⛔ Recorded for triage; no severity asserted, no domain:*, no type — routing and grading are triage's. Filed by the domain:spec execution PM seat as the residue of PR #18638 的最后一轮 base catch-up。⛔ Not claiming.
一句话
AGENTS.md §11(605 行)和 scripts/pm/os-regen-merge.sh 头部(248 行)逐字印出的 driver-free 可合并性探针配方,在本容器里照抄就失败 —— 且它的失败方式是 exit 1 加一句读起来像冲突判决的话,于是一个完全可合并的 head 会被读成「冲突」。
⚠️ 这不是 #15815 或 #15871 的重复:那两张卡把配方立 了起来(#15815 测出 merge-tree 会遵守 merge=os-regen,#15871 把推论写进 §11)。本卡说的是那条补救本身在这一步上不成立 。
配方逐字
AGENTS.md:605:
git clone --bare --shared . PROBE.git
git --git-dir=PROBE.git merge-tree --write-tree --name-only BASE HEAD
scripts/pm/os-regen-merge.sh:248 印的是同一条(该文件 blob c291f1d784dc661746e95804748f7df579870f35,在 origin/main 与 PR #18638 head 上一致)。
读数 —— 全部在本轮当场跑,⛔ 非转述
读数
值
git clone --bare --shared /home/user/objectstack PROBE.git
exit 0 —— 它不报错
PROBE.git/objects/info/alternates
⛔ 不存在 ;objects/info/ 整个目录是空的 ⇒ 这个 clone 什么都没共享
⛔ 暗读数:cat-file -t 配方要你传的 BASE(origin/main = d4cb05cbf0a)
exit 128 ,fatal: git cat-file: could not get object info
⭐ 亮控(同一个 clone,同一条命令):clone 自己的 refs 够得着的 sha(本地 main = 47863f4fbe)
exit 0 → commit
⇒ 结论
对象不可达是真的 ,不是命令拼错 —— 亮控在同一个 clone 里解析成功
⭐⭐ merge-tree --write-tree --name-only d4cb05cbf0a 34a63b9d583
exit 1 ,输出 merge-tree: d4cb05cbf0a8… - not something we can merge
⭐ 为什么这是陷阱而不只是缺陷
merge-tree 真冲突时也是 exit 1 。所以照抄配方的席位拿到的是:非零退出 + 一句带 「merge」 字样的话。⇒ 一次缺失对象被读成一次冲突判决 ,而被判「冲突」的那个 head 可能完全干净。本轮的实证:同一个 head 34a63b9d583,在一个显式写了 alternates 的探针里跑同一条命令,exit 0,一行输出,合并树 caf1af48bf63。同一棵树,两个相反的答案,差别只在配方那一步。
为什么会这样
git clone --bare --shared 只复制 refs/heads/**。而席位的惯常做法是 git fetch origin main 而不 快进本地 main —— 于是 origin/main 是一个 remote-tracking ref,clone 根本不带它,--shared 又没有写 alternates 兜底。⇒ 配方让你传的那个 base,恰恰是这个 clone 最够不着的那类 sha。 这不是边角情况,是这条路径上的默认情况。
可能的补救(⛔ 不替维护者选)
clone 之后显式写一行 objects/info/alternates 指回源仓的 objects(本轮就是这么做的,exit 0);
改用 git clone --bare --reference <源仓> …;
或把配方改成「传一个该 clone 的 refs 够得着的 sha」,并加一句:not something we can merge 是缺失对象,⛔ 不是冲突 。
⛔ 本卡不主张哪一条 —— 三条的代价没有同量纲量过,而 §11 是 governed 文本,改它的口径不是本席位的测量问题。⚠️ 无论选哪条,「exit 1 + not something we can merge ≠ 冲突」这一句本身值得写进配方旁边 ,因为它是把缺失对象和冲突判决分开的唯一可读信号。
⛔ 本卡不主张
重复检查 —— 方法陈述
两次 MCP search_issues,同一索引。
命中并已逐条读过标题的邻域卡:[finding] git merge-tree honours merge=os-regen, so a local mergeability probe reports MERGES CLEAN where GitHub reports dirty — and the probe writes os-regen-pending into the SHARED git dir #15815 、[governed] AGENTS.md §11: state the corollary that a local merge-tree of an os-regen path is not GitHub mergeability, and name the sound probe (bare shared clone) — the governed half of #15815 #15871 、[finding] os-regen-merge.sh step 1 misreports a MIXED os-regen conflict as "conflicts in NON-generated files" and forbids the hand-resolution the driver just asked for #14671 、[finding] os-regen-merge.sh tells you to rerun it after resolving a conflict, but no tree state lets the rerun perform step 2 — dirty is refused and clean makes merge-base read origin/main tip, so a dropped side stays dropped with exit 0 #18895 、[finding] os-regen 驱动的三条残留读数 —— =false 拼法未被拒、真合并静默丢掉 incoming 侧且 diffstat 看不见、os-regen-merge.sh 在栈式分支上不可用 #18343 、[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 、[finding] git-merge-regen.mjs's .gitattributes reader matches merge=os-regen with a word boundary, admitting rows routed to a different driver #15701 、Tier A of the #16624 class: the merge=os-regen driver and the pre-commit/pre-push gate build throwaway git repos with no environment of their own — the two files git itself invokes #16753 、merge.os-regen.driver 指向「上一个装过依赖的 worktree」的绝对路径 —— 该 worktree 一删,全容器的生成物合并驱动就坏了 #4868 、os-regen 驱动指示的 gen:schema 在 merge 未 commit 时运行,会把 authorable-surface 锚点倒退回旧 merge-base —— 生成器写入、门全绿、静默撤销 main 的锚点推进 #5370 、migrations/registry.ts still text-merges: two ADR-0087 entries with adjacent ids conflict server-side, which is the residue #7297's source sharding could not reach #8360 —— ⛔ 无一张说的是 alternates / 缺失对象 / 假冲突。
逐词读数(两份结果合并):alternates 0 、not something we can merge 0 、false conflict 0 、os-regen probe 0 ;clone --bare 1(即 §11 配方本身的引用)。
⭐ 亮控(同两份结果):merge-tree 21 、objectstack 449 ;暗控 ZZQQNOPE 0 ⇒ 上面那几个 0 是读数,不是死索引。
Dedupe words: objects/info/alternates · clone --bare --shared · not something we can merge · os-regen probe false conflict · merge-tree missing object
Refs
AGENTS.md:602-609 · scripts/pm/os-regen-merge.sh:246-250(blob c291f1d784dc) · #15815 (配方的由来)· #15871 (把它写进 §11 的 governed 轮)· PR #18638 (本轮载体)
⛔ Recorded for triage; no severity asserted, no
domain:*, no type — routing and grading are triage's. Filed by thedomain:specexecution PM seat as the residue of PR #18638 的最后一轮 base catch-up。⛔ Not claiming.一句话
AGENTS.md§11(605 行)和scripts/pm/os-regen-merge.sh头部(248 行)逐字印出的 driver-free 可合并性探针配方,在本容器里照抄就失败 —— 且它的失败方式是exit 1加一句读起来像冲突判决的话,于是一个完全可合并的 head 会被读成「冲突」。merge-tree会遵守merge=os-regen,#15871 把推论写进 §11)。本卡说的是那条补救本身在这一步上不成立。配方逐字
AGENTS.md:605:scripts/pm/os-regen-merge.sh:248印的是同一条(该文件 blobc291f1d784dc661746e95804748f7df579870f35,在origin/main与 PR #18638 head 上一致)。读数 —— 全部在本轮当场跑,⛔ 非转述
git clone --bare --shared /home/user/objectstack PROBE.gitPROBE.git/objects/info/alternatesobjects/info/整个目录是空的 ⇒ 这个 clone 什么都没共享cat-file -t配方要你传的 BASE(origin/main=d4cb05cbf0a)fatal: git cat-file: could not get object infomain=47863f4fbe)commitmerge-tree --write-tree --name-only d4cb05cbf0a 34a63b9d583merge-tree: d4cb05cbf0a8… - not something we can merge⭐ 为什么这是陷阱而不只是缺陷
merge-tree真冲突时也是 exit 1。所以照抄配方的席位拿到的是:非零退出 + 一句带 「merge」 字样的话。⇒ 一次缺失对象被读成一次冲突判决,而被判「冲突」的那个 head 可能完全干净。本轮的实证:同一个 head34a63b9d583,在一个显式写了 alternates 的探针里跑同一条命令,exit 0,一行输出,合并树caf1af48bf63。同一棵树,两个相反的答案,差别只在配方那一步。为什么会这样
git clone --bare --shared只复制refs/heads/**。而席位的惯常做法是git fetch origin main而不快进本地main—— 于是origin/main是一个 remote-tracking ref,clone 根本不带它,--shared又没有写 alternates 兜底。⇒ 配方让你传的那个 base,恰恰是这个 clone 最够不着的那类 sha。 这不是边角情况,是这条路径上的默认情况。可能的补救(⛔ 不替维护者选)
objects/info/alternates指回源仓的objects(本轮就是这么做的,exit 0);git clone --bare --reference <源仓> …;not something we can merge是缺失对象,⛔ 不是冲突。⛔ 本卡不主张哪一条 —— 三条的代价没有同量纲量过,而 §11 是 governed 文本,改它的口径不是本席位的测量问题。⚠️ 无论选哪条,「exit 1 + not something we can merge ≠ 冲突」这一句本身值得写进配方旁边,因为它是把缺失对象和冲突判决分开的唯一可读信号。
⛔ 本卡不主张
merge-tree错了 —— 对象确实不在,它说的是实话;错的是配方喂给它的 base。git merge-treehonoursmerge=os-regen, so a local mergeability probe reports MERGES CLEAN where GitHub reportsdirty— and the probe writesos-regen-pendinginto the SHARED git dir #15815 的结论被推翻 ——merge-tree遵守merge=os-regen仍然成立,这正是要 driver-free 探针的原因。--shared是否会写 alternates。本卡的读数只覆盖本容器。重复检查 —— 方法陈述
两次 MCP
search_issues,同一索引。git merge-treehonoursmerge=os-regen, so a local mergeability probe reports MERGES CLEAN where GitHub reportsdirty— and the probe writesos-regen-pendinginto the SHARED git dir #15815、[governed] AGENTS.md §11: state the corollary that a localmerge-treeof an os-regen path is not GitHub mergeability, and name the sound probe (bare shared clone) — the governed half of #15815 #15871、[finding] os-regen-merge.sh step 1 misreports a MIXED os-regen conflict as "conflicts in NON-generated files" and forbids the hand-resolution the driver just asked for #14671、[finding] os-regen-merge.sh tells you to rerun it after resolving a conflict, but no tree state lets the rerun perform step 2 — dirty is refused and clean makes merge-base read origin/main tip, so a dropped side stays dropped with exit 0 #18895、[finding] os-regen 驱动的三条残留读数 —— =false 拼法未被拒、真合并静默丢掉 incoming 侧且 diffstat 看不见、os-regen-merge.sh 在栈式分支上不可用 #18343、[incident] Themerge=os-regendriver exited 0 on a live merge while DISCARDING main's side ofcontent/docs/references/ui/view.mdx— caught and repaired in-round, but a zero exit from that driver is not evidence the merge happened #17602、[finding] git-merge-regen.mjs's .gitattributes reader matches merge=os-regen with a word boundary, admitting rows routed to a different driver #15701、Tier A of the #16624 class: themerge=os-regendriver and the pre-commit/pre-push gate build throwaway git repos with no environment of their own — the two files git itself invokes #16753、merge.os-regen.driver指向「上一个装过依赖的 worktree」的绝对路径 —— 该 worktree 一删,全容器的生成物合并驱动就坏了 #4868、os-regen 驱动指示的gen:schema在 merge 未 commit 时运行,会把 authorable-surface 锚点倒退回旧 merge-base —— 生成器写入、门全绿、静默撤销 main 的锚点推进 #5370、migrations/registry.tsstill text-merges: two ADR-0087 entries with adjacent ids conflict server-side, which is the residue #7297's source sharding could not reach #8360 —— ⛔ 无一张说的是 alternates / 缺失对象 / 假冲突。alternates0、not something we can merge0、false conflict0、os-regen probe0;clone --bare1(即 §11 配方本身的引用)。merge-tree21、objectstack449;暗控ZZQQNOPE0 ⇒ 上面那几个 0 是读数,不是死索引。Dedupe words:
objects/info/alternates·clone --bare --shared·not something we can merge·os-regen probe false conflict·merge-tree missing objectRefs
AGENTS.md:602-609·scripts/pm/os-regen-merge.sh:246-250(blobc291f1d784dc) · #15815(配方的由来)· #15871(把它写进 §11 的 governed 轮)· PR #18638(本轮载体)