qualia-framework 2.5.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/CLAUDE.md +63 -0
  2. package/README.md +108 -30
  3. package/agents/builder.md +110 -0
  4. package/agents/planner.md +186 -0
  5. package/agents/qa-browser.md +186 -0
  6. package/agents/verifier.md +369 -0
  7. package/bin/cli.js +706 -417
  8. package/bin/install.js +622 -0
  9. package/bin/qualia-ui.js +284 -0
  10. package/bin/state.js +824 -0
  11. package/bin/statusline.js +252 -0
  12. package/docs/erp-contract.md +161 -0
  13. package/guide.md +63 -0
  14. package/hooks/auto-update.js +117 -0
  15. package/hooks/block-env-edit.js +52 -0
  16. package/hooks/branch-guard.js +68 -0
  17. package/hooks/migration-guard.js +83 -0
  18. package/hooks/pre-compact.js +52 -0
  19. package/hooks/pre-deploy-gate.js +149 -0
  20. package/hooks/pre-push.js +53 -0
  21. package/hooks/session-start.js +126 -0
  22. package/package.json +31 -17
  23. package/rules/design-reference.md +179 -0
  24. package/rules/frontend.md +126 -0
  25. package/rules/infrastructure.md +87 -0
  26. package/skills/qualia/SKILL.md +88 -0
  27. package/skills/qualia-build/SKILL.md +115 -0
  28. package/skills/qualia-debug/SKILL.md +87 -0
  29. package/skills/qualia-design/SKILL.md +99 -0
  30. package/skills/qualia-handoff/SKILL.md +66 -0
  31. package/skills/qualia-help/SKILL.md +60 -0
  32. package/skills/qualia-idk/SKILL.md +8 -0
  33. package/skills/qualia-learn/SKILL.md +111 -0
  34. package/skills/qualia-new/SKILL.md +323 -0
  35. package/skills/qualia-pause/SKILL.md +63 -0
  36. package/skills/qualia-plan/SKILL.md +101 -0
  37. package/skills/qualia-polish/SKILL.md +207 -0
  38. package/skills/qualia-quick/SKILL.md +37 -0
  39. package/skills/qualia-report/SKILL.md +114 -0
  40. package/skills/qualia-resume/SKILL.md +49 -0
  41. package/skills/qualia-review/SKILL.md +161 -0
  42. package/skills/qualia-ship/SKILL.md +90 -0
  43. package/skills/qualia-skill-new/SKILL.md +167 -0
  44. package/skills/qualia-task/SKILL.md +91 -0
  45. package/skills/qualia-test/SKILL.md +134 -0
  46. package/skills/qualia-verify/SKILL.md +113 -0
  47. package/templates/DESIGN.md +475 -0
  48. package/templates/help.html +476 -0
  49. package/templates/plan.md +42 -0
  50. package/templates/project.md +22 -0
  51. package/templates/state.md +27 -0
  52. package/templates/tracking.json +20 -0
  53. package/tests/bin.test.sh +687 -0
  54. package/tests/hooks.test.sh +384 -0
  55. package/tests/runner.js +1956 -0
  56. package/tests/state.test.sh +713 -0
  57. package/tests/statusline.test.sh +243 -0
  58. package/bin/collect-metrics.sh +0 -62
  59. package/framework/.claudeignore +0 -51
  60. package/framework/CLAUDE.md +0 -51
  61. package/framework/MCP_SETUP.md +0 -229
  62. package/framework/agents/architecture-strategist.md +0 -53
  63. package/framework/agents/backend-agent.md +0 -150
  64. package/framework/agents/code-simplicity-reviewer.md +0 -86
  65. package/framework/agents/frontend-agent.md +0 -111
  66. package/framework/agents/kieran-typescript-reviewer.md +0 -96
  67. package/framework/agents/performance-oracle.md +0 -111
  68. package/framework/agents/qualia-codebase-mapper.md +0 -761
  69. package/framework/agents/qualia-debugger.md +0 -1204
  70. package/framework/agents/qualia-executor.md +0 -882
  71. package/framework/agents/qualia-integration-checker.md +0 -424
  72. package/framework/agents/qualia-phase-researcher.md +0 -457
  73. package/framework/agents/qualia-plan-checker.md +0 -700
  74. package/framework/agents/qualia-planner.md +0 -1245
  75. package/framework/agents/qualia-project-researcher.md +0 -603
  76. package/framework/agents/qualia-research-synthesizer.md +0 -200
  77. package/framework/agents/qualia-roadmapper.md +0 -606
  78. package/framework/agents/qualia-verifier.md +0 -686
  79. package/framework/agents/red-team-qa.md +0 -130
  80. package/framework/agents/security-auditor.md +0 -72
  81. package/framework/agents/team-orchestrator.md +0 -229
  82. package/framework/agents/teams/framework-audit-team.md +0 -66
  83. package/framework/agents/teams/full-stack-team.md +0 -48
  84. package/framework/agents/teams/optimize-team.md +0 -53
  85. package/framework/agents/teams/review-team.md +0 -70
  86. package/framework/agents/teams/ship-team.md +0 -86
  87. package/framework/agents/test-agent.md +0 -182
  88. package/framework/hooks/auto-format.sh +0 -54
  89. package/framework/hooks/block-env-edit.sh +0 -42
  90. package/framework/hooks/branch-guard.sh +0 -43
  91. package/framework/hooks/confirm-delete.sh +0 -59
  92. package/framework/hooks/migration-validate.sh +0 -77
  93. package/framework/hooks/notification-speak.sh +0 -16
  94. package/framework/hooks/pre-commit.sh +0 -100
  95. package/framework/hooks/pre-compact.sh +0 -56
  96. package/framework/hooks/pre-deploy-gate.sh +0 -160
  97. package/framework/hooks/qualia-colors.sh +0 -32
  98. package/framework/hooks/retention-cleanup.sh +0 -62
  99. package/framework/hooks/save-session-state.sh +0 -185
  100. package/framework/hooks/session-context-loader.sh +0 -96
  101. package/framework/hooks/session-learn.sh +0 -32
  102. package/framework/hooks/skill-announce.sh +0 -123
  103. package/framework/hooks/tool-error-announce.sh +0 -27
  104. package/framework/install.ps1 +0 -323
  105. package/framework/install.sh +0 -313
  106. package/framework/qualia-framework/VERSION +0 -1
  107. package/framework/qualia-framework/assets/qualia-logo.png +0 -0
  108. package/framework/qualia-framework/bin/collect-metrics.sh +0 -67
  109. package/framework/qualia-framework/bin/generate-report-docx.py +0 -429
  110. package/framework/qualia-framework/bin/qualia-tools.js +0 -2201
  111. package/framework/qualia-framework/bin/qualia-tools.test.js +0 -1054
  112. package/framework/qualia-framework/references/checkpoints.md +0 -775
  113. package/framework/qualia-framework/references/completion-checklists.md +0 -359
  114. package/framework/qualia-framework/references/continuation-format.md +0 -249
  115. package/framework/qualia-framework/references/continuation-prompt.md +0 -97
  116. package/framework/qualia-framework/references/decimal-phase-calculation.md +0 -65
  117. package/framework/qualia-framework/references/design-quality.md +0 -56
  118. package/framework/qualia-framework/references/employee-guide.md +0 -167
  119. package/framework/qualia-framework/references/git-integration.md +0 -254
  120. package/framework/qualia-framework/references/git-planning-commit.md +0 -50
  121. package/framework/qualia-framework/references/model-profile-resolution.md +0 -32
  122. package/framework/qualia-framework/references/model-profiles.md +0 -73
  123. package/framework/qualia-framework/references/phase-argument-parsing.md +0 -61
  124. package/framework/qualia-framework/references/planning-config.md +0 -195
  125. package/framework/qualia-framework/references/questioning.md +0 -141
  126. package/framework/qualia-framework/references/tdd.md +0 -263
  127. package/framework/qualia-framework/references/ui-brand.md +0 -160
  128. package/framework/qualia-framework/references/verification-patterns.md +0 -612
  129. package/framework/qualia-framework/templates/DEBUG.md +0 -159
  130. package/framework/qualia-framework/templates/DESIGN.md +0 -81
  131. package/framework/qualia-framework/templates/UAT.md +0 -247
  132. package/framework/qualia-framework/templates/codebase/architecture.md +0 -255
  133. package/framework/qualia-framework/templates/codebase/concerns.md +0 -310
  134. package/framework/qualia-framework/templates/codebase/conventions.md +0 -307
  135. package/framework/qualia-framework/templates/codebase/integrations.md +0 -280
  136. package/framework/qualia-framework/templates/codebase/stack.md +0 -186
  137. package/framework/qualia-framework/templates/codebase/structure.md +0 -285
  138. package/framework/qualia-framework/templates/codebase/testing.md +0 -480
  139. package/framework/qualia-framework/templates/config.json +0 -35
  140. package/framework/qualia-framework/templates/context.md +0 -283
  141. package/framework/qualia-framework/templates/continue-here.md +0 -78
  142. package/framework/qualia-framework/templates/debug-subagent-prompt.md +0 -91
  143. package/framework/qualia-framework/templates/discovery.md +0 -146
  144. package/framework/qualia-framework/templates/lab-notes.md +0 -16
  145. package/framework/qualia-framework/templates/milestone-archive.md +0 -123
  146. package/framework/qualia-framework/templates/milestone.md +0 -115
  147. package/framework/qualia-framework/templates/phase-prompt.md +0 -567
  148. package/framework/qualia-framework/templates/planner-subagent-prompt.md +0 -117
  149. package/framework/qualia-framework/templates/project.md +0 -184
  150. package/framework/qualia-framework/templates/projects/ai-agent.md +0 -156
  151. package/framework/qualia-framework/templates/projects/mobile-app.md +0 -181
  152. package/framework/qualia-framework/templates/projects/voice-agent.md +0 -134
  153. package/framework/qualia-framework/templates/projects/website.md +0 -137
  154. package/framework/qualia-framework/templates/requirements.md +0 -231
  155. package/framework/qualia-framework/templates/research-project/ARCHITECTURE.md +0 -204
  156. package/framework/qualia-framework/templates/research-project/FEATURES.md +0 -147
  157. package/framework/qualia-framework/templates/research-project/PITFALLS.md +0 -200
  158. package/framework/qualia-framework/templates/research-project/STACK.md +0 -120
  159. package/framework/qualia-framework/templates/research-project/SUMMARY.md +0 -170
  160. package/framework/qualia-framework/templates/research.md +0 -552
  161. package/framework/qualia-framework/templates/roadmap.md +0 -206
  162. package/framework/qualia-framework/templates/state.md +0 -179
  163. package/framework/qualia-framework/templates/summary-complex.md +0 -59
  164. package/framework/qualia-framework/templates/summary-minimal.md +0 -41
  165. package/framework/qualia-framework/templates/summary-standard.md +0 -48
  166. package/framework/qualia-framework/templates/summary.md +0 -246
  167. package/framework/qualia-framework/templates/user-setup.md +0 -311
  168. package/framework/qualia-framework/templates/verification-report.md +0 -322
  169. package/framework/qualia-framework/workflows/add-phase.md +0 -179
  170. package/framework/qualia-framework/workflows/add-todo.md +0 -157
  171. package/framework/qualia-framework/workflows/audit-milestone.md +0 -241
  172. package/framework/qualia-framework/workflows/check-todos.md +0 -176
  173. package/framework/qualia-framework/workflows/complete-milestone.md +0 -858
  174. package/framework/qualia-framework/workflows/diagnose-issues.md +0 -219
  175. package/framework/qualia-framework/workflows/discovery-phase.md +0 -289
  176. package/framework/qualia-framework/workflows/discuss-phase.md +0 -534
  177. package/framework/qualia-framework/workflows/execute-phase.md +0 -559
  178. package/framework/qualia-framework/workflows/execute-plan.md +0 -438
  179. package/framework/qualia-framework/workflows/help.md +0 -470
  180. package/framework/qualia-framework/workflows/insert-phase.md +0 -220
  181. package/framework/qualia-framework/workflows/list-phase-assumptions.md +0 -178
  182. package/framework/qualia-framework/workflows/map-codebase.md +0 -327
  183. package/framework/qualia-framework/workflows/new-milestone.md +0 -363
  184. package/framework/qualia-framework/workflows/new-project.md +0 -982
  185. package/framework/qualia-framework/workflows/pause-work.md +0 -122
  186. package/framework/qualia-framework/workflows/plan-milestone-gaps.md +0 -256
  187. package/framework/qualia-framework/workflows/plan-phase.md +0 -422
  188. package/framework/qualia-framework/workflows/progress.md +0 -389
  189. package/framework/qualia-framework/workflows/quick.md +0 -252
  190. package/framework/qualia-framework/workflows/remove-phase.md +0 -326
  191. package/framework/qualia-framework/workflows/research-phase.md +0 -74
  192. package/framework/qualia-framework/workflows/resume-project.md +0 -306
  193. package/framework/qualia-framework/workflows/set-profile.md +0 -80
  194. package/framework/qualia-framework/workflows/settings.md +0 -145
  195. package/framework/qualia-framework/workflows/transition.md +0 -556
  196. package/framework/qualia-framework/workflows/update.md +0 -197
  197. package/framework/qualia-framework/workflows/verify-phase.md +0 -195
  198. package/framework/qualia-framework/workflows/verify-work.md +0 -625
  199. package/framework/rules/context7.md +0 -14
  200. package/framework/rules/frontend.md +0 -33
  201. package/framework/rules/speed.md +0 -23
  202. package/framework/scripts/__pycache__/say.cpython-314.pyc +0 -0
  203. package/framework/scripts/apply-retention.sh +0 -120
  204. package/framework/scripts/bootstrap-pop-os.sh +0 -354
  205. package/framework/scripts/claude-voice +0 -13
  206. package/framework/scripts/cleanup.sh +0 -131
  207. package/framework/scripts/cowork-mode.sh +0 -141
  208. package/framework/scripts/generate-project-claude-md.sh +0 -153
  209. package/framework/scripts/load-test-webhook.js +0 -172
  210. package/framework/scripts/say.py +0 -236
  211. package/framework/scripts/showcase-video-recorder/ffmpeg-builder.js +0 -167
  212. package/framework/scripts/showcase-video-recorder/playwright-helpers.js +0 -216
  213. package/framework/scripts/speak.py +0 -55
  214. package/framework/scripts/speak.sh +0 -18
  215. package/framework/scripts/status.sh +0 -138
  216. package/framework/scripts/sync-to-framework.sh +0 -65
  217. package/framework/scripts/voice-hotkey.py +0 -227
  218. package/framework/scripts/voice-input.sh +0 -51
  219. package/framework/skills/animate/SKILL.md +0 -202
  220. package/framework/skills/bolder/SKILL.md +0 -144
  221. package/framework/skills/browser-qa/SKILL.md +0 -536
  222. package/framework/skills/clarify/SKILL.md +0 -179
  223. package/framework/skills/client-handoff/SKILL.md +0 -135
  224. package/framework/skills/collab-onboard/SKILL.md +0 -111
  225. package/framework/skills/colorize/SKILL.md +0 -170
  226. package/framework/skills/critique/SKILL.md +0 -126
  227. package/framework/skills/deep-research/SKILL.md +0 -240
  228. package/framework/skills/delight/SKILL.md +0 -329
  229. package/framework/skills/deploy/SKILL.md +0 -261
  230. package/framework/skills/deploy-verify/SKILL.md +0 -377
  231. package/framework/skills/deploy-verify/scripts/canary-check.sh +0 -206
  232. package/framework/skills/deploy-verify/scripts/check-console-errors.js +0 -147
  233. package/framework/skills/deploy-verify/scripts/check-cwv.js +0 -139
  234. package/framework/skills/deploy-verify/scripts/project-detect.sh +0 -84
  235. package/framework/skills/deploy-verify/scripts/verify.sh +0 -548
  236. package/framework/skills/design-quieter/SKILL.md +0 -130
  237. package/framework/skills/distill/SKILL.md +0 -149
  238. package/framework/skills/docs-lookup/SKILL.md +0 -79
  239. package/framework/skills/fcm-notifications/SKILL.md +0 -125
  240. package/framework/skills/financial-ledger/SKILL.md +0 -1039
  241. package/framework/skills/frontend-master/NOTICE.md +0 -4
  242. package/framework/skills/frontend-master/SKILL.md +0 -127
  243. package/framework/skills/frontend-master/reference/color-and-contrast.md +0 -132
  244. package/framework/skills/frontend-master/reference/interaction-design.md +0 -123
  245. package/framework/skills/frontend-master/reference/motion-design.md +0 -99
  246. package/framework/skills/frontend-master/reference/responsive-design.md +0 -114
  247. package/framework/skills/frontend-master/reference/spatial-design.md +0 -100
  248. package/framework/skills/frontend-master/reference/typography.md +0 -131
  249. package/framework/skills/frontend-master/reference/ux-writing.md +0 -107
  250. package/framework/skills/harden/SKILL.md +0 -357
  251. package/framework/skills/i18n-rtl/SKILL.md +0 -752
  252. package/framework/skills/learn/SKILL.md +0 -95
  253. package/framework/skills/memory/SKILL.md +0 -50
  254. package/framework/skills/mobile-expo/SKILL.md +0 -977
  255. package/framework/skills/mobile-expo/references/store-checklist.md +0 -550
  256. package/framework/skills/nestjs-backend/README.md +0 -73
  257. package/framework/skills/nestjs-backend/SKILL.md +0 -446
  258. package/framework/skills/nestjs-backend/references/templates.md +0 -1173
  259. package/framework/skills/normalize/SKILL.md +0 -79
  260. package/framework/skills/onboard/SKILL.md +0 -242
  261. package/framework/skills/openrouter-agent/SKILL.md +0 -922
  262. package/framework/skills/polish/SKILL.md +0 -209
  263. package/framework/skills/pr/SKILL.md +0 -66
  264. package/framework/skills/qualia/SKILL.md +0 -199
  265. package/framework/skills/qualia-add-todo/SKILL.md +0 -68
  266. package/framework/skills/qualia-audit-milestone/SKILL.md +0 -95
  267. package/framework/skills/qualia-check-todos/SKILL.md +0 -55
  268. package/framework/skills/qualia-complete-milestone/SKILL.md +0 -134
  269. package/framework/skills/qualia-debug/SKILL.md +0 -149
  270. package/framework/skills/qualia-design/SKILL.md +0 -203
  271. package/framework/skills/qualia-discuss-phase/SKILL.md +0 -72
  272. package/framework/skills/qualia-evolve/SKILL.md +0 -200
  273. package/framework/skills/qualia-execute-phase/SKILL.md +0 -89
  274. package/framework/skills/qualia-framework-audit/SKILL.md +0 -604
  275. package/framework/skills/qualia-guide/SKILL.md +0 -32
  276. package/framework/skills/qualia-help/SKILL.md +0 -114
  277. package/framework/skills/qualia-idk/SKILL.md +0 -352
  278. package/framework/skills/qualia-list-phase-assumptions/SKILL.md +0 -67
  279. package/framework/skills/qualia-new-milestone/SKILL.md +0 -72
  280. package/framework/skills/qualia-new-project/SKILL.md +0 -232
  281. package/framework/skills/qualia-optimize/SKILL.md +0 -417
  282. package/framework/skills/qualia-pause-work/SKILL.md +0 -96
  283. package/framework/skills/qualia-plan-milestone-gaps/SKILL.md +0 -57
  284. package/framework/skills/qualia-plan-phase/SKILL.md +0 -104
  285. package/framework/skills/qualia-production-check/SKILL.md +0 -0
  286. package/framework/skills/qualia-progress/SKILL.md +0 -53
  287. package/framework/skills/qualia-quick/SKILL.md +0 -89
  288. package/framework/skills/qualia-report/SKILL.md +0 -166
  289. package/framework/skills/qualia-research-phase/SKILL.md +0 -88
  290. package/framework/skills/qualia-resume-work/SKILL.md +0 -62
  291. package/framework/skills/qualia-review/SKILL.md +0 -263
  292. package/framework/skills/qualia-start/SKILL.md +0 -161
  293. package/framework/skills/qualia-verify-work/SKILL.md +0 -132
  294. package/framework/skills/rag/SKILL.md +0 -750
  295. package/framework/skills/responsive/SKILL.md +0 -231
  296. package/framework/skills/retro/SKILL.md +0 -284
  297. package/framework/skills/sakani-conventions/SKILL.md +0 -136
  298. package/framework/skills/sakani-conventions/evals/evals.json +0 -23
  299. package/framework/skills/sakani-conventions/references/entities.md +0 -365
  300. package/framework/skills/sakani-conventions/references/error-codes.md +0 -95
  301. package/framework/skills/seo-master/SKILL.md +0 -490
  302. package/framework/skills/seo-master/references/checklist.md +0 -199
  303. package/framework/skills/seo-master/references/structured-data.md +0 -609
  304. package/framework/skills/ship/SKILL.md +0 -239
  305. package/framework/skills/stack-researcher/SKILL.md +0 -215
  306. package/framework/skills/status/SKILL.md +0 -154
  307. package/framework/skills/status/scripts/health-check.sh +0 -562
  308. package/framework/skills/subscription-payments/SKILL.md +0 -250
  309. package/framework/skills/supabase/SKILL.md +0 -973
  310. package/framework/skills/supabase/references/templates.md +0 -159
  311. package/framework/skills/team/SKILL.md +0 -67
  312. package/framework/skills/test-runner/SKILL.md +0 -202
  313. package/framework/skills/voice-agent/SKILL.md +0 -1312
  314. package/framework/skills/zoho-workflow/SKILL.md +0 -51
  315. package/framework/statusline-command.sh +0 -117
  316. package/framework/teams/default/inboxes/plan-04.json +0 -9
  317. package/framework/teams/review-team.md +0 -75
  318. package/framework/teams/ship-team.md +0 -86
  319. package/profiles/fawzi.json +0 -16
  320. package/profiles/hasan.json +0 -16
  321. package/profiles/moayad.json +0 -16
  322. package/templates/CLAUDE-owner.md +0 -52
  323. package/templates/CLAUDE.md.hbs +0 -58
  324. package/templates/env.claude.template +0 -12
  325. package/templates/settings.json +0 -172
  326. /package/{framework/rules → rules}/deployment.md +0 -0
  327. /package/{framework/rules → rules}/security.md +0 -0
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: qualia-verify
3
+ description: "Goal-backward verification — checks if the phase ACTUALLY works, not just if tasks completed. Spawns verifier agent."
4
+ ---
5
+
6
+ # /qualia-verify — Verify a Phase
7
+
8
+ Spawn a verifier agent to check if the phase goal was achieved. Does NOT trust build summaries — greps the actual codebase.
9
+
10
+ ## Usage
11
+ `/qualia-verify` — verify the current built phase
12
+ `/qualia-verify {N}` — verify specific phase
13
+
14
+ ## Process
15
+
16
+ ### 1. Load Context
17
+
18
+ ```bash
19
+ echo "---PLAN---"
20
+ cat .planning/phase-{N}-plan.md 2>/dev/null
21
+ echo "---PREVIOUS---"
22
+ cat .planning/phase-{N}-verification.md 2>/dev/null || echo "NONE"
23
+ ```
24
+
25
+ ### 2. Spawn Verifier (Fresh Context)
26
+
27
+ ```bash
28
+ node ~/.claude/bin/qualia-ui.js banner verify {N} "{phase name}"
29
+ node ~/.claude/bin/qualia-ui.js spawn verifier "Goal-backward check..."
30
+ ```
31
+
32
+ ```
33
+ Agent(prompt="
34
+ Read your role: @agents/verifier.md
35
+
36
+ Phase plan with success criteria AND verification contracts:
37
+ @.planning/phase-{N}-plan.md
38
+
39
+ {If re-verification: Previous verification with gaps:}
40
+ {@.planning/phase-{N}-verification.md}
41
+
42
+ Verify this phase. Write report to .planning/phase-{N}-verification.md
43
+ ", subagent_type="qualia-verifier", description="Verify phase {N}")
44
+ ```
45
+
46
+ ### 2b. Browser QA (if phase touched frontend)
47
+
48
+ If the phase plan's Files section includes any `.tsx`, `.jsx`, `.css`, `.scss`, or `app/`/`pages/`/`components/` paths, ALSO spawn the browser QA agent in parallel:
49
+
50
+ ```bash
51
+ # Detect frontend touch
52
+ grep -l "\.tsx\|\.jsx\|\.css\|app/\|components/\|pages/" .planning/phase-{N}-plan.md && FRONTEND=true
53
+ ```
54
+
55
+ If frontend:
56
+
57
+ ```
58
+ Agent(prompt="
59
+ Read your role: @agents/qa-browser.md
60
+
61
+ Phase plan: @.planning/phase-{N}-plan.md
62
+ Existing verification: @.planning/phase-{N}-verification.md
63
+
64
+ Drive the running dev server and test the routes this phase touched. Append a '## Browser QA' section to the verification file.
65
+ ", subagent_type="qualia-qa-browser", description="Browser QA phase {N}")
66
+ ```
67
+
68
+ Wait for both the main verifier and the QA browser agent before moving to step 3. If Playwright MCP is unavailable, the QA browser agent returns BLOCKED — that's not a phase failure, just a note in the report.
69
+
70
+ ### 3. Present Results
71
+
72
+ Read the verification report. Present:
73
+
74
+ **If PASS:**
75
+ ```bash
76
+ node ~/.claude/bin/qualia-ui.js ok "All {count} criteria passed"
77
+ node ~/.claude/bin/qualia-ui.js end "PHASE {N} VERIFIED" "/qualia-plan {N+1}"
78
+ ```
79
+ (If phase == total phases, use `/qualia-polish` as the next command.)
80
+
81
+ **If FAIL:**
82
+ ```bash
83
+ node ~/.claude/bin/qualia-ui.js ok "Passed: {pass_count}"
84
+ node ~/.claude/bin/qualia-ui.js fail "Failed: {fail_count}"
85
+ ```
86
+
87
+ Then for each gap:
88
+ ```bash
89
+ node ~/.claude/bin/qualia-ui.js fail "{gap description}"
90
+ ```
91
+
92
+ End:
93
+ ```bash
94
+ node ~/.claude/bin/qualia-ui.js end "PHASE {N} GAPS FOUND" "/qualia-plan {N} --gaps"
95
+ ```
96
+
97
+ ### 4. Update State
98
+
99
+ ```bash
100
+ node ~/.claude/bin/state.js transition --to verified --phase {N} --verification {pass|fail}
101
+ ```
102
+ If PASS and more phases: state.js auto-advances to the next phase.
103
+ If FAIL and gap_cycles >= 2: state.js returns GAP_CYCLE_LIMIT — tell the employee to escalate.
104
+ If FAIL and gap_cycles < 2: proceed to `/qualia-plan {N} --gaps`.
105
+ Do NOT manually edit STATE.md or tracking.json — state.js handles both.
106
+
107
+ ### 5. Passive Knowledge Capture (on FAIL)
108
+
109
+ When verification fails, after showing the gaps, ask the user:
110
+
111
+ > *"Was any of this a recurring issue worth saving to common-fixes.md? (yes / no / which ones)"*
112
+
113
+ If yes, for each flagged gap spawn a brief `/qualia-learn` flow with type=`fix` — the gap title and fix direction from the verification report become the entry. Do NOT save every failure automatically — only the ones the user flags. The point is to build a real knowledge base, not a log of every mistake.
@@ -0,0 +1,475 @@
1
+ # Design System — {Project Name}
2
+
3
+ > Source of truth for all frontend work. Builder agents read this before writing any component.
4
+ > `/qualia-new` fills this during project setup. Update as design evolves.
5
+ > Format inspired by [awesome-design-md](https://github.com/VoltAgent/awesome-design-md).
6
+
7
+ ## 1. Visual Theme & Atmosphere
8
+
9
+ <!-- 2-3 paragraphs describing the FEEL of the site. Not what it does — what it FEELS like.
10
+ What mood does it create? What's the design philosophy? What makes it distinctive?
11
+ Example: "The site opens on a deep charcoal canvas with copper accents that feel
12
+ like a luxury watch brand crossed with a fintech terminal. The custom variable font
13
+ runs at weight 300 for headlines — light as confidence, not weakness." -->
14
+
15
+ {Write the visual narrative here. Be specific about mood, density, and what makes this site NOT look AI-generated.}
16
+
17
+ **Key Characteristics:**
18
+ - {Font choice and why — e.g., "Outfit at weight 300 for headlines — geometric, modern, not overused"}
19
+ - {Color signature — e.g., "Deep charcoal (#1a1a2e) backgrounds with copper (#c9784e) accents"}
20
+ - {Shadow approach — e.g., "Warm-tinted multi-layer shadows, not flat or neutral gray"}
21
+ - {Border-radius philosophy — e.g., "Conservative 4-8px, nothing pill-shaped"}
22
+ - {Layout approach — e.g., "Full-bleed sections, asymmetric grids, no card monotony"}
23
+ - {One signature detail — e.g., "Noise texture overlay at 2% on hero, grain filter on images"}
24
+
25
+ ## 2. Color Palette & Roles
26
+
27
+ <!-- Every color must have a name, hex value, AND its role. No unnamed colors in code. -->
28
+
29
+ ### Primary
30
+ - **{Brand Color Name}** (`#{hex}`): Primary brand identity. Used for {where}.
31
+ - **{Heading Color}** (`#{hex}`): All headings. Not pure black — {warm/cool undertone}.
32
+ - **{Background}** (`#{hex}`): Page background.
33
+
34
+ ### Accent & CTA
35
+ - **{Accent Name}** (`#{hex}`): CTAs, interactive highlights, links.
36
+ - **{Accent Hover}** (`#{hex}`): Hover state for accent elements.
37
+ - **{Secondary Accent}** (`#{hex}`): {role — badges, decorative, gradients}.
38
+
39
+ ### Neutral Scale
40
+ - **{Text Primary}** (`#{hex}`): Body text, paragraphs.
41
+ - **{Text Muted}** (`#{hex}`): Secondary text, descriptions, captions.
42
+ - **{Text Subtle}** (`#{hex}`): Placeholders, hints, disabled text.
43
+ - **{Border Default}** (`#{hex}`): Card borders, dividers.
44
+ - **{Border Subtle}** (`#{hex}`): Faint separators, inactive states.
45
+
46
+ ### Semantic
47
+ - **Success** (`#{hex}`): With icon. Background: `{rgba}`. Border: `{rgba}`.
48
+ - **Warning** (`#{hex}`): With icon. Background: `{rgba}`. Border: `{rgba}`.
49
+ - **Error** (`#{hex}`): With icon. Background: `{rgba}`. Border: `{rgba}`.
50
+ - **Info** (`#{hex}`): With icon. Background: `{rgba}`. Border: `{rgba}`.
51
+
52
+ ### Shadow Colors
53
+ - **Primary Shadow** (`{rgba}`): {e.g., "Brand-tinted — warm brown-gray, not neutral"}.
54
+ - **Secondary Shadow** (`{rgba}`): Reinforcement layer for depth.
55
+ - **Ambient Shadow** (`{rgba}`): Soft lift for subtle elevation.
56
+
57
+ ### CSS Variables
58
+
59
+ ```css
60
+ :root {
61
+ /* Brand */
62
+ --color-primary: #{hex};
63
+ --color-primary-hover: #{hex};
64
+ --color-primary-subtle: #{hex};
65
+
66
+ /* Accent */
67
+ --color-accent: #{hex};
68
+ --color-accent-hover: #{hex};
69
+
70
+ /* Backgrounds */
71
+ --color-bg: #{hex};
72
+ --color-bg-subtle: #{hex};
73
+ --color-bg-muted: #{hex};
74
+
75
+ /* Text */
76
+ --color-text: #{hex};
77
+ --color-text-muted: #{hex};
78
+ --color-text-subtle: #{hex};
79
+
80
+ /* Borders */
81
+ --color-border: #{hex};
82
+ --color-border-subtle: #{hex};
83
+
84
+ /* Semantic */
85
+ --color-success: #{hex};
86
+ --color-warning: #{hex};
87
+ --color-error: #{hex};
88
+ --color-info: #{hex};
89
+
90
+ /* Shadows */
91
+ --shadow-primary: {rgba};
92
+ --shadow-secondary: {rgba};
93
+ --shadow-ambient: {rgba};
94
+ }
95
+
96
+ /* Dark mode — rethink surfaces, don't just invert */
97
+ [data-theme="dark"] {
98
+ --color-bg: #{hex};
99
+ --color-bg-subtle: #{hex};
100
+ --color-text: #{hex};
101
+ --color-text-muted: #{hex};
102
+ --color-border: #{hex};
103
+ /* ... override all tokens ... */
104
+ }
105
+ ```
106
+
107
+ **Contrast verification:**
108
+ - Body text on background: {ratio} (must be >= 4.5:1)
109
+ - Muted text on background: {ratio} (must be >= 4.5:1)
110
+ - Accent on background: {ratio} (must be >= 3:1 for large text)
111
+
112
+ ## 3. Typography Rules
113
+
114
+ ### Font Families
115
+ - **Display/Heading**: `'{Font Name}'`, {fallback stack}
116
+ - **Body**: `'{Font Name}'`, {fallback stack}
117
+ - **Mono**: `'{Font Name}'`, monospace
118
+
119
+ **Google Fonts import:** `{URL}`
120
+
121
+ **Never use:** Inter, Roboto, Arial, Helvetica, system-ui, Space Grotesk.
122
+
123
+ ### Hierarchy Table
124
+
125
+ | Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
126
+ |------|------|------|--------|-------------|----------------|-------|
127
+ | Display Hero | {display} | {clamp(2.5rem, 1rem + 4vw, 4rem)} | {weight} | 1.05 | {-0.02em} | Largest text on site |
128
+ | Display | {display} | {clamp(2rem, 1rem + 3vw, 3rem)} | {weight} | 1.1 | {-0.015em} | Section heroes |
129
+ | H1 | {heading} | {clamp(1.75rem, 1rem + 2.5vw, 2.5rem)} | {weight} | 1.15 | {-0.01em} | Page titles |
130
+ | H2 | {heading} | {clamp(1.5rem, 0.75rem + 2vw, 2rem)} | {weight} | 1.2 | normal | Section titles |
131
+ | H3 | {heading} | {clamp(1.25rem, 0.75rem + 1.5vw, 1.5rem)} | {weight} | 1.25 | normal | Subsection titles |
132
+ | Body Large | {body} | {1.125rem} | 400 | 1.6 | normal | Intro text, feature descriptions |
133
+ | Body | {body} | {1rem} | 400 | 1.6 | normal | Standard reading text |
134
+ | Body Small | {body} | {0.875rem} | 400 | 1.5 | normal | Secondary text |
135
+ | Caption | {body} | {0.75rem} | 500 | 1.4 | {0.02em} | Labels, metadata |
136
+ | Button | {body} | {0.875rem–1rem} | 500 | 1.0 | {0.01em} | Button text |
137
+ | Code | {mono} | {0.875rem} | 500 | 1.7 | normal | Code blocks |
138
+
139
+ ### Principles
140
+ - {e.g., "Weight 300 at display sizes — light as authority, not shouting"}
141
+ - {e.g., "Progressive tracking: tighter letter-spacing at larger sizes"}
142
+ - {e.g., "Two-weight simplicity: 300 for display, 400 for body/UI, 600 for emphasis only"}
143
+ - Body text max-width: `65ch`. Everything else: fluid full-width.
144
+ - Min body font size: 16px. Never smaller for reading text.
145
+
146
+ ## 4. Component Specifications
147
+
148
+ ### Buttons
149
+
150
+ **Primary**
151
+ - Background: `var(--color-accent)`
152
+ - Text: `#ffffff`
153
+ - Padding: {8px 20px}
154
+ - Radius: {6px}
155
+ - Font: {size} {font} weight {weight}
156
+ - Hover: `var(--color-accent-hover)`, transition 150ms ease-out
157
+ - Active: `transform: scale(0.98)`
158
+ - Focus: `2px solid var(--color-accent)` offset 2px
159
+ - Disabled: opacity 0.5, `cursor: not-allowed`, `aria-disabled="true"`
160
+
161
+ **Secondary / Outlined**
162
+ - Background: transparent
163
+ - Text: `var(--color-accent)`
164
+ - Border: `1px solid var(--color-border)`
165
+ - Hover: `var(--color-bg-subtle)` background
166
+
167
+ **Ghost**
168
+ - Background: transparent
169
+ - Text: `var(--color-text)`
170
+ - Hover: `var(--color-bg-subtle)` background
171
+
172
+ **Destructive**
173
+ - Background: `var(--color-error)`
174
+ - Text: `#ffffff`
175
+ - Use: Only for irreversible actions with confirmation
176
+
177
+ **Sizes:** sm (32px height), md (40px), lg (48px)
178
+
179
+ ### Cards & Surfaces
180
+
181
+ - Background: `var(--color-bg-subtle)`
182
+ - Border: `1px solid var(--color-border-subtle)`
183
+ - Radius: {8px}
184
+ - Shadow (resting): `var(--shadow-ambient) 0px 4px 12px`
185
+ - Shadow (hover): `var(--shadow-primary) 0px 8px 24px, var(--shadow-secondary) 0px 4px 12px`
186
+ - Transition: shadow 200ms ease-out
187
+ - **No identical card grids** — vary layout, size, and emphasis
188
+
189
+ ### Inputs & Forms
190
+
191
+ - Height: 40px (md), 48px (lg)
192
+ - Border: `1px solid var(--color-border)`
193
+ - Radius: {6px}
194
+ - Focus: `2px solid var(--color-accent)` ring
195
+ - Error: `var(--color-error)` border + error text below with `aria-describedby`
196
+ - Label: visible `<label>` with `htmlFor` — never placeholder-only
197
+ - Placeholder: `var(--color-text-subtle)`
198
+
199
+ ### Badges / Status
200
+
201
+ - Padding: 2px 8px
202
+ - Radius: {4px}
203
+ - Font: caption size, weight 500
204
+ - Success: `var(--color-success)` bg at 0.15 alpha, text at full, border at 0.3 alpha
205
+ - Warning: same pattern with `var(--color-warning)`
206
+ - Error: same pattern with `var(--color-error)`
207
+
208
+ ### Navigation
209
+
210
+ - {Sticky header with backdrop-filter blur(12px) / Fixed sidebar / etc.}
211
+ - Logo: {left-aligned / centered}
212
+ - Links: {font, size, weight, color}
213
+ - Active indicator: {underline / background / border-bottom}
214
+ - Mobile: hamburger with drawer, 44px touch target
215
+ - CTA button: accent color, right-aligned
216
+
217
+ ### Toasts / Notifications
218
+
219
+ - Position: {top-right / bottom-center}
220
+ - `aria-live="polite"` for info, `"assertive"` for errors
221
+ - Auto-dismiss: 5s minimum, dismissible via close button
222
+ - Semantic coloring matching badge pattern
223
+
224
+ ## 5. Layout & Spacing
225
+
226
+ ### Spacing Scale (8px grid)
227
+
228
+ `4 / 8 / 12 / 16 / 24 / 32 / 48 / 64 / 96 / 128`
229
+
230
+ | Context | Value |
231
+ |---------|-------|
232
+ | Within components | 8–16px |
233
+ | Between related elements | 16–24px |
234
+ | Between sections | `clamp(3rem, 8vw, 6rem)` |
235
+ | Page horizontal padding | `clamp(1rem, 5vw, 4rem)` |
236
+ | Component gap | `clamp(1rem, 3vw, 2rem)` |
237
+
238
+ ### Grid & Layout Strategy
239
+
240
+ - **Full-width layouts** — no hardcoded `max-width: 1200px` caps
241
+ - Prose/reading content: `max-width: 65ch`
242
+ - Feature sections: varied layouts (side-by-side, staggered, asymmetric, full-bleed)
243
+ - {Specific grid: e.g., "12-column CSS grid with fluid gutters"}
244
+ - Break symmetry where it serves design — offset, overlap, diagonal flow
245
+
246
+ ### Whitespace Philosophy
247
+
248
+ {e.g., "Dense data, generous chrome. Financial tables are tightly packed, but the UI frame
249
+ around them breathes. Sections alternate between dense content and generous breathing room."}
250
+
251
+ ### Border Radius Scale
252
+
253
+ | Level | Value | Use |
254
+ |-------|-------|-----|
255
+ | Micro | 2px | Subtle rounding, inline elements |
256
+ | Standard | {4-6px} | Buttons, inputs, badges — the workhorse |
257
+ | Comfortable | {8px} | Cards, containers |
258
+ | Large | {12px} | Featured cards, hero elements |
259
+ | Full | 9999px | Avatars, pills (use sparingly) |
260
+
261
+ ## 6. Depth & Elevation
262
+
263
+ | Level | Shadow | Use |
264
+ |-------|--------|-----|
265
+ | Flat (0) | none | Page background, inline content |
266
+ | Subtle (1) | `var(--shadow-ambient) 0px 1px 3px` | Resting cards, slight lift |
267
+ | Standard (2) | `var(--shadow-primary) 0px 4px 12px` | Cards, panels |
268
+ | Elevated (3) | `var(--shadow-primary) 0px 8px 24px, var(--shadow-secondary) 0px 4px 12px` | Dropdowns, popovers, hover cards |
269
+ | Overlay (4) | `var(--shadow-primary) 0px 16px 48px, var(--shadow-secondary) 0px 8px 24px` | Modals, dialogs, floating panels |
270
+ | Focus ring | `0 0 0 2px var(--color-accent)` | Keyboard focus (non-negotiable) |
271
+
272
+ **Shadow philosophy:** {e.g., "Brand-tinted shadows — use warm rgba tones that echo the palette,
273
+ not neutral gray. Multi-layer: branded far shadow + neutral close shadow for depth parallax."}
274
+
275
+ ## 7. Do's and Don'ts
276
+
277
+ ### Do
278
+ - {e.g., "Use weight 300 for display headlines — lightness is the signature"}
279
+ - {e.g., "Apply brand-tinted shadows on all elevated elements"}
280
+ - {e.g., "Use the accent color ONLY for interactive/CTA elements — never decorative"}
281
+ - {e.g., "Keep border-radius within the defined scale — consistency over creativity"}
282
+ - {e.g., "Layer surfaces: bg → subtle → muted, each one shade step apart"}
283
+ - Use `cursor: pointer` on every clickable element
284
+ - Use CSS variables for every color — zero scattered hex values in components
285
+ - Use `clamp()` for fluid typography and spacing
286
+ - Test at 320px, 768px, 1024px, 1440px before shipping
287
+
288
+ ### Don't
289
+ - {e.g., "Don't use bold (700) for headlines — this brand uses light weights"}
290
+ - {e.g., "Don't use pill-shaped buttons (border-radius: 9999px) — conservative rounding only"}
291
+ - {e.g., "Don't use warm accents (orange, yellow) for interactive elements"}
292
+ - Don't use Inter, Roboto, Arial, Helvetica, system-ui, Space Grotesk
293
+ - Don't use blue-purple gradients (AI slop tell #1)
294
+ - Don't use identical card grids — vary layout and emphasis
295
+ - Don't use `outline: none` without a visible focus replacement
296
+ - Don't use `max-width: 1200px` or `1280px` containers — go full-width fluid
297
+ - Don't use placeholder-only form inputs — always pair with visible `<label>`
298
+ - Don't ship gray-on-gray text (#999 on #fff fails WCAG)
299
+
300
+ ## 8. Responsive Behavior
301
+
302
+ ### Breakpoints
303
+
304
+ | Name | Width | Key Changes |
305
+ |------|-------|-------------|
306
+ | Mobile | < 640px | Single column, stacked nav, reduced heading sizes |
307
+ | Tablet | 640–1023px | 2-column grids, condensed nav |
308
+ | Desktop | 1024–1279px | Full layout, expanded nav |
309
+ | Large | >= 1280px | Maximum content width, generous margins |
310
+
311
+ ### Collapsing Strategy
312
+
313
+ | Element | Desktop | Tablet | Mobile |
314
+ |---------|---------|--------|--------|
315
+ | Navigation | Full horizontal + CTA | Condensed or hamburger | Hamburger + drawer |
316
+ | Hero | {Side-by-side / full-width} | {Stacked, padded} | {Stacked, full-width} |
317
+ | Feature sections | {3-column / asymmetric} | {2-column} | {Single column stacked} |
318
+ | Sidebar | Always visible | Collapsible | Hidden, overlay |
319
+ | Tables | Full table | Scroll with sticky col | Card view |
320
+ | Modals | Centered, max-width | Centered, 80% width | Full screen |
321
+
322
+ ### Touch Targets
323
+ - All interactive elements: 44x44px minimum (48px recommended)
324
+ - Adequate spacing between tap targets (8px minimum gap)
325
+ - Mobile nav toggle: prominent, easy to reach
326
+
327
+ ### Image Behavior
328
+ - `next/image` with explicit `width`/`height` (prevent layout shift)
329
+ - Responsive `srcset` for different densities
330
+ - `max-width: 100%`, `height: auto` on all images
331
+ - Lazy-load below-fold images
332
+
333
+ ## 9. Agent Prompt Guide
334
+
335
+ ### Quick Color Reference
336
+ - Primary CTA: {Name} (`#{hex}`)
337
+ - CTA Hover: {Name} (`#{hex}`)
338
+ - Page background: {Name} (`#{hex}`)
339
+ - Heading text: {Name} (`#{hex}`)
340
+ - Body text: {Name} (`#{hex}`)
341
+ - Muted text: {Name} (`#{hex}`)
342
+ - Border: {Name} (`#{hex}`)
343
+ - Link: {Name} (`#{hex}`)
344
+ - Dark section: {Name} (`#{hex}`)
345
+ - Success: (`#{hex}`)
346
+ - Error: (`#{hex}`)
347
+
348
+ ### Example Component Prompts
349
+
350
+ **Hero section:**
351
+ "{Describe: background color, headline font/size/weight/color/spacing, subtitle treatment, CTA button specs, layout}"
352
+
353
+ **Card:**
354
+ "{Describe: background, border, radius, shadow (exact rgba), title font treatment, body text treatment}"
355
+
356
+ **Form:**
357
+ "{Describe: input border/radius/height, focus ring, label treatment, error state, submit button}"
358
+
359
+ ### Iteration Checklist
360
+ 1. Always use CSS variables — never hardcode colors in components
361
+ 2. {Font rule — e.g., "Enable ss01 on all display font text"}
362
+ 3. {Weight rule — e.g., "Default to 300; use 400 only for UI/buttons"}
363
+ 4. {Shadow rule — e.g., "Always use branded rgba, never neutral gray shadows"}
364
+ 5. {Heading rule — e.g., "Heading color is deep navy, not black — warmth matters"}
365
+ 6. {Radius rule — e.g., "Stay within 4-8px range except avatars"}
366
+
367
+ ## 10. Accessibility (Non-Negotiable)
368
+
369
+ ### Perceivable
370
+ - [ ] All images: descriptive `alt` text (decorative: `alt=""` + `aria-hidden="true"`)
371
+ - [ ] Color contrast: 4.5:1 normal text, 3:1 large text (18px+ bold / 24px+)
372
+ - [ ] Color contrast: 3:1 for UI components and graphical objects
373
+ - [ ] Information not conveyed by color alone — icons, text, patterns as supplements
374
+ - [ ] Text resizable to 200% without loss of content
375
+ - [ ] Content reflows at 320px (no horizontal scroll)
376
+
377
+ ### Operable
378
+ - [ ] All functionality available via keyboard (Tab, Enter, Space, Escape, Arrows)
379
+ - [ ] No keyboard traps (except focus traps in modals)
380
+ - [ ] Visible focus indicator on every interactive element
381
+ - [ ] Skip navigation link: `<a href="#main" class="sr-only focus:not-sr-only">`
382
+ - [ ] Touch targets: 44x44px minimum
383
+ - [ ] Page titles are descriptive and unique
384
+
385
+ ### Understandable
386
+ - [ ] Form inputs have visible `<label>` linked via `htmlFor`
387
+ - [ ] Error messages identify the field and describe the fix
388
+ - [ ] Required fields: `aria-required="true"` + visual indicator
389
+ - [ ] `<html lang="en">` set
390
+ - [ ] Consistent navigation across pages
391
+
392
+ ### Robust
393
+ - [ ] Semantic HTML: `<nav>`, `<main>`, `<article>`, `<section>`, `<header>`, `<footer>`
394
+ - [ ] One `<h1>` per page, sequential heading order
395
+ - [ ] ARIA used correctly when HTML semantics aren't enough
396
+ - [ ] Dynamic content: `aria-live="polite"` for updates, `"assertive"` for errors
397
+ - [ ] Modals: focus trap, close on Escape, `aria-modal="true"`, restore focus on close
398
+
399
+ ## 11. Hardening Criteria
400
+
401
+ Before shipping, stress-test:
402
+
403
+ - [ ] **Long text:** 200-character username, 3-paragraph description — does layout hold?
404
+ - [ ] **Empty everywhere:** all lists empty, all data missing — helpful empty states?
405
+ - [ ] **Error everywhere:** every fetch fails — error states visible and recoverable?
406
+ - [ ] **320px viewport:** nothing overflows, clips, or overlaps
407
+ - [ ] **Keyboard only:** Tab through entire app — everything reachable, focus visible?
408
+ - [ ] **Slow network:** loading states visible? Content streams, doesn't flash?
409
+ - [ ] **RTL text:** if applicable, does layout mirror correctly?
410
+ - [ ] **Zoom 200%:** content still usable, nothing hidden?
411
+
412
+ ## 12. Anti-Slop Detection
413
+
414
+ <!-- These patterns are checked by /qualia-polish grep scans. Any matches = mandatory fix. -->
415
+
416
+ | Pattern | Check | Fix |
417
+ |---------|-------|-----|
418
+ | Generic fonts | `grep -rn "Inter\|Roboto\|Arial\|Helvetica\|system-ui\|Space.Grotesk"` | Replace with project fonts |
419
+ | Hardcoded containers | `grep -rn "max-w-7xl\|max-w-\[1200\|max-width.*1200"` | Use fluid `clamp()` padding |
420
+ | Blue-purple gradients | `grep -rn "from-blue.*to-purple\|from-purple.*to-blue"` | Use brand colors |
421
+ | Card grid monotony | `grep -rn "grid-cols-3\|grid-cols-4"` in component files | Vary layout and emphasis |
422
+ | Scattered hex colors | `grep -rn "text-\[#\|bg-\[#\|border-\[#"` count > 5 | Use CSS variables |
423
+ | Missing focus styles | `grep -rn "outline: none\|outline:none"` | Add visible focus replacement |
424
+ | Placeholder-only inputs | `<input>` without adjacent `<label>` | Add visible label |
425
+
426
+ ## Motion Reference
427
+
428
+ ### Duration Table
429
+
430
+ | Action | Duration | Easing |
431
+ |--------|----------|--------|
432
+ | Micro-feedback (press, toggle) | 100ms | ease-out |
433
+ | Hover/focus | 150ms | ease-out |
434
+ | Tooltip, dropdown | 200ms | ease-out |
435
+ | Expand/collapse | 250ms | ease-in-out |
436
+ | Page element enter | 300ms | `cubic-bezier(0, 0, 0.2, 1)` |
437
+ | Page/route transition | 400ms | `cubic-bezier(0.4, 0, 0.2, 1)` |
438
+ | Complex orchestration | 500–800ms | staggered |
439
+
440
+ ### Easing Curves
441
+
442
+ ```css
443
+ --ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
444
+ --ease-decelerate: cubic-bezier(0, 0, 0.2, 1);
445
+ --ease-accelerate: cubic-bezier(0.4, 0, 1, 1);
446
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
447
+ ```
448
+
449
+ ### Stagger Pattern
450
+
451
+ ```css
452
+ @keyframes fadeUp {
453
+ from { opacity: 0; transform: translateY(12px); }
454
+ to { opacity: 1; transform: translateY(0); }
455
+ }
456
+ .stagger > * { animation: fadeUp 300ms var(--ease-decelerate) both; }
457
+ .stagger > *:nth-child(1) { animation-delay: 0ms; }
458
+ .stagger > *:nth-child(2) { animation-delay: 60ms; }
459
+ .stagger > *:nth-child(3) { animation-delay: 120ms; }
460
+ .stagger > *:nth-child(4) { animation-delay: 180ms; }
461
+ .stagger > *:nth-child(5) { animation-delay: 240ms; }
462
+ ```
463
+
464
+ ### Reduced Motion (mandatory)
465
+
466
+ ```css
467
+ @media (prefers-reduced-motion: reduce) {
468
+ *, *::before, *::after {
469
+ animation-duration: 0.01ms !important;
470
+ animation-iteration-count: 1 !important;
471
+ transition-duration: 0.01ms !important;
472
+ scroll-behavior: auto !important;
473
+ }
474
+ }
475
+ ```