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.
- package/.claude-plugin/archetypes.json +166 -0
- package/.claude-plugin/components.json +75 -0
- package/.claude-plugin/marketplace.json +15 -0
- package/.claude-plugin/plugin.json +174 -0
- package/.claude-plugin/specialist.json +48 -0
- package/.claude-plugin/stack-registry.json +96 -0
- package/AGENTS.md +13 -0
- package/CHANGELOG.md +712 -0
- package/CONTRIBUTING.md +99 -0
- package/ETHOS.md +83 -0
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/WICKED_GARDEN_BUS_EVENTS.md +149 -0
- package/agents/agentic/architect.md +449 -0
- package/agents/agentic/performance-analyst.md +702 -0
- package/agents/agentic/safety-reviewer.md +662 -0
- package/agents/crew/implementer.md +163 -0
- package/agents/crew/researcher.md +94 -0
- package/agents/crew/reviewer.md +184 -0
- package/agents/data/data-engineer.md +227 -0
- package/agents/engineering/api-documentarian.md +440 -0
- package/agents/engineering/migration-engineer.md +301 -0
- package/agents/engineering/solution-architect.md +208 -0
- package/agents/jam/brainstorm-facilitator.md +297 -0
- package/agents/jam/council.md +322 -0
- package/agents/jam/quick-facilitator.md +85 -0
- package/agents/persona/persona-agent.md +121 -0
- package/agents/platform/compliance-officer.md +266 -0
- package/agents/platform/privacy-expert.md +496 -0
- package/agents/platform/security-engineer.md +287 -0
- package/agents/product/a11y-expert.md +323 -0
- package/agents/product/requirements-analyst.md +238 -0
- package/agents/product/ui-reviewer.md +180 -0
- package/agents/product/ux-designer.md +199 -0
- package/agents/product/value-strategist.md +269 -0
- package/agents/qe/semantic-reviewer.md +78 -0
- package/commands/agentic/audit.md +24 -0
- package/commands/agentic/design.md +24 -0
- package/commands/agentic/frameworks.md +25 -0
- package/commands/agentic/review.md +27 -0
- package/commands/archetype/build.md +12 -0
- package/commands/archetype/decide.md +12 -0
- package/commands/archetype/explore.md +12 -0
- package/commands/archetype/incident.md +12 -0
- package/commands/archetype/migrate.md +12 -0
- package/commands/archetype/modernize.md +12 -0
- package/commands/archetype/review.md +14 -0
- package/commands/archetype/ship.md +12 -0
- package/commands/archetype/specify.md +12 -0
- package/commands/archetype/triage.md +12 -0
- package/commands/compile.md +37 -0
- package/commands/data/analyze.md +18 -0
- package/commands/data/data.md +21 -0
- package/commands/data/ml.md +18 -0
- package/commands/data/ontology.md +22 -0
- package/commands/data/pipeline.md +17 -0
- package/commands/deliberate.md +181 -0
- package/commands/engineering/add-field.md +77 -0
- package/commands/engineering/apply.md +58 -0
- package/commands/engineering/arch.md +26 -0
- package/commands/engineering/debug.md +27 -0
- package/commands/engineering/docs.md +27 -0
- package/commands/engineering/new-generator.md +257 -0
- package/commands/engineering/patch-plan.md +59 -0
- package/commands/engineering/plan.md +29 -0
- package/commands/engineering/remove.md +48 -0
- package/commands/engineering/rename.md +44 -0
- package/commands/engineering/review.md +32 -0
- package/commands/help.md +128 -0
- package/commands/install.md +118 -0
- package/commands/intent.md +54 -0
- package/commands/jam/brainstorm.md +37 -0
- package/commands/jam/council.md +49 -0
- package/commands/jam/quick.md +21 -0
- package/commands/jam/revisit.md +79 -0
- package/commands/persona/as.md +136 -0
- package/commands/persona/define.md +24 -0
- package/commands/persona/list.md +118 -0
- package/commands/platform/actions.md +20 -0
- package/commands/platform/assert.md +18 -0
- package/commands/platform/audit.md +23 -0
- package/commands/platform/compliance.md +20 -0
- package/commands/platform/gh.md +22 -0
- package/commands/platform/health.md +22 -0
- package/commands/platform/incident.md +23 -0
- package/commands/platform/infra.md +24 -0
- package/commands/platform/peer-health.md +103 -0
- package/commands/platform/plugin-health.md +58 -0
- package/commands/platform/security.md +38 -0
- package/commands/platform/toolchain.md +96 -0
- package/commands/platform/traces.md +20 -0
- package/commands/product/a11y.md +19 -0
- package/commands/product/acceptance.md +19 -0
- package/commands/product/align.md +20 -0
- package/commands/product/analyze.md +23 -0
- package/commands/product/elicit.md +19 -0
- package/commands/product/listen.md +24 -0
- package/commands/product/mockup.md +20 -0
- package/commands/product/screenshot.md +19 -0
- package/commands/product/strategy.md +40 -0
- package/commands/product/synthesize.md +23 -0
- package/commands/product/ux-review.md +42 -0
- package/commands/product/ux.md +20 -0
- package/commands/product/visual-direction.md +34 -0
- package/commands/prove.md +47 -0
- package/commands/report-issue.md +243 -0
- package/commands/reset.md +144 -0
- package/commands/search/blast-radius.md +58 -0
- package/commands/search/hotspots.md +55 -0
- package/commands/search/index.md +38 -0
- package/commands/search/lineage.md +47 -0
- package/commands/search/service-map.md +79 -0
- package/commands/setup.md +363 -0
- package/commands/smaht/briefing.md +200 -0
- package/commands/smaht/events-import.md +95 -0
- package/commands/smaht/state.md +19 -0
- package/commands/where-am-i.md +58 -0
- package/docs/README.md +32 -0
- package/docs/adr/0001-code-relationship-graph-engine.md +116 -0
- package/docs/adr/0002-major-cleanup-keep-cut.md +91 -0
- package/docs/adr/0003-peers-gate-required-layers-optin.md +41 -0
- package/docs/adr/0004-code-graph-moves-to-wicked-brain.md +47 -0
- package/docs/brain-chunk-format.md +135 -0
- package/docs/compiler.md +95 -0
- package/docs/daemon-api.md +70 -0
- package/docs/domains.md +197 -0
- package/docs/getting-started.md +208 -0
- package/docs/plans/2026-06-08-wicked-loom-conduct.md +1337 -0
- package/docs/plans/2026-06-08-wicked-loom-contract.md +638 -0
- package/docs/plans/2026-06-08-wicked-loom-cutover.md +1300 -0
- package/docs/plans/2026-06-08-wicked-loom-expand-compose.md +843 -0
- package/docs/plans/2026-06-08-wicked-loom-flow-cutover.md +403 -0
- package/docs/plans/2026-06-10-codegraph-to-brain-phase1a-graph-core.md +838 -0
- package/docs/plans/2026-06-10-codegraph-to-brain-phase1b-injected-edges.md +44 -0
- package/docs/required-peers.md +60 -0
- package/docs/specs/2026-06-08-wicked-loom-extraction.md +225 -0
- package/docs/specs/2026-06-10-codegraph-to-brain-migration.md +168 -0
- package/docs/v11/archetypes.md +231 -0
- package/hooks/hooks.json +275 -0
- package/hooks/scripts/bootstrap.py +1797 -0
- package/hooks/scripts/invoke.py +62 -0
- package/hooks/scripts/notification.py +166 -0
- package/hooks/scripts/permission_request.py +223 -0
- package/hooks/scripts/post_tool.py +1374 -0
- package/hooks/scripts/pre_compact.py +272 -0
- package/hooks/scripts/pre_tool.py +1278 -0
- package/hooks/scripts/prompt_submit.py +1109 -0
- package/hooks/scripts/session_end.py +95 -0
- package/hooks/scripts/stop.py +624 -0
- package/hooks/scripts/subagent_lifecycle.py +464 -0
- package/hooks/scripts/subscribers/on_gate_decided.py +84 -0
- package/hooks/scripts/task_completed.py +322 -0
- package/hooks/scripts/worktree_guard.py +148 -0
- package/hooks/subscriptions/on_gate_decided.json +9 -0
- package/install.mjs +128 -0
- package/package.json +41 -0
- package/pyproject.toml +59 -0
- package/schemas/README.md +32 -0
- package/schemas/assert_contracts.json +37 -0
- package/schemas/health_probe.json +46 -0
- package/schemas/plugin_status.json +37 -0
- package/scripts/_adapters/__init__.py +166 -0
- package/scripts/_adapters/jira_adapter.py +18 -0
- package/scripts/_adapters/linear_adapter.py +18 -0
- package/scripts/_adapters/miro_adapter.py +18 -0
- package/scripts/_adapters/notion_adapter.py +18 -0
- package/scripts/_agents.py +357 -0
- package/scripts/_brain_ingest/__init__.py +2 -0
- package/scripts/_brain_ingest/session_fact_extractor.py +341 -0
- package/scripts/_brain_port.py +163 -0
- package/scripts/_bus.py +1081 -0
- package/scripts/_bus_catalog_gen.py +93 -0
- package/scripts/_bus_consumers.json +46 -0
- package/scripts/_bus_emit.py +43 -0
- package/scripts/_capability_registry.py +334 -0
- package/scripts/_capability_resolver.py +322 -0
- package/scripts/_domain_store.py +559 -0
- package/scripts/_event_log_reader.py +154 -0
- package/scripts/_event_schema.py +305 -0
- package/scripts/_event_store.py +397 -0
- package/scripts/_heavy_cadence.py +324 -0
- package/scripts/_integration_resolver.py +321 -0
- package/scripts/_logger.py +151 -0
- package/scripts/_loom.py +482 -0
- package/scripts/_paths.py +133 -0
- package/scripts/_python.sh +22 -0
- package/scripts/_run.py +137 -0
- package/scripts/_session.py +502 -0
- package/scripts/_validate_registry.py +1042 -0
- package/scripts/_wicked_testing_probe.py +277 -0
- package/scripts/agentic/analyze_agents.py +391 -0
- package/scripts/agentic/detect_framework.py +420 -0
- package/scripts/agentic/issue_taxonomy.py +357 -0
- package/scripts/agentic/pattern_scorer.py +434 -0
- package/scripts/classify/persist.py +169 -0
- package/scripts/compiler/compile.py +552 -0
- package/scripts/compiler/phase0/VERDICT.md +60 -0
- package/scripts/compiler/phase0/detect.py +292 -0
- package/scripts/compiler/phase0/emit.py +228 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.bindings.json +30 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/.wg/evidence/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/.wg/evidence/honest-tests.txt +2 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/command_iq.bindings.json +45 -0
- package/scripts/compiler/phase0/evidence/command_iq.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/.projects/evidence-domain/phase-1-clarify/evidence/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/.projects/evidence-domain/phase-1-clarify/evidence/honest-tests.txt +3 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/memos.bindings.json +28 -0
- package/scripts/compiler/phase0/evidence/memos.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/memos.stage/.wg/evidence/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/memos.stage/.wg/evidence/honest-tests.txt +2 -0
- package/scripts/compiler/phase0/evidence/memos.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/memos.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/memos.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/memos.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/verdict.json +104 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.bindings.json +29 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/coverage/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/coverage/honest-tests.txt +3 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/wire-vault-transcript.txt +60 -0
- package/scripts/compiler/phase0/run_probe.py +234 -0
- package/scripts/compiler/phase0/wire_vault.py +310 -0
- package/scripts/crew/__init__.py +0 -0
- package/scripts/crew/_task_audit_writer.py +243 -0
- package/scripts/crew/_task_reader.py +389 -0
- package/scripts/crew/archetypes_v11.py +348 -0
- package/scripts/crew/detectors/__init__.py +12 -0
- package/scripts/crew/flow_compiler.py +121 -0
- package/scripts/crew/phase_manager.py +703 -0
- package/scripts/crew/scope_delta.py +264 -0
- package/scripts/crew/specialist_resolver.py +218 -0
- package/scripts/crew/stack_registry.py +189 -0
- package/scripts/data/data_profiler.py +271 -0
- package/scripts/data/ontology_recommender.py +231 -0
- package/scripts/data/schema_validator.py +267 -0
- package/scripts/delivery/drift.py +739 -0
- package/scripts/delivery/telemetry.py +614 -0
- package/scripts/engineering/patch/codegraph_db.py +125 -0
- package/scripts/engineering/patch/generators/__init__.py +56 -0
- package/scripts/engineering/patch/generators/base.py +373 -0
- package/scripts/engineering/patch/generators/csharp_generator.py +494 -0
- package/scripts/engineering/patch/generators/go_generator.py +430 -0
- package/scripts/engineering/patch/generators/java_generator.py +928 -0
- package/scripts/engineering/patch/generators/jsp_generator.py +454 -0
- package/scripts/engineering/patch/generators/kotlin_generator.py +561 -0
- package/scripts/engineering/patch/generators/perl_generator.py +510 -0
- package/scripts/engineering/patch/generators/php_generator.py +644 -0
- package/scripts/engineering/patch/generators/propagation_engine.py +929 -0
- package/scripts/engineering/patch/generators/python_generator.py +487 -0
- package/scripts/engineering/patch/generators/ruby_generator.py +463 -0
- package/scripts/engineering/patch/generators/rust_generator.py +400 -0
- package/scripts/engineering/patch/generators/sql_generator.py +594 -0
- package/scripts/engineering/patch/generators/typescript_generator.py +439 -0
- package/scripts/engineering/patch/patch.py +800 -0
- package/scripts/engineering/patch/safety.py +429 -0
- package/scripts/jam/__init__.py +0 -0
- package/scripts/jam/_bus_consumers.py +271 -0
- package/scripts/jam/agentic_cli_registry.py +703 -0
- package/scripts/jam/consensus.py +737 -0
- package/scripts/jam/detect_clis.py +409 -0
- package/scripts/jam/jam.py +283 -0
- package/scripts/jam/save_transcript.py +171 -0
- package/scripts/loom/__init__.py +22 -0
- package/scripts/loom/cli.py +170 -0
- package/scripts/loom/compose.py +180 -0
- package/scripts/loom/gate.py +120 -0
- package/scripts/loom/manifest.py +140 -0
- package/scripts/loom/resolve.py +59 -0
- package/scripts/persona/__init__.py +0 -0
- package/scripts/persona/registry.py +688 -0
- package/scripts/platform/guard_pipeline.py +1214 -0
- package/scripts/platform/guard_profiles.py +216 -0
- package/scripts/platform/observability/assert_contracts.py +434 -0
- package/scripts/platform/observability/health_probe.py +915 -0
- package/scripts/platform/observability/ops_log_viewer.py +209 -0
- package/scripts/platform/prereq_doctor.py +567 -0
- package/scripts/qe/conditions_manifest.py +260 -0
- package/scripts/qe/content_sanitizer.py +160 -0
- package/scripts/qe/coverage_tracker.py +535 -0
- package/scripts/qe/discover_scenarios.py +243 -0
- package/scripts/qe/evidence_tracker.py +232 -0
- package/scripts/qe/prove.py +196 -0
- package/scripts/qe/registry_lookup.py +80 -0
- package/scripts/qe/registry_store.py +176 -0
- package/scripts/qe/semantic_review.py +1005 -0
- package/scripts/qe/vault_gate.py +382 -0
- package/scripts/qe/verdict_audit.py +175 -0
- package/scripts/qe/verdict_schema.py +335 -0
- package/scripts/reset.py +220 -0
- package/scripts/resolve_path.py +22 -0
- package/scripts/sentinel/invariants.py +402 -0
- package/scripts/sentinel/pre_push.py +73 -0
- package/scripts/setup/__init__.py +1 -0
- package/scripts/setup/detect_state.py +114 -0
- package/scripts/setup/migrate_legacy.py +67 -0
- package/scripts/setup/migrate_v6_projects.py +232 -0
- package/scripts/setup/onboarding.py +114 -0
- package/scripts/smaht/_bus_consumers.py +98 -0
- package/scripts/smaht/adapters/__init__.py +83 -0
- package/scripts/smaht/adapters/brain_adapter.py +254 -0
- package/scripts/smaht/adapters/context7_adapter.py +438 -0
- package/scripts/smaht/adapters/delegation_adapter.py +104 -0
- package/scripts/smaht/adapters/domain_adapter.py +206 -0
- package/scripts/smaht/adapters/events_adapter.py +231 -0
- package/scripts/smaht/adapters/tools_adapter.py +49 -0
- package/scripts/smaht/cheatsheet_store.py +236 -0
- package/scripts/smaht/context_package.py +386 -0
- package/scripts/smaht/knowledge_graph.py +395 -0
- package/scripts/smaht/propose_skills.py +856 -0
- package/scripts/smaht/test_cheatsheet_store.py +428 -0
- package/scripts/statusline.py +151 -0
- package/scripts/where_am_i.py +236 -0
- package/skills/agentic/agentic-patterns/SKILL.md +91 -0
- package/skills/agentic/agentic-patterns/refs/anti-patterns-design.md +283 -0
- package/skills/agentic/agentic-patterns/refs/anti-patterns-operational.md +216 -0
- package/skills/agentic/agentic-patterns/refs/pattern-catalog.md +329 -0
- package/skills/agentic/context-engineering/SKILL.md +142 -0
- package/skills/agentic/context-engineering/refs/caching-and-optimization.md +251 -0
- package/skills/agentic/context-engineering/refs/compression-techniques.md +171 -0
- package/skills/agentic/context-engineering/refs/cost-calculation-budget.md +250 -0
- package/skills/agentic/context-engineering/refs/cost-optimization-reporting.md +300 -0
- package/skills/agentic/context-engineering/refs/selective-loading.md +179 -0
- package/skills/agentic/frameworks/SKILL.md +191 -0
- package/skills/agentic/frameworks/refs/framework-profiles-1.md +209 -0
- package/skills/agentic/frameworks/refs/framework-profiles-2.md +214 -0
- package/skills/agentic/frameworks/refs/migration-patterns-paths.md +267 -0
- package/skills/agentic/frameworks/refs/migration-patterns-testing.md +208 -0
- package/skills/agentic/refs/audit.md +134 -0
- package/skills/agentic/refs/design.md +137 -0
- package/skills/agentic/refs/frameworks.md +102 -0
- package/skills/agentic/refs/review.md +160 -0
- package/skills/agentic/review-methodology/SKILL.md +186 -0
- package/skills/agentic/review-methodology/refs/deliverable-templates.md +246 -0
- package/skills/agentic/review-methodology/refs/issue-taxonomy-quality-testing.md +277 -0
- package/skills/agentic/review-methodology/refs/issue-taxonomy-reliability-safety.md +253 -0
- package/skills/agentic/trust-and-safety/SKILL.md +177 -0
- package/skills/agentic/trust-and-safety/refs/guardrails-actions.md +246 -0
- package/skills/agentic/trust-and-safety/refs/guardrails-input-output.md +238 -0
- package/skills/agentic/trust-and-safety/refs/guardrails-resources.md +209 -0
- package/skills/agentic/trust-and-safety/refs/safety-checklist-advanced.md +209 -0
- package/skills/agentic/trust-and-safety/refs/safety-checklist-core.md +215 -0
- package/skills/archetype/SKILL.md +104 -0
- package/skills/archetype/refs/build.md +142 -0
- package/skills/archetype/refs/decide.md +117 -0
- package/skills/archetype/refs/explore.md +66 -0
- package/skills/archetype/refs/incident.md +149 -0
- package/skills/archetype/refs/migrate.md +170 -0
- package/skills/archetype/refs/modernize.md +187 -0
- package/skills/archetype/refs/review.md +145 -0
- package/skills/archetype/refs/ship.md +117 -0
- package/skills/archetype/refs/specify.md +108 -0
- package/skills/archetype/refs/triage.md +62 -0
- package/skills/classify/SKILL.md +157 -0
- package/skills/data/analysis/SKILL.md +125 -0
- package/skills/data/analysis/refs/templates.md +170 -0
- package/skills/data/data/SKILL.md +118 -0
- package/skills/data/data/refs/examples.md +235 -0
- package/skills/data/ml/SKILL.md +125 -0
- package/skills/data/ml/refs/templates.md +172 -0
- package/skills/data/pipeline/SKILL.md +136 -0
- package/skills/data/pipeline/refs/templates.md +175 -0
- package/skills/data/refs/analyze.md +123 -0
- package/skills/data/refs/data.md +95 -0
- package/skills/data/refs/ml.md +118 -0
- package/skills/data/refs/pipeline.md +92 -0
- package/skills/deliberate/SKILL.md +125 -0
- package/skills/deliberate/refs/architecture-lens.md +37 -0
- package/skills/deliberate/refs/assumptions-lens.md +43 -0
- package/skills/deliberate/refs/code-lens.md +38 -0
- package/skills/deliberate/refs/content-lens.md +37 -0
- package/skills/deliberate/refs/data-lens.md +43 -0
- package/skills/deliberate/refs/design-lens.md +37 -0
- package/skills/deliberate/refs/opportunity-patterns.md +107 -0
- package/skills/deliberate/refs/ops-lens.md +43 -0
- package/skills/deliberate/refs/product-lens.md +46 -0
- package/skills/deliberate/refs/rethink-framework.md +77 -0
- package/skills/deliberate/refs/security-lens.md +47 -0
- package/skills/deliberate/refs/testing-lens.md +45 -0
- package/skills/deliberate/refs/timing-lens.md +42 -0
- package/skills/engineering/architecture/SKILL.md +177 -0
- package/skills/engineering/architecture/refs/adr-template.md +268 -0
- package/skills/engineering/architecture/refs/architecture-template-deployment.md +176 -0
- package/skills/engineering/architecture/refs/architecture-template-design.md +300 -0
- package/skills/engineering/architecture/refs/examples-ecommerce-analytics.md +299 -0
- package/skills/engineering/architecture/refs/examples-saas-trading.md +291 -0
- package/skills/engineering/architecture/refs/patterns-advanced.md +238 -0
- package/skills/engineering/architecture/refs/patterns-structural.md +303 -0
- package/skills/engineering/backend/SKILL.md +102 -0
- package/skills/engineering/backend/refs/checklists.md +146 -0
- package/skills/engineering/backend/refs/patterns.md +181 -0
- package/skills/engineering/debugging/SKILL.md +99 -0
- package/skills/engineering/debugging/refs/patterns.md +248 -0
- package/skills/engineering/debugging/refs/process.md +203 -0
- package/skills/engineering/docs/SKILL.md +97 -0
- package/skills/engineering/engineering/SKILL.md +88 -0
- package/skills/engineering/engineering/refs/checklists.md +91 -0
- package/skills/engineering/engineering/refs/templates.md +71 -0
- package/skills/engineering/frontend/SKILL.md +92 -0
- package/skills/engineering/frontend/refs/checklists.md +96 -0
- package/skills/engineering/frontend/refs/patterns.md +167 -0
- package/skills/engineering/integration/SKILL.md +183 -0
- package/skills/engineering/integration/refs/error-handling-best-practices.md +139 -0
- package/skills/engineering/integration/refs/error-handling-error-classes-typescript.md +212 -0
- package/skills/engineering/integration/refs/error-handling-error-response-format.md +301 -0
- package/skills/engineering/integration/refs/error-handling-retry-strategies.md +190 -0
- package/skills/engineering/integration/refs/event-schemas-best-practices.md +225 -0
- package/skills/engineering/integration/refs/event-schemas-event-naming-conventions.md +303 -0
- package/skills/engineering/integration/refs/event-schemas-event-structure.md +288 -0
- package/skills/engineering/integration/refs/graphql-best-practices.md +138 -0
- package/skills/engineering/integration/refs/graphql-error-handling.md +198 -0
- package/skills/engineering/integration/refs/graphql-graphql-basics.md +197 -0
- package/skills/engineering/integration/refs/graphql-query-examples.md +226 -0
- package/skills/engineering/integration/refs/graphql-schema-design-patterns.md +280 -0
- package/skills/engineering/integration/refs/grpc-grpc-overview.md +246 -0
- package/skills/engineering/integration/refs/grpc-implementation-examples.md +269 -0
- package/skills/engineering/integration/refs/grpc-metadata-headers.md +304 -0
- package/skills/engineering/integration/refs/grpc-testing.md +49 -0
- package/skills/engineering/integration/refs/openapi-template.yaml +682 -0
- package/skills/engineering/integration/refs/resilience-best-practices.md +109 -0
- package/skills/engineering/integration/refs/resilience-circuit-breaker-pattern.md +302 -0
- package/skills/engineering/integration/refs/resilience-rate-limiting.md +245 -0
- package/skills/engineering/integration/refs/resilience-timeout-pattern.md +212 -0
- package/skills/engineering/integration/refs/rest-api-fundamentals.md +299 -0
- package/skills/engineering/integration/refs/rest-api-responses-security.md +302 -0
- package/skills/engineering/integration/refs/versioning-breaking-changes.md +237 -0
- package/skills/engineering/integration/refs/versioning-migration-strategies.md +257 -0
- package/skills/engineering/integration/refs/versioning-versioning-strategies.md +296 -0
- package/skills/engineering/large-scale-migration/SKILL.md +65 -0
- package/skills/engineering/patch/SKILL.md +184 -0
- package/skills/engineering/refs/arch.md +126 -0
- package/skills/engineering/refs/debug.md +142 -0
- package/skills/engineering/refs/docs.md +190 -0
- package/skills/engineering/refs/plan.md +109 -0
- package/skills/engineering/refs/review.md +138 -0
- package/skills/engineering/system-design/SKILL.md +154 -0
- package/skills/engineering/system-design/refs/anti-patterns-big-ball-of-mud.md +254 -0
- package/skills/engineering/system-design/refs/anti-patterns-circular-dependencies.md +241 -0
- package/skills/engineering/system-design/refs/anti-patterns-feature-envy.md +168 -0
- package/skills/engineering/system-design/refs/anti-patterns-god-object.md +247 -0
- package/skills/engineering/system-design/refs/component-template-lifecycle.md +210 -0
- package/skills/engineering/system-design/refs/component-template-maintenance.md +219 -0
- package/skills/engineering/system-design/refs/component-template-structure.md +276 -0
- package/skills/engineering/system-design/refs/dependencies-best-practices.md +260 -0
- package/skills/engineering/system-design/refs/dependencies-dependency-principles.md +295 -0
- package/skills/engineering/system-design/refs/dependencies-dependency-tracking.md +261 -0
- package/skills/engineering/system-design/refs/interface-template-lifecycle.md +211 -0
- package/skills/engineering/system-design/refs/interface-template-maintenance.md +212 -0
- package/skills/engineering/system-design/refs/interface-template-structure.md +269 -0
- package/skills/engineering/system-design/refs/patterns-dependency-injection.md +151 -0
- package/skills/engineering/system-design/refs/patterns-facade-pattern.md +257 -0
- package/skills/engineering/system-design/refs/patterns-layered-pattern.md +204 -0
- package/skills/engineering/system-design/refs/patterns-plugin-architecture.md +229 -0
- package/skills/engineering/unit-test-quality/SKILL.md +194 -0
- package/skills/ground/SKILL.md +130 -0
- package/skills/integration-discovery/SKILL.md +168 -0
- package/skills/integration-discovery/refs/capabilities.md +282 -0
- package/skills/integration-discovery/refs/cli-detection.md +295 -0
- package/skills/integration-discovery/refs/discovery-sources.md +233 -0
- package/skills/integration-discovery/refs/task-patterns.md +206 -0
- package/skills/jam/SKILL.md +45 -0
- package/skills/jam/refs/facilitation-patterns.md +125 -0
- package/skills/jam/refs/quick.md +64 -0
- package/skills/jam/refs/synthesis-patterns.md +114 -0
- package/skills/multi-model/SKILL.md +168 -0
- package/skills/multi-model/refs/aichat.md +119 -0
- package/skills/multi-model/refs/aider.md +100 -0
- package/skills/multi-model/refs/auditability.md +238 -0
- package/skills/multi-model/refs/codex.md +169 -0
- package/skills/multi-model/refs/context.md +306 -0
- package/skills/multi-model/refs/copilot.md +161 -0
- package/skills/multi-model/refs/examples.md +224 -0
- package/skills/multi-model/refs/gemini.md +185 -0
- package/skills/multi-model/refs/goose.md +112 -0
- package/skills/multi-model/refs/llm.md +124 -0
- package/skills/multi-model/refs/opencode.md +196 -0
- package/skills/multi-model/refs/orchestration.md +188 -0
- package/skills/multi-model/refs/pi.md +208 -0
- package/skills/persona/SKILL.md +144 -0
- package/skills/persona/refs/define.md +133 -0
- package/skills/platform/actions/refs/actions.md +114 -0
- package/skills/platform/audit/SKILL.md +174 -0
- package/skills/platform/audit/refs/audit.md +145 -0
- package/skills/platform/audit/refs/checklists-evidence-operations.md +144 -0
- package/skills/platform/audit/refs/checklists-gdpr-pci-evidence.md +213 -0
- package/skills/platform/audit/refs/checklists-soc2-hipaa.md +120 -0
- package/skills/platform/audit/refs/frameworks-gdpr-pci.md +225 -0
- package/skills/platform/audit/refs/frameworks-soc2-hipaa.md +228 -0
- package/skills/platform/compliance/SKILL.md +169 -0
- package/skills/platform/compliance/refs/checklists.md +303 -0
- package/skills/platform/compliance/refs/compliance.md +117 -0
- package/skills/platform/compliance/refs/frameworks.md +282 -0
- package/skills/platform/errors/SKILL.md +183 -0
- package/skills/platform/errors/refs/patterns.md +271 -0
- package/skills/platform/errors/refs/severity.md +264 -0
- package/skills/platform/gate-benchmark-rebaseline/SKILL.md +108 -0
- package/skills/platform/gh/refs/gh.md +105 -0
- package/skills/platform/gh-cli/SKILL.md +120 -0
- package/skills/platform/gh-cli/refs/automation.md +63 -0
- package/skills/platform/gh-cli/refs/gh-ops.md +103 -0
- package/skills/platform/gh-cli/refs/patterns.md +132 -0
- package/skills/platform/gh-cli/scripts/gh_ops.py +454 -0
- package/skills/platform/github-actions/SKILL.md +159 -0
- package/skills/platform/github-actions/refs/security.md +150 -0
- package/skills/platform/github-actions/refs/templates.md +230 -0
- package/skills/platform/github-actions/refs/troubleshooting.md +174 -0
- package/skills/platform/github-actions/scripts/workflow_gen.py +215 -0
- package/skills/platform/gitlab-ci/SKILL.md +140 -0
- package/skills/platform/gitlab-ci/refs/templates.md +223 -0
- package/skills/platform/gitlab-ci/refs/troubleshooting.md +213 -0
- package/skills/platform/glab-cli/SKILL.md +133 -0
- package/skills/platform/glab-cli/refs/ci-debugging.md +95 -0
- package/skills/platform/glab-cli/refs/glab-ops.md +78 -0
- package/skills/platform/glab-cli/refs/patterns.md +131 -0
- package/skills/platform/glab-cli/scripts/glab_ops.py +313 -0
- package/skills/platform/health/SKILL.md +177 -0
- package/skills/platform/health/refs/health.md +72 -0
- package/skills/platform/health/refs/sources.md +302 -0
- package/skills/platform/incident/refs/incident.md +136 -0
- package/skills/platform/infra/refs/infra.md +104 -0
- package/skills/platform/observability/SKILL.md +128 -0
- package/skills/platform/observability/refs/toolchain-discovery.md +243 -0
- package/skills/platform/prereq-doctor/SKILL.md +57 -0
- package/skills/platform/prereq-doctor/refs/tool-registry.md +58 -0
- package/skills/platform/traces/refs/traces.md +101 -0
- package/skills/product/acceptance-criteria/SKILL.md +193 -0
- package/skills/product/acceptance-criteria/refs/ac-anti-patterns.md +291 -0
- package/skills/product/acceptance-criteria/refs/ac-examples.md +277 -0
- package/skills/product/accessibility/SKILL.md +197 -0
- package/skills/product/accessibility/refs/aria-patterns-basics.md +250 -0
- package/skills/product/accessibility/refs/aria-patterns-dynamic.md +187 -0
- package/skills/product/accessibility/refs/aria-patterns-interactive.md +246 -0
- package/skills/product/accessibility/refs/audit-report-findings.md +248 -0
- package/skills/product/accessibility/refs/audit-report-results.md +276 -0
- package/skills/product/accessibility/refs/common-violations-html-css.md +270 -0
- package/skills/product/accessibility/refs/common-violations-interactive.md +303 -0
- package/skills/product/accessibility/refs/keyboard-testing-basics.md +222 -0
- package/skills/product/accessibility/refs/keyboard-testing-patterns.md +173 -0
- package/skills/product/accessibility/refs/screen-reader-testing-advanced.md +294 -0
- package/skills/product/accessibility/refs/screen-reader-testing-commands.md +255 -0
- package/skills/product/accessibility/refs/wcag-checklist.md +262 -0
- package/skills/product/analyze/SKILL.md +164 -0
- package/skills/product/analyze/refs/algorithms.md +238 -0
- package/skills/product/analyze/refs/sentiment-patterns.md +180 -0
- package/skills/product/imagery/SKILL.md +97 -0
- package/skills/product/imagery/alter/SKILL.md +105 -0
- package/skills/product/imagery/alter/refs/editing-reference.md +146 -0
- package/skills/product/imagery/create/SKILL.md +109 -0
- package/skills/product/imagery/create/refs/prompt-engineering.md +112 -0
- package/skills/product/imagery/create/refs/provider-reference.md +219 -0
- package/skills/product/imagery/review/SKILL.md +101 -0
- package/skills/product/imagery/review/refs/analysis-lenses.md +136 -0
- package/skills/product/imagery/review/refs/quality-gates.md +153 -0
- package/skills/product/imagery/scripts/analyze.sh +23 -0
- package/skills/product/imagery/scripts/edit.sh +14 -0
- package/skills/product/imagery/scripts/generate.sh +13 -0
- package/skills/product/imagery/scripts/provider.py +787 -0
- package/skills/product/listen/SKILL.md +175 -0
- package/skills/product/listen/refs/channels.md +220 -0
- package/skills/product/mockup/SKILL.md +106 -0
- package/skills/product/mockup/refs/templates.md +95 -0
- package/skills/product/refs/a11y.md +109 -0
- package/skills/product/refs/acceptance.md +79 -0
- package/skills/product/refs/align.md +67 -0
- package/skills/product/refs/analyze.md +77 -0
- package/skills/product/refs/elicit.md +67 -0
- package/skills/product/refs/listen.md +58 -0
- package/skills/product/refs/mockup.md +77 -0
- package/skills/product/refs/screenshot.md +59 -0
- package/skills/product/refs/strategy.md +77 -0
- package/skills/product/refs/synthesize.md +54 -0
- package/skills/product/refs/ux-review.md +68 -0
- package/skills/product/refs/ux.md +101 -0
- package/skills/product/requirements-analysis/SKILL.md +136 -0
- package/skills/product/requirements-analysis/refs/requirements-example-auth.md +264 -0
- package/skills/product/requirements-analysis/refs/requirements-example-export-integration.md +88 -0
- package/skills/product/requirements-analysis/refs/requirements-output-format-template.md +247 -0
- package/skills/product/requirements-analysis/refs/user-story-guide.md +296 -0
- package/skills/product/requirements-graph/SKILL.md +155 -0
- package/skills/product/requirements-graph/refs/examples.md +223 -0
- package/skills/product/requirements-graph/refs/schema.md +162 -0
- package/skills/product/requirements-migrate/SKILL.md +90 -0
- package/skills/product/requirements-navigate/SKILL.md +141 -0
- package/skills/product/requirements-navigate/refs/meta-templates.md +141 -0
- package/skills/product/screenshot/SKILL.md +147 -0
- package/skills/product/strategy/SKILL.md +198 -0
- package/skills/product/strategy/refs/frameworks.md +295 -0
- package/skills/product/strategy/refs/templates-competitive-market.md +299 -0
- package/skills/product/strategy/refs/templates-roi-value.md +207 -0
- package/skills/product/synthesize/SKILL.md +116 -0
- package/skills/product/synthesize/refs/journey-mapping.md +212 -0
- package/skills/product/synthesize/refs/prioritization.md +193 -0
- package/skills/product/ux-review/SKILL.md +164 -0
- package/skills/product/visual-direction/SKILL.md +137 -0
- package/skills/product/visual-review/SKILL.md +131 -0
- package/skills/runtime-exec/SKILL.md +138 -0
- package/skills/search/codebase-narrator/SKILL.md +131 -0
- package/skills/search/codebase-narrator/refs/output-template.md +100 -0
- package/skills/smaht/SKILL.md +72 -0
- package/skills/smaht/discovery/SKILL.md +65 -0
- package/skills/smaht/intent/SKILL.md +89 -0
- package/skills/smaht/propose-skills/SKILL.md +142 -0
- package/skills/smaht/refs/state.md +76 -0
- package/skills/swarm/SKILL.md +132 -0
- package/skills/swarm/refs/fan-out.md +104 -0
- package/skills/swarm/refs/independent-verification.md +86 -0
- package/skills/swarm/refs/receipts-and-evidence.md +69 -0
- package/skills/swarm/refs/recon-synthesis.md +87 -0
- package/skills/swarm/refs/ship-discipline.md +90 -0
- package/skills/wickedizer/SKILL.md +147 -0
- package/skills/wickedizer/refs/artifact-types.md +238 -0
- package/skills/wickedizer/refs/complexity.md +278 -0
- package/skills/wickedizer/refs/de-ai-pass.md +140 -0
- package/skills/wickedizer/refs/failure-modes.md +249 -0
- package/skills/wickedizer/refs/patterns.md +282 -0
- package/skills/wickedizer/refs/review.md +221 -0
- package/skills/wickedizer/refs/structure.md +282 -0
- package/skills/wickedizer/refs/voice-profile.md +125 -0
- package/skills/workflow/SKILL.md +132 -0
- package/skills/workflow/refs/archetype-adjustments.md +205 -0
- package/skills/workflow/refs/evidence.md +58 -0
- package/skills/workflow/refs/integration.md +130 -0
- package/skills/workflow/refs/risk-dimension-signals.md +260 -0
- package/skills/workflow/refs/scoring-rubric.md +49 -0
- package/skills/workflow/refs/signal-keywords.md +176 -0
- package/skills/workflow/refs/specialist-routing-rules.md +159 -0
- package/skills/worktrees/SKILL.md +87 -0
- 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
|