Measured while building the #13678 liveness gate, on 1d84cf3b4. Filed unassigned for triage; the gate LEDGERS this gap rather than fixing it, per that card's brief (zero skills/** edits).
The finding
NavItemVariant (packages/spec/src/ui/app.zod.ts:122) has nine members:
object · dashboard · page · url · report · action · component · group · separator
The ### Navigation Item Types section of skills/objectstack-ui/SKILL.md documents seven. action and component have no row, and neither appears anywhere else in that section.
This is the flight ⑧ class exactly — a live schema member with no doc row, in an enumeration a reader has every reason to take as complete (the heading names the catalog, and the other seven are there). An AI author reading this catalog cannot reach either variant.
Reproduce
node scripts/check-skill-identifier-liveness.mjs --list # after #13678 lands
prints navigation-item-types: ... GAP 2: action, component. Before that lands:
sed -n '/^### Navigation Item Types/,/^## /p' skills/objectstack-ui/SKILL.md | grep -c '^| `'
grep -n -A 3 'type NavItemVariant' packages/spec/src/ui/app.zod.ts
Disposition once fixed
The gap is recorded in scripts/skill-identifier-liveness-ledger.json under leg2Gaps.navigation-item-types. That ledger is shrink-only: when the two rows are written, the gate reports the improvement and asks for node scripts/check-skill-identifier-liveness.mjs --update, which prunes the entry. Adding the rows without running --update leaves budget behind — the gate says so and names the command.
Two things a fix should check, because the gate cannot: whether children is legal on either variant (NAV_VARIANTS_ACCEPTING_CHILDREN is object and group only), and what each variant's required properties are. This gate catches existence, never semantics.
Part of #13658.
Measured while building the #13678 liveness gate, on
1d84cf3b4. Filed unassigned for triage; the gate LEDGERS this gap rather than fixing it, per that card's brief (zeroskills/**edits).The finding
NavItemVariant(packages/spec/src/ui/app.zod.ts:122) has nine members:The
### Navigation Item Typessection ofskills/objectstack-ui/SKILL.mddocuments seven.actionandcomponenthave no row, and neither appears anywhere else in that section.This is the flight ⑧ class exactly — a live schema member with no doc row, in an enumeration a reader has every reason to take as complete (the heading names the catalog, and the other seven are there). An AI author reading this catalog cannot reach either variant.
Reproduce
prints
navigation-item-types: ... GAP 2: action, component. Before that lands:Disposition once fixed
The gap is recorded in
scripts/skill-identifier-liveness-ledger.jsonunderleg2Gaps.navigation-item-types. That ledger is shrink-only: when the two rows are written, the gate reports the improvement and asks fornode scripts/check-skill-identifier-liveness.mjs --update, which prunes the entry. Adding the rows without running--updateleaves budget behind — the gate says so and names the command.Two things a fix should check, because the gate cannot: whether
childrenis legal on either variant (NAV_VARIANTS_ACCEPTING_CHILDRENisobjectandgrouponly), and what each variant's required properties are. This gate catches existence, never semantics.Part of #13658.