claude-code-workflow 7.2.26 → 7.2.28

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 (408) hide show
  1. package/.ccw/specs/architecture-constraints.md +5 -0
  2. package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +140 -0
  3. package/.claude/skills/investigate/SKILL.md +110 -0
  4. package/.claude/skills/investigate/phases/01-root-cause-investigation.md +132 -0
  5. package/.claude/skills/investigate/phases/02-pattern-analysis.md +126 -0
  6. package/.claude/skills/investigate/phases/03-hypothesis-testing.md +177 -0
  7. package/.claude/skills/investigate/phases/04-implementation.md +139 -0
  8. package/.claude/skills/investigate/phases/05-verification-report.md +153 -0
  9. package/.claude/skills/investigate/specs/debug-report-format.md +226 -0
  10. package/.claude/skills/investigate/specs/iron-law.md +101 -0
  11. package/.claude/skills/security-audit/SKILL.md +125 -0
  12. package/.claude/skills/security-audit/phases/01-supply-chain-scan.md +139 -0
  13. package/.claude/skills/security-audit/phases/02-owasp-review.md +156 -0
  14. package/.claude/skills/security-audit/phases/03-threat-modeling.md +180 -0
  15. package/.claude/skills/security-audit/phases/04-report-tracking.md +177 -0
  16. package/.claude/skills/security-audit/specs/owasp-checklist.md +442 -0
  17. package/.claude/skills/security-audit/specs/scoring-gates.md +141 -0
  18. package/.claude/skills/ship/SKILL.md +105 -0
  19. package/.claude/skills/ship/phases/01-preflight-checks.md +121 -0
  20. package/.claude/skills/ship/phases/02-code-review.md +137 -0
  21. package/.claude/skills/ship/phases/03-version-bump.md +171 -0
  22. package/.claude/skills/ship/phases/04-changelog-commit.md +167 -0
  23. package/.claude/skills/ship/phases/05-pr-creation.md +163 -0
  24. package/.claude/skills/skill-generator/templates/sequential-phase.md +10 -0
  25. package/.claude/skills/skill-generator/templates/skill-md.md +4 -0
  26. package/.claude/skills/team-arch-opt/SKILL.md +1 -1
  27. package/.claude/skills/team-arch-opt/roles/coordinator/commands/monitor.md +3 -1
  28. package/.claude/skills/team-arch-opt/roles/refactorer/role.md +3 -1
  29. package/.claude/skills/team-arch-opt/specs/team-config.json +2 -2
  30. package/.claude/skills/team-coordinate/SKILL.md +4 -3
  31. package/.claude/skills/team-coordinate/roles/coordinator/commands/analyze-task.md +1 -1
  32. package/.claude/skills/team-coordinate/roles/coordinator/commands/dispatch.md +3 -2
  33. package/.claude/skills/team-coordinate/roles/coordinator/commands/monitor.md +3 -2
  34. package/.claude/skills/team-coordinate/roles/coordinator/role.md +16 -15
  35. package/.claude/skills/team-coordinate/specs/pipelines.md +7 -4
  36. package/.claude/skills/team-coordinate/specs/role-spec-template.md +1 -0
  37. package/.claude/skills/team-interactive-craft/SKILL.md +127 -0
  38. package/.claude/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
  39. package/.claude/skills/team-interactive-craft/roles/builder/role.md +216 -0
  40. package/.claude/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
  41. package/.claude/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +192 -0
  42. package/.claude/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +183 -0
  43. package/.claude/skills/team-interactive-craft/roles/coordinator/role.md +166 -0
  44. package/.claude/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
  45. package/.claude/skills/team-interactive-craft/roles/researcher/role.md +131 -0
  46. package/.claude/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
  47. package/.claude/skills/team-interactive-craft/specs/pipelines.md +85 -0
  48. package/.claude/skills/team-interactive-craft/specs/team-config.json +105 -0
  49. package/.claude/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
  50. package/.claude/skills/team-lifecycle-v4/SKILL.md +1 -1
  51. package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/dispatch.md +14 -2
  52. package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +24 -2
  53. package/.claude/skills/team-lifecycle-v4/roles/executor/role.md +3 -1
  54. package/.claude/skills/team-motion-design/SKILL.md +129 -0
  55. package/.claude/skills/team-motion-design/roles/animator/role.md +194 -0
  56. package/.claude/skills/team-motion-design/roles/choreographer/role.md +164 -0
  57. package/.claude/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
  58. package/.claude/skills/team-motion-design/roles/coordinator/commands/dispatch.md +203 -0
  59. package/.claude/skills/team-motion-design/roles/coordinator/commands/monitor.md +184 -0
  60. package/.claude/skills/team-motion-design/roles/coordinator/role.md +167 -0
  61. package/.claude/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
  62. package/.claude/skills/team-motion-design/roles/motion-tester/role.md +175 -0
  63. package/.claude/skills/team-motion-design/specs/gpu-constraints.md +114 -0
  64. package/.claude/skills/team-motion-design/specs/motion-tokens.md +128 -0
  65. package/.claude/skills/team-motion-design/specs/pipelines.md +74 -0
  66. package/.claude/skills/team-motion-design/specs/reduced-motion.md +129 -0
  67. package/.claude/skills/team-motion-design/specs/team-config.json +99 -0
  68. package/.claude/skills/team-perf-opt/SKILL.md +1 -1
  69. package/.claude/skills/team-perf-opt/roles/optimizer/role.md +3 -1
  70. package/.claude/skills/team-perf-opt/specs/team-config.json +2 -2
  71. package/.claude/skills/team-quality-assurance/SKILL.md +1 -1
  72. package/.claude/skills/team-quality-assurance/roles/coordinator/commands/dispatch.md +4 -2
  73. package/.claude/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +4 -2
  74. package/.claude/skills/team-quality-assurance/roles/executor/role.md +3 -1
  75. package/.claude/skills/team-testing/SKILL.md +1 -1
  76. package/.claude/skills/team-testing/roles/coordinator/commands/dispatch.md +5 -2
  77. package/.claude/skills/team-testing/roles/coordinator/commands/monitor.md +4 -2
  78. package/.claude/skills/team-testing/roles/executor/role.md +3 -1
  79. package/.claude/skills/team-ui-polish/SKILL.md +127 -0
  80. package/.claude/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
  81. package/.claude/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +194 -0
  82. package/.claude/skills/team-ui-polish/roles/coordinator/commands/monitor.md +180 -0
  83. package/.claude/skills/team-ui-polish/roles/coordinator/role.md +170 -0
  84. package/.claude/skills/team-ui-polish/roles/diagnostician/role.md +160 -0
  85. package/.claude/skills/team-ui-polish/roles/optimizer/role.md +225 -0
  86. package/.claude/skills/team-ui-polish/roles/scanner/role.md +356 -0
  87. package/.claude/skills/team-ui-polish/roles/verifier/role.md +142 -0
  88. package/.claude/skills/team-ui-polish/specs/anti-patterns.md +141 -0
  89. package/.claude/skills/team-ui-polish/specs/design-standards.md +356 -0
  90. package/.claude/skills/team-ui-polish/specs/fix-strategies.md +235 -0
  91. package/.claude/skills/team-ui-polish/specs/pipelines.md +81 -0
  92. package/.claude/skills/team-ui-polish/specs/scoring-guide.md +162 -0
  93. package/.claude/skills/team-ui-polish/specs/team-config.json +73 -0
  94. package/.claude/skills/team-uidesign/SKILL.md +6 -1
  95. package/.claude/skills/team-uidesign/roles/designer/role.md +28 -4
  96. package/.claude/skills/team-uidesign/roles/implementer/role.md +25 -3
  97. package/.claude/skills/team-uidesign/roles/researcher/role.md +21 -2
  98. package/.claude/skills/team-uidesign/roles/reviewer/role.md +19 -17
  99. package/.claude/skills/team-uidesign/specs/anti-patterns.md +211 -0
  100. package/.claude/skills/team-uidesign/specs/design-standards.md +329 -0
  101. package/.claude/skills/team-uidesign/specs/scoring-guide.md +114 -0
  102. package/.claude/skills/team-uidesign/specs/team-config.json +1 -1
  103. package/.claude/skills/team-uidesign/specs/ux-writing.md +86 -0
  104. package/.claude/skills/team-ux-improve/SKILL.md +3 -0
  105. package/.claude/skills/team-ux-improve/roles/designer/role.md +30 -0
  106. package/.claude/skills/team-ux-improve/roles/diagnoser/role.md +16 -1
  107. package/.claude/skills/team-ux-improve/roles/scanner/role.md +43 -1
  108. package/.claude/skills/team-ux-improve/specs/anti-patterns.md +103 -0
  109. package/.claude/skills/team-ux-improve/specs/design-standards.md +54 -0
  110. package/.claude/skills/team-ux-improve/specs/heuristics.md +88 -0
  111. package/.claude/skills/team-ux-improve/wisdom/anti-patterns/common-ux-pitfalls.md +40 -8
  112. package/.claude/skills/team-ux-improve/wisdom/patterns/state-management.md +32 -12
  113. package/.claude/skills/team-ux-improve/wisdom/patterns/ui-feedback.md +35 -11
  114. package/.claude/skills/team-ux-improve/wisdom/principles/general-ux.md +36 -9
  115. package/.claude/skills/team-visual-a11y/SKILL.md +143 -0
  116. package/.claude/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
  117. package/.claude/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
  118. package/.claude/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +250 -0
  119. package/.claude/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +204 -0
  120. package/.claude/skills/team-visual-a11y/roles/coordinator/role.md +169 -0
  121. package/.claude/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
  122. package/.claude/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
  123. package/.claude/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
  124. package/.claude/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
  125. package/.claude/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
  126. package/.claude/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
  127. package/.claude/skills/team-visual-a11y/specs/pipelines.md +98 -0
  128. package/.claude/skills/team-visual-a11y/specs/team-config.json +109 -0
  129. package/.claude/skills/team-visual-a11y/specs/typography-scale.md +165 -0
  130. package/.claude/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
  131. package/.codex/skills/investigate/agents/investigator.md +392 -0
  132. package/.codex/skills/investigate/orchestrator.md +362 -0
  133. package/.codex/skills/investigate/phases/01-root-cause-investigation.md +212 -0
  134. package/.codex/skills/investigate/phases/02-pattern-analysis.md +181 -0
  135. package/.codex/skills/investigate/phases/03-hypothesis-testing.md +214 -0
  136. package/.codex/skills/investigate/phases/04-implementation.md +195 -0
  137. package/.codex/skills/investigate/phases/05-verification-report.md +240 -0
  138. package/.codex/skills/security-audit/agents/security-auditor.md +341 -0
  139. package/.codex/skills/security-audit/orchestrator.md +384 -0
  140. package/.codex/skills/security-audit/phases/01-supply-chain-scan.md +226 -0
  141. package/.codex/skills/security-audit/phases/02-owasp-review.md +232 -0
  142. package/.codex/skills/security-audit/phases/03-threat-modeling.md +249 -0
  143. package/.codex/skills/security-audit/phases/04-report-tracking.md +300 -0
  144. package/.codex/skills/ship/agents/ship-operator.md +318 -0
  145. package/.codex/skills/ship/orchestrator.md +426 -0
  146. package/.codex/skills/ship/phases/01-preflight-checks.md +198 -0
  147. package/.codex/skills/ship/phases/02-code-review.md +228 -0
  148. package/.codex/skills/ship/phases/03-version-bump.md +259 -0
  149. package/.codex/skills/ship/phases/04-changelog-commit.md +263 -0
  150. package/.codex/skills/ship/phases/05-pr-creation.md +280 -0
  151. package/.codex/skills/team-interactive-craft/SKILL.md +220 -0
  152. package/.codex/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
  153. package/.codex/skills/team-interactive-craft/roles/builder/role.md +216 -0
  154. package/.codex/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
  155. package/.codex/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +162 -0
  156. package/.codex/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +233 -0
  157. package/.codex/skills/team-interactive-craft/roles/coordinator/role.md +209 -0
  158. package/.codex/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
  159. package/.codex/skills/team-interactive-craft/roles/researcher/role.md +131 -0
  160. package/.codex/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
  161. package/.codex/skills/team-interactive-craft/specs/pipelines.md +85 -0
  162. package/.codex/skills/team-interactive-craft/specs/team-config.json +105 -0
  163. package/.codex/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
  164. package/.codex/skills/team-motion-design/SKILL.md +222 -0
  165. package/.codex/skills/team-motion-design/roles/animator/role.md +194 -0
  166. package/.codex/skills/team-motion-design/roles/choreographer/role.md +164 -0
  167. package/.codex/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
  168. package/.codex/skills/team-motion-design/roles/coordinator/commands/dispatch.md +168 -0
  169. package/.codex/skills/team-motion-design/roles/coordinator/commands/monitor.md +242 -0
  170. package/.codex/skills/team-motion-design/roles/coordinator/role.md +210 -0
  171. package/.codex/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
  172. package/.codex/skills/team-motion-design/roles/motion-tester/role.md +175 -0
  173. package/.codex/skills/team-motion-design/specs/gpu-constraints.md +114 -0
  174. package/.codex/skills/team-motion-design/specs/motion-tokens.md +128 -0
  175. package/.codex/skills/team-motion-design/specs/pipelines.md +74 -0
  176. package/.codex/skills/team-motion-design/specs/reduced-motion.md +129 -0
  177. package/.codex/skills/team-motion-design/specs/team-config.json +99 -0
  178. package/.codex/skills/team-ui-polish/SKILL.md +218 -0
  179. package/.codex/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
  180. package/.codex/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +167 -0
  181. package/.codex/skills/team-ui-polish/roles/coordinator/commands/monitor.md +230 -0
  182. package/.codex/skills/team-ui-polish/roles/coordinator/role.md +213 -0
  183. package/.codex/skills/team-ui-polish/roles/diagnostician/role.md +164 -0
  184. package/.codex/skills/team-ui-polish/roles/optimizer/role.md +229 -0
  185. package/.codex/skills/team-ui-polish/roles/scanner/role.md +360 -0
  186. package/.codex/skills/team-ui-polish/roles/verifier/role.md +142 -0
  187. package/.codex/skills/team-ui-polish/specs/anti-patterns.md +141 -0
  188. package/.codex/skills/team-ui-polish/specs/design-standards.md +356 -0
  189. package/.codex/skills/team-ui-polish/specs/fix-strategies.md +235 -0
  190. package/.codex/skills/team-ui-polish/specs/pipelines.md +81 -0
  191. package/.codex/skills/team-ui-polish/specs/scoring-guide.md +162 -0
  192. package/.codex/skills/team-ui-polish/specs/team-config.json +73 -0
  193. package/.codex/skills/team-visual-a11y/SKILL.md +319 -0
  194. package/.codex/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
  195. package/.codex/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
  196. package/.codex/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +188 -0
  197. package/.codex/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +281 -0
  198. package/.codex/skills/team-visual-a11y/roles/coordinator/role.md +213 -0
  199. package/.codex/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
  200. package/.codex/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
  201. package/.codex/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
  202. package/.codex/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
  203. package/.codex/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
  204. package/.codex/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
  205. package/.codex/skills/team-visual-a11y/specs/pipelines.md +98 -0
  206. package/.codex/skills/team-visual-a11y/specs/team-config.json +109 -0
  207. package/.codex/skills/team-visual-a11y/specs/typography-scale.md +165 -0
  208. package/.codex/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
  209. package/README.md +8 -0
  210. package/ccw/dist/core/hooks/hook-templates.d.ts.map +1 -1
  211. package/ccw/dist/core/hooks/hook-templates.js +114 -1
  212. package/ccw/dist/core/hooks/hook-templates.js.map +1 -1
  213. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  214. package/ccw/dist/core/routes/cli-routes.js +34 -0
  215. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  216. package/ccw/dist/core/routes/system-routes.js +2 -2
  217. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  218. package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js → AlertDialog-BjP1ydDR.js} +2 -2
  219. package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js.map → AlertDialog-BjP1ydDR.js.map} +1 -1
  220. package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js → AnalysisPage-CAX3xqMf.js} +2 -2
  221. package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js.map → AnalysisPage-CAX3xqMf.js.map} +1 -1
  222. package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js → ApiSettingsPage-CtWlmztq.js} +2 -2
  223. package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js.map → ApiSettingsPage-CtWlmztq.js.map} +1 -1
  224. package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js → CliModeToggle-hR4a-eLX.js} +2 -2
  225. package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js.map → CliModeToggle-hR4a-eLX.js.map} +1 -1
  226. package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js → CliSessionSharePage-DzNPkFN9.js} +2 -2
  227. package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js.map → CliSessionSharePage-DzNPkFN9.js.map} +1 -1
  228. package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js → CliViewerPage-BPEGN4TT.js} +2 -2
  229. package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js.map → CliViewerPage-BPEGN4TT.js.map} +1 -1
  230. package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js → CodexLensPage-Cf0r2RHY.js} +2 -2
  231. package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js.map → CodexLensPage-Cf0r2RHY.js.map} +1 -1
  232. package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js → Collapsible-DEm1rJ4h.js} +2 -2
  233. package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js.map → Collapsible-DEm1rJ4h.js.map} +1 -1
  234. package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js → CommandsManagerPage-BpeWw8HO.js} +2 -2
  235. package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js.map → CommandsManagerPage-BpeWw8HO.js.map} +1 -1
  236. package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js → DeepWikiPage-BEsmh2vF.js} +2 -2
  237. package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js.map → DeepWikiPage-BEsmh2vF.js.map} +1 -1
  238. package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js → EndpointsPage-B30SFdtU.js} +2 -2
  239. package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js.map → EndpointsPage-B30SFdtU.js.map} +1 -1
  240. package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js → ExplorerPage-BVvMpg1O.js} +2 -2
  241. package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js.map → ExplorerPage-BVvMpg1O.js.map} +1 -1
  242. package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js → FixSessionPage-CL73dHbh.js} +2 -2
  243. package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js.map → FixSessionPage-CL73dHbh.js.map} +1 -1
  244. package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js → FloatingFileBrowser-BL-28lMZ.js} +2 -2
  245. package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js.map → FloatingFileBrowser-BL-28lMZ.js.map} +1 -1
  246. package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js → FloatingPanel-BzZDciHZ.js} +2 -2
  247. package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js.map → FloatingPanel-BzZDciHZ.js.map} +1 -1
  248. package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js → GraphExplorerPage-CDp6-d8P.js} +2 -2
  249. package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js.map → GraphExplorerPage-CDp6-d8P.js.map} +1 -1
  250. package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js → HistoryPage-fZY_7O9n.js} +2 -2
  251. package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js.map → HistoryPage-fZY_7O9n.js.map} +1 -1
  252. package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js → HookManagerPage-4LJeC9bq.js} +2 -2
  253. package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js.map → HookManagerPage-4LJeC9bq.js.map} +1 -1
  254. package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js → InstallationsPage-Bpigrbhw.js} +2 -2
  255. package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js.map → InstallationsPage-Bpigrbhw.js.map} +1 -1
  256. package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js → IssueHubPage-BP0zJc1R.js} +2 -2
  257. package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js.map → IssueHubPage-BP0zJc1R.js.map} +1 -1
  258. package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js → LiteTasksPage-CSt2oVKQ.js} +2 -2
  259. package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js.map → LiteTasksPage-CSt2oVKQ.js.map} +1 -1
  260. package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js → McpManagerPage-B-xaMA0w.js} +2 -2
  261. package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js.map → McpManagerPage-B-xaMA0w.js.map} +1 -1
  262. package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js → MemoryPage-CJqo_7DY.js} +2 -2
  263. package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js.map → MemoryPage-CJqo_7DY.js.map} +1 -1
  264. package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js → NotFoundPage-ibZeQA-Y.js} +2 -2
  265. package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js.map → NotFoundPage-ibZeQA-Y.js.map} +1 -1
  266. package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js → OrchestratorPage-DgJ4ctPQ.js} +2 -2
  267. package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js.map → OrchestratorPage-DgJ4ctPQ.js.map} +1 -1
  268. package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js → ProjectOverviewPage-Cit0Yq0D.js} +2 -2
  269. package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js.map → ProjectOverviewPage-Cit0Yq0D.js.map} +1 -1
  270. package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js → PromptHistoryPage-Ce1HDIK0.js} +2 -2
  271. package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js.map → PromptHistoryPage-Ce1HDIK0.js.map} +1 -1
  272. package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js → ReviewSessionPage-J1KikNrk.js} +2 -2
  273. package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js.map → ReviewSessionPage-J1KikNrk.js.map} +1 -1
  274. package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js → RulesManagerPage-CdBjTmth.js} +2 -2
  275. package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js.map → RulesManagerPage-CdBjTmth.js.map} +1 -1
  276. package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js → SessionDetailPage-B9ZK7LvX.js} +2 -2
  277. package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js.map → SessionDetailPage-B9ZK7LvX.js.map} +1 -1
  278. package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js → SessionsPage-CW_nS5UR.js} +2 -2
  279. package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js.map → SessionsPage-CW_nS5UR.js.map} +1 -1
  280. package/ccw/frontend/dist/assets/{SettingsPage-BPDbXPSM.js → SettingsPage-B2PYzSoO.js} +35 -35
  281. package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js.map +1 -0
  282. package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js → SkillsManagerPage-CTnWrrwp.js} +2 -2
  283. package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js.map → SkillsManagerPage-CTnWrrwp.js.map} +1 -1
  284. package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js → SpecsSettingsPage-DJpi9XQL.js} +2 -2
  285. package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js.map → SpecsSettingsPage-DJpi9XQL.js.map} +1 -1
  286. package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js → Switch-Ac6Ov7uy.js} +2 -2
  287. package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js.map → Switch-Ac6Ov7uy.js.map} +1 -1
  288. package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js → TabsNavigation-DZAAspqR.js} +2 -2
  289. package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js.map → TabsNavigation-DZAAspqR.js.map} +1 -1
  290. package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js → TaskDrawer-BJkwfhIZ.js} +2 -2
  291. package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js.map → TaskDrawer-BJkwfhIZ.js.map} +1 -1
  292. package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js → TeamPage-BJgjxBgb.js} +2 -2
  293. package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js.map → TeamPage-BJgjxBgb.js.map} +1 -1
  294. package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js → TerminalDashboardPage-D1WekoOy.js} +2 -2
  295. package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js.map → TerminalDashboardPage-D1WekoOy.js.map} +1 -1
  296. package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js → archive-DxemgIhF.js} +2 -2
  297. package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js.map → archive-DxemgIhF.js.map} +1 -1
  298. package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js → archive-restore-CjS83f1V.js} +2 -2
  299. package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js.map → archive-restore-CjS83f1V.js.map} +1 -1
  300. package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js → arrow-right-B5PUcn8I.js} +2 -2
  301. package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js.map → arrow-right-B5PUcn8I.js.map} +1 -1
  302. package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js → bookmark-plus-DCc9aPbb.js} +2 -2
  303. package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js.map → bookmark-plus-DCc9aPbb.js.map} +1 -1
  304. package/ccw/frontend/dist/assets/{bot-BLkaQscs.js → bot-DOwFtzak.js} +2 -2
  305. package/ccw/frontend/dist/assets/{bot-BLkaQscs.js.map → bot-DOwFtzak.js.map} +1 -1
  306. package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js → braces-96qH3aFh.js} +2 -2
  307. package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js.map → braces-96qH3aFh.js.map} +1 -1
  308. package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js → circle-stop-CCxSuil1.js} +2 -2
  309. package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js.map → circle-stop-CCxSuil1.js.map} +1 -1
  310. package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js → cpu-CZNSJFdq.js} +2 -2
  311. package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js.map → cpu-CZNSJFdq.js.map} +1 -1
  312. package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js → ellipsis-vertical-h8xtvw2_.js} +2 -2
  313. package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js.map → ellipsis-vertical-h8xtvw2_.js.map} +1 -1
  314. package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js → eye-D3NY0bm6.js} +2 -2
  315. package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js.map → eye-D3NY0bm6.js.map} +1 -1
  316. package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js → eye-off-Cy2vkc8p.js} +2 -2
  317. package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js.map → eye-off-Cy2vkc8p.js.map} +1 -1
  318. package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js → file-json-Bzq3U1Mx.js} +2 -2
  319. package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js.map → file-json-Bzq3U1Mx.js.map} +1 -1
  320. package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js → file-text-DwuwPDPi.js} +2 -2
  321. package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js.map → file-text-DwuwPDPi.js.map} +1 -1
  322. package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js → filter-q9g-bknU.js} +2 -2
  323. package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js.map → filter-q9g-bknU.js.map} +1 -1
  324. package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js → folder-CL6vb42J.js} +2 -2
  325. package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js.map → folder-CL6vb42J.js.map} +1 -1
  326. package/ccw/frontend/dist/assets/{gauge-kazFexTr.js → gauge-BkrcQBly.js} +2 -2
  327. package/ccw/frontend/dist/assets/{gauge-kazFexTr.js.map → gauge-BkrcQBly.js.map} +1 -1
  328. package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js → globe-BQbwyNeV.js} +2 -2
  329. package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js.map → globe-BQbwyNeV.js.map} +1 -1
  330. package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js → grid-3x3-x5_7DrN7.js} +2 -2
  331. package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js.map → grid-3x3-x5_7DrN7.js.map} +1 -1
  332. package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js → hard-drive-DTyWXwzf.js} +2 -2
  333. package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js.map → hard-drive-DTyWXwzf.js.map} +1 -1
  334. package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js → hash-80O0kJO7.js} +2 -2
  335. package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js.map → hash-80O0kJO7.js.map} +1 -1
  336. package/ccw/frontend/dist/assets/{history-ujQnmMC9.js → history-DDlN2Bwa.js} +2 -2
  337. package/ccw/frontend/dist/assets/{history-ujQnmMC9.js.map → history-DDlN2Bwa.js.map} +1 -1
  338. package/ccw/frontend/dist/assets/{index-CxzXz6o1.js → index-B9A3Hnrk.js} +2 -2
  339. package/ccw/frontend/dist/assets/{index-CxzXz6o1.js.map → index-B9A3Hnrk.js.map} +1 -1
  340. package/ccw/frontend/dist/assets/{index-B76AGix5.js → index-Bs80iCX0.js} +2 -2
  341. package/ccw/frontend/dist/assets/{index-B76AGix5.js.map → index-Bs80iCX0.js.map} +1 -1
  342. package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js → index-mbeo62f8.js} +2 -2
  343. package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js.map → index-mbeo62f8.js.map} +1 -1
  344. package/ccw/frontend/dist/assets/{index-Dff4bg3u.js → index-rLgoBCfV.js} +3 -3
  345. package/ccw/frontend/dist/assets/{index-Dff4bg3u.js.map → index-rLgoBCfV.js.map} +1 -1
  346. package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js → layout-grid-C1niOWJx.js} +2 -2
  347. package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js.map → layout-grid-C1niOWJx.js.map} +1 -1
  348. package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js → lightbulb-BTmI7SUg.js} +2 -2
  349. package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js.map → lightbulb-BTmI7SUg.js.map} +1 -1
  350. package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js → link-2-CB9HKeuZ.js} +2 -2
  351. package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js.map → link-2-CB9HKeuZ.js.map} +1 -1
  352. package/ccw/frontend/dist/assets/{link-5yXdZBch.js → link-koEYiemK.js} +2 -2
  353. package/ccw/frontend/dist/assets/{link-5yXdZBch.js.map → link-koEYiemK.js.map} +1 -1
  354. package/ccw/frontend/dist/assets/{list-9lHhC_U_.js → list-v2_GaLdC.js} +2 -2
  355. package/ccw/frontend/dist/assets/{list-9lHhC_U_.js.map → list-v2_GaLdC.js.map} +1 -1
  356. package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js → map-pin-BQNfAqG_.js} +2 -2
  357. package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js.map → map-pin-BQNfAqG_.js.map} +1 -1
  358. package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js → messages-square-Dzq5LGg9.js} +2 -2
  359. package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js.map → messages-square-Dzq5LGg9.js.map} +1 -1
  360. package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js → minimize-2-CtkoJXcz.js} +2 -2
  361. package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js.map → minimize-2-CtkoJXcz.js.map} +1 -1
  362. package/ccw/frontend/dist/assets/{package-BjOw1ldU.js → package-CH3smL37.js} +2 -2
  363. package/ccw/frontend/dist/assets/{package-BjOw1ldU.js.map → package-CH3smL37.js.map} +1 -1
  364. package/ccw/frontend/dist/assets/{plug-9dAARpE1.js → plug-CZ0aL_yF.js} +2 -2
  365. package/ccw/frontend/dist/assets/{plug-9dAARpE1.js.map → plug-CZ0aL_yF.js.map} +1 -1
  366. package/ccw/frontend/dist/assets/{power-K2S39x7f.js → power-F2A_J4l6.js} +2 -2
  367. package/ccw/frontend/dist/assets/{power-K2S39x7f.js.map → power-F2A_J4l6.js.map} +1 -1
  368. package/ccw/frontend/dist/assets/{save-D9-CoT3x.js → save-Byxot0YU.js} +2 -2
  369. package/ccw/frontend/dist/assets/{save-D9-CoT3x.js.map → save-Byxot0YU.js.map} +1 -1
  370. package/ccw/frontend/dist/assets/{send-Bunw9NtC.js → send-JjqhUkpw.js} +2 -2
  371. package/ccw/frontend/dist/assets/{send-Bunw9NtC.js.map → send-JjqhUkpw.js.map} +1 -1
  372. package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js → settings-2--SuN9rAt.js} +2 -2
  373. package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js.map → settings-2--SuN9rAt.js.map} +1 -1
  374. package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js → square-check-big-BbngGB2h.js} +2 -2
  375. package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js.map → square-check-big-BbngGB2h.js.map} +1 -1
  376. package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js → square-pen-CgrHgZSl.js} +2 -2
  377. package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js.map → square-pen-CgrHgZSl.js.map} +1 -1
  378. package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js → star-BU3TQr7Z.js} +2 -2
  379. package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js.map → star-BU3TQr7Z.js.map} +1 -1
  380. package/ccw/frontend/dist/assets/{style-BbREPmRj.js → style-CKs7nnn3.js} +2 -2
  381. package/ccw/frontend/dist/assets/{style-BbREPmRj.js.map → style-CKs7nnn3.js.map} +1 -1
  382. package/ccw/frontend/dist/assets/{target-CElrCVhR.js → target-DW5tsDW6.js} +2 -2
  383. package/ccw/frontend/dist/assets/{target-CElrCVhR.js.map → target-DW5tsDW6.js.map} +1 -1
  384. package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js → test-tube-BHm7w3ON.js} +2 -2
  385. package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js.map → test-tube-BHm7w3ON.js.map} +1 -1
  386. package/ccw/frontend/dist/assets/{upload-BD1F07wG.js → upload-DYR7PWwt.js} +2 -2
  387. package/ccw/frontend/dist/assets/{upload-BD1F07wG.js.map → upload-DYR7PWwt.js.map} +1 -1
  388. package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js → useApiSettings-D0TVgQD_.js} +2 -2
  389. package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js.map → useApiSettings-D0TVgQD_.js.map} +1 -1
  390. package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js → useCli-DfY8mAP8.js} +2 -2
  391. package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js.map → useCli-DfY8mAP8.js.map} +1 -1
  392. package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js → useCommands-CGusDp0F.js} +2 -2
  393. package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js.map → useCommands-CGusDp0F.js.map} +1 -1
  394. package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js → useDebounce-CIwh0fF1.js} +2 -2
  395. package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js.map → useDebounce-CIwh0fF1.js.map} +1 -1
  396. package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js → useFileExplorer-FMyFv39K.js} +2 -2
  397. package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js.map → useFileExplorer-FMyFv39K.js.map} +1 -1
  398. package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js → useLocale-B2qhsoTb.js} +2 -2
  399. package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js.map → useLocale-B2qhsoTb.js.map} +1 -1
  400. package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js → useSkills-cxKXMBm3.js} +3 -3
  401. package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js.map → useSkills-cxKXMBm3.js.map} +1 -1
  402. package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js → useSystemSettings-B-xUT_z-.js} +2 -2
  403. package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js.map → useSystemSettings-B-xUT_z-.js.map} +1 -1
  404. package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js → wand-sparkles-DZV_3lPr.js} +2 -2
  405. package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js.map → wand-sparkles-DZV_3lPr.js.map} +1 -1
  406. package/ccw/frontend/dist/index.html +1 -1
  407. package/package.json +105 -105
  408. package/ccw/frontend/dist/assets/SettingsPage-BPDbXPSM.js.map +0 -1
