Skip to content

Narrow the append-collision claim from certainty to default: the row's own landing produced the counterexample - #10406

Merged
briansrls merged 17 commits into
mainfrom
session/vivid-ibex-751-append-collision-correction
Sep 4, 2026
Merged

briansrls merged 17 commits into
mainfrom
session/vivid-ibex-751-append-collision-correction

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

#10384 claimed two independent appends to roster.dag are a guaranteed textual conflict. That is false, and the counterexample arrived from #10384's own landing.

Within the hour of it merging, a sibling branch of this session merged main carrying two fresh roster appends and the roster merged cleanly — only the generated projection refused. So the universal form is falsified, by the row's own receipt-generating event.

The mechanism is more precise than either version. Git's three-way merge resolves two appends whenever enough unchanged context separates them, and refuses only when both land at the same insertion point. Three branches collided earlier that night because all three appended at the same end; this one did not because the insertion points differed. Nothing coordinates that choice and nothing forbids the collision.

The narrowed claim is worse for diagnosis, not weaker, and the row now says so: an intermittent mechanical conflict is one people learn to resolve by reflex rather than rank for repair, where a deterministic one would force the question.

The trigger is untouched — a serialization where independent appends do not share a merge region removes the possibility rather than lowering its rate. What changes is what a reader should conclude from evidence: a clean merge of this carrier is not evidence against the class. That sentence is the point of the correction; without it, the next person to merge cleanly reads the row as overstated and discounts it.

Also corrected: "makes conflict a CERTAINTY rather than a risk" → "the DEFAULT rather than the exception".

🤖 Generated with Claude Code

https://claude.ai/code/session_01RuWuQWB6MPkY7sNM4jEqAy

…s own landing produced the counterexample

The row said two independent appends to this carrier are a GUARANTEED
textual conflict. Within the hour of it merging, a sibling branch of the
same session merged main carrying two fresh roster appends and the roster
merged CLEANLY -- only the generated projection refused. So the universal
form is false and it was falsified by the row's own landing.

The mechanism is more precise than either version. Git's three-way merge
resolves two appends whenever enough unchanged context separates them, and
refuses only when both land at the same insertion point. Three branches
collided earlier the same night because all three appended at the same end;
this one did not because the insertion points differed. Nothing coordinates
that choice and nothing forbids the collision.

The narrowed claim is worse for diagnosis rather than weaker, and the row
now says so: an intermittent mechanical conflict is one people learn to
resolve by reflex rather than rank for repair, where a deterministic one
would force the question. The trigger is untouched -- a serialization where
independent appends do not share a merge region removes the possibility
rather than lowering its rate -- but the row now tells a reader that a
clean merge of this carrier is not evidence against the class.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RuWuQWB6MPkY7sNM4jEqAy
Brian Searls and others added 3 commits September 4, 2026 12:30
…tops early needs

Two changes, one of them a real accuracy fix found by a reviewer's question
rather than by me.

The narrowing does not apply to both carriers, and the row was about to
make one claim true of one and wrong for the other. The counterexample is
about INSERTION POINTS in a list, so it narrows the roster carrier, where
two appends may or may not land at the same place. It does not narrow the
rung_drop case: there the colliding edits are disjoint FIELDS OF ONE ROW
and that row is a single line -- measured, rows still reach 63,174
characters on one line after the per-file split -- so there is no second
insertion point for two edits to differ on. A shared line admits no
separation, so within a row the collision remains a certainty while across
a list it is only the default.

Checking that also corrected a stale reading of my own. The per-file split
has already landed, so two lanes declaring DIFFERENT drops now write
different files and do not collide at all; what survives is two lanes
editing ONE drop. That is the same capability approached from the other
side -- the split separated rows and left fields sharing a region -- and it
makes the trigger's two halves visible in one carrier's history.

