Skip to content

The stale-base hazard's CONTENT form: a superseded branch reads as pending work, and the only tell is that its file is shorter than main's - #10246

Merged
briansrls merged 2 commits into
mainfrom
session/jolly-ferret-412-stale-content
Sep 3, 2026
Merged

briansrls merged 2 commits into
mainfrom
session/jolly-ferret-412-stale-content

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

The stale-base hazard has a content form, and the form we had written down was narrower than the class.

The known form announces itself: a surviving branch on a squash-merged PR, a same-sha duplicate, an auto-opened PR carrying a template body. Something structural to notice. The three prior instances in this repo (#9950, #10221, #10223) were all caught that way.

#10234 had none of those signals. No duplicate ref, no auto-open, no surviving-branch tell. Its substantive content had already landed as #10158 and been extended by #10141, leaving the branch 204 lines behind main on the only file it touched — 340 against main's 544, merge-base 00bb2f473a. The three-dot diff read +73/-0.

The only tell was that the branch's copy of the file was shorter than main's, and nothing in a +73/-0 diff says so: a diff renders what a branch adds to its base, never what its base is missing. Every sentence a reviewer would write about it — adds the note, properly scoped, no code touched — is accurate relative to that base and wrong relative to main.

The harm is that the line stops with the wrong prescription

A merge conflict did fire, so nothing merged silently and the class sits at mitigatable rather than below the floor. But the notice instructed "rebase on main, resolve the conflicts, and push" — and following it would have produced a revert wearing a resolution's clothes. There was no content decision available to make: one side was simply stale, so a reviewer weighing the two sides would have been choosing between a current note and a historical copy of it while believing they were reconciling two intentions.

A loud stop whose prescribed repair is the harmful arm is worse than a quiet one, because the diligence of following instructions is what causes the loss.

The row records its own confirming instance

Twenty minutes after #10234 was closed as superseded, a scheduled review approved it: "APPROVE — annotation-only change on an existing carrier, no substrate impact", and separately that "the revision addresses a prior codex REQUEST_CHANGES by correcting the re-derivation claim." Both statements are true of the branch. Neither is true of main, where that same paragraph still carried the unrepaired sentence.

The reviewer was not careless and did not need to be — the artifact it was handed contains no representation of what main has since become. That is the recorded reason the trigger names a producer and not reviewer diligence: diligence is precisely what was exercised here. It also shows the review scheduler does not read closure, so a superseded branch keeps accruing approvals that a later reader can mistake for consensus about current content.

Rung, ceiling, trigger

  • Found at: mitigatable. The conflict contains the harm by stopping the merge; nothing computes the distinction, and the diagnostic actively misdirects.
  • Ceiling: mechanically preventable. A merge-base that predates a merge which touched the same file is a supersession candidate, computable from the ref graph alone. Not higher: a stale branch is representable by construction, and forbidding one would mean forbidding branches from being behind main — which this repository deliberately allows, since PRs here merge behind main routinely.
  • Trigger names the capability, not an artifact: a producer that, for each file a PR changes, joins the branch version against main's and against the merge-base and emits a typed supersession verdict distinct from a content conflict — sufficient for routing the two to different prescriptions, since issuing one prescription for both is the entire harm. A checklist item asking reviewers to compare line counts would be satisfied while the capability stayed dead.

Content subsumption is not decidable in general, so the honest gate refuses for analysis rather than auto-closing.

Boundary

Bounded in the row against merge_region_excludes_shared_tail, whose subject is a conflict region resolved wrongly on a live carrier where both sides are current. This one is about a conflict that should never have been presented as a conflict at all. One fixes how a region is resolved; the other decides whether the region is a decision.

Carrier append: declared 78, roster 78, both joins empty, no duplicate declaration or roster entry, name equals identity on all 78, every declaration present in the regenerated projection, no repeated class body by content.

Brian Searls and others added 2 commits September 3, 2026 15:50
…as pending work

The known form of this hazard is the REF form and it is narrower than the
class. The ref form announces itself — a surviving branch on a
squash-merged PR, a same-sha duplicate, an auto-opened PR with a template
body. The three prior instances in this repo were all found that way.

#10234 had none of those signals. Its content had already landed as
#10158 and been extended by #10141, leaving the branch 204 lines behind
main on the one file it touched (340 vs 544, merge-base 00bb2f4). The
only tell was that the branch's copy was SHORTER than main's, and nothing
in a +73/-0 diff says so — a diff renders what a branch adds to its base,
never what its base is missing.

THE HARM IS THAT THE LINE STOPS WITH THE WRONG PRESCRIPTION. A conflict
did fire, so nothing merged silently and the class sits at mitigatable
rather than below the floor. But the notice said "rebase on main, resolve
the conflicts, and push", and following it would have produced a revert
wearing a resolution's clothes. There was no content decision available:
one side was simply stale. A loud stop whose prescribed repair is the
harmful arm is worse than a quiet one, because the diligence of following
instructions is what causes the loss.

The row records its own confirming instance: twenty minutes AFTER #10234
was closed as superseded, a scheduled review approved it, accurately
describing the branch and saying nothing true about main. The reviewer was
not careless — the artifact it was handed carries no representation of
what main has become. That is why the trigger names a producer rather than
reviewer diligence, and it also shows the scheduler does not read closure.

Ceiling is mechanically preventable: a merge-base predating a merge that
touched the same file is computable from the ref graph. Not higher —
branches here are deliberately allowed to be behind main. Trigger names
the producer and what it must be SUFFICIENT FOR: routing supersession and
conflict to DIFFERENT prescriptions, since issuing one prescription for
both is the entire harm.

Bounded against merge_region_excludes_shared_tail, whose subject is a
region resolved wrongly while both sides are current.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QWLoiyrKq3zNTiDNtrs9gC
The row said the confirming review landed twenty minutes AFTER #10234 was
closed, and concluded from that the review scheduler does not read
closure. Checked against the instruments rather than from memory:

  review 59345 completed  2026-09-03T15:39:02.867Z
  #10234 closedAt         2026-09-03T15:41:20Z

The review came ~2 minutes BEFORE the closure. I asserted an ordering
from the sequence in which I learned the two facts rather than from their
timestamps, and it was one query away.

So the closure-semantics claim has no receipt in this specimen and is
withdrawn. It may well be true of the scheduler; supporting it needs a
review whose completion genuinely follows a closedAt.

What survives at full strength is the point that matters: the reviewer
approved a branch 204 lines behind main and was not careless, because the
artifact it was handed contains no representation of what main became —
and that is why the trigger names a producer rather than reviewer
diligence. Diligence was exercised here and produced an approval of
superseded content.

The withdrawal is recorded IN the row rather than deleted, because a
ledger row asserting a behaviour its own cited receipt does not show is
the fabricated-citation class appearing inside the row that files its
neighbour. The scoping repair is the same one applied six lines above the
note this specimen came from: repair the false claim, keep the true one
beside it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QWLoiyrKq3zNTiDNtrs9gC
@gunbai-bot

gunbai-bot Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor Author

Pushed ddea8096b6, which withdraws one sub-claim from the row. Approval 59351 read 96b6915199, so it predates this correction — flagging that rather than letting the approval carry over silently.

The row had said the confirming review landed twenty minutes after #10234 was closed, and concluded from that the review scheduler does not read closure. Checked against the instruments:

review 59345 completed  2026-09-03T15:39:02.867Z
#10234 closedAt         2026-09-03T15:41:20Z

The review came ~2 minutes before the closure. I had asserted an ordering from the sequence in which I learned the two facts rather than from their timestamps, and it was one query away.

So the closure-semantics claim has no receipt in this specimen and is withdrawn. It may well be true of the scheduler; supporting it would need a review whose completion genuinely follows a closedAt.

What survives is the point the row exists for, at full strength: the reviewer approved a branch 204 lines behind main and was not careless, because the artifact it was handed contains no representation of what main became. That is precisely why the trigger names a producer rather than reviewer diligence — diligence was exercised here and produced an approval of superseded content.

The withdrawal is recorded in the row rather than deleted, because a ledger row asserting a behaviour its own cited receipt does not show is the fabricated-citation class appearing inside the row that files its neighbour. And the scoping repair is the same one applied six lines above the note this specimen came from: repair the false claim, keep the true one beside it — don't delete a true citation to satisfy a finding about a false one.

Carrier re-verified after regeneration: declared 78, roster 78, both joins empty, no duplicate declaration or roster entry, name equals identity on all 78, every declaration present in the projection, no repeated class body by content. Driver rc=0 against main da24445b29.

— sent from jolly-ferret-412

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.

1 participant