Skip to content

[Decision] skills token ratchet: price evals/** out (they never enter a customer context), and make the standing 「先削重复,余额按实测提高」 ruling the gate-recognised path for teaching text — or keep the per-raise ruling round #27847

Closed

Description

@objectstack-fleet

director#1 · os-bill · session_01Utp6CbQLcy8yg6vhJVXXi8

Ruled: 6513306068 · letter B · 2026-10-30T02:19Z
Ruling-ref: 6513306068

Filing gate ②: a governance choice on an existing gate, asked for by the maintainer in the director summon (2026-10-30, verbatim: 「继续帮我评估这种天花板的价值是什么,为什么要卡住车队的开发进度」) after ruling A on #26940. Filed by the director seat (summon #54 continuation 1, ledger objectstack#12708). ⛔ Not a claim. No domain:*: triage sets it (domain:skills expected — the gate's subject is skills/**, a governed face).

维护者速读

Governing text

Protocol statement. Metadata-protocol: none; Clause-②: no. The gate script is not a governed path; its subject (skills/**) is, so the change rides the skills lane.

Premises (read at origin/main ded67bfb)

  1. 85 priced rows; 28 under evals/; 27,897 of 217,710 tokens. Re-check: git show origin/main:scripts/check-skills-token-ratchet.mjs | grep -E "^\s+\['skills/" | grep -c /evals/ → 28; control: … | grep -c SKILL.md → 11.
  2. Evals are inert in consumer installs. Re-check: git show origin/main:skills/README.md | sed -n 74,75p; git grep -c "evals/" origin/main -- 'skills/*/SKILL.md' → 0.
  3. Headroom: 47 of 84 readable rows have ≤1 token of headroom, 69 have ≤20. Re-check: for each row, ceil(bytes/4) against the row (stamp line excluded on SKILL.md; the count here ignores that exclusion, so SKILL.md rows read 5 tighter than they are).
  4. The standing ruling is in reuse: git show origin/main:scripts/check-skills-token-ratchet.mjs | grep -c 先削重复 → 40.
  5. Cost of one raise through the ruling round: skills(objectstack-formula): no eval exercises currency:@path for a mail amount in the record's own currency (follow-up owed by #26660) #26940 — dev blocked 2026-10-29T05:20Z (6488686813) → seat analysis 05:27Z (6488793773) → director brief 10:16Z (6493978216) → ruling 2026-10-30T01:48Z (6512920986); three seats, about 20 hours, for +154 tokens. Four more October cards exist only because a file sat at its ceiling: skills(objectstack-ui): no eval teaches a report's dateRange / exportOptions, because both ui eval files sit at their token ceiling (follow-up owed by #26548) #26633, skills(objectstack-formula): no eval exercises label(record.FIELD), because cel-predicates-formulas.json sits at its token ceiling (follow-up owed by #26608) #26760, skills(objectstack-platform): the demoStaff row does not teach the manager key, because SKILL.md and config-plugins-ops.json sit at their token ceiling (follow-up owed by #26616) #26764, skills(objectstack-data): no eval exercises a hook's refusals catalogue, because hooks-security-seeds-datasources.json sits at its token ceiling (follow-up owed by #26170) #26834 (all closed).

Options

What changes What the team sees Workload
A keep as is Nothing. Every raise cites a ruling; seats decide case by case whether the 10-27 ruling applies. Teaching text and evals both pay by deletion; a file at its ceiling sends a card through the decision box. 0
B evals out + standing path in (i) evals/** leaves the ratchet's PRICED population (still MEASURED and printed, like generated files; check:skill-eval-tokens' quality gate and the eval self-consistency rules stay). (ii) The header names the 10-27 ruling as the gate-recognised path for SKILL.md / rules / references: a PR that shows deletion of restatement in the same file and quotes that ruling id may move the row by the measured remainder, AT the measurement — no per-card ruling. A raise with no deletion shown and no ruling stays red. An owed eval never blocks; a teaching addition pays by trimming and lands without a director round; the customer-context ceiling stays shrink-only in substance. skills · 1 PR (header + population filter + self-test rows) · S · precedent: #23606 B for the line ratchet, #12392 for the population boundary
C standing path only (ii) of B, evals stay priced. Teaching lands without a round; evals still send cards through the box when a file is full. skills · 1 PR · S
D per-bundle budget One ceiling per skill directory instead of per file; room moves between files of the same skill. Fewer walls, but a file can grow while a sibling shrinks, and the per-file dedup pressure weakens. skills · 1 PR · M · no precedent

业务含义直译:A 是「每次加一页都要老板签字,哪怕是考题本」;B 是「考题本不算页数,正文加页要先删废话、按老板已定的规矩自己办」;C 是「正文按规矩自己办,考题本仍要签字」;D 是「按整本书限页,不按章节」。

四维分析

os-decision-facets
① 长远:门禁只护客户上下文真会加载的文字;evals 计价是误标,且与 #26369 B 相撞;B 把既裁付账路径机械化(同 #23606 B)
② 拉动:#26940 一条 eval 约 20 小时三席位;10 月四张「文件满」跟进卡;常设裁决引用 40 次
③ 防错:保留「先删复述再加」的压力并要求 diff 可见;evals 随协议新增落地是加强防错
④ 不扩散:B 是既有门禁的减肢,不加门禁不加文件;D 改形
Prior rulings read: token ceiling, ratchet, 天花板, evals → 10402 ruling (header), 2026-10-27 「A:先削重复,余额按实测提高」, #23606 B (line ratchet), #26369 B, #12392; thread: none; repo: objectstack-ai/objectstack

Recommendation

B. 只看①选 B;②③④ 是否翻转:否。Not A: it keeps a known contradiction and a 20-hour round per owed eval. Not C: it leaves the mis-priced population in place. Not D: it trades the per-file dedup pressure, which is the gate's measured value, for flexibility nobody asked for. Confidence gap: whether a Claude Code consumer ever reads evals/*.json into context by its own choice was not measured (no SKILL.md points there, and the README states inert); if a harness does, (i) should instead move evals to a separate, looser budget rather than out of the count.

After the ruling

  • B or C: the skills seat files no new card — this card is the execution card: needs-user-decision → pm:queue, domain:skills; one PR edits the ratchet header, the population filter (B only) and the self-test rows, quoting this ruling; Tier by face (scripts/**, not governed; the skills seat lands it after review).
  • A: close not_planned; the 10-27 standing ruling stays a comment-level precedent.
  • D: the skills seat re-presents a per-bundle design before building.

Related

#26940 (the trigger) · #26633 · #26760 · #26764 · #26834 · #23606 · #26369 · #12392 · #10473 · scripts/check-skills-token-ratchet.mjs · skills/README.md

Dedupe

Titles of the last 1,000 objectstack issues (all states) grepped for ratchet|ceiling|天花板|token cap: #23606 (the LINE ratchet's twin question, ruled B), four closed eval follow-ups above, #23770 (closed, os-dev contract vs a ruled raise). No open card asks this question.

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    director#1 · os-bill · session_01Utp6CbQLcy8yg6vhJVXXi8

    Ruling: batch #429 item 4 · letter B · maintainer 「其他同意」 2026-10-30T02:15Z

    Director seat, summon #54 continuation 1 (ledger objectstack#12708, opening mark 6493929869). The maintainer answered batch #429 in the summon chat, verbatim: 「27681 多维度综合分析,给我建议。其他同意」 — 同意 = the seat's letter on this card: B.

    What the ruling binds (letter B), two parts in one PR on scripts/check-skills-token-ratchet.mjs:

    1. evals/** leaves the ratchet's PRICED population. Eval fixtures are inert in consumer installs (skills/README.md L74–75; no SKILL.md points at them), so they do not carry the customer-context cost the ratchet prices. They stay MEASURED and printed in the bundle total (the generated-file treatment of [finding] The published-skills TOKEN ratchet prices only SKILL.md — 37% of the shipped bundle (68,390 tokens) carries no ceiling #12392); their quality gates (check:skill-eval-tokens, the eval self-consistency rule) are untouched. An eval owed under [Decision] pm-dispatch: which PRs owe a Skills-docs: line (the #26184 audit Part B rule draft) — protocol-kind only, protocol-kind plus narrowing, or not adopted #26369 ruling B therefore never blocks on a ceiling again; its file's row is removed from the ratchet.
    2. The standing ruling becomes the gate-recognised path for teaching text (SKILL.md, rules/**, hand-authored references/**): a PR whose diff shows deletion of restatement in the same file and whose body quotes the 2026-10-27 ruling 「A:先削重复,余额按实测提高」 (or this comment) may move that file's row by the measured remainder, pinned AT the measurement, with no per-card ruling; the header and the refusal text say so, in the form [Decision] The line ratchet (check:pm-skill-ratchet): 32 of 37 files at zero headroom, so a sentence already ruled still needs a second ruling to land — keep it, let the ordering ruling carry its lines, add slack, or narrow it #23606 B gave the .claude/** line ratchet (ruling id + measured delta in the PR body; the seat record checks the quote). A raise with no deletion shown and no ruling quoted stays red; lowering stays always legitimate; the 10402 principle (no growth for a small feature) stands.
      Not taken: A (a known contradiction between [Decision] pm-dispatch: which PRs owe a Skills-docs: line (the #26184 audit Part B rule draft) — protocol-kind only, protocol-kind plus narrowing, or not adopted #26369 B and a shrink-only eval ceiling, and a ~20-hour ruling round per owed eval), C (the mis-priced population left in place), D (per-bundle budgets weaken the per-file dedup pressure, which is the gate's measured value).

    Governing text: the ratchet header (10402 ruling, L12–20; population boundary L146–159); skills/README.md L74–75; the 2026-10-27 standing ruling (quoted 40 times in the ratchet's row comments); #23606 B; #26369 B; SKILL.md 〈升级与决策〉 ④ (门禁只减不增 — this is a reduction).

    Workload of the letter: domain:skills · 1 PR · S (header, population filter, refusal text, self-test rows; the 28 eval rows removed from CEILINGS) · Clause-②: no, Metadata-protocol: none · not a governed path (scripts/**); the skills seat lands it after review · precedents #23606 B, #12392.

    Execution: this card is the execution card: needs-user-decision → pm:queue, domain:skills, priority:p2 in this act; the lane dispatches with Ruling-ref: naming this comment. Confidence gap carried into the dispatch: the dev confirms no harness reads evals/*.json into an authoring context (no SKILL.md pointer; README states inert); if one is found, evals move to a separate looser budget instead of leaving the count, and the seat re-presents.

    os-decision-facets
    ① 长远:门禁只护客户上下文真会加载的文字;既裁付账路径机械化,同 #23606 B
    ② 拉动:#26940 一条 eval 约 20 小时三席位;10 月四张「文件满」跟进卡;常设裁决引用 40 次
    ③ 防错:保留「先删复述再加」且 diff 可见;evals 随协议新增落地是加强防错
    ④ 不扩散:既有门禁的减肢,不加门禁不加文件

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p2 · domain:skills · area:devpath · audit (ruled B) · 2026-10-30T03:59Z

    ⛔ Not a claim. This audit was owed: a filer's pm:queue with no triage audit.

    • It is ruled 6513306068, letter B. Implement the ruling as worded on scripts/check-skills-token-ratchet.mjs and the rule text. Tier H. No other change to the gate.
    • pm:queue stands.

    Generated by Claude Code

  3. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    on Oct 30, 2026
  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

    Claim: PM loop round 1 · 2026-10-30T05:55Z
    Session: session_016WV4cwV7T5pwdsjZBGP4Uv (card thread; seat session_016WV4d1QkPVVzNz3FJqb2iS)
    Account: os-elon-musk
    Branch: claude/project-thread-8dcllt (the card thread's platform-assigned branch — the recorded platform exception; amended by the seat when the thread reported it)
    Worktree: objectstack-issue-27847
    Domain: domain:skills
    Seat: domain:skills#2 (seat 1 vacant on #7623; p2 rung)
    File surface: scripts/check-skills-token-ratchet.mjs (header: evals/** leaves the PRICED population, still MEASURED and printed in the bundle total; the 2026-10-27 「先削重复,余额按实测提高」 ruling named as the gate-recognised raise path for SKILL.md / rules / references when the PR shows same-file deletion of restatement and quotes the ruling id; the population filter; self-test rows), the rule text that restates the ratchet's raise rule if any (reported first) — stop on breach; explain in the report
    Container & model: S, mode:thread, model: fable (project rule: a card that edits .claude/** develops on fable); effort: medium; a gate change on a governed face's ratchet owes a CONTRACT_REVIEW_TIER review (fable) before the queue
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the ratchet prices evals/**, which never enters a customer context, and makes every measured raise wait on a per-card ruling, so an owed eval or a paid-for teaching line sits through a director round (#26940: about 20 hours, three seats, +154 tokens).
    Thread-read: 6513306068 (ruling, letter B: evals out of the priced population + the standing path in), 6514625752 (triage: implement the ruling as worded on the ratchet and the rule text; no other change to the gate)
    Premise: holds (origin/main a2f434dcc: the ratchet header still prices evals/** and requires a ruling id per raise)
    Serial constraints: open PR #27922 (#26940) edits one eval row of scripts/check-skills-token-ratchet.mjs and awaits a Tier H approval; this PR rebases after it lands, or carries that row's removal from the priced population if it lands first. No other open PR touches the file. Landing tier is read off the register at PR time; triage graded Tier H. ⛔ No other change to the gate (triage).

  5. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    domain:skills#2 · os-elon-musk · session_016WV4cwV7T5pwdsjZBGP4Uv

    {
      "issue": 27847,
      "status": "done",
      "branch": "claude/project-thread-8dcllt",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27984",
      "session": "session_016WV4cwV7T5pwdsjZBGP4Uv",
      "premise_still_valid": true,
      "summary": "Implemented ruling 6513306068 letter B on scripts/check-skills-token-ratchet.mjs and nothing else: (1) evals/** is population 1b, EVAL FIXTURES — measured, printed per file and in a new 'eval fixtures (measured, not ratcheted)' subtotal, counted into the bundle total, never ratcheted; the 28 eval rows and their comments leave CEILINGS; a CEILINGS row on an eval path is red naming the ruling (the generated-file shape); isEvalFixture() is the path predicate. (2) The header's discipline section and the over-ceiling refusal name the 2026-10-27 standing ruling 「A:先削重复,余额按实测提高」 as the one gate-recognised raise path (same-file deletion of restatement shown + ruling quoted in the PR body → move the row by the measured remainder, pinned AT the measurement; no deletion and no ruling stays red). As #23606 B for the line ratchet, the script reads neither diffs nor rulings, so (ii) is author-facing text the seat's contract-review record checks against — no new gate, no new mechanism. Rule text: nothing in .claude/**, skills/README.md or AGENTS.md restates 'a raise needs a ruling id per raise' for this gate (triage-duties.md L102 「仍需明确字句」 is satisfied by the quoted standing ruling), so zero rule-text edits, line budgets untouched. Serial case: PR #27922 (#26940) is still open awaiting Tier H approval, so this PR is based on main and the formula eval row leaves the priced population in this diff; if #27922 lands first the branch rebases and the row still leaves. Confidence gap checked: no SKILL.md/rule/guide/reference points at evals/**; the only readers are this gate, ui/scripts/check-skill-eval-tokens.mjs (maintainer scoring), bare-root-worklist.mjs (a comment) and skills/README.md.",
      "tests": "node scripts/check-skills-token-ratchet.mjs --self-test → '✓ check-skills-token-ratchet self-test: 97 cases pass.' exit 0 (18 new cases, floor 79→97). Ablations, one per pin: predicate forced to false → 9 cases red + gate red on 28 unpriced eval files; a CEILINGS row on skills/objectui/evals/testing.json → 'no ceiling names an eval fixture' red + gate red 'carries a CEILINGS row but is an EVAL FIXTURE … 6513306068'; standing-path refusal text reverted → 5 standing-path cases red. node scripts/check-skills-token-ratchet.mjs → exit 0, '56 authored bundle file(s) within their ceilings; 10 generator-owned file(s) and 28 eval fixture(s) measured, not ratcheted.'; bundle total 219351 before (main's script on the same tree) and after; ratcheted 180861/189813, eval fixtures 27188. eslint --no-inline-config on the file clean; check-commit-card-trailers --range origin/main..HEAD exit 0.",
      "gates": "node scripts/pm/dispatch-gates.mjs --commands derived 32 families at cc1daeea (fresh checkout after pnpm install --frozen-lockfile --ignore-scripts, 23 s); all 32 run, exit codes captured before any pipe (ran.list): 32 × exit 0, 0 × exit 3. --ran: '✓ dispatch-gates --ran: 32 derived famil(ies) accounted for — 32 run, 0 NOT-MEASURED'. Re-derived after the commit: 32, unchanged. Families include check-skills-token-ratchet (+ --self-test), check:ratchet-remedy-authority, check:scripts-symbol-anchors, check-self-test-wired, check:pm-dispatch-gates, check:nul-bytes, check:parse-guard, check:entry-guard. 11 changeset-dependent families do not apply (scripts/** only, skip-changeset declared on the create). CI check-runs: read on the PR by the seat at ACCEPT.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "5 — read-only: issue_read get + get_comments (#27847), pull_request_read get (#27922), subscribe_pr_activity (#27984); no GitHub MCP write",
      "api_writes": "3 — git push (origin claude/project-thread-8dcllt); relay pr_create (run 41013738542, #27984, labels: skip-changeset, no assignees); relay comment (this os-dev-report on #27847)",
      "line_budget": "scripts/check-skills-token-ratchet.mjs is under no line ratchet (not .claude/**): +148 / −358, 2055 → 1716 lines. No .claude/** or skills/** file touched, so every line budget is neutral.",
      "deviations": [
        "The GitHub MCP assignee/reviewer legs the platform prompt asks for after a PR create were NOT run: the project rule forbids GitHub MCP writes and os-dev.md forbids assignees on a dev's pr_create; the seat requests reviewers after ACCEPT.",
        "The gate run loop exceeded the 10-min foreground limit and was continued in the background (check:pm-dispatch-gates is the slow family); exit codes were still captured per command before any pipe.",
        "Commit trailer is the dispatch's 'Co-authored-by: Claude <noreply@anthropic.com>' + Claude-Session line, not the harness-suggested model-named trailer (no model name in commits)."
      ],
      "files_changed": [
        "scripts/check-skills-token-ratchet.mjs"
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "class: c · the ratchet header's opening still says `skills/` is loaded WHOLE into customer context (L12–20); evals now are an exception the populations section states. Left as is: triage ordered no other change to the gate. carrier: PR · noted, not filed"
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

    ACCEPT → PR #27984 (not on the register: ordinary queue; contract review PASS 6516625273 on head cc1daee). The seat flipped it ready and armed auto-merge.

  7. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

    Landed: PR #27984 merged (1fa48009b, 2026-10-30T06:55Z) through the ordinary queue (not on the register), on contract review PASS 6516625273. pm:dispatched is stripped with this note.

    From this commit, scripts/check-skills-token-ratchet.mjs:

    • prices no evals/** file. Eval files are still measured and printed in a subtotal and in the bundle total;
    • names the 2026-10-27 「先削重复,余额按实测提高」 ruling as the standing raise path for SKILL.md / rules / references (ruling 6513306068, letter B).

    Should-fixes 1 and 2 of the review (the refusal and header wording) ride the next header edit. PR #27922 (#26940) now rebases and drops its formula eval row. Nothing further owed on this card.

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:skillspriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions