Skip to content

docs(pm-dispatch,os-dev): 串行接力一夜沉淀的六条缺口补进 SKILL —— 接力模式、锚点措辞、裁决传播扫描、停摆纠偏、飞行中重叠、预期红停放 (#5441) - #5501

Merged
os-zhuang merged 3 commits into
mainfrom
claude/issue-5441-relay-mode-gaps
Aug 5, 2026
Merged

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

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 域表),章节位置有位移 —— 已基于合并后文本施工。六条全部确认缺失:

缺口 落点(当前文本) 缺失证据
1 串行接力 第 7 步「入队与落地」平行小节 grep 接力 零命中;A/B 两条只写单 PR 流程
2 锚点措辞 「入队与落地 A」 grep baseRev 零命中;authorable-surface 仅 1 命中(A 的八条路径清单)
3 裁决传播 第 5 步派发词 + 第 7 步 review grep 裁决传播 / INVALID_FILTER 均零命中
4 停摆纠偏 第 6 步 Collect subagent 半边 grep 停摆 零命中;原文只有「死掉 / 输出畸形算 blocked」
5 飞行中重叠 第 5 步 same-day churn 姊妹段 grep 飞行中 零命中;在飞 5 处全属域车道的批次选择,非在飞预警
6 预期红停放 「入队与落地 B」 grep 预期红 零命中;notes 2 只覆盖 flaky 的偶然红

第 2 条的措辞逐条对着代码核过,不是照抄 issue:

