voidmachine 0.0.0 → 5.0.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 (344) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -4
  3. package/bin/void-harness.mjs +12 -0
  4. package/bin/void-machine.mjs +12 -0
  5. package/core-assets/.claude-plugin/plugin.json +285 -0
  6. package/core-assets/.gitkeep +0 -0
  7. package/core-assets/PHILOSOPHY.md +218 -0
  8. package/core-assets/PROJECT-DOCTRINE.template.md +14 -0
  9. package/core-assets/adapters/security/manifest.yaml +96 -0
  10. package/core-assets/agents/.gitkeep +0 -0
  11. package/core-assets/agents/accessibility-specialist.md +59 -0
  12. package/core-assets/agents/api-integration-engineer.md +59 -0
  13. package/core-assets/agents/code-explorer.md +94 -0
  14. package/core-assets/agents/code-explorer.source +7 -0
  15. package/core-assets/agents/data-migration-engineer.md +59 -0
  16. package/core-assets/agents/devex-docs-engineer.md +57 -0
  17. package/core-assets/agents/doctrine-critic.md +91 -0
  18. package/core-assets/agents/doctrine-critic.source +11 -0
  19. package/core-assets/agents/domain-architect.md +56 -0
  20. package/core-assets/agents/experience-designer.md +59 -0
  21. package/core-assets/agents/frontend-engineer.md +60 -0
  22. package/core-assets/agents/independent-code-reviewer.md +62 -0
  23. package/core-assets/agents/migration-planner.md +97 -0
  24. package/core-assets/agents/migration-planner.source +7 -0
  25. package/core-assets/agents/observability-sre-engineer.md +59 -0
  26. package/core-assets/agents/pdf-specialist.md +58 -0
  27. package/core-assets/agents/performance-engineer.md +58 -0
  28. package/core-assets/agents/product-challenger.md +55 -0
  29. package/core-assets/agents/security-engineer.md +66 -0
  30. package/core-assets/agents/silent-failure-hunter.md +94 -0
  31. package/core-assets/agents/silent-failure-hunter.source +8 -0
  32. package/core-assets/agents/solution-architect.md +57 -0
  33. package/core-assets/agents/test-qa-engineer.md +60 -0
  34. package/core-assets/agents/type-design-analyzer.md +93 -0
  35. package/core-assets/agents/type-design-analyzer.source +8 -0
  36. package/core-assets/agents/visual-craft-director.md +62 -0
  37. package/core-assets/codex/hooks.json +172 -0
  38. package/core-assets/contract-history/visual-craft-director/v2.yaml +43 -0
  39. package/core-assets/data/catalog.v3.json +10527 -0
  40. package/core-assets/data/certification.json +1826 -0
  41. package/core-assets/data/identity.json +8 -0
  42. package/core-assets/data/model.json +4256 -0
  43. package/core-assets/enforce/ci-enforce.sh +183 -0
  44. package/core-assets/hooks/_checks.sh +145 -0
  45. package/core-assets/hooks/_hooklib.sh +163 -0
  46. package/core-assets/hooks/_syntax-worker.cjs +503 -0
  47. package/core-assets/hooks/_void-hook.mjs +15448 -0
  48. package/core-assets/hooks/activation-meter.sh +13 -0
  49. package/core-assets/hooks/anti-ai-slop-grep.sh +38 -0
  50. package/core-assets/hooks/auto-format.sh +9 -0
  51. package/core-assets/hooks/axe-precommit.sh +35 -0
  52. package/core-assets/hooks/block-dangerous-bash.sh +10 -0
  53. package/core-assets/hooks/block-protected-push.sh +81 -0
  54. package/core-assets/hooks/boundary-direction-check.sh +10 -0
  55. package/core-assets/hooks/control-character-grep.sh +10 -0
  56. package/core-assets/hooks/fowler-refactors.txt +71 -0
  57. package/core-assets/hooks/large-cl-grep.sh +9 -0
  58. package/core-assets/hooks/llm-cost-precommit.sh +55 -0
  59. package/core-assets/hooks/migration-lint.sh +58 -0
  60. package/core-assets/hooks/migration-pr-template.sh +55 -0
  61. package/core-assets/hooks/no-ai-design-slop.sh +10 -0
  62. package/core-assets/hooks/no-any-grep.sh +10 -0
  63. package/core-assets/hooks/no-as-cast-grep.sh +10 -0
  64. package/core-assets/hooks/no-console-log-grep.sh +10 -0
  65. package/core-assets/hooks/no-null-grep.sh +10 -0
  66. package/core-assets/hooks/no-only-no-skip.sh +10 -0
  67. package/core-assets/hooks/outcome-meter.sh +13 -0
  68. package/core-assets/hooks/pre-PR-review-evidence.sh +47 -0
  69. package/core-assets/hooks/protect-sensitive-files.sh +10 -0
  70. package/core-assets/hooks/refactor-named-grep.sh +49 -0
  71. package/core-assets/hooks/secret-in-content.sh +10 -0
  72. package/core-assets/hooks/sessionstart-context.sh +9 -0
  73. package/core-assets/hooks/stop-typecheck.sh +9 -0
  74. package/core-assets/hooks/tdd-guard.md +90 -0
  75. package/core-assets/hooks/tdd-guard.sh +10 -0
  76. package/core-assets/hooks/test-name-lint.sh +10 -0
  77. package/core-assets/hooks/tidying-commit-prefix.sh +37 -0
  78. package/core-assets/hooks/trim-large-output.sh +9 -0
  79. package/core-assets/hooks/tsc-noemit-precommit.sh +22 -0
  80. package/core-assets/hooks/ubiquitous-language-lint.sh +58 -0
  81. package/core-assets/hooks/viewport-screenshot-gate.sh +48 -0
  82. package/core-assets/modules/.gitkeep +0 -0
  83. package/core-assets/packs/pack-mobile/skills/void-eas-build-profile/.source +7 -0
  84. package/core-assets/packs/pack-mobile/skills/void-eas-build-profile/SKILL.md +164 -0
  85. package/core-assets/packs/pack-mobile/skills/void-eas-build-profile/harness.yaml +14 -0
  86. package/core-assets/packs/pack-mobile/skills/void-expo-config-plugins/.source +7 -0
  87. package/core-assets/packs/pack-mobile/skills/void-expo-config-plugins/SKILL.md +178 -0
  88. package/core-assets/packs/pack-mobile/skills/void-expo-config-plugins/harness.yaml +14 -0
  89. package/core-assets/packs/pack-mobile/skills/void-expo-router-pattern/.source +8 -0
  90. package/core-assets/packs/pack-mobile/skills/void-expo-router-pattern/SKILL.md +209 -0
  91. package/core-assets/packs/pack-mobile/skills/void-expo-router-pattern/harness.yaml +14 -0
  92. package/core-assets/packs/pack-mobile/skills/void-ota-update-strategy/.source +7 -0
  93. package/core-assets/packs/pack-mobile/skills/void-ota-update-strategy/SKILL.md +194 -0
  94. package/core-assets/packs/pack-mobile/skills/void-ota-update-strategy/harness.yaml +14 -0
  95. package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/.source +5 -0
  96. package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/SKILL.md +160 -0
  97. package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/harness.yaml +14 -0
  98. package/core-assets/packs/pack-monorepo/skills/void-package-extraction/.source +5 -0
  99. package/core-assets/packs/pack-monorepo/skills/void-package-extraction/SKILL.md +70 -0
  100. package/core-assets/packs/pack-monorepo/skills/void-package-extraction/harness.yaml +14 -0
  101. package/core-assets/packs/pack-monorepo/skills/void-service-package/.source +5 -0
  102. package/core-assets/packs/pack-monorepo/skills/void-service-package/SKILL.md +122 -0
  103. package/core-assets/packs/pack-monorepo/skills/void-service-package/harness.yaml +14 -0
  104. package/core-assets/packs/pack-monorepo/skills/void-turbo-pipeline-tuning/.source +7 -0
  105. package/core-assets/packs/pack-monorepo/skills/void-turbo-pipeline-tuning/SKILL.md +116 -0
  106. package/core-assets/packs/pack-monorepo/skills/void-turbo-pipeline-tuning/harness.yaml +14 -0
  107. package/core-assets/packs/pack-nextjs/skills/void-cache-component-pattern/.source +5 -0
  108. package/core-assets/packs/pack-nextjs/skills/void-cache-component-pattern/SKILL.md +162 -0
  109. package/core-assets/packs/pack-nextjs/skills/void-cache-component-pattern/harness.yaml +14 -0
  110. package/core-assets/packs/pack-nextjs/skills/void-instrumentation-setup/.source +5 -0
  111. package/core-assets/packs/pack-nextjs/skills/void-instrumentation-setup/SKILL.md +161 -0
  112. package/core-assets/packs/pack-nextjs/skills/void-instrumentation-setup/harness.yaml +14 -0
  113. package/core-assets/packs/pack-nextjs/skills/void-loading-error-boundaries/.source +5 -0
  114. package/core-assets/packs/pack-nextjs/skills/void-loading-error-boundaries/SKILL.md +176 -0
  115. package/core-assets/packs/pack-nextjs/skills/void-loading-error-boundaries/harness.yaml +14 -0
  116. package/core-assets/packs/pack-nextjs/skills/void-parallel-routes-slots/.source +5 -0
  117. package/core-assets/packs/pack-nextjs/skills/void-parallel-routes-slots/SKILL.md +129 -0
  118. package/core-assets/packs/pack-nextjs/skills/void-parallel-routes-slots/harness.yaml +14 -0
  119. package/core-assets/packs/pack-nextjs/skills/void-route-group-decision/.source +5 -0
  120. package/core-assets/packs/pack-nextjs/skills/void-route-group-decision/SKILL.md +107 -0
  121. package/core-assets/packs/pack-nextjs/skills/void-route-group-decision/harness.yaml +14 -0
  122. package/core-assets/packs/pack-pwa/skills/void-install-prompt-ux/.source +5 -0
  123. package/core-assets/packs/pack-pwa/skills/void-install-prompt-ux/SKILL.md +153 -0
  124. package/core-assets/packs/pack-pwa/skills/void-install-prompt-ux/harness.yaml +14 -0
  125. package/core-assets/packs/pack-pwa/skills/void-manifest-checklist/.source +5 -0
  126. package/core-assets/packs/pack-pwa/skills/void-manifest-checklist/SKILL.md +204 -0
  127. package/core-assets/packs/pack-pwa/skills/void-manifest-checklist/harness.yaml +14 -0
  128. package/core-assets/packs/pack-pwa/skills/void-offline-first-mutation/.source +8 -0
  129. package/core-assets/packs/pack-pwa/skills/void-offline-first-mutation/SKILL.md +266 -0
  130. package/core-assets/packs/pack-pwa/skills/void-offline-first-mutation/harness.yaml +14 -0
  131. package/core-assets/packs/pack-pwa/skills/void-service-worker-strategy/.source +5 -0
  132. package/core-assets/packs/pack-pwa/skills/void-service-worker-strategy/SKILL.md +178 -0
  133. package/core-assets/packs/pack-pwa/skills/void-service-worker-strategy/harness.yaml +14 -0
  134. package/core-assets/packs/pack-react/skills/void-accessibility-check/.source +8 -0
  135. package/core-assets/packs/pack-react/skills/void-accessibility-check/SKILL.md +136 -0
  136. package/core-assets/packs/pack-react/skills/void-accessibility-check/harness.yaml +14 -0
  137. package/core-assets/packs/pack-react/skills/void-client-vs-server-component/.source +5 -0
  138. package/core-assets/packs/pack-react/skills/void-client-vs-server-component/SKILL.md +116 -0
  139. package/core-assets/packs/pack-react/skills/void-client-vs-server-component/harness.yaml +14 -0
  140. package/core-assets/packs/pack-react/skills/void-form-pattern/.source +7 -0
  141. package/core-assets/packs/pack-react/skills/void-form-pattern/SKILL.md +157 -0
  142. package/core-assets/packs/pack-react/skills/void-form-pattern/harness.yaml +14 -0
  143. package/core-assets/packs/pack-react/skills/void-state-architecture/.source +5 -0
  144. package/core-assets/packs/pack-react/skills/void-state-architecture/SKILL.md +160 -0
  145. package/core-assets/packs/pack-react/skills/void-state-architecture/harness.yaml +14 -0
  146. package/core-assets/packs/pack-server/skills/void-background-job-pattern/.source +6 -0
  147. package/core-assets/packs/pack-server/skills/void-background-job-pattern/SKILL.md +214 -0
  148. package/core-assets/packs/pack-server/skills/void-background-job-pattern/harness.yaml +14 -0
  149. package/core-assets/packs/pack-server/skills/void-drizzle-migration-safe/.source +6 -0
  150. package/core-assets/packs/pack-server/skills/void-drizzle-migration-safe/SKILL.md +168 -0
  151. package/core-assets/packs/pack-server/skills/void-drizzle-migration-safe/harness.yaml +14 -0
  152. package/core-assets/packs/pack-server/skills/void-env-validation/.source +6 -0
  153. package/core-assets/packs/pack-server/skills/void-env-validation/SKILL.md +131 -0
  154. package/core-assets/packs/pack-server/skills/void-env-validation/harness.yaml +14 -0
  155. package/core-assets/packs/pack-server/skills/void-rate-limit-strategy/.source +6 -0
  156. package/core-assets/packs/pack-server/skills/void-rate-limit-strategy/SKILL.md +149 -0
  157. package/core-assets/packs/pack-server/skills/void-rate-limit-strategy/harness.yaml +14 -0
  158. package/core-assets/packs/pack-server/skills/void-server-action/.source +7 -0
  159. package/core-assets/packs/pack-server/skills/void-server-action/SKILL.md +181 -0
  160. package/core-assets/packs/pack-server/skills/void-server-action/harness.yaml +14 -0
  161. package/core-assets/packs/pack-server/skills/void-testing-server-modules/.source +7 -0
  162. package/core-assets/packs/pack-server/skills/void-testing-server-modules/SKILL.md +73 -0
  163. package/core-assets/packs/pack-server/skills/void-testing-server-modules/harness.yaml +14 -0
  164. package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/.source +7 -0
  165. package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/SKILL.md +205 -0
  166. package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/harness.yaml +14 -0
  167. package/core-assets/policies/core.yaml +95 -0
  168. package/core-assets/policies/ui.yaml +23 -0
  169. package/core-assets/profiles/base.yaml +29 -0
  170. package/core-assets/profiles/expo-config.yaml +36 -0
  171. package/core-assets/profiles/expo.yaml +35 -0
  172. package/core-assets/profiles/monorepo.yaml +33 -0
  173. package/core-assets/profiles/nextjs-config.yaml +31 -0
  174. package/core-assets/profiles/nextjs.yaml +31 -0
  175. package/core-assets/profiles/node-server.yaml +31 -0
  176. package/core-assets/profiles/pwa.yaml +33 -0
  177. package/core-assets/profiles/react.yaml +39 -0
  178. package/core-assets/profiles/sql.yaml +39 -0
  179. package/core-assets/profiles/typescript.yaml +39 -0
  180. package/core-assets/skills/.gitkeep +0 -0
  181. package/core-assets/skills/void-accessibility/.source +15 -0
  182. package/core-assets/skills/void-accessibility/SKILL.md +275 -0
  183. package/core-assets/skills/void-accessibility/harness.yaml +17 -0
  184. package/core-assets/skills/void-api-and-interface-design/.source +13 -0
  185. package/core-assets/skills/void-api-and-interface-design/SKILL.md +231 -0
  186. package/core-assets/skills/void-api-and-interface-design/harness.yaml +16 -0
  187. package/core-assets/skills/void-async-safety/.source +13 -0
  188. package/core-assets/skills/void-async-safety/SKILL.md +287 -0
  189. package/core-assets/skills/void-async-safety/harness.yaml +16 -0
  190. package/core-assets/skills/void-audit/.source +15 -0
  191. package/core-assets/skills/void-audit/SKILL.md +83 -0
  192. package/core-assets/skills/void-audit/harness.yaml +14 -0
  193. package/core-assets/skills/void-autopilot/.source +21 -0
  194. package/core-assets/skills/void-autopilot/SKILL.md +394 -0
  195. package/core-assets/skills/void-autopilot/harness.yaml +14 -0
  196. package/core-assets/skills/void-brainstorm/.source +14 -0
  197. package/core-assets/skills/void-brainstorm/SKILL.md +278 -0
  198. package/core-assets/skills/void-brainstorm/harness.yaml +14 -0
  199. package/core-assets/skills/void-checkpoint/.source +39 -0
  200. package/core-assets/skills/void-checkpoint/SKILL.md +227 -0
  201. package/core-assets/skills/void-checkpoint/harness.yaml +14 -0
  202. package/core-assets/skills/void-claude-md/.source +15 -0
  203. package/core-assets/skills/void-claude-md/SKILL.md +180 -0
  204. package/core-assets/skills/void-claude-md/harness.yaml +14 -0
  205. package/core-assets/skills/void-code-review/.source +14 -0
  206. package/core-assets/skills/void-code-review/SKILL.md +232 -0
  207. package/core-assets/skills/void-code-review/harness.yaml +15 -0
  208. package/core-assets/skills/void-commit-discipline/.source +9 -0
  209. package/core-assets/skills/void-commit-discipline/SKILL.md +211 -0
  210. package/core-assets/skills/void-commit-discipline/harness.yaml +15 -0
  211. package/core-assets/skills/void-context/.source +15 -0
  212. package/core-assets/skills/void-context/SKILL.md +166 -0
  213. package/core-assets/skills/void-context/harness.yaml +14 -0
  214. package/core-assets/skills/void-debug/.source +11 -0
  215. package/core-assets/skills/void-debug/SKILL.md +211 -0
  216. package/core-assets/skills/void-debug/harness.yaml +14 -0
  217. package/core-assets/skills/void-decide/.source +9 -0
  218. package/core-assets/skills/void-decide/SKILL.md +147 -0
  219. package/core-assets/skills/void-decide/harness.yaml +14 -0
  220. package/core-assets/skills/void-devex-audit/.source +8 -0
  221. package/core-assets/skills/void-devex-audit/SKILL.md +113 -0
  222. package/core-assets/skills/void-devex-audit/harness.yaml +15 -0
  223. package/core-assets/skills/void-doctor/.source +15 -0
  224. package/core-assets/skills/void-doctor/SKILL.md +83 -0
  225. package/core-assets/skills/void-doctor/harness.yaml +14 -0
  226. package/core-assets/skills/void-domain-driven-design/.source +13 -0
  227. package/core-assets/skills/void-domain-driven-design/SKILL.md +292 -0
  228. package/core-assets/skills/void-domain-driven-design/harness.yaml +15 -0
  229. package/core-assets/skills/void-frontend-design/.source +19 -0
  230. package/core-assets/skills/void-frontend-design/SKILL.md +274 -0
  231. package/core-assets/skills/void-frontend-design/harness.yaml +17 -0
  232. package/core-assets/skills/void-functional/.source +14 -0
  233. package/core-assets/skills/void-functional/SKILL.md +312 -0
  234. package/core-assets/skills/void-functional/harness.yaml +15 -0
  235. package/core-assets/skills/void-graph/.source +15 -0
  236. package/core-assets/skills/void-graph/SKILL.md +80 -0
  237. package/core-assets/skills/void-graph/harness.yaml +14 -0
  238. package/core-assets/skills/void-hexagonal-architecture/.source +12 -0
  239. package/core-assets/skills/void-hexagonal-architecture/SKILL.md +276 -0
  240. package/core-assets/skills/void-hexagonal-architecture/harness.yaml +15 -0
  241. package/core-assets/skills/void-implement/.source +39 -0
  242. package/core-assets/skills/void-implement/SKILL.md +192 -0
  243. package/core-assets/skills/void-implement/harness.yaml +14 -0
  244. package/core-assets/skills/void-learn/.source +13 -0
  245. package/core-assets/skills/void-learn/SKILL.md +226 -0
  246. package/core-assets/skills/void-learn/harness.yaml +14 -0
  247. package/core-assets/skills/void-llm-cost-discipline/.source +13 -0
  248. package/core-assets/skills/void-llm-cost-discipline/SKILL.md +299 -0
  249. package/core-assets/skills/void-llm-cost-discipline/harness.yaml +15 -0
  250. package/core-assets/skills/void-make-pdf/.source +9 -0
  251. package/core-assets/skills/void-make-pdf/SKILL.md +52 -0
  252. package/core-assets/skills/void-make-pdf/harness.yaml +15 -0
  253. package/core-assets/skills/void-merge/.source +8 -0
  254. package/core-assets/skills/void-merge/SKILL.md +111 -0
  255. package/core-assets/skills/void-merge/harness.yaml +14 -0
  256. package/core-assets/skills/void-migrations/.source +13 -0
  257. package/core-assets/skills/void-migrations/SKILL.md +264 -0
  258. package/core-assets/skills/void-migrations/harness.yaml +17 -0
  259. package/core-assets/skills/void-observability/.source +12 -0
  260. package/core-assets/skills/void-observability/SKILL.md +245 -0
  261. package/core-assets/skills/void-observability/harness.yaml +15 -0
  262. package/core-assets/skills/void-orchestrate/.source +16 -0
  263. package/core-assets/skills/void-orchestrate/SKILL.md +311 -0
  264. package/core-assets/skills/void-orchestrate/harness.yaml +10 -0
  265. package/core-assets/skills/void-plan/.source +15 -0
  266. package/core-assets/skills/void-plan/SKILL.md +246 -0
  267. package/core-assets/skills/void-plan/harness.yaml +14 -0
  268. package/core-assets/skills/void-plan-review/.source +12 -0
  269. package/core-assets/skills/void-plan-review/SKILL.md +128 -0
  270. package/core-assets/skills/void-plan-review/harness.yaml +15 -0
  271. package/core-assets/skills/void-qa/.source +15 -0
  272. package/core-assets/skills/void-qa/SKILL.md +103 -0
  273. package/core-assets/skills/void-qa/harness.yaml +15 -0
  274. package/core-assets/skills/void-refactor/.source +9 -0
  275. package/core-assets/skills/void-refactor/SKILL.md +220 -0
  276. package/core-assets/skills/void-refactor/harness.yaml +15 -0
  277. package/core-assets/skills/void-retrospective/.source +9 -0
  278. package/core-assets/skills/void-retrospective/SKILL.md +71 -0
  279. package/core-assets/skills/void-retrospective/harness.yaml +15 -0
  280. package/core-assets/skills/void-security-audit/.source +12 -0
  281. package/core-assets/skills/void-security-audit/SKILL.md +138 -0
  282. package/core-assets/skills/void-security-audit/harness.yaml +15 -0
  283. package/core-assets/skills/void-security-guidance/.source +13 -0
  284. package/core-assets/skills/void-security-guidance/SKILL.md +294 -0
  285. package/core-assets/skills/void-security-guidance/harness.yaml +15 -0
  286. package/core-assets/skills/void-source-driven-development/.source +12 -0
  287. package/core-assets/skills/void-source-driven-development/SKILL.md +158 -0
  288. package/core-assets/skills/void-source-driven-development/harness.yaml +15 -0
  289. package/core-assets/skills/void-tdd/.source +15 -0
  290. package/core-assets/skills/void-tdd/SKILL.md +394 -0
  291. package/core-assets/skills/void-tdd/harness.yaml +15 -0
  292. package/core-assets/skills/void-testing/.source +19 -0
  293. package/core-assets/skills/void-testing/SKILL.md +301 -0
  294. package/core-assets/skills/void-testing/harness.yaml +17 -0
  295. package/core-assets/skills/void-ticket/.source +18 -0
  296. package/core-assets/skills/void-ticket/SKILL.md +238 -0
  297. package/core-assets/skills/void-ticket/harness.yaml +14 -0
  298. package/core-assets/skills/void-typescript-strict/.source +10 -0
  299. package/core-assets/skills/void-typescript-strict/SKILL.md +294 -0
  300. package/core-assets/skills/void-typescript-strict/harness.yaml +17 -0
  301. package/core-assets/skills/void-ui-review/.source +12 -0
  302. package/core-assets/skills/void-ui-review/SKILL.md +97 -0
  303. package/core-assets/skills/void-ui-review/harness.yaml +15 -0
  304. package/core-assets/skills/void-verify/.source +12 -0
  305. package/core-assets/skills/void-verify/SKILL.md +184 -0
  306. package/core-assets/skills/void-verify/harness.yaml +15 -0
  307. package/core-assets/specialists/accessibility-specialist.source +11 -0
  308. package/core-assets/specialists/accessibility-specialist.yaml +30 -0
  309. package/core-assets/specialists/api-integration-engineer.source +11 -0
  310. package/core-assets/specialists/api-integration-engineer.yaml +30 -0
  311. package/core-assets/specialists/data-migration-engineer.source +11 -0
  312. package/core-assets/specialists/data-migration-engineer.yaml +30 -0
  313. package/core-assets/specialists/devex-docs-engineer.source +11 -0
  314. package/core-assets/specialists/devex-docs-engineer.yaml +29 -0
  315. package/core-assets/specialists/domain-architect.source +11 -0
  316. package/core-assets/specialists/domain-architect.yaml +28 -0
  317. package/core-assets/specialists/experience-designer.source +15 -0
  318. package/core-assets/specialists/experience-designer.yaml +38 -0
  319. package/core-assets/specialists/frontend-engineer.source +11 -0
  320. package/core-assets/specialists/frontend-engineer.yaml +32 -0
  321. package/core-assets/specialists/independent-code-reviewer.source +10 -0
  322. package/core-assets/specialists/independent-code-reviewer.yaml +38 -0
  323. package/core-assets/specialists/migrations.json +15 -0
  324. package/core-assets/specialists/observability-sre-engineer.source +11 -0
  325. package/core-assets/specialists/observability-sre-engineer.yaml +30 -0
  326. package/core-assets/specialists/pdf-specialist.source +11 -0
  327. package/core-assets/specialists/pdf-specialist.yaml +29 -0
  328. package/core-assets/specialists/performance-engineer.source +11 -0
  329. package/core-assets/specialists/performance-engineer.yaml +29 -0
  330. package/core-assets/specialists/product-challenger.source +10 -0
  331. package/core-assets/specialists/product-challenger.yaml +27 -0
  332. package/core-assets/specialists/security-engineer.source +13 -0
  333. package/core-assets/specialists/security-engineer.yaml +41 -0
  334. package/core-assets/specialists/solution-architect.source +13 -0
  335. package/core-assets/specialists/solution-architect.yaml +32 -0
  336. package/core-assets/specialists/test-qa-engineer.source +14 -0
  337. package/core-assets/specialists/test-qa-engineer.yaml +35 -0
  338. package/core-assets/specialists/visual-craft-director.source +17 -0
  339. package/core-assets/specialists/visual-craft-director.yaml +60 -0
  340. package/core-assets/templates/github/dependency-audit.mjs +54 -0
  341. package/core-assets/templates/github/void-dependency-audit.yml +35 -0
  342. package/core-assets/templates/github/void-security.yml +85 -0
  343. package/dist/main.js +70173 -0
  344. package/package.json +68 -4