@@ -0,0 +1,142 @@
1
+ ---
2
+ role: verifier
3
+ prefix: VERIFY
4
+ inner_loop: false
5
+ message_types: [verify_passed, verify_failed, fix_required, error]
6
+ ---
7
+
8
+ # Verification & Regression Check
9
+
10
+ Before/after comparison verification. Re-scan fixed code against same 8 dimensions, calculate improvement, detect regressions. Acts as Critic in the optimizer<->verifier Generator-Critic loop.
11
+
12
+ ## Phase 2: Context & Artifact Loading
13
+
14
+ | Input | Source | Required |
15
+ |-------|--------|----------|
16
+ | Original scan report | <session>/scan/scan-report.md | Yes |
17
+ | Fix log | <session>/optimization/fix-log.md | Yes |
18
+ | .msg/meta.json | <session>/wisdom/.msg/meta.json | Yes |
19
+ | Anti-patterns catalog | specs/anti-patterns.md | Yes |
20
+ | Design standards | specs/design-standards.md | Yes |
21
+ | Scoring guide | specs/scoring-guide.md | Yes |
22
+
23
+ 1. Extract session path from task description
24
+ 2. Read original scan report: parse before-scores per dimension and issue inventory
25
+ 3. Read fix log: parse all fixes applied and files modified
26
+ 4. Read specs for scoring reference
27
+
28
+ ## Phase 3: Verification
29
+
30
+ ### Step 1: Re-scan Fixed Code
31
+
32
+ Apply the same 8-dimension scan as the scanner role (reference roles/scanner/role.md Phase 3) to the current state of files. Use identical checklist items and scoring criteria.
33
+
34
+ If Chrome DevTools available:
35
+ - Take screenshots at same 3 viewports (mobile 375px, tablet 768px, desktop 1440px)
36
+ - Save to `<session>/evidence/after-mobile.png`, `after-tablet.png`, `after-desktop.png`
37
+
38
+ ### Step 2: Calculate Score Delta
39
+
40
+ For each dimension, compare before and after:
41
+
42
+ | Dimension | Before | After | Delta | Status |
43
+ |-----------|--------|-------|-------|--------|
44
+ | 1. Anti-Patterns | X/4 | Y/4 | +/-N | improved/same/regressed |
45
+ | 2. Color Quality | X/4 | Y/4 | +/-N | improved/same/regressed |
46
+ | 3. Typography | X/4 | Y/4 | +/-N | improved/same/regressed |
47
+ | 4. Spacing/Layout | X/4 | Y/4 | +/-N | improved/same/regressed |
48
+ | 5. Motion | X/4 | Y/4 | +/-N | improved/same/regressed |
49
+ | 6. Interaction States | X/4 | Y/4 | +/-N | improved/same/regressed |
50
+ | 7. Visual Hierarchy | X/4 | Y/4 | +/-N | improved/same/regressed |
51
+ | 8. Responsive | X/4 | Y/4 | +/-N | improved/same/regressed |
52
+ | **Total** | X/32 | Y/32 | +/-N | |
53
+
54
+ ### Step 3: Regression Detection
55
+
56
+ Check for NEW issues not present in original scan report:
57
+
58
+ | Check | Method |
59
+ |-------|--------|
60
+ | New issues introduced | Compare current issue inventory against original. Any issue not in original = regression |
61
+ | Score dropped | Any dimension score lower than before = regression |
62
+ | Positive findings broken | Items from original "Positive Findings" no longer hold |
63
+ | Build broken | Modified files have syntax errors or lint failures |
64
+
65
+ Classify regressions:
66
+ - **Critical**: Score dropped in any dimension, WCAG AA violation introduced, build broken
67
+ - **Non-critical**: New minor issues introduced but overall score improved
68
+
69
+ ### Step 4: Determine Signal
70
+
71
+ | Condition | Signal |
72
+ |-----------|--------|
73
+ | No regressions AND total score >= before score | `verify_passed` |
74
+ | Non-critical regressions AND total score improved | `verify_failed` (fixable) |
75
+ | Critical regressions OR total score dropped | `fix_required` (urgent) |
76
+
77
+ ## Phase 4: Generate Verification Report
78
+
79
+ Output: `<session>/verification/verify-report.md`
80
+
81
+ ```markdown
82
+ # Verification Report
83
+
84
+ ## Verdict: <PASSED | FAILED | FIX REQUIRED>
85
+
86
+ ## Score Comparison
87
+
88
+ | Dimension | Before | After | Delta |
89
+ |-----------|--------|-------|-------|
90
+ | 1. Anti-Patterns | X/4 | Y/4 | +N |
91
+ | 2. Color Quality | X/4 | Y/4 | +N |
92
+ | 3. Typography | X/4 | Y/4 | +N |
93
+ | 4. Spacing/Layout | X/4 | Y/4 | +N |
94
+ | 5. Motion | X/4 | Y/4 | +N |
95
+ | 6. Interaction States | X/4 | Y/4 | +N |
96
+ | 7. Visual Hierarchy | X/4 | Y/4 | +N |
97
+ | 8. Responsive | X/4 | Y/4 | +N |
98
+ | **Total** | **X/32** | **Y/32** | **+N** |
99
+
100
+ ## Before Rating: <rating-band> -> After Rating: <rating-band>
101
+
102
+ ## Regressions Found
103
+ <list of regressions with location, severity, description>
104
+ <or "None" if clean>
105
+
106
+ ## Remaining Issues
107
+ <issues from original scan that were NOT fixed>
108
+
109
+ ## Improvements
110
+ <per-dimension improvement details>
111
+
112
+ ## Screenshots
113
+ - Before: <session>/evidence/before-*.png
114
+ - After: <session>/evidence/after-*.png
115
+ <or "Chrome DevTools not available" if no screenshots>
116
+
117
+ ## Metadata
118
+ - Original scan: <session>/scan/scan-report.md
119
+ - Fix log: <session>/optimization/fix-log.md
120
+ - GC round: <round number>
121
+ - Timestamp: <ISO timestamp>
122
+ ```
123
+
124
+ After writing the report, send signal-appropriate message:
125
+
126
+ **If verify_passed**:
127
+ ```
128
+ mcp__ccw-tools__team_msg(session_id, role="verifier", type="verify_passed", content="Verification passed. Score: before X/32 -> after Y/32 (+N). No regressions.")
129
+ SendMessage(participant="coordinator", message="[verifier] VERIFY-001 passed. Score: X/32 -> Y/32 (+N). No regressions. Report: <session>/verification/verify-report.md")
130
+ ```
131
+
132
+ **If verify_failed**:
133
+ ```
134
+ mcp__ccw-tools__team_msg(session_id, role="verifier", type="verify_failed", content="Verification failed. N non-critical regressions found. Score: X/32 -> Y/32.")
135
+ SendMessage(participant="coordinator", message="[verifier] VERIFY-001 failed. N regressions (non-critical). Score: X/32 -> Y/32. Report: <session>/verification/verify-report.md")
136
+ ```
137
+
138
+ **If fix_required**:
139
+ ```
140
+ mcp__ccw-tools__team_msg(session_id, role="verifier", type="fix_required", content="Fix required. N critical regressions. Score dropped: X/32 -> Y/32.")
141
+ SendMessage(participant="coordinator", message="[verifier] VERIFY-001 fix_required. N critical regressions. Score: X/32 -> Y/32 (DROPPED). Report: <session>/verification/verify-report.md")
142
+ ```
@@ -0,0 +1,141 @@
1
+ # Anti-Pattern Catalog
2
+
3
+ Complete catalog of UI design anti-patterns from Impeccable's design audit knowledge. Used by scanner for detection and optimizer for remediation.
4
+
5
+ ## The AI Slop Test
6
+
7
+ > "If you showed this to someone and said 'AI made this,' would they believe you immediately? If yes, that is the problem."
8
+
9
+ AI-generated UIs share recognizable fingerprints. These are not inherently bad techniques -- they become problems when used as defaults without intentional design decisions. The issue is not the technique itself but the lack of thought behind it.
10
+
11
+ ## AI Slop Tells (20 Items)
12
+
13
+ ### 1. AI Color Palette
14
+ **Pattern**: Cyan-on-dark (#00d4ff, #06b6d4), purple-to-blue gradients (#8b5cf6 to #3b82f6), neon accents on dark backgrounds.
15
+ **Why it is a tell**: Every AI model defaults to the same "futuristic" palette. It signals zero design intent.
16
+ **Detection**: Search for cyan/purple/neon values on dark backgrounds. Check if palette could be from any Tailwind dark template.
17
+ **Severity**: P1
18
+
19
+ ### 2. Gradient Text for Impact
20
+ **Pattern**: `background-clip: text` + gradient applied to metrics, headings, or hero text.
21
+ **Why it is a tell**: AI uses gradient text as a crutch to make numbers and titles feel "premium." Real typography achieves emphasis through weight, size, and space.
22
+ **Detection**: Search for `background-clip: text` or `-webkit-background-clip: text`.
23
+ **Severity**: P1
24
+
25
+ ### 3. Default Dark Mode with Glowing Accents
26
+ **Pattern**: Dark background (gray-900/950) as default with glowing/neon accent colors. No light mode offered or light mode is an afterthought.
27
+ **Why it is a tell**: Dark mode with glow effects requires no real color decisions. It hides contrast problems and creates false sophistication.
28
+ **Detection**: Check default theme. If dark with glow `box-shadow` or neon colors, flag it.
29
+ **Severity**: P2
30
+
31
+ ### 4. Glassmorphism Everywhere
32
+ **Pattern**: `backdrop-filter: blur()`, glass cards, glow borders (`box-shadow: 0 0 Xpx <color>`), used decoratively on multiple components.
33
+ **Why it is a tell**: Glassmorphism is a valid technique for specific use cases (overlays, elevated surfaces). AI applies it everywhere as the default "modern" aesthetic.
34
+ **Detection**: Count instances of `backdrop-filter: blur`. If > 2 components use it without functional reason, flag.
35
+ **Severity**: P1
36
+
37
+ ### 5. Hero Metric Layout
38
+ **Pattern**: Big number (32-48px) + small label underneath + supporting stats in a row + gradient accent or colored bar.
39
+ **Why it is a tell**: This is the universal "AI dashboard" template. Every AI-generated analytics page uses this exact layout.
40
+ **Detection**: Pattern match for large-number + small-label structures repeated in a metrics row/grid.
41
+ **Severity**: P2
42
+
43
+ ### 6. Identical Card Grids
44
+ **Pattern**: Same-sized cards with icon + heading + body text repeated 3-6 times in a grid. Equal width, equal height, equal spacing.
45
+ **Why it is a tell**: Real content varies in importance. AI treats all items as equally important because it has no content strategy.
46
+ **Detection**: Grid of 3+ cards with identical structure and sizing. No featured/hero card.
47
+ **Severity**: P2
48
+
49
+ ### 7. Nested Cards
50
+ **Pattern**: Cards inside cards. `.card > .card-body > .inner-card`. Multiple layers of bordered containers.
51
+ **Why it is a tell**: AI nests containers to create visual "depth." It actually creates noise and makes hierarchy unclear.
52
+ **Detection**: Search for elements with border/shadow inside elements with border/shadow. Two levels of containment.
53
+ **Severity**: P2
54
+
55
+ ### 8. Generic Fonts
56
+ **Pattern**: Inter, Roboto, Arial, Open Sans, Lato, Montserrat, system-ui used as primary font without intentional choice.
57
+ **Why it is a tell**: These are defaults. AI picks them because they are safe. Safe means forgettable.
58
+ **Detection**: Check `font-family` declarations. If primary font is in the generic list, flag.
59
+ **Severity**: P2
60
+
61
+ ### 9. Rounded Rectangles with Generic Drop Shadows
62
+ **Pattern**: `border-radius: 8-16px` combined with `box-shadow: 0 1-4px 6-24px rgba(0,0,0,0.05-0.15)` on every container.
63
+ **Why it is a tell**: The "safe shape." Every AI output uses this exact combination because it is never wrong -- but never distinctive either.
64
+ **Detection**: Count elements with both border-radius (8-16px range) and generic box-shadow. If > 5, flag.
65
+ **Severity**: P3
66
+
67
+ ### 10. Large Icons Above Every Heading
68
+ **Pattern**: 24-48px icons with rounded corners or colored backgrounds placed above every heading or card title.
69
+ **Why it is a tell**: AI uses icons as visual filler. Real design uses icons sparingly where they aid comprehension.
70
+ **Detection**: Pattern match for icon elements directly above heading elements. If repeated 3+ times, flag.
71
+ **Severity**: P2
72
+
73
+ ### 11. One-Side Border Accent
74
+ **Pattern**: `border-left: 3-4px solid <accent-color>` or `border-top` used as the primary accent technique on cards/containers.
75
+ **Why it is a tell**: Lazy accent. It is a shortcut to add "personality" without making real design decisions.
76
+ **Detection**: Search for `border-left: [2-5]px solid` or `border-top: [2-5]px solid` with accent colors.
77
+ **Severity**: P3
78
+
79
+ ### 12. Decorative Sparklines
80
+ **Pattern**: Tiny charts, mini-graphs, or trend indicators that look sophisticated but convey no actionable data. Often in card corners.
81
+ **Why it is a tell**: AI adds charts to appear data-driven. If the chart has no axis labels, no values, and no interaction, it is decoration.
82
+ **Detection**: Small SVG/canvas charts (<100px) without labels, tooltips, or legends.
83
+ **Severity**: P2
84
+
85
+ ### 13. Bounce/Elastic Easing
86
+ **Pattern**: `cubic-bezier(0.68, -0.55, 0.265, 1.55)`, spring animations, or any easing that overshoots.
87
+ **Why it is a tell**: Bounce easing was trendy circa 2015. AI still defaults to it for "playfulness." It feels dated and tacky in modern UI.
88
+ **Detection**: Search for cubic-bezier with negative values or spring keyword.
89
+ **Severity**: P2
90
+
91
+ ### 14. Redundant Copy
92
+ **Pattern**: Intro paragraphs that restate the heading. "Welcome to your Dashboard. This is your dashboard where you can see..."
93
+ **Why it is a tell**: AI generates text to fill space. Real UX uses headings as the message and body for additional context only.
94
+ **Detection**: Compare heading text with first paragraph. If >50% word overlap, flag.
95
+ **Severity**: P3
96
+
97
+ ### 15. All Buttons Primary
98
+ **Pattern**: Every button is filled/primary color. No ghost buttons, text links, outline buttons, or secondary variants.
99
+ **Why it is a tell**: AI makes everything important. Real design creates hierarchy: 1 primary, 1-2 secondary, rest tertiary.
100
+ **Detection**: Check button variants. If all buttons have same fill/color treatment, flag.
101
+ **Severity**: P1
102
+
103
+ ### 16. Everything Centered
104
+ **Pattern**: `text-align: center` or `justify-content: center` / `align-items: center` on most content blocks including body text.
105
+ **Why it is a tell**: Centering is the safe choice. Real design uses left-alignment for readability, centering only for specific elements (headings, hero).
106
+ **Detection**: Count centered text blocks. If body text is centered, flag. If > 60% of content sections are centered, flag.
107
+ **Severity**: P2
108
+
109
+ ### 17. Same Spacing Everywhere
110
+ **Pattern**: Identical padding/margin on all cards, sections, and components. No variation in spacing rhythm.
111
+ **Why it is a tell**: AI applies uniform spacing because it has no sense of content grouping or visual rhythm.
112
+ **Detection**: Extract all padding/margin values. If > 70% are the same value, flag.
113
+ **Severity**: P2
114
+
115
+ ### 18. Monospace as Tech Aesthetic
116
+ **Pattern**: Monospace font (Fira Code, JetBrains Mono, Source Code Pro) used for non-code content to appear "techy."
117
+ **Why it is a tell**: AI equates monospace with "developer tool" aesthetic. Real design uses monospace only for actual code.
118
+ **Detection**: Monospace `font-family` on non-`<code>`, non-`<pre>` elements.
119
+ **Severity**: P3
120
+
121
+ ### 19. Modal Overuse
122
+ **Pattern**: Modals for confirmations, settings changes, form entries, when inline editing, drawers, or expandable sections would work.
123
+ **Why it is a tell**: Modals are AI's default "interaction" pattern because they are self-contained. Real UX considers context loss and flow interruption.
124
+ **Detection**: Count modal/dialog components. If > 3 modals for non-critical actions, flag.
125
+ **Severity**: P3
126
+
127
+ ### 20. Pure Black or Pure White
128
+ **Pattern**: `#000000` or `#ffffff` used as primary background/text colors without any tint.
129
+ **Why it is a tell**: Pure black and white create harsh contrast and feel sterile. Real design tints toward a brand hue.
130
+ **Detection**: Search for `#000`, `#000000`, `rgb(0,0,0)`, `#fff`, `#ffffff`, `rgb(255,255,255)` in styles.
131
+ **Severity**: P1
132
+
133
+ ## Scoring Guide
134
+
135
+ | Score | Tells Present | Label |
136
+ |-------|---------------|-------|
137
+ | 0 | 5+ tells | AI Slop Gallery |
138
+ | 1 | 3-4 tells | Heavy AI Influence |
139
+ | 2 | 1-2 tells | Some AI Tells |
140
+ | 3 | Subtle traces only | Mostly Clean |
141
+ | 4 | Zero tells, distinctive | Genuinely Intentional |
@@ -0,0 +1,356 @@
1
+ # Design Standards
2
+
3
+ Impeccable's positive design standards. These are the target state -- what good looks like. Used by scanner for scoring (how close to ideal) and optimizer as fix targets.
4
+
5
+ ---
6
+
7
+ ## Color
8
+
9
+ ### Principles
10
+ - Use **OKLCH** for perceptually uniform palettes. Colors at the same lightness actually look the same lightness
11
+ - Tint neutrals toward brand hue (chroma 0.005-0.01). Never pure gray
12
+ - **60-30-10 rule**: 60% neutral, 30% secondary/supporting, 10% accent
13
+ - Semantic token hierarchy: primitive -> semantic -> component tokens
14
+ - Never pure black (`#000`) or pure white (`#fff`). Always tint
15
+
16
+ ### Color Token Structure
17
+ ```
18
+ --color-primary oklch(0.55 0.2 250)
19
+ --color-primary-hover oklch(0.50 0.22 250)
20
+ --color-primary-active oklch(0.45 0.22 250)
21
+
22
+ --color-neutral-50 oklch(0.98 0.005 250) /* near-white, brand tinted */
23
+ --color-neutral-100 oklch(0.95 0.005 250)
24
+ --color-neutral-200 oklch(0.90 0.007 250)
25
+ --color-neutral-300 oklch(0.80 0.007 250)
26
+ --color-neutral-400 oklch(0.65 0.008 250)
27
+ --color-neutral-500 oklch(0.50 0.008 250)
28
+ --color-neutral-600 oklch(0.40 0.008 250)
29
+ --color-neutral-700 oklch(0.30 0.008 250)
30
+ --color-neutral-800 oklch(0.20 0.010 250)
31
+ --color-neutral-900 oklch(0.13 0.010 250)
32
+ --color-neutral-950 oklch(0.08 0.010 250) /* near-black, brand tinted */
33
+
34
+ --color-success oklch(0.65 0.18 145)
35
+ --color-warning oklch(0.75 0.15 85)
36
+ --color-error oklch(0.55 0.22 25)
37
+ --color-info oklch(0.60 0.15 250)
38
+
39
+ --color-surface var(--color-neutral-50)
40
+ --color-surface-raised var(--color-neutral-100)
41
+ --color-surface-overlay var(--color-neutral-900 / 0.5)
42
+
43
+ --color-text-primary var(--color-neutral-900)
44
+ --color-text-secondary var(--color-neutral-600)
45
+ --color-text-muted var(--color-neutral-400)
46
+ ```
47
+
48
+ ### Contrast Requirements (WCAG AA)
49
+ - Normal text (<18px / <24px bold): 4.5:1 minimum
50
+ - Large text (>=18px / >=24px bold): 3:1 minimum
51
+ - UI components and graphical objects: 3:1 minimum
52
+ - Focus indicators: 3:1 against adjacent colors
53
+
54
+ ### Text on Colored Backgrounds
55
+ - Never gray text on colored backgrounds (looks washed out)
56
+ - Use shade of the background color, or white/dark with transparency
57
+ - `color-mix(in oklch, var(--bg-color) 30%, black)` for text on colored surfaces
58
+
59
+ ---
60
+
61
+ ## Typography
62
+
63
+ ### Font Selection
64
+ Avoid: Inter, Roboto, Open Sans, Lato, Montserrat, Arial (overused defaults).
65
+
66
+ Recommended alternatives by category:
67
+ - **Sans-serif body**: Instrument Sans, Plus Jakarta Sans, DM Sans, Geist, General Sans
68
+ - **Sans-serif display**: Space Grotesk, Manrope, Outfit, Satoshi, Clash Display
69
+ - **Serif display**: Fraunces, Playfair Display 2, Source Serif 4
70
+ - **Monospace (code only)**: Geist Mono, JetBrains Mono, Fira Code
71
+
72
+ ### Modular Type Scale
73
+ Choose one ratio and apply consistently:
74
+
75
+ | Ratio | Name | Scale (base 16px) |
76
+ |-------|------|--------------------|
77
+ | 1.125 | Major Second | 16, 18, 20.25, 22.78, 25.63 |
78
+ | 1.200 | Minor Third | 16, 19.2, 23.04, 27.65, 33.18 |
79
+ | 1.250 | Major Third | 16, 20, 25, 31.25, 39.06 |
80
+ | 1.333 | Perfect Fourth | 16, 21.33, 28.43, 37.9, 50.52 |
81
+ | 1.500 | Perfect Fifth | 16, 24, 36, 54, 81 |
82
+
83
+ ### Fluid Sizing
84
+ Use `clamp()` for display text:
85
+ ```css
86
+ --text-xs: 0.75rem; /* 12px, fixed */
87
+ --text-sm: 0.875rem; /* 14px, fixed */
88
+ --text-base: 1rem; /* 16px, body */
89
+ --text-lg: 1.125rem; /* 18px */
90
+ --text-xl: clamp(1.25rem, 1.1rem + 0.5vw, 1.5rem); /* 20-24px */
91
+ --text-2xl: clamp(1.5rem, 1.2rem + 1vw, 2rem); /* 24-32px */
92
+ --text-3xl: clamp(1.875rem, 1.4rem + 1.5vw, 2.5rem); /* 30-40px */
93
+ --text-4xl: clamp(2.25rem, 1.5rem + 2.5vw, 3.5rem); /* 36-56px */
94
+ ```
95
+
96
+ ### Line Height & Spacing
97
+ - Body text: `line-height: 1.5` (24px at 16px base)
98
+ - Headings: `line-height: 1.2` (tighter)
99
+ - Small text / captions: `line-height: 1.6`
100
+ - Reading width: `max-width: 65ch` (range: 45-75ch)
101
+
102
+ ### Loading
103
+ - `font-display: swap` on all custom fonts
104
+ - Provide `size-adjust`, `ascent-override`, `descent-override` on fallback for minimal CLS
105
+
106
+ ---
107
+
108
+ ## Spacing
109
+
110
+ ### 4pt Base Scale
111
+ ```css
112
+ --space-0: 0;
113
+ --space-1: 0.25rem; /* 4px */
114
+ --space-2: 0.5rem; /* 8px */
115
+ --space-3: 0.75rem; /* 12px */
116
+ --space-4: 1rem; /* 16px */
117
+ --space-5: 1.25rem; /* 20px */
118
+ --space-6: 1.5rem; /* 24px */
119
+ --space-8: 2rem; /* 32px */
120
+ --space-10: 2.5rem; /* 40px */
121
+ --space-12: 3rem; /* 48px */
122
+ --space-16: 4rem; /* 64px */
123
+ --space-24: 6rem; /* 96px */
124
+ ```
125
+
126
+ ### Rhythm
127
+ - **Tight**: 4-8px within component groups (e.g., label + input, icon + text)
128
+ - **Comfortable**: 16-24px between related items (e.g., list items, form fields)
129
+ - **Generous**: 48-96px between major sections (e.g., page sections, content blocks)
130
+
131
+ Monotonous spacing (same value everywhere) = no rhythm = boring. Vary spacing intentionally.
132
+
133
+ ### Layout Principles
134
+ - Use `gap` instead of `margin` for sibling spacing
135
+ - Cards only when content is truly distinct and actionable. Not everything needs a card
136
+ - Flatten nested cards -- use spacing + subtle dividers instead
137
+ - Container queries (`@container`) for component-level responsive
138
+ - Touch targets: minimum 44x44px for all interactive elements
139
+ - Optical adjustments: visually center, not mathematically center (e.g., play button in circle needs right offset)
140
+
141
+ ---
142
+
143
+ ## Motion
144
+
145
+ ### Property Rules
146
+ - **Animate ONLY**: `transform`, `opacity`, `clip-path`, `background-color`, `color`, `border-color`, `box-shadow`, `filter`
147
+ - **NEVER animate**: `width`, `height`, `top`, `left`, `right`, `bottom`, `margin`, `padding` (triggers layout)
148
+
149
+ ### Easing
150
+ - **Default (ease-out-quart)**: `cubic-bezier(0.25, 1, 0.5, 1)` -- decelerates naturally
151
+ - **Enter (ease-out)**: `cubic-bezier(0, 0, 0.25, 1)` -- elements arrive and settle
152
+ - **Exit (ease-in)**: `cubic-bezier(0.5, 0, 0.75, 0)` -- elements accelerate away
153
+ - **NEVER**: `ease` (default), `linear` (mechanical), bounce/elastic (dated)
154
+
155
+ ### Duration Scale
156
+ ```css
157
+ --duration-instant: 100ms; /* tooltip show, ripple */
158
+ --duration-fast: 150ms; /* button hover, focus ring */
159
+ --duration-normal: 250ms; /* dropdown open, tab switch */
160
+ --duration-slow: 400ms; /* modal open, sidebar slide */
161
+ --duration-entrance: 500ms; /* page entrance, hero animation */
162
+ --duration-complex: 800ms; /* complex sequence, page transition */
163
+ ```
164
+
165
+ - Exit = 75% of entrance duration
166
+ - Feedback (hover, active, focus): 100-150ms maximum
167
+ - State change: 200-300ms
168
+ - Layout change: 300-500ms
169
+
170
+ ### Stagger
171
+ - Max visible items to stagger: 10
172
+ - Total stagger duration: max 500ms
173
+ - Formula: `animation-delay: calc(var(--index) * 50ms)`
174
+ - Cap: `animation-delay: min(calc(var(--index) * 50ms), 500ms)`
175
+
176
+ ### Reduced Motion
177
+ **Required** -- affects ~35% of adults over 40:
178
+ ```css
179
+ @media (prefers-reduced-motion: reduce) {
180
+ *,
181
+ *::before,
182
+ *::after {
183
+ animation-duration: 0.01ms !important;
184
+ animation-iteration-count: 1 !important;
185
+ transition-duration: 0.01ms !important;
186
+ scroll-behavior: auto !important;
187
+ }
188
+ }
189
+ ```
190
+
191
+ ### will-change
192
+ - Do NOT set in CSS (wastes GPU memory permanently)
193
+ - Add via JS on `pointerenter` / `focusin`
194
+ - Remove on `animationend` / `transitionend`
195
+
196
+ ---
197
+
198
+ ## Interaction States
199
+
200
+ ### The 8 Required States
201
+
202
+ Every interactive element must define:
203
+
204
+ | State | CSS | Visual Change |
205
+ |-------|-----|---------------|
206
+ | Default | -- | Base appearance |
207
+ | Hover | `:hover` (wrap in `@media(hover:hover)`) | Subtle background/opacity change |
208
+ | Focus | `:focus-visible` | Focus ring: 2px solid accent, offset 2px |
209
+ | Active | `:active` | Scale down (0.97) or darker background |
210
+ | Disabled | `[disabled], [aria-disabled="true"]` | Opacity 0.5, cursor not-allowed |
211
+ | Loading | `[aria-busy="true"]` | Spinner/skeleton, disable interaction |
212
+ | Error | `[aria-invalid="true"]` | Red border, error message below |
213
+ | Success | custom class/attribute | Green check, success message |
214
+
215
+ ### Focus Ring Specification
216
+ ```css
217
+ :focus-visible {
218
+ outline: 2px solid var(--color-primary);
219
+ outline-offset: 2px;
220
+ border-radius: inherit;
221
+ }
222
+
223
+ /* Only remove outline for mouse clicks */
224
+ :focus:not(:focus-visible) {
225
+ outline: none;
226
+ }
227
+ ```
228
+
229
+ Focus ring contrast: 3:1 minimum against all adjacent colors.
230
+
231
+ ### Form Labels
232
+ - Always provide visible `<label>` elements
233
+ - Placeholders are hints, NOT labels (they disappear)
234
+ - Use `aria-labelledby` or `aria-label` for icon-only buttons
235
+ - Error messages: `aria-describedby` linking input to error text
236
+
237
+ ### Touch Targets
238
+ - Minimum: 44x44px (WCAG 2.5.5 AAA) / 24x24px (WCAG 2.5.8 AA minimum)
239
+ - Use padding to increase hit area without changing visual size
240
+ - Minimum 8px gap between adjacent targets
241
+
242
+ ---
243
+
244
+ ## Visual Hierarchy
245
+
246
+ ### Squint Test
247
+ Blur the page (or squint). You should immediately identify:
248
+ 1. The most important element (usually primary heading or CTA)
249
+ 2. The second most important element
250
+ 3. Clear groupings of related content
251
+
252
+ If everything looks the same when blurred, hierarchy has failed.
253
+
254
+ ### Hierarchy Tools (use 2-3 together)
255
+ | Tool | Effect |
256
+ |------|--------|
257
+ | Size | Larger = more important. 3:1 ratio between major levels |
258
+ | Weight | Bold vs regular vs light. Maximum 2 weights per page |
259
+ | Color | Saturated vs muted. Primary color for emphasis |
260
+ | Space | More surrounding space = more important |
261
+ | Position | Top-left reads first (in LTR). Above fold > below fold |
262
+ | Contrast | High contrast = more important. Low contrast recedes |
263
+
264
+ ### Primary Action Rule
265
+ - Only 1 primary CTA per viewport
266
+ - Primary: filled button, highest contrast, most saturated
267
+ - Secondary: outline/ghost button
268
+ - Tertiary: text link, no background
269
+
270
+ ### Progressive Disclosure
271
+ - Show summary first, detail on demand
272
+ - Expandable sections, "show more," detail panels
273
+ - Do not dump all information at once
274
+
275
+ ---
276
+
277
+ ## Responsive Design
278
+
279
+ ### Breakpoints
280
+ ```css
281
+ /* Mobile first */
282
+ --bp-sm: 640px; /* Small tablets */
283
+ --bp-md: 768px; /* Tablets */
284
+ --bp-lg: 1024px; /* Laptops */
285
+ --bp-xl: 1280px; /* Desktops */
286
+ --bp-2xl: 1536px; /* Large screens */
287
+ ```
288
+
289
+ ### Fluid Design Principles
290
+ - Use `%`, `vw`, `fr`, `min()`, `max()`, `clamp()` instead of fixed `px` widths
291
+ - `max-width` instead of `width` for containers
292
+ - Grid with `fr` units for responsive layouts
293
+ - Container queries (`@container`) for component-level responsiveness
294
+
295
+ ### Mobile Requirements
296
+ - Minimum text: 14px (0.875rem), prefer 16px for body
297
+ - Touch targets: 44x44px minimum
298
+ - No horizontal scroll at >= 320px viewport
299
+ - Must have `<meta name="viewport" content="width=device-width, initial-scale=1">`
300
+ - Images: `max-width: 100%; height: auto`
301
+
302
+ ### Adapt, Don't Hide
303
+ - Content should be restructured for smaller screens, not hidden
304
+ - Stack horizontal layouts vertically
305
+ - Use accordion/tabs for complex content
306
+ - Simplify navigation (hamburger, bottom nav)
307
+
308
+ ---
309
+
310
+ ## UX Writing
311
+
312
+ ### Button Labels
313
+ - NEVER: "OK", "Submit", "Yes", "No" (generic)
314
+ - ALWAYS: verb + object — "Save changes", "Create account", "Delete message"
315
+ - Destructive: name the destruction + count — "Delete 5 items"
316
+
317
+ ### Error Messages
318
+ Formula: what happened + why + how to fix
319
+ - "Password must be 8+ characters with a number" not "Invalid password"
320
+ - Never blame user, never use codes alone
321
+ - Preserve user input on error
322
+
323
+ ### Empty States
324
+ Acknowledge + explain value + provide action
325
+ - "No projects yet. Create your first project to start collaborating. [Create project]"
326
+
327
+ ### Loading Text
328
+ - Specific: "Saving your draft..." not "Loading..."
329
+ - Multi-step: "Uploading (2 of 5 files)..."
330
+
331
+ ### Consistency
332
+ - One term per concept (delete/remove → pick one)
333
+ - Same icon for same action everywhere
334
+
335
+ ---
336
+
337
+ ## Dark Mode (when present)
338
+
339
+ ### Rules
340
+ - NOT inverted light mode — requires deliberate design
341
+ - **Surface hierarchy**: lighter surfaces = higher elevation
342
+ - Base: `oklch(0.10-0.15 0.01 <hue>)`
343
+ - Raised: `oklch(0.18-0.22 0.01 <hue>)`
344
+ - Overlay: `oklch(0.24-0.28 0.01 <hue>)`
345
+ - **Font weight**: reduce by 1 step (600→500, 500→400) — light text on dark looks heavier
346
+ - **Accent colors**: desaturate — reduce OKLCH chroma by 0.05-0.10 from light theme values
347
+ - Never: pure black `#000` background
348
+
349
+ ### Dangerous Combinations
350
+ | Combination | Problem | Fix |
351
+ |-------------|---------|-----|
352
+ | Gray on colored bg | Washed out | Use shade of bg color or white with opacity |
353
+ | Red + Green adjacent | Color blindness | Add icons/patterns |
354
+ | Yellow on white | Invisible | Use dark amber |
355
+ | Thin light text on images | Unpredictable contrast | Text shadow or overlay |
356
+ | Saturated on dark | Visual vibration | Desaturate chroma |