Skip to content

docs(os-dev): run the scoped platform-checklist check before push on an exported-symbol rename or removal - #23766

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-23665-scoped-checklist-before-push
Oct 16, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-23665-scoped-checklist-before-push

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

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 B

They implement ruling record 6190922830 on #23653 (letter C, item 3; maintainer 「C (推荐)」, 2026-10-15), verbatim:

  1. The dev-contract line (.claude/agents/os-dev.md, Tier S, skills lane): a PR that renames or removes an exported symbol runs the scoped check on its changed files before push and records the result in its report's gates line. One line, landing after item 1.

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: no dispatch-gates.mjs, dispatch-gates.data.mjs or dispatch-gates.self-test.mjs edit, no derived family, no CI or workflow change, and no edit to docs/qa/platform-checklist/README.md. The trigger is decidable from the author's own diff (an exported 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.md stood at 402/402 (headroom 0) on origin/main 140238a47. The .claude/agents/os-dev.md row of CEILINGS in scripts/pm/check-skill-line-ratchet.mjs moves 402 → 404, delta +2, with a comment block above the row in the shape of the execution-duties.md precedent (PR #23676).

Verification (final head 5e548689e)

Ratchet, before → after (plain run, exit 0 both):

  • before: ✓ check-skill-line-ratchet: .claude/agents/os-dev.md is 402 lines (ceiling 402; headroom 0).
  • after: ✓ 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": --ran neither refuses nor warns on an extra command. With node scripts/check-platform-checklist.mjs --changed-from origin/main :: exit 0 appended to the run record, dispatch-gates --ran still exits 0, keeps 39 derived, 39 run, 0 NOT-MEASURED, 0 UNRUN, and prints Outside 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 into gates verbatim; the run is not a derived family and does not enter reconciliation.

