Skip to content

Commit 1a0c04f

Browse files
committed
chore(merge-driver): say what the scratch merge measured about the guide's removed route
A merge made from a checkout carrying the new .gitattributes conflicts on the stub. A branch forked before this change still defers the guide on its first merge of main, because git reads routes from the merging checkout; the merged tree has no row to discharge the deferral against, so the next commit and the push are refused where, with the route, they passed and the stub was lost. Claude-Session: https://claude.ai/code/session_01VZqqwTj2wsihZEbfT6yyYN Co-authored-by: Claude <noreply@anthropic.com>
1 parent fb96a94 commit 1a0c04f

2 files changed

Lines changed: 13 additions & 7 deletions

File tree

‎.gitattributes‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,15 @@
3838
# it any more. It is a hand-written pointer stub naming the guide's public address,
3939
# and `gen:upgrade-guide` writes the gitignored docs pages under
4040
# content/docs/protocol-upgrade/ instead (NOT_DRIVER_MANAGED records that path). A
41-
# route there would now be harmful, not idle: the driver keeps one side WHOLE, so a
42-
# merge between the stub and a side still carrying a generated guide would keep
43-
# whichever side the driver chose, with nothing left to regenerate it from. Unrouted,
44-
# that merge text-merges and conflicts on the stub.
41+
# route there was harmful, not idle: the driver kept OURS whole, and the pre-commit
42+
# discharge then passed it, because `check:upgrade-guide` compares no committed
43+
# copy — so a branch carrying a generated guide merged the stub away in silence.
44+
# Unrouted, a merge made from a checkout that carries this file conflicts on the
45+
# stub. ⚠️ git reads the route from the checkout DOING the merge, so a branch
46+
# forked before #22483 still defers the guide on its first merge of main; the merged
47+
# tree has no row to discharge it against, so the next commit and the push are
48+
# refused instead of passed (measured on PR #22556 with the previous head as the
49+
# control, both merge directions).
4550
#
4651
# `merge=os-regen` hands those paths to `scripts/git-merge-regen.mjs`, which does
4752
# NOT text-merge them. See that file for why it also does not regenerate them

‎scripts/regen-artifacts.mjs‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -932,9 +932,10 @@ export const NOT_DRIVER_MANAGED = Object.freeze([
932932
+ 'runs before `next build`. Git never merges them. Recorded because this generator used to own '
933933
+ 'a ROUTED row, `docs/protocol-upgrade-guide.md`, and #22483 took that row out on purpose: the '
934934
+ 'file is now a hand-written pointer stub that nothing generates, so "discard both sides and '
935-
+ 're-run the generator" would discard the stub with no generator to bring it back. A merge '
936-
+ 'that meets it on both sides is a human\'s, and its conflict is the signal. Same expiry clause '
937-
+ 'as the three untracked entries above: committing these pages turns this entry red.',
935+
+ 're-run the generator" would discard the stub with no generator to bring it back, and '
936+
+ '`check:upgrade-guide`, which compares no committed copy, would pass the loss. A merge that '
937+
+ 'meets the stub on both sides is a human\'s. Same expiry clause as the three untracked '
938+
+ 'entries above: committing these pages turns this entry red.',
938939
},
939940
{
940941
path: 'docs/audits/**',

0 commit comments

Comments
 (0)