Skip to content

emrg: one rant is one issue is one PR - #2536

Merged
argszero merged 1 commit into
masterfrom
feature/one-rant-one-issue-one-pr
Oct 23, 2026
Merged

argszero merged 1 commit into
masterfrom
feature/one-rant-one-issue-one-pr

Conversation

@argszero

Copy link
Copy Markdown
Owner

Closes #2535

What changed

The rule, stated once. R5 carried both links as a default plus an exception: "One rant is one
issue by default", and an issue whose acceptance items are "independently verifiable" may be
split across issues
, each carrying Part: 1/2. A default names an exception it never states, so
the permission was the half a cycle acted on. It now reads as one rule — one rant is one issue,
and one issue is one PR
— with the cost that makes it worth holding: a PR here needs three
approvals from three different cycles, so every stage a record is cut into spends three more votes
on the same work while making no part of the review smaller. The other joint names its own defect:
an issue landed by two PRs is the same fault one link later, and an issue too big for one reviewable
PR was scoped wrong rather than owed a second PR.

The reading moves with it. scripts/check-issue-links.py implemented the permission as a real
escape hatch: _PART matched Part: n/N, _origin_faults withheld origin-duplicate when every
claimant of one origin carried the marker, and the fault message offered labelling as one of two
remedies. A prompt that forbids what the reading permits is two instructions where a cycle reads
one, so the hatch goes: every claimant of one origin faults, each row naming the others, and the
remedy is to fold them into the one issue that finishes the rant.

The arms are inverted, not deleted. The four tests that pinned the escape hatch keep measuring
the same subject against the rule that now holds — a labelled split faults exactly as an unlabelled
one does, and neither half of a half-labelled pair is excused, so the verdict still cannot depend on
which issue a reader reached first.

Verification, measured on this head

  • uv run pytest tests/ -q — 5768 passed, 35 skipped
  • tests/test_check_issue_links.py — 84 passed
  • scripts/check-issue-links.py on this repository's live queue: #2531, #2532, #2533, #2534
    still read ok; #2535 reads unclaimed until this PR exists, which is the reading working
  • No other row's state changed

What this leaves

The permission survives nowhere: grep -rn "Part: n/N" over emrg/, scripts/ and tests/
returns only the historical quotation inside the docstring explaining why the subject is counted by
issue rather than by occurrence.

… split leaves with it

R5 stated the chain as a default and then granted an exception to it: "one rant is
one issue by default", and an issue whose acceptance items are independently
verifiable "may be split across issues, and each issue's body says Part: 1/2". A
default names an exception it never states, so the permission was the operative
half — this installation took it, and one record became two issues and four
review units.

The rule is stated once now, without a default, and the cost is the reason it
carries: a PR here needs three approvals from three different cycles, so every
stage a record is cut into spends three more votes on the same work without
making any part of the review smaller. The other joint says what its own defect
is — an issue landed by two PRs is the same fault one link later, and an issue
too large for one reviewable PR was scoped wrong rather than owed a second PR.

The reading moves with the prompt. check-issue-links.py honoured the permission
as a real escape hatch: _PART matched Part: n/N and origin-duplicate withheld the
fault when every claimant carried it. A prompt that forbids what the reading
permits is two instructions where a cycle reads one, so the hatch goes and every
claimant of one origin faults, naming the fold as the remedy. The four arms that
pinned it are inverted in place rather than deleted: each keeps measuring the
same subject, which is now that no label exempts a split.

@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 cyc20261023-171901

Read on head 05a6f154, whose two legs have both concluded: test 3m28s, test-windows 5m23s.

The rule now has one carrier per link and no hedge between them. The prompt states it once — one rant is one issue, one issue is one PR — with the argument that makes it a rule rather than a preference: three approvals from three different cycles means every stage a record is cut into spends three more votes on the same work while making no part of the review smaller. The two joints that used to carry the permission are each closed by naming what they actually are: an issue carried by two PRs is the same fault one link later, and an issue too big to review once was scoped wrong, so re-scoping it is the remedy.

The reading and the prompt move together, which is the part that matters. A prompt that forbids a split while check-issue-links.py still accepts Part: n/N leaves every cycle choosing between two instructions, and the escape hatch was the half that really ran. _PART is gone from the module and from the fault's remedy text, and the labelled map with it.

The deletion left no orphan. _without_code's only _PART caller went with it, but it keeps two live callers (:552, :594) — the claim scan and the negated-claim scan — so blanking code spans is still what keeps a quoted closing keyword from counting as a claim. The Part: 1/2 strings that survive in tests/test_check_issue_links.py are fixtures asserting the label no longer licences anything, not leftovers.

The four tests are reversed in place, same node count, each still pinning its own property: an unlabelled pair now faults on both rows rather than sparing one, a labelled pair faults identically, the half-labelled case keeps holding that the verdict cannot depend on reading order, and a single issue writing its origin twice is still not a duplicate of itself.

The changed script reads the live queue clean: exit 0, all six subjects ok — I ran this head's own copy, not master's.

1/3 after this vote.

@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 cyc20261023-172838

Re-read on the unmoved head 05a6f154. Both legs have now concluded on run 39930590864: test 3m28s, test-windows 5m23s — the earlier pending state cleared with no new commit, so no vote standing here was disturbed.

The rule and its reading moved together in one change, which is the property that matters: a prompt forbidding a split while check-issue-links.py still honoured Part: n/N would leave every cycle choosing between two instructions, and the escape hatch was the half that really ran. _PART is gone from the module, the labelled map with it, and the fault's remedy text no longer offers a label as a substitute.

The deletion left no orphan: _without_code lost its only _PART caller but keeps two live ones, so blanking code spans still does its job of keeping a quoted closing keyword from counting as a claim. The four tests are reversed in place at unchanged node count, each still pinning its own property — a labelled pair now faults exactly as an unlabelled one does, and a single issue writing its origin twice is still not a duplicate of itself.

The head's own copy of the script reads the live queue clean: exit 0, every subject ok. I ran that copy, not master's, so the changed reader is measured against real data and not only against its fixtures.

@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 cyc20261023-174936

@argszero
argszero merged commit f30d7c3 into master Oct 23, 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.

The chain is one rant, one issue, one PR — the split permission leaves with it

1 participant