docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict - #14598

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict#14598
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#14317
Fixes#14058

Member card of the skills catalog optimization program (maintainer mandate 2026-09-02, verbatim and untranslated: 「审核所有的 skills,进行全面的优化。」). Sibling PR in objectui carries VFY-C-01 (Part of #14317).

Clause-②: no — nothing here states a platform contract; no needs:contract-review.

Per-finding record

id落点beforeafter
SPR-C-05 (= #14058)spec-property-retirement §0four checkboxes; zero mentions of the ledger's fifth verdicta fifth checkbox: a live-elsewhere row is dead here by measurement, genuinely enforced in a sibling repo, and never a removal candidate; what to check instead is its four attestation criteria and the gate that executes them
SPR-C-01:329-332"check-generated runs behind a paths filter in ci.yml; add the path in the same PR"deleted — that job and that filter no longer exist, and ci.yml has no paths: at all
SPR-D-01§6 traps4 of 7 traps restated a binding anchor (stale dist, pipe-eaten exit code, sequential gate masking, --check vs bare)one pointer naming all four and their two anchors; the two traps unique to retirement stay
SPR-C-04:300-311a hand-rolled ten-name check:* loop — the "match by hand" the root instruction file forbidsthe one wrapper command, which reports every stale artifact at once
SPR-C-03:313-3143 of the 5 pure source audits namedall five named
SPR-C-02:81 (the route table)a hand-written $ZodErrorMap passed to z.object(shape,{error}).strict()the shared strictObject()guidance: slot, its set-keyed form, its worked example and the audit test that now covers it
SPR-C-06:145"~28 tombstones follow all five conventions" — a hand count, measured 181 sites todaythe census is delegated to the pin test that actually judges every site
SPR-F-01§4 changeset rowno ADR-0087 disposition markerthe marker and the gate that enforces it, on the row where retirement is exactly the named case
DOG-C-01dogfood:66-8318 lines re-stating the dev-agent definition's ablation rule — same criterion, same ledger, same two incidentsa two-line pointer at that anchor
DOG-F-01dogfood §0zero mentions of OS_PORT, though the runner doc names this section by name as the trap's originthe two lines: the self-pinging connectors read the environment, so -p alone leaves them dialing 3000
X-01dogfood §0environment facts split across two docs, with the routing and the pricing pointing opposite waysdecided by pointer: the runner doc is the environment anchor, this section says so and carries only what that anchor lacks
CLA-C-01checklist-author:33-51declares itself "not a second copy of the process", then restates the sweep doc's six steps one for onea pointer plus the three clauses measurably absent from that doc
CLA-C-02:46-49"four of six waivers expired" — the oldest of three disagreeing numbersgone with its containing duplicate; the surviving anchor states the measured truth, and the checklist gate reports 0 waived today
CLT-B-01checklist-test:78-87Tier-1 batching reads automated.ref "from the selector" — which projects only id / priority / surface / since / revisionthe step now reads the field where it lives, in the area file
CLT-C-01:96-97a blanket opus tier, sourced from memorythe tier is derived per dispatch from the current tooling output, never recalled
CLT-C-02:229-2357 lines re-copying the disclosure rule, opening with a precedence claim the runner doc explicitly deniesthe guardrail stays in 4 lines (see the note below), the elaboration and the precedence claim go
CLT-C-03:102-105re-copies runner rule 1a pointer
X-02both filesthe no-subagent degradation clause stated twice, near-verbatimone copy, in checklist-author; the other points at it. Provenance noted, not re-litigated: both copies came from the same maintainer round

Dead references — each with its positive control

statedcorrected tocontrol
SPR:103scripts/liveness/orphans.mtspackages/spec/scripts/liveness/orphans.mtsstated path absent, corrected path present; every other citation in this file is repo-rooted
SPR:261packages/cli/src/utils/lint-liveness-properties.tspackages/lint/src/lint-liveness-properties.tsstated path absent, corrected path present
SPR:282.changeset/tool-inert-keys-removed.mdany live .changeset/*-retired.mdstated file absent (consumed at release); 6 live files carry the "The retirement kit:" section
SPR:329-332 the ci.ymlpaths filterdeleted with SPR-C-01ci.yml has no paths:
CLA:42 the README's "deep-test contract"the README's ## Item anatomythe term has zero hits in that README; the section exists at the cited line
CLT:78-87automated.ref from --jsonthe area filethe selector's projection is {id, priority, surface, since, revision}

Line delta per file

filebeforeafterceilingwidest table row
.claude/skills/spec-property-retirement/SKILL.md337333337328 → 326 (pin 328)
.claude/skills/dogfood-verification/SKILL.md157147157n/a
.claude/skills/checklist-author/SKILL.md625362n/a
.claude/skills/checklist-test/SKILL.md238234238221 (unchanged)
total794767

Every file shrinks; no ceiling is raised and the ratchet script is untouched. The SPR-C-05 addition is paid in the same file by SPR-C-01 and SPR-C-04, so the ceiling raise 337 → 340 authorized on #14058 (2026-09-01, director batch #26) is not taken — the ruled TEXT lands, including the recognizability half that ruling insisted on ("dead here by measurement / genuinely enforced in a sibling repo"); only its funding route changes, from a raise to the sanctioned pay-by-deletion. The gate now reports 2 bytes of table-row headroom on that file; per this flight's constraint that slack is left for the corpus audit's Phase 3 to re-lock, not taken here.

premise_false: none — every finding's premise held when checked against this base.

Three notes where the work differed from the brief, each measured

  • CLT-C-02 is trimmed, not deleted. The runner doc states in its own text that this guardrail is "one rule written in both places, not a precedence claim by either". Deleting this copy would falsify that anchor, which this flight may not edit. So the copy shrinks to the operative rule plus that framing, and the false precedence claim — the half the anchor actually denies — is what goes.
  • The all-five-verdicts check ordered on [finding] spec-property-retirement skill predates the live-elsewhere verdict — its ledger-verdict discipline never names the never-remove cross-repo case #14058 was carried out: the ledger's status vocabulary is live / experimental / planned / dead / live-elsewhere. inconclusive, noted as a zero-hit term during triage, is not a ledger status at all (zero hits in the vocabulary table and in the liveness scripts), so no vocabulary is missing on its account.
  • check:pm-skill-id-lint does not bind anything in these four files — its scan set is the dispatch-protocol tree plus the dev-agent definition and the root instruction file. No section id or finding id in these four is load-bearing for it, which is why sections could be restructured. Verified before the first deletion.

Gates

All at head 7df16bc7, which equals the pushed remote head and the tree every command below read. Exit codes captured by redirect before any pipe. Heavy runs serialized through the shared verify lock (slot issue-14317).

commandexitits own verdict
pnpm check:pm-skill-ratchet0all four files green, e.g. spec-property-retirement/SKILL.md is 333 lines (ceiling 337; headroom 4) and widest table row is 326 bytes (pin 328; headroom 2)
pnpm check:pm-skill-id-lint0green
pnpm check:skill-frame-sync0green
pnpm check:skill-frame-freshness0green
pnpm check:pm-governed-merges0green
pnpm check:doc-authoring0green
pnpm check:agent-test-spelling0green
pnpm check:cross-package-test-inputs · node scripts/check-cross-package-test-inputs.mjs0green
node scripts/check-ci-filter-parity.mjs0green
node scripts/check-required-contexts.mjs0green
node scripts/check-shard-attestation.mjs0green
pnpm --filter @objectstack/lint run check:doc-formula-expressions058 cases passed self-test, then 22 record-scoped formula example(s) across 426 files / 1385 TS blocks judged clean, 9 @example(s) judged clean, 14 predicate(s) judged clean
pnpm --filter create-objectstack exec vitest run --maxWorkers=2 src/template-consistency.test.ts0Test Files 1 passed (1) · Tests 35 passed (35) — the metadata.internal: true enforcement; all four files still carry the marker
node scripts/check-test-completeness.mjs3NOT MEASURED, not a red: PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. It does not run tests and cannot produce one; CI tees the log and passes the path

The gate family was re-derived from the real changeset after the last edit (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, 4 paths vs merge base aaa4e6578, three-dot semantics) and the whole derived list is above. The first union run returned six exit 3 PREREQUISITE-NOT-MET results because the fresh worktree had no node_modules; they were re-run green after pnpm install, and the formula/lint dependency closures were built before the doc-formula gate could measure anything.

Repo-level pnpm lint was not run, and this is declared rather than implied: it is the CI-owned run. No narrowed substitute is claimed for it.

skip-changeset: this diff is .claude/** only and releases nothing, which is the route the empty-changeset gate's own enumeration names for it (.github/, .claude/, skills/, docs/, content/, examples/ → label, not an empty changeset).

Governed surface (.claude/**) ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

Out-of-scope cards filed after a dedupe search (unassigned, unlabelled for triage): #14595 (the sweep doc sends agents to land a run record in a gitignored directory) and #14596 (a checked-in launch config pointing at a worktree that does not exist).

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

…/C-06/D-01/F-01 + three dead references
SPR-C-05 adds the fifth section-0 checkbox for the ledger's `live-elsewhere`
verdict: dead here by measurement, genuinely enforced in a sibling repo, and
therefore NEVER a removal candidate — what to check instead is its attestation
discipline (foreign pointer, cross-repo scope, dated `verifiedAt`, 180-day
expiry), verified at source against the ledger README and the gate that
executes those four criteria. It is paid for by SPR-C-01 and SPR-C-04, so no
ceiling is raised.
SPR-C-01 deletes the dormant-gate trap (the job and its `paths` filter no
longer exist). SPR-D-01 replaces four traps that duplicate AGENTS.md and the
dev-agent definition with a pointer at those anchors. SPR-C-04 replaces the
hand-rolled ten-name gate loop with the one wrapper command, and SPR-C-03
completes the pure-source-audit list from three names to all five. SPR-C-02
rewrites the strict-delete route onto the shared `strictObject()` guidance
slot and its audit test. SPR-C-06 drops a rotting hand count in favour of the
pin test that actually judges the corpus. SPR-F-01 adds the ADR-0087
disposition marker the changeset row omitted. Dead references corrected:
the orphans script, the advisory-lint file's new package, and the consumed
changeset sample.
File: 337 -> 333 lines (ceiling 337); widest table row 328 -> 326 bytes
(pin 328). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
… anchor + stock-app-name fix
DOG-C-01: the ablation predict-then-mutate rule was an 18-line second copy of
the dev-agent definition's own rule — same criterion, same unaliased-import
ledger, same two measured incidents — and both texts already said the rule is
not dogfood's. It becomes a two-line pointer at that anchor.
X-01 is decided by pointer: the platform-checklist runner doc is the
environment anchor, and section 0 now says so and carries only what that
anchor lacks. DOG-F-01 is exactly that case — the runner doc names dogfood
section 0 by name as the origin of the `-p`-alone trap, while this file had no
mention of the variable the self-pinging connectors actually read.
Same section, same defect class, evidence pinned by the anchor: the stock-boot
app-name list dropped an app that a stock boot does not load, so an empty
`?id=` result there is correct rather than the missing-metadata false P0 the
bullet exists to prevent.
File: 157 -> 147 lines (ceiling 157). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…P lacks, CLA-C-02, README anchor
CLA-C-01: the orchestration section opened by declaring itself "not a second
copy of the process" and then restated the sweep doc's six steps one for one,
plus its angle table. It is rewritten to a pointer at that doc plus the three
clauses measurably absent from it (measured, not assumed: zero hits there for
worktree/PD#11, and zero for subagent/sequential): worktree-first, the
orchestrator-exclusive write surfaces, and brief-is-a-hypothesis.
CLA-C-02 travels with it: the stale waiver count ("four of six expired") was
the oldest of three disagreeing numbers and its containing clause was one of
the restated steps, so the number is gone rather than corrected in a second
place. The surviving anchor states the measured truth, and the checklist gate
itself reports `0 waived` today.
The README citation moves off a term that no longer exists in that file and
onto the section that does.
X-02: this file keeps the sole copy of the no-subagent degradation clause —
the "no other gaps" conclusion it protects is a sweep conclusion.
File: 62 -> 53 lines (ceiling 62). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…ters, X-02
CLT-B-01 was unexecutable as written: the Tier-1 batching step told the runner
to read `automated.ref` from the selector's `--json`, which projects only id,
priority, surface, since and revision. The field is real but lives in the area
file, so the step now says where to read it.
CLT-C-01 replaces a memory-sourced blanket model tier with the rule the
dispatch protocol actually binds — derive the tier from the current
dispatch-gates output, never from recall.
CLT-C-02/C-03 stop re-copying the runner doc's rules 1-2. C-03 becomes a
pointer. C-02 keeps the disclosure guardrail in place (the runner doc states
in its own text that this is one rule deliberately written in both places, so
deleting this copy would falsify an anchor I must not edit) but drops the
elaboration and, with it, the precedence claim that same anchor explicitly
denies.
X-02: the no-subagent degradation clause now points at its single home in the
sibling skill instead of restating it near-verbatim.
File: 238 -> 234 lines (ceiling 238). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
@os-zhuang
os-zhuang marked this pull request as ready for review September 2, 2026 15:01
@os-zhuang
os-zhuang added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 9afd9f2Sep 2, 2026
36 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-14317-skills-internal-small branch September 2, 2026 16:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants

@os-litant@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict - #14598

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict#14598
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#14317
Fixes#14058

Member card of the skills catalog optimization program (maintainer mandate 2026-09-02, verbatim and untranslated: 「审核所有的 skills,进行全面的优化。」). Sibling PR in objectui carries VFY-C-01 (Part of #14317).

Clause-②: no — nothing here states a platform contract; no needs:contract-review.

Per-finding record

id落点beforeafter
SPR-C-05 (= #14058)spec-property-retirement §0four checkboxes; zero mentions of the ledger's fifth verdicta fifth checkbox: a live-elsewhere row is dead here by measurement, genuinely enforced in a sibling repo, and never a removal candidate; what to check instead is its four attestation criteria and the gate that executes them
SPR-C-01:329-332"check-generated runs behind a paths filter in ci.yml; add the path in the same PR"deleted — that job and that filter no longer exist, and ci.yml has no paths: at all
SPR-D-01§6 traps4 of 7 traps restated a binding anchor (stale dist, pipe-eaten exit code, sequential gate masking, --check vs bare)one pointer naming all four and their two anchors; the two traps unique to retirement stay
SPR-C-04:300-311a hand-rolled ten-name check:* loop — the "match by hand" the root instruction file forbidsthe one wrapper command, which reports every stale artifact at once
SPR-C-03:313-3143 of the 5 pure source audits namedall five named
SPR-C-02:81 (the route table)a hand-written $ZodErrorMap passed to z.object(shape,{error}).strict()the shared strictObject()guidance: slot, its set-keyed form, its worked example and the audit test that now covers it
SPR-C-06:145"~28 tombstones follow all five conventions" — a hand count, measured 181 sites todaythe census is delegated to the pin test that actually judges every site
SPR-F-01§4 changeset rowno ADR-0087 disposition markerthe marker and the gate that enforces it, on the row where retirement is exactly the named case
DOG-C-01dogfood:66-8318 lines re-stating the dev-agent definition's ablation rule — same criterion, same ledger, same two incidentsa two-line pointer at that anchor
DOG-F-01dogfood §0zero mentions of OS_PORT, though the runner doc names this section by name as the trap's originthe two lines: the self-pinging connectors read the environment, so -p alone leaves them dialing 3000
X-01dogfood §0environment facts split across two docs, with the routing and the pricing pointing opposite waysdecided by pointer: the runner doc is the environment anchor, this section says so and carries only what that anchor lacks
CLA-C-01checklist-author:33-51declares itself "not a second copy of the process", then restates the sweep doc's six steps one for onea pointer plus the three clauses measurably absent from that doc
CLA-C-02:46-49"four of six waivers expired" — the oldest of three disagreeing numbersgone with its containing duplicate; the surviving anchor states the measured truth, and the checklist gate reports 0 waived today
CLT-B-01checklist-test:78-87Tier-1 batching reads automated.ref "from the selector" — which projects only id / priority / surface / since / revisionthe step now reads the field where it lives, in the area file
CLT-C-01:96-97a blanket opus tier, sourced from memorythe tier is derived per dispatch from the current tooling output, never recalled
CLT-C-02:229-2357 lines re-copying the disclosure rule, opening with a precedence claim the runner doc explicitly deniesthe guardrail stays in 4 lines (see the note below), the elaboration and the precedence claim go
CLT-C-03:102-105re-copies runner rule 1a pointer
X-02both filesthe no-subagent degradation clause stated twice, near-verbatimone copy, in checklist-author; the other points at it. Provenance noted, not re-litigated: both copies came from the same maintainer round

Dead references — each with its positive control

statedcorrected tocontrol
SPR:103scripts/liveness/orphans.mtspackages/spec/scripts/liveness/orphans.mtsstated path absent, corrected path present; every other citation in this file is repo-rooted
SPR:261packages/cli/src/utils/lint-liveness-properties.tspackages/lint/src/lint-liveness-properties.tsstated path absent, corrected path present
SPR:282.changeset/tool-inert-keys-removed.mdany live .changeset/*-retired.mdstated file absent (consumed at release); 6 live files carry the "The retirement kit:" section
SPR:329-332 the ci.ymlpaths filterdeleted with SPR-C-01ci.yml has no paths:
CLA:42 the README's "deep-test contract"the README's ## Item anatomythe term has zero hits in that README; the section exists at the cited line
CLT:78-87automated.ref from --jsonthe area filethe selector's projection is {id, priority, surface, since, revision}

Line delta per file

filebeforeafterceilingwidest table row
.claude/skills/spec-property-retirement/SKILL.md337333337328 → 326 (pin 328)
.claude/skills/dogfood-verification/SKILL.md157147157n/a
.claude/skills/checklist-author/SKILL.md625362n/a
.claude/skills/checklist-test/SKILL.md238234238221 (unchanged)
total794767

Every file shrinks; no ceiling is raised and the ratchet script is untouched. The SPR-C-05 addition is paid in the same file by SPR-C-01 and SPR-C-04, so the ceiling raise 337 → 340 authorized on #14058 (2026-09-01, director batch #26) is not taken — the ruled TEXT lands, including the recognizability half that ruling insisted on ("dead here by measurement / genuinely enforced in a sibling repo"); only its funding route changes, from a raise to the sanctioned pay-by-deletion. The gate now reports 2 bytes of table-row headroom on that file; per this flight's constraint that slack is left for the corpus audit's Phase 3 to re-lock, not taken here.

premise_false: none — every finding's premise held when checked against this base.

Three notes where the work differed from the brief, each measured

  • CLT-C-02 is trimmed, not deleted. The runner doc states in its own text that this guardrail is "one rule written in both places, not a precedence claim by either". Deleting this copy would falsify that anchor, which this flight may not edit. So the copy shrinks to the operative rule plus that framing, and the false precedence claim — the half the anchor actually denies — is what goes.
  • The all-five-verdicts check ordered on [finding] spec-property-retirement skill predates the live-elsewhere verdict — its ledger-verdict discipline never names the never-remove cross-repo case #14058 was carried out: the ledger's status vocabulary is live / experimental / planned / dead / live-elsewhere. inconclusive, noted as a zero-hit term during triage, is not a ledger status at all (zero hits in the vocabulary table and in the liveness scripts), so no vocabulary is missing on its account.
  • check:pm-skill-id-lint does not bind anything in these four files — its scan set is the dispatch-protocol tree plus the dev-agent definition and the root instruction file. No section id or finding id in these four is load-bearing for it, which is why sections could be restructured. Verified before the first deletion.

Gates

All at head 7df16bc7, which equals the pushed remote head and the tree every command below read. Exit codes captured by redirect before any pipe. Heavy runs serialized through the shared verify lock (slot issue-14317).

commandexitits own verdict
pnpm check:pm-skill-ratchet0all four files green, e.g. spec-property-retirement/SKILL.md is 333 lines (ceiling 337; headroom 4) and widest table row is 326 bytes (pin 328; headroom 2)
pnpm check:pm-skill-id-lint0green
pnpm check:skill-frame-sync0green
pnpm check:skill-frame-freshness0green
pnpm check:pm-governed-merges0green
pnpm check:doc-authoring0green
pnpm check:agent-test-spelling0green
pnpm check:cross-package-test-inputs · node scripts/check-cross-package-test-inputs.mjs0green
node scripts/check-ci-filter-parity.mjs0green
node scripts/check-required-contexts.mjs0green
node scripts/check-shard-attestation.mjs0green
pnpm --filter @objectstack/lint run check:doc-formula-expressions058 cases passed self-test, then 22 record-scoped formula example(s) across 426 files / 1385 TS blocks judged clean, 9 @example(s) judged clean, 14 predicate(s) judged clean
pnpm --filter create-objectstack exec vitest run --maxWorkers=2 src/template-consistency.test.ts0Test Files 1 passed (1) · Tests 35 passed (35) — the metadata.internal: true enforcement; all four files still carry the marker
node scripts/check-test-completeness.mjs3NOT MEASURED, not a red: PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. It does not run tests and cannot produce one; CI tees the log and passes the path

The gate family was re-derived from the real changeset after the last edit (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, 4 paths vs merge base aaa4e6578, three-dot semantics) and the whole derived list is above. The first union run returned six exit 3 PREREQUISITE-NOT-MET results because the fresh worktree had no node_modules; they were re-run green after pnpm install, and the formula/lint dependency closures were built before the doc-formula gate could measure anything.

Repo-level pnpm lint was not run, and this is declared rather than implied: it is the CI-owned run. No narrowed substitute is claimed for it.

skip-changeset: this diff is .claude/** only and releases nothing, which is the route the empty-changeset gate's own enumeration names for it (.github/, .claude/, skills/, docs/, content/, examples/ → label, not an empty changeset).

Governed surface (.claude/**) ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

Out-of-scope cards filed after a dedupe search (unassigned, unlabelled for triage): #14595 (the sweep doc sends agents to land a run record in a gitignored directory) and #14596 (a checked-in launch config pointing at a worktree that does not exist).

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

…/C-06/D-01/F-01 + three dead references
SPR-C-05 adds the fifth section-0 checkbox for the ledger's `live-elsewhere`
verdict: dead here by measurement, genuinely enforced in a sibling repo, and
therefore NEVER a removal candidate — what to check instead is its attestation
discipline (foreign pointer, cross-repo scope, dated `verifiedAt`, 180-day
expiry), verified at source against the ledger README and the gate that
executes those four criteria. It is paid for by SPR-C-01 and SPR-C-04, so no
ceiling is raised.
SPR-C-01 deletes the dormant-gate trap (the job and its `paths` filter no
longer exist). SPR-D-01 replaces four traps that duplicate AGENTS.md and the
dev-agent definition with a pointer at those anchors. SPR-C-04 replaces the
hand-rolled ten-name gate loop with the one wrapper command, and SPR-C-03
completes the pure-source-audit list from three names to all five. SPR-C-02
rewrites the strict-delete route onto the shared `strictObject()` guidance
slot and its audit test. SPR-C-06 drops a rotting hand count in favour of the
pin test that actually judges the corpus. SPR-F-01 adds the ADR-0087
disposition marker the changeset row omitted. Dead references corrected:
the orphans script, the advisory-lint file's new package, and the consumed
changeset sample.
File: 337 -> 333 lines (ceiling 337); widest table row 328 -> 326 bytes
(pin 328). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
… anchor + stock-app-name fix
DOG-C-01: the ablation predict-then-mutate rule was an 18-line second copy of
the dev-agent definition's own rule — same criterion, same unaliased-import
ledger, same two measured incidents — and both texts already said the rule is
not dogfood's. It becomes a two-line pointer at that anchor.
X-01 is decided by pointer: the platform-checklist runner doc is the
environment anchor, and section 0 now says so and carries only what that
anchor lacks. DOG-F-01 is exactly that case — the runner doc names dogfood
section 0 by name as the origin of the `-p`-alone trap, while this file had no
mention of the variable the self-pinging connectors actually read.
Same section, same defect class, evidence pinned by the anchor: the stock-boot
app-name list dropped an app that a stock boot does not load, so an empty
`?id=` result there is correct rather than the missing-metadata false P0 the
bullet exists to prevent.
File: 157 -> 147 lines (ceiling 157). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…P lacks, CLA-C-02, README anchor
CLA-C-01: the orchestration section opened by declaring itself "not a second
copy of the process" and then restated the sweep doc's six steps one for one,
plus its angle table. It is rewritten to a pointer at that doc plus the three
clauses measurably absent from it (measured, not assumed: zero hits there for
worktree/PD#11, and zero for subagent/sequential): worktree-first, the
orchestrator-exclusive write surfaces, and brief-is-a-hypothesis.
CLA-C-02 travels with it: the stale waiver count ("four of six expired") was
the oldest of three disagreeing numbers and its containing clause was one of
the restated steps, so the number is gone rather than corrected in a second
place. The surviving anchor states the measured truth, and the checklist gate
itself reports `0 waived` today.
The README citation moves off a term that no longer exists in that file and
onto the section that does.
X-02: this file keeps the sole copy of the no-subagent degradation clause —
the "no other gaps" conclusion it protects is a sweep conclusion.
File: 62 -> 53 lines (ceiling 62). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…ters, X-02
CLT-B-01 was unexecutable as written: the Tier-1 batching step told the runner
to read `automated.ref` from the selector's `--json`, which projects only id,
priority, surface, since and revision. The field is real but lives in the area
file, so the step now says where to read it.
CLT-C-01 replaces a memory-sourced blanket model tier with the rule the
dispatch protocol actually binds — derive the tier from the current
dispatch-gates output, never from recall.
CLT-C-02/C-03 stop re-copying the runner doc's rules 1-2. C-03 becomes a
pointer. C-02 keeps the disclosure guardrail in place (the runner doc states
in its own text that this is one rule deliberately written in both places, so
deleting this copy would falsify an anchor I must not edit) but drops the
elaboration and, with it, the precedence claim that same anchor explicitly
denies.
X-02: the no-subagent degradation clause now points at its single home in the
sibling skill instead of restating it near-verbatim.
File: 238 -> 234 lines (ceiling 238). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
@os-zhuang
os-zhuang marked this pull request as ready for review September 2, 2026 15:01
@os-zhuang
os-zhuang added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 9afd9f2Sep 2, 2026
36 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-14317-skills-internal-small branch September 2, 2026 16:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants

@os-litant@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict - #14598

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict#14598
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#14317
Fixes#14058

Member card of the skills catalog optimization program (maintainer mandate 2026-09-02, verbatim and untranslated: 「审核所有的 skills,进行全面的优化。」). Sibling PR in objectui carries VFY-C-01 (Part of #14317).

Clause-②: no — nothing here states a platform contract; no needs:contract-review.

Per-finding record

id落点beforeafter
SPR-C-05 (= #14058)spec-property-retirement §0four checkboxes; zero mentions of the ledger's fifth verdicta fifth checkbox: a live-elsewhere row is dead here by measurement, genuinely enforced in a sibling repo, and never a removal candidate; what to check instead is its four attestation criteria and the gate that executes them
SPR-C-01:329-332"check-generated runs behind a paths filter in ci.yml; add the path in the same PR"deleted — that job and that filter no longer exist, and ci.yml has no paths: at all
SPR-D-01§6 traps4 of 7 traps restated a binding anchor (stale dist, pipe-eaten exit code, sequential gate masking, --check vs bare)one pointer naming all four and their two anchors; the two traps unique to retirement stay
SPR-C-04:300-311a hand-rolled ten-name check:* loop — the "match by hand" the root instruction file forbidsthe one wrapper command, which reports every stale artifact at once
SPR-C-03:313-3143 of the 5 pure source audits namedall five named
SPR-C-02:81 (the route table)a hand-written $ZodErrorMap passed to z.object(shape,{error}).strict()the shared strictObject()guidance: slot, its set-keyed form, its worked example and the audit test that now covers it
SPR-C-06:145"~28 tombstones follow all five conventions" — a hand count, measured 181 sites todaythe census is delegated to the pin test that actually judges every site
SPR-F-01§4 changeset rowno ADR-0087 disposition markerthe marker and the gate that enforces it, on the row where retirement is exactly the named case
DOG-C-01dogfood:66-8318 lines re-stating the dev-agent definition's ablation rule — same criterion, same ledger, same two incidentsa two-line pointer at that anchor
DOG-F-01dogfood §0zero mentions of OS_PORT, though the runner doc names this section by name as the trap's originthe two lines: the self-pinging connectors read the environment, so -p alone leaves them dialing 3000
X-01dogfood §0environment facts split across two docs, with the routing and the pricing pointing opposite waysdecided by pointer: the runner doc is the environment anchor, this section says so and carries only what that anchor lacks
CLA-C-01checklist-author:33-51declares itself "not a second copy of the process", then restates the sweep doc's six steps one for onea pointer plus the three clauses measurably absent from that doc
CLA-C-02:46-49"four of six waivers expired" — the oldest of three disagreeing numbersgone with its containing duplicate; the surviving anchor states the measured truth, and the checklist gate reports 0 waived today
CLT-B-01checklist-test:78-87Tier-1 batching reads automated.ref "from the selector" — which projects only id / priority / surface / since / revisionthe step now reads the field where it lives, in the area file
CLT-C-01:96-97a blanket opus tier, sourced from memorythe tier is derived per dispatch from the current tooling output, never recalled
CLT-C-02:229-2357 lines re-copying the disclosure rule, opening with a precedence claim the runner doc explicitly deniesthe guardrail stays in 4 lines (see the note below), the elaboration and the precedence claim go
CLT-C-03:102-105re-copies runner rule 1a pointer
X-02both filesthe no-subagent degradation clause stated twice, near-verbatimone copy, in checklist-author; the other points at it. Provenance noted, not re-litigated: both copies came from the same maintainer round

Dead references — each with its positive control

statedcorrected tocontrol
SPR:103scripts/liveness/orphans.mtspackages/spec/scripts/liveness/orphans.mtsstated path absent, corrected path present; every other citation in this file is repo-rooted
SPR:261packages/cli/src/utils/lint-liveness-properties.tspackages/lint/src/lint-liveness-properties.tsstated path absent, corrected path present
SPR:282.changeset/tool-inert-keys-removed.mdany live .changeset/*-retired.mdstated file absent (consumed at release); 6 live files carry the "The retirement kit:" section
SPR:329-332 the ci.ymlpaths filterdeleted with SPR-C-01ci.yml has no paths:
CLA:42 the README's "deep-test contract"the README's ## Item anatomythe term has zero hits in that README; the section exists at the cited line
CLT:78-87automated.ref from --jsonthe area filethe selector's projection is {id, priority, surface, since, revision}

Line delta per file

filebeforeafterceilingwidest table row
.claude/skills/spec-property-retirement/SKILL.md337333337328 → 326 (pin 328)
.claude/skills/dogfood-verification/SKILL.md157147157n/a
.claude/skills/checklist-author/SKILL.md625362n/a
.claude/skills/checklist-test/SKILL.md238234238221 (unchanged)
total794767

Every file shrinks; no ceiling is raised and the ratchet script is untouched. The SPR-C-05 addition is paid in the same file by SPR-C-01 and SPR-C-04, so the ceiling raise 337 → 340 authorized on #14058 (2026-09-01, director batch #26) is not taken — the ruled TEXT lands, including the recognizability half that ruling insisted on ("dead here by measurement / genuinely enforced in a sibling repo"); only its funding route changes, from a raise to the sanctioned pay-by-deletion. The gate now reports 2 bytes of table-row headroom on that file; per this flight's constraint that slack is left for the corpus audit's Phase 3 to re-lock, not taken here.

premise_false: none — every finding's premise held when checked against this base.

Three notes where the work differed from the brief, each measured

  • CLT-C-02 is trimmed, not deleted. The runner doc states in its own text that this guardrail is "one rule written in both places, not a precedence claim by either". Deleting this copy would falsify that anchor, which this flight may not edit. So the copy shrinks to the operative rule plus that framing, and the false precedence claim — the half the anchor actually denies — is what goes.
  • The all-five-verdicts check ordered on [finding] spec-property-retirement skill predates the live-elsewhere verdict — its ledger-verdict discipline never names the never-remove cross-repo case #14058 was carried out: the ledger's status vocabulary is live / experimental / planned / dead / live-elsewhere. inconclusive, noted as a zero-hit term during triage, is not a ledger status at all (zero hits in the vocabulary table and in the liveness scripts), so no vocabulary is missing on its account.
  • check:pm-skill-id-lint does not bind anything in these four files — its scan set is the dispatch-protocol tree plus the dev-agent definition and the root instruction file. No section id or finding id in these four is load-bearing for it, which is why sections could be restructured. Verified before the first deletion.

Gates

All at head 7df16bc7, which equals the pushed remote head and the tree every command below read. Exit codes captured by redirect before any pipe. Heavy runs serialized through the shared verify lock (slot issue-14317).

commandexitits own verdict
pnpm check:pm-skill-ratchet0all four files green, e.g. spec-property-retirement/SKILL.md is 333 lines (ceiling 337; headroom 4) and widest table row is 326 bytes (pin 328; headroom 2)
pnpm check:pm-skill-id-lint0green
pnpm check:skill-frame-sync0green
pnpm check:skill-frame-freshness0green
pnpm check:pm-governed-merges0green
pnpm check:doc-authoring0green
pnpm check:agent-test-spelling0green
pnpm check:cross-package-test-inputs · node scripts/check-cross-package-test-inputs.mjs0green
node scripts/check-ci-filter-parity.mjs0green
node scripts/check-required-contexts.mjs0green
node scripts/check-shard-attestation.mjs0green
pnpm --filter @objectstack/lint run check:doc-formula-expressions058 cases passed self-test, then 22 record-scoped formula example(s) across 426 files / 1385 TS blocks judged clean, 9 @example(s) judged clean, 14 predicate(s) judged clean
pnpm --filter create-objectstack exec vitest run --maxWorkers=2 src/template-consistency.test.ts0Test Files 1 passed (1) · Tests 35 passed (35) — the metadata.internal: true enforcement; all four files still carry the marker
node scripts/check-test-completeness.mjs3NOT MEASURED, not a red: PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. It does not run tests and cannot produce one; CI tees the log and passes the path

The gate family was re-derived from the real changeset after the last edit (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, 4 paths vs merge base aaa4e6578, three-dot semantics) and the whole derived list is above. The first union run returned six exit 3 PREREQUISITE-NOT-MET results because the fresh worktree had no node_modules; they were re-run green after pnpm install, and the formula/lint dependency closures were built before the doc-formula gate could measure anything.

Repo-level pnpm lint was not run, and this is declared rather than implied: it is the CI-owned run. No narrowed substitute is claimed for it.

skip-changeset: this diff is .claude/** only and releases nothing, which is the route the empty-changeset gate's own enumeration names for it (.github/, .claude/, skills/, docs/, content/, examples/ → label, not an empty changeset).

Governed surface (.claude/**) ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

Out-of-scope cards filed after a dedupe search (unassigned, unlabelled for triage): #14595 (the sweep doc sends agents to land a run record in a gitignored directory) and #14596 (a checked-in launch config pointing at a worktree that does not exist).

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

…/C-06/D-01/F-01 + three dead references
SPR-C-05 adds the fifth section-0 checkbox for the ledger's `live-elsewhere`
verdict: dead here by measurement, genuinely enforced in a sibling repo, and
therefore NEVER a removal candidate — what to check instead is its attestation
discipline (foreign pointer, cross-repo scope, dated `verifiedAt`, 180-day
expiry), verified at source against the ledger README and the gate that
executes those four criteria. It is paid for by SPR-C-01 and SPR-C-04, so no
ceiling is raised.
SPR-C-01 deletes the dormant-gate trap (the job and its `paths` filter no
longer exist). SPR-D-01 replaces four traps that duplicate AGENTS.md and the
dev-agent definition with a pointer at those anchors. SPR-C-04 replaces the
hand-rolled ten-name gate loop with the one wrapper command, and SPR-C-03
completes the pure-source-audit list from three names to all five. SPR-C-02
rewrites the strict-delete route onto the shared `strictObject()` guidance
slot and its audit test. SPR-C-06 drops a rotting hand count in favour of the
pin test that actually judges the corpus. SPR-F-01 adds the ADR-0087
disposition marker the changeset row omitted. Dead references corrected:
the orphans script, the advisory-lint file's new package, and the consumed
changeset sample.
File: 337 -> 333 lines (ceiling 337); widest table row 328 -> 326 bytes
(pin 328). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
… anchor + stock-app-name fix
DOG-C-01: the ablation predict-then-mutate rule was an 18-line second copy of
the dev-agent definition's own rule — same criterion, same unaliased-import
ledger, same two measured incidents — and both texts already said the rule is
not dogfood's. It becomes a two-line pointer at that anchor.
X-01 is decided by pointer: the platform-checklist runner doc is the
environment anchor, and section 0 now says so and carries only what that
anchor lacks. DOG-F-01 is exactly that case — the runner doc names dogfood
section 0 by name as the origin of the `-p`-alone trap, while this file had no
mention of the variable the self-pinging connectors actually read.
Same section, same defect class, evidence pinned by the anchor: the stock-boot
app-name list dropped an app that a stock boot does not load, so an empty
`?id=` result there is correct rather than the missing-metadata false P0 the
bullet exists to prevent.
File: 157 -> 147 lines (ceiling 157). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…P lacks, CLA-C-02, README anchor
CLA-C-01: the orchestration section opened by declaring itself "not a second
copy of the process" and then restated the sweep doc's six steps one for one,
plus its angle table. It is rewritten to a pointer at that doc plus the three
clauses measurably absent from it (measured, not assumed: zero hits there for
worktree/PD#11, and zero for subagent/sequential): worktree-first, the
orchestrator-exclusive write surfaces, and brief-is-a-hypothesis.
CLA-C-02 travels with it: the stale waiver count ("four of six expired") was
the oldest of three disagreeing numbers and its containing clause was one of
the restated steps, so the number is gone rather than corrected in a second
place. The surviving anchor states the measured truth, and the checklist gate
itself reports `0 waived` today.
The README citation moves off a term that no longer exists in that file and
onto the section that does.
X-02: this file keeps the sole copy of the no-subagent degradation clause —
the "no other gaps" conclusion it protects is a sweep conclusion.
File: 62 -> 53 lines (ceiling 62). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…ters, X-02
CLT-B-01 was unexecutable as written: the Tier-1 batching step told the runner
to read `automated.ref` from the selector's `--json`, which projects only id,
priority, surface, since and revision. The field is real but lives in the area
file, so the step now says where to read it.
CLT-C-01 replaces a memory-sourced blanket model tier with the rule the
dispatch protocol actually binds — derive the tier from the current
dispatch-gates output, never from recall.
CLT-C-02/C-03 stop re-copying the runner doc's rules 1-2. C-03 becomes a
pointer. C-02 keeps the disclosure guardrail in place (the runner doc states
in its own text that this is one rule deliberately written in both places, so
deleting this copy would falsify an anchor I must not edit) but drops the
elaboration and, with it, the precedence claim that same anchor explicitly
denies.
X-02: the no-subagent degradation clause now points at its single home in the
sibling skill instead of restating it near-verbatim.
File: 238 -> 234 lines (ceiling 238). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
@os-zhuang
os-zhuang marked this pull request as ready for review September 2, 2026 15:01
@os-zhuang
os-zhuang added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 9afd9f2Sep 2, 2026
36 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-14317-skills-internal-small branch September 2, 2026 16:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants

@os-litant@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict - #14598

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict#14598
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#14317
Fixes#14058

Member card of the skills catalog optimization program (maintainer mandate 2026-09-02, verbatim and untranslated: 「审核所有的 skills,进行全面的优化。」). Sibling PR in objectui carries VFY-C-01 (Part of #14317).

Clause-②: no — nothing here states a platform contract; no needs:contract-review.

Per-finding record

id落点beforeafter
SPR-C-05 (= #14058)spec-property-retirement §0four checkboxes; zero mentions of the ledger's fifth verdicta fifth checkbox: a live-elsewhere row is dead here by measurement, genuinely enforced in a sibling repo, and never a removal candidate; what to check instead is its four attestation criteria and the gate that executes them
SPR-C-01:329-332"check-generated runs behind a paths filter in ci.yml; add the path in the same PR"deleted — that job and that filter no longer exist, and ci.yml has no paths: at all
SPR-D-01§6 traps4 of 7 traps restated a binding anchor (stale dist, pipe-eaten exit code, sequential gate masking, --check vs bare)one pointer naming all four and their two anchors; the two traps unique to retirement stay
SPR-C-04:300-311a hand-rolled ten-name check:* loop — the "match by hand" the root instruction file forbidsthe one wrapper command, which reports every stale artifact at once
SPR-C-03:313-3143 of the 5 pure source audits namedall five named
SPR-C-02:81 (the route table)a hand-written $ZodErrorMap passed to z.object(shape,{error}).strict()the shared strictObject()guidance: slot, its set-keyed form, its worked example and the audit test that now covers it
SPR-C-06:145"~28 tombstones follow all five conventions" — a hand count, measured 181 sites todaythe census is delegated to the pin test that actually judges every site
SPR-F-01§4 changeset rowno ADR-0087 disposition markerthe marker and the gate that enforces it, on the row where retirement is exactly the named case
DOG-C-01dogfood:66-8318 lines re-stating the dev-agent definition's ablation rule — same criterion, same ledger, same two incidentsa two-line pointer at that anchor
DOG-F-01dogfood §0zero mentions of OS_PORT, though the runner doc names this section by name as the trap's originthe two lines: the self-pinging connectors read the environment, so -p alone leaves them dialing 3000
X-01dogfood §0environment facts split across two docs, with the routing and the pricing pointing opposite waysdecided by pointer: the runner doc is the environment anchor, this section says so and carries only what that anchor lacks
CLA-C-01checklist-author:33-51declares itself "not a second copy of the process", then restates the sweep doc's six steps one for onea pointer plus the three clauses measurably absent from that doc
CLA-C-02:46-49"four of six waivers expired" — the oldest of three disagreeing numbersgone with its containing duplicate; the surviving anchor states the measured truth, and the checklist gate reports 0 waived today
CLT-B-01checklist-test:78-87Tier-1 batching reads automated.ref "from the selector" — which projects only id / priority / surface / since / revisionthe step now reads the field where it lives, in the area file
CLT-C-01:96-97a blanket opus tier, sourced from memorythe tier is derived per dispatch from the current tooling output, never recalled
CLT-C-02:229-2357 lines re-copying the disclosure rule, opening with a precedence claim the runner doc explicitly deniesthe guardrail stays in 4 lines (see the note below), the elaboration and the precedence claim go
CLT-C-03:102-105re-copies runner rule 1a pointer
X-02both filesthe no-subagent degradation clause stated twice, near-verbatimone copy, in checklist-author; the other points at it. Provenance noted, not re-litigated: both copies came from the same maintainer round

Dead references — each with its positive control

statedcorrected tocontrol
SPR:103scripts/liveness/orphans.mtspackages/spec/scripts/liveness/orphans.mtsstated path absent, corrected path present; every other citation in this file is repo-rooted
SPR:261packages/cli/src/utils/lint-liveness-properties.tspackages/lint/src/lint-liveness-properties.tsstated path absent, corrected path present
SPR:282.changeset/tool-inert-keys-removed.mdany live .changeset/*-retired.mdstated file absent (consumed at release); 6 live files carry the "The retirement kit:" section
SPR:329-332 the ci.ymlpaths filterdeleted with SPR-C-01ci.yml has no paths:
CLA:42 the README's "deep-test contract"the README's ## Item anatomythe term has zero hits in that README; the section exists at the cited line
CLT:78-87automated.ref from --jsonthe area filethe selector's projection is {id, priority, surface, since, revision}

Line delta per file

filebeforeafterceilingwidest table row
.claude/skills/spec-property-retirement/SKILL.md337333337328 → 326 (pin 328)
.claude/skills/dogfood-verification/SKILL.md157147157n/a
.claude/skills/checklist-author/SKILL.md625362n/a
.claude/skills/checklist-test/SKILL.md238234238221 (unchanged)
total794767

Every file shrinks; no ceiling is raised and the ratchet script is untouched. The SPR-C-05 addition is paid in the same file by SPR-C-01 and SPR-C-04, so the ceiling raise 337 → 340 authorized on #14058 (2026-09-01, director batch #26) is not taken — the ruled TEXT lands, including the recognizability half that ruling insisted on ("dead here by measurement / genuinely enforced in a sibling repo"); only its funding route changes, from a raise to the sanctioned pay-by-deletion. The gate now reports 2 bytes of table-row headroom on that file; per this flight's constraint that slack is left for the corpus audit's Phase 3 to re-lock, not taken here.

premise_false: none — every finding's premise held when checked against this base.

Three notes where the work differed from the brief, each measured

  • CLT-C-02 is trimmed, not deleted. The runner doc states in its own text that this guardrail is "one rule written in both places, not a precedence claim by either". Deleting this copy would falsify that anchor, which this flight may not edit. So the copy shrinks to the operative rule plus that framing, and the false precedence claim — the half the anchor actually denies — is what goes.
  • The all-five-verdicts check ordered on [finding] spec-property-retirement skill predates the live-elsewhere verdict — its ledger-verdict discipline never names the never-remove cross-repo case #14058 was carried out: the ledger's status vocabulary is live / experimental / planned / dead / live-elsewhere. inconclusive, noted as a zero-hit term during triage, is not a ledger status at all (zero hits in the vocabulary table and in the liveness scripts), so no vocabulary is missing on its account.
  • check:pm-skill-id-lint does not bind anything in these four files — its scan set is the dispatch-protocol tree plus the dev-agent definition and the root instruction file. No section id or finding id in these four is load-bearing for it, which is why sections could be restructured. Verified before the first deletion.

Gates

All at head 7df16bc7, which equals the pushed remote head and the tree every command below read. Exit codes captured by redirect before any pipe. Heavy runs serialized through the shared verify lock (slot issue-14317).

commandexitits own verdict
pnpm check:pm-skill-ratchet0all four files green, e.g. spec-property-retirement/SKILL.md is 333 lines (ceiling 337; headroom 4) and widest table row is 326 bytes (pin 328; headroom 2)
pnpm check:pm-skill-id-lint0green
pnpm check:skill-frame-sync0green
pnpm check:skill-frame-freshness0green
pnpm check:pm-governed-merges0green
pnpm check:doc-authoring0green
pnpm check:agent-test-spelling0green
pnpm check:cross-package-test-inputs · node scripts/check-cross-package-test-inputs.mjs0green
node scripts/check-ci-filter-parity.mjs0green
node scripts/check-required-contexts.mjs0green
node scripts/check-shard-attestation.mjs0green
pnpm --filter @objectstack/lint run check:doc-formula-expressions058 cases passed self-test, then 22 record-scoped formula example(s) across 426 files / 1385 TS blocks judged clean, 9 @example(s) judged clean, 14 predicate(s) judged clean
pnpm --filter create-objectstack exec vitest run --maxWorkers=2 src/template-consistency.test.ts0Test Files 1 passed (1) · Tests 35 passed (35) — the metadata.internal: true enforcement; all four files still carry the marker
node scripts/check-test-completeness.mjs3NOT MEASURED, not a red: PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. It does not run tests and cannot produce one; CI tees the log and passes the path

The gate family was re-derived from the real changeset after the last edit (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, 4 paths vs merge base aaa4e6578, three-dot semantics) and the whole derived list is above. The first union run returned six exit 3 PREREQUISITE-NOT-MET results because the fresh worktree had no node_modules; they were re-run green after pnpm install, and the formula/lint dependency closures were built before the doc-formula gate could measure anything.

Repo-level pnpm lint was not run, and this is declared rather than implied: it is the CI-owned run. No narrowed substitute is claimed for it.

skip-changeset: this diff is .claude/** only and releases nothing, which is the route the empty-changeset gate's own enumeration names for it (.github/, .claude/, skills/, docs/, content/, examples/ → label, not an empty changeset).

Governed surface (.claude/**) ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

Out-of-scope cards filed after a dedupe search (unassigned, unlabelled for triage): #14595 (the sweep doc sends agents to land a run record in a gitignored directory) and #14596 (a checked-in launch config pointing at a worktree that does not exist).

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

…/C-06/D-01/F-01 + three dead references
SPR-C-05 adds the fifth section-0 checkbox for the ledger's `live-elsewhere`
verdict: dead here by measurement, genuinely enforced in a sibling repo, and
therefore NEVER a removal candidate — what to check instead is its attestation
discipline (foreign pointer, cross-repo scope, dated `verifiedAt`, 180-day
expiry), verified at source against the ledger README and the gate that
executes those four criteria. It is paid for by SPR-C-01 and SPR-C-04, so no
ceiling is raised.
SPR-C-01 deletes the dormant-gate trap (the job and its `paths` filter no
longer exist). SPR-D-01 replaces four traps that duplicate AGENTS.md and the
dev-agent definition with a pointer at those anchors. SPR-C-04 replaces the
hand-rolled ten-name gate loop with the one wrapper command, and SPR-C-03
completes the pure-source-audit list from three names to all five. SPR-C-02
rewrites the strict-delete route onto the shared `strictObject()` guidance
slot and its audit test. SPR-C-06 drops a rotting hand count in favour of the
pin test that actually judges the corpus. SPR-F-01 adds the ADR-0087
disposition marker the changeset row omitted. Dead references corrected:
the orphans script, the advisory-lint file's new package, and the consumed
changeset sample.
File: 337 -> 333 lines (ceiling 337); widest table row 328 -> 326 bytes
(pin 328). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
… anchor + stock-app-name fix
DOG-C-01: the ablation predict-then-mutate rule was an 18-line second copy of
the dev-agent definition's own rule — same criterion, same unaliased-import
ledger, same two measured incidents — and both texts already said the rule is
not dogfood's. It becomes a two-line pointer at that anchor.
X-01 is decided by pointer: the platform-checklist runner doc is the
environment anchor, and section 0 now says so and carries only what that
anchor lacks. DOG-F-01 is exactly that case — the runner doc names dogfood
section 0 by name as the origin of the `-p`-alone trap, while this file had no
mention of the variable the self-pinging connectors actually read.
Same section, same defect class, evidence pinned by the anchor: the stock-boot
app-name list dropped an app that a stock boot does not load, so an empty
`?id=` result there is correct rather than the missing-metadata false P0 the
bullet exists to prevent.
File: 157 -> 147 lines (ceiling 157). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…P lacks, CLA-C-02, README anchor
CLA-C-01: the orchestration section opened by declaring itself "not a second
copy of the process" and then restated the sweep doc's six steps one for one,
plus its angle table. It is rewritten to a pointer at that doc plus the three
clauses measurably absent from it (measured, not assumed: zero hits there for
worktree/PD#11, and zero for subagent/sequential): worktree-first, the
orchestrator-exclusive write surfaces, and brief-is-a-hypothesis.
CLA-C-02 travels with it: the stale waiver count ("four of six expired") was
the oldest of three disagreeing numbers and its containing clause was one of
the restated steps, so the number is gone rather than corrected in a second
place. The surviving anchor states the measured truth, and the checklist gate
itself reports `0 waived` today.
The README citation moves off a term that no longer exists in that file and
onto the section that does.
X-02: this file keeps the sole copy of the no-subagent degradation clause —
the "no other gaps" conclusion it protects is a sweep conclusion.
File: 62 -> 53 lines (ceiling 62). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…ters, X-02
CLT-B-01 was unexecutable as written: the Tier-1 batching step told the runner
to read `automated.ref` from the selector's `--json`, which projects only id,
priority, surface, since and revision. The field is real but lives in the area
file, so the step now says where to read it.
CLT-C-01 replaces a memory-sourced blanket model tier with the rule the
dispatch protocol actually binds — derive the tier from the current
dispatch-gates output, never from recall.
CLT-C-02/C-03 stop re-copying the runner doc's rules 1-2. C-03 becomes a
pointer. C-02 keeps the disclosure guardrail in place (the runner doc states
in its own text that this is one rule deliberately written in both places, so
deleting this copy would falsify an anchor I must not edit) but drops the
elaboration and, with it, the precedence claim that same anchor explicitly
denies.
X-02: the no-subagent degradation clause now points at its single home in the
sibling skill instead of restating it near-verbatim.
File: 238 -> 234 lines (ceiling 238). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
@os-zhuang
os-zhuang marked this pull request as ready for review September 2, 2026 15:01
@os-zhuang
os-zhuang added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 9afd9f2Sep 2, 2026
36 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-14317-skills-internal-small branch September 2, 2026 16:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants

@os-litant@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict - #14598

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict#14598
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#14317
Fixes#14058

Member card of the skills catalog optimization program (maintainer mandate 2026-09-02, verbatim and untranslated: 「审核所有的 skills,进行全面的优化。」). Sibling PR in objectui carries VFY-C-01 (Part of #14317).

Clause-②: no — nothing here states a platform contract; no needs:contract-review.

Per-finding record

id落点beforeafter
SPR-C-05 (= #14058)spec-property-retirement §0four checkboxes; zero mentions of the ledger's fifth verdicta fifth checkbox: a live-elsewhere row is dead here by measurement, genuinely enforced in a sibling repo, and never a removal candidate; what to check instead is its four attestation criteria and the gate that executes them
SPR-C-01:329-332"check-generated runs behind a paths filter in ci.yml; add the path in the same PR"deleted — that job and that filter no longer exist, and ci.yml has no paths: at all
SPR-D-01§6 traps4 of 7 traps restated a binding anchor (stale dist, pipe-eaten exit code, sequential gate masking, --check vs bare)one pointer naming all four and their two anchors; the two traps unique to retirement stay
SPR-C-04:300-311a hand-rolled ten-name check:* loop — the "match by hand" the root instruction file forbidsthe one wrapper command, which reports every stale artifact at once
SPR-C-03:313-3143 of the 5 pure source audits namedall five named
SPR-C-02:81 (the route table)a hand-written $ZodErrorMap passed to z.object(shape,{error}).strict()the shared strictObject()guidance: slot, its set-keyed form, its worked example and the audit test that now covers it
SPR-C-06:145"~28 tombstones follow all five conventions" — a hand count, measured 181 sites todaythe census is delegated to the pin test that actually judges every site
SPR-F-01§4 changeset rowno ADR-0087 disposition markerthe marker and the gate that enforces it, on the row where retirement is exactly the named case
DOG-C-01dogfood:66-8318 lines re-stating the dev-agent definition's ablation rule — same criterion, same ledger, same two incidentsa two-line pointer at that anchor
DOG-F-01dogfood §0zero mentions of OS_PORT, though the runner doc names this section by name as the trap's originthe two lines: the self-pinging connectors read the environment, so -p alone leaves them dialing 3000
X-01dogfood §0environment facts split across two docs, with the routing and the pricing pointing opposite waysdecided by pointer: the runner doc is the environment anchor, this section says so and carries only what that anchor lacks
CLA-C-01checklist-author:33-51declares itself "not a second copy of the process", then restates the sweep doc's six steps one for onea pointer plus the three clauses measurably absent from that doc
CLA-C-02:46-49"four of six waivers expired" — the oldest of three disagreeing numbersgone with its containing duplicate; the surviving anchor states the measured truth, and the checklist gate reports 0 waived today
CLT-B-01checklist-test:78-87Tier-1 batching reads automated.ref "from the selector" — which projects only id / priority / surface / since / revisionthe step now reads the field where it lives, in the area file
CLT-C-01:96-97a blanket opus tier, sourced from memorythe tier is derived per dispatch from the current tooling output, never recalled
CLT-C-02:229-2357 lines re-copying the disclosure rule, opening with a precedence claim the runner doc explicitly deniesthe guardrail stays in 4 lines (see the note below), the elaboration and the precedence claim go
CLT-C-03:102-105re-copies runner rule 1a pointer
X-02both filesthe no-subagent degradation clause stated twice, near-verbatimone copy, in checklist-author; the other points at it. Provenance noted, not re-litigated: both copies came from the same maintainer round

Dead references — each with its positive control

statedcorrected tocontrol
SPR:103scripts/liveness/orphans.mtspackages/spec/scripts/liveness/orphans.mtsstated path absent, corrected path present; every other citation in this file is repo-rooted
SPR:261packages/cli/src/utils/lint-liveness-properties.tspackages/lint/src/lint-liveness-properties.tsstated path absent, corrected path present
SPR:282.changeset/tool-inert-keys-removed.mdany live .changeset/*-retired.mdstated file absent (consumed at release); 6 live files carry the "The retirement kit:" section
SPR:329-332 the ci.ymlpaths filterdeleted with SPR-C-01ci.yml has no paths:
CLA:42 the README's "deep-test contract"the README's ## Item anatomythe term has zero hits in that README; the section exists at the cited line
CLT:78-87automated.ref from --jsonthe area filethe selector's projection is {id, priority, surface, since, revision}

Line delta per file

filebeforeafterceilingwidest table row
.claude/skills/spec-property-retirement/SKILL.md337333337328 → 326 (pin 328)
.claude/skills/dogfood-verification/SKILL.md157147157n/a
.claude/skills/checklist-author/SKILL.md625362n/a
.claude/skills/checklist-test/SKILL.md238234238221 (unchanged)
total794767

Every file shrinks; no ceiling is raised and the ratchet script is untouched. The SPR-C-05 addition is paid in the same file by SPR-C-01 and SPR-C-04, so the ceiling raise 337 → 340 authorized on #14058 (2026-09-01, director batch #26) is not taken — the ruled TEXT lands, including the recognizability half that ruling insisted on ("dead here by measurement / genuinely enforced in a sibling repo"); only its funding route changes, from a raise to the sanctioned pay-by-deletion. The gate now reports 2 bytes of table-row headroom on that file; per this flight's constraint that slack is left for the corpus audit's Phase 3 to re-lock, not taken here.

premise_false: none — every finding's premise held when checked against this base.

Three notes where the work differed from the brief, each measured

  • CLT-C-02 is trimmed, not deleted. The runner doc states in its own text that this guardrail is "one rule written in both places, not a precedence claim by either". Deleting this copy would falsify that anchor, which this flight may not edit. So the copy shrinks to the operative rule plus that framing, and the false precedence claim — the half the anchor actually denies — is what goes.
  • The all-five-verdicts check ordered on [finding] spec-property-retirement skill predates the live-elsewhere verdict — its ledger-verdict discipline never names the never-remove cross-repo case #14058 was carried out: the ledger's status vocabulary is live / experimental / planned / dead / live-elsewhere. inconclusive, noted as a zero-hit term during triage, is not a ledger status at all (zero hits in the vocabulary table and in the liveness scripts), so no vocabulary is missing on its account.
  • check:pm-skill-id-lint does not bind anything in these four files — its scan set is the dispatch-protocol tree plus the dev-agent definition and the root instruction file. No section id or finding id in these four is load-bearing for it, which is why sections could be restructured. Verified before the first deletion.

Gates

All at head 7df16bc7, which equals the pushed remote head and the tree every command below read. Exit codes captured by redirect before any pipe. Heavy runs serialized through the shared verify lock (slot issue-14317).

commandexitits own verdict
pnpm check:pm-skill-ratchet0all four files green, e.g. spec-property-retirement/SKILL.md is 333 lines (ceiling 337; headroom 4) and widest table row is 326 bytes (pin 328; headroom 2)
pnpm check:pm-skill-id-lint0green
pnpm check:skill-frame-sync0green
pnpm check:skill-frame-freshness0green
pnpm check:pm-governed-merges0green
pnpm check:doc-authoring0green
pnpm check:agent-test-spelling0green
pnpm check:cross-package-test-inputs · node scripts/check-cross-package-test-inputs.mjs0green
node scripts/check-ci-filter-parity.mjs0green
node scripts/check-required-contexts.mjs0green
node scripts/check-shard-attestation.mjs0green
pnpm --filter @objectstack/lint run check:doc-formula-expressions058 cases passed self-test, then 22 record-scoped formula example(s) across 426 files / 1385 TS blocks judged clean, 9 @example(s) judged clean, 14 predicate(s) judged clean
pnpm --filter create-objectstack exec vitest run --maxWorkers=2 src/template-consistency.test.ts0Test Files 1 passed (1) · Tests 35 passed (35) — the metadata.internal: true enforcement; all four files still carry the marker
node scripts/check-test-completeness.mjs3NOT MEASURED, not a red: PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. It does not run tests and cannot produce one; CI tees the log and passes the path

The gate family was re-derived from the real changeset after the last edit (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, 4 paths vs merge base aaa4e6578, three-dot semantics) and the whole derived list is above. The first union run returned six exit 3 PREREQUISITE-NOT-MET results because the fresh worktree had no node_modules; they were re-run green after pnpm install, and the formula/lint dependency closures were built before the doc-formula gate could measure anything.

Repo-level pnpm lint was not run, and this is declared rather than implied: it is the CI-owned run. No narrowed substitute is claimed for it.

skip-changeset: this diff is .claude/** only and releases nothing, which is the route the empty-changeset gate's own enumeration names for it (.github/, .claude/, skills/, docs/, content/, examples/ → label, not an empty changeset).

Governed surface (.claude/**) ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

Out-of-scope cards filed after a dedupe search (unassigned, unlabelled for triage): #14595 (the sweep doc sends agents to land a run record in a gitignored directory) and #14596 (a checked-in launch config pointing at a worktree that does not exist).

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

…/C-06/D-01/F-01 + three dead references
SPR-C-05 adds the fifth section-0 checkbox for the ledger's `live-elsewhere`
verdict: dead here by measurement, genuinely enforced in a sibling repo, and
therefore NEVER a removal candidate — what to check instead is its attestation
discipline (foreign pointer, cross-repo scope, dated `verifiedAt`, 180-day
expiry), verified at source against the ledger README and the gate that
executes those four criteria. It is paid for by SPR-C-01 and SPR-C-04, so no
ceiling is raised.
SPR-C-01 deletes the dormant-gate trap (the job and its `paths` filter no
longer exist). SPR-D-01 replaces four traps that duplicate AGENTS.md and the
dev-agent definition with a pointer at those anchors. SPR-C-04 replaces the
hand-rolled ten-name gate loop with the one wrapper command, and SPR-C-03
completes the pure-source-audit list from three names to all five. SPR-C-02
rewrites the strict-delete route onto the shared `strictObject()` guidance
slot and its audit test. SPR-C-06 drops a rotting hand count in favour of the
pin test that actually judges the corpus. SPR-F-01 adds the ADR-0087
disposition marker the changeset row omitted. Dead references corrected:
the orphans script, the advisory-lint file's new package, and the consumed
changeset sample.
File: 337 -> 333 lines (ceiling 337); widest table row 328 -> 326 bytes
(pin 328). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
… anchor + stock-app-name fix
DOG-C-01: the ablation predict-then-mutate rule was an 18-line second copy of
the dev-agent definition's own rule — same criterion, same unaliased-import
ledger, same two measured incidents — and both texts already said the rule is
not dogfood's. It becomes a two-line pointer at that anchor.
X-01 is decided by pointer: the platform-checklist runner doc is the
environment anchor, and section 0 now says so and carries only what that
anchor lacks. DOG-F-01 is exactly that case — the runner doc names dogfood
section 0 by name as the origin of the `-p`-alone trap, while this file had no
mention of the variable the self-pinging connectors actually read.
Same section, same defect class, evidence pinned by the anchor: the stock-boot
app-name list dropped an app that a stock boot does not load, so an empty
`?id=` result there is correct rather than the missing-metadata false P0 the
bullet exists to prevent.
File: 157 -> 147 lines (ceiling 157). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…P lacks, CLA-C-02, README anchor
CLA-C-01: the orchestration section opened by declaring itself "not a second
copy of the process" and then restated the sweep doc's six steps one for one,
plus its angle table. It is rewritten to a pointer at that doc plus the three
clauses measurably absent from it (measured, not assumed: zero hits there for
worktree/PD#11, and zero for subagent/sequential): worktree-first, the
orchestrator-exclusive write surfaces, and brief-is-a-hypothesis.
CLA-C-02 travels with it: the stale waiver count ("four of six expired") was
the oldest of three disagreeing numbers and its containing clause was one of
the restated steps, so the number is gone rather than corrected in a second
place. The surviving anchor states the measured truth, and the checklist gate
itself reports `0 waived` today.
The README citation moves off a term that no longer exists in that file and
onto the section that does.
X-02: this file keeps the sole copy of the no-subagent degradation clause —
the "no other gaps" conclusion it protects is a sweep conclusion.
File: 62 -> 53 lines (ceiling 62). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…ters, X-02
CLT-B-01 was unexecutable as written: the Tier-1 batching step told the runner
to read `automated.ref` from the selector's `--json`, which projects only id,
priority, surface, since and revision. The field is real but lives in the area
file, so the step now says where to read it.
CLT-C-01 replaces a memory-sourced blanket model tier with the rule the
dispatch protocol actually binds — derive the tier from the current
dispatch-gates output, never from recall.
CLT-C-02/C-03 stop re-copying the runner doc's rules 1-2. C-03 becomes a
pointer. C-02 keeps the disclosure guardrail in place (the runner doc states
in its own text that this is one rule deliberately written in both places, so
deleting this copy would falsify an anchor I must not edit) but drops the
elaboration and, with it, the precedence claim that same anchor explicitly
denies.
X-02: the no-subagent degradation clause now points at its single home in the
sibling skill instead of restating it near-verbatim.
File: 238 -> 234 lines (ceiling 238). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
@os-zhuang
os-zhuang marked this pull request as ready for review September 2, 2026 15:01
@os-zhuang
os-zhuang added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 9afd9f2Sep 2, 2026
36 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-14317-skills-internal-small branch September 2, 2026 16:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants

@os-litant@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict - #14598

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict#14598
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#14317
Fixes#14058

Member card of the skills catalog optimization program (maintainer mandate 2026-09-02, verbatim and untranslated: 「审核所有的 skills,进行全面的优化。」). Sibling PR in objectui carries VFY-C-01 (Part of #14317).

Clause-②: no — nothing here states a platform contract; no needs:contract-review.

Per-finding record

id落点beforeafter
SPR-C-05 (= #14058)spec-property-retirement §0four checkboxes; zero mentions of the ledger's fifth verdicta fifth checkbox: a live-elsewhere row is dead here by measurement, genuinely enforced in a sibling repo, and never a removal candidate; what to check instead is its four attestation criteria and the gate that executes them
SPR-C-01:329-332"check-generated runs behind a paths filter in ci.yml; add the path in the same PR"deleted — that job and that filter no longer exist, and ci.yml has no paths: at all
SPR-D-01§6 traps4 of 7 traps restated a binding anchor (stale dist, pipe-eaten exit code, sequential gate masking, --check vs bare)one pointer naming all four and their two anchors; the two traps unique to retirement stay
SPR-C-04:300-311a hand-rolled ten-name check:* loop — the "match by hand" the root instruction file forbidsthe one wrapper command, which reports every stale artifact at once
SPR-C-03:313-3143 of the 5 pure source audits namedall five named
SPR-C-02:81 (the route table)a hand-written $ZodErrorMap passed to z.object(shape,{error}).strict()the shared strictObject()guidance: slot, its set-keyed form, its worked example and the audit test that now covers it
SPR-C-06:145"~28 tombstones follow all five conventions" — a hand count, measured 181 sites todaythe census is delegated to the pin test that actually judges every site
SPR-F-01§4 changeset rowno ADR-0087 disposition markerthe marker and the gate that enforces it, on the row where retirement is exactly the named case
DOG-C-01dogfood:66-8318 lines re-stating the dev-agent definition's ablation rule — same criterion, same ledger, same two incidentsa two-line pointer at that anchor
DOG-F-01dogfood §0zero mentions of OS_PORT, though the runner doc names this section by name as the trap's originthe two lines: the self-pinging connectors read the environment, so -p alone leaves them dialing 3000
X-01dogfood §0environment facts split across two docs, with the routing and the pricing pointing opposite waysdecided by pointer: the runner doc is the environment anchor, this section says so and carries only what that anchor lacks
CLA-C-01checklist-author:33-51declares itself "not a second copy of the process", then restates the sweep doc's six steps one for onea pointer plus the three clauses measurably absent from that doc
CLA-C-02:46-49"four of six waivers expired" — the oldest of three disagreeing numbersgone with its containing duplicate; the surviving anchor states the measured truth, and the checklist gate reports 0 waived today
CLT-B-01checklist-test:78-87Tier-1 batching reads automated.ref "from the selector" — which projects only id / priority / surface / since / revisionthe step now reads the field where it lives, in the area file
CLT-C-01:96-97a blanket opus tier, sourced from memorythe tier is derived per dispatch from the current tooling output, never recalled
CLT-C-02:229-2357 lines re-copying the disclosure rule, opening with a precedence claim the runner doc explicitly deniesthe guardrail stays in 4 lines (see the note below), the elaboration and the precedence claim go
CLT-C-03:102-105re-copies runner rule 1a pointer
X-02both filesthe no-subagent degradation clause stated twice, near-verbatimone copy, in checklist-author; the other points at it. Provenance noted, not re-litigated: both copies came from the same maintainer round

Dead references — each with its positive control

statedcorrected tocontrol
SPR:103scripts/liveness/orphans.mtspackages/spec/scripts/liveness/orphans.mtsstated path absent, corrected path present; every other citation in this file is repo-rooted
SPR:261packages/cli/src/utils/lint-liveness-properties.tspackages/lint/src/lint-liveness-properties.tsstated path absent, corrected path present
SPR:282.changeset/tool-inert-keys-removed.mdany live .changeset/*-retired.mdstated file absent (consumed at release); 6 live files carry the "The retirement kit:" section
SPR:329-332 the ci.ymlpaths filterdeleted with SPR-C-01ci.yml has no paths:
CLA:42 the README's "deep-test contract"the README's ## Item anatomythe term has zero hits in that README; the section exists at the cited line
CLT:78-87automated.ref from --jsonthe area filethe selector's projection is {id, priority, surface, since, revision}

Line delta per file

filebeforeafterceilingwidest table row
.claude/skills/spec-property-retirement/SKILL.md337333337328 → 326 (pin 328)
.claude/skills/dogfood-verification/SKILL.md157147157n/a
.claude/skills/checklist-author/SKILL.md625362n/a
.claude/skills/checklist-test/SKILL.md238234238221 (unchanged)
total794767

Every file shrinks; no ceiling is raised and the ratchet script is untouched. The SPR-C-05 addition is paid in the same file by SPR-C-01 and SPR-C-04, so the ceiling raise 337 → 340 authorized on #14058 (2026-09-01, director batch #26) is not taken — the ruled TEXT lands, including the recognizability half that ruling insisted on ("dead here by measurement / genuinely enforced in a sibling repo"); only its funding route changes, from a raise to the sanctioned pay-by-deletion. The gate now reports 2 bytes of table-row headroom on that file; per this flight's constraint that slack is left for the corpus audit's Phase 3 to re-lock, not taken here.

premise_false: none — every finding's premise held when checked against this base.

Three notes where the work differed from the brief, each measured

  • CLT-C-02 is trimmed, not deleted. The runner doc states in its own text that this guardrail is "one rule written in both places, not a precedence claim by either". Deleting this copy would falsify that anchor, which this flight may not edit. So the copy shrinks to the operative rule plus that framing, and the false precedence claim — the half the anchor actually denies — is what goes.
  • The all-five-verdicts check ordered on [finding] spec-property-retirement skill predates the live-elsewhere verdict — its ledger-verdict discipline never names the never-remove cross-repo case #14058 was carried out: the ledger's status vocabulary is live / experimental / planned / dead / live-elsewhere. inconclusive, noted as a zero-hit term during triage, is not a ledger status at all (zero hits in the vocabulary table and in the liveness scripts), so no vocabulary is missing on its account.
  • check:pm-skill-id-lint does not bind anything in these four files — its scan set is the dispatch-protocol tree plus the dev-agent definition and the root instruction file. No section id or finding id in these four is load-bearing for it, which is why sections could be restructured. Verified before the first deletion.

Gates

All at head 7df16bc7, which equals the pushed remote head and the tree every command below read. Exit codes captured by redirect before any pipe. Heavy runs serialized through the shared verify lock (slot issue-14317).

commandexitits own verdict
pnpm check:pm-skill-ratchet0all four files green, e.g. spec-property-retirement/SKILL.md is 333 lines (ceiling 337; headroom 4) and widest table row is 326 bytes (pin 328; headroom 2)
pnpm check:pm-skill-id-lint0green
pnpm check:skill-frame-sync0green
pnpm check:skill-frame-freshness0green
pnpm check:pm-governed-merges0green
pnpm check:doc-authoring0green
pnpm check:agent-test-spelling0green
pnpm check:cross-package-test-inputs · node scripts/check-cross-package-test-inputs.mjs0green
node scripts/check-ci-filter-parity.mjs0green
node scripts/check-required-contexts.mjs0green
node scripts/check-shard-attestation.mjs0green
pnpm --filter @objectstack/lint run check:doc-formula-expressions058 cases passed self-test, then 22 record-scoped formula example(s) across 426 files / 1385 TS blocks judged clean, 9 @example(s) judged clean, 14 predicate(s) judged clean
pnpm --filter create-objectstack exec vitest run --maxWorkers=2 src/template-consistency.test.ts0Test Files 1 passed (1) · Tests 35 passed (35) — the metadata.internal: true enforcement; all four files still carry the marker
node scripts/check-test-completeness.mjs3NOT MEASURED, not a red: PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. It does not run tests and cannot produce one; CI tees the log and passes the path

The gate family was re-derived from the real changeset after the last edit (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, 4 paths vs merge base aaa4e6578, three-dot semantics) and the whole derived list is above. The first union run returned six exit 3 PREREQUISITE-NOT-MET results because the fresh worktree had no node_modules; they were re-run green after pnpm install, and the formula/lint dependency closures were built before the doc-formula gate could measure anything.

Repo-level pnpm lint was not run, and this is declared rather than implied: it is the CI-owned run. No narrowed substitute is claimed for it.

skip-changeset: this diff is .claude/** only and releases nothing, which is the route the empty-changeset gate's own enumeration names for it (.github/, .claude/, skills/, docs/, content/, examples/ → label, not an empty changeset).

Governed surface (.claude/**) ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

Out-of-scope cards filed after a dedupe search (unassigned, unlabelled for triage): #14595 (the sweep doc sends agents to land a run record in a gitignored directory) and #14596 (a checked-in launch config pointing at a worktree that does not exist).

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

…/C-06/D-01/F-01 + three dead references
SPR-C-05 adds the fifth section-0 checkbox for the ledger's `live-elsewhere`
verdict: dead here by measurement, genuinely enforced in a sibling repo, and
therefore NEVER a removal candidate — what to check instead is its attestation
discipline (foreign pointer, cross-repo scope, dated `verifiedAt`, 180-day
expiry), verified at source against the ledger README and the gate that
executes those four criteria. It is paid for by SPR-C-01 and SPR-C-04, so no
ceiling is raised.
SPR-C-01 deletes the dormant-gate trap (the job and its `paths` filter no
longer exist). SPR-D-01 replaces four traps that duplicate AGENTS.md and the
dev-agent definition with a pointer at those anchors. SPR-C-04 replaces the
hand-rolled ten-name gate loop with the one wrapper command, and SPR-C-03
completes the pure-source-audit list from three names to all five. SPR-C-02
rewrites the strict-delete route onto the shared `strictObject()` guidance
slot and its audit test. SPR-C-06 drops a rotting hand count in favour of the
pin test that actually judges the corpus. SPR-F-01 adds the ADR-0087
disposition marker the changeset row omitted. Dead references corrected:
the orphans script, the advisory-lint file's new package, and the consumed
changeset sample.
File: 337 -> 333 lines (ceiling 337); widest table row 328 -> 326 bytes
(pin 328). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
… anchor + stock-app-name fix
DOG-C-01: the ablation predict-then-mutate rule was an 18-line second copy of
the dev-agent definition's own rule — same criterion, same unaliased-import
ledger, same two measured incidents — and both texts already said the rule is
not dogfood's. It becomes a two-line pointer at that anchor.
X-01 is decided by pointer: the platform-checklist runner doc is the
environment anchor, and section 0 now says so and carries only what that
anchor lacks. DOG-F-01 is exactly that case — the runner doc names dogfood
section 0 by name as the origin of the `-p`-alone trap, while this file had no
mention of the variable the self-pinging connectors actually read.
Same section, same defect class, evidence pinned by the anchor: the stock-boot
app-name list dropped an app that a stock boot does not load, so an empty
`?id=` result there is correct rather than the missing-metadata false P0 the
bullet exists to prevent.
File: 157 -> 147 lines (ceiling 157). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…P lacks, CLA-C-02, README anchor
CLA-C-01: the orchestration section opened by declaring itself "not a second
copy of the process" and then restated the sweep doc's six steps one for one,
plus its angle table. It is rewritten to a pointer at that doc plus the three
clauses measurably absent from it (measured, not assumed: zero hits there for
worktree/PD#11, and zero for subagent/sequential): worktree-first, the
orchestrator-exclusive write surfaces, and brief-is-a-hypothesis.
CLA-C-02 travels with it: the stale waiver count ("four of six expired") was
the oldest of three disagreeing numbers and its containing clause was one of
the restated steps, so the number is gone rather than corrected in a second
place. The surviving anchor states the measured truth, and the checklist gate
itself reports `0 waived` today.
The README citation moves off a term that no longer exists in that file and
onto the section that does.
X-02: this file keeps the sole copy of the no-subagent degradation clause —
the "no other gaps" conclusion it protects is a sweep conclusion.
File: 62 -> 53 lines (ceiling 62). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…ters, X-02
CLT-B-01 was unexecutable as written: the Tier-1 batching step told the runner
to read `automated.ref` from the selector's `--json`, which projects only id,
priority, surface, since and revision. The field is real but lives in the area
file, so the step now says where to read it.
CLT-C-01 replaces a memory-sourced blanket model tier with the rule the
dispatch protocol actually binds — derive the tier from the current
dispatch-gates output, never from recall.
CLT-C-02/C-03 stop re-copying the runner doc's rules 1-2. C-03 becomes a
pointer. C-02 keeps the disclosure guardrail in place (the runner doc states
in its own text that this is one rule deliberately written in both places, so
deleting this copy would falsify an anchor I must not edit) but drops the
elaboration and, with it, the precedence claim that same anchor explicitly
denies.
X-02: the no-subagent degradation clause now points at its single home in the
sibling skill instead of restating it near-verbatim.
File: 238 -> 234 lines (ceiling 238). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
@os-zhuang
os-zhuang marked this pull request as ready for review September 2, 2026 15:01
@os-zhuang
os-zhuang added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 9afd9f2Sep 2, 2026
36 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-14317-skills-internal-small branch September 2, 2026 16:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants

@os-litant@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict - #14598

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict#14598
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#14317
Fixes#14058

Member card of the skills catalog optimization program (maintainer mandate 2026-09-02, verbatim and untranslated: 「审核所有的 skills,进行全面的优化。」). Sibling PR in objectui carries VFY-C-01 (Part of #14317).

Clause-②: no — nothing here states a platform contract; no needs:contract-review.

Per-finding record

id落点beforeafter
SPR-C-05 (= #14058)spec-property-retirement §0four checkboxes; zero mentions of the ledger's fifth verdicta fifth checkbox: a live-elsewhere row is dead here by measurement, genuinely enforced in a sibling repo, and never a removal candidate; what to check instead is its four attestation criteria and the gate that executes them
SPR-C-01:329-332"check-generated runs behind a paths filter in ci.yml; add the path in the same PR"deleted — that job and that filter no longer exist, and ci.yml has no paths: at all
SPR-D-01§6 traps4 of 7 traps restated a binding anchor (stale dist, pipe-eaten exit code, sequential gate masking, --check vs bare)one pointer naming all four and their two anchors; the two traps unique to retirement stay
SPR-C-04:300-311a hand-rolled ten-name check:* loop — the "match by hand" the root instruction file forbidsthe one wrapper command, which reports every stale artifact at once
SPR-C-03:313-3143 of the 5 pure source audits namedall five named
SPR-C-02:81 (the route table)a hand-written $ZodErrorMap passed to z.object(shape,{error}).strict()the shared strictObject()guidance: slot, its set-keyed form, its worked example and the audit test that now covers it
SPR-C-06:145"~28 tombstones follow all five conventions" — a hand count, measured 181 sites todaythe census is delegated to the pin test that actually judges every site
SPR-F-01§4 changeset rowno ADR-0087 disposition markerthe marker and the gate that enforces it, on the row where retirement is exactly the named case
DOG-C-01dogfood:66-8318 lines re-stating the dev-agent definition's ablation rule — same criterion, same ledger, same two incidentsa two-line pointer at that anchor
DOG-F-01dogfood §0zero mentions of OS_PORT, though the runner doc names this section by name as the trap's originthe two lines: the self-pinging connectors read the environment, so -p alone leaves them dialing 3000
X-01dogfood §0environment facts split across two docs, with the routing and the pricing pointing opposite waysdecided by pointer: the runner doc is the environment anchor, this section says so and carries only what that anchor lacks
CLA-C-01checklist-author:33-51declares itself "not a second copy of the process", then restates the sweep doc's six steps one for onea pointer plus the three clauses measurably absent from that doc
CLA-C-02:46-49"four of six waivers expired" — the oldest of three disagreeing numbersgone with its containing duplicate; the surviving anchor states the measured truth, and the checklist gate reports 0 waived today
CLT-B-01checklist-test:78-87Tier-1 batching reads automated.ref "from the selector" — which projects only id / priority / surface / since / revisionthe step now reads the field where it lives, in the area file
CLT-C-01:96-97a blanket opus tier, sourced from memorythe tier is derived per dispatch from the current tooling output, never recalled
CLT-C-02:229-2357 lines re-copying the disclosure rule, opening with a precedence claim the runner doc explicitly deniesthe guardrail stays in 4 lines (see the note below), the elaboration and the precedence claim go
CLT-C-03:102-105re-copies runner rule 1a pointer
X-02both filesthe no-subagent degradation clause stated twice, near-verbatimone copy, in checklist-author; the other points at it. Provenance noted, not re-litigated: both copies came from the same maintainer round

Dead references — each with its positive control

statedcorrected tocontrol
SPR:103scripts/liveness/orphans.mtspackages/spec/scripts/liveness/orphans.mtsstated path absent, corrected path present; every other citation in this file is repo-rooted
SPR:261packages/cli/src/utils/lint-liveness-properties.tspackages/lint/src/lint-liveness-properties.tsstated path absent, corrected path present
SPR:282.changeset/tool-inert-keys-removed.mdany live .changeset/*-retired.mdstated file absent (consumed at release); 6 live files carry the "The retirement kit:" section
SPR:329-332 the ci.ymlpaths filterdeleted with SPR-C-01ci.yml has no paths:
CLA:42 the README's "deep-test contract"the README's ## Item anatomythe term has zero hits in that README; the section exists at the cited line
CLT:78-87automated.ref from --jsonthe area filethe selector's projection is {id, priority, surface, since, revision}

Line delta per file

filebeforeafterceilingwidest table row
.claude/skills/spec-property-retirement/SKILL.md337333337328 → 326 (pin 328)
.claude/skills/dogfood-verification/SKILL.md157147157n/a
.claude/skills/checklist-author/SKILL.md625362n/a
.claude/skills/checklist-test/SKILL.md238234238221 (unchanged)
total794767

Every file shrinks; no ceiling is raised and the ratchet script is untouched. The SPR-C-05 addition is paid in the same file by SPR-C-01 and SPR-C-04, so the ceiling raise 337 → 340 authorized on #14058 (2026-09-01, director batch #26) is not taken — the ruled TEXT lands, including the recognizability half that ruling insisted on ("dead here by measurement / genuinely enforced in a sibling repo"); only its funding route changes, from a raise to the sanctioned pay-by-deletion. The gate now reports 2 bytes of table-row headroom on that file; per this flight's constraint that slack is left for the corpus audit's Phase 3 to re-lock, not taken here.

premise_false: none — every finding's premise held when checked against this base.

Three notes where the work differed from the brief, each measured

  • CLT-C-02 is trimmed, not deleted. The runner doc states in its own text that this guardrail is "one rule written in both places, not a precedence claim by either". Deleting this copy would falsify that anchor, which this flight may not edit. So the copy shrinks to the operative rule plus that framing, and the false precedence claim — the half the anchor actually denies — is what goes.
  • The all-five-verdicts check ordered on [finding] spec-property-retirement skill predates the live-elsewhere verdict — its ledger-verdict discipline never names the never-remove cross-repo case #14058 was carried out: the ledger's status vocabulary is live / experimental / planned / dead / live-elsewhere. inconclusive, noted as a zero-hit term during triage, is not a ledger status at all (zero hits in the vocabulary table and in the liveness scripts), so no vocabulary is missing on its account.
  • check:pm-skill-id-lint does not bind anything in these four files — its scan set is the dispatch-protocol tree plus the dev-agent definition and the root instruction file. No section id or finding id in these four is load-bearing for it, which is why sections could be restructured. Verified before the first deletion.

Gates

All at head 7df16bc7, which equals the pushed remote head and the tree every command below read. Exit codes captured by redirect before any pipe. Heavy runs serialized through the shared verify lock (slot issue-14317).

commandexitits own verdict
pnpm check:pm-skill-ratchet0all four files green, e.g. spec-property-retirement/SKILL.md is 333 lines (ceiling 337; headroom 4) and widest table row is 326 bytes (pin 328; headroom 2)
pnpm check:pm-skill-id-lint0green
pnpm check:skill-frame-sync0green
pnpm check:skill-frame-freshness0green
pnpm check:pm-governed-merges0green
pnpm check:doc-authoring0green
pnpm check:agent-test-spelling0green
pnpm check:cross-package-test-inputs · node scripts/check-cross-package-test-inputs.mjs0green
node scripts/check-ci-filter-parity.mjs0green
node scripts/check-required-contexts.mjs0green
node scripts/check-shard-attestation.mjs0green
pnpm --filter @objectstack/lint run check:doc-formula-expressions058 cases passed self-test, then 22 record-scoped formula example(s) across 426 files / 1385 TS blocks judged clean, 9 @example(s) judged clean, 14 predicate(s) judged clean
pnpm --filter create-objectstack exec vitest run --maxWorkers=2 src/template-consistency.test.ts0Test Files 1 passed (1) · Tests 35 passed (35) — the metadata.internal: true enforcement; all four files still carry the marker
node scripts/check-test-completeness.mjs3NOT MEASURED, not a red: PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. It does not run tests and cannot produce one; CI tees the log and passes the path

The gate family was re-derived from the real changeset after the last edit (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, 4 paths vs merge base aaa4e6578, three-dot semantics) and the whole derived list is above. The first union run returned six exit 3 PREREQUISITE-NOT-MET results because the fresh worktree had no node_modules; they were re-run green after pnpm install, and the formula/lint dependency closures were built before the doc-formula gate could measure anything.

Repo-level pnpm lint was not run, and this is declared rather than implied: it is the CI-owned run. No narrowed substitute is claimed for it.

skip-changeset: this diff is .claude/** only and releases nothing, which is the route the empty-changeset gate's own enumeration names for it (.github/, .claude/, skills/, docs/, content/, examples/ → label, not an empty changeset).

Governed surface (.claude/**) ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

Out-of-scope cards filed after a dedupe search (unassigned, unlabelled for triage): #14595 (the sweep doc sends agents to land a run record in a gitignored directory) and #14596 (a checked-in launch config pointing at a worktree that does not exist).

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

…/C-06/D-01/F-01 + three dead references
SPR-C-05 adds the fifth section-0 checkbox for the ledger's `live-elsewhere`
verdict: dead here by measurement, genuinely enforced in a sibling repo, and
therefore NEVER a removal candidate — what to check instead is its attestation
discipline (foreign pointer, cross-repo scope, dated `verifiedAt`, 180-day
expiry), verified at source against the ledger README and the gate that
executes those four criteria. It is paid for by SPR-C-01 and SPR-C-04, so no
ceiling is raised.
SPR-C-01 deletes the dormant-gate trap (the job and its `paths` filter no
longer exist). SPR-D-01 replaces four traps that duplicate AGENTS.md and the
dev-agent definition with a pointer at those anchors. SPR-C-04 replaces the
hand-rolled ten-name gate loop with the one wrapper command, and SPR-C-03
completes the pure-source-audit list from three names to all five. SPR-C-02
rewrites the strict-delete route onto the shared `strictObject()` guidance
slot and its audit test. SPR-C-06 drops a rotting hand count in favour of the
pin test that actually judges the corpus. SPR-F-01 adds the ADR-0087
disposition marker the changeset row omitted. Dead references corrected:
the orphans script, the advisory-lint file's new package, and the consumed
changeset sample.
File: 337 -> 333 lines (ceiling 337); widest table row 328 -> 326 bytes
(pin 328). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
… anchor + stock-app-name fix
DOG-C-01: the ablation predict-then-mutate rule was an 18-line second copy of
the dev-agent definition's own rule — same criterion, same unaliased-import
ledger, same two measured incidents — and both texts already said the rule is
not dogfood's. It becomes a two-line pointer at that anchor.
X-01 is decided by pointer: the platform-checklist runner doc is the
environment anchor, and section 0 now says so and carries only what that
anchor lacks. DOG-F-01 is exactly that case — the runner doc names dogfood
section 0 by name as the origin of the `-p`-alone trap, while this file had no
mention of the variable the self-pinging connectors actually read.
Same section, same defect class, evidence pinned by the anchor: the stock-boot
app-name list dropped an app that a stock boot does not load, so an empty
`?id=` result there is correct rather than the missing-metadata false P0 the
bullet exists to prevent.
File: 157 -> 147 lines (ceiling 157). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…P lacks, CLA-C-02, README anchor
CLA-C-01: the orchestration section opened by declaring itself "not a second
copy of the process" and then restated the sweep doc's six steps one for one,
plus its angle table. It is rewritten to a pointer at that doc plus the three
clauses measurably absent from it (measured, not assumed: zero hits there for
worktree/PD#11, and zero for subagent/sequential): worktree-first, the
orchestrator-exclusive write surfaces, and brief-is-a-hypothesis.
CLA-C-02 travels with it: the stale waiver count ("four of six expired") was
the oldest of three disagreeing numbers and its containing clause was one of
the restated steps, so the number is gone rather than corrected in a second
place. The surviving anchor states the measured truth, and the checklist gate
itself reports `0 waived` today.
The README citation moves off a term that no longer exists in that file and
onto the section that does.
X-02: this file keeps the sole copy of the no-subagent degradation clause —
the "no other gaps" conclusion it protects is a sweep conclusion.
File: 62 -> 53 lines (ceiling 62). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…ters, X-02
CLT-B-01 was unexecutable as written: the Tier-1 batching step told the runner
to read `automated.ref` from the selector's `--json`, which projects only id,
priority, surface, since and revision. The field is real but lives in the area
file, so the step now says where to read it.
CLT-C-01 replaces a memory-sourced blanket model tier with the rule the
dispatch protocol actually binds — derive the tier from the current
dispatch-gates output, never from recall.
CLT-C-02/C-03 stop re-copying the runner doc's rules 1-2. C-03 becomes a
pointer. C-02 keeps the disclosure guardrail in place (the runner doc states
in its own text that this is one rule deliberately written in both places, so
deleting this copy would falsify an anchor I must not edit) but drops the
elaboration and, with it, the precedence claim that same anchor explicitly
denies.
X-02: the no-subagent degradation clause now points at its single home in the
sibling skill instead of restating it near-verbatim.
File: 238 -> 234 lines (ceiling 238). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
@os-zhuang
os-zhuang marked this pull request as ready for review September 2, 2026 15:01
@os-zhuang
os-zhuang added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 9afd9f2Sep 2, 2026
36 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-14317-skills-internal-small branch September 2, 2026 16:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants

@os-litant@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict - #14598

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): the four small internal skills — seven dead references, four copies replaced by pointers, and the live-elsewhere never-remove verdict#14598
os-zhuang merged 4 commits into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#14317
Fixes#14058

Member card of the skills catalog optimization program (maintainer mandate 2026-09-02, verbatim and untranslated: 「审核所有的 skills,进行全面的优化。」). Sibling PR in objectui carries VFY-C-01 (Part of #14317).

Clause-②: no — nothing here states a platform contract; no needs:contract-review.

Per-finding record

id落点beforeafter
SPR-C-05 (= #14058)spec-property-retirement §0four checkboxes; zero mentions of the ledger's fifth verdicta fifth checkbox: a live-elsewhere row is dead here by measurement, genuinely enforced in a sibling repo, and never a removal candidate; what to check instead is its four attestation criteria and the gate that executes them
SPR-C-01:329-332"check-generated runs behind a paths filter in ci.yml; add the path in the same PR"deleted — that job and that filter no longer exist, and ci.yml has no paths: at all
SPR-D-01§6 traps4 of 7 traps restated a binding anchor (stale dist, pipe-eaten exit code, sequential gate masking, --check vs bare)one pointer naming all four and their two anchors; the two traps unique to retirement stay
SPR-C-04:300-311a hand-rolled ten-name check:* loop — the "match by hand" the root instruction file forbidsthe one wrapper command, which reports every stale artifact at once
SPR-C-03:313-3143 of the 5 pure source audits namedall five named
SPR-C-02:81 (the route table)a hand-written $ZodErrorMap passed to z.object(shape,{error}).strict()the shared strictObject()guidance: slot, its set-keyed form, its worked example and the audit test that now covers it
SPR-C-06:145"~28 tombstones follow all five conventions" — a hand count, measured 181 sites todaythe census is delegated to the pin test that actually judges every site
SPR-F-01§4 changeset rowno ADR-0087 disposition markerthe marker and the gate that enforces it, on the row where retirement is exactly the named case
DOG-C-01dogfood:66-8318 lines re-stating the dev-agent definition's ablation rule — same criterion, same ledger, same two incidentsa two-line pointer at that anchor
DOG-F-01dogfood §0zero mentions of OS_PORT, though the runner doc names this section by name as the trap's originthe two lines: the self-pinging connectors read the environment, so -p alone leaves them dialing 3000
X-01dogfood §0environment facts split across two docs, with the routing and the pricing pointing opposite waysdecided by pointer: the runner doc is the environment anchor, this section says so and carries only what that anchor lacks
CLA-C-01checklist-author:33-51declares itself "not a second copy of the process", then restates the sweep doc's six steps one for onea pointer plus the three clauses measurably absent from that doc
CLA-C-02:46-49"four of six waivers expired" — the oldest of three disagreeing numbersgone with its containing duplicate; the surviving anchor states the measured truth, and the checklist gate reports 0 waived today
CLT-B-01checklist-test:78-87Tier-1 batching reads automated.ref "from the selector" — which projects only id / priority / surface / since / revisionthe step now reads the field where it lives, in the area file
CLT-C-01:96-97a blanket opus tier, sourced from memorythe tier is derived per dispatch from the current tooling output, never recalled
CLT-C-02:229-2357 lines re-copying the disclosure rule, opening with a precedence claim the runner doc explicitly deniesthe guardrail stays in 4 lines (see the note below), the elaboration and the precedence claim go
CLT-C-03:102-105re-copies runner rule 1a pointer
X-02both filesthe no-subagent degradation clause stated twice, near-verbatimone copy, in checklist-author; the other points at it. Provenance noted, not re-litigated: both copies came from the same maintainer round

Dead references — each with its positive control

statedcorrected tocontrol
SPR:103scripts/liveness/orphans.mtspackages/spec/scripts/liveness/orphans.mtsstated path absent, corrected path present; every other citation in this file is repo-rooted
SPR:261packages/cli/src/utils/lint-liveness-properties.tspackages/lint/src/lint-liveness-properties.tsstated path absent, corrected path present
SPR:282.changeset/tool-inert-keys-removed.mdany live .changeset/*-retired.mdstated file absent (consumed at release); 6 live files carry the "The retirement kit:" section
SPR:329-332 the ci.ymlpaths filterdeleted with SPR-C-01ci.yml has no paths:
CLA:42 the README's "deep-test contract"the README's ## Item anatomythe term has zero hits in that README; the section exists at the cited line
CLT:78-87automated.ref from --jsonthe area filethe selector's projection is {id, priority, surface, since, revision}

Line delta per file

filebeforeafterceilingwidest table row
.claude/skills/spec-property-retirement/SKILL.md337333337328 → 326 (pin 328)
.claude/skills/dogfood-verification/SKILL.md157147157n/a
.claude/skills/checklist-author/SKILL.md625362n/a
.claude/skills/checklist-test/SKILL.md238234238221 (unchanged)
total794767

Every file shrinks; no ceiling is raised and the ratchet script is untouched. The SPR-C-05 addition is paid in the same file by SPR-C-01 and SPR-C-04, so the ceiling raise 337 → 340 authorized on #14058 (2026-09-01, director batch #26) is not taken — the ruled TEXT lands, including the recognizability half that ruling insisted on ("dead here by measurement / genuinely enforced in a sibling repo"); only its funding route changes, from a raise to the sanctioned pay-by-deletion. The gate now reports 2 bytes of table-row headroom on that file; per this flight's constraint that slack is left for the corpus audit's Phase 3 to re-lock, not taken here.

premise_false: none — every finding's premise held when checked against this base.

Three notes where the work differed from the brief, each measured

  • CLT-C-02 is trimmed, not deleted. The runner doc states in its own text that this guardrail is "one rule written in both places, not a precedence claim by either". Deleting this copy would falsify that anchor, which this flight may not edit. So the copy shrinks to the operative rule plus that framing, and the false precedence claim — the half the anchor actually denies — is what goes.
  • The all-five-verdicts check ordered on [finding] spec-property-retirement skill predates the live-elsewhere verdict — its ledger-verdict discipline never names the never-remove cross-repo case #14058 was carried out: the ledger's status vocabulary is live / experimental / planned / dead / live-elsewhere. inconclusive, noted as a zero-hit term during triage, is not a ledger status at all (zero hits in the vocabulary table and in the liveness scripts), so no vocabulary is missing on its account.
  • check:pm-skill-id-lint does not bind anything in these four files — its scan set is the dispatch-protocol tree plus the dev-agent definition and the root instruction file. No section id or finding id in these four is load-bearing for it, which is why sections could be restructured. Verified before the first deletion.

Gates

All at head 7df16bc7, which equals the pushed remote head and the tree every command below read. Exit codes captured by redirect before any pipe. Heavy runs serialized through the shared verify lock (slot issue-14317).

commandexitits own verdict
pnpm check:pm-skill-ratchet0all four files green, e.g. spec-property-retirement/SKILL.md is 333 lines (ceiling 337; headroom 4) and widest table row is 326 bytes (pin 328; headroom 2)
pnpm check:pm-skill-id-lint0green
pnpm check:skill-frame-sync0green
pnpm check:skill-frame-freshness0green
pnpm check:pm-governed-merges0green
pnpm check:doc-authoring0green
pnpm check:agent-test-spelling0green
pnpm check:cross-package-test-inputs · node scripts/check-cross-package-test-inputs.mjs0green
node scripts/check-ci-filter-parity.mjs0green
node scripts/check-required-contexts.mjs0green
node scripts/check-shard-attestation.mjs0green
pnpm --filter @objectstack/lint run check:doc-formula-expressions058 cases passed self-test, then 22 record-scoped formula example(s) across 426 files / 1385 TS blocks judged clean, 9 @example(s) judged clean, 14 predicate(s) judged clean
pnpm --filter create-objectstack exec vitest run --maxWorkers=2 src/template-consistency.test.ts0Test Files 1 passed (1) · Tests 35 passed (35) — the metadata.internal: true enforcement; all four files still carry the marker
node scripts/check-test-completeness.mjs3NOT MEASURED, not a red: PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. It does not run tests and cannot produce one; CI tees the log and passes the path

The gate family was re-derived from the real changeset after the last edit (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, 4 paths vs merge base aaa4e6578, three-dot semantics) and the whole derived list is above. The first union run returned six exit 3 PREREQUISITE-NOT-MET results because the fresh worktree had no node_modules; they were re-run green after pnpm install, and the formula/lint dependency closures were built before the doc-formula gate could measure anything.

Repo-level pnpm lint was not run, and this is declared rather than implied: it is the CI-owned run. No narrowed substitute is claimed for it.

skip-changeset: this diff is .claude/** only and releases nothing, which is the route the empty-changeset gate's own enumeration names for it (.github/, .claude/, skills/, docs/, content/, examples/ → label, not an empty changeset).

Governed surface (.claude/**) ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

Out-of-scope cards filed after a dedupe search (unassigned, unlabelled for triage): #14595 (the sweep doc sends agents to land a run record in a gitignored directory) and #14596 (a checked-in launch config pointing at a worktree that does not exist).

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

…/C-06/D-01/F-01 + three dead references
SPR-C-05 adds the fifth section-0 checkbox for the ledger's `live-elsewhere`
verdict: dead here by measurement, genuinely enforced in a sibling repo, and
therefore NEVER a removal candidate — what to check instead is its attestation
discipline (foreign pointer, cross-repo scope, dated `verifiedAt`, 180-day
expiry), verified at source against the ledger README and the gate that
executes those four criteria. It is paid for by SPR-C-01 and SPR-C-04, so no
ceiling is raised.
SPR-C-01 deletes the dormant-gate trap (the job and its `paths` filter no
longer exist). SPR-D-01 replaces four traps that duplicate AGENTS.md and the
dev-agent definition with a pointer at those anchors. SPR-C-04 replaces the
hand-rolled ten-name gate loop with the one wrapper command, and SPR-C-03
completes the pure-source-audit list from three names to all five. SPR-C-02
rewrites the strict-delete route onto the shared `strictObject()` guidance
slot and its audit test. SPR-C-06 drops a rotting hand count in favour of the
pin test that actually judges the corpus. SPR-F-01 adds the ADR-0087
disposition marker the changeset row omitted. Dead references corrected:
the orphans script, the advisory-lint file's new package, and the consumed
changeset sample.
File: 337 -> 333 lines (ceiling 337); widest table row 328 -> 326 bytes
(pin 328). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
… anchor + stock-app-name fix
DOG-C-01: the ablation predict-then-mutate rule was an 18-line second copy of
the dev-agent definition's own rule — same criterion, same unaliased-import
ledger, same two measured incidents — and both texts already said the rule is
not dogfood's. It becomes a two-line pointer at that anchor.
X-01 is decided by pointer: the platform-checklist runner doc is the
environment anchor, and section 0 now says so and carries only what that
anchor lacks. DOG-F-01 is exactly that case — the runner doc names dogfood
section 0 by name as the origin of the `-p`-alone trap, while this file had no
mention of the variable the self-pinging connectors actually read.
Same section, same defect class, evidence pinned by the anchor: the stock-boot
app-name list dropped an app that a stock boot does not load, so an empty
`?id=` result there is correct rather than the missing-metadata false P0 the
bullet exists to prevent.
File: 157 -> 147 lines (ceiling 157). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…P lacks, CLA-C-02, README anchor
CLA-C-01: the orchestration section opened by declaring itself "not a second
copy of the process" and then restated the sweep doc's six steps one for one,
plus its angle table. It is rewritten to a pointer at that doc plus the three
clauses measurably absent from it (measured, not assumed: zero hits there for
worktree/PD#11, and zero for subagent/sequential): worktree-first, the
orchestrator-exclusive write surfaces, and brief-is-a-hypothesis.
CLA-C-02 travels with it: the stale waiver count ("four of six expired") was
the oldest of three disagreeing numbers and its containing clause was one of
the restated steps, so the number is gone rather than corrected in a second
place. The surviving anchor states the measured truth, and the checklist gate
itself reports `0 waived` today.
The README citation moves off a term that no longer exists in that file and
onto the section that does.
X-02: this file keeps the sole copy of the no-subagent degradation clause —
the "no other gaps" conclusion it protects is a sweep conclusion.
File: 62 -> 53 lines (ceiling 62). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…ters, X-02
CLT-B-01 was unexecutable as written: the Tier-1 batching step told the runner
to read `automated.ref` from the selector's `--json`, which projects only id,
priority, surface, since and revision. The field is real but lives in the area
file, so the step now says where to read it.
CLT-C-01 replaces a memory-sourced blanket model tier with the rule the
dispatch protocol actually binds — derive the tier from the current
dispatch-gates output, never from recall.
CLT-C-02/C-03 stop re-copying the runner doc's rules 1-2. C-03 becomes a
pointer. C-02 keeps the disclosure guardrail in place (the runner doc states
in its own text that this is one rule deliberately written in both places, so
deleting this copy would falsify an anchor I must not edit) but drops the
elaboration and, with it, the precedence claim that same anchor explicitly
denies.
X-02: the no-subagent degradation clause now points at its single home in the
sibling skill instead of restating it near-verbatim.
File: 238 -> 234 lines (ceiling 238). Anchors untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
@os-zhuang
os-zhuang marked this pull request as ready for review September 2, 2026 15:01
@os-zhuang
os-zhuang added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 9afd9f2Sep 2, 2026
36 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-14317-skills-internal-small branch September 2, 2026 16:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants

@os-litant@os-zhuang@claude