diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index a3bb50913a..b80849309c 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -165,9 +165,9 @@ fire 一轮烟测,判据取**GitHub 上的产出**;③ 每 fire 一轮:读座位 据(「若 X 则 Y」),其余指针化 (座位贴为唯一状态源);⛔ 不写结论、不含未经重读即可执行的祈使句。 - **放行认门禁 job 的结论,不认聚合读数**(承载门禁族的 job 须 `completed: success`,`in_progress` - 不算;聚合只作阴性筛查,放行按名定向读单条 job,⛔ 不拉全表);advisory 门禁红着合并进 main - 是共 - 享损伤,任何车道发现都立即止血 + 立单;落地两个读数与踢出重投的签名纪律见事实表。 + 不算;聚合只作阴性筛查,放行按名定向读单条 job,⛔ 不拉全表);advisory 门禁红着合并进 + main 是共享损伤,任何车道发现都立即止血 + 立单(main-red 跳队与锚卡两约定见 + landing-operations B);落地两个读数与踢出重投的签名纪律见事实表。 - **dev 自己死了 ≠ 维护者中止**:子代理消失(零推送/零分支/无报告)是正常死法,走死认领回 收;「维护者中止」只在有显式信号(原话,或宿主回报 stopped by the user)时成立 —— 判据是 信号不是症状,⛔ 不得据推断立一道没有重启条件的门。 @@ -776,7 +776,7 @@ os-zhuang 审核。我的手机github 应该会收到推送消息吧」;当日 队列强制的地板,不是 PM 放行的门槛;非必查门的红要么是真缺陷要么是坏门,两者都归 PM 入 队前处置(实测:一张 required 全绿、非必查类型门与一个测试分片红着的 PR 经队列落地,该仓 main 红了约一小时,逐 PR 连环红到 fix-forward 才止)。本段只适用本循环派发的 dev PR;PM 自己的 -工具 PR 留维护者。 +工具 PR 留维护者。main-red 修复的跳队例外与事故锚卡约定见 landing-operations B。 **入队与落地(细则见 `references/landing-operations.md`,落地窗口查阅)。** 原则: diff --git a/.claude/skills/pm-dispatch/references/landing-operations.md b/.claude/skills/pm-dispatch/references/landing-operations.md index b6cac386b8..a650f72e29 100644 --- a/.claude/skills/pm-dispatch/references/landing-operations.md +++ b/.claude/skills/pm-dispatch/references/landing-operations.md @@ -8,15 +8,12 @@ 批次选择只保证同批 file-disjoint,管不到先后两单都碰生成物(协议变更几乎必然)。 `merge=os-regen` 路径清单**当场读**:`grep os-regen .gitattributes`(唯一权威清 单,⛔ 不抄进派发令当常量 —— 散文没法被类型检查;文档产物同在清单、同样被吞)。 -该驱动 merge exit 0、零冲突标记,却**静默丢掉一侧改动** —— 只有重新生成才暴露。 -四步序已机械化:`bash scripts/pm/os-regen-merge.sh` —— ① `git merge origin/main` -(⛔ 禁 rebase / force-push);② 生成物 `git checkout origin/main -- <路径>`;③ -**先 commit 掉 merge**;④ 整链重生成 + 生成物门禁全绿。顺序防的陷阱: +四步序已机械化:`bash scripts/pm/os-regen-merge.sh`(⛔ 禁 rebase / force-push; +步骤以脚本自身为权威)。顺序防的陷阱: -- **MERGE 状态下跑 `gen:schema` 会把 authorable-surface 锚点静默倒退回旧分叉点** - (HEAD 仍是合并前分支 tip),倒退后的锚点**依然 authentic**、全部门放行 ——「先 - commit 再重生成」的由来。 +- **MERGE 状态下跑 `gen:schema` 会把 authorable-surface 锚点静默倒退回旧分叉点**, + 且全部门放行 ——「先 commit 再重生成」的由来。 重生成后**断言所有兄弟单的条目都还在**;更硬的旁证是查**上一单的实现体**完好(带 引号精确名 `git grep … origin/main -- <实现文件>`)—— 条目是索引,实现体才是被吞 @@ -27,19 +24,16 @@ ## B. 跟到 MERGED 为止;入队后的看护归车道 PM 落地窗口 车道 PM 的权责:验收(复核清单);**首次入队** —— ACCEPT 后挂 6–9 分钟 flip 定点,到点核门禁 -job 结论(承载门禁族的 job `completed: success`),绿即转 ready + 挂 auto-merge,未绿阶梯重挂; -CI success webhook 不可靠,⛔ 不坐等不忙轮询;定点文本照定时器写法纪律(幂等开头、只写判 -据);确认 **MERGED** —— 每轮同时读队列分支与 `origin/main` 两个读数。ready 与 auto-merge 顺 -序不可反(转回 draft 会同时掉 auto-merge 与队列成员资格)。**契约复审链 PASS 落地的 PR 到窗 -口时已 ready + auto-merge 在挂**(清标与落地同一笔,见 `contract-review.md`)—— 窗口自身权责 -不变:跟到 MERGED、踢出处置、落地后对账。 - -**转 ready / 挂 auto-merge 之前先读 `mergeable_state`**:`dirty` ⇒ 先 merge `origin/main` -(生成物在面上按 A 的固定序)再挂;`unknown` ⇒ 重读一次(惰性计算,事实行见平台读数)。 -**ready + 全绿 ≠ 已入队 —— 队列从不主动拉 PR,入队是显式动作。**零 `enqueued` 事件按序查: -① `mergeable_state` 是否 `dirty`;② enable-auto-merge 调用根本没落地(GraphQL、吃配额、回显 -两向不可靠,按既有陷阱行重发一次,以 timeline 事件验证,⛔ 不看 `auto_merge` 字段);③ PR -碰 `.github/workflows/**` 而 token 缺 workflows 权限。 +job 结论,绿即转 ready + 挂 auto-merge,未绿阶梯重挂;CI success webhook 不可靠,⛔ 不坐等不忙 +轮询;定点文本照定时器写法纪律;确认 **MERGED** —— 每轮同时读队列分支与 `origin/main` 两个 +读数。**契约复审链 PASS 落地的 PR 到窗口时已 ready + auto-merge 在挂**(清标与落地同一笔,见 +`contract-review.md`)—— 窗口自身权责不变:跟到 MERGED、踢出处置、落地后对账。 + +**转 ready / 挂 auto-merge 之前先读 `mergeable_state`**(事实行见平台读数):`dirty` ⇒ 先 merge +`origin/main`(生成物在面上按 A 的固定序)再挂。**ready + 全绿 ≠ 已入队 —— 队列从不 +主动拉 PR,入队是显式动作。**零 `enqueued` 事件按序查:① `mergeable_state` 是否 `dirty`; +② enable-auto-merge 调用根本没落地(重发与效果验证序列见平台读数);③ PR 碰 +`.github/workflows/**` 而 token 缺 workflows 权限。 **确认 MERGED 的同一动作里给 `Part of` 卡收口**(`Fixes` 卡 GitHub 代关、标签随 卡离开在飞视图):`Part of` 卡开着不摘 `pm:dispatched`,就把无在飞物的卡永远算在 @@ -61,12 +55,18 @@ CI success webhook 不可靠,⛔ 不坐等不忙轮询;定点文本照定时器 告已收复核,⛔ 合并前不归档(活会话是 dirty 自救的执行手;误归档可 unarchive,但 容器现场已失,宁晚勿早);暂停/交接把在挂订阅清点进座位贴,⛔ 不留孤儿订阅。 +**main-red 事故两条约定**:① **p0 fix-forward 允许跳队**(维护者 2026-08-25「同意」):main 红的 +止血 PR(p0、机械、根因已核实)可跳队(GitHub 队列自带 jump-the-queue),或按既有 governed +例外由维护者人工直合一行修复 —— 排在事故自己堵住的队列后面是具名反模式;仅限 +main-red 修复,⛔ 不放宽其它任何 PR 的 queue-only 落地。② **一个失败 check 只锚一张卡**(维 +护者 2026-08-25「同意」):main-red 事故按失败 check 名锚一张卡,先立者赢;后见者把读数评论 +到锚卡上,⛔ 不另立。 + ## C. 依赖前棒才能转绿的 PR:draft 停放 + 签名级预期红清单 -串行链里后棒常常先行实现。这种 PR **停在 draft**,PR body 写两样:**精确的预期红 -清单**(逐条失败测试名 + 报错签名 ——「几条测试会红」不够用)与**解除条件**(「依 -赖 PR #N 合入」)。每个 CI-failure 事件与清单比对 —— 签名匹配静默跳过,**新签名才 -是真问题**。依赖合入后:最后一轮同步 → 红清零 → 转 ready → 入队。 +这种 PR **停在 draft**,PR body 写两样:**精确的预期红清单**(逐条失败测试名 + 报错签名)与 +**解除条件**(「依赖 PR #N 合入」)。每个 CI-failure 事件与清单比对 —— 签名匹配静默跳过, +**新签名才是真问题**。依赖合入后:最后一轮同步 → 红清零 → 转 ready → 入队。 ## D. 串行接力:多个已实现 PR 全碰生成物时,一次只放行一个