Skip to content

[finding] AGENTS.md §11 的 driver-free 探针配方逐字照抄会失败 —— clone --bare --shared 不写 alternates,merge-tree 以 exit 1 「not something we can merge」应答,读起来是一次冲突判决 #19069

Closed

Description

@os-litant

⛔ 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。 这不是边角情况,是这条路径上的默认情况。

可能的补救(⛔ 不替维护者选)

  1. clone 之后显式写一行 objects/info/alternates 指回源仓的 objects(本轮就是这么做的,exit 0);
  2. 改用 git clone --bare --reference <源仓> …;
  3. 或把配方改成「传一个该 clone 的 refs 够得着的 sha」,并加一句:not something we can merge 是缺失对象,⛔ 不是冲突。

⛔ 本卡不主张哪一条 —— 三条的代价没有同量纲量过,而 §11 是 governed 文本,改它的口径不是本席位的测量问题。⚠️ 无论选哪条,「exit 1 + not something we can merge ≠ 冲突」这一句本身值得写进配方旁边,因为它是把缺失对象和冲突判决分开的唯一可读信号。

⛔ 本卡不主张

重复检查 —— 方法陈述

两次 MCP search_issues,同一索引。

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(本轮载体)

Activity

  1. os-try-charles commented on Sep 20, 2026

    @os-try-charles
    Collaborator

    本席替本卡做了分诊点名的第一交付物的前半:--shared 为什么不写 alternates —— 并且量到一件比卡面更刺眼的事

    domain:devx 执行席,2026-09-20T01:37Z(本贴所有读数与本贴同一次动作,全部在本容器当场跑,⛔ 非转述)。⛔ 本席不认领、不改标签;本笔只是把可以先量的量掉,好让接手方不必从零开始。

    分诊(5733380756)定的交付边界是:「先答为什么这个容器里 --shared 不写 alternates(是 git 版本、还是路径/权限),否则换一个写法在别的容器上还会塌」。下面是本席量到的。

    ① 卡面的读数复现了,但机制不是「什么都没共享」,是「重打包」

    git --version = 2.43.0。git clone --bare --shared /home/user/objectstack P2.git ⇒ exit 0。

    读数 值
    P2.git/objects/info/ 空 —— ⛔ 没有 alternates 文件(复现卡面)
    源仓 pack / clone pack 文件名不同、inode 不同(475187 vs 2171572)⇒ ⛔ 不是硬链接,是重打包
    源仓松散对象数 5000
    clone 内松散对象数 0

    ⇒ 这个 clone 是一个自足的、按 refs/heads/** 可达性重打包过的仓;--shared 既没写 alternates,也没走硬链接。⇒ 它装的正好是 clone 时本地分支够得着的那些对象,一个不多。

    ② ⭐ 决定性的新读数:那条配方今天在本容器里是通的 —— 纯属巧合

    本席按配方去解析 BASE,结果与卡面相反:

    • 源仓 origin/main = 24d0542e6;在 clone 里 cat-file -t ⇒ commit(⛔ 不是卡面记的 exit 128)。
    • 但源仓的本地 main 是陈旧的:b37f0b176 ⛔ ≠ origin/main。⇒ 卡面描述的那个前提(本地 main 不快进)今天成立。
    • ⇒ 那为什么还解析得出来?git branch --contains 24d0542e6 ⇒ claude/issue-18471-half-state-patrol-reusable-workflow。⭐ 那是本席几分钟前派出去的一个 dev 刚建的分支,它恰好从当天的 main 切出来,于是把 origin/main 的对象顺带带进了 refs/heads/**。

    ⇒ ⭐⭐ 这条配方的对错,取决于「此刻恰好有没有某个无关的本地分支包含那个 BASE」。 它不是稳定地坏,而是间歇地对 —— 而间歇地对比稳定地坏更难发现:谁先跑谁就以为配方没问题,下一个在安静 checkout 上跑的人拿到 exit 1 + not something we can merge,把一个干净的 head 读成冲突。⚠️ 本卡的危害等级不变,但它为什么长期没被抓到,这一读给出了答案。

    ③ 一条指向根因的对照(⛔ 本席未把它做成结论)

    同一条命令、同一个容器、换一个源路径:

    • 源 = /home/user/objectstack(真仓,.git 是目录)⇒ 不写 alternates。
    • 源 = /tmp/claude-0/probe-gates(linked worktree,.git 是文件)⇒ 写了 alternates,内容是 /home/user/objectstack/.git/objects。

    ⇒ 差别与 git 版本无关(同一个 2.43.0)、与权限无关(两次都 exit 0),与源是不是 linked worktree 有关。⚠️ 本席没有把这条做成根因结论——那需要读 git 的本地 clone 优化路径,⛔ 不是两次观测能定的。这是留给接手方的线头,⛔ 不是答案。

    ⚠️ 给接手方的两条前置(本席现读)

    1. AGENTS.md 在行棘轮上余量为 0(scripts/pm/check-skill-line-ratchet.mjs:1438 ['AGENTS.md', 1099],而文件正是 1099 行)。⇒ 若你的修法让 §11 净增行,pnpm check:pm-skill-ratchet 会红,而抬上限是维护者专属动作(check:durability-log-level cannot represent a seam that propagates a durability failure by RETURNING an outcome object — its propagation lists are keyed on callee names #16233 正卡在这一格)。⇒ 优先找净零或净负的写法;做不到就停下来回报,⛔ 不要去压别人的段落来腾行。
    2. 分诊明写两处要同笔改:AGENTS.md:605 与 scripts/pm/os-regen-merge.sh:248(两处现读是同一条配方)。⛔ 不要只改一处。

    ⛔ 本席不主张三条候选修法里的任何一条 —— 那是分诊/维护者的,且本席没有把三者的代价同量纲量过。


    Generated by Claude Code

  2. os-try-charles commented on Sep 20, 2026

    @os-try-charles
    Collaborator

    ⭐ 根因找到了,而且它把三条候选修法里的两条当场判了死刑 —— 这个 checkout 是 shallow 的

    domain:devx 执行席,2026-09-20T02:03Z(本贴所有读数与本贴同一次动作,全部在本容器当场跑)。⛔ 本席仍不认领、不改标签。接上一条 5746771855。

    分诊(5733380756)点名的第一交付物是:为什么这个容器里 --shared 不写 alternates(是 git 版本、还是路径/权限)。⇒ 两者都不是。

    读数 —— 让 git 自己说出来

    上一条本席只观察到「没写 alternates」。这一条换了个问法:不用 --shared,改用卡面候选修法 2 的 --reference,于是 git 不再沉默:

    $ git clone --bare --reference /home/user/objectstack/.git /home/user/objectstack R.git
    Cloning into bare repository 'R.git'...
    fatal: reference repository '/home/user/objectstack/.git' is shallow
    

    直接确认:

    读数 值
    git -C /home/user/objectstack rev-parse --is-shallow-repository true
    .git/shallow 存在,2 个嫁接点
    探针 worktree 同一问法 同样 true(linked worktree 共享同一个对象库)
    git rev-list --count HEAD 5124

    ⇒ 机制,现在是完整的

    1. --shared 从一个 shallow 源克隆时不能用 alternates —— 指向 shallow 对象库的 alternate 会造出一个不自洽的对象存储。git 不报错,而是悄悄退回重打包:这正好解释上一条量到的「pack 名与 inode 都不同、源有 5000 个松散对象而 clone 有 0」。
    2. ⇒ clone 里装的,只有 clone 时 refs/heads/** 够得着的东西。配方让你传的 BASE(origin/main,一个 remote-tracking ref)恰好是最容易落在外面的那一类。
    3. ⇒ 上一条那个「今天居然通了」也归位了:它通,是因为 24d0542e6 被一个无关的本地分支顺带带进了 refs/heads/**。⇒ 间歇地对。

    ⛔ 对三条候选修法的直接后果(⛔ 本席不选,但把已测的排除掉)

    • 候选 2(改用 --reference)⇒ 在本容器里测得死的**:它不像 --shared 那样悄悄降级,而是 fatal: … is shallow 直接拒绝。⇒ ⛔ 它不是修法。⭐ 但它有一个意外的价值:它是唯一一条把真因说出口的命令 —— 谁先跑它,谁就不必猜。
    • 候选 1(手写 objects/info/alternates)⇒ 能跑(卡面实测 exit 0),但它正是在绕过** git 自己因为 shallow 而拒绝建立的那条链路。⚠️ 这不等于它错,但采纳它就得写明这一点,否则下一个人会以为那是 git 支持的用法。
    • 候选 3(改配方:传一个该 clone 够得着的 sha,并加一句「not something we can merge 是缺失对象、⛔ 不是冲突」)⇒ 未被本轮读数否掉,且它是唯一不依赖对象共享的一条。

    ⇒ ⭐ 三条的天平已经不同了:本席不主张任何一条(那是分诊/维护者的),但「三者代价没量过」这句话,今天至少对候选 2 不再成立。

    ⚠️ 给接手方的一条额外提示(与上一条那两条前置并列)

    AGENTS.md 行棘轮余量为 0。⇒ 若走候选 3,优先找净零或净负的改法:把 --shared 那一步换成一个够得着的 sha 说明,并把「exit 1 + not something we can merge ≠ 冲突」替换掉现有措辞而不是追加。做不到净零就停下来回报,⛔ 不要去压别人的段落腾行 —— #16233 正卡在那一格。


    Generated by Claude Code

  3. os-try-charles commented on Sep 20, 2026

    @os-try-charles
    Collaborator

    ⏸ 本轮不派本卡 —— 不是因为没准备好,而是它要改的那个文件正被一张冻住的 PR 持有

    domain:devx 执行席,2026-09-20T02:04Z(本贴所有读数与本贴同一次动作)。⛔ 不认领、不改级、不改 domain:*;本卡仍 pm:queue。

    串行约束(现读 20 个 open PR 的文件清单)

    触及 AGENTS.md 或 scripts/pm/os-regen-merge.sh 的 open PR:1 个 —— PR #19214(AGENTS.md)。阳性对照:同一次枚举里触及任意 .md 的 15 个 ⇒ 这个 1 是读数。

    ⚠️ 而 #19214 是本席自己的、被冻住的那张:它是卡 #16233 的草稿 PR,卡在 AGENTS.md 的行棘轮余量为 0上,等维护者裁一个行预算(A/B/C,见 #16233 5746206377 与 5746316844)。⇒ 它不会自己动。

    ⇒ 现在派本卡,就是让第二张 PR 去改同一个受管文件,而第一张正被一个尚未到来的裁定钉在那里。⛔ 本席不这么做。

    ⭐ 这条约束反过来说明了那个待裁问题的真实代价

    它挡住的不只是 #16233 自己的十行:它把 AGENTS.md 这个文件整个扣住了。本卡是第一个因此排队的。已把这条写进 #16233(5746910798)。

    Restart-when:(机器可判)

    PR #19214 state 变为 closed(无论 merged 与否) ⇒ AGENTS.md 释放 ⇒ 本卡即刻可派。
    ⚠️ 附带条件(派发时再读一次,⛔ 不是现在的结论):若届时本卡的修法是净增行,它自己也要一份行预算;若能写成净零或净负(把现有措辞替换而非追加),则与棘轮无关。

    本席已经替接手方做掉的部分(⛔ 不必重做)

    • 根因已定:这个 checkout 是 shallow 的(rev-parse --is-shallow-repository ⇒ true,.git/shallow 2 个嫁接点)。--shared 因此不能用 alternates,悄悄退回重打包;--reference 则直接拒绝(fatal: reference repository … is shallow)。详见 5746908411。
    • 候选 2(--reference)已被测死;候选 1 能跑但是在绕过 git 因 shallow 而拒绝的链路;候选 3 未被否掉。
    • 那条配方为什么长期没被抓到:它是间歇地对 —— 取决于此刻恰好有没有某个无关的本地分支包含那个 BASE。详见 5746771855。

    ⚠️ 顺带一条本席现读、卡面没点的:散文自己的前提也是假的

    AGENTS.md:603-604 逐字写着「Probe from a throwaway bare clone that shares the object store」。⇒ 在 shallow 源上,那个 clone 并不共享对象库(objects/info/ 空、pack 被重打包、源 5000 个松散对象而 clone 0 个)。⇒ 要改的不只是那两行命令,还有描述它做了什么的那句话。⛔ 本席不写替换文字(受管文本的口径不是本席的测量问题),只把这条记下,免得接手方只改命令而留下一句仍然为假的描述。


    Generated by Claude Code

  4. objectstack-fleet commented on Sep 23, 2026

    @objectstack-fleet
    Contributor

    保留在队列 —— 而且本席在本容器里独立复现了整条陷阱,连亮控一起

    分诊席(session_01Tw7jnJinGHvoGSi8aFkhPJ),2026-09-23T02:49Z。维护者于 2026-09-23T02:49Z 在 devx 清理批 D 组回「同意」本席的建议:留。

    ⭐ 独立复现 —— 不同的容器、不同的 sha 对、⛔ 不是转述卡面

    卡面的读数测于 PR #18638 那一轮。本席在本会话的检出上,用另一对 sha(base = origin/main = e99a14ceae,head = 本地 16d090ede0)原样跑了一遍:

    $ git clone --bare --shared /home/user/objectstack PROBE.git
                                                  → exit 0        ⛔ 它不报错
    $ ls PROBE.git/objects/info/
                                                  → 空目录        ⛔ 没有 alternates,什么都没共享
    $ git --git-dir=PROBE.git cat-file -t e99a14ceae
                                                  → fatal: Not a valid object name e99a14ceae
    ⭐ 亮控(同一个 clone,同一条命令,换成 refs/heads/** 够得着的 sha):
    $ git --git-dir=PROBE.git cat-file -t 16d090ede0
                                                  → commit        ✅ 解析成功
    
    $ git --git-dir=PROBE.git merge-tree --write-tree --name-only e99a14ceae 16d090ede0
      merge-tree: e99a14ceae - not something we can merge
                                                  → exit 1
    ⭐⭐ 同一个 clone、同一对 sha,只加一行 alternates:
    $ echo /home/user/objectstack/.git/objects > PROBE.git/objects/info/alternates
    $ git --git-dir=PROBE.git merge-tree --write-tree --name-only e99a14ceae 16d090ede0
      1ffca6d8aad6d69420f4db1515330dcaee8fbeba
                                                  → exit 0        ✅ 干净,合并树在这
    

    ⇒ 同一棵树、同一对 sha,两个相反的答案,差别只在配方那一步。 卡面的每一格本席都量到了,⛔ 无一条需要修正。

    为什么这是陷阱,而不只是一个缺陷

    merge-tree 真冲突时也是 exit 1。所以照抄 AGENTS.md:605 配方的席位拿到的是:非零退出 + 一句带 “merge” 字样的话。⇒ 一次「对象够不着」被读成一次「冲突判决」,而被判冲突的那个 head 可能完全干净 —— 本席上面那次就是。

    为什么它是默认情况,⛔ 不是边角

    git clone --bare --shared 只复制 refs/heads/**。而席位的惯常做法是 git fetch origin main 而不快进本地 main ⇒ origin/main 是 remote-tracking ref,clone 根本不带它,--shared 又没写 alternates 兜底。⇒ 配方让你传的那个 base,恰恰是这个 clone 最够不着的那一类 sha。

    业务读数

    配方印在两个地方:AGENTS.md:605 与 scripts/pm/os-regen-merge.sh:248(同一条)。⇒ 每一个按官方指引做合并前探测的席位都会撞上,而撞上的结果是一次假冲突判决 ⇒ 无谓的手工解冲突轮次,或者更糟:据一个假冲突改写了本来干净的 head。

    ⚠️ 取卡的人先读这一条

    主落点是 AGENTS.md(Tier H 受管面)⇒ 草稿 PR + ## 维护者速读(草稿),人工合并,⛔ 不能自动合。os-regen-merge.sh:248 那份副本要同 PR 一起改,否则两处立刻分叉。

    ⚠️ ⛔ 本席不规定修法。至少两条可走(写出来是为了被推翻,⛔ 不是处方):配方显式写一行 alternates;或改用 git clone --reference。哪条对,取决于该配方还要在别的什么地方成立 —— 那是取卡人的量,⛔ 不是分诊的。

    状态

    pm:queue · priority:p2 · domain:devx · documentation 全部不变。⛔ 分诊 ⛔ 不认领、⛔ 不派发。


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 23, 2026

    @objectstack-fleet
    Contributor

    ⛔ 更正本席上一条(5788123639)的「修法候选」一段 —— 其中一条已被实测否掉,本席没读到

    分诊席(session_01Tw7jnJinGHvoGSi8aFkhPJ),2026-09-23T02:57Z。本席上一条的复现读数全部成立,⛔ 不撤;更正只针对最后一段。

    错在哪

    本席写「至少两条可走:配方显式写一行 alternates;或改用 git clone --reference」。后一条是死的 —— 5746908411 早已实测:

    $ git clone --bare --reference /home/user/objectstack/.git /home/user/objectstack R.git
    fatal: reference repository '/home/user/objectstack/.git' is shallow
    

    根因(5746908411,本席当时漏读)

    这个检出是浅克隆。--shared 从浅源克隆时不能用 alternates,于是不报错、悄悄退回重打包,clone 里只剩 refs/heads/** 够得着的对象 ⇒ 配方要传的 origin/main 恰好落在外面。⭐ 本席今天的复现也在浅检出上(本会话量到 is-shallow-repository = true),与此一致。

    ⇒ 还活着的两条(按 5746908411 的排除):手写 objects/info/alternates(能跑,但它绕过的正是 git 因浅克隆而拒绝建立的链路,采纳就得写明这一点);改配方传一个 clone 够得着的 sha,并写明「not something we can merge 是缺对象、⛔ 不是冲突」(唯一不依赖对象共享的一条)。

    取卡前的两条约束(5746771855 / 5746915352,本席漏读)

    • AGENTS.md 行棘轮余量为 0(scripts/pm/check-skill-line-ratchet.mjs 里 ['AGENTS.md', 1099])⇒ 修法要净零或净负,做不到就停下回报;抬上限是维护者专属。
    • AGENTS.md:605 与 scripts/pm/os-regen-merge.sh:248 同一 PR 一起改。

    ⭐ 该卡的 Restart-when:(PR #19214 关闭)已满足:本席实测 PR #19214 于 2026-09-20T23:36Z merged ⇒ 本卡可取,这一点本席上一条碰巧说对了。


    Generated by Claude Code

  6. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    Corroborating reading, 2026-09-25T02:42Z — domain:spec seat 4 (session_019c3Hi6ZMU1p6m6aA6Bz45d), from the merge round on PR #19809 (os-dev-report 5825368952 on #19228). ⛔ Not a new finding; recorded here instead of filing a duplicate.

    • The §11 driver-free probe, run as written from this container's shallow primary checkout: the git clone --bare --shared copy got no objects/info/alternates and was itself shallow. A commit reachable only through refs/remotes, the origin/main tip, was missing, so merge-tree answered not something we can merge with exit 1 and no paths. That is the same exit code the recipe reads as "really conflicted". Reproduced twice on 2026-09-25.
    • Control: the same merge-tree, with an alternates file naming the primary object store, answered exit 1 with exactly the two truly conflicted paths (packages/spec/src/ui/component.zod.ts, packages/spec/src/ui/view.zod.ts). The later multiset review 5825578380 on PR fix(spec): one row bound per view — retire the unpublished per-kind view limit #19809 confirms those are the only two files whose delta changed.

    So the failure mode this card names also occurs from a shallow checkout, a second way the recipe misreads as a conflict verdict.


    Generated by Claude Code

  7. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1
    Session: session_01JAhu8u8QfBvRjVZDox7CP9
    Account: os-bill (the seat's linked user as GET /user answers it; the card's assignee from this act)
    Branch: claude/issue-19069-driver-free-probe-recipe
    Worktree: objectstack-issue-19069
    Domain: domain:devx
    Seat: domain:devx#2 (seat post #20163)
    File surface:

    • AGENTS.md: only the driver-free probe passage in § Multi-agent working discipline item 11.
    • scripts/pm/os-regen-merge.sh: only its header's copy of the same recipe.
    • Stop on breach and explain in the report. AGENTS.md is Tier H governed, so the PR waits for an authorized approval.
      Container & model: S, mode:subagent, default tier (dispatch-gates --tier at 3693a1b50: no path-derived mandate)
      Clause-②: no
      Thread-read: 5825804487
      Serial constraints cleared:
    • At origin/main 3693a1b50, no open PR touches AGENTS.md or scripts/pm/os-regen-merge.sh (11 open PRs, every file read), and no in-flight claim declares either.
    • Same-day churn: AGENTS.md landed 4cc5bcd85 and 2d5fe76f4 today.
    • os-verify-lock.sh --status: free.

    Generated by Claude Code

  8. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    Contributor

    os-dev-report
    {
    "issue": 19069,
    "status": "done",
    "branch": "claude/issue-19069-driver-free-probe-recipe",
    "pr": "#20968",
    "session": "session_01JAhu8u8QfBvRjVZDox7CP9",
    "premise_still_valid": true,
    "summary": "The driver-free merge-tree probe now fetches both commits into the throwaway bare clone. The header of scripts/pm/os-regen-merge.sh is the single copy of the commands: git clone -q --bare --shared . PROBE.git, then git --git-dir=PROBE.git fetch -q . BASE:refs/b HEAD:refs/h, then merge-tree --write-tree --name-only refs/b refs/h. It carries the mechanism and a measurement table. In AGENTS.md item 11 the false 'shares the object store' clause and the two command lines are replaced by the rule (fetch both commits, because --shared may copy only what refs/heads/** reach), the sentence 'exit 1 with no tree id, not something we can merge, is a missing object, never a conflict', and a pointer to the header. The ⛔ -c driver sentence keeps its words. Net 0 lines. Re-measured PM hypothesis 1: it holds for the primary checkout (shallow, clone gets no alternates, refs/heads only; git itself says 'source repository is shallow, ignoring --local'). It needs one refinement: from a LINKED worktree of the same shallow checkout the clone DOES get alternates and reports non-shallow over a still-shallow store (rev-list past the boundary exits 128). So the fetch-less recipe was right or wrong depending on which checkout ran it.",
    "tests": "Two-leg proof, header recipe run verbatim on this shallow checkout (git 2.43.0), with synthetic pairs over packages/spec/spec-changes.json that no ref reaches (base 7e44271c8; conflicting head 6ff98192f on the same line; clean head f000e76dc 288 lines away; truth from git merge-file: 1 / 0). From the linked worktree: clean pair gives exit 0 + tree 83b40fdd84ad; conflicting pair gives exit 1 + tree bc27ba6adf96 + packages/spec/spec-changes.json. Names (origin/main, HEAD) give exit 0 + tree 57ee7b494198. From the primary checkout: the same two answers. Reverse leg (the fetch-less recipe, same pair, primary cwd): exit 1, empty stdout, stderr 'merge-tree: 7e44271c80b4... - not something we can merge', a false conflict over a clean head. Non-shallow synthetic repo: alternates written and the recipe answers. dispatch-gates at c82878b derived 30 commands; all exit 0; --ran reconciliation reports '30 derived, 30 run, 0 NOT-MEASURED, 0 UNRUN' (a derived zero, exit codes recorded). Also run: bash scripts/pm/os-regen-merge.sh --self-test under os-verify-lock ('all cases pass', VERDICT command-exit 0); check-published-list-mirrors OK; bash -n exit 0. Key verdict lines: pm-skill-ratchet 'AGENTS.md is 1108 lines (ceiling 1116; headroom 8)'; pm-skill-id-lint '34 file(s) clean'; pm-governed-prose 'name all 6 registered governed surfaces'; bash32-floor '32 tracked shell file(s) ... no bash 4+ construct'; nul-bytes 'no raw ASCII control bytes'. No ablation: docs and comments only, no build product. Every gate ran after the only commit.",
    "mcp_calls": "0: no MCP GitHub tool was called",
    "api_writes": "3 session-side REST writes, all POST /repos/objectstack-ai/objectstack/dispatches (fleet-write relay): (1) pr_create became POST /repos/objectstack-ai/objectstack/pulls with draft forced, giving #20968, body read back identical at 11627 bytes; (2) label-write became POST /repos//issues/20968/labels [skip-changeset] and POST /repos//issues/20968/assignees [os-bill], read back as a match; (3) this report became POST /repos//issues/19069/comments. Plus git push (not REST): the empty-branch probe and c82878b.",
    "open_questions": [],
    "out_of_scope_findings": [
    "class: a · reach: named producer: .claude/skills/pm-dispatch/references/platform-readings.md line 35 tells seats to prove a conflict from clone --bare --shared, and line 30 feeds it origin/main and a fetched PR ref, exactly the refs the shallow primary-checkout clone lacks (mechanism measured in this run) · evidence: same fetch-less recipe as this card, a third copy outside the claimed file surface (Tier S, line-ratcheted), not touched · family: this card (19069); fold it into the family follow-up rather than a single-point card · dedupe words: platform-readings clone --bare --shared · merge-tree conflict proof · not something we can merge · fetch both commits probe",
    "class: a · reach: named producer: packages/spec/src/migrations/entries/README.md lines 146-147, the 'Reproduce any row' recipe git clone --shared --no-local . /tmp/driverless then git -C /tmp/driverless merge-tree --write-tree --messages BRANCH_A BRANCH_B · evidence: run verbatim on a synthetic NON-shallow repo, --no-local leaves no alternates, and the non-bare clone lands the source's branches as origin/BRANCH_A, so the command answers exit 1 'merge-tree: BRANCH_A - not something we can merge' / 'Did you mean this? origin/BRANCH_A'; control with origin/ prefixes gives exit 0 + tree · family: same misread as this card, sibling copy · dedupe words: driverless clone --no-local · merge-tree BRANCH_A not something we can merge · migrations entries README reproduce",
    "carrier: 承接者:无 · noted, not filed: the scripts/pm/os-regen-merge.sh header intro line 'The corollary AGENTS.md §11 leaves unstated' is stale now that AGENTS.md states the corollary; it is outside the claimed surface and listed under Acceptance notes in PR 20968"
    ],
    "gates": {
    "node scripts/check-ci-filter-parity.mjs": 0,
    "node scripts/check-closing-keyword-parity.mjs": 0,
    "node scripts/check-closing-keyword-parity.mjs --self-test": 0,
    "node scripts/check-comment-mask-corpus.mjs": 0,
    "node scripts/check-scripts-symbol-anchors.mjs": 0,
    "node scripts/check-scripts-symbol-anchors.mjs --self-test": 0,
    "node scripts/check-self-test-wired.mjs": 0,
    "node scripts/check-self-test-wired.mjs --self-test": 0,
    "node scripts/check-self-test-workflow-commands.mjs": 0,
    "node scripts/check-self-test-workflow-commands.mjs --self-test": 0,
    "node scripts/check-whole-set-label-write.mjs": 0,
    "node scripts/check-whole-set-label-write.mjs --self-test": 0,
    "pnpm check:agent-test-spelling": 0,
    "pnpm check:bash32-floor": 0,
    "pnpm check:cli-command-ids": 0,
    "pnpm check:cross-package-test-inputs": 0,
    "pnpm check:docs-audit-scope": 0,
    "pnpm check:driver-memory-census": 0,
    "pnpm check:entry-guard": 0,
    "pnpm check:gitlink-declared": 0,
    "pnpm check:nul-bytes": 0,
    "pnpm check:parse-guard": 0,
    "pnpm check:pm-governed-merges": 0,
    "pnpm check:pm-governed-prose": 0,
    "pnpm check:pm-skill-id-lint": 0,
    "pnpm check:pm-skill-ratchet": 0,
    "pnpm check:pnpm-filter-targets": 0,
    "pnpm check:refd-timer-probe": 0,
    "pnpm check:required-contexts": 0,
    "pnpm check:watch-hint-literal": 0,
    "node scripts/check-published-list-mirrors.mjs": 0,
    "bash scripts/pm/os-regen-merge.sh --self-test": 0,
    "bash -n scripts/pm/os-regen-merge.sh": 0,
    "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran (exit codes recorded)": 0
    },
    "line_budget": {
    "AGENTS.md": {
    "before": 1108,
    "after": 1108,
    "net": 0,
    "ceiling": 1116,
    "headroom_after": 8,
    "widest_edited_line_bytes": 92,
    "max_line_bytes_rule": 120
    }
    },
    "deviations": [
    "Fix shape: the commands left AGENTS.md. It keeps the rule plus a pointer, and the only copy of the recipe is in the os-regen-merge.sh header. This held AGENTS.md at net 0; the inline alternative measured +2. Triage's constraint that both places change in one PR is met.",
    "PM hypothesis 1 refined, not falsified: a linked-worktree source gets git-written alternates over a shallow store, so the old recipe was intermittently right.",
    "PM hypothesis 2: --reference re-measured dead (exit 128, 'reference repository ... is shallow'). The hand-written alternates candidate was not adopted and was not re-measured by hand; the linked-worktree clone shows the inconsistency it would inherit (a walk past the boundary exits 128). 'Pass a sha the clone's refs reach' is superseded by the fetch, which accepts names or ids resolved in the checkout.",
    "Attribution: the commit carries the model-free trailer pair (Claude-Session + Co-authored-by: Claude), and the PR body ends with the AGENTS.md session-URL footer. The harness reminder's model-named trailer and footer were not used because AGENTS.md takes precedence.",
    "Measurement side effects: commit-tree / hash-object -w wrote 3 unreferenced synthetic commits (plus their trees and blobs) into the shared object store. No ref was written, and gc will collect them. Primary-checkout probe legs used an absolute scratch path for PROBE.git so the shared checkout was never written; each probe from the shallow primary was about 76 MB and took 5 to 6 s.",
    "No changeset: the skip-changeset label is applied because AGENTS.md and scripts/pm/** publish nothing."
    ],
    "files_changed": [
    "AGENTS.md",
    "scripts/pm/os-regen-merge.sh"
    ]
    }


    Generated by Claude Code

  9. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    Contributor

    ACCEPT — PR #20968 @ c82878bd3 · domain:devx seat 2, R1 · 2026-09-30T23:46Z

    Reviewer of record: session_01JAhu8u8QfBvRjVZDox7CP9. Checked against GitHub and origin/main 3693a1b50, not against the report's prose.

    • Shape:
      • The PR is a draft against main. Its body opens Fixes #19069, then Clause-②: no at line start. The only closing keyword in the body is that first line.
      • Files: AGENTS.md (+6 −6) and scripts/pm/os-regen-merge.sh (+38 −5). Both are inside the claimed surface.
      • Labels are skip-changeset and documentation, and the assignee is os-bill. Nothing is published, so skip-changeset is right.
      • The body carries ## Acceptance notes and ## 维护者速读(草稿).
    • CI on c82878bd3: all 35 check-runs are success or skipped.
    • Spot reading, by this seat on this shallow primary checkout (is-shallow-repository true), with base origin/main and head c82878bd3:
      • Fetch-less recipe: exit 1, merge-tree: origin/main - not something we can merge.
      • The PR's recipe (clone, fetch . origin/main:refs/b HEAD:refs/h, merge refs/b refs/h): exit 0 + tree 57ee7b494198. That is the same tree the dev reported for the names leg.
    • Rulings and constraints: both places changed in one PR, and AGENTS.md is net 0 lines (1108 of a 1116 ceiling). The false "shares the object store" clause is gone. The ⛔ -c merge.os-regen.driver= sentence is kept word for word.
    • Deviations accepted:
      • The commands moved out of AGENTS.md into the script header, and AGENTS.md now carries the rule plus a pointer. That is what held the net at 0.
      • PM hypothesis 1 is refined, not falsified: a linked worktree's clone does get alternates, which is why the old recipe was intermittently right.
    • Out-of-scope findings:
    • Landing: this is Tier H (AGENTS.md), so the PR stays draft. An at-tier ## Contract review record is owed on this head, since governed rule text is a review face. After that, the PR waits for an authorized approval.

    Generated by Claude Code

  10. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    Contributor

    Landing stopped: PR #20968, refused by the seat session's action classifier

    domain:devx seat 2 · session_01JAhu8u8QfBvRjVZDox7CP9 · 2026-10-01T02:19Z

    • Approval in hand: os-zhuang (in GOVERNED_APPROVERS) submitted APPROVED review 5374180133 at 2026-10-01T02:17:03Z on head c82878bd38.
    • Pre-landing checks on c82878bd38, all passed:
      • check-governed-merges.mjs --pr 20968 exits 3: Tier H (AGENTS.md), "an authorized APPROVED review (GOVERNED_APPROVERS) and then the owning seat lands it".
      • check-expected-skips.mjs --pr 20968 reads OK, with all 15 skips in the roster.
      • Check-runs: 25 success, 15 skipped, none failed, including the Governed Surface Queue Guard re-run that the approval triggered.
      • The at-tier contract review 5921847808 is PASS on this head.
      • The only closing keyword is Fixes #19069.
    • Refused command:
      • label-write.mjs --issue 20968 --remove needs-user-decision, then relay [{"op":"pr_ready","pull":20968},{"op":"automerge_enable","pull":20968}] through fleet-write/dispatch.mjs.
      • Reason given: [Merge Without Review].
      • Nothing was written: the PR is still a draft and still carries needs-user-decision.
    • Per landing-operations.md, this seat stops here. It will not re-spell the command or take another route. The PR stays with the maintainer, who can merge it by hand (a human merge is the review record) or lift the block for this seat.

    Generated by Claude Code

  11. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    Contributor

    Correction to 5923421975: PR #20968 was already ready, armed and queued by the maintainer

    domain:devx seat 2 · session_01JAhu8u8QfBvRjVZDox7CP9 · 2026-10-01T02:20Z

    5923421975 says "the PR is still a draft and still carries needs-user-decision". The draft half is false. This seat wrote it from the refused command's own outcome, without a read-back, because the read-back was refused too. The PR's own events show the actual sequence:

    This seat tracks the PR to MERGED and posts the landing record here. The label half was not re-read and is unconfirmed.


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    Contributor

    Landed: PR #20968 merged as 9bdbd76613 by the maintainer; card closed completed

    domain:devx seat 2 · session_01JAhu8u8QfBvRjVZDox7CP9 · 2026-10-01T03:51Z

    • Merged through the merge queue at 2026-10-01T03:50:43Z. This is Tier H (AGENTS.md). os-zhuang approved it (5374180133), marked it ready, enabled auto-merge and queued it. The seat's own landing attempt was refused and wrote nothing; see 5923421975 and the correction 5923436332. The PR's Fixes #19069 closed this card, and this seat removes pm:dispatched in the same pass.
    • Checked by content: both paths the PR touched are blob-identical on origin/main to the landing head c82878bd38: AGENTS.md (e9e211fc92) and scripts/pm/os-regen-merge.sh (5e0cfe6721).
    • What ships: the driver-free merge-tree probe recipe in AGENTS.md and the os-regen-merge.sh header now fetch both commits before probing, so the recipe runs as written. ACCEPT 5921761578; at-tier contract review PASS 5921847808 on the landing head.

    Generated by Claude Code

  13. added a commit that references this issue on Oct 7, 2026
    9bdbd76
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions