From 834fae19dff6a133e9b8d44a17a85eb21222d413 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Aug 2026 14:12:07 +0000 Subject: [PATCH 1/3] =?UTF-8?q?docs(pm-dispatch):=20sweep=20=E6=89=93?= =?UTF-8?q?=E5=8C=85=E6=99=8B=E7=BA=A7=E6=9D=A1=E6=AC=BE(#6243=20=E8=AF=95?= =?UTF-8?q?=E7=82=B9=E5=AE=9A=E7=A8=BF)+=20mode:cloud=20=E4=BA=A4=E4=BB=98?= =?UTF-8?q?=E9=80=9A=E9=81=93=E4=BA=8C=E4=BF=AE(=E8=87=AA=E5=BC=80=20PR=20?= =?UTF-8?q?+=20=E8=AE=A2=E9=98=85=E5=94=A4=E9=86=92)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 发现分诊轮新增 sweep 打包晋级:同类判据、逐项清单、零 rider 自证、范围外 照旧单开、成员单防双派 —— 五条均出自 #6243/PR #6288 试点实测。 mode:cloud 第 3 课改写:create_session 卡实测持有 GitHub API 工具(三例), 正道改为 dev 自开 draft PR + 终报 issue 评论 + PM 挂 subscribe_pr_activity 秒级唤醒;降级通道收窄到 trigger 拉起的会话;巡检退为兜底心跳。 Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY --- .claude/skills/pm-dispatch/SKILL.md | 52 ++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index fa85edea76..60f3b4c42c 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -818,6 +818,24 @@ Prime Directive #10 是一个强力生产者,而循环原本只有「修掉」 范围 —— 已排队父单的 sub-issue 会自动成为派发候选(step 1),把仅有依赖 关系的发现挂进去等于让未分诊的东西静默入池;那种情况独立立单 + `Blocked-by:`(cloud#1045/#1046 之于 cloud#1050 即此形)。 +- **sweep 打包晋级**(试点 #6243 / PR #6288 一轮跑顺后定稿,维护者 + 2026-08-07 批准):晋级一批**同类**发现时,可以打包成**一张 sweep 卡** + 代替逐张入队 —— 一次认领、一个 PR、N 条 `Fixes`、逐项清单评审,把每单的 + 认领/PR/CI/验收固定开销摊薄到 1/N。这是「顺手修」的制度化替身:省同一笔 + 固定开销,但评审完整性不打折。打包判据与纪律,五条都是试点实测过的: + 1. **同类才打包**:全部命中同一判据(试点即「description 面在说谎或漂移」, + 全部校验不变量卡);不同性质的卡打包=一张 PR 里混多个评审面,禁止; + 2. **逐项清单是 PR 正文的必备件**:每项一行 落点 | before | after,评审 + 按行核,不按 diff 顺序读; + 3. **N 项之外零改动**,且 PR 自证(`git diff --stat` 文件数与清单一一 + 对应)—— 这是 sweep 与 rider 的分界线; + 4. **范围外发现照旧单开**(PD #10 不因打包而豁免;#6287 之于 #6288 即 + 此形); + 5. **卡片本身是认领对象**:sweep 卡入队、被认领,成员单保持 `pm:queue` + 标签但**不再是可派发候选**(选择期按 sweep 卡的成员清单排除,防双派; + PR 合并时 N 条 `Fixes` 齐关)。 + 适用面注记:`domain:spec-surface` 车道的默认运行模式即 sweep-first + (见「`spec` 一分为二」);其它车道按发现批次的同类度自行判断。 #### 发版板(`target:` —— 发版视角的常设轴,维护者 2026-08-06 拍板) @@ -1357,15 +1375,31 @@ to `mode:subagent`). 处停摆,而 PM 只能靠 poke 唤醒。条款原文形:⛔ 不为提问/中期汇报结束回合; 开放选择按裁决与三轴自裁记入终报 open_questions;合法回合终点只有 (a) 推送完成 + 终报 JSON 作为最后一条消息,或 (b) 硬阻塞详报。 -3. **交付通道写明降级路径。** 云会话通常没有 GitHub API 工具(连接器不随 - create_session/trigger 传递),派发词写明:开 PR / 发评论失败 ⛔ 不视为 - 阻塞 —— 推送 outcome branch + 终报作最后一条会话消息,**PM 代开 draft - PR、代转录报告**到 issue(权限面不因此放大)。 - -**监控与转向**:`get_session` 读实时状态(status / model / token 用量; -IDLE + 分支未推送 = 停摆待 poke);投递消息用**绑定会话的 poke 触发器** -(`create_trigger` 带 `persistent_session_id` + `fire_trigger` + 用后即 -`delete_trigger`)。收报:巡检主动读会话终报与分支推送,⛔ 不等推送通知。 +3. **交付通道:自开 PR + 订阅唤醒是正道,降级通道只属于 trigger 流。** + 初版条款以为云会话一律没有 GitHub API 工具 —— 对 `create_session` 卡是 + **过度保守的误判**(2026-08-07 下午三例实测推翻:#5599 会话自发 issue + 评论、#5775 会话自立两张 issue、#6243 会话自开 PR #6288),没有工具的只是 + **trigger 拉起**的会话(与第 1 课的 403 同源)。据此分流: + - **create_session 卡(常态)**:派发词要求 dev **自开 draft PR** + (`Fixes #`,正文含验证记录)并把终报以 **issue 评论** + (``)交付;PM 在派发后立即对该 PR(或预期分支的 + PR)挂 `subscribe_pr_activity` —— dev 的完成动作即 webhook,通知延迟从 + 「≤巡检间隔」降到秒级。**例外仍归 PM 代办**:会话未 attach 的姊妹仓 + (源仓之外)依旧够不着 —— 跨仓跟进卡由 PM 代立(#5775 的 objectui + 跟进卡即此形)。 + - **trigger 拉起的会话(定时/重复型)**:维持降级通道 —— 推送 outcome + branch + 终报走报告 ref(空提交信息)或最后一条会话消息,PM 代开 + draft PR、代转录(权限面不因此放大)。附一条实测:报告 ref 用完后 + PM 侧 `push --delete` 会被 git 代理 403(推送授权不含删 ref),清理 + 要走有权限的通道或留给维护者。 + +**监控与转向**:事件面交给 PR 订阅(上条),`get_session` 读实时状态 +(status / model / `post_turn_summary`;IDLE + 分支未推送 = 停摆待 poke); +投递消息用**绑定会话的 poke 触发器**(`create_trigger` 带 +`persistent_session_id` + `fire_trigger` + 用后即 `delete_trigger`)。巡检 +从主通知通道退为**兜底心跳**:webhook 不保证送达(CI success/新推送/踢队 +可能缺席),定时器仍要挂,但频率可放宽,且每轮先核订阅已覆盖哪些面、只补 +盲区(会话停摆、未开 PR 的分支、姊妹仓动静)。 #### 座位 Routine 化(PM 侧的运行形态,#5472 第 5 点) From cef3644640059b28acd2405a41e40e1003646de9 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Aug 2026 14:13:36 +0000 Subject: [PATCH 2/3] chore: re-run CI after skip-changeset label (gate reads live labels on rerun) Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY From 5e0663b35b986b7fad426aed2394131dab51172f Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 8 Aug 2026 08:38:29 +0000 Subject: [PATCH 3/3] docs(pm-dispatch): seven operational notes from the 2026-08-08 spec-lane shift (14-20) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Battle-tested additions to the 实测坑位 section, each anchored to the incident that paid for it: 14. GraphQL quota debt as an ordered ledger — issue_write's LOOKUP half is GraphQL too, so claims are unavailable during quota-red, not just slow (four zero-outs in one morning; three PRs queued in one recovery window). 15. Parallel spec PRs both moving the pin-count assertion get kicked from the merge queue — stack receipts in merge order, recount from the file (#6512 resolved the same line twice: +1 under #6515, then -7 under #6526). 16. Findings-sweep promotions and sweep cards must re-verify against the main of NOW — an ADR phase commit can absorb members wholesale (#6488's two members absorbed by #6279; the dev's evidence-backed zero-impl stop is the correct output). 17. When a ruled action collides with a measured counter-fact (#6483 vs ADR-0094): execute the ruling, invert the pins honestly, no promote, file the decision card, hold auto-merge for an explicit objection window. 18. Container-restart recovery: triage each dead dev's site into three states — pushed+PR / mid-regen (PM finishes mechanically, 'Recovery commit:' prefix) / mid-source-edit (judge the diff first). 19. Contract-surface changes must run consumer-package tests — a broken fixture in package B only fails from B's own suite (#6287, #5046 family). 20. When a hard precondition needs a repo this seat cannot reach, post the exact commands for the owning seat and wait for readings (#4914); unreachable is not zero-hit. --- .claude/skills/pm-dispatch/SKILL.md | 73 +++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index ff387477e7..15a0d3ab6e 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -397,6 +397,79 @@ REST 取 `body`(原文 4321 / 5183 / 4181 字符)+ 取 `body_html`(渲染版)— `POST /issues/{n}/labels`(真追加),或读-合-写三步;写后照上面 label discipline 的「写后回读」核对。 +**14. GraphQL 配额欠账要清单化,恢复窗口一次连清 —— `issue_write` 连读半边都吃 +GraphQL。** notes 3 说过读走 REST、写排队;2026-08-08 spec 车道一个上午配额四度 +归零,补上三条实测: + +- **`issue_write` 的查找半边也是 GraphQL**:配额红时连「改标签」都失败在 + `failed to get issue ID` —— 认领(assign+label)因此整体不可用,⛔ 不要以为 + 「只是写慢点」;认领类动作在配额红期就是排队,评论(REST)可先行落地把结论 + 发出去。 +- **欠账列成有序清单挂进巡逻词**,不靠记忆:哪个 PR 欠 ready 切换、哪个欠 + auto-merge、哪单欠 close/标签,恢复后按序连打 —— ready → auto-merge → 入队 + 可以在同一个恢复窗口内一气完成(实测三个 PR 十分钟内全部入队)。 +- 每轮巡逻**先探一个最便宜的 GraphQL 写**当配额读数,红了立刻回事件流,不逐个 + 试报错。 + +**15. 并行 spec PR 都动 pin 计数断言时,队列会踢后进者 —— 收据按合并顺序堆叠, +计数从文件重数。** `type-alias-convention.pin.test.ts` 的计数断言是同一行,两支 +在飞 PR 各自 +N/−N 时文本必冲突:入队合并撞上前车结果树 ⇒ `MERGE_CONFLICT` 踢出 +(#6512 实测,同一分支解了**两轮**:先撞 #6515 的 +1,再撞 #6526 的 −7)。规程: + +- 解冲突时**两侧收据都保留**,按合并顺序堆叠,新计数**从合并后源码重数** + (`grep -c '^export type Iso'`),⛔ 不从两侧收据做算术 ——「the file, not the + history, is the operand」,#6526 的收据注释原文; +- 双方都占用同一个 Iso 编号是常态(各取当时 max+1),重编号**后进侧**; +- 预期这种 PR 被踢不是事故:踢出通知到达 ⇒ 按 os-regen 四步再解一轮即可,不必 + 预防性串行化两支 PR。 + +**16. findings sweep 晋级与 sweep 立卡,前提核查要对「此刻的 main」—— 同族 ADR +的 phase 提交能整体吸收成员。** #6488(X/XParsed 恢复卡)两成员 #5507/#5975 的 +晋级(00:40)与立卡(01:48)都晚于 ADR-0122 phase 2 的合并(前夜 19:47,#6279 一次 +翻转全仓 1384 个裸别名)却未对其后的 main 重验 —— 派发后 dev 动工前置门才发现 +**零剩余工作**,两成员整体被吸收。晋级/立卡不是免检通道:它们与派发一样要吃 +「前提对此刻 main 成立」这条判据,同族里有在飞或新落的 ADR phase 提交时尤其要查 +其合并时间线。dev 的正确产出是**带证据的零实现停手**(空提交承载报告),PM 抽验 +后关卡 —— 这是流程产出的「好的失败」,勿当返工计。 + +**17. 裁决明令的动作在实施中测出对向事实 —— 照裁决执行、如实反转 pin、不 +promote、立独立决策卡、扣 auto-merge 留异议窗口。** #6483 裁决①明令 permission +免测量回滚,实施测量发现 ADR-0094 有 2026-07-14 的方向确认 + 4 处生产写点,回滚 +即打断它。处置形状(全套缺一不可):按裁决字面执行;把被打断行为的功能 pin +**反转为拒绝 pin**(不是删除);⛔ 不在同 PR 里做任何 promote/回退;PM 把冲突立成 +`needs-user-decision` 卡(A/B/C + 推荐);该 PR **不挂 auto-merge**,合并前留给 +维护者一个显式异议窗口。既不拿新事实推翻已下的裁决(那是维护者的权限),也不让 +新事实被合并流程静默碾过。 + +**18. 容器重启杀死在飞 dev —— 现场三态判读,四步 regen 中途的可机械续作。** +2026-08-08 一次重启同时杀死四个容器内 dev(云端工头不受影响 —— 独立容器)。 +恢复前先对每个现场做三态判读: + +- **分支已推 + PR 已开**:只欠验收 —— CI 重跑 + step-7,不动代码; +- **死在四步 regen 中途**(工作树里未提交的全是生成物,merge commit 已在):PM + 直接续作 —— build → 整链 regen → `check:generated` 10/10 → 提交推送;恢复 + commit 统一 `Recovery commit:` 前缀留审计;⚠️ 有的现场 regen 一件没跑 + (#5628 实测:CI 的 check:docs 红了才暴露),推送前先跑一遍 `check:generated` + 别赌; +- **死在源码编辑中途**(未提交的是 src):先读 diff 判完整性 —— docblock 把动机 + /失效模式/判据写全的(#5583 的 TDZ cycle fix 实测),PM 可代跑其终验(eager + 重现路径 + 定向 + 全量)后提交;写了一半、意图不明的,⛔ 不代提交,记进交接。 + + dev 的 `.os-scratch/` 一类临时目录是工作物不是交付物,清掉,⛔ 不进 feature PR。 + +**19. spec 改动的 fixture triage 必须跑消费包测试 —— B 包的坏 fixture 只有 +消费者面能跑红。** #6287 的映射变更让 metadata-protocol 一条 conformance fixture +反着断言,spec 范围内任何 sweep 都看不见它(PR #5046 同族:改在 A 包,坏 fixture +在 B 包)。派发令里「消费者面跑一遍」不是礼貌性复测,是唯一能抓到这类断裂的一步 +—— step 5 的派发模板对动契约面的单,消费包测试清单要点名列出,dev 报告里要有 +各消费包的真实读数。 + +**20. 硬前置要的仓不可达时 —— 请对应座位代跑并回贴读数,勿派勿硬做。** #4914 的 +裁决硬前置是 cloud/objectui 两仓裸名反查,实测本席凭证 `add_repo` cloud 被拒 +(工头会话同样看不见该仓)。处置:在 issue 上贴出**给对应座位的现成命令**(含 +notes 6 的对照反查),等读数回贴再派;⛔ 不因「查不了」就当「查过了干净」—— +不可达 ≠ 零命中,这是 notes 6「缺失类读数先证伪扫描器坏了」的跨仓版。 + The product spans three repos with a fixed dependency direction: `objectstack` (backend; `packages/spec` is the single contract) → `objectui` (frontend; its build flows back via `pnpm objectui:refresh`) and