@haposoft/cafekit 0.16.0-rc.8 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/README.md +116 -27
  2. package/bin/__tests__/codex-hooks-ownership.test.js +239 -0
  3. package/bin/__tests__/codex-hooks.test.js +50 -0
  4. package/bin/__tests__/codex-native.test.js +1882 -70
  5. package/bin/__tests__/develop-contract.test.js +400 -23
  6. package/bin/__tests__/installer-safety.test.js +3 -3
  7. package/bin/__tests__/optional-skill-inventory.test.js +249 -0
  8. package/bin/__tests__/output-styles.test.js +214 -0
  9. package/bin/__tests__/package-inventory.test.js +1735 -98
  10. package/bin/__tests__/runtime-schema.test.js +111 -0
  11. package/bin/__tests__/secret-output-guardrail.test.js +122 -0
  12. package/bin/__tests__/skill-routing-source.test.js +172 -0
  13. package/bin/__tests__/specs-v2-execution-closeout.test.js +1 -1
  14. package/bin/install.js +10 -0
  15. package/bin/lib/codex-install.js +170 -5
  16. package/bin/lib/context.js +14 -0
  17. package/bin/lib/i18n.js +12 -6
  18. package/bin/lib/skill-deps.js +5 -5
  19. package/bin/phases/claude-runtime.js +23 -0
  20. package/bin/phases/claude-settings.js +8 -0
  21. package/bin/phases/codex-hooks.js +156 -0
  22. package/bin/phases/codex-runtime.js +29 -38
  23. package/bin/phases/copy-payload.js +8 -2
  24. package/bin/phases/select-skill-bundles.js +96 -0
  25. package/bin/phases/skill-inventory.js +71 -0
  26. package/bin/phases/skills-setup.js +9 -2
  27. package/bin/phases/write-metadata.js +8 -5
  28. package/package.json +8 -2
  29. package/src/claude/CLAUDE.md +3 -3
  30. package/src/claude/agents/brainstormer.md +52 -69
  31. package/src/claude/agents/code-auditor.md +32 -14
  32. package/src/claude/agents/debugger.md +35 -20
  33. package/src/claude/agents/deployer.md +12 -5
  34. package/src/claude/agents/docs-keeper.md +11 -1
  35. package/src/claude/agents/implementer.md +25 -13
  36. package/src/claude/agents/inspector.md +6 -3
  37. package/src/claude/agents/project-manager.md +1 -1
  38. package/src/claude/agents/researcher.md +26 -55
  39. package/src/claude/agents/spec-maker.md +12 -7
  40. package/src/claude/agents/strategist.md +52 -0
  41. package/src/claude/agents/test-runner.md +117 -132
  42. package/src/claude/agents/ui-ux-designer.md +1 -1
  43. package/src/claude/hooks/__tests__/fixtures/statusline-default.golden +1 -0
  44. package/src/claude/hooks/__tests__/precompact.test.js +158 -0
  45. package/src/claude/hooks/__tests__/spec-gate.test.js +10 -3
  46. package/src/claude/hooks/__tests__/state.test.js +5 -0
  47. package/src/claude/hooks/__tests__/statusline.test.js +196 -0
  48. package/src/claude/hooks/agent.cjs +1 -1
  49. package/src/claude/hooks/docs-sync.cjs +12 -10
  50. package/src/claude/hooks/inspect-block.cjs +1 -1
  51. package/src/claude/hooks/lib/config.cjs +3 -0
  52. package/src/claude/hooks/lib/hook-state-dir.cjs +39 -0
  53. package/src/claude/hooks/lib/secret-keywords.cjs +42 -0
  54. package/src/claude/hooks/precompact.cjs +105 -0
  55. package/src/claude/hooks/rules.cjs +1 -1
  56. package/src/claude/hooks/secret-output-guardrail.cjs +43 -0
  57. package/src/claude/hooks/session.cjs +27 -1
  58. package/src/claude/hooks/spec-gate.cjs +3 -3
  59. package/src/claude/hooks/spec-state.cjs +2 -2
  60. package/src/claude/hooks/state.cjs +1 -1
  61. package/src/claude/hooks/task-scaffold-guard.cjs +1 -1
  62. package/src/claude/hooks/usage.cjs +1 -1
  63. package/src/claude/migration-manifest.json +29 -15
  64. package/src/claude/output-styles/coding-level-0-eli5.md +103 -0
  65. package/src/claude/output-styles/coding-level-1-junior.md +124 -0
  66. package/src/claude/output-styles/coding-level-2-mid.md +146 -0
  67. package/src/claude/output-styles/coding-level-3-senior.md +148 -0
  68. package/src/claude/output-styles/coding-level-4-lead.md +159 -0
  69. package/src/claude/output-styles/coding-level-5-god.md +91 -0
  70. package/src/claude/references/debugger/core-philosophy.md +5 -3
  71. package/src/claude/references/debugger/frontend-verification.md +2 -2
  72. package/src/claude/references/debugger/log-ci-analysis.md +13 -1
  73. package/src/claude/references/debugger/parallel-agent-hydration.md +19 -34
  74. package/src/claude/references/debugger/performance-diagnostics.md +2 -2
  75. package/src/claude/references/debugger/root-cause-tracing.md +37 -6
  76. package/src/claude/references/debugger/side-effect-gate.md +3 -1
  77. package/src/claude/references/debugger/verification-protocol.md +13 -12
  78. package/src/claude/rules/orchestrator.md +7 -1
  79. package/src/claude/rules/process-management.md +39 -0
  80. package/src/claude/rules/review-audit-self-decision.md +48 -0
  81. package/src/claude/rules/skill-domain-routing.md +26 -24
  82. package/src/claude/rules/skill-workflow-routing.md +22 -14
  83. package/src/claude/rules/workflow.md +3 -3
  84. package/src/claude/runtime.json +1 -0
  85. package/src/claude/runtime.schema.json +205 -0
  86. package/src/claude/scripts/generate-skill-catalog.cjs +156 -122
  87. package/src/claude/scripts/provenance.cjs +18 -5
  88. package/src/claude/scripts/workflow-policy.cjs +1 -1
  89. package/src/claude/settings/settings.json +16 -0
  90. package/src/claude/skills/agent-browser/SKILL.md +1 -1
  91. package/src/claude/skills/ai-multimodal/SKILL.md +1 -1
  92. package/src/claude/skills/brainstorm/SKILL.md +193 -172
  93. package/src/claude/skills/brainstorm/references/question-framework.md +105 -167
  94. package/src/claude/skills/chrome-devtools/SKILL.md +1 -1
  95. package/src/claude/skills/code-review/SKILL.md +43 -25
  96. package/src/claude/skills/code-review/references/spec-compliance-review.md +3 -4
  97. package/src/claude/skills/code-review/references/verification-gate.md +1 -1
  98. package/src/claude/skills/debug/SKILL.md +48 -19
  99. package/src/claude/skills/delegate/SKILL.md +1 -1
  100. package/src/claude/skills/develop/SKILL.md +92 -65
  101. package/src/claude/skills/develop/references/parallel-waves.md +36 -63
  102. package/src/claude/skills/develop/references/quality-gate.md +31 -4
  103. package/src/claude/skills/develop/references/subagent-patterns.md +21 -7
  104. package/src/claude/skills/docs/SKILL.md +42 -23
  105. package/src/claude/skills/docs/references/init-workflow.md +4 -4
  106. package/src/claude/skills/docs/references/reconstruct-workflow.md +6 -6
  107. package/src/claude/skills/docs/references/standard-docs-workflow.md +6 -2
  108. package/src/claude/skills/docs/references/summarize-workflow.md +2 -2
  109. package/src/claude/skills/docs/references/update-workflow.md +9 -7
  110. package/src/claude/skills/docs/templates/requirements-as-is.md +1 -1
  111. package/src/claude/skills/docx/SKILL.md +1 -1
  112. package/src/claude/skills/git/SKILL.md +1 -1
  113. package/src/claude/skills/git/references/commit-protocols.md +1 -1
  114. package/src/claude/skills/git/references/finish-branch.md +1 -1
  115. package/src/claude/skills/hotfix/SKILL.md +159 -170
  116. package/src/claude/skills/hotfix/references/diagnosis-protocol.md +14 -9
  117. package/src/claude/skills/hotfix/references/parallel-patterns.md +27 -13
  118. package/src/claude/skills/hotfix/references/prevention-gate.md +5 -0
  119. package/src/claude/skills/hotfix/references/review-cycle.md +21 -15
  120. package/src/claude/skills/hotfix/references/workflow-specialized.md +53 -21
  121. package/src/claude/skills/inspect/SKILL.md +55 -46
  122. package/src/claude/skills/inspect/references/internal-inspection.md +21 -5
  123. package/src/claude/skills/loop/SKILL.md +114 -0
  124. package/src/claude/skills/loop/references/bounded-loop-protocol.md +104 -0
  125. package/src/claude/skills/loop/references/metric-and-guard-contract.md +76 -0
  126. package/src/claude/skills/pdf/SKILL.md +1 -1
  127. package/src/claude/skills/pptx/SKILL.md +1 -1
  128. package/src/claude/skills/question/SKILL.md +16 -13
  129. package/src/claude/skills/research/SKILL.md +70 -43
  130. package/src/claude/skills/route/SKILL.md +94 -0
  131. package/src/claude/skills/route/references/agent-timing.md +46 -0
  132. package/src/claude/skills/route/references/chaining-patterns.md +53 -0
  133. package/src/claude/skills/route/references/task-taxonomy.md +48 -0
  134. package/src/claude/skills/specs/SKILL.md +41 -60
  135. package/src/claude/skills/specs/references/review.md +11 -8
  136. package/src/claude/skills/specs/references/templates.md +34 -18
  137. package/src/claude/skills/specs/templates/requirements-init.md +1 -1
  138. package/src/claude/skills/specs/templates/research.md +2 -2
  139. package/src/claude/skills/sync/SKILL.md +6 -6
  140. package/src/claude/skills/sync/references/sync-protocols.md +1 -1
  141. package/src/claude/skills/test/SKILL.md +120 -120
  142. package/src/claude/skills/test/references/execution-strategy.md +208 -361
  143. package/src/claude/skills/test/references/failure-triage.md +55 -121
  144. package/src/claude/skills/test/references/test-memory.md +20 -34
  145. package/src/claude/skills/ui-ux-pro-max/SKILL.md +1 -1
  146. package/src/claude/skills/web-testing/SKILL.md +1 -1
  147. package/src/claude/skills/xlsx/SKILL.md +1 -1
  148. package/src/claude/status.cjs +135 -33
  149. package/src/codex/AGENTS.md +14 -4
  150. package/src/codex/hooks/docs-sync.cjs +8 -3
  151. package/src/codex/hooks/lib/hook-context.cjs +18 -4
  152. package/src/codex/hooks/rules.cjs +29 -1
  153. package/src/codex/hooks/secret-output-guardrail.cjs +30 -0
  154. package/src/codex/hooks/spec-gate.cjs +3 -8
  155. package/src/codex/hooks/spec-state.cjs +2 -1
  156. package/src/codex/hooks.json +5 -0
  157. package/src/codex/runtime.json +2 -0
  158. package/src/common/.env.example +1 -1
  159. package/src/claude/skills/backend-development/SKILL.md +0 -101
  160. package/src/claude/skills/backend-development/references/backend-api-design.md +0 -495
  161. package/src/claude/skills/backend-development/references/backend-architecture.md +0 -454
  162. package/src/claude/skills/backend-development/references/backend-authentication.md +0 -338
  163. package/src/claude/skills/backend-development/references/backend-code-quality.md +0 -659
  164. package/src/claude/skills/backend-development/references/backend-debugging.md +0 -904
  165. package/src/claude/skills/backend-development/references/backend-devops.md +0 -491
  166. package/src/claude/skills/backend-development/references/backend-mindset.md +0 -387
  167. package/src/claude/skills/backend-development/references/backend-performance.md +0 -397
  168. package/src/claude/skills/backend-development/references/backend-security.md +0 -342
  169. package/src/claude/skills/backend-development/references/backend-technologies.md +0 -256
  170. package/src/claude/skills/backend-development/references/backend-testing.md +0 -429
  171. package/src/claude/skills/devops/.env.example +0 -76
  172. package/src/claude/skills/devops/SKILL.md +0 -102
  173. package/src/claude/skills/devops/references/browser-rendering.md +0 -305
  174. package/src/claude/skills/devops/references/cloudflare-d1-kv.md +0 -123
  175. package/src/claude/skills/devops/references/cloudflare-platform.md +0 -271
  176. package/src/claude/skills/devops/references/cloudflare-r2-storage.md +0 -280
  177. package/src/claude/skills/devops/references/cloudflare-workers-advanced.md +0 -312
  178. package/src/claude/skills/devops/references/cloudflare-workers-apis.md +0 -309
  179. package/src/claude/skills/devops/references/cloudflare-workers-basics.md +0 -418
  180. package/src/claude/skills/devops/references/docker-basics.md +0 -297
  181. package/src/claude/skills/devops/references/docker-compose.md +0 -292
  182. package/src/claude/skills/devops/references/gcloud-platform.md +0 -297
  183. package/src/claude/skills/devops/references/gcloud-services.md +0 -304
  184. package/src/claude/skills/devops/references/kubernetes-basics.md +0 -95
  185. package/src/claude/skills/devops/references/kubernetes-helm-advanced.md +0 -70
  186. package/src/claude/skills/devops/references/kubernetes-helm.md +0 -81
  187. package/src/claude/skills/devops/references/kubernetes-kubectl.md +0 -74
  188. package/src/claude/skills/devops/references/kubernetes-security-advanced.md +0 -94
  189. package/src/claude/skills/devops/references/kubernetes-security.md +0 -89
  190. package/src/claude/skills/devops/references/kubernetes-troubleshooting-advanced.md +0 -74
  191. package/src/claude/skills/devops/references/kubernetes-troubleshooting.md +0 -49
  192. package/src/claude/skills/devops/references/kubernetes-workflows-advanced.md +0 -75
  193. package/src/claude/skills/devops/references/kubernetes-workflows.md +0 -76
  194. package/src/claude/skills/devops/scripts/cloudflare_deploy.py +0 -269
  195. package/src/claude/skills/devops/scripts/docker_optimize.py +0 -332
  196. package/src/claude/skills/devops/scripts/requirements.txt +0 -20
  197. package/src/claude/skills/devops/scripts/tests/requirements.txt +0 -3
  198. package/src/claude/skills/devops/scripts/tests/test_cloudflare_deploy.py +0 -285
  199. package/src/claude/skills/devops/scripts/tests/test_docker_optimize.py +0 -436
  200. package/src/claude/skills/frontend-design/SKILL.md +0 -135
  201. package/src/claude/skills/frontend-design/references/ai-multimodal-overview.md +0 -165
  202. package/src/claude/skills/frontend-design/references/analysis-best-practices.md +0 -80
  203. package/src/claude/skills/frontend-design/references/analysis-prompts.md +0 -141
  204. package/src/claude/skills/frontend-design/references/analysis-techniques.md +0 -118
  205. package/src/claude/skills/frontend-design/references/animejs.md +0 -396
  206. package/src/claude/skills/frontend-design/references/anti-slop-rules.md +0 -103
  207. package/src/claude/skills/frontend-design/references/asset-generation.md +0 -337
  208. package/src/claude/skills/frontend-design/references/bento-motion-engine.md +0 -142
  209. package/src/claude/skills/frontend-design/references/design-extraction-overview.md +0 -71
  210. package/src/claude/skills/frontend-design/references/extraction-best-practices.md +0 -141
  211. package/src/claude/skills/frontend-design/references/extraction-output-templates.md +0 -162
  212. package/src/claude/skills/frontend-design/references/extraction-prompts.md +0 -127
  213. package/src/claude/skills/frontend-design/references/magicui-components.md +0 -129
  214. package/src/claude/skills/frontend-design/references/performance-guardrails.md +0 -169
  215. package/src/claude/skills/frontend-design/references/premium-design-patterns.md +0 -93
  216. package/src/claude/skills/frontend-design/references/redesign-audit-checklist.md +0 -114
  217. package/src/claude/skills/frontend-design/references/technical-accessibility.md +0 -119
  218. package/src/claude/skills/frontend-design/references/technical-best-practices.md +0 -97
  219. package/src/claude/skills/frontend-design/references/technical-optimization.md +0 -44
  220. package/src/claude/skills/frontend-design/references/technical-overview.md +0 -90
  221. package/src/claude/skills/frontend-design/references/technical-workflows.md +0 -150
  222. package/src/claude/skills/frontend-design/references/visual-analysis-overview.md +0 -95
  223. package/src/claude/skills/frontend-design/references/workflow-3d.md +0 -102
  224. package/src/claude/skills/frontend-design/references/workflow-describe.md +0 -87
  225. package/src/claude/skills/frontend-design/references/workflow-immersive.md +0 -87
  226. package/src/claude/skills/frontend-design/references/workflow-quick.md +0 -57
  227. package/src/claude/skills/frontend-design/references/workflow-screenshot.md +0 -63
  228. package/src/claude/skills/frontend-design/references/workflow-video.md +0 -74
  229. package/src/claude/skills/frontend-development/SKILL.md +0 -406
  230. package/src/claude/skills/frontend-development/resources/common-patterns.md +0 -331
  231. package/src/claude/skills/frontend-development/resources/complete-examples.md +0 -872
  232. package/src/claude/skills/frontend-development/resources/component-patterns.md +0 -502
  233. package/src/claude/skills/frontend-development/resources/data-fetching.md +0 -767
  234. package/src/claude/skills/frontend-development/resources/file-organization.md +0 -502
  235. package/src/claude/skills/frontend-development/resources/loading-and-error-states.md +0 -501
  236. package/src/claude/skills/frontend-development/resources/performance.md +0 -406
  237. package/src/claude/skills/frontend-development/resources/routing-guide.md +0 -364
  238. package/src/claude/skills/frontend-development/resources/styling-guide.md +0 -428
  239. package/src/claude/skills/frontend-development/resources/typescript-standards.md +0 -418
  240. package/src/claude/skills/mobile-development/SKILL.md +0 -218
  241. package/src/claude/skills/mobile-development/references/mobile-android.md +0 -604
  242. package/src/claude/skills/mobile-development/references/mobile-best-practices.md +0 -544
  243. package/src/claude/skills/mobile-development/references/mobile-debugging.md +0 -1089
  244. package/src/claude/skills/mobile-development/references/mobile-frameworks.md +0 -465
  245. package/src/claude/skills/mobile-development/references/mobile-ios.md +0 -496
  246. package/src/claude/skills/mobile-development/references/mobile-mindset.md +0 -542
  247. package/src/claude/skills/react-best-practices/AGENTS.md +0 -2249
  248. package/src/claude/skills/react-best-practices/README.md +0 -123
  249. package/src/claude/skills/react-best-practices/SKILL.md +0 -128
  250. package/src/claude/skills/react-best-practices/metadata.json +0 -15
  251. package/src/claude/skills/react-best-practices/rules/_sections.md +0 -46
  252. package/src/claude/skills/react-best-practices/rules/_template.md +0 -28
  253. package/src/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  254. package/src/claude/skills/react-best-practices/rules/advanced-use-latest.md +0 -49
  255. package/src/claude/skills/react-best-practices/rules/async-api-routes.md +0 -38
  256. package/src/claude/skills/react-best-practices/rules/async-defer-await.md +0 -80
  257. package/src/claude/skills/react-best-practices/rules/async-dependencies.md +0 -36
  258. package/src/claude/skills/react-best-practices/rules/async-parallel.md +0 -28
  259. package/src/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
  260. package/src/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
  261. package/src/claude/skills/react-best-practices/rules/bundle-conditional.md +0 -31
  262. package/src/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
  263. package/src/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  264. package/src/claude/skills/react-best-practices/rules/bundle-preload.md +0 -50
  265. package/src/claude/skills/react-best-practices/rules/client-event-listeners.md +0 -74
  266. package/src/claude/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
  267. package/src/claude/skills/react-best-practices/rules/js-batch-dom-css.md +0 -82
  268. package/src/claude/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
  269. package/src/claude/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
  270. package/src/claude/skills/react-best-practices/rules/js-cache-storage.md +0 -70
  271. package/src/claude/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
  272. package/src/claude/skills/react-best-practices/rules/js-early-exit.md +0 -50
  273. package/src/claude/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
  274. package/src/claude/skills/react-best-practices/rules/js-index-maps.md +0 -37
  275. package/src/claude/skills/react-best-practices/rules/js-length-check-first.md +0 -49
  276. package/src/claude/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
  277. package/src/claude/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
  278. package/src/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
  279. package/src/claude/skills/react-best-practices/rules/rendering-activity.md +0 -26
  280. package/src/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  281. package/src/claude/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
  282. package/src/claude/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
  283. package/src/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  284. package/src/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  285. package/src/claude/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
  286. package/src/claude/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
  287. package/src/claude/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
  288. package/src/claude/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
  289. package/src/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
  290. package/src/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  291. package/src/claude/skills/react-best-practices/rules/rerender-memo.md +0 -44
  292. package/src/claude/skills/react-best-practices/rules/rerender-transitions.md +0 -40
  293. package/src/claude/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
  294. package/src/claude/skills/react-best-practices/rules/server-cache-lru.md +0 -41
  295. package/src/claude/skills/react-best-practices/rules/server-cache-react.md +0 -26
  296. package/src/claude/skills/react-best-practices/rules/server-parallel-fetching.md +0 -79
  297. package/src/claude/skills/react-best-practices/rules/server-serialization.md +0 -38
