From 0e6f702e6cc8a25b48a6d0e5801ffefca0980afb Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 13 Sep 2026 11:56:48 +0000 Subject: [PATCH 1/8] skills(pm-dispatch): a claimed card is followed through to MERGED; triage is the sole producer of grading, routing and dedupe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Charter revision, chain head card 17942 (rules layer). Three rulings land here, quoted verbatim: - Q1 and Q2 (director seat, decision batch 131 item 1, 2026-09-13): 「同意」 to `1A(+三类表)·2(1)·3A·4B` — the claiming seat owns a card to MERGED; a cross-lane surface found after dispatch imports an isolated contract-review-tier review whose record carries `Implemented-by:` / `Reviewed-by:`; `pm:retriage` re-routing is pre-dispatch only; the spec seat keeps the intake of NEW `packages/spec` work; derived work in three classes (in-scope ⇒ sub-issue owned by the claiming seat at inherited priority; unclaimed blocker ⇒ the blocked seat claims and does it, any size; in-flight blocker ⇒ wait, `pm:blocking` ranks it first; incidental ⇒ a separate card). - The seat's plan, accepted verbatim: 「以上接受你的建议。」 - Ruling ③ (skills seat record, 2026-09-13T09:51Z): 「同意」 to the five points — 「一律经过分诊。定级、路由、查重、跨仓 shadow 检查、`duplicate_of` 关单,全部收回分诊席一个人做」; 「唯一例外:在飞卡的衍生子卡」; 「立卡者不查重,只在卡面附 3–5 个查重词」; 「查重缓存住在分诊席自己的容器里」. Q3 (self-routing / self-grading) is WITHDRAWN; no self-routing text had reached SKILL.md (git grep -E '自路由|自定级|self-rout' over origin/main exits 1, control 「分诊座位唯一」 hits), so nothing comes out. SKILL.md (812 → 811 in this commit; the family PR nets 0): - 多仓协调: 「跨座位转移 … 唯一豁免:简单阻塞项直接接手」 becomes 认领即跟到 MERGED plus the imported-review record line (+1); 「凡触 packages/spec 一律转」 narrows to NEW spec work; 「跨仓查重/shadow 检查恒归中央」 is deleted — the rule survives in the rewritten 分诊座位唯一生产 line (查重 / shadow / duplicate_of named) and in core-rules 多仓协调; the 单车道仓 repo:* 席 restatement is deleted — it survives at the 单车道仓 … 自理机械三务 line of the same section and the skills-lane finding self-triage line of 分诊座位职责. - 域车道: domain:* production gains the one ruled exception; the third boundary-crossing channel is named. - Epic 子树车道: 衍生问题三分 is deleted — generalised to every dispatched card in 执行座位职责, where the four 简单阻塞项 lines are rewritten as the three-class rule and the blocker rules (the S-level cap is lifted by the ruling; the incidental class survives at 顺带发现 ⇒ 独立立单). - 分诊座位职责: the triage-side dedupe cache line (+1) — lanes/triage.md is at 7/7 with its one spendable line taken by ruling B, so the cache rule lands in the rules layer the triage seat reads. - 平台读数纪律 and 报告契约: 立单前查重 → 立卡者附查重词; 立卡查重先行 → 立卡附查重词. core-rules.md (151/151): mirrors of every moved rule — dedupe keywords, triage as the sole producer including 查重, follow-through plus new-spec intake, the blocker rule, the domain-label exception. Not in this commit (references layer, follow-up PR): contract-review.md 复核归属与资格 / 独立性件 and dispatch-runbook.md 跨车道简单阻塞项直接接手. The 「分诊不重指派」 wording that option B named does not exist in the instruction tree (git grep exits 1), so there is nothing to narrow. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude --- .claude/skills/pm-dispatch/SKILL.md | 29 +++++++++---------- .../pm-dispatch/references/core-rules.md | 10 +++---- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index d12b2aaff8..574fece224 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -172,7 +172,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - dev 自己死了不等于维护者中止:子代理消失是正常死法,走死认领回收。 - 维护者中止只在有显式信号时成立:原话,或宿主回报 stopped by the user。 - ⛔ 不据推断立一道没有重启条件的门;判据是信号不是症状。 -- 立单前查重:关键词、CVE/公告号、包名、报错串各搜一遍;空结果须有控制词背书。 +- 立卡者不查重,只附 3–5 个查重词;分诊按词查自有列表,零命中须控制词背书。 - 共享基础设施修复入队前按症状复查 main,不按 issue 号。 - 真撞上重复,先比数值与作用域再决定关哪个。 - sweep 晋级与立卡的前提要对此刻的 main;dev 带证据的零实现停手是好产出,不当返工计。 @@ -190,7 +190,6 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 单车道仓 `cloud`、`objectos`、`hotcrm`、`www.objectos.ai`;未来新仓默认此类。 - 单车道仓 `repo:*` 席自理机械三务,⛔ 不产 `domain:*`;决策卡入本仓收件箱,不落 objectstack。 - 机械三务 = 自扫 sweep、自打 `type`、自做 `finding` 首触定级。 -- 跨仓查重/shadow 检查恒归中央,全仓视图 ⛔ 不下放。 - 新仓登记是一张清单:座位贴、标签、类别归属、门禁盘点。 - 新仓准入判据一句:这个仓真的需要常设席位吗。 - hotcrm 收卡判据与宪章见 `references/lanes/hotcrm.md`。 @@ -217,18 +216,18 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 规则 3:联动杂事立单,不靠记忆。 - 已验收 PR 的产物流向另一仓,接受该 PR 的执行席立即在消费仓立后续单,带 `Blocked-by:`。 - 规则 4:纵向拆分,一个分诊 PM + N 个执行 PM,一人一车道双射。 -- 分诊座位唯一:定级/路由/type 由它一座生产,只扫/分类/打标/拆分/查重/转仓。 +- 分诊座位唯一生产:定级/路由/type/查重/shadow/`duplicate_of`;执行席永不定级或路由裸卡。 - 执行座位信任标签,只在本车道认领;误标 ⛔ 不自行改,挂 `pm:retriage` + 异议评论同笔。 -- 单车道仓 `repo:*` 席 = 执行座位 + 机械三务自理;skills 车道 finding 自分诊例外照旧。 - 突发积压调频率或 `batch`,持续积压按仓拆席走 PR;⛔ 不跨车道借调。 - 维护者直派通道:当面指挥的 PM 会话直接路由,只对明示指挥的卡成立。 - 直派的审计评论逐字引用授权指令。 - 多车道仓分诊空缺时,会话型执行 PM 可代扫:只做分诊动作,不跨车道认领,贴上注明。 - 代扫在分诊座位有主时立即停止。 - 规则 5:一块板不设第二跟踪器:pm 标签就是状态机,org Project 只是维护者的聚合视图。 -- 跨座位转移:工作跨座位线,PM 永不跨(唯一豁免:简单阻塞项直接接手)。 +- 认领即跟到 MERGED:派发后发现的跨车道面(含 spec)不移卡,认领席借契约复审档隔离复核。 +- 复核记录带 `Implemented-by:`/`Reviewed-by:`,自审机读可见;`pm:retriage` 改路由只对未派发卡。 - 转移落对方队列:目标仓立单带 `pm:queue`、出处行与一行可执行判据,依赖用 `Blocked-by:`。 -- 凡触 `packages/spec` 一律转 `domain:spec` 座位,不论谁需要它。 +- 新 `packages/spec` 工作恒由 `domain:spec` 席收口,不论谁需要它;已派发卡 ⛔ 不因触 spec 转席。 - 任何跨座位请求都是工作(要读数、要开卡、要授权):一律立卡进目标车道队列。 - ⛔ 座位贴敲门或裁决评论永不作跨座位请求的唯一载体;评论是加速器不是记录。 - 等待方同一笔把自卡翻 `pm:blocked` + `Blocked-by:` 指向请求卡;⛔ 不设新标签新 sweep。 @@ -252,12 +251,12 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 表未覆盖的包首次分诊时归类并走 PR 更新本表;新增或退役 `domain:*` 必须同批改本表。 - 座位在编情况以 `label:pm:seat` 索引为准,每个 `domain:*` 与 `repo:*` 恰一张座位贴。 -- `domain:*` 只由分诊席产出;打标签不等于认领,未打标签的 issue ⛔ 任何人不得认领。 +- `domain:*` 只由分诊席产出,例外仅在飞卡衍生 sub-issue 承父卡域;无标签的卡 ⛔ 不得认领。 - 跨域例外路径:拆不动的跨域单 PR 由分诊席指定一个车道 PM 认领,认领评论申报文件面。 - 只在跨域例外路径上跑定向在飞检查,范围 = 该单文件面触及的那几个域的在飞单。 - 定向在飞检查读各在飞单认领评论的文件面申报,要求不相交,相交即让行。 - 日常同域批次选择不跑全局在飞检查,同域独立性由本域批次选择保证。 -- 跨域相交只从两条越界通道进来:跨域例外路径,与简单阻塞项直接接手。 +- 跨域相交只经三条越界通道:跨域例外路径、认领席跟到底的越界面、接手无主阻塞项。 - 合并队列是共享串行资源:车道买到的是并行编写,不是并行落地。 - 谁发现 flake 谁修或立单,⛔ 不绕行。 @@ -297,9 +296,8 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 离开子树(交车道或转 spec 座位)同一笔标签写摘 `pm:epic` 加 `pm:queue`。 - `pm:epic` + `pm:queue` 同卡 = 半状态(保留兼移交);后者即已移交,取回走全套认领协议含重读。 - 单车道仓(无 `domain:*`)开卡即认领合法;多车道仓域标签前置照旧,子树标记即保留。 -- 衍生问题三分,判据:不修它 epic 验收过不过得去;in-scope ⇒ 挂父单 sub-issue 下轮自动入队。 - 触 `packages/spec`/公共契约(sub-issue 或衍生)⇒ 照旧转 spec 座位队列,epic 侧写 `Blocked-by:`。 -- 顺带发现 ⇒ 独立立单进修复落地仓,查重先行;⛔ 不借 sub-issue 通道塞未分诊卡进池子。 +- 顺带发现 ⇒ 独立立单进修复落地仓,附查重词;⛔ 不借 sub-issue 通道塞未分诊卡进池子。 - 每次分流留一行审计评论;父单维护 checklist 汇总评论,决策仍锚在具体 sub-issue。 - 收尾四步、僵尸回收与领地防撞细则见 `references/seat-post-protocol.md`。 @@ -313,6 +311,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - ⛔ 分诊 fresh session 开局不做泛关键词 ToolSearch;可验判据:空转轮 ~4 万 token 以内。 - 工具加载纪律只约束分诊 fresh session 的开局;执行座位与 dev 不受约束。 - 两级盘点:小时轮以 `since` 窗口读增量,锚 = 座位贴上一份收班简报的时间戳。 +- 查重缓存住席内:新会话全量拉,其后 `since` 增量;⛔ 不建分支、不共享、不依赖备份。 - 每日一 fire 跑全仓全量对账并归集日频职责。 - 选层按 fire 时刻,⛔ 不用计数器;简报写明本轮跑的层。 - 从不更新的卡不入窗;老化欠账归半状态巡查不归小时轮。 @@ -451,10 +450,10 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 阻塞解除后给延后单重新定价:派发前一单时带必答项。 - 必答项:你的改动让 #X 变简单、变难、变得不必要还是无影响。 - 派发后一单前用该回答重读它的选项与成本,⛔ 不沿用立单时那份。 -- 跨车道简单阻塞项直接接手:本车道卡被他车道卡挡住,且阻塞项机械、规格清楚、S 级。 -- 命中即被挡座位直接接手做掉,⛔ 不持续等待。 -- 接手在他车道卡上走完整认领、尊重其热文件串行队、完工留收单注记。 -- 带设计判断/语义权衡的仍归属地车道;接手细则见 `references/dispatch-runbook.md`。 +- 在飞卡衍生三分:不修它验收过不过;in-scope ⇒ 父卡 sub-issue,认领席自有、优先级继承。 +- 该 sub-issue 带父卡域与优先级直接派发,唯一绕过分诊;sweep 事后扫,重复关 `duplicate`。 +- 阻塞项无主 ⇒ 被挡席认领做掉,不限大小;在该卡走完整认领、尊重其热文件串行队。 +- 阻塞项在飞 ⇒ 等:`pm:blocking` 在其车道排最前、等待者写该卡;p0/p1 优先级沿链传递。 - 取卡全序:`priority:p0` > `pm:blocking` > `target:` 板上项 > p1 > p2 > p3 > 无级;同级先 `Bug` 再卡龄。 - `pm:blocking` 级内先按解锁扇出(从 `Blocked-by:` 反向索引现算,⛔ 扇出数不落标签)。 - 全序每级取既有信号现读/现算,零逐卡维护;优先是排序不是豁免;无级卡轮报记分诊缺口。 @@ -775,7 +774,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - ⛔ 本文不抄终报形状的第二份。 - `premise_still_valid: false` + `pr: null` 是合法终报,当再分诊输入复核,永不当失败派发。 - `status: needs_decision` 时 `open_questions` 必须非空。 -- `out_of_scope_findings` 只列三类立卡与 `noted, not filed`;立卡查重先行、归挂、立在修复仓。 +- `out_of_scope_findings` 只列三类立卡与 `noted, not filed`;立卡附查重词、归挂、立在修复仓。 - 席位在 ACCEPT 读 PR `## Acceptance notes`,实属三类的由席位补立;三类外已立的卡关 not planned。 - PM 核验它们存在,并把同轮并行报告互相对读:两个 dev 同一小时审相邻代码会立出孪生卡。 diff --git a/.claude/skills/pm-dispatch/references/core-rules.md b/.claude/skills/pm-dispatch/references/core-rules.md index 86bd3f5d95..1d9237981e 100644 --- a/.claude/skills/pm-dispatch/references/core-rules.md +++ b/.claude/skills/pm-dispatch/references/core-rules.md @@ -48,23 +48,23 @@ - 自设定时器的文本以先重读状态开头,只写关键判据,⛔ 不写可直接执行的祈使句。 - PM 写进 GitHub 的文本 ⛔ 不用尖括号占位符,携带易损片段的评论发出后回读。 - 放行认承载门禁族的 job 结论 ⛔ 不认聚合读数,advisory 红着进 main 即止血并立单。 -- 子代理自死不等于维护者中止,需显式信号;立单前查重的空结果须有控制词背书。 +- 子代理自死不等于维护者中止,需显式信号;立卡者只附查重词,分诊查重零命中须控制词。 - 默认读序 git、payload、REST、MCP;REST 可达性逐会话探一次;派发前读配额不够就减批。 ## 多仓协调 - 依赖方向固定:objectstack 提供唯一契约,objectui 与 cloud 消费它。 -- 多车道仓的域标签、类型与定级只由中央分诊生产,单车道仓自理三务但 ⛔ 不产域标签。 +- 多车道仓的域标签、type、定级与查重只由中央分诊生产,单车道仓自理三务不产域标签。 - 跨仓查重与 shadow 检查恒归中央 ⛔ 不下放;决策卡入本仓收件箱,在飞卡 ⛔ 不中途转仓。 - issue 住在修复落地的仓,抽掉 objectstack 仍成立的当场转仓;缝卡须带仓标签并点名读者。 - 跨仓 feature 拆成父单加每仓一张子单,下游带 `Blocked-by:`,上游未关闭 ⛔ 不派发。 - pin 消费的仓派发前核 pin 是否已覆盖那个提交,发布包消费的仓判据是消费方可安装。 - 上游未发版时转 hold ⛔ 不回队列;已验收产物流向另一仓由接受席立即立后续单。 -- 任何跨座位请求都是工作,一律立卡进目标车道队列,等待方同笔把自卡翻 `pm:blocked`。 -- 凡触 `packages/spec` 一律转 `domain:spec` 座位,不论谁需要它。 +- 跨座位请求即立卡进目标车道,自卡翻 `pm:blocked`;阻塞项无主由被挡席认领,在飞即等。 +- 认领席跟到 MERGED,派发后的跨车道面不移卡、借隔离复核;新 spec 工作由 spec 席收口。 ## 域车道 - 每个包恰好属于一个域(唯一例外见 SKILL.md 锚定规则),域标签等于修复落地的包所属的域。 - 域由分诊读代码判定,⛔ 绝不从 issue 标题的词汇猜域;说不出修复碰哪个文件就还不可标。 - 域到包家族的对照表住 SKILL.md,增删一个域标签必须同批改那张表。 -- 域标签只由分诊席产出;打标签不等于认领,未打标签的 issue ⛔ 任何人不得认领。 +- 域标签只由分诊席产出,例外仅在飞卡衍生 sub-issue 承父卡域;无标签的卡 ⛔ 不得认领。 - 跨域单 PR 由分诊席指定一个车道 PM 认领并申报完整文件面,只此路径跑定向在飞检查。 - 合并队列是共享串行资源,谁发现 flake 谁修或立单,⛔ 不绕行。 ## 座位贴协议 From 1ad7d17179e3daeebf1e8ae006a186b6772b115c Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 13 Sep 2026 11:56:48 +0000 Subject: [PATCH 2/8] =?UTF-8?q?skills(pm-dispatch):=20tier=20the=20governe?= =?UTF-8?q?d=20surface=20=E2=80=94=20the=20rules=20layer=20stays=20hand-me?= =?UTF-8?q?rged,=20pm-dispatch=20references=20land=20after=20in-seat=20con?= =?UTF-8?q?tract-tier=20review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ruling on card 17950 (live chat with the skills seat, 2026-09-13T07:2xZ–07:4xZ), maintainer verbatim: 「收窄受管面,但是 skills 是不是还是应该我来确认?」, then to the seat's boundary — 「**规则层(你确认)**:所有 SKILL.md 级的规则文本——发布的 `skills/**`(两个仓)、`.claude/skills/*/SKILL.md`(含 pm-dispatch 本体和内部 playbook)、`core-rules.md`、`.claude/agents/**`、hooks、settings、`AGENTS.md`、`CLAUDE.md`、ADR。**事实层(席内契约复审档复核后入队)**:只有 `.claude/skills/pm-dispatch/references/**`」 — 「我点头」. SKILL.md 〈复核〉 (net 0): the three skills-lane self-landing lines (diff 含 .md ⇒ 四件套 / 纯代码面 including `.claude/` hooks, workflows and settings ⇒ skills 席自审 / 直接落地 ⛔ 不推维护者) are replaced by three lines — the non-governed pure-code path (`scripts/pm/`) keeps its in-seat contract-tier self-review and landing; the two-layer definition; the per-layer landing. The old carve-out that let `.claude/` hooks, workflows and settings PRs land on the skills seat's own review is superseded: the ruling names hooks and settings in the rules layer. The ACCEPT fork line now reads 命中规则层. core-rules.md 执行座位职责: the mirror. lanes/skills.md (33/33): 受管面 PR 恒 draft 等人合 → 规则层受管 PR 恒 draft 等维护者的字; the 范围 pointer names the two layers. The objectui half (published skills/** governed there too) is already stated by lanes/ui.md 常设承诺 and the 跨仓同判 line of 〈复核〉 — measured, no line owed. AGENTS.md Prime Directive 14 (1075 → 1072 in this commit; the PR nets 0): the tiering sentence, paid inside the directive by folding the four ⛔-never spellings into one clause, dropping the node -e helper (the register sentence already names the file), and compressing the armed-or-queued paragraph and the detection sentence without removing a rule. The prose gate's anchor sentence and all five register spans are unchanged; the references prefix is spelled with a trailing slash, never as a ** glob, because check-governed-prose reds any **-shaped span outside the register. Not in this commit: the register and queue-guard script items of the card (a separate script PR) and contract-review.md 落地前检③ (references PR). Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude --- .claude/skills/pm-dispatch/SKILL.md | 8 +-- .../pm-dispatch/references/core-rules.md | 2 +- .../pm-dispatch/references/lanes/skills.md | 4 +- AGENTS.md | 59 +++++++++---------- 4 files changed, 35 insertions(+), 38 deletions(-) diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index 574fece224..c4c8389ce3 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -605,7 +605,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 路径面用 `get_files` 取,⛔ 不看报告自述;动手之前先分,不是事后对照。 - governed 面统一定义:`docs/adr/**` + `.claude/**`(全量,含 agents/hooks/settings)+ `skills/**`。 - governed 面同含 `AGENTS.md` + `CLAUDE.md`;agent 指令文件跨仓同判,仓集读 `GOVERNED_REPOS`,此处不列。 -- 路径面一条命中 ⇒ ACCEPT 换终局四件套,混合 diff ⛔ 不按比例判;要拆让 dev 单独开 PR。 +- 路径面命中规则层 ⇒ ACCEPT 换终局四件套,混合 diff ⛔ 不按比例判;要拆让 dev 单独开 PR。 - ① 复核结论照常写在 issue 上;技能面 hunk 须由契约复审档的席复核,档外席先交 skills 席。 - ② PR 留给维护者看得见地悬着;终局两条:人工直合即审核记录;授权批准 ⇒ 队列放行。 - 看得见 = ACCEPT 同笔挂 `needs-user-decision` + 贴终稿「维护者速读」评论;①仍是审核记录。 @@ -621,9 +621,9 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 请审走免碰 draft 位的专用 REST 端点,MCP 兜底显式带 `draft: true`;端点事实住 platform-readings。 - ④ 轮次报告单列 awaiting a human merge。 - 已入队才读到本条 ⇒ 转 draft 与 disable 都做;出队以阳性探针答,ref 缺席只旁证。 -- skills 车道自有 PR 再按 diff 内容分流:diff 含任一 `.md` 文件 ⇒ 终局四件套照旧。 -- 纯代码面(`scripts/pm/`、`.claude/` hooks/workflows/settings、非 md 产物)⇒ 复核席为 skills 席自审。 -- skills 席自审按契约复审档、清单不减,然后直接落地(ready → 入队),⛔ 不推维护者。 +- skills 车道自有 PR:纯代码面如 `scripts/pm/` 由本席按达档自审(清单不减)后落地。 +- 受管面两层:事实层仅本技能 `references/`,其余为规则层(含发布 `skills/**` 与 SKILL.md)。 +- 规则层四件套等人合;事实层 PR(受管路径全在该目录)经席内达档复核后 ready → 入队。 - 路径面干净的才转 ready → 入队;队列是唯一被认可的落地路径,⛔ 永不队列外合并。 - 入队资格 = PR 上每一个 check 全绿,⛔ 不是 required 子集;required 集是队列强制的地板。 - 非必查红是真缺陷或坏门,归 PM 入队前处置;第三种按设计而红,三条全立才可带红入队: diff --git a/.claude/skills/pm-dispatch/references/core-rules.md b/.claude/skills/pm-dispatch/references/core-rules.md index 1d9237981e..b25e0c2bb0 100644 --- a/.claude/skills/pm-dispatch/references/core-rules.md +++ b/.claude/skills/pm-dispatch/references/core-rules.md @@ -119,7 +119,7 @@ - 停摆永不自愈,按梯度复位、三次即判不可靠重派;报告丢失时按草稿 PR 直接验收。 - 复核对 GitHub 核验 ⛔ 不对自述核验,逐项过清单并亲核形态、范围与整包价值密度。 - CI 收敛读数只属于复核侧;判决三种:验收落卡、返工最多两轮、升级走决策通道。 -- 验收后先取 PR 路径面,一条命中受管面即分叉,⛔ 不翻正式、不入队、不挂自动合并。 +- 验收后取路径面,命中规则层即分叉 ⛔ 不翻正式不入队;`references/` 席内达档复核后入队。 - 受管面 PR 留 draft 并向两个授权批准账户请审;契约卡无同形复核记录 PASS ⛔ 禁止入队。 - 入队资格是每一个检查全绿 ⛔ 不是必查子集;碰生成物的 PR 入队前先同步再重生成。 - 唯一例外:源码自述 pushed 上按设计而红、不跑 `merge_group`、评论记明门与因,三条全立。 diff --git a/.claude/skills/pm-dispatch/references/lanes/skills.md b/.claude/skills/pm-dispatch/references/lanes/skills.md index 46f64d1ea5..936e086114 100644 --- a/.claude/skills/pm-dispatch/references/lanes/skills.md +++ b/.claude/skills/pm-dispatch/references/lanes/skills.md @@ -8,14 +8,14 @@ - PM 循环工具与指令架构文件的归属见 SKILL.md 域车道表 `domain:skills` 行,⛔ 不另抄。 - 受管面的治理执行文件:`.github/CODEOWNERS` 治理路由半边。 - 同含 SUBJECT 是受管面本身的门禁与审计脚本。 -- 全量判据在 SKILL.md 域车道表;受管面统一定义见 SKILL.md 〈复核〉,⛔ 不另抄。 +- 全量判据在 SKILL.md 域车道表;受管面定义与两层分档见 SKILL.md 〈复核〉,⛔ 不另抄。 - QA 管理循环执行归本席;qa-run 记录是协议载体不是工作。 - 契约复核归派发席席内、决裁勤务归项目总监席(`director.md`);本席保留 skill 与治理文本。 ## 常设承诺 - 四维分析先于派发与复核。 -- 受管面 PR 恒 draft 等人合;flip 或 arm 前跑 `check-governed-merges --test` 带路径。 +- 规则层受管 PR 恒 draft 等维护者的字;flip 或 arm 前跑 `check-governed-merges --test` 带路径。 - 轮报的受管合并审计清单带 `--since` 四仓实跑,⛔ 不凭记忆汇总。 - 档位从 `--tier` 推导引用;pm-dispatch 根恒契约复审档;条款②闸门照现行。 - 额度耗尽豁免的地板是默认判断档,⛔ 不再往下。 diff --git a/AGENTS.md b/AGENTS.md index 98bad85295..6f62d26c22 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -254,38 +254,35 @@ localStorage / auth gotchas. record gains a one-line pointer. Files never move between registries and numbers are never reassigned. 14. **⛔ A governed surface is confirmed and merged by the maintainer, by hand — no AI seat merges, queues, or arms auto-merge on a PR whose diff touches one.** The governed surfaces are `docs/adr/**`, `.claude/**` (agents, hooks - and settings — not only skills), `skills/**`, `AGENTS.md` and `CLAUDE.md` — the file you are reading is one - — and a mixed diff is governed whole on a single path hit. The register is the `GOVERNED_SURFACES` table in + and settings — not only skills), `skills/**`, `AGENTS.md` and `CLAUDE.md` — the file you are reading is one — + and a mixed diff is governed whole on a single path hit. The register is the `GOVERNED_SURFACES` table in `scripts/pm/check-governed-merges.mjs`; adding a surface is an edit *there*, never here, and `pnpm - check:pm-governed-prose` reds per-PR when this paragraph names fewer surfaces than the register — or more. When - it reds, name the surface **in this paragraph**. Print today's set rather than trusting this paragraph: - `node -e "import('./scripts/pm/check-governed-merges.mjs').then(m=>console.log(m.GOVERNED_SURFACES.map(s=>s.glob).join(' · ')))"` - - **Authoring stays open to every seat** — drafting the ADR, the skill or the instruction edit, pushing the - branch, opening the PR, revising it under review. What is reserved is the **landing**: on any PR whose diff - touches a governed surface, ⛔ never merge it, ⛔ never add it to the merge queue, ⛔ never call - `enable_pr_auto_merge`, ⛔ never flip it out of draft to make any of those possible. Judge it on the PR's **file - list**, not on its description, and a **mixed diff is not a proportion question** — one path hit is enough; if - the rest needs to land, split the governed files into their own PR. **Those four lift only for an authorized - APPROVED review** — by an account in `GOVERNED_APPROVERS` (`scripts/pm/check-governed-queue-guard.mjs`), on ANY - commit; the queue then lands it. A later push does not expire that approval, and this gate does not re-review it. - Hand-authored governed content needs that approval; a PR whose only governed paths are register rows the queue leg - regenerates byte-exact clears with zero approvals — an uncertified recompute, drift or a hand-authored sibling - keeps it governed. Unapproved, the bypass direct merge (人工直合) is the only landing. ⛔ **No agent seat - submits an approving review on a governed-surface PR, under any account** — an authorized account is - agent-operated too. Nothing else substitutes — "CI is green" carries no information about a governance change. - - **Already armed or queued when you read this?** Converting the PR back to **draft** is the only action that - reliably removes it from the merge queue; `disable_pr_auto_merge` alone drops the arming but **not** queue - membership. Do both, then confirm from the remote that it is in neither the queue nor `origin/main` (§7's - draft-flip re-arm note, run backwards). **Do not read draft as a barrier that holds by itself — the barrier is - this directive**, and a human merge IS the review record — ⛔ not a relaxation. Behind the directive sit - prevention and detection: the queue guard refuses an unpinned governed diff in the queue; `docs/adr/` in - CODEOWNERS routes review requests — the *only* governed surface routed there, so on the other four nothing - summons the maintainer automatically; the report-only post-merge audit (`scripts/pm/check-governed-merges.mjs`) - lists every governed-surface merge with its approver and merger for the PM round report — a merger the - maintainer does not recognise, or any agent approval, is a seat violation, filed and rolled back. The rule has no - exception for a seat to judge. + check:pm-governed-prose` reds per-PR when this paragraph names fewer surfaces than the register — or more. When it + reds, name the surface here. + + **Authoring stays open to every seat** — drafting, pushing, opening and revising the PR. What is reserved is the + **landing**: on a PR whose diff touches a governed surface ⛔ never merge, ⛔ never queue, ⛔ never arm + auto-merge, ⛔ never flip it out of draft to make any of those possible — judged on the PR's **file list**, not + its description; a **mixed diff is not a proportion question**, one path hit is enough; to land the rest, split off + the governed files. **Those four lift only for an authorized APPROVED review** — by an account in + `GOVERNED_APPROVERS` (`scripts/pm/check-governed-queue-guard.mjs`), on ANY commit and not dismissed. The queue then + lands it. A later push does not expire that approval, and this gate does not re-review it. Hand-authored governed + content needs that approval; a PR whose only governed paths are register rows the queue leg regenerates byte-exact + clears with zero approvals — an uncertified recompute, drift or a hand-authored sibling keeps it governed. + Unapproved, the bypass direct merge (人工直合) is the only landing. **Landing is tiered**: a PR whose governed + paths all lie under `.claude/skills/pm-dispatch/references/` lands through the queue after the skills seat's + contract-tier review; every other governed path is the rules layer and waits for the maintainer's word. ⛔ **No + agent seat submits an approving review on a governed-surface PR, under any account** — an authorized account is + agent-operated too; "CI is green" carries no information about a governance change. + + **Already armed or queued when you read this?** Convert it back to **draft** AND disable auto-merge — draft is + what removes queue membership, disabling alone drops only the arming — then confirm from the remote that it is in + neither the queue nor `origin/main`. **Draft is no barrier by itself — the barrier is this directive**, and a + human merge IS the review record, ⛔ not a relaxation. Behind it: the queue guard refuses an unpinned governed + diff; CODEOWNERS routes review requests for `docs/adr/` only, so nothing summons the maintainer on the other four; + the post-merge audit (`scripts/pm/check-governed-merges.mjs`) lists every governed-surface merge with its approver + and merger — a merger the maintainer does not recognise, or any agent approval, is a seat violation, filed and + rolled back. The rule has no exception for a seat to judge. 15. **⛔ A version release is performed by the maintainer, by hand — no AI seat publishes, tags, cuts a Release, or triggers a release workflow, and none merges the Version Packages PR.** A rule that binds every seat lives here, From 3f885f45dc644c5fc82425a362faddea541a81f6 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 13 Sep 2026 11:56:48 +0000 Subject: [PATCH 3/8] =?UTF-8?q?skills(pm-dispatch):=20once=20an=20authoriz?= =?UTF-8?q?ed=20approval=20exists,=20the=20owning=20seat=20lands=20a=20gov?= =?UTF-8?q?erned=20PR=20=E2=80=94=20later=20pushes=20included?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ruling C on card 17971 (maintainer, live chat with the skills seat, 2026-09-13T08:50Z), verbatim: 「C. approve 后不管后续改动都由席位落地:」 — chosen over A (byte-pinned approval) and B (status quo) with the seat's own reservation in front of the maintainer. AGENTS.md Prime Directive 14: the first sentence gains its converse (confirmed by an authorized approval and then landed by the owning seat; before that approval the four acts stay forbidden); the approval sentence now says WHO lands it — the owning seat, later pushes included, re-queuing after an ejection or a rebase on its own pre-landing check — and that the maintainer's word is spent once per PR. Multi-agent discipline §7 (a): 「never enter this path, however green」 → 「on green alone」. Post-Task Checklist step 2: landing waits for the maintainer's word instead of 「by hand」 alone. Line counts unchanged at each spot. SKILL.md: red line 27 gains 「批准在案后席位落地」, paid on the same line by folding the three 永不 into one; 复核 ②: 授权批准 ⇒ 席位落地; the 批准后再推亦不过期 line now defines 席位落地 = 过落地前检、清标、ready、auto-merge, 踢出/变基同法 (its former 无批准 ⛔ 不翻 ready… half survives at red line 27). core-rules.md 红线: the mirror. Unchanged by design: the queue guards (their predicate already accepts the approval on any commit), objectui's AGENTS.md §9 (sibling repo, its own PR), and each seat's Routine text (updated at its next re-arm, per the card). Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude --- .claude/skills/pm-dispatch/SKILL.md | 6 ++-- .../pm-dispatch/references/core-rules.md | 2 +- AGENTS.md | 36 ++++++++++--------- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index c4c8389ce3..6d2648564a 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -24,7 +24,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - ⛔ PM 永不写代码、不写文件;唯一例外是维护者逐 PR 明示授权的 `.claude/` 内部工具 PR。 - ⛔ 该例外的 PR 不得自审自合:授权原话引在正文,复核由另一座位或维护者做。 - ⛔ 永不以任一账号对受管面 PR 提交批准 review,永不合并受管面 PR。 -- ⛔ 受管面 PR 无授权批准时永不翻 ready、永不入队、永不挂 auto-merge。 +- ⛔ 受管面 PR 无授权批准时永不翻 ready、入队或挂 auto-merge;批准在案后席位落地。 - ⛔ 永不合自己的 PR,永不合红的或未复核的 PR,永不绕过合并队列。 - ⛔ 永不派发 assignee 是别人的卡;⛔ 永不派发带 `needs-user-decision` 或 `pm:retriage` 的卡。 - ⛔ 永不代维护者答产品或架构问题;唯一例外是已裁的代裁通道,不得宽于其置信门。 @@ -607,14 +607,14 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - governed 面同含 `AGENTS.md` + `CLAUDE.md`;agent 指令文件跨仓同判,仓集读 `GOVERNED_REPOS`,此处不列。 - 路径面命中规则层 ⇒ ACCEPT 换终局四件套,混合 diff ⛔ 不按比例判;要拆让 dev 单独开 PR。 - ① 复核结论照常写在 issue 上;技能面 hunk 须由契约复审档的席复核,档外席先交 skills 席。 -- ② PR 留给维护者看得见地悬着;终局两条:人工直合即审核记录;授权批准 ⇒ 队列放行。 +- ② PR 留给维护者看得见地悬着;终局两条:人工直合即审核记录;授权批准 ⇒ 席位落地。 - 看得见 = ACCEPT 同笔挂 `needs-user-decision` + 贴终稿「维护者速读」评论;①仍是审核记录。 - 速读五段固定:改了什么/为什么改/风险与代价(含回滚)/席位意见/你要做的(一个动作)。 - 草稿归 dev:受管面 PR 正文带 `## 维护者速读(草稿)`,中文、业务角度,席位意见留空。 - 终稿 = 席位对照自己读的 diff 校正草稿、填席位意见后贴评论;维护者只读评论。 - PR 上的标签 = 待维护者审阅,不入六态;与请审同为等人合清单,随合并或撤回判决离开。 - 批准判定单源 = 队列守卫常量 `GOVERNED_APPROVERS`:授权账户 APPROVED 即算,⛔ 不卡 `commit_id`。 -- 批准后再推提交也不过期;无批准 ⛔ 不翻 ready、不入队、不挂 auto-merge。 +- 批准后再推亦不过期;席位落地 = 过落地前检、清标、ready、auto-merge,踢出/变基同法。 - ③ 在 draft PR 上向两个授权批准账户 `os-zhuang` 与 `hotlong` 都 request review,主动推。 - PR 作者身份即两账户之一的席位时,对该账户请审必失败(author-identity 422)。 - 该账户改为把 PR assign 给它替代通知,另一账户照常请审;轮次报告点名说明走了兜底。 diff --git a/.claude/skills/pm-dispatch/references/core-rules.md b/.claude/skills/pm-dispatch/references/core-rules.md index b25e0c2bb0..74cc457bad 100644 --- a/.claude/skills/pm-dispatch/references/core-rules.md +++ b/.claude/skills/pm-dispatch/references/core-rules.md @@ -5,7 +5,7 @@ - PM 不写任何文件;⛔ 永不合自己的、红的或未复核的 PR,合并只经合并队列发生。 - 版本发布必须人工,发现未经人工的发布痕迹按事故立案,⛔ 不代跑补救性发布。 - 版本包 PR 默认永不催,唯一例外是重要修复已合 main 在等发布且提醒点名用户后果。 -- 受管面由维护者人工合并且合并即审核记录,⛔ 席位永不以任一账号对受管面 PR 批准。 +- 受管面由维护者人合或授权批准后席位落地,⛔ 席位永不以任一账号批准受管面 PR。 - ⛔ 永不代维护者回答产品或架构问题,唯一例外是已裁的代裁车道。 - ⛔ 永不派发 assignee 属于别人的 issue,⛔ 永不派发带决策标签的 issue。 - 并行度以 `batch` 封顶,验证锁到达深度 ≥ `LOCK_DEPTH_HOLD`(2)即等;同批按构造文件面不相交。 diff --git a/AGENTS.md b/AGENTS.md index 6f62d26c22..bf7008352f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -252,10 +252,11 @@ localStorage / auth gotchas. When a cloud decision's **mechanism half** governs open code here, this repo carries its own ADR — own number, a `## Provenance` section naming the cloud record and its date, the commercial half left in cloud — and the cloud record gains a one-line pointer. Files never move between registries and numbers are never reassigned. -14. **⛔ A governed surface is confirmed and merged by the maintainer, by hand — no AI seat merges, queues, or arms - auto-merge on a PR whose diff touches one.** The governed surfaces are `docs/adr/**`, `.claude/**` (agents, hooks - and settings — not only skills), `skills/**`, `AGENTS.md` and `CLAUDE.md` — the file you are reading is one — - and a mixed diff is governed whole on a single path hit. The register is the `GOVERNED_SURFACES` table in +14. **⛔ A governed surface is confirmed and merged by the maintainer, by hand — or confirmed by an authorized + approval and then landed by the owning seat; before that approval no AI seat merges, queues, or arms auto-merge on a + PR whose diff touches one.** The governed surfaces are `docs/adr/**`, `.claude/**` (agents, hooks and settings — + not only skills), `skills/**`, `AGENTS.md` and `CLAUDE.md` — the file you are reading is one — and a mixed diff + is governed whole on a single path hit. The register is the `GOVERNED_SURFACES` table in `scripts/pm/check-governed-merges.mjs`; adding a surface is an edit *there*, never here, and `pnpm check:pm-governed-prose` reds per-PR when this paragraph names fewer surfaces than the register — or more. When it reds, name the surface here. @@ -265,15 +266,16 @@ localStorage / auth gotchas. auto-merge, ⛔ never flip it out of draft to make any of those possible — judged on the PR's **file list**, not its description; a **mixed diff is not a proportion question**, one path hit is enough; to land the rest, split off the governed files. **Those four lift only for an authorized APPROVED review** — by an account in - `GOVERNED_APPROVERS` (`scripts/pm/check-governed-queue-guard.mjs`), on ANY commit and not dismissed. The queue then - lands it. A later push does not expire that approval, and this gate does not re-review it. Hand-authored governed - content needs that approval; a PR whose only governed paths are register rows the queue leg regenerates byte-exact - clears with zero approvals — an uncertified recompute, drift or a hand-authored sibling keeps it governed. - Unapproved, the bypass direct merge (人工直合) is the only landing. **Landing is tiered**: a PR whose governed - paths all lie under `.claude/skills/pm-dispatch/references/` lands through the queue after the skills seat's - contract-tier review; every other governed path is the rules layer and waits for the maintainer's word. ⛔ **No - agent seat submits an approving review on a governed-surface PR, under any account** — an authorized account is - agent-operated too; "CI is green" carries no information about a governance change. + `GOVERNED_APPROVERS` (`scripts/pm/check-governed-queue-guard.mjs`), on ANY commit and not dismissed. That word is + spent once per PR: the OWNING seat then lands it, later pushes included, re-queuing after an ejection or a rebase on + its own pre-landing check; this gate does not re-review it. Hand-authored governed content needs that approval; a PR + whose only governed paths are register rows the queue leg regenerates byte-exact clears with zero approvals — an + uncertified recompute, drift or a hand-authored sibling keeps it governed. Unapproved, the bypass direct merge + (人工直合) is the only landing. **Landing is tiered**: a PR whose governed paths all lie under + `.claude/skills/pm-dispatch/references/` lands through the queue after the skills seat's contract-tier review; every + other governed path is the rules layer and waits for the maintainer's word. ⛔ **No agent seat submits an approving + review on a governed-surface PR, under any account** — an authorized account is agent-operated too; "CI is green" + carries no information about a governance change. **Already armed or queued when you read this?** Convert it back to **draft** AND disable auto-merge — draft is what removes queue membership, disabling alone drops only the arming — then confirm from the remote that it is in @@ -488,7 +490,7 @@ Even inside your own worktree, operate defensively: re-verification, done by the platform, race-free. **Arm only what is already green and accepted.** - ⛔ **Two classes of PR never enter this path, however green:** (a) a diff touching any + ⛔ **Two classes of PR never enter this path on green alone:** (a) a diff touching any **governed surface** (**Prime Directive #14**, which names them and holds the current list — **this file and `CLAUDE.md` are on it**, so re-read it rather than recalling it); (b) the **Version Packages** PR, or any PR whose merge performs a release @@ -1031,9 +1033,9 @@ registry? Add it to `OPEN_CAPABILITY_REGISTRIES` in the same PR that fixes it. the PR is accepted — arm auto-merge so the queue lands it (Multi-agent discipline §7: never straight to `main`; never arm a PR that isn't green yet). A finished task = a merged PR, not a dirty working tree. ⛔ **Except a diff touching a governed - surface** (Prime Directive #14 names them — more than ADRs): push it, open the PR, - and stop there, landing it is the maintainer's, by hand. For that class, a - finished task = a PR left visibly awaiting a human merge. + surface** (Prime Directive #14 names them — more than ADRs): push it, open the PR, and stop + there; landing waits for the maintainer's word. For that class, a finished task = a PR + left visibly awaiting that word. 3. **Add a changeset for anything that publishes.** Feature, functional improvement or fix — run `pnpm changeset` (or add a `.changeset/*.md` entry) describing it before committing. A bug fix in a released package takes a **`patch`** changeset — never none, and ⛔ never `skip-changeset`: that label is for a diff that publishes From 1ecc96e648be82ca09c9d1135cb71c5b58ec8bbc Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 13 Sep 2026 11:56:48 +0000 Subject: [PATCH 4/8] =?UTF-8?q?skills(pm-dispatch):=20lanes/ui.md=20states?= =?UTF-8?q?=20clause=20=E2=91=A1=20applicability=20for=20the=20ui=20lane?= =?UTF-8?q?=20instead=20of=20pointing=20at=20it?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Card 17933 (p2 Task, routed into this lane by the maintainer's direct word). The maintainer read the pointer as 「不是说你的 ui 车道不需要契约复审了吗?为什么还有 `needs:contract-review`」 — a misreading that had already happened on the rule's own user. lanes/ui.md 席内判断, one line replaced (38/38): the pointer 「档位与复核豁免边界读源码与 references/contract-review.md,⛔ 不凭记忆或继承的注记」 becomes the statement synthesised from contract-review.md's three paragraphs — clause ② review applies to this lane as default-tier self-review plus gates with the label hung as usual; only the independence piece and the downgrade fuse are exempt. The per-lane applicability table and the ruling on the 「复核正为补偿低档派发而存在」 derivation live in contract-review.md and ride the references PR. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude --- .claude/skills/pm-dispatch/references/lanes/ui.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.claude/skills/pm-dispatch/references/lanes/ui.md b/.claude/skills/pm-dispatch/references/lanes/ui.md index 7721a304e7..c4fea1515d 100644 --- a/.claude/skills/pm-dispatch/references/lanes/ui.md +++ b/.claude/skills/pm-dispatch/references/lanes/ui.md @@ -35,4 +35,4 @@ - 零读数恒配点亮的正控,且正控须经被测机制本身生效;本仓 search 假零,查重只引命中。 - 脚本能滚动不证明用户能滚动:可达性断言必须驱动真实输入管道。 - 落地验证按内容,正控须在合并前证明会响,⛔ 不按 sha 判已落地。 -- 档位与复核豁免边界读源码与 `references/contract-review.md`,⛔ 不凭记忆或继承的注记。 +- 条款②复核本席适用:默认判断档自审加门禁,标照挂;豁免只有独立性件与降档保险丝。 From da7a969ad786d3f4daf1985daf711c2fc523c7b4 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 13 Sep 2026 11:56:48 +0000 Subject: [PATCH 5/8] =?UTF-8?q?skills(pm-dispatch):=20the=20backlog=20swee?= =?UTF-8?q?p=20gains=20the=20fourth=20state=20=E2=80=94=20an=20ungraded=20?= =?UTF-8?q?card=20in=20pm:queue=20with=20a=20domain:*?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Card 17742, graded by the lane's self-triage (2026-09-12T02:20Z), verbatim: 「admitted as class (a) with one measured instance … Grade: pm:queue · Task · priority:p2 … (1) COUNT the population on both boards first … (2) then the cheapest of the card's three shapes that the count supports — a fourth disjunct if the population is small, the H-row home if it is large; (3) the round report's 裸卡 metric must say what it becomes」. Count, posted on the card before this edit (2026-09-13T11:46Z, repo-scoped REST lists, both boards, every page read): pm:queue ∧ domain:* ∧ ¬priority:* = 7 on objectstack and 31 on objectui — small, so the fourth disjunct is the shape; the pm:on-hold pool (69 / 46) is a decision already made and not a dispatch slot, so it stays outside the disjunct and is recorded as a measurement only. SKILL.md 分诊座位职责 (net 0): 析取 ④ takes the line of 「②③ 只取 updated_at …」 and carries that clause for ②③④; the 半状态治愈积压 line reads ②③④; the 轮次报告 裸卡数 metric line states 未定级数另计析取④. core-rules.md 分诊座位职责: the sweep mirror names 队列卡缺定级. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude --- .claude/skills/pm-dispatch/SKILL.md | 6 +++--- .claude/skills/pm-dispatch/references/core-rules.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index 6d2648564a..7af116df67 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -320,9 +320,9 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - Backlog sweep 是常设职责,每 fire 扫任一析取命中的卡。 - 析取 ①:全裸(无 `pm:*`、无 `needs-user-decision`、无 `domain:*`)。 - 析取 ②:有 `pm:queue` 无 `domain:*`(仅多车道仓);析取 ③:有 `domain:*` 无 pm-state。 -- ②③ 只取 `updated_at` 早于 ~2 分钟的卡。 +- 析取 ④:有 `pm:queue` 与 `domain:*` 而无 `priority:*`;②③④ 只取 `updated_at` 早于 ~2 分钟。 - 排除 `tracking`、`status:parked`、全部 `pm:seat` 贴、`qa-run` 记录。 -- 半状态治愈积压 ②③ 最老优先、P0 嫌疑先行,⛔ 优先最新不适用。 +- 半状态治愈积压 ②③④ 最老优先、P0 嫌疑先行,⛔ 优先最新不适用。 - 首触定级与三析取 sweep 每 fire 跑到清空:⛔ 无每轮总量预算,清得动就多清。 - 窗口耗尽未跑完的,下一 fire 从标签状态断点续跑。 - 排序:队列每轮清空时最新优先;清不空的那一刻起改最老优先。 @@ -677,7 +677,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 健康指标五个:可派发库存(open `pm:queue` 未认领及趋势);决策箱(待维护者数)。 - 决策箱指标还要点名带开放下游依赖的决策卡,从 `Blocked-by:` 反向索引现算。 - finding 数与中位年龄:裸标签数即未定级数,hold 已换标不在内。 -- 裸卡数与中位年龄:sweep 析取①,老化 = 首触欠账。 +- 裸卡数与中位年龄:sweep 析取①,未定级数另计析取④;老化 = 首触欠账。 - 发版阻塞 = 三仓 `target:` 之和,归零 = 三张板都空;总 open 数刻意不在指标内。 - Version Packages PR 默认永不催,挂着的发布 PR 是常态,⛔ 不进维护者摘要。 - 唯一例外 = 重要修复已合 main 在等发布;提醒必须点名该修复与不发版的用户可见后果。 diff --git a/.claude/skills/pm-dispatch/references/core-rules.md b/.claude/skills/pm-dispatch/references/core-rules.md index 74cc457bad..eb38e340a5 100644 --- a/.claude/skills/pm-dispatch/references/core-rules.md +++ b/.claude/skills/pm-dispatch/references/core-rules.md @@ -79,7 +79,7 @@ ## 分诊座位职责 - 执行席 ⛔ 跳过分诊动作,读到标签当既成事实。 - 两级盘点是小时轮读增量加每日全量对账,枚举须比对总数、不等即报不完整并点名缺口。 -- sweep 扫全裸卡、队列卡缺域标签、域标签卡缺 pm 状态,排除跟踪、停放与协议载体卡。 +- sweep 扫全裸卡、队列卡缺域或缺定级、域卡缺 pm 状态,排除跟踪、停放与协议载体卡。 - 首触定级跑到清空 ⛔ 无总量预算、未跑完断点续跑;清得空最新优先,否则最老优先。 - 裸卡超过十五张则下一轮改域分批集中模式,每批不超过五张同族卡。 - 有落点或可复现的缺陷、范围明确的工具修复与实现未被裁错的说明书脱节进 `pm:queue`。 From fb0b5e18928d3ba9f586916ca65193fa7360788b Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 13 Sep 2026 11:56:49 +0000 Subject: [PATCH 6/8] skills(pm-dispatch): the director seat presents the governed drafts awaiting the maintainer's word as one decision batch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Card 17951 (p2 Task; the reading-cost half of the maintainer's question, verbatim: 「③ 受管面手合本身也是一条队列。能否简化我的审核步骤,比如我召唤项目总监时可以批量决定?」). SKILL.md 升级与决策 (+1; the family PR nets 0): after the director's four duties, one line — every summon presents the governed drafts carrying an in-seat ACCEPT as one batch of at most five rows; the approval and the merge stay the maintainer's own clicks. AGENTS.md Prime Directive 14: the same duty as one clause of the tiering sentence (the directive is 34 lines before and after the family; 1072 → 1075 across its commits). Not in this commit: lanes/director.md and decision-analysis.md (references PR). Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude --- .claude/skills/pm-dispatch/SKILL.md | 1 + AGENTS.md | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index 7af116df67..4a145e608d 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -764,6 +764,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 每问必带推荐项,被 Skip 或长挂即转卡通道,⛔ 不重弹。 - 项目总监席:维护者在所在仓召唤,入口 `/pm-dispatch director`;⛔ 无 Routine 无 cron。 - 四职 = `needs:contract-review` 事后审计、决裁勤务、维护者动作台账、governed 合并审计。 +- 每场召唤把带席内 ACCEPT 的受管草稿呈为一批 ≤5 行决裁;批准与合并仍是维护者的点击。 - 总监席档位由维护者按项目人工定,每场记入摘要台账;⛔ 无档位硬门、无免档整理态。 - 总监席是唯一裁决者:决策箱、代裁与一类自裁只出自本席,⛔ 无子代理无自述。 - 总监席不占 `domain:*`,永不认领 backlog、永不写码;章程见 `references/lanes/director.md`。 diff --git a/AGENTS.md b/AGENTS.md index bf7008352f..f04446be10 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -273,7 +273,8 @@ localStorage / auth gotchas. uncertified recompute, drift or a hand-authored sibling keeps it governed. Unapproved, the bypass direct merge (人工直合) is the only landing. **Landing is tiered**: a PR whose governed paths all lie under `.claude/skills/pm-dispatch/references/` lands through the queue after the skills seat's contract-tier review; every - other governed path is the rules layer and waits for the maintainer's word. ⛔ **No agent seat submits an approving + other governed path is the rules layer and waits for the maintainer's word, which the director seat requests as ONE + batch of at most five rows — the approval stays the maintainer's click. ⛔ **No agent seat submits an approving review on a governed-surface PR, under any account** — an authorized account is agent-operated too; "CI is green" carries no information about a governance change. From e843be5e0cdd89a59dc98a4c3150b966512e2f81 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 13 Sep 2026 11:56:49 +0000 Subject: [PATCH 7/8] =?UTF-8?q?skills(pm-dispatch):=20lanes/triage.md=20?= =?UTF-8?q?=E2=80=94=20a=20six-state=20label=20that=20appears=20concurrent?= =?UTF-8?q?ly=20belongs=20to=20the=20seat=20that=20wrote=20it?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ruling B on card 17624 (director seat, decision batch 125 item 5, 2026-09-13): 「同意」 — the concurrency principle replaces line 7 of lanes/triage.md, a near-verbatim duplicate of the SKILL.md 分诊座位职责 line; the ratchet cap stays at 7. Precondition (ruling item 2) measured word by word: line 7 differs from the SKILL.md line only by 「分诊」 inserted (the subject the SKILL.md section already supplies) and 「裁定」 dropped (SKILL.md is the stricter spelling); neither difference carries a rule absent from SKILL.md, so B stands. lanes/triage.md line 7 (7/7): the restatement is replaced by 「补半状态前先确认无人在动;读取之后才出现的六态属他席,停手重读,⛔ 不替换」. The other three disciplines stay closed by measurement (no shared six-state writer under scripts/pm/), per the ruling's item 3. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude --- .claude/skills/pm-dispatch/references/lanes/triage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.claude/skills/pm-dispatch/references/lanes/triage.md b/.claude/skills/pm-dispatch/references/lanes/triage.md index e5e3e7606f..e6bcb3eb0e 100644 --- a/.claude/skills/pm-dispatch/references/lanes/triage.md +++ b/.claude/skills/pm-dispatch/references/lanes/triage.md @@ -4,4 +4,4 @@ - 分诊每 fire 只取一个仓,两仓轮替:objectstack、objectui、objectstack……;仓内按最旧优先。 - 饥饿守卫:轮次开始时任一仓最旧未路由卡超过 4 小时,该仓本轮优先,不论轮到谁。 - ⛔ 不回退到跨仓全局最旧优先;⛔ 不因积压增设第二分诊席或改 fire 频率。 -- ⛔ 分诊不挂 `needs:contract-review`:随 draft PR 或 `Clause-②: yes` 认领;写方向、给六态之一。 +- 补半状态前先确认无人在动;读取之后才出现的六态属他席,停手重读,⛔ 不替换。 From 8c34811896c8d3a3eb7902bb42e0a5239accc6c0 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 13 Sep 2026 11:58:49 +0000 Subject: [PATCH 8/8] =?UTF-8?q?skills(pm-dispatch):=20the=20epic=20lane's?= =?UTF-8?q?=20spec=20lines=20follow=20the=20follow-through=20ruling=20?= =?UTF-8?q?=E2=80=94=20planned=20spec=20sub-issues=20still=20route=20to=20?= =?UTF-8?q?the=20spec=20seat,=20derived=20work=20stays=20with=20the=20clai?= =?UTF-8?q?ming=20seat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up on card 17942 (same ruling as the first commit: 「同意」 to `1A(+三类表)·2(1)·3A·4B`, and 「以上接受你的建议。」 — the spec seat keeps the intake of NEW packages/spec work; a cross-lane surface found after dispatch, packages/spec included, does not move the card). Two 座位贴协议 / Epic 子树车道 lines still said 「packages/spec 恒归 spec 座位」 and 「(sub-issue 或衍生)⇒ 照旧转 spec 座位队列」, which would have re-created the transfer the ruling removed for derived work. Both are rewritten in place (net 0): planned spec sub-issues still route to the spec seat with the epic side writing Blocked-by:; derived work follows the three-class rule of 执行座位职责. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude --- .claude/skills/pm-dispatch/SKILL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index 4a145e608d..881b23c903 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -283,7 +283,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 平台事实变化 → references 事实表改一行。 - 三类以 `finding` 入 skills 车道由该席分诊;三类之外默认关 not planned。 - 接管/移交 = 改正文 + 审计评论(只作审计);收尾清单等细则见 `references/seat-post-protocol.md`。 -- epic 委托不入座位贴体系;`packages/spec` 恒归 spec 座位。 +- epic 委托不入座位贴体系;新 `packages/spec` 工作恒归 spec 座位。 ## Epic 子树车道 @@ -296,7 +296,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 离开子树(交车道或转 spec 座位)同一笔标签写摘 `pm:epic` 加 `pm:queue`。 - `pm:epic` + `pm:queue` 同卡 = 半状态(保留兼移交);后者即已移交,取回走全套认领协议含重读。 - 单车道仓(无 `domain:*`)开卡即认领合法;多车道仓域标签前置照旧,子树标记即保留。 -- 触 `packages/spec`/公共契约(sub-issue 或衍生)⇒ 照旧转 spec 座位队列,epic 侧写 `Blocked-by:`。 +- 新立 spec/公共契约 sub-issue 照旧转 spec 座位队列,epic 侧写 `Blocked-by:`;衍生按三分留席。 - 顺带发现 ⇒ 独立立单进修复落地仓,附查重词;⛔ 不借 sub-issue 通道塞未分诊卡进池子。 - 每次分流留一行审计评论;父单维护 checklist 汇总评论,决策仍锚在具体 sub-issue。 - 收尾四步、僵尸回收与领地防撞细则见 `references/seat-post-protocol.md`。