PR length is a doctrine problem: a round cap with successor PRs, issue sizing as a triage duty, and the Round log's verbatim mirror (#196 revisited) #416
Replies: 3 comments
Triage: the three directions restated as four decisions in the house ruling form — and the one thing re-measurement changedTriage 2026-08-15 What re-measurement did to my own claimsI wrote both sides of this, so the claims above are assertions until somebody goes and checks them. Re-derived from
And one thing changed in substance, which is why the asks below are not in the order the post puts them: D1's R1 — D3: who writes the rolling summary (ask this one first)Analysis — why C is a real cell and not a fudgeThe axis is who writes, and its exhaustive set is {engine, builder, both}. The post above enumerated the first two; C is the third cell of the same axis, and it is where the two objections cancel:
Two mechanical facts constrain all three cells equally, and neither is negotiable:
R2 — D1: what triggers the cut, and at what numberAnalysis — why not B, and where the number comes fromB is the thing this direction exists to replace. The premise you ruled on is that raising or checking a ceiling does not address why we keep walking into it; a byte budget is limit-checking with a nicer failure mode. It also makes the cut point unpredictable to the builder mid-round, and it re-measures a quantity that changes under R1. C is honest but it does not bind. Every stalled PR in evidence was authored by an agent that had no rule telling it to stop, and judgment is exactly what was exercised for eleven rounds on incubator#188. The number. incubator#188's body reached 203,623 B over 11 rounds — ~18.5 KB of body per round, so the body alone crosses R3 — D1: who performs the cutAnalysis — what each option would have to own
R4 — D2: mint the sizing rule now, or hold it behind R2Analysis — what the D2 mint would carry, and the one caveat it must absorbThe deliverable is
Board facts the mint would carry at this write, so whoever writes it does not re-derive them: no release window stands, so the mint takes no membership call; no open Two notes on how this waits
|
|
R1 — D3: who writes the rolling summary (ask this one first) C |
Ruled, all four — recorded as decisions, and minted: epic #417 with #418, #419, #420Thank you @danmt. Every ask went to its recommendation, so nothing below re-argues anything; this comment is the record and the mint.
No One thing your ruling supersedes, and it is mineMy R2 carried a conditional — "If R1 lands B or C, the D3 mint re-derives N on the consensus-surface axis, where it will likely be larger." You ruled C and named 5 in the same message, so the conditional is spent and What the ruling does change is the reason the number is written down. Under One thing re-measurement added
The mintFour issues,
The fence, computed per path (#288): #418 is the newest open carrier of Two things a builder will meet and should not have to ask about, so both are decided in the specs rather than left open:
No consumer reds on any of these merges: crewUnmoved and not racing this: entries 27, 28 and 31 on crew#327 remain held at release-init step 1 behind wave 1. Ceremony minted first, so the cross-repo edge is crew's to declare, qualified, naming #418 and #420. Nothing here declares an edge into crew, because there is nothing over there to name yet. Closing this as resolved — the asks are answered and the work is on the board. #417 is where the arc is tracked from here. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Filed by crew's triage out of heavy-duty/crew#456, at @danmt's ask on that thread: "did you file the ceremony issues for this? or a discussion or something so its picked up at some point?" — and per his earlier direction there, "if we need to change stuff in ceremony, file it as a thorough discussion." Nothing here is minted, in either repo.
The engine halves are recorded on crew#327 as entries 27, 28 and 31 of its
## To mint when this arc openslist, held at release-init step 1 until the operator blesses wave 1 (ruledB, 2026-08-15). Those bullets are crew-side and cannot reach this board — which is exactly why this discussion exists. This is the doctrine half, and it is a different half in each of the three cases below.What forced it
Two mornings, two days, two stalled PRs in heavy-duty/incubator (#188, #210), both terminal at a green head with every check passing. Cause, measured: crew's
_resume_attach_commentspasses a PR's whole comment thread tojqon argv, which binds atMAX_ARG_STRLEN(32 pages, 131,072 bytes) — notARG_MAX. #210's thread was 152,094 B, #188's 273,114 B. Above the limit theexecvefails, the failure is swallowed, and the PR drops out of resume detection permanently, because a thread never shrinks.That line is crew's to fix and it is not what this discussion is about. What it exposed is a doctrine question ceremony owns:
The engine's ability to rescue a stranded PR degrades as the PR accumulates rounds — so it fails hardest on exactly the PRs most likely to need rescuing. Raising the ceiling does not address why we keep walking into it. Three doctrine asks follow, in @danmt's framing, with what is already ruled marked as ruled and what is open marked as open.
D1 — Cap the rounds; the branch continues in a successor PR, and the predecessor closes as a ledger
The direction. After a threshold number of rounds, the branch continues in a new PR carrying the code forward. The new PR's body holds only the current state. The predecessor closes and stands as the ledger of how we got there — every comment, every verdict, every ruling, intact. The issue points at all of its PRs in an ordered list, so the chain is navigable: the history is relocated, not deleted. This bounds every per-PR payload in the engine by construction rather than by limit-checking.
Already ruled by @danmt on crew#456, and not up for re-argument here:
Closes #Nmoves with the code, once — the predecessor becomesRefs #Nin the same act that makes the successor the closer.What is still open, and it is the whole of what blocks a mint: what N is, and who performs the cut (the builder at the round close? the engine at the handoff? triage?).
The doctrine surfaces this touches, measured against this repo's
mainat this write:BUILDER.mdline 3 — "You turn one issue into one PR." This direction makes it one issue → an ordered chain of k PRs. That sentence is the contract's opening line and a successor-PR rule contradicts it directly; it has to be amended, not worked around. The same phrase rides.github/pull_request_template.md's header ("One issue, one PR — draft while building").BUILDER.md, claiming and handoff — what a builder does at the cut, and whether an in-flight claim survives it.REVIEWER.md— that approvals do not survive a cut, and that the review target is the successor while the predecessor is read-only history.TRIAGE.md— the issue body carries the ordered list of its PRs, and who maintains it.D2 — Issue size is a triage responsibility, and round count is the signal it is failing
The direction, in @danmt's words: "the longer a PR runs, the harder it is to get consensus from all agents." Every additional round widens the surface a reviewer must hold, and reviewers that disagree generate more rounds, which lengthen the PR further. That loop should be an input to how triage sizes an issue in the first place — a large issue that will obviously produce a ten-round PR should be split before a builder claims it, not after the thread is 150 KB.
His own rule of thumb from the thread: "is the PR to fix this issue complex? yes? then its an epic and has multiple issues that are ideally disjointed, we avoid having multiple issues touching the same few lines of a file, group when we can without introducing overwhelming complexity."
This one is entirely ceremony's. Measured:
TRIAGE.mdon this repo'smaincontains no sizing language of any kind — not "size", not "small", not "split", not "large". The issue contract governs density (context, spec, tasks, acceptance criteria, test plan, dependencies) and says nothing about extent. crew ships no doctrine, so crew's half of this is only round count surfaced to triage as sizing evidence rather than only as a stalled PR — a telemetry deliverable that carries no cross-repo blocker as drafted, and gains one the moment it must read a rule that does not exist yet.One caveat the rule must absorb, because it is arithmetic rather than taste.
TRIAGE.md's own contract (#288) makes every newer issue on a shared deliverable declare an unconditionalBlocked by #Nagainst the newest open carrier. So splitting one issue into k on a single axis does not produce k claimable issues — it produces a k-deep serial chain, one claim at a time. crew'scoremigration chain is four issues deep for exactly that reason, and crew's board sat at zeroready/ zeroclaimedwhile this was being measured. A sizing rule that ignores this trades stalled PRs for a queue that is idle by construction. The split that pays is across disjoint deliverables, and the contract offers no discount for near-disjoint ones — that is precisely @danmt's "ideally disjointed", and the rule should say it in the contract's own vocabulary.@danmt has priced the k-deep idle cost and taken it ("I'd rather have multiple issues idle due to blocking than super large PRs that never close"), so that trade is settled; what is not written anywhere is the rule itself.
D3 — The Round log stops being a verbatim mirror. This revisits ceremony#196's ruling, and it should be revisited knowingly
This is the one with real prior art, and it is a ruling of @danmt's own.
ceremony#196 — "Handoff spends a session reconstructing a record the round log was already supposed to hold" — was RULED 2026-07-28 (danmt): the engine appends it, mechanically. The builder keeps exactly one obligation, the one it already had (answer the round whole, in one reply); the engine mirrors that reply into the PR body's
## Round log. The reasoning was explicit and good: "Nothing new is asked of the builder, so there is no new thing to forget, and the durable record appears without discipline", and a guard "checks that a record exists; it can never check that it is true."That ruling is what put 6–9 KB of verbatim prose per round into PR bodies. #188's 203,623-byte body is that ruling, working as designed, at eleven rounds. The mechanism is
BUILDER.md's own text on this repo'smain:@danmt's new direction, from crew#456 at
2026-08-15T11:04:03Z:So: a rolling summary, not an append-only log. It keeps the property #196 was really after — the record lives where the merging human looks — and drops the property that made it grow.
The one decision this needs, and it is the reason it is a discussion and not an issue:
Who writes the rolling summary?
BUILDER.md's "no body edit" — a prohibition the direction does not name. If (b) is the answer, the repeal must be written, not implied.Two mechanical facts either answer must respect, measured rather than assumed:
author,createdAtand a 40-hex head SHA out of the thread. A body summary cannot answer "was the newest round answered at the current head" at any length or quality, because it carries no per-event author, time or head.<sha>— see the Round log"), then the comment thread stops growing too — the same 100-comment thread falls from ~250 KB to a few KB. D3 in the (b) shape pays down the class of bug that started all of this, on top of bounding the body. That is worth having on the record before the shape is chosen.And one defect in the current mirror, reported as what it is — read from crew's code, not observed firing.
_mirror_roundsfetchescomments(first:100)— the oldest hundred — while crew'sanswered-head.jquseslast:100. #188 carried 108 comments. Past a hundred, the newest replies fall outside the window and recent rounds mirror as "Round passed with no written reply": a false record, written by the engine, in the bodyBUILDER.mdpoints the merging human at. It is crew's bug and is recorded there; it belongs here only as evidence that the verbatim mirror is already not faithful at the lengths that provoked this.What I am asking for
Argue and converge on the three above — particularly D1's N and who cuts, and D3's (a)/(b) — so that whoever mints here has a spec rather than options. Two coordination notes:
BUILDER.md's "no body edit" is vendored byte-identical into every consumer and guarded bydocs-sync, so crew cannot amend it locally. D1 and D2 are independent as drafted.Dedup, searched rather than assumed: this repo carries no issue and no discussion, open or closed, on PR sizing, round caps, or successor PRs. On the Round log, ceremony#196 is the only prior art and it is the ruling D3 revisits.
All reactions