You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[incident] The merge=os-regen driver exited 0 on a live merge while DISCARDING main's side of content/docs/references/ui/view.mdx — caught and repaired in-round, but a zero exit from that driver is not evidence the merge happened #17602
Incident record, filed by the domain:spec execution seat. The merge=os-regen driver was observed, on a live merge, exiting 0 while discarding one side. This is the failure the seat has been probing for on every merge that touches a routed path; it has now happened and been caught. ⚠️ It was caught and repaired in the same round — nothing wrong reached main — so this is a record and a prevention question, ⛔ not an outage.
The measurement
Merge round on PR #17298 (card #17063): origin/mainabc4b83ce8 merged into the PR head, 127 commits behind, 48 files.
10 of the 48 paths are routed to merge=os-regen (⚠️ see the register note below).
Of those 10, exactly one was changed on both sides — content/docs/references/ui/view.mdx — so that is the only path where the driver actually had a merge to perform.
It exited 0 having kept the branch blob 347d5117 verbatim and discarded main's 6552cb19.
⇒ ⛔ A zero exit from this driver is not evidence the merge happened. That is the whole content of this card.
The repair, and the reading that proves it
The round took main's side for that one path per os-regen-merge.sh step 2 (worktree only, hash-proven), kept the branch's own bytes for the other nine, then re-derived the retirement's rows on top. Survival probed on all 10 routed paths with a lit control on every file — 0 of 10 failed. For the both-sides file, occurrences counted with grep -o | wc -l (⛔ not grep -c, which counts lines), against three reference trees:
⇒ Both sides present in the merged tree, control lit, negative control dark.
⭐ Two register readings that moved, and why quoting is not measuring
The merge=os-regen register moved. The dispatch order recalled 9 routed paths from a reading taken hours earlier; re-derived at merge time it is 10 — packages/spec/liveness/state-counts.md (.gitattributes:141) was absent from the recalled list. The order instructed the re-derivation and the re-derivation paid. ⇒ ⛔ A routed-path list quoted from an earlier comment is recall, not a reading.
The governed-path count also moved, on the same PR. It read 2 of 48 at 04:37Z and again at 22:50Z; on the new head it reads 1 of 48 — skills/objectstack-ui/SKILL.md alone — because skills/objectstack-ui/references/react-blocks.md is now lifted by the #11705 generated-surface exception, being a pure regeneration byte-equal to gen:react-blocks recomputed on the tree. ⚠️The verdict is unchanged (the PR is still governed and still ends in a human hand merge); only the arithmetic moved. ⇒ Same lesson, second instrument.
⚠️ A second failure mode the same merge produced, with no conflict marker at all
Main added a third describe.each site naming viewDoorsCarryingPageMountCheck; the branch had renamed that identifier to viewDoorsCarryingObjectLevelChecks. Both edits auto-merged cleanly, exit 0, no marker, leaving a dangling identifier — and tsup does not type-check tests, so the package build was green. Only check:test-typecheck saw it (TS2304). ⇒ A rename on one side plus a new call site on the other is invisible to git's merge and to the build; the gate is what caught it. Recorded as the existing gate working, ⛔ not as a gap in it.
What this card asks for (⛔ the lane decides; this seat proposes nothing binding)
Should a zero exit from git-merge-regen.mjs be trusted at all, or should the driver itself refuse rather than silently prefer one side when it cannot regenerate? A driver that exits 0 on a merge it did not perform is the shape that makes every downstream reading unreliable.
Is the per-artifact survival probe the standing requirement for any merge touching a routed path, or should it be mechanised? Today it is seat discipline carried in dispatch orders — which worked here, and which will not survive the seat that forgets to write it.
What this does NOT claim
⛔ No claim that anything wrong reached main. It did not: caught in the round, repaired in the round, probed on all 10 paths afterwards.
⛔ No claim this is the first occurrence. The seat has carried "the driver exits 0 while dropping a side" as a working fact for some time; what is new is a measured instance on a live merge with the blobs named. ⚠️ If an older card already records the behaviour, this one should be folded into it — see the dedupe limit below.
⛔ No claim about the other nine routed paths' merge behaviour: only one had a both-sides change, so the other nine exercised nothing.
⛔ No claim about os-regen-merge.sh being wrong; its step 2 is exactly what repaired this.
Incident record, filed by the⚠️ It was caught and repaired in the same round — nothing wrong reached
domain:specexecution seat. Themerge=os-regendriver was observed, on a live merge, exiting 0 while discarding one side. This is the failure the seat has been probing for on every merge that touches a routed path; it has now happened and been caught.main— so this is a record and a prevention question, ⛔ not an outage.The measurement
Merge round on PR #17298 (card #17063):
origin/mainabc4b83ce8merged into the PR head, 127 commits behind, 48 files.merge=os-regen(content/docs/references/ui/view.mdx— so that is the only path where the driver actually had a merge to perform.347d5117verbatim and discarded main's6552cb19.⇒ ⛔ A zero exit from this driver is not evidence the merge happened. That is the whole content of this card.
The repair, and the reading that proves it
The round took main's side for that one path per
os-regen-merge.shstep 2 (worktree only, hash-proven), kept the branch's own bytes for the other nine, then re-derived the retirement's rows on top. Survival probed on all 10 routed paths with a lit control on every file — 0 of 10 failed. For the both-sides file, occurrences counted withgrep -o | wc -l(⛔ notgrep -c, which counts lines), against three reference trees:⇒ Both sides present in the merged tree, control lit, negative control dark.
⭐ Two register readings that moved, and why quoting is not measuring
The
merge=os-regenregister moved. The dispatch order recalled 9 routed paths from a reading taken hours earlier; re-derived at merge time it is 10 —packages/spec/liveness/state-counts.md(.gitattributes:141) was absent from the recalled list. The order instructed the re-derivation and the re-derivation paid. ⇒ ⛔ A routed-path list quoted from an earlier comment is recall, not a reading.The governed-path count also moved, on the same PR. It read 2 of 48 at 04:37Z and again at 22:50Z; on the new head it reads 1 of 48 —⚠️ The verdict is unchanged (the PR is still governed and still ends in a human hand merge); only the arithmetic moved. ⇒ Same lesson, second instrument.
skills/objectstack-ui/SKILL.mdalone — becauseskills/objectstack-ui/references/react-blocks.mdis now lifted by the #11705 generated-surface exception, being a pure regeneration byte-equal togen:react-blocksrecomputed on the tree.Main added a third
describe.eachsite namingviewDoorsCarryingPageMountCheck; the branch had renamed that identifier toviewDoorsCarryingObjectLevelChecks. Both edits auto-merged cleanly, exit 0, no marker, leaving a dangling identifier — andtsupdoes not type-check tests, so the package build was green. Onlycheck:test-typechecksaw it (TS2304). ⇒ A rename on one side plus a new call site on the other is invisible to git's merge and to the build; the gate is what caught it. Recorded as the existing gate working, ⛔ not as a gap in it.What this card asks for (⛔ the lane decides; this seat proposes nothing binding)
git-merge-regen.mjsbe trusted at all, or should the driver itself refuse rather than silently prefer one side when it cannot regenerate? A driver that exits 0 on a merge it did not perform is the shape that makes every downstream reading unreliable.What this does NOT claim
main. It did not: caught in the round, repaired in the round, probed on all 10 paths afterwards.os-regen-merge.shbeing wrong; its step 2 is exactly what repaired this.domain:speclabel set,state=all, since 2026-07-01 ⇒ 400 issues ([security] datasource credential in a nested config position is served in cleartext on read — redaction is top-level-key-only #13405–The ADR-0087 ledger entry for the aggregate x field-type refusal says "no non-temporal pair changes behaviour" — PR #17559 makes that false, andobjectstack migrate meta/ the upgrade guide are its only readers #17561), grepped foros-regen(5 hits, all closed and all about generated artifacts rather than the driver's merge behaviour),git-merge-regen(0),drop… a side(0),.gitattributes(2). Lit control on the same corpus:merge driver|merge=→ 4 ⇒ the zeros are readings.since=2026-07-01, by the corpus ceiling The ADR-0087 ledger entry for the aggregate x field-type refusal says "no non-temporal pair changes behaviour" — PR #17559 makes that false, andobjectstack migrate meta/ the upgrade guide are its only readers #17561, and by thedomain:speclabel — a card indomain:devxordomain:skillsrecording the same behaviour would not appear.domain:*.Refs: #17063 / PR #17298 (where it was measured) · #15141 / PR #17554 (the probe that passed, earlier tonight) · #11705 (the generated-surface exception) ·
.gitattributes:140-157·scripts/git-merge-regen.mjs·os-regen-merge.sh.domain:specexecution seat ·session_01MkQhmuuJAVDjmeWNixwDDH· measured and filed 2026-09-11T02:20ZGenerated by Claude Code