-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Component Hardening Protocol
Hardening takes a shipped component and asks: is this correct, complete, and polished?
Most of this page moved. The checks that used to live here are now Component Audit Rubric — it owns what is checked, how it is verified, how severe a failure is, and how it scores. The scope rules (what counts as a hardening fix versus new capability, when an API change is allowed, and how naming disputes route) moved to Component Lifecycle §When Findings Route Back.
What is still only here is Layer 3: the human design review and its form. That is this page's job now.
| Layer | Executor | What it does | Where it lives |
|---|---|---|---|
| 1. Automated audit | the nightly pass | Convention checks — tokens, naming, theming, a11y contracts, exports |
Component Audit Rubric, the auto and semi items |
| 2. Bug & visual fixes | agent + human review | Visual bugs, state coverage gaps, edge cases, internal consistency | Component Audit Rubric §4, §5 |
| 3. Design review | human, with preparation | Proportions, interaction feel, composition quality, visual polish | this page |
Layers 1 and 2 should not need human attention: automate what is objective, fix what is clearly wrong, and escalate only what genuinely needs an eye.
- Matching another design system. Astryx is forward-looking; another system's behaviour is research input for the spec loop, not a hardening issue.
- Adding features. Missing states, new props, new sub-components — those go through the Component Specification Protocol.
- System-level design changes. Motion, edge compensation, spacing algorithms affect every component and need their own spec. Once settled they become a convention page the rubric cites, which is how the automated layers grow.
Visual judgment from a human. Prepare the form, a human fills it out.
Layer 3 is scoped to visual and interaction quality. It does not cover naming, API shape, or whether a prop should exist — those are engineering and spec concerns.
The rubric's §5b grades the same territory from screenshots; this form is how a human records the call and routes what they find. Run it after Layers 1 and 2 are done, with the screenshots §5b already required.
Does this look right on its own terms — not compared to any reference, but as a standalone component?
Proportions — sizes, spacing, typography feel balanced?
- Looks right
- Adjust: _______________
Interactive states — hover, focus, active, disabled feel visually distinct?
- States feel right
- Adjust: _______________ (which state, what feels off)
Density — appropriately compact or spacious for its use case?
- Good density
- Too dense / too spacious: _______________
Does this play well with the rest of the system?
Inside Dialog:
- Works well / [ ] Issue: _______________ / [ ] N/A
Inside Table:
- Works well / [ ] Issue: _______________ / [ ] N/A
Inside Card / Layout:
- Works well / [ ] Issue: _______________
With other components:
- Composes cleanly / [ ] Issue: _______________
Did anything come up that's NOT a hardening fix?
- No — everything is within hardening scope
- Yes — filing spec issue(s) for:
-
- Naming concern — queue vibe test for:
-
- Prepare it after Layers 1 and 2 are complete, pre-filling what can be pre-filled: the composition contexts the stories cover, the states that apply, and the §5b screenshots.
- A human fills it out — boxes ticked, brief notes where adjustment is needed.
- Process the answers: "Adjust" items become Layer 2 fixes; "Naming concern" items go to the vibe-test queue; "Spec issue" items are filed against the Component Specification Protocol.
- Archive the form in the hardening issue as the record of what was decided — Component Audit Rubric L9 looks for it there.
The long-term goal is to push Layers 1 and 2 toward full automation. Layer 3 stays human — that is the point.
| Check | Current | Target |
|---|---|---|
| Token usage | the nightly pass | CI check on every PR |
| themeProps | the nightly pass | CI check on every PR |
| Prop/type naming | the nightly pass | ESLint rule |
| State coverage | manual checklist | Storybook interaction tests |
| Visual regression | manual — no VRT suite exists | Playwright or Chromatic VRT |
| A11y contracts | axe in the pr-a11y job, static DOM only |
keyboard and focus behaviour too |
| Keyboard nav | manual + user-event unit tests |
Playwright keyboard tests |
Story play: coverage |
104 of 165 top-level story files | every interactive component |