Skip to content

fix(skills-ratchet): evals/** leave the priced population; the standing 「先削重复,余额按实测提高」 ruling is the gate-recognised raise path - #27984

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-8dcllt
Oct 30, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-8dcllt

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

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

Fixes #27847
Ruling-ref: 6513306068

What changes

One file, scripts/check-skills-token-ratchet.mjs, implementing ruling record 6513306068 (letter B) as worded, and nothing else about the gate:

  1. evals/** leaves the PRICED population. A new population 1b, EVAL FIXTURES (skills/<name>/evals/**, decided by path alone through isEvalFixture()), takes 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: measured, printed per file as (eval fixture) and in a new eval fixtures (measured, not ratcheted) subtotal, counted into the bundle total (whole shipped tree), never ratcheted. The 28 eval rows leave CEILINGS with their row comments. A CEILINGS row on an eval path is red, exactly as on a generator-owned file, with the ruling named in the refusal.
  2. The standing path. The header's discipline section and the over-ceiling refusal name the 2026-10-27 ruling 「A:先削重复,余额按实测提高」 as the one gate-recognised raise path for teaching text (SKILL.md, rules/**, guides/**, hand-authored references/**): a PR whose diff shows deletion of restatement in the same file and whose body quotes that ruling (or record 6513306068) may move the row by the measured remainder, pinned AT the measurement, with no per-card ruling; a raise with no deletion shown and no ruling quoted stays red. As [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 did for the .claude/** line ratchet, the script reads neither diffs nor rulings: the conditions are author-facing text that the seat's contract-review record checks against.
  3. Self-test. 18 new cases, floor 79 → 97: the eval-fixture predicate in both directions (a nested evals/** path is one; SKILL.md, a rule, a reference, skills/README.md, a rules/evals/ path and a bare evals/ outside skills/ are not), an eval fixture with no row is green and says measured-not-ratcheted, a row on one is red naming the ruling, no row names an eval path, the real tree has eval fixtures, the walk still measures them, the report counts them into the bundle total and not into the ratcheted subtotal and prints their subtotal; and the refusal text carries the ruling id, the same-file-deletion condition, the AT-the-measurement pin and the no-deletion-no-ruling red.

Not changed: the walk, the counting convention, the stamp-line exclusion, the generator-owned boundary and its tripwire, every teaching row, check:skill-eval-tokens and the eval self-consistency rule. No rule text restates "a raise needs a ruling id per raise" for this gate (.claude/**, skills/README.md, AGENTS.md grepped for the ratchet, 天花板, token ceiling): triage-duties.md L102 says a ceiling raise 「仍需明确字句」, which the quoted standing ruling is, so the rule text is untouched.

Why

The ratchet priced evals/**, which no customer session loads (skills/README.md layout: evals are 「used by maintainers to score the skill, inert (but harmless) in consumer installs」; git grep -c "evals/" origin/main -- 'skills/*/SKILL.md' → 0), so an eval owed under #26369 B blocked on a ceiling that protects nothing a customer pays for, and every measured raise waited on a per-card ruling although the maintainer had already ruled the payment path on 2026-10-27 (quoted 40 times in the row comments). #26940 cost about 20 hours and three seats for +154 tokens. The maintainer ruled B on #27847 (record 6513306068, 「其他同意」).

