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,222 @@
1
+ ---
2
+ role: focus-auditor
3
+ prefix: FOCUS
4
+ inner_loop: false
5
+ message_types: [state_update]
6
+ ---
7
+
8
+ # Focus & Keyboard Accessibility Auditor
9
+
10
+ Focus-visible completeness audit. Tab order, focus indicator visibility (3:1 contrast), skip link, focus traps, ARIA live regions, keyboard operability. Produce detailed focus audit report with element-by-element analysis.
11
+
12
+ ## Phase 2: Context & Environment Detection
13
+
14
+ | Input | Source | Required |
15
+ |-------|--------|----------|
16
+ | Task description | From task subject/description | Yes |
17
+ | Session path | Extracted from task description | Yes |
18
+ | Target (URL or file paths) | From task description CONTEXT | Yes |
19
+ | WCAG level (AA/AAA) | From task description CONTEXT | Yes |
20
+ | .msg/meta.json | <session>/.msg/meta.json | No |
21
+ | Previous audit (re-audit) | <session>/audits/focus/focus-audit-*.md | Only for FOCUS-002+ |
22
+
23
+ 1. Extract session path, target, and WCAG level from task description
24
+ 2. Determine audit type from subject: FOCUS-001 -> initial audit, FOCUS-002+ -> re-audit (verification)
25
+ 3. Identify target:
26
+ - URL -> use Chrome DevTools for interactive focus testing
27
+ - File paths -> read HTML/JSX/Vue/Svelte files for interactive elements
28
+ - Full site -> enumerate pages from navigation/routes
29
+ 4. For re-audit: read previous audit report and fix summary for comparison baseline
30
+ 5. Read focus patterns from specs/focus-patterns.md for reference
31
+
32
+ ## Phase 3: Focus Audit Execution
33
+
34
+ ### Step 1: Interactive Element Inventory
35
+
36
+ **Static analysis** (always):
37
+ - Glob for HTML/JSX/TSX/Vue/Svelte files
38
+ - Extract all interactive elements:
39
+ - Native focusable: `<a href>`, `<button>`, `<input>`, `<select>`, `<textarea>`, `<details>`
40
+ - Custom focusable: elements with `tabindex`, `role="button"`, `role="link"`, `role="tab"`, etc.
41
+ - Modals/dialogs: `role="dialog"`, `role="alertdialog"`, `<dialog>`
42
+ - Dynamic content areas: `aria-live`, `role="status"`, `role="alert"`
43
+ - Record source location (file:line) and context for each element
44
+
45
+ **Runtime analysis** (if Chrome DevTools available):
46
+ - `mcp__chrome-devtools__navigate_page({ url: "<target-url>" })`
47
+ - `mcp__chrome-devtools__evaluate_script({ expression: "..." })` to:
48
+ - Enumerate all focusable elements in DOM order
49
+ - Check `tabindex` values (0, -1, positive)
50
+ - Detect focus traps (elements that prevent Tab from escaping)
51
+
52
+ ### Step 2: Tab Order Audit
53
+
54
+ | Check | Criterion | Standard |
55
+ |-------|-----------|----------|
56
+ | Logical sequence | Tab order follows visual/reading order | WCAG 2.4.3 |
57
+ | No positive tabindex | `tabindex > 0` is an anti-pattern | Best practice |
58
+ | No tab traps | Tab can escape all containers (except modals) | WCAG 2.1.2 |
59
+ | Skip link first | First focusable element is skip-to-content link | WCAG 2.4.1 |
60
+ | All interactive reachable | Every interactive element reachable via Tab | WCAG 2.1.1 |
61
+
62
+ Flag:
63
+ - `tabindex > 0` (disrupts natural tab order)
64
+ - `tabindex="-1"` on elements that should be focusable
65
+ - Missing `tabindex="0"` on custom interactive elements
66
+ - `outline: none` or `outline: 0` without alternative focus indicator
67
+
68
+ ### Step 3: Focus Indicator Visibility
69
+
70
+ Per specs/focus-patterns.md:
71
+
72
+ | Check | Requirement | Standard |
73
+ |-------|-------------|----------|
74
+ | Outline present | At least 2px outline on :focus-visible | WCAG 2.4.7 |
75
+ | Outline contrast | >= 3:1 against adjacent colors | WCAG 2.4.11 |
76
+ | :focus-visible used | Keyboard focus distinct from mouse click | Best practice |
77
+ | Not obscured | Focus indicator not hidden by overlays, sticky headers | WCAG 2.4.11 |
78
+ | Consistent style | Same focus style across similar elements | Best practice |
79
+
80
+ **CSS analysis**:
81
+ - Search for `:focus`, `:focus-visible`, `:focus-within` rules
82
+ - Check for `outline: none` / `outline: 0` without alternative (box-shadow, border)
83
+ - Verify `:focus:not(:focus-visible) { outline: none; }` pattern (mouse click suppression)
84
+ - Calculate focus indicator contrast against adjacent background
85
+
86
+ ### Step 4: Skip Link Audit
87
+
88
+ | Check | Requirement |
89
+ |-------|-------------|
90
+ | Exists | `<a href="#main">` or similar as first focusable element |
91
+ | Visually hidden until focus | `position: absolute; left: -9999px` pattern |
92
+ | Visible on focus | Repositions on `:focus` to visible area |
93
+ | Target exists | `#main` or target ID exists in DOM |
94
+ | Functional | Focus moves to main content on activation |
95
+
96
+ ### Step 5: Focus Trap Audit (Modals/Dialogs)
97
+
98
+ Per specs/focus-patterns.md:
99
+
100
+ | Check | Requirement | Standard |
101
+ |-------|-------------|----------|
102
+ | Focus moves to dialog | On open, focus moves to first focusable or dialog itself | ARIA Practices |
103
+ | Tab cycles within | Tab/Shift+Tab stay within dialog focusable elements | ARIA Practices |
104
+ | Escape closes | Escape key closes dialog | ARIA Practices |
105
+ | Focus restores | On close, focus returns to trigger element | ARIA Practices |
106
+ | Background inert | Background content not focusable while dialog open | Best practice |
107
+ | Scroll lock | Background scroll locked while dialog open | Best practice |
108
+
109
+ ### Step 6: ARIA Audit
110
+
111
+ | Element Type | Required ARIA | Standard |
112
+ |-------------|--------------|----------|
113
+ | Buttons | `role="button"` (if not `<button>`), `aria-pressed` (toggle), `aria-expanded` (disclosure) | WCAG 4.1.2 |
114
+ | Dialogs | `role="dialog"`, `aria-modal="true"`, `aria-labelledby` | ARIA Practices |
115
+ | Navigation | `role="navigation"` (if not `<nav>`), `aria-label` for multiple nav regions | WCAG 4.1.2 |
116
+ | Live regions | `aria-live="polite"` (status), `aria-live="assertive"` (errors) | WCAG 4.1.3 |
117
+ | Forms | `aria-required`, `aria-invalid`, `aria-describedby` for errors | WCAG 4.1.2 |
118
+ | Tabs | `role="tablist"`, `role="tab"`, `role="tabpanel"`, `aria-selected` | ARIA Practices |
119
+ | Accordions | `aria-expanded`, `aria-controls` | ARIA Practices |
120
+
121
+ ### Step 7: Keyboard Operability
122
+
123
+ | Element | Expected Keys | Standard |
124
+ |---------|--------------|----------|
125
+ | Links/buttons | Enter activates | WCAG 2.1.1 |
126
+ | Buttons | Space activates | WCAG 2.1.1 |
127
+ | Checkboxes | Space toggles | WCAG 2.1.1 |
128
+ | Radio groups | Arrow keys navigate within group | ARIA Practices |
129
+ | Tabs | Arrow keys switch tabs, Tab moves to panel | ARIA Practices |
130
+ | Menus | Arrow keys navigate, Enter selects, Escape closes | ARIA Practices |
131
+ | Sliders | Arrow keys adjust value | ARIA Practices |
132
+
133
+ ### Input Method Awareness
134
+
135
+ | Check | Requirement |
136
+ |-------|-------------|
137
+ | Hover guard | `:hover` styles wrapped in `@media(hover:hover)` — touch devices don't hover |
138
+ | Pointer detection | `@media(pointer:coarse)` used for larger touch targets (48px+) |
139
+ | Focus-visible distinction | `:focus-visible` for keyboard only, not mouse clicks |
140
+ | Touch target sizing | All interactive elements >= 44x44px on `pointer:coarse` devices |
141
+
142
+ ### Step 8: Target Size (WCAG 2.5.8)
143
+
144
+ | Check | Requirement | Standard |
145
+ |-------|-------------|----------|
146
+ | Interactive elements | Minimum 24x24px CSS pixels | WCAG 2.5.8 AA |
147
+ | Inline links | Exempt if within text paragraph | Exception |
148
+ | Spacing | At least 24px between targets OR targets themselves >= 24px | WCAG 2.5.8 |
149
+
150
+ ## Phase 4: Report Generation & Output
151
+
152
+ 1. Write audit report to `<session>/audits/focus/focus-audit-{NNN}.md` (or `<session>/re-audit/focus-audit-{NNN}.md` for re-audits):
153
+
154
+ ```markdown
155
+ # Focus & Keyboard Accessibility Audit - {NNN}
156
+ [focus-auditor]
157
+
158
+ ## Summary
159
+ - **Total interactive elements**: {count}
160
+ - **Pass**: {pass_count} | **Fail**: {fail_count}
161
+ - **WCAG Level**: {AA|AAA}
162
+ - **Critical issues**: {count}
163
+ - **High issues**: {count}
164
+
165
+ ## Tab Order
166
+ | # | Element | Type | tabindex | Logical | Status |
167
+ |---|---------|------|----------|---------|--------|
168
+ | 1 | Skip link | <a> | 0 | Yes | PASS |
169
+ | 2 | Logo link | <a> | 0 | Yes | PASS |
170
+ | ... | ... | ... | ... | ... | ... |
171
+
172
+ ## Focus Indicators
173
+ | Element | :focus-visible | Outline | Contrast | Obscured | Status |
174
+ |---------|---------------|---------|----------|----------|--------|
175
+ | ... | yes/no | Xpx solid | X:1 | no | PASS/FAIL |
176
+
177
+ ## Skip Link
178
+ | Check | Status | Details |
179
+ |-------|--------|---------|
180
+ | Exists | PASS/FAIL | ... |
181
+ | Hidden until focus | PASS/FAIL | ... |
182
+ | Target exists | PASS/FAIL | ... |
183
+
184
+ ## Focus Traps (Modals/Dialogs)
185
+ | Dialog | Focus on open | Tab cycles | Escape closes | Focus restores | Status |
186
+ |--------|-------------|-----------|--------------|---------------|--------|
187
+ | ... | yes/no | yes/no | yes/no | yes/no | PASS/FAIL |
188
+
189
+ ## ARIA Coverage
190
+ | Element | Role | Label | States | Status |
191
+ |---------|------|-------|--------|--------|
192
+ | ... | ... | ... | ... | PASS/FAIL |
193
+
194
+ ## Keyboard Operability
195
+ | Element | Enter | Space | Arrows | Escape | Status |
196
+ |---------|-------|-------|--------|--------|--------|
197
+ | ... | yes/no | yes/no | n/a | n/a | PASS/FAIL |
198
+
199
+ ## Target Size
200
+ | Element | Size | Min 24x24 | Status |
201
+ |---------|------|----------|--------|
202
+ | ... | WxH | yes/no | PASS/FAIL |
203
+
204
+ ## Issues (by severity)
205
+ ### Critical
206
+ - ...
207
+ ### High
208
+ - ...
209
+ ### Medium
210
+ - ...
211
+ ```
212
+
213
+ 2. For re-audit (FOCUS-002+), add before/after comparison section:
214
+ ```markdown
215
+ ## Before/After Comparison
216
+ | Element | Before | After | Status |
217
+ |---------|--------|-------|--------|
218
+ | ... | FAIL (no outline) | PASS (2px solid) | FIXED |
219
+ ```
220
+
221
+ 3. Update `<session>/.msg/meta.json` under `focus-auditor` namespace:
222
+ - Read existing -> merge `{ "focus-auditor": { audit_id, total_elements, pass_count, fail_count, critical_count, high_count, skip_link_present, focus_traps_valid, timestamp } }` -> write back
@@ -0,0 +1,206 @@
1
+ ---
2
+ role: remediation-planner
3
+ prefix: REMED
4
+ inner_loop: false
5
+ message_types: [state_update]
6
+ ---
7
+
8
+ # Remediation Planner
9
+
10
+ Synthesize findings from all 3 audit reports (color, typography, focus) into a prioritized remediation plan with code-level fix guidance. Map each issue to WCAG success criterion, estimate effort, and group by file/component for efficient fixing.
11
+
12
+ ## Phase 2: Context & Artifact Loading
13
+
14
+ | Input | Source | Required |
15
+ |-------|--------|----------|
16
+ | Task description | From task subject/description | Yes |
17
+ | Session path | Extracted from task description | Yes |
18
+ | Color audit report | <session>/audits/color/color-audit-001.md | Yes |
19
+ | Typography audit report | <session>/audits/typography/typo-audit-001.md | Yes |
20
+ | Focus audit report | <session>/audits/focus/focus-audit-001.md | Yes |
21
+ | WCAG level (AA/AAA) | From task description CONTEXT | Yes |
22
+ | .msg/meta.json | <session>/.msg/meta.json | Yes |
23
+
24
+ 1. Extract session path and WCAG level from task description
25
+ 2. Read ALL 3 audit reports -- all must exist (REMED-001 is blocked by all 3 auditors)
26
+ 3. Parse each report for:
27
+ - Issues by severity (Critical/High/Medium)
28
+ - Specific elements and file:line locations
29
+ - Current values vs required values
30
+ 4. Read meta.json for auditor summary stats
31
+
32
+ ## Phase 3: Remediation Plan Synthesis
33
+
34
+ ### Step 1: Issue Collection & Deduplication
35
+
36
+ Collect all issues from 3 audit reports:
37
+
38
+ | Source | Issue Types |
39
+ |--------|------------|
40
+ | Color audit | Contrast failures, OKLCH range violations, color blindness risks, dark mode gaps |
41
+ | Typography audit | Size violations, line-height issues, reading width, clamp() failures, font loading |
42
+ | Focus audit | Missing focus indicators, tab order issues, missing ARIA, keyboard gaps, skip link, target size |
43
+
44
+ Deduplicate:
45
+ - Same element flagged by multiple auditors -> merge into single issue with multiple aspects
46
+ - Same CSS rule causing multiple failures -> group under single fix
47
+
48
+ ### Step 2: Severity Classification
49
+
50
+ | Severity | Criteria | Examples |
51
+ |----------|----------|---------|
52
+ | Critical | Blocks usage for impaired users, WCAG A violation | No keyboard access, contrast < 2:1, focus trap with no escape |
53
+ | High | Degrades experience significantly, WCAG AA violation | Contrast 3:1-4.5:1 on body text, missing skip link, no focus indicator |
54
+ | Medium | Non-compliance but usable, WCAG AAA-only violation | Contrast between AA and AAA thresholds, suboptimal reading width |
55
+ | Low | Enhancement, best practice | Font loading optimization, letter-spacing refinement |
56
+
57
+ ### Step 3: Prioritization & Grouping
58
+
59
+ Group by file/component for efficient fixing:
60
+
61
+ ```
62
+ File: src/styles/globals.css
63
+ [CRITICAL] Color: --text-primary contrast 3.2:1 (need 4.5:1) -> WCAG 1.4.3
64
+ [HIGH] Focus: No :focus-visible on buttons -> WCAG 2.4.7
65
+ [MEDIUM] Typography: line-height 1.4 on body (need 1.5) -> WCAG 1.4.12
66
+
67
+ File: src/components/Modal.tsx
68
+ [CRITICAL] Focus: No focus trap in modal -> WCAG 2.1.2
69
+ [HIGH] ARIA: Missing aria-modal="true" -> WCAG 4.1.2
70
+ ```
71
+
72
+ Priority order within each file: Critical -> High -> Medium -> Low.
73
+
74
+ ### Step 4: Code-Level Fix Guidance
75
+
76
+ For each issue, provide specific fix:
77
+
78
+ **Color fixes**:
79
+ ```css
80
+ /* Before: contrast 3.2:1 */
81
+ --text-primary: oklch(55% 0 0);
82
+ /* After: contrast 5.1:1 -- adjust lightness down */
83
+ --text-primary: oklch(35% 0 0);
84
+ ```
85
+
86
+ **Focus fixes**:
87
+ ```css
88
+ /* Add :focus-visible to interactive elements */
89
+ button:focus-visible,
90
+ a:focus-visible {
91
+ outline: 2px solid var(--color-accent);
92
+ outline-offset: 2px;
93
+ }
94
+ button:focus:not(:focus-visible) {
95
+ outline: none;
96
+ }
97
+ ```
98
+
99
+ **ARIA fixes**:
100
+ ```html
101
+ <!-- Before -->
102
+ <div class="modal">
103
+ <!-- After -->
104
+ <div class="modal" role="dialog" aria-modal="true" aria-labelledby="modal-title">
105
+ ```
106
+
107
+ **Typography fixes**:
108
+ ```css
109
+ /* Before: fixed font-size */
110
+ body { font-size: 14px; }
111
+ /* After: responsive with floor */
112
+ body { font-size: clamp(1rem, 1vw + 0.875rem, 1.25rem); line-height: 1.625; }
113
+ ```
114
+
115
+ ### Step 5: Effort Estimation
116
+
117
+ | Effort | Criteria |
118
+ |--------|----------|
119
+ | Trivial (< 5 min) | Single CSS property change (contrast, outline) |
120
+ | Small (5-15 min) | Multiple CSS changes in one file, add ARIA attributes |
121
+ | Medium (15-60 min) | Focus trap implementation, skip link, keyboard navigation |
122
+ | Large (1-4 hours) | Responsive typography overhaul, dark mode color parity |
123
+
124
+ ### Step 6: WCAG Criterion Mapping
125
+
126
+ Map every issue to specific WCAG success criterion:
127
+
128
+ | Issue Domain | Common Criteria |
129
+ |-------------|----------------|
130
+ | Color contrast | 1.4.3 (AA), 1.4.6 (AAA), 1.4.11 (non-text) |
131
+ | Typography | 1.4.4 (resize), 1.4.12 (text spacing) |
132
+ | Focus indicators | 2.4.7 (visible), 2.4.11 (not obscured) |
133
+ | Keyboard | 2.1.1 (keyboard), 2.1.2 (no trap) |
134
+ | Tab order | 2.4.3 (focus order) |
135
+ | Skip link | 2.4.1 (bypass blocks) |
136
+ | ARIA | 4.1.2 (name/role/value) |
137
+ | Target size | 2.5.8 (target size) |
138
+ | Live regions | 4.1.3 (status messages) |
139
+
140
+ ## Phase 4: Validation & Output
141
+
142
+ 1. Validate plan completeness:
143
+
144
+ | Check | Requirement |
145
+ |-------|-------------|
146
+ | All critical issues addressed | Every critical issue has a fix |
147
+ | All high issues addressed | Every high issue has a fix |
148
+ | File grouping complete | Every fix maps to specific file:line |
149
+ | WCAG mapping complete | Every fix maps to WCAG criterion |
150
+ | No orphan issues | Every audit issue appears in plan |
151
+
152
+ 2. Write remediation plan to `<session>/remediation/remediation-plan.md`:
153
+
154
+ ```markdown
155
+ # Remediation Plan
156
+ [remediation-planner]
157
+
158
+ ## Executive Summary
159
+ - **Total issues**: {count} (Critical: {n}, High: {n}, Medium: {n}, Low: {n})
160
+ - **Files affected**: {count}
161
+ - **Estimated total effort**: {hours}
162
+ - **WCAG target**: {AA|AAA}
163
+
164
+ ## Priority Matrix
165
+ | # | Severity | Domain | WCAG | File | Issue | Fix | Effort |
166
+ |---|----------|--------|------|------|-------|-----|--------|
167
+ | 1 | Critical | Color | 1.4.3 | globals.css:12 | Contrast 3.2:1 | L 55% -> 35% | Trivial |
168
+ | 2 | Critical | Focus | 2.1.2 | Modal.tsx:45 | No focus trap | Add trap logic | Medium |
169
+ | ... | ... | ... | ... | ... | ... | ... | ... |
170
+
171
+ ## Fixes by File
172
+
173
+ ### `src/styles/globals.css`
174
+ #### Fix 1: Color contrast (Critical, WCAG 1.4.3)
175
+ - **Current**: `--text-primary: oklch(55% 0 0);` (contrast 3.2:1)
176
+ - **Target**: `--text-primary: oklch(35% 0 0);` (contrast 5.1:1)
177
+ - **Effort**: Trivial
178
+
179
+ #### Fix 2: Focus indicators (High, WCAG 2.4.7)
180
+ - **Current**: No :focus-visible rules
181
+ - **Target**: Add :focus-visible with 2px outline
182
+ - **Effort**: Small
183
+
184
+ ### `src/components/Modal.tsx`
185
+ #### Fix 3: Focus trap (Critical, WCAG 2.1.2)
186
+ - **Current**: No focus management
187
+ - **Target**: Implement focus trap (store activeElement, cycle Tab, Escape to close)
188
+ - **Effort**: Medium
189
+
190
+ ## Implementation Order
191
+ 1. All Critical fixes (blocks usage)
192
+ 2. All High fixes (degrades experience)
193
+ 3. Medium fixes (non-compliance)
194
+ 4. Low fixes (enhancements)
195
+
196
+ ## Verification Checklist
197
+ - [ ] All color combinations pass WCAG {level} contrast
198
+ - [ ] All interactive elements have visible focus indicators
199
+ - [ ] Tab order is logical with no traps (except modals)
200
+ - [ ] Skip link present and functional
201
+ - [ ] All ARIA roles and states correct
202
+ - [ ] Typography meets minimum sizes at all breakpoints
203
+ ```
204
+
205
+ 3. Update `<session>/.msg/meta.json` under `remediation-planner` namespace:
206
+ - Read existing -> merge `{ "remediation-planner": { total_issues, critical, high, medium, low, files_affected, estimated_effort, timestamp } }` -> write back
@@ -0,0 +1,185 @@
1
+ ---
2
+ role: typo-auditor
3
+ prefix: TYPO
4
+ inner_loop: false
5
+ message_types: [state_update]
6
+ ---
7
+
8
+ # Typography Readability Auditor
9
+
10
+ Typography accessibility audit across all viewports. Font sizes at breakpoints, line-height ratios, clamp() validation, reading width measurement, font loading strategy assessment. Produce detailed typography report with breakpoint-by-breakpoint analysis.
11
+
12
+ ## Phase 2: Context & Environment Detection
13
+
14
+ | Input | Source | Required |
15
+ |-------|--------|----------|
16
+ | Task description | From task subject/description | Yes |
17
+ | Session path | Extracted from task description | Yes |
18
+ | Target (URL or file paths) | From task description CONTEXT | Yes |
19
+ | WCAG level (AA/AAA) | From task description CONTEXT | Yes |
20
+ | .msg/meta.json | <session>/.msg/meta.json | No |
21
+
22
+ 1. Extract session path, target, and WCAG level from task description
23
+ 2. Identify target:
24
+ - URL -> use Chrome DevTools for rendered typography (navigate_page, resize_page, screenshot)
25
+ - File paths -> read CSS/SCSS files directly for typography definitions
26
+ - Full site -> enumerate stylesheets from HTML entry points
27
+ 3. Read typography standards from specs/typography-scale.md for reference thresholds
28
+
29
+ ## Phase 3: Typography Audit Execution
30
+
31
+ ### Step 1: Typography Definition Extraction
32
+
33
+ **Static analysis** (always):
34
+ - Glob for CSS/SCSS/Tailwind files -> extract typography definitions
35
+ - Extract: font-family, font-size, line-height, letter-spacing, font-weight, font-display
36
+ - Parse clamp() functions: `clamp(min, preferred, max)` -> validate min/max bounds
37
+ - Parse @media queries for responsive breakpoints
38
+ - Record source location (file:line) for each rule
39
+
40
+ **Runtime analysis** (if Chrome DevTools available):
41
+ - Navigate to target URL
42
+ - For each breakpoint (320px, 768px, 1024px, 1400px):
43
+ - `mcp__chrome-devtools__resize_page({ width: <breakpoint>, height: 900 })`
44
+ - `mcp__chrome-devtools__evaluate_script({ expression: "..." })` to measure:
45
+ - Computed font-size on body, headings (h1-h6), paragraphs, captions
46
+ - Computed line-height on same elements
47
+ - Container width and character count per line
48
+ - `mcp__chrome-devtools__take_screenshot({})` -> save to `<session>/evidence/typo-{breakpoint}px.png`
49
+
50
+ ### Step 2: Font Size Audit
51
+
52
+ | Breakpoint | Element | Minimum Size | Standard |
53
+ |-----------|---------|-------------|----------|
54
+ | 320px (mobile) | Body text | 16px | WCAG 1.4.4 |
55
+ | 320px (mobile) | Small/caption | 14px | Best practice |
56
+ | 768px (tablet) | Body text | 16px | WCAG 1.4.4 |
57
+ | 1024px (desktop) | Body text | 16px | WCAG 1.4.4 |
58
+ | 1400px (wide) | Body text | 16px | WCAG 1.4.4 |
59
+
60
+ **clamp() validation**:
61
+ - Minimum value >= 14px (absolute floor)
62
+ - Maximum value reasonable for element type (headings: max ~72px, body: max ~20px)
63
+ - Preferred value uses viewport unit (vw) for fluid scaling
64
+ - Check: `clamp(min, preferred, max)` where min >= 14px for any text
65
+
66
+ **200% zoom check** (WCAG 1.4.4):
67
+ - At 200% zoom, no content should be clipped or lost
68
+ - Text should reflow without horizontal scrolling
69
+
70
+ ### Step 3: Line Height Audit
71
+
72
+ | Element Type | Expected Range | Standard |
73
+ |-------------|---------------|----------|
74
+ | Body text | 1.5 - 1.75 | WCAG 1.4.12, readability |
75
+ | Headings | 1.1 - 1.3 | Visual impact |
76
+ | Code blocks | 1.5 - 1.7 | Scanning readability |
77
+ | Buttons/labels | 1.2 - 1.5 | UI element |
78
+
79
+ Check for unitless line-height (preferred over px/em for inheritance).
80
+
81
+ ### Step 4: Letter Spacing Audit
82
+
83
+ | Element Type | Expected Range | Standard |
84
+ |-------------|---------------|----------|
85
+ | Display headings | -0.02em to 0 | Tight for visual |
86
+ | Body text | 0 (default) | Normal |
87
+ | Uppercase labels | 0.05em - 0.1em | Legibility |
88
+ | Monospace code | 0.08em - 0.15em | Wide for scanning |
89
+
90
+ **WCAG 1.4.12 override test**: Text must remain readable when user overrides:
91
+ - Line height to at least 1.5x font size
92
+ - Letter spacing to at least 0.12em
93
+ - Word spacing to at least 0.16em
94
+
95
+ ### Step 5: Reading Width Audit
96
+
97
+ Measure characters per line for body text containers:
98
+
99
+ | Metric | Optimal | Acceptable | Flag |
100
+ |--------|---------|-----------|------|
101
+ | Characters per line | 66ch | 45-75ch | < 45 or > 75 |
102
+ | Max container width | 65ch-75ch | Up to 900px | > 900px without column |
103
+
104
+ Check: `max-width` or `width` on body text containers.
105
+
106
+ ### Step 6: Font Loading Strategy
107
+
108
+ | Property | Good | Acceptable | Poor |
109
+ |----------|------|-----------|------|
110
+ | Body font | `font-display: swap` | `font-display: fallback` | `font-display: block` or missing |
111
+ | Display font | `font-display: optional` | `font-display: swap` | `font-display: block` |
112
+ | Preload | Critical fonts preloaded | Some preloaded | None preloaded |
113
+ | Fallback stack | System font fallback defined | Generic fallback | No fallback |
114
+
115
+ Check for FOUT (Flash of Unstyled Text) / FOIT (Flash of Invisible Text) risks.
116
+
117
+ ## Phase 4: Report Generation & Output
118
+
119
+ 1. Write audit report to `<session>/audits/typography/typo-audit-{NNN}.md`:
120
+
121
+ ```markdown
122
+ # Typography Accessibility Audit - {NNN}
123
+ [typo-auditor]
124
+
125
+ ## Summary
126
+ - **Total typography rules audited**: {count}
127
+ - **Pass**: {pass_count} | **Fail**: {fail_count}
128
+ - **WCAG Level**: {AA|AAA}
129
+ - **Critical issues**: {count}
130
+ - **High issues**: {count}
131
+
132
+ ## Font Size by Breakpoint
133
+ | Breakpoint | Element | Computed Size | Min Required | Status |
134
+ |-----------|---------|--------------|-------------|--------|
135
+ | 320px | body | Xpx | 16px | PASS/FAIL |
136
+ | 320px | h1 | Xpx | -- | OK |
137
+ | ... | ... | ... | ... | ... |
138
+
139
+ ## clamp() Validation
140
+ | Rule | clamp() Value | Min | Max | Status |
141
+ |------|--------------|-----|-----|--------|
142
+ | .body | clamp(1rem, 2vw, 1.25rem) | 16px | 20px | PASS/FAIL |
143
+ | ... | ... | ... | ... | ... |
144
+
145
+ ## Line Height Audit
146
+ | Element | Current | Expected Range | Status |
147
+ |---------|---------|---------------|--------|
148
+ | body | 1.6 | 1.5-1.75 | PASS |
149
+ | h1 | 1.2 | 1.1-1.3 | PASS |
150
+ | ... | ... | ... | ... |
151
+
152
+ ## Letter Spacing Audit
153
+ | Element | Current | Expected Range | Status |
154
+ |---------|---------|---------------|--------|
155
+ | ... | ... | ... | ... |
156
+
157
+ ## Reading Width
158
+ | Container | Width | Chars/Line | Optimal (45-75) | Status |
159
+ |-----------|-------|-----------|-----------------|--------|
160
+ | .content | 700px | ~68ch | Yes | PASS |
161
+ | ... | ... | ... | ... | ... |
162
+
163
+ ## Font Loading
164
+ | Font | font-display | Preload | Fallback | Status |
165
+ |------|-------------|---------|----------|--------|
166
+ | ... | swap | yes/no | system | PASS/FAIL |
167
+
168
+ ## Text Spacing Override Test (WCAG 1.4.12)
169
+ | Override | Applied | Content Readable | Status |
170
+ |---------|---------|-----------------|--------|
171
+ | line-height: 1.5x | Yes | Yes/No | PASS/FAIL |
172
+ | letter-spacing: 0.12em | Yes | Yes/No | PASS/FAIL |
173
+ | word-spacing: 0.16em | Yes | Yes/No | PASS/FAIL |
174
+
175
+ ## Issues (by severity)
176
+ ### Critical
177
+ - ...
178
+ ### High
179
+ - ...
180
+ ### Medium
181
+ - ...
182
+ ```
183
+
184
+ 2. Update `<session>/.msg/meta.json` under `typo-auditor` namespace:
185
+ - Read existing -> merge `{ "typo-auditor": { audit_id, total_rules, pass_count, fail_count, critical_count, high_count, breakpoints_tested, timestamp } }` -> write back