5.8 KiB
T07 — Styling Stabilization QA Pass
Date: 2026-03-28
Task: T07 — Stabilization QA Pass
Scope: QA review of T02–T06 outcomes in recipe-manager/frontend
What was reviewed
Read docs:
.harness/styling-stabilization-execution-board.md.harness/docs/styling-inventory.md.harness/docs/styling-token-contract.md.harness/docs/ui-primitive-contract.md.harness/docs/styling-governance.md.harness/docs/t05-legacy-style-debt-cleanup.mddocs/visual-audit/after/homepage-qa-note-t04.md
Inspected implementation surfaces:
src/styles/tokens.csssrc/theme.tssrc/index.csssrc/components/ui/primitives.tsxsrc/App.tsxsrc/components/MissionControlPanel.tsxsrc/pages/RecipeListPage.tsxsrc/pages/CookModePage.tsxsrc/pages/ImportUrlPage.tsxsrc/components/RecipeCard.tsxsrc/components/Toast.tsxsrc/components/ErrorBoundary.tsxsrc/pages/NotFoundPage.tsxscripts/style-guardrails.mjsfrontend/package.json
Validation commands:
npm run style:guardrails✅ passnpm run build✅ passnpm run lint❌ fails (pre-existing non-styling issues; see findings)- grep scan for raw palette utilities in app/page/component surfaces
QA findings by severity
High
- Known drift still present in unguarded surfaces (
ErrorBoundary,NotFoundPage)src/components/ErrorBoundary.tsxstill uses raw Tailwind palette utilities (bg-gray-*,text-gray-*,bg-blue-*,text-red-*).src/pages/NotFoundPage.tsxstill uses raw palette (text-gray-*,bg-blue-*).- Risk: these are user-visible shell/error states and create immediate visual inconsistency with tokenized surfaces.
Medium
-
Guardrail scope is still too narrow for current stabilized claims
- Current
style:guardrailsonly enforces:src/App.tsxsrc/components/MissionControlPanel.tsxsrc/components/ui/primitives.tsx
- High-drift but now partially stabilized files (e.g.,
RecipeListPage,ImportUrlPage,CookModePage,RecipeCard) are not protected yet.
- Current
-
Residual non-token palette usage remains in otherwise stabilized pages/components
src/pages/RecipeListPage.tsx: hero overlay gradient usesfrom-slate-900.../via-slate-900....src/components/RecipeCard.tsx: card image overlay usesfrom-slate-950.../via-slate-900....src/components/Toast.tsx: close button hover useshover:text-gray-200.- These are limited, but they are still direct palette leakage.
-
Release hygiene risk: lint gate is red
npm run lintfails due to existing React/TS lint errors inApp.tsx,CookModePage.tsx,RecipeDetailPage.tsx,api.ts,types/api-aux.ts.- Not strictly a styling blocker, but it weakens governance confidence and CI-readiness.
Low
theme.tsstill contains non-token hex values inrecipeAccentPalette- Most token drift was eliminated correctly, but this transitional array still includes raw hex values.
- This is documented as an exception in T02; low-risk but still outside ideal contract purity.
What is now considered stabilized
- Token source authority:
tokens.cssis effectively canonical;theme.tsnow primarily references CSS vars instead of duplicating hardcoded token values. - Primitive layer exists and is adopted:
UiPage,UiSection,UiCard,UiButton,UiChip,UiBadge,cn()are implemented and used in key shell/surface paths. - App shell conversion landed:
App.tsxnow follows tokenized/primitive-aligned styling patterns. - Mission Control conversion landed:
MissionControlPanel.tsxmoved onto tokenized primitive usage. - Legacy cleanup landed:
src/App.cssremoved; legacy.cardalias removed fromindex.css. - Governance baseline landed: written governance + runnable guardrail command in package scripts.
What still needs work
-
Close remaining obvious drift surfaces
- Convert
ErrorBoundaryandNotFoundPageto tokenized/primitive patterns.
- Convert
-
Finish palette cleanup on media overlays/edge controls
- Replace remaining
slate-*/gray-*utility references inRecipeListPage,RecipeCard, andToastwith semantic tokens.
- Replace remaining
-
Expand guardrail coverage in phases
- Add stabilized pages/components to
scripts/style-guardrails.mjsscope incrementally (start withNotFoundPage,ErrorBoundary,RecipeListPage,RecipeCard,Toast).
- Add stabilized pages/components to
-
Address lint debt to improve release confidence
- Resolve outstanding lint errors (especially
react-hooks/set-state-in-effectand explicitanyviolations) so governance checks can become stronger CI gates.
- Resolve outstanding lint errors (especially
-
Optional contract hardening
- Replace non-token hexes in
recipeAccentPalettewith token references.
- Replace non-token hexes in
Recommended next execution-board task
T08 (new): Guardrail Scope Expansion + Residual Drift Cleanup
Proposed scope:
- Convert
ErrorBoundary+NotFoundPageto tokenized primitives. - Remove remaining raw palette classes in
RecipeListPage,RecipeCard,Toast. - Expand
style:guardrailsfile scope to include these surfaces. - Keep changes low-risk and styling-only.
If no new task id is allowed, treat this as T07 follow-on patch set before final signoff.
Release gate status (from execution board)
- One canonical token source with no major CSS/TS drift
- Base primitives centralized and used across high-traffic surfaces
- [~] No new ad-hoc color classes outside tokenized set (mostly true, residual exceptions remain)
- Legacy scaffold artifacts removed/documented
- Governance doc + guardrail command exist
Overall: Near-stable, not fully closed due to residual palette drift and narrow guardrail scope.
Ready for review
Yes (with follow-on cleanup required before final “fully stabilized” signoff).