Skip to content

Commit 2659901

Browse files
pm-dispatch references: the seat record reads the head's check-runs as gate evidence; ACCEPT is the PR's seat record; two pre-landing checks (#23439)
Fixes #23409 Clause-②: no The card's two items plus the three added in comment 6163735021, inside triage's scope (comment 6163828327): text only, all under `.claude/skills/pm-dispatch/references/**`; no `SKILL.md`, no `scripts/**`, no new gate. Dispatched by the `domain:skills` seat 1 under the claim in comment 6164024645 (branch `claude/issue-23409-seat-record-reads-check-runs`, session `session_013zGKMG1cRedVzWtqGGGZW9`). Base: `origin/main` at `04a314873c`, with PR #23389 and PR #23422 both on `main`. Authority: the remainder of #23378's 方案 4 under the maintainer's 「同意」, verbatim: 「dev 本地验证瘦身,CI 是证据。本地只跑改动包的 typecheck 和测试、以及读到改动文件的门禁族;全量门禁族交给 PR 的 CI check-runs,ACCEPT 读 check-runs(复审员已经这么做)。」 This PR carries its change 4, the seat half; the dev half is already on `main` from PR #23405. ## 维护者速读(草稿) **改了什么**:PM 派发协议的三份参考文件,各改一行,纯文本: ① 复核清单写明「席位核对」的门禁证据就是 PR 当前 head 上的 CI check-runs(名称+结论),dev 在本地跑的门禁只证明本地那一小部分,不能顶替缺席的 check-run; ② ACCEPT 判决的落点从「卡上一条英文短评论」改为「PR 上的 `## 席位核对` 评论,卡上只留一行指针」,对所有 PR 一律适用; ③ 落地细则里「落地前检三条」改为「两条」,与契约复核细则的枚举对齐。 **为什么改**:落实您对「CI 是证据、ACCEPT 读 check-runs」的同意——dev 一侧已落地,本卡补上席位一侧;另两处是今天两份协议 PR 落地后遗留的文本不一致,不改会让席位按两种说法各行其是。 **风险与代价(含回滚)**:无代码、无脚本、无新门禁;三个文件行数均不增(77/183/101 持平)。复核清单为腾出一行,删去了「复核后又推提交须补跑并集」一句——dev 契约自带同一句,上一行也已判过时的本地并集不作数,所以不丢规则。回滚 = revert 本 PR。 **席位意见**: **你要做的**:无需操作——`.claude/**` 属 Tier S,由席位契约复审档复核 PASS 后入队;若反对「ACCEPT 一律落在 PR 上」,在 #23409 线程留一句否决即可。 ## Rule sentences, before → after ### 1. `references/review-checklist.md` 〈测试与门禁证据〉: the seat record's gate evidence (77 → 77 lines) ```text before: (none) after: - 席位核对门禁证据 = 钉 head 的 check-runs(名+结论);本地并集只证本地子集,⛔ 不替缺席者。 ``` New line 49, 118 bytes. It sits after the two head-pin lines for check-runs (`:47` pins every gate reading to `head.sha`, `:48` the non-head `cancelled`), so 「钉 head」 is that pin, and before the local union's own head pin (`:49` → `:50`, unchanged). Paid by a same-file deletion: ```text before: - 复核后又推提交而 HEAD 未动 ⇒ 补跑并集(至少棘轮族)再更新报告。 after: (deleted; was line 50) ``` Why it restates: its remedy is the dev contract's own unconditional duty, `.claude/agents/os-dev.md:161–162` 「复核后任何一次 push,都在新 head 上重跑并集。」 「至少重跑 ratchet 族,然后才更新报告或 PR 正文。」; and its seat-side verdict is the line kept just above it, 「dev 本地并集钉 head:所抄 `git rev-parse --short HEAD` 不符 PR `head.sha` 或没抄 ⇒ 双向都不入账。」 A union whose cited HEAD did not move after a later push is exactly that case. Under the new line the seat's gate evidence after such a push is the new head's check-runs, never a re-run union. The dispatch's mechanism note (one amended line may be enough) was measured and does not hold: `:44` is 112 bytes and `:45` 119; the full rule folded into `:44` measures 140 bytes, over the 120-byte cap. `:44`'s 「⛔ 不因报告写了本地绿跳过」 stays: it governs the act of reading the two required jobs, the new line governs what counts as evidence. The dispatch's suggested spelling (147 bytes) was shortened to fit. ### 2. `references/execution-duties.md:179`: the ACCEPT verdict's location (183 → 183, in place) ```text before: - 判决 ACCEPT:issue 英文短评论,核对清单结论 + 抽查读数 + 偏差,链接 PR,⛔ 不复述其叙事。 after: - 判决 ACCEPT:PR 评论 `## 席位核对`,清单结论+抽查读数+偏差,⛔ 不复述其叙事;卡留指针行。 ``` 116 → 118 bytes. This is the seat's ruling A in comment 6163735021 (every PR, governed or not). Its veto window was read at this head: the comments after it on #23409 are the unblock (6163808287), triage (6163828327) and the claim (6164024645); none overrules. The dispatch's suggested spelling measures 137 bytes, not 118, because each CJK character is 3 bytes, so it was shortened. 「核对」 is dropped because 清单 is this section's 复核清单. 「英文」 is dropped because `SKILL.md:95` already makes every new GitHub text English. 「链接 PR」 is dropped because the record now sits on the PR. The pointer's spelling stays single-sourced at `SKILL.md:190`. Consistent with the one machine reader of the verdict: `check-half-states.mjs` H48 already reads it as an issue comment on the PR. ### 3. Pre-landing check count: two. `references/landing-operations.md:59` corrected in place (101 → 101) ```text before: - 受管路径全在 `.claude/**` 者 Tier S:席内达档复核过落地前检三条即转正式入队。 after: - 受管路径全在 `.claude/**` 者 Tier S:席内达档复核过落地前检两条即转正式入队。 ``` Evidence that two is the true count: - The list is defined once, at `references/contract-review.md:32–36`. That is PR #23389's landed text; lines 32, 35 and 36 are untouched by it. 「落地前检两条,过则 Tier S 入队、Tier H 等人批:① 达档条款②复核 PASS 在案(同形记录)。」 … 「② PR check 全绿,⛔ 非 required 子集;…」. `references/lanes/director.md:35` points into it by number: 「受管面两层落地见 `../contract-review.md` 落地前检②」. - AGENTS.md Prime Directive #14 names the same two for Tier S: a `## Contract review` record for the current head with `Served-tier: CONTRACT_REVIEW_TIER` and a PASS verdict, "and every check is green". `check-governed-merges.mjs --branch` on this branch prints the same two (record + "every check green"). - History. The shared clone was deepened to read it (`--deepen=600`, then `--deepen=1500`). `c2cce8fd1b` (2026-09-14, PR #18111) wrote the 「三条」 sentence while contract-review.md's list had three items: ① PASS 在案, ② 双载体已清 (`check-clause2-carriers.mjs --pair N`), ③ PR check 全绿. `7e0bfce400` (2026-09-22, PR #19694) retired the double-carrier item and renumbered the list to 「两条」. Its PR body named the director.md pointer drift (③ → ②) but not `landing-operations.md:59`, which has said 「三条」 since. - No third check is named anywhere. Grep 落地前检 over `.claude/`, `AGENTS.md` and `scripts/pm/*.mjs`: contract-review.md:32 (两条), landing-operations.md:59 (三条), lanes/director.md:35 (②), SKILL.md:197 (no count), plus script prose that quotes SKILL.md:197. - The dispatch's three readings were checked and not adopted. The third one, `check-governed-merges.mjs --pr N` answering Tier S, is the tier classifier. It already has its own bullet one line above, `landing-operations.md:58` 「转 ready/入队前跑 `check-governed-merges.mjs --pr N`:受管面照两层;…」. contract-review.md:32 uses it to choose the branch (「过则 Tier S 入队、Tier H 等人批」), not as a third condition to pass. Listing it inside contract-review.md would restate `:58`. "Roster-skipped" is item ②'s own exception (`SKILL.md:205` 「每 check 绿或预期 skip」), not a separate check. `dispatch-gates.mjs` calls the `--pr` read "the landing pre-check" in English prose. That names a pre-landing step, not an item of this list. ### 4. Under-tier route: read, nothing written `references/execution-duties.md:112` 「自审随面定档:仅申报面车道席作 `TIER_DEFAULT` 记录;余面未达档 ⛔ 不自审,起隔离子代理。」 and `references/cross-repo-coordination.md:45` 「认领即跟到 MERGED:派发后发现跨车道面(含 spec)不移卡,复核按面定档,未达档借隔离复核。」 were both rewritten by PR #23389 (`4f81f31526`). Their earlier spellings were 「未达档 ⛔ 不自审,起隔离达档子代理」 and 「认领席借契约复审档隔离复核」. Reading: they **agree**. The tier follows the face, and a seat below the face's tier does not review its own work: it takes an isolated review at that tier. No reconciliation is owed, so `cross-repo-coordination.md` is untouched (51/51). `SKILL.md:190`, read against them and **not edited** (triage excludes `SKILL.md`): 「指针 `ACCEPT → PR #n comment ID`;技能面 hunk 须由契约复审档的席复核,档外席先交 skills 席。」 The pointer's placeholder is respelled as ID for the body sanitizer. - Still true as a tier and lane-ownership rule. A skills-face hunk is governed rules text, so it is reviewed at `CONTRACT_REVIEW_TIER` (`contract-review.md:11`), and the governed surfaces are `domain:skills`' lane (SKILL.md 域车道 table). - Stale as a route. 「档外席先交 skills 席」 names a second under-tier route, handing the hunk to the skills seat, beside the references' single one, an isolated review at the face's tier. ## Acceptance notes - The scripts' remedy prose still names the old terminal ("ACCEPT on the card, `needs-user-decision` on the PR, a final 维护者速读 …"). Triage excludes these files, so they are not edited: `scripts/pm/check-governed-merges.mjs:220` and `:1865`, and `scripts/pm/check-governed-queue-guard.mjs:384` and `:1993`. A fifth site the dispatch did not list carries the same phrase: `scripts/pm/dispatch-gates.mjs:11928` (the size-limb remedy). All five are prose; no reading depends on them. `carrier: none — tooling card if the maintainer wants the prose moved`. - The `SKILL.md:190` route reading above: two routes for an under-tier review of a skills-face hunk. `carrier: none` (a `SKILL.md` card, if the seat wants one route). ## Verification, at head `229a926376` The local subset is the families `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derives for this diff. Each exit code was captured before any pipe: ```text node scripts/check-closing-keyword-parity.mjs :: exit 0 node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 node scripts/check-comment-mask-corpus.mjs :: exit 0 node scripts/pm/check-harness-current.mjs --self-test :: exit 0 pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 (first run exit 3 PREREQUISITE NOT MET; prerequisite built under os-verify-lock, VERDICT command-exit 0, then re-run) pnpm check:agent-test-spelling :: exit 0 pnpm check:cross-package-test-inputs :: exit 0 pnpm check:doc-authoring :: exit 0 pnpm check:driver-memory-census :: exit 0 pnpm check:gitlink-declared :: exit 0 pnpm check:nul-bytes :: exit 0 pnpm check:pm-governed-merges :: exit 0 pnpm check:pm-skill-id-lint :: exit 0 (87 file(s) clean) pnpm check:pm-skill-ratchet :: exit 0 (review-checklist.md 77/77, landing-operations.md 101/101, execution-duties.md 183/183) pnpm check:refd-timer-probe :: exit 0 pnpm check:required-contexts :: exit 0 pnpm check:skill-frame-sync :: exit 0 pnpm check:watch-hint-literal :: exit 0 pnpm check:pm-governed-prose :: exit 0 (artifact roster, run because the card names it) pnpm check:pm-settings-deny-roster :: exit 0 (artifact roster whose roster sits under .claude) ``` `--ran` reconciliation: 「Run reconciliation — 18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN.」 and 「a DERIVED zero — all 18 recorded an exit code and none of them is 3」. Every line of the three files is 120 bytes or less (widest: 119, 120, 120). The added lines carry no full-width punctuation, and there are no control bytes. There is no ablation, because the change is text only. CI's families are read off this PR's check-runs and are not re-run locally. The tier reading from `check-governed-merges.mjs --branch` is GOVERNED, Tier S, `.claude/**` ×3, size 6 ≤ 3000; the landing tier is read at landing by `--pr`. `skip-changeset`: `.claude/**` ships in no package. --- _Generated by [Claude Code](https://claude.ai/code/session_013zGKMG1cRedVzWtqGGGZW9)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 775ed65 commit 2659901

3 files changed

Lines changed: 3 additions & 3 deletions

File tree

‎.claude/skills/pm-dispatch/references/execution-duties.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@
176176
- 绿色输出≠ 该绿证明了被测风险:拒收断言、全绿方向与时序、pin 翻转、边界后收益。
177177
- 触 `skills/**` 的 PR 加问整包价值密度:从整包加载的客户 agent 座位读,⛔ 不从作者座位读。
178178
- 超派发预算或小功能大扩写 ⇒ REWORK,⛔ 不因已经写好了放行。
179-
- 判决 ACCEPT:issue 英文短评论,核对清单结论 + 抽查读数 + 偏差,链接 PR,⛔ 不复述其叙事。
179+
- 判决 ACCEPT:PR 评论 `## 席位核对`,清单结论+抽查读数+偏差,⛔ 不复述其叙事;卡留指针行。
180180
- `mcp_calls` 点名写工具(`settings.json` deny 清单 + `update_pull_request`)⇒ 拒收,⛔ 不带注放行。
181181
- 判决 REWORK:逐项反馈,同认领重派;补丁轮优先 SendMessage 续派原 dev;最多 2 轮,第三次升级。
182182
- 判决 ESCALATE:见〈升级与决策〉;熔断任一命中亦判,PR 暂停,答复前 ⛔ 不派下一轮。

‎.claude/skills/pm-dispatch/references/landing-operations.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
- 落地评论 = 两个读数的探针表 + 一行状态变更(摘标/关卡/收口),⛔ 不复述 `## 席位核对`。
5757
- 契约复核 PASS 落地的 PR 到窗口时已 ready 且 auto-merge 在挂,见 `contract-review.md`。
5858
- 转 ready/入队前跑 `check-governed-merges.mjs --pr N`:受管面照两层;>3000 行(含生成物)照 Tier H。
59-
- 受管路径全在 `.claude/**` 者 Tier S:席内达档复核过落地前检三条即转正式入队。
59+
- 受管路径全在 `.claude/**` 者 Tier S:席内达档复核过落地前检两条即转正式入队。
6060
- Tier H(其余受管面)者:四件套留 draft 等人批,⛔ 不翻正式不入队;获授权批准后认领席落地。
6161
- ⛔ 两层不由席位批准;清标即落地同受此闸,漏判会被队列守卫在 merge group 里拒收。
6262
- 再读 `mergeable_state`:`dirty` ⇒ 先 merge `origin/main` 再挂;生成物在面上按 A 的固定序。

‎.claude/skills/pm-dispatch/references/review-checklist.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@
4646
- 收敛期转红走补丁轮续派原 dev,⛔ 不作 REWORK 的理由;重量级卡可在派发令写本单等 CI。
4747
- 每个门禁读数先钉到 PR 当前 head:比对 run `head_sha` 与 `head.sha`,不一致的双向都不入账。
4848
- ⛔ 非当前 head 上的 `cancelled` 零动作、永不重跑:新推送自带全套 run。
49+
- 席位核对门禁证据 = 钉 head 的 check-runs(名+结论);本地并集只证本地子集,⛔ 不替缺席者。
4950
- dev 本地并集钉 head:所抄 `git rev-parse --short HEAD` 不符 PR `head.sha` 或没抄 ⇒ 双向都不入账。
50-
- 复核后又推提交而 HEAD 未动 ⇒ 补跑并集(至少棘轮族)再更新报告。
5151

5252
## 断言与收益
5353

0 commit comments

Comments
 (0)