Repository navigation
Commit 2659901
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
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
176 | 176 | | |
177 | 177 | | |
178 | 178 | | |
179 | | - | |
| 179 | + | |
180 | 180 | | |
181 | 181 | | |
182 | 182 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
59 | | - | |
| 59 | + | |
60 | 60 | | |
61 | 61 | | |
62 | 62 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
46 | 46 | | |
47 | 47 | | |
48 | 48 | | |
| 49 | + | |
49 | 50 | | |
50 | | - | |
51 | 51 | | |
52 | 52 | | |
53 | 53 | | |
| |||
0 commit comments