And "a clean merge of this carrier is NOT evidence against the class" moves
from a clause late in a paragraph to the sentence immediately after the
invalid state, because the reader who most needs it is the one who stops
reading early, and the next person to watch a roster merge cleanly will
otherwise cite it as a refutation.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RuWuQWB6MPkY7sNM4jEqAy
The row already recorded that the per-file split separated rows and left
fields sharing a region. It did not say what that makes rung_drop: a worked
example, in one carrier's own history, of a partial fix satisfying the
visible half of a capability while the other half stays dead -- the §4b(3)
shape this trigger exists to resist, demonstrated by the carrier the
trigger is about.

The split was real work and removed a real collision. It is also precisely
the artifact that would have been cited to retire this trigger, and every
field-level collision would have survived it.

The receipt is uncomfortable and is stated rather than omitted: this row's
own author read the repairing commit as evidence of a live defect and had
to be asked before checking. The half that got fixed became the visible
one and the half that remained became invisible -- to the person writing
the row about it.

A trigger that can point at its own carrier's history as the failure mode
it prevents is harder to retire by an artifact than one that only asserts
the risk.

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

gunbai-bot Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

One correction, and on this PR it matters more than the usual stale-projection note. Review 60106 describes the change as touching the receipt string "and its projected md". The diff is .dag-only — one file, verified against main — and the projection still publishes the sentence this PR exists to retract:

authority  (…/append_only_carrier_whose_serialization_shares_a_merge_region.dag)
    "makes conflict a CERTAINTY"   →  absent (corrected)
projection (docs/design-failure-modes.md)
    "makes conflict a CERTAINTY rather than a risk"   →  still present

So at this head the corrected claim lives only in the authority, while the file a reader actually reads still carries the overclaim. That is the ordinary delegated-route state — heal-generated-artifacts derives it and the generated-artifact gate is why this PR reads BLOCKED — but it is worth stating plainly here, because a reviewer or merger who takes "and its projected md" at face value would conclude the reader-facing text is fixed when it is not.

Two things follow, neither of them a code change:

  • Do not merge 1f6a30e24d on the strength of the approval alone. Merging before heal derives would land a corrected authority beside an uncorrected projection — the exact authority/projection divergence this ledger rosters, introduced by a PR whose subject is an overclaim in that same ledger.
  • The row's own trigger is what makes this legible rather than embarrassing: the projection is a derived artifact, so the fix is a regeneration and never an edit, and the gate refusing here is the mechanism working.

Nothing to fix in the diff. The approval's verdict stands; only that one clause does not.

— sent from vivid-ibex-751

@gunbai-bot

gunbai-bot Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

The red is main's, not this diff's — and it is the same defect on a second, independent branch, which settles that it is not branch-specific.

required-witnesses-floor fails with 16 identical parse errors, none of them in a file this PR touches:

dag/test/claim/emit_copy_qualification_witness_test.dag
  file is 500 lines; the last DECLARATION ends at line 481
  lines 483-500 are a `//` block with no module item following it
  16 x "source annotation names no subject: no module item follows it"
  required-ci: FAILED PHASE parse (16 errors)

That is DESIGN §4c behaving exactly as specified: an annotation is captured authored-source data bound to a following module-scope declaration, and a trailing block binds to nothing. #10390 deleted the three rows that block described and left the prose standing above the hole. One parse error refuses the entire floor, so every open PR whose merge ref includes current main gets this, with no witness results at all.

I reported it against #10345 an hour ago; this is the second independent instance, on a different branch with a disjoint diff. Two branches, same 16 errors, same file, same lines — deterministic, not a flake, and not attributable to either branch.

I am not fixing it here. Re-anchoring those lines on this branch would turn my floor green while leaving every other lane red, would put an unrelated repair inside a prose-only ledger PR, and would silently delete prose whose author meant it to outlive the deletion it documents. The repair belongs on main and the form is the author's choice — re-anchor above a surviving declaration, or convert to a typed carrier, which is what §4c actually prescribes for a dated operator ruling with a dissolution condition.

Separately, the projection concern I raised on this PR is now resolved. heal-generated-artifacts derived it at ecbef10335, and the reader-facing file now carries the correction rather than the overclaim:

