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,128 @@
1
+ ---
2
+ name: void-plan-review
3
+ description: "Critique a written plan (not a diff) via four lenses: CEO premise/ambition, Eng test-coverage, Design states/slop, DevEx time-to-first-value. Proposes findings; the author disposes."
4
+ ---
5
+
6
+ # plan-review — voidcorp craftsman edition
7
+
8
+ `void-brainstorm` pressure-tests the idea and `void-plan` authors the plan. This skill sits between the written plan and implementation: it **critiques an already-written plan** from up to four expert lenses, surfaces findings one decision at a time, and appends an Implementation Tasks list to the plan. It is read-mostly — it **proposes**; the plan's author (you, via `void-plan`) **disposes**. It never writes code and never restructures the plan itself.
9
+
10
+ Invoke it on a plan in `docs/specs/` or `docs/plans/` before the plan becomes tickets. Pick one lens, several, or `all` (the orchestrated pass, below).
11
+
12
+ **Attribution**: see `.source`. Distilled from gstack `/plan-ceo-review`, `/plan-eng-review`, `/plan-design-review`, `/plan-devex-review`, `/autoplan` (methodology only; the runtime and the named-founder rosters are rejected).
13
+
14
+ ---
15
+
16
+ ## The shared contract (every lens obeys this)
17
+
18
+ - **Scope gate first.** Before reviewing, state what the plan touches and what is explicitly NOT in scope. A plan touching > 8 files or > 2 new services is a size smell — flag it before anything else.
19
+ - **One finding = one decision.** Surface findings interactively, one at a time, each as a concrete decision with 2-3 options (always including "do nothing / defer") and a recommendation mapped to a stated preference. Never dump a wall of findings.
20
+ - **Severity**: `P1` blocks ship · `P2` same-branch follow-up · `P3` later. Effort is dual-scaled (human hours vs AI-agent minutes — completeness is cheap when an agent implements).
21
+ - **Findings become tasks, not edits.** The lens appends an Implementation Tasks list (P1/P2/P3) to the plan. It does not silently rewrite the plan; the author folds the fixes in. Registries the plan should already contain (Not-in-scope, What-already-exists, diagrams) are `void-plan`' job — the lens flags their absence, it does not own them.
22
+ - **Verdict**: `CLEARED` (no P1 unresolved) or `NOT CLEARED` with the blocking findings named.
23
+ - **Optional second opinion.** For a high-stakes plan, run one independent pass (a fresh subagent, or a second model) and surface only where it disagrees — cross-model tension is signal.
24
+
25
+ ---
26
+
27
+ ## Lens: CEO — is this the right thing, at the right ambition?
28
+
29
+ The only lens that may challenge the **premise** and say "scrap it, do this instead." It accepts nothing as given.
30
+
31
+ - **Premise & leverage**: right problem? a cheaper reframing? real outcome vs a proxy metric? cost of doing nothing? what existing code already solves each sub-problem?
32
+ - **Trajectory**: current → delta → 12-month ideal. Reversibility 1-5 (one-way vs two-way door); path dependency; debt introduced; "obvious to a new engineer in 12 months?"
33
+ - **Alternatives are mandatory**: 2-3 approaches, weighting *minimal-viable* and *ideal-architecture* equally, each with effort/risk/reuse; recommend one; do not proceed without approval. (Authoring the chosen approach is `void-plan`' job — the lens forces the comparison, not the write-up.)
34
+
35
+ **Scope mode** (pick once, up front — this is the plan-level 10x move):
36
+ - `EXPANSION` — cathedral: run the 10x check, sketch the Platonic-ideal version, name ≥ 5 delight opportunities. Default for greenfield.
37
+ - `SELECTIVE` — hold rigor as the baseline, then offer neutral expansion candidates + platform potential to cherry-pick. Default for an enhancement.
38
+ - `HOLD` — maximum rigor, no expansion; > 8 files / > 2 services is a smell. Default for a bugfix.
39
+ - `REDUCTION` — ruthless minimum. Default for a > 15-file plan.
40
+
41
+ **Verdict shape**: CRITICAL GAP / WARNING / OK per area, plus the unresolved decisions.
42
+
43
+ ---
44
+
45
+ ## Lens: Eng — is this buildable, testable, and will it not break?
46
+
47
+ The gating lens. Owns the deep **test-coverage trace** no other lens does. Four sections, each answered even when "no issues":
48
+
49
+ - **Architecture**: boundaries and dependency direction, coupling / SPOFs, scaling, security architecture, the distribution/build pipeline, and one realistic production-failure scenario per new codepath.
50
+ - **Failure modes**: every codepath walked for four data paths — happy / nil / empty / upstream-error. A failure that is neither rescued nor tested is a CRITICAL GAP.
51
+ - **Tests**: detect the framework; trace every branch, error, and null path; map interaction edge cases (double-submit, navigate-away, stale data, slow network, concurrency); decide unit vs E2E vs eval per behavior. **A regression fix ships with a test — non-negotiable.** Emit a coverage map of what is and isn't covered.
52
+ - **Performance**: N+1, unbounded memory, missing caching on hot paths.
53
+
54
+ **Output**: per-finding `[severity] (confidence N/10) file:line`, and quote the line that motivates each finding (no quote → it is unverified, drop the confidence). Verdict CLEARED / NOT CLEARED gates the plan.
55
+
56
+ ---
57
+
58
+ ## Lens: Design — what does the user perceive on screen?
59
+
60
+ Scope-gated: no UI in the plan → skip. Judges what reaches the user's eyes.
61
+
62
+ - **Information architecture**: explicit primary / secondary / tertiary emphasis per screen.
63
+ - **Interaction-state coverage**: every state the user actually hits — loading, empty, error, success, partial — described as what the user *sees*. A missing state is a first-class plan gap, not a detail.
64
+ - **Journey & emotional arc**: the 5-second / 5-minute / 5-year read of the feature.
65
+ - **AI-slop risk**: classify the surface (marketing vs app-UI vs hybrid) and hold it to the matching bar; reject generic-AI-generated patterns. (Bar and blacklist re-derived from OpenAI's "designing delightful frontends" + Krug — cited in `.source`, composes with `void-frontend-design` / `void-ui-review`.)
66
+ - **Responsive & a11y**: per-viewport intent, keyboard path, ARIA, 44px targets, 4.5:1 contrast — as plan requirements, not afterthoughts.
67
+
68
+ **Output**: rate each dimension `N/10 → M/10` with the fix written into the plan; "design-complete" when every dimension ≥ 8.
69
+
70
+ ---
71
+
72
+ ## Lens: DevEx — is the developer-facing surface a good journey?
73
+
74
+ Scope-gated: no API / CLI / SDK / library / docs surface → skip. Audits the developer journey from "never heard of it" → hello-world → upgrade. Signature metric: **time-to-first-value (TTHW)**, scored against real competitors (verify with a web search, do not invent numbers).
75
+
76
+ - **Getting started**: one-command install, try-before-install, steps to a working example.
77
+ - **Interface design**: guessable naming, sensible defaults, coverage vs dropping to raw HTTP, progressive disclosure.
78
+ - **Error messages**: trace three real error paths — each names the problem, the cause, the fix, and links docs.
79
+ - **Docs**: findable in 2 minutes, copy-paste works, version-matched.
80
+ - **Upgrade path**: blast radius, deprecation warnings, codemods, semver honored.
81
+ - **Dev environment**: LSP autocomplete, non-interactive CI, types, hot reload, cross-platform.
82
+
83
+ **Output**: a DX scorecard (each dimension Score/Prior/Trend + TTHW tier + competitive rank); TTHW > 10 min is blocking; any dimension < 6 is critical DX debt. This lens judges the *plan's promises*; once the surface ships, `void-devex-audit` measures the reality against them.
84
+
85
+ ---
86
+
87
+ ## `all` — the orchestrated pass (replaces gstack autoplan)
88
+
89
+ Runs the applicable lenses in the fixed order **CEO → Design → Eng → DX** (Design/DX skipped when their scope gate is empty). The order is load-bearing: each phase completes and writes its findings before the next. autoplan is a **mode here, not a separate skill** — once the lenses are one skill, an orchestrator that "runs the four" is a mode, not a new subject (YAGNI).
90
+
91
+ Between phases, auto-decide only the safe class; escalate the rest:
92
+ - **Decision taxonomy**: *Mechanical* (one correct answer) → auto-decide. *Taste* (defensible either way) and *User-challenge* (contradicts a stated goal) → surface to the human, never auto-decide.
93
+ - **Decision principles** for the Mechanical class: choose completeness; fix the whole blast radius (auto-approve in-radius expansions under ~1 day / 5 files / no new infra); when two fixes are equivalent, take the cleaner one without agonizing; reject duplication, reuse; explicit-and-graspable beats clever; bias toward flagging over blocking.
94
+ - **Cross-lens synthesis**: a concern raised by 2+ lenses is a high-confidence theme (the dedup that makes the multi-lens pass worth more than four solo runs).
95
+ - **One final gate**: present the aggregated, deduped task list and the auto-decision audit trail; the human approves / overrides / challenges / revises-and-re-runs the affected lens. The pass drives to this gate; it never auto-applies plan edits beyond appending the task list.
96
+
97
+ ---
98
+
99
+ ## Composition & boundaries
100
+
101
+ - **Downstream of `void-plan`** (which authors the plan) and **upstream of implementation** (`void-implement`). It reviews the artifact `void-plan` produced.
102
+ - **Not `void-brainstorm`**: brainstorm pressure-tests the *idea* (is there demand?); plan-review critiques the *written plan* (is it the right shape, buildable, complete?). Different artifact, different question.
103
+ - **Not `void-code-review`**: that reviews a *diff*; this reviews a *plan* before any code exists.
104
+ - **Not `doctrine-critic`**: that judges a diff against VoidCorp doctrine; this critiques a plan across product/eng/design/DX lenses.
105
+ - **Composes with `void-frontend-design` / `void-ui-review`** (the Design lens defers UI build-craft and audit to them), `void-devex-audit` (the DevEx lens's shipped-surface counterpart — this judges the plan, that measures the deployed reality), and `void-security-guidance` / `void-security-audit` (the Eng lens routes a deep security concern there).
106
+
107
+ ---
108
+
109
+ ## Anti-rules
110
+
111
+ - MUST NOT rewrite the plan — it appends a findings/task list; the author folds fixes in.
112
+ - MUST NOT own plan structure or registries (Not-in-scope, diagrams) — that is `void-plan`.
113
+ - MUST NOT re-litigate the idea's demand — that is `void-brainstorm`.
114
+ - MUST NOT review code or a diff — that is `void-code-review`.
115
+ - MUST NOT auto-decide a Taste or User-challenge call — those go to the human.
116
+ - MUST NOT dump findings in bulk — one finding, one decision.
117
+ - MUST NOT vendor the gstack runtime or the named-founder "how great X think" rosters.
118
+
119
+ ---
120
+
121
+ ## Final rule
122
+
123
+ ```
124
+ Written plan → pick lens(es) → one finding at a time → Implementation Tasks appended → CLEARED verdict.
125
+ The lens proposes; the author disposes. Otherwise → it is not voidcorp plan-review.
126
+ ```
127
+
128
+ A plan reviewed by the right lens before it becomes tickets is cheaper by an order of magnitude than the same gap found in code review.
@@ -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: action
6
+ activation: on-demand
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-qa` skill (see `docs/plans/skill-audits/void-qa.md` for the full distribution matrix):
2
+
3
+ - gstack /qa (1642 LOC, "Test → Fix → Verify") — VENDORED (DEV-390): the QA methodology. Kept + distilled: the QA-engineer-AND-bug-fixer role, test-as-a-user (never read source to test), the modes (diff-aware default / full / quick / regression), the clean-working-tree precondition for atomic fix commits, the Orient → Explore → Document → Score → Triage → Fix-loop → Self-regulate → Report workflow, the per-page checklist (interactive / forms / navigation / empty-loading-error-overflow states / console-after-every-interaction / responsive), the two evidence tiers (interactive before/after vs static single shot), the health-score rubric (per-category deductions + weights), the atomic `fix(qa):` commit-per-fix + re-verify + regression-test + verified/best-effort/reverted classification, and the WTF self-regulation stop-and-ask heuristic.
4
+ - gstack /qa-only (1214 LOC) — VENDORED as the `--report-only` mode (phases through Report, no fix loop). No second skill: report-only is a mode, not a subject.
5
+ - gstack /design-review (1952 LOC), live half — the live-screenshot visual QA is re-homed here as the "visual pass" that COMPOSES `void-ui-review` (which already owns the visual-craft methodology: register split, squint test, interaction-state coverage, technical audit). This skill drives the browser; void-ui-review supplies the bar. No duplication.
6
+ - REPOINTED, not ported: every gstack `$B <cmd>` browse-daemon call (goto/snapshot/click/fill/console/viewport/screenshot) maps onto the `mcp__claude-in-chrome__*` MCP tools (navigate/computer/read_page/form_input/read_console_messages/resize_window/gif_creator/read_network_requests), with `tabs_context_mcp` called first. Full daemon port was ~190 CDP/Chromium files and weeks of work; the re-point is the same prose on a browser layer Claude Code already ships. This IS the epic's "Vague 4" claude-in-chrome re-point.
7
+ - REJECTED (gstack runtime, not doctrine): the browse binary + `./setup` + bun bootstrap, CDP-mode detection, gbrain/learnings search + log, telemetry/review-log, the `~/.gstack/projects` + chromium-profile cookie import (claude-in-chrome uses the user's real logged-in Chrome, so cookie import is moot — documented as a rejection per the ticket), TESTING.md / CLAUDE.md auto-edit.
8
+ - REJECTED (scope creep, routed elsewhere): the entire Test-Framework-Bootstrap block (detect runtime → research → install → write TESTING.md). Standing up a test framework is `void-tdd`/`void-testing`, not QA. A QA skill that also bootstraps a framework is two subjects; the ticket's "un sujet, un skill" forbids it.
9
+
10
+ Strategy: distill + repoint. One skill, one subject ("live browser QA of a running web app"). qa-only folds in as a mode; the visual pass composes ui-review; the regression test composes tdd/testing. < 30% overlap is structural: this drives the browser + functional/fix loop; ui-review judges visuals; devex-audit audits dev surfaces; tdd/testing author suites.
11
+
12
+ Companion change (same ticket, gated by Folpe): the "Never use mcp__claude-in-chrome__*" rule in ~/.claude/CLAUDE.md predates the claude-in-chrome adoption and makes this skill unusable; it is lifted in the same move.
13
+
14
+ DEV-444 adaptation: UI evidence now covers mobile and desktop applicable states, carries the current
15
+ diff identity, and is handed to a fresh Visual Craft Director; unavailable browser proof blocks.
@@ -0,0 +1,103 @@
1
+ ---
2
+ name: void-qa
3
+ description: "Live browser QA of a running web app via the claude-in-chrome MCP: systematic exploration, edge/error/empty states, atomic fix loop, evidence-backed report. Report-only mode available."
4
+ ---
5
+
6
+ # qa — voidcorp craftsman edition
7
+
8
+ You are a QA engineer AND a bug-fix engineer. Test a running web app like a real user — click everything, fill every form, check every state — using the **claude-in-chrome MCP** to drive the browser. When you find a bug, fix it in source with an atomic commit, then re-verify. Produce a structured report with before/after evidence.
9
+
10
+ This tests the *shipped, running app* through a real browser. It is not unit/E2E authoring (`void-tdd` + `void-testing` own that), and it does not judge visual craft from code (`void-ui-review` owns that — this skill composes it for the live visual pass).
11
+
12
+ **Attribution**: see `.source`. Vendored from gstack `/void-qa` + `/qa-only` + the live half of `/design-review`, repointed off the gstack browse daemon onto the claude-in-chrome MCP already present in Claude Code. The gstack runtime (browse binary, gbrain/learnings, telemetry, `~/.gstack` artifacts, test-framework bootstrap) is rejected.
13
+
14
+ ---
15
+
16
+ ## When to invoke
17
+
18
+ - Verifying a running app after a change (the default: a feature branch, "does it actually work?").
19
+ - Auditing a deployed site for bugs and broken flows.
20
+ - A report-only pass (no fixes) before a review or handoff.
21
+
22
+ Do NOT use this to author a unit/E2E suite (`void-tdd`/`void-testing`), to audit UI craft from code (`void-ui-review`), or to audit a dev-facing API/CLI/SDK surface (`void-devex-audit`).
23
+
24
+ ## Browser tooling: claude-in-chrome (load first)
25
+
26
+ The execution primitives are the `mcp__claude-in-chrome__*` tools. If they are deferred, load the core set in **one** ToolSearch call before anything else:
27
+
28
+ `select:mcp__claude-in-chrome__tabs_context_mcp,mcp__claude-in-chrome__navigate,mcp__claude-in-chrome__computer,mcp__claude-in-chrome__read_page,mcp__claude-in-chrome__tabs_create_mcp,mcp__claude-in-chrome__read_console_messages,mcp__claude-in-chrome__form_input,mcp__claude-in-chrome__gif_creator,mcp__claude-in-chrome__resize_window,mcp__claude-in-chrome__read_network_requests`
29
+
30
+ Command mapping from the old gstack browse (`$B`) to the MCP:
31
+
32
+ | Need | claude-in-chrome tool |
33
+ |------|-----------------------|
34
+ | Session tab context (**call first**) | `tabs_context_mcp` |
35
+ | Open the target in a **new** tab | `tabs_create_mcp` |
36
+ | Navigate | `navigate` |
37
+ | Click / type / screenshot | `computer` |
38
+ | Fill a form field | `form_input` |
39
+ | Read DOM / accessibility tree | `read_page` |
40
+ | Console errors after an action | `read_console_messages` (filter with `pattern`) |
41
+ | Network (data-fetch 404s) | `read_network_requests` |
42
+ | Responsive viewport | `resize_window` |
43
+ | Record a repro | `gif_creator` |
44
+
45
+ ## Hard constraints (claude-in-chrome reality)
46
+
47
+ - **`tabs_context_mcp` first**, every session. Never reuse a tab id from another session; open a fresh tab with `tabs_create_mcp` unless the user names a tab.
48
+ - **Permissions are per-site.** If a site is not authorized and permission is refused, STOP and tell the user which site to allow — never loop retrying the same denied call.
49
+ - **Never trigger a JS dialog** (`alert`/`confirm`/`prompt`) or a browser modal — they block the extension and kill the session. For repro debugging use `console.log` + `read_console_messages`, not `alert`. Warn the user before touching any element that may open one.
50
+ - **Not headless.** claude-in-chrome drives the user's real, interactive Chrome (already logged in — no cookie import, no `~/.gstack/chromium-profile`). QA in a cloud/cron session with no interactive Chrome is **out of scope** — an assumed limitation the browse daemon did not have; say so rather than faking it.
51
+ - After 2-3 failed tool calls, a page that will not load, or unexpected tangents: stop and ask the user, do not keep retrying.
52
+
53
+ ## Modes
54
+
55
+ - **Diff-aware** (default on a feature branch with no URL) — read the branch diff, map changed files to affected pages/routes, detect the local dev server, test only those pages plus a homepage smoke. The common case.
56
+ - **Full** (a URL is given) — systematic exploration of every reachable page; 5-10 well-evidenced issues; health score.
57
+ - **Quick** (`--quick`) — 30-second smoke: homepage + top 5 nav targets, load + console + broken links only.
58
+ - **Regression** (`--regression <baseline.json>`) — run full, then diff against a prior baseline: fixed vs new vs score delta.
59
+ - **Report-only** (`--report-only`, the old `/qa-only`) — phases through Report, then STOP. No fix loop, no commits.
60
+
61
+ ## Precondition: clean working tree
62
+
63
+ Each fix must be its own atomic commit, so before fixing, `git status --porcelain` must be empty. If dirty, ask the user to commit / stash / abort first (recommend commit — preserve their work before QA adds fix commits). Report-only mode may run on a dirty tree.
64
+
65
+ ## Workflow
66
+
67
+ 1. **Orient** — `tabs_context_mcp`, open the target in a new tab, screenshot, read the page, check console. Detect the framework (Next.js `__next` / `_next/data`; Rails `csrf-token`; SPA = client routing) and note it. For an SPA, map nav from `read_page` (client routes, not raw links).
68
+ 2. **Explore** — visit pages systematically. Per page: visual scan of the screenshot; click interactive elements; fill + submit forms (empty, invalid, edge, overflow); walk navigation in and out; exercise **the states a user actually hits — empty, loading, error, overflow**; check console after every interaction; for responsive, `resize_window` then **verify the screenshot dimensions actually changed** — on some setups it resizes the window without re-rendering to a true mobile viewport, so confirm before trusting a "mobile" shot (else note responsive as unverified). Depth over breadth: more time on core flows (auth, checkout, search), less on static pages.
69
+ 3. **Document** — write each issue the moment you find it, never batch. Two evidence tiers: an **interactive** bug gets a before-screenshot, the action, an after-screenshot (a `gif_creator` repro for a flow); a **static** bug gets one annotated screenshot. Verify a bug reproduces once before writing it. For a UI quality pass, capture mobile and desktop for every applicable state and bind each capture to the current diff hash; a later CSS/UI diff makes it stale. Redact credentials (`[REDACTED]`). Surface every screenshot to the user (Read the file) — otherwise it is invisible.
70
+ 4. **Health score** — per-category 0-100 (Console, Links, Visual, Functional, UX, Performance, Content, Accessibility) minus severity deductions (critical -25 / high -15 / medium -8 / low -3), weighted average. Record it as the baseline.
71
+ 5. **Visual pass** — for visual/interaction judgment on the live screenshots, compose `void-ui-review`, then hand the current-diff evidence to `core:visual-craft-director` in fresh context. This skill drives the browser; `void-ui-review` supplies the craft bar; the specialist owns the independent verdict. If the browser or required captures are unavailable, report the UI pass blocked rather than certifying from prose.
72
+ 6. **Triage** — sort by severity; fix per tier: `--quick` critical+high · standard (default) +medium · `--exhaustive` +low. Mark unfixable-from-source (third-party, infra) as deferred.
73
+ 7. **Fix loop** (skipped in report-only) — per issue in severity order: locate source (grep/glob — only now do you read code); make the **minimal** fix (no refactor, no scope creep); commit one fix `fix(qa): <issue> — <desc>`; re-test the page with a before/after pair + console + a regression test that reproduces the bug (compose `void-tdd`/`void-testing` — assert behavior, not "it renders"); classify **verified / best-effort / reverted** (`git revert` on a regression → defer).
74
+ 8. **Self-regulation** — every 5 fixes or after any revert, stop and evaluate: reverts, fixes touching many files, all-low-severity remaining, and unrelated-file edits all raise the "this is going wrong" signal. Above the threshold, or past a hard cap of ~50 fixes, STOP and show the user before continuing.
75
+ 9. **Report** — issues with severity + evidence + fix status (verified/best-effort/reverted/deferred) + commit SHA; health-score delta baseline → final; a one-line PR summary ("QA found N, fixed M, health X → Y"). If the final score is worse than baseline, warn prominently. Write it under the project's report location, not `~/.gstack`.
76
+
77
+ ## Composition & boundaries
78
+
79
+ - **With `void-ui-review`** — this skill owns driving the browser and the functional/fix loop; `void-ui-review` owns the visual-craft judgment applied to the live screenshots (step 5). No restated design rules here.
80
+ - **With `void-tdd` / `void-testing`** — the regression test in the fix loop is authored per their discipline. This skill finds bugs in a running app; they own how the test that locks the fix is written.
81
+ - **Not `void-devex-audit`** — that audits a developer-facing surface (API/CLI/SDK/docs journey, TTHW); this QAs an end-user web app in a browser. Different surface.
82
+ - **Not E2E authoring** — Playwright suites are `void-testing`'s output; this is exploratory human-style QA of the deployed thing.
83
+ - **Supersedes** gstack `/void-qa`, `/qa-only`, and the live-screenshot half of `/design-review`.
84
+
85
+ ## Anti-rules
86
+
87
+ - MUST NOT test by reading source — test as a user; read code only in the fix loop, to locate the bug.
88
+ - MUST NOT trigger a blocking JS dialog / modal — it kills the claude-in-chrome session.
89
+ - MUST NOT reuse a cross-session tab id, or assume a headless/CI browser — mark non-interactive sessions out of scope.
90
+ - MUST NOT bundle fixes — one atomic `fix(qa):` commit each; revert on regression.
91
+ - MUST NOT include credentials in the report — `[REDACTED]`.
92
+ - MUST NOT bootstrap a test framework or edit CI/CLAUDE.md — that is `void-tdd`/`void-testing`, not QA.
93
+ - MUST NOT vendor the gstack runtime (browse binary, gbrain/learnings, telemetry, `~/.gstack` artifacts, cookie-profile import).
94
+
95
+ ## Final rule
96
+
97
+ ```
98
+ Running app → load claude-in-chrome (tabs_context first) → orient → explore every state → document with
99
+ evidence → score → triage → atomic fix + regression test + re-verify → self-regulate → report.
100
+ Report-only stops before the fix loop. Otherwise → it is not voidcorp qa.
101
+ ```
102
+
103
+ QA is the discipline of hitting the app the way a user will, before the user does — and, when it breaks, fixing it under the same evidence bar that found it.
@@ -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: action
6
+ activation: on-demand
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,9 @@
1
+ Sources for `void-refactor` skill (see `docs/plans/skill-audits/void-refactor.md` for full audit):
2
+
3
+ - Kent Beck "Tidy First?" 2023 — https://www.oreilly.com/library/view/tidy-first/9781098151232/ — separate Tidyings from Behavior Changes, Two-Hat principle
4
+ - Martin Fowler "Refactoring" 2nd ed. 2018 — https://martinfowler.com/books/refactor.html — catalog of named refactors + smells catalog
5
+ - Michael Feathers "Working Effectively with Legacy Code" 2004 — Sprout Method, Wrap Method for legacy/untested code
6
+ - citypaul/.dotfiles refactor notes — Tidy-First commit cadence
7
+ - Joshua Kerievsky "Refactoring to Patterns" — referenced, used sparingly (not daily practice)
8
+
9
+ Strategy: distill. Author for void-machine with two modes mirroring tdd. Reject monolithic-rewrite framing. Companion hooks: tidying-commit-prefix, refactor-named-grep. Allowed Fowler names in ../../hooks/fowler-refactors.txt.
@@ -0,0 +1,220 @@
1
+ ---
2
+ name: void-refactor
3
+ description: Tidy-First. Tidyings commit separately from behavior changes (Two-Hat). Named Fowler refactors only. Tests stay green. Two modes (strict/souple). Use when improving structure without behavior change.
4
+ ---
5
+
6
+ # refactor — voidcorp craftsman edition
7
+
8
+ Refactoring changes structure, not behavior. The moment behavior changes, you stop refactor and switch to `void-tdd`. Tidyings and Behavior Changes never share a commit. Named refactors from the Fowler catalog, executed mechanically. Tests stay green at every step.
9
+
10
+ **Attribution**: see `.source` in this directory. Primary sources: Kent Beck "Tidy First?" 2023, Martin Fowler "Refactoring" 2nd ed. 2018, Michael Feathers for legacy code.
11
+
12
+ ---
13
+
14
+ ## The Two-Hat principle (Beck)
15
+
16
+ You wear ONE hat at a time:
17
+
18
+ - **Tidying hat**: structure changes only. No new behavior. No new tests. Tests stay green.
19
+ - **Behavior Change hat**: new feature, bugfix, anything that changes observable outcomes. Goes through `void-tdd`.
20
+
21
+ Switching hats means committing. Mixing hats in one commit is rejected.
22
+
23
+ ### Why this matters
24
+
25
+ A commit that does both is unreviewable (the reviewer cannot tell which line is structural and which is functional) and unrevertable (you cannot back out the structural part without losing the feature). The discipline forces clarity.
26
+
27
+ ---
28
+
29
+ ## Cycle
30
+
31
+ ```
32
+ 1. Pick a smell (or a Fowler trigger)
33
+ 2. Pick a named refactor (Fowler catalog)
34
+ 3. Execute mechanically (IDE refactor when possible)
35
+ 4. Run tests → green
36
+ 5. Commit with the refactor name in the message
37
+ 6. (loop until done)
38
+ ```
39
+
40
+ If tests turn red at step 4, you have changed behavior. Back out, recategorize as `void-tdd` work, restart.
41
+
42
+ ---
43
+
44
+ ## Modes
45
+
46
+ | Mode | Posture | When |
47
+ |---|---|---|
48
+ | **strict** | One Tidying = one commit, named after the Fowler refactor | When `void-tdd` is in strict for the target paths |
49
+ | **souple** | Mechanical batch Tidyings allowed (same Fowler move applied N times, e.g., 10 Rename Variable) | When `void-tdd` is in souple, or target paths are in `exploratory` |
50
+
51
+ `exploratory` is not a refactor mode — exploratory code is meant to be thrown away, not refactored.
52
+
53
+ ### Auto-selection
54
+
55
+ Mirror the `void-tdd` mode for the target paths. Override via `// refactor-mode: strict` or `// refactor-mode: souple` at the file header.
56
+
57
+ ---
58
+
59
+ ## Named refactors (Fowler catalog)
60
+
61
+ Use a name from the catalog. Vague "restructure somehow" is rejected.
62
+
63
+ ### Common refactors
64
+
65
+ | Refactor | When |
66
+ |---|---|
67
+ | **Extract Function** | A block of code does a sub-task that has a name. Give the name a function. |
68
+ | **Inline Function** | A function's body is as clear as its name. Inline it. |
69
+ | **Extract Variable** | An expression is hard to understand. Name it with a `const`. |
70
+ | **Inline Variable** | A variable's name adds no clarity. Inline. |
71
+ | **Rename Variable** / **Rename Function** | Better name. Use IDE Rename Symbol. |
72
+ | **Move Function** | The function belongs to another module / class. |
73
+ | **Replace Conditional with Polymorphism** | A `switch` on type is repeated. Move dispatch to the types. (Use sparingly; discriminated unions + exhaustive switch is often better in TS than classes.) |
74
+ | **Replace Magic Number with Symbolic Constant** | Magic numbers (or magic strings) without context. Name them. |
75
+ | **Decompose Conditional** | Complex `if` expression. Extract Variable on each branch's condition + Extract Function on each body. |
76
+ | **Replace Primitive with Branded Type** | Composes with `void-typescript-strict`. `string` UserId → `UserId` branded. |
77
+ | **Replace Loop with Pipeline** | Imperative loop accumulating into an array. Use `.map().filter().reduce()`. |
78
+ | **Replace Function with Command** | Function with many parameters and state. Object with a `run()` method. |
79
+ | **Separate Query from Modifier** | A function that returns AND mutates. Split into `getX()` and `setX()`. |
80
+
81
+ The allowed-names list is maintained in `../../hooks/fowler-refactors.txt`. The companion hook `refactor-named-grep` warns on `refactor:` commits without a recognized name.
82
+
83
+ ### When to use a named refactor
84
+
85
+ - **Code smell triggers** a refactor. Smells from Fowler's catalog: Long Function, Long Parameter List, Divergent Change, Shotgun Surgery, Feature Envy, Data Clumps, Primitive Obsession (→ branded types), Speculative Generality, Comments-as-Apology.
86
+ - **A new feature** would be hard to add into the current shape → refactor BEFORE adding.
87
+ - **A just-implemented feature** surfaced a structural insight → refactor AFTER.
88
+
89
+ NOT triggers:
90
+
91
+ - "The code is ugly" without a current task — leave it
92
+ - "Anticipating future flexibility" — YAGNI
93
+
94
+ ---
95
+
96
+ ## Tidy-First vs Tidy-After (Beck)
97
+
98
+ | Pattern | When |
99
+ |---|---|
100
+ | **Tidy First** | Adding the feature into current shape is hard. Tidy the area first, in separate commits, then add the feature. |
101
+ | **Tidy After** | The feature reveals the better structure. Add the feature (via `void-tdd`), then tidy in separate commits. |
102
+
103
+ Either is fine. Choose by which path is cheaper.
104
+
105
+ ---
106
+
107
+ ## Sprout / Wrap for legacy / untested code (Feathers)
108
+
109
+ When the target code has no tests and you need to change it:
110
+
111
+ - **Sprout Method**: do not modify the legacy code. Sprout the new logic into a new, tested function. Call the new function from the legacy code at a clear point.
112
+ - **Wrap Method**: when the legacy function is called many places, wrap it: rename `oldFn` → `oldFnRaw`, write a new `oldFn` that delegates to `oldFnRaw` and adds the new behavior (with tests).
113
+
114
+ Both let you add tested behavior without refactor untested code first. Refactor inward once a test seam exists.
115
+
116
+ ---
117
+
118
+ ## Commit cadence
119
+
120
+ ### Strict mode
121
+
122
+ ```
123
+ refactor: extract validateEmail helper
124
+ refactor: rename userQty to userCount
125
+ refactor: move formatCurrency to @repo/format
126
+ feat: add invoice discount calculation
127
+ ```
128
+
129
+ Each refactor commit names a Fowler move. Each refactor is small enough to review at a glance.
130
+
131
+ ### Souple mode
132
+
133
+ ```
134
+ refactor: rename UserDto fields to camelCase (15 occurrences, IDE Rename)
135
+ refactor: replace inline magic numbers with TAX_RATE constants (8 sites)
136
+ feat: add invoice discount calculation
137
+ ```
138
+
139
+ Batch is allowed if the move is the same Fowler refactor applied mechanically. Multiple different refactors do NOT batch — that drifts back to "cleanup."
140
+
141
+ ---
142
+
143
+ ## Banned
144
+
145
+ ### Big-bang rewrites
146
+
147
+ "Let's rewrite this module" is not a refactor — it is a feature project. Goes through `void-brainstorm` + `void-plan` + `void-tdd`. Rewrites lose context, regress invariants, and never quite catch up to the original.
148
+
149
+ ### `refactor: misc cleanup` commits
150
+
151
+ Either name the Fowler refactor, or split. This is the path to a `git log` that says nothing.
152
+
153
+ ### Mixed-intent commits
154
+
155
+ `refactor: extract helper and add validation` mixes hats. Split:
156
+
157
+ - `refactor: extract validateEmail helper`
158
+ - `feat: add stricter email validation`
159
+
160
+ The companion hook `tidying-commit-prefix` warns on `refactor:` commits whose body indicates behavior-change keywords (`feat`, `fix`, `void-implement`, `add`).
161
+
162
+ ### Speculative refactor for future flexibility
163
+
164
+ YAGNI. Refactor when current code resists current task. Future-proof abstractions cost more than they save in > 80% of cases.
165
+
166
+ ### Pattern-target refactor as a default
167
+
168
+ Reach for "Refactor toward Strategy / Visitor / etc." only when the pattern is the documented destination. Daily practice is the Fowler catalog, not the GoF.
169
+
170
+ ---
171
+
172
+ ## Composition with other skills
173
+
174
+ - **With `void-tdd`**: the R step of RED-GREEN-REFACTOR delegates here. The refactor mode mirrors the tdd mode.
175
+ - **With `void-testing`**: tests stay green at every step. This skill must not add new tests (adding tests = behavior addition).
176
+ - **With `void-code-review`**: review surfaces refactor candidates ("function has 4 levels of nesting → Extract Function"). This skill decides + executes.
177
+ - **With `void-hexagonal-architecture`** / **`void-domain-driven-design`**: cross-boundary refactors (Move Class across packages) — the architecture skill decides target placement; this skill executes mechanically.
178
+ - **With `void-typescript-strict`**: "Replace Primitive with Branded Type" is a Fowler-Primitive-Obsession-driven move executed here, validated by typescript-strict.
179
+
180
+ ---
181
+
182
+ ## Companion hooks
183
+
184
+ - **`tidying-commit-prefix`** (commit-msg) — warn if `refactor:` subject is paired with behavior-change keywords in body
185
+ - **`refactor-named-grep`** (commit-msg) — warn if `refactor:` subject does not contain a known Fowler refactor name (allowlist in `fowler-refactors.txt`)
186
+
187
+ See `../../hooks/`.
188
+
189
+ ---
190
+
191
+ ## Anti-rules
192
+
193
+ - MUST NOT change observable behavior. Any behavior change → stop, switch to `void-tdd`.
194
+ - MUST NOT add new tests (that is a behavior addition or a coverage backfill, both via `void-tdd`).
195
+ - MUST NOT decide whether the refactor is worth doing (taste / cost call escalates to user).
196
+ - MUST NOT batch unrelated refactors in one commit, even in `souple`.
197
+ - MUST NOT silently allow "cleanup" mixed-intent commits.
198
+
199
+ ---
200
+
201
+ ## When you are stuck
202
+
203
+ | Problem | Solution |
204
+ |---|---|
205
+ | Tests turn red on a refactor | Behavior changed. Back out. Recategorize as `void-tdd` work. |
206
+ | Cannot pick a Fowler name | The change is probably a behavior addition disguised as structural. Re-examine. |
207
+ | Code has no tests | Sprout Method or Wrap Method (Feathers) first. Then refactor inward. |
208
+ | Refactor crosses package boundary | Compose with `void-hexagonal-architecture` matrix first. Then execute. |
209
+ | Want to "clean up" | Pick a current task that triggers the cleanup, or leave it. |
210
+
211
+ ---
212
+
213
+ ## Final rule
214
+
215
+ ```
216
+ Refactor → named Fowler move, tests green at every step, separate commit, no behavior change.
217
+ Otherwise → it is not a voidcorp refactor.
218
+ ```
219
+
220
+ Refactoring is mechanical. The risk is in mixing it with feature work, not in the move itself.
@@ -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: action
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,9 @@
1
+ Sources for `void-retrospective` skill (see `docs/plans/skill-audits/void-retrospective.md` for full audit):
2
+
3
+ - gstack /retro (1770 LOC) — VENDORED (DEV-396): the git-history signal methodology (window gathering: commits/authors/files/types, hotspots, test-vs-prod ratio, PR size, regressions, recurring-fix files). Its data-gathering reads gstack state (~/.gstack/, timeline.jsonl); the harness version reads git log / PRs (gh) / .void/usage.log instead.
4
+ - Rejected (documented): the quantified-self gamification — focus score, ship-of-the-week, personal/team streaks, the week-over-week leaderboard. Productivity gamification, not craftsman doctrine: it optimizes a number, not the code. Kept the signal methodology, dropped the scoring/ranking apparatus.
5
+ - Rejected: all gstack runtime (preamble, gbrain, telemetry, voice, plan-mode, history-save to gstack paths).
6
+
7
+ Strategy: distill + dedicated skill. Its mapped target `void-learn` no longer exists (fused into learn, issue #75), and a periodic window review is a distinct subject from learn's point capture — folding would violate one-skill-one-subject and overflow 400 LOC. So a light dedicated skill that FEEDS learn. See docs/DECISIONS.md (2026-07-10, DEV-396) and the DEV-386 split decision that spun this out.
8
+
9
+ No companion hooks; it reads and reports, writing nothing into doctrine (learn owns the HITL write).
@@ -0,0 +1,71 @@
1
+ ---
2
+ name: void-retrospective
3
+ description: "Periodic engineering retro over a window: read git log / PRs / .void, surface signals (hotspots, test ratio, commit types, regressions), turn them into improvement decisions feeding learn."
4
+ ---
5
+
6
+ # retrospective — voidcorp craftsman edition
7
+
8
+ `void-learn` catches ONE lesson the moment it appears. This skill is the opposite cadence: a deliberate look back over a **window** (a week, a cycle, a sprint) to find the patterns no single moment surfaces — what the codebase's own history is telling you. It reads signals, turns them into concrete improvement decisions, and routes each durable pattern into `void-learn`.
9
+
10
+ Invoke it on a cadence ("weekly retro", "retro since the last release"). It reads and reports; it does not change code.
11
+
12
+ **Attribution**: see `.source`. Distilled from gstack `/retro` — the git-history signal methodology, with the quantified-self gamification (focus score, ship-of-the-week, streaks) deliberately dropped as out of craftsman scope.
13
+
14
+ ---
15
+
16
+ ## Data sources — agnostic and durable
17
+
18
+ Read only sources that survive any tool teardown. **Never** `~/.gstack/` or gstack telemetry.
19
+
20
+ - **git log** over the window: commits with author, timestamp, subject, files changed, insertions/deletions. The spine of the retro.
21
+ - **Conventional-commit types** parsed from subjects: `feat` / `fix` / `void-refactor` / `test` / `chore` / `docs`.
22
+ - **PRs** via `gh pr list --state merged --search "merged:>=<date>"` when a GitHub remote exists.
23
+ - **`.void/runs/*/events.jsonl`** (plus legacy logs when present): which skills actually fired.
24
+ - **Test vs production files**: classify changed paths (`test/`, `spec/`, `__tests__/`, `*.test.*`) to compute the test-to-prod ratio.
25
+
26
+ If a source is absent (no remote, no `.void/`), note it and proceed with what exists.
27
+
28
+ ## Signals to compute (not scores)
29
+
30
+ Report each as an observation with the evidence, not a leaderboard number:
31
+
32
+ - **Commit-type mix** — the `feat`/`fix`/`void-refactor`/`test` ratio. A fix-heavy window points at a quality or root-cause gap; a zero-refactor window at accreting debt; a zero-test window at a discipline slip.
33
+ - **Hotspots** — the files changed most often. A file touched in many commits/PRs is either the active surface or a design pressure point.
34
+ - **Recurring-fix files** — files that received multiple `fix:` commits. Composes with `void-debug`: a file fixed three times is an architectural smell, not three coincidences.
35
+ - **Test-to-prod ratio** — production LOC changed vs test LOC changed. A ratio trending toward zero is the signal that matters most.
36
+ - **PR size distribution** — small vs large PRs. A window of large PRs points at insufficient vertical slicing (composes with `void-plan`).
37
+ - **Regressions** — `fix:` commits that reference a prior feature, or reverts. Each is a candidate for a "prevention" decision.
38
+
39
+ ## Output — a report that ends in decisions
40
+
41
+ 1. **Window summary** — dates, commit count, PR count, the signals above with their evidence (file:count, ratio, examples). Plain observations, no gamified ranking.
42
+ 2. **Improvement decisions** — the point of the retro. For each signal that warrants action, state a concrete change: a test to add, a file to refactor, a hook to propose, a convention to adopt. Not a vague "do better."
43
+ 3. **Route each durable pattern to `void-learn`** — a decision that generalizes ("this class of bug keeps recurring in the adapter layer") is captured as a lesson, HITL. The retro surfaces the pattern; `void-learn` decides where it belongs and writes it (with confirmation). The retro itself writes nothing into doctrine.
44
+
45
+ ## Rejected — gstack gamification (documented)
46
+
47
+ Deliberately NOT vendored: the **focus score**, **ship-of-the-week**, **personal/team streaks**, and the week-over-week trend leaderboard. These are quantified-self productivity gamification, not craftsman doctrine — they optimize a number, not the code. The signal methodology (what the git history reveals) is kept; the scoring/ranking apparatus is dropped.
48
+
49
+ ## Composition & boundaries
50
+
51
+ - **Feeds `void-learn`** — the retro is a *discovery* pass over a window; `void-learn` is the *capture* of one lesson. Different subject, different cadence (window vs point). The retro routes patterns to it, never duplicates its HITL write.
52
+ - **With `void-debug`** — the recurring-fix-file signal is that skill's "recurring bug = architectural smell" seen at the window scale.
53
+ - **With `void-plan`** — a large-PR window is a slicing signal; the fix is smaller vertical slices.
54
+ - **Live/visual dashboards** — deferred; this skill produces a text report. Any richer visualization is out of scope.
55
+
56
+ ## Anti-rules
57
+
58
+ - MUST NOT depend on `~/.gstack/` or any gstack telemetry (it disappears at teardown).
59
+ - MUST NOT reintroduce the gamification (focus score, ship-of-the-week, streaks).
60
+ - MUST NOT write into doctrine — it proposes decisions and routes durable patterns to `void-learn` (HITL).
61
+ - MUST NOT change code — it reads history and reports.
62
+ - MUST NOT duplicate `void-learn`'s point-capture — this is the window-review cadence.
63
+
64
+ ## Final rule
65
+
66
+ ```
67
+ Window → git log / PRs / .void → signals (types, hotspots, test ratio, regressions) → improvement decisions → route durable patterns to learn.
68
+ Otherwise → it is not voidcorp retrospective.
69
+ ```
70
+
71
+ The history is already telling you where the debt and the recurring pain are. The retro is the discipline of listening to it on a cadence.
@@ -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: action
6
+ activation: on-demand
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]