Repository navigation
docs(os-dev): admit the ruled ceiling raise in the ratchet block and point at the ratchet header - #23868
Conversation
The dev contract's ratchet block told a dev to report blocked and never raise a ceiling, which contradicted the ruling of record landed in the header of scripts/pm/check-skill-line-ratchet.mjs: a ruling that orders text into a ratcheted file authorizes the raise. The clause now admits that one exception and points at the ratchet header for its form, at equal line count and under the 120-byte line cap; the permission for a density fix that buys no content moves onto the preceding line. 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: Read 2026-10-16T10:26Z by the isolated reviewer, on the inputs alone: card #23770 (body and all four comments — the claim 6212771865, the order, the ① Derived judgments
② Semver level
③ Boundary flags
The two Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #23770
Clause-②: no
What lands
Two lines of the ratchet block in
.claude/agents/os-dev.md(L296–L297 on the base) are rewritten in place. Net 0 lines (404 → 404), noCEILINGSrow moves, no line is freed or added, and the file is the only path in the diff.- 密度优化只随净减内容的 PR;分界只问折行有没有为新增内容买行。- 密度优化只随净减内容的 PR;分界只问折行有没有为新增内容买行;不买者 ⛔ 不当筹行拒。- ⛔ 不把不买内容的密度修复当筹行拒掉;删不出等量内容 ⇒ 报 `blocked`,⛔ 不抬 ceiling。- 删不出等量内容 ⇒ 报 `blocked`,⛔ 不自抬 ceiling;裁决记录下令写入者除外(见棘轮头部)。Every byte reading is
LC_ALL=C awk lengthon the file at7ba991b9a.Why
The stale clause told a dev 「删不出等量内容 ⇒ 报
blocked,⛔ 不抬 ceiling」 with no exception, while ruling record 6184799323 on #23606 (letter B, item 1, maintainer 「同意」) admits one: a ruling of record that orders text into a ratcheted file authorizes the raise, quoted with its id and measured delta in the raising PR. The ruling's single source in the tree is the ratchet header (scripts/pm/check-skill-line-ratchet.mjs, section 「The ratchet discipline」, the RAISING bullet, L66–77 on this base) and theSKILL.mdguard-index row (L291). The new L297 admits the exception in one clause and points at the header — it restates nothing: the form (ruling id plus delta in the PR body; at most that delta; no tolerance band) stays where it is landed.What each clause keeps (dispatch §2(d)):
blocked」 — a dev with no ruling behind its lines still reportsblockedwhen it cannot delete equal content.blocked」 nor 「不抬」 applies, and the ruled raise is the route.Paying for the bytes — a move within the block, not a deletion and not a raise
Measured first, as dispatch §3 asked: keeping L297's first clause and appending the ruled-raise tail lands at 179 B; the card's example tail alone, as a line, at 126 B; the tightest tail that keeps 「报
blocked」, the ⛔ and the header pointer at 117 B. So the first clause 「⛔ 不把不买内容的密度修复当筹行拒掉」 could not stay on L297.Instead of deleting it, it moves onto L296, compressed to 「不买者 ⛔ 不当筹行拒」 — the same permission (a density edit that buys no content is not refused as a 筹行), now beside the dividing line whose negative branch it is (「分界只问折行有没有为新增内容买行」). L296 goes 90 → 120 B. Nothing is dropped, so no deletion is named and no single source is claimed for one.
Why this is not re-wrapping: 「新增以删减付账」 and the ⛔ on re-wrap are about LINES — merging lines to free one and spending it on new content. Here no line is freed and no line is added; two adjacent rule lines are edited in place under the ratchet header's 120-byte line convention (its 「Why 120 bytes」 section). The ratchet's count is unchanged, so there is nothing to pay.
CEILINGSmove: no ruling orders this text, so item 2 of the ruling applies.CEILINGSclause.Mechanism assumptions (dispatch §2), measured on the base
origin/mainmoved0af559e80→f7e836da1(PR docs(pm-dispatch): let an execution seat accept a filer-labelled card when the lane fits the domain table and the body passes the filing gate; triage spot-checks after #23751) between the order and this branch;git diff 0af559e80 f7e836da1 -- .claude/agents/os-dev.mdis empty. 404 lines, L297 at 116 B, headroom 0, L292–298 as the order read them.f7e836da1: the ratchet header's RAISING bullet (L66–77; the paragraph runs two lines past the card's L75) and theSKILL.mdguard row (L291: 「抬上限凭下令写入的裁决记录……无裁决 id 即红……不买内容的密度修复允许」).CEILINGSmove, no re-wrap. No deletion was needed, so none is named.No conflict between the file's current text and the order was met: the order's budgets add to the file's rules without contradicting any line of it.
Verification (final head
7ba991b9a)Ratchet verdict for the file, plain run, exit 0 both times:
f7e836da1):✓ check-skill-line-ratchet: .claude/agents/os-dev.md is 404 lines (ceiling 404; headroom 0).7ba991b9a):✓ check-skill-line-ratchet: .claude/agents/os-dev.md is 404 lines (ceiling 404; headroom 0).pnpm check:pm-skill-ratchet(self-test then gate):✓ check-skill-line-ratchet self-test: 164 cases pass.and the line above; exit 0.Derived gates:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackwith no paths at7ba991b9aderived 20 commands, identical to the dispatch order's list. All 20 ran locally, each exit code captured before any pipe (output redirected to a log first, the status read next), all exit 0. Reconciliation:Run reconciliation — 20 derived, 20 run, 0 NOT-MEASURED, 0 UNRUN.exit 0.pnpm --filter @objectstack/lint run check:doc-formula-expressionsneeds@objectstack/formulaand@objectstack/lintbuilt: their dependency closures were built under the verify lock (VERDICT command-exit 0 · held the lock 112s · waited 0s), then the gate exited 0. A first attempt without the closure stopped attsupdts on an unbuilt@objectstack/spec(VERDICT command-exit 1) — a build-order fact, not a measurement, superseded by the closure build.pnpm check:pm-skill-id-lint:✓ check-skill-id-lint: 87 file(s) clean— no issue number enters the operating text (the ruling is reached through its header, not by id).pnpm check:skill-frame-sync: exit 0 — the file carries no second copy of the decision frame.pnpm check:nul-bytes: exit 0; the edited file also passes the raw control-byte grep from the file's own byte discipline (no match).pnpm check:skill-frame-freshnessexit 0 (1/1 framework files are byte-identical to the ref).pnpm check:dev-prereqsexit 1 — 「The workspace is not built — 1 unmet precondition」: 65 of 69 packages have nodist/in this fresh worktree, where only the formula/lint closure was built. A box-state reading, not a verdict on the diff; CI's fresh checkout builds the workspace.Acceptance notes
os-dev.mdnames nodeviations,line_budgetorfiles_changedkey, while dispatch §7 asks for them as machine-checkable fields and the file's own L139 writes todeviations. PR docs(os-dev): run the scoped platform-checklist check before push on an exported-symbol rename or removal #23766 noted thedeviationshalf. Out of scope here and untouched; the report carries the keys anyway. Carrier: none — noted, not filed..claude/skills/spec-property-retirement/SKILL.md(max-table-row pin 326, measured 324: 「lower the pin to 324」) — an opportunistic tightening the gate itself suggests, on a path not this card's. Carrier: none — noted, not filed..claude/**). Theskip-changesetlabel is the seat's to write; this PR writes no label..claude/**): lands by the owning seat after an at-tier## Contract reviewPASS. The draft stays a draft; no auto-merge, no reviewer request.维护者速读(草稿)
.claude/agents/os-dev.md)里关于「行数上限」的两行。原来写死「删不出等量内容就报 blocked,绝不抬上限」;现在加上唯一的例外——维护者裁决记录下令写进去的文字,可以按棘轮门禁脚本头部写明的格式抬上限(PR 正文引裁决评论 id 与实测增量)。另一句「不买内容的密度修复不拒」原样保留,只是挪到上一行并压缩。总行数不变、上限不动、不发布任何包。Generated by Claude Code