Skip to content

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

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-23409-seat-record-reads-check-runs
Oct 14, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-23409-seat-record-reads-check-runs

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

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)

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:

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)

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)

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 tooling(pm): the contract review's tier follows the face that made it owed #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 feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #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 docs(pm): landing-operations names the two landing tiers and lanes/ui.md's spec pointer states the landed rule (#18037) #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 pm(skills): retire the clause-② gate text — label hang/clear, --pair, double carrier, independence requirement (step ②) #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:

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

…ence; ACCEPT is the PR's seat record; two pre-landing checks

- review-checklist.md: the seat record's gate evidence is the head-pinned
  check-runs (name + conclusion); a local union evidences only its local
  subset and never stands in for a missing check-run. Paid by deleting the
  post-review re-run line, a restatement of the dev contract's own re-run
  duty and of the stale-sha verdict on the line above it.
- execution-duties.md: the ACCEPT verdict is the PR's seat-record comment,
  with a pointer line on the card, for every PR.
- landing-operations.md: the Tier S landing passes the two pre-landing
  checks contract-review.md enumerates, not three.

Claude-Session: https://claude.ai/code/session_013zGKMG1cRedVzWtqGGGZW9
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 229a9263768191ac775e3c9af889bb260602b5cd
Local-runs: none

Reviewed in seat by the dispatching skills seat (served tier read from get_session last_served_model this fire, equal to the constant's value), on the PR diff (three files, +3/−3, one commit on 04a314873c; check-governed-merges --pr 23439: .claude/** ×3, Tier S, 6 changed lines), card #23409 (the remainder of #23378's 方案 4 under the maintainer's 「同意」; the three added items 6163735021; triage's scope 6163828327), the dev's report (the newest os-dev-report comment on the card) and the head's check-runs. The governed faces are the review checklist, the execution duties and the landing window; the judgment is whether each sentence says what its authority says and whether the one deletion is still said elsewhere. Written 2026-10-14T08:43Z.

① Derived judgments

② Semver level

None owed: .claude/** ships in no package; skip-changeset on the PR is correct.

③ Boundary flags

  • Dev flag — the shared clone's history was deepened (git fetch --deepen, 196 → 2932 commits on the ancestry) to read the 三条/两条 history; additive to .git/shallow, no working-tree edit. Accepted; the reading it bought is what settled item 3.
  • Dev flag — one prerequisite two-package build under the verify lock for check:doc-formula-expressions; 18 derived families run, --ran 18/18; two roster gates beyond the derivation (check:pm-governed-prose, check:pm-settings-deny-roster) exit 0. Accepted.
  • Carried by the seat as a card (filed this fire, see the pointer on the card): SKILL.md:190's second under-tier route vs the references' one route (decision: which model serves the clause-② contract review — fable on every lane (ruling 5771798588), or fable only for the spec / skills lanes and governed surfaces with opus elsewhere? #23352 ruling B′ with C) — SKILL.md 〈优先级〉 says two conflicting rules ⇒ act on the stricter and file a card.
  • Observation (dev, no card): the scripts' remedy prose still names the old terminal ("ACCEPT on the card, needs-user-decision on the PR, a final 维护者速读") at check-governed-merges.mjs:220/:1865, check-governed-queue-guard.mjs:384/:1993, dispatch-gates.mjs:11928 — prose only, no reading depends on it; a tooling card only if the maintainer wants the prose moved (dispatch-gates.mjs is frozen by instrument-discipline.md:10).
  • open_questions: none.

Implemented-by: claude/issue-23409-seat-record-reads-check-runs
Reviewed-by: session_013zGKMG1cRedVzWtqGGGZW9

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · PR #23439 at 229a926376 (Fixes #23409) — Tier S, landing by the seat

Skills seat 1 (session_013zGKMG1cRedVzWtqGGGZW9, huangyiirene), written 2026-10-14T08:43Z. Report read; everything below is verified on GitHub and the tree, not on the report.

  1. 形态: draft PR against main; line 1 Fixes #23409 is the body's only closing keyword; Clause-②: no at line start; three files, +3/−3, one commit on 04a314873c; skip-changeset (nothing published); check-governed-merges --pr 23439 → .claude/** ×3, Tier S, 6 changed lines; assignee huangyiirene; no SKILL.md, no scripts/** (triage's scope).
  2. 前提实测: the seat-record rule is on main since PR pm-dispatch: one seat record per governed PR; the card keeps a pointer; the landing comment is the probe table; the director ledger is one block per summon #23422 (SKILL.md L188–191) and the dev half since PR docs(os-dev, AGENTS, pm-dispatch): local verification = changed packages typecheck/tests + families reading changed files; main merged after PR open only on conflict, main-red or queue removal #23405 (os-dev.md ③/④); the pre-landing count's one definition is contract-review.md:32–36 with two items, the history of the stale 「三条」 read from c2cce8fd1b → 7e0bfce400; the two references on the under-tier route agree. Judged line by line in the ## Contract review PASS record above for this head.
  3. 门禁 check-runs: 38 runs on 229a926376, read 2026-10-14T08:41Z — by newest run per name 23 success, 11 skipped, none failing or in progress; Lint & Repo Gates and TypeScript Type Check success; every skipped name is on the expected-skips roster (scripts/pm/check-expected-skips.mjs, read from source on main). The dev's local subset (18 derived families, exit 0, --ran 18/18) is its own evidence; the farm's is these check-runs — which is the very sentence this PR writes into the checklist.
  4. 接受的偏差: the dispatch's spellings over the 120-byte cap (shortened by the dev); the deletion of old L50 instead of an in-place amendment (L44/L45 measured 140 bytes folded); the shared clone's history deepened for the count reading; one prerequisite build under the verify lock.
  5. 范围外去向: SKILL.md:190's second under-tier route → a card filed by the seat this fire (the pointer comment on pm-dispatch references, after PR #23389 lands: the ACCEPT reads the PR's check-runs as its gate evidence (review-checklist.md), and the pre-landing check count agrees between landing-operations.md:59 and contract-review.md:29 #23409 names it); the five scripts' remedy-prose sites → observation for the maintainer (tooling, prose only, dispatch-gates.mjs frozen) — no card unless asked.
  6. 落地条款: Tier S — PASS record on this head, every check green, roster-expected skips ⇒ the seat flips pr_ready, reads mergeable_state until it settles, then arms automerge_enable as a second relay stroke; MERGED is confirmed from the queue ref and origin/main, then pm:dispatched leaves the card with a probe-table landing comment.

Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants