diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index f96c432fffc..3dafed8540b 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -39,9 +39,8 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 ## 优先级 -- 优先序:维护者裁决 > 北极星 > `AGENTS.md` > 红线 > 核心条款 > 细则 > 座位判断。 -- 核心条款住 `references/core-rules.md`,是本文的子集;细则是本文其余各节与其它 references。 -- 一条规则在本文与核心条款一处改动,另一处同 PR 同改。 +- 优先序:维护者裁决 > 北极星 > `AGENTS.md` > 红线 > 细则 > 座位判断。 +- 细则住本文其余各节与 `references/**`,按阶段读;阶段文件与各自读者见〈阶段细则索引〉。 - 红线与各节的禁止行都在四轴权衡之外,⛔ 不因更合理的理由被推翻。 - 两条细则冲突 ⇒ 按更严的一条行动并立卡;⛔ 不当场改文本了结。 @@ -53,7 +52,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 |---|---|---| | `triage` | 以分诊座位身份运行(只扫/分类/路由,永不认领) | — | | ``(如 `spec`、`skills`) | 以该 `domain:*` 车道的执行座位身份运行 | — | -| `epic:#` | 以父单 #n 的 epic PM 身份运行(见 Epic 子树车道 节) | — | +| `epic:#` | 以父单 #n 的 epic PM 身份运行(见 `references/seat-lifecycle.md` 〈Epic 子树车道〉) | — | | `director` | 以项目总监席身份运行(人工召唤;三职见 升级与决策 节与 `references/lanes/director.md`) | — | | `label:` | backlog 过滤标签;`label:all` = 全部 open 未认领 | `pm:queue` | | `repo:` | 扫哪个仓的 backlog(单 issue 的落地仓看它自己的 `repo:*` 标签) | `objectstack-ai/objectstack` | @@ -74,22 +73,18 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 队列空 + 无在飞 + 无待复核 + 决策箱无新答复 ⇒ 自退。 - 分诊席跑普通直连会话、默认判断档;裁决不在本席,归维护者召唤的总监席。 - 子代理裁决逐份过转录核验采信。 -- 开轮互斥:fire 开始、首个写动作之前读四个读数,未收班活动任一未满一轮 ⇒ 自退。 -- 读数一、二:最近的收班简报,与晚于它的最新开轮标记。 -- 开轮标记是轮中会话在座位贴上的唯一痕迹;标记可漏写,认领不可省。 -- 读数三:本车道 `pm:dispatched` ∪ `pm:queue` 卡最新非本 session 同席号的 `Claim:` 评论。 -- 或收班简报后卡分支有推送(逐卡 `git ls-remote`):推即认领,欠一条 `Claim:`。 -- 读数四:本车道 `state=CLOSED` 按 `updated_at` 降序首张带同席号 `Claim:` 卡的 session ID。 -- 评审链与总监席的笔迹是跨席作业不算占席;读数三、四只增加自退、永不清座位。 -- 总监席多场并行、无在任者:读数一、二与自退对它不成立;`domain:*` 席互斥照旧。 -- 同 session 的 subagent dev 认领不触发自退,甄别靠分支。 -- 收班简报是前任不再写的显式声明,是释放标记不是锁:简报即最新事件 ⇒ 立即坐席。 -- 滞后标题是进场顺手修的半状态,⛔ 不是阻塞;简报点名的留守尾巴作围栏。 -- 维护者明示召唤是仲裁:有简报径直坐席;无简报才走保守确认,确认终止即坐席。 -- 互斥清 ⇒ fetch 后三章程(本文、core-rules、本席章程)最新触碰 sha 走 `git-history.mjs touch`。 -- 异于上一开轮标记即先重读;留开轮标记(session ID + fire 时刻 + 该触碰,注明重读)再跑轮。 -- 同读 harness 载入面 `.claude/**` 的最新触碰与内容是否已在共享检出 HEAD。 -- 否 ⇒ 记座位贴,自然收班时换会话,⛔ 不中断批次;读数走 `scripts/pm/check-harness-current.mjs`。 +- 开轮互斥的四读数、开轮标记与章程触碰核对见 `references/seat-lifecycle.md` 〈开轮互斥〉。 + +## 阶段细则索引 + +| 文件 | 谁在哪个 fire 读 | 承载的章节 | +|:--|:--|:--| +| `references/seat-lifecycle.md` | 每个座位每次 fire:开轮互斥读数前、收班前 | 开轮互斥 · 座位贴协议 · Epic 子树车道 · 轮次报告与节奏 · 停止条件与待命 · 断粮与跨墙恢复 | +| `references/reading-discipline.md` | 任一座位取读数、引读数或核验 main 的那一刻 | 平台读数纪律 | +| `references/cross-repo-coordination.md` | 分诊席路由与查重前;执行席跨仓认领、派发或转移时 | 多仓协调 | +| `references/triage-duties.md` | 分诊席每次 fire 开局 | 分诊座位职责 | +| `references/execution-duties.md` | 执行席每次 fire | 候选与批次 · 认领 · 派发 · 收集 · 复核 | +| `references/landing-operations.md` | 执行席落地窗口(ACCEPT 之后至 MERGED) | 入队与落地 · A–D 操作细则 | ## 全体座位的不变量 @@ -156,92 +151,6 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - PM 写进 GitHub 的文本 ⛔ 不用尖括号路径占位符,改写成后跟显式路径的说法。 - 携带易损片段的评论(派发令与裁决)post 后读回;写侧形状见 `references/platform-readings.md`。 -## 平台读数纪律 - -- 判据取命令输出,⛔ 不取 API 字段字面值、不取本地工作树、不取看着相邻的日志。 -- GitHub API 与工具行为的实测事实表在 `references/platform-readings.md`,做对应操作的那一刻查阅。 -- 核验 main 用 `origin/main`:先 fetch,再 `git grep PAT origin/main -- PATHS` 或 `git show origin/main:PATH`。 -- ⛔ 不用共享检出的工作树核验 main,它的 HEAD 由别的 agent 摆布。 -- 零命中须配同主体必中词,否则该零作废;同主体 = 同语料/路径形/包界/引法/失效形态。 -- 同仪器的控制词双零是仪器坏,⛔ 不读作缺席:换法重画再报;哑火仪器与干净结果同值。 -- 控制通过 ≠ 问题问对:零命中须写仪器可达半径与一个必在半径外的已知目标。 -- 半径按形态写(内容/文件名/声明/字段);所求在半径外 ⇒ 零非读数,换看得见它的仪器。 -- 零的三件判据、目录约定、精确名与枚举配额见 `references/filing-gate.md` 的〈读数判据〉。 -- 正命中须答谁打印/执行它,否则不证缺陷仍活;注释/文档块/夹具/修复的回归 pin 不算。 -- 他人据以行动的读数须带单位并答什么本来会让它不是这个值;递 dev 的恒标线索非答案。 -- ⛔ 自用即弃的探针不欠此税;「不是这个值」的答案取逐字工件或具名反例。 -- 仓不可达 ⛔ 不当查过了干净:在 issue 上贴出给对应座位的现成命令,等读数回贴再派。 -- 读数与认领等座位文本恒带 UTC 取数时刻 `YYYY-MM-DDThh:mmZ`;树读数另带 ref/tip,无者按未取。 -- 失效修法按序取:先删容许出错的构造,再让正确形态成唯一拼写,最后才加检查。 -- 门禁两次误报(假红、实测假绿、处方句点名不存在路径)⇒ 删肢或删门禁,PR 引两次测量。 -- 只有护产品落地或用户可见契约的门禁才立修复卡;门禁上「稳定 > 功能」= 更少零件。 -- 自设定时器的文本以先重读状态开头,只写关键判据(若 X 则 Y),其余指针化。 -- 定时器文本 ⛔ 不写结论、不含未经重读即可执行的祈使句。 -- 放行认门禁 job 的结论(`completed: success`),⛔ 不认聚合读数。 -- advisory 门禁红着进 main 是共享损伤,任何车道发现都立即止血并立单,见 landing-operations B。 -- 仪器纪律(硬门禁面、只报告面、新增授权、工具位)见 `references/instrument-discipline.md`。 -- dev 自己死了不等于维护者中止:子代理消失是正常死法,走接管(见认领节)。 -- 维护者中止只认原话或宿主回报 stopped by the user,⛔ 不据推断立无重启条件的门。 -- 共享基础设施修复入队前按症状复查 main,不按 issue 号。 -- 立卡者自跑查重并写下查询与命中数(含 closed);判重仍归分诊,比数值与作用域定关哪个。 -- sweep 晋级与立卡的前提要对此刻的 main;dev 带证据的零实现停手是好产出,不当返工计。 -- 裁决明令的动作实施中测出对向事实 ⇒ 照字面执行,被打断行为的 pin 反转为拒绝 pin。 -- 对向事实下 ⛔ 同 PR 不做任何 promote/回退;pin 是反转不是删除。 -- 冲突立成 `needs-user-decision` 卡,该 PR 不挂 auto-merge 留异议窗口。 -- 读序 git、payload、REST、MCP;REST 可达性逐会话探一次;通道对照见 `references/rest-channel.md`。 -- 派发前读一次 `rate_limit`,余量装不下整批就减批,⛔ 不靠撞墙发现。 -- 写少而大:同卡同轮结论合成一条评论,⛔ 不放慢单笔、不攒着一次性发;写量按身份计。 - -## 多仓协调 - -- 产品依赖方向固定:`objectstack`(后端,`packages/spec` 是唯一契约)→ `objectui`(前端)与 `cloud`。 -- objectui 构建产物经 `pnpm objectui:refresh` 回流。 -- 多车道仓 `objectstack`、`objectui`:中央分诊是 `domain:*`/type/定级的唯一生产者。 -- 单车道仓 `cloud`、`objectos`、`hotcrm`、`www.objectos.ai`;未来新仓默认此类。 -- 单车道仓 `repo:*` 席自理机械三务,⛔ 不产 `domain:*`;决策卡入本仓收件箱,不落 objectstack。 -- 机械三务 = 自扫 sweep、自打 `type`、自做 `finding` 首触定级。 -- 新仓登记是一张清单:座位贴、标签、类别归属、门禁盘点、写身份锁移植(deny + hooks)。 -- 新仓准入判据一句:这个仓真的需要常设席位吗。 -- hotcrm 收卡判据与宪章见 `references/lanes/hotcrm.md`。 -- objectui 卡按修复落点分流三流,`domain:ui` 是唯一新增标签。 -- `domain:devx`(工程面)与 `domain:spec`(契约面)跨仓归各自车道。 -- 其余(发布库与 apps)归 `domain:ui` 执行席;症状位置不改流向,docs 随所记录的面走。 -- 车道可分席(席号 `· seat N`,或域×仓):忙时一车道开多席,闲时收归一席;每席独立座位贴。 -- 认领评论带 `Seat: domain:X#N` 行申报席号(缺省席 1);同席认领互斥,他席认领不触发自退。 -- 拆分触发预登记:单轮逼近 fire 周期,或某仓在全序下持续断粮 ⇒ 按仓拆回多席。 -- seam 卡单一归属:归修复落地仓的席,双仓皆动 objectstack 侧主导。 -- `scripts/pm/**` 等住 objectstack 的全板工具链单写手恒为 objectstack 侧席,他侧上游立卡回链。 -- 工装只答被告知的仓,缺 `--repo`/`PM_SWEEP_REPO` 即答 objectstack;⛔ 不答手上那张卡的仓。 -- 规则 1:issue 住在修复落地的仓,分诊时按判据严格执行。 -- 判据:正文抽掉 objectstack 还成立 ⇒ 当场转仓(console/UI 缺陷即转 objectui);不成立才是缝卡。 -- transfer 不可用时重建:出处头 + 裸 `#N` 改全名 + 关源单为 moved。 -- 缝卡收窄为真协调卡:留 objectstack 带 `repo:*`,正文点名读者(哪个座位、哪一步)。 -- 决策收件箱按仓:平台在 objectstack / objectui,元数据项目在本仓;在飞卡 ⛔ 不中途转仓。 -- 规则 2:跨层功能点或 objectui 消费的 `Seam:` 卡恒由分诊立父单 + 逐层子单,spec/后端先行。 -- 下游带 `Blocked-by: #`;`Blocked-by` 未关闭/未合并的不派发,对 GitHub 现验。 -- 被链接或同父的两单永不同批。 -- pin 滞后是盲区:本仓 pin 是否已覆盖该 commit 是第二读数,派发前用 REST `compare` 核祖先。 -- 本地 `merge-base` 在浅检出上给假非祖先;未覆盖 ⇒ 派发令要求 PR 正文留档分叉窗口。 -- ⛔ pin bump 不做 rider:走专用 bump 脚本连带 override 与 lockfile。 -- 规则 3:联动杂事立单,不靠记忆。 -- 已验收 PR 的产物流向另一仓,接受该 PR 的执行席立即在消费仓立后续单,带 `Blocked-by:`。 -- 规则 4:纵向拆分,一个分诊 PM + N 个执行 PM;一人恰一车道,一车道可坐多席。 -- 分诊座位唯一生产:定级/路由/type/查重/shadow/`duplicate_of`;执行席永不定级或路由裸卡。 -- 执行座位信任标签,只在本车道认领;误标 ⛔ 不自行改,挂 `pm:retriage` + 异议评论同笔。 -- 突发积压调频率或 `batch`,持续积压按仓拆席走 PR;⛔ 不跨车道借调。 -- 维护者直派通道:当面指挥的 PM 会话直接路由,只对明示指挥的卡成立。 -- 直派的审计评论逐字引用授权指令。 -- 多车道仓分诊空缺时,会话型执行 PM 可代扫:只做分诊动作,不跨车道认领,贴上注明。 -- 代扫在分诊座位有主时立即停止。 -- 规则 5:一块板不设第二跟踪器:pm 标签就是状态机,org Project 只是维护者的聚合视图。 -- 认领即跟到 MERGED:派发后发现的跨车道面(含 spec)不移卡,认领席借契约复审档隔离复核。 -- 复核记录带 `Implemented-by:`/`Reviewed-by:`;`pm:retriage` 改路由只对未派发卡。 -- 转移落对方队列:目标仓立单带 `pm:queue`、出处行与一行可执行判据,依赖用 `Blocked-by:`。 -- 跨座位请求骑在它所关的既有卡上:请求席在自卡写 `Blocked-by:`,并在目标卡留一条评论。 -- 该评论点名席位与步骤;无既有卡承载且请求自身即立卡门 ①②④ 时才立新卡。 -- 等待方同一笔把自卡翻 `pm:blocked` + `Blocked-by:` 指向请求卡;⛔ 不设新标签新 sweep。 -- 目标仓不可达是读数缺口,不是落点:由可达席在目标仓立卡,此前请求记座位贴或协调卡。 - ## 域车道 - 锚定规则:每个包恰属一个域;`domain:*` = 修复落地包的域;`Seam:` 卡归 spec 席,默认纵向派发。 @@ -269,347 +178,8 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 合并队列是共享串行资源:车道买到的是并行编写,不是并行落地。 - 谁发现 flake 谁修或立单,⛔ 不绕行。 -## 座位贴协议 - -- 贴 = 座位(标签 `pm:seat`),正文固定四段现值:当前 PM / 继承台账 / 热文件串行队 / 说明。 -- 正文只由在任座位 PM 编辑且为权威;标题与 assignee 是派生视图,三者同笔更新。 -- 标题只放慢状态,快状态留在说明段。 -- 维护者强制接管令取席位、队列、未起工卡与待落地 PR;⛔ 不取在飞卡,由原认领者跟完。 -- 子代理 dev 的返回消息、探活与续派只在派发会话;落地或 `Release:` 后归新席位。 -- 范围与常设承诺是岗位说明不是状态,版本化在 `references/lanes/.md`。 -- 贴内只放指向车道文件的指针,升级走技能 PR,⛔ 不手抄接力。 -- 写侧刷新点 = 轮次边界;中途状态由卡上 claim/ACCEPT 评论承载。 -- 读侧只读贴正文 + 晚于正文最后编辑的评论;刷新前读完评论、回执未读敲门,再刷。 -- 热文件串行队是正文具名段:区域写不清就只能整文件串行。 -- 座位贴每仓登记合并是否对外发布及其验证层;登记缺失视为未验证。 -- 无心跳,活性惰性判定:超过一天无自有产出即可降级回收。 -- ⛔ 永不从贴的 `updated_at` 或标题推死活;活性只认在任者自己的产出。 -- 竞态三招:动手前重 fetch 正文、审计评论时间戳先到先得、写后回读。 -- 收班 = 状态 flush + 在飞显式安置,不是在飞归零;收班简报是最终一笔。 -- 离任留守只写简报点名的项,⛔ 不读队列、不新派发、不碰未点名卡。 -- 换班报告默认零建议,只收三类:原则错/缺、可机械化项、平台事实变化。 -- 原则错/缺 → skills 席专题;可机械化项 → 门禁/脚本卡,⛔ 不是散文。 -- 平台事实变化 → references 事实表改一行。 -- 三类以 `finding` 入 skills 车道由该席分诊;三类之外默认关 not planned。 -- 接管/移交 = 改正文 + 审计评论(只作审计);收尾清单等细则见 `references/seat-post-protocol.md`。 -- epic 委托不入座位贴体系;新 `packages/spec` 工作恒归 spec 座位。 - -## Epic 子树车道 - -- 大开发与跨层功能点(spec/运行时/前端)整体委托一个专职 PM 会话:`/pm-dispatch epic:#`。 -- 委托信号成对落地:父单打 `pm:epic` + 正文写会话 ID 与声明的文件领地。 -- epic 立卡挂父单、打 `pm:epic`,⛔ 永不 `pm:queue`;`label:pm:epic` 即父子保留全集,域座位不取。 -- 队列 = 子树 open 未认领 sub-issue,每轮重读不缓存;其它 PM 候选获取跳过整棵子树。 -- 域座位批次选择读一次 `label:pm:epic` 索引,避开领地相交;epic PM 不兼任 `domain:*` 座位。 -- 认领纪律全套照做:先写标签、再 `Claim:`、再全线程重读;认领后 `pm:epic` 留在卡上。 -- 离开子树(交车道或转 spec 座位)同一笔标签写摘 `pm:epic` 加 `pm:queue`。 -- `pm:epic` + `pm:queue` 同卡 = 半状态(保留兼移交);后者即已移交,取回走全套认领协议含重读。 -- 单车道仓(无 `domain:*`)开卡即认领合法;多车道仓域标签前置照旧,子树标记即保留。 -- 新立 spec/公共契约 sub-issue 照旧转 spec 座位队列,epic 侧写 `Blocked-by:`;衍生按三分留席。 -- 顺带发现只经立卡门:三类内缺陷才立,带查询与命中数;其余进 Acceptance notes 或座位贴。 -- 每次分流留一行审计评论;父单维护 checklist 汇总评论,决策仍锚在具体 sub-issue。 -- 收尾四步、僵尸回收与领地防撞细则见 `references/seat-post-protocol.md`。 - -## 分诊座位职责 - -- 发版板(无板仓跳过)、查重/shadow 检查与代裁通道全仓照跑。 -- fire 开局只按名加载互斥检查所需工具,`ToolSearch` 用 `select:`;判定本轮有活才加载其余。 -- ⛔ 分诊 fresh session 开局不做泛关键词 ToolSearch;可验判据:空转轮 ~4 万 token 以内。 -- 工具加载纪律只约束分诊 fresh session 的开局;执行座位与 dev 不受约束。 -- 两级盘点:小时轮以 `since` 窗口读增量,锚 = 座位贴上一份收班简报的时间戳。 -- 查重缓存住席内:新会话全量拉,其后 `since` 增量;⛔ 不建分支、不共享、不依赖备份。 -- 每日一 fire 跑全仓全量对账并归集日频职责;选层按 fire 时刻 ⛔ 不用计数器,简报写明层。 -- 从不更新的卡不入窗;老化欠账归半状态巡查不归小时轮。 -- 每条枚举比对返回数与 `totalCount`,不等 ⇒ 报 `sweep INCOMPLETE` 点名缺口,⛔ 永不报干净。 -- Backlog sweep 是常设职责,每 fire 扫任一析取命中的卡。 -- 析取 ①:全裸(无 `pm:*`、无 `needs-user-decision`、无 `domain:*`)。 -- 析取 ②:有 `pm:queue` 无 `domain:*`(仅多车道仓);析取 ③:有 `domain:*` 无 pm-state。 -- 析取 ④:有 `pm:queue` 与 `domain:*` 而无 `priority:*`;②③④ 只取 `updated_at` 早于 ~2 分钟。 -- 排除 `tracking`、`status:parked`、全部 `pm:seat` 贴、`qa-run` 记录。 -- 半状态治愈积压 ②③④ 最老优先、P0 嫌疑先行,⛔ 优先最新不适用。 -- 首触定级与三析取 sweep 每 fire 跑到清空:⛔ 无每轮总量预算,清得动就多清。 -- 窗口耗尽未跑完的,下一 fire 从标签状态断点续跑。 -- 排序:队列每轮清空时最新优先;清不空的那一刻起改最老优先。 -- 裸卡数 >15 ⇒ 下一 fire 整轮改域分批集中模式,每批 ≤5 张同族卡,照样跑到清空。 -- 紧急卡直接分诊:维护者点名或 p0 嫌疑 ⇒ 立即起默认判断档分诊子代理,不等定时轮。 -- 紧急分诊的授权面 = 分诊本身,⛔ 不写码不认领;产出落卡,与定时轮分诊同格式同效力。 -- 跨仓 pin 链的窗口级兜底也在 sweep,⛔ 只立单不执行 bump。 -- objectui pin 落后且其队列已空 ⇒ 在本仓立/刷新 console bump 单。 -- 见新 tag 族发布 ⇒ 在 cloud 立 `.objectstack-sha` bump 单。 -- bump 单单张封顶:先查同题 open 单,已有就追评刷新;工具链新形态只提请不扩面。 -- 分类动作每张三选一,外加一个修复通道。 -- 裁定写方向、给六态之一。 -- 方向在 ADR/本卡裁决/不可重裁规则:贴 `check-prior-rulings.mjs` 的 `Prior rulings read:` 行,或不点。 -- `pm:queue` = 有具名落点或复现的具体缺陷,无可问之事;⛔ 工具/门禁修复不由此进。 -- `tooling` 入 `pm:queue` 仅当首行带 `Unblocks: #N`(open 产品卡)或点名所护的已发布面。 -- `pm:queue` 也收恢复不变量的 finding、test-only pin,与实现未被裁错的说明书脱节(修文档)。 -- `needs-user-decision` = 设计卡、feature/契约形状提案、需要 appetite 的多周程序。 -- 碰迁移形状或删已发布能力也进决策箱;说明书脱节不进:有裁定出处才是 (b),否则改文档。 -- 决策卡落卡必带四棱卡面块与其上的「维护者速读」,⛔ 不留待有人接手再补。 -- 决策卡的速读同题,用业务语言先讲事情与选项,末句只问一字:A/B/C 或是否。 -- 立卡门四类:① 缺陷 / ② 维护者决定 / ③ 直派任务 / ④ 协调节点,⛔ 其余一律不立卡。 -- 首行写立卡门类别 ①–④;四类定义、⛔ 清单、三答与配额见 `references/filing-gate.md`。 -- `finding` = 三类内待定级:(a) 可复现缺陷(复现或失败探针);(b) 违背已声明契约(引契约文); -- (c) AI 写元数据会被运行时拒收或静默丢弃的陷阱;其余进 PR `## Acceptance notes`,⛔ 不立卡。 -- (a) 的分界是不完整 vs 错误,不是文档 vs 代码:示例照抄即失败是 (a),漏列成员不是。 -- 门禁头注、self-test 文案与 `check-*` 处方句 ⛔ 非已声明契约;(b) 须用户或已发布包读得到。 -- (c) 元数据 = 由写它的人以外的人存储并再作者化的键:React prop 不是,存储的视图配置是。 -- 把作者引向运行时会兑现却让事情更糟的元数据的警告不在 (c) 内;记为边界,⛔ 不扩类。 -- (a) 须今天可达,(c) 须具名生产者;观察、休眠、零拉动 ⛔ 不立卡、不进汇总卡、无配额。 -- 只报告的仪器,报错不配 dev:猜意图的只印读数,误报席位一句推翻,⛔ 不立卡不派 dev。 -- Acceptance notes 前先答「哪个 PR 或人会碰到它」;答不出 ⇒ 仍然关,理由写「承接者:无」。 -- 先修复:正文被 sanitizer 截断的卡不可派发,评论修复指令后跳过。 -- 停摆指令判据必须比其它分类更硬(双读取),事后证伪同处公开作废。 -- 决策箱勤务:入箱校验/补全四棱块、速读与 `Prior rulings on this card:` 行;存量卡低频回填。 -- 入决策箱那一笔连「前提今天还成立吗」一起现读;改状态只需现读卡。 -- 线程有 `Ruling:`/RULED 的卡再入箱,该行逐 id 各一句变化;缺行 ⇒ 拒入,`pm:retriage` 回立卡者。 -- `type`(Bug/Feature/Task)是分诊固定产出,分诊席唯一权威生产;立单者可预填,分诊校正。 -- 判据:违背已声明契约 ⇒ `Bug`,扩大接受集/公开面越出已声明 ⇒ `Feature`,其余 ⇒ `Task`。 -- `Bug` 无具名落点或复现路径不入 `pm:queue`(标记补复现)。 -- ⛔ 不回填存量 backlog 的 type;新卡即时打、存量卡下次碰到补。 -- 定级按北极星「优先级」1–3 条;首行 `Path: <定义项> | <清单项 id/缺项> | P<路步> | none`。 -- 定义项取北极星「做出来的是什么」或仪器卡的车队决定;无则关;`none` 非分诊缺口。 -- 清单项三态定级(会 fail / 步骤够不到 / 无项断言)与定级判据见 `references/filing-gate.md`。 -- 「无则关」= 首触即关 not_planned,带理由与入队两条件,⛔ 不定 p3、不 hold;下行同此。 -- 产品仓 P0/P1 开着时,无解锁对象的 p2/p3 `tooling` 卡同样关。 -- 路由是分诊的技术判断,⛔ 永不升级哪个仓的问题;父单是协调节点,永不派发。 -- 父单已有子结构的:父单队列标签即可,分诊逐个展开路由、补 `Blocked-by:` 排序。 -- 跨层功能点(≥2 层)立父单带 `area:*`+`pm:epic`+清单项级,逐层子单按 `Blocked-by:` 排。 -- 每张留一条英文审计评论(`Triage: lands in …; rationale: …`),可选带 `Size/model suggestion:` 行。 -- 查重/shadow 检查先按文件/机制查本仓与姊妹仓 open 卡(含 `pm:dispatched`),再跟引用与关键词。 -- 同文件同机制 = 同一发现,不分车道,首触定级即并:证据搬先卡,后卡关 `duplicate_of`。 -- 同族异缺陷 ⛔ 不并:互链排同批;在飞(assignee/open PR)永不并,`Blocked-by:` 不派;完工查过期。 -- 执行席 ⛔ 不并卡,疑重复挂 `pm:retriage` 写明哪两张同文件同机制;同 assignee 者自关后卡。 -- 生产者在哪是常设分诊问题:declared ≠ enforced 形状的卡先问谁在写这个字段。 -- 派发前按生产者的答案改卡的范围与域标签。 -- 发现分诊轮:`finding` 恒 = 待首次定级、定级即离标;hold 重验只在 `Restart-when:` 命中时发生。 -- closed 形态随每轮解锁扫描;可执行判据由分诊席每日一个低频子轮批量执行。 -- `Restart-when:` 命中同 closed 命中待遇:回队前 ref 重验再回队。 -- ⛔ 不设逐卡豁免评论;每 fire 定完全部未定级 finding,优先于旧卡重验。 -- 三类外不可逆或有硬时限(发版即固化、只被消费的文件、过窗不可补)⇒ 不关,报维护者。 -- 三类外首触关闭只清门前存量,关 not planned(不等批准可否决重开);三类内无证据拒收。 -- 三类内再过时前提检查,三选一:晋级 / 关闭 not planned / hold;判级只在此轮,不在立单时。 -- ⛔ 写入前对每张卡现读当前状态;任何列表快照读数一律作废。 -- ⛔ 带 `pm:dispatched` / assignee / 任何 open 或 merged PR 引用的卡,一律不动。 -- 标签/assignee 写恒经 `scripts/pm/label-write.mjs`(四步、回读);⛔ 永不 MCP `issue_write`(锁 1 已拒)。 -- 车道席可附证据/前提重验,⛔ 不定级不改标;skills 车道 finding 由该席自分诊,全仓轮跳过。 -- 域分批与 sweep 打包晋级五条照用;每批约定与积压告警见 `references/dispatch-runbook.md`。 -- `pm:retriage` 每 fire 先答异议评论所求,答后同笔摘标;须维护者答的进收件箱,标照摘。 -- retriage 维持或改判皆由分诊席同笔摘标;挂标归异议席。 -- retriage 的异议判据认内容(有评论写明所求)⛔ 不认形状(有一条异议评论)。 -- 发版板 `target:`:判据二元,⛔ 不做优先级渐变:不修它,当前 RC 能不能发。 -- 判阻塞四类:① 用户今天就撞的已发布面缺陷;② 公开契约 declared≠enforced。 -- ③ 存量数据/迁移形状(发布后修不回);④ 发布说明里要为它道歉的。 -- 拆分/分票时 `target:*` 随工作走,对每一半重跑二元判据,默认继承,不继承按四类写明理由。 -- 每张板恰好一个生产者;鲜度节奏、清板三选一、pin 前置见 `references/seat-post-protocol.md`。 -- 代裁人工地板(恒交维护者):功能新增;ADR;协议/公开契约变化;破坏性或难回滚动作。 -- 人工地板同含:安全/权限边界;门禁削弱(降阈/删必查/抬上限/跳测);新增运行时第三方依赖; -- 花费/配额/舰队形态/默认模型档位;新增必需门禁/hook/棘轮(卡具名所守契约与预期捕获)。 -- 唯一例外:`platform-readings.md` 增量抬上限到落地行数,免决策卡,记 `ruledRaises` 引常设裁决。 -- 条件:席位验收评论逐条核实、去重计数(候选/落地/已有/拒收)、一事一行、不计重排。 -- 代裁车道只覆盖代码整理(行为不变的重构)与 bug 修复。 -- 机械边界测试:改动扩大接受集或公开面 ⇒ 人工;拉回已声明契约 ⇒ 代裁车道。 -- 置信门四条全立才可代裁:① 四棱同向;② 不在人工地板;③ 不推翻既有维护者裁决。 -- ④ 执行是否决窗口不是许可门。 -- 代裁动作:裁定 → 一次标签写入换 `needs-user-decision` 为工作态。 -- 随后卡上贴四棱块 + 结论 + `auto-adjudicated` 标记,轮次报告设代裁清单专节。 -- 一类自裁门:召唤中总监席可免呈自裁一张决策卡,当且仅当三判据全立。 -- ① 既有裁定/在案类规则/成文纪律机械决定方向,裁决评论点名所用权威。 -- ② 失败方向响亮(拒绝/诊断/红门禁)且一次 revert 可回。 -- ③ 四类地板零移动:安全/权限边界、已发布契约语义、产品能力取舍、门禁强度; -- 门禁普查标 retire 的退役除外,总监/技能席引该行裁;触地板即呈报,地板是排除项非权重。 -- 一类自裁逐卡记录:裁决评论引本通道与 ①的权威,录裁 + 转 `pm:queue`,⛔ 裁不派。 -- 每场召唤收尾呈摘要表(卡、权威、方向)供维护者追认;被推翻的行按新裁决执行。 -- 二类(带一个可报点)与三类(地板)照旧现场呈报,走常设决裁批流程。 -- 回翻条款:代裁卡实施中发现契约终究要动 ⇒ dev 停手,卡回决策箱,⛔ 永不静默重裁。 -- 请示纪律:方向性授权覆盖整条执行链一并做完,⛔ 不逐项回问。 -- 需裁事项攒批(≤5 项/批,每项一行带推荐),一句同意即全链执行。 -- 中间状态与限流/重试类运维细节只进座位贴和触发器,⛔ 不弹给维护者。 -- 汇报只在里程碑、真阻塞、被问到时。 -- 可逆且有推荐默认的事项按否决窗口:声明即执行,异议再回滚。 -- 人工地板项(发版、天花板、契约扩大)仍需明确字句,但攒批不逐项弹。 - -## 执行座位职责 - -- 半状态巡查按需跑(分诊席每日对账可调),H 行是读数不是前提;⛔ 不因锚行停派发。 - -### 候选与批次 - -- 整车道一次读全,本地求交:`list_issues` 带 `labels: [domain:X]` + 最小字段拿回全车道 open 集。 -- 候选 = open、未 assign、无 `needs-user-decision`、无 `pm:retriage`;⛔ 排除两行皆无的 `tooling` 卡。 -- 已排队父单的 open sub-issue 自动是候选,`pm:epic` 父单的子树除外。 -- 每张候选读全文 + 全部评论,写派发词前做决策复读:评论读到最后一页。 -- 维护者裁决逐字引入派发词裁决分区作约束,无则写明无裁决。 -- 派发前做前提过时检查,裁决同罪,三面都查:动作面、卡引用面、工作项面。 -- 动作面:`git log --oneline -20 -- `。 -- 裁决实施卡的动作面再核被点名的动作在 `origin/main` 上还没被做掉。 -- 卡引用面:裁决/卡片点名的每张 issue 逐个读当前 open/closed/assignee。 -- 引用读到的现状,⛔ 不引用裁决写作时的描述。 -- 工作项面:卡片与分诊评论列的每条工作项逐条对树核验是否仍未完成,⛔ 不对卡核验。 -- 每条工作项写进派发令时都是 dev 首先证伪的前提。 -- 并行度以 `batch` 封顶,等待不填槽;同批独立按文件面不相交判,⛔ 不按包、不按 check 名。 -- 舰队至多一张 `tooling` 卡带 `pm:dispatched`,第二张等;带 `Unblocks:` 者继承产品级不计数。 -- single-writer 路径 = `SINGLE_CLAIM_PATHS` 所枚举;共享其它路径是普通并发,后落地方解冲突。 -- 第 N 单派发前读 `scripts/pm/os-verify-lock.sh --status`:到达深度 ≥ `LOCK_DEPTH_HOLD`(= 2)即等。 -- 到达深度 = `queue N:` 行数 + 1(待派 dev 的运行算作到达);`state:` holder 与 `parked` 行不计。 -- 有效上限是锁宽的函数,⛔ 不是第二个 `batch`;`priority:p0` 可超 `batch`,⛔ 不越过深度等待。 -- 同区域单跨轮硬串行;延后不是搁置,被延后那一刻就把已知的坑记到该 issue 上。 -- 家族派发是范围澄清不是豁免:一个 dev 有意覆盖 N 张同区域已裁卡,可折叠为一次派发。 -- 折叠准入五门全过才可折:① 同缺陷形态同修法(⛔ 不是同关键词/同子系统)。 -- ② 同包/区域(一 worktree、一 changeset、一队列位)。 -- ③ 每张成员都已裁/已定级,⛔ 决策箱内一张不许;④ 每成员独立可核(一个具名判据)。 -- ⑤ 派发令点名排除清单:长得像家族而不是的成员及理由。 -- fold-or-serial 必答:≥2 张排队卡共享热文件时,必须以五门为判据显式答折叠或串行。 -- 答题处是串行队条目和/或链首认领;不答而默认串行是漏答。 -- 并行纪律四条(常规,非豁免):① 认领申报文件面到区域级,拿不准就串行。 -- ② 开 PR 前合一次 main;③ 兄弟卡落地后再合一次;④ 冲突交合并队列仲裁,⛔ 不手动排序。 -- 文件面不相交只保证文本可合并;跨文件语义耦合由队列 CI 逮住,⛔ 不读作不可能冲突。 -- 阻塞解除后延后单重定价:前一单派发词必答 #X 变简单、变难、不必要或无影响。 -- 派发后一单前用该回答重读它的选项与成本,⛔ 不沿用立单时那份。 -- 在飞卡衍生三分:不修它验收过不过;in-scope ⇒ 父卡 sub-issue,认领席自有、优先级继承。 -- 该 sub-issue 带父卡域与优先级直接派发,唯一绕过分诊;sweep 事后扫,重复关 `duplicate`。 -- 自在飞派发升级出的卡首行一句:本卡承哪一半、父卡留哪一半;缺此行不入队不入箱。 -- 阻塞项无主 ⇒ 被挡席认领做掉,不限大小;在该卡走完整认领、尊重其热文件串行队。 -- 阻塞项在飞 ⇒ 等:`pm:blocking` 在其车道排最前、等待者写该卡;p0/p1 优先级沿链传递。 -- 取卡前置 = `docs/NORTH-STAR.md`「优先级」第 3 条:产品仓开放 P0/P1 每次取卡现读。 -- 取卡全序:维护者直派插队卡(出处三件)> 契约面卡(判据见 `references/lanes/spec.md`)> 标签序。 -- 标签序:`priority:p0` > `pm:blocking` > 功能点位次 > `target:` 板上项 > p1 > p2 > p3 > 无级。 -- `pm:blocking` 级内先按解锁扇出(从 `Blocked-by:` 反向索引现算,⛔ 扇出数不落标签)。 -- 全序每级现读/现算,零逐卡维护;同级先 `Bug` 再卡龄;无级/缺 `Path:` 轮报记分诊缺口。 -- 解锁那一刻 PM 自己的判断最不可信:裁决收窄或关掉了那张卡是假设不是前提。 -- 该假设以机制假设身份进派发令,被证伪就在同一张卡公开更正。 - -### 认领(先认领后动工) - -- 共享身份下 assignee 只答有无认领;身份只认正文 session ID,⛔ 不认作者字段,接管同此。 -- assignee 字段归 PM:原子对 step 1 设,dev 席恒不写它;跨账号 assignee 不是你 ⇒ 永不碰。 -- 释放是显式动作:让卡离手者同笔清 assignee + `Release:` 行(会话/因/去向);下一任重新认领。 -- 部分落地(PR 带 `Refs #N (item k)`,⛔ 不 `Fixes`)即释放:合入同笔回 `pm:queue` + 清 assignee。 -- 同笔 `Release:` 行点名已落项与余项去向;余项需换道/拆分加 `pm:retriage`,自队列重新认领。 -- 派发前按序执行原子对:① Assign @me,并把 `pm:dispatched` 与摘 `pm:queue` 放进同一次标签写入。 -- step ① 之后获得 assignee 的直接弃出本批。 -- ② 认领评论(英文)照抄 模板与表 节:`Claim:` 首行,`Branch:`、`Clause-②:` 各占一行且行首。 -- 条款②入队闸门只读认领评论且只读行首键:句中提及与另发评论皆读不到,卡即不可读。 -- 谓词保持严格、⛔ 不放宽;session ID 不可省,`mode:subagent` 下 dev 与 PM 同 ID,身份看分支。 -- `Clause-②: yes | no` 恰这两种拼写,恒英文机器判据;判据:本卡放宽接受集或扩大公开面吗。 -- 引当次 `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --tier ` 输出⛔ 不凭记忆 -- 末行 Serial constraints cleared 是落在评论里的读数,同包在飞单不点名等于没查。 -- 本卡 pin 断言兄弟卡在改的行为 ⇒ 派发令注明,并在用例内预登记翻转触发词,⛔ 不修绿。 -- 家族派发的折叠认领:共享分支按链首卡命名;每张成员卡各留认领评论并点名该分支。 -- 折叠的一 PR 正文多行 `Fixes #` 每成员一行、逐卡 commit;完整串行约束检查落链首认领。 -- 限流不拆原子对:发不出评论就撤 assign 或不开始;配额尽则整对排队,永不留半个。 -- ③ 竞态复读:认领评论上墙后重读全线程;认领评论时间戳是唯一仲裁。 -- 更早的评论带不同 session ID/分支 ⇒ 你输了,回 `already claimed — yielding` 另选。 -- 让行是交接不是退场:连同让行评论交出已诊断的一切与已取的板面读数,赢家不必重扫。 -- dev 每个可编译小步即 push:容器随会话回收,未 push 的树救不回,可交接的只有远程分支。 -- 认领人不可达(token 耗尽/会话结束/身份退役)⇒ 接管:一条评论四件齐,⛔ 不判死活。 -- ① 跨账号 `Release:` 点名被撤认领的 id 与 session ID,带出处三件(谁的指令/原话/在哪说)。 -- ② assignee 同笔换人(`--unassign 旧 --assign 新`);③ 新 `Claim:`:新 session、续用分支与远程 sha。 -- ④ 交接记录:旧分支最后已 push 的 sha + 一句状态;读者只验①③形状,缺一件即非撤销。 -- C9 只剩一种红:无任何 `Release:` 的跨账号 `Claim:`(真抢卡);线程上每条活认领都要点名。 -- 误伤活席位 ⇒ 令其追加式更正,落 PR 正文不落分支历史。 - -### 派发 - -- 一单一次 `Agent` 调用,`subagent_type` 为 `os-dev`,后台并行。 -- 模型分档是 PM 的逐卡显式决定;档位值单源在 dispatch-gates 常量,⛔ 本文不写模型名。 -- 下限档给机械卡(正确性由门禁农场机械判定)。 -- 默认判断档给 M/L、裁决实施与任何带设计判断的卡;拿不准就升一档。 -- 上限 = 契约复审档(`CONTRACT_REVIEW_TIER`),给最重协议/流程/编排卡,按卡取用非新默认。 -- 强制条款①:凡改协议语义面的卡一律契约复审档。 -- 协议语义面 = 本 `SKILL.md`、决策框架拷贝所在文件、`.claude/agents/os-dev.md` 与 `skills/**`。 -- 仅 `references/**` 面、或治理面上一行级机械文本改动的卡,降为默认判断档施工。 -- 发布的 `skills/**` 整根随 `npx skills add` 发运,⛔ 无一行级豁免,逐行判机械不作数。 -- 纯机械一行 PM 酌定可至下限档;降档施工的补偿控制 = 复核席跑契约复审档。 -- 降档施工只经契约复审档复核到达维护者,⛔ 不新增标签不新增链。 -- 强制条款②:放宽接受集或扩大公开面的卡默认判断档施工;命中即 spec 车道的活。 -- 条款②判据即代裁的机械边界测试与 `references/lanes/spec.md` 席内分派判据,⛔ 不另抄。 -- 负边界:运行时权限/安全行为变更不是条款②,归人工地板安全/权限边界类。 -- 条款②只指已发布契约面,拉回已声明契约不触它;卡面复述仍是条款②。 -- 删已发布契约文本本就否定的误拒本身是 `no`;该 `no` 须引那段文本,缺引即读作缺申报。 -- 引文不符 ⇒ 降为 `yes`;裁决守卫、安全拒绝、失败关闭是刻意拒绝非误拒,删之 `yes`。 -- 错误码已发布面 = `ERROR_CODE_LEDGER`/`StandardErrorCode`:新码恒 `yes`,无门亦然,漏登即缺口。 -- 机械放宽判别门禁落地前,入队前的席内契约复核是方向自述的补偿控制。 -- 豁免够不到的地板只有维护者裁决能设。 -- 席位档策略:skills 车道外的执行席与分诊席默认判断档会话。 -- 条款②自审资格按车道:spec 与 skills 席达档席内审;未达档 ⛔ 不自审,起隔离达档子代理。 -- 降档出口两条:额度耗尽豁免,与主动预降(余量吃紧可预先降档)。 -- 额度耗尽豁免仅当契约复审档实测不可用才落默认判断档,⛔ 不再往下。 -- 降档的档位与理由记入认领评论 Container & model 行;档位逐次派发显式传参,永不省略。 -- 解析顺序、pin 语义与允许名单回退陷阱以 os-dev 定义 frontmatter 注释为权威。 -- 分诊 suggestion 行是输入不是决定,不采纳给理由。 -- 派发词 ⛔ 默认不整段粘贴 issue 正文:让 dev 自己读全文与全部评论并自查正文完整性。 -- 派发词只带增量,构造细则与条款原文见 `references/dispatch-runbook.md`。 -- 派发词引卡片的精确断言(schema 臂、判据、原文)一律逐字,⛔ 不释义转述。 -- 三分区:裁决(不可重裁)/ PM 机制假设(须实测,鼓励证伪)/ PM 建议的路线(可选,实测优先)。 -- 凡我觉得可以这样的一律降到第三区;⛔ 不把假设写成裁决。 -- 标准非协商条款 ⛔ 不抄进派发词:hook 已机械强制段与 os-dev.md 已载通用段砍掉。 -- ⛔ 不砍卡类特有约束:ADR 类 draft-only、tier 推导引用、棘轮实况、释义纪律。 -- 无条件条款只住角色文件,冲突时它胜、错了修那里,⛔ 不靠派发词临时覆盖。 -- 终报要求随派发词带一句:只收机器可核字段(gates / line_budget / deviations / files_changed)。 -- 派发令恒带 `Writes:` 行:只走 REST 代理、写预算(端点清单)、`mcp_calls` 计数,dev 两数都报。 -- 清单、路径、行号在派发那一刻从树上取,⛔ 不从卡片/上次派发/记忆抄。 -- 门禁清单取 `dispatch-gates --commands --repo 仓` 逐条跑,退出码先落盘,`--ran` 对账;被拒即手推。 -- 点名单是线索不是规格,dev 对实际改动重取补跑;行级断言转述前必须自己重验。 -- 派发令里关于代码的危害断言必须有读数(点名 call site / 路径 / 迁移)。 -- 搬自任何工件(含己文)本轮未亲测计数/零命中/文件面:重测或注「未验证」点名来源。 -- PM 测不了的危害 ⇒ 写成给 dev 的问题,⛔ 不写成栅栏;人工地板栅栏关于流程,免测量。 -- 派发令写明 dev ⛔ 不另留认领:PM 那条即身份;核对最新一条点名本分支,不符停手回报。 -- 已认领、别动 assignee 收窄到 assignee 字段本身;认领协议已满足是另一句话且可能是假的。 -- 触 `skills/**` 的卡,派发词必带 PM 定的净增行数预算(按 feature 大小定,小功能给小数)。 -- dev 装不下预算 ⇒ 停手回报,⛔ 不自行扩写、不自行抬预算。 -- 对外发布的技能包是平台最大的对外价值,评估恒整包整体。 -- 文件面写两句:预期落点;生产者在别包时修生产者侧并报落点,⛔ 不在消费者侧打补丁。 -- same-day churn 行:当天合并 ⇒ 先核对当前 main;在飞重叠每轮求交,相交即发四句警告。 -- 被在飞重叠完全覆盖就停下回报,⛔ 不硬造 diff。 -- 翻转公开语义的裁决随卡带全仓 pin 清扫,两句缺一不可,原文见 runbook。 -- 拒收用例 ⇒ `code`+`status` 最低断言;过滤/谓词语义 ⇒ 编译面清单逐面申报,⛔ 静默略过。 -- 资源与后端:S 级机械 + M ⇒ `mode:subagent`;S 级但不机械(判断面在设计不在门禁)按 M 待遇。 -- `mode:cloud` 只保留给 L/XL、活过 PM 会话的工作、浏览器/dogfood 验证;build 重的 M 卡逐卡判。 -- 归档义务只落在云卡;OOM 死的单独重派;判定连同档位写进认领评论。 -- 一次性云卡用 `create_session`,⛔ 不用 create_trigger+fire;trigger 流只留给定时/重复型。 -- 云会话 `SendMessage` not-reachable 是设计非故障,⛔ 不复测。 -- 接手中断的 dev:先试 SendMessage 复活,不可用才走接手协议,⛔ 不重跑原派发词。 - -### 收集 - -- 报告通道统一:GitHub 是两种模式共用的真相源;dev 终报先落 issue 评论、再作返回消息。 -- 收集先扫 GitHub,标记评论在 = 报告完整;两处皆无才进探活/判死。 -- 标记两种拼写等效(HTML 注释形、首行 `os-dev-report`);⛔ 永不把没收到失败通知读作还在跑。 -- 探活是每轮巡检的固定动作;完成通知不可靠,缺席什么都不证明。 -- ① 巡检首动作 `list_triggers` 确认 Routine 启用,在飞重挂加速器;唤醒归 Routine,漏挂不断链。 -- ② 在飞期间主巡检间隔 ≤45 分钟,待命期 60–70;节奏维护者明示可改。 -- ③ 已派发未回报的 dev 逐个发状态询问;派发后 ~45 分钟无远程产出即到门槛。 -- 已有远程分支/PR 不豁免探针。 -- ④ 活着 ⇒ 进度与阻塞点;回 no active task; resumed from transcript ⇒ 生前已死,询问即复活。 -- ⑤ 判据永远取正向证据:分支、PR、报告、探活回包。 -- 判死只有三类依据:探针回包表明已死;宿主明确回报 stopped;超过本车道基线且连续静默。 -- 基线 = 本车道实录派发 → 推分支/开 PR 的端到端耗时,三五单即可用,⛔ 非本文任何常数。 -- `mode:cloud` 的 ~2h 静默是本轮收集边界(记 `blocked` 移步下轮),也不是判死。 -- 停摆永不自愈:携带任务中途状态的完成通知本身就是停摆信号。 -- 报告末句是意图不是结果 = 停摆非完成:当刻 SendMessage 续派,⛔ 不读作交付、不判死。 -- 停摆 ⇒ 立刻 SendMessage 附前台执行姿态句,⛔ 不等任何静默阈值(阈值是给没有回答的)。 -- 复位走梯度,每次比上一次更具体;第三次停摆判 unreliable,按接手协议重派。 -- 通知重放先算身份再读内容:与已验收那份同身份 ⇒ 记重放即结束。 -- 直接验收兜底:(a) draft PR 在且 CI 全绿 + (b) 探活确认已死或 ≥2h 无推送 + (c) 报告未达。 -- 三条件全立 ⇒ 直接按 PR 验收,复核判据不减;先探活后翻 ready。 -- 舰队级死因(全账号断粮)下取 (a)+(c) 照常收口,PR body 就是报告。 - -### 复核 - -- 你是记录在案的复核人:对 GitHub 核验,⛔ 不对报告的自述核验。 -- 逐项判据展开在 `references/review-checklist.md`,每份报告对着它过。 -- PR 形态与范围:draft、目标 `main`、`Fixes`/`Part of` 首行判据,翻 ready 前亲核。 -- `Part of` 卡 MERGED 时点收口;changed files 范围与 changeset/`skip-changeset` 分流;测试证据。 -- 改到已有 `.changeset/*.md` 的 PR ⛔ 不打 `skip-changeset`;确认取维护者原话或出处三件转述。 -- 报告在草稿 PR 时点到达,CI 收敛读数只属于复核侧:gate `in_progress` 是诚实读数。 -- 绿色输出≠ 该绿证明了被测风险:拒收断言、全绿方向与时序、pin 翻转、边界后收益。 -- 触 `skills/**` 的 PR 加问整包价值密度:从整包加载的客户 agent 座位读,⛔ 不从作者座位读。 -- 超派发预算或小功能大扩写 ⇒ REWORK,⛔ 不因已经写好了放行。 -- 判决 ACCEPT:issue 英文短评论,核对清单结论 + 抽查读数 + 偏差,链接 PR,⛔ 不复述其叙事。 -- `mcp_calls` 点名写工具(`settings.json` deny 清单 + `update_pull_request`)⇒ 拒收,⛔ 不带注放行。 -- 判决 REWORK:逐项反馈,同认领重派;补丁轮优先 SendMessage 续派原 dev;最多 2 轮,第三次升级。 -- 判决 ESCALATE:见 升级与决策 节。 +## 路径分叉 + - **ACCEPT 之后的路径分叉**:翻 ready / 挂 auto-merge / 入队前先取一次 PR 的路径面。 - 路径面用 `get_files` 取,⛔ 不看报告自述;动手之前先分,不是事后对照。 - governed 面统一定义:`docs/adr/**` + `.claude/**`(全量)+ `skills/**` + `docs/NORTH-STAR.md`。 @@ -639,72 +209,6 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 源码自述 pushed 分支上按设计而红、不跑 `merge_group`、PR 评论记明门与因,缺一即否。 - 本段只适用本循环派发的 dev PR;PM 自己的工具 PR 留维护者。 -### 入队与落地 - -- 细则见 `references/landing-operations.md`,落地窗口查阅。 -- fork PR = 提案,席位永不放行;采纳 diff 内部落地,见 `references/external-contributions.md`。 -- 条款②入队闸门:翻 ready / 入队前先取 PR 实际 diff;diff 是事实,卡片语义是预测。 -- `--tier` 嫌疑行是提示非裁定;双肢命中任一 ⇒ 无达档条款②复核 PASS 在案 ⛔ 禁止入队。 -- 路径肢 = diff 触及契约面 `packages/spec/src/**`,含 error-code-ledger 与 `*.zod.ts` 契约 schema。 -- 声明肢 = 认领评论声明 `Clause-②: yes`,与路径无关;错误的 `no` 是可审计的假申报。 -- 交付后复核按面欠 ⛔ 不按车道(五面见 `references/contract-review.md`);双肢命中即 spec 车道。 -- 子代理起不来 ⇒ 复核缺席,PR 留 draft 队列外等档;唯一旁路是维护者亲审,逐次为准。 -- PASS ⇒ ready、auto-merge;FAIL ⇒ 补丁轮;⛔ 免复核不放行。 -- 真正设计分叉照旧进决策箱,席内复核 ⛔ 不替代维护者裁定。 -- 外部评审链降为可选事后审计,非放行前提。 -- 契约复核的适用面、资格与归属见 `references/contract-review.md`。 -- 碰生成物的 PR 入队前先同步 + 整体重生成:四步序 `bash scripts/pm/os-regen-merge.sh`。 -- 跟到 MERGED 为止,入队后的看护归车道 PM 的落地窗口:每轮同时读队列分支与 `origin/main`。 -- 默认分支 push 即触发对外部署的仓,只在验证层存在时才合并;无验证层 ⛔ 不合并。 -- 验证层 = 部署以 CI 为闸、发布后探测线上面、失败自动回滚并立卡。 -- 该类仓的落地判据是已发布且探测通过,⛔ 不是 MERGED;跟到发布为止。 -- 合并后工作流不在 PR 检查清单上,读 PR 检查的规则对它全盲;按独立检查类登记分开读。 -- 人闸不是验证层的替代:答不了会不会坏的人闸只买延迟,⛔ 不以人闸代替探测。 -- 信任 suite/check 事件前先重读 PR 对象取 head:检查读数绑定该 head,⛔ 不绑事件带的 SHA。 -- 落地记账:座位贴落地清单即账本,逐轮即时记;确需全仓核对时首选 `head:claude/` 精确过滤。 -- 红/踢出处置在同一落地窗口内做:机器输入是 merge-queue triage workflow 的分诊评论。 -- 判据唯一来源是签名台账(锚点 issue),优先于现场判断;只有人工能升级台账。 -- 疑似新 flaky 只留提请,⛔ 不自行加表;纯计数不追记,只有改变修法作用域时才记。 -- 四分支:已知 flaky ⇒ 原样重投;已修签名再现 ⇒ ⛔ 不重投,判新问题重新诊断。 -- 基上缺已合修复 ⇒ merge main 推新提交,重跑无效。 -- 新签名 ⇒ ⛔ 不重投,在 PR 与其 `Fixes` 卡各留完整签名与初判。 -- 每次处置留审计评论,重投写签名与台账依据。 -- 依赖前棒才能转绿的 PR:draft 停放 + 签名级预期红清单 + 解除条件,见 landing-operations C。 -- 多个已实现 PR 全碰生成物 ⇒ 串行接力一次只放行一个,每棒一整圈,见 landing-operations D。 - -### 轮次报告与节奏 - -- 每轮向维护者打中文轮次报告(chat 通道):issue → 判决 → PR 链接 → 备注的表。 -- 报告加升级项、代裁清单(分诊)、awaiting a human merge 项。 -- 报告含 `UNRECOGNISED` 行:对本轮门禁日志 grep `UNRECOGNISED` 逐行照录,`NOT APPLICABLE` 行也在内。 -- 健康指标五个:可派发库存(open `pm:queue` 未认领及趋势);决策箱(待维护者数)。 -- 决策箱指标还要点名带开放下游依赖的决策卡,从 `Blocked-by:` 反向索引现算。 -- finding 数与中位年龄:裸标签数即未定级数,hold 已换标不在内。 -- 裸卡数与中位年龄:sweep 析取①,未定级数另计析取④;老化 = 首触欠账。 -- 发版阻塞 = 三仓 `target:` 之和,归零 = 三张板都空;总 open 数刻意不在指标内。 -- Version Packages PR 默认永不催,挂着的发布 PR 是常态,⛔ 不进维护者摘要。 -- 唯一例外 = 重要修复已合 main 在等发布;提醒必须点名该修复与不发版的用户可见后果。 -- 波次收工点(执行席):① 收工点 = 会话内在飞归零,⛔ 不在复核中途压缩;云卡不挡。 -- ② 收工存档 = 上下文里的判断 flush 到 GitHub,随后立即派下一波,⛔ 不等人闸。 -- `/compact` 由维护者在终端会话择机执行,永远不是派发前提。 - -### 停止条件与待命 - -- 停:队列空或 `rounds` 用尽(仅一次性调用适用);一轮 ≥ 半数派发失败或升级;维护者打断。 -- 常设座位队列清空不等于退场,是切换待命姿态:巡检间隔按收集节②。 -- 待命五项各以其主节为准,⛔ 此处不另抄:findings 配合;`pm:blocked`/`pm:on-hold` 解锁扫描。 -- 在飞/已入队 PR 跟到 MERGED;决策箱仅在报告中列出 ⛔ 不 nag;跨车道备忘跟进。 -- 退场只有两个入口:维护者交接令(走交接收尾清单),或被惰性回收。 - -## 断粮与跨墙恢复(5 小时用量墙) - -- 权威的墙信号是失败本身:撞墙报文里的重置时刻在那一刻可得、事前查不到,记下来。 -- 跨墙定时器:拿到重置时刻 ⇒ 一发定点(reset + 缓冲)优先。 -- 没有重置时刻 ⇒ 挂每小时 cron Routine,⛔ 不用 send_later 链。 -- 第一枪成功的 fire 跑恢复后删除 cron;fired 文本照定时器写法纪律。 -- 恢复 playbook 链的是既有规则:逐个探在飞云卡 → 直接验收兜底或 transcript 复活。 -- 随后重挂常规巡检 → 照常跑轮。 - ## 升级与决策 - 只在至少一条成立时升级:选项在产品语义或公开契约形状上真实分歧且既有规范定不了。 diff --git a/.claude/skills/pm-dispatch/references/compile-surfaces.md b/.claude/skills/pm-dispatch/references/compile-surfaces.md index cf333063357..932db715eee 100644 --- a/.claude/skills/pm-dispatch/references/compile-surfaces.md +++ b/.claude/skills/pm-dispatch/references/compile-surfaces.md @@ -1,6 +1,6 @@ # 过滤与谓词语义的编译面清单 -见 SKILL.md 〈派发〉的过滤与谓词语义条款;命中它的派发令逐面抄进本清单,PR 逐面申报。 +见 execution-duties.md 的过滤与谓词语义条款;命中它的派发令逐面抄进本清单,PR 逐面申报。 维护纪律与复核串一并适用:这张表由 PR 维护、派发前先跑复核串重验,⛔ 不凭记忆抄。 编译面清单(行号每天在动,派发前按下方复核串重验): diff --git a/.claude/skills/pm-dispatch/references/contract-review.md b/.claude/skills/pm-dispatch/references/contract-review.md index ca98d4a048b..a601a932ceb 100644 --- a/.claude/skills/pm-dispatch/references/contract-review.md +++ b/.claude/skills/pm-dispatch/references/contract-review.md @@ -1,6 +1,6 @@ # 契约复核细则(按面) -见 SKILL.md 〈入队与落地〉的条款②闸门;本文只放复核归属与资格。 +见 landing-operations.md 〈入队与落地〉的条款②闸门;本文只放复核归属与资格。 ## 复核归属与资格(按面) diff --git a/.claude/skills/pm-dispatch/references/core-rules.md b/.claude/skills/pm-dispatch/references/core-rules.md deleted file mode 100644 index 841fde36c4a..00000000000 --- a/.claude/skills/pm-dispatch/references/core-rules.md +++ /dev/null @@ -1,151 +0,0 @@ -# PM 核心条款(人读摘要) -每行一条规则,按 SKILL.md 章节分组;细节以 SKILL.md 与其它 references 为准,⛔ 不新增规则。 -## 红线 -- PM 不写任何文件;⛔ 永不合自己的、红的或未复核的 PR,合并只经合并队列发生。 -- 版本发布必须人工,发现未经人工的发布痕迹按事故立案,⛔ 不代跑补救性发布。 -- 版本包 PR 默认永不催,唯一例外是重要修复已合 main 在等发布且提醒点名用户后果。 -- 受管面由维护者人合或授权批准后席位落地,⛔ 席位永不以任一账号批准受管面 PR。 -- ⛔ 永不代维护者回答产品或架构问题,唯一例外是已裁的代裁车道。 -- ⛔ 永不派发 assignee 属于别人的 issue,⛔ 永不派发带决策标签的 issue。 -- 并行度以 `batch` 封顶,验证锁到达深度 ≥ `LOCK_DEPTH_HOLD`(2)即等;同批按构造文件面不相交。 -## 入口与角色 -- 座位角色由 `/pm-dispatch` 参数认定;无角色参数按执行姿态跑,车道由座位贴认定。 -- 开轮第一个动作是一次最便宜的车道盘点查询,⛔ 在它之前不读任何长文本。 -- 队列空、无在飞、无待复核、决策箱无新答复,本轮即自退。 -- 一轮自 fire 唤醒起,到队列清空或用量窗口耗尽止;轮次报告是轮末汇报 ⛔ 不是停止信号。 -- 入座自绑 cron Routine 作默认唤醒、只定下次唤醒;fire 到时未清空即接续,⛔ 不重开不重排。 -- 分诊席跑普通直连会话、默认判断档,裁决归总监席;`send_later` 只是 ≤55 分钟加速器。 -- 开轮互斥四读数:收班简报、开轮标记、本车道同席号最新他会话认领与最新关闭卡认领。 -- 未收班活动任一未满一轮即自退,总监席除外;有简报即坐席,坐席后核章程再写开轮标记。 -## 全体座位的不变量 -- 状态住 GitHub 标签、assignee、正文行与座位贴;⛔ 本地零状态;循环须能从新会话恢复。 -- PM ⛔ 不写文件也不写代码,唯一例外是维护者逐 PR 明示授权的 `.claude/` 内部工具 PR。 -- 该例外须把授权原话引在 PR 正文。 -- 用户账号仅三用:assignee、授权批准、维护者亲手;写只走 REST 代理,署名随令牌非席位。 -- GitHub 新内容一律英文,中文只留轮次报告、派发令裁决引文与四维分析;引文照抄不译。 -- 存量中文 ⛔ 不追溯改写;一 PM 一车道、一车道多席、一席一贴;与 AGENTS.md 冲突以之为准。 -## 状态模型 -- 可派发等于 open 加队列标签加无 assignee 且不带 `pm:retriage`,已设 assignee 即 ⛔ 永不碰。 -- `pm:on-hold` 仅当带机器可读 `Restart-when:` 行才合法,触发文件走 `Restart-touch:` 行。 -- hold 放行须双查:只放最近一次转换评论的条件,其后有更新的 merged PR 即拒。 -- 没有可点火出口的卡 ⛔ 不 hold,直接关 not planned 并把理由与出处写进关单评论。 -- 缺陷卡 ⛔ 不可自行关闭或藏进 hold:可复现回队列、未兑现走 enforce-or-remove、余下进箱。 -- `pm:blocked` 配正文行 `Blocked-by:`,完工卡遇门禁或等换标的同用此态并写 `Unlock-action:` 行。 -- `pm:awaiting-maintainer` 只剩站外人工动作,恒带 `Maintainer-action:` 行;`pm:blocking` ⛔ 不手工挂。 -- `pm:retriage` 并存 ⛔ 不摘原标且跳过派发;`finding` 恒等于待首次定级、定级即离标。 -- 插队标签可超 `batch` 立即派发,⛔ 不豁免同文件串行、深度等待与认领协议。 -- 五个 pm 状态标签加 `needs-user-decision` 共六态互斥,转换恒一笔 replace,队列卡逾三天欠转换。 -- 关闭即在同一笔摘掉 pm 状态标;状态变更不过夜,半状态在结束会话前补齐或回滚。 -- 等待别的座位也是状态、写在卡上才存在;代他人指令的关闭须带指令、原话与出处三件。 -- 标签写恒为读现值、增删目标、写合并集、回读比对四步,缺项即重挂。 -## 平台读数纪律 -- 判据取命令输出,⛔ 不取 API 字段字面值、不取本地工作树、不取看着相邻的日志。 -- 核验 main 用 fetch 后的 `origin/main`,⛔ 不用共享检出树;仓不可达 ⛔ 不当查过且干净。 -- 零命中须配同主体必中词,否则该零作废;同仪器的控制词双零是仪器坏,⛔ 不读作缺席。 -- 控制通过 ≠ 问题问对:零命中须写仪器可达半径与半径外已知目标,半径外的零非读数。 -- 他人据以行动的读数须带单位并答什么本来会让它不是这个值;递 dev 的恒标线索非答案。 -- 板面、树与队列读数一律自带 UTC 取数时刻,无时间戳的读数按未取处理。 -- 失效修法按序取:先删掉容许出错的构造,再让正确形态成为唯一拼写,最后才加检查。 -- 自设定时器的文本以先重读状态开头,只写关键判据,⛔ 不写可直接执行的祈使句。 -- PM 写进 GitHub 的文本 ⛔ 不用尖括号占位符,携带易损片段的评论发出后回读。 -- 放行认承载门禁族的 job 结论 ⛔ 不认聚合读数,advisory 红着进 main 即止血并立单。 -- 默认读序 git、payload、REST、MCP;REST 可达性逐会话探一次;派发前读配额不够就减批。 -## 多仓协调 -- 依赖方向固定:objectstack 提供唯一契约,objectui 与 cloud 消费它。 -- 多车道仓的域标签、type、定级与查重只由中央分诊生产,单车道仓自理三务不产域标签。 -- 跨仓查重与 shadow 检查恒归中央 ⛔ 不下放;决策卡入本仓收件箱,在飞卡 ⛔ 不中途转仓。 -- issue 住在修复落地的仓,抽掉 objectstack 仍成立的当场转仓;缝卡须带仓标签并点名读者。 -- 跨层功能点或跨仓 `Seam:` 卡拆成父单加逐层子单,下游带 `Blocked-by:`,上游未关 ⛔ 不派发。 -- pin 消费的仓派发前核 pin 是否已覆盖那个提交,发布包消费的仓判据是消费方可安装。 -- 上游未发版时转 hold ⛔ 不回队列;已验收产物流向另一仓由接受席立即立后续单。 -- 跨座位请求骑既有卡:自卡 `Blocked-by:` + `pm:blocked`,目标卡评论;无主被挡席认领,在飞即等。 -- 认领席跟到 MERGED,派发后的跨车道面不移卡、借隔离复核;新 spec 工作由 spec 席收口。 -## 域车道 -- 每个包恰好属于一个域,域标签 = 修复落地包的域,只决文件归属 ⛔ 非队列非优先级单位。 -- 域由分诊读代码判定,⛔ 绝不从 issue 标题的词汇猜域;说不出修复碰哪个文件就还不可标。 -- 域到包家族的对照表住 SKILL.md,增删一个域标签同批改那张表;`area:*` 是功能轴,首触打。 -- 域标签只由分诊席产出,例外仅在飞卡衍生 sub-issue 承父卡域;无标签的卡 ⛔ 不得认领。 -- 跨域单 PR 由分诊席指定一个车道 PM 认领并申报完整文件面,在飞检查同域跨域皆跑。 -- 合并队列是共享串行资源,谁发现 flake 谁修或立单,⛔ 不绕行。 -## 座位贴协议 -- 一座位一贴,正文固定四段现值:当前 PM、继承台账、热文件串行队、说明。 -- 贴正文由在任 PM 独家编辑且为权威,标题只放慢状态、与 assignee 同为派生视图同笔更新。 -- 岗位说明与常设承诺版本化在 `references/lanes/` 下,贴内只放指针,升级走技能 PR。 -- 写侧刷新点是轮次边界,读侧只读正文加晚于它的评论;刷新前读完评论、回执未读敲门。 -- 活性靠惰性判定,超过一天无自有产出即可降级回收;⛔ 永不从更新时刻或标题推死活。 -- 收班是状态 flush 加在飞安置而非归零,简报是最终一笔;留守只写简报点名的项。 -- 换班报告默认零建议,只收原则错缺、可机械化项与平台事实变化三类。 -- 交接按收尾清单走完;强制接管 ⛔ 不取在飞卡,由原认领者跟完;归档自派会话不可移交。 -## 分诊座位职责 -- 执行席 ⛔ 跳过分诊动作,读到标签当既成事实;立卡者只答类别/读者/查重命中数。 -- 两级盘点是小时轮读增量加每日全量对账,枚举须比对总数、不等即报不完整并点名缺口。 -- sweep 扫全裸卡、队列卡缺域或缺定级、域卡缺 pm 状态,排除跟踪、停放与协议载体卡。 -- 首触定级跑到清空 ⛔ 无总量预算、未跑完断点续跑;清得空最新优先,否则最老优先。 -- 立卡门 ①–④ 外 ⛔ 不立卡;裸卡超十五张则下轮改域分批,每批不超过五张同族卡。 -- 有落点或可复现的缺陷、实现未被裁错的说明书脱节进 `pm:queue`;工具卡另须带解锁行。 -- 设计卡、契约形状提案、碰迁移形状或删已发布能力的进决策箱;无出处说明书脱节不进。 -- 门 ① 内 `finding` 限三类:今日可达可复现缺陷、契约违背、具名生产者陷阱;截断卡不派。 -- 三类边界:缺陷问错不问缺、文档同判;元数据须他人再作者化;引向更糟的警告在类外。 -- 类型字段由分诊席唯一生产,违背已声明契约是缺陷、扩出已声明是功能、其余是任务。 -- 缺陷卡无具名落点或复现路径不入队列 ⛔ 不回填存量;每张卡留一条英文审计评论。 -- 路由是分诊的技术判断 ⛔ 永不升级哪个仓的问题;父单是协调节点、永不派发。 -- 发版板判据二元:不修它当前候选版能不能发 ⛔ 不做渐变,拆票时标签随工作走。 -- 发版阻塞四类:用户今天撞上的已发布面缺陷、契约声明未兑现、迁移形状、要道歉的。 -- 代裁只出自维护者召唤的总监席 ⛔ 永不凭自述;其档位由维护者按项目定,⛔ 无硬门。 -- 人工地板恒交维护者:新功能、ADR、协议/公开契约变化、破坏性/难回滚动作、门禁削弱。 -- 地板含安全/权限边界、花费配额与模型档位、新增运行时依赖、新增必需门禁/hook/棘轮。 -- 代裁车道只覆盖行为不变的重构与缺陷修复,边界测试是接受面有没有扩大。 -- 置信门四条全立才可代裁:四棱同向、不在地板、不推翻既有裁决、否决窗口执行。 -- 代裁即换标签、贴四棱块与结论、打自动裁决标记、轮报设专节;发现契约要动则回箱。 -- 方向性授权覆盖整条执行链,需裁事项攒批呈报,运维细节 ⛔ 不弹给维护者。 -## 执行座位职责 -- 半状态巡查按需跑,其 H 行是读数不是前提,⛔ 不因锚行停派发。 -- 候选整车道一次读全再本地求交,每张读全文与全部评论并把裁决逐字引入派发词。 -- 派发前做前提过时检查,动作面、卡引用面与工作项面三面都对树核验。 -- 同批独立性按文件面不相交判,⛔ 不按包;同区域硬串行,冲突交合并队列仲裁 ⛔ 不手排。 -- 家族派发须过五门:同缺陷同修法、同包区域、成员皆已裁、逐成员可核、点名排除清单。 -- 两张以上排队卡共享热文件时,必须以五门为判据显式回答折叠还是串行。 -- 取卡全序:维护者直派插队卡(出处三件)> 契约面卡(判据见 `references/lanes/spec.md`)> 标签序。 -- 标签序:`priority:p0` > `pm:blocking` > 功能点位次 > `target:` 板上项 > p1 > p2 > p3 > 无级。 -- 认领原子对:一次标签写入完成认领与状态对调,随后留 `Claim:` 开头的评论并重读全线程。 -- 更早的他会话认领即让行并交出已诊断的一切;认领人不可达即接管,⛔ 不判死活。 -- dev 自死不等于维护者中止,需显式信号;接管一条评论四件齐,只救已 push 的分支。 -- 一单一次派发,档位逐卡显式传参;语义面卡恒契约复审档施工,契约复核按面欠不按车道。 -- 派发词 ⛔ 不整段粘贴 issue 正文,只带增量,并要求子代理自查正文完整性。 -- 派发词分三区:裁决不可重裁、机制假设须实测、建议路线可换,⛔ 不把假设写成裁决。 -- 标准非协商条款 ⛔ 不抄进派发词,清单、路径与行号在派发那一刻从树上取。 -- 危害断言必须有读数,测不了写成问题 ⛔ 不写成栅栏;技能包卡必带净增行数预算。 -- 收集先扫 GitHub 且报告缺席 ⛔ 永不读作成功;探活先确认 Routine 启用,在飞再重挂加速器。 -- 停摆永不自愈,按梯度复位、三次即判不可靠重派;报告丢失时按草稿 PR 直接验收。 -- 复核对 GitHub 核验 ⛔ 不对自述核验,逐项过清单并亲核形态、范围与整包价值密度。 -- CI 收敛读数只属于复核侧;判决三种:验收落卡、返工最多两轮、升级走决策通道。 -- 验收后取路径面:规则层 ⛔ 不翻正式不入队,Tier S 达档 PASS 后入队;fork PR 永不放行。 -- 受管面 PR 留 draft 并向两个授权批准账户请审;契约卡无同形复核记录 PASS ⛔ 禁止入队。 -- 入队资格是每一个检查全绿 ⛔ 不是必查子集;碰生成物的 PR 入队前先同步再重生成。 -- 唯一例外:源码自述 pushed 上按设计而红、不跑 `merge_group`、评论记明门与因,三条全立。 -- 跟到合并为止并每轮读队列成员资格与 `origin/main`;踢出按签名台账四分支处置。 -- 合并即发布的仓无验证层不合并,落地判据是已发布且探测通过 ⛔ 不是 MERGED。 -- 每轮打中文轮次报告,含判决表、升级项、代裁清单、等人合项与五指标。 -- 收工点是会话内在飞归零、存档后立即派下一波 ⛔ 不等人闸;清空转待命而不是退场。 -## 断粮与跨墙恢复 -- 权威的用量墙信号是失败本身,重置时刻只在撞墙那一刻可得,拿到就记下来。 -- 拿到重置时刻挂一发定点定时器、否则挂每小时循环 ⛔ 不用延时链,成功后删掉循环。 -## 升级与决策 -- 升级只有两条门槛:公开契约或产品语义真实分歧且规范定不了,或动作破坏性难回滚。 -- 其余都是 PM 的裁量,给维护者的是否决窗口而不是许可门。 -- 具名不升级类:恢复不变量的修复、技术任务之间的顺序与依赖、验证策略、说明书脱节。 -- 记账不升级(无产品可见行为变化):去重并卡、理台账、纯文档措辞、既有门禁盲区加强。 -- 带前提的裁决三件缺一不可:选路线、挂具名可证伪前提、前提不成立必须报分叉。 -- 同族近似单默认并入既有拒收集;两个实现不一致时带治理的一侧胜出并删另一侧。 -- 落卡先刷新前提,前提行自带 re-check 命令;决策默认锚在所属 issue,呈报带 `Governing text:`。 -- 裁决记录四件同笔:鲜度门、状态转换、依赖行活性现验、条件已知即就地判掉。 -- 出决策箱须引一个同趟取回过的裁决 id,⛔ 时间戳加回忆不算引用。 -- 基本裁决:协议为准,文档随实现,协议错先改;声明即强制限 spec/元数据契约与运行时能力。 -- 方案逐轴过四轴:业务需求、长远合理性、防 AI 写错、创业阶段聚焦(新增门禁默认否)。 -- 推荐须逐轴给理由、长远权重不低于一半;有拉动荐长远终态一次付清,零拉动荐不扩散。 -- 每张决策卡落卡即带标准四棱块;卡先于弹窗,被阻塞的执行卡同笔转 `pm:blocked`。 -- 项目总监席由人工召唤,未回字 = 不在 = 停;三职:复核审计、决裁、动作台账。 -## 报告契约 -- 终报 JSON 的权威形状住 `.claude/agents/os-dev.md`,⛔ 本协议不另存第二份。 -- 前提被证伪且无 PR 是合法终报,当再分诊输入复核,⛔ 永不当失败派发。 -- needs_decision 必带 open_questions;范围外逐条 `class:`/`carrier:`,dev 不立卡,席位处置、对读同轮。 diff --git a/.claude/skills/pm-dispatch/references/cross-repo-coordination.md b/.claude/skills/pm-dispatch/references/cross-repo-coordination.md new file mode 100644 index 00000000000..d37037a0932 --- /dev/null +++ b/.claude/skills/pm-dispatch/references/cross-repo-coordination.md @@ -0,0 +1,51 @@ +# 多仓协调 + +分诊席每次 fire 路由与查重前读本文;执行席跨仓认领、派发或转移时读本文。 + +- 产品依赖方向固定:`objectstack`(后端,`packages/spec` 是唯一契约)→ `objectui`(前端)与 `cloud`。 +- objectui 构建产物经 `pnpm objectui:refresh` 回流。 +- 多车道仓 `objectstack`、`objectui`:中央分诊是 `domain:*`/type/定级的唯一生产者。 +- 单车道仓 `cloud`、`objectos`、`hotcrm`、`www.objectos.ai`;未来新仓默认此类。 +- 单车道仓 `repo:*` 席自理机械三务,⛔ 不产 `domain:*`;决策卡入本仓收件箱,不落 objectstack。 +- 机械三务 = 自扫 sweep、自打 `type`、自做 `finding` 首触定级。 +- 新仓登记是一张清单:座位贴、标签、类别归属、门禁盘点、写身份锁移植(deny + hooks)。 +- 新仓准入判据一句:这个仓真的需要常设席位吗。 +- hotcrm 收卡判据与宪章见 `references/lanes/hotcrm.md`。 +- objectui 卡按修复落点分流三流,`domain:ui` 是唯一新增标签。 +- `domain:devx`(工程面)与 `domain:spec`(契约面)跨仓归各自车道。 +- 其余(发布库与 apps)归 `domain:ui` 执行席;症状位置不改流向,docs 随所记录的面走。 +- 车道可分席(席号 `· seat N`,或域×仓):忙时一车道开多席,闲时收归一席;每席独立座位贴。 +- 认领评论带 `Seat: domain:X#N` 行申报席号(缺省席 1);同席认领互斥,他席认领不触发自退。 +- 拆分触发预登记:单轮逼近 fire 周期,或某仓在全序下持续断粮 ⇒ 按仓拆回多席。 +- seam 卡单一归属:归修复落地仓的席,双仓皆动 objectstack 侧主导。 +- `scripts/pm/**` 等住 objectstack 的全板工具链单写手恒为 objectstack 侧席,他侧上游立卡回链。 +- 工装只答被告知的仓,缺 `--repo`/`PM_SWEEP_REPO` 即答 objectstack;⛔ 不答手上那张卡的仓。 +- 规则 1:issue 住在修复落地的仓,分诊时按判据严格执行。 +- 判据:正文抽掉 objectstack 还成立 ⇒ 当场转仓(console/UI 缺陷即转 objectui);不成立才是缝卡。 +- transfer 不可用时重建:出处头 + 裸 `#N` 改全名 + 关源单为 moved。 +- 缝卡收窄为真协调卡:留 objectstack 带 `repo:*`,正文点名读者(哪个座位、哪一步)。 +- 决策收件箱按仓:平台在 objectstack / objectui,元数据项目在本仓;在飞卡 ⛔ 不中途转仓。 +- 规则 2:跨层功能点或 objectui 消费的 `Seam:` 卡恒由分诊立父单 + 逐层子单,spec/后端先行。 +- 下游带 `Blocked-by: #`;`Blocked-by` 未关闭/未合并的不派发,对 GitHub 现验。 +- 被链接或同父的两单永不同批。 +- pin 滞后是盲区:本仓 pin 是否已覆盖该 commit 是第二读数,派发前用 REST `compare` 核祖先。 +- 本地 `merge-base` 在浅检出上给假非祖先;未覆盖 ⇒ 派发令要求 PR 正文留档分叉窗口。 +- ⛔ pin bump 不做 rider:走专用 bump 脚本连带 override 与 lockfile。 +- 规则 3:联动杂事立单,不靠记忆。 +- 已验收 PR 的产物流向另一仓,接受该 PR 的执行席立即在消费仓立后续单,带 `Blocked-by:`。 +- 规则 4:纵向拆分,一个分诊 PM + N 个执行 PM;一人恰一车道,一车道可坐多席。 +- 分诊座位唯一生产:定级/路由/type/查重/shadow/`duplicate_of`;执行席永不定级或路由裸卡。 +- 执行座位信任标签,只在本车道认领;误标 ⛔ 不自行改,挂 `pm:retriage` + 异议评论同笔。 +- 突发积压调频率或 `batch`,持续积压按仓拆席走 PR;⛔ 不跨车道借调。 +- 维护者直派通道:当面指挥的 PM 会话直接路由,只对明示指挥的卡成立。 +- 直派的审计评论逐字引用授权指令。 +- 多车道仓分诊空缺时,会话型执行 PM 可代扫:只做分诊动作,不跨车道认领,贴上注明。 +- 代扫在分诊座位有主时立即停止。 +- 规则 5:一块板不设第二跟踪器:pm 标签就是状态机,org Project 只是维护者的聚合视图。 +- 认领即跟到 MERGED:派发后发现的跨车道面(含 spec)不移卡,认领席借契约复审档隔离复核。 +- 复核记录带 `Implemented-by:`/`Reviewed-by:`;`pm:retriage` 改路由只对未派发卡。 +- 转移落对方队列:目标仓立单带 `pm:queue`、出处行与一行可执行判据,依赖用 `Blocked-by:`。 +- 跨座位请求骑在它所关的既有卡上:请求席在自卡写 `Blocked-by:`,并在目标卡留一条评论。 +- 该评论点名席位与步骤;无既有卡承载且请求自身即立卡门 ①②④ 时才立新卡。 +- 等待方同一笔把自卡翻 `pm:blocked` + `Blocked-by:` 指向请求卡;⛔ 不设新标签新 sweep。 +- 目标仓不可达是读数缺口,不是落点:由可达席在目标仓立卡,此前请求记座位贴或协调卡。 diff --git a/.claude/skills/pm-dispatch/references/execution-duties.md b/.claude/skills/pm-dispatch/references/execution-duties.md new file mode 100644 index 00000000000..59a5a2ca43a --- /dev/null +++ b/.claude/skills/pm-dispatch/references/execution-duties.md @@ -0,0 +1,183 @@ +# 执行座位职责 + +执行席每次 fire 读本文:候选、认领、派发、收集、复核;落地窗口另读 `landing-operations.md`。 + +- 半状态巡查按需跑(分诊席每日对账可调),H 行是读数不是前提;⛔ 不因锚行停派发。 + +## 候选与批次 + +- 整车道一次读全,本地求交:`list_issues` 带 `labels: [domain:X]` + 最小字段拿回全车道 open 集。 +- 候选 = open、未 assign、无 `needs-user-decision`、无 `pm:retriage`;⛔ 排除两行皆无的 `tooling` 卡。 +- 已排队父单的 open sub-issue 自动是候选,`pm:epic` 父单的子树除外。 +- 每张候选读全文 + 全部评论,写派发词前做决策复读:评论读到最后一页。 +- 维护者裁决逐字引入派发词裁决分区作约束,无则写明无裁决。 +- 派发前做前提过时检查,裁决同罪,三面都查:动作面、卡引用面、工作项面。 +- 动作面:`git log --oneline -20 -- `。 +- 裁决实施卡的动作面再核被点名的动作在 `origin/main` 上还没被做掉。 +- 卡引用面:裁决/卡片点名的每张 issue 逐个读当前 open/closed/assignee。 +- 引用读到的现状,⛔ 不引用裁决写作时的描述。 +- 工作项面:卡片与分诊评论列的每条工作项逐条对树核验是否仍未完成,⛔ 不对卡核验。 +- 每条工作项写进派发令时都是 dev 首先证伪的前提。 +- 并行度以 `batch` 封顶,等待不填槽;同批独立按文件面不相交判,⛔ 不按包、不按 check 名。 +- 舰队至多一张 `tooling` 卡带 `pm:dispatched`,第二张等;带 `Unblocks:` 者继承产品级不计数。 +- single-writer 路径 = `SINGLE_CLAIM_PATHS` 所枚举;共享其它路径是普通并发,后落地方解冲突。 +- 第 N 单派发前读 `scripts/pm/os-verify-lock.sh --status`:到达深度 ≥ `LOCK_DEPTH_HOLD`(= 2)即等。 +- 到达深度 = `queue N:` 行数 + 1(待派 dev 的运行算作到达);`state:` holder 与 `parked` 行不计。 +- 有效上限是锁宽的函数,⛔ 不是第二个 `batch`;`priority:p0` 可超 `batch`,⛔ 不越过深度等待。 +- 同区域单跨轮硬串行;延后不是搁置,被延后那一刻就把已知的坑记到该 issue 上。 +- 家族派发是范围澄清不是豁免:一个 dev 有意覆盖 N 张同区域已裁卡,可折叠为一次派发。 +- 折叠准入五门全过才可折:① 同缺陷形态同修法(⛔ 不是同关键词/同子系统)。 +- ② 同包/区域(一 worktree、一 changeset、一队列位)。 +- ③ 每张成员都已裁/已定级,⛔ 决策箱内一张不许;④ 每成员独立可核(一个具名判据)。 +- ⑤ 派发令点名排除清单:长得像家族而不是的成员及理由。 +- fold-or-serial 必答:≥2 张排队卡共享热文件时,必须以五门为判据显式答折叠或串行。 +- 答题处是串行队条目和/或链首认领;不答而默认串行是漏答。 +- 并行纪律四条(常规,非豁免):① 认领申报文件面到区域级,拿不准就串行。 +- ② 开 PR 前合一次 main;③ 兄弟卡落地后再合一次;④ 冲突交合并队列仲裁,⛔ 不手动排序。 +- 文件面不相交只保证文本可合并;跨文件语义耦合由队列 CI 逮住,⛔ 不读作不可能冲突。 +- 阻塞解除后延后单重定价:前一单派发词必答 #X 变简单、变难、不必要或无影响。 +- 派发后一单前用该回答重读它的选项与成本,⛔ 不沿用立单时那份。 +- 在飞卡衍生三分:不修它验收过不过;in-scope ⇒ 父卡 sub-issue,认领席自有、优先级继承。 +- 该 sub-issue 带父卡域与优先级直接派发,唯一绕过分诊;sweep 事后扫,重复关 `duplicate`。 +- 自在飞派发升级出的卡首行一句:本卡承哪一半、父卡留哪一半;缺此行不入队不入箱。 +- 阻塞项无主 ⇒ 被挡席认领做掉,不限大小;在该卡走完整认领、尊重其热文件串行队。 +- 阻塞项在飞 ⇒ 等:`pm:blocking` 在其车道排最前、等待者写该卡;p0/p1 优先级沿链传递。 +- 取卡前置 = `docs/NORTH-STAR.md`「优先级」第 3 条:产品仓开放 P0/P1 每次取卡现读。 +- 取卡全序:维护者直派插队卡(出处三件)> 契约面卡(判据见 `references/lanes/spec.md`)> 标签序。 +- 标签序:`priority:p0` > `pm:blocking` > 功能点位次 > `target:` 板上项 > p1 > p2 > p3 > 无级。 +- `pm:blocking` 级内先按解锁扇出(从 `Blocked-by:` 反向索引现算,⛔ 扇出数不落标签)。 +- 全序每级现读/现算,零逐卡维护;同级先 `Bug` 再卡龄;无级/缺 `Path:` 轮报记分诊缺口。 +- 解锁那一刻 PM 自己的判断最不可信:裁决收窄或关掉了那张卡是假设不是前提。 +- 该假设以机制假设身份进派发令,被证伪就在同一张卡公开更正。 + +## 认领(先认领后动工) + +- 共享身份下 assignee 只答有无认领;身份只认正文 session ID,⛔ 不认作者字段,接管同此。 +- assignee 字段归 PM:原子对 step 1 设,dev 席恒不写它;跨账号 assignee 不是你 ⇒ 永不碰。 +- 释放是显式动作:让卡离手者同笔清 assignee + `Release:` 行(会话/因/去向);下一任重新认领。 +- 部分落地(PR 带 `Refs #N (item k)`,⛔ 不 `Fixes`)即释放:合入同笔回 `pm:queue` + 清 assignee。 +- 同笔 `Release:` 行点名已落项与余项去向;余项需换道/拆分加 `pm:retriage`,自队列重新认领。 +- 派发前按序执行原子对:① Assign @me,并把 `pm:dispatched` 与摘 `pm:queue` 放进同一次标签写入。 +- step ① 之后获得 assignee 的直接弃出本批。 +- ② 认领评论(英文)照抄 SKILL.md 模板:`Claim:` 首行,`Branch:`、`Clause-②:` 各占一行且行首。 +- 条款②入队闸门只读认领评论且只读行首键:句中提及与另发评论皆读不到,卡即不可读。 +- 谓词保持严格、⛔ 不放宽;session ID 不可省,`mode:subagent` 下 dev 与 PM 同 ID,身份看分支。 +- `Clause-②: yes | no` 恰这两种拼写,恒英文机器判据;判据:本卡放宽接受集或扩大公开面吗。 +- 引当次 `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --tier ` 输出⛔ 不凭记忆 +- 末行 Serial constraints cleared 是落在评论里的读数,同包在飞单不点名等于没查。 +- 本卡 pin 断言兄弟卡在改的行为 ⇒ 派发令注明,并在用例内预登记翻转触发词,⛔ 不修绿。 +- 家族派发的折叠认领:共享分支按链首卡命名;每张成员卡各留认领评论并点名该分支。 +- 折叠的一 PR 正文多行 `Fixes #` 每成员一行、逐卡 commit;完整串行约束检查落链首认领。 +- 限流不拆原子对:发不出评论就撤 assign 或不开始;配额尽则整对排队,永不留半个。 +- ③ 竞态复读:认领评论上墙后重读全线程;认领评论时间戳是唯一仲裁。 +- 更早的评论带不同 session ID/分支 ⇒ 你输了,回 `already claimed — yielding` 另选。 +- 让行是交接不是退场:连同让行评论交出已诊断的一切与已取的板面读数,赢家不必重扫。 +- dev 每个可编译小步即 push:容器随会话回收,未 push 的树救不回,可交接的只有远程分支。 +- 认领人不可达(token 耗尽/会话结束/身份退役)⇒ 接管:一条评论四件齐,⛔ 不判死活。 +- ① 跨账号 `Release:` 点名被撤认领的 id 与 session ID,带出处三件(谁的指令/原话/在哪说)。 +- ② assignee 同笔换人(`--unassign 旧 --assign 新`);③ 新 `Claim:`:新 session、续用分支与远程 sha。 +- ④ 交接记录:旧分支最后已 push 的 sha + 一句状态;读者只验①③形状,缺一件即非撤销。 +- C9 只剩一种红:无任何 `Release:` 的跨账号 `Claim:`(真抢卡);线程上每条活认领都要点名。 +- 误伤活席位 ⇒ 令其追加式更正,落 PR 正文不落分支历史。 + +## 派发 + +- 一单一次 `Agent` 调用,`subagent_type` 为 `os-dev`,后台并行。 +- 模型分档是 PM 的逐卡显式决定;档位值单源在 dispatch-gates 常量,⛔ 本文不写模型名。 +- 下限档给机械卡(正确性由门禁农场机械判定)。 +- 默认判断档给 M/L、裁决实施与任何带设计判断的卡;拿不准就升一档。 +- 上限 = 契约复审档(`CONTRACT_REVIEW_TIER`),给最重协议/流程/编排卡,按卡取用非新默认。 +- 强制条款①:凡改协议语义面的卡一律契约复审档。 +- 协议语义面 = 本 `SKILL.md`、决策框架拷贝所在文件、`.claude/agents/os-dev.md` 与 `skills/**`。 +- 仅 `references/**` 面、或治理面上一行级机械文本改动的卡,降为默认判断档施工。 +- 发布的 `skills/**` 整根随 `npx skills add` 发运,⛔ 无一行级豁免,逐行判机械不作数。 +- 纯机械一行 PM 酌定可至下限档;降档施工的补偿控制 = 复核席跑契约复审档。 +- 降档施工只经契约复审档复核到达维护者,⛔ 不新增标签不新增链。 +- 强制条款②:放宽接受集或扩大公开面的卡默认判断档施工;命中即 spec 车道的活。 +- 条款②判据即代裁的机械边界测试与 `references/lanes/spec.md` 席内分派判据,⛔ 不另抄。 +- 负边界:运行时权限/安全行为变更不是条款②,归人工地板安全/权限边界类。 +- 条款②只指已发布契约面,拉回已声明契约不触它;卡面复述仍是条款②。 +- 删已发布契约文本本就否定的误拒本身是 `no`;该 `no` 须引那段文本,缺引即读作缺申报。 +- 引文不符 ⇒ 降为 `yes`;裁决守卫、安全拒绝、失败关闭是刻意拒绝非误拒,删之 `yes`。 +- 错误码已发布面 = `ERROR_CODE_LEDGER`/`StandardErrorCode`:新码恒 `yes`,无门亦然,漏登即缺口。 +- 机械放宽判别门禁落地前,入队前的席内契约复核是方向自述的补偿控制。 +- 豁免够不到的地板只有维护者裁决能设。 +- 席位档策略:skills 车道外的执行席与分诊席默认判断档会话。 +- 条款②自审资格按车道:spec 与 skills 席达档席内审;未达档 ⛔ 不自审,起隔离达档子代理。 +- 降档出口两条:额度耗尽豁免,与主动预降(余量吃紧可预先降档)。 +- 额度耗尽豁免仅当契约复审档实测不可用才落默认判断档,⛔ 不再往下。 +- 降档的档位与理由记入认领评论 Container & model 行;档位逐次派发显式传参,永不省略。 +- 解析顺序、pin 语义与允许名单回退陷阱以 os-dev 定义 frontmatter 注释为权威。 +- 分诊 suggestion 行是输入不是决定,不采纳给理由。 +- 派发词 ⛔ 默认不整段粘贴 issue 正文:让 dev 自己读全文与全部评论并自查正文完整性。 +- 派发词只带增量,构造细则与条款原文见 `references/dispatch-runbook.md`。 +- 派发词引卡片的精确断言(schema 臂、判据、原文)一律逐字,⛔ 不释义转述。 +- 三分区:裁决(不可重裁)/ PM 机制假设(须实测,鼓励证伪)/ PM 建议的路线(可选,实测优先)。 +- 凡我觉得可以这样的一律降到第三区;⛔ 不把假设写成裁决。 +- 标准非协商条款 ⛔ 不抄进派发词:hook 已机械强制段与 os-dev.md 已载通用段砍掉。 +- ⛔ 不砍卡类特有约束:ADR 类 draft-only、tier 推导引用、棘轮实况、释义纪律。 +- 无条件条款只住角色文件,冲突时它胜、错了修那里,⛔ 不靠派发词临时覆盖。 +- 终报要求随派发词带一句:只收机器可核字段(gates / line_budget / deviations / files_changed)。 +- 派发令恒带 `Writes:` 行:只走 REST 代理、写预算(端点清单)、`mcp_calls` 计数,dev 两数都报。 +- 清单、路径、行号在派发那一刻从树上取,⛔ 不从卡片/上次派发/记忆抄。 +- 门禁清单取 `dispatch-gates --commands --repo 仓` 逐条跑,退出码先落盘,`--ran` 对账;被拒即手推。 +- 点名单是线索不是规格,dev 对实际改动重取补跑;行级断言转述前必须自己重验。 +- 派发令里关于代码的危害断言必须有读数(点名 call site / 路径 / 迁移)。 +- 搬自任何工件(含己文)本轮未亲测计数/零命中/文件面:重测或注「未验证」点名来源。 +- PM 测不了的危害 ⇒ 写成给 dev 的问题,⛔ 不写成栅栏;人工地板栅栏关于流程,免测量。 +- 派发令写明 dev ⛔ 不另留认领:PM 那条即身份;核对最新一条点名本分支,不符停手回报。 +- 已认领、别动 assignee 收窄到 assignee 字段本身;认领协议已满足是另一句话且可能是假的。 +- 触 `skills/**` 的卡,派发词必带 PM 定的净增行数预算(按 feature 大小定,小功能给小数)。 +- dev 装不下预算 ⇒ 停手回报,⛔ 不自行扩写、不自行抬预算。 +- 对外发布的技能包是平台最大的对外价值,评估恒整包整体。 +- 文件面写两句:预期落点;生产者在别包时修生产者侧并报落点,⛔ 不在消费者侧打补丁。 +- same-day churn 行:当天合并 ⇒ 先核对当前 main;在飞重叠每轮求交,相交即发四句警告。 +- 被在飞重叠完全覆盖就停下回报,⛔ 不硬造 diff。 +- 翻转公开语义的裁决随卡带全仓 pin 清扫,两句缺一不可,原文见 runbook。 +- 拒收用例 ⇒ `code`+`status` 最低断言;过滤/谓词语义 ⇒ 编译面清单逐面申报,⛔ 静默略过。 +- 资源与后端:S 级机械 + M ⇒ `mode:subagent`;S 级但不机械(判断面在设计不在门禁)按 M 待遇。 +- `mode:cloud` 只保留给 L/XL、活过 PM 会话的工作、浏览器/dogfood 验证;build 重的 M 卡逐卡判。 +- 归档义务只落在云卡;OOM 死的单独重派;判定连同档位写进认领评论。 +- 一次性云卡用 `create_session`,⛔ 不用 create_trigger+fire;trigger 流只留给定时/重复型。 +- 云会话 `SendMessage` not-reachable 是设计非故障,⛔ 不复测。 +- 接手中断的 dev:先试 SendMessage 复活,不可用才走接手协议,⛔ 不重跑原派发词。 + +## 收集 + +- 报告通道统一:GitHub 是两种模式共用的真相源;dev 终报先落 issue 评论、再作返回消息。 +- 收集先扫 GitHub,标记评论在 = 报告完整;两处皆无才进探活/判死。 +- 标记两种拼写等效(HTML 注释形、首行 `os-dev-report`);⛔ 永不把没收到失败通知读作还在跑。 +- 探活是每轮巡检的固定动作;完成通知不可靠,缺席什么都不证明。 +- ① 巡检首动作 `list_triggers` 确认 Routine 启用,在飞重挂加速器;唤醒归 Routine,漏挂不断链。 +- ② 在飞期间主巡检间隔 ≤45 分钟,待命期 60–70;节奏维护者明示可改。 +- ③ 已派发未回报的 dev 逐个发状态询问;派发后 ~45 分钟无远程产出即到门槛。 +- 已有远程分支/PR 不豁免探针。 +- ④ 活着 ⇒ 进度与阻塞点;回 no active task; resumed from transcript ⇒ 生前已死,询问即复活。 +- ⑤ 判据永远取正向证据:分支、PR、报告、探活回包。 +- 判死只有三类依据:探针回包表明已死;宿主明确回报 stopped;超过本车道基线且连续静默。 +- 基线 = 本车道实录派发 → 推分支/开 PR 的端到端耗时,三五单即可用,⛔ 非本文任何常数。 +- `mode:cloud` 的 ~2h 静默是本轮收集边界(记 `blocked` 移步下轮),也不是判死。 +- 停摆永不自愈:携带任务中途状态的完成通知本身就是停摆信号。 +- 报告末句是意图不是结果 = 停摆非完成:当刻 SendMessage 续派,⛔ 不读作交付、不判死。 +- 停摆 ⇒ 立刻 SendMessage 附前台执行姿态句,⛔ 不等任何静默阈值(阈值是给没有回答的)。 +- 复位走梯度,每次比上一次更具体;第三次停摆判 unreliable,按接手协议重派。 +- 通知重放先算身份再读内容:与已验收那份同身份 ⇒ 记重放即结束。 +- 直接验收兜底:(a) draft PR 在且 CI 全绿 + (b) 探活确认已死或 ≥2h 无推送 + (c) 报告未达。 +- 三条件全立 ⇒ 直接按 PR 验收,复核判据不减;先探活后翻 ready。 +- 舰队级死因(全账号断粮)下取 (a)+(c) 照常收口,PR body 就是报告。 + +## 复核 + +- 你是记录在案的复核人:对 GitHub 核验,⛔ 不对报告的自述核验。 +- 逐项判据展开在 `references/review-checklist.md`,每份报告对着它过。 +- PR 形态与范围:draft、目标 `main`、`Fixes`/`Part of` 首行判据,翻 ready 前亲核。 +- `Part of` 卡 MERGED 时点收口;changed files 范围与 changeset/`skip-changeset` 分流;测试证据。 +- 改到已有 `.changeset/*.md` 的 PR ⛔ 不打 `skip-changeset`;确认取维护者原话或出处三件转述。 +- 报告在草稿 PR 时点到达,CI 收敛读数只属于复核侧:gate `in_progress` 是诚实读数。 +- 绿色输出≠ 该绿证明了被测风险:拒收断言、全绿方向与时序、pin 翻转、边界后收益。 +- 触 `skills/**` 的 PR 加问整包价值密度:从整包加载的客户 agent 座位读,⛔ 不从作者座位读。 +- 超派发预算或小功能大扩写 ⇒ REWORK,⛔ 不因已经写好了放行。 +- 判决 ACCEPT:issue 英文短评论,核对清单结论 + 抽查读数 + 偏差,链接 PR,⛔ 不复述其叙事。 +- `mcp_calls` 点名写工具(`settings.json` deny 清单 + `update_pull_request`)⇒ 拒收,⛔ 不带注放行。 +- 判决 REWORK:逐项反馈,同认领重派;补丁轮优先 SendMessage 续派原 dev;最多 2 轮,第三次升级。 +- 判决 ESCALATE:见 SKILL.md 〈升级与决策〉。 diff --git a/.claude/skills/pm-dispatch/references/external-contributions.md b/.claude/skills/pm-dispatch/references/external-contributions.md index 8525132b71d..670116c2ff3 100644 --- a/.claude/skills/pm-dispatch/references/external-contributions.md +++ b/.claude/skills/pm-dispatch/references/external-contributions.md @@ -1,6 +1,6 @@ # 外部贡献:fork PR 是提案,不是交付 -见 SKILL.md 〈入队与落地〉的 fork PR 行;本文是 fork PR(head 仓 ≠ base 仓)进场到落地的四步。 +见 landing-operations.md 的 fork PR 行;本文是 fork PR(head 仓 ≠ base 仓)进场到落地的四步。 席位永不翻 ready、入队、挂 auto-merge 或批准它;席位复审是必需输入,⛔ 永不是放行许可。 - ① 先立卡:分诊 fire 扫 open PR 中 head 仓 ≠ base 仓者;无卡的按 PR 正文立卡,常规定级。 diff --git a/.claude/skills/pm-dispatch/references/filing-gate.md b/.claude/skills/pm-dispatch/references/filing-gate.md index 7f273778e71..279a431650e 100644 --- a/.claude/skills/pm-dispatch/references/filing-gate.md +++ b/.claude/skills/pm-dispatch/references/filing-gate.md @@ -1,6 +1,6 @@ # 立卡门与定级判据 -见 SKILL.md 〈分诊座位职责〉与〈平台读数纪律〉的指针行;本文是「什么才算一张卡」与 +见 triage-duties.md 与 reading-discipline.md 的指针行;本文是「什么才算一张卡」与 定级、读数三组判据的执行说明。 ## 立卡门 diff --git a/.claude/skills/pm-dispatch/references/instrument-discipline.md b/.claude/skills/pm-dispatch/references/instrument-discipline.md index a260eea766b..235d5cc9a3a 100644 --- a/.claude/skills/pm-dispatch/references/instrument-discipline.md +++ b/.claude/skills/pm-dispatch/references/instrument-discipline.md @@ -1,6 +1,6 @@ # 仪器纪律 -见 SKILL.md 〈平台读数纪律〉的指针行;本文是仪器的分界、授权与工具位次序。 +见 reading-discipline.md 的指针行;本文是仪器的分界、授权与工具位次序。 - 硬门禁只答有确定答案的问题:受管登记表、队列守卫、CI 测试、复核记录在不在。 - 判意图的仪器(放宽 tell、半状态巡查)只印读数 ⛔ 不挡落地,误报由席位一句话推翻。 diff --git a/.claude/skills/pm-dispatch/references/landing-operations.md b/.claude/skills/pm-dispatch/references/landing-operations.md index a32840f4abb..bec4b55d415 100644 --- a/.claude/skills/pm-dispatch/references/landing-operations.md +++ b/.claude/skills/pm-dispatch/references/landing-operations.md @@ -1,6 +1,38 @@ # 入队与落地细则 -见 SKILL.md 〈入队与落地〉;本文是 ACCEPT 之后把 PR 送到 MERGED 的操作细则。 +执行席在落地窗口(ACCEPT 之后至 MERGED)读本文;入队与落地条款与 A–D 操作细则都在此。 + +## 入队与落地 + +- fork PR = 提案,席位永不放行;采纳 diff 内部落地,见 `references/external-contributions.md`。 +- 条款②入队闸门:翻 ready / 入队前先取 PR 实际 diff;diff 是事实,卡片语义是预测。 +- `--tier` 嫌疑行是提示非裁定;双肢命中任一 ⇒ 无达档条款②复核 PASS 在案 ⛔ 禁止入队。 +- 路径肢 = diff 触及契约面 `packages/spec/src/**`,含 error-code-ledger 与 `*.zod.ts` 契约 schema。 +- 声明肢 = 认领评论声明 `Clause-②: yes`,与路径无关;错误的 `no` 是可审计的假申报。 +- 交付后复核按面欠 ⛔ 不按车道(五面见 `references/contract-review.md`);双肢命中即 spec 车道。 +- 子代理起不来 ⇒ 复核缺席,PR 留 draft 队列外等档;唯一旁路是维护者亲审,逐次为准。 +- PASS ⇒ ready、auto-merge;FAIL ⇒ 补丁轮;⛔ 免复核不放行。 +- 真正设计分叉照旧进决策箱,席内复核 ⛔ 不替代维护者裁定。 +- 外部评审链降为可选事后审计,非放行前提。 +- 契约复核的适用面、资格与归属见 `references/contract-review.md`。 +- 碰生成物的 PR 入队前先同步 + 整体重生成:四步序 `bash scripts/pm/os-regen-merge.sh`。 +- 跟到 MERGED 为止,入队后的看护归车道 PM 的落地窗口:每轮同时读队列分支与 `origin/main`。 +- 默认分支 push 即触发对外部署的仓,只在验证层存在时才合并;无验证层 ⛔ 不合并。 +- 验证层 = 部署以 CI 为闸、发布后探测线上面、失败自动回滚并立卡。 +- 该类仓的落地判据是已发布且探测通过,⛔ 不是 MERGED;跟到发布为止。 +- 合并后工作流不在 PR 检查清单上,读 PR 检查的规则对它全盲;按独立检查类登记分开读。 +- 人闸不是验证层的替代:答不了会不会坏的人闸只买延迟,⛔ 不以人闸代替探测。 +- 信任 suite/check 事件前先重读 PR 对象取 head:检查读数绑定该 head,⛔ 不绑事件带的 SHA。 +- 落地记账:座位贴落地清单即账本,逐轮即时记;确需全仓核对时首选 `head:claude/` 精确过滤。 +- 红/踢出处置在同一落地窗口内做:机器输入是 merge-queue triage workflow 的分诊评论。 +- 判据唯一来源是签名台账(锚点 issue),优先于现场判断;只有人工能升级台账。 +- 疑似新 flaky 只留提请,⛔ 不自行加表;纯计数不追记,只有改变修法作用域时才记。 +- 四分支:已知 flaky ⇒ 原样重投;已修签名再现 ⇒ ⛔ 不重投,判新问题重新诊断。 +- 基上缺已合修复 ⇒ merge main 推新提交,重跑无效。 +- 新签名 ⇒ ⛔ 不重投,在 PR 与其 `Fixes` 卡各留完整签名与初判。 +- 每次处置留审计评论,重投写签名与台账依据。 +- 依赖前棒才能转绿的 PR:draft 停放 + 签名级预期红清单 + 解除条件,见 landing-operations C。 +- 多个已实现 PR 全碰生成物 ⇒ 串行接力一次只放行一个,每棒一整圈,见 landing-operations D。 ## A. 碰生成物的 PR:入队前先同步 + 整体重生成 diff --git a/.claude/skills/pm-dispatch/references/lanes/cli.md b/.claude/skills/pm-dispatch/references/lanes/cli.md index a01f898ae54..fde20bf74f0 100644 --- a/.claude/skills/pm-dispatch/references/lanes/cli.md +++ b/.claude/skills/pm-dispatch/references/lanes/cli.md @@ -1,6 +1,6 @@ # 车道岗位说明:domain:cli -见 SKILL.md 〈座位贴协议〉;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 +见 seat-lifecycle.md;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 ## 范围 diff --git a/.claude/skills/pm-dispatch/references/lanes/devx.md b/.claude/skills/pm-dispatch/references/lanes/devx.md index 1ac1cb890b5..08dddf988a6 100644 --- a/.claude/skills/pm-dispatch/references/lanes/devx.md +++ b/.claude/skills/pm-dispatch/references/lanes/devx.md @@ -1,6 +1,6 @@ # 车道岗位说明:domain:devx -见 SKILL.md 〈座位贴协议〉;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 +见 seat-lifecycle.md;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 ## 范围 @@ -16,7 +16,7 @@ - `content/docs/releases/**` 是 release-owned,恰两条通道;发布页作用域只管 v16 及以后。 - 通道一:完整性缺口逐卡批准,⛔ 不构成先例。通道二:事实错误走专用 docs-only PR。 - ⛔ 不做任何发布动作,含改根 `version` 脚本链;能点绿的门禁不等于该点绿。 -- 受管面 PR 照 SKILL.md 〈复核〉的路径分叉执行,⛔ 此处不另抄。 +- 受管面 PR 照 SKILL.md 〈路径分叉〉的路径分叉执行,⛔ 此处不另抄。 - 设计如此的红门禁必须在 PR 上说明红因并声明不修。 - changeset 按 publish 面判:根 `scripts/`、docs、test-only ⇒ `skip-changeset`。 - 落进已发布包的源 ⇒ 真 changeset。 diff --git a/.claude/skills/pm-dispatch/references/lanes/engine.md b/.claude/skills/pm-dispatch/references/lanes/engine.md index 206d92bd75a..29006cc363e 100644 --- a/.claude/skills/pm-dispatch/references/lanes/engine.md +++ b/.claude/skills/pm-dispatch/references/lanes/engine.md @@ -1,6 +1,6 @@ # 车道岗位说明:domain:engine -见 SKILL.md 〈座位贴协议〉;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 +见 seat-lifecycle.md;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 ## 范围 diff --git a/.claude/skills/pm-dispatch/references/lanes/hotcrm.md b/.claude/skills/pm-dispatch/references/lanes/hotcrm.md index 37affadec28..a55d2572fb0 100644 --- a/.claude/skills/pm-dispatch/references/lanes/hotcrm.md +++ b/.claude/skills/pm-dispatch/references/lanes/hotcrm.md @@ -1,6 +1,6 @@ # 车道岗位说明:repo:hotcrm -见 SKILL.md 〈多仓协调〉;本文是本席的岗位说明,现值状态恒在座位贴,⛔ 不迁入本文件。 +见 cross-repo-coordination.md;本文是本席的岗位说明,现值状态恒在座位贴,⛔ 不迁入本文件。 ## 形态 diff --git a/.claude/skills/pm-dispatch/references/lanes/services.md b/.claude/skills/pm-dispatch/references/lanes/services.md index 80c3edbe06f..1f3fd84cf4e 100644 --- a/.claude/skills/pm-dispatch/references/lanes/services.md +++ b/.claude/skills/pm-dispatch/references/lanes/services.md @@ -1,6 +1,6 @@ # 车道岗位说明:domain:services -见 SKILL.md 〈座位贴协议〉;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 +见 seat-lifecycle.md;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 ## 范围 diff --git a/.claude/skills/pm-dispatch/references/lanes/skills.md b/.claude/skills/pm-dispatch/references/lanes/skills.md index fdacb3441ed..23dfc8f9a5c 100644 --- a/.claude/skills/pm-dispatch/references/lanes/skills.md +++ b/.claude/skills/pm-dispatch/references/lanes/skills.md @@ -1,13 +1,13 @@ # 车道岗位说明:domain:skills -见 SKILL.md 〈座位贴协议〉;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 +见 seat-lifecycle.md;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 ## 范围 - 两个技能根:`.claude/skills/**`(含 pm-dispatch 本体)与 `skills/**`(发布目录,恒英文)。 - PM 循环工具与指令架构文件的归属见 SKILL.md 域车道表 `domain:skills` 行,⛔ 不另抄。 - 受管面治理执行文件:`.github/CODEOWNERS` 路由半边 + SUBJECT 是受管面本身的门禁/审计脚本。 -- 全量判据在 SKILL.md 域车道表;受管面定义与两层分档见 SKILL.md 〈复核〉,⛔ 不另抄。 +- 全量判据在 SKILL.md 域车道表;受管面定义与两层分档见 SKILL.md 〈路径分叉〉,⛔ 不另抄。 - QA 管理循环执行归本席;qa-run 记录是协议载体不是工作。 - 契约复核归派发席席内、决裁勤务归项目总监席(`director.md`);本席保留 skill 与治理文本。 diff --git a/.claude/skills/pm-dispatch/references/lanes/spec.md b/.claude/skills/pm-dispatch/references/lanes/spec.md index c6afe898db6..14a4668a1cf 100644 --- a/.claude/skills/pm-dispatch/references/lanes/spec.md +++ b/.claude/skills/pm-dispatch/references/lanes/spec.md @@ -1,6 +1,6 @@ # 车道岗位说明:domain:spec -见 SKILL.md 〈座位贴协议〉;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 +见 seat-lifecycle.md;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 ## 范围 diff --git a/.claude/skills/pm-dispatch/references/lanes/triage.md b/.claude/skills/pm-dispatch/references/lanes/triage.md index e6bcb3eb0ee..02d400c3762 100644 --- a/.claude/skills/pm-dispatch/references/lanes/triage.md +++ b/.claude/skills/pm-dispatch/references/lanes/triage.md @@ -1,5 +1,5 @@ # 席位章程:分诊席(Triage) -见 SKILL.md 〈分诊座位职责〉;本文是本席的岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 +见 triage-duties.md;本文是本席的岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 - 分诊每 fire 只取一个仓,两仓轮替:objectstack、objectui、objectstack……;仓内按最旧优先。 - 饥饿守卫:轮次开始时任一仓最旧未路由卡超过 4 小时,该仓本轮优先,不论轮到谁。 diff --git a/.claude/skills/pm-dispatch/references/lanes/ui.md b/.claude/skills/pm-dispatch/references/lanes/ui.md index 90f732320ed..883f9261656 100644 --- a/.claude/skills/pm-dispatch/references/lanes/ui.md +++ b/.claude/skills/pm-dispatch/references/lanes/ui.md @@ -1,6 +1,6 @@ # 车道岗位说明:domain:ui -见 SKILL.md 〈多仓协调〉;本文是本席的岗位说明,现值状态恒在座位贴,⛔ 不迁入本文件。 +见 cross-repo-coordination.md;本文是本席的岗位说明,现值状态恒在座位贴,⛔ 不迁入本文件。 ## 形态 @@ -10,15 +10,15 @@ ## 范围 -- 三流分流的残余流归本席:发布库 `@object-ui/*` 与 `apps/*`,判据见 SKILL.md 〈多仓协调〉。 +- 三流分流的残余流归本席:发布库 `@object-ui/*` 与 `apps/*`,判据见 cross-repo-coordination.md。 - objectui 的 `domain:devx` 与 `domain:spec` 卡归各自跨仓车道,⛔ 不归本席。 - 落点不明留分诊首触,⛔ 不猜、不代判。 ## 常设承诺 -- 构建产物经 `pnpm objectui:refresh` 回流,见 SKILL.md 〈多仓协调〉。 +- 构建产物经 `pnpm objectui:refresh` 回流,见 cross-repo-coordination.md。 - 回流后的 console pin bump 是 objectstack 的单张卡,⛔ 永不做本仓 PR 的 rider。 -- 新 `packages/spec` 工作恒归 `domain:spec` 席,已派发卡 ⛔ 不因此转席,见 SKILL.md 〈多仓协调〉。 +- 新 `packages/spec` 工作恒归 `domain:spec` 席,已派发卡 ⛔ 不因此转席,见 cross-repo-coordination.md。 - `scripts/pm/**` 单写手恒在 objectstack 侧 ⇒ 本席的工具需求走上游卡带 `Blocked-by:` 回链。 - 本仓标签/assignee 写走 objectstack `label-write.mjs --repo`,⛔ 不 MCP `issue_write`;被拒转有通道席。 - 受管面五项含仓根发布 `skills/**`,清单、判据与禁令见 objectui AGENTS.md §9 受管面段。 diff --git a/.claude/skills/pm-dispatch/references/platform-readings.md b/.claude/skills/pm-dispatch/references/platform-readings.md index 5eb7c62301e..eea021a8e53 100644 --- a/.claude/skills/pm-dispatch/references/platform-readings.md +++ b/.claude/skills/pm-dispatch/references/platform-readings.md @@ -1,6 +1,6 @@ # 平台读数事实表 -见 SKILL.md 〈平台读数纪律〉;本表是 GitHub API 与工具行为的读数事实,操作时查阅。 +见 reading-discipline.md;本表是 GitHub API 与工具行为的读数事实,操作时查阅。 ## 队列成员资格与 auto-merge diff --git a/.claude/skills/pm-dispatch/references/reading-discipline.md b/.claude/skills/pm-dispatch/references/reading-discipline.md new file mode 100644 index 00000000000..0c35a5e5273 --- /dev/null +++ b/.claude/skills/pm-dispatch/references/reading-discipline.md @@ -0,0 +1,37 @@ +# 平台读数纪律 + +任一座位在取读数、引读数或核验 main 的那一刻读本文,所有 fire、所有阶段。 + +- 判据取命令输出,⛔ 不取 API 字段字面值、不取本地工作树、不取看着相邻的日志。 +- GitHub API 与工具行为的实测事实表在 `references/platform-readings.md`,做对应操作的那一刻查阅。 +- 核验 main 用 `origin/main`:先 fetch,再 `git grep PAT origin/main -- PATHS` 或 `git show origin/main:PATH`。 +- ⛔ 不用共享检出的工作树核验 main,它的 HEAD 由别的 agent 摆布。 +- 零命中须配同主体必中词,否则该零作废;同主体 = 同语料/路径形/包界/引法/失效形态。 +- 同仪器的控制词双零是仪器坏,⛔ 不读作缺席:换法重画再报;哑火仪器与干净结果同值。 +- 控制通过 ≠ 问题问对:零命中须写仪器可达半径与一个必在半径外的已知目标。 +- 半径按形态写(内容/文件名/声明/字段);所求在半径外 ⇒ 零非读数,换看得见它的仪器。 +- 零的三件判据、目录约定、精确名与枚举配额见 `references/filing-gate.md` 的〈读数判据〉。 +- 正命中须答谁打印/执行它,否则不证缺陷仍活;注释/文档块/夹具/修复的回归 pin 不算。 +- 他人据以行动的读数须带单位并答什么本来会让它不是这个值;递 dev 的恒标线索非答案。 +- ⛔ 自用即弃的探针不欠此税;「不是这个值」的答案取逐字工件或具名反例。 +- 仓不可达 ⛔ 不当查过了干净:在 issue 上贴出给对应座位的现成命令,等读数回贴再派。 +- 读数与认领等座位文本恒带 UTC 取数时刻 `YYYY-MM-DDThh:mmZ`;树读数另带 ref/tip,无者按未取。 +- 失效修法按序取:先删容许出错的构造,再让正确形态成唯一拼写,最后才加检查。 +- 门禁两次误报(假红、实测假绿、处方句点名不存在路径)⇒ 删肢或删门禁,PR 引两次测量。 +- 只有护产品落地或用户可见契约的门禁才立修复卡;门禁上「稳定 > 功能」= 更少零件。 +- 自设定时器的文本以先重读状态开头,只写关键判据(若 X 则 Y),其余指针化。 +- 定时器文本 ⛔ 不写结论、不含未经重读即可执行的祈使句。 +- 放行认门禁 job 的结论(`completed: success`),⛔ 不认聚合读数。 +- advisory 门禁红着进 main 是共享损伤,任何车道发现都立即止血并立单,见 landing-operations B。 +- 仪器纪律(硬门禁面、只报告面、新增授权、工具位)见 `references/instrument-discipline.md`。 +- dev 自己死了不等于维护者中止:子代理消失是正常死法,走接管(见 execution-duties.md 认领)。 +- 维护者中止只认原话或宿主回报 stopped by the user,⛔ 不据推断立无重启条件的门。 +- 共享基础设施修复入队前按症状复查 main,不按 issue 号。 +- 立卡者自跑查重并写下查询与命中数(含 closed);判重仍归分诊,比数值与作用域定关哪个。 +- sweep 晋级与立卡的前提要对此刻的 main;dev 带证据的零实现停手是好产出,不当返工计。 +- 裁决明令的动作实施中测出对向事实 ⇒ 照字面执行,被打断行为的 pin 反转为拒绝 pin。 +- 对向事实下 ⛔ 同 PR 不做任何 promote/回退;pin 是反转不是删除。 +- 冲突立成 `needs-user-decision` 卡,该 PR 不挂 auto-merge 留异议窗口。 +- 读序 git、payload、REST、MCP;REST 可达性逐会话探一次;通道对照见 `references/rest-channel.md`。 +- 派发前读一次 `rate_limit`,余量装不下整批就减批,⛔ 不靠撞墙发现。 +- 写少而大:同卡同轮结论合成一条评论,⛔ 不放慢单笔、不攒着一次性发;写量按身份计。 diff --git a/.claude/skills/pm-dispatch/references/review-checklist.md b/.claude/skills/pm-dispatch/references/review-checklist.md index a170da565a7..025ede6ae21 100644 --- a/.claude/skills/pm-dispatch/references/review-checklist.md +++ b/.claude/skills/pm-dispatch/references/review-checklist.md @@ -1,6 +1,6 @@ # 复核清单细则 -见 SKILL.md 〈复核〉;本文逐项展开每份 dev 报告的复核判据,对着它过。 +见 execution-duties.md 〈复核〉;本文逐项展开每份 dev 报告的复核判据,对着它过。 ## PR 形态与卡片关系 diff --git a/.claude/skills/pm-dispatch/references/seat-lifecycle.md b/.claude/skills/pm-dispatch/references/seat-lifecycle.md new file mode 100644 index 00000000000..281bd8d179b --- /dev/null +++ b/.claude/skills/pm-dispatch/references/seat-lifecycle.md @@ -0,0 +1,96 @@ +# 座位生命周期(开轮、座位贴、收班) + +每个座位每次 fire 读本文:开轮互斥读数之前读〈开轮互斥〉,收班之前读其余各节。 + +## 开轮互斥 + +- 开轮互斥:fire 开始、首个写动作之前读四个读数,未收班活动任一未满一轮 ⇒ 自退。 +- 读数一、二:最近的收班简报,与晚于它的最新开轮标记。 +- 开轮标记是轮中会话在座位贴上的唯一痕迹;标记可漏写,认领不可省。 +- 读数三:本车道 `pm:dispatched` ∪ `pm:queue` 卡最新非本 session 同席号的 `Claim:` 评论。 +- 或收班简报后卡分支有推送(逐卡 `git ls-remote`):推即认领,欠一条 `Claim:`。 +- 读数四:本车道 `state=CLOSED` 按 `updated_at` 降序首张带同席号 `Claim:` 卡的 session ID。 +- 评审链与总监席的笔迹是跨席作业不算占席;读数三、四只增加自退、永不清座位。 +- 总监席多场并行、无在任者:读数一、二与自退对它不成立;`domain:*` 席互斥照旧。 +- 同 session 的 subagent dev 认领不触发自退,甄别靠分支。 +- 收班简报是前任不再写的显式声明,是释放标记不是锁:简报即最新事件 ⇒ 立即坐席。 +- 滞后标题是进场顺手修的半状态,⛔ 不是阻塞;简报点名的留守尾巴作围栏。 +- 维护者明示召唤是仲裁:有简报径直坐席;无简报才走保守确认,确认终止即坐席。 +- 互斥清 ⇒ fetch 后 SKILL.md、阶段 references、本席章程的最新触碰 sha 走 `git-history.mjs touch`。 +- 异于上一开轮标记即先重读;留开轮标记(session ID + fire 时刻 + 该触碰,注明重读)再跑轮。 +- 同读 harness 载入面 `.claude/**` 的最新触碰与内容是否已在共享检出 HEAD。 +- 否 ⇒ 记座位贴,自然收班时换会话,⛔ 不中断批次;读数走 `scripts/pm/check-harness-current.mjs`。 + +## 座位贴协议 + +- 贴 = 座位(标签 `pm:seat`),正文固定四段现值:当前 PM / 继承台账 / 热文件串行队 / 说明。 +- 正文只由在任座位 PM 编辑且为权威;标题与 assignee 是派生视图,三者同笔更新。 +- 标题只放慢状态,快状态留在说明段。 +- 维护者强制接管令取席位、队列、未起工卡与待落地 PR;⛔ 不取在飞卡,由原认领者跟完。 +- 子代理 dev 的返回消息、探活与续派只在派发会话;落地或 `Release:` 后归新席位。 +- 范围与常设承诺是岗位说明不是状态,版本化在 `references/lanes/.md`。 +- 贴内只放指向车道文件的指针,升级走技能 PR,⛔ 不手抄接力。 +- 写侧刷新点 = 轮次边界;中途状态由卡上 claim/ACCEPT 评论承载。 +- 读侧只读贴正文 + 晚于正文最后编辑的评论;刷新前读完评论、回执未读敲门,再刷。 +- 热文件串行队是正文具名段:区域写不清就只能整文件串行。 +- 座位贴每仓登记合并是否对外发布及其验证层;登记缺失视为未验证。 +- 无心跳,活性惰性判定:超过一天无自有产出即可降级回收。 +- ⛔ 永不从贴的 `updated_at` 或标题推死活;活性只认在任者自己的产出。 +- 竞态三招:动手前重 fetch 正文、审计评论时间戳先到先得、写后回读。 +- 收班 = 状态 flush + 在飞显式安置,不是在飞归零;收班简报是最终一笔。 +- 离任留守只写简报点名的项,⛔ 不读队列、不新派发、不碰未点名卡。 +- 换班报告默认零建议,只收三类:原则错/缺、可机械化项、平台事实变化。 +- 原则错/缺 → skills 席专题;可机械化项 → 门禁/脚本卡,⛔ 不是散文。 +- 平台事实变化 → references 事实表改一行。 +- 三类以 `finding` 入 skills 车道由该席分诊;三类之外默认关 not planned。 +- 接管/移交 = 改正文 + 审计评论(只作审计);收尾清单等细则见 `references/seat-post-protocol.md`。 +- epic 委托不入座位贴体系;新 `packages/spec` 工作恒归 spec 座位。 + +## Epic 子树车道 + +- 大开发与跨层功能点(spec/运行时/前端)整体委托一个专职 PM 会话:`/pm-dispatch epic:#`。 +- 委托信号成对落地:父单打 `pm:epic` + 正文写会话 ID 与声明的文件领地。 +- epic 立卡挂父单、打 `pm:epic`,⛔ 永不 `pm:queue`;`label:pm:epic` 即父子保留全集,域座位不取。 +- 队列 = 子树 open 未认领 sub-issue,每轮重读不缓存;其它 PM 候选获取跳过整棵子树。 +- 域座位批次选择读一次 `label:pm:epic` 索引,避开领地相交;epic PM 不兼任 `domain:*` 座位。 +- 认领纪律全套照做:先写标签、再 `Claim:`、再全线程重读;认领后 `pm:epic` 留在卡上。 +- 离开子树(交车道或转 spec 座位)同一笔标签写摘 `pm:epic` 加 `pm:queue`。 +- `pm:epic` + `pm:queue` 同卡 = 半状态(保留兼移交);后者即已移交,取回走全套认领协议含重读。 +- 单车道仓(无 `domain:*`)开卡即认领合法;多车道仓域标签前置照旧,子树标记即保留。 +- 新立 spec/公共契约 sub-issue 照旧转 spec 座位队列,epic 侧写 `Blocked-by:`;衍生按三分留席。 +- 顺带发现只经立卡门:三类内缺陷才立,带查询与命中数;其余进 Acceptance notes 或座位贴。 +- 每次分流留一行审计评论;父单维护 checklist 汇总评论,决策仍锚在具体 sub-issue。 +- 收尾四步、僵尸回收与领地防撞细则见 `references/seat-post-protocol.md`。 + +## 轮次报告与节奏 + +- 每轮向维护者打中文轮次报告(chat 通道):issue → 判决 → PR 链接 → 备注的表。 +- 报告加升级项、代裁清单(分诊)、awaiting a human merge 项。 +- 报告含 `UNRECOGNISED` 行:对本轮门禁日志 grep `UNRECOGNISED` 逐行照录,`NOT APPLICABLE` 行也在内。 +- 健康指标五个:可派发库存(open `pm:queue` 未认领及趋势);决策箱(待维护者数)。 +- 决策箱指标还要点名带开放下游依赖的决策卡,从 `Blocked-by:` 反向索引现算。 +- finding 数与中位年龄:裸标签数即未定级数,hold 已换标不在内。 +- 裸卡数与中位年龄:sweep 析取①,未定级数另计析取④;老化 = 首触欠账。 +- 发版阻塞 = 三仓 `target:` 之和,归零 = 三张板都空;总 open 数刻意不在指标内。 +- Version Packages PR 默认永不催,挂着的发布 PR 是常态,⛔ 不进维护者摘要。 +- 唯一例外 = 重要修复已合 main 在等发布;提醒必须点名该修复与不发版的用户可见后果。 +- 波次收工点(执行席):① 收工点 = 会话内在飞归零,⛔ 不在复核中途压缩;云卡不挡。 +- ② 收工存档 = 上下文里的判断 flush 到 GitHub,随后立即派下一波,⛔ 不等人闸。 +- `/compact` 由维护者在终端会话择机执行,永远不是派发前提。 + +## 停止条件与待命 + +- 停:队列空或 `rounds` 用尽(仅一次性调用适用);一轮 ≥ 半数派发失败或升级;维护者打断。 +- 常设座位队列清空不等于退场,是切换待命姿态:巡检间隔按 `execution-duties.md` 收集节②。 +- 待命五项各以其主节为准,⛔ 此处不另抄:findings 配合;`pm:blocked`/`pm:on-hold` 解锁扫描。 +- 在飞/已入队 PR 跟到 MERGED;决策箱仅在报告中列出 ⛔ 不 nag;跨车道备忘跟进。 +- 退场只有两个入口:维护者交接令(走交接收尾清单),或被惰性回收。 + +## 断粮与跨墙恢复(5 小时用量墙) + +- 权威的墙信号是失败本身:撞墙报文里的重置时刻在那一刻可得、事前查不到,记下来。 +- 跨墙定时器:拿到重置时刻 ⇒ 一发定点(reset + 缓冲)优先。 +- 没有重置时刻 ⇒ 挂每小时 cron Routine,⛔ 不用 send_later 链。 +- 第一枪成功的 fire 跑恢复后删除 cron;fired 文本照定时器写法纪律。 +- 恢复 playbook 链的是既有规则:逐个探在飞云卡 → 直接验收兜底或 transcript 复活。 +- 随后重挂常规巡检 → 照常跑轮。 diff --git a/.claude/skills/pm-dispatch/references/seat-post-protocol.md b/.claude/skills/pm-dispatch/references/seat-post-protocol.md index 449b42ff359..43e007ee6ad 100644 --- a/.claude/skills/pm-dispatch/references/seat-post-protocol.md +++ b/.claude/skills/pm-dispatch/references/seat-post-protocol.md @@ -1,6 +1,6 @@ # 座位贴协议细则 -见 SKILL.md 〈座位贴协议〉;本文是接管、移交、回收那一刻要查的协议细则。 +见 seat-lifecycle.md 〈座位贴协议〉;本文是接管、移交、回收那一刻要查的协议细则。 ## 贴的四段与派生视图 diff --git a/.claude/skills/pm-dispatch/references/triage-duties.md b/.claude/skills/pm-dispatch/references/triage-duties.md new file mode 100644 index 00000000000..31dd43eea7b --- /dev/null +++ b/.claude/skills/pm-dispatch/references/triage-duties.md @@ -0,0 +1,120 @@ +# 分诊座位职责 + +分诊席每次 fire 开局读本文;本文是分诊座位的全部职责。 + +- 发版板(无板仓跳过)、查重/shadow 检查与代裁通道全仓照跑。 +- fire 开局只按名加载互斥检查所需工具,`ToolSearch` 用 `select:`;判定本轮有活才加载其余。 +- ⛔ 分诊 fresh session 开局不做泛关键词 ToolSearch;可验判据:空转轮 ~4 万 token 以内。 +- 工具加载纪律只约束分诊 fresh session 的开局;执行座位与 dev 不受约束。 +- 两级盘点:小时轮以 `since` 窗口读增量,锚 = 座位贴上一份收班简报的时间戳。 +- 查重缓存住席内:新会话全量拉,其后 `since` 增量;⛔ 不建分支、不共享、不依赖备份。 +- 每日一 fire 跑全仓全量对账并归集日频职责;选层按 fire 时刻 ⛔ 不用计数器,简报写明层。 +- 从不更新的卡不入窗;老化欠账归半状态巡查不归小时轮。 +- 每条枚举比对返回数与 `totalCount`,不等 ⇒ 报 `sweep INCOMPLETE` 点名缺口,⛔ 永不报干净。 +- Backlog sweep 是常设职责,每 fire 扫任一析取命中的卡。 +- 析取 ①:全裸(无 `pm:*`、无 `needs-user-decision`、无 `domain:*`)。 +- 析取 ②:有 `pm:queue` 无 `domain:*`(仅多车道仓);析取 ③:有 `domain:*` 无 pm-state。 +- 析取 ④:有 `pm:queue` 与 `domain:*` 而无 `priority:*`;②③④ 只取 `updated_at` 早于 ~2 分钟。 +- 排除 `tracking`、`status:parked`、全部 `pm:seat` 贴、`qa-run` 记录。 +- 半状态治愈积压 ②③④ 最老优先、P0 嫌疑先行,⛔ 优先最新不适用。 +- 首触定级与三析取 sweep 每 fire 跑到清空:⛔ 无每轮总量预算,清得动就多清。 +- 窗口耗尽未跑完的,下一 fire 从标签状态断点续跑。 +- 排序:队列每轮清空时最新优先;清不空的那一刻起改最老优先。 +- 裸卡数 >15 ⇒ 下一 fire 整轮改域分批集中模式,每批 ≤5 张同族卡,照样跑到清空。 +- 紧急卡直接分诊:维护者点名或 p0 嫌疑 ⇒ 立即起默认判断档分诊子代理,不等定时轮。 +- 紧急分诊的授权面 = 分诊本身,⛔ 不写码不认领;产出落卡,与定时轮分诊同格式同效力。 +- 跨仓 pin 链的窗口级兜底也在 sweep,⛔ 只立单不执行 bump。 +- objectui pin 落后且其队列已空 ⇒ 在本仓立/刷新 console bump 单。 +- 见新 tag 族发布 ⇒ 在 cloud 立 `.objectstack-sha` bump 单。 +- bump 单单张封顶:先查同题 open 单,已有就追评刷新;工具链新形态只提请不扩面。 +- 分类动作每张三选一,外加一个修复通道。 +- 裁定写方向、给六态之一。 +- 方向在 ADR/本卡裁决/不可重裁规则:贴 `check-prior-rulings.mjs` 的 `Prior rulings read:` 行,或不点。 +- `pm:queue` = 有具名落点或复现的具体缺陷,无可问之事;⛔ 工具/门禁修复不由此进。 +- `tooling` 入 `pm:queue` 仅当首行带 `Unblocks: #N`(open 产品卡)或点名所护的已发布面。 +- `pm:queue` 也收恢复不变量的 finding、test-only pin,与实现未被裁错的说明书脱节(修文档)。 +- `needs-user-decision` = 设计卡、feature/契约形状提案、需要 appetite 的多周程序。 +- 碰迁移形状或删已发布能力也进决策箱;说明书脱节不进:有裁定出处才是 (b),否则改文档。 +- 决策卡落卡必带四棱卡面块与其上的「维护者速读」,⛔ 不留待有人接手再补。 +- 决策卡的速读同题,用业务语言先讲事情与选项,末句只问一字:A/B/C 或是否。 +- 立卡门四类:① 缺陷 / ② 维护者决定 / ③ 直派任务 / ④ 协调节点,⛔ 其余一律不立卡。 +- 首行写立卡门类别 ①–④;四类定义、⛔ 清单、三答与配额见 `references/filing-gate.md`。 +- `finding` = 三类内待定级:(a) 可复现缺陷(复现或失败探针);(b) 违背已声明契约(引契约文); +- (c) AI 写元数据会被运行时拒收或静默丢弃的陷阱;其余进 PR `## Acceptance notes`,⛔ 不立卡。 +- (a) 的分界是不完整 vs 错误,不是文档 vs 代码:示例照抄即失败是 (a),漏列成员不是。 +- 门禁头注、self-test 文案与 `check-*` 处方句 ⛔ 非已声明契约;(b) 须用户或已发布包读得到。 +- (c) 元数据 = 由写它的人以外的人存储并再作者化的键:React prop 不是,存储的视图配置是。 +- 把作者引向运行时会兑现却让事情更糟的元数据的警告不在 (c) 内;记为边界,⛔ 不扩类。 +- (a) 须今天可达,(c) 须具名生产者;观察、休眠、零拉动 ⛔ 不立卡、不进汇总卡、无配额。 +- 只报告的仪器,报错不配 dev:猜意图的只印读数,误报席位一句推翻,⛔ 不立卡不派 dev。 +- Acceptance notes 前先答「哪个 PR 或人会碰到它」;答不出 ⇒ 仍然关,理由写「承接者:无」。 +- 先修复:正文被 sanitizer 截断的卡不可派发,评论修复指令后跳过。 +- 停摆指令判据必须比其它分类更硬(双读取),事后证伪同处公开作废。 +- 决策箱勤务:入箱校验/补全四棱块、速读与 `Prior rulings on this card:` 行;存量卡低频回填。 +- 入决策箱那一笔连「前提今天还成立吗」一起现读;改状态只需现读卡。 +- 线程有 `Ruling:`/RULED 的卡再入箱,该行逐 id 各一句变化;缺行 ⇒ 拒入,`pm:retriage` 回立卡者。 +- `type`(Bug/Feature/Task)是分诊固定产出,分诊席唯一权威生产;立单者可预填,分诊校正。 +- 判据:违背已声明契约 ⇒ `Bug`,扩大接受集/公开面越出已声明 ⇒ `Feature`,其余 ⇒ `Task`。 +- `Bug` 无具名落点或复现路径不入 `pm:queue`(标记补复现)。 +- ⛔ 不回填存量 backlog 的 type;新卡即时打、存量卡下次碰到补。 +- 定级按北极星「优先级」1–3 条;首行 `Path: <定义项> | <清单项 id/缺项> | P<路步> | none`。 +- 定义项取北极星「做出来的是什么」或仪器卡的车队决定;无则关;`none` 非分诊缺口。 +- 清单项三态定级(会 fail / 步骤够不到 / 无项断言)与定级判据见 `references/filing-gate.md`。 +- 「无则关」= 首触即关 not_planned,带理由与入队两条件,⛔ 不定 p3、不 hold;下行同此。 +- 产品仓 P0/P1 开着时,无解锁对象的 p2/p3 `tooling` 卡同样关。 +- 路由是分诊的技术判断,⛔ 永不升级哪个仓的问题;父单是协调节点,永不派发。 +- 父单已有子结构的:父单队列标签即可,分诊逐个展开路由、补 `Blocked-by:` 排序。 +- 跨层功能点(≥2 层)立父单带 `area:*`+`pm:epic`+清单项级,逐层子单按 `Blocked-by:` 排。 +- 每张留一条英文审计评论(`Triage: lands in …; rationale: …`),可选带 `Size/model suggestion:` 行。 +- 查重/shadow 检查先按文件/机制查本仓与姊妹仓 open 卡(含 `pm:dispatched`),再跟引用与关键词。 +- 同文件同机制 = 同一发现,不分车道,首触定级即并:证据搬先卡,后卡关 `duplicate_of`。 +- 同族异缺陷 ⛔ 不并:互链排同批;在飞(assignee/open PR)永不并,`Blocked-by:` 不派;完工查过期。 +- 执行席 ⛔ 不并卡,疑重复挂 `pm:retriage` 写明哪两张同文件同机制;同 assignee 者自关后卡。 +- 生产者在哪是常设分诊问题:declared ≠ enforced 形状的卡先问谁在写这个字段。 +- 派发前按生产者的答案改卡的范围与域标签。 +- 发现分诊轮:`finding` 恒 = 待首次定级、定级即离标;hold 重验只在 `Restart-when:` 命中时发生。 +- closed 形态随每轮解锁扫描;可执行判据由分诊席每日一个低频子轮批量执行。 +- `Restart-when:` 命中同 closed 命中待遇:回队前 ref 重验再回队。 +- ⛔ 不设逐卡豁免评论;每 fire 定完全部未定级 finding,优先于旧卡重验。 +- 三类外不可逆或有硬时限(发版即固化、只被消费的文件、过窗不可补)⇒ 不关,报维护者。 +- 三类外首触关闭只清门前存量,关 not planned(不等批准可否决重开);三类内无证据拒收。 +- 三类内再过时前提检查,三选一:晋级 / 关闭 not planned / hold;判级只在此轮,不在立单时。 +- ⛔ 写入前对每张卡现读当前状态;任何列表快照读数一律作废。 +- ⛔ 带 `pm:dispatched` / assignee / 任何 open 或 merged PR 引用的卡,一律不动。 +- 标签/assignee 写恒经 `scripts/pm/label-write.mjs`(四步、回读);⛔ 永不 MCP `issue_write`(锁 1 已拒)。 +- 车道席可附证据/前提重验,⛔ 不定级不改标;skills 车道 finding 由该席自分诊,全仓轮跳过。 +- 域分批与 sweep 打包晋级五条照用;每批约定与积压告警见 `references/dispatch-runbook.md`。 +- `pm:retriage` 每 fire 先答异议评论所求,答后同笔摘标;须维护者答的进收件箱,标照摘。 +- retriage 维持或改判皆由分诊席同笔摘标;挂标归异议席。 +- retriage 的异议判据认内容(有评论写明所求)⛔ 不认形状(有一条异议评论)。 +- 发版板 `target:`:判据二元,⛔ 不做优先级渐变:不修它,当前 RC 能不能发。 +- 判阻塞四类:① 用户今天就撞的已发布面缺陷;② 公开契约 declared≠enforced。 +- ③ 存量数据/迁移形状(发布后修不回);④ 发布说明里要为它道歉的。 +- 拆分/分票时 `target:*` 随工作走,对每一半重跑二元判据,默认继承,不继承按四类写明理由。 +- 每张板恰好一个生产者;鲜度节奏、清板三选一、pin 前置见 `references/seat-post-protocol.md`。 +- 代裁人工地板(恒交维护者):功能新增;ADR;协议/公开契约变化;破坏性或难回滚动作。 +- 人工地板同含:安全/权限边界;门禁削弱(降阈/删必查/抬上限/跳测);新增运行时第三方依赖; +- 花费/配额/舰队形态/默认模型档位;新增必需门禁/hook/棘轮(卡具名所守契约与预期捕获)。 +- 唯一例外:`platform-readings.md` 增量抬上限到落地行数,免决策卡,记 `ruledRaises` 引常设裁决。 +- 条件:席位验收评论逐条核实、去重计数(候选/落地/已有/拒收)、一事一行、不计重排。 +- 代裁车道只覆盖代码整理(行为不变的重构)与 bug 修复。 +- 机械边界测试:改动扩大接受集或公开面 ⇒ 人工;拉回已声明契约 ⇒ 代裁车道。 +- 置信门四条全立才可代裁:① 四棱同向;② 不在人工地板;③ 不推翻既有维护者裁决。 +- ④ 执行是否决窗口不是许可门。 +- 代裁动作:裁定 → 一次标签写入换 `needs-user-decision` 为工作态。 +- 随后卡上贴四棱块 + 结论 + `auto-adjudicated` 标记,轮次报告设代裁清单专节。 +- 一类自裁门:召唤中总监席可免呈自裁一张决策卡,当且仅当三判据全立。 +- ① 既有裁定/在案类规则/成文纪律机械决定方向,裁决评论点名所用权威。 +- ② 失败方向响亮(拒绝/诊断/红门禁)且一次 revert 可回。 +- ③ 四类地板零移动:安全/权限边界、已发布契约语义、产品能力取舍、门禁强度; +- 门禁普查标 retire 的退役除外,总监/技能席引该行裁;触地板即呈报,地板是排除项非权重。 +- 一类自裁逐卡记录:裁决评论引本通道与 ①的权威,录裁 + 转 `pm:queue`,⛔ 裁不派。 +- 每场召唤收尾呈摘要表(卡、权威、方向)供维护者追认;被推翻的行按新裁决执行。 +- 二类(带一个可报点)与三类(地板)照旧现场呈报,走常设决裁批流程。 +- 回翻条款:代裁卡实施中发现契约终究要动 ⇒ dev 停手,卡回决策箱,⛔ 永不静默重裁。 +- 请示纪律:方向性授权覆盖整条执行链一并做完,⛔ 不逐项回问。 +- 需裁事项攒批(≤5 项/批,每项一行带推荐),一句同意即全链执行。 +- 中间状态与限流/重试类运维细节只进座位贴和触发器,⛔ 不弹给维护者。 +- 汇报只在里程碑、真阻塞、被问到时。 +- 可逆且有推荐默认的事项按否决窗口:声明即执行,异议再回滚。 +- 人工地板项(发版、天花板、契约扩大)仍需明确字句,但攒批不逐项弹。 diff --git a/.claude/skills/pm-dispatch/references/true-green.md b/.claude/skills/pm-dispatch/references/true-green.md index 465ffdfe3b7..7761a6e2715 100644 --- a/.claude/skills/pm-dispatch/references/true-green.md +++ b/.claude/skills/pm-dispatch/references/true-green.md @@ -1,6 +1,6 @@ # 各仓真绿跑法索引 -见 SKILL.md 〈复核〉的入队资格条款(全 check 绿,非 required 子集);每仓一节,一行一事实。 +见 SKILL.md 〈路径分叉〉的入队资格条款(全 check 绿,非 required 子集);每仓一节,一行一事实。 每节放正典测试跑法、CI 日志 grep 看不见的门禁、本地 preflight。 与编译面清单同一维护纪律:这张表由 PR 维护,踩到新形态的那个 PR 顺手改这里。 diff --git a/scripts/pm/check-half-states.mjs b/scripts/pm/check-half-states.mjs index 3bbd077de68..779c84d35ca 100644 --- a/scripts/pm/check-half-states.mjs +++ b/scripts/pm/check-half-states.mjs @@ -15101,7 +15101,7 @@ export function h64ExposureClause(counts = {}, cap = H64_LOGIN_ROSTER_CAP) { // // ## The rule, and the clause that had no reader // -// `.claude/skills/pm-dispatch/SKILL.md` 〈分诊座位职责〉 makes the triage seat's +// `.claude/skills/pm-dispatch/references/triage-duties.md` 〈分诊座位职责〉 makes the triage seat's // inventory two-tiered and closes the rule with a forcing function: 「选层按 // fire 时刻,⛔ 不用计数器;简报写明本轮跑的层」. The SELECTOR itself is pinned // one hop away in `.claude/skills/pm-dispatch/references/dispatch-runbook.md` @@ -15168,7 +15168,7 @@ export function h64ExposureClause(counts = {}, cap = H64_LOGIN_ROSTER_CAP) { // // The filing card measured, and this file's flight re-measured, that the // English word `Tier` in any casing appears NOWHERE in the charter: the only -// clause is SKILL.md 〈分诊座位职责〉 「选层按 fire 时刻,⛔ 不用计数器;简报写明 +// clause is references/triage-duties.md 〈分诊座位职责〉 「选层按 fire 时刻,⛔ 不用计数器;简报写明 // 本轮跑的层」, which requires the tier to be WRITTEN and prescribes no // spelling. So the repair is HERE, in the predicate, and ⛔ NOT in adding an // English spelling to a charter that is a governed surface and never said it. @@ -15520,7 +15520,7 @@ export function h65TierlessRoundArtefactRow(hit, comment, total = 1) { : ''; return ( `${hit.shape} (comment \`${id}\`) ${because} — so the two-tier rule at ` + - '`.claude/skills/pm-dispatch/SKILL.md` 〈分诊座位职责〉 (「选层按 fire 时刻,⛔ 不用计数器;' + + '`.claude/skills/pm-dispatch/references/triage-duties.md` 〈分诊座位职责〉 (「选层按 fire 时刻,⛔ 不用计数器;' + '简报写明本轮跑的层」) is satisfied by SILENCE here. The clause is the rule\'s forcing ' + 'function: a seat that must NAME its tier cannot skip choosing one, and the one measured ' + 'instance of the skipped choice was a full-board enumeration on a fire that owed a `since` ' + diff --git a/scripts/pm/check-skill-line-ratchet.mjs b/scripts/pm/check-skill-line-ratchet.mjs index 209c07a9451..cdebc6de1ab 100644 --- a/scripts/pm/check-skill-line-ratchet.mjs +++ b/scripts/pm/check-skill-line-ratchet.mjs @@ -358,7 +358,20 @@ export const CEILINGS = new Map([ // growth (the 811 → 812 entry above). SKILL.md is not a CROSS_FILE_MOVES // destination, so no `ruledRaises` record applies. Landed count, headroom 0, // same convention. - ['.claude/skills/pm-dispatch/SKILL.md', 819], + // Lowered 819 → 319 by the principle-only cut (maintainer, decision batch #213 + // item 4, verbatim: 「1 2 4 同意」 on 「协议主文 819 → 约 300 行(红线 + 状态模型 + + // 入口 + 索引),派发 / 复核 / 入队细则各成一份按阶段读的 reference;同时删 + // core-rules.md 双份」). Relocation, not deletion: 开轮互斥 / 座位贴协议 / Epic + // 子树车道 / 轮次报告与节奏 / 停止条件与待命 / 断粮与跨墙恢复 → + // references/seat-lifecycle.md; 平台读数纪律 → references/reading-discipline.md; + // 多仓协调 → references/cross-repo-coordination.md; 分诊座位职责 → + // references/triage-duties.md; 执行座位职责 (候选/认领/派发/收集/复核) → + // references/execution-duties.md; 入队与落地 → references/landing-operations.md + // (the one declared CROSS-FILE MOVE below; this file is its source). Every + // rule line moved verbatim; the ACCEPT path-fork block stays here under + // 路径分叉 because check:pm-governed-prose anchors its region in this file. + // Landed count, headroom 0, same convention (lowering is always legitimate). + ['.claude/skills/pm-dispatch/SKILL.md', 319], // Raised 223 → 244 by the triage reading-cost card (maintainer ruling // 2026-08-20, quoted in the raising PR): three mandated conventions land in // the runbook's triage sections. Landed count, headroom 0, same convention. @@ -1145,7 +1158,13 @@ export const CEILINGS = new Map([ // tails leave the corpus; one rule per ≤120-byte line, no rule already stated in // SKILL.md). Landed count, headroom 0, same convention (lowering is always // legitimate). - ['.claude/skills/pm-dispatch/references/landing-operations.md', 69], + // Raised 69 → 101 by the CROSS-FILE MOVE declared in CROSS_FILE_MOVES below + // (the principle-only cut of SKILL.md, decision batch #213 item 4): the + // 入队与落地 clause block — 29 rule lines, its heading and blank lines — moved + // verbatim out of SKILL.md, whose ceiling fell 819 → 319 in the same PR; +32 + // against a net source decrease of 500. Landed count, headroom 0, same + // convention. + ['.claude/skills/pm-dispatch/references/landing-operations.md', 101], // Release-aftercare duties — what a lane PM still owes AFTER a tagged release // rolls to production, which the landing window (ends at MERGED) never // covered: post-roll placement/latency reading with the waker-bias re-draw @@ -1198,20 +1217,21 @@ export const CEILINGS = new Map([ // ruling citations and incident narrative left; every rule stayed. Landed count, // headroom 0, same convention (lowering is always legitimate). ['.claude/skills/pm-dispatch/references/compile-surfaces.md', 24], - // Plain-language digest of the corpus's binding rules, one rule per line, added - // under the 2026-09-04 rules-only ruling so the maintainer reviews the rules - // instead of the corpus. Set at the landed line count (headroom 0, same - // convention as every entry above); it is a NEW file, so this is an added row - // and no other row moves. - // Raised 150 → 151 by the same queue-entry third-case ruling (decision batch - // #91, 2026-09-08, option A — quoted in full at the SKILL.md entry above): the - // twin line that SKILL.md:44 orders (一条规则在本文与核心条款一处改动,另一处同 - // PR 同改), one 116 B line stating the sole exception with all three conditions. - // Could not be paid in place: the rule line holds 114 B of 120, and of this - // file's 121 adjacent bullet pairs ZERO merge under the cap (smallest 156 B). - // Landing it in SKILL.md alone was option C, refused by the ruling: the twin - // obligation is not waived. Landed count, headroom 0, same convention. - ['.claude/skills/pm-dispatch/references/core-rules.md', 151], + // `references/core-rules.md` (151) left this map with the file: it was the + // declared subset of SKILL.md, and the principle-only cut (maintainer, + // decision batch #213 item 4, verbatim: 「1 2 4 同意」 on 「协议主文 819 → 约 300 + // 行(红线 + 状态模型 + 入口 + 索引),派发 / 复核 / 入队细则各成一份按阶段读的 + // reference;同时删 core-rules.md 双份」) deleted the duplicate. + // Five per-phase references created by that cut, each holding sections moved + // VERBATIM out of SKILL.md (819 → 319 in the same PR) and opening with one + // line naming which seat reads it on which fire. New files, landed at their + // own counts (headroom 0, same convention as every entry above); added rows, + // paid for by the SKILL.md decrease — the map's total goes down. + ['.claude/skills/pm-dispatch/references/seat-lifecycle.md', 96], + ['.claude/skills/pm-dispatch/references/reading-discipline.md', 37], + ['.claude/skills/pm-dispatch/references/cross-repo-coordination.md', 51], + ['.claude/skills/pm-dispatch/references/triage-duties.md', 120], + ['.claude/skills/pm-dispatch/references/execution-duties.md', 183], // New file, landed at its own count (headroom 0, same convention as every // entry above): the filing gate and the grading/reading criteria the triage // seat applies. A new pm-dispatch references file belongs in this map by the @@ -1889,6 +1909,21 @@ export const CROSS_FILE_MOVES = new Map([ ], }, ], + // The principle-only cut of SKILL.md (maintainer, decision batch #213 item 4): + // the 入队与落地 clause block moved verbatim into the file that already held + // its A–D operating detail. `was` values are the participants' ceilings on + // `origin/main` at fae870352; the reviewer holds them against that diff. The + // five NEW per-phase references of the same PR are added rows, not + // destinations — a move needs a pre-move ceiling, which a new file has none + // of — and the same source decrease is what pays for them. + [ + '.claude/skills/pm-dispatch/references/landing-operations.md', + { + ruling: '入队与落地 consolidation into landing-operations.md under the principle-only cut of SKILL.md, authorised by #14685 item 5 (comment 5520452691)', + was: 69, + sources: [['.claude/skills/pm-dispatch/SKILL.md', 819]], + }, + ], ]); /** @@ -1961,7 +1996,13 @@ export const MAX_TABLE_ROW_BYTES = new Map([ ['.claude/skills/pm-dispatch/references/seat-post-protocol.md', 0], ['.claude/skills/pm-dispatch/references/true-green.md', 0], ['.claude/skills/pm-dispatch/references/compile-surfaces.md', 352], - ['.claude/skills/pm-dispatch/references/core-rules.md', 0], + // The five per-phase references of the principle-only cut carry no table + // row (their tables stayed in SKILL.md), so each pin is the measurement 0. + ['.claude/skills/pm-dispatch/references/seat-lifecycle.md', 0], + ['.claude/skills/pm-dispatch/references/reading-discipline.md', 0], + ['.claude/skills/pm-dispatch/references/cross-repo-coordination.md', 0], + ['.claude/skills/pm-dispatch/references/triage-duties.md', 0], + ['.claude/skills/pm-dispatch/references/execution-duties.md', 0], ['.claude/skills/pm-dispatch/references/filing-gate.md', 0], ['.claude/skills/pm-dispatch/references/app-platform-boundary.md', 219], ['.claude/skills/pm-dispatch/references/lanes/engine.md', 0], diff --git a/scripts/pm/dispatch-gates.mjs b/scripts/pm/dispatch-gates.mjs index 07c6f1f1afc..ba0f068286e 100644 --- a/scripts/pm/dispatch-gates.mjs +++ b/scripts/pm/dispatch-gates.mjs @@ -25400,7 +25400,7 @@ function selfTest() { // per-file entry under `skills/` has quietly returned. t('a catalog file is covered by exactly ONE entry — skills/** — now that the published PM skill and its own entry are gone', catalogHit.hits.length === 1 && catalogHit.hits[0].glob === 'skills/**'); t('no per-file entry for the deleted published PM skill survives it, and its old path carries the root mandate only', !MANDATORY_TIER_GLOBS.some((g) => g.glob.includes('objectstack-pm-dispatch')) && fableOf(['skills/objectstack-pm-dispatch/SKILL.md']).hits.every((h) => h.glob === 'skills/**')); - t('skills/** does NOT reach the internal .claude/skills tree — a pm-dispatch references file still carries no mandate', fableOf(['.claude/skills/pm-dispatch/references/core-rules.md']).mandatory === false); + t('skills/** does NOT reach the internal .claude/skills tree — a pm-dispatch references file still carries no mandate', fableOf(['.claude/skills/pm-dispatch/references/state-machine.md']).mandatory === false); t('the skills/** entry is declared with its one-line exit switched off, as data', MANDATORY_TIER_GLOBS.some((g) => g.glob === 'skills/**' && g.oneLineExit === false && g.tier === CONTRACT_REVIEW_TIER)); t('every other mandatory entry keeps the one-line exit open (the flag is an opt-out, absent by default)', MANDATORY_TIER_GLOBS.filter((g) => g.glob !== 'skills/**').every((g) => g.oneLineExit === undefined) && catalogHit.hits.every((h) => h.glob !== 'skills/**' || h.oneLineExit === false)); const catalogLines = tierLines(catalogHit).join('\n'); @@ -26505,7 +26505,7 @@ function selfTest() { t('and refuses the one-line-class exit on stdout, where the claim comment reads it', (catalogCli.stdout ?? '').includes('NOT available') && !(catalogCli.stdout ?? '').includes('drops to opus execution')); const catalogAiCli = runCli(['--tier', 'skills/objectstack-ai/SKILL.md']); t('⭐ a second catalog SKILL.md prints the same mandate', catalogAiCli.status === 0 && (catalogAiCli.stdout ?? '').includes('MANDATORY') && (catalogAiCli.stdout ?? '').includes("'skills/**'")); - const internalRefsCli = runCli(['--tier', '.claude/skills/pm-dispatch/references/core-rules.md']); + const internalRefsCli = runCli(['--tier', '.claude/skills/pm-dispatch/references/state-machine.md']); t('⭐ --tier on an internal pm-dispatch references file still prints NO mandate', internalRefsCli.status === 0 && (internalRefsCli.stdout ?? '').includes('no path-derived mandate') && !(internalRefsCli.stdout ?? '').includes('MANDATORY')); // ── The entry guard (#9757) ───────────────────────────────────────────────