Derived gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack with no paths, at 5e548689e, 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-expressions first exited 3 (PREREQUISITE NOT MET: @objectstack/formula and @objectstack/lint not 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.
  • Clause ⑤ (a gate script was edited): the ratchet has no *.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 inside check:pm-dispatch-gates (exit 0).
  • Local-only families check:dev-prereqs and check:skill-frame-freshness are not owed: the diff touches neither packages/spec nor a four-axis frame file.
  • CI runs the full farm; this PR's check-runs are the record for every family CI runs.

A conflict named, not quietly settled

os-dev.md L295 (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 names os-dev.md lines 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 no deviations key while L139 and other lines name one (dispatch §2(e)). Out of scope here and untouched; neither new line references deviations.
  • The ratchet's --self-test case "every live ruled-raise record quotes its ruling" covers ruledRaises records on CROSS_FILE_MOVES destinations. 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).
  • No changeset: the diff publishes nothing (.claude/**, scripts/pm/**). The skip-changeset label is the seat's to write.
  • Governed, Tier S (.claude/**): lands by the owning seat after an at-tier ## Contract review PASS. The draft stays a draft; no auto-merge is armed.

维护者速读(草稿)

  • 改了什么:给开发 agent 的工作契约(.claude/agents/os-dev.md)加两行规则:凡 PR 改名或删除了导出符号,push 前先跑一遍平台测试清单的「只看改动文件」模式,并把判定行原样写进报告的 gates 字段;同时把该文件的行数上限从 402 抬到 404(按裁决记录授权的抬高,附测量说明)。
  • 为什么改:平台测试清单反复变红,根因常是某个 PR 改名/删除了清单锚定的符号,而清单不是逐 PR 门禁,红只在合并后被日巡发现。裁决选了「不加门禁、加开发契约」:让作者在 push 前自己跑一次范围检查,把发现提前到合并之前。
  • 风险与代价(含回滚):零运行时影响,不发布任何包;只给开发 agent 增加一步秒级自检。两行而非一行,是因为 120 字节的单行上限装不下完整命令加说明;上限抬 2 行按裁决记录授权。回滚 = revert 本 PR,两行与上限一起回退。
  • 席位意见:(留空)
  • 你要做的:无需操作;本 PR 为 Tier S,由席位在达档复核 PASS 后入队落地。

Generated by Claude Code

…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
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Oct 16, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

Seat domain:skills#2 · session_01VqGhCg9wdsBXPz54uAEWg7 (os-elon-musk) · read 2026-10-16T00:50Z · head 5e548689eac618d5aaa4823f92c8755d30cc18bf · verdict: ACCEPT (Tier S — lands on the seat only after an at-tier contract review PASS on this head)

Implemented-by: claude/issue-23665-scoped-checklist-before-push
Reviewed-by: session_01VqGhCg9wdsBXPz54uAEWg7

  1. Shape.
    • Draft PR against main. The body's first line is Fixes #23665, followed by Clause-②: no at line start, copied from claim 6204972376. The only closing keyword is that one.
    • The file list is the claimed surface:
      • .claude/agents/os-dev.md: +2 lines, at L142–143 between L141 (the trigger-shaped line) and ④;
      • the .claude/agents/os-dev.md row of CEILINGS, plus its comment block (+21/−1).
    • No dispatch-gates*.mjs, CI, workflow or checklist-README edit (ruling item 2).
  2. The ruling (6190922830, letter C, item 3) against the diff, read by the seat.
    • L142: 「改名或删除导出符号 ⇒ push 前跑 node scripts/check-platform-checklist.mjs --changed-from origin/main。」 The trigger is the ruling's, decidable from the dev's own diff, and it does not widen to every PR. The command is the mode's own spelling (check-platform-checklist.mjs header L100 on main).
    • L143: 「判定行原样记 gates;它非派生族,不在 --commands 清单,--ran 只把它列为派生外、不报错。」 The first clause is the ruling's 「records the result in its report's gates line」. The rest answers the order's §2 (d): the run is not a derived family, and --ran files it as outside the derivation. The dev measured that reading.
    • Both lines are 119 B. Item 2 stands: no derived family is added.
  3. The raise (402 → 404) against ruling 6184799323 letter B item 1, read by the seat.
    • That item authorizes a raise 「by the measured lines the text needs」, with the ordering ruling's id and the delta quoted in the PR body and the row moved by at most that delta. The body quotes 6190922830, 6184799323 and +2, and the row moves by +2.
    • The ruling sized the text as "one line". The dev measured that the verbatim command alone is 70 B in its code span, and that the tightest one-line spelling carrying trigger, command and the gates clause is 125 B, over the 120 B cap. So +2 is the measured need, not a re-wrap or an expansion.
    • The comment block above the row follows PR pm: a package's test:repo project is CI's run; a spec-plus-one-package card is build-heavy and goes mode:cloud #23676's execution-duties.md shape.
  4. Gates — check-runs pinned to head 5e548689e.
    • 38 check-runs: 29 success, 7 skipped, 1 in_progress (Test Core (1/6)) and 1 failure.
    • success includes Lint & Repo Gates, TypeScript Type Check, Governed Surface Queue Guard, every Lint lane (Lint · PM dispatch-gates among them) and every Type Check lane.
    • The failure is Check Changeset: the PR carries no changeset and no skip-changeset.
    • The dev's local union at 5e548689e covers 39 derived families: 39 run at exit 0, and --ran reports 0 not measured.
    • The ratchet --self-test (164 cases) passes, and the live run of the new command exits 0.
  5. skip-changeset is owed and held.
  6. Out of scope (carrier: this seat):
    • Stale rule text. os-dev.md L297 at the head (L295 on main) reads 「删不出等量内容 ⇒ 报 blocked,⛔ 不抬 ceiling」. That contradicts ruling 6184799323 B item 1. The dev named the conflict and followed the ruling; the ruling outranks the text. An equal-line-count reword is a skills-lane act, to be filed by this seat.
    • Known gap. The report template has no deviations key; it is already in the seat's brief.
  7. Landing.
    • At-tier contract review: OWED. The face is rules (os-dev.md), at CONTRACT_REVIEW_TIER.
    • needs:contract-review is added in this act, and the isolated reviewer is launched on this head.
    • Landing then needs skip-changeset, the pre-landing checks, and pr_ready + automerge_enable.

Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 5e548689eac618d5aaa4823f92c8755d30cc18bf
Local-runs: none
Scope: .claude/agents/os-dev.md + scripts/pm/check-skill-line-ratchet.mjs, scripts/check-platform-checklist.mjs, scripts/pm/dispatch-gates.mjs

PR #23766 for card #23665, net diff against main at 140238a47 read with git diff. Inputs: the card's body and all seven comments, ruling record 6190922830 on #23653 (letter C) and ruling record 6184799323 on #23606 (letter B), the PR body and file list, and the head's check-runs (read 2026-10-16T01:01Z). The dispatch order and the dispatching seat's conclusions were not inputs to the verdict. Face: rules — reviewFace hits on the file list are .claude/agents/os-dev.md alone; scripts/pm/check-skill-line-ratchet.mjs is not a governed path and enters the scope as the gate whose row the rule's ceiling lives in.

① Derived judgments

  1. Accept set and public surface: unchanged — right. The file list is two files, .claude/agents/os-dev.md (+2/−0) and scripts/pm/check-skill-line-ratchet.mjs (+21/−1). Neither ships in any published package's files[]; no schema, export, REST shape or metadata key moves. Clause-②: no is the correct declaration.
  2. L142, the trigger line — right. 「改名或删除导出符号 ⇒ push 前跑 node scripts/check-platform-checklist.mjs --changed-from origin/main。」 The trigger is ruling 6190922830 item 3's 「renames or removes an exported symbol」, decidable from the author's own diff and not widened to every PR. The command is the mode's own spelling: the scripts/check-platform-checklist.mjs header 「The scoped mode」 (L93–100 at the head) and SCOPED_FLAG = '--changed-from' (L2162) take exactly --changed-from REF as two arguments, and the script's self-test refuses the = spelling, so the line's spelling is the one that runs. The mode judges anchors by their TARGET file in the change set computed from the merge base with REF to the working tree, so a run before push on the worktree is the right moment. 119 B, under the 120-byte cap.
  3. L143, the recording line — right, with one reading noted. 「判定行原样记 gates;它非派生族,不在 --commands 清单,--ran 只把它列为派生外、不报错。」 The first clause is item 3's 「records the result in its report's gates line」; gates is the report's existing field (L144, L372). The rest is item 2 made operational for the reader of ③/④: no package script and no workflow spells --changed-from (grep over package.json and .github/workflows/), so --commands cannot emit it; and dispatch-gates.mjs files an unlisted recorded command under 「Outside this card's derivation (N) — recorded, and named by nothing this run derived. Not an error: a run beyond the union costs nothing.」 (recon.extra, L13996), with the ✗ verdict driven by UNRUN families, never by extras. Reading noted: the FULL gate alias pnpm check:platform-checklist is a different command and can still be derived for the script's own paths and docs/qa/**; the line speaks only of the scoped run and claims nothing about the full gate. 119 B.
  4. Placement — right. Both lines sit in 〈本地验证范围〉 between L141 (the trigger-shaped rules) and ④ (L144), inside the ③ block they qualify. No neighbour re-wrapped: the file's diff is +2/−0. No issue number entered the operating text (L142–143 scanned), so check:pm-skill-id-lint is untouched.
  5. Ruling item 2's hard limits hold — right. The file list carries no dispatch-gates.mjs, dispatch-gates.data.mjs or dispatch-gates.self-test.mjs, no .github/workflows/**, and no docs/qa/platform-checklist/README.md. Nothing enters a derived family.
  6. The ceiling raise 402 → 404 — right under ruling 6184799323 B item 1, and +2 is the measured need. B.1 authorizes a raise 「by the measured lines the text needs」 when the raising PR quotes the ordering ruling's id and the measured delta and moves the row by at most that delta. The PR body quotes 6190922830 (letter C, item 3), 6184799323 (letter B, item 1) and +2; the row moves by exactly +2. On the measure: the ratchet's run applies lengthVerdict (MAX_LINE_BYTES = 120) to every CEILINGS file, so the cap binds os-dev.md. Re-measured here with LC_ALL=C awk length on the head's text: the command is 70 B in its code span; trigger plus command alone is 119 B; the dispatch's one-line example is 137 B; the dev's tightest readable one-line spelling is 125 B; a spelling with every space removed is still 121 B. One line cannot carry trigger, command and the gates clause under the cap, so two lines at 119 B and 119 B is the floor. Ruling 6190922830's 「One line」 was a size estimate; B.1 fixes the measure as the lines the text needs. The second line's tail (not a derived family) is item 2's content, not an unruled line, so no 「新增以删减付账」 debt is owed.
  7. The CEILINGS comment block — right, in the precedent shape. It names the ordering ruling and its id, the maintainer's word verbatim 「C (推荐)」, the authorizing ruling and its id, the measured bytes, the delta, and 「Not a CROSS_FILE_MOVES destination, so no ruledRaises record applies」. Verified: the CROSS_FILE_MOVES map (L1699–2023) has destinations platform-readings.md and landing-operations.md only; os-dev.md appears in CEILINGS (L1455, 404) and MAX_TABLE_ROW_BYTES (L2114, 0) and nowhere in the move map. The ratchet cannot read rulings; this record is the reader its header names for the quote.
  8. Attribution — right. The head commit's trailers are the model-free pair (Co-authored-by: Claude plus Claude-Session:); the PR body ends in the session-URL footer; no model identifier appears in the diff, the commit, the PR body or the thread.
  9. Gates, read off the head's check-runs (43 on 5e548689e). The five required contexts: Lint & Repo Gates success, TypeScript Type Check success, Test Core success (shards 1/6–6/6 all success), Governed Surface Queue Guard success, Build Core skipped by the path filter (the standing shape for a diff outside the packages). Every Lint and Type Check lane success, Lint · PM dispatch-gates among them; 7 runs skipped by the filter. Red: Check Changeset × 2 (failure) — see ②. No other red.

② Semver level

  • The diff publishes nothing: .claude/** and scripts/pm/** are on os-dev.md L300's fast track and in no package's files[]. No changeset is right; skip-changeset is the matching declaration.
  • Clause-②: no on the PR body, copied from claim 6204972376 — right: no accept set changes.
  • The skip-changeset label is not yet on the PR: the card's comment 6205492518 records it as owed and held for the maintainer's word. Both Check Changeset runs on this head are red for that absence, not for a wrong level. This record does not stand in for the pre-landing check that every check is green: the PR lands only after the label lands and Check Changeset reruns green on this head.

③ Boundary flags

open_questions: [] — none raised. Dev deviations, each answered:

  1. Two lines and +2 instead of 「one line」 and +1 — answered in ① item 6: the measured need under a cap that binds the file; within B.1's authorization.
  2. os-dev.md L297 at the head (L295 on main) 「删不出等量内容 ⇒ 报 blocked,⛔ 不抬 ceiling」 against the raise route — answered: an accepted ruling of record binds (6184799323 B.1, landed in the ratchet header by PR feat(pm): line ratchet — a raise is authorized by the ordering ruling of record (id + measured delta in the PR body) #23668), and L188–189 require the conflict to be named, which the dev and the PR body did. The clause is stale against the ruling. Escalated: an equal-line-count reword is a domain:skills act for the seat to file; not this PR's.
  3. check:doc-formula-expressions exit 3 then 0 — answered: a PREREQUISITE NOT MET reading is not a measurement; Lint · docs & code guards and Lint · repo & tooling gates are green on the head.
  4. check:pm-dispatch-gates fast tier locally — answered: Lint · PM dispatch-gates success on the head is the record for the full battery.
  5. Model-free trailer pair over the harness reminder — answered: AGENTS.md and os-dev.md L285–286 prescribe it; verified on the head commit.
  6. No label written; no changeset — answered in ②.

Dev out_of_scope_findings, each answered: (1) the stale L297 — as flag 2, carrier the seat; (2) the report template carries no deviations key while L60, L139 and L309 name one — a known template gap, out of scope here, carrier the seat. One note of my own: the PR body cites main-relative line numbers (L186–187, L295); at the head they read L188–189 and L297. Cosmetic; nothing to change.

Implemented-by: claude/issue-23665-scoped-checklist-before-push
Reviewed-by: session_01VqGhCg9wdsBXPz54uAEWg7

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 16, 2026
@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 16, 2026 09:24
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 16, 2026 09:24
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 16, 2026
Merged via the queue into main with commit 9a1d934 Oct 16, 2026
48 of 51 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-23665-scoped-checklist-before-push branch October 16, 2026 09:40
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/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants