wicked-garden 12.27.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 (640) hide show
  1. package/.claude-plugin/archetypes.json +166 -0
  2. package/.claude-plugin/components.json +75 -0
  3. package/.claude-plugin/marketplace.json +15 -0
  4. package/.claude-plugin/plugin.json +174 -0
  5. package/.claude-plugin/specialist.json +48 -0
  6. package/.claude-plugin/stack-registry.json +96 -0
  7. package/AGENTS.md +13 -0
  8. package/CHANGELOG.md +712 -0
  9. package/CONTRIBUTING.md +99 -0
  10. package/ETHOS.md +83 -0
  11. package/LICENSE +21 -0
  12. package/README.md +115 -0
  13. package/WICKED_GARDEN_BUS_EVENTS.md +149 -0
  14. package/agents/agentic/architect.md +449 -0
  15. package/agents/agentic/performance-analyst.md +702 -0
  16. package/agents/agentic/safety-reviewer.md +662 -0
  17. package/agents/crew/implementer.md +163 -0
  18. package/agents/crew/researcher.md +94 -0
  19. package/agents/crew/reviewer.md +184 -0
  20. package/agents/data/data-engineer.md +227 -0
  21. package/agents/engineering/api-documentarian.md +440 -0
  22. package/agents/engineering/migration-engineer.md +301 -0
  23. package/agents/engineering/solution-architect.md +208 -0
  24. package/agents/jam/brainstorm-facilitator.md +297 -0
  25. package/agents/jam/council.md +322 -0
  26. package/agents/jam/quick-facilitator.md +85 -0
  27. package/agents/persona/persona-agent.md +121 -0
  28. package/agents/platform/compliance-officer.md +266 -0
  29. package/agents/platform/privacy-expert.md +496 -0
  30. package/agents/platform/security-engineer.md +287 -0
  31. package/agents/product/a11y-expert.md +323 -0
  32. package/agents/product/requirements-analyst.md +238 -0
  33. package/agents/product/ui-reviewer.md +180 -0
  34. package/agents/product/ux-designer.md +199 -0
  35. package/agents/product/value-strategist.md +269 -0
  36. package/agents/qe/semantic-reviewer.md +78 -0
  37. package/commands/agentic/audit.md +24 -0
  38. package/commands/agentic/design.md +24 -0
  39. package/commands/agentic/frameworks.md +25 -0
  40. package/commands/agentic/review.md +27 -0
  41. package/commands/archetype/build.md +12 -0
  42. package/commands/archetype/decide.md +12 -0
  43. package/commands/archetype/explore.md +12 -0
  44. package/commands/archetype/incident.md +12 -0
  45. package/commands/archetype/migrate.md +12 -0
  46. package/commands/archetype/modernize.md +12 -0
  47. package/commands/archetype/review.md +14 -0
  48. package/commands/archetype/ship.md +12 -0
  49. package/commands/archetype/specify.md +12 -0
  50. package/commands/archetype/triage.md +12 -0
  51. package/commands/compile.md +37 -0
  52. package/commands/data/analyze.md +18 -0
  53. package/commands/data/data.md +21 -0
  54. package/commands/data/ml.md +18 -0
  55. package/commands/data/ontology.md +22 -0
  56. package/commands/data/pipeline.md +17 -0
  57. package/commands/deliberate.md +181 -0
  58. package/commands/engineering/add-field.md +77 -0
  59. package/commands/engineering/apply.md +58 -0
  60. package/commands/engineering/arch.md +26 -0
  61. package/commands/engineering/debug.md +27 -0
  62. package/commands/engineering/docs.md +27 -0
  63. package/commands/engineering/new-generator.md +257 -0
  64. package/commands/engineering/patch-plan.md +59 -0
  65. package/commands/engineering/plan.md +29 -0
  66. package/commands/engineering/remove.md +48 -0
  67. package/commands/engineering/rename.md +44 -0
  68. package/commands/engineering/review.md +32 -0
  69. package/commands/help.md +128 -0
  70. package/commands/install.md +118 -0
  71. package/commands/intent.md +54 -0
  72. package/commands/jam/brainstorm.md +37 -0
  73. package/commands/jam/council.md +49 -0
  74. package/commands/jam/quick.md +21 -0
  75. package/commands/jam/revisit.md +79 -0
  76. package/commands/persona/as.md +136 -0
  77. package/commands/persona/define.md +24 -0
  78. package/commands/persona/list.md +118 -0
  79. package/commands/platform/actions.md +20 -0
  80. package/commands/platform/assert.md +18 -0
  81. package/commands/platform/audit.md +23 -0
  82. package/commands/platform/compliance.md +20 -0
  83. package/commands/platform/gh.md +22 -0
  84. package/commands/platform/health.md +22 -0
  85. package/commands/platform/incident.md +23 -0
  86. package/commands/platform/infra.md +24 -0
  87. package/commands/platform/peer-health.md +103 -0
  88. package/commands/platform/plugin-health.md +58 -0
  89. package/commands/platform/security.md +38 -0
  90. package/commands/platform/toolchain.md +96 -0
  91. package/commands/platform/traces.md +20 -0
  92. package/commands/product/a11y.md +19 -0
  93. package/commands/product/acceptance.md +19 -0
  94. package/commands/product/align.md +20 -0
  95. package/commands/product/analyze.md +23 -0
  96. package/commands/product/elicit.md +19 -0
  97. package/commands/product/listen.md +24 -0
  98. package/commands/product/mockup.md +20 -0
  99. package/commands/product/screenshot.md +19 -0
  100. package/commands/product/strategy.md +40 -0
  101. package/commands/product/synthesize.md +23 -0
  102. package/commands/product/ux-review.md +42 -0
  103. package/commands/product/ux.md +20 -0
  104. package/commands/product/visual-direction.md +34 -0
  105. package/commands/prove.md +47 -0
  106. package/commands/report-issue.md +243 -0
  107. package/commands/reset.md +144 -0
  108. package/commands/search/blast-radius.md +58 -0
  109. package/commands/search/hotspots.md +55 -0
  110. package/commands/search/index.md +38 -0
  111. package/commands/search/lineage.md +47 -0
  112. package/commands/search/service-map.md +79 -0
  113. package/commands/setup.md +363 -0
  114. package/commands/smaht/briefing.md +200 -0
  115. package/commands/smaht/events-import.md +95 -0
  116. package/commands/smaht/state.md +19 -0
  117. package/commands/where-am-i.md +58 -0
  118. package/docs/README.md +32 -0
  119. package/docs/adr/0001-code-relationship-graph-engine.md +116 -0
  120. package/docs/adr/0002-major-cleanup-keep-cut.md +91 -0
  121. package/docs/adr/0003-peers-gate-required-layers-optin.md +41 -0
  122. package/docs/adr/0004-code-graph-moves-to-wicked-brain.md +47 -0
  123. package/docs/brain-chunk-format.md +135 -0
  124. package/docs/compiler.md +95 -0
  125. package/docs/daemon-api.md +70 -0
  126. package/docs/domains.md +197 -0
  127. package/docs/getting-started.md +208 -0
  128. package/docs/plans/2026-06-08-wicked-loom-conduct.md +1337 -0
  129. package/docs/plans/2026-06-08-wicked-loom-contract.md +638 -0
  130. package/docs/plans/2026-06-08-wicked-loom-cutover.md +1300 -0
  131. package/docs/plans/2026-06-08-wicked-loom-expand-compose.md +843 -0
  132. package/docs/plans/2026-06-08-wicked-loom-flow-cutover.md +403 -0
  133. package/docs/plans/2026-06-10-codegraph-to-brain-phase1a-graph-core.md +838 -0
  134. package/docs/plans/2026-06-10-codegraph-to-brain-phase1b-injected-edges.md +44 -0
  135. package/docs/required-peers.md +60 -0
  136. package/docs/specs/2026-06-08-wicked-loom-extraction.md +225 -0
  137. package/docs/specs/2026-06-10-codegraph-to-brain-migration.md +168 -0
  138. package/docs/v11/archetypes.md +231 -0
  139. package/hooks/hooks.json +275 -0
  140. package/hooks/scripts/bootstrap.py +1797 -0
  141. package/hooks/scripts/invoke.py +62 -0
  142. package/hooks/scripts/notification.py +166 -0
  143. package/hooks/scripts/permission_request.py +223 -0
  144. package/hooks/scripts/post_tool.py +1374 -0
  145. package/hooks/scripts/pre_compact.py +272 -0
  146. package/hooks/scripts/pre_tool.py +1278 -0
  147. package/hooks/scripts/prompt_submit.py +1109 -0
  148. package/hooks/scripts/session_end.py +95 -0
  149. package/hooks/scripts/stop.py +624 -0
  150. package/hooks/scripts/subagent_lifecycle.py +464 -0
  151. package/hooks/scripts/subscribers/on_gate_decided.py +84 -0
  152. package/hooks/scripts/task_completed.py +322 -0
  153. package/hooks/scripts/worktree_guard.py +148 -0
  154. package/hooks/subscriptions/on_gate_decided.json +9 -0
  155. package/install.mjs +128 -0
  156. package/package.json +41 -0
  157. package/pyproject.toml +59 -0
  158. package/schemas/README.md +32 -0
  159. package/schemas/assert_contracts.json +37 -0
  160. package/schemas/health_probe.json +46 -0
  161. package/schemas/plugin_status.json +37 -0
  162. package/scripts/_adapters/__init__.py +166 -0
  163. package/scripts/_adapters/jira_adapter.py +18 -0
  164. package/scripts/_adapters/linear_adapter.py +18 -0
  165. package/scripts/_adapters/miro_adapter.py +18 -0
  166. package/scripts/_adapters/notion_adapter.py +18 -0
  167. package/scripts/_agents.py +357 -0
  168. package/scripts/_brain_ingest/__init__.py +2 -0
  169. package/scripts/_brain_ingest/session_fact_extractor.py +341 -0
  170. package/scripts/_brain_port.py +163 -0
  171. package/scripts/_bus.py +1081 -0
  172. package/scripts/_bus_catalog_gen.py +93 -0
  173. package/scripts/_bus_consumers.json +46 -0
  174. package/scripts/_bus_emit.py +43 -0
  175. package/scripts/_capability_registry.py +334 -0
  176. package/scripts/_capability_resolver.py +322 -0
  177. package/scripts/_domain_store.py +559 -0
  178. package/scripts/_event_log_reader.py +154 -0
  179. package/scripts/_event_schema.py +305 -0
  180. package/scripts/_event_store.py +397 -0
  181. package/scripts/_heavy_cadence.py +324 -0
  182. package/scripts/_integration_resolver.py +321 -0
  183. package/scripts/_logger.py +151 -0
  184. package/scripts/_loom.py +482 -0
  185. package/scripts/_paths.py +133 -0
  186. package/scripts/_python.sh +22 -0
  187. package/scripts/_run.py +137 -0
  188. package/scripts/_session.py +502 -0
  189. package/scripts/_validate_registry.py +1042 -0
  190. package/scripts/_wicked_testing_probe.py +277 -0
  191. package/scripts/agentic/analyze_agents.py +391 -0
  192. package/scripts/agentic/detect_framework.py +420 -0
  193. package/scripts/agentic/issue_taxonomy.py +357 -0
  194. package/scripts/agentic/pattern_scorer.py +434 -0
  195. package/scripts/classify/persist.py +169 -0
  196. package/scripts/compiler/compile.py +552 -0
  197. package/scripts/compiler/phase0/VERDICT.md +60 -0
  198. package/scripts/compiler/phase0/detect.py +292 -0
  199. package/scripts/compiler/phase0/emit.py +228 -0
  200. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.bindings.json +30 -0
  201. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.lint-output.txt +17 -0
  202. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/.wg/evidence/failing-tests.txt +4 -0
  203. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/.wg/evidence/honest-tests.txt +2 -0
  204. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/fab-fail.build.md +8 -0
  205. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/fab-missing.build.md +8 -0
  206. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/honest.build.md +8 -0
  207. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/wg_check_claims.py +174 -0
  208. package/scripts/compiler/phase0/evidence/command_iq.bindings.json +45 -0
  209. package/scripts/compiler/phase0/evidence/command_iq.lint-output.txt +17 -0
  210. package/scripts/compiler/phase0/evidence/command_iq.stage/.projects/evidence-domain/phase-1-clarify/evidence/failing-tests.txt +4 -0
  211. package/scripts/compiler/phase0/evidence/command_iq.stage/.projects/evidence-domain/phase-1-clarify/evidence/honest-tests.txt +3 -0
  212. package/scripts/compiler/phase0/evidence/command_iq.stage/fab-fail.build.md +8 -0
  213. package/scripts/compiler/phase0/evidence/command_iq.stage/fab-missing.build.md +8 -0
  214. package/scripts/compiler/phase0/evidence/command_iq.stage/honest.build.md +8 -0
  215. package/scripts/compiler/phase0/evidence/command_iq.stage/wg_check_claims.py +174 -0
  216. package/scripts/compiler/phase0/evidence/memos.bindings.json +28 -0
  217. package/scripts/compiler/phase0/evidence/memos.lint-output.txt +17 -0
  218. package/scripts/compiler/phase0/evidence/memos.stage/.wg/evidence/failing-tests.txt +4 -0
  219. package/scripts/compiler/phase0/evidence/memos.stage/.wg/evidence/honest-tests.txt +2 -0
  220. package/scripts/compiler/phase0/evidence/memos.stage/fab-fail.build.md +8 -0
  221. package/scripts/compiler/phase0/evidence/memos.stage/fab-missing.build.md +8 -0
  222. package/scripts/compiler/phase0/evidence/memos.stage/honest.build.md +8 -0
  223. package/scripts/compiler/phase0/evidence/memos.stage/wg_check_claims.py +174 -0
  224. package/scripts/compiler/phase0/evidence/verdict.json +104 -0
  225. package/scripts/compiler/phase0/evidence/wicked-bus.bindings.json +29 -0
  226. package/scripts/compiler/phase0/evidence/wicked-bus.lint-output.txt +17 -0
  227. package/scripts/compiler/phase0/evidence/wicked-bus.stage/coverage/failing-tests.txt +4 -0
  228. package/scripts/compiler/phase0/evidence/wicked-bus.stage/coverage/honest-tests.txt +3 -0
  229. package/scripts/compiler/phase0/evidence/wicked-bus.stage/fab-fail.build.md +8 -0
  230. package/scripts/compiler/phase0/evidence/wicked-bus.stage/fab-missing.build.md +8 -0
  231. package/scripts/compiler/phase0/evidence/wicked-bus.stage/honest.build.md +8 -0
  232. package/scripts/compiler/phase0/evidence/wicked-bus.stage/wg_check_claims.py +174 -0
  233. package/scripts/compiler/phase0/evidence/wire-vault-transcript.txt +60 -0
  234. package/scripts/compiler/phase0/run_probe.py +234 -0
  235. package/scripts/compiler/phase0/wire_vault.py +310 -0
  236. package/scripts/crew/__init__.py +0 -0
  237. package/scripts/crew/_task_audit_writer.py +243 -0
  238. package/scripts/crew/_task_reader.py +389 -0
  239. package/scripts/crew/archetypes_v11.py +348 -0
  240. package/scripts/crew/detectors/__init__.py +12 -0
  241. package/scripts/crew/flow_compiler.py +121 -0
  242. package/scripts/crew/phase_manager.py +703 -0
  243. package/scripts/crew/scope_delta.py +264 -0
  244. package/scripts/crew/specialist_resolver.py +218 -0
  245. package/scripts/crew/stack_registry.py +189 -0
  246. package/scripts/data/data_profiler.py +271 -0
  247. package/scripts/data/ontology_recommender.py +231 -0
  248. package/scripts/data/schema_validator.py +267 -0
  249. package/scripts/delivery/drift.py +739 -0
  250. package/scripts/delivery/telemetry.py +614 -0
  251. package/scripts/engineering/patch/codegraph_db.py +125 -0
  252. package/scripts/engineering/patch/generators/__init__.py +56 -0
  253. package/scripts/engineering/patch/generators/base.py +373 -0
  254. package/scripts/engineering/patch/generators/csharp_generator.py +494 -0
  255. package/scripts/engineering/patch/generators/go_generator.py +430 -0
  256. package/scripts/engineering/patch/generators/java_generator.py +928 -0
  257. package/scripts/engineering/patch/generators/jsp_generator.py +454 -0
  258. package/scripts/engineering/patch/generators/kotlin_generator.py +561 -0
  259. package/scripts/engineering/patch/generators/perl_generator.py +510 -0
  260. package/scripts/engineering/patch/generators/php_generator.py +644 -0
  261. package/scripts/engineering/patch/generators/propagation_engine.py +929 -0
  262. package/scripts/engineering/patch/generators/python_generator.py +487 -0
  263. package/scripts/engineering/patch/generators/ruby_generator.py +463 -0
  264. package/scripts/engineering/patch/generators/rust_generator.py +400 -0
  265. package/scripts/engineering/patch/generators/sql_generator.py +594 -0
  266. package/scripts/engineering/patch/generators/typescript_generator.py +439 -0
  267. package/scripts/engineering/patch/patch.py +800 -0
  268. package/scripts/engineering/patch/safety.py +429 -0
  269. package/scripts/jam/__init__.py +0 -0
  270. package/scripts/jam/_bus_consumers.py +271 -0
  271. package/scripts/jam/agentic_cli_registry.py +703 -0
  272. package/scripts/jam/consensus.py +737 -0
  273. package/scripts/jam/detect_clis.py +409 -0
  274. package/scripts/jam/jam.py +283 -0
  275. package/scripts/jam/save_transcript.py +171 -0
  276. package/scripts/loom/__init__.py +22 -0
  277. package/scripts/loom/cli.py +170 -0
  278. package/scripts/loom/compose.py +180 -0
  279. package/scripts/loom/gate.py +120 -0
  280. package/scripts/loom/manifest.py +140 -0
  281. package/scripts/loom/resolve.py +59 -0
  282. package/scripts/persona/__init__.py +0 -0
  283. package/scripts/persona/registry.py +688 -0
  284. package/scripts/platform/guard_pipeline.py +1214 -0
  285. package/scripts/platform/guard_profiles.py +216 -0
  286. package/scripts/platform/observability/assert_contracts.py +434 -0
  287. package/scripts/platform/observability/health_probe.py +915 -0
  288. package/scripts/platform/observability/ops_log_viewer.py +209 -0
  289. package/scripts/platform/prereq_doctor.py +567 -0
  290. package/scripts/qe/conditions_manifest.py +260 -0
  291. package/scripts/qe/content_sanitizer.py +160 -0
  292. package/scripts/qe/coverage_tracker.py +535 -0
  293. package/scripts/qe/discover_scenarios.py +243 -0
  294. package/scripts/qe/evidence_tracker.py +232 -0
  295. package/scripts/qe/prove.py +196 -0
  296. package/scripts/qe/registry_lookup.py +80 -0
  297. package/scripts/qe/registry_store.py +176 -0
  298. package/scripts/qe/semantic_review.py +1005 -0
  299. package/scripts/qe/vault_gate.py +382 -0
  300. package/scripts/qe/verdict_audit.py +175 -0
  301. package/scripts/qe/verdict_schema.py +335 -0
  302. package/scripts/reset.py +220 -0
  303. package/scripts/resolve_path.py +22 -0
  304. package/scripts/sentinel/invariants.py +402 -0
  305. package/scripts/sentinel/pre_push.py +73 -0
  306. package/scripts/setup/__init__.py +1 -0
  307. package/scripts/setup/detect_state.py +114 -0
  308. package/scripts/setup/migrate_legacy.py +67 -0
  309. package/scripts/setup/migrate_v6_projects.py +232 -0
  310. package/scripts/setup/onboarding.py +114 -0
  311. package/scripts/smaht/_bus_consumers.py +98 -0
  312. package/scripts/smaht/adapters/__init__.py +83 -0
  313. package/scripts/smaht/adapters/brain_adapter.py +254 -0
  314. package/scripts/smaht/adapters/context7_adapter.py +438 -0
  315. package/scripts/smaht/adapters/delegation_adapter.py +104 -0
  316. package/scripts/smaht/adapters/domain_adapter.py +206 -0
  317. package/scripts/smaht/adapters/events_adapter.py +231 -0
  318. package/scripts/smaht/adapters/tools_adapter.py +49 -0
  319. package/scripts/smaht/cheatsheet_store.py +236 -0
  320. package/scripts/smaht/context_package.py +386 -0
  321. package/scripts/smaht/knowledge_graph.py +395 -0
  322. package/scripts/smaht/propose_skills.py +856 -0
  323. package/scripts/smaht/test_cheatsheet_store.py +428 -0
  324. package/scripts/statusline.py +151 -0
  325. package/scripts/where_am_i.py +236 -0
  326. package/skills/agentic/agentic-patterns/SKILL.md +91 -0
  327. package/skills/agentic/agentic-patterns/refs/anti-patterns-design.md +283 -0
  328. package/skills/agentic/agentic-patterns/refs/anti-patterns-operational.md +216 -0
  329. package/skills/agentic/agentic-patterns/refs/pattern-catalog.md +329 -0
  330. package/skills/agentic/context-engineering/SKILL.md +142 -0
  331. package/skills/agentic/context-engineering/refs/caching-and-optimization.md +251 -0
  332. package/skills/agentic/context-engineering/refs/compression-techniques.md +171 -0
  333. package/skills/agentic/context-engineering/refs/cost-calculation-budget.md +250 -0
  334. package/skills/agentic/context-engineering/refs/cost-optimization-reporting.md +300 -0
  335. package/skills/agentic/context-engineering/refs/selective-loading.md +179 -0
  336. package/skills/agentic/frameworks/SKILL.md +191 -0
  337. package/skills/agentic/frameworks/refs/framework-profiles-1.md +209 -0
  338. package/skills/agentic/frameworks/refs/framework-profiles-2.md +214 -0
  339. package/skills/agentic/frameworks/refs/migration-patterns-paths.md +267 -0
  340. package/skills/agentic/frameworks/refs/migration-patterns-testing.md +208 -0
  341. package/skills/agentic/refs/audit.md +134 -0
  342. package/skills/agentic/refs/design.md +137 -0
  343. package/skills/agentic/refs/frameworks.md +102 -0
  344. package/skills/agentic/refs/review.md +160 -0
  345. package/skills/agentic/review-methodology/SKILL.md +186 -0
  346. package/skills/agentic/review-methodology/refs/deliverable-templates.md +246 -0
  347. package/skills/agentic/review-methodology/refs/issue-taxonomy-quality-testing.md +277 -0
  348. package/skills/agentic/review-methodology/refs/issue-taxonomy-reliability-safety.md +253 -0
  349. package/skills/agentic/trust-and-safety/SKILL.md +177 -0
  350. package/skills/agentic/trust-and-safety/refs/guardrails-actions.md +246 -0
  351. package/skills/agentic/trust-and-safety/refs/guardrails-input-output.md +238 -0
  352. package/skills/agentic/trust-and-safety/refs/guardrails-resources.md +209 -0
  353. package/skills/agentic/trust-and-safety/refs/safety-checklist-advanced.md +209 -0
  354. package/skills/agentic/trust-and-safety/refs/safety-checklist-core.md +215 -0
  355. package/skills/archetype/SKILL.md +104 -0
  356. package/skills/archetype/refs/build.md +142 -0
  357. package/skills/archetype/refs/decide.md +117 -0
  358. package/skills/archetype/refs/explore.md +66 -0
  359. package/skills/archetype/refs/incident.md +149 -0
  360. package/skills/archetype/refs/migrate.md +170 -0
  361. package/skills/archetype/refs/modernize.md +187 -0
  362. package/skills/archetype/refs/review.md +145 -0
  363. package/skills/archetype/refs/ship.md +117 -0
  364. package/skills/archetype/refs/specify.md +108 -0
  365. package/skills/archetype/refs/triage.md +62 -0
  366. package/skills/classify/SKILL.md +157 -0
  367. package/skills/data/analysis/SKILL.md +125 -0
  368. package/skills/data/analysis/refs/templates.md +170 -0
  369. package/skills/data/data/SKILL.md +118 -0
  370. package/skills/data/data/refs/examples.md +235 -0
  371. package/skills/data/ml/SKILL.md +125 -0
  372. package/skills/data/ml/refs/templates.md +172 -0
  373. package/skills/data/pipeline/SKILL.md +136 -0
  374. package/skills/data/pipeline/refs/templates.md +175 -0
  375. package/skills/data/refs/analyze.md +123 -0
  376. package/skills/data/refs/data.md +95 -0
  377. package/skills/data/refs/ml.md +118 -0
  378. package/skills/data/refs/pipeline.md +92 -0
  379. package/skills/deliberate/SKILL.md +125 -0
  380. package/skills/deliberate/refs/architecture-lens.md +37 -0
  381. package/skills/deliberate/refs/assumptions-lens.md +43 -0
  382. package/skills/deliberate/refs/code-lens.md +38 -0
  383. package/skills/deliberate/refs/content-lens.md +37 -0
  384. package/skills/deliberate/refs/data-lens.md +43 -0
  385. package/skills/deliberate/refs/design-lens.md +37 -0
  386. package/skills/deliberate/refs/opportunity-patterns.md +107 -0
  387. package/skills/deliberate/refs/ops-lens.md +43 -0
  388. package/skills/deliberate/refs/product-lens.md +46 -0
  389. package/skills/deliberate/refs/rethink-framework.md +77 -0
  390. package/skills/deliberate/refs/security-lens.md +47 -0
  391. package/skills/deliberate/refs/testing-lens.md +45 -0
  392. package/skills/deliberate/refs/timing-lens.md +42 -0
  393. package/skills/engineering/architecture/SKILL.md +177 -0
  394. package/skills/engineering/architecture/refs/adr-template.md +268 -0
  395. package/skills/engineering/architecture/refs/architecture-template-deployment.md +176 -0
  396. package/skills/engineering/architecture/refs/architecture-template-design.md +300 -0
  397. package/skills/engineering/architecture/refs/examples-ecommerce-analytics.md +299 -0
  398. package/skills/engineering/architecture/refs/examples-saas-trading.md +291 -0
  399. package/skills/engineering/architecture/refs/patterns-advanced.md +238 -0
  400. package/skills/engineering/architecture/refs/patterns-structural.md +303 -0
  401. package/skills/engineering/backend/SKILL.md +102 -0
  402. package/skills/engineering/backend/refs/checklists.md +146 -0
  403. package/skills/engineering/backend/refs/patterns.md +181 -0
  404. package/skills/engineering/debugging/SKILL.md +99 -0
  405. package/skills/engineering/debugging/refs/patterns.md +248 -0
  406. package/skills/engineering/debugging/refs/process.md +203 -0
  407. package/skills/engineering/docs/SKILL.md +97 -0
  408. package/skills/engineering/engineering/SKILL.md +88 -0
  409. package/skills/engineering/engineering/refs/checklists.md +91 -0
  410. package/skills/engineering/engineering/refs/templates.md +71 -0
  411. package/skills/engineering/frontend/SKILL.md +92 -0
  412. package/skills/engineering/frontend/refs/checklists.md +96 -0
  413. package/skills/engineering/frontend/refs/patterns.md +167 -0
  414. package/skills/engineering/integration/SKILL.md +183 -0
  415. package/skills/engineering/integration/refs/error-handling-best-practices.md +139 -0
  416. package/skills/engineering/integration/refs/error-handling-error-classes-typescript.md +212 -0
  417. package/skills/engineering/integration/refs/error-handling-error-response-format.md +301 -0
  418. package/skills/engineering/integration/refs/error-handling-retry-strategies.md +190 -0
  419. package/skills/engineering/integration/refs/event-schemas-best-practices.md +225 -0
  420. package/skills/engineering/integration/refs/event-schemas-event-naming-conventions.md +303 -0
  421. package/skills/engineering/integration/refs/event-schemas-event-structure.md +288 -0
  422. package/skills/engineering/integration/refs/graphql-best-practices.md +138 -0
  423. package/skills/engineering/integration/refs/graphql-error-handling.md +198 -0
  424. package/skills/engineering/integration/refs/graphql-graphql-basics.md +197 -0
  425. package/skills/engineering/integration/refs/graphql-query-examples.md +226 -0
  426. package/skills/engineering/integration/refs/graphql-schema-design-patterns.md +280 -0
  427. package/skills/engineering/integration/refs/grpc-grpc-overview.md +246 -0
  428. package/skills/engineering/integration/refs/grpc-implementation-examples.md +269 -0
  429. package/skills/engineering/integration/refs/grpc-metadata-headers.md +304 -0
  430. package/skills/engineering/integration/refs/grpc-testing.md +49 -0
  431. package/skills/engineering/integration/refs/openapi-template.yaml +682 -0
  432. package/skills/engineering/integration/refs/resilience-best-practices.md +109 -0
  433. package/skills/engineering/integration/refs/resilience-circuit-breaker-pattern.md +302 -0
  434. package/skills/engineering/integration/refs/resilience-rate-limiting.md +245 -0
  435. package/skills/engineering/integration/refs/resilience-timeout-pattern.md +212 -0
  436. package/skills/engineering/integration/refs/rest-api-fundamentals.md +299 -0
  437. package/skills/engineering/integration/refs/rest-api-responses-security.md +302 -0
  438. package/skills/engineering/integration/refs/versioning-breaking-changes.md +237 -0
  439. package/skills/engineering/integration/refs/versioning-migration-strategies.md +257 -0
  440. package/skills/engineering/integration/refs/versioning-versioning-strategies.md +296 -0
  441. package/skills/engineering/large-scale-migration/SKILL.md +65 -0
  442. package/skills/engineering/patch/SKILL.md +184 -0
  443. package/skills/engineering/refs/arch.md +126 -0
  444. package/skills/engineering/refs/debug.md +142 -0
  445. package/skills/engineering/refs/docs.md +190 -0
  446. package/skills/engineering/refs/plan.md +109 -0
  447. package/skills/engineering/refs/review.md +138 -0
  448. package/skills/engineering/system-design/SKILL.md +154 -0
  449. package/skills/engineering/system-design/refs/anti-patterns-big-ball-of-mud.md +254 -0
  450. package/skills/engineering/system-design/refs/anti-patterns-circular-dependencies.md +241 -0
  451. package/skills/engineering/system-design/refs/anti-patterns-feature-envy.md +168 -0
  452. package/skills/engineering/system-design/refs/anti-patterns-god-object.md +247 -0
  453. package/skills/engineering/system-design/refs/component-template-lifecycle.md +210 -0
  454. package/skills/engineering/system-design/refs/component-template-maintenance.md +219 -0
  455. package/skills/engineering/system-design/refs/component-template-structure.md +276 -0
  456. package/skills/engineering/system-design/refs/dependencies-best-practices.md +260 -0
  457. package/skills/engineering/system-design/refs/dependencies-dependency-principles.md +295 -0
  458. package/skills/engineering/system-design/refs/dependencies-dependency-tracking.md +261 -0
  459. package/skills/engineering/system-design/refs/interface-template-lifecycle.md +211 -0
  460. package/skills/engineering/system-design/refs/interface-template-maintenance.md +212 -0
  461. package/skills/engineering/system-design/refs/interface-template-structure.md +269 -0
  462. package/skills/engineering/system-design/refs/patterns-dependency-injection.md +151 -0
  463. package/skills/engineering/system-design/refs/patterns-facade-pattern.md +257 -0
  464. package/skills/engineering/system-design/refs/patterns-layered-pattern.md +204 -0
  465. package/skills/engineering/system-design/refs/patterns-plugin-architecture.md +229 -0
  466. package/skills/engineering/unit-test-quality/SKILL.md +194 -0
  467. package/skills/ground/SKILL.md +130 -0
  468. package/skills/integration-discovery/SKILL.md +168 -0
  469. package/skills/integration-discovery/refs/capabilities.md +282 -0
  470. package/skills/integration-discovery/refs/cli-detection.md +295 -0
  471. package/skills/integration-discovery/refs/discovery-sources.md +233 -0
  472. package/skills/integration-discovery/refs/task-patterns.md +206 -0
  473. package/skills/jam/SKILL.md +45 -0
  474. package/skills/jam/refs/facilitation-patterns.md +125 -0
  475. package/skills/jam/refs/quick.md +64 -0
  476. package/skills/jam/refs/synthesis-patterns.md +114 -0
  477. package/skills/multi-model/SKILL.md +168 -0
  478. package/skills/multi-model/refs/aichat.md +119 -0
  479. package/skills/multi-model/refs/aider.md +100 -0
  480. package/skills/multi-model/refs/auditability.md +238 -0
  481. package/skills/multi-model/refs/codex.md +169 -0
  482. package/skills/multi-model/refs/context.md +306 -0
  483. package/skills/multi-model/refs/copilot.md +161 -0
  484. package/skills/multi-model/refs/examples.md +224 -0
  485. package/skills/multi-model/refs/gemini.md +185 -0
  486. package/skills/multi-model/refs/goose.md +112 -0
  487. package/skills/multi-model/refs/llm.md +124 -0
  488. package/skills/multi-model/refs/opencode.md +196 -0
  489. package/skills/multi-model/refs/orchestration.md +188 -0
  490. package/skills/multi-model/refs/pi.md +208 -0
  491. package/skills/persona/SKILL.md +144 -0
  492. package/skills/persona/refs/define.md +133 -0
  493. package/skills/platform/actions/refs/actions.md +114 -0
  494. package/skills/platform/audit/SKILL.md +174 -0
  495. package/skills/platform/audit/refs/audit.md +145 -0
  496. package/skills/platform/audit/refs/checklists-evidence-operations.md +144 -0
  497. package/skills/platform/audit/refs/checklists-gdpr-pci-evidence.md +213 -0
  498. package/skills/platform/audit/refs/checklists-soc2-hipaa.md +120 -0
  499. package/skills/platform/audit/refs/frameworks-gdpr-pci.md +225 -0
  500. package/skills/platform/audit/refs/frameworks-soc2-hipaa.md +228 -0
  501. package/skills/platform/compliance/SKILL.md +169 -0
  502. package/skills/platform/compliance/refs/checklists.md +303 -0
  503. package/skills/platform/compliance/refs/compliance.md +117 -0
  504. package/skills/platform/compliance/refs/frameworks.md +282 -0
  505. package/skills/platform/errors/SKILL.md +183 -0
  506. package/skills/platform/errors/refs/patterns.md +271 -0
  507. package/skills/platform/errors/refs/severity.md +264 -0
  508. package/skills/platform/gate-benchmark-rebaseline/SKILL.md +108 -0
  509. package/skills/platform/gh/refs/gh.md +105 -0
  510. package/skills/platform/gh-cli/SKILL.md +120 -0
  511. package/skills/platform/gh-cli/refs/automation.md +63 -0
  512. package/skills/platform/gh-cli/refs/gh-ops.md +103 -0
  513. package/skills/platform/gh-cli/refs/patterns.md +132 -0
  514. package/skills/platform/gh-cli/scripts/gh_ops.py +454 -0
  515. package/skills/platform/github-actions/SKILL.md +159 -0
  516. package/skills/platform/github-actions/refs/security.md +150 -0
  517. package/skills/platform/github-actions/refs/templates.md +230 -0
  518. package/skills/platform/github-actions/refs/troubleshooting.md +174 -0
  519. package/skills/platform/github-actions/scripts/workflow_gen.py +215 -0
  520. package/skills/platform/gitlab-ci/SKILL.md +140 -0
  521. package/skills/platform/gitlab-ci/refs/templates.md +223 -0
  522. package/skills/platform/gitlab-ci/refs/troubleshooting.md +213 -0
  523. package/skills/platform/glab-cli/SKILL.md +133 -0
  524. package/skills/platform/glab-cli/refs/ci-debugging.md +95 -0
  525. package/skills/platform/glab-cli/refs/glab-ops.md +78 -0
  526. package/skills/platform/glab-cli/refs/patterns.md +131 -0
  527. package/skills/platform/glab-cli/scripts/glab_ops.py +313 -0
  528. package/skills/platform/health/SKILL.md +177 -0
  529. package/skills/platform/health/refs/health.md +72 -0
  530. package/skills/platform/health/refs/sources.md +302 -0
  531. package/skills/platform/incident/refs/incident.md +136 -0
  532. package/skills/platform/infra/refs/infra.md +104 -0
  533. package/skills/platform/observability/SKILL.md +128 -0
  534. package/skills/platform/observability/refs/toolchain-discovery.md +243 -0
  535. package/skills/platform/prereq-doctor/SKILL.md +57 -0
  536. package/skills/platform/prereq-doctor/refs/tool-registry.md +58 -0
  537. package/skills/platform/traces/refs/traces.md +101 -0
  538. package/skills/product/acceptance-criteria/SKILL.md +193 -0
  539. package/skills/product/acceptance-criteria/refs/ac-anti-patterns.md +291 -0
  540. package/skills/product/acceptance-criteria/refs/ac-examples.md +277 -0
  541. package/skills/product/accessibility/SKILL.md +197 -0
  542. package/skills/product/accessibility/refs/aria-patterns-basics.md +250 -0
  543. package/skills/product/accessibility/refs/aria-patterns-dynamic.md +187 -0
  544. package/skills/product/accessibility/refs/aria-patterns-interactive.md +246 -0
  545. package/skills/product/accessibility/refs/audit-report-findings.md +248 -0
  546. package/skills/product/accessibility/refs/audit-report-results.md +276 -0
  547. package/skills/product/accessibility/refs/common-violations-html-css.md +270 -0
  548. package/skills/product/accessibility/refs/common-violations-interactive.md +303 -0
  549. package/skills/product/accessibility/refs/keyboard-testing-basics.md +222 -0
  550. package/skills/product/accessibility/refs/keyboard-testing-patterns.md +173 -0
  551. package/skills/product/accessibility/refs/screen-reader-testing-advanced.md +294 -0
  552. package/skills/product/accessibility/refs/screen-reader-testing-commands.md +255 -0
  553. package/skills/product/accessibility/refs/wcag-checklist.md +262 -0
  554. package/skills/product/analyze/SKILL.md +164 -0
  555. package/skills/product/analyze/refs/algorithms.md +238 -0
  556. package/skills/product/analyze/refs/sentiment-patterns.md +180 -0
  557. package/skills/product/imagery/SKILL.md +97 -0
  558. package/skills/product/imagery/alter/SKILL.md +105 -0
  559. package/skills/product/imagery/alter/refs/editing-reference.md +146 -0
  560. package/skills/product/imagery/create/SKILL.md +109 -0
  561. package/skills/product/imagery/create/refs/prompt-engineering.md +112 -0
  562. package/skills/product/imagery/create/refs/provider-reference.md +219 -0
  563. package/skills/product/imagery/review/SKILL.md +101 -0
  564. package/skills/product/imagery/review/refs/analysis-lenses.md +136 -0
  565. package/skills/product/imagery/review/refs/quality-gates.md +153 -0
  566. package/skills/product/imagery/scripts/analyze.sh +23 -0
  567. package/skills/product/imagery/scripts/edit.sh +14 -0
  568. package/skills/product/imagery/scripts/generate.sh +13 -0
  569. package/skills/product/imagery/scripts/provider.py +787 -0
  570. package/skills/product/listen/SKILL.md +175 -0
  571. package/skills/product/listen/refs/channels.md +220 -0
  572. package/skills/product/mockup/SKILL.md +106 -0
  573. package/skills/product/mockup/refs/templates.md +95 -0
  574. package/skills/product/refs/a11y.md +109 -0
  575. package/skills/product/refs/acceptance.md +79 -0
  576. package/skills/product/refs/align.md +67 -0
  577. package/skills/product/refs/analyze.md +77 -0
  578. package/skills/product/refs/elicit.md +67 -0
  579. package/skills/product/refs/listen.md +58 -0
  580. package/skills/product/refs/mockup.md +77 -0
  581. package/skills/product/refs/screenshot.md +59 -0
  582. package/skills/product/refs/strategy.md +77 -0
  583. package/skills/product/refs/synthesize.md +54 -0
  584. package/skills/product/refs/ux-review.md +68 -0
  585. package/skills/product/refs/ux.md +101 -0
  586. package/skills/product/requirements-analysis/SKILL.md +136 -0
  587. package/skills/product/requirements-analysis/refs/requirements-example-auth.md +264 -0
  588. package/skills/product/requirements-analysis/refs/requirements-example-export-integration.md +88 -0
  589. package/skills/product/requirements-analysis/refs/requirements-output-format-template.md +247 -0
  590. package/skills/product/requirements-analysis/refs/user-story-guide.md +296 -0
  591. package/skills/product/requirements-graph/SKILL.md +155 -0
  592. package/skills/product/requirements-graph/refs/examples.md +223 -0
  593. package/skills/product/requirements-graph/refs/schema.md +162 -0
  594. package/skills/product/requirements-migrate/SKILL.md +90 -0
  595. package/skills/product/requirements-navigate/SKILL.md +141 -0
  596. package/skills/product/requirements-navigate/refs/meta-templates.md +141 -0
  597. package/skills/product/screenshot/SKILL.md +147 -0
  598. package/skills/product/strategy/SKILL.md +198 -0
  599. package/skills/product/strategy/refs/frameworks.md +295 -0
  600. package/skills/product/strategy/refs/templates-competitive-market.md +299 -0
  601. package/skills/product/strategy/refs/templates-roi-value.md +207 -0
  602. package/skills/product/synthesize/SKILL.md +116 -0
  603. package/skills/product/synthesize/refs/journey-mapping.md +212 -0
  604. package/skills/product/synthesize/refs/prioritization.md +193 -0
  605. package/skills/product/ux-review/SKILL.md +164 -0
  606. package/skills/product/visual-direction/SKILL.md +137 -0
  607. package/skills/product/visual-review/SKILL.md +131 -0
  608. package/skills/runtime-exec/SKILL.md +138 -0
  609. package/skills/search/codebase-narrator/SKILL.md +131 -0
  610. package/skills/search/codebase-narrator/refs/output-template.md +100 -0
  611. package/skills/smaht/SKILL.md +72 -0
  612. package/skills/smaht/discovery/SKILL.md +65 -0
  613. package/skills/smaht/intent/SKILL.md +89 -0
  614. package/skills/smaht/propose-skills/SKILL.md +142 -0
  615. package/skills/smaht/refs/state.md +76 -0
  616. package/skills/swarm/SKILL.md +132 -0
  617. package/skills/swarm/refs/fan-out.md +104 -0
  618. package/skills/swarm/refs/independent-verification.md +86 -0
  619. package/skills/swarm/refs/receipts-and-evidence.md +69 -0
  620. package/skills/swarm/refs/recon-synthesis.md +87 -0
  621. package/skills/swarm/refs/ship-discipline.md +90 -0
  622. package/skills/wickedizer/SKILL.md +147 -0
  623. package/skills/wickedizer/refs/artifact-types.md +238 -0
  624. package/skills/wickedizer/refs/complexity.md +278 -0
  625. package/skills/wickedizer/refs/de-ai-pass.md +140 -0
  626. package/skills/wickedizer/refs/failure-modes.md +249 -0
  627. package/skills/wickedizer/refs/patterns.md +282 -0
  628. package/skills/wickedizer/refs/review.md +221 -0
  629. package/skills/wickedizer/refs/structure.md +282 -0
  630. package/skills/wickedizer/refs/voice-profile.md +125 -0
  631. package/skills/workflow/SKILL.md +132 -0
  632. package/skills/workflow/refs/archetype-adjustments.md +205 -0
  633. package/skills/workflow/refs/evidence.md +58 -0
  634. package/skills/workflow/refs/integration.md +130 -0
  635. package/skills/workflow/refs/risk-dimension-signals.md +260 -0
  636. package/skills/workflow/refs/scoring-rubric.md +49 -0
  637. package/skills/workflow/refs/signal-keywords.md +176 -0
  638. package/skills/workflow/refs/specialist-routing-rules.md +159 -0
  639. package/skills/worktrees/SKILL.md +87 -0
  640. package/skills/worktrees/refs/recipes.md +96 -0
@@ -0,0 +1,382 @@
1
+ #!/usr/bin/env python3
2
+ """vault_gate.py — the garden's produces-gate, backed by wicked-vault.
3
+
4
+ This is the load-bearing replacement for ``evidence_tracker``'s
5
+ *satisfied-when-claimed* model. The tracker records what an archetype
6
+ *claims* to have produced and never re-derives it; that lets a build's
7
+ review gate pass on a self-asserted "tests pass". ``wicked-vault``
8
+ instead re-derives — it recomputes the envelope hash and re-runs the
9
+ pure verifier every time, never trusting a cached status — and answers
10
+ ``cross-check`` with a mechanical PASS / REJECT / ERROR.
11
+
12
+ So the gate becomes: *is the claim actually backed by evidence that
13
+ clears its declared contract?* — not *did someone say it was done?*
14
+
15
+ **Required peer, fail-closed by default.** wicked-vault is a required
16
+ sibling (like wicked-bus / wicked-brain / wicked-testing). When it is
17
+ genuinely unresolvable, ``gate_satisfied`` (``require=True`` default)
18
+ **fails closed** — it never self-asserts a PASS. ``require=False`` is an
19
+ explicit opt-out to the doctrine-light ``evidence_tracker`` claim-only
20
+ path for throwaway/low-rigor work.
21
+
22
+ **Loom is authoritative (contract phase).** The re-derivation engine is
23
+ now ``wicked-loom``: ``cross_check`` shells ``loom gate`` and ``resolve_vault``
24
+ (default ``allow_npx=True``) shells ``loom resolve vault``. The in-process
25
+ vault re-derivation + npx resolution ladder were removed once loom became
26
+ load-bearing. Resolution splits into two paths (see ``resolve_vault``):
27
+ - ``allow_npx=True`` — loom authoritative; loom-unresolvable/disabled/
28
+ erroring → None (no in-process fallback; the gate then fails closed).
29
+ - ``allow_npx=False`` — the ``vault_available`` concrete-install probe:
30
+ an in-process ladder (``WICKED_VAULT_BIN`` env, with set-but-empty as
31
+ the kill-switch → config → PATH → ``node_modules/.bin``; **no npx, no
32
+ loom** — npx/loom would report the last-resort as resolvable and corrupt
33
+ the "is a concrete vault installed?" signal). Unchanged from pre-contract.
34
+
35
+ Stdlib-only. Cross-platform (argv lists, ``shutil.which``, no shell).
36
+ """
37
+
38
+ from __future__ import annotations
39
+
40
+ import json
41
+ import os
42
+ import shutil
43
+ import sys
44
+ from pathlib import Path
45
+ from typing import Any, Dict, List, Optional
46
+
47
+ _CONFIG_PATH = Path.home() / ".something-wicked" / "wicked-garden" / "config.json"
48
+ _DEFAULT_TIMEOUT = 120
49
+
50
+ # wicked-loom is the authoritative runtime for the resolve + gate surfaces
51
+ # (contract phase: the in-process re-derivation + npx ladder were removed).
52
+ # When the loom shim is absent the shimmed surfaces are unavailable and the
53
+ # gate fails closed — there is no in-process fallback.
54
+ # ``_loom`` is a sibling module in scripts/. When this runs as a CLI
55
+ # (`python3 scripts/qe/vault_gate.py …`, incl. via _python.sh) only scripts/qe
56
+ # is on sys.path, so add scripts/ — otherwise the import fails, the loom shim
57
+ # is None, and EVERY gate silently fails closed ("unavailable") even with loom
58
+ # + vault installed. Module-level imports (hooks, conftest) already have
59
+ # scripts/ on the path; this makes the CLI path behave the same. phase_manager
60
+ # does the same insert. (Regression introduced by the loom cutover, #891.)
61
+ sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
62
+ try:
63
+ import _loom
64
+ except ImportError: # pragma: no cover — loom shim absent => surfaces unavailable
65
+ _loom = None # type: ignore
66
+
67
+
68
+ # ---------------------------------------------------------------------------
69
+ # Resolution
70
+ # ---------------------------------------------------------------------------
71
+
72
+ def _argv_for(target: str) -> List[str]:
73
+ """Turn a resolved vault location into an argv prefix.
74
+
75
+ A ``.mjs``/``.js`` file is a script → invoke via ``node``. Anything
76
+ else (an executable name or a shim) is run directly.
77
+ """
78
+ if target.endswith((".mjs", ".js")):
79
+ return ["node", target]
80
+ return [target]
81
+
82
+
83
+ def resolve_vault(*, allow_npx: bool = True,
84
+ project_dir: Optional[Path] = None) -> Optional[List[str]]:
85
+ """Return the argv prefix that invokes wicked-vault, or None.
86
+
87
+ Two distinct callers, two paths (contract phase):
88
+
89
+ - ``allow_npx=True`` (default; the run-the-vault path): **loom is
90
+ authoritative.** Garden asks ``wicked-loom resolve vault`` and returns
91
+ its ``command`` array (None when loom reports the vault unresolvable /
92
+ kill-switched). loom unresolvable, disabled (``WICKED_LOOM_CUTOVER=off``),
93
+ or erroring → None. There is no in-process npx ladder here anymore (the
94
+ contract removed it); a missing loom means a missing resolver, and the
95
+ gate downstream fails closed (I2).
96
+
97
+ - ``allow_npx=False`` (the ``vault_available`` concrete-install probe):
98
+ the in-process ladder (``WICKED_VAULT_BIN`` env → config → PATH →
99
+ ``node_modules/.bin``; **no npx, no loom**). loom is deliberately NOT
100
+ consulted: it would report the npx last-resort as resolvable and corrupt
101
+ the "is a concrete vault actually installed?" signal. This path is
102
+ unchanged from before the contract. ``WICKED_VAULT_BIN=""`` (set-but-
103
+ empty) is the deliberate kill-switch → None.
104
+ """
105
+ if allow_npx:
106
+ # Run-the-vault path: loom authoritative, no in-process fallback.
107
+ if _loom is None or not _loom.use_loom(project_dir=project_dir):
108
+ return None # loom disabled / unresolvable -> no resolver
109
+ out = _loom.run_json(["resolve", "vault"], project_dir=project_dir)
110
+ if out["error"] is not None or not isinstance(out.get("json"), dict):
111
+ return None # loom errored -> fail-closed (no in-process fallback)
112
+ return out["json"].get("command") # list[str] or None
113
+
114
+ # Concrete-install probe (allow_npx=False): in-process ladder, no loom/npx.
115
+ if "WICKED_VAULT_BIN" in os.environ:
116
+ env = os.environ["WICKED_VAULT_BIN"].strip()
117
+ return _argv_for(env) if env else None # empty == kill-switch
118
+
119
+ pref = _read_config_preference("wicked-vault")
120
+ if pref:
121
+ return _argv_for(pref)
122
+
123
+ found = shutil.which("wicked-vault")
124
+ if found:
125
+ return [found]
126
+
127
+ base = Path(project_dir) if project_dir else Path.cwd()
128
+ local = base / "node_modules" / ".bin" / "wicked-vault"
129
+ if local.exists():
130
+ return [str(local)]
131
+
132
+ return None
133
+
134
+
135
+ def vault_available(project_dir: Optional[Path] = None) -> bool:
136
+ """True iff a **concrete** vault install is resolvable (env, config,
137
+ PATH, or node_modules) — not the npx last-resort. This is the signal
138
+ setup and the SessionStart bootstrap use to decide whether the
139
+ required peer is actually installed."""
140
+ return resolve_vault(allow_npx=False, project_dir=project_dir) is not None
141
+
142
+
143
+ def _read_config_preference(key: str) -> Optional[str]:
144
+ """Read ``tool_preferences.{key}`` from config.json; None on any error."""
145
+ try:
146
+ if not _CONFIG_PATH.exists():
147
+ return None
148
+ data = json.loads(_CONFIG_PATH.read_text(encoding="utf-8"))
149
+ prefs = data.get("tool_preferences")
150
+ if isinstance(prefs, dict):
151
+ value = prefs.get(key)
152
+ if isinstance(value, str) and value.strip():
153
+ return value.strip()
154
+ return None
155
+ except (json.JSONDecodeError, OSError):
156
+ return None
157
+
158
+
159
+ # ---------------------------------------------------------------------------
160
+ # Invocation
161
+ # ---------------------------------------------------------------------------
162
+
163
+ def cross_check(
164
+ scope: str,
165
+ phase: str,
166
+ *,
167
+ project_dir: Optional[Path] = None,
168
+ with_attestations: bool = False,
169
+ timeout: int = _DEFAULT_TIMEOUT,
170
+ ) -> Dict[str, Any]:
171
+ """Run the produces re-derivation via ``wicked-loom gate`` and return its
172
+ mechanical verdict.
173
+
174
+ loom is the **sole** re-derivation engine (the in-process vault path was
175
+ removed in the contract phase). loom re-hashes the recorded evidence and
176
+ re-runs the verifier, mapping the result onto ``{available, overall,
177
+ claims, mode, contract_version, detail, raw}``.
178
+
179
+ **Fail-closed (I2).** When loom is unresolvable, disabled
180
+ (``WICKED_LOOM_CUTOVER=off``), errors, returns non-JSON, or reports the
181
+ vault unavailable behind it, ``available`` is False and ``overall`` is
182
+ ERROR — we never invent a PASS. There is no in-process fallback; a missing
183
+ loom is a missing gate, and a missing gate fails closed.
184
+ """
185
+ if _loom is None or not _loom.use_loom(project_dir=project_dir):
186
+ # loom shim absent, or WICKED_LOOM_CUTOVER=off / auto-unresolvable.
187
+ # No in-process re-derivation remains -> the gate is unavailable.
188
+ return {"available": False, "overall": "ERROR",
189
+ "error": "wicked-loom not in use (disabled or unresolvable)",
190
+ "exit_code": None}
191
+
192
+ loom_args = ["gate", phase, "--scope", scope]
193
+ if with_attestations:
194
+ loom_args.append("--with-attestations")
195
+ out = _loom.run_json(loom_args, project_dir=project_dir, timeout=timeout)
196
+ if out["error"] is not None or not isinstance(out.get("json"), dict):
197
+ # loom unresolvable / timed out / non-JSON -> fail closed (I2).
198
+ return {"available": False, "overall": "ERROR",
199
+ "error": out.get("error") or "loom returned no usable verdict",
200
+ "exit_code": out.get("exit_code")}
201
+
202
+ verdict = out["json"].get("gate") or {}
203
+ if verdict.get("gate") == "unavailable":
204
+ # loom reached but the vault is unresolvable behind it -> fail closed.
205
+ return {"available": False, "overall": "ERROR",
206
+ "error": verdict.get("error", "vault unavailable via loom"),
207
+ "exit_code": out.get("exit_code")}
208
+ return {
209
+ "available": True,
210
+ "overall": verdict.get("overall", "ERROR"),
211
+ "exit_code": out.get("exit_code"),
212
+ "claims": verdict.get("claims", []),
213
+ "mode": verdict.get("mode"),
214
+ "contract_version": verdict.get("contract_version"),
215
+ "detail": verdict.get("detail"),
216
+ "raw": verdict,
217
+ }
218
+
219
+
220
+ # ---------------------------------------------------------------------------
221
+ # The gate
222
+ # ---------------------------------------------------------------------------
223
+
224
+ def _sentinel_stamp(project_dir: Path, result: Dict[str, Any],
225
+ scope: str, phase: str) -> None:
226
+ """Stamp this verdict into the claim-sentinel ledger (fail-open).
227
+
228
+ gate_satisfied is the single front door for re-derivation, so stamping here
229
+ means every prove/gate run — from any command, any cwd — leaves the record
230
+ the sentinel's claim-time invariants (ref-watch, TaskCompleted) check against."""
231
+ try:
232
+ from pathlib import Path as _P
233
+ import sys as _sys
234
+ sentinel_dir = _P(__file__).resolve().parents[1] / "sentinel"
235
+ if str(sentinel_dir) not in _sys.path:
236
+ _sys.path.insert(0, str(sentinel_dir))
237
+ from invariants import stamp_verdict # type: ignore
238
+ stamp_verdict(_P(project_dir),
239
+ overall=str(result.get("overall", "ERROR")),
240
+ satisfied=bool(result.get("satisfied")),
241
+ re_derived=bool(result.get("re_derived")),
242
+ scope=scope, phase=phase)
243
+ except Exception: # noqa: BLE001 — the sentinel must never break the gate
244
+ return
245
+
246
+
247
+ def gate_satisfied(
248
+ project_dir: Path,
249
+ scope: str,
250
+ phase: str,
251
+ *,
252
+ with_attestations: bool = False,
253
+ require: bool = True,
254
+ ) -> Dict[str, Any]:
255
+ """The produces-gate. The vault is a **required** evidence backend
256
+ (installed by ``/wicked-garden:setup``), so the default is to re-derive
257
+ or **fail closed** — never to self-assert a PASS.
258
+
259
+ Returns ``{satisfied, re_derived, gate, ...}``. ``re_derived`` is the
260
+ honesty flag: True means the verdict was recomputed from frozen
261
+ evidence; False means either a fail-closed "unavailable" verdict or the
262
+ explicitly opted-out claim-only path.
263
+
264
+ - vault resolvable → run cross-check, ``re_derived: true``.
265
+ - vault unresolvable, ``require=True`` (default) → fail closed:
266
+ ``satisfied: false``, ``gate: "unavailable"`` with remediation.
267
+ - vault unresolvable, ``require=False`` → legacy claim-only path
268
+ (opt-out for throwaway/low-rigor work; treat "done" with suspicion).
269
+ """
270
+ if resolve_vault(project_dir=Path(project_dir)) is not None:
271
+ cc = cross_check(scope, phase, project_dir=Path(project_dir),
272
+ with_attestations=with_attestations)
273
+ if cc.get("available"):
274
+ result = {
275
+ "satisfied": cc.get("overall") == "PASS",
276
+ "re_derived": True,
277
+ "gate": "vault-cross-check",
278
+ "overall": cc.get("overall"),
279
+ "claims": cc.get("claims", []),
280
+ "contract_version": cc.get("contract_version"),
281
+ "detail": cc.get("detail"),
282
+ "error": cc.get("error"),
283
+ }
284
+ _sentinel_stamp(Path(project_dir), result, scope, phase)
285
+ return result
286
+ # Resolver pointed at a vault but it could not be run (offline npx,
287
+ # missing executable). Fail closed — do not invent a PASS.
288
+ if require:
289
+ return {
290
+ "satisfied": False, "re_derived": False, "gate": "unavailable",
291
+ "error": cc.get("error", "vault resolvable but not runnable"),
292
+ "reason": "wicked-vault could not be executed; gate fails closed.",
293
+ }
294
+
295
+ if require:
296
+ return {
297
+ "satisfied": False,
298
+ "re_derived": False,
299
+ "gate": "unavailable",
300
+ "reason": (
301
+ "wicked-vault is a required evidence backend but is not "
302
+ "resolvable. Install it (`npm i -g wicked-vault` or "
303
+ "`npx wicked-vault-install`) and re-run /wicked-garden:setup. "
304
+ "Gate fails closed — 'done' cannot be self-asserted."
305
+ ),
306
+ }
307
+
308
+ # Explicit opt-out (require=False): the doctrine-light tracker.
309
+ _here = str(Path(__file__).resolve().parent)
310
+ if _here not in sys.path:
311
+ sys.path.insert(0, _here)
312
+ import evidence_tracker as et # noqa: E402
313
+
314
+ return {
315
+ "satisfied": et.produces_satisfied(Path(project_dir)),
316
+ "re_derived": False,
317
+ "gate": "claim-only",
318
+ "reason": (
319
+ "vault opt-out (require=False) — gate is doctrine-light "
320
+ "(satisfied-when-claimed, not re-derived)."
321
+ ),
322
+ }
323
+
324
+
325
+ __all__ = ["resolve_vault", "vault_available", "cross_check", "gate_satisfied"]
326
+
327
+
328
+ # ---------------------------------------------------------------------------
329
+ # CLI — so markdown playbooks can call the gate from Bash.
330
+ # exit 0 == satisfied (gate / cross-check both gate on exit code)
331
+ # ---------------------------------------------------------------------------
332
+
333
+ if __name__ == "__main__":
334
+ import argparse
335
+
336
+ parser = argparse.ArgumentParser(description="wicked-vault-backed produces gate.")
337
+ sub = parser.add_subparsers(dest="action", required=True)
338
+
339
+ res = sub.add_parser("resolve", help="show how the vault CLI resolves")
340
+
341
+ cc = sub.add_parser("cross-check", help="run vault cross-check for a phase")
342
+ cc.add_argument("project_dir")
343
+ cc.add_argument("--scope", required=True)
344
+ cc.add_argument("--phase", required=True)
345
+ cc.add_argument("--with-attestations", action="store_true")
346
+
347
+ g = sub.add_parser("gate", help="gate verdict (vault required; fail-closed)")
348
+ g.add_argument("project_dir")
349
+ g.add_argument("--scope", required=True)
350
+ g.add_argument("--phase", required=True)
351
+ g.add_argument("--with-attestations", action="store_true")
352
+ g.add_argument("--no-require", action="store_true",
353
+ help="opt out of the requirement (low-rigor claim-only fallback)")
354
+
355
+ a = parser.parse_args()
356
+
357
+ if a.action == "resolve":
358
+ prefix = resolve_vault()
359
+ print(json.dumps({
360
+ "resolvable": prefix is not None,
361
+ "installed": vault_available(), # concrete install (not npx)
362
+ "argv_prefix": prefix,
363
+ # Honesty signal: did the loom shim import succeed? If False, the
364
+ # gate fails closed regardless of whether loom/vault are installed
365
+ # (the CLI sys.path bug). Lets callers/tests distinguish "loom shim
366
+ # broken" from "vault genuinely absent".
367
+ "loom_shim_loaded": _loom is not None,
368
+ }))
369
+ sys.exit(0)
370
+
371
+ if a.action == "cross-check":
372
+ out = cross_check(a.scope, a.phase, project_dir=Path(a.project_dir),
373
+ with_attestations=a.with_attestations)
374
+ print(json.dumps(out, indent=2))
375
+ sys.exit(0 if out.get("overall") == "PASS" else 1)
376
+
377
+ if a.action == "gate":
378
+ out = gate_satisfied(Path(a.project_dir), a.scope, a.phase,
379
+ with_attestations=a.with_attestations,
380
+ require=not a.no_require)
381
+ print(json.dumps(out, indent=2))
382
+ sys.exit(0 if out.get("satisfied") else 1)
@@ -0,0 +1,175 @@
1
+ #!/usr/bin/env python3
2
+ """verdict_audit.py — Append-only audit log of review-archetype verdicts.
3
+
4
+ Every verdict the ``review`` archetype emits gets a one-line JSONL
5
+ record in ``{project_dir}/audit/verdicts.jsonl``. The log is the
6
+ forensic record of who said what, when. No HMAC, no orphan detection
7
+ — this is steering-not-blocking territory. The log is for *replay*,
8
+ not for refusing advancement.
9
+
10
+ Restored in v11 from the deleted v6 ``gate_ingest_audit.py`` +
11
+ ``dispatch_log.py``, slimmed (~600 LOC → ~140 LOC). HMAC signing was
12
+ the v6 dispatch-log's defense against rogue reviewer self-authorisation
13
+ in the universal pipeline. v11's review archetype has its own banned-
14
+ reviewer enforcement at the validation layer (verdict_schema.py); the
15
+ audit log just records what happened.
16
+
17
+ Stdlib-only.
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ import json
23
+ import os
24
+ from datetime import datetime, timezone
25
+ from pathlib import Path
26
+ from typing import Any, Dict, Optional
27
+
28
+
29
+ # ---------------------------------------------------------------------------
30
+ # Append-only log writer
31
+ # ---------------------------------------------------------------------------
32
+
33
+ def _utc_now() -> str:
34
+ return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.%fZ")
35
+
36
+
37
+ def _audit_log_path(project_dir: Path) -> Path:
38
+ """{project_dir}/audit/verdicts.jsonl"""
39
+ return Path(project_dir) / "audit" / "verdicts.jsonl"
40
+
41
+
42
+ def append_verdict(
43
+ project_dir: Path,
44
+ *,
45
+ verdict: Dict[str, Any],
46
+ archetype: Optional[str] = None,
47
+ phase: Optional[str] = None,
48
+ source_path: Optional[str] = None,
49
+ ) -> Path:
50
+ """Append a verdict record to the audit log.
51
+
52
+ The record carries:
53
+ - recorded_at (ISO-8601 UTC, when the audit was written)
54
+ - archetype (e.g. 'review', 'build', 'migrate')
55
+ - phase (the archetype phase that produced the verdict)
56
+ - source_path (path to the verdict.json this audits, if any)
57
+ - verdict_field, reviewer, score (canonical fields from the verdict)
58
+ - raw (the entire verdict dict, for replay fidelity)
59
+
60
+ Returns the path to the audit log file.
61
+ Fail-open: on any I/O error, prints to stderr and returns the path
62
+ that was *attempted* but does not raise.
63
+ """
64
+ project_dir = Path(project_dir)
65
+ log_path = _audit_log_path(project_dir)
66
+ log_path.parent.mkdir(parents=True, exist_ok=True)
67
+
68
+ record = {
69
+ "recorded_at": _utc_now(),
70
+ "archetype": archetype,
71
+ "phase": phase,
72
+ "source_path": source_path,
73
+ "verdict": verdict.get("verdict"),
74
+ "reviewer": verdict.get("reviewer"),
75
+ "score": verdict.get("score"),
76
+ "raw": verdict,
77
+ }
78
+
79
+ line = json.dumps(record, sort_keys=True, ensure_ascii=False, default=str)
80
+ try:
81
+ # Atomic append: open in text-append mode with line buffering.
82
+ with log_path.open("a", encoding="utf-8") as fh:
83
+ fh.write(line + "\n")
84
+ except OSError as exc:
85
+ import sys
86
+ print(
87
+ f"[verdict-audit] WARN: append failed for {log_path}: {exc}",
88
+ file=sys.stderr,
89
+ )
90
+ return log_path
91
+
92
+
93
+ # ---------------------------------------------------------------------------
94
+ # Read-side helpers
95
+ # ---------------------------------------------------------------------------
96
+
97
+ def read_verdicts(
98
+ project_dir: Path,
99
+ *,
100
+ archetype: Optional[str] = None,
101
+ phase: Optional[str] = None,
102
+ verdict_filter: Optional[str] = None,
103
+ ) -> list:
104
+ """Load all audit records, optionally filtered by archetype / phase /
105
+ verdict. Returns [] when the log is missing or unreadable."""
106
+ project_dir = Path(project_dir)
107
+ log_path = _audit_log_path(project_dir)
108
+ if not log_path.exists():
109
+ return []
110
+ out = []
111
+ try:
112
+ for line in log_path.read_text(encoding="utf-8").splitlines():
113
+ if not line.strip():
114
+ continue
115
+ try:
116
+ rec = json.loads(line)
117
+ except json.JSONDecodeError:
118
+ continue
119
+ if archetype and rec.get("archetype") != archetype:
120
+ continue
121
+ if phase and rec.get("phase") != phase:
122
+ continue
123
+ if verdict_filter and rec.get("verdict") != verdict_filter:
124
+ continue
125
+ out.append(rec)
126
+ except OSError:
127
+ return out
128
+ return out
129
+
130
+
131
+ __all__ = ["append_verdict", "read_verdicts"]
132
+
133
+
134
+ # ---------------------------------------------------------------------------
135
+ # CLI
136
+ # ---------------------------------------------------------------------------
137
+
138
+ if __name__ == "__main__":
139
+ import argparse, sys
140
+ parser = argparse.ArgumentParser(description="v11 verdict audit log tool.")
141
+ sub = parser.add_subparsers(dest="action", required=True)
142
+
143
+ a = sub.add_parser("append", help="Append a verdict from a JSON file.")
144
+ a.add_argument("project_dir")
145
+ a.add_argument("--verdict-file", required=True)
146
+ a.add_argument("--archetype", default=None)
147
+ a.add_argument("--phase", default=None)
148
+
149
+ r = sub.add_parser("read", help="Read all audit records (JSON output).")
150
+ r.add_argument("project_dir")
151
+ r.add_argument("--archetype", default=None)
152
+ r.add_argument("--phase", default=None)
153
+ r.add_argument("--verdict", default=None)
154
+
155
+ args = parser.parse_args()
156
+
157
+ if args.action == "append":
158
+ with open(args.verdict_file, "r", encoding="utf-8") as fh:
159
+ verdict = json.load(fh)
160
+ path = append_verdict(
161
+ Path(args.project_dir),
162
+ verdict=verdict,
163
+ archetype=args.archetype,
164
+ phase=args.phase,
165
+ source_path=args.verdict_file,
166
+ )
167
+ print(json.dumps({"ok": True, "path": str(path)}))
168
+ elif args.action == "read":
169
+ records = read_verdicts(
170
+ Path(args.project_dir),
171
+ archetype=args.archetype,
172
+ phase=args.phase,
173
+ verdict_filter=args.verdict,
174
+ )
175
+ print(json.dumps(records, indent=2, default=str))