← Sketches · the native app program

The scorecard

c1352026-11-10

Every layer component against Mark's five checks, with its cousins and its resolution.

Source: c135 initial-prompt.md (Mark's five checks, in his order); c135 plan.md §The scorecard, §Resolution strategies, D1–D8 (D8 revised 2026-11-09: the waiting-list extractions happen now); brand/component_philosophy.md (the eight principles the checks measure against); qdash ui/LAYER-CANDIDATES.md (the waiting list); app/data/component-registry.ts (the names). The cell values are illustrative.

The five checks

modular · clean · documented · shaped · docs page. Mark's, in his order; one row per component, generated by a script, kept as a living page.

The catalog

23 groups, about 250 components, 193 demos with adminProps; released by tag (v0.9.37). Measured, not rebuilt.

The waiting list

StateEmpty, JsonTree, StatTile, Panel, Spark, BarList, Attention*, SkeletonRows and more, staged in qdash. Extracted now, ahead of their groups (D8).

The Opus track's 59 fixes

UxIcon id, a danger tone on UxPill, a logo-only AgentAvatar, highlight.js optimizeDeps. Merged into the census at Phase 1.

ComponentModularCleanDocumentedShapedDocs pageCousinsResolution
UxButtonux · every consumerpassespassesno doc comments on propspassespassesUxIconBtn, UxAddBtnkeep
UxPillux · every consumerpassespassesno doc commentspassesno danger tone (Opus list)UxTag, UxBoxTagkeep; UxBoxTag merges into it, alias two releases
DataTabledata · qdash, designpassesone arbitrary valueslots undocumentedpassesno state port; flavors not harvestedUxTableListkeep both, with a note: dense and roomy
DataMetricValuedata-metric family · qdash, designpassespassesno doc commentspassespassesDataStat, DataVal, DataCardmerge DataStat and DataVal into the family; alias and deprecate
DataSparkChartOlddata · no consumer in the scannot assessedhex colorsnonenot assessedpassesDataSparkChartretire, after the scan confirms
FilterTriggerBarfilter · qdash, designpassespassesemits undocumentedpassespassesDataListingBar (contains it); the filter-old groupkeep; retire filter-old
NavVerticalSubmenunav · qdashpassesprovisional subGap propno doc commentspassespasses—keep; drop subGap
StateEmptywaiting list → DataStateEmptynot assessednot assessednot assessednot assessednot assessedFilterNoMatches; the #empty slotsextract now
JsonTreewaiting list → DataJsonTreenot assessednot assessednot assessednot assessednot assessedUxCodeBlockextract now
StatTilewaiting list → DataStatTilenot assessednot assessednot assessednot assessednot assessedDataStat, DataMachineMicroextract now; joins the DataStat merge
Six ways to resolve a duplicate or a cousin
1Merge

two components show the same thing with different props: one survives, the other becomes an alias that warns

2Split

one component carries two purposes: a prop that changes what it is

3Alias and deprecate

consumers cannot move in one release; two minor releases, a console warning, a note (D3)

4Retire

no consumer uses it and no pattern needs it; checked against the scan, not memory

5Extract

qdash staged a library-grade piece the layer lacks; the waiting lists, now (D8)

6Keep

with a note when the overlap is deliberate: a dense and a roomy variant a pattern documents

Group order (D1): the most used first, one release per group (D7)
ux

interactive, display, feedback

data

table, data-metric, data-machine

filter · nav · layout

the page furniture

form

inputs, selects, save bars

domain groups

actor, agent, policy, compliance, security, …; each shows a qdash flavor or is a retire candidate (D4)

icon · typography · prose

last; the least churn

passes the checkwork leftnot assessed yet (still in qdash)extracted from qdash now (D8)the five checks
The problem
The layer grew with the work, c92 through c128: duplicates and near cousins, shapes that predate the component philosophy, code without annotation, docs pages that show one default where the dashboard uses five flavors. The control plane web app (c134) will stand on this layer for years and starts from a blank slate, so the layer must already hold what it needs.
The core idea
Measure before changing. Every component gets one row against the five checks, plus who uses it, which cousins it overlaps and one of six resolutions; the census is ruled with Mark, then the groups are brought to five passes in D1's order, one release each. The cells above are illustrative: the script fills the real ones in Phase 0.
What is open
Release cadence during the cleanup, per group or fewer and larger (question 2); which families Mark already knows are duplicates, so the census starts from his list (question 4); the annotation lint's exact rule, written after the first group passes (D6).

Qpoint Brand Style Guide