其余案例编号也已核实: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)

  1. 新小节「串行接力 —— 同碰生成物的多个 PR,一次只放行一个」(紧随「入队与落地」,同级):三条 —— 每棒一整圈且 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) #5323fix(service-analytics): 空 $and/$or 按布尔单位元归约,两个编译器对齐五后端,四条进一致性表 (#5322) #5365fix(service-analytics)!: 作者的 where 也 NULL-safe —— $not 下推守卫、{$not:{}} 为零行、{} 析取项吸收 $or (#5325) #5335 的 pin 块),否则两边都动或都不动,两种结果在 CI 上都是绿的
  2. 「入队与落地 A」补锚点断言措辞 + 四步序第 3 步补「先 commit 掉这次 merge,再整体重生成」。四步序这处不是加脚注而是直接改正:照原文在 MERGE 状态下重生成就会踩 os-regen 驱动指示的 gen:schema 在 merge 未 commit 时运行,会把 authorable-surface 锚点倒退回旧 merge-base —— 生成器写入、门全绿、静默撤销 main 的锚点推进 #5370,留着注解等于自留「声明与执行不一致」。
  3. 第 5 步派发词补「裁决传播 = 全仓 pin 扫描」:一轮翻完 + 翻 pin 必须保留承重(断言新语义的实质,无效形状的拒收断言原样保留)。两条写成一体:少了后半条,「全仓翻完」会退化成「全仓删干净」。
  4. 第 7 步 review 补一条:实施裁决的 PR 要按错误码 grep 消费层,确认旧立场无残留、且无效形状的拒收断言仍在。
  5. 第 6 步 Collect 补停摆纠偏:watcher 永不触发(完成通知本身即意味无存活子任务);中途状态即停摆信号,立即恢复、⛔ 不等静默阈值;第三次视为不可靠,改走「Handing off an interrupted dev」。
  6. 第 5 步 same-day churn 补姊妹段「飞行中重叠」:每轮读 git log origin/main 时对每个在飞 dispatch 做「新落地 PR × 在飞文件面」相交判断,相交即预警(四条内容);并点明它与 Operational notes 8 的分工 —— notes 8 是 PM 替自己入队前复查,这条是替别人在飞的 agent 复查。
  7. 「入队与落地 B」补预期红停放:draft 停放 + 签名级预期红清单 + 解除条件;新签名才是真问题(fix(service-analytics): 空 $and/$or 按布尔单位元归约,两个编译器对齐五后端,四条进一致性表 (#5322) #5365 的 REST 红即由此识别)。写明它是 notes 2 在故意红上的对偶。

.claude/agents/os-dev.md(+11) —— 第 4 条的生产端半边(PD #12:生产端修复优于 PM 端补救):资源纪律新增第 6 条「前台跑完,不要把验证挂到后台等唤醒」,并区分出唯一合法的长等待是第 1 条的 flock 排队。

⚠️ #5484 的提示:本 PR 在 os-dev.md 的资源纪律里加了 11 行,os-dev.md:263 的字节自扫正则(#5484 的目标行)已下移到 :274,内容一字未动。按内容 grep,不要按行号。

未动的两处(刻意)

⚠️ changeset:改用 skip-changeset 标签,与派发口径不同 —— 请复核

派发口径要求「空 frontmatter changeset,先例 .changeset/pm-dispatch-three-axis-decision-frame.md」。该先例已被今日更晚合入的 #5467(修 #5292)改判,现行 Check Changeset 门禁的失败文案原文:

  1. It releases nothing (.github/, .claude/, docs/, content/, examples/, tests-only, and the like) → apply the skip-changeset label. PREFERRED
  2. An empty-frontmatter changeset also satisfies this gate and stays legal — but it is a LAST RESORT … Unlike the label it is a REAL INPUT to changesets/action: when every pending changeset is empty, the action … prints "All changesets are empty; not creating PR" … no version PR, no publish, and the Release run still goes GREEN. That is 空 changeset 会静默卡死已 version 的发布:Release run 全绿,但 npm 和 Docker 什么都没发(17.0.0-rc.2 现在就卡着) #4898, which silently stalled 17.0.0-rc.2. It also buys you nothing the label does not: an empty changeset names no package, so its body reaches no CHANGELOG.

门禁文案逐字点名 .claude/ 属路由 2。本 PR 因此走标签路线(已挂 skip-changeset)。这正是 SKILL 第 5 步「same-day churn」讲的那件事发生在派发口径本身上:先例来自 #5453,而 #5467 在其后落地。若维护者/PM 仍要求那份 in-repo 散文记录,一条空 changeset 即可补上(说一声就加),但按门禁的说法它下游不到任何 CHANGELOG。

验证

.claude/ 的实际读者只有两个门(其余两个的 ROOTS 不含 .claude/,如实说明,不冒充覆盖):

$ node scripts/check-nul-bytes.mjs --self-test
✓ check-nul-bytes --self-test: 48 assertions over a temp git repo (real scan() path)
$ node scripts/check-nul-bytes.mjs
check-nul-bytes: OK (scanned 5461 tracked text file(s); skipped 5 binary, 1 non-regular;
no raw ASCII control bytes).                                              EXIT=0

$ node scripts/check-doc-authoring.mjs --self-test
✓ check-doc-authoring self-test: scope wiring (.claude and the live docs/ corpus in,
  .claude/worktrees and docs/{audits,handoff,plans} out), detection, and the dead-root
  hard error … all hold.
$ node scripts/check-doc-authoring.mjs
✓ doc authoring guard: 362 files clean — no bare metadata literals.       EXIT=0

不覆盖 .claude/ 但一并跑过、确认无回归:

$ node scripts/check-role-word.mjs        # ROOTS = ['content/docs', 'skills']
check-role-word: OK (43 baselined file(s), no new occurrences).           EXIT=0
$ pnpm -s check:docs-audit-scope          # 只看 content/docs/
✓ docs-accuracy-audit scope is in sync with content/docs/: 178 hand-written doc(s).
✓ release-owned pages are in scope and read-only: 9 page(s) … review-only.  EXIT=0

字节纪律自扫(超出门禁扫描面,含 #5460 加入的 DEL):

$ grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' .claude/skills/pm-dispatch/SKILL.md \
    .claude/agents/os-dev.md
(零命中,exit 1)

没有测试可加,如实说明:改动是两份 .claude/ 内部 agent 协议散文,不含任何可执行代码路径;packages/speccheck:skill-docs / check:skill-refs 生成链的 SKILLS_DIR 指向仓根 skills/(已核 build-skill-docs.ts:28build-skill-references.ts:34),读不到 .claude/,所以没有生成物需要重生成pnpm test / pnpm typecheck 对本 diff 无信息量,未跑 —— 报告里不拿它们充作证据。


🤖 Generated with Claude Code

https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE


Generated by Claude Code

…摆纠偏、飞行中重叠、预期红停放 (#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
@vercel

vercel Bot commented Aug 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 5, 2026 2:32pm

Request Review

@os-zhuang os-zhuang added documentation Improvements or additions to documentation skip-changeset PR has no user-facing published change; bypasses the changeset gate labels Aug 5, 2026 — with Claude
@github-actions github-actions Bot added the size/m label Aug 5, 2026
@os-zhuang os-zhuang added tooling and removed size/m labels Aug 5, 2026 — with Claude
@github-actions github-actions Bot added the size/m label Aug 5, 2026
claude added 2 commits August 5, 2026 14:30
自查发现的方向错误:「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

Copy link
Copy Markdown
Contributor Author

自查补两条(已推,head a8cdd24a8)

开 PR 后自己复核新增散文的每处交叉引用与每个数字,抓到两处并改正 —— 记在这里,免得 review 时再花一遍:

1. fc30c1922:交叉引用方向写反。 停摆纠偏第三条写「re-dispatch … under "Handing off an interrupted dev" below」,而该小节是第 5 步的子节(SKILL.md:839),新增段落在第 6 步(:923)—— 「below」会把读者指向第 6 步之后的 Cloud mode 段。改为「in step 5」。同段内对 cloud-mode ~2h 阈值的「below」是对的(那段确实在下面),保留。

2. a8cdd24a8:issue 正文的时间戳与仓内记录不符,改用可核验值。 issue 第 5 条写「#533500:0xZ 合入」。两个独立读数都不支持:

GitHub API  PR #5335 .merged_at        = 2026-08-04T23:49:44Z
main 上 squash 提交 1792384e8 committer = 2026-08-04T23:44:11+00:00

差了约 15 分钟且跨了整点。散文里那句原样照抄会写进一个仓里查不到的钟点,所以改写成「起飞后 32 分钟合入(merged_at 2026-08-04T23:49:44Z)」—— 把不可核验的钟点换成可核验的时间差 + 权威字段名。起飞时刻 23:17Z 沿用 issue 的记述(仓内无产物可核,且它不是这段的承重点:承重的是「起飞之后 main 又落了一个相交 PR」这个事实)。

顺带一条支持性证据:#5335 自己的 PR body 明写「⛔ #5322($and: [] / $or: [] 空组合子)—— 独立裁定,本单只加用例把它钉在抛错这一侧」,正是新增第 1 条第 3 款「两棒散文互锁 / pin 块占位交接」的实证,不是转述。

两次改动都重跑过读 .claude/ 的两个门(check-nul-bytescheck-doc-authoring)与超出门禁扫描面的字节自扫,均绿。


Generated by Claude Code


Generated by Claude Code

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 31016486579 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

失败的 job(日志抽取,best effort):

  • Temporal Conformance (live PG + MySQL) — 失败步骤: Run the non-SQL temporal backends under the skewed process zone

    �[90mstderr�[2m | src/sql-driver-unique-tenancy.test.ts�[2m > �[22m�[2mSqlDriver unique × tenancy (#3696)�[2m > �[22m�[2mretires a legacy global unique index and replaces it with the composite
    �[90mstderr�[2m | src/sql-driver-unique-tenancy.test.ts�[2m > �[22m�[2mSqlDriver unique × tenancy (#3696)�[2m > �[22m�[2mretires the legacy `uniq_<table>_<col>` index left by the drift rebuild path
    �[90mstderr�[2m | src/sql-driver-unique-tenancy.test.ts�[2m > �[22m�[2mSqlDriver unique × tenancy (#3696)�[2m > �[22m�[2mbare-composite tightening + duplicate pre-flight (ADR-0120 D4)�[2m > �[22m�[2ma
    �[90mstderr�[2m | src/sql-driver-unique-tenancy.test.ts�[2m > �[22m�[2mSqlDriver unique × tenancy (#3696)�[2m > �[22m�[2mbare-composite tightening + duplicate pre-flight (ADR-0120 D4)�[2m > �[22m�[2mB
    �[22m�[39m[schema-drift] product: cannot tighten 'uniq_product_organization_id_code' as UNIQUE (COALESCE(organization_id, '__global__'), code) — existing rows already violate the NULL-safe unique cons
    �[90mstderr�[2m | src/sql-driver-unique-tenancy.test.ts�[2m > �[22m�[2mSqlDriver unique × tenancy (#3696)�[2m > �[22m�[2mbare-composite tightening + duplicate pre-flight (ADR-0120 D4)�[2m > �[22m�[2mB
    �[22m�[39m[schema-drift] REFUSING to rebuild 'uniq_product_organization_id_code' on 'product' as a NULL-safe unique — 1 duplicate group(s) violate it (e.g. organization_id="__global__", code="DUP" × 2
    

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 11 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 在其他 PR 的同类评论里搜同名测试;出现过 ⇒ flaky 实锤,开 issue 修/隔离那条测试。修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

Merged via the queue into main with commit e504a68 Aug 5, 2026
19 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-5441-relay-mode-gaps branch August 5, 2026 15:02
os-zhuang pushed a commit that referenced this pull request Aug 5, 2026
#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
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Aug 6, 2026
…ine 化 (objectstack-ai#5472) (objectstack-ai#5522)

* docs(pm-dispatch): 协调模型改版 —— 分诊/执行纵向拆分 + 一人一车道双射 + 登记表正文即真相 + 座位 Routine 化 (objectstack-ai#5472)

维护者 2026-08-05 拍板的 PM 协调模型改版,落到 `.claude/skills/pm-dispatch/SKILL.md`
(唯一文件面)加一份 changeset。前提已对 origin/main 核过:同文件今天已合的 objectstack-ai#5130
(决策轴)与 objectstack-ai#5095(域表 22 包)成果全部保留,engine 域拆分与本单其余条款在 main
上均未落地,按增量施工。

- Multi-repo rule 4 重写为「纵向拆分 + 双射」:1 个分诊 PM(全仓唯一,只扫/分类/
  打标签/拆跨域/查重,永不认领派发,`domain:*` 的唯一生产者)+ N 个执行 PM(信任
  标签、跳过分诊、只在本车道认领)。旧的分片阶梯 / 同队列禁令 / Borrowing 三段
  删除,只留一处「越界许可已删除」的墓碑句。
- 跨域例外路径成为唯一越界通道:分诊座位指定单一车道 PM 认领 + 申报文件面 +
  定向在飞检查(写明触发条件与检查范围);全局在飞检查从每轮常备税降级为该路径专用。
- 座位表协议(objectstack-ai#4604):正文表格即唯一权威现状,行=座位 / 列=座位|范围|当前 PM|说明,
  接管即就地编辑该行 + 审计评论;评论不承载状态;无心跳,活性惰性判定,>24h 无产出
  可回收。epic 登记退回 `pm:epic` 父单正文(`label:pm:epic` 即索引),座位表不重复记。
- rule 5 补 org Project 的分层定位:视图层、无任何机器读它、GraphQL 配额不进循环
  热路径;权威层坚持 issue 正文 + REST。
- 域表重切:`domain:engine` 拆为 `domain:engine-core`(objectql / metadata* /
  platform-objects / core / formula / plugin-pinyin-search)与 `domain:drivers`
  (`plugins/driver-*`),附存量标签迁移与座位表加行要求;拆分后每包恰好一域。
- 座位 Routine 化的运行形态(Dispatch backends / Collect / step 9):每座位一个
  cron Routine、fresh session per fire、频率随队列深度独立调、读 objectstack-ai#4604 拿范围 →
  从 labels 重建状态 → 跑一轮 → 结束;轮次互斥取「fire 开始查上一轮产出时间,
  间隔不足即自退」。⛔ 如实记录 objectstack-ai#5474 试点实测:CCR 会话内 create_trigger 创建的
  Routine 不携带 GitHub 连接器,fired session 无 mcp github 工具即静默零产出,
  座位 Routine 须由维护者从 claude.ai Routines UI 带连接器创建并先烟测。
- round loop 新增职责划分表(step 0 / step 2 分类半边属分诊座位,step 1、3-9 属
  执行座位)+ step 0 三处扫描排除 + Guardrails 两条新 binding。

刻意未动:`.claude/agents/os-dev.md`(在飞 objectstack-ai#5441 的领地)、`content/docs/releases/`、
已发布目录 `skills/objectstack-pm-dispatch/`、objectstack-ai#4604 正文本身(运行态登记由 PM 落地)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N3uGFF8teXbpgtbEJ1aYXu

* docs(pm-dispatch): 与 objectstack-ai#5501 的语义合并 —— 座位 Routine 与停摆纠偏/串行接力的层级互引 (objectstack-ai#5472)

objectstack-ai#5501(objectstack-ai#5441 的实施)已于 2026-08-05T15:02:23Z 合入 main,本分支终轮 git merge
origin/main 无冲突(两 PR 的落点区段互不相交)。机械合并之后补两处**语义**叠加,
使两侧意图相加而不是并排放置:

- step 6 Collect:objectstack-ai#5501 的停摆纠偏靠 SendMessage 唤醒一个还活着的对面,而座位
  Routine 的 fire 结束后没有可唤醒的 subagent —— 停摆与「会话已销毁」在 GitHub
  上是同一个读数。补一段:验证管线可能超过一个 fire 的活,一开始就走 mode:cloud,
  把恢复权交给下一轮的 GitHub 读数。
- 座位 Routine 化一节:补跨 fire 长流程的可行性依据 —— 串行接力(一棒一整圈 +
  棒间 PM 复核)必然跨多个 fire,能跨过去是因为交接物全是 GitHub 读数(draft/
  ready、auto-merge 是否挂上、预期红停放那份签名级清单写在 PR body 里);因此
  对长流程只加一条要求:接力/停放的每一项都要落成 GitHub 上可读的文本,不许把
  「下一棒该干什么」留在会话记忆里。

未改 objectstack-ai#5501 的任何原文(含其「飞行中范围重叠拦截」段 —— 它说的是 PM 为**自己**
在飞的 agent 复查 main,双射之下天然就是本车道范围,与本单删掉的跨 PM 全局在飞
检查不是同一个机制,无需改写)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N3uGFF8teXbpgtbEJ1aYXu

---------

Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Aug 6, 2026
…ack-ai#5580) (objectstack-ai#5625)

`github.event.pull_request.labels` 是事件触发那一刻的快照。开 PR 后数秒内补
`skip-changeset` 标签,`opened` 事件的 run 看不见它 → 走计数路径 → 无 changeset
→ 红;而 `rerun_failed_jobs` 复用同一份载荷(pm-dispatch Operational notes 5),
于是这个红 run 按构造无法被重跑成绿。一日三例:objectstack-ai#5467(本门禁自己的修复 PR)、
objectstack-ai#5501objectstack-ai#5577,每例都要一个人或 agent 停下来「认签名解释掉」。

job 内新增第一个步骤,用 `gh api repos/$REPO/pulls/$PR` 实时读回标签集,产出
`steps.labels.outputs.skip`;其后每个步骤按它决定是否执行。载荷读法按 issue 建议
保留为 fast-path —— 载荷已有标签就整个 job 跳过,常规路径依旧零 runner 成本。

- **容忍方向朝着执行**:标签读不到(API 报错、无 PR 号)判为 `skip=false`,即
  照常执行守卫。读不到输入的门什么也没验证,据此发豁免正是 objectstack-ai#4690 反模式(静默
  跳过、exit 0、看起来像「无违规」);失败以 `::warning::` 明说,由计数步骤定论。
- **实时读放在 checkout 之前**:标签在位时其后全部步骤跳过,整个 job 只花一次 API
  调用 —— 收敛到实时状态比它替掉的那个 stale 红更便宜。
- **精确整行匹配**(`grep -qxF`,here-string 而非管道):被替换的 `contains(数组,
  'skip-changeset')` 是数组元素精确匹配,子串匹配会让 `skip-changeset-audit`
  这类标签新获豁免;here-string 让 `grep -q` 不进管道,避免 `-q` 首个命中即关闭
  管道、写入端吃 SIGPIPE 在 `pipefail` 下把判定翻成 false。
- 保留 fast-path 留下唯一一个反向 stale 格:标签在开 PR 后被**移除**时本 run 仍
  短路。该格自愈 —— 移除标签必然触发 `unlabeled` 事件,它起的 run 两处都看不到
  标签而照常执行;objectstack-ai#5580 那个方向没有这种救援(`labeled` run 的绿不会清掉
  `opened` run 的红)。文件内注释写明了这笔交换。

⛔ 未动 `BASE_SHA` diff 计数逻辑与 objectstack-ai#5292/PR objectstack-ai#5467 的三段有序失败文案(heredoc
终结符仍在块基缩进);未动其他 job。`allow-major` 步骤的同款载荷读法按边界留在
原样 —— RC pre-mode 期间休眠(`check-changeset-no-major.mjs` 整体让位),已记为
objectstack-ai#5620。

验证:`check:workflow-status-functions` 与 `check:nul-bytes`(含各自 self-test)
全绿;从 YAML 抽出该步骤真实脚本,以 stub `gh` 在 `bash -e` 与 `bash -eo pipefail`
两种方言下跑 7 场景 × 2 = 14 例全通过(载荷 stale/标签实时在位、无标签、空标签、
API 失败、无 PR 号、近似标签名、401 个标签的 pipefail 压力);另建前后决策真值表,
7 格中仅「载荷无标签 + 实时有标签」的首 run 与其重跑两格改变(enforce → exempt),
与事前预测一致。

Fixes objectstack-ai#5580

Claude-Session: https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE

Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Aug 6, 2026
…in 滞后、死代码删除复核 (objectstack-ai#5513) (objectstack-ai#5645)

2026-08-05 跑完一整条 filter 缺陷链(objectstack-ai#5363 / objectstack-ai#5366 / objectstack-ai#5368 / objectstack-ai#5375 / objectstack-ai#5431 / objectstack-ai#5445,
cloud#1117)后回看,六处在那一轮真实咬过人或真实救过场的规程,SKILL 里没有对应条目。
六条各落在 issue 指定的节内,**纯增补**:111 行插入、0 行删除,既有条目(objectstack-ai#5501 的接力
模式、objectstack-ai#5522 的座位模型、objectstack-ai#5630 的 assertEngineDeleteDispatch 条款)一字未动。

落点与要点:

1. **Multi-repo,rule 2 之后**「pin 滞后」——`Blocked-by:` 只保证上游已合并,姊妹仓还有
   第二个读数:本仓 pin 是否覆盖那个 commit。cloud#1116 的裁决落于 framework objectstack-ai#5368
   (`9c5abf4e9`),而 cloud 的 `.objectstack-sha` 未覆盖它,于是 `TursoDriver` 有一个
   方向反了的分叉窗口(fail-closed 一侧先到)。规程:派发前核祖先关系;未覆盖则 dev 在
   PR 正文留档窗口与方向,⛔ pin bump 不做 rider。
2. **step 3** 末「阻塞解除后重新定价」—— 前一单合入会改变后一单的成本模型,方向不止一个
   (本轮变便宜、没变、成本估计过期各有实例)。两个动作配对:派发前一单时带必答项
   「你的改动是否让 #X 变简单 / 变难 / 不必要 / 无影响」,派发被延后那单前用该回答重读
   其选项与成本估计。
3. **step 5** 派发令「多面组件的测试落点」—— 同一契约 ≥2 实现面时,新用例进共享一致性
   覆盖而非独立文件(原话照录)。附 objectstack-ai#5375 / objectstack-ai#5431 / objectstack-ai#5445 三条正交轴共用一条不变量。
4. **step 7 清单**「收益穿过它必经的那道边界之后还在吗」—— 判据是价值主张是否依赖下游
   如实转发;实例即 objectstack-ai#5423(4xx 直通曾整条替换 ≥500 字符正文,`code` 到了正文没到)。
5. **step 7 清单**「死代码删除的复核」——「这是死代码」是断言而非能从 diff 读出的事实,
   PM 在 origin/main 独立核一次引用面再 ACCEPT(查法用 Operational notes 6:notes 6 说
   怎么查不假阴性,本条说什么时候必须查)。
6. **step 8** 升级门槛之后「带前提的裁决」—— 分歧关键是可被代码证伪的事实时,第三档 =
   裁决 + 前提验证要求 + 「前提不成立报 fork,不许硬做也不许悄悄改选」禁令,三件缺一
   不可;缺第 3 条即退化为无人裁决且无读数显示。

实施时两处核实结果与 issue 正文不同,成文按核实后的事实写:

- issue 的附带论断「没有任何闸门在量这个 pin 滞后」**不成立** —— cloud 的
  `scripts/check-pin-staleness.sh`(test.yml 以 `continue-on-error` 跑)每次 CI 都报两个
  pin 各落后 main 多少 commit,advisory 是**有意设计**(`--max-behind` 需显式传)。它答
  的是「落后多少」,不是「是否覆盖我这条裁决 commit」;成文因此指向该脚本,并只把后一个
  问题留给派发前的祖先判断。据此**未**另立「无闸门」的发现单。
- 第 4 条的 rest-server 缺陷本身已由 objectstack-ai#5423 按「截断而非替换」修掉,成文改用过去时并注明,
  以免后来的读者去找一个已不存在的活 bug;该条要补的是**复核清单的缺口**,与代码是否已修
  无关。

第 1 / 3 条按 issue「未验证的部分」的克制写入适用判据(前后单共用同一契约或数据表示;
组件对同一契约有 ≥2 实现面),形态迥异的批次(纯 UI、纯文档)明确不强加。

验证:`node scripts/check-nul-bytes.mjs --self-test` + 全仓扫描绿(48 断言 / 5537 文件);
改动文件自扫 `grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'` 零命中,并用邻近词反查证伪
「扫描器坏了」;`check:docs-audit-scope` 绿;markdown 结构核对(强调标记成对、代码围栏
16 个偶数、嵌套围栏缩进对齐)。

Claude-Session: https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: os-zhuang <hr@objectstack.ai>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate tooling

Projects

None yet

2 participants