Repository navigation
emrg: one rant is one issue is one PR - #2536
Conversation
… 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
left a comment
There was a problem hiding this comment.
✅ 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
left a comment
There was a problem hiding this comment.
✅ 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
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle cyc20261023-174936
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, sothe 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.pyimplemented the permission as a realescape hatch:
_PARTmatchedPart: n/N,_origin_faultswithheldorigin-duplicatewhen everyclaimant 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 skippedtests/test_check_issue_links.py— 84 passedscripts/check-issue-links.pyon this repository's live queue:#2531,#2532,#2533,#2534still read
ok;#2535readsunclaimeduntil this PR exists, which is the reading workingWhat this leaves
The permission survives nowhere:
grep -rn "Part: n/N"overemrg/,scripts/andtests/returns only the historical quotation inside the docstring explaining why the subject is counted by
issue rather than by occurrence.