本贴是 domain:spec-surface 座位的唯一权威登记。 座位贴协议(维护者 2026-08-06 批准):索引 = label:pm:seat,总入口 #4604 (指针页)。本席由维护者 2026-08-07 批准自 domain:spec 拆出。
单写手规则 :只有在任座位 PM 编辑本贴正文;接管/移交 = 改正文 + 一条审计评论(评论只作交接存档,不承载状态)。空缺争用:动手前重拉正文、审计评论时间戳先到先得、写后回读。活性判定(惰性,无心跳,仅接管冲突时评估):>24h 无产出即可回收。
范围
packages/spec 的文本面 :describe / JSDoc / 墓碑迁移散文 / 错误 guidance 与 alias 表 —— 即契约「怎么解释自己」的那些行。
准入判据 = 校验不变量 :改动前合法的元数据改动后逐字节依然合法,非法依然非法;客户零迁移,changeset 恒 patch。
三条红线:
产物随源走 :describe 改动会重生成 content/docs/references/** 与 json-schema manifest 的 description 字段 —— 产物变更归触发它的源 PR,跑 check:generated 重生成提交、⛔ 不手改;同一生成树在飞重生成 >1 时按 #4675 四步序串行。
> ⚠️ 2026-08-07 实测收窄(三个 dev 独立复现,PR #6364 / #6368 / #6375 ) :上面这条过宽 。参考页由 scripts/build-docs.ts 从 packages/spec/json-schema/ 渲染,后者只派生自 Zod .describe() 字符串 。⇒ 只有 .describe() 改动触发 content/docs/references/** 重生成;纯 JSDoc / TSDoc / 代码注释改动零重生成。 本席多数卡片因此不碰生成树 ,也不需要四步重建串行。反例边界(判据是「改的是不是渲染输入」,不是「改的是不是文本」):#6389 摘 ledger 数据行 ⇒ 11 页重生成;#5059 规则下的模块头 doc block 也是渲染输入 (getFileDescription() 消费)⇒ #6447 实测恰好重生成对应 6 页;guidance / error-map 字符串是错误模板 ⇒ 零重生成(#6423 / #6453 两次实测)。
卡点自报信号(座位职责,不等积压被感觉到)
队列水位:pm:queue + domain:spec-surface 连续 3 天 >15 张、或平均滞留 >48h → 提频/加 batch,再不行按 SKILL 拆域条款继续拆;
同一 references 树在飞重生成 PR >2 → 打包成一列发,不加席位;
分诊脉冲(单次审计灌入 20+)→ 一次性 sweep 专项吃掉,不改常设结构。
运行模式建议 :sweep-first —— 本席卡片天然适合打包(试点 #6243 在案)。
当前 PM(会话或 Routine ID)
🟢 In office : GitHub os-project-manager / session session_018ffcE95NaMJcL9XJ9VDYgk / takeover 2026-08-07T16:45Z — the maintainer-designated incoming PM per the 16:40Z handover order ("我让新项目经理接手").
前任 :hotlong / 会话 session_01JTSZAjgtL3oR6YcpNDhW3T,在任 2026-08-07T13:45Z → 16:40Z 注销。分工修正(维护者 ~17:00Z 指令)已履行完毕并收官:前任的三项在手(#6375 /#6389 /#6426 )已全部 MERGED。
说明 — 座位现状(2026-08-07T22:25Z 刷新)
在飞(本席)
空。 队列 0 可派发(22:0xZ 扫描)、0 阻塞。姿态:待命 (60–70min 巡检,五职责:pm:blocked 解锁扫描、findings 配合、决策箱列报、跨车道备忘、在队 PR 跟 MERGED)。
账面(本任期,截至 22:25Z)
3 卡闭环,0 返工,0 决策箱新增,发版板(target:v17)清零 :
待分诊:flaky: format.exit-code.test.ts pins timer.elapsed() + 531 to a fixed low byte — any 1ms of scheduling delay turns it red #6380 (packages/cli flaky,落点不在本席)。
前任期内闭环:参数门拒绝「差一个下划线」的内建键时无提示:selectedIds 报 Unknown param,不指向 _selectedIds(#5568 验证副产品) #5622 /fix(spec): action-param rejection names the built-in a "differs by one underscore" key meant (#5622) #6368 、[spec] ADR-0117 D1 执行面落地后的声明同步:OWNING_BUSINESS_UNIT_ID JSDoc 翻面 + object.zod.ts systemFields 注入清单描述 #5767 /docs(spec): flip OWNING_BUSINESS_UNIT_ID to INJECTED and sync the systemFields injection list (ADR-0117 D1, #5767) #6364 、strictObject 的 history 句夹在「哪个键错了」与「该写什么」之间,在单行 error 显示位上把修法推到 222 字符之后(#5762 实测) #5955 /fix(spec): move the strictObject history sentence to the end of the message (#5955) #6375 、删除 saveMetaItem legacy 写入分支后的三处残留:一个无生产者的 ledger 错误码 + 两处已过期的跨包注释 #5783 /fix(spec,rest): OVERLAY_PERSISTENCE_FAILED leaves the error-code ledger, plus three same-origin residues (#5783) #6389 、HookContext 契约表把 before* 的 input.options 记成 DriverOptions —— 实测那里仍是调用方的 engine options(含 where),两个 break-glass 守卫正读它 #5997 /docs(spec): input.options during before* is the caller's engine options bag, not DriverOptions — correct the HookContext.input contract table and pin it #6426 。
E. 实测结论(沿承 + 本任新增)
渲染输入判据 (见上收窄框;四类实证:ledger 数据行、模块头、guidance、error-map)。
兄弟单耗时基线:69–96 分钟 (给 6 个 zod 模块补真正的模块头 doc block —— #5059 新规则下这些页面的开篇介绍需要显式声明 #6145 89min、三个手写 unrecognized_keys error map 绕过 strictUnknownKeyError,把说明句夹在「哪个键错了」与处方之间 —— #5955 的修法与 #5593 的迁移都够不到 #6416 49min 至 PR / 69min 至入队;S 级卡显著更快)。探活门槛 45 分钟(发探针),判死看基线上沿。宿主 worker 重启会连带杀死 resume 出来的 subagent 及其完成通知 —— 重启后凡「已 resume 待报告」的 dev 一律按报告已丢处理,直接验收兜底三条件审完即走,⛔ 不再二次 resume 与自己的验收竞速。
探针回执本身是活性读数 :「queued for delivery」= 活;「no active task; resumed from transcript」= 生前已死、本次即复活。中期探针(~40min)对活 dev 无害且常促成提前推分支。
flaky: format.exit-code.test.ts pins timer.elapsed() + 531 to a fixed low byte — any 1ms of scheduling delay turns it red #6380 flaky 签名 :format.exit-code.test.ts → expected 20 to be 19(时序竞态)。重投必然有效。
拒收/删除类复核两条硬判据 :删除类 PM 自跑 origin/main 引用面普查;拒收类最低断言 code + status。
提前复核路径(维护者「能否加速」指令后的常设做法) :PR 一出即对 diff/正文/check runs 做 step 7,ACCEPT 先落 issue,flip 只等两门禁 job conclusion=success —— docs(spec): give six zod modules a true module-header doc block (#6145) #6447 省 20–35min,fix(spec): put the fix before the explanation in the three hand-written unrecognized_keys error maps (#6416) #6453 全程(派发→合入)83min。前提是 dev 把完整验证叙事写进 PR 正文(派发令保留该要求);dev 终报到达后与 ACCEPT 对账归档,不重开复核。
PR 正文语言返工可在飞中完成 :docs(spec): give six zod modules a true module-header doc block (#6145) #6447 首版正文中文(违反 2026-08-06 语言政策),SendMessage 指令 dev 在 CI 运行期改英文 —— 零 CI 作废、零落地延迟;后续派发令加了「正文从一开始就用英文」一句,fix(spec): put the fix before the explanation in the three hand-written unrecognized_keys error maps (#6416) #6453 一次到位。
F. 跨车道备忘
ADR-0117 D1 声明面:ownership 枚举扩展 'business_unit'(须与列注入同 PR 或严格后置) #5678 (ownership 枚举扩展,协议席):fix(spec): systemFields.owner guidance no longer claims ownership: 'org' picks a principal (#6365) #6423 的 batch-20 新钉子断言「两锚点全 authorable 枚举同进退」,ADR-0117 D1 声明面:ownership 枚举扩展 'business_unit'(须与列注入同 PR 或严格后置) #5678 若开第四档,该钉子在其联动清单(it 文案已自注)。
把 44 个 strictUnknownKeyError 直调点批量迁到 strictObject,棘轮降到 0(路线 1 消不掉手抄数组与 shape 的漂移) #5593 (44 直调点迁移,协议席,pm:blocked):fix(spec): move the strictObject history sentence to the end of the message (#5955) #6375 实测重新定价 = 零;三个手写 unrecognized_keys error map 绕过 strictUnknownKeyError,把说明句夹在「哪个键错了」与处方之间 —— #5955 的修法与 #5593 的迁移都够不到 #6416 的三个手写 map 不在其 44 点清单内。fix(spec): put the fix before the explanation in the three hand-written unrecognized_keys error maps (#6416) #6453 落地后新增一条重定价输入 :三个 map 现携 13 条次序钉子 + docblock 次序说明 —— 若 把 44 个 strictUnknownKeyError 直调点批量迁到 strictObject,棘轮降到 0(路线 1 消不掉手抄数组与 shape 的漂移) #5593 未来把它们折入 strictObject(即 三个手写 unrecognized_keys error map 绕过 strictUnknownKeyError,把说明句夹在「哪个键错了」与处方之间 —— #5955 的修法与 #5593 的迁移都够不到 #6416 的方向 2),这些钉子是现成的验收判据,折入时随迁不删。
三个手写 unrecognized_keys error map 绕过 strictUnknownKeyError,把说明句夹在「哪个键错了」与处方之间 —— #5955 的修法与 #5593 的迁移都够不到 #6416 方向 2 (三 map 折入 guidance,需 set-keyed 形态)是分诊留档的未来卡 —— 属本席文本面;若立卡,alias-integrity.test.ts 盲点收口是其价值论证(三个手写 unrecognized_keys error map 绕过 strictUnknownKeyError,把说明句夹在「哪个键错了」与处方之间 —— #5955 的修法与 #5593 的迁移都够不到 #6416 正文 + 分诊评论有完整分析)。
归档:[spec] hook.zod.ts 的 positions JSDoc 仍把 services.sharing.canEdit(…) 举为「hook 可以这么读」的正例 —— #5720 已证实 hook 拿不到 services #6001 、sweep(spec-surface): 5-item description-surface truth sweep — one claim, one PR, per-item checklist review (#6085 #6081 #6137 #6065 #5676) #6243 /docs(spec): 七项 description-surface truth sweep —— 一 PR 七条 Fixes,逐项清单评审 (#6243) #6288 、ADR-0122 第二期:major 窗口翻转裸名为解析态语义 + XInput 去留 #6083 /spec: ADR-0122 phase 2 — flip bare names to parsed semantics (#6083) #6279 。
G. 环境注记(⛔ 接任会话必读,每条都咬过人)
本贴是
domain:spec-surface座位的唯一权威登记。 座位贴协议(维护者 2026-08-06 批准):索引 =label:pm:seat,总入口 #4604(指针页)。本席由维护者 2026-08-07 批准自domain:spec拆出。单写手规则:只有在任座位 PM 编辑本贴正文;接管/移交 = 改正文 + 一条审计评论(评论只作交接存档,不承载状态)。空缺争用:动手前重拉正文、审计评论时间戳先到先得、写后回读。活性判定(惰性,无心跳,仅接管冲突时评估):>24h 无产出即可回收。
范围
packages/spec的文本面:describe / JSDoc / 墓碑迁移散文 / 错误 guidance 与 alias 表 —— 即契约「怎么解释自己」的那些行。准入判据 = 校验不变量:改动前合法的元数据改动后逐字节依然合法,非法依然非法;客户零迁移,changeset 恒 patch。
三条红线:
domain:spec(协议席)。判据看「合法集合变没变」,不看行数(先例:meta: bind Zod schemas for webhook / connector / sharing_rule WITHOUT registering the kinds — close the unvalidatedPUT /metawrite hole (#2657 audit, option A) #6245 size S 但把放行改 422 → 协议卡;feat(spec): action param 的 options[] 声明逐选项 visibleWhen (#5016) #6235 只开一个键 → 协议卡)。domain:spec-tooling(C 包 program card:协议工具链/门禁车道(domain:spec-tooling)—— 整包移交待接收 #5163 程序卡边界)。同一缺陷两半分治的先例:FormField/FormSectionvisibleWhendescribe 宣称 runtime 表单绑定current_user,但字段级条件规则的求值面从未绑过它——按文档写的谓词必然 fault 并 fail-open #6146(文档教错根,surface)与 finding: packages/formula 一包两话 —— SCOPE_ROOTS 不含 current_user 而 introspectScope 宣告它;字段级 visibleWhen 的 lint 拒绝还附错误修法「Write record.current_user」 #6290(lint 判错并给错修法,tooling 面)。content/docs/releases/恒不许碰(全仓通则)。产物随源走:describe 改动会重生成
content/docs/references/**与 json-schema manifest 的 description 字段 —— 产物变更归触发它的源 PR,跑check:generated重生成提交、⛔ 不手改;同一生成树在飞重生成 >1 时按 #4675 四步序串行。>⚠️ 2026-08-07 实测收窄(三个 dev 独立复现,PR #6364 / #6368 / #6375):上面这条过宽。参考页由
scripts/build-docs.ts从packages/spec/json-schema/渲染,后者只派生自 Zod.describe()字符串。⇒ 只有.describe()改动触发content/docs/references/**重生成;纯 JSDoc / TSDoc / 代码注释改动零重生成。 本席多数卡片因此不碰生成树,也不需要四步重建串行。反例边界(判据是「改的是不是渲染输入」,不是「改的是不是文本」):#6389 摘 ledger 数据行 ⇒ 11 页重生成;#5059 规则下的模块头 doc block 也是渲染输入(getFileDescription()消费)⇒ #6447 实测恰好重生成对应 6 页;guidance / error-map 字符串是错误模板 ⇒ 零重生成(#6423 / #6453 两次实测)。卡点自报信号(座位职责,不等积压被感觉到)
pm:queue + domain:spec-surface连续 3 天 >15 张、或平均滞留 >48h → 提频/加 batch,再不行按 SKILL 拆域条款继续拆;运行模式建议:sweep-first —— 本席卡片天然适合打包(试点 #6243 在案)。
当前 PM(会话或 Routine ID)
🟢 In office: GitHub
os-project-manager/ sessionsession_018ffcE95NaMJcL9XJ9VDYgk/ takeover 2026-08-07T16:45Z — the maintainer-designated incoming PM per the 16:40Z handover order ("我让新项目经理接手").前任:
hotlong/ 会话session_01JTSZAjgtL3oR6YcpNDhW3T,在任 2026-08-07T13:45Z → 16:40Z 注销。分工修正(维护者 ~17:00Z 指令)已履行完毕并收官:前任的三项在手(#6375/#6389/#6426)已全部 MERGED。说明 — 座位现状(2026-08-07T22:25Z 刷新)
在飞(本席)
空。 队列 0 可派发(22:0xZ 扫描)、0 阻塞。姿态:待命(60–70min 巡检,五职责:
pm:blocked解锁扫描、findings 配合、决策箱列报、跨车道备忘、在队 PR 跟 MERGED)。账面(本任期,截至 22:25Z)
systemFieldsownerguidance misstatesownership: 'org'— tells authors org "chooses the principal" when it injects noowner_idat all #6365 / PR fix(spec):systemFields.ownerguidance no longer claimsownership: 'org'picks a principal (#6365) #6423(be87153a4,19:25Z)—— systemFields owner guidance;立单→合入 4h12m;直接验收兜底路径首战。d2b97c3ac,20:58Z)—— 6 模块头 doc block;派发→合入 1h45m。bf0ae9976,22:18Z)—— 三个手写 error map 重排;派发→合入 1h23m(提前复核路径)。format.exit-code.test.tspinstimer.elapsed() + 531to a fixed low byte — any 1ms of scheduling delay turns it red #6380(packages/cliflaky,落点不在本席)。selectedIds报 Unknown param,不指向_selectedIds(#5568 验证副产品) #5622/fix(spec): action-param rejection names the built-in a "differs by one underscore" key meant (#5622) #6368、[spec] ADR-0117 D1 执行面落地后的声明同步:OWNING_BUSINESS_UNIT_ID JSDoc 翻面 + object.zod.ts systemFields 注入清单描述 #5767/docs(spec): flipOWNING_BUSINESS_UNIT_IDto INJECTED and sync thesystemFieldsinjection list (ADR-0117 D1, #5767) #6364、strictObject 的 history 句夹在「哪个键错了」与「该写什么」之间,在单行 error 显示位上把修法推到 222 字符之后(#5762 实测) #5955/fix(spec): move the strictObject history sentence to the end of the message (#5955) #6375、删除 saveMetaItem legacy 写入分支后的三处残留:一个无生产者的 ledger 错误码 + 两处已过期的跨包注释 #5783/fix(spec,rest): OVERLAY_PERSISTENCE_FAILED leaves the error-code ledger, plus three same-origin residues (#5783) #6389、HookContext 契约表把before*的input.options记成 DriverOptions —— 实测那里仍是调用方的 engine options(含 where),两个 break-glass 守卫正读它 #5997/docs(spec):input.optionsduringbefore*is the caller's engine options bag, notDriverOptions— correct theHookContext.inputcontract table and pin it #6426。E. 实测结论(沿承 + 本任新增)
format.exit-code.test.tspinstimer.elapsed() + 531to a fixed low byte — any 1ms of scheduling delay turns it red #6380 flaky 签名:format.exit-code.test.ts→expected 20 to be 19(时序竞态)。重投必然有效。origin/main引用面普查;拒收类最低断言code+status。F. 跨车道备忘
ownership枚举扩展,协议席):fix(spec):systemFields.ownerguidance no longer claimsownership: 'org'picks a principal (#6365) #6423 的 batch-20 新钉子断言「两锚点全 authorable 枚举同进退」,ADR-0117 D1 声明面:ownership 枚举扩展 'business_unit'(须与列注入同 PR 或严格后置) #5678 若开第四档,该钉子在其联动清单(it 文案已自注)。strictUnknownKeyError直调点批量迁到strictObject,棘轮降到 0(路线 1 消不掉手抄数组与 shape 的漂移) #5593(44 直调点迁移,协议席,pm:blocked):fix(spec): move the strictObject history sentence to the end of the message (#5955) #6375 实测重新定价 = 零;三个手写 unrecognized_keys error map 绕过 strictUnknownKeyError,把说明句夹在「哪个键错了」与处方之间 —— #5955 的修法与 #5593 的迁移都够不到 #6416 的三个手写 map 不在其 44 点清单内。fix(spec): put the fix before the explanation in the three hand-written unrecognized_keys error maps (#6416) #6453 落地后新增一条重定价输入:三个 map 现携 13 条次序钉子 + docblock 次序说明 —— 若 把 44 个strictUnknownKeyError直调点批量迁到strictObject,棘轮降到 0(路线 1 消不掉手抄数组与 shape 的漂移) #5593 未来把它们折入strictObject(即 三个手写 unrecognized_keys error map 绕过 strictUnknownKeyError,把说明句夹在「哪个键错了」与处方之间 —— #5955 的修法与 #5593 的迁移都够不到 #6416 的方向 2),这些钉子是现成的验收判据,折入时随迁不删。alias-integrity.test.ts盲点收口是其价值论证(三个手写 unrecognized_keys error map 绕过 strictUnknownKeyError,把说明句夹在「哪个键错了」与处方之间 —— #5955 的修法与 #5593 的迁移都够不到 #6416 正文 + 分诊评论有完整分析)。hook.zod.ts的positionsJSDoc 仍把services.sharing.canEdit(…)举为「hook 可以这么读」的正例 —— #5720 已证实 hook 拿不到services#6001、sweep(spec-surface): 5-item description-surface truth sweep — one claim, one PR, per-item checklist review (#6085 #6081 #6137 #6065 #5676) #6243/docs(spec): 七项 description-surface truth sweep —— 一 PR 七条 Fixes,逐项清单评审 (#6243) #6288、ADR-0122 第二期:major 窗口翻转裸名为解析态语义 + XInput 去留 #6083/spec: ADR-0122 phase 2 — flip bare names to parsed semantics (#6083) #6279。G. 环境注记(⛔ 接任会话必读,每条都咬过人)
api.github.com返回 403 —— GitHub 仅 MCP 可达;靠写后回读,没有 REST 第二意见。systemFields.ownerguidance no longer claimsownership: 'org'picks a principal (#6365) #6423/docs(spec): give six zod modules a true module-header doc block (#6145) #6447/fix(spec): put the fix before the explanation in the three hand-written unrecognized_keys error maps (#6416) #6453 三次实证:入队、合并通知实时到达)。其余看护走 send_later 定点。:00重试;search 与 core 独立池。git fetch origin main --deepen=100。cwd每次调用重置 —— 一律git -C /home/user/objectstack …。list_issues多标签过滤是 OR;issue_write的labels是整组替换(先取现值合并再写)。