Repository navigation
docs(os-dev): run the scoped platform-checklist check before push on an exported-symbol rename or removal - #23766
Conversation
…an exported-symbol rename or removal Two rule lines in the dev contract's 〈本地验证范围〉 section, beside the trigger-shaped rules: a diff that renames or removes an exported symbol runs `node scripts/check-platform-checklist.mjs --changed-from origin/main` before push, and the verdict line is recorded verbatim in the report's `gates` field; the run is not a derived family, so `--commands` never lists it and `--ran` reports it as outside the derivation, not an error. The os-dev.md ceiling moves 402 → 404 as an ordinary ruled raise (the ruling of record that orders the text, under the ratchet header's ruled-raise clause); the comment block above the row carries the measurement: the ruled content does not fit one 120-byte line (tightest one-line spelling 125 B), and the two lines land at 119 B and 119 B. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VqGhCg9wdsBXPz54uAEWg7
席位核对Seat Implemented-by:
Generated by Claude Code |
Contract reviewServed-tier: PR #23766 for card #23665, net diff against ① Derived judgments
② Semver level
③ Boundary flags
Dev Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #23665
Clause-②: no
What lands
Two rule lines in
.claude/agents/os-dev.md〈本地验证范围〉, right after the trigger-shaped line (新 fake engine ⇒ …) and before ④:- 改名或删除导出符号 ⇒ push 前跑 `node scripts/check-platform-checklist.mjs --changed-from origin/main`。— 119 B- 判定行原样记 `gates`;它非派生族,不在 `--commands` 清单,`--ran` 只把它列为派生外、不报错。— 119 BThey implement ruling record 6190922830 on #23653 (letter C, item 3; maintainer 「C (推荐)」, 2026-10-15), verbatim:
The command is the scoped mode's own spelling (
scripts/check-platform-checklist.mjs, header section "The scoped mode", landed by PR #23677). Item 2 of the same ruling stands: nodispatch-gates.mjs,dispatch-gates.data.mjsordispatch-gates.self-test.mjsedit, no derived family, no CI or workflow change, and no edit todocs/qa/platform-checklist/README.md. The trigger is decidable from the author's own diff (anexported symbol renamed or removed); it is deliberately not "every PR", so the line stays a dev-contract duty and never a de facto gate on every push.Paying for the lines — route taken: ruled raise, not deletion
os-dev.mdstood at 402/402 (headroom 0) onorigin/main140238a47. The.claude/agents/os-dev.mdrow ofCEILINGSinscripts/pm/check-skill-line-ratchet.mjsmoves 402 → 404, delta +2, with a comment block above the row in the shape of theexecution-duties.mdprecedent (PR #23676).CEILINGSrow in the same PR by at most that delta. No second word from the maintainer is needed.」gatesclause is 125 B (改名或删导出符号 ⇒ push 前 `…`,记 `gates`。). Trigger plus command alone lands at 119 B, so thegatesclause and the not-a-derived-family reading take the second line (119 B). Every byte reading isLC_ALL=C awk lengthon the file.os-dev.mdis not aCROSS_FILE_MOVESdestination, so noruledRaisesrecord applies.Verification (final head
5e548689e)Ratchet, before → after (plain run, exit 0 both):
✓ check-skill-line-ratchet: .claude/agents/os-dev.md is 402 lines (ceiling 402; headroom 0).✓ check-skill-line-ratchet: .claude/agents/os-dev.md is 404 lines (ceiling 404; headroom 0).node scripts/pm/check-skill-line-ratchet.mjs --self-test→✓ check-skill-line-ratchet self-test: 164 cases pass.exit 0, before and after.Live proof of the new line's own command, run as written on this branch, exit 0:
check-platform-checklist --changed-from origin/main: 0 anchored files in the change set — nothing judged. 2 changed file(s) since merge base 140238a47, and none of them is the target of a checklist symbol anchor.(followed by the mode's standing caveat that this is not the full gate's verdict).Mechanism reading for "records the result in its report's gates line":
--ranneither refuses nor warns on an extra command. Withnode scripts/check-platform-checklist.mjs --changed-from origin/main :: exit 0appended to the run record,dispatch-gates --ranstill exits 0, keeps39 derived, 39 run, 0 NOT-MEASURED, 0 UNRUN, and printsOutside this card's derivation (1) — recorded, and named by nothing this run derived. Not an error: a run beyond the union costs nothing.Hence the second line: the verdict line goes intogatesverbatim; the run is not a derived family and does not enter reconciliation.Derived gates:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackwith no paths, at5e548689e, derived 39 commands (identical to the dispatch order's list). All 39 ran locally with exit codes captured before any pipe; reconciliation:Run reconciliation — 39 derived, 39 run, 0 NOT-MEASURED, 0 UNRUN.exit 0.pnpm --filter @objectstack/lint run check:doc-formula-expressionsfirst exited 3 (PREREQUISITE NOT MET:@objectstack/formulaand@objectstack/lintnot built). Built both under the verify lock (VERDICT command-exit 0 · held the lock 11s · waited 0s) and re-ran: exit 0. The exit-3 reading is not a measurement and was replaced in the record.pnpm check:pm-dispatch-gates(fast tier, 1884 cases, 229.4 s on this box): exit 0.pnpm check:pm-skill-id-lint:✓ check-skill-id-lint: 87 file(s) clean— no issue number entered the operating text.*.test.ts; its own suite is its--self-test(164 cases, exit 0), and the one other test file naming it,scripts/pm/dispatch-gates.self-test.mjs, ran insidecheck:pm-dispatch-gates(exit 0).check:dev-prereqsandcheck:skill-frame-freshnessare not owed: the diff touches neitherpackages/specnor a four-axis frame file.A conflict named, not quietly settled
os-dev.mdL295 (unchanged here) reads 「删不出等量内容 ⇒ 报blocked,⛔ 不抬 ceiling」, and L186–187 make the file win over a dispatch word and require conflicts to be named. The raise route here follows ruling record 6184799323 (letter B, item 1) and the ratchet header that lands it; both post-date L293–295 and explicitly admit a ruled raise, and item 5 of that ruling namesos-dev.mdlines among the raises in force. The clause is stale against the ruling; rewording it at equal line count is a separate skills-lane act, not this card's. L296's exception (land the line, leave the row, report red) does not apply: the dispatch order names the raise route, not measurement-first.Acceptance notes
os-dev.md's report JSON template has nodeviationskey while L139 and other lines name one (dispatch §2(e)). Out of scope here and untouched; neither new line referencesdeviations.--self-testcase "every live ruled-raise record quotes its ruling" coversruledRaisesrecords onCROSS_FILE_MOVESdestinations. An ordinary raise's comment block is read by the seat's contract-review record and the queue guard's reader, not by the script (ratchet header, ruled-raise clause)..claude/**,scripts/pm/**). Theskip-changesetlabel is the seat's to write..claude/**): lands by the owning seat after an at-tier## Contract reviewPASS. The draft stays a draft; no auto-merge is armed.维护者速读(草稿)
.claude/agents/os-dev.md)加两行规则:凡 PR 改名或删除了导出符号,push 前先跑一遍平台测试清单的「只看改动文件」模式,并把判定行原样写进报告的gates字段;同时把该文件的行数上限从 402 抬到 404(按裁决记录授权的抬高,附测量说明)。Generated by Claude Code