The P0 instrument of docs/plan/47-showcase-execution.md: every kit value
export, where the gallery shows it, whether nav reaches it, and how many files
import it in each consuming app. Ruling D8 (doc 44 §Rulings) sets the target:
the uncovered-export count falls pass over pass and ends at zero. Measured
against kit 0.2.2 as of 2026-08-20 (see the P5 pass-log row below); the
prior freeze at kit 0.0.25 is retired.
Headline#
- 108 value exports (kit 0.2.2)
- 95 appear on at least one gallery page · 12 uncovered beyond one
standing exception:
Toastsis the mount-once host (a second mount would double the toaster), shown mounted in the shell and documented on the toast page. Of the 12: three are a regression from the 0.0.25 ledger, where they were covered and are not now (ConfirmModalIdwas on the modal page,formatDateTimeandformatRelativeTimewere on the timestamp page); nine are new-since-0.0.25 surface that never got a gallery demo (DEFAULT_LOCALE,RequiredMark,SCHEMA_FORM_FORMATS,X_KEYS,X_TIERS,X_WIDGETS,X_WIDTHS,formatCompactDateTime,lintSchema). See Reading notes for detail. - Nav runs on two complete surfaces. The index cards and the gallery sidebar
each link all 43 component pages, registry-verified:
COMPONENT_GROUPSinshowcase-registry.tshas exactly one entry perapp/components/*directory, with no orphans either direction. The patterns index and sidebar each link all 27 pattern pages (PATTERN_GROUPS, same one-to-one check)./chip-compareand/toolbar-comparenow live as ordinary component pages underapp/components/rather than top-level routes. No unlinked routes remain.
Pass log#
| Pass | Uncovered exports | Note |
|---|---|---|
| P0 baseline | 41 | gate-corrected counts (see the P0 validation report) |
| P2 | 41 | 13 pattern pages + D5 reorder; pattern pages demo composites, not export coverage, so the count moves in P1. Gate PASS-WITH-NOTES, 1 major fixed (see the P2 validation report) |
| P1 | 0 (+1 exception) | 9 new component pages, 8 grown pages, nav completed on both component surfaces; gallery redefined to include app/patterns |
| P3 | 0 (+1 exception) | chip-compare graduated (nav-linked, species section, lg-frame ruling in place); /toolbar-compare added; the orphan-route note below is resolved |
| P4 | 0 (+1 exception) | 97 rendered em dashes swept from 34 files; empty-value placeholder glyphs became hyphens (owner may sanction the em-dash glyph back) |
| P5 (re-derivation) | 12 (+1 exception) | Re-run against kit 0.2.2, replacing the 0.0.25 freeze. Export count grew 94 to 108: seven new components (Breadcrumbs, Kicker, Markdown, CodePill, plus SchemaForm and its lintSchema/X_*/SCHEMA_FORM_FORMATS vocabulary, InputContainer's sibling RequiredMark) and one route reshuffle (chip-compare and toolbar-compare moved from top-level routes into app/components/). All 43 component and 27 pattern directories still have exactly one nav entry each; the P3 "no orphans" result holds. Of the 12 uncovered: 3 are a regression (ConfirmModalId, formatDateTime, formatRelativeTime were covered at 0.0.25 and are not now); 9 are new-since-0.0.25 surface never demoed (DEFAULT_LOCALE, formatCompactDateTime, RequiredMark, lintSchema, X_WIDGETS, X_WIDTHS, X_TIERS, X_KEYS, SCHEMA_FORM_FORMATS) |
Re-derivation method#
Manual per pass; the check script stays proposal-only (owner ruling). To re-derive:
- Export list. Value exports of
packages/ui/src/index.tspluspackages/ui/src/table/index.ts. Skipexport typelines and inlinetypespecifiers;X as Ycounts as Y. Dedup is still required even thoughindex.tsno longer reaches the table barrel viaexport *: it names each of the 26 table exports directly instead (export { Table, col, Pager, ... } from "./table"), soindex.tsalready contains the full union on its own at 108, and the naive 108 + 26 sum over-counts by exactly those 26 shared names. - Counting rule. A file counts once per export when it contains a
runtime
import { ... } from "@versable-git/ui"naming it. Type-only imports do not count. Strip comments before matching (line and block comments, string-aware): per-line inspection is not sufficient. The trees hold three fully-commented dead import blocks today (speedwayroutes/workspaces/files.tsx,routes/workspaces/select.tsx, and the single-line form atroutes/workspaces/new.tsx:40) plus an inline comment inside live import braces (speedwayroot.tsx:26) whose comma breaks naive comma-splitting; all four are handled only by real comment stripping. Dynamicimport("@versable-git/ui"), namespace (import * as), andrequire()forms exist nowhere today; the rule assumes brace imports and must be revisited if one appears. - Trees. Gallery = every immediate subdirectory of
apps/playground/src/app/components/(chip-compare and toolbar-compare moved in from top-level routes at some point after 0.0.25 and count the same as any other component directory now) plus every immediate subdirectory ofapp/patterns/(pattern pages are showcase surface; their slugs print aspatterns/<slug>), exceptapp/components/layout.tsx,app/components/page.tsx,app/patterns/layout.tsx,app/patterns/page.tsx, andapp/patterns/pattern-shell.tsx(chrome and shared per-pattern wrapper, an AppShell/Card/CodeBlock consumer) which count as shell. Demo =app/demoplusapp/shell-demoplusapp/(admin)/demo/admin(a new full-app admin demo added after 0.0.25, folded into Demo per its name and shape rather than Shell). Shell = the rest of the playground, including the newapp/docs/doc-browser tree (also new since 0.0.25 and not a component/pattern gallery surface). walmart =walmart-mvp/frontend/src. speedway =speedway/app(sibling checkouts of this repo). - Nav. Four arrays over three surfaces: the index
groups(apps/playground/src/app/page.tsx), the gallery sidebarnav(apps/playground/src/app/components/layout.tsx), and the patterns index + sidebar (app/patterns/page.tsx,app/patterns/layout.tsx). Nav column: both = index and gallery sidebar; +pat = also on a patterns surface; patterns = patterns surfaces only.
Context for reading the walmart column: that app runs two cohorts (kit-adopted
pages and a legacy shadcn-style cohort under components/ui/); legacy files
import local components, so they cannot inflate these counts.
Columns#
Export · gallery pages whose page.tsx imports it at runtime · nav reach of those pages (both = index and gallery sidebar; +pat = also on a patterns surface; patterns = patterns surfaces only; n/a = no gallery page) · demo-route files importing it ("+N shell" = shell files outside gallery and demo) · walmart importer files · speedway importer files.
| Export | Gallery pages | Nav | Demo | walmart | speedway |
|---|---|---|---|---|---|
| Card | alert, app-shell, breadcrumbs, button, card, chip, chip-compare, copy-button, data-table, dropdown, dropzone, empty-state, facet-bar, hooks, identity, inline-edit, internals, kicker, list-item, markdown, menus-and-pickers, modal, page-info, page-states, page-title, side-panel, spinner, stat-tile, table, table-hooks, tabs, toast, toolbar-compare, typography, patterns/attribute-spec-grid, patterns/auth-card-shell, patterns/boot-skeletons, patterns/bulk-selection-bar, patterns/compact-dropzone, patterns/confirm-and-report, patterns/entrance-cards, patterns/module-attribute-normalization, patterns/module-content-generation, patterns/module-image-generation, patterns/module-part-type-matching, patterns/peek-panel, patterns/recent-activity-feed, patterns/shape-matched-skeleton, patterns/split-cards, patterns/top-loading-bar, patterns/typography-composites | both+pat | 16 (+11 shell) | 13 | 28 |
| Button | alert, app-shell, breadcrumbs, button, chip, chip-compare, code-block, data-table, dropdown, dropzone, field-chip, hooks, icon, input, kicker, menus-and-pickers, modal, page-info, page-states, page-title, schema-form, select, spinner, status, timestamp, toolbar-compare, tooltip, typography, patterns/account-menu, patterns/auth-card-shell, patterns/boot-skeletons, patterns/bulk-selection-bar, patterns/confirm-and-report, patterns/entrance-cards, patterns/job-title, patterns/member-row-inline-role, patterns/module-attribute-normalization, patterns/module-content-generation, patterns/module-image-generation, patterns/module-part-type-matching, patterns/page-title-variants, patterns/peek-panel, patterns/recent-activity-feed, patterns/searchable-attach-list, patterns/shape-matched-skeleton, patterns/split-cards, patterns/top-loading-bar, patterns/typography-composites, patterns/workflow-stepper | both+pat | 15 (+14 shell) | 14 | 34 |
| Input | app-shell, chip, chip-compare, field-chip, icon, input, kicker, modal, spinner, toolbar-compare, tooltip, patterns/auth-card-shell, patterns/peek-panel, patterns/searchable-attach-list | both+pat | 2 (+1 shell) | 6 | 14 |
| InputContainer | input | both | 0 | 0 | 0 |
| RequiredMark | NONE | n/a | 0 | 0 | 0 |
| Select | chip, chip-compare, dropzone, menus-and-pickers, modal, schema-form, select, spinner, toolbar-compare, patterns/member-row-inline-role | both+pat | 5 | 5 | 7 |
| StatusPill | button, chip, code-block, data-table, field-chip, icon, page-title, status, table, tabs, tooltip, typography, patterns/account-menu, patterns/job-title, patterns/member-row-inline-role, patterns/page-title-variants, patterns/peek-panel, patterns/typography-composites | both+pat | 16 (+1 shell) | 8 | 9 |
| StatusDot | status, patterns/recent-activity-feed | both+pat | 3 (+1 shell) | 1 | 0 |
| CodePill | status | both | 0 | 0 | 0 |
| CodeBlock | code-block, modal, schema-form, typography | both | 0 (+3 shell) | 3 | 1 |
| Chip | chip, chip-compare, data-table, dropdown, hooks, icon, internals, schema-form, spinner, table, toolbar-compare, typography, patterns/module-part-type-matching | both+pat | 8 (+2 shell) | 4 | 8 |
| FieldChip | chip-compare, field-chip, patterns/attribute-spec-grid, patterns/file-chip | both+pat | 1 | 1 | 6 |
| Alert | alert, menus-and-pickers, typography, patterns/auth-card-shell, patterns/typography-composites | both+pat | 7 (+3 shell) | 4 | 11 |
| PageTitle | breadcrumbs, button, icon, page-title, spinner, patterns/boot-skeletons, patterns/job-title, patterns/page-title-variants, patterns/typography-composites | both+pat | 18 (+3 shell) | 9 | 17 |
| Markdown | markdown, patterns/peek-panel | both+pat | 0 (+1 shell) | 0 | 0 |
| Breadcrumbs | breadcrumbs | both | 2 (+3 shell) | 0 | 0 |
| ListItem | icon, list-item, modal | both | 0 (+2 shell) | 0 | 0 |
| SidePanel | side-panel, patterns/peek-panel | both+pat | 0 | 0 | 1 |
| Timestamp | modal, timestamp, patterns/peek-panel, patterns/recent-activity-feed | both+pat | 6 (+1 shell) | 4 | 13 |
| formatDateTime | NONE | n/a | 0 | 1 | 0 |
| formatRelativeTime | NONE | n/a | 0 | 0 | 0 |
| formatCompactDateTime | NONE | n/a | 0 | 0 | 0 |
| DEFAULT_LOCALE | NONE | n/a | 0 | 0 | 0 |
| IdentityRow | app-shell, identity, patterns/account-menu, patterns/confirm-and-report, patterns/member-row-inline-role, patterns/typography-composites | both+pat | 3 (+1 shell) | 2 | 1 |
| WorkspaceSwitcher | app-shell, identity | both | 1 (+1 shell) | 1 | 0 |
| Kicker | kicker, typography, patterns/entrance-cards, patterns/shape-matched-skeleton, patterns/typography-composites | both+pat | 1 (+3 shell) | 0 | 0 |
| StatTile | icon, kicker, spinner, stat-tile, tooltip, typography, patterns/dashboard-stats | both+pat | 6 (+2 shell) | 2 | 2 |
| PageInfo | page-info | both | 2 (+1 shell) | 7 | 0 |
| EmptyState | empty-state, icon, page-states, table, patterns/module-image-generation, patterns/recent-activity-feed, patterns/searchable-attach-list, patterns/typography-composites | both+pat | 0 | 2 | 12 |
| PageLoading | page-states | both | 0 | 0 | 0 |
| PageError | page-states | both | 0 | 9 | 0 |
| ListState | page-states | both | 0 | 0 | 0 |
| Modal | modal | both | 1 (+1 shell) | 4 | 7 |
| ModalTitle | modal | both | 1 | 4 | 7 |
| ModalFooter | modal | both | 1 | 1 | 1 |
| ConfirmModal | modal, patterns/confirm-and-report, patterns/member-row-inline-role | both+pat | 2 | 4 | 3 |
| ConfirmModalId | NONE | n/a | 0 | 0 | 0 |
| useModal | modal, patterns/confirm-and-report, patterns/member-row-inline-role | both+pat | 3 (+1 shell) | 9 | 10 |
| selectedModalId | modal | both | 0 | 0 | 0 |
| selectedModalKey | modal | both | 0 | 0 | 0 |
| selectedModalArgs | modal | both | 0 | 0 | 0 |
| Toasts | NONE | n/a | 0 (+1 shell) | 1 | 1 |
| pushAlert | alert, button, dropzone, inline-edit, modal, spinner, toast, patterns/bulk-selection-bar, patterns/confirm-and-report, patterns/member-row-inline-role, patterns/searchable-attach-list, patterns/typography-composites | both+pat | 16 | 8 | 15 |
| useAlertToast | toast | both | 0 | 0 | 0 |
| IconFor | side-panel | both | 0 (+2 shell) | 1 | 20 |
| IconKeyList | icon | both | 0 | 0 | 0 |
| RenderIcon | app-shell, chip-compare, dropdown, dropzone, field-chip, icon, input, toolbar-compare, tooltip, patterns/account-menu, patterns/auth-card-shell, patterns/entrance-cards, patterns/file-chip, patterns/page-title-variants, patterns/part-identity, patterns/peek-panel, patterns/split-cards, patterns/workflow-stepper | both+pat | 2 (+8 shell) | 8 | 0 |
| LoadingIcon | icon | both | 0 | 0 | 0 |
| Tabs | app-shell, modal, tabs, patterns/account-menu, patterns/auth-card-shell, patterns/compact-dropzone, patterns/dashboard-stats, patterns/peek-panel, patterns/recent-activity-feed | both+pat | 0 (+1 shell) | 1 | 4 |
| Tooltip | app-shell, dropzone, icon, status, tooltip, typography, patterns/attribute-spec-grid, patterns/bulk-selection-bar, patterns/job-title, patterns/member-row-inline-role, patterns/part-identity | both+pat | 0 | 11 | 11 |
| Dropdown | dropdown, menus-and-pickers, toolbar-compare, patterns/account-menu | both+pat | 0 (+1 shell) | 2 | 5 |
| Spinner | spinner | both | 0 | 4 | 1 |
| Skeleton | spinner, patterns/boot-skeletons, patterns/shape-matched-skeleton | both+pat | 0 | 9 | 1 |
| SkeletonGroup | spinner, patterns/searchable-attach-list | both+pat | 0 | 20 | 0 |
| Progress | dropzone, spinner, patterns/module-attribute-normalization | both+pat | 6 (+1 shell) | 2 | 3 |
| Table | chip, icon, modal, spinner, status, table, tooltip, patterns/bulk-selection-bar, patterns/module-content-generation, patterns/peek-panel | both+pat | 7 | 1 | 8 |
| col | modal, spinner, table | both | 0 | 1 | 0 |
| Pager | table | both | 0 | 0 | 0 |
| useTableSort | table-hooks | both | 0 | 0 | 0 |
| useTableSearch | table-hooks | both | 0 | 0 | 0 |
| useTableFilters | table-hooks | both | 0 | 0 | 0 |
| useTableSelection | data-table, table-hooks, patterns/bulk-selection-bar | both+pat | 0 | 1 | 1 |
| useTablePagination | table-hooks | both | 0 | 0 | 0 |
| paginationMeta | table-hooks | both | 0 | 0 | 0 |
| useColumnVisibility | table-hooks | both | 0 | 0 | 0 |
| useDataTable | data-table | both | 0 | 4 | 9 |
| noopSyncAdapter | table-hooks | both | 0 | 0 | 0 |
| DataTable | data-table, modal | both | 7 | 6 | 10 |
| RowMenu | data-table | both | 0 | 0 | 1 |
| SelectionCell | data-table, patterns/bulk-selection-bar | both+pat | 0 | 1 | 1 |
| SelectAllCell | data-table, patterns/bulk-selection-bar | both+pat | 0 | 1 | 1 |
| SelectionCheckbox | data-table | both | 0 | 0 | 0 |
| FilterBar | table-hooks | both | 0 | 0 | 0 |
| FacetBar | chip-compare, data-table, facet-bar, menus-and-pickers, status, toolbar-compare | both | 0 | 0 | 0 |
| FilterableCell | data-table, facet-bar, status | both | 0 | 0 | 0 |
| facetTooltip | facet-bar | both | 0 | 0 | 0 |
| TableSkeleton | table, patterns/boot-skeletons | both+pat | 0 | 0 | 0 |
| ToolbarSkeleton | table | both | 0 | 0 | 0 |
| renderDate | table | both | 0 | 0 | 0 |
| renderLink | table | both | 0 | 0 | 0 |
| renderCode | table | both | 0 | 0 | 0 |
| AppShell | app-shell | both | 2 (+3 shell) | 1 | 0 |
| Sidebar | app-shell, patterns/sidebar-anatomy | both+pat | 0 | 0 | 1 |
| Topbar | app-shell | both | 0 | 0 | 0 |
| Dropzone | dropzone, icon, page-info, patterns/compact-dropzone | both+pat | 2 | 1 | 1 |
| CopyButton | copy-button, patterns/job-title, patterns/peek-panel | both+pat | 1 (+2 shell) | 2 | 1 |
| InlineEdit | inline-edit | both | 0 | 0 | 3 |
| useKeyPress | hooks | both | 0 (+1 shell) | 0 | 0 |
| useDebounce | hooks, input | both | 0 | 0 | 0 |
| useLocalStorage | hooks | both | 0 | 0 | 1 |
| useSessionStorage | hooks | both | 0 | 0 | 0 |
| useNavHijack | hooks | both | 0 | 0 | 0 |
| useDisabledReason | hooks, tooltip | both | 0 | 0 | 0 |
| renderNode | internals | both | 0 | 0 | 0 |
| renderMarkdownLite | internals | both | 0 | 0 | 0 |
| accentStyle | internals, table | both | 4 | 0 | 0 |
| accentClass | internals | both | 0 | 0 | 0 |
| useAsyncAction | internals | both | 0 | 0 | 0 |
| PortalId | internals | both | 0 | 0 | 0 |
| getPortalRoot | internals | both | 0 | 0 | 0 |
| SemanticColorList | internals | both | 0 | 0 | 0 |
| SchemaForm | schema-form, patterns/module-attribute-normalization, patterns/module-content-generation, patterns/module-image-generation, patterns/module-part-type-matching | both+pat | 0 | 0 | 0 |
| lintSchema | NONE | n/a | 0 | 0 | 0 |
| X_WIDGETS | NONE | n/a | 0 | 0 | 0 |
| X_WIDTHS | NONE | n/a | 0 | 0 | 0 |
| X_TIERS | NONE | n/a | 0 | 0 | 0 |
| X_KEYS | NONE | n/a | 0 | 0 | 0 |
| SCHEMA_FORM_FORMATS | NONE | n/a | 0 | 0 | 0 |
Reading notes#
- Zero unmatched imports, all three trees: every runtime kit import in the playground, walmart, and speedway resolves to a current export. Nothing imports a name the kit has dropped, despite speedway's lockfile pinning 0.0.14.
- Toasts is the one standing exception: mounted once in the shell
(
apps/playground/src/app/layout.tsx:18), documented on the toast page's host card, never counted as covered by the mechanical rule. - Sidebar now reaches the gallery both ways: the app-shell component page imports it directly and the sidebar-anatomy pattern page carries its own usage card. At 0.0.25 it was patterns-only.
- /chip-compare and /toolbar-compare are ordinary component pages now, nav-linked from both component surfaces the same as any other export. No unlinked routes remain.
- The 12 uncovered exports, in two groups. Three regressed from the
0.0.25 ledger, where each was covered:
ConfirmModalIdhad a usage card on the modal page,formatDateTimeandformatRelativeTimewere imported directly on the timestamp page. All three now go undemoed; the timestamp page's five examples render through theTimestampcomponent alone, and the modal page no longer shows a rawConfirmModalIdusage. The other nine are surface the kit grew after 0.0.25 that never got a gallery demo: Timestamp'sDEFAULT_LOCALEandformatCompactDateTime, and SchemaForm's exported vocabulary (lintSchema,X_WIDGETS,X_WIDTHS,X_TIERS,X_KEYS,SCHEMA_FORM_FORMATS, plus Input's siblingRequiredMark). These nine are public API a consumer would import to validate or configure a schema, not something a gallery page necessarily renders on screen, but the P0 target still calls for demoing them. - The index-subtitle em dash was fixed when the style ledger fired on it; the P4 sweep still owns the class across all rendered copy.