Mechanical rename produced by scripts/msd-rename.cjs: gsd/Gsd/GSD -> msd/Msd/MSD across contents and paths, upstream package/repo coordinates -> @golem15/msd-core and golem15com/msd-core. Deep links into upstream history, sibling upstream packages, the GSD-2 import feature, CHANGELOG.md and .changeset/ are kept as-is. Hand edits on top: MSD block-letter banner and logos, LICENSE copyright line, package/plugin identity, regenerated lockfile, install-tree fixtures, derived registries and benchmark baseline; migration checksum baseline re-locked (MSD keeps its own install state, so no install had applied the old sums); sort-order and regex-escaped expectations in tests adjusted.
5.7 KiB
UI-Consideration Probe — Spec-Completeness Reference
The third adapter of the shared probe-core resolution model (ADR-550 Decision 7), on
the UI element/state axis. It surfaces the shape-rooted UI state considerations a
UI-SPEC must resolve before a dimension may PASS — the visual analog of the requirement-side
edge-probe, reusing its exact lifecycle, validators, and plan-phase lift
(see edge-probe.md for the shared status×verification model — this doc does not re-argue it).
Axis boundary (this is a MIXED axis). This compiled taxonomy covers ONLY the finite, project-independent shape-rooted content/robustness states. The open, domain/UX-dependent considerations — real-time/offline/optimistic-UI, deep accessibility (WCAG breadth), internationalization / RTL depth, and emerging interaction paradigms — are open-ended and are prose-owned in the companion domain-probes.md technology/UX bank, NOT here. Forcing them into a closed compiled taxonomy is the wrong model.
Inputs
A list of UI elements, each a { id, text, text_en?, elements? } record where text is the
researcher-authored description, elements is an optional author-supplied override of the
element classification, and text_en is an optional English translation of text
(#4657). The element cues are English word-boundary patterns, so a non-English text (a
project running with response_language set) classifies to zero kinds unless text_en
carries a faithful English rendering — engine input, never user-facing output; text
itself keeps the UI-SPEC's own language and is never translated. The six element kinds are:
form, list-collection, nav, media, interactive-control, static-content. When
elements is absent, a heuristic classifier proposes kinds from the prose
(text_en ?? text, propose-then-confirm) — the author may correct the kind.
Taxonomy (8 categories)
Closed and small by design: the finite, project-independent content/robustness states every
UI surface must account for. Growth toward open UX topics happens in domain-probes.md, not by
bloating this closed core.
| id | name | applies to element kinds | consideration question |
|---|---|---|---|
| empty | Empty / no data | form, list-collection, media | What is shown when there is no data — zero items, an unfilled form, or absent media? |
| loading | Loading / in-flight | form, list-collection, media, nav, interactive-control | What is shown while data or content is still loading (skeleton, spinner, progressive reveal)? |
| error | Error / failure | form, list-collection, media, nav, interactive-control | What is shown when the load or submit fails (message, retry affordance, partial fallback)? |
| populated | Populated / happy path | list-collection, media | What does the normal populated (happy-path) state look like at a typical volume of content? |
| partial | Partial / incomplete | form, list-collection | What is shown for partial or incomplete data — some fields or rows present, others missing? |
| overflow | Overflow / truncation | list-collection, nav, static-content | What happens when content exceeds its container — scroll, clip, wrap, or truncate? |
| zero-one-many | Zero / one / many | list-collection | How does the layout read at zero, one, and many items (singular vs plural copy, spacing)? |
| long-text | Long text | form, static-content, interactive-control, nav | What happens with unusually long text — truncation, wrapping, ellipsis, or reflow? |
Relevance filter + resolution states
The probe reuses the edge-probe rails verbatim (ADR-550 Decision 7 — see edge-probe.md for the full model):
- Relevance filter first. Classify each element's kind(s), then raise only the categories
whose
applies to element kindsintersect. A static label is never asked about loading or empty state — that is what makes an unresolved consideration meaningful. - Dismissal requires a reason string. Silence is not a resolution; the reason is the audit trail.
- Zero-classification surfaces one
unclassifiedcandidate (#1110). An element whose prose matched no kind cue yields exactly one softunclassified — review manuallyitem (category: "unclassified",status: "unresolved") — never a silent drop, never a guessed kind.unclassifiedis a review signal, not a ninth taxonomy category; an explicitelements: []opt-out stays silent.
Each raised consideration carries the shared two orthogonal axes — status
(resolved | dismissed | unresolved) and, when resolved, a verification tier
(explicit | backstop). A backstop consideration lifts into must_haves.truths and, at
verify time, is confirmed only by explicit evidence (a wired held-out/property test) or routes
to insufficient_spec → human_needed — never a silent pass (the honest-verifier disposition,
#1154). See honest-verifier.md.
Closed / open boundary
The 8 ids above are the closed, compiled subset — finite and project-independent, so a
compiled taxonomy is legitimate (the same property that makes edge-probe's data-shape taxonomy
closed). The open subset is prose-owned in domain-probes.md:
real-time/offline/optimistic-UI, deep accessibility (WCAG breadth), i18n / RTL depth, and
emerging interaction paradigms (gesture/voice/reduced-motion/print) are open-ended and
cue-triggered — they do not belong in this closed taxonomy. This probe complements the
msd-ui-checker seven quality dimensions (it adds a state-coverage axis); it does not change the
BLOCK/FLAG/PASS enum or the dimensions themselves.