@@ -0,0 +1,158 @@
1
+ ---
2
+ name: void-source-driven-development
3
+ description: Ground every third-party config or API usage in the official docs for the installed version, not training memory. Verify the version; cite the reference when it helps. Use before writing any tool config.
4
+ ---
5
+
6
+ # source-driven-development
7
+
8
+ Training memory drifts. It blends three minor versions of a framework into one plausible-looking config that compiles, runs, and is subtly wrong: a renamed option, a removed flag, a default that flipped between majors. This skill makes the official documentation of the **installed version** the source of truth for any third-party tool. The read is mandatory; the citation is not. Where a choice is not obvious, a brief reference in the commit lets the "why" outlive the session.
9
+
10
+ This encodes the repo hard rule: *read the official documentation of any third-party tool before writing its config.*
11
+
12
+ **Attribution**: see `.source` in this directory.
13
+
14
+ ---
15
+
16
+ ## The rule
17
+
18
+ When you configure or call a third-party tool (framework, library, CLI, API, build tool):
19
+
20
+ 1. **Find the installed version.** Read the lockfile (`pnpm-lock.yaml`, `package-lock.json`, `Cargo.lock`) or the resolved entry, not just the `^x` range in `package.json`. Options change between majors; the range lies about what is actually resolved.
21
+ 2. **Read the docs for that version.** Pin the docs to the resolved major/minor. Latest-docs for an older installed version is a silent mismatch.
22
+ 3. **Prefer a clean read.** Use the `defuddle` skill (or WebFetch) on the official docs. Strip nav and ads to the load-bearing prose. Distrust third-party tutorials, blog posts, and Stack Overflow answers: they are dated by construction and rarely say which version they target.
23
+ 4. **Cite when it helps.** For a non-obvious choice, put the URL + section (or doc path) in the commit body, the PR, or a comment next to the config, so the next reader can re-derive it. A missing citation never blocks on its own.
24
+
25
+ Memory proposes; docs dispose.
26
+
27
+ ---
28
+
29
+ ## Conflict resolution
30
+
31
+ | Conflict | Winner | Why |
32
+ |---|---|---|
33
+ | Memory vs official docs | Docs | Memory is a lossy average of many versions; docs describe one. |
34
+ | Two sources disagree | Official + version-matched | Vendor docs for the installed version beat any third party. |
35
+ | Docs vs a stale tutorial | Docs | Tutorials freeze a moment; the tool moved on. |
36
+ | Latest docs vs installed-version docs | Installed-version docs | You ship what is installed, not what is newest. |
37
+
38
+ When the docs and a working example genuinely conflict and you cannot resolve it, that uncertainty is a finding: surface it, do not paper over it with a guess.
39
+
40
+ ---
41
+
42
+ ## What "cite the reference" looks like
43
+
44
+ In a commit (composes with `void-commit-discipline` — the "why" carries the source):
45
+
46
+ ```
47
+ chore(build): set vite `build.target` to es2022
48
+
49
+ Vite 7 dropped the old `esbuild.target` shorthand; the documented field
50
+ is now build.target. Ref: vitejs.dev/config/build-options#build-target
51
+ (v7 docs, matches pnpm-lock resolved 7.0.x).
52
+ ```
53
+
54
+ Next to non-obvious config:
55
+
56
+ ```ts
57
+ // retries default changed to 0 in playwright 1.45; opt back in explicitly.
58
+ // ref: playwright.dev/docs/test-retries (v1.45 docs)
59
+ retries: 2,
60
+ ```
61
+
62
+ What verifies a config line is the read of the version-matched docs, not the presence of a citation. A reviewer who doubts an option checks it against those docs; a concrete mismatch is a defect, a missing reference is not.
63
+
64
+ ---
65
+
66
+ ## When this applies
67
+
68
+ - Writing or changing any tool config (bundler, test runner, linter, ORM, CI, framework).
69
+ - Calling a third-party API or SDK where parameter names, defaults, or auth flow matter.
70
+ - Choosing options that differ across major versions.
71
+ - Upgrading a dependency across a major (re-read; do not assume the old config carries).
72
+
73
+ ## When this does NOT apply
74
+
75
+ - First-party code in this repo (you own it; read the source, not "docs").
76
+ - Stable, well-internalized language built-ins where no version ambiguity exists.
77
+ - Throwaway exploration you will delete (but the moment it lands, the rule applies).
78
+
79
+ ---
80
+
81
+ ## Offline / no-network
82
+
83
+ Some runs have no egress: a sandboxed autonomous worker, an air-gapped CI step. You still must not write config from memory. Two moves keep the rule intact without opening the network:
84
+
85
+ 1. **Inject the doc, do not fetch it.** Treat the version-matched reference as an *input*, not a side effect: pass the doc text (or a curated, version-pinned excerpt committed to the repo) into the decision as a parameter — a port — and validate its shape at the boundary with Zod before you trust it (e.g. assert the option you are about to set actually appears in the supplied reference). This is functional core / imperative shell: fetching is an adapter concern, the choice logic takes the doc as data. It composes with `void-hexagonal-architecture` and `void-security-guidance` (untrusted input is validated at the edge).
86
+
87
+ 2. **If no version-matched doc is reachable and the semantics you are writing are genuinely uncertain, incur a `source-debt`.** A missing citation is not a source-debt. A `source-debt` is a short, honest note, in the commit body or the PR, naming exactly which `tool@version` option was authored offline and what remains uncertain about it. It is the alternative to guessing silently, not a mandatory field: a label or checkbox may carry it if the project uses one, but neither is the authority.
88
+
89
+ What matters is the verification itself: the real uncertainty is resolved against the version-matched official docs before the change ships. Once that read is done, a note, label or checkbox not yet updated never blocks on its own. The offline bypass is for *authoring* without egress, never for *shipping* config whose semantics remain unverified.
90
+
91
+ This widens egress by **zero** (decision A3): offline work defers the verification behind an explicit, reviewable IOU; it never reaches for the network it was denied.
92
+
93
+ ---
94
+
95
+ ## Composition
96
+
97
+ - **Upstream of `void-plan`** — stack decisions in a plan must be grounded in current official docs, not remembered defaults. A plan step that pins a library cites the doc that justifies the choice.
98
+ - **With `void-commit-discipline`** — the mandatory "why" in the commit body is where the source citation lives. The git log becomes the audit trail of *why this config*, traceable to a versioned doc.
99
+ - **With `void-decide`** (pack-monorepo) — a structural tool choice becomes an ADR whose "Alternatives considered" cites the official docs of each option, not folklore.
100
+ - **Contrast with memory-driven work** — the failure mode this skill replaces is writing config from training recall and only checking docs when it breaks. Invert that order.
101
+
102
+ ---
103
+
104
+ ## Rationalizations
105
+
106
+ | Rationalization | Reality |
107
+ |---|---|
108
+ | "I know this API, I've used it many times" | You know an average of several versions. The installed one has its own truths. |
109
+ | "The docs will just say what I already think" | Then the read costs seconds and confirms it. When they don't, you just dodged a bug. |
110
+ | "It compiled / it ran, so it's right" | Wrong defaults compile fine. Deprecated-but-still-working options run fine. Until they don't. |
111
+ | "This tutorial does exactly this" | Tutorials rarely state their version and rot silently. Match the vendor docs to your lockfile. |
112
+ | "Checking the version is overkill for a config tweak" | The tweak that broke prod was a flag renamed between minors. The check is cheap. |
113
+ | "I'll read the docs later" | Later never comes. The read happens before the line; a citation, when useful, lands in the same commit. |
114
+ | "Latest docs are close enough" | "Close enough" between majors is how a removed option ships to prod. |
115
+
116
+ ---
117
+
118
+ ## Verification
119
+
120
+ The work is not done until the source check is done. Before marking any third-party config or usage complete:
121
+
122
+ - [ ] Installed version identified from the lockfile (not the `package.json` range).
123
+ - [ ] Official docs for **that** version read (via `/defuddle` / WebFetch, not memory or a tutorial).
124
+ - [ ] Every non-obvious option checked against that doc; cited briefly where it helps the next reader (never blocking on its own).
125
+ - [ ] Any memory-vs-docs conflict resolved in favor of the docs, or surfaced as an open question if irresolvable.
126
+
127
+ If the version check or the read is missing, the config is written from memory. That is the state this skill exists to prevent.
128
+
129
+ ---
130
+
131
+ ## Anti-rules
132
+
133
+ - MUST NOT write tool config from training memory alone — read the version-matched docs first.
134
+ - MUST NOT skip the installed-version check — the `^` range is not the resolved version.
135
+ - MUST NOT cite a third-party tutorial as authoritative — the official, versioned doc is the source.
136
+ - MUST NOT land config whose semantics were not checked against the version-matched docs. A missing citation alone is not that failure.
137
+ - MUST NOT silently pick a side when sources genuinely conflict — surface the divergence.
138
+
139
+ ---
140
+
141
+ ## When you are stuck
142
+
143
+ | Problem | Solution |
144
+ |---|---|
145
+ | Cannot find the official docs | Start from the package homepage / repo README, follow to the versioned docs site. Avoid SEO tutorials. |
146
+ | Docs only cover "latest" | Check the changelog / migration guide for your installed major; or read the versioned docs branch / tag. |
147
+ | Docs and a working snippet conflict | Trust the versioned official docs. If still unresolved, surface it as an open question, do not guess. |
148
+ | The option I remember doesn't exist | It was renamed or removed. Read the migration guide for your major. |
149
+ | No time to read everything | Read the one section governing the option you are setting. Targeted, not exhaustive. |
150
+
151
+ ---
152
+
153
+ ## Final rule
154
+
155
+ ```
156
+ Third-party config → installed version found, version-matched official docs read, source cited when it helps.
157
+ Otherwise → it was written from memory, and memory is not a source.
158
+ ```
@@ -0,0 +1,15 @@
1
+ # Harness metadata for this skill. Not part of the Agent Skills
2
+ # specification, and never copied into a consumer project: the SKILL.md
3
+ # beside it stays portable and validates against the official six fields.
4
+ # Read by this repository's graph, and by the installer for `runtimes`.
5
+ kind: standard
6
+ activation: always
7
+ owner: folpe
8
+ runtimes: [claude, codex]
9
+ enforcement:
10
+ floor: ci
11
+ inline:
12
+ claude: active
13
+ codex: active
14
+ hermes: ci-only
15
+ eval_targets: [claude/anthropic/opus]
@@ -0,0 +1,15 @@
1
+ Sources for `void-tdd` skill (see `docs/plans/skill-audits/void-tdd.md` for full audit):
2
+
3
+ - DECLIK port — /Users/folpe/Developer/DECLIK/.claude/skills/tdd/SKILL.md (377 LOC, top-5%, distills the below)
4
+ - superpowers/test-driven-development — Iron Law + Red Flags + Common Rationalizations
5
+ - citypaul/.dotfiles tdd — TDD Evidence in commit history pattern
6
+ - nizos/tdd-guard — https://github.com/nizos/tdd-guard — companion hook (PreToolUse Edit/Write, 10 bypasses)
7
+ - Kent Beck "Test-Driven Development: By Example" (2002) — foundation
8
+ - morodomi/tdd-skills — reviewed, rejected as primary (too rigid phase-by-phase commit gates)
9
+
10
+ Strategy: port-DECLIK with three minimal stack-agnostic adaptations (paths/commands read from voidcorp.config.json, DECLIK-specific refs moved to pack-monorepo).
11
+
12
+ Companion hook: packages/core/claude/hooks/tdd-guard.sh (94 LOC, all 10 bypasses).
13
+
14
+ DEV-444 adaptation: frontend RED now targets component/hook/store/a11y/state behavior, requires a
15
+ keyboard regression before E2E for interactive controls, and binds proof to the current diff.
@@ -0,0 +1,394 @@
1
+ ---
2
+ name: void-tdd
3
+ description: TDD in three modes (strict/souple/exploratory) chosen by path. Iron Law in strict (no prod code without a failing test), mutation gate if tooled, anti-rustine. Use for any feature, bugfix, refactor.
4
+ ---
5
+
6
+ # tdd — voidcorp craftsman edition
7
+
8
+ Curated aggregate of the best TDD practices for the TypeScript/web stack 2026. Ported from the DECLIK `void-tdd` skill (377 LOC, already top-5%), adapted to be stack-agnostic via `.void/config.json`.
9
+
10
+ **Attribution**: see `.source` in this directory. Primary sources: DECLIK port (which itself distills superpowers/test-driven-development + citypaul/tdd + nizos/tdd-guard). This skill **does not reinvent**; it composes at the right level for void-machine consumers.
11
+
12
+ The companion hook `tdd-guard` (see `../../hooks/tdd-guard.sh`) materializes the structural floor at the Edit/Write level: a sibling test file or an explicitly declared E2E test file MUST exist before governed production code is edited. It does not run the suite, so the failing-first (RED) step stays the engineer's discipline.
13
+
14
+ For E2E coverage, put `// tdd-cover: e2e tests/e2e/route.spec.ts` on the production
15
+ file's first line. The literal project-relative path must name an existing regular
16
+ `.test`/`.spec` JS/TS file inside the physical project root. One valid declaration
17
+ satisfies the structural floor; malformed, misplaced or conflicting declarations
18
+ refuse. It does not prove the route is covered or the suite passed. Keep real
19
+ test evidence, and never use exploratory mode to mean "tested elsewhere".
20
+
21
+ ---
22
+
23
+ ## Modes
24
+
25
+ Three postures, chosen by context. If unsure of the mode, ask explicitly before coding.
26
+
27
+ | Mode | When | Posture |
28
+ |---|---|---|
29
+ | **strict** | New behavior on production code, hotfix on paying surface, refactor that changes observable behavior, DB integration that affects business invariants | Iron Law (zero line of production code without a failing test that requested it) + mutation testing when the project has a mutation runner + 100% coverage + commit/PR evidence trail |
30
+ | **souple** | Integration glue tested at a higher level (E2E + handler covers the chain), framework wiring, config | RED-GREEN-REFACTOR without mutation gate, ≥ 80% coverage on business code, no commit-by-phase ritual |
31
+ | **exploratory** | Documented spike, throwaway POC, scripts marked as such, draft work | No TDD obligation. The file MUST declare throwaway status + deletion date in a header comment. If the code survives the spike, it transitions to strict before merging to prod. |
32
+
33
+ ### Auto-detection heuristic
34
+
35
+ If no explicit `Mode:` marker is in the task or a file header comment, apply:
36
+
37
+ - Path matches `<config.paths.business>` and not in `<config.paths.spikes>` nor in `docs/` → **strict**
38
+ - Path matches `<config.paths.spikes>`, draft folder, or scaffolds → **exploratory**
39
+ - Path matches `<config.paths.serverActions>` (boundary HTTP / Server Action) AND the pure logic is in `services/` with strict tests → **souple** on the handler, **strict** on the service
40
+ - Otherwise → **souple** + ask confirmation if in doubt
41
+
42
+ Paths come from `voidcorp.config.json`. Defaults are documented in `packages/core/claude/skills/void-tdd/defaults.md`.
43
+
44
+ ### Override
45
+
46
+ The user can impose a mode via:
47
+
48
+ - Prompt marker: "implement X in strict mode" / "spike in exploratory mode"
49
+ - File header comment: `// tdd-mode: strict`
50
+ - Repo-wide: `.void/config.json` → `{ "modes": { "tdd": "strict" } }`
51
+
52
+ ---
53
+
54
+ ## Iron Law (strict only)
55
+
56
+ ```
57
+ ZERO LINE OF PRODUCTION CODE WITHOUT A FAILING TEST THAT REQUESTED IT.
58
+ ```
59
+
60
+ **No exception without explicit permission.** Keep the spirit AND the letter — violating one violates both.
61
+
62
+ ### If you wrote code before the test (strict)
63
+
64
+ - You **delete** it. Delete means delete.
65
+ - Do not keep anything "as reference"
66
+ - Do not "adapt" existing code while writing the tests
67
+ - Do not look at the deleted code while re-implementing
68
+ - Implement fresh from the tests
69
+
70
+ Sunk-cost fallacy: the time is already lost. Keeping unverified code is technical debt, not an asset.
71
+
72
+ ---
73
+
74
+ ## Cycle
75
+
76
+ ### Strict mode
77
+
78
+ ```
79
+ RED → Verify RED → GREEN → Verify GREEN → [MUTATE → KILL MUTANTS] → REFACTOR
80
+ ```
81
+
82
+ The bracketed steps run only when the project has a mutation runner (see MUTATE below).
83
+
84
+ ### Souple mode
85
+
86
+ ```
87
+ RED → GREEN → REFACTOR (if it has value)
88
+ ```
89
+
90
+ ### Exploratory mode
91
+
92
+ ```
93
+ Code → [does the demo prove the idea?] → either transition to strict before merge, or delete.
94
+ ```
95
+
96
+ ### RED — write the failing test
97
+
98
+ One thing tested, a name that states the behavior, real code — assert on the observable
99
+ outcome, never on a mock's call count (that tests the mock, not the behavior). Mocks live
100
+ only at infrastructure boundaries. The full technique (how to express the test, factories,
101
+ mocking policy) is the `void-testing` skill's job; TDD owns only *when* and *that* it fails first.
102
+
103
+ Before finalizing the test, scan the mutator rules (boundaries, boolean combinations, equality, arithmetic identities, array/string ops, optional chaining, side effects). This scan needs no tooling and no runner: it is how you write a test that a mutant could not survive, whether or not the project can actually run one.
104
+
105
+ ### Verify RED — watch it fail
106
+
107
+ **Strict: mandatory. Never skip.**
108
+
109
+ ```bash
110
+ <config.commands.testUnit> path/to/file.test.ts
111
+ ```
112
+
113
+ Confirm:
114
+
115
+ - Test fails (not a syntax error)
116
+ - The failure message matches what you expect
117
+ - Fails because the feature is missing, not because of a typo
118
+
119
+ ### GREEN — minimal code
120
+
121
+ ```typescript
122
+ async function retryOperation<T>(fn: () => Promise<T>): Promise<T> {
123
+ for (let i = 0; i < 3; i++) {
124
+ try { return await fn(); }
125
+ catch (e) { if (i === 2) throw e; }
126
+ }
127
+ throw new Error('unreachable');
128
+ }
129
+ ```
130
+
131
+ **No more.** No speculative configuration options. No refactor during GREEN.
132
+
133
+ ### Verify GREEN
134
+
135
+ ```bash
136
+ <config.commands.testUnit> path/to/file.test.ts
137
+ ```
138
+
139
+ Confirm:
140
+
141
+ - Test passes
142
+ - Other tests still pass
143
+ - Pristine output (no warnings, no errors)
144
+
145
+ ### MUTATE (strict, only when a mutation runner is present)
146
+
147
+ The harness ships no mutation runner and installs none. `init` detects Stryker in the project's
148
+ dependencies and writes `commands.mutation` into `.void/config.json` only on that signal, so the
149
+ presence of that key *is* the capability check.
150
+
151
+ - Key present → run `<config.commands.mutation> --mutate <path>`, produce a killed/survived/score
152
+ report, and treat the gate as mandatory in strict.
153
+ - Key absent → the gate does not apply. Never invent a `stryker` command and never block the cycle
154
+ on it; the mutator scan at RED carries the intent instead. Adopting a runner is a project
155
+ decision, not something this skill performs.
156
+
157
+ ### KILL MUTANTS (strict, when MUTATE ran)
158
+
159
+ For each survivor:
160
+
161
+ - If the case value is clear → add a test
162
+ - If ambiguous (business judgment) → ask the user via AskUserQuestion before patching
163
+
164
+ All tests must pass after fix.
165
+
166
+ ### REFACTOR
167
+
168
+ After GREEN (and after MUTATE/KILL in strict), assess the improvements.
169
+
170
+ | Priority | Action | Examples |
171
+ |---|---|---|
172
+ | Critical | Now | Knowledge duplication, > 3 nesting levels, critical surviving mutations |
173
+ | High | This session | Magic numbers, unclear names, functions > 30 lines |
174
+ | Nice | Later | Minor renames, single-use helpers |
175
+ | Skip | Do not touch | Already clean code |
176
+
177
+ Tests must stay green at every step.
178
+
179
+ Load the `void-refactor` skill for the detailed methodology (RED-GREEN-REFACTOR strict commit boundaries).
180
+
181
+ ---
182
+
183
+ ## Stack glue
184
+
185
+ ### Commands (read from `voidcorp.config.json`)
186
+
187
+ - Unit: `<config.commands.testUnit>` (e.g. `bunx vitest run`, `pnpm vitest`, `npm test`)
188
+ - E2E: `<config.commands.testE2e>` (e.g. `bunx playwright test`)
189
+ - Mutation: `<config.commands.mutation>` (e.g. `bunx stryker run`) — absent when no mutation runner is detected
190
+ - Watch: `<config.commands.testWatch>` (e.g. `bunx vitest --watch`)
191
+
192
+ ### Conventions
193
+
194
+ - Test files: `Name.test.ts` co-located with the source file
195
+ - Real-I/O integration tests: `Name.integration.test.ts`
196
+ - E2E Playwright: `<config.paths.e2e>` (e.g. `apps/*/tests/e2e/*.spec.ts`)
197
+
198
+ See the `void-testing` skill for the full technique catalog (factories over `beforeEach`, fixture externalization, behavior-first naming, snapshot policy).
199
+
200
+ ### Schema contracts at trust boundaries
201
+
202
+ If you touch a schema in `<config.paths.contracts>` (Zod schemas at trust boundaries):
203
+
204
+ 1. RED: add a `parse()` case that should fail (invalid data) or succeed (valid data)
205
+ 2. GREEN: modify the schema
206
+ 3. Verify: every downstream call site that consumes this type must compile AND pass its tests
207
+
208
+ The contract is the **single source of truth**, never redefined in tests.
209
+
210
+ ### Frontend behavior (strict)
211
+
212
+ For a UI change, RED lives at the smallest observable surface: component, hook, store, accessibility
213
+ contract, or rendered state. Cover every applicable loading/empty/error/success/partial state named
214
+ by the pre-build experience brief. An interactive control needs a role-first keyboard regression
215
+ test before any E2E proof; E2E may confirm the journey but cannot be the first place a keyboard bug
216
+ is caught. Record passing test evidence against the current diff hash so a later UI edit invalidates
217
+ the proof instead of inheriting green.
218
+
219
+ ### Anti-pattern detected too often
220
+
221
+ Mocking the DB or Server Actions to make a test pass: it breaks at the next refactor without
222
+ protecting anything. Prefer integration tests (pglite / dev DB branch) or invoking the action
223
+ directly. Full anti-mock-business rationale: the `void-testing` skill.
224
+
225
+ ---
226
+
227
+ ## Coverage (strict)
228
+
229
+ 100% by default on the business layer (services + domain). Verification before PR approval:
230
+
231
+ ```bash
232
+ <config.commands.testUnit> --coverage
233
+ ```
234
+
235
+ Target reading:
236
+
237
+ ```
238
+ All files | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
239
+ ----------|---------|----------|---------|---------|---
240
+ All files | 100 | 100 | 100 | 100 |
241
+ ```
242
+
243
+ ### Exception
244
+
245
+ If 100% is impossible (e.g. a Sentry wrapper whose init branch is not testable without an HTTP cassette):
246
+
247
+ 1. Document in the package README: why + where the missing coverage is compensated (integration/E2E)
248
+ 2. Explicit Folpe approval
249
+ 3. List in repo CLAUDE.md under "Test coverage exceptions"
250
+
251
+ Burden of proof on the requester. 100% remains the default.
252
+
253
+ ---
254
+
255
+ ## TDD Evidence (strict)
256
+
257
+ The commit history must show the RED → GREEN → [MUTATE → KILL] → REFACTOR progression.
258
+
259
+ ```
260
+ abc123 test: add failing test for retryOperation backoff
261
+ def456 feat: implement retryOperation exponential backoff
262
+ ghi789 test: strengthen boundary tests post-mutation (kills 3 survivors)
263
+ jkl012 refactor: extract backoff helper for clarity
264
+ ```
265
+
266
+ ### Documented exceptions
267
+
268
+ If evidence is not linear (multi-session, grouped refactor, context resume), document in the PR:
269
+
270
+ ```markdown
271
+ ## TDD Evidence
272
+
273
+ RED phase: commit c925187
274
+ GREEN phase: commits 5e0055b, 9a246d0
275
+ MUTATE + KILL: commit 7b8c9d0
276
+ REFACTOR: commit 11dbd1a
277
+
278
+ Test Evidence:
279
+ - 4/4 tests passing (vitest run, 7.7s)
280
+ - Mutation score: 94% (3/52 documented survivors)
281
+ ```
282
+
283
+ Exception on the evidence presentation, **never on the process**.
284
+
285
+ ---
286
+
287
+ ## Anti-rustine integrated
288
+
289
+ If you are tempted to:
290
+
291
+ - Skip TDD "just this once"
292
+ - Mock everything to "make the test pass"
293
+ - Cast `as any` to avoid real modeling
294
+ - Add a test after the fact that passes immediately
295
+
296
+ → Stop signal. Redesign the approach. Source: project-level "no rustine" rule.
297
+
298
+ A test that is hard to write = a design that is hard to use. The test is the API oracle.
299
+
300
+ ---
301
+
302
+ ## Red Flags (strict)
303
+
304
+ Source: superpowers/test-driven-development. Keep the full list — this is the anti-drift psychology.
305
+
306
+ - Code written before the test
307
+ - Test written after the implementation
308
+ - Test that passes immediately
309
+ - Cannot explain why the test failed
310
+ - Tests added "later"
311
+ - Rationalization "just this once"
312
+ - "I already tested it manually"
313
+ - "Tests after reach the same goal"
314
+ - "It is the spirit, not the ritual"
315
+ - "Keep as reference" / "adapt the existing code"
316
+ - "I already spent X hours, deleting is a waste"
317
+ - "TDD is dogmatic, I am pragmatic"
318
+ - "This case is different because..."
319
+
320
+ → **All these phrases mean: delete, start over in strict.**
321
+
322
+ ---
323
+
324
+ ## Common Rationalizations
325
+
326
+ | Excuse | Reality |
327
+ |---|---|
328
+ | "Too simple to test" | Simple code breaks. The test takes 30 seconds. |
329
+ | "I test afterward" | Tests that pass immediately prove nothing. |
330
+ | "Tests after reach the same goal" | After-tests answer "what does this code do." Before-tests answer "what should this code do." |
331
+ | "I tested it manually" | Manual ≠ systematic. No trace, not re-executable. |
332
+ | "X hours of work to delete = waste" | Sunk-cost fallacy. Keeping unverified code is debt. |
333
+ | "Keep as reference, write tests first" | You will adapt it. That is testing-after. Delete = delete. |
334
+ | "Need to explore first" | OK. Throw away the exploration, restart in strict. |
335
+ | "Hard to test = design not clear" | Listen to the test. Hard to test = hard to use. |
336
+ | "TDD will slow me down" | TDD is faster than debugging in prod. Pragmatic = test-first. |
337
+ | "Manual is faster" | Manual does not prove edge cases. You will re-test on every change. |
338
+
339
+ ---
340
+
341
+ ## Verification checklist
342
+
343
+ Before marking the work complete:
344
+
345
+ - [ ] TDD mode identified at start (strict / souple / exploratory)
346
+ - [ ] Every line of production code has a test that requested it (strict)
347
+ - [ ] Watched every test fail before impl (strict)
348
+ - [ ] Every test fails for the right reason (feature missing, not typo)
349
+ - [ ] Minimal code to pass each test
350
+ - [ ] All tests pass
351
+ - [ ] Pristine output (no warnings, no errors)
352
+ - [ ] Tests use real code (mocks only where unavoidable)
353
+ - [ ] Edge cases and errors covered
354
+ - [ ] Mutation testing run + survivors handled (strict, when `commands.mutation` exists)
355
+ - [ ] Coverage verified 100% or exception documented (strict)
356
+ - [ ] Commit history shows TDD evidence or documented exception (strict)
357
+ - [ ] Refactor evaluated and applied where it has value (all Critical/High priorities addressed)
358
+
359
+ Cannot check every box in strict? You skipped TDD. Restart.
360
+
361
+ ---
362
+
363
+ ## When you are stuck
364
+
365
+ | Problem | Solution |
366
+ |---|---|
367
+ | Do not know how to test | Write the desired signature. Write the assertion first. Ask the user. |
368
+ | Test too complex | Design too complex. Simplify the API. |
369
+ | Must mock everything | Code too coupled. Use parameter injection (see `void-hexagonal-architecture` skill). |
370
+ | Huge test setup | Extract helpers. Still complex? Rethink the design. |
371
+ | Mode not obvious | Ask the user. Default to souple > strict when in doubt. |
372
+
373
+ ---
374
+
375
+ ## Debugging integration
376
+
377
+ Bug found? **Write a failing test that reproduces it before any fix.** Follow the TDD cycle of the applicable mode. The test proves the fix and prevents the regression.
378
+
379
+ Never fix a bug without a reproducing test.
380
+
381
+ See the `void-debug` skill for the upstream root-cause discipline.
382
+
383
+ ---
384
+
385
+ ## Final rule
386
+
387
+ ```
388
+ Production code → a test exists and failed first (strict)
389
+ → a test exists (souple)
390
+ → the code is marked as throwaway (exploratory)
391
+ Otherwise → this is not voidcorp tdd.
392
+ ```
393
+
394
+ No exception without explicit permission from the human partner.
@@ -0,0 +1,15 @@
1
+ # Harness metadata for this skill. Not part of the Agent Skills
2
+ # specification, and never copied into a consumer project: the SKILL.md
3
+ # beside it stays portable and validates against the official six fields.
4
+ # Read by this repository's graph, and by the installer for `runtimes`.
5
+ kind: standard
6
+ activation: always
7
+ owner: folpe
8
+ runtimes: [claude, codex]
9
+ enforcement:
10
+ floor: ci
11
+ inline:
12
+ claude: pretooluse
13
+ codex: pretooluse
14
+ hermes: ci-only
15
+ eval_targets: [claude/anthropic/opus]
@@ -0,0 +1,19 @@
1
+ Sources for `void-testing` skill (see `docs/plans/skill-audits/void-testing.md` for full audit):
2
+
3
+ - Kent C. Dodds "Common Testing Mistakes" + Testing Library philosophy — https://kentcdodds.com/blog/common-mistakes-with-react-testing-library
4
+ - James Shore "Testing Without Mocks" (Art of Agile Development 2nd ed.) — https://www.jamesshore.com/v2/books/aoad2/testing_without_mocks — sociable tests, nullable infrastructure
5
+ - Martin Fowler "Mocks Aren't Stubs" — https://martinfowler.com/articles/mocksArentStubs.html — terminology baseline (dummy / stub / spy / mock / fake)
6
+ - citypaul/.dotfiles testing notes — pyramid ratios, fixture externalization
7
+ - superpowers test patterns — verify-test-fails-for-right-reason, pristine output
8
+ - Vitest docs — https://vitest.dev — tactical specifics in pack-monorepo
9
+ - Playwright docs — https://playwright.dev — tactical specifics in pack-nextjs-pwa
10
+ - Next.js CLI — https://nextjs.org/docs/app/api-reference/cli/next — build and serve the deployment-equivalent artifact
11
+ - Playwright fixtures, parallelism and auth — https://playwright.dev/docs/test-fixtures, https://playwright.dev/docs/test-parallel, https://playwright.dev/docs/auth — isolated worker state and authentication setup
12
+ - Better Auth rate limits — https://better-auth.com/docs/concepts/rate-limit — preserve production defaults and prove client-facing denial
13
+ - MSW (Mock Service Worker) — https://mswjs.io — HTTP boundary mocking
14
+ - pglite — https://pglite.dev — in-memory Postgres for fast integration tests
15
+
16
+ Strategy: distill. Author from sources; framework specifics live in packs. Hooks: no-only-no-skip, test-name-lint, no-business-mock, no-snapshot-default.
17
+
18
+ DEV-444 adaptation: Testing Library's role-first principle is extended to keyboard input and explicit
19
+ applicable-state coverage without moving TDD cycle ownership into this skill.