@@ -1,365 +1,212 @@
1
- # Execution Strategy
1
+ # Execution strategy
2
2
 
3
- Detailed instructions for how `hapo:test` and the `test-runner` agent execute
4
- each test type. Referenced by `SKILL.md` during Phase 2.
3
+ Load this reference when Test needs packet routing, proof construction, blast
4
+ radius selection, UI safety, or report details.
5
5
 
6
- ---
6
+ ## 1. Classify the target before execution
7
7
 
8
- ## Phase A: Blast Radius Scoping (Default Mode)
8
+ Inspect current filesystem entries with `lstat`; a broken link is still a
9
+ marker. Resolve all accepted paths inside the target feature directory.
9
10
 
10
- When `--full` is NOT specified, narrow the test scope to only what changed:
11
-
12
- ```
13
- 1. git diff --name-only HEAD
14
- → List all modified files since last commit
15
-
16
- 2. For each changed file:
17
- a. Look for co-located test file:
18
- src/auth/login.ts → src/auth/login.test.ts (same dir)
19
- b. If not found, grep reverse import:
20
- grep -r "from.*login" tests/ --include="*.test.*" -l
21
- c. If changed file is a config (tsconfig, jest.config, package.json, .env):
22
- → Escalate to full suite immediately
23
-
24
- 3. Count mapped tests vs total tests:
25
- If mapped > 60% of total → run full suite (not worth the diff overhead)
26
-
27
- 4. Run only mapped tests.
28
- Report: "Blast-radius mode: N changed files → M test files mapped"
29
-
30
- 5. Flag any changed file with NO matching test:
31
- "[!] No tests found for `src/utils/parser.ts` — consider adding tests"
32
- ```
33
-
34
- ---
35
-
36
- ## Phase B: Code Test Execution
37
-
38
- ### Pre-flight Checks (always run first)
39
-
40
- Catch compile errors before spending time on tests.
41
- **HARD RULE:** Do NOT auto-install missing tooling during verification. If a required pre-flight tool (like `eslint`, `flake8`, `tsc`) is missing, stop and report it as an environment gap or missing project setup.
42
-
43
- ```bash
44
- # JavaScript / TypeScript
45
- npx tsc --noEmit # Type check
46
- npx eslint . --max-warnings 0 # Lint
47
-
48
- # Python
49
- python -m py_compile src/ # Syntax check
50
- flake8 src/ # Lint
51
-
52
- # Go
53
- go vet ./...
54
-
55
- # Rust
56
- cargo check
57
-
58
- # Flutter
59
- flutter analyze
60
- ```
61
-
62
- If pre-flight fails or a required tool is missing → report `Compile Error` / `Environment Gap`, do NOT proceed to test execution.
63
-
64
- ### Test Execution by Language
65
-
66
- ```bash
67
- # JavaScript / TypeScript
68
- npm test # Auto-detect npm/yarn/pnpm/bun
69
- npm run test:coverage # With coverage
70
- npx vitest run --coverage # Vitest
71
- npx jest --coverage # Jest
72
-
73
- # Python
74
- pytest # Basic
75
- pytest --cov=src --cov-report=term-missing # With coverage
76
-
77
- # Go
78
- go test ./... -cover -coverprofile=coverage.out
79
-
80
- # Rust
81
- cargo test
82
-
83
- # Flutter
84
- flutter test --coverage
85
- ```
86
-
87
- After each command, parse the runner output for executed test count. A successful
88
- exit with 0 executed tests is `NO_TESTS`, not `PASS`.
89
-
90
- ### Coverage Thresholds
91
-
92
- | Metric | Minimum | Focus Areas |
93
- |-----------|---------|------------------------------------|
94
- | Lines | 80% | All business logic |
95
- | Branches | 70% | Error paths, conditionals |
96
- | Functions | 80% | Public API surfaces |
97
- | Priority | — | Auth, payment, data mutation paths |
98
-
99
- ### Build Verification (after tests pass)
100
-
101
- ```bash
102
- npm run build # JS/TS
103
- go build ./... # Go
104
- cargo build --release # Rust
105
- flutter build # Flutter
106
- ```
107
-
108
- Check for: unresolved deps, deprecation warnings, missing env vars.
109
-
110
- ---
111
-
112
- ## Phase C: UI Verification via chrome-devtools Scripts
113
-
114
- **Script directory:** `packages/spec/src/claude/skills/chrome-devtools/scripts/`
115
-
116
- ### Execution Model: Parallel Subagents
117
-
118
- UI verification is split across multiple `test-runner` subagents running **in parallel** to reduce total test time. Each subagent owns a distinct scope:
119
-
120
- ```
121
- Caller (hapo:test)
122
- │
123
- ├─ Spawn simultaneously:
124
- │ ├─ test-runner #1 → Phase C-pre + C-0 + C-1 + C-2 + C-3 (Auth, Smoke, Console, Network)
125
- │ ├─ test-runner #2 → Phase C-4 + C-5 (Performance + Screenshots)
126
- │ ├─ test-runner #3 → Phase C-6 + C-7 (Accessibility + SEO)
127
- │ ├─ test-runner #4 → Phase C-8 (Security)
128
- │ └─ test-runner #5 → Phase C-5b (User Flow, only if --ui-flow specified)
129
- │
130
- └─ Collect all verdicts → merge into single UI Results section
131
- ```
132
-
133
- Each subagent must run **Phase C-pre (Lazy Install)** first before executing its assigned phases.
134
-
135
- ---
136
-
137
- ### Phase C-pre: Dependency Lazy Installation
138
-
139
- Chrome-devtools scripts require Puppeteer & Chromium. Installed strictly on first use.
140
-
141
- 1. Check if `node_modules` exists:
142
- `test -d packages/spec/src/claude/skills/chrome-devtools/scripts/node_modules`
143
- 2. If NOT found:
144
- Log: *"Preparing UI Testing environment (first-time setup)..."*
145
- Run: `cd packages/spec/src/claude/skills/chrome-devtools/scripts && npm install`
146
- *(Downloads Puppeteer & Chromium — may take 1-2 minutes.)*
147
- 3. Proceed after successful installation.
148
-
149
- ---
150
-
151
- ### Phase C-0: Auth Injection (only for `--ui-auth`)
152
-
153
- Ask user to log in manually and provide credentials. Then inject:
154
-
155
- ```bash
156
- # Option A — Cookies
157
- node inject-auth.js --url <url> \
158
- --cookies '[{"name":"session","value":"abc123","domain":".example.com"}]'
159
-
160
- # Option B — Bearer token
161
- node inject-auth.js --url <url> \
162
- --token "Bearer eyJhbGci..." --header Authorization
163
-
164
- # Option C — localStorage
165
- node inject-auth.js --url <url> \
166
- --local-storage '{"auth_token":"xyz","user_id":"123"}'
167
- ```
168
-
169
- ---
170
-
171
- ### Phase C-0.5: Multi-page Discovery
172
-
173
- Before individual phase tests, crawl the site to discover all pages to test:
174
-
175
- ```bash
176
- # Navigate root URL, collect all internal links via evaluate.js
177
- node navigate.js --url <url> --wait-until networkidle2
178
- node evaluate.js --script "
179
- Array.from(document.querySelectorAll('a[href]'))
180
- .map(a => a.href)
181
- .filter(h => h.startsWith(window.location.origin))
182
- .filter((v,i,a) => a.indexOf(v) === i)
183
- " --output discovered-pages.json
184
- ```
185
-
186
- Collects: list of all internal URLs on the site.
187
- If discovered pages > 20: sample top 10 by depth + priority pages (homepage, auth, key flows).
188
- Pass discovered URL list to subsequent phases — run checks on ALL discovered pages, not just the entry URL.
189
-
190
- ---
191
-
192
- ### Phase C-1: Smoke Test (navigate.js)
193
-
194
- ```bash
195
- node navigate.js --url <url> --wait-until networkidle2
196
- ```
197
-
198
- Collects: `{success, url, title}`
199
- Fail if: `success: false` or unexpected redirect (e.g. to login page).
200
-
201
- ---
202
-
203
- ### Phase C-2: Console Error Audit (console.js)
204
-
205
- ```bash
206
- node console.js --url <url> --types error,warn --duration 3000
207
- ```
208
-
209
- Collects: `{messages[], messageCount}`
210
- Flag as `UI Console Error` if any `type: "error"` or `type: "pageerror"` found.
211
-
212
- ---
213
-
214
- ### Phase C-3: Network Error Audit (network.js)
215
-
216
- ```bash
217
- node network.js --url <url> --types xhr,fetch
218
- ```
219
-
220
- Collects: request/response pairs.
221
- Flag as `UI Network Error` if any response status is `4xx` or `5xx`.
222
-
223
- ---
224
-
225
- ### Phase C-4: Performance Metrics (performance.js)
226
-
227
- ```bash
228
- node performance.js --url <url> --metrics
229
- ```
230
-
231
- Collects Core Web Vitals: `LCP`, `FID`, `CLS`, `FCP`, `TTFB`, `JSHeapUsedSize`.
232
-
233
- | Metric | Good | Needs Work | Poor (BLOCK) |
234
- |--------------|---------|------------|--------------|
235
- | LCP | < 2.5s | 2.5–4s | > 4s |
236
- | CLS | < 0.1 | 0.1–0.25 | > 0.25 |
237
- | FCP | < 1.8s | 1.8–3s | > 3s |
238
- | TTFB | < 800ms | 800ms–1.8s | > 1.8s |
239
- | JSHeapUsedSize | < 50MB | 50–100MB | > 100MB (memory leak flag) |
240
-
241
- ---
242
-
243
- ### Phase C-5: Responsive Screenshots (screenshot.js & gemini_batch_process.py)
244
-
245
- ```bash
246
- # Capture screenshots
247
- node screenshot.js --url <url> --output screenshots/mobile-375.png --full-page true
248
- node screenshot.js --url <url> --output screenshots/desktop-1440.png --full-page true
249
-
250
- # AI Visual Analysis (Delegate to hapo:ai-multimodal Hub)
251
- pushd ../../ai-multimodal/scripts
252
- python gemini_batch_process.py --files "../../chrome-devtools/scripts/screenshots/mobile-375.png" --task analyze --prompt "Check for layout overlap"
253
- python gemini_batch_process.py --files "../../chrome-devtools/scripts/screenshots/desktop-1440.png" --task analyze --prompt "Check for layout overlap"
254
- popd
255
- ```
256
-
257
- Flag as `UI Visual Error` if the AI analysis output reports any of the following:
258
- - Overlapping/overflowing elements (layout broken)
259
- - Text cut off or unreadable
260
- - Images not loading (broken img placeholders)
261
-
262
- ---
263
-
264
- ### Phase C-5b: User Flow Testing (click.js + fill.js) — `--ui-flow` only
265
-
266
- Test critical user journeys (login, form submission, checkout flow):
267
-
268
- ```bash
269
- # Step 1: Navigate to form page
270
- node navigate.js --url <url>/login
271
-
272
- # Step 2: Fill in form fields
273
- node fill.js --selector "#email" --value "test@example.com"
274
- node fill.js --selector "#password" --value "testpassword123"
275
-
276
- # Step 3: Click submit
277
- node click.js --selector "button[type=submit]"
278
-
279
- # Step 4: Verify success state
280
- node navigate.js --url <url>/dashboard # Expect redirect to dashboard
281
- node screenshot.js --output screenshots/after-login.png
282
- node console.js --url <url>/dashboard --types error # Should be 0 errors
283
- ```
284
-
285
- Common flows to test:
286
- - **Auth flow**: Login → Dashboard → Logout
287
- - **Form submission**: Fill → Submit → Success/Error state
288
- - **CRUD flow**: Create → Read → Update → Delete (if applicable)
289
-
290
- Flag as `User Flow Error` if: redirect fails, form shows error, or console errors appear post-submit.
291
-
292
- ---
293
-
294
- ### Phase C-6: Accessibility Snapshot (aria-snapshot.js)
295
-
296
- ```bash
297
- node aria-snapshot.js --url <url> --output snapshots/aria.yaml
298
- ```
299
-
300
- Flag as `Accessibility Error` if:
301
- - Interactive elements have no accessible name (`aria-label`, `aria-labelledby`, or visible text)
302
- - Form inputs lack associated `<label>` elements
303
- - Images missing `alt` text (role `img` with no name)
304
-
305
- ---
306
-
307
- ### Phase C-7: SEO Audit (evaluate.js)
308
-
309
- Check SEO meta tags and structure via in-page JavaScript:
310
-
311
- ```bash
312
- node evaluate.js --script "({
313
- title: document.title,
314
- description: document.querySelector('meta[name=description]')?.content,
315
- og_title: document.querySelector('meta[property=\"og:title\"]')?.content,
316
- og_image: document.querySelector('meta[property=\"og:image\"]')?.content,
317
- canonical: document.querySelector('link[rel=canonical]')?.href,
318
- h1_count: document.querySelectorAll('h1').length,
319
- robots: document.querySelector('meta[name=robots]')?.content,
320
- structured_data: !!document.querySelector('script[type=\"application/ld+json\"]')
321
- })"
322
- ```
323
-
324
- Flag as `SEO Error` if:
325
- - `title` is empty or > 60 characters
326
- - `description` is missing or > 160 characters
327
- - `h1_count` is 0 (no H1) or > 1 (multiple H1)
328
- - `canonical` is missing
329
- - `og:title` or `og:image` is missing (important for social sharing)
330
-
331
- Also check `robots.txt` and `sitemap.xml` exist:
332
- ```bash
333
- node navigate.js --url <url>/robots.txt
334
- node navigate.js --url <url>/sitemap.xml
335
- ```
336
-
337
- ---
338
-
339
- ### Phase C-8: Security Check (network.js + evaluate.js)
340
-
341
- Basic client-side security checks:
342
-
343
- ```bash
344
- # Check response headers for security headers
345
- node network.js --url <url>
346
-
347
- # Check for visible secrets in page source
348
- node evaluate.js --script "
349
- const src = document.documentElement.innerHTML;
350
- const patterns = [
351
- /api[_-]?key\s*=\s*['\"][a-zA-Z0-9]{20,}/i,
352
- /secret[_-]?key\s*=\s*['\"][a-zA-Z0-9]{20,}/i,
353
- /Bearer\s+[a-zA-Z0-9\-_]+\.[a-zA-Z0-9\-_]+\.[a-zA-Z0-9\-_]+/,
354
- /password\s*=\s*['\"][^'\"]{6,}/i
355
- ];
356
- patterns.map(p => ({pattern: p.source, found: p.test(src)}))
357
- .filter(r => r.found)
358
- "
359
- ```
360
-
361
- Flag as `Security Warning` if:
362
- - Missing security headers: `X-Content-Type-Options`, `X-Frame-Options`, `Content-Security-Policy`
363
- - API keys, secrets, or JWT tokens visible in page HTML
364
- - Mixed content (HTTP resources on HTTPS page) detected via network audit
365
- - `autocomplete="off"` missing on password fields
11
+ ### Process-first markers
12
+
13
+ - Flat markers are direct-child `plan.md` and `task-NN-*.md` entries.
14
+ - The plan must be a regular file whose second line is exactly
15
+ `Specs-Contract: process-first-ready-v1`.
16
+ - At least one task must be a regular direct child. Each task has one unique
17
+ identity, exactly one `Status:`, one `## Verification Plan`, a nonempty exact
18
+ `Command`, and nonempty exact unique `Named probes`.
19
+ - A flat task without a plan, a plan without tasks, wrong/missing process
20
+ marker, malformed or duplicate task fields, symlink, directory, device, or
21
+ other nonregular flat marker returns `BLOCKED`.
22
+
23
+ ### Legacy markers
24
+
25
+ - Legacy markers are `spec.json`, nested legacy tasks, or separate legacy
26
+ receipts. Detect them even when orphaned or broken.
27
+ - Legacy is selected only when a regular schema-valid `spec.json` has one
28
+ consistent identity and registry resolving every contained nested task and
29
+ receipt, and no flat marker exists.
30
+ - Orphan nested tasks/receipts, absent or schema-invalid root, conflicting
31
+ identities, symlinks, nonregular markers, or unresolved/out-of-root entries
32
+ return `BLOCKED`.
33
+
34
+ ### Precedence truth table
35
+
36
+ | Flat state | Legacy state | Result |
37
+ |---|---|---|
38
+ | valid | absent | process-first |
39
+ | absent | valid | legacy adapter |
40
+ | absent | absent | ordinary non-Spec scope |
41
+ | any marker | any marker | `BLOCKED` mixed state |
42
+ | invalid | absent | `BLOCKED` |
43
+ | absent | invalid | `BLOCKED` |
44
+
45
+ Do not infer that an invalid marker is absent. Testing never repairs, migrates,
46
+ renames, deletes, or chooses between conflicting packet identities.
47
+
48
+ ## 2. Select the smallest adequate proof
49
+
50
+ For process-first work, read current plan and active task bytes. The exact task
51
+ Verification Plan is authoritative for command, named probes, reachability,
52
+ oracle, counterexample, proof level, and artifacts. Run every required named
53
+ probe exactly once unless the command's runner legitimately reports multiple
54
+ executions; preserve those counts without deduplicating output.
55
+
56
+ For ordinary scope, derive commands from current project files. Map changed
57
+ files to co-located tests, reverse imports, entrypoints, consumers, configuration,
58
+ and runtime surfaces. Escalate to a wider suite when configuration or shared
59
+ infrastructure changes, mapped scope exceeds roughly 60 percent, or a required
60
+ surface cannot be isolated. `--full` widens selection; it does not loosen proof.
61
+
62
+ Run cheap project-provided prechecks before expensive tests. Do not auto-install
63
+ missing runners, packages, browsers, or linters. A missing prerequisite is
64
+ `BLOCKED`; a precheck that actually runs and fails is `FAIL`.
65
+
66
+ An exit-zero command with zero executed tests, any required skip/todo/cancel,
67
+ or a required named probe that did not execute is not `PASS`.
68
+
69
+ ## 3. Side-effect boundary
70
+
71
+ Before proof, record:
72
+
73
+ - runtime Base and Head;
74
+ - tracked and untracked state;
75
+ - ignored project paths relevant to the command;
76
+ - absence or SHA-256 of `.hapo/test-memory.json`;
77
+ - absence or bytes of any known Test-owned report, cache, or auth-state path.
78
+
79
+ Use a Test-owned temporary directory outside the project only when the command
80
+ needs an ephemeral output location. Record contained artifacts before cleanup,
81
+ then remove only that exact Test-owned temporary directory. Never clean project
82
+ drift or overwrite user-owned files.
83
+
84
+ After proof, compare all observations. Report project-command tracked,
85
+ untracked, and ignored drift separately from runtime Head. A command may
86
+ legitimately change project bytes, but Test must surface that drift; it cannot
87
+ silently delete it, hide it, or call unchanged Head sufficient evidence.
88
+
89
+ Test-owned memory, reports, caches, lazy installs, and auth state must remain
90
+ byte-for-byte absent/unchanged. Any mutation makes required proof `FAIL`.
91
+
92
+ ## 4. `test-proof-v1` schema
93
+
94
+ Return canonical UTF-8 JSON with exactly these top-level keys and no others:
95
+
96
+ ```text
97
+ schema_version, target, verdict, command, exit, counts, provenance,
98
+ proof_level, expected, observed, reachability, artifacts, branches,
99
+ raw_output, redactions, payload_sha256
100
+ ```
101
+
102
+ Validate every nested object against a closed shape:
103
+
104
+ - `schema_version`: exactly `test-proof-v1`.
105
+ - `target`: exact keys `{feature, task_path}`. Both are nonempty strings;
106
+ `task_path` is a contained regular flat task path.
107
+ - `verdict`: exactly `PASS | PASS_WITH_WARNINGS | FAIL | BLOCKED`.
108
+ - `command`: exact task command string; nullable only for pre-execution
109
+ `BLOCKED`.
110
+ - `exit`: integer; nullable only for pre-execution `BLOCKED`.
111
+ - `counts`: exact keys `{executed, passed, failed, skipped}` with nonnegative
112
+ integers and `passed + failed + skipped === executed`.
113
+ - `provenance`: exact keys `{base, head}`. Values are lowercase canonical Git
114
+ SHAs matching current runtime anchors; the whole field is nullable only for
115
+ pre-execution `BLOCKED` before repository identity is available.
116
+ - `proof_level`: exactly `source | installed | live`; never promote one level
117
+ into another.
118
+ - `expected`, `observed`, `raw_output`: nonempty redacted strings after any
119
+ attempted execution. For pre-execution `BLOCKED`, `observed` and `raw_output`
120
+ name the changed prerequisite and `expected` remains nonempty.
121
+ - `reachability`: exact keys `{status, evidence}` where status is
122
+ `PASS | FAIL | BLOCKED` and evidence is an array of unique nonempty strings.
123
+ - `artifacts`: sorted array of exact `{path, sha256}` rows. Every path is
124
+ contained and every digest is lowercase SHA-256.
125
+ - `redactions`: unique sorted labels drawn only from `authorization`, `cookie`,
126
+ `set-cookie`, `credential`, `session-token`, `pii`; never include secret values.
127
+ - `payload_sha256`: lowercase SHA-256 of canonical stable JSON after removing
128
+ only `payload_sha256`. The controller recomputes it.
129
+
130
+ `branches` is a nonempty sorted array. Each row has exact keys:
131
+
132
+ ```text
133
+ id, required, verdict, command, exit, counts, proof_level
134
+ ```
135
+
136
+ - IDs equal the Verification Plan's exact unique Named probes, one row each.
137
+ - `required` is exactly `true`; branch verdict and proof level use the same
138
+ closed enums.
139
+ - `command` equals the task's exact command; `exit` is an integer; branch counts
140
+ use the same closed shape. Execution fields may be null only for a required
141
+ pre-execution `BLOCKED` branch, whose counts are all zero.
142
+ - Reject unknown nested keys, duplicate/missing/extra branch IDs, contradictory
143
+ aggregate counts, command drift, proof-level promotion, and unsorted rows.
144
+
145
+ Payload counts cover required Named-probe executions only, not unrelated support
146
+ tests reported by the same suite. Attribute each required execution to exactly
147
+ one branch with no overlap or omission. Payload `executed`, `passed`, `failed`,
148
+ and `skipped` each equal the element-wise sum of that field across every branch;
149
+ any unattributed, multiply attributed, or unequal count is contradictory and
150
+ returns `BLOCKED`.
151
+
152
+ ## 5. Aggregation and integrity
153
+
154
+ Aggregate required branches in strict order:
155
+
156
+ 1. Any attempted required `FAIL` branch makes the payload `FAIL`.
157
+ 2. Any missing, invalid, unknown, or pre-execution blocked required branch makes
158
+ it `BLOCKED` unless a required attempted failure already exists.
159
+ 3. Any warning branch makes it `PASS_WITH_WARNINGS` unless a stronger result
160
+ exists.
161
+ 4. Only every required branch at literal `PASS` can reach payload `PASS`.
162
+
163
+ Attempted `FAIL` has at least one of: nonzero exit, failed count, or
164
+ `reachability.status: FAIL`. A payload may be `PASS` only with the exact command,
165
+ exit 0, executed > 0, failed 0, skipped 0, matching current provenance, every
166
+ branch `PASS`, reachability `PASS`, valid artifacts, safe redaction, and a valid
167
+ digest. A contradictory payload returns `BLOCKED`; never repair it by guessing.
168
+
169
+ ## 6. Authenticated UI proof
170
+
171
+ Use UI proof only for a reachable UI requirement.
172
+
173
+ 1. Confirm the exact target is HTTPS or localhost, expected environment, and
174
+ safe origin before opening auth state.
175
+ 2. Prefer the project's native test login/helper. Otherwise require an
176
+ explicitly selected user-controlled browser profile.
177
+ 3. Confirm profile identity, permissions, tenant/environment, and allowed action
178
+ scope without exposing credentials.
179
+ 4. Bind approval to the confirmed origin. Stop on cross-origin redirects,
180
+ unexpected identity/permission, or auth challenges.
181
+ 5. Obtain fresh consent before a destructive production action. If consent or
182
+ safe isolation is unavailable, return `BLOCKED`.
183
+ 6. Never ask the user to paste credentials, cookies, bearer tokens, session
184
+ tokens, or local-storage auth; never export or persist them.
185
+
186
+ Redact Authorization, Cookie, Set-Cookie, session tokens, credentials, and
187
+ scoped PII from commands, request/response headers and bodies, console/network
188
+ logs, screenshots, filenames, artifact metadata, raw output, and reports. If a
189
+ required assertion cannot be shown without disclosure, return `BLOCKED`.
190
+
191
+ UI depth is proportional: smoke/navigation first; add console/network,
192
+ interaction flow, viewport/visual, accessibility, performance, SEO, or security
193
+ only when the Verification Plan, behavior, or risk requires them. Multiple
194
+ workers may own disjoint phases, but their outputs aggregate into one proof and
195
+ must not write project state.
196
+
197
+ ## 7. Human report versus machine proof
198
+
199
+ Return the validated `test-proof-v1` handoff to the controller and a separate
200
+ concise report containing only verdict, scope, exact redacted command, exit,
201
+ counts, reachability, proof level, project-command drift, and next action.
202
+
203
+ Do not paste verbose raw output, full JSON, credentials, PII, or screenshots into
204
+ the report. Do not write a report file during proof. Process-first Status and
205
+ inline `## Receipt` remain controller-only.
206
+
207
+ ## Legacy workflow compatibility
208
+
209
+ After a valid legacy route, preserve its v2.1 task/receipt adapter and existing
210
+ proof rules. Separate legacy receipts remain legacy-only. Never search for or
211
+ create a separate receipt for a process-first task, and never copy a legacy
212
+ receipt into a flat task.