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,234 @@
1
+ #!/usr/bin/env python3
2
+ """Phase-0 falsification harness.
3
+
4
+ For each target repo: detect -> emit -> stage honest+fabricated claim
5
+ fixtures -> run the EMITTED lint -> record a per-repo verdict. Writes
6
+ evidence + a verdict summary. Zero wicked-garden runtime touches the
7
+ target repo: only the emitted stdlib lint runs there.
8
+
9
+ Gate: >= 2/3 real repos PASS, where PASS =
10
+ (a) test_command detected unaided (source=detected, conf>=0.5), AND
11
+ (b) emitted lint passes an honest claim, AND
12
+ (c) emitted lint catches a missing-evidence fabricated claim, AND
13
+ (d) emitted lint catches a failure-evidence fabricated claim.
14
+
15
+ usage: run_probe.py <repo1> [<repo2> ...]
16
+ Stdlib-only.
17
+ """
18
+ from __future__ import annotations
19
+
20
+ import json
21
+ import subprocess
22
+ import sys
23
+ import tempfile
24
+ from pathlib import Path
25
+
26
+ HERE = Path(__file__).resolve().parent
27
+ sys.path.insert(0, str(HERE))
28
+ import detect as detect_mod # noqa: E402
29
+ import emit as emit_mod # noqa: E402
30
+
31
+ EVID = HERE / "evidence"
32
+ EVID.mkdir(exist_ok=True)
33
+
34
+
35
+ def _run(cmd, cwd=None, timeout=120):
36
+ try:
37
+ p = subprocess.run(cmd, cwd=cwd, capture_output=True, text=True,
38
+ timeout=timeout)
39
+ return p.returncode, (p.stdout or "") + (p.stderr or "")
40
+ except subprocess.TimeoutExpired:
41
+ return 124, f"<timeout after {timeout}s>"
42
+ except FileNotFoundError as e:
43
+ return 127, f"<not found: {e}>"
44
+ except Exception as e: # noqa: BLE001
45
+ return 1, f"<error: {e}>"
46
+
47
+
48
+ def _real_pass_evidence(ecosystem: str, repo_root: Path):
49
+ """Produce REAL evidence by running a minimal passing test in the repo's
50
+ runner family. Returns (text, is_real, note). Falls back to a clearly
51
+ labelled synthetic pass when the toolchain/runner is unavailable —
52
+ the lint can't tell provenance; it only reads content."""
53
+ tmp = Path(tempfile.mkdtemp(prefix="wgprobe-"))
54
+ try:
55
+ if ecosystem == "node":
56
+ spec = tmp / "wgprobe.test.mjs"
57
+ spec.write_text(
58
+ "import { test, expect } from 'vitest'\n"
59
+ "test('wgprobe', () => { expect(1+1).toBe(2) })\n"
60
+ )
61
+ rc, out = _run(["npx", "vitest", "run", str(spec)],
62
+ cwd=str(repo_root), timeout=120)
63
+ if rc == 0 and ("pass" in out.lower()):
64
+ return out[-1500:], True, "real vitest run"
65
+ return ("Test Files 1 passed (1)\n Tests 1 passed (1)\n"
66
+ "(synthetic: real vitest run unavailable rc=%s)" % rc), False, \
67
+ f"synthetic; vitest rc={rc}"
68
+ if ecosystem == "python":
69
+ t = tmp / "test_wgprobe.py"
70
+ t.write_text("def test_wgprobe():\n assert 1 + 1 == 2\n")
71
+ rc, out = _run([sys.executable, "-m", "pytest", "-q", str(t)],
72
+ cwd=str(repo_root), timeout=90)
73
+ if rc == 0 and ("passed" in out.lower()):
74
+ return out[-1500:], True, "real pytest run"
75
+ # fall back to a real plain-python assertion run (always available)
76
+ rc2, out2 = _run([sys.executable, "-c",
77
+ "assert 1+1==2; print('1 passed (plain python assert OK)')"],
78
+ timeout=30)
79
+ if rc2 == 0:
80
+ return out2 + f"\n(pytest unavailable rc={rc}; real python assert used)", \
81
+ True, "real python assert (pytest unavailable)"
82
+ return "1 passed\n(synthetic)", False, "synthetic"
83
+ if ecosystem == "go":
84
+ rc, out = _run(["go", "test", "./..."], cwd=str(repo_root), timeout=120)
85
+ if rc == 0:
86
+ return out[-1500:] or "ok\tPASS\n", True, "real go test"
87
+ return "ok PASS\n(synthetic: go rc=%s)" % rc, False, f"synthetic; go rc={rc}"
88
+ if ecosystem == "rust":
89
+ rc, out = _run(["cargo", "test"], cwd=str(repo_root), timeout=180)
90
+ if rc == 0:
91
+ return out[-1500:] or "test result: ok. 1 passed\n", True, "real cargo test"
92
+ return "test result: ok. 1 passed\n(synthetic rc=%s)" % rc, False, f"synthetic; cargo rc={rc}"
93
+ return "1 passed\n(synthetic; unknown ecosystem)", False, "synthetic"
94
+ finally:
95
+ pass # leave tmp; harmless
96
+
97
+
98
+ def probe_repo(repo_path: str) -> dict:
99
+ root = Path(repo_path).resolve()
100
+ name = root.name
101
+ bindings = detect_mod.detect(str(root))
102
+ (EVID / f"{name}.bindings.json").write_text(json.dumps(bindings, indent=2))
103
+
104
+ eco = bindings["test_command"].get("ecosystem")
105
+ tc = bindings["test_command"]
106
+ detected = tc.get("source") == detect_mod.DETECTED and tc.get("value") and tc.get("confidence", 0) >= 0.5
107
+
108
+ # emit the lint into an isolated staging dir (NOT the repo tree)
109
+ stage = EVID / f"{name}.stage"
110
+ if stage.exists():
111
+ for p in stage.rglob("*"):
112
+ if p.is_file():
113
+ p.unlink()
114
+ stage.mkdir(parents=True, exist_ok=True)
115
+ lint_path = emit_mod.emit(bindings, str(stage))
116
+
117
+ # build fixtures: a fake "repo root" = stage, with an evidence sink
118
+ sink = stage / bindings["evidence_sink"]["value"]
119
+ sink.mkdir(parents=True, exist_ok=True)
120
+
121
+ # honest evidence (real where possible)
122
+ ev_text, ev_real, ev_note = _real_pass_evidence(eco, root)
123
+ (sink / "honest-tests.txt").write_text(ev_text)
124
+ # failure evidence for the contradiction case
125
+ (sink / "failing-tests.txt").write_text(
126
+ "FAIL src/foo.test\n 2 failed | 1 passed\nError: expected 2 received 3\nexit code 1\n"
127
+ )
128
+
129
+ honest_doc = stage / "honest.build.md"
130
+ honest_doc.write_text(
131
+ "---\nphase: build\nclaims:\n"
132
+ " - id: c-honest\n evidence: honest-tests\n"
133
+ ' text: "tests pass: 1/1 passing, exit 0"\n'
134
+ "---\n# honest\n"
135
+ )
136
+ fab_missing_doc = stage / "fab-missing.build.md"
137
+ fab_missing_doc.write_text(
138
+ "---\nphase: build\nclaims:\n"
139
+ " - id: c-fab-missing\n evidence: tests-that-were-never-run\n"
140
+ ' text: "all tests pass, build clean, ready to merge"\n'
141
+ "---\n# fabricated: evidence file does not exist\n"
142
+ )
143
+ fab_fail_doc = stage / "fab-fail.build.md"
144
+ fab_fail_doc.write_text(
145
+ "---\nphase: build\nclaims:\n"
146
+ " - id: c-fab-fail\n evidence: failing-tests\n"
147
+ ' text: "tests pass — all green"\n'
148
+ "---\n# fabricated: evidence actually shows failure\n"
149
+ )
150
+
151
+ def run_lint(doc):
152
+ return _run([sys.executable, lint_path, "--repo-root", str(stage),
153
+ "--claims-file", str(doc)], timeout=30)
154
+
155
+ h_rc, h_out = run_lint(honest_doc)
156
+ fm_rc, fm_out = run_lint(fab_missing_doc)
157
+ ff_rc, ff_out = run_lint(fab_fail_doc)
158
+
159
+ (EVID / f"{name}.lint-output.txt").write_text(
160
+ f"$ emitted lint (test_command={tc.get('value')})\n\n"
161
+ f"--- honest (expect exit 0) -> rc={h_rc} ---\n{h_out}\n"
162
+ f"--- fabricated/missing (expect exit 1) -> rc={fm_rc} ---\n{fm_out}\n"
163
+ f"--- fabricated/failure (expect exit 1) -> rc={ff_rc} ---\n{ff_out}\n"
164
+ )
165
+
166
+ lint_ok = (h_rc == 0) and (fm_rc == 1) and (ff_rc == 1)
167
+ verdict = "PASS" if (detected and lint_ok) else ("FAIL" if not detected else "FAIL")
168
+
169
+ return {
170
+ "repo": name,
171
+ "ecosystem": eco,
172
+ "detection": {
173
+ "test_command": tc.get("value"),
174
+ "declared_script": tc.get("declared_script"),
175
+ "source": tc.get("source"),
176
+ "confidence": tc.get("confidence"),
177
+ "ambiguity": tc.get("ambiguity"),
178
+ "hand_correction_needed": not detected,
179
+ },
180
+ "evidence_sink": bindings["evidence_sink"]["value"]
181
+ + f" ({bindings['evidence_sink']['source']})",
182
+ "claims_surface": bindings["claims_surface"]["value"]
183
+ + f" ({bindings['claims_surface']['source']})",
184
+ "lint": {
185
+ "honest_exit": h_rc, "expect": 0,
186
+ "fab_missing_exit": fm_rc, "fab_failure_exit": ff_rc,
187
+ "honest_evidence_real": ev_real, "honest_evidence_note": ev_note,
188
+ "behaviour_ok": lint_ok,
189
+ },
190
+ "verdict": verdict,
191
+ }
192
+
193
+
194
+ def main(argv):
195
+ targets = argv or []
196
+ if not targets:
197
+ print("usage: run_probe.py <repo1> [<repo2> ...]", file=sys.stderr)
198
+ return 2
199
+ results = [probe_repo(t) for t in targets]
200
+ passes = sum(1 for r in results if r["verdict"] == "PASS")
201
+ summary = {
202
+ "targets": len(results),
203
+ "passes": passes,
204
+ "gate": "PASS" if passes >= max(2, (len(results) + 1) // 2) else "FAIL",
205
+ "gate_rule": ">=2/3 real repos detect test_command unaided AND emitted lint catches both fabrication shapes",
206
+ "results": results,
207
+ }
208
+ (EVID / "verdict.json").write_text(json.dumps(summary, indent=2))
209
+
210
+ print("=" * 70)
211
+ print(f"PHASE-0 VERDICT: {summary['gate']} ({passes}/{len(results)} repos PASS)")
212
+ print("=" * 70)
213
+ for r in results:
214
+ d = r["detection"]
215
+ l = r["lint"]
216
+ print(f"\n[{r['verdict']}] {r['repo']} ({r['ecosystem']})")
217
+ print(f" test_command : {d['test_command']} "
218
+ f"[{d['source']} conf={d['confidence']}]"
219
+ + (f" AMBIGUITY: {d['ambiguity']}" if d.get('ambiguity') else ""))
220
+ if d.get("declared_script"):
221
+ print(f" declared : {d['declared_script']}")
222
+ print(f" evidence_sink: {r['evidence_sink']}")
223
+ print(f" claims : {r['claims_surface']}")
224
+ print(f" lint exits : honest={l['honest_exit']}(want 0) "
225
+ f"fab-missing={l['fab_missing_exit']}(want 1) "
226
+ f"fab-failure={l['fab_failure_exit']}(want 1) ok={l['behaviour_ok']}")
227
+ print(f" honest-ev : {'REAL' if l['honest_evidence_real'] else 'synthetic'} "
228
+ f"({l['honest_evidence_note']})")
229
+ print(f"\nevidence dir: {EVID}")
230
+ return 0
231
+
232
+
233
+ if __name__ == "__main__":
234
+ sys.exit(main(sys.argv[1:]))
@@ -0,0 +1,310 @@
1
+ #!/usr/bin/env python3
2
+ """Phase-0 consumer-contract wiring: wicked-garden -> wicked-vault.
3
+
4
+ Demonstrates CONTRACTS.md §10-A (compile time) and §10-B (runtime gate) END
5
+ TO END against a real repo. The OLD Phase-0 model emitted a `wg_check_claims.py`
6
+ lint that grepped files; this REPLACES that file-grep gate with a real
7
+ `wicked-vault cross-check` call — the harness gate is now a vault verdict.
8
+
9
+ Flow per repo:
10
+ 1. detect.py -> bindings (test_command especially).
11
+ 2. declare-contract scope=<repo>-demo phase=build, one required claim
12
+ `tests-pass`, kind `test-run`, verifier `exit_code_eq:0`, source_pin set
13
+ to the DETECTED test_command (§10-A.2: source pinned to the repo's real
14
+ command).
15
+ 3a. REAL run: record --run the detected test_command. Honest data — if the
16
+ toolchain is absent / slow it will FAIL or time out, and the gate REJECTs.
17
+ 3b. GATE-TRANSITION demo (separate scope <repo>-demo-gate): a single contract
18
+ whose source is a marker-driven command (`sh -c 'exit $(cat MARKER)'`).
19
+ We record a genuinely-FAILING capture (marker=1) then a genuinely-PASSING
20
+ capture (marker=0). Same pinned source string both times (honors G8), but
21
+ the captured exit code differs — so the latest-active artifact flips the
22
+ verdict. This explicitly shows BOTH outcomes the task asks for: `true`
23
+ (pass) and `false` (fail), both verified with `exit_code_eq:0`.
24
+ 4. cross-check --scope <...> --phase build (§10-B): REJECT when the failing
25
+ capture is latest, PASS when a passing capture is latest. Exit code of the
26
+ CLI IS the gate signal (0 == PASS).
27
+
28
+ Cleanup: the vault writes `.wicked-vault/` into the target repo; this script
29
+ removes it afterward so the target repos stay clean.
30
+
31
+ Stdlib-only. Cross-platform note: uses `sh -c` for the marker command, which is
32
+ available on macOS/Linux and Git Bash/WSL on Windows; native PowerShell would
33
+ need a different marker command but the §10 interaction is identical.
34
+ """
35
+ from __future__ import annotations
36
+
37
+ import json
38
+ import os
39
+ import shutil
40
+ import subprocess
41
+ import sys
42
+ import tempfile
43
+ from pathlib import Path
44
+
45
+ HERE = Path(__file__).resolve().parent
46
+ # Resolve the vault CLI portably: WICKED_VAULT_BIN env first, else a sibling
47
+ # checkout (dev default). A .mjs/.js path runs via node; anything else direct.
48
+ _VAULT_BIN = os.environ.get("WICKED_VAULT_BIN", "").strip() or str(
49
+ Path.home() / "Projects" / "wicked-vault" / "bin" / "wicked-vault.mjs")
50
+ VAULT_PREFIX = (["node", _VAULT_BIN] if _VAULT_BIN.endswith((".mjs", ".js"))
51
+ else [_VAULT_BIN])
52
+ EVIDENCE = HERE / "evidence" / "wire-vault-transcript.txt"
53
+
54
+ # Per-repo wall-clock budget for the REAL detected test_command. If it exceeds
55
+ # this we kill it; the captured run then counts as a fail (honest REJECT).
56
+ REAL_RUN_TIMEOUT_S = 90
57
+
58
+
59
+ class Tee:
60
+ """Mirror everything we print to both stdout and the transcript file."""
61
+
62
+ def __init__(self, path: Path):
63
+ path.parent.mkdir(parents=True, exist_ok=True)
64
+ self._fh = open(path, "w", encoding="utf-8")
65
+
66
+ def __call__(self, *parts: object) -> None:
67
+ line = " ".join(str(p) for p in parts)
68
+ sys.stdout.write(line + "\n")
69
+ sys.stdout.flush()
70
+ self._fh.write(line + "\n")
71
+ self._fh.flush()
72
+
73
+ def close(self) -> None:
74
+ self._fh.close()
75
+
76
+
77
+ def run_vault(args: list[str], cwd_repo: Path, timeout: int | None = None) -> tuple[int, dict | str]:
78
+ """Invoke the vault CLI. Returns (exit_code, parsed_json_or_raw_text)."""
79
+ cmd = [*VAULT_PREFIX, *args, "--cwd", str(cwd_repo)]
80
+ try:
81
+ proc = subprocess.run(
82
+ cmd, capture_output=True, text=True, timeout=timeout,
83
+ )
84
+ except subprocess.TimeoutExpired:
85
+ return 124, {"error": f"vault CLI timed out after {timeout}s", "args": args}
86
+ out = proc.stdout.strip()
87
+ try:
88
+ parsed: dict | str = json.loads(out) if out else {"error": "empty stdout", "stderr": proc.stderr.strip()}
89
+ except json.JSONDecodeError:
90
+ parsed = out or proc.stderr.strip()
91
+ return proc.returncode, parsed
92
+
93
+
94
+ def detect(repo: Path, tee: Tee) -> dict:
95
+ out = subprocess.run(
96
+ [sys.executable, str(HERE / "detect.py"), str(repo)],
97
+ capture_output=True, text=True,
98
+ )
99
+ bindings = json.loads(out.stdout)
100
+ tc = bindings["test_command"]
101
+ tee(f" detect.py: test_command = {tc.get('value')!r} "
102
+ f"(source={tc.get('source')}, confidence={tc.get('confidence')}, "
103
+ f"ecosystem={tc.get('ecosystem')})")
104
+ if tc.get("ambiguity"):
105
+ tee(f" ambiguity flagged: {tc['ambiguity']}")
106
+ return bindings
107
+
108
+
109
+ def write_spec(source_pin: str) -> str:
110
+ """Write a contract spec JSON to a temp file; return its path."""
111
+ spec = {
112
+ "required_evidence": [{
113
+ "claim_id": "tests-pass",
114
+ "kind": "test-run",
115
+ "source_pin": source_pin,
116
+ "verifier": {"kind": "exit_code_eq", "params": {"code": 0}},
117
+ "required": True,
118
+ }],
119
+ "origin": "wicked-garden:compiler:phase0:wire_vault",
120
+ }
121
+ fd, path = tempfile.mkstemp(suffix=".json", prefix="wg-vault-spec-")
122
+ with os.fdopen(fd, "w", encoding="utf-8") as fh:
123
+ json.dump(spec, fh)
124
+ return path
125
+
126
+
127
+ def real_run_section(repo: Path, reponame: str, test_cmd: str | None, tee: Tee) -> dict:
128
+ """§10-A/B against the DETECTED test_command. Honest: may FAIL/timeout."""
129
+ scope = f"{reponame}-demo"
130
+ result: dict = {"scope": scope, "runnable": None}
131
+ tee(f"\n [REAL] scope={scope} phase=build source_pin={test_cmd!r}")
132
+
133
+ if not test_cmd:
134
+ tee(" [REAL] no test_command detected — skipping real run.")
135
+ result["runnable"] = False
136
+ result["note"] = "detect.py returned no test_command"
137
+ return result
138
+
139
+ spec = write_spec(test_cmd)
140
+ rc, out = run_vault(
141
+ ["declare-contract", "--scope", scope, "--phase", "build", "--spec", spec],
142
+ repo)
143
+ os.unlink(spec)
144
+ tee(f" [REAL] declare-contract exit={rc} contract_version="
145
+ f"{out.get('contract_version') if isinstance(out, dict) else out}")
146
+
147
+ tee(f" [REAL] record --run (timeout {REAL_RUN_TIMEOUT_S}s) ...")
148
+ rc, out = run_vault(
149
+ ["record", "--scope", scope, "--phase", "build", "--claim", "tests-pass",
150
+ "--kind", "test-run", "--source", test_cmd, "--verifier", "exit_code_eq:0",
151
+ "--run"],
152
+ repo, timeout=REAL_RUN_TIMEOUT_S)
153
+ if rc == 124:
154
+ # Our wrapper killed the vault process. The detected command did not
155
+ # complete in budget => not runnable here. Fall back to gate demo only.
156
+ tee(f" [REAL] record TIMED OUT after {REAL_RUN_TIMEOUT_S}s — "
157
+ "detected command is NOT runnable in budget on this machine.")
158
+ result["runnable"] = False
159
+ result["note"] = f"detected command timed out > {REAL_RUN_TIMEOUT_S}s"
160
+ return result
161
+ if isinstance(out, dict) and out.get("error"):
162
+ tee(f" [REAL] record ERROR: {out['error']}")
163
+ result["runnable"] = False
164
+ result["note"] = f"record error: {out['error']}"
165
+ return result
166
+
167
+ status = out.get("status_at_record") if isinstance(out, dict) else None
168
+ detail = out.get("status_detail") if isinstance(out, dict) else None
169
+ tee(f" [REAL] record exit={rc} status_at_record={status} detail={detail!r}")
170
+ result["runnable"] = True
171
+ result["status_at_record"] = status
172
+
173
+ rc, out = run_vault(["cross-check", "--scope", scope, "--phase", "build"], repo)
174
+ overall = out.get("overall") if isinstance(out, dict) else out
175
+ tee(f" [REAL] cross-check exit={rc} overall={overall} "
176
+ "(this exit code IS the harness gate signal)")
177
+ result["crosscheck_overall"] = overall
178
+ result["crosscheck_exit"] = rc
179
+ return result
180
+
181
+
182
+ def gate_transition_section(repo: Path, reponame: str, tee: Tee) -> dict:
183
+ """Explicit REJECT->PASS demo on ONE contract, both outcomes genuine.
184
+
185
+ Records a genuinely-FAILING capture (`false`-equivalent, marker=1) then a
186
+ genuinely-PASSING capture (`true`-equivalent, marker=0), both via the SAME
187
+ pinned source (honors G8). Latest-active artifact flips the verdict.
188
+ """
189
+ scope = f"{reponame}-demo-gate"
190
+ result: dict = {"scope": scope}
191
+ marker = Path(tempfile.gettempdir()) / f"wg-vault-gate-{reponame}-marker"
192
+ # Same source string for both records => G8 source_pin satisfied; exit code
193
+ # comes from the marker file the vault reads at run time.
194
+ source = f"sh -c 'exit $(cat {marker})'"
195
+ tee(f"\n [GATE] scope={scope} phase=build source_pin={source!r}")
196
+
197
+ spec = write_spec(source)
198
+ rc, out = run_vault(
199
+ ["declare-contract", "--scope", scope, "--phase", "build", "--spec", spec],
200
+ repo)
201
+ os.unlink(spec)
202
+ tee(f" [GATE] declare-contract exit={rc} contract_version="
203
+ f"{out.get('contract_version') if isinstance(out, dict) else out}")
204
+
205
+ # 1) genuinely FAILING capture (false): marker=1
206
+ marker.write_text("1")
207
+ rc, out = run_vault(
208
+ ["record", "--scope", scope, "--phase", "build", "--claim", "tests-pass",
209
+ "--kind", "test-run", "--source", source, "--verifier", "exit_code_eq:0",
210
+ "--run"],
211
+ repo)
212
+ tee(f" [GATE] record FAILING (false/exit 1) exit={rc} "
213
+ f"status_at_record={out.get('status_at_record') if isinstance(out, dict) else out}")
214
+
215
+ rc_fail, out = run_vault(["cross-check", "--scope", scope, "--phase", "build"], repo)
216
+ overall_fail = out.get("overall") if isinstance(out, dict) else out
217
+ tee(f" [GATE] cross-check (failing latest) exit={rc_fail} overall={overall_fail} "
218
+ "<- expect REJECT / exit 1")
219
+ result["fail_overall"] = overall_fail
220
+ result["fail_exit"] = rc_fail
221
+
222
+ # 2) genuinely PASSING capture (true): marker=0 -> becomes latest active
223
+ marker.write_text("0")
224
+ rc, out = run_vault(
225
+ ["record", "--scope", scope, "--phase", "build", "--claim", "tests-pass",
226
+ "--kind", "test-run", "--source", source, "--verifier", "exit_code_eq:0",
227
+ "--run"],
228
+ repo)
229
+ tee(f" [GATE] record PASSING (true/exit 0) exit={rc} "
230
+ f"status_at_record={out.get('status_at_record') if isinstance(out, dict) else out}")
231
+
232
+ rc_pass, out = run_vault(["cross-check", "--scope", scope, "--phase", "build"], repo)
233
+ overall_pass = out.get("overall") if isinstance(out, dict) else out
234
+ tee(f" [GATE] cross-check (passing latest) exit={rc_pass} overall={overall_pass} "
235
+ "<- expect PASS / exit 0")
236
+ result["pass_overall"] = overall_pass
237
+ result["pass_exit"] = rc_pass
238
+
239
+ marker.unlink(missing_ok=True)
240
+ return result
241
+
242
+
243
+ def cleanup(repo: Path, tee: Tee) -> None:
244
+ vdir = repo / ".wicked-vault"
245
+ if vdir.exists():
246
+ shutil.rmtree(vdir)
247
+ tee(f" cleanup: removed {vdir}")
248
+ else:
249
+ tee(f" cleanup: nothing to remove at {vdir}")
250
+
251
+
252
+ def wire(repo: Path, tee: Tee) -> dict:
253
+ reponame = repo.name
254
+ tee("\n" + "=" * 72)
255
+ tee(f"REPO: {repo}")
256
+ tee("=" * 72)
257
+ # Clean slate: the cross-check is re-run from a fresh vault every time.
258
+ cleanup(repo, tee)
259
+ bindings = detect(repo, tee)
260
+ test_cmd = bindings["test_command"].get("value")
261
+ real = real_run_section(repo, reponame, test_cmd, tee)
262
+ gate = gate_transition_section(repo, reponame, tee)
263
+ cleanup(repo, tee)
264
+ return {"repo": reponame, "real": real, "gate": gate}
265
+
266
+
267
+ def main() -> int:
268
+ # When invoked via `node <path>`, that path must exist. A bare command
269
+ # (global install / PATH) is left to the subprocess to resolve.
270
+ if VAULT_PREFIX[0] == "node" and not Path(_VAULT_BIN).exists():
271
+ sys.stderr.write(
272
+ f"wicked-vault CLI not found at {_VAULT_BIN} "
273
+ "(set WICKED_VAULT_BIN to override)\n")
274
+ return 2
275
+ repos = [Path(a).resolve() for a in sys.argv[1:]] or [
276
+ Path.home() / "Projects" / "memos",
277
+ Path.home() / "Projects" / "Enterprise-AISDLC",
278
+ ]
279
+ tee = Tee(EVIDENCE)
280
+ tee("wicked-garden -> wicked-vault consumer-contract wiring (Phase-0)")
281
+ tee(f"vault CLI: {' '.join(VAULT_PREFIX)}")
282
+ tee(f"transcript: {EVIDENCE}")
283
+ summary = []
284
+ try:
285
+ for repo in repos:
286
+ if not repo.exists():
287
+ tee(f"\nSKIP (missing): {repo}")
288
+ continue
289
+ summary.append(wire(repo, tee))
290
+ finally:
291
+ tee("\n" + "=" * 72)
292
+ tee("SUMMARY")
293
+ tee("=" * 72)
294
+ for s in summary:
295
+ tee(f"\n{s['repo']}:")
296
+ r = s["real"]
297
+ tee(f" REAL detected command runnable: {r.get('runnable')}"
298
+ + (f" ({r['note']})" if r.get("note") else ""))
299
+ if r.get("runnable"):
300
+ tee(f" real cross-check: overall={r.get('crosscheck_overall')} "
301
+ f"exit={r.get('crosscheck_exit')}")
302
+ g = s["gate"]
303
+ tee(f" GATE failing-latest: overall={g.get('fail_overall')} exit={g.get('fail_exit')} (expect REJECT/1)")
304
+ tee(f" GATE passing-latest: overall={g.get('pass_overall')} exit={g.get('pass_exit')} (expect PASS/0)")
305
+ tee.close()
306
+ return 0
307
+
308
+
309
+ if __name__ == "__main__":
310
+ raise SystemExit(main())
File without changes