Skip to content

docs(pm-dispatch): the dispatch-gates freeze admits derivation-truth fixes - #24258

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-24171-narrow-dispatch-gates-freeze
Oct 18, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-24171-narrow-dispatch-gates-freeze

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #24171
Clause-②: no

Executes term 1 of ruling 6243472660 on the card (letter B, the maintainer's 「24171 B」, 2026-10-18). .claude/skills/pm-dispatch/references/instrument-discipline.md L10 is narrowed in place with no new line, and L12 records the narrowing ruling beside ruling 208. One file, +2/−2. The file has 12 lines before and after.

What changed

L10, before and after:

- 工具位只有一个,先花在删除上;`dispatch-gates.mjs` 冻结,只在它喂的 workflow 坏了时碰。
- 工具位只有一个,先花在删除上;`dispatch-gates.mjs` 冻结,只在它喂的 workflow 坏了或推导失真时碰:输出须与 CI 实跑一致(含从既有门禁自己的扫描根推导它),⛔ 不新增门禁、推导行、棘轮、`--tier` 强制档或常量。

L12, before and after:

- 裁决记录:裁决 208,卡 19491,评论 5755284987(编号不带 # 前缀,id-lint 拒)。
- 裁决记录:裁决 208,卡 19491,评论 5755284987;2026-10-18 收窄裁决:维护者逐字「24171 B」,卡 24171,评论 6243472660(编号不带 # 前缀,id-lint 拒)。

How each clause of ruling term 1 maps onto the new L10:

  • "derivation-truth fixes are allowed under the freeze": the freeze's one exception gains a second one, 「或推导失真时碰」.
  • "The tool's output must be true of what CI runs": 「输出须与 CI 实跑一致」.
  • "including deriving an existing gate from its own scan roots": 「含从既有门禁自己的扫描根推导它」.
  • "No new gate, row, ratchet, --tier mandate or constant": 「⛔ 不新增门禁、推导行、棘轮、--tier 强制档或常量」. "Row" is written 推导行 (a derived row, which is the sense of the ruling's terms 2 and 3), so nobody reads it as a text line. "--tier mandate" is written 强制档, meaning the MANDATORY_TIER_GLOB_ROWS rows in dispatch-gates.
  • "Ruling 208 R6's other clauses stand": the slot sentence 「工具位只有一个,先花在删除上」, the freeze and the original workflow exception are kept word for word.
  • Provenance: L12 cites the ruling by comment id with no hash prefix, which is the id-lint convention L12 already uses.

Line width (measured)

  • Before the edit, the widest line in the file was 111 bytes (L5 and L10). After it, L10 is 273 bytes and L12 is 172 bytes.
  • The file has no CEILINGS row in scripts/pm/check-skill-line-ratchet.mjs. The 120-byte max-line-length rule binds only files with a row, so it does not read this one.
  • The ruling's 「no new line」 outranks the file's habit of keeping lines at 120 bytes or less. So the sentence was tightened instead of split.
  • The PM's suggested spelling measured 264 bytes. The landed one is 9 bytes longer: 推导行 instead of a bare 行 (+6), and 强制档或 instead of 档位与 (+3).

Verification at head 50b11c7

The derivation ran with no paths: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack. Its change set came from merge base f5ef054 (1 path, +2/−2). It names 16 commands, the same list as the path-derived run at f5ef054. All 16 ran locally, and each exit code was captured before any pipe:

command exit
node scripts/check-closing-keyword-parity.mjs 0
node scripts/check-closing-keyword-parity.mjs --self-test 0
node scripts/check-comment-mask-corpus.mjs 0
node scripts/pm/check-harness-current.mjs --self-test 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions 0 (the first run exited 3, PREREQUISITE NOT MET, because formula and lint were not built; after building them under the verify lock, VERDICT command-exit 0, the re-run exited 0)
pnpm check:agent-test-spelling 0
pnpm check:cross-package-test-inputs 0
pnpm check:doc-authoring 0
pnpm check:driver-memory-census 0
pnpm check:gitlink-declared 0
pnpm check:nul-bytes 0
pnpm check:pm-governed-merges 0
pnpm check:pm-skill-id-lint 0 (87 files clean)
pnpm check:refd-timer-probe 0
pnpm check:skill-frame-sync 0
pnpm check:watch-hint-literal 0

The --ran reconciliation used the exit-coded record and printed: "16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED (a DERIVED zero — all 16 recorded an exit code and none of them is 3)".

Outside the derivation, pnpm check:pm-skill-ratchet exited 0. Its output names this file 0 times, which confirms the ratchet does not read it.

Card premise re-check after the edit: grep -c "冻结" gives 1 and grep -c "工具位" gives 2. The second count was already 2 on origin/main f5ef054, because L3 also contains the word.

Not run locally: check:dev-prereqs and check:skill-frame-freshness, the two local-only families. The diff touches neither packages/spec nor the copy of the decision frame in SKILL.md. Everything outside the 16 runs in CI.

No changeset: .claude/** publishes nothing, and skip-changeset is declared in the same call that creates this PR.

Acceptance notes

  • Assumption (a) holds: this file has no CEILINGS row. The dispatch order expected pnpm check:pm-skill-ratchet in the derived list, but it is not there. It was run anyway and passed.
  • Assumption (b): git grep -n "冻结" -- .claude scripts/pm finds 4 hits. The other 3 (compile-surfaces.md twice, lanes/devx.md once) use the word for something unrelated. No script or text quotes L10. The only file that names this one is reading-discipline.md L26, a pointer line that is still accurate. L12 avoids the word 冻结 so that the card's premise re-check still reads 1.
  • Assumption (c): the two sibling worktrees in this container (cards 24037 and 24241) do not touch this file.
  • Observation (no card, no carrier; 承接者:无): the ratchet header says its CEILINGS enumeration covers "the pm-dispatch surface (SKILL.md, its references/, the per-lane job descriptions)". Its self-test also calls compile-surfaces.md "the last uncovered pm-dispatch references file". Today, though, references/instrument-discipline.md and references/external-contributions.md have no row. The same header says absence is "a fact to check, not an oversight to infer", so this is prose drifting from the map, not a defect.
  • Observation for the contract review: the Chinese option B in the card body (the text the 速读 showed) reads 「不动 --tier 档位表与常量」, which means "do not touch". The ruling record's term 1 reads "No new ... --tier mandate or constant". As the dispatch order requires, this PR follows the ruling record word for word.

维护者速读(草稿)

  • 改了什么: 仪器纪律文件里 dispatch-gates.mjs 冻结那一行原地改写,没有加行,文件仍是 12 行。冻结照旧。原来只有「它喂的 workflow 坏了」时可以动它,现在「推导失真」时也可以:工具说 CI 会跑什么,必须和 CI 实际跑的一致,包括按既有门禁自己的扫描根推导它。同一句明写:不准借此新增门禁、推导行、棘轮、--tier 强制档或常量。出处行补记了本次收窄裁决(评论 6243472660,您的「24171 B」)。
  • 为什么改: 执行您 2026-10-18 的裁决 B。按字面冻结,两张"让推导说真话"的卡(24037、24073)派不出去,而工具确实在对 dev 说假话:一次让 main 红了一轮,一次让本地 98/98 对账全绿而 CI 是红的。
  • 风险与代价(含回滚): 只改了一份给内部 agent 读的文档,不发布,不影响产品代码和 CI。风险是有人把"推导失真"宽读成扩张工具的口子,所以句中明写了四个"不新增"。这一行偏长(273 字节,其余行在 111 字节以内),因为裁决要求不加新行;该文件不在行数棘轮内,门禁不受影响。回滚就是 revert 本 PR 的一个提交。
  • 席位意见:
  • 你要做的: 不需要操作。席位做完契约档复核后自行落地。如果对措辞有意见(比如「推导行」「强制档」的译法),在 PR 上说一句即可。

Generated by Claude Code

…fixes

instrument-discipline.md L10 is narrowed in place, no new line: the frozen
dispatch-gates.mjs may also be touched when its derivation is untrue. Its
output must match what CI actually runs, including deriving an existing gate
from that gate's own scan roots; no new gate, derived row, ratchet, --tier
mandate or constant. L12 records the narrowing ruling (comment 6243472660,
the maintainer's "24171 B", 2026-10-18) beside ruling 208, numbers without a
hash prefix. The file stays 12 lines.

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

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 50b11c7f5683f52bef85c0ea929cad04444bbf07
Local-runs: none
Scope: .claude/skills/pm-dispatch/references/instrument-discipline.md + scripts/pm/dispatch-gates.mjs (the MANDATORY_TIER_GLOB_ROWS rows the new clause calls 强制档, and the ROOT_DIR_WATCH_HINTS idiom its 「扫描根」 names), the ruling record 6243472660 on card 24171 (read this act)

Face: governed rules text (.claude/**, Tier S) — no published schema, no narrowing line, Clause-②: no. Inputs: card 24171 (body with its Ruled: first line, the seat's delta 6241925462, the ruling 6243472660, the claim 6245595553, the order 6245600209, the report 6245767901) and PR 24258 (body, file list, the net diff +2/−2 at the head above); the head's check-runs at this read were 24 success, 9 skipped, 3 in progress — the landing check reads them again, this record judges the diff. Rendered in seat at 2026-10-18T04:48Z; the seat's served tier equals the value of CONTRACT_REVIEW_TIER.

① Derived judgments

  1. The rule's accept set. BEFORE: dispatch-gates.mjs may be touched only when a workflow it feeds breaks. AFTER: also when its derivation is untrue — the output must match what CI actually runs, including deriving an existing gate from that gate's own scan roots — and the same clause forbids adding a gate, a derived row, a ratchet, a --tier mandate or a constant. Right: it is term 1 of ruling 6243472660 clause for clause (the allowed class, the truth criterion 「输出须与 CI 实跑一致」, the scan-roots inclusion 「含从既有门禁自己的扫描根推导它」, the four prohibitions). The slot sentence 「工具位只有一个,先花在删除上」, the freeze and the original workflow exception survive verbatim (「Ruling 208 R6's other clauses stand」).
  2. Renderings. 「推导行」 for "row": right — a derived row in dispatch-gates.data.mjs, the sense of the ruling's terms 2–3, and it closes the text-line misreading. 「--tier 强制档」 for "--tier mandate": right — MANDATORY_TIER_GLOB_ROWS in scripts/pm/dispatch-gates.mjs is what a mandate is. 「常量」 for "constant": right.
  3. Provenance L12: ruling 208's record kept; the narrowing ruling added as 「2026-10-18 收窄裁决:维护者逐字「24171 B」,卡 24171,评论 6243472660」 with no # — right, the id-lint convention the line itself states; pnpm check:pm-skill-id-lint read 87 files clean at the dev's run, and CI's Lint · repo & tooling gates re-reads it.
  4. Public surface: none. .claude/** is unpublished; no code, gate or workflow changed. The card's premise re-check still reads 冻结 1; its control 工具位 reads 2, which it already read on main f5ef054a (L3 carries the word) — the dev's correction of the card's control count is accepted.
  5. Line count 12 → 12, the ruling's 「no new line」 held. L10 is now 273 bytes against a previous widest line of 111; the file carries no CEILINGS row in scripts/pm/check-skill-line-ratchet.mjs, so no width pin reads it, and the ruling's constraint outranks the file's 120-byte habit. Accepted; recorded on the seat post as a lane note, not a card.

② Semver level

.claude/** publishes nothing: skip-changeset declared in the pr_create stroke (the PR carries skip-changeset, documentation, size/xs), Check Changeset success on the head. Body line 2 Clause-②: no: right, no published accept set moves.

③ Boundary flags

  • Dev flag: the card's Chinese option B says 「不动 --tier 档位表与常量」 while the ruling record's term 1 says "No new … --tier mandate or constant". The ruling comment is the first landing point for execution and review, and its terms were taken from the director's delta; the PR follows the record word for word. The gap is immaterial for the two cards the ruling unblocks (neither card 24037 nor card 24073 touches a mandate row or a constant); it is recorded here and on the card's pointer line, not escalated.
  • Dev observation: the ratchet file's header prose says CEILINGS covers every references/ file, while instrument-discipline.md and external-contributions.md have no row. An observation outside the filing gate (no reach:): it stays in the PR's Acceptance notes and in the seat post's carried pointers.
  • open_questions: none. Deviations D1–D7 in the report are read: the second git push is os-dev.md rule 1's write-route probe; check:pm-skill-ratchet outside the derivation was run anyway and passed; the trailer and footer forms follow AGENTS.md's precedence; test:repo and the two local-only families are CI's and not owed here.

Implemented-by: claude/issue-24171-narrow-dispatch-gates-freeze
Reviewed-by: session_01QBcLjVCmcWbZEk6qhYMib2

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读

改了什么:仪器纪律文件(.claude/skills/pm-dispatch/references/instrument-discipline.md)第 10 行原地改写,不加行,文件仍 12 行。dispatch-gates.mjs 的冻结照旧,多开一个口子:当它的推导失真(说 CI 会跑什么而 CI 不跑,或漏算 CI 会跑的)时可以改它,标准是「输出须与 CI 实跑一致,含从既有门禁自己的扫描根推导它」;同一句明写 ⛔ 不新增门禁、推导行、棘轮、--tier 强制档或常量。第 12 行出处补记本次收窄裁决(您的「24171 B」,评论 6243472660)。

为什么改:执行您 2026-10-18 对 #24171 的裁决 B。两张 p2 卡(24037、24073)要让推导说真话,字面冻结把它们挡住;本周工具两次说了假话(一次 main 红一轮,一次本地 98/98 对账全绿而 CI 红)。

风险与代价(含回滚):只改一份给 agent 读的内部规则,不发布、不动代码与 CI。风险是「推导失真」被宽读成扩张工具的口子,句中四个「不新增」封住。该行 273 字节、比文件其它行长,因裁决要求不加新行;本文件不在行数棘轮内。回滚 = revert 本 PR 一个提交。

席位意见:ACCEPT。席内达档契约复核 PASS(6245800774,head 50b11c7f)逐条对照了裁决第 1 条与新句;dev 指出的一处措辞差(卡面选项 B 写「不动 --tier 档位表与常量」,裁决记录写「不新增 --tier mandate or constant」)按裁决记录落地,对被解锁的两张卡无实质差别,已记在复核记录与卡上。head 38 个 check 26 绿、12 预期跳过、0 红。Tier S(.claude/**)由席位落地,不需要您的批准。

你要做的:无。若希望把「--tier 强制档或常量」收紧为「不动 --tier 档位表与常量」,在本 PR 评论一句,席位补一张一行 PR。

席位核对

Seat domain:skills#1 · session_01QBcLjVCmcWbZEk6qhYMib2 (sunhaolin) · read 2026-10-18T04:53Z · head 50b11c7f5683f52bef85c0ea929cad04444bbf07 · verdict: ACCEPT (Tier S — the seat lands it after the two pre-landing checks)

Implemented-by: claude/issue-24171-narrow-dispatch-gates-freeze
Reviewed-by: session_01QBcLjVCmcWbZEk6qhYMib2

  1. Shape. Draft PR against main; body line 1 Fixes #24171, line 2 Clause-②: no (copied from claim 6245595553). The only closing keyword in the body is that line; no other open card number sits beside a closing verb (the sibling cards are written as bare numbers). File list: .claude/skills/pm-dispatch/references/instrument-discipline.md (+2/−2). mergeable true, mergeable_state clean at this read.
  2. Premise and acceptance, read by the seat. The ruling's term 1 is executed clause for clause (contract review 6245800774 ①.1–①.3); 12 lines before and after; L12 cites the ruling id without #; the card's re-check still reads 冻结 1. The dev's correction of the card's control count (工具位 already 2 on main) is accepted.
  3. Gates — check-runs pinned to head 50b11c7f. 38 completed: 26 success (Lint & Repo Gates, TypeScript Type Check, Test Core, Governed Surface Queue Guard, Check Changeset, every Lint · and Type Check · lane, the four claim checks, Dogfood Regression Gate), 12 skipped all in the roster (check-expected-skips.mjs --pr 24258 OK, exit 0), 0 failed. check-governed-merges.mjs --pr 24258: GOVERNED, Tier S, .claude/** ×1, +2/−2 under the 3000-line threshold. The dev's local subset: 16 of 16 derived families exit 0, --ran reconciled.
  4. Changeset. None owed (.claude/** unpublished); skip-changeset declared in the pr_create stroke and present, Check Changeset success. The seat concurs: the dev's declaration confirmed, not forwarded. Platform reading: the first pr_create carrying labels was NOT refused (relay run 39097899779) — the pointer carried since PR feat(fleet-write): pr_create carries labels; os-dev declares skip-changeset in the create's stroke #24175 is answered.
  5. Report hygiene. mcp_calls 0; api_writes 2 relay strokes (pr_create with assignee and labels; the report comment), no PATCH/PUT/DELETE; two git push (the empty-branch probe and the commit). Deviations D1–D7 answered in the contract review ③.
  6. Out of scope. Two observations in the PR's Acceptance notes (the ratchet header's CEILINGS prose; the option-B wording gap), neither inside the filing gate; carried on the seat post, not filed.
  7. Landing (Tier S). Pre-landing check ①: the ## Contract review PASS record 6245800774 names this head. Check ②: every check green or an expected skip. Next act: relay pr_ready then automerge_enable; the probe-table landing comment follows when the queue ref is gone and origin/main carries the commit. subscribe_pr_activity is live on this PR since 2026-10-18T04:46Z.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 18, 2026 04:54
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 18, 2026 04:54
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 18, 2026
Merged via the queue into main with commit ef9557c Oct 18, 2026
39 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-24171-narrow-dispatch-gates-freeze branch October 18, 2026 05:06
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