From 05573dfe41c8bfe925770d69b7fbe875b111e51e Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 29 Aug 2026 05:17:03 +0000 Subject: [PATCH 1/3] docs(pm-dispatch): pin the security-object enumeration's method and calibration case The standing security-object platform-object enumeration appends its NUMBERS to the seat post but never its METHOD, so the duty does not reproduce across seats: the recorded watch item could not be re-derived from anything written down. Record, in the triage-seat runbook where the other standing round duties live: - the surface half as a member-level diff against the recorded baseline ref (column-declaration lines), which is strictly stronger than comparing two totals and cheaper; - the reader-half classification rules the count depends on: generated bundles are not readers, a packages/spec contract declaration IS a read point, and the bare key: literal spelling counts per matching line; - the watch item as the CALIBRATION case, so a run that cannot reproduce it knows its instrument is wrong BEFORE it records a zero; - a zero without a positive control is recorded as NOT MEASURED, never as 0. Ratchet net-0: the 19 added lines are paid for by canonically re-wrapping 16 paragraphs in the same file (whitespace only, zero content removed, no new over-120-byte line; three pre-existing over-length lines are resolved). The recorded recipe excludes the .claude instruction surface, so this file naming the calibration key does not perturb the next run's count. --- .../references/dispatch-runbook.md | 138 +++++++++--------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/.claude/skills/pm-dispatch/references/dispatch-runbook.md b/.claude/skills/pm-dispatch/references/dispatch-runbook.md index dce62f2d00..202eb2ff0a 100644 --- a/.claude/skills/pm-dispatch/references/dispatch-runbook.md +++ b/.claude/skills/pm-dispatch/references/dispatch-runbook.md @@ -44,14 +44,11 @@ sweep 周期的半状态是治愈环自身的缺陷,不是库存;正文自报 P0 ## 同趟成员卡写侧打包(维护者 2026-08-16 限流裁定的对价) 出处:反复撞的限流墙经维护者确认为「GitHub API 池」。同一趟派发/定级覆盖多张成员卡 -时,**锚 -卡承载全量认领(或定级)评论**(会话、分支、文件面、交付物、串行约束全量),成员卡各留 -一行 -指针指向锚卡;标签翻转照旧逐卡执行 —— 省的是评论正文写量,不是状态写入;验收与解锁 -扫描的 -读侧不变,仍逐卡读。**写序:标签翻转只在认领评论写成功之后**,两笔不原子 —— 评论 502 -而标 -签已翻即制造一记真 H2(实测一轮三起);顺序反了就带重试义务,重试未成即回滚标签。 +时,**锚卡承载全量认领(或定级)评论**(会话、分支、文件面、交付物、串行约束全量),成员 +卡各留一行指针指向锚卡;标签翻转照旧逐卡执行 —— 省的是评论正文写量,不是状态写 +入;验收与解锁扫描的读侧不变,仍逐卡读。**写序:标签翻转只在认领评论写成功之后**,两笔 +不原子 —— 评论 502 而标签已翻即制造一记真 H2(实测一轮三起);顺序反了就带重试义务,重 +试未成即回滚标签。 ## 座位贴活性巡查(分诊轮常设项;维护者 2026-08-14) @@ -61,11 +58,9 @@ fire 附带一次: - **扫描面**:`label:pm:seat` 列表页上标题挂 `🟢 ` 的贴;`🟢 Routine` 座位以 调度器读数为准,不入本巡查。 - **判据只认在任者自己的产出**(自有评论/认领/正文编辑,作者与时间戳是平台盖章的硬读 - 数), - ⛔ 不算发给它的跨座位通知 —— 收到消息不是活着的证据。 -- **>24h 无自有产出(与既有回收线同一条)⇒ 当场降级**:标题改 `⏳ vacant` + 摘 assignee - **同笔**,留证据评论(最后自有产出的时间戳与链接);在飞认领照认领协议由原认领者跟 - 完。 + 数), ⛔ 不算发给它的跨座位通知 —— 收到消息不是活着的证据。 +- **>24h 无自有产出(与既有回收线同一条)⇒ 当场降级**:标题改 `⏳ vacant` + 摘 assignee **同 + 笔**,留证据评论(最后自有产出的时间戳与链接);在飞认领照认领协议由原认领者跟完。 - 惰性判定(接管冲突时)照旧,本巡查是其常设出口(细则见 `seat-post-protocol.md`)。 ## 分诊席读数成本三则(维护者 2026-08-20) @@ -77,14 +72,12 @@ fire 附带一次: 沿用主文件轮次报告节定义,含点名带开放下游依赖的决策卡)。**细节禁止复述**:逐卡理 由已作审计评论落卡,简报只指不拷。硬预算正文 ≤3000 字符,收班**自报字符数**;连续 两轮超限即漂移 —— 没有读数的「写短点」约定会涨回去。 -- **互斥最小尾页读法**(读数定义在主文件):尾页配方只覆盖座位贴两个读数;第三读数 - (车道 `pm:dispatched` 卡最新非本 session `Claim:`)出自车道盘点,不在座位贴线程。 - 配方:`issue_read get` 拿评论总数,按小 `perPage`(~15)算末页页码只读尾页;尾页缺 - 读数再回翻一页,⛔ 不读整线程。 -- **长线程状态读外包**:线程 > ~15 条的**状态提取**(找最新转换评论、抽 - `Restart-when:` 行、确认 claim/report 在不在)派低档只读子代理(sonnet 即可)返回结 - 构化摘录,尾部优先。**裁决级阅读(契约复审、放行判定、代裁)不可外包** —— 那是拿放 - 行质量换 token,禁止。 +- **互斥最小尾页读法**(读数定义在主文件):尾页配方只覆盖座位贴两个读数;第三读数 (车道 + `pm:dispatched` 卡最新非本 session `Claim:`)出自车道盘点,不在座位贴线程。配方:`issue_read get` + 拿评论总数,按小 `perPage`(~15)算末页页码只读尾页;尾页缺读数再回翻一页,⛔ 不读整线程。 +- **长线程状态读外包**:线程 > ~15 条的**状态提取**(找最新转换评论、抽 `Restart-when:` 行、确 + 认 claim/report 在不在)派低档只读子代理(sonnet 即可)返回结构化摘录,尾部优先。**裁决级阅 + 读(契约复审、放行判定、代裁)不可外包** —— 那是拿放行质量换 token,禁止。 - **派发前读一次 `rate_limit`**:配额是全舰队共享的单点,耗尽同时杀掉在飞的每个 agent(实测一记限流一次带走三个 dev);余量装不下整批就减批,⛔ 不靠撞墙发现。 @@ -104,10 +97,9 @@ fire 附带一次: 要更新项目经理技能」。实测:一张决策卡三个叠加半状态。 - **裁决记录四件补遗**(四件本体在主文件;原子、记录座位全责、维护者裁与代裁同规):① - 鲜 - 度门可内联声明分歧代替调和正文,对过期正文记录的裁决按过期论;② 结果态 = - `pm:queue`/`pm:blocked`/`pm:on-hold`/关闭,永不留挂;④ 已可判定的就地解决,⛔ 不留给未 - 来静默触发。 + 鲜度门可内联声明分歧代替调和正文,对过期正文记录的裁决按过期论;② 结果态 = + `pm:queue`/`pm:blocked`/`pm:on-hold`/关闭,永不留挂;④ 已可判定的就地解决,⛔ 不留给未来静默触 + 发。 - **机械两旗(report-only,归半状态巡查;接线是另一张卡的事,⛔ 不随协议文本改脚本)**:旗 一 —— open 卡标题带决策标记或线程含裁决记录、却仍挂 `needs-user-decision`;旗二 —— `pm:blocked` 卡的 `Blocked-by:` 目标已关闭。「交付了一半的阻塞」是判断不是 grep,归四件 @@ -120,16 +112,13 @@ fire 附带一次: ## 结论当轮执行(维护者 2026-08-14) 出处:维护者裁(逐字,未译)「现在开工派发」;当日实测是成批「建议关闭」复测结论与结论 -表 -躺置多日无人执行。 +表躺置多日无人执行。 - **结论产生的那一轮就执行它。** 复测/审计/裁决得出结论而不在同一轮完成对应的关 - 闭/换标写 - 入,本身就是半状态,与半状态家族同列 —— 记录后离场(record-and-walk-away)⛔ 禁止;结论 - 表同规,表不是交付物,落账才是。 + 闭/换标写入,本身就是半状态,与半状态家族同列 —— 记录后离场(record-and-walk-away)⛔ 禁 + 止;结论表同规,表不是交付物,落账才是。 - **无权执行 ⇒ 点名有权者,并当轮把状态搬进对方收件箱**(换标进对方的收件箱视图/决策 - 箱), - ⛔ 不许只留一条评论等人路过 —— 评论不是任何人的收件箱,标签才是。 + 箱), ⛔ 不许只留一条评论等人路过 —— 评论不是任何人的收件箱,标签才是。 - **机械半边**:「交付 PR 已合并而卡仍挂 `pm:dispatched`」由半状态巡查的 report-only 项浮 出(细节以脚本头为权威);旗标是兜底,当轮执行才是修法。 @@ -140,10 +129,9 @@ fire 附带一次: draft-PR 时点交报、transcript 复活与接手协议兜底;共享容器争用只来自 build+test, docs/指令类 M 卡碰不到 —— 归档义务因此只落云卡。 -1. **授权面随 source,不随环境**:trigger 拉起的会话无仓库授权(只读勘察); - `create_session` 带 `source_url` 出生即持推送授权。同时带 `outcome_branch`(= 认领分 - 支)、显式 `model`(trigger 流不可指模型)、`title`(车道名开头,⛔ 不叫 os-dev;形如 - `⚡ <车道> #<单号> <短语>`)。 +1. **授权面随 source,不随环境**:trigger 拉起的会话无仓库授权(只读勘察); `create_session` 带 + `source_url` 出生即持推送授权。同时带 `outcome_branch`(= 认领分支)、显式 `model`(trigger 流不可 + 指模型)、`title`(车道名开头,⛔ 不叫 os-dev;形如 `⚡ <车道> #<单号> <短语>`)。 2. **派发词必带自驱条款**(云会话回合一结束即停摆等 poke):⛔ 不为提问/中期汇报结束回 合;开放选择按裁决与评估轴自裁记入终报 open_questions;合法回合终点只有 (a) 推送完成 + 终报,或 (b) 硬阻塞详报。 @@ -153,14 +141,13 @@ docs/指令类 M 卡碰不到 —— 归档义务因此只落云卡。 4. **云卡 draft PR 一存在,立即 `subscribe_pr_activity` —— 硬步骤**:未订阅的云卡 PR 是轮 询负债,订阅把感知从巡检周期缩到秒级。 -监控与转向:`get_session` 读实时状态(IDLE + 分支未推送 = 停摆待 poke);投递消息用绑 -定会话的 poke 触发器(`create_trigger` 带 `persistent_session_id` + `fire_trigger`,用 -后即 `delete_trigger`);巡检退为兜底心跳,只补订阅盲区(会话停摆、未开 PR 的分支、姊妹 -仓动静)。roster 不可达与 SendMessage 同裁(`ListAgents` 同列不到,⛔ 不复测)。会话句 -柄是**账号作用域**的:`get_session` / `archive_session` / 绑会话 poke 触发器对另一账号 -建的会话一律答 `not found`,与「从不存在」不可区分 —— **⛔ 永不读作死亡信号**(实测判 -not found 的会话数十分钟前还 RUNNING;误判死会往活 worktree 塞第二个 agent);跨账号接 -班活性只认 GitHub 产出读数 —— draft-PR 时点交报正为此存在。 +监控与转向:`get_session` 读实时状态(IDLE + 分支未推送 = 停摆待 poke);投递消息用绑定会话的 +poke 触发器(`create_trigger` 带 `persistent_session_id` + `fire_trigger`,用后即 `delete_trigger`);巡检退为兜 +底心跳,只补订阅盲区(会话停摆、未开 PR 的分支、姊妹仓动静)。roster 不可达与 SendMessage 同 +裁(`ListAgents` 同列不到,⛔ 不复测)。会话句柄是**账号作用域**的:`get_session` / `archive_session` / +绑会话 poke 触发器对另一账号建的会话一律答 `not found`,与「从不存在」不可区分 —— **⛔ +永不读作死亡信号**(实测判 not found 的会话数十分钟前还 RUNNING;误判死会往活 worktree 塞第二 +个 agent);跨账号接班活性只认 GitHub 产出读数 —— draft-PR 时点交报正为此存在。 ## subagent 批(`mode:subagent`)派发前置:先快进本地检出 @@ -172,10 +159,9 @@ subagent 在 PM 容器内运行,agent 定义与技能文本读**本地检出**, 先试复活、不可用才接手与 ⛔ 不重跑原派发词在主文件;五条增量: -- **死后恢复查三态,不止查远程**:远程(`git ls-remote`)/ 仅容器磁盘 / 真没了 —— 中间那 - 态最值钱且当前无人查(worktree 比 agent 活得久,同容器共享,未提交改动通常还在),只查远 - 程会令下一个 dev「从零开始」。捡到的工作一律标 **UNVERIFIED** 交接 —— 不丢弃也不继 - 承。 +- **死后恢复查三态,不止查远程**:远程(`git ls-remote`)/ 仅容器磁盘 / 真没了 —— 中间那态最 + 值钱且当前无人查(worktree 比 agent 活得久,同容器共享,未提交改动通常还在),只查远程会令 + 下一个 dev「从零开始」。捡到的工作一律标 **UNVERIFIED** 交接 —— 不丢弃也不继承。 - worktree 已存在,⛔ 不要新建,`cd` 进去接着做(第二个 worktree 会劈开工作); - 先读全部既有提交与未提交改动,逐 hunk 决定保留或修正 —— 既不推倒重来也不盲信(死 agent 的一切都未经验证); @@ -194,13 +180,11 @@ subagent 在 PM 容器内运行,agent 定义与技能文本读**本地检出**, ## 停摆复位梯度 -原则三条在主文件;本节是执行细则。姿态句全文:「前台(阻塞)同步执行全部步骤,中途不停 -止、不把构建/测试挂到后台等唤醒」。梯度逐级(原样重发同一句不算一次复位):① 复述执行姿态 -→ ② 点名下一个工具调用 + 明令禁止后台等待 → ③ 第三次停摆判 unreliable,按接手协议重 -派到 -该分支。自己挂的定时器不会唤醒自己;长验证管线的派发/接力词写明前台姿态;生产侧条款 -在 -os-dev 定义。 +原则三条在主文件;本节是执行细则。姿态句全 +文:「前台(阻塞)同步执行全部步骤,中途不停止、不把构建/测试挂到后台等唤醒」。梯度逐 +级(原样重发同一句不算一次复位):① 复述执行姿态 → ② 点名下一个工具调用 + 明令禁止 +后台等待 → ③ 第三次停摆判 unreliable,按接手协议重派到该分支。自己挂的定时器不会唤醒 +自己;长验证管线的派发/接力词写明前台姿态;生产侧条款在 os-dev 定义。 ## 通知重放去重 @@ -222,18 +206,16 @@ os-dev 定义。 件;本节是条款原文与增量: - **三分区条款原文**:「裁决(不可重裁)」—— dev 执行,不重 - 开;「PM 机制假设(须实测,鼓励证伪)」—— dev 动手前验证,证 - 伪照实报告并按裁决意图换实现路径,⛔ 不许为顺从假设硬 - 做;「PM 建议的路线(可选,实测优先)」—— dev 有更好的就 + 开;「PM 机制假设(须实测,鼓励证伪)」—— dev 动手前验证,证伪照实报告并按裁决意图换实 + 现路径,⛔ 不许为顺从假设硬做;「PM 建议的路线(可选,实测优先)」—— dev 有更好的就 换,⛔ 不得因「派发令写了」照做。 - **兄弟 dev 报告里的成本/形状估计一律落「机制假设」区并注明须复测**,⛔ 不得穿裁决的衣服转述:被当事实搬运的「两行 改动」照字面落地把双字面量的方向循环写成 `desc → desc → null`,度量列永远升不了序而天真测试照绿 —— 错在搬运的派发词。 - **前提含「spec 有这个槽位」⇒ 派发前先读安装包内的活性账 - 本**(`node_modules/@objectstack/spec/liveness/<域>.json` - 对应行):`status: 'planned'` = 有 carrier、零消费者,`authorHint` 就是证词;不读账本的派发让 dev 交 - 出解析通过、 - 校验通过、加载成功而**渲染为零**的元数据 —— 绿收据背书的假修复比诚实的缺陷更 - 贵,代价是一次文件读对一整轮 agent 运行。 + 本**(`node_modules/@objectstack/spec/liveness/<域>.json` 对应行):`status: 'planned'` = 有 carrier、零消费 + 者,`authorHint` 就是证词;不读账本的派发让 dev 交出解析通过、校验通过、加载成功而**渲染 + 为零**的元数据 —— 绿收据背书的假修复比诚实的缺陷更贵,代价是一次文件读对一整轮 + agent 运行。 - **停条件写法:要证据,不要判决**。派发令里的前提/停条件检查必须要 dev 回报**证据 面**(搜了什么、找到什么),分叉 归 PM 判 —— 写成「发现消费者就停下」把判决权交回被停的一方。 @@ -246,12 +228,11 @@ os-dev 定义。 法),装依赖命令别带它。 - **文件面两句原文**:「预期落点是 X;若实测表明真正的生产者在别包,报备后按生产者侧修(落点与理由写进报告和 PR 正文),⛔ 不 在消费者侧打补丁」—— 只写一个路径名,是要求 dev 在守约与修对之间二选一;跨包常等于跨车道,PM 事后补跨座位声明。 -- **Same-day churn 行与在飞重叠**:派发时 `git log origin/main --oneline -20 -- ` 见当天合并 ⇒ 加一行「 - 基于合并后的代码工作,issue 引用的片段可能已变,先核对当前 main」(dev 的 worktree 切出后不会自己更新)。在飞重 - 叠每轮拦截(churn 行只覆盖派发瞬间):main 新落 PR 与在飞申报文件面求交,相交即警告四句 - —— 合 main 重跑测试矩 - 阵、读对方 diff 重划边界、只补它没覆盖的部分、被完全覆盖就停下回报 ⛔ 不硬造 diff。 - 晚一轮 = 一次返工。 +- **Same-day churn 行与在飞重叠**:派发时 `git log origin/main --oneline -20 -- ` 见当天合并 ⇒ 加 + 一行「基于合并后的代码工作,issue 引用的片段可能已变,先核对当前 main」(dev 的 worktree 切 + 出后不会自己更新)。在飞重叠每轮拦截(churn 行只覆盖派发瞬间):main 新落 PR 与在飞申报文 + 件面求交,相交即警告四句 —— 合 main 重跑测试矩阵、读对方 diff 重划边界、只补它没覆 + 盖的部分、被完全覆盖就停下回报 ⛔ 不硬造 diff。晚一轮 = 一次返工。 - **全仓 pin 清扫两句原文**:① grep 错误码/错误消息**全仓扫描**同语义 pin,一轮翻完,不只改 本包(旧立场的 pin 住在 被改包之外的消费层);② 翻转后的 pin 必须继续承重 —— 断言新语义的**实质**(行数、译文、状态码),不是「旧断言已 @@ -272,3 +253,22 @@ os-dev 定义。 - **测量先行卡**(修复由测量结果**有条件授权**)⇒ 派发令写 明「⛔ 测量存在之前不写修复」—— 测量姿态让 dev 看得见 卡面没列的探针,实现姿态只看得见要交的 diff。 + +## security-object 无判决枚举(座位贴常设 ⑦)的方法与校准 + +⑦ 每 ~10 轮跑一次,读数追加在座位贴(⛔ 不建台账、不设红门、不给 verdict);方法落本节。 + +- **表面半边 = 对基线 ref 直接 diff 列声明,⛔ 不比两个总 + 数**:`git diff <基线ref> origin/main -- '<两插件>/src/objects/*.object.ts'` 再 + `grep -E "^[+-] [a-z_][a-z0-9_]*: Field\."`;零命中 = **成员级同一**,强于「两个总数相等」且更便 + 宜 ⇒ 读数必记基线 ref(2026-08-26 = `b000ab59`),否则下轮无从 diff。 +- **读者半边的分类判据(⛔ 不得每轮重新发明)**:命中面取 + `git grep -I -n -w "<键>" -- . ':(exclude)<声明该列的 *.object.ts>' ':(exclude).claude'`,**逐命中行计一 + 次**;① `*.generated.ts`(i18n 等生成包)**不是读者**,排除;② `packages/spec` 的契约声明**算一个读 + 点**(被消费的契约面,不是该列自身的声明);③ 裸字面量 `key:` 拼写**算**、与属性读同 + 权(2026-08-26 注:「读者计数必须含裸字面量 `key:` 拼写」)。 +- **校准用例(正对照)恒先跑**:`sys_share_link.email_allowlist` = **3** 个非声明读点(2026-08-26 记);跑 + 不出 3 ⇒ **仪器坏了**,⛔ 记下任何零之前停(漏 ① 得 7,多减 ② 得 2)。 +- **⛔ 无正对照的零记「没读到 / NOT MEASURED」,不记 0**:⑦ 的输出全是零,正对照是它唯一的 + 可证伪面;`name` / `label` / `description` 这类列名到处匹配 ⇒ 未校准的仪器平凡地 + 回「新增零读者键 0」,与一次成功枚举逐字节同形。 From 65e37e06cce272d3b4e894163a59bb72678c34e6 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 29 Aug 2026 05:39:30 +0000 Subject: [PATCH 2/3] docs(pm-dispatch): pay the enumeration-method section with deletions, not re-wrapping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit REWORK. The previous commit funded a 19-line section entirely by re-wrapping 16 paragraphs with zero content removed. That is banned: SKILL.md's ratchet row (maintainer 2026-08-17) reads 「⛔ re-wrap(折行合并)不得用作筹行 —— 棘轮治理的是 内容体量,行数只是机读代理,新增以删减付账;密度优化仅随净减内容的 PR 顺带」. Line count stayed flat while content volume rose, which is exactly the shape the rule forbids. - Every one of the 16 re-wraps is reverted: outside the five cut regions and the new section, this file is byte-identical to origin/main. - The section is compressed 19 -> 11 lines (three bullets, each at its own 120-byte minimum) while keeping all four pinned items, the calibration case and the load-bearing .claude pathspec exclusion. - Payment is now REAL DELETION with a surviving home named per cut (8 lines): the seat-post back-pointer (home: seat-post-protocol.md); the re-quoted 2026-08-20 ruling plus the director-seat parenthetical (home: SKILL.md, same quote and date); the restated mechanical flag (home: the half-states gate script header this line already declares authoritative); the re-quoted three partition names (home: SKILL.md, which delegates only the per-partition dev obligations here); and the 已发布包/changeset conditional clause, whose rationale is verbatim in review-checklist.md and whose obligation is in os-dev.md. Cuts were re-derived against the post-13106 tree and avoid its hunks, so none of the cuts it already spends are claimed here. RESIDUAL DEFICIT: 4 lines (274 -> 278). check:pm-skill-ratchet is RED by construction and this number is the evidence for the ceiling decision; per the rework instruction no further re-wrapping was used to close it. --- .../references/dispatch-runbook.md | 166 +++++++++--------- 1 file changed, 85 insertions(+), 81 deletions(-) diff --git a/.claude/skills/pm-dispatch/references/dispatch-runbook.md b/.claude/skills/pm-dispatch/references/dispatch-runbook.md index 202eb2ff0a..61daf0daae 100644 --- a/.claude/skills/pm-dispatch/references/dispatch-runbook.md +++ b/.claude/skills/pm-dispatch/references/dispatch-runbook.md @@ -44,11 +44,14 @@ sweep 周期的半状态是治愈环自身的缺陷,不是库存;正文自报 P0 ## 同趟成员卡写侧打包(维护者 2026-08-16 限流裁定的对价) 出处:反复撞的限流墙经维护者确认为「GitHub API 池」。同一趟派发/定级覆盖多张成员卡 -时,**锚卡承载全量认领(或定级)评论**(会话、分支、文件面、交付物、串行约束全量),成员 -卡各留一行指针指向锚卡;标签翻转照旧逐卡执行 —— 省的是评论正文写量,不是状态写 -入;验收与解锁扫描的读侧不变,仍逐卡读。**写序:标签翻转只在认领评论写成功之后**,两笔 -不原子 —— 评论 502 而标签已翻即制造一记真 H2(实测一轮三起);顺序反了就带重试义务,重 -试未成即回滚标签。 +时,**锚 +卡承载全量认领(或定级)评论**(会话、分支、文件面、交付物、串行约束全量),成员卡各留 +一行 +指针指向锚卡;标签翻转照旧逐卡执行 —— 省的是评论正文写量,不是状态写入;验收与解锁 +扫描的 +读侧不变,仍逐卡读。**写序:标签翻转只在认领评论写成功之后**,两笔不原子 —— 评论 502 +而标 +签已翻即制造一记真 H2(实测一轮三起);顺序反了就带重试义务,重试未成即回滚标签。 ## 座位贴活性巡查(分诊轮常设项;维护者 2026-08-14) @@ -58,10 +61,11 @@ fire 附带一次: - **扫描面**:`label:pm:seat` 列表页上标题挂 `🟢 ` 的贴;`🟢 Routine` 座位以 调度器读数为准,不入本巡查。 - **判据只认在任者自己的产出**(自有评论/认领/正文编辑,作者与时间戳是平台盖章的硬读 - 数), ⛔ 不算发给它的跨座位通知 —— 收到消息不是活着的证据。 -- **>24h 无自有产出(与既有回收线同一条)⇒ 当场降级**:标题改 `⏳ vacant` + 摘 assignee **同 - 笔**,留证据评论(最后自有产出的时间戳与链接);在飞认领照认领协议由原认领者跟完。 -- 惰性判定(接管冲突时)照旧,本巡查是其常设出口(细则见 `seat-post-protocol.md`)。 + 数), + ⛔ 不算发给它的跨座位通知 —— 收到消息不是活着的证据。 +- **>24h 无自有产出(与既有回收线同一条)⇒ 当场降级**:标题改 `⏳ vacant` + 摘 assignee + **同笔**,留证据评论(最后自有产出的时间戳与链接);在飞认领照认领协议由原认领者跟 + 完。 ## 分诊席读数成本三则(维护者 2026-08-20) @@ -72,24 +76,25 @@ fire 附带一次: 沿用主文件轮次报告节定义,含点名带开放下游依赖的决策卡)。**细节禁止复述**:逐卡理 由已作审计评论落卡,简报只指不拷。硬预算正文 ≤3000 字符,收班**自报字符数**;连续 两轮超限即漂移 —— 没有读数的「写短点」约定会涨回去。 -- **互斥最小尾页读法**(读数定义在主文件):尾页配方只覆盖座位贴两个读数;第三读数 (车道 - `pm:dispatched` 卡最新非本 session `Claim:`)出自车道盘点,不在座位贴线程。配方:`issue_read get` - 拿评论总数,按小 `perPage`(~15)算末页页码只读尾页;尾页缺读数再回翻一页,⛔ 不读整线程。 -- **长线程状态读外包**:线程 > ~15 条的**状态提取**(找最新转换评论、抽 `Restart-when:` 行、确 - 认 claim/report 在不在)派低档只读子代理(sonnet 即可)返回结构化摘录,尾部优先。**裁决级阅 - 读(契约复审、放行判定、代裁)不可外包** —— 那是拿放行质量换 token,禁止。 +- **互斥最小尾页读法**(读数定义在主文件):尾页配方只覆盖座位贴两个读数;第三读数 + (车道 `pm:dispatched` 卡最新非本 session `Claim:`)出自车道盘点,不在座位贴线程。 + 配方:`issue_read get` 拿评论总数,按小 `perPage`(~15)算末页页码只读尾页;尾页缺 + 读数再回翻一页,⛔ 不读整线程。 +- **长线程状态读外包**:线程 > ~15 条的**状态提取**(找最新转换评论、抽 + `Restart-when:` 行、确认 claim/report 在不在)派低档只读子代理(sonnet 即可)返回结 + 构化摘录,尾部优先。**裁决级阅读(契约复审、放行判定、代裁)不可外包** —— 那是拿放 + 行质量换 token,禁止。 - **派发前读一次 `rate_limit`**:配额是全舰队共享的单点,耗尽同时杀掉在飞的每个 agent(实测一记限流一次带走三个 dev);余量装不下整批就减批,⛔ 不靠撞墙发现。 ## 分诊两级盘点细则(维护者 2026-08-20) -出处(逐字,未译):「每次都需要 四仓全量 open issue 盘点 … 吗?建议分诊多久执行一次」 -→「立卡」。实测全量四仓 ~50k token/轮,`since` 等价 ~8k。小时层三读法:sweep 析取①②③ = -`list_issues` + `since`(标签变更刷新 `updated_at`,半标注照样入窗);解锁扫描反演 = 逐仓 -`state=CLOSED` + `since` 与 `Blocked-by:` 反向索引求交,命中走既有回队双查;健康指标 = 逐 -标签 `perPage: 1` 只读 `totalCount`。每日层(当日首 fire)= 四仓全量对账 + 归集本就日频的 -职责(finding 集中轮、`Restart-when:` 判据批扫、决策箱回填)。成本靶:干活轮 ≤50k,空转轮 -守既有探针预算(契约复审的常设承担归项目总监席人工召唤,见 `contract-review.md`)。 +出处原话逐字住主文件「两级盘点」条。实测全量四仓 ~50k token/轮,`since` 等价 ~8k。小时层 +三读法:sweep 析取①②③ = `list_issues` + `since`(标签变更刷新 `updated_at`,半标注照样入窗);解锁 +扫描反演 = 逐仓 `state=CLOSED` + `since` 与 `Blocked-by:` 反向索引求交,命中走既有回队双查;健康 +指标 = 逐标签 `perPage: 1` 只读 `totalCount`。每日层(当日首 fire)= 四仓全量对账 + 归集本就日频 +的职责(finding 集中轮、`Restart-when:` 判据批扫、决策箱回填)。成本靶:干活轮 ≤50k,空转轮守 +既有探针预算。 ## 落卡与裁决记录细则(维护者 2026-08-13) @@ -97,9 +102,10 @@ fire 附带一次: 要更新项目经理技能」。实测:一张决策卡三个叠加半状态。 - **裁决记录四件补遗**(四件本体在主文件;原子、记录座位全责、维护者裁与代裁同规):① - 鲜度门可内联声明分歧代替调和正文,对过期正文记录的裁决按过期论;② 结果态 = - `pm:queue`/`pm:blocked`/`pm:on-hold`/关闭,永不留挂;④ 已可判定的就地解决,⛔ 不留给未来静默触 - 发。 + 鲜 + 度门可内联声明分歧代替调和正文,对过期正文记录的裁决按过期论;② 结果态 = + `pm:queue`/`pm:blocked`/`pm:on-hold`/关闭,永不留挂;④ 已可判定的就地解决,⛔ 不留给未 + 来静默触发。 - **机械两旗(report-only,归半状态巡查;接线是另一张卡的事,⛔ 不随协议文本改脚本)**:旗 一 —— open 卡标题带决策标记或线程含裁决记录、却仍挂 `needs-user-decision`;旗二 —— `pm:blocked` 卡的 `Blocked-by:` 目标已关闭。「交付了一半的阻塞」是判断不是 grep,归四件 @@ -112,15 +118,17 @@ fire 附带一次: ## 结论当轮执行(维护者 2026-08-14) 出处:维护者裁(逐字,未译)「现在开工派发」;当日实测是成批「建议关闭」复测结论与结论 -表躺置多日无人执行。 +表 +躺置多日无人执行。 - **结论产生的那一轮就执行它。** 复测/审计/裁决得出结论而不在同一轮完成对应的关 - 闭/换标写入,本身就是半状态,与半状态家族同列 —— 记录后离场(record-and-walk-away)⛔ 禁 - 止;结论表同规,表不是交付物,落账才是。 + 闭/换标写 + 入,本身就是半状态,与半状态家族同列 —— 记录后离场(record-and-walk-away)⛔ 禁止;结论 + 表同规,表不是交付物,落账才是。 - **无权执行 ⇒ 点名有权者,并当轮把状态搬进对方收件箱**(换标进对方的收件箱视图/决策 - 箱), ⛔ 不许只留一条评论等人路过 —— 评论不是任何人的收件箱,标签才是。 -- **机械半边**:「交付 PR 已合并而卡仍挂 `pm:dispatched`」由半状态巡查的 report-only 项浮 - 出(细节以脚本头为权威);旗标是兜底,当轮执行才是修法。 + 箱), + ⛔ 不许只留一条评论等人路过 —— 评论不是任何人的收件箱,标签才是。 +- **机械半边**:旗标由半状态巡查 report-only 浮出(判据以脚本头为权威);当轮执行才是修法。 ## 云卡(`mode:cloud`)四课 @@ -129,9 +137,10 @@ fire 附带一次: draft-PR 时点交报、transcript 复活与接手协议兜底;共享容器争用只来自 build+test, docs/指令类 M 卡碰不到 —— 归档义务因此只落云卡。 -1. **授权面随 source,不随环境**:trigger 拉起的会话无仓库授权(只读勘察); `create_session` 带 - `source_url` 出生即持推送授权。同时带 `outcome_branch`(= 认领分支)、显式 `model`(trigger 流不可 - 指模型)、`title`(车道名开头,⛔ 不叫 os-dev;形如 `⚡ <车道> #<单号> <短语>`)。 +1. **授权面随 source,不随环境**:trigger 拉起的会话无仓库授权(只读勘察); + `create_session` 带 `source_url` 出生即持推送授权。同时带 `outcome_branch`(= 认领分 + 支)、显式 `model`(trigger 流不可指模型)、`title`(车道名开头,⛔ 不叫 os-dev;形如 + `⚡ <车道> #<单号> <短语>`)。 2. **派发词必带自驱条款**(云会话回合一结束即停摆等 poke):⛔ 不为提问/中期汇报结束回 合;开放选择按裁决与评估轴自裁记入终报 open_questions;合法回合终点只有 (a) 推送完成 + 终报,或 (b) 硬阻塞详报。 @@ -141,13 +150,14 @@ docs/指令类 M 卡碰不到 —— 归档义务因此只落云卡。 4. **云卡 draft PR 一存在,立即 `subscribe_pr_activity` —— 硬步骤**:未订阅的云卡 PR 是轮 询负债,订阅把感知从巡检周期缩到秒级。 -监控与转向:`get_session` 读实时状态(IDLE + 分支未推送 = 停摆待 poke);投递消息用绑定会话的 -poke 触发器(`create_trigger` 带 `persistent_session_id` + `fire_trigger`,用后即 `delete_trigger`);巡检退为兜 -底心跳,只补订阅盲区(会话停摆、未开 PR 的分支、姊妹仓动静)。roster 不可达与 SendMessage 同 -裁(`ListAgents` 同列不到,⛔ 不复测)。会话句柄是**账号作用域**的:`get_session` / `archive_session` / -绑会话 poke 触发器对另一账号建的会话一律答 `not found`,与「从不存在」不可区分 —— **⛔ -永不读作死亡信号**(实测判 not found 的会话数十分钟前还 RUNNING;误判死会往活 worktree 塞第二 -个 agent);跨账号接班活性只认 GitHub 产出读数 —— draft-PR 时点交报正为此存在。 +监控与转向:`get_session` 读实时状态(IDLE + 分支未推送 = 停摆待 poke);投递消息用绑 +定会话的 poke 触发器(`create_trigger` 带 `persistent_session_id` + `fire_trigger`,用 +后即 `delete_trigger`);巡检退为兜底心跳,只补订阅盲区(会话停摆、未开 PR 的分支、姊妹 +仓动静)。roster 不可达与 SendMessage 同裁(`ListAgents` 同列不到,⛔ 不复测)。会话句 +柄是**账号作用域**的:`get_session` / `archive_session` / 绑会话 poke 触发器对另一账号 +建的会话一律答 `not found`,与「从不存在」不可区分 —— **⛔ 永不读作死亡信号**(实测判 +not found 的会话数十分钟前还 RUNNING;误判死会往活 worktree 塞第二个 agent);跨账号接 +班活性只认 GitHub 产出读数 —— draft-PR 时点交报正为此存在。 ## subagent 批(`mode:subagent`)派发前置:先快进本地检出 @@ -159,9 +169,10 @@ subagent 在 PM 容器内运行,agent 定义与技能文本读**本地检出**, 先试复活、不可用才接手与 ⛔ 不重跑原派发词在主文件;五条增量: -- **死后恢复查三态,不止查远程**:远程(`git ls-remote`)/ 仅容器磁盘 / 真没了 —— 中间那态最 - 值钱且当前无人查(worktree 比 agent 活得久,同容器共享,未提交改动通常还在),只查远程会令 - 下一个 dev「从零开始」。捡到的工作一律标 **UNVERIFIED** 交接 —— 不丢弃也不继承。 +- **死后恢复查三态,不止查远程**:远程(`git ls-remote`)/ 仅容器磁盘 / 真没了 —— 中间那 + 态最值钱且当前无人查(worktree 比 agent 活得久,同容器共享,未提交改动通常还在),只查远 + 程会令下一个 dev「从零开始」。捡到的工作一律标 **UNVERIFIED** 交接 —— 不丢弃也不继 + 承。 - worktree 已存在,⛔ 不要新建,`cd` 进去接着做(第二个 worktree 会劈开工作); - 先读全部既有提交与未提交改动,逐 hunk 决定保留或修正 —— 既不推倒重来也不盲信(死 agent 的一切都未经验证); @@ -180,11 +191,13 @@ subagent 在 PM 容器内运行,agent 定义与技能文本读**本地检出**, ## 停摆复位梯度 -原则三条在主文件;本节是执行细则。姿态句全 -文:「前台(阻塞)同步执行全部步骤,中途不停止、不把构建/测试挂到后台等唤醒」。梯度逐 -级(原样重发同一句不算一次复位):① 复述执行姿态 → ② 点名下一个工具调用 + 明令禁止 -后台等待 → ③ 第三次停摆判 unreliable,按接手协议重派到该分支。自己挂的定时器不会唤醒 -自己;长验证管线的派发/接力词写明前台姿态;生产侧条款在 os-dev 定义。 +原则三条在主文件;本节是执行细则。姿态句全文:「前台(阻塞)同步执行全部步骤,中途不停 +止、不把构建/测试挂到后台等唤醒」。梯度逐级(原样重发同一句不算一次复位):① 复述执行姿态 +→ ② 点名下一个工具调用 + 明令禁止后台等待 → ③ 第三次停摆判 unreliable,按接手协议重 +派到 +该分支。自己挂的定时器不会唤醒自己;长验证管线的派发/接力词写明前台姿态;生产侧条款 +在 +os-dev 定义。 ## 通知重放去重 @@ -205,17 +218,17 @@ subagent 在 PM 容器内运行,agent 定义与技能文本读**本地检出**, 原则(⛔ 默认不整段粘贴 issue 正文;dev 自查正文完整性是「自己读」截断风险的对价)在主文 件;本节是条款原文与增量: -- **三分区条款原文**:「裁决(不可重裁)」—— dev 执行,不重 - 开;「PM 机制假设(须实测,鼓励证伪)」—— dev 动手前验证,证伪照实报告并按裁决意图换实 - 现路径,⛔ 不许为顺从假设硬做;「PM 建议的路线(可选,实测优先)」—— dev 有更好的就 - 换,⛔ 不得因「派发令写了」照做。 +- **三分区各自的 dev 义务**(三个区名逐字住主文件「三分区」条):裁决区 dev 执行不重开;机 + 制假设区动手前验证,证伪照实报告并按裁决意图换实现路径,⛔ 不许为顺从假设硬做;建议 + 路线区有更好的就换,⛔ 不得因「派发令写了」照做。 - **兄弟 dev 报告里的成本/形状估计一律落「机制假设」区并注明须复测**,⛔ 不得穿裁决的衣服转述:被当事实搬运的「两行 改动」照字面落地把双字面量的方向循环写成 `desc → desc → null`,度量列永远升不了序而天真测试照绿 —— 错在搬运的派发词。 - **前提含「spec 有这个槽位」⇒ 派发前先读安装包内的活性账 - 本**(`node_modules/@objectstack/spec/liveness/<域>.json` 对应行):`status: 'planned'` = 有 carrier、零消费 - 者,`authorHint` 就是证词;不读账本的派发让 dev 交出解析通过、校验通过、加载成功而**渲染 - 为零**的元数据 —— 绿收据背书的假修复比诚实的缺陷更贵,代价是一次文件读对一整轮 - agent 运行。 + 本**(`node_modules/@objectstack/spec/liveness/<域>.json` + 对应行):`status: 'planned'` = 有 carrier、零消费者,`authorHint` 就是证词;不读账本的派发让 dev 交 + 出解析通过、 + 校验通过、加载成功而**渲染为零**的元数据 —— 绿收据背书的假修复比诚实的缺陷更 + 贵,代价是一次文件读对一整轮 agent 运行。 - **停条件写法:要证据,不要判决**。派发令里的前提/停条件检查必须要 dev 回报**证据 面**(搜了什么、找到什么),分叉 归 PM 判 —— 写成「发现消费者就停下」把判决权交回被停的一方。 @@ -228,11 +241,12 @@ subagent 在 PM 容器内运行,agent 定义与技能文本读**本地检出**, 法),装依赖命令别带它。 - **文件面两句原文**:「预期落点是 X;若实测表明真正的生产者在别包,报备后按生产者侧修(落点与理由写进报告和 PR 正文),⛔ 不 在消费者侧打补丁」—— 只写一个路径名,是要求 dev 在守约与修对之间二选一;跨包常等于跨车道,PM 事后补跨座位声明。 -- **Same-day churn 行与在飞重叠**:派发时 `git log origin/main --oneline -20 -- ` 见当天合并 ⇒ 加 - 一行「基于合并后的代码工作,issue 引用的片段可能已变,先核对当前 main」(dev 的 worktree 切 - 出后不会自己更新)。在飞重叠每轮拦截(churn 行只覆盖派发瞬间):main 新落 PR 与在飞申报文 - 件面求交,相交即警告四句 —— 合 main 重跑测试矩阵、读对方 diff 重划边界、只补它没覆 - 盖的部分、被完全覆盖就停下回报 ⛔ 不硬造 diff。晚一轮 = 一次返工。 +- **Same-day churn 行与在飞重叠**:派发时 `git log origin/main --oneline -20 -- ` 见当天合并 ⇒ 加一行「 + 基于合并后的代码工作,issue 引用的片段可能已变,先核对当前 main」(dev 的 worktree 切出后不会自己更新)。在飞重 + 叠每轮拦截(churn 行只覆盖派发瞬间):main 新落 PR 与在飞申报文件面求交,相交即警告四句 + —— 合 main 重跑测试矩 + 阵、读对方 diff 重划边界、只补它没覆盖的部分、被完全覆盖就停下回报 ⛔ 不硬造 diff。 + 晚一轮 = 一次返工。 - **全仓 pin 清扫两句原文**:① grep 错误码/错误消息**全仓扫描**同语义 pin,一轮翻完,不只改 本包(旧立场的 pin 住在 被改包之外的消费层);② 翻转后的 pin 必须继续承重 —— 断言新语义的**实质**(行数、译文、状态码),不是「旧断言已 @@ -247,28 +261,18 @@ subagent 在 PM 容器内运行,agent 定义与技能文本读**本地检出**, 抄进派发令**(⛔ 不 凭记忆),并带:「每一面都必须在 PR 正文有一个结论:已改 / 本就合规(证据)/ 明确不在范围(理由);⛔ 静默略过 —— 评审把没提到的面读作漏掉的面」。防的不是做错,是做对了一部分然后以为做完了。 - - 改动触及**已发布包**(`package.json` 的 `private` 不为 true)⇒ 「用户可见行为改动**必须**带 - `.changeset/*.md`;判据是包的发布状态,不是改动大小 —— 缺了则合进 main 却永不发布,看起来像修好了,比不合更 - 糟」(ACCEPT 侧对账在复核清单)。 - **测量先行卡**(修复由测量结果**有条件授权**)⇒ 派发令写 明「⛔ 测量存在之前不写修复」—— 测量姿态让 dev 看得见 卡面没列的探针,实现姿态只看得见要交的 diff。 ## security-object 无判决枚举(座位贴常设 ⑦)的方法与校准 -⑦ 每 ~10 轮跑一次,读数追加在座位贴(⛔ 不建台账、不设红门、不给 verdict);方法落本节。 - -- **表面半边 = 对基线 ref 直接 diff 列声明,⛔ 不比两个总 - 数**:`git diff <基线ref> origin/main -- '<两插件>/src/objects/*.object.ts'` 再 - `grep -E "^[+-] [a-z_][a-z0-9_]*: Field\."`;零命中 = **成员级同一**,强于「两个总数相等」且更便 - 宜 ⇒ 读数必记基线 ref(2026-08-26 = `b000ab59`),否则下轮无从 diff。 -- **读者半边的分类判据(⛔ 不得每轮重新发明)**:命中面取 - `git grep -I -n -w "<键>" -- . ':(exclude)<声明该列的 *.object.ts>' ':(exclude).claude'`,**逐命中行计一 - 次**;① `*.generated.ts`(i18n 等生成包)**不是读者**,排除;② `packages/spec` 的契约声明**算一个读 - 点**(被消费的契约面,不是该列自身的声明);③ 裸字面量 `key:` 拼写**算**、与属性读同 - 权(2026-08-26 注:「读者计数必须含裸字面量 `key:` 拼写」)。 -- **校准用例(正对照)恒先跑**:`sys_share_link.email_allowlist` = **3** 个非声明读点(2026-08-26 记);跑 - 不出 3 ⇒ **仪器坏了**,⛔ 记下任何零之前停(漏 ① 得 7,多减 ② 得 2)。 -- **⛔ 无正对照的零记「没读到 / NOT MEASURED」,不记 0**:⑦ 的输出全是零,正对照是它唯一的 - 可证伪面;`name` / `label` / `description` 这类列名到处匹配 ⇒ 未校准的仪器平凡地 - 回「新增零读者键 0」,与一次成功枚举逐字节同形。 +- **表面半边**:`git diff <基线ref> origin/main -- '<两插件>/src/objects/*.object.ts'` 过 + `grep -E "^[+-] [a-z_][a-z0-9_]*: Field\."`;零命中 = 成员级同一(强于总数相等);读数必记基线 + ref(2026-08-26 = `b000ab59`)。 +- **读者半边**:`git grep -I -n -w "<键>" -- . ':(exclude)<声明该列的 *.object.ts>' ':(exclude).claude'`(⛔ + 缺后者会命中本节),逐命中行计一次:① `*.generated.ts` 不是读者;② `packages/spec` 契约声 + 明**算**读点;③ 裸字面量 `key:` 拼写**算**。 +- **正对照恒先跑**:`sys_share_link.email_allowlist` = **3**(2026-08-26 记;漏 ① 得 7,多减 ② 得 2)—— + 跑不出 3 即仪器坏了,⛔ 记下任何零之前停;⛔ 无对照的零记「没读到」不记 0(`name` 这类 + 列名到处匹配,未校准的仪器平凡地回 0)。 From 55f24d14bdfa09563891c46697e206d789f4fd16 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 29 Aug 2026 05:44:14 +0000 Subject: [PATCH 3/3] docs(pm-dispatch): compress the enumeration section to the 10-line target MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bullet 1's 「⛔ 不比总数」 point moves into its label, which lets the whole bullet wrap in 2 lines instead of 3 without dropping the baseline-ref rule or its 2026-08-26 provenance. Section 11 -> 10 lines, residual deficit 4 -> 3. 10 is the structural floor, not a stopping point chosen for convenience: the two recipes are single unbreakable code atoms of 75 and 46 bytes, so bullet 1 cannot go below 2 lines while carrying both, and bullets 2 and 3 are already at their own minimum line counts. Going lower means deleting a recipe or the parentheticals that say why each rule is what it is. RESIDUAL DEFICIT: 3 lines (274 -> 277). --- .claude/skills/pm-dispatch/references/dispatch-runbook.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.claude/skills/pm-dispatch/references/dispatch-runbook.md b/.claude/skills/pm-dispatch/references/dispatch-runbook.md index 61daf0daae..31a1510d93 100644 --- a/.claude/skills/pm-dispatch/references/dispatch-runbook.md +++ b/.claude/skills/pm-dispatch/references/dispatch-runbook.md @@ -267,9 +267,8 @@ os-dev 定义。 ## security-object 无判决枚举(座位贴常设 ⑦)的方法与校准 -- **表面半边**:`git diff <基线ref> origin/main -- '<两插件>/src/objects/*.object.ts'` 过 - `grep -E "^[+-] [a-z_][a-z0-9_]*: Field\."`;零命中 = 成员级同一(强于总数相等);读数必记基线 - ref(2026-08-26 = `b000ab59`)。 +- **表面半边(⛔ 不比总数)**:`git diff <基线ref> origin/main -- '<两插件>/src/objects/*.object.ts'` 过 + `grep -E "^[+-] [a-z_][a-z0-9_]*: Field\."`;零命中 = 成员级同一,必记基线 ref(2026-08-26 `b000ab59`)。 - **读者半边**:`git grep -I -n -w "<键>" -- . ':(exclude)<声明该列的 *.object.ts>' ':(exclude).claude'`(⛔ 缺后者会命中本节),逐命中行计一次:① `*.generated.ts` 不是读者;② `packages/spec` 契约声 明**算**读点;③ 裸字面量 `key:` 拼写**算**。