From 746c05963a50feef03e644ecf2e906790917a91c Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 25 Aug 2026 08:15:39 +0000 Subject: [PATCH] =?UTF-8?q?docs(pm-dispatch):=20SKILL.md=20discipline=20pa?= =?UTF-8?q?ck=20=E2=80=94=20six=20scoped=20protocol=20amendments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One file, six amendments, all from the skills-lane self-triage rulings on the folded pack (hazard-claim readings, angle-bracket placeholders, work-item staleness, the dev's own claim comment, the fourth mutex reading, and the report-marker collection criterion). The line ceiling was NOT raised: 1005 -> 999 lines (headroom 6). New rule text is paid for by compressing existing prose in the paragraphs it lands in. --- .claude/skills/pm-dispatch/SKILL.md | 228 ++++++++++++++-------------- 1 file changed, 111 insertions(+), 117 deletions(-) diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index 78fafc7392..789070627f 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -56,15 +56,14 @@ UI 创建、UI 钉模型 —— 凭据随 Routine 所挂 repo sources 走,Routin (2026-08-23 实测;会话内 create_trigger 建的是静默零产出陷阱,细节在 references);② 创建后手动 fire 一轮烟测,判据取**GitHub 上的产出**;③ 每 fire 一轮:读座位 贴 → 从 labels 重建状态 → 跑一轮 → 结束,不继承上下文。**开轮互斥读法**(宁少跑,不让两 -个同座位 -会话并行写标签):fire 开始、首个写动作之前读三个读数,任一未满一个轮次 ⇒ 自退 —— 最 -近收班简 -报;晚于它的最新「开轮」标记(轮中会话在座位贴上唯一的痕迹);本车道 `pm:dispatched` 卡最新 -非本 -session 的 `Claim:` 评论(拼写见「认领」,车道盘点已取)—— 标记可漏写,认领不可省;第三读数 -只会 -**增加**自退、永不清座位。三读数皆清,先在座位贴留一行开轮标记(session ID + fire 时刻)再 -跑轮。 +个同座位会话并行写标签):fire 开始、首个写动作之前读四个读数,任一未满一个轮次 ⇒ 自 +退 —— 最近收班简报;晚于它的最新「开轮」标记(轮中会话在座位贴上唯一的痕迹);本车道 +`pm:dispatched` 卡最新非本 session 的 `Claim:` 评论(拼写见「认领」,车道盘点已取);本车道 +`state=CLOSED` 按 `updated_at` 降序第一张卡的 `Claim:` session ID —— 第四读免疫标签惯例:不用 +`pm:dispatched` 的会话对前三读完全隐形,叠加过期座位贴后与空席同形(实测:一个 16 分钟前还 +在一趟合并五个 PR 的会话被读作「清」)。标记可漏写,认领不可省;第三、四读数只**增 +加**自退、永不清座位。四读数皆清,先在座位贴留一行开轮标记(session ID + fire 时刻)再跑 +轮。 ## 全体座位的不变量 @@ -106,57 +105,53 @@ session 的 `Claim:` 评论(拼写见「认领」,车道盘点已取)—— 标 **标签纪律 —— 标签就是状态机,必须诚实:** -- `needs-user-decision` vs `pm:on-hold` = **决定待做 vs 已做**,挂错招来重复升级或永久沉默;hold 没 - 有可点火的出口 = 谁都无法合法退出的状态,`manual — <理由>` ⛔ 不是合法出口 —— 没有 - 机制能唤醒的卡不 +- `needs-user-decision` vs `pm:on-hold` = **决定待做 vs 已做**,挂错招来重复升级或永久沉默;hold + 没有可点火的出口 = 谁都无法合法退出的状态,`manual — <理由>` ⛔ 不是合法出口 —— 没 + 有机制能唤醒的卡不 hold,按「暂时不准备开发 ⇒ 直接关闭」(维护者 2026-08-16 原话:「我建议有些暂时不准备开发的应该直接 - 关闭。」)关 not planned,理由与出处写进关单评论:卡即记录、重开免费、维护者可否决。**关闭默认不适用 - `type:Bug` 的 hold**,三分支:可复现且用户可达 ⇒ 回 `pm:queue`(Bug 优先只作用于队列卡,被 hold - 的 Bug 就 - 是被藏起的缺陷);declared≠enforced 观察类 ⇒ 转 enforce-or-remove 通道(其真实解决路径,不 hold - 不裸 - 关);真 won't-fix 候选 ⇒ 逐卡进决策箱 —— 座位永不自行关闭真实缺陷。**机会主义重启条 - 件必须点名触发文 - 件**(维护者 2026-08-11 接受):写侧即 `Restart-touch:` 行(行契约见 `references/state-machine.md`);派发 - 前必查收敛为一件事 —— 派发/折叠检查时读半状态巡查锚(`half-state-patrol.yml` 的 - `ANCHOR_ISSUE` 置顶 issue)的 H17 on-hold 触发文件索引、与本次派发文件面相交,命中 ⇒ 按该 hold - 评论的 rider/restart 条款处置(点名该单、顺手活列为申报过的增项)。 + 关闭。」)关 not planned,理由与出处写进关单评论:卡即记录、重开免费、维护者可否决。**关闭 + 默认不适用 `type:Bug` 的 hold**,三分支:可复现且用户可达 ⇒ 回 `pm:queue`(被 hold 的 Bug 就是 + 被藏起的缺陷);declared≠enforced 观察类 ⇒ 转 enforce-or-remove 通道(不 hold 不裸关);真 + won't-fix 候选 ⇒ 逐卡进决策箱 —— 座位永不自行关闭真实缺陷。**机会主义重启条件必须 + 点名触发文件**(维护者 2026-08-11 接受):写侧即 `Restart-touch:` 行(行契约见 + `references/state-machine.md`);派发/折叠检查时读半状态巡查锚(`half-state-patrol.yml` 的 + `ANCHOR_ISSUE` 置顶 issue)的 H17 on-hold 触发文件索引、与本次派发文件面相交,命中 ⇒ 按该 + hold 评论的 rider/restart 条款处置(点名该单、顺手活列为申报过的增项)。 - **`Blocked-by:` 行是机器可 grep 的反向索引**,一遍读喂三个职责:上游关单时放回被解锁的、 - 按解 - 锁扇出排序选择、**在合并后的 ref 上重验每张回队卡的文件面**(⛔ 只做第一件;上游已合 - ≠ 卡还成 - 立 —— 关掉上游的那个合并最可能顺手把你这张卡也修掉)。**一个标签存在,当且仅当有 - 具名读者**;`pm:blocking` 即其推导缓存(语义见状态模型行,读者以词表脚本注为权威;裁决原 - 话见 runbook 全序节)。 + 按解锁扇出排序选择、**在合并后的 ref 上重验每张回队卡的文件面**(⛔ 只做第一件;关掉 + 上游的那个合并最可能顺手把你这张卡也修掉)。**一个标签存在,当且仅当有具名读 + 者**;`pm:blocking` 即其推导缓存(语义见状态模型行,读者以词表脚本注为权威;裁决原话见 + runbook 全序节)。 - **跨仓解锁的判据是「消费方可安装」,不是「上游已合并」**:消费仓以**发布包**消费该上 游(而非 git SHA pin)时,解锁扫描放回前先验证修复已进入消费方可安装的发行版(安装面探 - 针:装上的包是否接受新键/新行为); - 未发版 ⇒ 转 `pm:on-hold` + `Restart-when: <消费方安装面判据>`,⛔ 不回 `pm:queue` —— 回队烧掉 - 的派发注定以 premise-false 收场;发行与依赖升级是人工动作,hold 评论预写唤醒后的派发形 - 状,让任何座位可继承。 - pin 消费的仓不适用本条 —— pin 移动即可安装,照旧走 pin 滞后读数(多仓协调 2)。 -- **状态变更不过夜**:标签挂了评论没跟上、assignee 设了没认领评论、结论只在 chat ——都 - 是半状态 - ,结束会话(含限流悬挂)前补齐成对或回滚半边(report-only 巡查见机械守卫索引)。**等待他座 - 位也是状态,写在卡上才存在**(等谁、自何时,⛔ 不留在会话记忆);P0 嫌疑的等待 ⇒ 紧急直 - 接分诊通道是义务不是选项(维护者 2026-08-19)。**代执行他人指令 - 的关闭/作废,评论带出处三件(谁的指令、原话、在哪说的)** —— 无出处的关闭与误操作 - 在证据上不可区 - 分,会被兄弟席当误扫重开;同理适用于摘标签、回收认领等不可反推理由的动作。 + 针: 装上的包是否接受新键/新行为);未发版 ⇒ 转 `pm:on-hold` + `Restart-when:` 加消费方安装面 + 判据,⛔ 不回 `pm:queue` —— 回队烧掉的派发注定以 premise-false 收场;发行与依赖升级是人工 + 动作,hold 评论预写唤醒后的派发形状。pin 消费的仓不适用本条 —— pin 移动即可安装,照 + 旧走 pin 滞后读数(多仓协调 2)。 +- **状态变更不过夜**:标签挂了评论没跟上、assignee 设了没认领评论、结论只在 chat —— 都 + 是半状态,结束会话(含限流悬挂)前补齐成对或回滚半边(report-only 巡查见机械守卫索 + 引)。**等待他座位也是状态,写在卡上才存在**(等谁、自何时,⛔ 不留在会话记忆);P0 嫌疑 + 的等待 ⇒ 紧急直接分诊通道是义务不是选项(维护者 2026-08-19)。**代执行他人指令的关 + 闭/作废,评论带出处三件(谁的指令、原话、在哪说的)** —— 无出处的关闭与误操作在证 + 据上不可区分,会被兄弟席当误扫重开;同理适用于摘标签、回收认领等不可反推理由的动 + 作。 - **写后回读按风险定向;标签写恒为硬步骤 read-modify-write + 回读**(维护者 2026-08-18 裁定):① 先取现集 → ② 只增删目标标签 → ③ 写合并集 → ④ 写后回读核验 —— 整组 PUT 写的是 本席快照,并发席落在你读与写之间的标签被静默剥掉,受害者常是你没打算碰的那枚;**承 - 载闸门语义的标签**(如 `needs:contract-review`)挂与清两向同此四步,闸门被剥不是红灯是放 - 行,「被剥」与「从未挂过」在证据上不可区分,回读是唯一察觉手段; - 多席可写面恒读回(防竞态覆盖,不只防 sanitizer);正文/评论仅当含尖括号/HTML 注释才读 - 回;「API 返回 200」≠「落地内容正确」。 + 载闸门语义的标签**(如 `needs:contract-review`)挂与清两向同此四步,闸门被剥不是红灯是放行, + 与「从未挂过」在证据上不可区分,回读是唯一察觉手段;多席可写面恒读回(防竞态覆盖,不 + 只防 sanitizer);「API 返回 200」≠「落地内容正确」。 +- **PM 写进 GitHub 的文本 ⛔ 不用尖括号路径占位符**,改写成「后跟显式路径」的说法 —— + 被 sanitizer 吃掉后剩下的裸命令读起来完整而其实不是(实测:一条派发令就 + 在「永不用裸形式」之前展示了它要禁的那条裸形式);backtick、围栏块与标题同吃,都不是 + 护身符。不产生这个构造才是修法,回读只是兜底:必须携带易损片段的评论(派发令与裁 + 决,不含例行标记)post 后读回。 ## 平台读数纪律 -统一原则:**判据取命令的输出,不取 API 字段的字面值、不取本地工作树现状、不 -取「看起来相邻」的 -日志。** GitHub API / 工具行为的实测事实表在 `references/platform-readings.md`(条目清单即其文内 -标题),做对应操作的那一刻查阅。常驻原则: +统一原则:**判据取命令的输出,不取 API 字段的字面值、不取本地工作树现状、不取「看起来相 +邻」的日志。** GitHub API / 工具行为的实测事实表在 `references/platform-readings.md`,做对应操作 +的那一刻查阅。常驻原则: - **核验 main 用 `origin/main`**(先 fetch,再 `git grep origin/main -- ` / `git show origin/main:`),⛔ 不用共享检出的工作树 —— 它的 HEAD由别的 agent 摆布。 @@ -173,9 +168,9 @@ session 的 `Claim:` 评论(拼写见「认领」,车道盘点已取)—— 标 不算;聚合只作阴性筛查,放行按名定向读单条 job,⛔ 不拉全表);advisory 门禁红着合并进 main 是共 享损伤,任何车道发现都立即止血 + 立单;落地两个读数与踢出重投的签名纪律见事实表。 -- **dev 自己死了 ≠ 维护者中止**:子代理消失(零推送/零分支/无报告)是正常死法,按死认领 - 回收处理;「维护者中止」只在有显式信号(原话,或宿主回报stopped by the user)时成立 —— 判 - 据是信号不是症状,⛔ 不得据推断立一道没有重启条件的门。 +- **dev 自己死了 ≠ 维护者中止**:子代理消失(零推送/零分支/无报告)是正常死法,走死认领回 + 收;「维护者中止」只在有显式信号(原话,或宿主回报 stopped by the user)时成立 —— 判据是 + 信号不是症状,⛔ 不得据推断立一道没有重启条件的门。 - **立单前查重**(关键词、CVE/公告号、包名、报错串各搜一遍 —— 两条 issue 描述同一个问 题,没有 门禁能看见);**共享基础设施修复,入队前按「症状」复查 main,不按issue 号**(重复修复守卫 @@ -354,8 +349,8 @@ skills,类似分诊」)—— 贴内指针指向其车道文件,升级走技能 **工具加载纪律(fire 开局)**:互斥检查/自退判断只按名加载所需工具 —— `ToolSearch` 用 `select:mcp__github__list_issues,mcp__github__issue_read` 形式,判定「本轮有活」之后才加载其余;⛔ 开 局不做泛关键词 ToolSearch(一次注入全家桶 schema —— 分诊席 2026-08-20 自测:空转轮 ~12 万 -token,~8 万是这张门票);可验判据:空转轮 ~4 万以内,分诊下轮自测读数回报。只约束分诊 fresh -session 的开局;执行座位(常驻会话)与 dev(需全工具面)不受此约束。 +token,~8 万是这张门票);可验判据:空转轮 ~4 万以内。只约束分诊 fresh session 的开局,执行座 +位与 dev(需全工具面)不受此约束。 **两级盘点(two-tier inventory;维护者 2026-08-20:「每次都需要 四仓全量 open issue 盘点 … 吗?建议分诊多久执行一次」→「立卡」)**:小 @@ -397,7 +392,7 @@ sanitizer 截断的卡不 可派发,评论修复指令后跳过;停摆指令判据必须比其它分类更硬(双读取),事后证伪同处公开 作废。 **决策箱勤务(常设)**:落卡入箱时校验/补全标准四棱卡面块(块形状见「升级与决策」);存量 -卡低频子轮回填 —— 回填新写的块用中文,存量英文块 ⛔ 不迁移。 +卡低频子轮回填,语言按不变量。 **原生 issue 类型 Bug/Feature/Task 是分诊的固定产出**(维护者 2026-08-12 裁定「同意」):分诊 座位是 `type` 字段的唯一权威生产者(立单者可预填,分诊校正 —— 与 `domain:*` 同一纪律);判 @@ -495,14 +490,17 @@ sub-issue 自动是 词裁决分区**作约束,无则写明「无裁决」—— 竞态复读只答「被谁认领」答不 了「已被裁过」(裁决评论不带 session ID,裁后回队的标签状态与从未裁过的卡同形,队列列表 分不出),漏读的派发词把已闭分叉当开放问题重开、并丢掉裁决自带的实施约束;评论还可能 -记着一半工作已交付。**派发前做前提过时检查(stale-premise check)—— 裁决同 -罪**(裁决描述的也是当时的仓,写得权威、日期又近,恰恰更容易被当成现成事实),两半都 -查:**动作 -面** —— `git log --oneline -20 -- ` 之外,裁决实施卡再核被点名的动作在 `origin/main` 上 -还没被做掉;**卡引用面** —— 裁决/卡片点名为阻塞、认领面、协调对象 -或「落地即启用」依赖的每张 -issue,逐个读当前 open/closed/assignee,引用读到的现状 ⛔ 不引用裁决写作时的描述(过时动作断 -言 dev 动手即自纠,过时卡引用不变红)。花几分钟,不查则赔一次 agent 运行。 +记着一半工作已交付。**派发前做前提过时检查(stale-premise check)—— 裁决同罪**(裁决描述的 +也是当时的仓,写得权威、日期又近,恰恰更容易被当成现成事实),三面都查:**动作面** —— +`git log --oneline -20 -- ` 之外,裁决实施卡再核被点名的动作在 `origin/main` 上还没被做 +掉;**卡引用面** —— 裁决/卡片点名为阻塞、认领面、协调对象或「落地即启用」依赖的每 +张 issue,逐个读当前 open/closed/assignee,引用读到的现状 ⛔ 不引用裁决写作时的描述(过时动作 +断言 dev 动手即自纠,过时卡引用不变红);**工作项面** —— 卡片与分诊评论列的每条工作 +项,逐条**对树**核验它是否仍未完成(grep 具名字符串、读那个常量),⛔ 不对卡核验:评论复读 +只找得到被推翻的裁决,找不到在别的卡号下已被做掉的工作(实测:一张三项卡有两项早已落 +地、点名的验证语料也已退役,烧掉一整轮才测出来)。每条工作项写进派发令时都是**dev 首 +先证伪的前提**(卡的中心断言已经这么写,任务清单照办),派发令即自带过时探测器。不查则 +赔一次 agent 运行。 **批次独立性。** 一批内任两单不得可能碰同一个包/registry/barrel/spec schema;拿不准就串 行。**同 @@ -620,16 +618,14 @@ dev 侧推分支要早 —— 远程分支是在飞工作最硬的证据。**死 会丢掉原文旁的例外,而被读的正是复述):额度耗尽豁免及其 `needs:contract-review` 补偿一并及 于它;豁免够不到的地板只有维护者裁决能设。**席位档策略(同 2026-08-20 裁决)**:skills 车道外 执行 PM 席默认 `opus` 会话,fable 保留给分诊 Routine(代裁 + 契约复审)、本席与条款②工作 —— -各自档位与 Routine UI pin 归既有条款,本行记策略 ⛔ 不建触发器不另抄。降档出口两条:**额 -度耗尽豁免**(维护者 2026-08-13 +各自档位与 Routine UI pin 归既有条款(本行只记策略)。降档出口两条:**额度耗尽豁免**(维护者 +2026-08-13 原话:「fable 如果用完了,可以用 opus」):仅当 fable 实测不可用(限流/墙杀中途,重派同样可降) 才落 `opus`,⛔ 不再往下;与**主动预降**(余量吃紧可预先降档),两者档位与理由皆记入认领评 -论「Container & model」行。明确不变(合并后按席内 -分派面适用):spec 文本面照旧 sonnet/opus;机器面与下游适配默认 opus,门禁语义设计升 fable,拿 -不准升档照旧。**档位逐次派发显式传参,永不省略**(解析顺序、pin 语义与允许名单回退陷 -阱以 os-dev -定义 frontmatter 注释为权威),连同尺寸写进同一行;分诊 suggestion 行是输入不是决定,不采纳给 -理由。 +论「Container & model」行。明确不变:spec 文本面照旧 sonnet/opus;机器面与下游适配默认 opus, +门禁语义设计升 fable,拿不准升档照旧。**档位逐次派发显式传参,永不省略**(解析顺序、pin +语义与允许名单回退陷阱以 os-dev 定义 frontmatter 注释为权威),连同尺寸写进同一行;分诊 +suggestion 行是输入不是决定,不采纳给理由。 **派发词原则(构造细则与条款原文见 `references/dispatch-runbook.md`)。** ⛔ 默认不整段粘 贴 issue 正文 —— 让 dev 自己读 GitHub 全文与全部评论,并**必须**要求 dev 自查正文完整性(截 @@ -637,17 +633,26 @@ dev 侧推分支要早 —— 远程分支是在飞工作最硬的证据。**死 风险随「自己读」转移给 dev,自查是对价不是客套)。派发词只带增量: - **三分区,措辞决定 dev 敢不敢证伪**:「裁决(不可重裁)」/「PM 机制假设(须实测,鼓励证伪)」/「PM - 建议的路线(可选,实测优先)」;凡「我觉得可以这样」的一律降到第三块 —— 机制假设穿着裁决的衣服,两个方向都是返工(细则见 runbook)。 + 建议的路线(可选,实测优先)」;凡「我觉得可以这样」的一律降到第三块 —— 机制假设穿着裁决 + 的衣服,两个方向都是返工(细则见 runbook)。 - **标准非协商条款 ⛔ 不抄进派发词,分层砍**:hook 已机械强制段(worktree-first / never-stash)与 os-dev.md 已载通用段(push 重试、语言、releases 禁令)砍掉;⛔ 不砍卡类特有约束(ADR 类 draft-only、tier 推导引用、棘轮实况、释义纪律)。无条件条款只住角色文件(冲突时它胜、 - 错了修那里, - ⛔ 不靠派发词临时覆盖)。**终报要求随派发词带一句**:只收机器可核字段(gates/line_budget/ - deviations/files_changed),⛔ 复述 PR body 叙事。**清单、路径、行号在派发那一刻从树上取**,⛔ - 不 - 从卡片/上次派发/记忆抄(`node scripts/pm/dispatch-gates.mjs`,取数的是 PM;点名单是线索不是规 - 格,dev 对实际改动重取补跑 —— 条款在 os-dev 定义,补遗见 runbook);行级断言转述前必须自 - 己重验。 + 错了修那里,⛔ 不靠派发词临时覆盖)。**终报要求随派发词带一句**:只收机器可核字段 + (gates/line_budget/deviations/files_changed),⛔ 复述 PR body 叙事。**清单、路径、行号在派发那 + 一刻从树上取**,⛔ 不从卡片/上次派发/记忆抄(`node scripts/pm/dispatch-gates.mjs`,取数的是 + PM;点名单是线索不是规格,dev 对实际改动重取补跑);行级断言转述前必须自己重验。 +- **派发令里关于代码的危害断言必须有读数**(点名 call site / 路径 / 迁移),与零命中同一 + register —— 「这会毁数据」「这会弄坏 X」是关于安全的缺席断言,同样要控制项。PM 座位 + 测不了 ⇒ 写成给 dev 的问题,⛔ 不写成栅栏:未测量的栅栏把 dev 挡在正确修法之外,拒绝它 + 要赔一次往返、且指望 dev 敢跟派发者争(实测:一句「会截断数据」的栅栏,那条路径上每 + 一列其实都是空的)。**人工地板栅栏**(挡在维护者该做的决定之外)关于流程不关于代 + 码,免测量。 +- **派发令必须要求 dev 留自己的认领评论**(其**本身**的 session ID + 分支,在 PM 那条**之外**) + —— 共享身份下 assignee 只说「有人认领了」,分得清「谁」的只有评论,而 PM 那条标识的 + 是 PM 会话、不是写代码的那个。「已认领、别动 assignee」⛔ 收窄到**恰好 assignee 这个字 + 段**:它读起来像「认领协议已满足」,那是另一句话且可能是假的(实测:被这么告知的卡当 + 时无 assignee、无认领评论、无分支)。 - **触 `skills/**`(对外发布的技能包)的卡,派发词必带 PM 定的净增行数预算**(按 feature 大小 定,小功能给小数);dev 装不下 ⇒ 停手回报,⛔ 不自行扩写、不自行抬预算(抬预算是维护者 裁决)。 @@ -681,48 +686,39 @@ dev**:先试 SendMessage 复活,不可用才走接手协议(四条增量见 runb ### 收集 -**报告通道统一:GitHub 是两种模式共用的真相源。** dev 终报同时落 issue 评论(首行 -``)与返回消息 —— 评论是记录,消息是加速器;收集先扫 GitHub,标记评论在 = -报告完整,两处皆无才进探活/判死。⛔ 永不把「没收到失败通知」读作「还在跑」、报告缺 -席读作成功,永不虚构未回报 agent 的结果。 +**报告通道统一:GitHub 是两种模式共用的真相源。** dev 终报先落 issue 评论、再作返回消息 +—— 评论是记录(会话中途死掉时它是唯一幸存副本),消息是加速器;收集先扫 GitHub,标记 +评论在 = 报告完整,两处皆无才进探活/判死。**标记两种拼写等效**:HTML 注释 +`` 与首行纯文本 `os-dev-report`;⛔ 仅凭 HTML 注释形式缺失永不读 +作「报告未达」—— 被 sanitizer 清洗的报告与从未送达的在证据上不可区分,误读即把一份 +完整终报送进探活/判死流程。⛔ 永不把「没收到失败通知」读作「还在跑」、报告缺席读 +作成功,永不虚构未回报 agent 的结果。 **探活是每轮巡检的固定动作 —— 完成通知不可靠,缺席什么都不证明。** ① 定时器重挂是 -每次巡检的** -第一动作**(先挂后查,链条对中断免疫);② 在飞期间主巡检间隔 ≤45 分钟,待命期 60–70,有在 -飞即收 -紧;③ 已派发未回报的 dev 逐个发状态询问(「回一段简报后继续干活」),派发后 ~45 分钟无远 -程产出即 -到探活门槛;**已有远程分支/PR 不豁免** —— 探的是「报告未达」不是「分支未出现」,远程 -产出证明工作 -发生过,不证明 agent 还在(常见死格恰在开出正确 PR 之后);④ 两种回包都有价值:活着 ⇒ 进 -度与阻 -塞点;「no active task; resumed from transcript」⇒ 生前已死,询问本身即复活;⑤ 判据永远取正向证 -据(分支、PR、报告、探活回包)。 +每次巡检的**第一动作**(先挂后查,链条对中断免疫);② 在飞期间主巡检间隔 ≤45 分钟,待命 +期 60–70;③ 已派发未回报的 dev 逐个发状态询问(「回一段简报后继续干活」),派发后 ~45 分 +钟无远程产出即到门槛,**已有远程分支/PR 不豁免** —— 远程产出证明工作发生过,不证明 +agent 还在(常见死格恰在开出正确 PR 之后);④ 两种回包都有价值:活着 ⇒ 进度与阻塞点;「no active +task; resumed from transcript」⇒ 生前已死,询问本身即复活;⑤ 判据永远取正向证据(分支、PR、 +报告、探活回包)。 **45 分钟是发探针的门槛,⛔ 不是判死的门槛**(探针代价是一次消息;判死代价是往可能活着 -的 worktree 塞第二个 agent)。判死的正当依据只有三类:探针回包表明已死、宿主明确回报 -stopped、超 -过**本车道实测基线**且连续静默 —— 基线 = 本车道实录「派发 → 推分支/开 PR」端到端耗 -时(三五单即可 -用,⛔ 非本文任何常数),基线之内的沉默不是证据。`mode:cloud` 的 ~2h 静默是**本轮收集边 -界**(记 `blocked` 移步下轮),也不是判死。 +的 worktree 塞第二个 agent)。判死只有三类正当依据:探针回包表明已死、宿主明确回报 +stopped、超过**本车道实测基线**且连续静默 —— 基线 = 本车道 +实录「派发 → 推分支/开 PR」端到端耗时(三五单即可用,⛔ 非本文任何常数)。`mode:cloud` +的 ~2h 静默是**本轮收集边界**(记 `blocked` 移步下轮),也不是判死。 **失报与停摆的处置(细则见 `references/dispatch-runbook.md`)。** 三条原则: - **停摆永不自愈**:携带任务中途状态的完成通知本身就是停摆信号,立刻 SendMessage 附前台执 - 行姿 - 态句,⛔ 不等任何静默阈值(阈值是给「没有回答」的);复位走梯度,每次比上一次更具体,第 - 三次停摆 - 判 unreliable 按接手协议重派。这里是消费侧兜底,⛔ 不能写 - 成「派发词写全了就可以不探」。 -- **通知重放先算身份再读内容**:与已验收那份同身份(三元组定义见 runbook)⇒ 记 - 「重放」即结束,⛔ 不重新验收不重复 ACCEPT;⛔ 到达不读作「还活着」,不到达也不读 - 作「已死」。 + 行姿态句,⛔ 不等任何静默阈值(阈值是给「没有回答」的);复位走梯度,每次比上一次更具 + 体,第三次停摆判 unreliable 按接手协议重派。⛔ 不能写成「派发词写全了就可以不探」。 +- **通知重放先算身份再读内容**:与已验收那份同身份(三元组定义见 runbook)⇒ 记「重放」即 + 结束,⛔ 不重新验收不重复 ACCEPT;到达不读作「还活着」,不到达也不读作「已死」。 - **直接验收兜底(报告丢失 ≠ 验收停摆)**:(a) draft PR 在且 CI 全绿 + (b) 探活确认已死或 ≥2h 无 推送 + (c) 报告未达 ⇒ 直接按 PR 验收(复核判据不减,细则见 runbook);先探活后翻 ready;舰队 - 级 - 死因(全账号断粮)下取 (a)+(c) 照常收口,PR body 就是报告。 + 级死因(全账号断粮)下取 (a)+(c) 照常收口,PR body 就是报告。 ### 复核 @@ -831,12 +827,10 @@ main 红了约一小时,逐 PR 连环红到 fix-forward 才止)。本段只适 在内;老化 = 首触欠账);**发版阻塞**(release blockers;三仓 `target:`之和,归零 = 三张板都 空)。 -**波次收工点(维护者 2026-08-09 裁定)。** ① 收工点 = 会话内在飞归零(⛔ 不在复核中途压 -缩;云卡不挡 —— 热移交见座位贴协议 -细则);② 收工存档 = 上下文里的判断 flush 到 GitHub(不过夜义务),随后**立即派下一波**, -⛔ 不等人闸。`/compact` 仍由维护者在终端会话择机执行 —— 收工点上的优化项,永远不是派 -发前提; -①② 令任何压缩(手动或自动)无损,前提是 GitHub 恒为唯一权威 —— 失守时压缩即丢判断。 +**波次收工点(维护者 2026-08-09 裁定)。** ① 收工点 = 会话内在飞归零(⛔ 不在复核中途压缩; +云卡不挡 —— 热移交见座位贴协议细则);② 收工存档 = 上下文里的判断 flush 到 GitHub(不过 +夜义务),随后**立即派下一波**,⛔ 不等人闸。`/compact` 由维护者在终端会话择机执行,永远不 +是派发前提;①② 令任何压缩无损,前提是 GitHub 恒为唯一权威 —— 失守时压缩即丢判断。 ### 停止条件与待命