docs(skills): the walk-radius mandate picks the turbo task by rule, not by name - #17016
Conversation
…ot by name The tree-scoped-pin checklist item named `<pkg>#test` unconditionally. Since the test task was split, a package declaring a `test:repo` script hashes its radius on `<pkg>#test:repo` and its `<pkg>#test` must carry no root input — the gate enforces both directions, so following the sentence literally reds twice. The bullet now states the picker and points at `scripts/check-cross-package-test-inputs.mjs` as the authority when the two disagree. In place, line-neutral (337/337, headroom 0); the addition is paid for by deleting the turbo/CI-shard rationale clause, not by a re-wrap. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HxLw5aKDPR5RJgyUR7Exkd
维护者速读 — PR #17016(#16987,skills 席终稿,2026-09-09T02:30Z)改了什么 — 退役 playbook( 为什么改 — 这句话是判定一次退役有没有做完的条件,而它把执行者送去撞门禁:6 个拆分包(core / objectql / rest / runtime / spec / types)的根输入都在 风险与代价(含回滚) — 只动一段说明文字,不动门禁、不动 席位意见 — 接受。本席在拉下来的分支头上复量:字节 120 / 118 / 119 / 118、337 → 337 行、控制字节 0;受管面命中 你要做的 — 合并;或由 os-zhuang / hotlong 批准,本席随即入队。看两处即可:① 新句子的规则对不对(6/6 实测在 PR 正文);② 是否同意用删理由句付这 83 字节。 Generated by Claude Code |
Fixes #16987
PKG(PKG#test,PKG#test:repo) so the body survives the platform's byte rewriting. The file is unchanged in that spelling, and every byte count below is of the FILE's bytes, never of this rendering.What changed
.claude/skills/spec-property-retirement/SKILL.md, the tree-scoped-pin checklist item's ⭐ 半径按包申报一次 bullet (lines 278–281). It namedPKG#testunconditionally. It now states the picker and names the authority, in place and line-neutral.Before (4 lines, 392 bytes — 89 · 90 · 113 · 100):
After (4 lines, 475 bytes — 120 · 118 · 119 · 118):
Kept intact: the
CROSS_PACKAGE_TEST_INPUTSanchor, theheldBywitness clause, and the closing completion condition ⛔ 半径未申报的 tree-scoped pin 不是完成的退役。⛔ Not touched:
scripts/check-cross-package-test-inputs.mjsandturbo.json— the gate is correct and #10315 / #10694 hold on that script. This is a documentation defect, and the fix is only in the documentation.The 83 added bytes are paid for by deleted content, not by a re-wrap
The bullet is 4 lines before and 4 lines after; the file is 337/337 with headroom 0, and the ratchet's per-line budget is 120 bytes, so the envelope is fixed at 4 × 120. The picker plus the authority pointer do not fit inside the old wording. They are paid for by deleting the rationale clause
turbo 才 hash 得到它、CI 分片并集才看得见— the bullet's only pure-why clause, and the one clause nothing else in the file depends on (git grepfor分片/并集/hashin this file returns no other bullet stating it). ⛔ No ceiling was raised, and no line was re-flowed to buy room.Two smaller compressions in the same envelope:
那条 glob 还要一条→的 glob 另配, and的 PKG#test inputs→ the picker sentence itself.Readings — all taken on this branch at
c7178179(baseee2cb6b4), not transcribedPackages declaring a
test:reposcript —git grep -l '"test:repo"' -- 'packages/**/package.json'→ 6:turbo.jsoninputs, counted per task on this branch:#testinputs#testROOT#test:repoinputs#test:repoROOT⇒ 6 of 6, zero exceptions: on every split package the root inputs sit on
#test:repoand#testcarries none. The rule is flat, so it is written flat — no "in most cases", no carve-out.The authority already knows about the split, and says so itself.
pnpm check:cross-package-test-inputson this branch prints, unprompted:And its own self-test pins the failing direction (
scripts/check-cross-package-test-inputs.mjs:2569, verbatim except the placeholder substitution declared at the top of this body):The playbook's blindness to the split, and its repair:
Gates — 16 derived, 16 run, 16 green, 0 NOT-MEASURED
Derived from the real change set, not from the dispatch list:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackatc7178179, reconciled afterwards with--ran:Each exit code was captured after redirecting to a file, never across a pipe. All 16 exited 0. The two that speak directly to this diff:
pnpm check:nul-bytesis green, and an independent scan of the changed file for control bytes returned no match.Lint, narrowed and proved narrowed. ① The linted population is read from
eslint.config.mjsitself: every config object'sfilesis ats/tsx/mts/cts/js/jsx/mjs/cjsglob, and markdown matches none — ESLint says so in its own words,File ignored because no matching configuration was supplied.② The count is read from--format json: 1 result, 0 files actually linted, 0 errors. ③ Invariance for untouched files: this repo "never enables type-aware linting (noparserOptions.project, no typed@typescript-eslintrules) for ANY file" (eslint.config.mjs, its own comment), so a diff confined to one markdown file cannot move any untouched file's verdict. The repo-widepnpm lintis CI's run.No package tests are owed. The diff touches no workspace package, so there is no dependency closure to build and no affected package's
test/typecheckto run.@objectstack/lintand@objectstack/formulawere built only becausecheck:doc-formula-expressionsreads theirdist/.skip-changeset:.claude/**is not published — nothing in any package'sfiles[]moves.维护者速读(草稿)
改了什么
退役 playbook(
.claude/skills/spec-property-retirement/SKILL.md)里那条「半径按包申报一次」的检查项,原来无条件点名一个 turbo 任务。现在它写出选任务的规则(声明了test:repo脚本的包申报在PKG#test:repo、其PKG#test不带根输入;否则PKG#test),并点名权威(scripts/check-cross-package-test-inputs.mjs,两者分歧时以它为准)。原地改写,4 行进 4 行出,文件仍是 337 行。为什么改
这句话是判定一次退役有没有做完的条件,而它把人送去撞门禁:门禁两个方向都管——半径没落在
#test:repo上是一红,留在#test上又是一红。红的消息指向turbo.json,不指向送他去那里的那句话,读者最省力的「修法」是去改门禁,而门禁是对的。卡面自陈:同一次派发里,卡、分诊评论、派发词三份独立文本全部继承了同一个错任务名。这次改的就是那个源头。风险与代价(含回滚)
风险低:只动一段说明文字,不动任何门禁、不动
turbo.json,行为面零变化。代价是删掉了那条「turbo 才 hash 得到它、CI 分片并集才看得见」的理由句——4 行 × 120 字节的信封装不下新规则,而抬棘轮上限需要维护者裁决,所以用删内容付账,没有 re-wrap 凑行。回滚就是 revert 这一个提交,没有迁移、没有下游依赖。席位意见
(留空,待评审席位填写。)
你要做的
这是 governed surface(
.claude/**),按规则由维护者人工确认并合并。本 PR 保持 draft,未入队、未挂 auto-merge。要看的两处:一是新句子的规则写得对不对(6/6 实测在上面),二是同意用「删理由句」来付那 83 个字节。Generated by Claude Code
Generated by Claude Code