docs(pm-dispatch,os-dev): 串行接力一夜沉淀的六条缺口补进 SKILL —— 接力模式、锚点措辞、裁决传播扫描、停摆纠偏、飞行中重叠、预期红停放 (#5441) - #5501
Conversation
…摆纠偏、飞行中重叠、预期红停放 (#5441) 2026-08-04/05 夜 spec 车道以串行接力连落 10 个 PR(#5304 → #5365),六个情形是 现行 SKILL 没有覆盖、靠现场即兴的,各有实付学费。按 issue 注明的落点章节逐条插入: - 第 7 步「入队与落地」新增平行小节「串行接力」:每棒一整圈(auto-merge 由 PM 挂、 dev 永不碰,ready 与 auto-merge 顺序不可反且每棒各走一次)、相邻棒同文件交接语义 而非文本(#5318/#5319 实例)、两棒散文互锁由 PM 指派分工(#5323↔#5365、#5335)。 - 「入队与落地 A」新增锚点断言措辞:authenticity = baseRev 是 origin/main 祖先 且 keys 与该 commit 逐行一致;baseRev 允许滞后;⛔ 不得要求 baseRev == merge-base (那会教唆手改锚点,即 #4650 攻击自身)。四步序的第 3 步补上「先 commit merge」, 并引用 #5370 / #5371 两个新陷阱(仅引用,不实现)。 - 第 5 步派发词 + 第 7 步 review 新增「裁决传播 = 全仓 pin 扫描」:翻 pin 一轮翻完 且必须保留承重(#5322 裁决、#5365 的 REST 层漏翻)。 - 第 6 步 Collect 的 subagent 半边新增停摆纠偏:watcher 永不触发,中途状态即停摆 信号,第三次视为不可靠改走接手协议。生产端半边同步落到 os-dev.md 资源纪律第 6 条。 - 第 5 步 same-day churn 新增姊妹段「飞行中范围重叠」:每轮读 origin/main 时对每个 在飞 dispatch 做相交判断,相交即预警(#5322 × #5335 实例)。 - 「入队与落地 B」新增依赖 PR 的预期红停放:draft 停放 + 签名级预期红清单 + 解除 条件,新签名才是真问题(#5365 的 REST 红即由此识别)。 仅改 `.claude/` 内部 agent 协议文本,不发布任何包;六条落点之外未动任何段落。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
自查发现的方向错误:「Handing off an interrupted dev」小节是第 5 步的子节 (SKILL.md:839),而新增段落写在第 6 步(:923),原文写「below」会把读者指向 第 6 步之后的 Cloud mode 段。同段里对 cloud-mode ~2h 阈值的「below」是对的,保留。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE
…,不是 00:0xZ issue #5441 正文写「#5335 在 00:0xZ 合入」,核 GitHub API 的 merged_at 与 main 上 squash 提交的 committer date,两者一致给出 2026-08-04T23:49:44Z。改写成「起飞后 32 分钟合入(merged_at 2026-08-04T23:49:44Z)」,把不可核验的钟点换成可核验的 时间差 + 权威字段;起飞时刻 23:17Z 沿用 issue 的记述(无仓内产物可核,且非承重)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE
自查补两条(已推,head
|
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 31016486579 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
#5501(#5441 的实施)已于 2026-08-05T15:02:23Z 合入 main,本分支终轮 git merge origin/main 无冲突(两 PR 的落点区段互不相交)。机械合并之后补两处**语义**叠加, 使两侧意图相加而不是并排放置: - step 6 Collect:#5501 的停摆纠偏靠 SendMessage 唤醒一个还活着的对面,而座位 Routine 的 fire 结束后没有可唤醒的 subagent —— 停摆与「会话已销毁」在 GitHub 上是同一个读数。补一段:验证管线可能超过一个 fire 的活,一开始就走 mode:cloud, 把恢复权交给下一轮的 GitHub 读数。 - 座位 Routine 化一节:补跨 fire 长流程的可行性依据 —— 串行接力(一棒一整圈 + 棒间 PM 复核)必然跨多个 fire,能跨过去是因为交接物全是 GitHub 读数(draft/ ready、auto-merge 是否挂上、预期红停放那份签名级清单写在 PR body 里);因此 对长流程只加一条要求:接力/停放的每一项都要落成 GitHub 上可读的文本,不许把 「下一棒该干什么」留在会话记忆里。 未改 #5501 的任何原文(含其「飞行中范围重叠拦截」段 —— 它说的是 PM 为**自己** 在飞的 agent 复查 main,双射之下天然就是本车道范围,与本单删掉的跨 PM 全局在飞 检查不是同一个机制,无需改写)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N3uGFF8teXbpgtbEJ1aYXu
Fixes #5441
2026-08-04/05 夜 spec 车道以串行接力连落 10 个 PR(#5304 → #5306 → #5308 → #5318 → #5319 → #5321 → #5314 → #5312 → #5323 → #5365),其中六个情形是现行 SKILL 没有覆盖、全靠现场即兴的。按 issue 注明的落点章节逐条插入,六条落点之外未动任何段落。
前提核验(基于合并后的 origin/main,HEAD = 0285f7f)
issue 提醒 SKILL.md 今日已两改(#5453 三轴 / #5468 域表),章节位置有位移 —— 已基于合并后文本施工。六条全部确认缺失:
grep 接力零命中;A/B 两条只写单 PR 流程grep baseRev零命中;authorable-surface仅 1 命中(A 的八条路径清单)grep 裁决传播/INVALID_FILTER均零命中grep 停摆零命中;原文只有「死掉 / 输出畸形算 blocked」grep 飞行中零命中;在飞5 处全属域车道的批次选择,非在飞预警grep 预期红零命中;notes 2 只覆盖 flaky 的偶然红第 2 条的措辞逐条对着代码核过,不是照抄 issue:
packages/spec/scripts/build-schemas.ts的verifyCommittedSurfaceBase()文档注释与实现只查两件事 —— baseRev 是 origin/main 的祖先(merge-base --is-ancestor)、keys 与该 commit 的 surface 逐行一致(compareAnchorKeys)。没有任何地方要求 baseRev == merge-base。const drifted = ... JSON.stringify(committed.doc.keys) !== JSON.stringify(anchor.keys),且if (drifted && !CHECK)才写 —— 即只在 keys 漂移时才推进 baseRev;同处注释写着 "Staleness is NOT an error"。PR fix(spec): #4650 删除闸门改用树内基线锚点,按 SHA 钉住的离线消费者构建不再硬失败 (#5235) #5304 的正文同样写明「滞后是合法的,不是错误 ……--check只证明它真实(authentic),不要求它最新(current)」。gen:schema在 merge 未 commit 时运行,会把 authorable-surface 锚点倒退回旧 merge-base —— 生成器写入、门全绿、静默撤销 main 的锚点推进 #5370 /gen:schemarmSync 整个json-schema/会顺手抹掉gen:openapi的产物,rest 的 openapi 路由测试随后 503 假红——check:generated原地跑 build-schemas 也触发 #5371 两单已核实存在且开放(os-regen 驱动指示的gen:schema在 merge 未 commit 时运行,会把 authorable-surface 锚点倒退回旧 merge-base —— 生成器写入、门全绿、静默撤销 main 的锚点推进 #5370bug/pm:queue,gen:schemarmSync 整个json-schema/会顺手抹掉gen:openapi的产物,rest 的 openapi 路由测试随后 503 假红——check:generated原地跑 build-schemas 也触发 #5371finding),文中仅引用、明确写「⛔ 不要在接力单里顺手实现」。其余案例编号也已核实:10 个 PR 全在 main 上;#5365 的合并 diff 确实同时改了
packages/rest/src/analytics-filter-refusal-envelope.test.ts(+87)与 service-analytics 层,正是第 3 条「消费层各有拷贝」的实证;INVALID_FILTER在 objectql / rest 十余个文件里有拷贝。改动内容
.claude/skills/pm-dispatch/SKILL.md(+135)auto-merge由 PM 挂 / dev 永不碰(ready 与 auto-merge 顺序不可反,且每棒各走一次,不是整链一次);相邻棒同文件交接语义而非文本(fix(spec): app 表单摘掉八个已退役的墓碑键输入,#3786 对账门改判「真实可授权面」(#5280) #5318/feat(spec)!: ViewItemSchema 拆成授权门 + wire 变体,并让 wire 的开放递归生效 (#5074) #5319 同动metadata-form-zod-reconciliation.test.ts,取一边会「各自绿、合起来错」);两棒散文互锁由 PM 在两侧指派分工(fix(driver-mongodb): 空$and/$or/$not归约成布尔单位元,非 filter 节点先响亮拒收 (#5239) #5323 ↔ fix(service-analytics): 空 $and/$or 按布尔单位元归约,两个编译器对齐五后端,四条进一致性表 (#5322) #5365、fix(service-analytics)!: 作者的where也 NULL-safe ——$not下推守卫、{$not:{}}为零行、{}析取项吸收$or(#5325) #5335 的 pin 块),否则两边都动或都不动,两种结果在 CI 上都是绿的。gen:schema在 merge 未 commit 时运行,会把 authorable-surface 锚点倒退回旧 merge-base —— 生成器写入、门全绿、静默撤销 main 的锚点推进 #5370,留着注解等于自留「声明与执行不一致」。git log origin/main时对每个在飞 dispatch 做「新落地 PR × 在飞文件面」相交判断,相交即预警(四条内容);并点明它与 Operational notes 8 的分工 —— notes 8 是 PM 替自己入队前复查,这条是替别人在飞的 agent 复查。.claude/agents/os-dev.md(+11) —— 第 4 条的生产端半边(PD #12:生产端修复优于 PM 端补救):资源纪律新增第 6 条「前台跑完,不要把验证挂到后台等唤醒」,并区分出唯一合法的长等待是第 1 条的flock排队。os-dev.md:263的字节自扫正则(#5484 的目标行)已下移到 :274,内容一字未动。按内容 grep,不要按行号。未动的两处(刻意)
skills/objectstack-pm-dispatch/SKILL.md(已发布镜像):那是面向客户的泛化版本(有 Quickstart / Configuration,没有「入队与落地」这类本仓专属小节),六条里的案例编号与本仓 issue 号对它无意义。沿用 docs(pm-dispatch,os-dev): 决策分析轴由两条扩为三条 —— 补「实际业务需求」轴与创业聚焦原则 (#5130) #5453 的先例(「已发布目录里的镜像本次刻意未动,那是发布内容,另单处理」)。os-dev.md的字节自扫正则:os-dev.md 的「自扫」正则比门禁本身还窄:#5460 把 DEL 纳入扫描面后,那条指令会给出假绿 #5484 的活,已单独排队。skip-changeset标签,与派发口径不同 —— 请复核派发口径要求「空 frontmatter changeset,先例
.changeset/pm-dispatch-three-axis-decision-frame.md」。该先例已被今日更晚合入的 #5467(修 #5292)改判,现行Check Changeset门禁的失败文案原文:门禁文案逐字点名
.claude/属路由 2。本 PR 因此走标签路线(已挂skip-changeset)。这正是 SKILL 第 5 步「same-day churn」讲的那件事发生在派发口径本身上:先例来自 #5453,而 #5467 在其后落地。若维护者/PM 仍要求那份 in-repo 散文记录,一条空 changeset 即可补上(说一声就加),但按门禁的说法它下游不到任何 CHANGELOG。验证
.claude/的实际读者只有两个门(其余两个的 ROOTS 不含.claude/,如实说明,不冒充覆盖):不覆盖
.claude/但一并跑过、确认无回归:字节纪律自扫(超出门禁扫描面,含 #5460 加入的 DEL):
没有测试可加,如实说明:改动是两份
.claude/内部 agent 协议散文,不含任何可执行代码路径;packages/spec的check:skill-docs/check:skill-refs生成链的SKILLS_DIR指向仓根skills/(已核build-skill-docs.ts:28、build-skill-references.ts:34),读不到.claude/,所以没有生成物需要重生成。pnpm test/pnpm typecheck对本 diff 无信息量,未跑 —— 报告里不拿它们充作证据。🤖 Generated with Claude Code
https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE
Generated by Claude Code