Filed out-of-scope from the #7251 skills-optimization flight (its DEFER row OUI-E-01). Unassigned.
Measured
At the flight's audit ref, skills/objectui/ carried 123 TypeScript fences and 63 JSON/JSONC fences. grep -rc "os:check" skills/objectui/ returns zero.
Every objectui gate that could read them excludes the surface, by construction rather than by accident:
| Gate |
Why it does not reach a fence in skills/ |
check-skills-paths.mjs |
Deliberately excludes fences — "A fence is a worked example", and a tutorial fence may name a file the reader is about to create. It reads inline code spans in prose only. |
check-doc-links.mjs |
SCAN_ROOTS has no skills row. |
check-doc-component-types.mjs |
DOCS_ROOT = 'content/docs'; its header says so verbatim — "This gate walks content/docs and nothing else: not skills/**". |
check-doc-snippet-types.mjs |
content/docs + package READMEs. |
check-doc-fence-languages.mjs |
content/docs + package READMEs. It judges the fence language tag, never the contents. |
Net: this repo enforces path existence in skill prose, and nothing else. A fence can import a symbol that does not exist, spell a key the renderer never reads, or restate a shape the spec changed, and stay green forever.
What already exists to copy
objectstack has packages/spec/scripts/check-skill-examples.ts, with the convention that an HTML comment containing os:check, placed on the line above a fence, opts that fence into a real type-check. A port would give objectui the same opt-in marker plus a runner over skills/**.
Why this is the highest-leverage structural addition here
It is the mechanism that stops the drift class from recurring. Two rounds of it have already been cleaned by hand — #3658 / #7094's truth sweep, and #7251's own correctness items, which included an eval asserting a mobile hook API (useSwipe / useLongPress) that has zero occurrences repo-wide. Every one of those was found by a human reading, which is precisely the economics check-skills-paths.mjs was created to end for paths.
Shape of the work
- Port the marker convention and the runner; opt-in, so it starts at zero red.
- Measure how many of the 123 fences compile as-is, and land the marker on the ones that already pass — that number is the honest starting ratchet.
- Decide separately whether the ratchet should be shrink-only, the way
check-doc-fence-languages.mjs treats its declared-file population.
Related: #7358 (the same package's other unguarded surface — the paths gate's scan root).
Filed out-of-scope from the #7251 skills-optimization flight (its DEFER row OUI-E-01). Unassigned.
Measured
At the flight's audit ref,
skills/objectui/carried 123 TypeScript fences and 63 JSON/JSONC fences.grep -rc "os:check" skills/objectui/returns zero.Every objectui gate that could read them excludes the surface, by construction rather than by accident:
skills/check-skills-paths.mjscheck-doc-links.mjsSCAN_ROOTShas noskillsrow.check-doc-component-types.mjsDOCS_ROOT = 'content/docs'; its header says so verbatim — "This gate walkscontent/docsand nothing else: notskills/**".check-doc-snippet-types.mjscontent/docs+ package READMEs.check-doc-fence-languages.mjscontent/docs+ package READMEs. It judges the fence language tag, never the contents.Net: this repo enforces path existence in skill prose, and nothing else. A fence can import a symbol that does not exist, spell a key the renderer never reads, or restate a shape the spec changed, and stay green forever.
What already exists to copy
objectstack has
packages/spec/scripts/check-skill-examples.ts, with the convention that an HTML comment containingos:check, placed on the line above a fence, opts that fence into a real type-check. A port would give objectui the same opt-in marker plus a runner overskills/**.Why this is the highest-leverage structural addition here
It is the mechanism that stops the drift class from recurring. Two rounds of it have already been cleaned by hand — #3658 / #7094's truth sweep, and #7251's own correctness items, which included an eval asserting a mobile hook API (
useSwipe/useLongPress) that has zero occurrences repo-wide. Every one of those was found by a human reading, which is precisely the economicscheck-skills-paths.mjswas created to end for paths.Shape of the work
check-doc-fence-languages.mjstreats its declared-file population.Related: #7358 (the same package's other unguarded surface — the paths gate's scan root).