Confidence gap carried into the dispatch, checked: no harness reads evals/*.json into an authoring context. Readers on origin/main 9cd54faa: scripts/check-skills-token-ratchet.mjs (this gate), ui/scripts/check-skill-eval-tokens.mjs (maintainer scoring), scripts/pm/bare-root-worklist.mjs (a comment naming the folder), skills/README.md (the layout). No SKILL.md, rule, guide or reference points at an eval file.

Serial: PR #27922 (#26940) edits one eval row in this file and still waits on its Tier H approval, so this PR is based on main; that row (skills/objectstack-formula/evals/cel-predicates-formulas.json) leaves the priced population in this diff. If #27922 lands first, this branch rebases onto it and the row still leaves.

Verification

  • node scripts/check-skills-token-ratchet.mjs --self-test → 97 cases pass, exit 0. Ablated once per pin: the predicate forced to false → 9 cases red and the gate red on 28 unpriced files; a CEILINGS row on skills/objectui/evals/testing.json → no ceiling names an eval fixture red and the gate red with the eval-fixture refusal; the standing-path text reverted to the old sentence → the 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 and after (main's script run on the same tree prints 219351); ratcheted (authored) 180861 / 189813, eval fixtures 27188.
  • pnpm check:ratchet-remedy-authority exit 0 (this gate still classified as marking the expanding remedy ⛔ MAINTAINER-ONLY); eslint --no-inline-config on the file clean; node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD exit 0.
  • Gates: node scripts/pm/dispatch-gates.mjs --commands derived 32 families on cc1daeea (fresh checkout after pnpm install --frozen-lockfile --ignore-scripts); every one ran with its exit code captured before any pipe: 32 run, 32 exit 0, 0 NOT MEASURED; --ran reconciliation: 32 derived famil(ies) accounted for — 32 run, 0 NOT-MEASURED; re-derived after the commit, still 32. Among them: check-skills-token-ratchet and its --self-test, check:ratchet-remedy-authority, check:scripts-symbol-anchors, check:self-test-wired, check:pm-dispatch-gates, check:nul-bytes. No package source changed, so no package test or typecheck is owed; the 11 changeset-dependent families do not apply (skip-changeset).

Clause-②: no
Metadata-protocol: none

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (No spec change.)
  • 2. Every name I added uses the casing for its kind.
  • 3. No formatter ran; eslint on the edited file passes (full pnpm lint left to CI).
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. No published package changes (scripts/** only), so no changeset; skip-changeset declared on the create; both declaration lines are filled in above.
  • 6. packages/spec not touched.
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English.
  • The Before Submitting list in CONTRIBUTING.md is done.

维护者速读

  • 改了什么:scripts/check-skills-token-ratchet.mjs 一个文件。evals/** 退出计价总体(仍量、仍打印进 bundle 总量,28 行从 CEILINGS 删除,给 eval 文件加行即红);表头与超限拒绝文案把你 10-27 裁的「A:先削重复,余额按实测提高」写成门禁认可的唯一抬高路径(同文件可见删复述 + PR 正文引裁决 ⇒ 按实测余额抬、钉在实测;没删没引仍红);自测加 18 钉。
  • 为什么改:按 [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 裁决 B(6513306068)原话实现;分诊要求门禁不作其他改动,已遵守。
  • 风险与回滚:不动走法、计数口径、版本戳排除、生成文件边界与任何教学行;bundle 总量前后都是 219351。回滚即 revert 本 PR。
  • 先看:表头〈The ratchet discipline〉第三条与〈populations〉的 1b;再看 verdict() 的 eval 分支与超限文案。
  • 两分钟验证:node scripts/check-skills-token-ratchet.mjs --self-test 预期 97 cases pass;node scripts/check-skills-token-ratchet.mjs 预期末行 56 authored … 10 generator-owned … 28 eval fixture(s),exit 0。
  • 需要你做的:本 PR 欠契约复审(席位记录);落地档位按登记册在 PR 时读出(分诊定 Tier H),由席位按该档位落地。

🤖 Generated with Claude Code

https://claude.ai/code/session_016WV4cwV7T5pwdsjZBGP4Uv

…ng 「先削重复,余额按实测提高」 ruling is the gate-recognised raise path

Ruling record 6513306068 on the token-ratchet decision card, letter B.

- `evals/**` under a published skill is population 1b: measured and
  printed in the bundle total, never ratcheted — the generated-file
  treatment. The 28 eval rows leave `CEILINGS`; a row on an eval path is
  red, as on a generated file. `isEvalFixture()` is the path predicate.
- The header and the over-ceiling refusal name the 2026-10-27 standing
  ruling as the one gate-recognised raise path for teaching text: deletion
  of restatement shown in the same file plus the ruling quoted in the PR
  body moves the row by the measured remainder, pinned AT the measurement;
  no deletion and no ruling stays red. The script reads neither diffs nor
  rulings, so the conditions are text the seat's review checks, as #23606
  B did for the line ratchet.
- Self-test: 18 new cases pin both legs (eval fixture not priced but
  printed; the refusal carries the ruling id, both conditions and the pin);
  floor 79 -> 97. Bundle total unchanged (219351).

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4cwV7T5pwdsjZBGP4Uv
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 30, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

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

Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head cc1daee · 2026-10-30T06:25Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

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

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: cc1daeead95f07366708ee97fed55ed9869ab083
Local-runs: probe — the head script and main's script run on the head tree (--self-test and the gate), 21 ablations of the head script and the tree in a detached worktree (removed afterwards), check-ratchet-remedy-authority and check-scripts-symbol-anchors on the head, git merge-tree of #27984 and #27922 in both orders
Scope: scripts/check-skills-token-ratchet.mjs (the one file in the diff: header L124-145 and L162-196, CEILINGS L663-1047, isEvalFixture :1062, verdict :1073-1144, reportLines :1156-1193, run :1195-1250, SELF_TEST_BATTERIES :1316-1402, SELF_TEST_BATTERY_FLOOR :1409, selfTest :1411 onward) + the code and text its hunks assert: scripts/pm/check-skill-line-ratchet.mjs (the #23606 B form, rows :1326-1351 and :1546-1553), scripts/pm/check-governed-merges.mjs (generatedExceptionFor, imported unchanged), scripts/check-ratchet-remedy-authority.mjs (registry row for this gate :839-842), skills/README.md :74-75 (evals inert), .github/workflows/lint.yml :5457-5463 (the CI step), .claude/skills/pm-dispatch/references/triage-duties.md :102, ui/scripts/check-skill-eval-tokens.mjs (untouched, confirmed by the file list), PR #27922's diff on the same file (read for the serial case), card #27847, ruling 6513306068, triage 6514625752, claim 6516079887, os-dev report 6516446549 and /mnt/project-files/skills-lane-seat2/report-27847.json, dispatch-27847.md

① Derived judgments

Base: the PR's merge base with origin/main is 6caca510e; origin/main at review time is 4a5396b81, and between the two neither scripts/check-skills-token-ratchet.mjs nor anything under skills/ changed, so every measurement below reads the same on either. The diff is one file, +148/−358 (2055 to 1845 lines).

  1. The −358 is fully accounted for: 28 CEILINGS rows, every one under an evals/ path (the 28 the card counted), 308 row-comment lines attached to those rows (the per-raise history, including the 40 quotations of the 2026-10-27 ruling, which now lives once in the header and once in the refusal), 10 header lines (the old three-line raise sentence, the old five-line population 1 paragraph, "Three populations", the "and the evals rows" clause, one lead-in), 4 blank lines, and 8 code lines: the two-line old refusal sentence, the bundle-total line, the ratcheted count, the summary line, the floor constant, the self-test authored filter, and the self-test case "the raise is bound to a quoted maintainer ruling". No other logic line was removed. The +148 adds nothing beyond the two legs and their pins. TRUE to the triage line "no other change to the gate".
  2. Non-eval rows and ceilings are byte-identical: the 56 rows left on the head (grep of ['skills/ row lines, sorted) equal main's 56 non-eval rows exactly; main had 84 rows (56 + 28), the head's CEILINGS Map has 56 keys, sum 189813, every key an existing file. No row is raised, lowered, added or re-commented. The --self-test floor row "every discovered AUTHORED file carries a ceiling today" still passes on the real tree.
  3. Leg (i) as worded. isEvalFixture(rel) is /^skills\/[^/]+\/evals\//: evals/ directly under a skill directory, and discoverBundleFiles enters only skills/NAME directories carrying a SKILL.md, so the predicate can only match files of a published skill's own evals/ tree. It cannot match a SKILL.md, a rules/ file or a references/ file: pinned by two self-test cases (three teaching paths are false; evals/x.json, skills/README.md and skills/demo/rules/evals/x.md are false) and reproduced on the tree — a probe skills/objectstack-ai/rules/evals/x.md is priced and reds as unpriced; a probe skills/objectstack-ai/references/probe-new.md reds as unpriced. The two evals/README.md files leave with the rest, which is what evals/** says.
  4. MEASURED and printed, 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: verdict returns green "eval fixture, measured but not ratcheted" when no row exists; reportLines prints each file as (eval fixture), a new subtotal eval fixtures (measured, not ratcheted) 27188, and adds it into bundle total (whole shipped tree). Head script on the head tree: 219351 bundle total, ratcheted (authored) 180861 / 189813, 56 authored + 10 generator-owned + 28 eval fixtures, exit 0. Main's script on the same tree: 219351 bundle total, 208049 / 217809, 84 authored + 10 generator-owned, exit 0. 208049 − 180861 = 27188 = the eval subtotal, so no token left the printed total.
  5. A CEILINGS row on an eval path is red with the ruling named — the same shape as the generated-file guard (verdict branch after the generator branch, before the unpriced check). Reproduced: a row for skills/objectui/evals/testing.json reds the self-test ("no ceiling names an eval fixture") and the gate ("carries a CEILINGS row but is an EVAL FIXTURE ... 6513306068"). An eval file grown by 400 bytes stays green and is printed at 566 with the subtotal moved to 27288; a new evals/probe-new.json under a published skill is green and printed. check:skill-eval-tokens (ui/scripts) and the eval self-consistency rule are not in the diff.
  6. Leg (ii) as worded. The header's discipline section now names the 2026-10-27 ruling verbatim and untranslated 「A:先削重复,余额按实测提高」, the record 6513306068 ([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 letter B, 「其他同意」), the [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 form, the two conditions (deletion of restatement IN THE SAME FILE shown in the diff; the ruling quoted in the body), the effect (move the row by the measured remainder, pinned AT the measurement, no per-card ruling), the red (no deletion shown and no ruling quoted), that a ruling of record ordering text still authorises its own delta, and that the 10402 principle stands. The over-ceiling refusal carries the ruling record, the 2026-10-27 words, the same-file deletion condition, the AT-the-measurement pin, the no-deletion-no-ruling red and RATCHET_AUTHORITY_MARKER. Reproduced on the tree: 120 bytes appended to skills/objectstack-ui/SKILL.md reds the gate (3879 against 3851, over by 28) with every one of those six strings present once; 80 bytes appended to skills/objectstack-query/rules/filters.md reds (2503 against 2482).
  7. How (ii) is recognised mechanically: it is not, and that is true to the ruling. The ruling says "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)"; the line ratchet's [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 rows are row comments plus the PR body, read by no code. The script reads no diff and no PR body before or after this PR; the only mechanical act a PR can take is to edit a row, which is exactly what it could do on main (probe: objectui/SKILL.md row 1852 to 1952 with no file change is green on the head script, as on main). Nothing is loosened: no row moved, no headroom was granted, no path was added by which a row can move without a seat record, and no new gate, check, workflow or script was added (the one new function is a path predicate mirroring generatorOwning, the one new verdict branch mirrors the generator branch).
  8. Population text: the old population 1 list "SKILL.md, rules/, evals/ and hand-authored references/" becomes "SKILL.md, rules/, guides/** and hand-authored references/**". guides/** (objectui's five guides) were priced on main under rows that are byte-identical on the head; the old text omitted them. The raise rule in the discipline section applies to every priced row, as it did on main, so naming guides/** describes the existing population and changes no behaviour. The ruling's "SKILL.md / rules / references" is read as the teaching text, which guides are. Accepted.
  9. The self-test pins both legs: 18 new cases (4 on the refusal text, 14 on the eval population), roster 79 to 97, floor 79 to 97. Ablated once each, head script copies in the worktree: predicate forced false — 9 cases red, gate red on all 28 eval files as unpriced; regex loosened to /evals\// — 1 red (outside-skill case); eval-row red removed — 2 red; eval tokens dropped from the bundle total — 1 red; eval subtotal line removed — 1 red; eval counted into the ratcheted subtotal — 2 red; old refusal sentence restored — 5 red; each of the four refusal conditions removed alone — 1 red each; authority marker dropped — 1 red (existing pin); one roster label deleted — floor red (96 below 97, undeclared battery); one case deleted with its label kept — floor red (battery DID NOT RUN). Every new pin goes red under its ablation. Lowering the floor constant itself to 96 is not caught; that is the floor's design on main too (it guards the roster count, and the constant is a diff-visible edit), not a change in this PR.
  10. Neighbouring gates on the head: check-ratchet-remedy-authority self-test and gate exit 0 (this gate still classified marked, registry row unchanged); check-scripts-symbol-anchors self-test and gate exit 0 (4086 anchors resolve); dispatch-gates --commands derives the ratchet and its self-test among the families, as the report says.
  11. Rule text: nothing under .claude/**, skills/README.md or AGENTS.md restates "a raise needs a ruling id per raise" for this gate. dispatch-runbook.md:78 and SKILL.md:240 bind the Ruling-ref on leaving the decision box, not the ratchet; triage-duties.md:102 says a ceiling raise 「仍需明确字句」, which the quoted standing ruling is. Zero rule-text edits is the right count; line budgets untouched.
  12. PR declarations: Fixes #27847, Ruling-ref: 6513306068, Clause-②: no, Metadata-protocol: none, ## 维护者速读 six lines in Chinese with the last line saying contract review is owed and the tier is the register's; labels skip-changeset, size/l; draft; user.login is objectstack-fleet[bot]; mergeable_state: blocked. The body's numbers (97 cases, 56/10/28, 219351, 180861/189813, 27188) reproduce exactly.

② Semver level

None owed. The diff is scripts/** only; no published package, no packages/spec, no changeset; skip-changeset declared on the create and consistent with Human Minimum 5 in the body. Clause-②: no is right: no accepted set and no public face changes.

③ Boundary flags

④ Design judgment

Rules face, judged on the hits file against the ruling's acceptance scenarios and the code it changes:

  • scripts/check-skills-token-ratchet.mjs guards the governed skills/** face, so the question is whether the gate after this PR still protects what the 10402 ruling protects and nothing less. It does: every customer-loaded file (SKILL.md, rules, guides, references, objectui's README) keeps its row at its exact main ceiling; an unpaid addition to any of them reds with the full refusal (probes on a SKILL.md and a rules file); an unpriced new teaching file reds; an evals/-named directory anywhere but directly under the skill root is still priced. What leaves is only what no customer session loads (skills/README.md:74-75), and it leaves the way [finding] The published-skills TOKEN ratchet prices only SKILL.md — 37% of the shipped bundle (68,390 tokens) carries no ceiling #12392's generated files left — measured, printed per file, subtotalled, in the bundle total — so the whole-tree number a maintainer reads is unchanged (219351 before and after) and the eval population cannot grow silently out of sight. The ruling's two scenarios hold: an owed eval never blocks (eval growth and a new eval file are green and printed); a teaching addition still pays by deletion and the standing path is written where the author meets it, in the words of the ruling, with the conditions, the pin and the red spelled out and pinned by four self-test cases.
  • The one thing the ruling does not ask the script to do is read a diff or a PR body, and the PR does not pretend otherwise: it says in the header, in the self-test comment and in the body that the deletion and the quote are the seat's contract-review record to check, in the [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 form. That keeps the gate a reduction (SKILL.md 〈升级与决策〉 ④: 门禁只减不增): one predicate, one verdict branch, one subtotal, 18 pins, 28 rows out, no new gate.

No file in hits is a schema or an ADR, so no first-consumer or execution-plan judgment is owed.

Implemented-by: claude/project-thread-8dcllt
Reviewed-by: session_016WV4d1QkPVVzNz3FJqb2iS

VERDICT: PASS

Must-fix: none.

Should-fix:

  1. scripts/check-skills-token-ratchet.mjs over-ceiling refusal (verdict, about :1137): it says the other direction "has one gate-recognised path" while the header (L22-24) and the ruling both keep the second authorisation, "a ruling of record that orders text into a file still authorises its own measured delta". Adding "or a ruling of record that orders the text, quoted with its measured delta" to the refusal, about 15 words, would make the author-facing text match the header; the four standing-path pins still pass as written. Follow-up, not a blocker: the red for an unpaid raise is correct either way and the header is the authority.
  2. Header L21-24 ("skills/ is loaded WHOLE into customer agent context windows") now has a stated exception in population 1b. Triage forbade other changes to the gate in this PR; when the header is next edited, one clause there ("every hand-authored teaching file under it") closes the gap. Carried from the report's out-of-scope finding.
  3. docs(skills): objectstack-formula eval for a mail amount in each record's own currency (currency:@path) #27922 (skills(objectstack-formula): no eval exercises currency:@path for a mail amount in the record's own currency (follow-up owed by #26660) #26940): whichever of the two PRs lands second must drop the formula eval row and its comment in the rebase; the gate reds a kept row, so this is a sequencing note for the seat, not a change to this PR.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

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

维护者速读

  • 改了什么:按你批准的 B(裁决 6513306068)改 skills token 天花板门禁。① evals/** 退出计价:28 个 eval 文件的上限行与注释删除,但仍逐个测量,打出小计(27188)并计入总量(219351,前后相同)。② 门禁头部写明你 10-27 的「A:先削重复,余额按实测提高」是教学文字(SKILL.md / rules / references)抬上限的常设路径:同一文件里看得见删掉的复述,并引用该裁决号,即可按实测余额抬行,不再逐卡请裁。只改 scripts/check-skills-token-ratchet.mjs 一个文件,+148/−358。
  • 为什么改:evals 从不进客户上下文,却占计价的 12%;每补一条 eval 都要走一轮裁决(skills(objectstack-formula): no eval exercises currency:@path for a mail amount in the record's own currency (follow-up owed by #26660) #26940 那条用了约 20 小时、三个席位)。
  • 风险与回滚:不加门禁,教学文字仍只降不升。56 条非 eval 行逐字节不变;没付账的抬行仍然是红的(实测:SKILL.md +120 B、rules 文件 +80 B 均转红)。revert 即回滚。
  • 先看:脚本头部的两段新说明,再看 isEvalFixture(/^skills\/[^/]+\/evals\//,只能命中 evals 目录)。
  • 两分钟验证:node scripts/check-skills-token-ratchet.mjs exit 0(56 个计价文件、10 个生成文件、28 个 eval 文件);--self-test 97 条通过。
  • 需要你做的:无。登记册判定本 PR 不在受管面(分诊写的 Tier H 不作数,以登记册为准),契约复核 PASS 6516625273(Head-sha: cc1daeead95f07366708ee97fed55ed9869ab083),由本席转 ready 并开自动合并。

席位意见:ACCEPT。契约复核 PASS,没有 must-fix。−358 行逐行对上:28 条 eval 行、308 行附带注释、10 行头部、4 行空行、8 行代码。should-fix 1、2 都是说明文字:拒收提示只提一条路径,没提「裁决本身命令写入」那条;头部「skills/ 整体加载」没注明 evals 例外。按分诊「门禁不做其他改动」,留到下次改头部时一并处理,不阻塞。should-fix 3 是与 #27922 的合并顺序,见下。

席位核对

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 30, 2026 06:38
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 30, 2026 06:38
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 30, 2026
Merged via the queue into main with commit 1fa4800 Oct 30, 2026
47 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-8dcllt branch October 30, 2026 06:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/l skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant