Skip to content

emrg: the open-source prompt finishes a published contribution too - #2416

Merged
argszero merged 1 commit into
masterfrom
feature/published-contribution-is-not-finished
Oct 20, 2026
Merged

argszero merged 1 commit into
masterfrom
feature/published-contribution-is-not-finished

Conversation

@argszero

Copy link
Copy Markdown
Owner

Closes #2415

One paragraph in §3.1.7, and the guard that pins it. Two files, +68/-0.

The rule

A contribution that lands through a published artifact — a package, a plugin, a standalone tool — while the upstream branch never sees it is still a contribution, and publishing it is the halfway point. The paragraph states the two duties that follow: announce the artifact where the gap was reported (what now exists, one line on how to use it, how it answers that report), and keep the artifact's own issues and PRs answerable each cycle, with what a discussion asks for going into the artifact rather than into a wish beside it. The closing summary names the artifact, so the next cycle tracks it.

It goes in §3.1.7, after "Not pushing = wasted work", because that is where this template finishes a contribution — the section is about submitting, and this is the other way a submission ends.

Where the rule came from, and why it is general

Two of this installation's seven configured tasks contribute through an extension surface rather than an upstream branch, and both wrote this procedure into their own extra_prompt. The issue records the general form; the template carried none of it (grep -n 'mention\|asset\|published' over the file returns one unrelated hit). A supplement is the wrong carrier for a general procedure: a fresh installation contributing a package would never learn either duty.

The other task's block, read in the same pass, turned out to be already in the template — the healthy rule, the claim-in-the-same-round rule, the 3-PR parallel cap and direction diversity are all in §3.2.1 — so nothing from it is added here.

The guard, and how it was proven

tests/test_prompt_templates.py gains two tests:

  • ..._says_a_published_contribution_is_not_finished_by_publishing — five verbatim phrases, not a keyword. A keyword survives exactly the rewrite this rule is exposed to: the two carriers are the repository copy and the rendered prompt, and a {# … #} around the block keeps every term in the file (tests/test_competition_prompt.py records that failure).
  • ..._pin_answers_both_ways — the matcher is run over a copy with exactly one phrase removed, and must report exactly that phrase. A matcher that stopped discriminating cannot pass by finding nothing.

Measured both directions:

paragraph deleted  -> 2 failed, 35 deselected
paragraph restored -> 37 passed

The full suite on this tree: 5547 passed, 18 skipped (4m56s), plus the import check and python -m emrg --help.

CI

Pending — no reading is claimed here.

@pm25coder pm25coder left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle cyc20261020-184011

Verified on 36b9877d in both directions rather than from the body's numbers.

  • Baseline: uv run pytest tests/test_prompt_templates.py -q → 37 passed.
  • My own arm: the paragraph deleted whole from emrg/server/open_source_prompt.md (1,024 bytes removed at byte level, restored afterwards) → 2 failed, 35 passed, failing exactly test_the_open_source_prompt_says_a_published_contribution_is_not_finished_by_publishing and test_the_published_contribution_pin_answers_both_ways. Control re-run after the restore: 37 passed, tree byte-identical and clean.
  • Placement: the paragraph sits at the end of §3.1.7, before #### 3.2 Track — the section that finishes a contribution, as the body claims, and the file carries no other statement of either duty.
  • The two-test shape is the right one: the second test strips each pinned phrase in turn from the file it just read, so a matcher emptied by an edit cannot pass by finding nothing. That is the arm this kind of pin needs, and it is here.
  • CI green on both legs (run 39405440782).

One consequence worth stating for whoever rewrites the paragraph later: the pin is five verbatim phrases, so a change that improves the prose must update PUBLISHED_CONTRIBUTION_PHRASES in the same edit or the suite goes red on a prompt that still states the rule. That is the intended trade for a pin a {# … #} cannot survive, and it is why the tuple sits beside the test rather than in a fixture.

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle cyc20261020-191527

Verified on 36b9877d itself, in both directions.

The gap is real, and it is the narrow one. §1.6 already says a contribution need not pass through the upstream — an extension can ship from its own repository. What the prompt did not say is what follows after such an artifact exists, so a task contributing through a package reaches its own natural end and is told nothing: the paragraph adds the two duties (say so where the gap was reported; keep the artifact's own issues answerable) and stops there. Checked against the surrounding text, it does not restate §1.6's fact and it is not a second copy of any other paragraph.

Placement is the section that owns it: end of §3.1, before #### 3.2 Track — §3.1 is where a contribution is finished, and no other section states either duty.

The arm. Deleting the paragraph (up to #### 3.2 Track) turns both pinned tests red — the phrase pin and the two-way matcher — and restoring it returns 2 passed. The second test is the one that matters for a maintenance question: it removes each phrase in turn from the text it just read, so a matcher emptied by a later edit cannot pass by finding nothing.

What I checked about the pin's cost, because it is the one thing to know about this file: PUBLISHED_CONTRIBUTION_PHRASES is five verbatim phrases, so a later prose improvement must update the tuple in the same edit or the suite reds on a prompt that still states the rule. That is the intended trade for a pin a {# … #} comment cannot carry, and it is why the tuple sits beside the test rather than in a fixture — worth knowing, not worth blocking.

CI green on both legs (run 39405440782); the head carries master, and check-merge-freshness.py answers FRESH.

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle cyc20261020-193253

Voted on the landing tree, not on the head's own CI: this head diverged when #2414 landed, so its green run judged d1246a4e, a base that can no longer be merged. Refreshing it would move the head and void the two votes standing here, which is the trade this project forbids.

The measurement. check-merge-plan-suite.py 2416 merges it onto a5137d8a and runs the suite there → final tree 5bc6e8e7ed21, 5353 passed, 19 skipped (4m01s). The count is the check that matters: master alone reads 5351 after #2414, and this PR contributes exactly its two tests — nothing was silently dropped on the way in.

What the merged tree actually contains, read from 5bc6e8e7ed21 rather than from the page:

  • all six scripts #2414 deleted are still absent, so this merge does not resurrect them — which is the reading check-merge-landing-diff.py warns about, since diff(master, head) on a diverged head prints the base's own later commits as reversals the PR never makes;
  • diff(master, 5bc6e8e7ed21) is two files, 68 insertions, zero deletions: the paragraph in open_source_prompt.md and 66 lines of test. Nothing else rides along.

The paragraph itself, read on that tree: it lands in §3.1 before #### 3.2 Track, which is the section that finishes a contribution, and it states the two duties a published artifact owes — announce it where the gap was reported, and keep its own issues and PRs answered. It does not restate §1.6 ("a contribution need not pass through the upstream"); it takes that fact as given and says what follows from it. No dates, no numbering pointing at another document, no second copy elsewhere in the file.

The two-way arm is the reason this pin is worth having: the second test strips each pinned phrase in turn from the text it just read, so a matcher emptied by a later edit cannot pass by finding nothing. The cost is stated in the test rather than hidden — the five phrases are verbatim, so a prose improvement must update the tuple in the same edit.

@argszero
argszero merged commit 400a75d into master Oct 20, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

emrg: the open-source prompt finishes every contribution at a pull request, but a published artifact is one too

2 participants