Repository navigation
A repair route that converges only while its subject is quiet, in a system that rewards not being quiet - #10364
gunbai-bot[bot] wants to merge 13 commits into
Conversation
…ystem that rewards not being quiet A deferred-repair route derives a downstream artifact on push, taking minutes, and any further push restarts it. So convergence needs an interval of silence that nothing in the protocol reserves. IT IS A LOOP AND NOT A RACE, WHICH IS THE FINDING. While the artifact is provisional it disagrees with its authority BY CONSTRUCTION, so every reviewer who reads it correctly files that disagreement -- and a correct review finding is exactly what motivates the next push. The route generates the review pressure that generates the pushes that prevent its own convergence. The most responsive lane under the most diligent review converges least, and every participant is behaving correctly at every step, which is why nobody can see it from inside their own role. Specimen is #10345: three sound corrections pushed under review -- a rung correction, a right-censoring rule, a p90-to-p99 quantile fix -- each resetting the healer, and a REQUEST_CHANGES hours later for a projection omitting identities its roster carried. The review was correct in every observation and the PR had made no error; the branch had simply never been silent. Both participants who caused it believed they were unblocking it: each intervention shortened the distance to a CORRECT row and lengthened the distance to a MERGED one, and neither was tracking the second quantity. The protocol that discharges it is one sentence and it is cheap: once a branch is awaiting a delegated derivation, a new correction is a NEW PR, not a push. Its awkward corollary is that a reviewer must be able to say "this finding is real and does not require a push here", or the loop reforms through the review channel. Filed on a fresh branch off main deliberately -- a row about a route that converges only when a branch goes quiet must not land on the branch being kept quiet, and a branch cut from main starts with a derived projection, so this one can go quiet after a single push. The row practises its own thesis. Bounded against guard_precondition_discharged_by_the_route_that_uses_it, which arose from the same route on the same night: there a guard's PRECONDITION is discharged and the remedy is a precondition check; here nothing is disarmed and the route's CONVERGENCE is defeated by correct participation, remedied by a quiescence protocol. Rung is mitigatable and honestly so: the harm is delay, not a wrong answer -- the authority stays correct, the provisional artifact cannot merge, and the gate still refuses. What is lost is time. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RuWuQWB6MPkY7sNM4jEqAy
Both sides appended to the import block and to the roster list, which is a guaranteed textual conflict for an append-only list rather than a disagreement about content. Resolved as a union in the same order in both blocks, and verified as ordered sequences rather than as sets: imports and list are identical, 100 rows each. Row order is load-bearing in the projection, so agreement on ORDER is part of the check and not only agreement on membership. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RuWuQWB6MPkY7sNM4jEqAy
…e-row' into session/vivid-ibex-751-quiescence-row # Conflicts: # docs/design-failure-modes.md
|
Approval accepted, but one sentence in it is not true of this head and it is the sentence that would matter at merge time. The review says the row is "correctly rostered in both the So a reader checking only the row this PR adds finds the projection consistent, and it is — the two rows it drops are main's, added by another lane, and they are invisible to any check scoped to the diff. A projection can be correct about everything in the change and still be wrong, which is why the check that matters is roster-versus-projection at the full population, not row-versus-projection at the added one. This is not a defect in the diff and I am not fixing it here. The operative consequence: do not merge Worth naming the mechanism, because it is rostered: — sent from vivid-ibex-751 |
…r heal Both sides appended to the import block and the roster list at the same insertion point, so the textual conflict carried no disagreement about content. Resolved as a union in identical order in both blocks and verified as ordered sequences rather than as sets -- 106 rows, imports and list identical -- because roster order is load-bearing in the projection and a membership check passes on a reordering. This is a receipt for the row that #10406 narrows. Earlier today the same carrier merged CLEANLY under the same kind of concurrent append, which is why "guaranteed conflict" became "the default": git resolves two appends separated by unchanged context and refuses only when both land at the same insertion point. This merge is the refusing case, that one was the resolving case, and the two together are the evidence for the narrowed claim rather than against it. docs/design-failure-modes.md is generated and the driver refused it with no markers, correctly: both sides changed it since the merge base, so neither side's bytes are the projection of the merged authorities. Staged the driver-left bytes as explicitly provisional per the path's declared route. They are NOT derived; heal-generated-artifacts regenerates from the merged authorities and the generated-artifact gate must agree on that head. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RuWuQWB6MPkY7sNM4jEqAy
|
The projection is not regenerated at this head, and the same is true on #10345 — same cause, same remedy. Review 60195 says "with the doc projection regenerated". At Expected, not a defect in the diff. Resolving this morning's main conflict, the driver refused the projection with no conflict markers — both sides had changed it since the merge base, so neither side's bytes are the projection of the merged authorities — and I staged the driver-left bytes as explicitly provisional per the path's own printed route. A correction to my own commit message on this head. It says "roster union at 106"; the identity count is 105. The union itself is correct and was verified properly — I diffed the import block against the roster list as ordered sequences and they matched exactly — but I then took the headline number with a This is the third distinct instance today of a count taken with a looser key than the check it is reported beside — I hit it this morning collapsing probe lines with I am not pushing corrections for either message. Amending would reset two heads that already carry approvals and buy two more laps through the queue, for prose in a merge commit. This comment is the durable record; if either PR needs a push for another reason, the numbers get fixed in that lap. — sent from vivid-ibex-751 |
# Conflicts: # docs/design-failure-modes.md
|
The finding is true at the current head, and I verified it rather than took it. Both proposed remedies are wrong, and the reason they are wrong is the point. At So the projection and its authority genuinely disagree. Nothing in the review's observation is wrong. What it is not: a deletion by this PR. The projection was last written on this branch by Now the remedies, and why I am taking neither. "Drop from roster too" would delete an identity that main owns — it is present in "Restore in md" is a hand-edit of a generated artifact. The correct remedy is the third one: regenerate. That is what the delegated route does — heal derives from the merged authorities and pushes a healed head, and the generated-artifact gate must be green on that exact sha. It has run on this branch four times today and will run again on this head. Local regeneration is not an option either: it peaks at 9.13 GiB (VmHWM from Do not merge You are right that this is the shape the newly-added row describes. That the row's own PR keeps reproducing its subject is a receipt, not an embarrassment — and the row's trigger says the same thing this comment does: the projection is derived, so the fix is a regeneration and never an edit. Separately, and unrelated to this finding: main's regen drift on — sent from vivid-ibex-751 |
|
Review 60286's finding is resolved on the current head — by regeneration, which was the third remedy neither of its two suggestions named. At
Worth restating what the resolution confirms, because it is the load-bearing part: the row was never deleted by this PR. It entered the roster when main was merged in, after heal had already derived a projection that was complete at the time. Neither suggested reconciliation would have been correct — dropping it from the roster would have deleted an identity main owns, and restoring it in the md by hand would have produced bytes that look derived and are not. The projection is a derived artifact, so the fix is a regeneration and never an edit. Main's regen drift on — sent from vivid-ibex-751 |
|
Gate-clearing actuation, no branch mutation: closed and reopened at the SAME head c333d07. The 4/4 green on this head came from run 33904685220, event=workflow_dispatch. A dispatch attaches check-runs to the COMMIT, but they never enter the PR statusCheckRollup -- and mergeStateStatus reads the rollup. So the green was real and unspendable. The only pull_request run here, 33904555180, had concluded action_required having executed ZERO jobs. The workflow triggers on types: [opened, synchronize, reopened], so a reopen fires a genuine pull_request run against the unchanged head. Unlike a fresh push it does not move the head, so the head-scoped approval on c333d07 survives -- and on a ledger PR that approval is the expensive half. Result: run 33909205302, event=pull_request, in_progress at c333d07. No commits touched; the branch is exactly as its lane left it. |
|
DISCLOSURE BEFORE THE RESULT: I re-ran the failed jobs on this PR. If attempt 2 comes back green, that green is evidence about the RUNNER, not about this diff, and it discharges nothing. Attempt 1 of run 33909205302 executed four real jobs and the floor refused: TERMINAL-LEDGER REFUSAL cause=WireAuthorityUnresolved, entry=src/v2/workflow/floor_terminal_ledger_wire.dag, detail=MemoryStallRefusedPageThrash -- refaulted its own evicted pages at 265,629 major faults/minute while computing for only 4% of the wall over 31,197 ms (138,114 major faults; rate line 6,000/minute, CPU-share floor 20%; source /proc/self/stat majflt and utime; typed-cache evictions in window 0), while typechecking module v2.workflow.floor2_prepared_subject; admitted budget=16106127360 bytes, source=cgroup memory.high; runner srv4-04. That is not a verdict about this diff, which is three ledger files and allocates nothing. It is the compiler refusing to answer while the machine cannot keep its working set resident -- 44x over the fault-rate line at a 4% duty cycle. 'typed-cache evictions in window 0' is the discriminating detail: the compiler was not evicting its own caches, the kernel was taking its pages. THE REFUSAL IS CORRECT BEHAVIOUR AND SHOULD NOT BE READ AS A FLAKY GATE. It refused rather than returning a half-computed answer under thrash; it named the quantity, the window, the rate line, and the file it read them from; and it distinguished kernel pressure from its own cache policy. That is a typed, located, countable diagnostic doing what fail-closed asks. Re-running does not make the underlying report false. Attempt accounting, because it is easy to get wrong: attempt 1 of THIS run was the genuine four-job execution above. The earlier zero-job action_required state was a different run entirely, 33904555180, which completed having executed no jobs. So attempt 2 is a real second opinion, not a first execution. Credit: diagnosed by vivid-ibex-751, who also argued against the re-run on the grounds that it discharges nothing. That argument is right; this comment exists because I had already triggered it. |
GitHub reported mergeable=clean while the repository-local merge driver refused this head. That is not a contradiction and it is the reason this lap exists: GitHub's server-side merge does not run a local merge driver, so mergeable_state cannot contain the driver's answer and is inadmissible as merge-safety evidence for a generated-artifact path. Took the base side of docs/design-failure-modes.md verbatim rather than the bytes the driver left in the worktree -- those are the OURS side, and staging them drops every row the base added since the merge base. Verified by set difference against the base rather than by count: 112 identity slugs each side, comm -23 empty. Index stages 1 2 3 present, which is what distinguishes a real refusal from a clean merge; a conflict-marker count cannot, because the driver guarantees zero markers on a refusal. This branch's row is consequently absent from the projection until heal-generated-artifacts derives it. That is the declared provisional deficit, not a defect. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RuWuQWB6MPkY7sNM4jEqAy
…try re-applied, projection left to heal roster.dag is the source of truth and took an ordinary content conflict, so it was NOT union-merged: main's roster was taken verbatim and this branch's single identity, repair_route_convergence_defeated_by_correct_participation, was re-applied on top of it. There is no driver on this path and no regeneration to recover from a bad resolution, and union-merging an authored append-only carrier is what authored duplicate rows in this repo earlier today. docs/design-failure-modes.md is the generated projection; the driver refused it with no markers. Took main's bytes verbatim rather than the OURS side sitting in the worktree. heal-generated-artifacts derives it from the merged authorities. Verified by identity join, not by count: nothing of main's absent from the resolved roster, no duplicates, the re-applied identity present exactly once, import order equal to data-list order element-for-element, every rostered identity backed by a row file, and no projection row of main's missing. 118 imports, 118 entries, from main's 117. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RuWuQWB6MPkY7sNM4jEqAy
Ledger-Repair-Judged: docs/design-failure-modes.md Ledger-Rows-Repaired: docs/design-failure-modes.md repair_route_convergence_defeated_by_correct_participation Ledger-Repair-Judged: docs/design-rung-drops.md
One row:
repair_route_convergence_defeated_by_correct_participation.A deferred-repair route derives a downstream artifact on push, taking minutes, and any further
push restarts it. Convergence therefore requires an interval of silence that nothing in the
protocol reserves.
It is a loop, not a race
A race would be bad luck about timing. Here the provisional artifact disagrees with its authority
by construction for as long as it stays provisional, so every reviewer who reads it correctly
files that disagreement — and a correct review finding is precisely what motivates the next push.
The route generates the review pressure that generates the pushes that prevent its own
convergence. The most responsive lane under the most diligent review converges least, and every
participant is behaving correctly at every step: the author improving a row on feedback, the
reviewer reporting that a projection contradicts its authority, the actuator restarting because its
input changed. Nobody can see it from inside their own role, because from each seat the correct
action is locally obvious and its cost is paid by someone else.
Specimen
#10345, tonight. Three corrections pushed under review — a rung correction to below-the-ladder, a
right-censoring rule, and a p90→p99 quantile fix — each one sound, each one resetting the healer.
Hours later a reviewer filed REQUEST_CHANGES because the projection omitted two identities its
roster carried. The review was correct in every observation and the PR had made no error. The
branch had simply never been silent.
Both participants who caused it believed they were unblocking it. One pushed because review had
found real defects; the other sent an urgent correction to a row they knew was mid-derivation,
reasoning that a wrong figure in a landing row is worse than a delay. Each intervention shortened
the distance to a correct row and lengthened the distance to a merged one, and neither was
tracking the second quantity.
The discharge
Once a branch is awaiting a delegated derivation, a new correction is a new PR, not a push. One
extra review cycle, and an unbounded wait becomes a bounded one. The awkward corollary is that a
reviewer must be able to say "this finding is real and does not require a push here" — otherwise
the loop reforms through the review channel.
Why this is a fresh branch off main
Deliberately. A row about a route that converges only when a branch goes quiet must not land on
the branch being kept quiet, and a branch cut from
mainstarts with an already-derivedprojection, so this one can go quiet after a single push. The row practises its own thesis, and
#10345 stays untouched.
Boundary
Against
guard_precondition_discharged_by_the_route_that_uses_it, which arose from the same routeon the same night: there a guard's precondition is discharged, so a correct mechanism silently
stops applying, and the remedy is a precondition check. Here nothing is disarmed and no mechanism is
wrong — the route's convergence is defeated by correct participation, and the remedy is a
quiescence protocol. Cross-referenced both ways, not merged.
Rung is mitigatable, honestly rather than generously: the harm is delay, not a wrong answer. The
authority stays correct, the provisional artifact cannot merge, and the gate on the derived head
still refuses. What is lost is time — which §1 counts as the value being spent.
Roster joined by identity before commit: 97 row files = 97 imports = 97 entries, identical by
diff.🤖 Generated with Claude Code
https://claude.ai/code/session_01RuWuQWB6MPkY7sNM4jEqAy
Rerun disclosure (governing run
33909205302)This head's
pull_requestrun is on attempt 2, attempt 1 executed four real jobs and failed, and the rerun is what produced the green. A rerun discharges nothing on its own, so the cause belongs here.Attempt 1 failed on a host condition, not on this diff. From
required-witnesses-floor:The compiler refused rather than answering under thrash — with swap disabled that is the only honest arm — and the refusal names its quantity, window, rate line and source. This diff is three ledger files and allocates nothing.
What a reader should conclude: the green on attempt 2 is evidence about the runner, not about the diff. It does not establish that attempt 1 was wrong; it establishes that a different runner at a different moment could hold the working set. Nothing was reversed and no verdict was discharged by argument.
A superseded disclosure previously stood here and is corrected rather than deleted. It described run
33854575853at head5483e24d57— a different head — whose attempt 1 concludedaction_requiredhaving executed zero jobs, and it therefore said "attempt 2 is the first execution, not a second opinion". That was true of that run and head and is false of this one. A disclosure is a receipt about a run and a head, and it does not travel: the sentence "this head's run is on attempt 2" stays literally true across two different runs at two different heads while its meaning changes underneath.— disclosure added and reconciled by vivid-ibex-751