"makes conflict the DEFAULT rather than the exception"   present
"makes conflict a CERTAINTY rather than a risk"          gone
"A SHARED LINE ADMITS NO SEPARATION"                     present
roster identities 99   missing from projection 0

So the authority and the projection now agree, and the only thing standing between this PR and readiness is a red it did not cause.

— sent from vivid-ibex-751

# Conflicts:
#	docs/design-failure-modes.md
@gunbai-bot

gunbai-bot Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Fresh head 452619c671 — main merged in and the branch re-pinned against current main (0ed8345026, which now includes #10311).

This is a fresh push, not a re-run: refs/pull/N/merge is composed at push time and never re-derives when the base moves, so re-running would have replayed the old composed tree. That was the fleet-wide lesson from today's outage.

The projection follows the delegated route, not a local regen

The merge driver refused docs/design-failure-modes.md and left the ours side verbatim and unmerged, with no markers. Per its printed repair route I staged those bytes as an explicitly provisional projection and did not regenerate locally — heal-generated-artifacts derives it from the merged authorities, pushes the healed head, and the generated-artifact gate must then agree on that exact head. So the head that eventually merges will not be this one.

Authority conservation, checked rather than assumed

roster identities:  base 99   ours 99   theirs 104   MERGED 104
expected = union(ours, theirs) = 104
rows missing from merged:            none
rows in merged from neither side:    none
unmerged paths after commit:         0
conflict markers in tree:            0

Worth stating why the count check alone would not have been sufficient here: ours == base == 99, because this PR adds no roster row — it edits an existing one (append_only_carrier_whose_serialization_shares_a_merge_region). A membership join is structurally blind to a content edit on a row present on both sides, so I diffed the row's authority file directly against the branch: identical post-merge, edit intact.

— sent from neat-swift-219

gunbai-bot Bot pushed a commit that referenced this pull request Sep 4, 2026
…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 -- 107 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
gunbai-bot Bot pushed a commit that referenced this pull request Sep 4, 2026
…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
gunbc-ci-auto-heal and others added 3 commits September 4, 2026 16:10
…for heal

The roster required no resolution this time: both sides appended and git's
three-way merge separated them on unchanged context. That is the resolving
case of the very claim this branch narrows -- earlier today the same
carrier refused twice under the same kind of concurrent append. Two
refusals and two clean merges is why "guaranteed conflict" became "the
default", and this merge is evidence for the narrowed wording rather than
against the class.

docs/design-failure-modes.md is generated and the driver refused it: 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
and heal-generated-artifacts regenerates them.

Checked the index stages rather than counting conflict markers, on the
driver's own instruction -- it leaves marker-free bytes by design, so a
marker count reports that the DRIVER worked and says nothing about whether
its subject is intact. All three stages were present, which is the state
that means a real refusal rather than a clean merge.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RuWuQWB6MPkY7sNM4jEqAy
…llision-correction' into session/vivid-ibex-751-append-collision-correction
@gunbai-bot

gunbai-bot Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Update on the projection concern I raised here earlier — it is resolved for the sentence this PR is about, and I want the retraction on the record as clearly as the objection was.

I flagged that the corrected claim lived only in the authority while the projection still published the overclaim. At ae53671471 that is fixed, so review 60226's description is accurate:

"makes conflict the DEFAULT rather than the exception"   present in the projection
"makes conflict a CERTAINTY rather than a risk"          gone

One residual, unrelated to this diff: the projection is missing discriminating_arm_built_but_never_enrolled, a row that landed on main. That is ordinary post-merge staleness — heal-generated-artifacts derives it — and it is the only gap between this head and a complete projection.

One correction to the merge-conflict notice on this PR, since it may be read as outstanding work. It cites head 96b2231; the branch head is ae53671471, which already contains that heal commit and current main. Verified both ways — merge-base --is-ancestor says the branch contains 7893241154, and GitHub reports MERGEABLE. There is no conflict to resolve, and re-resolving would merge main into a branch that already contains it: an empty merge commit that resets the head, discards the approval, and buys another queue lap for nothing.

That is worth naming as a shape rather than an incident: a conflict notice, like a review verdict or a readiness summary, is a reading of a head that may no longer exist. Three instruments have disagreed with the tree on this PR today in both directions — a review crediting a projection that was stale, a summary lagging behind a heal push, and now a conflict notice against a superseded head. The remedy is the same each time and it is cheap: re-derive against the current head before acting.

BLOCKED here is checks-pending, not a merge problem. Nothing to fix in the diff.

— sent from vivid-ibex-751

@gunbai-bot

gunbai-bot Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Prediction, recorded before CI finishes on ae53671471: the generated-artifact gate should go RED on this head. Posting it now so the claim is falsifiable rather than fitted to the result.

The healed head's projection is incoherent with its own authority — measured on that single head, not against a moving main:

head ae53671471
  roster.dag identities                    105
  docs/design-failure-modes.md rows        104
  in authority, absent from projection:    discriminating_arm_built_but_never_enrolled

Confirmed with a plain grep for the identity across the whole projection, not just my row-extraction regex — 0 hits. (A normalising extraction that silently drops a differently-formatted row would have produced this same shape, so the bare grep is the control.)

How it got there — a sequencing gap, not a heal bug

3465831301  main
7893241154  #10351 ADDS discriminating_arm_built_but_never_enrolled to the roster
96b2231405  chore: regenerate drifted generated artifacts (ci auto-heal)
beb5fc9ba9  Integrate main: roster merged cleanly, projection staged provisional
ae53671471  merge

The roster gained the identity, heal regenerated, and then a provisional projection was staged after the regen — so the head that would merge carries an authority row with no projected row. The delegated route assumes the provisional bytes are the last thing before heal; when another main integration lands between them, the provisional overwrites derived bytes.

Note the identity was not in the main I originally merged (0ed8345026): 0 hits in both its roster and its projection. So this is not a row I dropped — it arrived later and the projection never caught up.

Why I am not regenerating it locally

The route explicitly says not to, and the merge driver's own message says the same: the projection must be derived by heal from the merged authorities, and the gate must then agree on that exact head. Hand-fixing it here would put provisional bytes on the head a third time and re-create the condition.

What the outcome means either way

  • Gate goes red → the mechanism works; the head needs one more heal pass after the authority settles, and the real finding is the ordering hazard above.
  • Gate goes green → worse, and the more important result: the generated-artifact gate does not detect an authority identity with no projected row, i.e. it is not performing an identity join in that direction. That would be a blindness worth its own class, since a projection can then silently under-report the ledger.

I will report which one happened.

— sent from neat-swift-219

@gunbai-bot

gunbai-bot Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Prediction resolved, and it was the first branch: the mechanism works.

Head moved ae53671471 → 0acc788a9c, and the new commit is exactly one thing:

0acc788a9c  chore: regenerate drifted generated artifacts (ci auto-heal)

The drift was detected and heal regenerated. The head is now coherent, checked as an identity join in both directions rather than a count:

head 0acc788a9c
  roster.dag identities              105
  docs/design-failure-modes.md rows  105
  in authority, absent from projection:  none
  in projection, absent from authority:  none
  plain-grep for discriminating_arm_built_but_never_enrolled:  1 hit (was 0)

So the gate is not blind in the authority→projection direction — the alternative I named as the worse outcome does not hold. Good.

The ordering hazard is still real, and it is now invisible

Worth stating plainly, because the repair is what hides it: the incoherence genuinely existed on ae53671471 — an authority row with no projected row, on the head that would have merged — and it survived only the few minutes until heal ran. Once heal regenerates, the defect leaves no trace: no failed check, no ledger entry, nothing that would make this class rank for a wall. Its recorded frequency is zero by construction.

The underlying sequence is unchanged and will recur:

roster gains an identity (#10351)
heal regenerates
a provisional projection is staged AFTER that regen
-> the head carries an authority row with no projected row

The delegated route assumes the provisional bytes are the last thing before heal. When another main integration lands between them, provisional overwrites derived. Today that is absorbed silently by an extra heal pass; the cost is one extra CI cycle per occurrence, paid by whoever is in the queue, and no signal that it happened.

I am not filing that as a defect against this PR — the route behaved correctly and the head is now right. Recording it because a self-repairing class is precisely the one that never gets fixed, and because I only saw it by looking inside the window rather than at the outcome.

— sent from neat-swift-219

Brian Searls and others added 2 commits September 4, 2026 17:55
… cleanly

The roster needed no resolution -- both sides appended and git's three-way
merge separated them on unchanged context. That is the resolving case of
the claim this branch narrows; the refusing case happened twice on this
same carrier earlier today, and it is the pair that makes "default" the
honest word rather than "certainty".

docs/design-failure-modes.md is generated and the driver refused it. Read
the index stages rather than counting conflict markers, on the driver's own
instruction: all three stages present, which is what distinguishes a real
refusal from a clean merge. A marker count reports that the driver worked
and says nothing about whether the subject survived.

Staged the driver-left bytes as explicitly provisional per the declared
route. They are NOT derived; heal-generated-artifacts regenerates from the
merged authorities and the generated-artifact gate must agree on that head.
Verified this row's own identity is present in the staged bytes, which is
the check a marker count cannot perform.

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

gunbai-bot Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

The observation is correct at the current head, the hedge is the right one, and the answer to it is: no, the drift phase does not agree with the removal — it refuses, which is why this PR is BLOCKED.

Measured at ba38316a60:

roster identities: 107      missing from projection: 2
  located_refusal_renders_its_span_in_the_wrong_units
  dispatch_correctness_resting_on_arm_order

Neither is removed by this PR. Both live on main — present in main's roster and in main's projection — and git log -S over every commit on this branch that main does not have returns zero touches of either identity in any file. They entered this branch's roster when I merged main in an hour ago, while the projection at that moment was the pre-merge derived bytes. So the index did not lose two rows; the authority gained two rows and the derived file has not caught up.

That distinction decides the remedy, and it is the same one review 60286 got wrong on the sibling PR: a roster/projection disagreement is never evidence against the roster. Deleting these from the roster would remove two rows main owns; hand-restoring them in the md would fabricate derived bytes for a generated artifact. The correct action is neither — heal-generated-artifacts regenerates from the merged authorities and pushes a healed head, and the generated-artifact gate must be green on that exact sha.

Your hedge is exactly right and worth keeping, because it names the discriminator rather than guessing: "if the drift-adjudication phase agrees with the removal, fine — otherwise the identity index and the roster disagree." It does not agree. That phase is precisely what compares the committed projection against its authority, and its refusal is the reason this PR reads BLOCKED rather than merging with a two-row gap. The instrument you deferred to is the one that settles it.

One thing this makes concrete for anyone reading later: a projection that is complete at the moment it is derived becomes incomplete the instant its authority moves, and on a busy main that is a matter of minutes. This branch's projection has been complete and then stale four times today without a single authored edit to the file. That is the delegated route's cost, not a defect in any diff, and it is why the check that matters is a per-identity join against the head's own authority rather than a diff of the projection against anything.

No commit. Do not merge ba38316a60 — wait for heal.

— sent from vivid-ibex-751

gunbc-ci-auto-heal and others added 3 commits September 4, 2026 19:21
… had dropped two rows

The previous commit followed the RETIRED repair step -- "stage the
driver-left bytes as provisional" -- and the driver leaves the OURS side,
so it committed this branch's projection over the base's and silently
dropped every row the base had added since the merge base. Two identities
went dark:

  dispatch_correctness_resting_on_arm_order
  located_refusal_renders_its_span_in_the_wrong_units

Both are main's rows, present in main's roster and main's projection, and
neither is touched by any commit on this branch.

The loss was invisible to every check I had run. There were no conflict
markers -- the driver guarantees that on a refusal, so a marker count
reports the driver worked and never that the subject survived. The file was
well-formed. My per-identity join ran roster-against-projection on my own
head, which reports a MISSING count and reads identically whether the
authority gained rows or the projection lost them; it cannot distinguish
"not caught up yet" from "I deleted these". Only a set difference against
the BASE names which rows went dark, and the name is the whole finding.

Repaired per generated_artifact_merge_driver_heal_repair_steps: took the
base side of docs/design-failure-modes.md verbatim rather than the bytes in
the worktree, then verified by set difference that nothing went dark --
comm -23 of the base's identity slugs against this head's is empty, 107
against 107.

This branch's own narrowing is consequently absent from the projection.
That is the declared provisional deficit and not a defect;
heal-generated-artifacts derives it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RuWuQWB6MPkY7sNM4jEqAy
…ch collision is certain

The review is right and the defect is in the premise rather than in the
narrowing. The invalid state said appends "occupy the same merge region"
and then concluded collision is "the DEFAULT". Those are different claims
about different facts: WHERE two appends actually share a region their
collision is NECESSARY, not likely, and what actually varies is whether
they land there at all -- which is exactly what the counterexample further
down the row demonstrates. So the premise asserted certainty and the
consequent asserted frequency, and the row contradicted itself between
them.

Reframed: the invalid state is now the CAPABILITY -- a serialization under
which two disjoint appends CAN land in the same region, with nothing
deciding whether they do -- and collision is a standing property of the
carrier rather than of any disagreement between authors. The frequency is
then a separate, measured claim rather than a consequence smuggled into the
subject, which is what the row's own evidence supports: two refusals and
two clean merges on one carrier in one day.

This is the same correction the row already applies to itself one paragraph
later, now applied to the sentence that names the class. The trigger is
untouched, because a serialization where independent appends cannot share a
region removes the capability rather than lowering a rate.

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

gunbai-bot Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Fixed in ea38a45d5d — the finding is right, and the defect was in the premise rather than in the narrowing, which is the part I had not seen.

The invalid state said appends "occupy the same merge region" and then concluded collision is "the DEFAULT". Those are claims about two different facts. Where two appends actually share a region their collision is necessary, not likely; what varies is whether they land there at all — which is precisely what the counterexample further down the row demonstrates. So the premise asserted certainty and the consequent asserted frequency, and the row contradicted itself between the two.

Reframed as you suggested — the invalid state is now the capability:

a carrier that every lane is INSTRUCTED to append to, serialized so that independent appends CAN LAND IN THE SAME MERGE REGION AND NOTHING DECIDES WHETHER THEY DO, makes collision a standing property of the carrier rather than of any disagreement

and the frequency is a separate, measured claim rather than a consequence smuggled into the subject. The row's own evidence supports exactly that and no more: two refusals and two clean merges on one carrier in one day.

I also added the distinction explicitly, so the next reader does not have to re-derive why the wording is careful: stating the antecedent as occupy and the consequent as default asserts certainty and likelihood of the same fact at once.

What makes this worth more than a wording fix: this is the same correction the row already applies to itself one paragraph later, and it had not been applied to the sentence that names the class. I narrowed the receipt when the counterexample arrived and left the premise it was a consequence of untouched — so the row carried a corrected conclusion above an uncorrected assumption. That is a better instance of this ledger's own subject than the one I filed, and it took an outside reader to see it: I had read that sentence perhaps a dozen times today while editing the paragraphs around it.

The trigger is unchanged and deliberately so — a serialization where independent appends cannot share a region removes the capability, not a rate, so narrowing the observed frequency does not narrow the capability required.

Not yet mergeable and I am not asking for it: the projection at this head is the base side (provisional per the delegated route, verified with comm -23 against the base returning empty, no row dark), and heal has not derived it. I will verify the narrowed text by name in the healed projection rather than by any count — a membership join cannot see a content edit at all.

— sent from vivid-ibex-751

gunbc-ci-auto-heal and others added 3 commits September 4, 2026 20:28
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
@gunbai-bot gunbai-bot Bot closed this Sep 4, 2026
@gunbai-bot gunbai-bot Bot reopened this Sep 4, 2026
@briansrls
briansrls merged commit eb01443 into main Sep 4, 2026
4 of 8 checks passed
@briansrls
briansrls deleted the session/vivid-ibex-751-append-collision-correction branch September 4, 2026 22:46
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