@mindrian_os/cli 2.0.0-beta.29 → 2.0.0-beta.31
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/plugin.json +21 -0
- package/.mcp.json +14 -0
- package/CHANGELOG.md +41 -0
- package/agents/analogy-query-fetcher.md +119 -0
- package/agents/brain-query.md +91 -0
- package/agents/competitor-watch-fetcher.md +94 -0
- package/agents/framework-runner.md +258 -0
- package/agents/grading.md +216 -0
- package/agents/grant-reviewer.md +191 -0
- package/agents/investor.md +141 -0
- package/agents/larry-extended.md +215 -0
- package/agents/meeting-perspective-extractor.md +94 -0
- package/agents/opportunity-scanner.md +105 -0
- package/agents/persona-analyst.md +201 -0
- package/agents/research.md +103 -0
- package/agents/reverse-salient-agent.md +42 -0
- package/agents/vault-section-reviewer.md +107 -0
- package/assets/banner-showcase.html +537 -0
- package/assets/fonts/BebasNeue-Regular.ttf +0 -0
- package/assets/fonts/Inter-Bold.ttf +0 -0
- package/assets/fonts/Inter-Regular.ttf +0 -0
- package/assets/logo.svg +10 -0
- package/bin/local-chain-recommender.cjs +256 -0
- package/bin/mindrian-brain-mcp-client.cjs +319 -0
- package/bin/mindrian-mcp-server.cjs +445 -0
- package/bin/mindrian-mcp-shim.cjs +100 -0
- package/bin/mindrian-tools.cjs +784 -0
- package/commands/act.md +529 -0
- package/commands/admin.md +439 -0
- package/commands/agentshield.md +49 -0
- package/commands/analyze-needs.md +78 -0
- package/commands/analyze-systems.md +73 -0
- package/commands/analyze-timing.md +98 -0
- package/commands/auto-explore.md +85 -0
- package/commands/beautiful-question.md +76 -0
- package/commands/bono.md +152 -0
- package/commands/brain-derive.md +137 -0
- package/commands/build-knowledge.md +121 -0
- package/commands/build-thesis.md +94 -0
- package/commands/causal.md +269 -0
- package/commands/challenge-assumptions.md +78 -0
- package/commands/compare-ventures.md +117 -0
- package/commands/correct-reference-now.md +88 -0
- package/commands/dashboard.md +144 -0
- package/commands/deck.md +117 -0
- package/commands/deep-grade.md +214 -0
- package/commands/diagnose.md +131 -0
- package/commands/diagnostics.md +195 -0
- package/commands/dial-memory-refresh.md +113 -0
- package/commands/diffusion.md +129 -0
- package/commands/discover.md +221 -0
- package/commands/doctor.md +271 -0
- package/commands/dogfood-flush.md +130 -0
- package/commands/dominant-designs.md +76 -0
- package/commands/eureka.md +315 -0
- package/commands/explain-decision.md +135 -0
- package/commands/explore-domains.md +78 -0
- package/commands/explore-futures.md +67 -0
- package/commands/explore-opportunity.md +172 -0
- package/commands/explore-trends.md +78 -0
- package/commands/export.md +128 -0
- package/commands/feynman-timeline-refresh.md +102 -0
- package/commands/file-meeting.md +1195 -0
- package/commands/find-analogies.md +369 -0
- package/commands/find-bottlenecks.md +108 -0
- package/commands/find-connections.md +111 -0
- package/commands/funding.md +114 -0
- package/commands/futures.md +128 -0
- package/commands/grade-grant.md +297 -0
- package/commands/grade.md +257 -0
- package/commands/graph.md +218 -0
- package/commands/hat-briefing.md +163 -0
- package/commands/heal.md +72 -0
- package/commands/help.md +176 -0
- package/commands/hmi-status.md +75 -0
- package/commands/ignite.md +229 -0
- package/commands/ingest-methodology.md +128 -0
- package/commands/intel-pipeline.md +133 -0
- package/commands/jtbd.md +262 -0
- package/commands/leadership.md +113 -0
- package/commands/lean-canvas.md +74 -0
- package/commands/macro-trends.md +88 -0
- package/commands/map-unknowns.md +76 -0
- package/commands/memory-cortex-reach.md +79 -0
- package/commands/memory.md +213 -0
- package/commands/models.md +200 -0
- package/commands/mos-reason.md +489 -0
- package/commands/mos.md +162 -0
- package/commands/mullins.md +155 -0
- package/commands/mva-brief.md +86 -0
- package/commands/mva-option.md +119 -0
- package/commands/mva-report.md +76 -0
- package/commands/new-project.md +633 -0
- package/commands/new-surface.md +116 -0
- package/commands/onboard.md +489 -0
- package/commands/operator.md +168 -0
- package/commands/opportunities.md +177 -0
- package/commands/organize.md +74 -0
- package/commands/persona.md +276 -0
- package/commands/pipeline.md +167 -0
- package/commands/present.md +125 -0
- package/commands/publish.md +227 -0
- package/commands/pws-brain.md +154 -0
- package/commands/qualify-opportunity.md +113 -0
- package/commands/query.md +70 -0
- package/commands/radar.md +110 -0
- package/commands/reanalyze.md +124 -0
- package/commands/research.md +467 -0
- package/commands/room.md +385 -0
- package/commands/rooms.md +682 -0
- package/commands/root-cause.md +77 -0
- package/commands/rs-experts.md +153 -0
- package/commands/rs-explain.md +134 -0
- package/commands/rs-fetch.md +119 -0
- package/commands/rs-thesis.md +131 -0
- package/commands/scenario-plan.md +80 -0
- package/commands/scheduled-tasks.md +308 -0
- package/commands/score-innovation.md +78 -0
- package/commands/scout.md +379 -0
- package/commands/setup.md +658 -0
- package/commands/show.md +71 -0
- package/commands/skill.md +108 -0
- package/commands/snapshot.md +179 -0
- package/commands/speakers.md +118 -0
- package/commands/splash.md +55 -0
- package/commands/stance.md +91 -0
- package/commands/status.md +109 -0
- package/commands/structure-argument.md +82 -0
- package/commands/suggest-next.md +141 -0
- package/commands/systems-thinking.md +224 -0
- package/commands/think-hats.md +86 -0
- package/commands/trending-to-absurd.md +151 -0
- package/commands/update.md +256 -0
- package/commands/user-needs.md +77 -0
- package/commands/validate.md +77 -0
- package/commands/value-proposition.md +116 -0
- package/commands/vault.md +330 -0
- package/commands/visualize.md +71 -0
- package/commands/whitespace.md +541 -0
- package/commands/wiki.md +96 -0
- package/data/ROOM.md +47 -0
- package/data/brain-census.generated.json +2617 -0
- package/data/brain-orchestration-projection.json +4973 -0
- package/data/brain-packet-schema.json +545 -0
- package/data/brain-surface-contract.json +32 -0
- package/data/capability-ledger.json +391 -0
- package/data/capability-map-registry.json +23 -0
- package/data/command-registry.json +2433 -0
- package/data/connector-coverage-ledger.json +1618 -0
- package/data/connector-out-of-spine-allowlist.json +71 -0
- package/data/connector-registry.json +3637 -0
- package/data/corpus-stats-source.json +11 -0
- package/data/corpus-stats.generated.json +10 -0
- package/data/cross-domain-analogues.json +15 -0
- package/data/deck-aliases.json +6 -0
- package/data/deck-styles.json +85 -0
- package/data/deployment-surfaces.json +69 -0
- package/data/dispatch-framework-map.json +18 -0
- package/data/doctor-modules.json +206 -0
- package/data/dual-graph-health-baseline.json +12 -0
- package/data/eureka-critic-tags.json +32 -0
- package/data/first-reward-surfaces.json +66 -0
- package/data/first-touch-surfaces.json +60 -0
- package/data/flagship-floor-set.json +37 -0
- package/data/framework-names.json +121 -0
- package/data/grant-rubric-fixtures/early-stage-pre-seed.json +18 -0
- package/data/grant-rubric-fixtures/early-stage-round-a.json +18 -0
- package/data/grant-rubric-fixtures/early-stage-seed.json +18 -0
- package/data/grant-rubric-fixtures/hybrid-seed-incentive.json +18 -0
- package/data/grant-rubric-fixtures/rd-fund.json +18 -0
- package/data/grant-rubric-fixtures/regional-innovation-incubators.json +18 -0
- package/data/grant-rubric-fixtures/technology-incubators.json +18 -0
- package/data/grant-rubric-fixtures/tnufa.json +167 -0
- package/data/grant-rubric-schema.json +33 -0
- package/data/harness-fixtures/converged-room/.context/ROOM.md +13 -0
- package/data/harness-fixtures/converged-room/.intelligence/ROOM.md +13 -0
- package/data/harness-fixtures/converged-room/.snapshots/ROOM.md +13 -0
- package/data/harness-fixtures/converged-room/MINTO.md +19 -0
- package/data/harness-fixtures/converged-room/STATE.md +73 -0
- package/data/harness-fixtures/converged-room/USER.md +23 -0
- package/data/harness-fixtures/converged-room/assets/ROOM.md +13 -0
- package/data/harness-fixtures/converged-room/business-model/CONTEXT.md +32 -0
- package/data/harness-fixtures/converged-room/business-model/ROOM.md +36 -0
- package/data/harness-fixtures/converged-room/competitive-analysis/CONTEXT.md +33 -0
- package/data/harness-fixtures/converged-room/competitive-analysis/ROOM.md +35 -0
- package/data/harness-fixtures/converged-room/financial-model/CONTEXT.md +30 -0
- package/data/harness-fixtures/converged-room/financial-model/ROOM.md +35 -0
- package/data/harness-fixtures/converged-room/funding/CONTEXT.md +41 -0
- package/data/harness-fixtures/converged-room/funding/ROOM.md +35 -0
- package/data/harness-fixtures/converged-room/legal-ip/CONTEXT.md +30 -0
- package/data/harness-fixtures/converged-room/legal-ip/ROOM.md +35 -0
- package/data/harness-fixtures/converged-room/market-analysis/CONTEXT.md +32 -0
- package/data/harness-fixtures/converged-room/market-analysis/ROOM.md +35 -0
- package/data/harness-fixtures/converged-room/opportunity-bank/CONTEXT.md +39 -0
- package/data/harness-fixtures/converged-room/opportunity-bank/ROOM.md +36 -0
- package/data/harness-fixtures/converged-room/problem-definition/CONTEXT.md +32 -0
- package/data/harness-fixtures/converged-room/problem-definition/ROOM.md +36 -0
- package/data/harness-fixtures/converged-room/references/ROOM.md +13 -0
- package/data/harness-fixtures/converged-room/references/SECTION-SCHEMA.md +213 -0
- package/data/harness-fixtures/converged-room/references/SUB-SCHEMAS.md +91 -0
- package/data/harness-fixtures/converged-room/solution-design/CONTEXT.md +36 -0
- package/data/harness-fixtures/converged-room/solution-design/ROOM.md +36 -0
- package/data/harness-fixtures/converged-room/strategy/CONTEXT.md +35 -0
- package/data/harness-fixtures/converged-room/strategy/ROOM.md +35 -0
- package/data/harness-fixtures/converged-room/team/ROOM.md +13 -0
- package/data/harness-fixtures/converged-room/team-execution/CONTEXT.md +36 -0
- package/data/harness-fixtures/converged-room/team-execution/ROOM.md +35 -0
- package/data/harness-manifest.json +74 -0
- package/data/harness-policies/CONTEXT.md +55 -0
- package/data/harness-policies/_schema.json +42 -0
- package/data/harness-policies/contract-parity-larry.json +63 -0
- package/data/harness-policies/gate-card-fire.json +13 -0
- package/data/harness-policies/gate-graph-derive-health.json +13 -0
- package/data/harness-policies/gate-shape-declaration.json +13 -0
- package/data/harness-policies/gate-tool-honesty.json +13 -0
- package/data/harness-policies/gate-worktree-hygiene.json +13 -0
- package/data/harness-policies/memory-write-policy.json +28 -0
- package/data/harness-policies/registry-drift.json +13 -0
- package/data/harness-policies/release-payload-ceiling.json +13 -0
- package/data/harness-policies/voice-backend-noun-free.json +13 -0
- package/data/harness-policies/voice-fork-as-card.json +13 -0
- package/data/harness-policies/voice-glyph-present.json +13 -0
- package/data/harness-policies/voice-hyphens-only.json +13 -0
- package/data/help-groups.json +236 -0
- package/data/hitl-shape-backfill.json +777 -0
- package/data/hitl-shape-declaration-fixtures/invalid-bad-shape.json +5 -0
- package/data/hitl-shape-declaration-fixtures/invalid-missing-why.json +4 -0
- package/data/hitl-shape-declaration-fixtures/invalid-ranker-contradiction.json +6 -0
- package/data/hitl-shape-declaration-fixtures/invalid-skill-gap.json +3 -0
- package/data/hitl-shape-declaration-fixtures/valid-multi-stage.json +7 -0
- package/data/hitl-shape-declaration-fixtures/valid-single-shape.json +5 -0
- package/data/hitl-shape-declaration-fixtures/valid-skill-exempt.json +5 -0
- package/data/hitl-shape-declaration-schema.json +34 -0
- package/data/hitl-stages-fixtures/bono.json +10 -0
- package/data/hitl-stages-fixtures/pipeline-1.json +9 -0
- package/data/hitl-stages-fixtures/pipeline-2.json +9 -0
- package/data/hitl-stages-fixtures/pipeline-3.json +10 -0
- package/data/hitl-stages-fixtures/research.json +10 -0
- package/data/hitl-stages-fixtures/rs-convergence.json +10 -0
- package/data/hitl-stages-fixtures/rs-family.json +11 -0
- package/data/hitl-stages-fixtures/rs-reverse-salient.json +10 -0
- package/data/hitl-stages-fixtures/trending-to-absurd.json +11 -0
- package/data/hitl-stages-schema.json +26 -0
- package/data/mcp-tool-connectors.json +464 -0
- package/data/mva-agent-prompts.json +31 -0
- package/data/mva-deck-template.html +15 -0
- package/data/mva-heuristic-keywords.json +35 -0
- package/data/orchestration-command-ledger.json +576 -0
- package/data/orchestration-unwired-allowlist.json +6 -0
- package/data/portfolio-ahp-matrix.json +16 -0
- package/data/publish-needs.json +76 -0
- package/data/render-coverage-registry.json +1152 -0
- package/data/research-sources.json +58 -0
- package/data/roadmap-type-chains.json +28 -0
- package/data/room-blueprints.json +156 -0
- package/data/subagent-dispatch-grants.json +150 -0
- package/hooks/hooks.json +493 -0
- package/hooks/run-hook.cmd +64 -0
- package/lib/__init__.py +0 -0
- package/lib/__pycache__/__init__.cpython-312.pyc +0 -0
- package/lib/agents/auto-explore-agent.cjs +1163 -0
- package/lib/agents/mva/brain-classic-traps.cjs +55 -0
- package/lib/agents/mva/brain-cross-domain.cjs +79 -0
- package/lib/agents/mva/brain-similar-ventures.cjs +93 -0
- package/lib/agents/mva/dashboard-graph-neighborhood.cjs +72 -0
- package/lib/agents/mva/index.cjs +42 -0
- package/lib/agents/mva/six-hats-red-black.cjs +137 -0
- package/lib/agents/mva/tavily-funding-scan.cjs +147 -0
- package/lib/agents/mva/test-all-six-agents.cjs +467 -0
- package/lib/agents/reverse-salient-agent.cjs +757 -0
- package/lib/agents/tension-hook-agent.cjs +586 -0
- package/lib/brain/ROOM.md +44 -0
- package/lib/brain/chain-recommender.cjs +784 -0
- package/lib/brain/curation-batch.cjs +519 -0
- package/lib/brain/framework-chain-slice.cjs +252 -0
- package/lib/brain/hypergraph-event-schema.cjs +184 -0
- package/lib/chat/chat-context.js +185 -0
- package/lib/chat/chat-panel.js +721 -0
- package/lib/chat/fabric-chat.cjs +288 -0
- package/lib/chat/generative-tools.js +219 -0
- package/lib/conversation/ROOM.md +39 -0
- package/lib/conversation/classifier-rules.json +38 -0
- package/lib/conversation/classifier.cjs +264 -0
- package/lib/conversation/operator-epistemic-cap.test.cjs +156 -0
- package/lib/conversation/operator.cjs +492 -0
- package/lib/conversation/operator.test.cjs +160 -0
- package/lib/copy/115-spec-strings.cjs +55 -0
- package/lib/core/__init__.py +0 -0
- package/lib/core/__nav-stub.cjs +14 -0
- package/lib/core/__pycache__/__init__.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs-math.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_cache.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_corpus.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_corpus_exclude.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_hybrid.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_math.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_rooms.cpython-312.pyc +0 -0
- package/lib/core/abstraction-gate.cjs +133 -0
- package/lib/core/act-jtbd-blurb.cjs +231 -0
- package/lib/core/artifact-id.cjs +148 -0
- package/lib/core/asset-ops.cjs +151 -0
- package/lib/core/auto-commit-throttle.cjs +129 -0
- package/lib/core/bearer-token.cjs +199 -0
- package/lib/core/behavioral/observation-schema.cjs +86 -0
- package/lib/core/bono/cell-fanout.cjs +305 -0
- package/lib/core/bono/debate-composition.cjs +495 -0
- package/lib/core/bono/hat-governance.cjs +367 -0
- package/lib/core/bono/persona-research.cjs +288 -0
- package/lib/core/bono/reviewer-governance.cjs +331 -0
- package/lib/core/brain-client.cjs +2365 -0
- package/lib/core/brain-derivation-prompts.cjs +331 -0
- package/lib/core/brain-derivation-queue.cjs +535 -0
- package/lib/core/brain-derivation.cjs +740 -0
- package/lib/core/brain-md-schema.cjs +528 -0
- package/lib/core/brain-md-staleness.cjs +357 -0
- package/lib/core/brain-response-sanitize.cjs +396 -0
- package/lib/core/breakthrough/canary.cjs +134 -0
- package/lib/core/breakthrough/canary.test.cjs +136 -0
- package/lib/core/breakthrough/detectors.cjs +359 -0
- package/lib/core/breakthrough/detectors.test.cjs +333 -0
- package/lib/core/breakthrough/ethics-fence.cjs +129 -0
- package/lib/core/breakthrough/ethics-fence.test.cjs +178 -0
- package/lib/core/breakthrough/resurfacing.cjs +150 -0
- package/lib/core/breakthrough/resurfacing.test.cjs +233 -0
- package/lib/core/breakthrough/review-queue.cjs +168 -0
- package/lib/core/breakthrough/review-queue.test.cjs +160 -0
- package/lib/core/breakthrough/scanner-d17-d18.test.cjs +229 -0
- package/lib/core/breakthrough/scanner.cjs +435 -0
- package/lib/core/breakthrough/scanner.test.cjs +267 -0
- package/lib/core/breakthrough/schema.cjs +180 -0
- package/lib/core/breakthrough/schema.test.cjs +256 -0
- package/lib/core/breakthrough/scoring.cjs +293 -0
- package/lib/core/breakthrough/scoring.test.cjs +423 -0
- package/lib/core/breakthrough/verb-dispatch.cjs +230 -0
- package/lib/core/breakthrough/verb-dispatch.test.cjs +185 -0
- package/lib/core/breakthrough/voice-scaffold.cjs +249 -0
- package/lib/core/breakthrough/voice-scaffold.test.cjs +251 -0
- package/lib/core/bridge-writer.cjs +477 -0
- package/lib/core/cache-prune.cjs +314 -0
- package/lib/core/card-fire-gate.cjs +107 -0
- package/lib/core/card-fire-sidechannel.cjs +518 -0
- package/lib/core/chain-executor.cjs +939 -0
- package/lib/core/chain-retry.cjs +214 -0
- package/lib/core/chain-step-dispatcher.cjs +397 -0
- package/lib/core/chat-context-builder.cjs +253 -0
- package/lib/core/check-plugin-enabled.cjs +145 -0
- package/lib/core/close-loop-writer.cjs +492 -0
- package/lib/core/command-registration-check.cjs +246 -0
- package/lib/core/correlation-label-index.cjs +230 -0
- package/lib/core/correlation.cjs +112 -0
- package/lib/core/coverage-monitor.cjs +183 -0
- package/lib/core/coverage-rollup.cjs +232 -0
- package/lib/core/cross-room-aggregator.cjs +1127 -0
- package/lib/core/cross-room-store.cjs +292 -0
- package/lib/core/cross-room-triggers.cjs +222 -0
- package/lib/core/daily-briefing.cjs +438 -0
- package/lib/core/decision-axes.cjs +178 -0
- package/lib/core/decision-capture.cjs +618 -0
- package/lib/core/deck-design-rules.cjs +211 -0
- package/lib/core/deep-links.cjs +82 -0
- package/lib/core/directive-envelope.cjs +217 -0
- package/lib/core/directive-envelope.test.cjs +225 -0
- package/lib/core/dispatch-optimizer.cjs +354 -0
- package/lib/core/doc-text-extractor.cjs +133 -0
- package/lib/core/doctor/capability-ledger-module.cjs +170 -0
- package/lib/core/doctor/card-fire-health-module.cjs +159 -0
- package/lib/core/doctor/cascade-rooms-active-module.cjs +127 -0
- package/lib/core/doctor/cascade-rooms-module.cjs +184 -0
- package/lib/core/doctor/class-m-brain-smoke.cjs +479 -0
- package/lib/core/doctor/class-m-brain-smoke.test.cjs +448 -0
- package/lib/core/doctor/class-s-eureka-smoke.cjs +380 -0
- package/lib/core/doctor/deployment-surfaces-module.cjs +408 -0
- package/lib/core/doctor/deprecated-usage-module.cjs +155 -0
- package/lib/core/doctor/eureka-fts-health-module.cjs +236 -0
- package/lib/core/doctor/graph-derive-heal-retrofit-module.cjs +148 -0
- package/lib/core/doctor/graph-derive-health-module.cjs +486 -0
- package/lib/core/doctor/install-incomplete-module.cjs +320 -0
- package/lib/core/doctor/install-state-module.cjs +503 -0
- package/lib/core/doctor/mcp-surface-module.cjs +369 -0
- package/lib/core/doctor/mode-select-checkpoint-module.cjs +113 -0
- package/lib/core/doctor/plugin-enabled-state-module.cjs +86 -0
- package/lib/core/doctor/room-graph-density-module.cjs +181 -0
- package/lib/core/doctor/room-md-module.cjs +198 -0
- package/lib/core/doctor/shared.cjs +555 -0
- package/lib/core/doctor/stale-first-touch-copy-module.cjs +83 -0
- package/lib/core/doctor/statusline-visibility-module.cjs +295 -0
- package/lib/core/doctor/ui-compliance-module.cjs +223 -0
- package/lib/core/doctor/umbilical-module.cjs +486 -0
- package/lib/core/doctor/verify-surface-module.cjs +82 -0
- package/lib/core/doctor/voice-style-log-module.cjs +146 -0
- package/lib/core/domain-insight-sweep.cjs +224 -0
- package/lib/core/drift-baseline.cjs +362 -0
- package/lib/core/drift-runtime-reachability.cjs +283 -0
- package/lib/core/dual-path-detector.cjs +84 -0
- package/lib/core/dual-path-detector.test.cjs +334 -0
- package/lib/core/enrichment-queue.cjs +636 -0
- package/lib/core/eureka/ahp-weights.cjs +232 -0
- package/lib/core/eureka/analogy-fitness.cjs +326 -0
- package/lib/core/eureka/compression-meter.cjs +165 -0
- package/lib/core/eureka/embedding-classifier.cjs +226 -0
- package/lib/core/eureka/embedding-spine.cjs +563 -0
- package/lib/core/eureka/entity-classifier.cjs +232 -0
- package/lib/core/eureka/entity-extractor.cjs +356 -0
- package/lib/core/eureka/eureka-enable.cjs +228 -0
- package/lib/core/eureka/eureka-offer.cjs +225 -0
- package/lib/core/eureka/eureka-reach-runner.cjs +430 -0
- package/lib/core/eureka/explore-chain.cjs +834 -0
- package/lib/core/eureka/explored-artifact.cjs +456 -0
- package/lib/core/eureka/fts-index-lifecycle.cjs +265 -0
- package/lib/core/eureka/grade-grant-examine.cjs +544 -0
- package/lib/core/eureka/grade-grant.cjs +596 -0
- package/lib/core/eureka/hybrid-retrieve.cjs +256 -0
- package/lib/core/eureka/lateral-engine-adapter.cjs +118 -0
- package/lib/core/eureka/lexical-overlap.cjs +98 -0
- package/lib/core/eureka/online-pattern-query.cjs +142 -0
- package/lib/core/eureka/opportunity-harvest.cjs +752 -0
- package/lib/core/eureka/opportunity-statement.cjs +519 -0
- package/lib/core/eureka/portfolio-dimensions.cjs +255 -0
- package/lib/core/eureka/qualify-opportunity.cjs +607 -0
- package/lib/core/eureka/reasoning-mode.cjs +481 -0
- package/lib/core/eureka/report-html.cjs +368 -0
- package/lib/core/eureka/research-filing.cjs +547 -0
- package/lib/core/eureka/room-native-substrate.cjs +343 -0
- package/lib/core/eureka/tail-quadrant.cjs +177 -0
- package/lib/core/eureka/tri-modal-index.cjs +564 -0
- package/lib/core/eureka/vector-store.cjs +414 -0
- package/lib/core/eureka-critic.cjs +733 -0
- package/lib/core/eureka-deps-resolver.cjs +179 -0
- package/lib/core/expert-genesis.cjs +437 -0
- package/lib/core/expert-library.cjs +303 -0
- package/lib/core/exports-log.cjs +79 -0
- package/lib/core/feynman/ROOM.md +25 -0
- package/lib/core/feynman/dial-memory-renderer.cjs +279 -0
- package/lib/core/feynman/dial-memory-runner.cjs +173 -0
- package/lib/core/feynman/feynman-seed-writer.cjs +187 -0
- package/lib/core/feynman/timeline-renderer.cjs +197 -0
- package/lib/core/feynman/timeline-runner.cjs +281 -0
- package/lib/core/feynman-minto-invariants.cjs +609 -0
- package/lib/core/findings-wirer.cjs +360 -0
- package/lib/core/first-touch-version-stamper.cjs +113 -0
- package/lib/core/folder-memory-async.cjs +424 -0
- package/lib/core/folder-memory-shared.cjs +890 -0
- package/lib/core/folder-memory.cjs +546 -0
- package/lib/core/framework-chain-composer.cjs +583 -0
- package/lib/core/frontmatter-schemas.cjs +468 -0
- package/lib/core/fusion-router.cjs +540 -0
- package/lib/core/futures/causal-cue.cjs +91 -0
- package/lib/core/futures/orchestrator.cjs +1391 -0
- package/lib/core/futures/subsystem-render.cjs +164 -0
- package/lib/core/gate-relevance.cjs +278 -0
- package/lib/core/git-ops.cjs +141 -0
- package/lib/core/graph-backfill.cjs +562 -0
- package/lib/core/graph-candidate-producer.cjs +235 -0
- package/lib/core/graph-derivation.cjs +546 -0
- package/lib/core/graph-derive-classifier.cjs +352 -0
- package/lib/core/graph-ops.cjs +274 -0
- package/lib/core/graph-refine-loop.cjs +194 -0
- package/lib/core/graph-self-heal.cjs +289 -0
- package/lib/core/greeting-intent-detector.cjs +201 -0
- package/lib/core/grill-engine.cjs +459 -0
- package/lib/core/hat-persistence.cjs +274 -0
- package/lib/core/hsi-engine.cjs +439 -0
- package/lib/core/hsi-lsa.cjs +246 -0
- package/lib/core/hsi-spectral.cjs +554 -0
- package/lib/core/hsi-to-graph.test.cjs +168 -0
- package/lib/core/icm-forest.cjs +703 -0
- package/lib/core/ignite-branch-gate.cjs +66 -0
- package/lib/core/index.cjs +60 -0
- package/lib/core/insight-sensors.cjs +1000 -0
- package/lib/core/install-state.cjs +242 -0
- package/lib/core/integration-registry.cjs +232 -0
- package/lib/core/intel-pipeline.cjs +545 -0
- package/lib/core/intelligence-cascade.cjs +852 -0
- package/lib/core/issue-tree.cjs +269 -0
- package/lib/core/larry-thinness-acknowledgment.cjs +64 -0
- package/lib/core/larry-thinness-acknowledgment.test.cjs +97 -0
- package/lib/core/lazygraph-ops.cjs +1453 -0
- package/lib/core/lens-engine.cjs +434 -0
- package/lib/core/leverage-scan.cjs +218 -0
- package/lib/core/llm-name-suggester.cjs +194 -0
- package/lib/core/llm-name-suggester.test.cjs +132 -0
- package/lib/core/lru-cache.cjs +139 -0
- package/lib/core/mcp-dep-heal.cjs +475 -0
- package/lib/core/mcp-dep-heal.test.cjs +253 -0
- package/lib/core/mcp-profiles.cjs +185 -0
- package/lib/core/meeting-ops.cjs +54 -0
- package/lib/core/memory/governance-candidate-raiser.cjs +205 -0
- package/lib/core/memory/governance-candidate.cjs +95 -0
- package/lib/core/memory/reconcile-memory-runner.cjs +653 -0
- package/lib/core/memory-ops.cjs +641 -0
- package/lib/core/meter/gate-density-reader.cjs +112 -0
- package/lib/core/meter/transfer-reader.cjs +276 -0
- package/lib/core/meter/two-gauge.cjs +245 -0
- package/lib/core/methodology-ingest.cjs +346 -0
- package/lib/core/metrics/larryreach-loop-health.cjs +142 -0
- package/lib/core/migration-snapshot.cjs +287 -0
- package/lib/core/migration-snapshot.test.cjs +174 -0
- package/lib/core/migrations/ROOM.md +33 -0
- package/lib/core/migrations/phase-109-nodes-provenance.cjs +400 -0
- package/lib/core/migrations/phase-109-session-focus.cjs +99 -0
- package/lib/core/migrations/phase-160-nodes-bitemporal.cjs +168 -0
- package/lib/core/migrations/phase-160-nodes-bitemporal.test.cjs +140 -0
- package/lib/core/migrations/phase-162-section-nodes.cjs +156 -0
- package/lib/core/migrations/phase-222-ranker-weights.cjs +62 -0
- package/lib/core/migrations/phase-224-edge-review-status.cjs +87 -0
- package/lib/core/mindrian-brain-shim.test.cjs +221 -0
- package/lib/core/mode-select-sidechannel.cjs +259 -0
- package/lib/core/model-profiles.cjs +246 -0
- package/lib/core/mullins-scaffold.cjs +258 -0
- package/lib/core/mullins-scaffold.test.cjs +128 -0
- package/lib/core/mva-agent-contract.cjs +170 -0
- package/lib/core/mva-agent-contract.test.cjs +169 -0
- package/lib/core/mva-budget.cjs +75 -0
- package/lib/core/mva-budget.test.cjs +68 -0
- package/lib/core/mva-classifier.cjs +392 -0
- package/lib/core/mva-classifier.test.cjs +248 -0
- package/lib/core/mva-deck-builder.cjs +452 -0
- package/lib/core/mva-deck-builder.test.cjs +287 -0
- package/lib/core/mva-detect.smoke.test.cjs +209 -0
- package/lib/core/mva-dispatcher.cjs +110 -0
- package/lib/core/mva-dispatcher.test.cjs +216 -0
- package/lib/core/mva-option-router.cjs +414 -0
- package/lib/core/mva-option-router.test.cjs +483 -0
- package/lib/core/mva-orchestrator.cjs +365 -0
- package/lib/core/mva-orchestrator.test.cjs +916 -0
- package/lib/core/mva-progressive-renderer.cjs +194 -0
- package/lib/core/mva-progressive-renderer.test.cjs +157 -0
- package/lib/core/mva-rule-linter.cjs +458 -0
- package/lib/core/mva-rule-linter.test.cjs +484 -0
- package/lib/core/mva-state.cjs +159 -0
- package/lib/core/mva-telemetry.cjs +58 -0
- package/lib/core/mva-telemetry.test.cjs +196 -0
- package/lib/core/mva-vercel-deploy.cjs +168 -0
- package/lib/core/mva-vercel-deploy.test.cjs +239 -0
- package/lib/core/nav-dial.cjs +440 -0
- package/lib/core/navigation/ROOM.md +15 -0
- package/lib/core/navigation/abstraction-claim.cjs +185 -0
- package/lib/core/navigation/calibration-gate.cjs +284 -0
- package/lib/core/navigation/calibration-log.cjs +141 -0
- package/lib/core/navigation/confirm-node.cjs +73 -0
- package/lib/core/navigation/dashboard-helpers.cjs +145 -0
- package/lib/core/navigation/edges.cjs +1150 -0
- package/lib/core/navigation/evidence-claim.cjs +186 -0
- package/lib/core/navigation/explanation.cjs +48 -0
- package/lib/core/navigation/file-evidence-readback.cjs +242 -0
- package/lib/core/navigation/focus.cjs +155 -0
- package/lib/core/navigation/get-domains-for-trends.cjs +277 -0
- package/lib/core/navigation/governance.cjs +101 -0
- package/lib/core/navigation/grant-rubric.cjs +218 -0
- package/lib/core/navigation/graph-export.cjs +325 -0
- package/lib/core/navigation/ingestion.cjs +109 -0
- package/lib/core/navigation/insights-stale.test.cjs +127 -0
- package/lib/core/navigation/insights.cjs +574 -0
- package/lib/core/navigation/lens-nodes.cjs +315 -0
- package/lib/core/navigation/memory-artifacts.cjs +437 -0
- package/lib/core/navigation/memory-cortex-packet.cjs +274 -0
- package/lib/core/navigation/memory-events.cjs +811 -0
- package/lib/core/navigation/neighborhood.cjs +79 -0
- package/lib/core/navigation/packet.cjs +420 -0
- package/lib/core/navigation/planning-artifacts.cjs +219 -0
- package/lib/core/navigation/projections.cjs +295 -0
- package/lib/core/navigation/ranker-weights.cjs +133 -0
- package/lib/core/navigation/reasoning-write.cjs +211 -0
- package/lib/core/navigation/reconcile-guard.cjs +98 -0
- package/lib/core/navigation/reified-claim.cjs +287 -0
- package/lib/core/navigation/research-preflight.cjs +156 -0
- package/lib/core/navigation/room-birth.cjs +1213 -0
- package/lib/core/navigation/room-context.cjs +380 -0
- package/lib/core/navigation/room-home.cjs +142 -0
- package/lib/core/navigation/spine-events.cjs +548 -0
- package/lib/core/navigation/synthetic-expert.cjs +177 -0
- package/lib/core/navigation/transitions.cjs +253 -0
- package/lib/core/navigation/typed-claim.cjs +208 -0
- package/lib/core/navigation/typed-domain.cjs +249 -0
- package/lib/core/navigation/typed-entity.cjs +236 -0
- package/lib/core/navigation/typed-frame.cjs +257 -0
- package/lib/core/navigation/typed-open-question.cjs +130 -0
- package/lib/core/navigation/typed-opportunity.cjs +418 -0
- package/lib/core/navigation-engine-offer.cjs +776 -0
- package/lib/core/navigation-engine-shared.cjs +256 -0
- package/lib/core/navigation-engine.cjs +1696 -0
- package/lib/core/navigation.cjs +686 -0
- package/lib/core/nl-graph-queries.cjs +164 -0
- package/lib/core/node-insert-epistemic.test.cjs +212 -0
- package/lib/core/node-insert-overrides.test.cjs +273 -0
- package/lib/core/node-insert.cjs +274 -0
- package/lib/core/npm-cli-resolve.cjs +151 -0
- package/lib/core/npm-cli-resolve.test.cjs +153 -0
- package/lib/core/npm-install-lock.cjs +326 -0
- package/lib/core/npm-install-lock.test.cjs +379 -0
- package/lib/core/numeric/sklearn-stopwords-v1.json +325 -0
- package/lib/core/numeric/svd.cjs +377 -0
- package/lib/core/numeric/tfidf.cjs +241 -0
- package/lib/core/offer-presenter.cjs +406 -0
- package/lib/core/opportunity-extractor.cjs +183 -0
- package/lib/core/opportunity-ops.cjs +1423 -0
- package/lib/core/orchestration-candidate-lift.cjs +284 -0
- package/lib/core/part8-egress-guard.cjs +536 -0
- package/lib/core/part8-egress-guard.test.cjs +194 -0
- package/lib/core/part8-egress-ontology.cjs +174 -0
- package/lib/core/part8-egress-ontology.test.cjs +133 -0
- package/lib/core/persona-ops.cjs +692 -0
- package/lib/core/persona-override.cjs +327 -0
- package/lib/core/persona-taxonomy.cjs +328 -0
- package/lib/core/pinecone-inference.cjs +176 -0
- package/lib/core/pitch-feedback-schemas.cjs +303 -0
- package/lib/core/planning/artifact-brain-packet.cjs +212 -0
- package/lib/core/planning/reconcile-runner.cjs +347 -0
- package/lib/core/platform-gates.cjs +120 -0
- package/lib/core/platform.cjs +257 -0
- package/lib/core/proactive-intelligence.cjs +528 -0
- package/lib/core/problem-type-router.cjs +315 -0
- package/lib/core/publish-needs-default-lane.cjs +110 -0
- package/lib/core/ralph-loop-gate.cjs +48 -0
- package/lib/core/reader/ab-harness.cjs +177 -0
- package/lib/core/reader/decide-projection-reader.cjs +358 -0
- package/lib/core/reasoning-ops.cjs +639 -0
- package/lib/core/recipe-maps.cjs +442 -0
- package/lib/core/recovery/case-file.cjs +358 -0
- package/lib/core/recovery/controller.cjs +1008 -0
- package/lib/core/recovery/dispatcher.cjs +533 -0
- package/lib/core/recovery/result-semantics.cjs +488 -0
- package/lib/core/recovery/stage-envelope.cjs +338 -0
- package/lib/core/refusal-messaging.cjs +569 -0
- package/lib/core/refusal-messaging.test.cjs +220 -0
- package/lib/core/repo-version.cjs +134 -0
- package/lib/core/research-cache.cjs +165 -0
- package/lib/core/research-cache.test.cjs +137 -0
- package/lib/core/research-context-extractor.cjs +283 -0
- package/lib/core/research-corpus.cjs +814 -0
- package/lib/core/research-corpus.test.cjs +280 -0
- package/lib/core/research-filing-selector.cjs +189 -0
- package/lib/core/resolve-active-room.cjs +602 -0
- package/lib/core/resolve-brain-key.cjs +273 -0
- package/lib/core/resolve-umbilical-target.cjs +288 -0
- package/lib/core/resolve-vercel-key.cjs +107 -0
- package/lib/core/resolve-vercel-key.test.cjs +137 -0
- package/lib/core/reverse-salient-persona-suffix.cjs +115 -0
- package/lib/core/room-auto-create.cjs +318 -0
- package/lib/core/room-auto-create.test.cjs +198 -0
- package/lib/core/room-chooser.cjs +244 -0
- package/lib/core/room-classifier-strict-mode.cjs +235 -0
- package/lib/core/room-db.cjs +348 -0
- package/lib/core/room-discard-cascade.cjs +238 -0
- package/lib/core/room-discard-cascade.test.cjs +135 -0
- package/lib/core/room-name-validator.cjs +132 -0
- package/lib/core/room-name-validator.test.cjs +156 -0
- package/lib/core/room-naming-selector.cjs +357 -0
- package/lib/core/room-naming-selector.test.cjs +277 -0
- package/lib/core/room-open.cjs +259 -0
- package/lib/core/room-ops-async.cjs +92 -0
- package/lib/core/room-ops-shared.cjs +64 -0
- package/lib/core/room-ops-sync.cjs +70 -0
- package/lib/core/room-ops.cjs +32 -0
- package/lib/core/room-receipt-emit.cjs +63 -0
- package/lib/core/room-root.cjs +93 -0
- package/lib/core/room-skeleton-scaffold.cjs +669 -0
- package/lib/core/room-skeleton-scaffold.test.cjs +296 -0
- package/lib/core/room-type-detector.cjs +386 -0
- package/lib/core/rs-backend-dispatch.cjs +64 -0
- package/lib/core/rs-brain-substrate-prompts.cjs +129 -0
- package/lib/core/rs-brain-substrate.cjs +570 -0
- package/lib/core/rs-breakthrough-scorer.cjs +255 -0
- package/lib/core/rs-canon-violations.cjs +82 -0
- package/lib/core/rs-chain-feeder.cjs +381 -0
- package/lib/core/rs-commercial-assessor.cjs +280 -0
- package/lib/core/rs-corpus-quality-gate.cjs +62 -0
- package/lib/core/rs-differential-scorer.cjs +629 -0
- package/lib/core/rs-domain-analyzer.cjs +385 -0
- package/lib/core/rs-egress-prompts.cjs +113 -0
- package/lib/core/rs-egress-telemetry.cjs +225 -0
- package/lib/core/rs-egress-violations.cjs +53 -0
- package/lib/core/rs-engine.cjs +597 -0
- package/lib/core/rs-expert-brain-projection.cjs +280 -0
- package/lib/core/rs-expert-mapper.cjs +467 -0
- package/lib/core/rs-fetcher-academic.cjs +697 -0
- package/lib/core/rs-fetcher-experts.cjs +314 -0
- package/lib/core/rs-fetcher-industry.cjs +731 -0
- package/lib/core/rs-fetcher-patents.cjs +564 -0
- package/lib/core/rs-innovation-classifier.cjs +194 -0
- package/lib/core/rs-math.cjs +458 -0
- package/lib/core/rs-mind-map.cjs +656 -0
- package/lib/core/rs-neo4j-writer.cjs +388 -0
- package/lib/core/rs-nl-to-query.cjs +435 -0
- package/lib/core/rs-pinecone-bridge.cjs +344 -0
- package/lib/core/rs-preprocessor.cjs +350 -0
- package/lib/core/rs-query-matrix.cjs +316 -0
- package/lib/core/rs-query-to-text.cjs +438 -0
- package/lib/core/rs-sqlite-mirror.cjs +495 -0
- package/lib/core/rs-thesis-generator.cjs +188 -0
- package/lib/core/rs_cache.py +635 -0
- package/lib/core/rs_corpus.py +562 -0
- package/lib/core/rs_corpus_exclude.py +62 -0
- package/lib/core/rs_hybrid.py +589 -0
- package/lib/core/rs_math.py +287 -0
- package/lib/core/rs_rooms.py +196 -0
- package/lib/core/salient-governance.cjs +315 -0
- package/lib/core/scheduled-scanner.cjs +658 -0
- package/lib/core/scratchpad-ops.cjs +316 -0
- package/lib/core/seam-liveness.cjs +191 -0
- package/lib/core/seam-liveness.test.cjs +177 -0
- package/lib/core/section-8-trace-schema.cjs +138 -0
- package/lib/core/section-registry.cjs +167 -0
- package/lib/core/security/agentshield-adapters.test.cjs +104 -0
- package/lib/core/security/agentshield-run.cjs +343 -0
- package/lib/core/security/agentshield-scanner.cjs +314 -0
- package/lib/core/security/agentshield-scanner.test.cjs +259 -0
- package/lib/core/sensors/hat-scoping-table.cjs +103 -0
- package/lib/core/sensors/sensor-circularity.cjs +278 -0
- package/lib/core/sensors/sensor-content-relevance.cjs +407 -0
- package/lib/core/sensors/sensor-diffusion-adoption.cjs +230 -0
- package/lib/core/sensors/sensor-eureka.cjs +208 -0
- package/lib/core/sensors/sensor-expert-skill.cjs +293 -0
- package/lib/core/sensors/sensor-external-fact.cjs +184 -0
- package/lib/core/sensors/sensor-gate-approach.cjs +104 -0
- package/lib/core/sensors/sensor-jtbd-reweight.cjs +141 -0
- package/lib/core/sensors/sensor-lagging-component.cjs +115 -0
- package/lib/core/sensors/sensor-memory-cortex.cjs +111 -0
- package/lib/core/sensors/sensor-methodology-decision.cjs +131 -0
- package/lib/core/sensors/sensor-opportunity-harvest.cjs +195 -0
- package/lib/core/sensors/sensor-perspective-lock.cjs +174 -0
- package/lib/core/sensors/sensor-priority.cjs +183 -0
- package/lib/core/sensors/sensor-recency.cjs +151 -0
- package/lib/core/sensors/sensor-roadmap-type.cjs +421 -0
- package/lib/core/sensors/sensor-room-pick.cjs +238 -0
- package/lib/core/sensors/sensor-show-share.cjs +215 -0
- package/lib/core/sensors/sensor-temporal-blindness.cjs +123 -0
- package/lib/core/sensors/sensor-types.cjs +294 -0
- package/lib/core/sensors/sensor-url-ingest.cjs +234 -0
- package/lib/core/session-binding.cjs +208 -0
- package/lib/core/session-presence.cjs +404 -0
- package/lib/core/session-register.cjs +138 -0
- package/lib/core/session-state.cjs +144 -0
- package/lib/core/shallow-doc-parser.cjs +353 -0
- package/lib/core/shallow-doc-parser.test.cjs +226 -0
- package/lib/core/skill-activation-router.cjs +284 -0
- package/lib/core/skillopt-schemas.cjs +509 -0
- package/lib/core/stale-copy-scanner.cjs +190 -0
- package/lib/core/stance-state.cjs +153 -0
- package/lib/core/state-aware-router.cjs +78 -0
- package/lib/core/state-ops.cjs +80 -0
- package/lib/core/state-version.cjs +350 -0
- package/lib/core/statusline-cache.cjs +266 -0
- package/lib/core/statusline-liveness-gate.cjs +105 -0
- package/lib/core/surface-fence.cjs +127 -0
- package/lib/core/synthesizers/comparison-matrix.cjs +82 -0
- package/lib/core/synthesizers/convergence-map.cjs +107 -0
- package/lib/core/synthesizers/domain-hierarchy.cjs +138 -0
- package/lib/core/synthesizers/source-comparison.cjs +56 -0
- package/lib/core/synthesizers/tension-map.cjs +119 -0
- package/lib/core/synthetic-expert-behavior-gate.cjs +99 -0
- package/lib/core/synthetic-expert-construction-gate.cjs +170 -0
- package/lib/core/telemetry/schema.cjs +168 -0
- package/lib/core/telemetry/schema.test.cjs +124 -0
- package/lib/core/telemetry/validator.cjs +200 -0
- package/lib/core/telemetry/validator.test.cjs +188 -0
- package/lib/core/telemetry/writer.cjs +141 -0
- package/lib/core/telemetry/writer.test.cjs +331 -0
- package/lib/core/temporal/date-sync-gate.cjs +256 -0
- package/lib/core/temporal/date-sync-gate.test.cjs +191 -0
- package/lib/core/temporal/dual-stamp.cjs +172 -0
- package/lib/core/temporal/dual-stamp.test.cjs +172 -0
- package/lib/core/temporal/point-in-time.cjs +76 -0
- package/lib/core/temporal/point-in-time.test.cjs +169 -0
- package/lib/core/temporal/recency-decay.cjs +119 -0
- package/lib/core/temporal/recency-decay.test.cjs +140 -0
- package/lib/core/temporal/reference-now.cjs +281 -0
- package/lib/core/temporal/reference-now.test.cjs +225 -0
- package/lib/core/temporal/resolve-relative-time.cjs +116 -0
- package/lib/core/temporal/resolve-relative-time.test.cjs +138 -0
- package/lib/core/temporal/supersession.cjs +250 -0
- package/lib/core/temporal/supersession.test.cjs +103 -0
- package/lib/core/terminal-capability.cjs +88 -0
- package/lib/core/token-estimator.cjs +348 -0
- package/lib/core/tone-filter.cjs +147 -0
- package/lib/core/trending-to-absurd/orchestrator.cjs +341 -0
- package/lib/core/trending-to-absurd/stage7-roadmap.cjs +317 -0
- package/lib/core/trending-to-absurd/variance.cjs +169 -0
- package/lib/core/unknowns/bandit.cjs +332 -0
- package/lib/core/unknowns/corpus-adapter.cjs +327 -0
- package/lib/core/unknowns/dsp.cjs +356 -0
- package/lib/core/unknowns/edge-writer.cjs +211 -0
- package/lib/core/unknowns/iface.cjs +212 -0
- package/lib/core/unknowns/orchestrator.cjs +375 -0
- package/lib/core/unknowns/pattern-miner.cjs +214 -0
- package/lib/core/unknowns/rumsfeld-matrix.cjs +155 -0
- package/lib/core/unknowns/verdict.cjs +254 -0
- package/lib/core/update-path.cjs +57 -0
- package/lib/core/url-ingest.cjs +568 -0
- package/lib/core/user-archetype.cjs +284 -0
- package/lib/core/user-md-ops.cjs +578 -0
- package/lib/core/venture-shape-nudge.cjs +178 -0
- package/lib/core/venture-shape-nudge.test.cjs +266 -0
- package/lib/core/verb-reach-affinity.cjs +299 -0
- package/lib/core/visual-ops.cjs +692 -0
- package/lib/core/voice-transition-detector.cjs +125 -0
- package/lib/core/watched-sources.cjs +237 -0
- package/lib/core/write-lock.cjs +149 -0
- package/lib/graph/canvas-graph.js +467 -0
- package/lib/graph/constellation-config.cjs +299 -0
- package/lib/graph/graph-detail-panel.js +165 -0
- package/lib/hmi/ROOM.md +47 -0
- package/lib/hmi/across-session-memory.cjs +669 -0
- package/lib/hmi/agentshield-drift-gate.cjs +142 -0
- package/lib/hmi/brain-review-packet.cjs +221 -0
- package/lib/hmi/cortex-reach-adapter.cjs +271 -0
- package/lib/hmi/cross-room-memory.cjs +618 -0
- package/lib/hmi/decoy-tier.cjs +395 -0
- package/lib/hmi/depth-state.cjs +164 -0
- package/lib/hmi/dial-label-composer.cjs +410 -0
- package/lib/hmi/dial-presenter.cjs +508 -0
- package/lib/hmi/dial-reach-orchestrator.cjs +377 -0
- package/lib/hmi/dial-selector.cjs +239 -0
- package/lib/hmi/f1-pick-capture-cli.cjs +131 -0
- package/lib/hmi/f3-depth-capture-cli.cjs +77 -0
- package/lib/hmi/f4-scope-capture-cli.cjs +86 -0
- package/lib/hmi/f8-action-capture-cli.cjs +145 -0
- package/lib/hmi/f8-capture.test.cjs +77 -0
- package/lib/hmi/f9-ordered-capture-cli.cjs +138 -0
- package/lib/hmi/harvest-scope-state.cjs +202 -0
- package/lib/hmi/hats-persona-cache.cjs +142 -0
- package/lib/hmi/jtbd-classifier.cjs +219 -0
- package/lib/hmi/jtbd-state.cjs +263 -0
- package/lib/hmi/jtbd-taxonomy.json +402 -0
- package/lib/hmi/mindrian-ascii-logo.cjs +96 -0
- package/lib/hmi/part8-egress-gate.cjs +149 -0
- package/lib/hmi/reach-component-map.json +47 -0
- package/lib/hmi/reach-relevance-gate.cjs +147 -0
- package/lib/hmi/selector-dispatcher.cjs +1201 -0
- package/lib/hmi/selector-dispatcher.test.cjs +141 -0
- package/lib/hmi/selector-telemetry.cjs +269 -0
- package/lib/hmi/shape-f0-renderer.cjs +145 -0
- package/lib/hmi/shape-f1-fallback.cjs +80 -0
- package/lib/hmi/shape-f1-renderer.cjs +219 -0
- package/lib/hmi/shape-f2-renderer.cjs +132 -0
- package/lib/hmi/shape-f3-parity.test.cjs +64 -0
- package/lib/hmi/shape-f3-renderer.cjs +66 -0
- package/lib/hmi/shape-f4-parity.test.cjs +72 -0
- package/lib/hmi/shape-f4-renderer.cjs +72 -0
- package/lib/hmi/shape-f5-renderer.cjs +155 -0
- package/lib/hmi/shape-f6-plan-review-renderer.cjs +324 -0
- package/lib/hmi/shape-f6-renderer.cjs +144 -0
- package/lib/hmi/shape-f7-breakthrough-renderer.cjs +234 -0
- package/lib/hmi/shape-f7-breakthrough-renderer.test.cjs +233 -0
- package/lib/hmi/shape-f8-renderer.cjs +150 -0
- package/lib/hmi/shape-f8-renderer.test.cjs +70 -0
- package/lib/hmi/shape-f9-renderer.cjs +187 -0
- package/lib/hmi/shape-f9-renderer.test.cjs +80 -0
- package/lib/hmi/shape-g-renderer.cjs +219 -0
- package/lib/hmi/shape-h-renderer.cjs +222 -0
- package/lib/hmi/tier-check.cjs +63 -0
- package/lib/hmi/turn-text.cjs +268 -0
- package/lib/hmi/voice-color-mark.cjs +318 -0
- package/lib/hmi/voice-style-log.cjs +276 -0
- package/lib/import/PRECONDITIONS.md +41 -0
- package/lib/import/branding.cjs +210 -0
- package/lib/import/branding.test.cjs +235 -0
- package/lib/import/classifications-sync.cjs +104 -0
- package/lib/import/classifications-sync.test.cjs +129 -0
- package/lib/import/enricher.cjs +296 -0
- package/lib/import/enricher.test.cjs +273 -0
- package/lib/import/integration.test.cjs +376 -0
- package/lib/import/manifest.cjs +129 -0
- package/lib/import/manifest.schema.json +185 -0
- package/lib/import/manifest.test.cjs +123 -0
- package/lib/import/meeting-detector.cjs +92 -0
- package/lib/import/meeting-detector.test.cjs +100 -0
- package/lib/import/person-detector.cjs +229 -0
- package/lib/import/person-detector.test.cjs +149 -0
- package/lib/import/report.cjs +186 -0
- package/lib/import/report.test.cjs +186 -0
- package/lib/import/room-md-scaffolder.cjs +49 -0
- package/lib/import/router.cjs +224 -0
- package/lib/import/router.test.cjs +356 -0
- package/lib/import/run-all-tests.cjs +36 -0
- package/lib/import/smoke-test.cjs +213 -0
- package/lib/import/smoke-test.test.cjs +148 -0
- package/lib/import/undo.test.cjs +199 -0
- package/lib/import/vault-scanner.cjs +105 -0
- package/lib/import/vault-scanner.test.cjs +67 -0
- package/lib/lens-engine/correlation-resolver.cjs +174 -0
- package/lib/lens-engine/source-lens-driver.cjs +736 -0
- package/lib/mcp/adapter-client.cjs +103 -0
- package/lib/mcp/app-html/dashboard.html +316 -0
- package/lib/mcp/app-html/graph.html +428 -0
- package/lib/mcp/app-html/mindrian-platform.html +1841 -0
- package/lib/mcp/app-html/wiki.html +383 -0
- package/lib/mcp/app-views.cjs +322 -0
- package/lib/mcp/brain-composition-census.cjs +184 -0
- package/lib/mcp/brain-router.cjs +530 -0
- package/lib/mcp/capability-registry.cjs +62 -0
- package/lib/mcp/contract-version.cjs +59 -0
- package/lib/mcp/daemon-lifecycle.cjs +324 -0
- package/lib/mcp/gate-dedup.cjs +120 -0
- package/lib/mcp/gate-ledger.cjs +145 -0
- package/lib/mcp/gate-render.cjs +483 -0
- package/lib/mcp/hook-adapter-audit.cjs +199 -0
- package/lib/mcp/larry-context.cjs +42 -0
- package/lib/mcp/mcp-first-flag.cjs +147 -0
- package/lib/mcp/no-instructions.test.cjs +270 -0
- package/lib/mcp/pipeline-state.cjs +424 -0
- package/lib/mcp/prompts.cjs +421 -0
- package/lib/mcp/register-core-tools.cjs +78 -0
- package/lib/mcp/resources.cjs +359 -0
- package/lib/mcp/runtime-instructions.cjs +38 -0
- package/lib/mcp/session-catchup.cjs +349 -0
- package/lib/mcp/session-registry.cjs +113 -0
- package/lib/mcp/session-room.cjs +124 -0
- package/lib/mcp/sse-event-bus.cjs +98 -0
- package/lib/mcp/stop-gate-handler.cjs +589 -0
- package/lib/mcp/surface-detect.cjs +186 -0
- package/lib/mcp/tool-router.cjs +2113 -0
- package/lib/mcp/tools/chain.cjs +674 -0
- package/lib/mcp/tools/claim.cjs +180 -0
- package/lib/mcp/tools/context.cjs +92 -0
- package/lib/mcp/tools/dual-path.cjs +79 -0
- package/lib/mcp/tools/gate.cjs +392 -0
- package/lib/mcp/tools/graph-reason.cjs +130 -0
- package/lib/mcp/tools/graph.cjs +321 -0
- package/lib/mcp/tools/identity.cjs +174 -0
- package/lib/mcp/tools/room.cjs +449 -0
- package/lib/mcp/tools/sensors.cjs +450 -0
- package/lib/mcp/tools/status.cjs +183 -0
- package/lib/mcp/tools/stop-gate.cjs +103 -0
- package/lib/mcp/tools/views.cjs +382 -0
- package/lib/mcp/tree-watcher.cjs +199 -0
- package/lib/memory/.mindrian/auto-explore-mat-test-001.json +11 -0
- package/lib/memory/aaak-compress.cjs +403 -0
- package/lib/memory/aaak-compress.test.cjs +288 -0
- package/lib/memory/async-artifact-auto-commit.test.cjs +223 -0
- package/lib/memory/bearer-token.test.cjs +315 -0
- package/lib/memory/body-shape-coverage.test.cjs +268 -0
- package/lib/memory/brain-cache-lru.test.cjs +259 -0
- package/lib/memory/brain-client-query-shape.test.cjs +160 -0
- package/lib/memory/brain-cypher-chain-slice.test.cjs +368 -0
- package/lib/memory/brain-derivation-graceful-degradation.test.cjs +1019 -0
- package/lib/memory/brain-derivation-queue.test.cjs +553 -0
- package/lib/memory/brain-derivation.test.cjs +639 -0
- package/lib/memory/brain-derive-command.test.cjs +534 -0
- package/lib/memory/brain-derive-curation.test.cjs +243 -0
- package/lib/memory/brain-md-invariants-validator.test.cjs +704 -0
- package/lib/memory/brain-md-schema.test.cjs +467 -0
- package/lib/memory/brain-md-staleness.test.cjs +525 -0
- package/lib/memory/brain-server-resolution.test.cjs +314 -0
- package/lib/memory/brain-suggestion-template.test.cjs +200 -0
- package/lib/memory/chain-recommender-canonical.test.cjs +208 -0
- package/lib/memory/chain-recommender.test.cjs +233 -0
- package/lib/memory/chat-context.test.cjs +128 -0
- package/lib/memory/command-registry.test.cjs +220 -0
- package/lib/memory/connector-registry.test.cjs +94 -0
- package/lib/memory/correlation-label-index.test.cjs +119 -0
- package/lib/memory/correlation.test.cjs +253 -0
- package/lib/memory/cross-room-aggregator.test.cjs +909 -0
- package/lib/memory/curation-132-03-dedup-held-rename.test.cjs +251 -0
- package/lib/memory/curation-132-05-pseudonymize.test.cjs +205 -0
- package/lib/memory/curation-batch.test.cjs +213 -0
- package/lib/memory/dashboard-server.test.cjs +256 -0
- package/lib/memory/debouncer-drain-at-prompt.test.cjs +389 -0
- package/lib/memory/decision-capture.test.cjs +632 -0
- package/lib/memory/decision-capture.worker.cjs +70 -0
- package/lib/memory/doctor-deprecation-surface.test.cjs +188 -0
- package/lib/memory/dual-graph-health.test.cjs +485 -0
- package/lib/memory/explain-decision-command.test.cjs +521 -0
- package/lib/memory/explain-decision-footer.test.cjs +316 -0
- package/lib/memory/explored-materials-store.cjs +392 -0
- package/lib/memory/f-selector-ranker.test.cjs +593 -0
- package/lib/memory/feynman-minto-guardian.test.cjs +863 -0
- package/lib/memory/feynman-minto-invariants.test.cjs +554 -0
- package/lib/memory/feynman-prompts-drift.test.cjs +144 -0
- package/lib/memory/feynman-prompts.cjs +151 -0
- package/lib/memory/feynman-prompts.test.cjs +96 -0
- package/lib/memory/first-touch-version.test.cjs +198 -0
- package/lib/memory/folder-memory-quadruple.test.cjs +548 -0
- package/lib/memory/folder-memory.test.cjs +503 -0
- package/lib/memory/framework-chain-composer.test.cjs +549 -0
- package/lib/memory/frontmatter-schema-validator.test.cjs +344 -0
- package/lib/memory/guardian-onstop-reaches-user.test.cjs +396 -0
- package/lib/memory/heal-command.test.cjs +604 -0
- package/lib/memory/help-coverage.test.cjs +108 -0
- package/lib/memory/help-renderer.test.cjs +145 -0
- package/lib/memory/huji-run-one-async-parity.test.cjs +242 -0
- package/lib/memory/hypergraph-event-schema.test.cjs +116 -0
- package/lib/memory/index-artifact-transaction.test.cjs +333 -0
- package/lib/memory/lazygraph-rs-discoveries-view.test.cjs +122 -0
- package/lib/memory/local-chain-recommender.test.cjs +172 -0
- package/lib/memory/mcp-input-validation.test.cjs +240 -0
- package/lib/memory/mcp-server-brain-deps.test.cjs +270 -0
- package/lib/memory/mcp-stack-fallback.test.cjs +433 -0
- package/lib/memory/minto-debounce-consumer-census.test.cjs +567 -0
- package/lib/memory/minto-debouncer.test.cjs +407 -0
- package/lib/memory/minto-debouncer.worker.cjs +46 -0
- package/lib/memory/minto-migration-v88.test.cjs +265 -0
- package/lib/memory/minto-schema-v88.test.cjs +390 -0
- package/lib/memory/mos-status-renderer.test.cjs +631 -0
- package/lib/memory/narrative-schema.cjs +376 -0
- package/lib/memory/narrative-schema.test.cjs +209 -0
- package/lib/memory/nav-dial.test.cjs +414 -0
- package/lib/memory/navigation-engine-core.test.cjs +712 -0
- package/lib/memory/navigation-engine-offer.test.cjs +404 -0
- package/lib/memory/navigation-hook-resolver.test.cjs +177 -0
- package/lib/memory/navigation-invariants.test.cjs +483 -0
- package/lib/memory/navigation-projections.test.cjs +241 -0
- package/lib/memory/navigation-write-edge.test.cjs +206 -0
- package/lib/memory/offer-closer.test.cjs +258 -0
- package/lib/memory/offer-presenter.test.cjs +554 -0
- package/lib/memory/on-stop-snapshot.test.cjs +404 -0
- package/lib/memory/orchestration-projection.test.cjs +706 -0
- package/lib/memory/packet-chain-hint.test.cjs +407 -0
- package/lib/memory/packet-schema-validation.test.cjs +317 -0
- package/lib/memory/palette-consistency.test.cjs +127 -0
- package/lib/memory/pending-tension-store.cjs +453 -0
- package/lib/memory/per-command-jtbd-derivation.test.cjs +130 -0
- package/lib/memory/per-command-teaching.test.cjs +110 -0
- package/lib/memory/post-compact-reinjection.test.cjs +854 -0
- package/lib/memory/post-write-triple.test.cjs +317 -0
- package/lib/memory/pre-compact-snapshot.test.cjs +495 -0
- package/lib/memory/precommit-real-commit.test.cjs +301 -0
- package/lib/memory/problem-type-router.test.cjs +656 -0
- package/lib/memory/query-efficiency-telemetry.test.cjs +612 -0
- package/lib/memory/recompile-room-references.test.cjs +392 -0
- package/lib/memory/recompile-room-references.worker.cjs +42 -0
- package/lib/memory/record-decision-dual-write.test.cjs +454 -0
- package/lib/memory/render-v2-disposition.test.cjs +199 -0
- package/lib/memory/room-classifier-strict-mode.test.cjs +430 -0
- package/lib/memory/room-minto-hook.test.cjs +398 -0
- package/lib/memory/rs-discovery-engine.test.cjs +323 -0
- package/lib/memory/run-feynman-tests.cjs +2101 -0
- package/lib/memory/security-trifecta.test.cjs +329 -0
- package/lib/memory/selector-alias-map.test.cjs +172 -0
- package/lib/memory/selector-decisions.test.cjs +417 -0
- package/lib/memory/selector-miss.test.cjs +290 -0
- package/lib/memory/session-start-brain-staleness.test.cjs +363 -0
- package/lib/memory/session-start-triple-injection.test.cjs +514 -0
- package/lib/memory/sessionstart-banner-formatter.cjs +318 -0
- package/lib/memory/sessionstart-coordinator.test.cjs +446 -0
- package/lib/memory/sessionstart-minto-banner.test.cjs +373 -0
- package/lib/memory/skill-activation-router.test.cjs +465 -0
- package/lib/memory/skill-vs-code-drift.test.cjs +257 -0
- package/lib/memory/soft-alias.test.cjs +144 -0
- package/lib/memory/spine-events-correlation.test.cjs +198 -0
- package/lib/memory/stale-copy-scanner.test.cjs +294 -0
- package/lib/memory/stamp-artifact-write.test.cjs +304 -0
- package/lib/memory/state-aware-router.test.cjs +90 -0
- package/lib/memory/statusline-active-room-write.test.cjs +245 -0
- package/lib/memory/statusline-active-room.test.cjs +315 -0
- package/lib/memory/statusline-minto-segment.test.cjs +292 -0
- package/lib/memory/statusline-two-row.test.cjs +338 -0
- package/lib/memory/suggest-next-workflow.test.cjs +176 -0
- package/lib/memory/sync-async-entry-points.test.cjs +204 -0
- package/lib/memory/terminal-capability.test.cjs +155 -0
- package/lib/memory/test-bridge-writer-enhanced.cjs +452 -0
- package/lib/memory/test-rs-brain-substrate-shape.cjs +529 -0
- package/lib/memory/test-rs-brain-substrate.cjs +636 -0
- package/lib/memory/test-rs-breakthrough-scorer.cjs +375 -0
- package/lib/memory/test-rs-canon-violations.cjs +218 -0
- package/lib/memory/test-rs-chain-feeder-core.cjs +344 -0
- package/lib/memory/test-rs-chain-feeder-skill-spawn.cjs +297 -0
- package/lib/memory/test-rs-commercial-assessor.cjs +385 -0
- package/lib/memory/test-rs-differential-scorer.cjs +480 -0
- package/lib/memory/test-rs-discovery-engine.cjs +648 -0
- package/lib/memory/test-rs-domain-analyzer.cjs +492 -0
- package/lib/memory/test-rs-egress-primitives.cjs +420 -0
- package/lib/memory/test-rs-expert-mapper.cjs +547 -0
- package/lib/memory/test-rs-explain-command.cjs +443 -0
- package/lib/memory/test-rs-fetcher-academic.cjs +848 -0
- package/lib/memory/test-rs-fetcher-experts.cjs +496 -0
- package/lib/memory/test-rs-fetcher-industry.cjs +702 -0
- package/lib/memory/test-rs-fetcher-patents.cjs +674 -0
- package/lib/memory/test-rs-innovation-classifier.cjs +301 -0
- package/lib/memory/test-rs-mind-map.cjs +646 -0
- package/lib/memory/test-rs-neo4j-writer.cjs +518 -0
- package/lib/memory/test-rs-nl-to-query.cjs +449 -0
- package/lib/memory/test-rs-pinecone-bridge.cjs +282 -0
- package/lib/memory/test-rs-preprocessor.cjs +433 -0
- package/lib/memory/test-rs-query-matrix.cjs +391 -0
- package/lib/memory/test-rs-query-to-text.cjs +551 -0
- package/lib/memory/test-rs-sqlite-mirror.cjs +649 -0
- package/lib/memory/test-rs-thesis-generator.cjs +360 -0
- package/lib/memory/triple-context-formatter.cjs +473 -0
- package/lib/memory/triple-context-formatter.test.cjs +442 -0
- package/lib/memory/user-md-persona.test.cjs +565 -0
- package/lib/memory/userpromptsubmit-integration.test.cjs +787 -0
- package/lib/memory/validators/README.md +157 -0
- package/lib/memory/validators/brain-md-invariants.cjs +475 -0
- package/lib/memory/validators/brain-substrate-invariants.cjs +285 -0
- package/lib/memory/validators/external-academic-invariants.cjs +249 -0
- package/lib/memory/validators/external-industry-invariants.cjs +271 -0
- package/lib/memory/validators/external-patents-invariants.cjs +266 -0
- package/lib/memory/validators/minto-invariants.cjs +62 -0
- package/lib/memory/validators/navigation-invariants.cjs +340 -0
- package/lib/memory/validators/queue-health.cjs +95 -0
- package/lib/memory/validators/snapshot-integrity.cjs +129 -0
- package/lib/memory/validators/stale-lifecycle.cjs +116 -0
- package/lib/memory/vault-section-minto-generator-atomic.test.cjs +556 -0
- package/lib/memory/vault-section-minto-generator-atomic.worker.cjs +73 -0
- package/lib/memory/workflow-layer-e2e.test.cjs +262 -0
- package/lib/memory/write-lock-atomic.test.cjs +137 -0
- package/lib/memory/write-lock-atomic.worker.cjs +55 -0
- package/lib/parity/check-parity.cjs +83 -0
- package/lib/presentation/presentation-server.cjs +101 -0
- package/lib/presentation/presentation-watcher.cjs +123 -0
- package/lib/quickview/hub-server.cjs +719 -0
- package/lib/quickview/server.cjs +533 -0
- package/lib/render/JTBD-PALETTES.md +145 -0
- package/lib/render/ROOM.md +111 -0
- package/lib/render/render-v2.cjs +532 -0
- package/lib/render/render-v2.test.cjs +267 -0
- package/lib/render/render.cjs +65 -0
- package/lib/sessionstart/budget-compressor.cjs +130 -0
- package/lib/sessionstart/contributor-interface.cjs +134 -0
- package/lib/sessionstart/contributor-isolator.cjs +128 -0
- package/lib/sessionstart/precedence-ladder.cjs +47 -0
- package/lib/state/ROOM.md +46 -0
- package/lib/state/state-md-parser.cjs +215 -0
- package/lib/statusline/ROOM.md +38 -0
- package/lib/statusline/banner-suppression.cjs +50 -0
- package/lib/statusline/cockpit-renderer.cjs +443 -0
- package/lib/statusline/cockpit-signals.cjs +312 -0
- package/lib/statusline/cockpit-telemetry.cjs +152 -0
- package/lib/statusline/ctx-window.cjs +135 -0
- package/lib/statusline/governing-thought-truncator.cjs +45 -0
- package/lib/statusline/next-move-cache.cjs +235 -0
- package/lib/statusline/ratification-next.cjs +164 -0
- package/lib/statusline/room-health-cache.cjs +200 -0
- package/lib/statusline/surface-detect.cjs +85 -0
- package/lib/statusline/two-row-renderer.cjs +207 -0
- package/lib/statusline/version-resolver.cjs +81 -0
- package/lib/ui/design-system.cjs +19 -0
- package/lib/update-bootstrap.sh.template +145 -0
- package/lib/vault/frontmatter-schema.cjs +297 -0
- package/lib/vault/room-scanner.cjs +365 -0
- package/lib/vault/wikilink-builder.cjs +231 -0
- package/lib/vault/wikilink-builder.test.cjs +182 -0
- package/lib/wiki/briefing.cjs +193 -0
- package/lib/wiki/editor-dist/wiki-editor.css +1 -0
- package/lib/wiki/editor-dist/wiki-editor.js +1327 -0
- package/lib/wiki/graph-links.cjs +281 -0
- package/lib/wiki/page-renderer.cjs +229 -0
- package/lib/wiki/room-home.cjs +353 -0
- package/lib/wiki/wiki-chat.cjs +81 -0
- package/lib/wiki/wiki-export.cjs +364 -0
- package/lib/wiki/wiki-layout.cjs +1143 -0
- package/lib/wiki/wiki-search.cjs +142 -0
- package/lib/wiki/wiki-server.cjs +748 -0
- package/lib/wiki/wiki-watcher.cjs +105 -0
- package/lib/workflow/ROOM.md +47 -0
- package/lib/workflow/chain-source.cjs +179 -0
- package/lib/workflow/command-resolver.cjs +155 -0
- package/lib/workflow/command-resolver.test.cjs +235 -0
- package/lib/workflow/cross-room-umbilical-closer.cjs +364 -0
- package/lib/workflow/dial-close-reach.cjs +405 -0
- package/lib/workflow/f-selector-ranker.cjs +1148 -0
- package/lib/workflow/f1-pick-consumer.cjs +232 -0
- package/lib/workflow/f3-depth-consumer.cjs +98 -0
- package/lib/workflow/f4-scope-consumer.cjs +112 -0
- package/lib/workflow/f8-consumer.test.cjs +82 -0
- package/lib/workflow/f8-fanout-consumer.cjs +208 -0
- package/lib/workflow/f9-consumer.test.cjs +71 -0
- package/lib/workflow/f9-ordered-consumer.cjs +199 -0
- package/lib/workflow/local-chain-recommender.cjs +330 -0
- package/lib/workflow/memory-cascade-f9-adapter.cjs +273 -0
- package/lib/workflow/memory-governance-closer.cjs +384 -0
- package/lib/workflow/offer-closer.cjs +407 -0
- package/lib/workflow/reach-hedge-ranker.cjs +809 -0
- package/lib/workflow/reach-reject-reader.cjs +372 -0
- package/lib/workflow/reconcile-f9-adapter.cjs +299 -0
- package/lib/workflow/selector-decisions.cjs +478 -0
- package/lib/workflow/session-binding-consumer.cjs +249 -0
- package/npm-shrinkwrap.json +1544 -0
- package/output-styles/destijl.md +67 -0
- package/package.json +22 -4
- package/pipelines/PWS_grading/01-deep-grade.md +48 -0
- package/pipelines/PWS_grading/02-mullins.md +50 -0
- package/pipelines/PWS_grading/03-build-thesis.md +60 -0
- package/pipelines/PWS_grading/04-structure-argument.md +77 -0
- package/pipelines/PWS_grading/CHAIN.md +79 -0
- package/pipelines/analogy/01-decompose.md +80 -0
- package/pipelines/analogy/02-abstract.md +87 -0
- package/pipelines/analogy/03-search.md +135 -0
- package/pipelines/analogy/04-transfer.md +101 -0
- package/pipelines/analogy/05-validate.md +106 -0
- package/pipelines/analogy/CHAIN.md +73 -0
- package/pipelines/discovery/01-explore-domains.md +44 -0
- package/pipelines/discovery/02-think-hats.md +50 -0
- package/pipelines/discovery/03-analyze-needs.md +54 -0
- package/pipelines/discovery/CHAIN.md +48 -0
- package/pipelines/thesis/01-structure-argument.md +45 -0
- package/pipelines/thesis/02-challenge-assumptions.md +48 -0
- package/pipelines/thesis/03-build-thesis.md +54 -0
- package/pipelines/thesis/CHAIN.md +48 -0
- package/references/brain/causal-directives.md +91 -0
- package/references/brain/causal-enrichment.cypher +165 -0
- package/references/brain/command-triggers-schema.md +15 -0
- package/references/brain/graph-architecture.md +317 -0
- package/references/brain/query-patterns.md +504 -0
- package/references/brain/room-hierarchy-schema.md +218 -0
- package/references/brain/schema.md +86 -0
- package/references/capability-radar/capabilities-index.md +269 -0
- package/references/capability-radar/changelog-cache.md +95 -0
- package/references/causal/causal-schema.md +103 -0
- package/references/design/email-template-standard.md +169 -0
- package/references/design/graph-visualization-standard.md +178 -0
- package/references/design/newsletter-email-template.html +307 -0
- package/references/document-generation.md +179 -0
- package/references/hsi/HSI-TOOLS-REFERENCE.md +222 -0
- package/references/import-config.md +141 -0
- package/references/integrations/detection-patterns.md +101 -0
- package/references/meeting/artifact-template.md +377 -0
- package/references/meeting/cross-meeting-intelligence.md +216 -0
- package/references/meeting/cross-relationship-patterns.md +202 -0
- package/references/meeting/extraction-perspectives.md +225 -0
- package/references/meeting/filing-protocol.md +222 -0
- package/references/meeting/knowledge-typing.md +242 -0
- package/references/meeting/live-join-interface.md +244 -0
- package/references/meeting/section-mapping.md +192 -0
- package/references/meeting/segment-classification.md +258 -0
- package/references/meeting/speaker-profile-template.md +219 -0
- package/references/meeting/summary-template.md +348 -0
- package/references/meeting/transcript-patterns.md +226 -0
- package/references/methodology/analyze-needs.md +135 -0
- package/references/methodology/analyze-systems.md +121 -0
- package/references/methodology/analyze-timing.md +149 -0
- package/references/methodology/beautiful-question.md +109 -0
- package/references/methodology/build-knowledge.md +161 -0
- package/references/methodology/build-thesis-scored.md +60 -0
- package/references/methodology/build-thesis.md +237 -0
- package/references/methodology/causal-loop-diagrams.md +65 -0
- package/references/methodology/challenge-assumptions.md +127 -0
- package/references/methodology/diagnose.md +169 -0
- package/references/methodology/dominant-designs.md +212 -0
- package/references/methodology/explore-domains.md +147 -0
- package/references/methodology/explore-futures.md +163 -0
- package/references/methodology/explore-trends.md +129 -0
- package/references/methodology/find-bottlenecks.md +131 -0
- package/references/methodology/grade.md +211 -0
- package/references/methodology/huji-stage-a-intake.md +246 -0
- package/references/methodology/index.md +34 -0
- package/references/methodology/leadership.md +200 -0
- package/references/methodology/lean-canvas.md +116 -0
- package/references/methodology/leverage-scan-signatures.md +83 -0
- package/references/methodology/macro-trends.md +192 -0
- package/references/methodology/map-unknowns.md +137 -0
- package/references/methodology/mullins-7-domains.md +104 -0
- package/references/methodology/problem-types.md +65 -0
- package/references/methodology/root-cause.md +178 -0
- package/references/methodology/rubric-huji.md +160 -0
- package/references/methodology/sapphire-encoding.md +355 -0
- package/references/methodology/scenario-plan.md +190 -0
- package/references/methodology/score-innovation.md +154 -0
- package/references/methodology/skillopt-judge-rubric.md +48 -0
- package/references/methodology/skillopt-queries-rubric.md +60 -0
- package/references/methodology/skillopt-refute-rubric.md +59 -0
- package/references/methodology/skillopt-review-rubric.md +72 -0
- package/references/methodology/skillopt-revise-rubric.md +48 -0
- package/references/methodology/structure-argument.md +158 -0
- package/references/methodology/systems-thinking.md +231 -0
- package/references/methodology/think-hats.md +147 -0
- package/references/methodology/triz-matrix.json +751 -0
- package/references/methodology/triz-principles.md +501 -0
- package/references/methodology/user-needs.md +199 -0
- package/references/methodology/validate.md +163 -0
- package/references/methodology/value-proposition.md +244 -0
- package/references/opportunities/funding-lifecycle.md +103 -0
- package/references/opportunities/grant-api-patterns.md +99 -0
- package/references/opportunities/opportunity-template.md +84 -0
- package/references/opportunities/tnufa-rubric.md +81 -0
- package/references/personality/assessment-philosophy.md +72 -0
- package/references/personality/lexicon.md +100 -0
- package/references/personality/persona-chains.md +56 -0
- package/references/personality/pws-lexicon-full.md +499 -0
- package/references/personality/voice-dna.md +156 -0
- package/references/personas/hat-perspectives.md +76 -0
- package/references/personas/persona-template.md +63 -0
- package/references/pipeline/act-output-contract.md +88 -0
- package/references/pipeline/chains-index.md +39 -0
- package/references/pws-profile-generation.md +79 -0
- package/references/reasoning/reasoning-schema.md +143 -0
- package/references/reasoning/reasoning-template.md +68 -0
- package/references/reasoning/run-template.md +38 -0
- package/references/research/RESEARCH_14_CLAUDE_CODE_SOURCE_ARCHITECTURE.md +209 -0
- package/references/research/RESEARCH_15_V1.8_OPTIMIZATION_JTBD.md +375 -0
- package/references/research/RESEARCH_16_NATIVE_FIRST_PLUGIN_ARCHITECTURE.md +575 -0
- package/references/research/RESEARCH_17_MCP_UI_FRAMEWORKS.md +272 -0
- package/references/security/agentshield-baseline.json +8 -0
- package/references/security/cve-db.json +220 -0
- package/references/taxonomy/TAXONOMY.md +192 -0
- package/references/templates/MINTO.md +36 -0
- package/references/user-research/2026-04-05-leah-lawrence-session.md +202 -0
- package/references/vault-kit/README.md +35 -0
- package/references/vault-kit/app.json +12 -0
- package/references/vault-kit/appearance.json +12 -0
- package/references/vault-kit/graph.json +35 -0
- package/references/vault-kit/snippets/mindrian-destijl.css +297 -0
- package/references/vault-kit/templates/new-artifact.md +37 -0
- package/references/vault-kit/templates/new-meeting-note.md +35 -0
- package/references/vault-kit/templates/new-team-profile.md +29 -0
- package/references/vault-kit/templates/new-xref.md +35 -0
- package/references/visual/ROOM.md +55 -0
- package/references/visual/palette.json +54 -0
- package/references/visual/symbol-system.md +151 -0
- package/scripts/189-plurai-gate-check.cjs +88 -0
- package/scripts/198-plurai-gate-check.cjs +118 -0
- package/scripts/198-rollback-rehearsal.cjs +233 -0
- package/scripts/83-scope-injection.test.cjs +648 -0
- package/scripts/PYTHON_GATES.md +78 -0
- package/scripts/__pycache__/compute-hsi.cpython-312.pyc +0 -0
- package/scripts/__pycache__/detect-reverse-salients.cpython-312.pyc +0 -0
- package/scripts/__pycache__/rs-engine.cpython-312.pyc +0 -0
- package/scripts/act-command.cjs +518 -0
- package/scripts/admin-brain-write.cjs +442 -0
- package/scripts/admin-command-gate.cjs +178 -0
- package/scripts/agentshield-scan-cli.cjs +226 -0
- package/scripts/agentshield-sessionstart-scan.cjs +282 -0
- package/scripts/analogy-fitness-report.cjs +266 -0
- package/scripts/analyze-room +1079 -0
- package/scripts/apply-teaching-content.cjs +298 -0
- package/scripts/async-artifact-auto-commit.cjs +485 -0
- package/scripts/audit-active-phase-resolver.cjs +160 -0
- package/scripts/audit-body-shape-coverage.cjs +213 -0
- package/scripts/auto-explore-drain.cjs +274 -0
- package/scripts/auto-explore-fingerprint.cjs +354 -0
- package/scripts/auto-explore-fire.cjs +359 -0
- package/scripts/backfill-correlation-id.cjs +425 -0
- package/scripts/backfill-hitl-shape.cjs +276 -0
- package/scripts/backfill-hitl-shape.test.cjs +307 -0
- package/scripts/backup-modifications +68 -0
- package/scripts/banner +182 -0
- package/scripts/brain-derivation-drain.cjs +291 -0
- package/scripts/brain-derive-command.cjs +846 -0
- package/scripts/brain-normalize-books.cypher +505 -0
- package/scripts/brain-normalize-final.cypher +1355 -0
- package/scripts/brain-normalize-problemtype.cypher +475 -0
- package/scripts/brain-normalize-supplement.cypher +449 -0
- package/scripts/brain-normalize-targeted.cypher +344 -0
- package/scripts/brain-normalize-v194.cypher +61 -0
- package/scripts/brain-normalize.cypher +530 -0
- package/scripts/brain-response-sanitize-hook.cjs +165 -0
- package/scripts/build-brain-census.cjs +957 -0
- package/scripts/build-brain-packet-schema.cjs +225 -0
- package/scripts/build-command-registry.cjs +587 -0
- package/scripts/build-connector-registry.cjs +1331 -0
- package/scripts/build-corpus-stats.cjs +408 -0
- package/scripts/build-dist-bundles.cjs +495 -0
- package/scripts/build-ecosystem-graph.cjs +490 -0
- package/scripts/build-graph +1462 -0
- package/scripts/build-graph-from-sqlite.cjs +97 -0
- package/scripts/build-harness-manifest.cjs +1090 -0
- package/scripts/build-jtbd-nudges +205 -0
- package/scripts/build-new-surface.cjs +805 -0
- package/scripts/build-orchestration-projection.cjs +1221 -0
- package/scripts/build-render-coverage.cjs +637 -0
- package/scripts/build-skill-mirrors.cjs +681 -0
- package/scripts/cache-hitrate-report.cjs +216 -0
- package/scripts/causal-to-graph.cjs +163 -0
- package/scripts/check-abstraction-fixture-neutral.cjs +160 -0
- package/scripts/check-admin-identity.cjs +212 -0
- package/scripts/check-brain-tool-liveness.cjs +502 -0
- package/scripts/check-card-fire.cjs +1809 -0
- package/scripts/check-cirs-declaration.cjs +279 -0
- package/scripts/check-deck-design.cjs +104 -0
- package/scripts/check-dual-graph-health.cjs +645 -0
- package/scripts/check-first-touch-drift.cjs +220 -0
- package/scripts/check-flagship-floor.cjs +391 -0
- package/scripts/check-framework-vocabulary-drift.cjs +563 -0
- package/scripts/check-gate-seam.cjs +178 -0
- package/scripts/check-graph-derive-health.cjs +208 -0
- package/scripts/check-graph-export-typemap.cjs +118 -0
- package/scripts/check-help-coverage.cjs +290 -0
- package/scripts/check-hitl-stages.cjs +219 -0
- package/scripts/check-hook-schema-compatibility.cjs +231 -0
- package/scripts/check-hsi-deps +42 -0
- package/scripts/check-kuzu-reintroduction.cjs +251 -0
- package/scripts/check-onboard +43 -0
- package/scripts/check-onboard-statusline.cjs +363 -0
- package/scripts/check-palette-consistency.cjs +106 -0
- package/scripts/check-pending-ambiguous.cjs +244 -0
- package/scripts/check-pending-breakthrough.cjs +189 -0
- package/scripts/check-pending-breakthrough.test.cjs +166 -0
- package/scripts/check-pending-naming-decision.cjs +97 -0
- package/scripts/check-plugin-path-anchoring.cjs +830 -0
- package/scripts/check-publish-needs.cjs +126 -0
- package/scripts/check-registry-drift.cjs +206 -0
- package/scripts/check-release-payload-ceiling.cjs +269 -0
- package/scripts/check-render-coverage.cjs +558 -0
- package/scripts/check-research-isomorphism.cjs +446 -0
- package/scripts/check-reward-before-investment.cjs +261 -0
- package/scripts/check-room-blueprints.cjs +213 -0
- package/scripts/check-schema-aliases.cjs +532 -0
- package/scripts/check-shape-declaration.cjs +958 -0
- package/scripts/check-shape-declaration.test.cjs +185 -0
- package/scripts/check-skill-spec.cjs +312 -0
- package/scripts/check-skill-vs-code-drift.cjs +178 -0
- package/scripts/check-substrate.cjs +513 -0
- package/scripts/check-tool-honesty.cjs +1601 -0
- package/scripts/check-update +60 -0
- package/scripts/check-version-and-sha.cjs +366 -0
- package/scripts/check-voice-style.cjs +184 -0
- package/scripts/check-worktree-hygiene.cjs +530 -0
- package/scripts/classify-insight +59 -0
- package/scripts/coherence-smoke-test.cjs +489 -0
- package/scripts/compute-bayesian-surprise.py +175 -0
- package/scripts/compute-blindspot-mass.py +209 -0
- package/scripts/compute-disruption-index.py +211 -0
- package/scripts/compute-element-novelty.py +254 -0
- package/scripts/compute-external-whitespace.py +563 -0
- package/scripts/compute-hsi.py +947 -0
- package/scripts/compute-meetings-intelligence +716 -0
- package/scripts/compute-opportunity-state +17 -0
- package/scripts/compute-state +393 -0
- package/scripts/compute-team +1112 -0
- package/scripts/compute-whitespace-embeddings.py +464 -0
- package/scripts/compute-whitespace-gaps.py +562 -0
- package/scripts/compute_topic_forest.py +684 -0
- package/scripts/consolidate-pinecone.py +265 -0
- package/scripts/context-monitor +943 -0
- package/scripts/create-speaker-profile +311 -0
- package/scripts/cross-room-detect.cjs +195 -0
- package/scripts/csv-to-idea-graph.cjs +755 -0
- package/scripts/ctxl-eval.cjs +846 -0
- package/scripts/curation-132-03-dedup-held-rename.cjs +395 -0
- package/scripts/curation-132-05-pseudonymize.cjs +189 -0
- package/scripts/derive-verb-reach-affinity.cjs +507 -0
- package/scripts/detect-reverse-salients.py +242 -0
- package/scripts/diagnostics-command.cjs +345 -0
- package/scripts/dial-memory-refresh-command.cjs +147 -0
- package/scripts/discover-analogy-whitespace.py +433 -0
- package/scripts/discover-hsi-whitespace.py +352 -0
- package/scripts/discover-rs-whitespace.py +327 -0
- package/scripts/discovery-cycle.cjs +625 -0
- package/scripts/disposition-render-v2.cjs +229 -0
- package/scripts/doctor-preflight-format.cjs +101 -0
- package/scripts/doctor.cjs +4327 -0
- package/scripts/dogfood-bridge/append-to-queue.sh +59 -0
- package/scripts/dogfood-bridge/path-filter.cjs +86 -0
- package/scripts/dogfood-derive.cjs +158 -0
- package/scripts/dogfood-emit.cjs +126 -0
- package/scripts/empathy-observation-emit.cjs +108 -0
- package/scripts/enrichment-queue-append.cjs +157 -0
- package/scripts/ensure-brain-baseline.cjs +117 -0
- package/scripts/entity-extract.cjs +1135 -0
- package/scripts/eureka-command.cjs +687 -0
- package/scripts/eureka-critic-run.cjs +662 -0
- package/scripts/eureka-portfolio-report.cjs +2038 -0
- package/scripts/eureka-room-report.cjs +419 -0
- package/scripts/explain-decision-command.cjs +499 -0
- package/scripts/export-pinecone-embeddings.cjs +516 -0
- package/scripts/extract-room-intelligence.cjs +714 -0
- package/scripts/fetch-brain-baseline.cjs +190 -0
- package/scripts/fetch-brain-baseline.py +360 -0
- package/scripts/feynman-minto-guardian.cjs +672 -0
- package/scripts/feynman-timeline-refresh-command.cjs +270 -0
- package/scripts/file-asset +253 -0
- package/scripts/fire-sensor-event.cjs +83 -0
- package/scripts/first-install-router.cjs +968 -0
- package/scripts/frontmatter-schema-validator.cjs +339 -0
- package/scripts/fts-index-drain.cjs +221 -0
- package/scripts/generate-chat-embed.cjs +179 -0
- package/scripts/generate-deck.cjs +322 -0
- package/scripts/generate-export.cjs +474 -0
- package/scripts/generate-hub.cjs +2553 -0
- package/scripts/generate-lobby.cjs +718 -0
- package/scripts/generate-presentation.cjs +988 -0
- package/scripts/generate-presentation.test.cjs +405 -0
- package/scripts/generate-section-intelligence.cjs +330 -0
- package/scripts/generate-snapshot.cjs +1410 -0
- package/scripts/generate-standalone +159 -0
- package/scripts/git-ops +211 -0
- package/scripts/graph-heal-pipeline.cjs +321 -0
- package/scripts/gsd-artifact-graph-hook.cjs +219 -0
- package/scripts/gsd-graph-derive-drain.cjs +571 -0
- package/scripts/gsd-graph-derive-sweep.cjs +195 -0
- package/scripts/heal-command.cjs +1365 -0
- package/scripts/hedge-refit-pipeline.cjs +207 -0
- package/scripts/help-renderer.cjs +303 -0
- package/scripts/hmi-compliance-poll.cjs +451 -0
- package/scripts/hmi-status-command.cjs +510 -0
- package/scripts/hooked-rescore-117.cjs +224 -0
- package/scripts/hooks/pre-commit +533 -0
- package/scripts/hooks/pre-commit-room-minto-guard.cmd +43 -0
- package/scripts/hooks/pre-commit-room-minto-guard.sh +533 -0
- package/scripts/hsi-to-graph.cjs +194 -0
- package/scripts/huji-batch.cjs +821 -0
- package/scripts/huji-eval.cjs +1158 -0
- package/scripts/huji-intake.cjs +563 -0
- package/scripts/huji-pin-smoketest.cjs +454 -0
- package/scripts/huji-run-one-async.cjs +305 -0
- package/scripts/huji-run-one.cjs +671 -0
- package/scripts/install-pre-commit.sh +113 -0
- package/scripts/intent-classifier +106 -0
- package/scripts/intent-classifier.cjs +3620 -0
- package/scripts/interpret-whitespace.cjs +691 -0
- package/scripts/jtbd-command.cjs +810 -0
- package/scripts/jtbd-update.cjs +299 -0
- package/scripts/label-topic-forest.cjs +667 -0
- package/scripts/learn-from-usage +168 -0
- package/scripts/lib/__pycache__/ensure_ml_deps.cpython-312.pyc +0 -0
- package/scripts/lib/ensure_ml_deps.py +97 -0
- package/scripts/load-embeddings-into-neo4j.cjs +569 -0
- package/scripts/memory-artifact-graph-hook.cjs +191 -0
- package/scripts/memory-command.cjs +687 -0
- package/scripts/memory-completion-detector.cjs +217 -0
- package/scripts/memory-lifecycle.cjs +620 -0
- package/scripts/memory-resume-nudge.cjs +233 -0
- package/scripts/methodology-ingest-local.sh +36 -0
- package/scripts/migrate-brain-mcp-from-http-to-stdio.cjs +190 -0
- package/scripts/migrate-brain-mcp-from-http-to-stdio.test.cjs +242 -0
- package/scripts/migrate-hats-to-roomdb.cjs +217 -0
- package/scripts/migrate-lazygraph.cjs +250 -0
- package/scripts/migrate-minto-schema-v88.cjs +296 -0
- package/scripts/migrate-plugin-root-refs.cjs +168 -0
- package/scripts/migrate-room-sections-v275.cjs +556 -0
- package/scripts/migrate-rooms +417 -0
- package/scripts/migrate-skill-frontmatter.cjs +472 -0
- package/scripts/migrate-stale-user-settings.cjs +296 -0
- package/scripts/migrate-telemetry-v1.cjs +384 -0
- package/scripts/migrate-telemetry-v1.test.cjs +356 -0
- package/scripts/minto-debouncer.cjs +428 -0
- package/scripts/mos-status.cjs +622 -0
- package/scripts/mva-detect.cjs +229 -0
- package/scripts/mva-run.cjs +36 -0
- package/scripts/on-agent-complete +163 -0
- package/scripts/on-cwd-changed +149 -0
- package/scripts/on-file-changed +68 -0
- package/scripts/on-stop +617 -0
- package/scripts/on-task-complete +194 -0
- package/scripts/operator-command.cjs +858 -0
- package/scripts/operator-update.cjs +308 -0
- package/scripts/part8-egress-guard-hook.cjs +229 -0
- package/scripts/pipeline-command.cjs +271 -0
- package/scripts/post-compact +383 -0
- package/scripts/post-update-activation.cjs +339 -0
- package/scripts/post-write +283 -0
- package/scripts/power-demo-prompt.md +621 -0
- package/scripts/pre-compact +273 -0
- package/scripts/preflight-auto-explore.cjs +314 -0
- package/scripts/preflight-doctor.cjs +225 -0
- package/scripts/preflight-release-drift.cjs +168 -0
- package/scripts/preflight-tension-surface.cjs +414 -0
- package/scripts/probe-brain-contract.cjs +502 -0
- package/scripts/publish-ops +346 -0
- package/scripts/query-efficiency-telemetry.cjs +364 -0
- package/scripts/query-semantic-scholar.cjs +545 -0
- package/scripts/reapply-modifications +49 -0
- package/scripts/reassign-primary.cjs +125 -0
- package/scripts/recompile-room-references.cjs +601 -0
- package/scripts/release-beta-preflight.sh +69 -0
- package/scripts/render-pdf +588 -0
- package/scripts/render-viz +190 -0
- package/scripts/research-speaker +239 -0
- package/scripts/resolve-room +204 -0
- package/scripts/restore-post-compact-context.cjs +320 -0
- package/scripts/room-auto-create-nudge.cjs +136 -0
- package/scripts/room-naming-selector.cjs +201 -0
- package/scripts/room-registry +767 -0
- package/scripts/rs-discovery-engine.cjs +725 -0
- package/scripts/rs-engine.py +2073 -0
- package/scripts/rs-experts-command.cjs +300 -0
- package/scripts/rs-explain-command.cjs +323 -0
- package/scripts/rs-fetch-command.cjs +170 -0
- package/scripts/rs-thesis-command.cjs +203 -0
- package/scripts/rs-vector-bridge.cjs +410 -0
- package/scripts/run-harness.cjs +890 -0
- package/scripts/scout-cadence-guard.cjs +323 -0
- package/scripts/scout-cadence-runner.cjs +509 -0
- package/scripts/scout-telemetry-aggregator.cjs +268 -0
- package/scripts/sealed-walker.py +96 -0
- package/scripts/seed-brain-commands.cjs +324 -0
- package/scripts/self-update +105 -0
- package/scripts/sentinel-deadline-monitor +241 -0
- package/scripts/sentinel-health-check +198 -0
- package/scripts/sentinel-snapshot +42 -0
- package/scripts/serve-dashboard +103 -0
- package/scripts/serve-dashboard-live +932 -0
- package/scripts/serve-presentation +97 -0
- package/scripts/serve-wiki +90 -0
- package/scripts/session-end-presence.cjs +79 -0
- package/scripts/session-start +1942 -0
- package/scripts/sessionstart-coordinator.cjs +249 -0
- package/scripts/sessionstart-npm-reconcile.cjs +111 -0
- package/scripts/sessionstart-post-update-preflight.cjs +303 -0
- package/scripts/sessionstart-reference-now-seed.cjs +137 -0
- package/scripts/setup-hooks.sh +112 -0
- package/scripts/skillopt-codereview.cjs +830 -0
- package/scripts/skillopt-eval.cjs +519 -0
- package/scripts/skillopt-funnel.cjs +1076 -0
- package/scripts/skillopt-genqueries.cjs +571 -0
- package/scripts/skillopt-inventory.cjs +319 -0
- package/scripts/skillopt-merge.cjs +656 -0
- package/scripts/skillopt-triggerloop.cjs +1126 -0
- package/scripts/soft-alias-runner.cjs +116 -0
- package/scripts/stamp-artifact-write.cjs +276 -0
- package/scripts/stamp-firing-block.cjs +325 -0
- package/scripts/state-write.cjs +97 -0
- package/scripts/statusline-fallback-echo.cjs +297 -0
- package/scripts/statusline-mos +116 -0
- package/scripts/statusline-mos-dispatch +127 -0
- package/scripts/suggest-next-command.cjs +416 -0
- package/scripts/sweep-skill-descriptions.cjs +263 -0
- package/scripts/sync-rooms-brain +438 -0
- package/scripts/sync-rooms-graph +264 -0
- package/scripts/telemetry-command-invocation.cjs +120 -0
- package/scripts/test-doctor-recovery.cjs +242 -0
- package/scripts/test-fresh-install.md +140 -0
- package/scripts/track-analytics +156 -0
- package/scripts/transcribe-audio +148 -0
- package/scripts/transcript-ingest.cjs +225 -0
- package/scripts/update-icm-index +153 -0
- package/scripts/v182-brain-optimize.cypher +1191 -0
- package/scripts/validate-model-profiles +93 -0
- package/scripts/vault-content-reformatter.cjs +581 -0
- package/scripts/vault-export-orchestrator.cjs +400 -0
- package/scripts/vault-footer-injector.cjs +315 -0
- package/scripts/vault-import.cjs +839 -0
- package/scripts/vault-integration-test.cjs +318 -0
- package/scripts/vault-regenerate-all.cjs +216 -0
- package/scripts/vault-regenerate-all.test.cjs +138 -0
- package/scripts/vault-rules-generator.cjs +220 -0
- package/scripts/vault-section-minto-generator.cjs +1642 -0
- package/scripts/vault-section-minto-generator.integration.test.cjs +576 -0
- package/scripts/vault-section-minto-generator.test.cjs +291 -0
- package/scripts/vault-section-state-generator.cjs +385 -0
- package/scripts/vault-welcome-generator.cjs +403 -0
- package/scripts/vault-wikilink-injector.cjs +449 -0
- package/scripts/verify-phase-132.cjs +338 -0
- package/scripts/verify-release +744 -0
- package/scripts/whitespace-command.cjs +831 -0
- package/scripts/whitespace-to-brain.cjs +383 -0
- package/scripts/whitespace-to-graph.cjs +220 -0
- package/scripts/wikilink-batch.cjs +102 -0
- package/scripts/wikilink-file.cjs +139 -0
- package/scripts/write-bridge-artifacts.cjs +140 -0
- package/scripts/write-scope-check +12 -0
- package/scripts/write-scope-check.cjs +461 -0
- package/scripts/write-whitespace-sections.cjs +483 -0
- package/settings.json +7 -0
- package/skills/act/SKILL.md +523 -0
- package/skills/admin/SKILL.md +437 -0
- package/skills/agentshield/SKILL.md +50 -0
- package/skills/analyze-needs/SKILL.md +74 -0
- package/skills/analyze-systems/SKILL.md +69 -0
- package/skills/analyze-timing/SKILL.md +94 -0
- package/skills/auto-explore/SKILL.md +84 -0
- package/skills/beautiful-question/SKILL.md +72 -0
- package/skills/bono/SKILL.md +146 -0
- package/skills/brain-connector/SKILL.md +206 -0
- package/skills/brain-derive/SKILL.md +140 -0
- package/skills/build-knowledge/SKILL.md +118 -0
- package/skills/build-thesis/SKILL.md +90 -0
- package/skills/causal/SKILL.md +265 -0
- package/skills/challenge-assumptions/SKILL.md +74 -0
- package/skills/client-discovery-interview/SKILL.md +94 -0
- package/skills/client-discovery-interview/discovery-scaffold.json +41 -0
- package/skills/client-discovery-interview/question-bank.md +149 -0
- package/skills/compare-ventures/SKILL.md +113 -0
- package/skills/context-engine/SKILL.md +169 -0
- package/skills/conversation-mode/SKILL.md +189 -0
- package/skills/correct-reference-now/SKILL.md +86 -0
- package/skills/dashboard/SKILL.md +142 -0
- package/skills/deck/SKILL.md +113 -0
- package/skills/deep-grade/SKILL.md +210 -0
- package/skills/diagnose/SKILL.md +128 -0
- package/skills/diagnostics/SKILL.md +193 -0
- package/skills/dial-memory-refresh/SKILL.md +116 -0
- package/skills/diffusion/SKILL.md +125 -0
- package/skills/discover/SKILL.md +216 -0
- package/skills/doctor/SKILL.md +269 -0
- package/skills/dogfood-flush/SKILL.md +133 -0
- package/skills/dominant-designs/SKILL.md +72 -0
- package/skills/eureka/SKILL.md +313 -0
- package/skills/explain-decision/SKILL.md +138 -0
- package/skills/explore-domains/SKILL.md +74 -0
- package/skills/explore-futures/SKILL.md +64 -0
- package/skills/explore-opportunity/SKILL.md +168 -0
- package/skills/explore-trends/SKILL.md +74 -0
- package/skills/export/SKILL.md +126 -0
- package/skills/feynman-timeline-refresh/SKILL.md +105 -0
- package/skills/file-meeting/SKILL.md +1190 -0
- package/skills/find-analogies/SKILL.md +360 -0
- package/skills/find-bottlenecks/SKILL.md +104 -0
- package/skills/find-connections/SKILL.md +108 -0
- package/skills/funding/SKILL.md +110 -0
- package/skills/futures/SKILL.md +124 -0
- package/skills/grade/SKILL.md +252 -0
- package/skills/grade-grant/SKILL.md +293 -0
- package/skills/graph/SKILL.md +216 -0
- package/skills/hat-briefing/SKILL.md +160 -0
- package/skills/heal/SKILL.md +69 -0
- package/skills/help/SKILL.md +172 -0
- package/skills/hmi-status/SKILL.md +73 -0
- package/skills/ignite/SKILL.md +225 -0
- package/skills/ingest-methodology/SKILL.md +125 -0
- package/skills/intel-pipeline/SKILL.md +128 -0
- package/skills/intelligence-orchestrator/SKILL.md +262 -0
- package/skills/jtbd/SKILL.md +261 -0
- package/skills/larry-personality/SKILL.md +570 -0
- package/skills/larry-personality/framework-chains.md +92 -0
- package/skills/larry-personality/mode-engine.md +185 -0
- package/skills/leadership/SKILL.md +109 -0
- package/skills/lean-canvas/SKILL.md +70 -0
- package/skills/macro-trends/SKILL.md +84 -0
- package/skills/map-unknowns/SKILL.md +72 -0
- package/skills/memory/SKILL.md +212 -0
- package/skills/memory-cortex-reach/SKILL.md +80 -0
- package/skills/models/SKILL.md +197 -0
- package/skills/mos/SKILL.md +160 -0
- package/skills/mos-deck-engine/SKILL.md +329 -0
- package/skills/mos-reason/SKILL.md +484 -0
- package/skills/mullins/SKILL.md +151 -0
- package/skills/mullins-scaffold/SKILL.md +132 -0
- package/skills/mullins-scaffold/scaffold.json +223 -0
- package/skills/mva-brief/SKILL.md +87 -0
- package/skills/mva-option/SKILL.md +120 -0
- package/skills/mva-pipeline/SKILL.md +158 -0
- package/skills/mva-report/SKILL.md +79 -0
- package/skills/new-project/SKILL.md +629 -0
- package/skills/new-surface/SKILL.md +112 -0
- package/skills/onboard/SKILL.md +485 -0
- package/skills/operator/SKILL.md +167 -0
- package/skills/opportunities/SKILL.md +171 -0
- package/skills/organize/SKILL.md +69 -0
- package/skills/persona/SKILL.md +272 -0
- package/skills/pipeline/SKILL.md +164 -0
- package/skills/present/SKILL.md +123 -0
- package/skills/publish/SKILL.md +224 -0
- package/skills/pws-brain/SKILL.md +152 -0
- package/skills/pws-methodology/SKILL.md +92 -0
- package/skills/qualify-opportunity/SKILL.md +111 -0
- package/skills/query/SKILL.md +68 -0
- package/skills/radar/SKILL.md +106 -0
- package/skills/reanalyze/SKILL.md +122 -0
- package/skills/research/SKILL.md +462 -0
- package/skills/room/SKILL.md +381 -0
- package/skills/room-passive/SKILL.md +174 -0
- package/skills/room-proactive/SKILL.md +344 -0
- package/skills/rooms/SKILL.md +678 -0
- package/skills/root-cause/SKILL.md +73 -0
- package/skills/rs-experts/SKILL.md +151 -0
- package/skills/rs-explain/SKILL.md +130 -0
- package/skills/rs-fetch/SKILL.md +115 -0
- package/skills/rs-thesis/SKILL.md +129 -0
- package/skills/scenario-plan/SKILL.md +76 -0
- package/skills/scheduled-tasks/SKILL.md +301 -0
- package/skills/score-innovation/SKILL.md +74 -0
- package/skills/scout/SKILL.md +370 -0
- package/skills/setup/SKILL.md +654 -0
- package/skills/show/SKILL.md +68 -0
- package/skills/skill/SKILL.md +104 -0
- package/skills/snapshot/SKILL.md +178 -0
- package/skills/speakers/SKILL.md +116 -0
- package/skills/splash/SKILL.md +54 -0
- package/skills/stance/SKILL.md +89 -0
- package/skills/status/SKILL.md +107 -0
- package/skills/structure-argument/SKILL.md +78 -0
- package/skills/suggest-next/SKILL.md +137 -0
- package/skills/systems-thinking/SKILL.md +220 -0
- package/skills/think-hats/SKILL.md +82 -0
- package/skills/trending-to-absurd/SKILL.md +100 -0
- package/skills/ui-system/SKILL.md +474 -0
- package/skills/ui-system/design-system/M-OS-DESIGN-SYSTEM.md +273 -0
- package/skills/ui-system/design-system/SPEC.md +72 -0
- package/skills/ui-system/design-system/image-prompt-style.md +29 -0
- package/skills/ui-system/design-system/mos-design-system.css +240 -0
- package/skills/ui-system/rules/design-system.md +60 -0
- package/skills/ui-system/rules/dual-palette.md +156 -0
- package/skills/ui-system/rules/glyph-disambiguation.md +171 -0
- package/skills/ui-system/rules/shape-f-zero-and-six.md +169 -0
- package/skills/update/SKILL.md +254 -0
- package/skills/user-needs/SKILL.md +73 -0
- package/skills/validate/SKILL.md +73 -0
- package/skills/value-proposition/SKILL.md +141 -0
- package/skills/vault/SKILL.md +326 -0
- package/skills/visualize/SKILL.md +69 -0
- package/skills/whitespace/SKILL.md +539 -0
- package/skills/wiki/SKILL.md +94 -0
- package/templates/_base.html +20 -0
- package/templates/chat-panel.html +205 -0
- package/templates/constellation-chat-hooks.js +89 -0
- package/templates/constellation.html +1272 -0
- package/templates/destijl-base.css +268 -0
- package/templates/discovery/discovery-brief-template.md +97 -0
- package/templates/due-diligence.html +49 -0
- package/templates/executive-summary.html +40 -0
- package/templates/icm/CLAUDE.md +31 -0
- package/templates/icm/GROUP-CLAUDE.md +33 -0
- package/templates/icm/INDEX.md +26 -0
- package/templates/import/stage-contracts/01-ingest.md +34 -0
- package/templates/import/stage-contracts/02-classify.md +48 -0
- package/templates/import/stage-contracts/03-route.md +42 -0
- package/templates/import/stage-contracts/04-enrich.md +40 -0
- package/templates/investment-thesis.html +25 -0
- package/templates/meeting-report.html +361 -0
- package/templates/presentation/dashboard.html +1150 -0
- package/templates/presentation/deck.html +540 -0
- package/templates/presentation/diagrams.html +437 -0
- package/templates/presentation/graph.html +391 -0
- package/templates/presentation/insights.html +548 -0
- package/templates/presentation/wiki.html +533 -0
- package/templates/profile.html +136 -0
- package/templates/room-context/last-session.md +56 -0
- package/templates/room-context/methodology-history.md +28 -0
- package/templates/room-context/rejection-log.md +25 -0
- package/templates/room-context/weekly-digest.md +54 -0
- package/templates/room-skeleton/MINTO.md.tmpl +19 -0
- package/templates/room-skeleton/ROOM.md.identity.tmpl +13 -0
- package/templates/room-skeleton/ROOM.md.section.tmpl +33 -0
- package/templates/room-skeleton/STATE.md.tmpl +33 -0
- package/templates/room-skeleton/USER.md.tmpl +23 -0
- package/templates/room-skeleton/references/.gitkeep +0 -0
- package/templates/room-skeleton/references/SECTION-SCHEMA.md +213 -0
- package/templates/room-skeleton/references/SUB-SCHEMAS.md +91 -0
- package/templates/room-skeleton/section-contracts/.gitkeep +0 -0
- package/templates/room-skeleton/section-contracts/business-model.md +32 -0
- package/templates/room-skeleton/section-contracts/competitive-analysis.md +33 -0
- package/templates/room-skeleton/section-contracts/financial-model.md +30 -0
- package/templates/room-skeleton/section-contracts/funding.md +41 -0
- package/templates/room-skeleton/section-contracts/legal-ip.md +30 -0
- package/templates/room-skeleton/section-contracts/market-analysis.md +32 -0
- package/templates/room-skeleton/section-contracts/opportunity-bank.md +39 -0
- package/templates/room-skeleton/section-contracts/problem-definition.md +32 -0
- package/templates/room-skeleton/section-contracts/solution-design.md +36 -0
- package/templates/room-skeleton/section-contracts/strategy.md +35 -0
- package/templates/room-skeleton/section-contracts/team-execution.md +36 -0
- package/templates/shared.css +427 -0
- package/templates/showcase/blueprint.html +432 -0
- package/templates/showcase/library.html +571 -0
- package/templates/showcase/narrative.html +361 -0
- package/templates/showcase/overview.html +468 -0
- package/templates/showcase/synthesis.html +473 -0
- package/templates/signature-footer.html +34 -0
|
@@ -0,0 +1,1126 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
/*
|
|
4
|
+
* scripts/skillopt-triggerloop.cjs - Phase 230-03, WS1.5: the flagged-only REAL trigger-test loop.
|
|
5
|
+
* ==========================================================================
|
|
6
|
+
* The funnel (Plan 02) PREDICTS which skill would fire; this loop MEASURES it by
|
|
7
|
+
* spawning a real subagent and watching the Skill actually fire in the stream-json
|
|
8
|
+
* JSONL. AI-SPEC Pitfall 1 is the load-bearing detail of the whole phase: the
|
|
9
|
+
* `--output-format json` envelope has NO reliable `.messages[]` tool trace, so a
|
|
10
|
+
* genuine fire is observable ONLY in `--output-format stream-json --verbose` output.
|
|
11
|
+
* assertStreamJsonArgs structurally blocks any trigger run that is not stream-json
|
|
12
|
+
* (a trigger rate computed off the json envelope is UNVERIFIED, D7).
|
|
13
|
+
*
|
|
14
|
+
* THE DETECTOR IS PINNED AGAINST A LIVE CAPTURE, NOT DOCUMENTATION.
|
|
15
|
+
* agentskills.io documents a native `{ type:'tool_use', name:'Skill',
|
|
16
|
+
* input:{ skill } }` block. Two live captures against THIS plugin
|
|
17
|
+
* (out/captures/firing-beautiful-question.jsonl and nonfiring-weather.jsonl,
|
|
18
|
+
* produced by live stream-json spawns during Plan 03) prove that the MindrianOS
|
|
19
|
+
* plugin does NOT surface a native Skill tool at all: a skill fires through an MCP
|
|
20
|
+
* tool named `mcp__plugin_mos_mindrian-os__methodology` whose input carries the
|
|
21
|
+
* bare skill name in `input.command`. SKILL_FIRE_TOOL + SKILL_INPUT_FIELD below are
|
|
22
|
+
* read from that firing capture, never assumed. The native `Skill` form is kept as
|
|
23
|
+
* a forward-compat secondary so a future CLI that adds it still detects.
|
|
24
|
+
*
|
|
25
|
+
* Part 1 (this task): preflightPluginLoad, detectSkillFire, assertStreamJsonArgs,
|
|
26
|
+
* the live --capture path, and the fixture-driven --selftest.
|
|
27
|
+
* Part 2 (Task 2): the scratch-checkout revision loop + best-by-validation.
|
|
28
|
+
*
|
|
29
|
+
* CJS only, switch-case argv router, no em-dashes. Reuses lib/core/skillopt-schemas.cjs.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
const fs = require('node:fs');
|
|
33
|
+
const path = require('node:path');
|
|
34
|
+
const { spawnSync } = require('node:child_process');
|
|
35
|
+
|
|
36
|
+
const {
|
|
37
|
+
TriggerResultSchema,
|
|
38
|
+
LoopSummarySchema,
|
|
39
|
+
DescriptionRevisionSchema,
|
|
40
|
+
UnitRecordSchema,
|
|
41
|
+
NOT_EVALUATED_REASONS,
|
|
42
|
+
PHASE_OUT_DIR,
|
|
43
|
+
inlineSchemaJson,
|
|
44
|
+
assertUnderOut,
|
|
45
|
+
assertPinnedModelId,
|
|
46
|
+
} = require('../lib/core/skillopt-schemas.cjs');
|
|
47
|
+
|
|
48
|
+
const REPO_ROOT = path.resolve(__dirname, '..');
|
|
49
|
+
|
|
50
|
+
// The pinned FULL user model id for the trigger-test (sonnet tier - we measure real
|
|
51
|
+
// triggering under the model a user actually runs). assertPinnedModelId preflights it.
|
|
52
|
+
const PINNED_TRIGGER_MODEL = 'claude-sonnet-4-5';
|
|
53
|
+
|
|
54
|
+
// --------------------------------------------------------------------------
|
|
55
|
+
// SKILL-FIRE DETECTION CONSTANTS - PINNED FROM A LIVE CAPTURE (never documentation).
|
|
56
|
+
// Source capture: out/captures/firing-beautiful-question.jsonl (a live stream-json
|
|
57
|
+
// spawn where the query "Reframe my challenge ... as Why / What-if / How" fired the
|
|
58
|
+
// beautiful-question skill). The observed tool_use block was, verbatim:
|
|
59
|
+
// { "type":"tool_use", "name":"mcp__plugin_mos_mindrian-os__methodology",
|
|
60
|
+
// "input": { "command":"beautiful-question", "context":"declining user retention" } }
|
|
61
|
+
// So the fire is an MCP methodology tool_use, and the invoked skill name lives in
|
|
62
|
+
// input.command (bare, no mos: prefix) - NOT the native Skill tool, NOT input.skill.
|
|
63
|
+
// --------------------------------------------------------------------------
|
|
64
|
+
const SKILL_FIRE_TOOL = 'mcp__plugin_mos_mindrian-os__methodology'; // out/captures/firing-beautiful-question.jsonl
|
|
65
|
+
const SKILL_INPUT_FIELD = 'command'; // out/captures/firing-beautiful-question.jsonl : input.command == "beautiful-question"
|
|
66
|
+
const NATIVE_SKILL_TOOL = 'Skill'; // forward-compat secondary (agentskills.io documented form)
|
|
67
|
+
|
|
68
|
+
// More than this fraction of unparseable JSONL lines means the capture is corrupt
|
|
69
|
+
// (never a silent zero-fire - D5). A corrupt stream is jsonl_corrupt, not fired:false.
|
|
70
|
+
const JSONL_CORRUPT_THRESHOLD = 0.20;
|
|
71
|
+
|
|
72
|
+
// The mos plugin name as it appears in system/init.plugins (live capture).
|
|
73
|
+
const MOS_PLUGIN_RE = /mos|mindrian/i;
|
|
74
|
+
|
|
75
|
+
// --------------------------------------------------------------------------
|
|
76
|
+
// resolveTriggerConfig - defaults; concurrency hard-capped at 4 (429-storm guard).
|
|
77
|
+
// --------------------------------------------------------------------------
|
|
78
|
+
const HARD_CAP_CONCURRENCY = 4;
|
|
79
|
+
function resolveTriggerConfig(config) {
|
|
80
|
+
const c = config || {};
|
|
81
|
+
let concurrency = typeof c.concurrency === 'number' && c.concurrency > 0 ? c.concurrency : 3;
|
|
82
|
+
if (concurrency > HARD_CAP_CONCURRENCY) concurrency = HARD_CAP_CONCURRENCY;
|
|
83
|
+
return {
|
|
84
|
+
model: c.model || PINNED_TRIGGER_MODEL,
|
|
85
|
+
reviseModel: c.reviseModel || PINNED_TRIGGER_MODEL,
|
|
86
|
+
pluginDir: c.pluginDir || REPO_ROOT,
|
|
87
|
+
captureMaxTurns: typeof c.captureMaxTurns === 'number' ? c.captureMaxTurns : 4,
|
|
88
|
+
captureBudgetUsd: typeof c.captureBudgetUsd === 'number' ? c.captureBudgetUsd : 0.5,
|
|
89
|
+
triggerBudgetUsd: typeof c.triggerBudgetUsd === 'number' ? c.triggerBudgetUsd : 0.25,
|
|
90
|
+
triggerMaxTurns: typeof c.triggerMaxTurns === 'number' ? c.triggerMaxTurns : 4,
|
|
91
|
+
runsPerQuery: typeof c.runsPerQuery === 'number' && c.runsPerQuery > 0 ? c.runsPerQuery : 3,
|
|
92
|
+
maxIterations: Math.min(typeof c.maxIterations === 'number' ? c.maxIterations : 5, 5), // hard cap 5
|
|
93
|
+
timeoutMs: typeof c.timeoutMs === 'number' ? c.timeoutMs : 180000,
|
|
94
|
+
concurrency,
|
|
95
|
+
reviseRubricPath: c.reviseRubricPath || path.join('references', 'methodology', 'skillopt-revise-rubric.md'),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// --------------------------------------------------------------------------
|
|
100
|
+
// writeAtomic - write-temp-then-rename (copied from huji-batch.writeAtomic:60-64).
|
|
101
|
+
// --------------------------------------------------------------------------
|
|
102
|
+
function writeAtomic(filePath, contents) {
|
|
103
|
+
const tmp = filePath + '.tmp.' + process.pid + '.' + Math.random().toString(36).slice(2, 10);
|
|
104
|
+
fs.writeFileSync(tmp, contents, 'utf8');
|
|
105
|
+
fs.renameSync(tmp, filePath);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function safeStem(name) {
|
|
109
|
+
return String(name || '').replace(/[^A-Za-z0-9._-]/g, '_');
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Strip the optional mos: namespace so a bare name and a namespaced command compare
|
|
113
|
+
// equal (AI-SPEC warns the field may surface either; live capture showed the bare form).
|
|
114
|
+
function normalizeSkillName(s) {
|
|
115
|
+
return String(s == null ? '' : s).replace(/^mos:/, '').trim();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// --------------------------------------------------------------------------
|
|
119
|
+
// extractInvokedSkill(block) - given a tool_use content block, return the invoked
|
|
120
|
+
// skill name if this block is a skill fire, else null. Reads SKILL_INPUT_FIELD from
|
|
121
|
+
// the MCP methodology tool (the live-verified mechanism); falls back to the native
|
|
122
|
+
// Skill tool's documented input shape for forward compatibility.
|
|
123
|
+
// --------------------------------------------------------------------------
|
|
124
|
+
function extractInvokedSkill(block) {
|
|
125
|
+
if (!block || block.type !== 'tool_use') return null;
|
|
126
|
+
const input = block.input || {};
|
|
127
|
+
if (block.name === SKILL_FIRE_TOOL) {
|
|
128
|
+
return input[SKILL_INPUT_FIELD] != null ? String(input[SKILL_INPUT_FIELD]) : null;
|
|
129
|
+
}
|
|
130
|
+
if (block.name === NATIVE_SKILL_TOOL) {
|
|
131
|
+
if (input.skill != null) return String(input.skill);
|
|
132
|
+
if (input.command != null) return String(input.command);
|
|
133
|
+
if (input.name != null) return String(input.name);
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// --------------------------------------------------------------------------
|
|
140
|
+
// detectSkillFire(jsonlText, expectedSkill) - THE load-bearing detector. Splits the
|
|
141
|
+
// stream-json JSONL, JSON.parse per line (skips unparseable lines but COUNTS them:
|
|
142
|
+
// > 20% unparseable is jsonl_corrupt, NEVER a silent zero-fire). Scans assistant
|
|
143
|
+
// events for skill-fire tool_use blocks and matches the invoked name against the
|
|
144
|
+
// expected skill with mos:-namespace tolerance.
|
|
145
|
+
// Returns { ok, reason?, fired, invoked, blocks, total_lines, unparseable_lines }.
|
|
146
|
+
// ok:false + reason:'jsonl_corrupt' when the stream is unusable.
|
|
147
|
+
// When expectedSkill is null, fired == "any skill fired at all" (used for a
|
|
148
|
+
// should_not_trigger query whose skill under test must stay silent).
|
|
149
|
+
// --------------------------------------------------------------------------
|
|
150
|
+
function detectSkillFire(jsonlText, expectedSkill) {
|
|
151
|
+
const rawLines = String(jsonlText == null ? '' : jsonlText)
|
|
152
|
+
.split('\n')
|
|
153
|
+
.map((l) => l.trim())
|
|
154
|
+
.filter(Boolean);
|
|
155
|
+
if (rawLines.length === 0) {
|
|
156
|
+
return { ok: false, reason: 'jsonl_corrupt', fired: false, invoked: null, blocks: [], total_lines: 0, unparseable_lines: 0 };
|
|
157
|
+
}
|
|
158
|
+
let unparseable = 0;
|
|
159
|
+
const events = [];
|
|
160
|
+
for (const ln of rawLines) {
|
|
161
|
+
let ev = null;
|
|
162
|
+
try { ev = JSON.parse(ln); } catch (_e) { unparseable += 1; continue; }
|
|
163
|
+
events.push(ev);
|
|
164
|
+
}
|
|
165
|
+
if (unparseable / rawLines.length > JSONL_CORRUPT_THRESHOLD) {
|
|
166
|
+
return { ok: false, reason: 'jsonl_corrupt', fired: false, invoked: null, blocks: [], total_lines: rawLines.length, unparseable_lines: unparseable };
|
|
167
|
+
}
|
|
168
|
+
const blocks = [];
|
|
169
|
+
const invokedAll = [];
|
|
170
|
+
for (const ev of events) {
|
|
171
|
+
if (!ev || ev.type !== 'assistant' || !ev.message || !Array.isArray(ev.message.content)) continue;
|
|
172
|
+
for (const b of ev.message.content) {
|
|
173
|
+
const inv = extractInvokedSkill(b);
|
|
174
|
+
if (inv !== null) { blocks.push(b); invokedAll.push(inv); }
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const exp = expectedSkill == null ? null : normalizeSkillName(expectedSkill);
|
|
178
|
+
const fired = exp === null ? invokedAll.length > 0 : invokedAll.some((i) => normalizeSkillName(i) === exp);
|
|
179
|
+
return {
|
|
180
|
+
ok: true,
|
|
181
|
+
fired,
|
|
182
|
+
invoked: invokedAll.length ? invokedAll[0] : null,
|
|
183
|
+
blocks,
|
|
184
|
+
total_lines: rawLines.length,
|
|
185
|
+
unparseable_lines: unparseable,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// --------------------------------------------------------------------------
|
|
190
|
+
// assertStreamJsonArgs(args) - the D7 integrity guardrail. A trigger run MUST use
|
|
191
|
+
// --output-format stream-json --verbose; a json-envelope trigger run is rejected so
|
|
192
|
+
// its (unverifiable) trigger rate is never computed. Every real trigger/capture
|
|
193
|
+
// spawn preflights its own arg vector through this.
|
|
194
|
+
// --------------------------------------------------------------------------
|
|
195
|
+
function assertStreamJsonArgs(args) {
|
|
196
|
+
if (!Array.isArray(args)) return { ok: false, reason: 'args_not_array' };
|
|
197
|
+
const i = args.indexOf('--output-format');
|
|
198
|
+
if (i < 0 || args[i + 1] !== 'stream-json') return { ok: false, reason: 'not_stream_json' };
|
|
199
|
+
if (!args.includes('--verbose')) return { ok: false, reason: 'missing_verbose' };
|
|
200
|
+
return { ok: true };
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// --------------------------------------------------------------------------
|
|
204
|
+
// defaultSpawn(args, timeoutMs) - real spawnSync with all fuses; input:'' closes
|
|
205
|
+
// stdin at once (avoids the CLI's 3s "no stdin" wait). Selftests inject a fake.
|
|
206
|
+
// --------------------------------------------------------------------------
|
|
207
|
+
function defaultSpawn(args, timeoutMs) {
|
|
208
|
+
return spawnSync('claude', args, {
|
|
209
|
+
env: process.env, encoding: 'utf8', input: '', maxBuffer: 16 * 1024 * 1024, timeout: timeoutMs,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// --------------------------------------------------------------------------
|
|
214
|
+
// preflightPluginLoad(config) - ONE stream-json run asserting system/init carries
|
|
215
|
+
// the mos plugin and no plugin_errors. Copied from huji-batch.preflightPluginLoad:
|
|
216
|
+
// 162-192. On failure the CALLER aborts the whole run closed before spending (D7 /
|
|
217
|
+
// AI-SPEC Section 6). spawnImpl injectable so the selftest exercises it model-free.
|
|
218
|
+
// --------------------------------------------------------------------------
|
|
219
|
+
function preflightPluginLoad(config) {
|
|
220
|
+
const cfg = resolveTriggerConfig(config);
|
|
221
|
+
const spawn = (config && config.spawnImpl) || defaultSpawn;
|
|
222
|
+
const args = [
|
|
223
|
+
'-p', 'preflight: confirm the plugin is loaded',
|
|
224
|
+
'--plugin-dir', cfg.pluginDir,
|
|
225
|
+
'--output-format', 'stream-json',
|
|
226
|
+
'--verbose',
|
|
227
|
+
'--max-turns', '1',
|
|
228
|
+
'--no-session-persistence',
|
|
229
|
+
];
|
|
230
|
+
const guard = assertStreamJsonArgs(args);
|
|
231
|
+
if (!guard.ok) return { ok: false, reason: 'preflight_args_not_stream_json' };
|
|
232
|
+
const res = spawn(args, Math.min(cfg.timeoutMs, 120000));
|
|
233
|
+
if (!res || res.error) {
|
|
234
|
+
return { ok: false, reason: 'preflight_spawn_failed', detail: res && res.error ? String(res.error.message || res.error).slice(0, 200) : 'no_result' };
|
|
235
|
+
}
|
|
236
|
+
let sawInit = false;
|
|
237
|
+
let pluginLoaded = false;
|
|
238
|
+
let pluginErrors = false;
|
|
239
|
+
for (const ln of String(res.stdout || '').split('\n').filter(Boolean)) {
|
|
240
|
+
let ev = null;
|
|
241
|
+
try { ev = JSON.parse(ln); } catch (_e) { continue; }
|
|
242
|
+
if (!ev || typeof ev !== 'object') continue;
|
|
243
|
+
if ((ev.type === 'system' && ev.subtype === 'init') || ev.plugins !== undefined) {
|
|
244
|
+
sawInit = true;
|
|
245
|
+
const plugins = ev.plugins || [];
|
|
246
|
+
if (Array.isArray(plugins) && plugins.some((p) => MOS_PLUGIN_RE.test(JSON.stringify(p)))) pluginLoaded = true;
|
|
247
|
+
const errs = ev.plugin_errors;
|
|
248
|
+
if (errs && ((Array.isArray(errs) && errs.length) || (typeof errs === 'object' && Object.keys(errs).length))) pluginErrors = true;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (!sawInit) return { ok: false, reason: 'no_system_init' };
|
|
252
|
+
if (pluginErrors) return { ok: false, reason: 'plugin_errors_present' };
|
|
253
|
+
if (!pluginLoaded) return { ok: false, reason: 'plugin_not_loaded' };
|
|
254
|
+
return { ok: true };
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// --------------------------------------------------------------------------
|
|
258
|
+
// buildCaptureArgs / buildTriggerArgs - the spawn arg vectors. Both are stream-json
|
|
259
|
+
// --verbose with the DEFAULT tool set (no --allowedTools) so progressive disclosure
|
|
260
|
+
// runs under real conditions (AI-SPEC Section 4 Tool Use). buildTriggerArgs points
|
|
261
|
+
// --plugin-dir at a scratch checkout; buildCaptureArgs at the given plugin dir.
|
|
262
|
+
// --------------------------------------------------------------------------
|
|
263
|
+
function buildCaptureArgs(query, config) {
|
|
264
|
+
const cfg = resolveTriggerConfig(config);
|
|
265
|
+
return [
|
|
266
|
+
'-p', String(query),
|
|
267
|
+
'--plugin-dir', cfg.pluginDir,
|
|
268
|
+
'--model', cfg.model,
|
|
269
|
+
'--output-format', 'stream-json',
|
|
270
|
+
'--verbose',
|
|
271
|
+
'--permission-mode', 'dontAsk',
|
|
272
|
+
'--max-turns', String(cfg.captureMaxTurns),
|
|
273
|
+
'--max-budget-usd', String(cfg.captureBudgetUsd),
|
|
274
|
+
'--no-session-persistence',
|
|
275
|
+
];
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function buildTriggerArgs(query, pluginDir, config) {
|
|
279
|
+
const cfg = resolveTriggerConfig(config);
|
|
280
|
+
return [
|
|
281
|
+
'-p', String(query),
|
|
282
|
+
'--plugin-dir', pluginDir,
|
|
283
|
+
'--model', cfg.model,
|
|
284
|
+
'--output-format', 'stream-json',
|
|
285
|
+
'--verbose',
|
|
286
|
+
'--permission-mode', 'dontAsk',
|
|
287
|
+
'--max-turns', String(cfg.triggerMaxTurns),
|
|
288
|
+
'--max-budget-usd', String(cfg.triggerBudgetUsd),
|
|
289
|
+
'--no-session-persistence',
|
|
290
|
+
];
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// --------------------------------------------------------------------------
|
|
294
|
+
// runCapture({ skill, query, outDir, config, spawnImpl }) - the ONE live step in
|
|
295
|
+
// this plan. preflight (abort closed on failure), spawn ONE stream-json subagent,
|
|
296
|
+
// write the raw JSONL to out/captures/<skill>.jsonl (assertUnderOut first), then
|
|
297
|
+
// report what the detector saw. No capture spawn happens after a failed preflight.
|
|
298
|
+
// --------------------------------------------------------------------------
|
|
299
|
+
function runCapture(opts) {
|
|
300
|
+
const o = opts || {};
|
|
301
|
+
const cfg = resolveTriggerConfig(o.config);
|
|
302
|
+
const outDir = o.outDir || path.join(REPO_ROOT, PHASE_OUT_DIR);
|
|
303
|
+
const spawn = o.spawnImpl || defaultSpawn;
|
|
304
|
+
|
|
305
|
+
if (o.preflight !== false) {
|
|
306
|
+
const pf = preflightPluginLoad(Object.assign({}, o.config, { spawnImpl: o.preflightSpawnImpl || spawn }));
|
|
307
|
+
if (!pf.ok) return { ok: false, reason: 'preflight_failed', detail: pf, spawned: false };
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const args = buildCaptureArgs(o.query, cfg);
|
|
311
|
+
const guard = assertStreamJsonArgs(args);
|
|
312
|
+
if (!guard.ok) return { ok: false, reason: 'capture_args_not_stream_json', spawned: false };
|
|
313
|
+
|
|
314
|
+
const res = spawn(args, cfg.timeoutMs);
|
|
315
|
+
if (!res || res.error) return { ok: false, reason: 'capture_spawn_failed', spawned: true };
|
|
316
|
+
const jsonl = String(res.stdout || '');
|
|
317
|
+
|
|
318
|
+
const target = path.join(outDir, 'captures', safeStem(o.skill) + '.jsonl');
|
|
319
|
+
const under = assertUnderOut(target, outDir);
|
|
320
|
+
if (!under.ok) return { ok: false, reason: 'capture_outside_out', target, spawned: true };
|
|
321
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
322
|
+
writeAtomic(target, jsonl);
|
|
323
|
+
|
|
324
|
+
const det = detectSkillFire(jsonl, o.skill);
|
|
325
|
+
return { ok: true, spawned: true, path: target, fired: det.fired, invoked: det.invoked, detector: det };
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// --------------------------------------------------------------------------
|
|
329
|
+
// makeTriggerUnitRecord - a UnitRecord (kind 'trigger') for one run. status
|
|
330
|
+
// 'not_evaluated' MUST carry a closed-vocabulary reason (D5). Never a silent skip.
|
|
331
|
+
// --------------------------------------------------------------------------
|
|
332
|
+
function makeTriggerUnitRecord(o) {
|
|
333
|
+
const rec = {
|
|
334
|
+
unit_id: o.unitId,
|
|
335
|
+
kind: 'trigger',
|
|
336
|
+
model: o.model,
|
|
337
|
+
session_id: o.sessionId != null ? o.sessionId : null,
|
|
338
|
+
total_cost_usd: typeof o.costUsd === 'number' ? o.costUsd : null,
|
|
339
|
+
exit: typeof o.exit === 'number' ? o.exit : null,
|
|
340
|
+
status: o.status,
|
|
341
|
+
not_evaluated_reason: o.reason || null,
|
|
342
|
+
error_issues: o.issues || null,
|
|
343
|
+
payload: o.payload != null ? o.payload : null,
|
|
344
|
+
};
|
|
345
|
+
const parsed = UnitRecordSchema.safeParse(rec);
|
|
346
|
+
if (!parsed.success) {
|
|
347
|
+
throw new Error('skillopt-triggerloop: internal trigger UnitRecord invalid: ' + JSON.stringify(parsed.error.issues));
|
|
348
|
+
}
|
|
349
|
+
return rec;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// ==========================================================================
|
|
353
|
+
// PART 2 (Task 2): scratch-checkout revision loop + best-by-validation selection.
|
|
354
|
+
// ==========================================================================
|
|
355
|
+
|
|
356
|
+
const matter = require('gray-matter');
|
|
357
|
+
|
|
358
|
+
// --------------------------------------------------------------------------
|
|
359
|
+
// runPool - dependency-free bounded concurrency pool (copied verbatim from
|
|
360
|
+
// huji-batch.cjs:200-229). Used for the runsPerQuery fan-out. getLimit re-read each
|
|
361
|
+
// iteration; never an unbounded parallel-all (429-storm guard, Pitfall 5).
|
|
362
|
+
// --------------------------------------------------------------------------
|
|
363
|
+
async function runPool({ items, getLimit, worker, onSettle }) {
|
|
364
|
+
let idx = 0;
|
|
365
|
+
const running = [];
|
|
366
|
+
const results = [];
|
|
367
|
+
const limitNow = () => Math.max(0, getLimit());
|
|
368
|
+
while (idx < items.length || running.length > 0) {
|
|
369
|
+
while (idx < items.length && running.length < limitNow()) {
|
|
370
|
+
const item = items[idx++];
|
|
371
|
+
const entry = { done: false };
|
|
372
|
+
entry.promise = (async () => {
|
|
373
|
+
try { entry.settled = { item, res: await worker(item) }; }
|
|
374
|
+
catch (err) { entry.settled = { item, err }; }
|
|
375
|
+
entry.done = true;
|
|
376
|
+
return entry.settled;
|
|
377
|
+
})();
|
|
378
|
+
running.push(entry);
|
|
379
|
+
}
|
|
380
|
+
if (running.length === 0) break;
|
|
381
|
+
await Promise.race(running.map((e) => e.promise));
|
|
382
|
+
for (let i = running.length - 1; i >= 0; i--) {
|
|
383
|
+
if (running[i].done) {
|
|
384
|
+
const settled = running[i].settled;
|
|
385
|
+
results.push(settled);
|
|
386
|
+
running.splice(i, 1);
|
|
387
|
+
if (onSettle) onSettle(settled);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
return results;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// The plugin surface a --plugin-dir checkout needs to (a) load the full skill roster
|
|
395
|
+
// AND (b) run the MCP methodology server that actually fires a skill (per the live
|
|
396
|
+
// capture, the fire is mcp__plugin_mos_mindrian-os__methodology). node_modules is
|
|
397
|
+
// symlinked, not copied, so the MCP server resolves its deps without a heavy copy.
|
|
398
|
+
const SCRATCH_COPY_ENTRIES = Object.freeze([
|
|
399
|
+
'.claude-plugin', '.mcp.json', 'skills', 'commands', 'agents', 'hooks',
|
|
400
|
+
'bin', 'lib', 'scripts', 'references', 'data', 'pipelines', 'package.json',
|
|
401
|
+
]);
|
|
402
|
+
const SCRATCH_SYMLINK_ENTRIES = Object.freeze(['node_modules']);
|
|
403
|
+
|
|
404
|
+
// --------------------------------------------------------------------------
|
|
405
|
+
// buildScratchCheckout(skill, description, scratchDir, opts) - copy the plugin
|
|
406
|
+
// skill-loading + MCP surface into out/scratch/<skill>/ (assertUnderOut FIRST, fail
|
|
407
|
+
// closed - the real skills/ tree is NEVER a write target, CFM4/D6), then rewrite
|
|
408
|
+
// ONLY that skill's SKILL.md description frontmatter inside the scratch copy. The
|
|
409
|
+
// full roster is present so progressive disclosure runs under real conditions.
|
|
410
|
+
// --------------------------------------------------------------------------
|
|
411
|
+
function buildScratchCheckout(skill, description, scratchDir, opts) {
|
|
412
|
+
const o = opts || {};
|
|
413
|
+
const sourceRoot = o.sourceRoot || REPO_ROOT;
|
|
414
|
+
const outRoot = o.outRoot || path.join(REPO_ROOT, PHASE_OUT_DIR);
|
|
415
|
+
|
|
416
|
+
// Containment: scratchDir MUST be under the out sandbox. This structurally forbids
|
|
417
|
+
// ever pointing the checkout at the shipped skills/ or scripts/ tree.
|
|
418
|
+
const under = assertUnderOut(scratchDir, outRoot);
|
|
419
|
+
if (!under.ok) return { ok: false, reason: 'scratch_outside_out', scratchDir };
|
|
420
|
+
|
|
421
|
+
const skillDir = o.skillDir || skill; // inventory dir == skill name in this repo
|
|
422
|
+
if (o.copyImpl) {
|
|
423
|
+
// Injected copy for the selftest (no real 100MB clone); still exercises the guard + rewrite.
|
|
424
|
+
o.copyImpl(sourceRoot, scratchDir);
|
|
425
|
+
} else {
|
|
426
|
+
fs.mkdirSync(scratchDir, { recursive: true });
|
|
427
|
+
for (const entry of SCRATCH_COPY_ENTRIES) {
|
|
428
|
+
const src = path.join(sourceRoot, entry);
|
|
429
|
+
if (!fs.existsSync(src)) continue;
|
|
430
|
+
fs.cpSync(src, path.join(scratchDir, entry), { recursive: true });
|
|
431
|
+
}
|
|
432
|
+
for (const entry of SCRATCH_SYMLINK_ENTRIES) {
|
|
433
|
+
const src = path.join(sourceRoot, entry);
|
|
434
|
+
const dst = path.join(scratchDir, entry);
|
|
435
|
+
if (fs.existsSync(src) && !fs.existsSync(dst)) {
|
|
436
|
+
try { fs.symlinkSync(src, dst); } catch (_e) { /* symlink optional */ }
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// Rewrite ONLY the candidate skill's description in the scratch copy.
|
|
442
|
+
const skillMdPath = path.join(scratchDir, 'skills', skillDir, 'SKILL.md');
|
|
443
|
+
const guard = assertUnderOut(skillMdPath, outRoot);
|
|
444
|
+
if (!guard.ok) return { ok: false, reason: 'skill_md_outside_out', skillMdPath };
|
|
445
|
+
if (fs.existsSync(skillMdPath) && description != null) {
|
|
446
|
+
const parsed = matter(fs.readFileSync(skillMdPath, 'utf8'));
|
|
447
|
+
parsed.data.description = description;
|
|
448
|
+
writeAtomic(skillMdPath, matter.stringify(parsed.content, parsed.data));
|
|
449
|
+
}
|
|
450
|
+
return { ok: true, scratchDir, skillMdPath };
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// --------------------------------------------------------------------------
|
|
454
|
+
// runTriggerQuery({ skill, query, scratchDir, config, iteration, split, spawnImpl })
|
|
455
|
+
// - measure ONE query: runsPerQuery real stream-json spawns against the scratch
|
|
456
|
+
// checkout, each detected via detectSkillFire(jsonl, skill). assertStreamJsonArgs
|
|
457
|
+
// preflights every arg vector (D7). A spawn/timeout/corrupt-JSONL run lands as a
|
|
458
|
+
// not_evaluated trigger UnitRecord and is EXCLUDED from both numerator AND
|
|
459
|
+
// denominator; the rate is over completed runs only, never inflated (D5/D11).
|
|
460
|
+
// --------------------------------------------------------------------------
|
|
461
|
+
async function runTriggerQuery(opts) {
|
|
462
|
+
const o = opts || {};
|
|
463
|
+
const cfg = resolveTriggerConfig(o.config);
|
|
464
|
+
const spawn = o.spawnImpl || defaultSpawn;
|
|
465
|
+
const runs = cfg.runsPerQuery;
|
|
466
|
+
const items = Array.from({ length: runs }, (_v, i) => i);
|
|
467
|
+
|
|
468
|
+
let fires = 0;
|
|
469
|
+
let completed = 0;
|
|
470
|
+
const notEvaluated = [];
|
|
471
|
+
|
|
472
|
+
const worker = async (runIdx) => {
|
|
473
|
+
const args = buildTriggerArgs(o.query, o.scratchDir, cfg);
|
|
474
|
+
const guard = assertStreamJsonArgs(args);
|
|
475
|
+
if (!guard.ok) return { runIdx, notEvaluated: true, reason: 'schema_fail' };
|
|
476
|
+
const res = spawn(args, cfg.timeoutMs);
|
|
477
|
+
if (!res || res.error) return { runIdx, notEvaluated: true, reason: 'spawn_failed' };
|
|
478
|
+
if (res.signal === 'SIGTERM') return { runIdx, notEvaluated: true, reason: 'timeout' };
|
|
479
|
+
if (typeof res.status === 'number' && res.status !== 0) return { runIdx, notEvaluated: true, reason: 'nonzero_exit' };
|
|
480
|
+
const det = detectSkillFire(String(res.stdout || ''), o.skill);
|
|
481
|
+
if (!det.ok) return { runIdx, notEvaluated: true, reason: 'empty_envelope' }; // jsonl_corrupt -> not_evaluated, never a silent no-fire
|
|
482
|
+
return { runIdx, notEvaluated: false, fired: det.fired };
|
|
483
|
+
};
|
|
484
|
+
|
|
485
|
+
const onSettle = (settled) => {
|
|
486
|
+
const r = settled.res;
|
|
487
|
+
if (!r) return;
|
|
488
|
+
if (r.notEvaluated) { notEvaluated.push(r); return; }
|
|
489
|
+
completed += 1;
|
|
490
|
+
if (r.fired) fires += 1;
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
await runPool({ items, getLimit: () => cfg.concurrency, worker, onSettle });
|
|
494
|
+
|
|
495
|
+
const trigger_rate = completed > 0 ? fires / completed : 0;
|
|
496
|
+
return {
|
|
497
|
+
skill: o.skill,
|
|
498
|
+
query: o.query,
|
|
499
|
+
split: o.split || 'train',
|
|
500
|
+
iteration: typeof o.iteration === 'number' ? o.iteration : 0,
|
|
501
|
+
runs,
|
|
502
|
+
fires,
|
|
503
|
+
completed_runs: completed,
|
|
504
|
+
not_evaluated_runs: notEvaluated.length,
|
|
505
|
+
trigger_rate,
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// A query PASSES depending on its kind: a should_trigger query needs the skill under
|
|
510
|
+
// test to fire in at least 2/3 of the completed runs; a should_not_trigger query
|
|
511
|
+
// needs it to fire in ZERO runs (do-no-harm to a sibling, D3).
|
|
512
|
+
const SHOULD_TRIGGER_PASS_RATE = 2 / 3;
|
|
513
|
+
function queryPasses(kind, triggerRate) {
|
|
514
|
+
if (kind === 'should_not_trigger') return triggerRate === 0;
|
|
515
|
+
return triggerRate >= SHOULD_TRIGGER_PASS_RATE;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
// --------------------------------------------------------------------------
|
|
519
|
+
// buildRevisePrompt / buildReviseArgs - the revision-subagent spawn. TRAIN failures
|
|
520
|
+
// ONLY in -p; the frozen rubric in --append-system-prompt-file; inline
|
|
521
|
+
// DescriptionRevisionSchema; --allowedTools Read; --max-turns 2. The prompt NEVER
|
|
522
|
+
// contains a validation query string (overfitting guard, AI-SPEC 1b Dimension 3).
|
|
523
|
+
// --------------------------------------------------------------------------
|
|
524
|
+
function buildRevisePrompt(o) {
|
|
525
|
+
const lines = [
|
|
526
|
+
'SKILL: ' + o.skill,
|
|
527
|
+
'CURRENT DESCRIPTION: ' + (o.currentDescription || ''),
|
|
528
|
+
'',
|
|
529
|
+
'NAMED SIBLING SKILLS (make this skill distinct from these):',
|
|
530
|
+
];
|
|
531
|
+
for (const s of (o.siblings || [])) lines.push('- ' + s.skill + ': ' + s.description);
|
|
532
|
+
lines.push('');
|
|
533
|
+
lines.push('TRAIN-SET FAILURES (optimize against these ONLY):');
|
|
534
|
+
for (const f of (o.trainFailures || [])) {
|
|
535
|
+
lines.push('- query: ' + f.query + ' | should fire: ' + (f.expected == null ? 'none' : f.expected) + ' | actually fired: ' + (f.actually_fired == null ? 'nothing' : f.actually_fired));
|
|
536
|
+
}
|
|
537
|
+
lines.push('');
|
|
538
|
+
lines.push('Rewrite the description per the rubric. Return only the JSON the schema describes.');
|
|
539
|
+
return lines.join('\n');
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
function buildReviseArgs(o, config) {
|
|
543
|
+
const cfg = resolveTriggerConfig(config);
|
|
544
|
+
return [
|
|
545
|
+
'-p', buildRevisePrompt(o),
|
|
546
|
+
'--append-system-prompt-file', cfg.reviseRubricPath,
|
|
547
|
+
'--plugin-dir', cfg.pluginDir,
|
|
548
|
+
'--model', cfg.reviseModel,
|
|
549
|
+
'--output-format', 'json',
|
|
550
|
+
'--json-schema', inlineSchemaJson(DescriptionRevisionSchema),
|
|
551
|
+
'--allowedTools', 'Read',
|
|
552
|
+
'--max-turns', '2',
|
|
553
|
+
'--max-budget-usd', String(cfg.triggerBudgetUsd),
|
|
554
|
+
'--permission-mode', 'dontAsk',
|
|
555
|
+
'--no-session-persistence',
|
|
556
|
+
];
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
// --------------------------------------------------------------------------
|
|
560
|
+
// selectBestIteration(iterations) - THE do-no-harm selector (D3/CFM1). Picks the
|
|
561
|
+
// iteration with the highest VALIDATION pass-rate (ties break to the EARLIEST, so
|
|
562
|
+
// the selector can NEVER drift to "last iteration"). Keeps baseline unless a later
|
|
563
|
+
// iteration strictly improves it. regressed_query_count = validation queries that
|
|
564
|
+
// passed at iteration 0 but fail in the chosen candidate; ANY regression BLOCKS the
|
|
565
|
+
// proposed diff (proposed_description stays null). converged=false when no iteration
|
|
566
|
+
// beat baseline (best-by-validation baseline kept, marked did-not-converge).
|
|
567
|
+
// iterations[i] = { iteration, validation_pass_rate, validation_passed_set:Set,
|
|
568
|
+
// description? }.
|
|
569
|
+
// --------------------------------------------------------------------------
|
|
570
|
+
function selectBestIteration(iterations) {
|
|
571
|
+
const baseline = iterations[0];
|
|
572
|
+
let best = baseline;
|
|
573
|
+
for (let i = 1; i < iterations.length; i++) {
|
|
574
|
+
if (iterations[i].validation_pass_rate > best.validation_pass_rate) best = iterations[i];
|
|
575
|
+
}
|
|
576
|
+
const improved = best.iteration !== baseline.iteration && best.validation_pass_rate > baseline.validation_pass_rate;
|
|
577
|
+
const chosen = improved ? best : baseline;
|
|
578
|
+
|
|
579
|
+
const baseSet = baseline.validation_passed_set || new Set();
|
|
580
|
+
const chosenSet = chosen.validation_passed_set || new Set();
|
|
581
|
+
const regressed_queries = [...baseSet].filter((q) => !chosenSet.has(q));
|
|
582
|
+
const regressed_query_count = improved ? regressed_queries.length : 0;
|
|
583
|
+
const blocked_by_regression = regressed_query_count > 0;
|
|
584
|
+
const converged = improved;
|
|
585
|
+
const proposed_description = (improved && !blocked_by_regression && chosen.description != null) ? chosen.description : null;
|
|
586
|
+
|
|
587
|
+
return {
|
|
588
|
+
best_iteration: chosen.iteration,
|
|
589
|
+
baseline_validation_rate: baseline.validation_pass_rate,
|
|
590
|
+
best_validation_rate: chosen.validation_pass_rate,
|
|
591
|
+
regressed_query_count,
|
|
592
|
+
regressed_queries,
|
|
593
|
+
converged,
|
|
594
|
+
blocked_by_regression,
|
|
595
|
+
proposed_description,
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
// Measure one iteration's whole query set. Returns per-query TriggerResult rows plus
|
|
600
|
+
// the validation pass-set + rate. measureImpl is injectable so the selftest drives
|
|
601
|
+
// canned rates with zero spawn; the default measures via runTriggerQuery.
|
|
602
|
+
async function measureIteration(o) {
|
|
603
|
+
const { skill, queries, scratchDir, iteration, config } = o;
|
|
604
|
+
const measure = o.measureImpl || (async (q) => runTriggerQuery({
|
|
605
|
+
skill, query: q.query, scratchDir, iteration, split: q.split, config, spawnImpl: o.spawnImpl,
|
|
606
|
+
}));
|
|
607
|
+
const rows = [];
|
|
608
|
+
const validationPassed = new Set();
|
|
609
|
+
let validationTotal = 0;
|
|
610
|
+
for (const q of queries) {
|
|
611
|
+
const m = await measure(q, iteration);
|
|
612
|
+
const row = {
|
|
613
|
+
skill, query: q.query, split: q.split, iteration,
|
|
614
|
+
runs: m.runs, fires: m.fires, trigger_rate: m.trigger_rate,
|
|
615
|
+
completed_runs: m.completed_runs, not_evaluated_runs: m.not_evaluated_runs, kind: q.kind,
|
|
616
|
+
};
|
|
617
|
+
const parsed = TriggerResultSchema.safeParse({
|
|
618
|
+
skill: row.skill, query: row.query, split: row.split, iteration: row.iteration,
|
|
619
|
+
runs: row.runs, fires: row.fires, trigger_rate: Number(row.trigger_rate.toFixed(4)),
|
|
620
|
+
});
|
|
621
|
+
if (!parsed.success) throw new Error('measureIteration: TriggerResult invalid: ' + JSON.stringify(parsed.error.issues));
|
|
622
|
+
rows.push(row);
|
|
623
|
+
if (q.split === 'validation') {
|
|
624
|
+
validationTotal += 1;
|
|
625
|
+
if (queryPasses(q.kind, m.trigger_rate)) validationPassed.add(q.query);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
const validation_pass_rate = validationTotal > 0 ? validationPassed.size / validationTotal : 0;
|
|
629
|
+
return { iteration, rows, validation_passed_set: validationPassed, validation_pass_rate, validation_total: validationTotal };
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
// Collect the TRAIN failures of an iteration (what the reviser is allowed to see).
|
|
633
|
+
function trainFailures(iterationMeasure, baselineDescriptionBySkill) {
|
|
634
|
+
const fails = [];
|
|
635
|
+
for (const row of iterationMeasure.rows) {
|
|
636
|
+
if (row.split !== 'train') continue;
|
|
637
|
+
if (!queryPasses(row.kind, row.trigger_rate)) {
|
|
638
|
+
fails.push({ query: row.query, expected: row.kind === 'should_not_trigger' ? null : row.skill, actually_fired: row.trigger_rate > 0 ? 'the skill fired when it should not' : 'nothing' });
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
return fails;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
// --------------------------------------------------------------------------
|
|
645
|
+
// runLoopForSkill({ skill, queries, config, ... }) - the full flagged-skill loop.
|
|
646
|
+
// Iteration 0 = baseline. Then up to maxIterations (hard cap 5): revise against
|
|
647
|
+
// TRAIN failures only, rebuild the scratch checkout with the candidate, re-measure
|
|
648
|
+
// train + validation. Select best by validation pass-rate with the do-no-harm gate.
|
|
649
|
+
// Persists out/loop/<skill>/iteration-<n>.json + summary.json (LoopSummary-valid).
|
|
650
|
+
// reviseImpl/measureImpl/scratchImpl injectable so the selftest runs zero-spawn.
|
|
651
|
+
// --------------------------------------------------------------------------
|
|
652
|
+
async function runLoopForSkill(o) {
|
|
653
|
+
const cfg = resolveTriggerConfig(o.config);
|
|
654
|
+
const skill = o.skill;
|
|
655
|
+
const queries = o.queries || [];
|
|
656
|
+
const outDir = o.outDir || path.join(REPO_ROOT, PHASE_OUT_DIR);
|
|
657
|
+
const loopDir = path.join(outDir, 'loop', safeStem(skill));
|
|
658
|
+
|
|
659
|
+
const scratchImpl = o.scratchImpl || ((desc, iter) => buildScratchCheckout(skill, desc, path.join(outDir, 'scratch', safeStem(skill)), { skillDir: o.skillDir, outRoot: outDir }));
|
|
660
|
+
const reviseImpl = o.reviseImpl || defaultReviseImpl;
|
|
661
|
+
|
|
662
|
+
const iterations = [];
|
|
663
|
+
const persist = (iterMeasure) => {
|
|
664
|
+
if (o._noWrite) return;
|
|
665
|
+
const target = path.join(loopDir, 'iteration-' + iterMeasure.iteration + '.json');
|
|
666
|
+
const guard = assertUnderOut(target, outDir);
|
|
667
|
+
if (!guard.ok) throw new Error('runLoopForSkill: iteration path outside out: ' + target);
|
|
668
|
+
fs.mkdirSync(loopDir, { recursive: true });
|
|
669
|
+
const persistable = iterMeasure.rows.map((r) => ({
|
|
670
|
+
skill: r.skill, query: r.query, split: r.split, iteration: r.iteration,
|
|
671
|
+
runs: r.runs, fires: r.fires, trigger_rate: Number(r.trigger_rate.toFixed(4)),
|
|
672
|
+
}));
|
|
673
|
+
writeAtomic(target, JSON.stringify(persistable, null, 2) + '\n');
|
|
674
|
+
};
|
|
675
|
+
|
|
676
|
+
// Iteration 0: baseline description, measured on train + validation.
|
|
677
|
+
const baselineDesc = o.baselineDescription != null ? o.baselineDescription : null;
|
|
678
|
+
let currentDesc = baselineDesc;
|
|
679
|
+
scratchImpl(currentDesc, 0);
|
|
680
|
+
const m0 = await measureIteration({ skill, queries, scratchDir: path.join(outDir, 'scratch', safeStem(skill)), iteration: 0, config: cfg, measureImpl: o.measureImpl, spawnImpl: o.spawnImpl });
|
|
681
|
+
m0.description = baselineDesc;
|
|
682
|
+
iterations.push(m0);
|
|
683
|
+
persist(m0);
|
|
684
|
+
|
|
685
|
+
for (let iter = 1; iter <= cfg.maxIterations; iter++) {
|
|
686
|
+
const prev = iterations[iterations.length - 1];
|
|
687
|
+
const fails = trainFailures(prev);
|
|
688
|
+
const revision = await reviseImpl({ skill, currentDescription: currentDesc, siblings: o.siblings || [], trainFailures: fails, iteration: iter, config: cfg });
|
|
689
|
+
if (!revision || revision.description == null) break; // reviser failed; keep best so far
|
|
690
|
+
currentDesc = revision.description;
|
|
691
|
+
scratchImpl(currentDesc, iter);
|
|
692
|
+
const m = await measureIteration({ skill, queries, scratchDir: path.join(outDir, 'scratch', safeStem(skill)), iteration: iter, config: cfg, measureImpl: o.measureImpl, spawnImpl: o.spawnImpl });
|
|
693
|
+
m.description = currentDesc;
|
|
694
|
+
iterations.push(m);
|
|
695
|
+
persist(m);
|
|
696
|
+
// Early stop if a strict validation improvement with zero regression is already banked.
|
|
697
|
+
const interim = selectBestIteration(iterations);
|
|
698
|
+
if (interim.converged && !interim.blocked_by_regression && interim.best_iteration === iter) {
|
|
699
|
+
// keep going only if more iterations could help; but a clean win is a fine place to stop.
|
|
700
|
+
if (o.stopOnFirstCleanWin) break;
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
const selection = selectBestIteration(iterations);
|
|
705
|
+
const summary = {
|
|
706
|
+
skill,
|
|
707
|
+
iterations_run: Math.min(iterations.length - 1, 5), // revision iterations beyond baseline, cap 5
|
|
708
|
+
best_iteration: selection.best_iteration,
|
|
709
|
+
selected_by: 'validation_pass_rate',
|
|
710
|
+
baseline_validation_rate: Number(selection.baseline_validation_rate.toFixed(4)),
|
|
711
|
+
best_validation_rate: Number(selection.best_validation_rate.toFixed(4)),
|
|
712
|
+
regressed_query_count: selection.regressed_query_count,
|
|
713
|
+
converged: selection.converged,
|
|
714
|
+
proposed_description: selection.proposed_description,
|
|
715
|
+
};
|
|
716
|
+
const parsed = LoopSummarySchema.safeParse(summary);
|
|
717
|
+
if (!parsed.success) throw new Error('runLoopForSkill: LoopSummary invalid: ' + JSON.stringify(parsed.error.issues));
|
|
718
|
+
|
|
719
|
+
const summaryOut = Object.assign({}, summary, {
|
|
720
|
+
blocked_by_regression: selection.blocked_by_regression,
|
|
721
|
+
regressed_queries: selection.regressed_queries,
|
|
722
|
+
});
|
|
723
|
+
if (!o._noWrite) {
|
|
724
|
+
const target = path.join(loopDir, 'summary.json');
|
|
725
|
+
const guard = assertUnderOut(target, outDir);
|
|
726
|
+
if (!guard.ok) throw new Error('runLoopForSkill: summary path outside out: ' + target);
|
|
727
|
+
fs.mkdirSync(loopDir, { recursive: true });
|
|
728
|
+
writeAtomic(target, JSON.stringify(summaryOut, null, 2) + '\n');
|
|
729
|
+
}
|
|
730
|
+
return { summary: summaryOut, iterations, selection };
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
// Default revision spawn: build args, spawn json, unwrap + validate DescriptionRevision.
|
|
734
|
+
function defaultReviseImpl(o) {
|
|
735
|
+
const cfg = resolveTriggerConfig(o.config);
|
|
736
|
+
const args = buildReviseArgs(o, cfg);
|
|
737
|
+
const res = spawnSync('claude', args, { env: process.env, encoding: 'utf8', input: '', maxBuffer: 8 * 1024 * 1024, timeout: cfg.timeoutMs });
|
|
738
|
+
if (!res || res.error || (typeof res.status === 'number' && res.status !== 0)) return null;
|
|
739
|
+
let env = null;
|
|
740
|
+
try { env = JSON.parse(String(res.stdout || '')); } catch (_e) { return null; }
|
|
741
|
+
let structured = env && env.structured_output;
|
|
742
|
+
if (!structured && env && typeof env.result === 'string') {
|
|
743
|
+
try { structured = JSON.parse(env.result); } catch (_e) { structured = null; }
|
|
744
|
+
}
|
|
745
|
+
if (!structured) return null;
|
|
746
|
+
const parsed = DescriptionRevisionSchema.safeParse(Object.assign({ skill: o.skill, iteration: o.iteration }, structured));
|
|
747
|
+
return parsed.success ? parsed.data : null;
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
// --------------------------------------------------------------------------
|
|
751
|
+
// runLoopsFromFunnel - the DEFERRED live entry (gated to the smoke opt-in per
|
|
752
|
+
// CONTEXT.md; this plan runs only the two capture spawns live). Reads the flagged
|
|
753
|
+
// subset from out/funnel/funnel-results.json and the per-skill query sets, then runs
|
|
754
|
+
// runLoopForSkill for each. Aborts closed if the plugin preflight fails.
|
|
755
|
+
// --------------------------------------------------------------------------
|
|
756
|
+
async function runLoopsFromFunnel(o) {
|
|
757
|
+
const outDir = o.outDir;
|
|
758
|
+
const cfg = resolveTriggerConfig(o.config);
|
|
759
|
+
const pf = preflightPluginLoad(cfg);
|
|
760
|
+
if (!pf.ok) { console.error('skillopt-triggerloop: plugin preflight failed (' + pf.reason + ') - aborting closed.'); process.exit(1); }
|
|
761
|
+
|
|
762
|
+
let funnel = null;
|
|
763
|
+
try { funnel = JSON.parse(fs.readFileSync(path.join(outDir, 'funnel', 'funnel-results.json'), 'utf8')); } catch (_e) { funnel = null; }
|
|
764
|
+
if (!funnel || !Array.isArray(funnel.skills)) { console.error('skillopt-triggerloop: no funnel-results.json - run the funnel first.'); process.exit(2); }
|
|
765
|
+
let flagged = funnel.skills.filter((s) => s.verdict === 'flagged').map((s) => s.skill);
|
|
766
|
+
if (o.skills && o.skills.length) flagged = flagged.filter((s) => o.skills.includes(s));
|
|
767
|
+
|
|
768
|
+
const summaries = [];
|
|
769
|
+
for (const skill of flagged) {
|
|
770
|
+
let set = null;
|
|
771
|
+
try { set = JSON.parse(fs.readFileSync(path.join(outDir, 'queries', safeStem(skill) + '.json'), 'utf8')); } catch (_e) { set = null; }
|
|
772
|
+
if (!set || !Array.isArray(set.queries)) continue;
|
|
773
|
+
const r = await runLoopForSkill({ skill, queries: set.queries, baselineDescription: null, config: cfg, outDir });
|
|
774
|
+
summaries.push(r.summary);
|
|
775
|
+
console.log('loop ' + skill + ': best_iter=' + r.summary.best_iteration + ' validation ' + r.summary.baseline_validation_rate + ' -> ' + r.summary.best_validation_rate + (r.summary.blocked_by_regression ? ' BLOCKED(regression)' : '') + (r.summary.converged ? '' : ' did-not-converge'));
|
|
776
|
+
}
|
|
777
|
+
console.log('OK skillopt-triggerloop: looped ' + summaries.length + ' flagged skills.');
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// --------------------------------------------------------------------------
|
|
781
|
+
// runSelftestPart2 - fixture-driven, ZERO spawn. Four required fixtures:
|
|
782
|
+
// (1) best-by-validation picks iteration 2 for rates [0.5,0.7,0.9,0.8] (not last).
|
|
783
|
+
// (2) a candidate with a higher aggregate rate but one regressed validation query
|
|
784
|
+
// is BLOCKED (regressed_query_count > 0, proposed_description null).
|
|
785
|
+
// (3) a 5-iteration no-improvement run yields converged:false with baseline kept.
|
|
786
|
+
// (4) a scratch checkout targeting skills/ is rejected by assertUnderOut.
|
|
787
|
+
// plus: the revise prompt contains train queries and NONE of the validation ones.
|
|
788
|
+
// --------------------------------------------------------------------------
|
|
789
|
+
function runSelftestPart2(assert) {
|
|
790
|
+
// (1) best-by-validation not-last.
|
|
791
|
+
const s1 = selectBestIteration([
|
|
792
|
+
{ iteration: 0, validation_pass_rate: 0.5, validation_passed_set: new Set(['a']) },
|
|
793
|
+
{ iteration: 1, validation_pass_rate: 0.7, validation_passed_set: new Set(['a', 'b']) },
|
|
794
|
+
{ iteration: 2, validation_pass_rate: 0.9, validation_passed_set: new Set(['a', 'b', 'c']), description: 'best desc' },
|
|
795
|
+
{ iteration: 3, validation_pass_rate: 0.8, validation_passed_set: new Set(['a', 'b']) },
|
|
796
|
+
]);
|
|
797
|
+
assert.strictEqual(s1.best_iteration, 2, 'part2: best-by-validation must pick iteration 2, not the last (3)');
|
|
798
|
+
assert.strictEqual(s1.regressed_query_count, 0, 'part2: no regression when best superset of baseline');
|
|
799
|
+
assert.strictEqual(s1.converged, true, 'part2: a strict improvement converges');
|
|
800
|
+
assert.strictEqual(s1.proposed_description, 'best desc', 'part2: proposed description is the best iteration');
|
|
801
|
+
|
|
802
|
+
// (2) higher aggregate rate but one regressed validation query -> BLOCKED.
|
|
803
|
+
const s2 = selectBestIteration([
|
|
804
|
+
{ iteration: 0, validation_pass_rate: 0.6, validation_passed_set: new Set(['a', 'b', 'c']) },
|
|
805
|
+
{ iteration: 1, validation_pass_rate: 0.8, validation_passed_set: new Set(['a', 'b', 'd', 'e']), description: 'regressing desc' },
|
|
806
|
+
]);
|
|
807
|
+
assert.strictEqual(s2.best_iteration, 1, 'part2: the higher-rate iteration is selected');
|
|
808
|
+
assert.strictEqual(s2.regressed_query_count, 1, 'part2: exactly one validation query (c) regressed');
|
|
809
|
+
assert.strictEqual(s2.blocked_by_regression, true, 'part2: any regression blocks the diff (D3 hard gate)');
|
|
810
|
+
assert.strictEqual(s2.proposed_description, null, 'part2: a blocked candidate proposes nothing');
|
|
811
|
+
|
|
812
|
+
// (3) 5-iteration no-improvement -> converged:false, baseline kept.
|
|
813
|
+
const noImprove = [{ iteration: 0, validation_pass_rate: 0.7, validation_passed_set: new Set(['a', 'b']) }];
|
|
814
|
+
for (let i = 1; i <= 5; i++) noImprove.push({ iteration: i, validation_pass_rate: 0.6, validation_passed_set: new Set(['a']), description: 'worse ' + i });
|
|
815
|
+
const s3 = selectBestIteration(noImprove);
|
|
816
|
+
assert.strictEqual(s3.converged, false, 'part2: no improvement across 5 iterations must be converged:false');
|
|
817
|
+
assert.strictEqual(s3.best_iteration, 0, 'part2: baseline is kept when nothing beats it');
|
|
818
|
+
assert.strictEqual(s3.proposed_description, null, 'part2: non-convergence proposes nothing (baseline kept)');
|
|
819
|
+
|
|
820
|
+
// The whole thing also produces a schema-valid LoopSummary with selected_by literal.
|
|
821
|
+
const summaryFixture = {
|
|
822
|
+
skill: 'beautiful-question', iterations_run: 5, best_iteration: 0,
|
|
823
|
+
selected_by: 'validation_pass_rate', baseline_validation_rate: 0.7, best_validation_rate: 0.7,
|
|
824
|
+
regressed_query_count: 0, converged: false, proposed_description: null,
|
|
825
|
+
};
|
|
826
|
+
assert.strictEqual(LoopSummarySchema.safeParse(summaryFixture).success, true, 'part2: LoopSummary fixture validates with selected_by validation_pass_rate');
|
|
827
|
+
|
|
828
|
+
// (4) scratch checkout targeting skills/ is rejected by assertUnderOut.
|
|
829
|
+
const bad = buildScratchCheckout('act', 'x', path.join(REPO_ROOT, 'skills', 'act'), { outRoot: path.join(REPO_ROOT, PHASE_OUT_DIR) });
|
|
830
|
+
assert.strictEqual(bad.ok, false, 'part2: a scratch dir under skills/ must be rejected (CFM4 containment)');
|
|
831
|
+
assert.strictEqual(bad.reason, 'scratch_outside_out', 'part2: containment reason is scratch_outside_out');
|
|
832
|
+
|
|
833
|
+
// buildScratchCheckout rewrites ONLY the candidate SKILL.md inside a real out-sandbox
|
|
834
|
+
// scratch (using an injected copyImpl - no heavy real clone).
|
|
835
|
+
const baseOut = path.join(REPO_ROOT, PHASE_OUT_DIR);
|
|
836
|
+
fs.mkdirSync(baseOut, { recursive: true });
|
|
837
|
+
const tmpOut = fs.mkdtempSync(path.join(baseOut, '.selftest-scratch-'));
|
|
838
|
+
try {
|
|
839
|
+
const scratchDir = path.join(tmpOut, 'scratch', 'demo');
|
|
840
|
+
const copyImpl = (_src, dst) => {
|
|
841
|
+
fs.mkdirSync(path.join(dst, 'skills', 'demo'), { recursive: true });
|
|
842
|
+
fs.writeFileSync(path.join(dst, 'skills', 'demo', 'SKILL.md'), '---\nname: demo\ndescription: OLD description\n---\nbody\n', 'utf8');
|
|
843
|
+
};
|
|
844
|
+
const okc = buildScratchCheckout('demo', 'NEW routing description', scratchDir, { copyImpl, outRoot: tmpOut, skillDir: 'demo' });
|
|
845
|
+
assert.strictEqual(okc.ok, true, 'part2: a scratch dir under out/ is accepted');
|
|
846
|
+
const rewritten = fs.readFileSync(okc.skillMdPath, 'utf8');
|
|
847
|
+
assert.ok(/description: NEW routing description/.test(rewritten), 'part2: candidate description rewritten in the scratch SKILL.md');
|
|
848
|
+
assert.ok(!/OLD description/.test(rewritten), 'part2: old description replaced');
|
|
849
|
+
// The REAL skills/demo (does not exist) or skills/act must be untouched: assert path is under out.
|
|
850
|
+
assert.ok(okc.skillMdPath.includes(path.sep + '.selftest-scratch-'), 'part2: rewrite happened under the out sandbox, never the real skills/ tree');
|
|
851
|
+
} finally {
|
|
852
|
+
fs.rmSync(tmpOut, { recursive: true, force: true });
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
// Revise prompt carries TRAIN failures and NONE of the validation query strings.
|
|
856
|
+
const reviseArgs = buildReviseArgs({
|
|
857
|
+
skill: 'beautiful-question', currentDescription: 'old',
|
|
858
|
+
siblings: [{ skill: 'find-connections', description: 'cross-domain patterns' }],
|
|
859
|
+
trainFailures: [{ query: 'TRAIN-QUERY-alpha', expected: 'beautiful-question', actually_fired: 'nothing' }],
|
|
860
|
+
}, {});
|
|
861
|
+
const promptIdx = reviseArgs.indexOf('-p') + 1;
|
|
862
|
+
const prompt = reviseArgs[promptIdx];
|
|
863
|
+
assert.ok(prompt.includes('TRAIN-QUERY-alpha'), 'part2: revise prompt contains the train failure query');
|
|
864
|
+
assert.ok(!prompt.includes('VALIDATION-QUERY'), 'part2: revise prompt must never contain a validation query string');
|
|
865
|
+
assert.ok(reviseArgs.includes('--allowedTools') && reviseArgs[reviseArgs.indexOf('--allowedTools') + 1] === 'Read', 'part2: revise spawn is --allowedTools Read');
|
|
866
|
+
assert.ok(reviseArgs.includes('--max-turns') && reviseArgs[reviseArgs.indexOf('--max-turns') + 1] === '2', 'part2: revise spawn is --max-turns 2');
|
|
867
|
+
assert.ok(reviseArgs.includes('--json-schema'), 'part2: revise spawn carries an inline --json-schema');
|
|
868
|
+
|
|
869
|
+
// A trigger arg vector points --plugin-dir under out/scratch and is stream-json --verbose.
|
|
870
|
+
const trigVec = buildTriggerArgs('q', path.join(REPO_ROOT, PHASE_OUT_DIR, 'scratch', 'beautiful-question'), {});
|
|
871
|
+
assert.strictEqual(assertStreamJsonArgs(trigVec).ok, true, 'part2: trigger vector is stream-json --verbose');
|
|
872
|
+
const pdIdx = trigVec.indexOf('--plugin-dir') + 1;
|
|
873
|
+
assert.ok(trigVec[pdIdx].includes(path.sep + 'scratch' + path.sep), 'part2: trigger --plugin-dir is a scratch checkout, never the repo skills/');
|
|
874
|
+
|
|
875
|
+
// An end-to-end zero-spawn loop via injected measure + revise fixtures: baseline
|
|
876
|
+
// weak, iteration 1 improves validation with no regression -> proposed, converged.
|
|
877
|
+
const queries = [
|
|
878
|
+
{ query: 'train-pos-1', split: 'train', kind: 'should_trigger' },
|
|
879
|
+
{ query: 'train-neg-1', split: 'train', kind: 'should_not_trigger' },
|
|
880
|
+
{ query: 'val-pos-1', split: 'validation', kind: 'should_trigger' },
|
|
881
|
+
{ query: 'val-neg-1', split: 'validation', kind: 'should_not_trigger' },
|
|
882
|
+
];
|
|
883
|
+
const canned = {
|
|
884
|
+
0: { 'train-pos-1': 0.0, 'train-neg-1': 0.0, 'val-pos-1': 0.0, 'val-neg-1': 0.0 },
|
|
885
|
+
1: { 'train-pos-1': 1.0, 'train-neg-1': 0.0, 'val-pos-1': 1.0, 'val-neg-1': 0.0 },
|
|
886
|
+
};
|
|
887
|
+
const measureImpl = async (q, iteration) => ({ runs: 3, fires: Math.round((canned[iteration][q.query] || 0) * 3), trigger_rate: canned[iteration][q.query] || 0, completed_runs: 3, not_evaluated_runs: 0 });
|
|
888
|
+
const reviseImpl = async () => ({ skill: 'demo', iteration: 1, description: 'improved routing desc', rationale: 'targets train-pos-1 miss' });
|
|
889
|
+
const scratchImpl = () => ({ ok: true });
|
|
890
|
+
// Run without persistence and without a real scratch, single revision iteration.
|
|
891
|
+
const loop = (async () => runLoopForSkill({
|
|
892
|
+
skill: 'demo', queries, baselineDescription: 'weak', config: { maxIterations: 1 },
|
|
893
|
+
measureImpl, reviseImpl, scratchImpl, _noWrite: true,
|
|
894
|
+
}))();
|
|
895
|
+
return loop.then((res) => {
|
|
896
|
+
assert.strictEqual(res.summary.best_iteration, 1, 'part2: e2e loop selects the improving iteration 1');
|
|
897
|
+
assert.strictEqual(res.summary.converged, true, 'part2: e2e loop converges on a clean win');
|
|
898
|
+
assert.strictEqual(res.summary.regressed_query_count, 0, 'part2: e2e clean win has zero regression');
|
|
899
|
+
assert.ok(res.summary.proposed_description, 'part2: e2e clean win proposes the improved description');
|
|
900
|
+
});
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
// --------------------------------------------------------------------------
|
|
904
|
+
// runSelftest (Part 1) - fixture-driven, ZERO spawn, zero spend. The firing and
|
|
905
|
+
// non-firing fixtures are the REAL bytes captured live from this plugin (see the
|
|
906
|
+
// SKILL_FIRE_TOOL comment); they are also written to disk under out/captures/ by the
|
|
907
|
+
// live --capture path. Inline here so CI (tests/run-all-230.sh) is hermetic even
|
|
908
|
+
// though .planning/out is gitignored.
|
|
909
|
+
// --------------------------------------------------------------------------
|
|
910
|
+
function part1Fixtures() {
|
|
911
|
+
// Real init + real assistant tool_use block (verbatim from firing-beautiful-question.jsonl),
|
|
912
|
+
// wrapped in realistic hook/thinking noise so the corrupt-ratio logic is exercised.
|
|
913
|
+
const firing = [
|
|
914
|
+
JSON.stringify({ type: 'system', subtype: 'hook_started', hook_name: 'SessionStart:startup' }),
|
|
915
|
+
JSON.stringify({ type: 'system', subtype: 'init', plugins: [{ name: 'mos' }, { name: 'superpowers' }], plugin_errors: undefined }),
|
|
916
|
+
JSON.stringify({ type: 'system', subtype: 'thinking_tokens', tokens: 128 }),
|
|
917
|
+
JSON.stringify({ type: 'assistant', message: { content: [{ type: 'text', text: 'Let me reframe that.' }] } }),
|
|
918
|
+
JSON.stringify({ type: 'assistant', message: { content: [{ type: 'tool_use', id: 'toolu_01T8jHKF5yU2kQ25vKJv5zJm', name: SKILL_FIRE_TOOL, input: { command: 'beautiful-question', context: 'declining user retention' } }] } }),
|
|
919
|
+
JSON.stringify({ type: 'user', message: { content: [{ type: 'tool_result', content: 'ok' }] } }),
|
|
920
|
+
JSON.stringify({ type: 'result', subtype: 'success', session_id: 'sess-fire', total_cost_usd: 0.04 }),
|
|
921
|
+
].join('\n') + '\n';
|
|
922
|
+
|
|
923
|
+
const nonfiring = [
|
|
924
|
+
JSON.stringify({ type: 'system', subtype: 'hook_started', hook_name: 'SessionStart:startup' }),
|
|
925
|
+
JSON.stringify({ type: 'system', subtype: 'init', plugins: [{ name: 'mos' }], plugin_errors: undefined }),
|
|
926
|
+
JSON.stringify({ type: 'assistant', message: { content: [{ type: 'text', text: 'I do not have live weather, but happy to chat.' }] } }),
|
|
927
|
+
JSON.stringify({ type: 'result', subtype: 'success', session_id: 'sess-nofire', total_cost_usd: 0.01 }),
|
|
928
|
+
].join('\n') + '\n';
|
|
929
|
+
|
|
930
|
+
// A stream that is mostly garbage: > 20% unparseable -> jsonl_corrupt (never fired:false).
|
|
931
|
+
const corrupt = [
|
|
932
|
+
JSON.stringify({ type: 'system', subtype: 'init', plugins: [{ name: 'mos' }] }),
|
|
933
|
+
'{ this is not valid json <<<',
|
|
934
|
+
'neither is this line',
|
|
935
|
+
'}}} broken',
|
|
936
|
+
JSON.stringify({ type: 'assistant', message: { content: [{ type: 'text', text: 'ok' }] } }),
|
|
937
|
+
].join('\n') + '\n';
|
|
938
|
+
|
|
939
|
+
return { firing, nonfiring, corrupt };
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
function runSelftestPart1(assert) {
|
|
943
|
+
const fx = part1Fixtures();
|
|
944
|
+
|
|
945
|
+
// Firing fixture: fired:true, invoked the bare skill, with mos: tolerance.
|
|
946
|
+
const dFire = detectSkillFire(fx.firing, 'beautiful-question');
|
|
947
|
+
assert.strictEqual(dFire.ok, true, 'part1: firing fixture must parse cleanly');
|
|
948
|
+
assert.strictEqual(dFire.fired, true, 'part1: firing fixture must fire beautiful-question');
|
|
949
|
+
assert.strictEqual(dFire.invoked, 'beautiful-question', 'part1: invoked skill read from input.command');
|
|
950
|
+
const dFireNs = detectSkillFire(fx.firing, 'mos:beautiful-question');
|
|
951
|
+
assert.strictEqual(dFireNs.fired, true, 'part1: namespaced expected (mos:beautiful-question) must still match the bare fire');
|
|
952
|
+
const dWrong = detectSkillFire(fx.firing, 'find-connections');
|
|
953
|
+
assert.strictEqual(dWrong.fired, false, 'part1: a different expected skill must NOT count the beautiful-question fire');
|
|
954
|
+
|
|
955
|
+
// Non-firing fixture: fired:false (and any-fire is false).
|
|
956
|
+
const dNo = detectSkillFire(fx.nonfiring, 'beautiful-question');
|
|
957
|
+
assert.strictEqual(dNo.ok, true, 'part1: non-firing fixture must parse cleanly');
|
|
958
|
+
assert.strictEqual(dNo.fired, false, 'part1: non-firing fixture must not fire');
|
|
959
|
+
assert.strictEqual(detectSkillFire(fx.nonfiring, null).fired, false, 'part1: non-firing any-fire is false');
|
|
960
|
+
|
|
961
|
+
// Corrupt fixture: jsonl_corrupt, NOT a silent fired:false.
|
|
962
|
+
const dCorrupt = detectSkillFire(fx.corrupt, 'beautiful-question');
|
|
963
|
+
assert.strictEqual(dCorrupt.ok, false, 'part1: corrupt fixture must not parse ok');
|
|
964
|
+
assert.strictEqual(dCorrupt.reason, 'jsonl_corrupt', 'part1: corrupt fixture reason must be jsonl_corrupt');
|
|
965
|
+
assert.strictEqual(detectSkillFire('', 'x').reason, 'jsonl_corrupt', 'part1: empty input is jsonl_corrupt');
|
|
966
|
+
|
|
967
|
+
// assertStreamJsonArgs: rejects a json-envelope vector, accepts a stream-json capture vector.
|
|
968
|
+
const jsonVec = ['-p', 'q', '--output-format', 'json', '--verbose'];
|
|
969
|
+
assert.strictEqual(assertStreamJsonArgs(jsonVec).ok, false, 'part1: --output-format json vector must be rejected (D7)');
|
|
970
|
+
const capVec = buildCaptureArgs('q', {});
|
|
971
|
+
assert.strictEqual(assertStreamJsonArgs(capVec).ok, true, 'part1: capture vector is stream-json --verbose');
|
|
972
|
+
assert.strictEqual(assertStreamJsonArgs(['-p', 'q', '--output-format', 'stream-json']).ok, false, 'part1: stream-json without --verbose must be rejected');
|
|
973
|
+
|
|
974
|
+
// preflight failure path returns ok:false and runCapture then never spawns.
|
|
975
|
+
const badInitSpawn = () => ({ status: 0, stdout: JSON.stringify({ type: 'system', subtype: 'init', plugins: [] }) + '\n' });
|
|
976
|
+
const pfBad = preflightPluginLoad({ spawnImpl: badInitSpawn });
|
|
977
|
+
assert.strictEqual(pfBad.ok, false, 'part1: preflight with no mos plugin must fail closed');
|
|
978
|
+
assert.strictEqual(pfBad.reason, 'plugin_not_loaded', 'part1: reason is plugin_not_loaded');
|
|
979
|
+
let captureSpawnCalls = 0;
|
|
980
|
+
const cap = runCapture({
|
|
981
|
+
skill: 'beautiful-question', query: 'q',
|
|
982
|
+
preflightSpawnImpl: badInitSpawn,
|
|
983
|
+
spawnImpl: () => { captureSpawnCalls += 1; return { status: 0, stdout: '' }; },
|
|
984
|
+
});
|
|
985
|
+
assert.strictEqual(cap.ok, false, 'part1: runCapture must abort on failed preflight');
|
|
986
|
+
assert.strictEqual(cap.spawned, false, 'part1: no capture spawn after a failed preflight');
|
|
987
|
+
assert.strictEqual(captureSpawnCalls, 0, 'part1: capture spawnImpl must not be called after failed preflight');
|
|
988
|
+
|
|
989
|
+
// A good preflight lets runCapture spawn + write under out/ (guarded), using a fake spawn.
|
|
990
|
+
const goodInitSpawn = () => ({ status: 0, stdout: JSON.stringify({ type: 'system', subtype: 'init', plugins: [{ name: 'mos' }] }) + '\n' });
|
|
991
|
+
const baseOut = path.join(REPO_ROOT, PHASE_OUT_DIR);
|
|
992
|
+
fs.mkdirSync(baseOut, { recursive: true });
|
|
993
|
+
const tmpOut = fs.mkdtempSync(path.join(baseOut, '.selftest-capture-'));
|
|
994
|
+
try {
|
|
995
|
+
const capOk = runCapture({
|
|
996
|
+
skill: 'beautiful-question', query: 'q', outDir: tmpOut,
|
|
997
|
+
preflightSpawnImpl: goodInitSpawn,
|
|
998
|
+
spawnImpl: () => ({ status: 0, stdout: fx.firing }),
|
|
999
|
+
});
|
|
1000
|
+
assert.strictEqual(capOk.ok, true, 'part1: runCapture succeeds after a good preflight');
|
|
1001
|
+
assert.strictEqual(capOk.fired, true, 'part1: runCapture detector sees the fire');
|
|
1002
|
+
assert.ok(fs.existsSync(capOk.path), 'part1: capture file written under out/');
|
|
1003
|
+
assert.ok(capOk.path.includes(path.sep + 'captures' + path.sep), 'part1: capture lands in out/captures/');
|
|
1004
|
+
} finally {
|
|
1005
|
+
fs.rmSync(tmpOut, { recursive: true, force: true });
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
// If the REAL live captures are on disk, assert the detector against them too (belt).
|
|
1009
|
+
const realFiring = path.join(baseOut, 'captures', 'firing-beautiful-question.jsonl');
|
|
1010
|
+
const realNonfiring = path.join(baseOut, 'captures', 'nonfiring-weather.jsonl');
|
|
1011
|
+
if (fs.existsSync(realFiring)) {
|
|
1012
|
+
const d = detectSkillFire(fs.readFileSync(realFiring, 'utf8'), 'beautiful-question');
|
|
1013
|
+
assert.strictEqual(d.fired, true, 'part1: REAL firing capture must fire beautiful-question');
|
|
1014
|
+
assert.strictEqual(d.invoked, 'beautiful-question', 'part1: REAL firing capture invoked read from input.command');
|
|
1015
|
+
}
|
|
1016
|
+
if (fs.existsSync(realNonfiring)) {
|
|
1017
|
+
const d = detectSkillFire(fs.readFileSync(realNonfiring, 'utf8'), 'beautiful-question');
|
|
1018
|
+
assert.strictEqual(d.fired, false, 'part1: REAL non-firing capture must not fire');
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
// --------------------------------------------------------------------------
|
|
1023
|
+
// main - switch-case argv router (gsd-tools.cjs pattern), no Commander/yargs.
|
|
1024
|
+
// --selftest fixture-driven, no spawn, exit
|
|
1025
|
+
// --capture <skill> <query...> ONE live stream-json capture -> out/captures/<skill>.jsonl
|
|
1026
|
+
// --dry-run print a trigger arg vector, spawn NOTHING
|
|
1027
|
+
// --skills <csv> flagged skills to loop (Task 2)
|
|
1028
|
+
// --out <dir> out directory (default PHASE_OUT_DIR)
|
|
1029
|
+
// --max-iterations <n> revision iterations (default 5, hard cap 5)
|
|
1030
|
+
// --runs-per-query <n> runs per query (default 3)
|
|
1031
|
+
// --------------------------------------------------------------------------
|
|
1032
|
+
async function main(argv) {
|
|
1033
|
+
const args = argv.slice(2);
|
|
1034
|
+
|
|
1035
|
+
if (args.includes('--selftest')) {
|
|
1036
|
+
const assert = require('node:assert');
|
|
1037
|
+
runSelftestPart1(assert);
|
|
1038
|
+
await runSelftestPart2(assert);
|
|
1039
|
+
console.log('OK - skillopt-triggerloop self-test passed: detector (fire/no-fire/corrupt) pinned from live captures, stream-json guard, preflight fail-closed, loop best-by-validation + regression block + non-convergence + scratch containment.');
|
|
1040
|
+
return;
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
let outDir = path.join(REPO_ROOT, PHASE_OUT_DIR);
|
|
1044
|
+
const outIdx = args.indexOf('--out');
|
|
1045
|
+
if (outIdx >= 0 && args[outIdx + 1]) outDir = path.resolve(args[outIdx + 1]);
|
|
1046
|
+
|
|
1047
|
+
let skills = null;
|
|
1048
|
+
const skIdx = args.indexOf('--skills');
|
|
1049
|
+
if (skIdx >= 0 && args[skIdx + 1]) skills = args[skIdx + 1].split(',').map((s) => s.trim()).filter(Boolean);
|
|
1050
|
+
|
|
1051
|
+
let maxIterations = 5;
|
|
1052
|
+
const miIdx = args.indexOf('--max-iterations');
|
|
1053
|
+
if (miIdx >= 0 && args[miIdx + 1]) maxIterations = parseInt(args[miIdx + 1], 10) || 5;
|
|
1054
|
+
|
|
1055
|
+
let runsPerQuery = 3;
|
|
1056
|
+
const rpIdx = args.indexOf('--runs-per-query');
|
|
1057
|
+
if (rpIdx >= 0 && args[rpIdx + 1]) runsPerQuery = parseInt(args[rpIdx + 1], 10) || 3;
|
|
1058
|
+
|
|
1059
|
+
const config = { maxIterations, runsPerQuery };
|
|
1060
|
+
|
|
1061
|
+
if (args.includes('--capture')) {
|
|
1062
|
+
const ci = args.indexOf('--capture');
|
|
1063
|
+
const skill = args[ci + 1];
|
|
1064
|
+
const query = args.slice(ci + 2).filter((a) => !a.startsWith('--')).join(' ');
|
|
1065
|
+
if (!skill || !query) { console.error('usage: --capture <skill> <query...>'); process.exit(2); }
|
|
1066
|
+
const r = runCapture({ skill, query, outDir, config });
|
|
1067
|
+
console.log(JSON.stringify(r, null, 2));
|
|
1068
|
+
if (!r.ok) process.exit(1);
|
|
1069
|
+
return;
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
if (args.includes('--dry-run')) {
|
|
1073
|
+
const sampleSkill = (skills && skills[0]) || 'beautiful-question';
|
|
1074
|
+
const scratchDir = path.join(outDir, 'scratch', safeStem(sampleSkill));
|
|
1075
|
+
const vec = buildTriggerArgs('sample trigger query for ' + sampleSkill, scratchDir, config);
|
|
1076
|
+
console.log('# dry-run triggerloop skills=' + (skills ? skills.join(',') : 'all-flagged') + ' max-iterations=' + resolveTriggerConfig(config).maxIterations + ' runs-per-query=' + resolveTriggerConfig(config).runsPerQuery);
|
|
1077
|
+
console.log(JSON.stringify(vec));
|
|
1078
|
+
if (typeof buildReviseArgs === 'function') {
|
|
1079
|
+
const rv = buildReviseArgs({ skill: sampleSkill, currentDescription: 'old', trainFailures: [{ query: 'q', expected: sampleSkill, actually_fired: 'null' }] }, config);
|
|
1080
|
+
console.log(JSON.stringify(rv));
|
|
1081
|
+
}
|
|
1082
|
+
return;
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
if (typeof runLoopForSkill !== 'function') {
|
|
1086
|
+
console.error('skillopt-triggerloop: live loop requires the flagged funnel results and is gated to the smoke opt-in (Task 2 wiring).');
|
|
1087
|
+
process.exit(2);
|
|
1088
|
+
}
|
|
1089
|
+
// Live loop entry is wired in Task 2 (runLoopsFromFunnel).
|
|
1090
|
+
await runLoopsFromFunnel({ outDir, skills, config });
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
module.exports = {
|
|
1094
|
+
// Part 1 (Task 1)
|
|
1095
|
+
preflightPluginLoad,
|
|
1096
|
+
detectSkillFire,
|
|
1097
|
+
extractInvokedSkill,
|
|
1098
|
+
assertStreamJsonArgs,
|
|
1099
|
+
buildCaptureArgs,
|
|
1100
|
+
buildTriggerArgs,
|
|
1101
|
+
runCapture,
|
|
1102
|
+
makeTriggerUnitRecord,
|
|
1103
|
+
normalizeSkillName,
|
|
1104
|
+
resolveTriggerConfig,
|
|
1105
|
+
SKILL_FIRE_TOOL,
|
|
1106
|
+
SKILL_INPUT_FIELD,
|
|
1107
|
+
NATIVE_SKILL_TOOL,
|
|
1108
|
+
PINNED_TRIGGER_MODEL,
|
|
1109
|
+
writeAtomic,
|
|
1110
|
+
safeStem,
|
|
1111
|
+
// Part 2 (Task 2)
|
|
1112
|
+
buildScratchCheckout,
|
|
1113
|
+
runTriggerQuery,
|
|
1114
|
+
runLoopForSkill,
|
|
1115
|
+
runLoopsFromFunnel,
|
|
1116
|
+
selectBestIteration,
|
|
1117
|
+
measureIteration,
|
|
1118
|
+
queryPasses,
|
|
1119
|
+
buildRevisePrompt,
|
|
1120
|
+
buildReviseArgs,
|
|
1121
|
+
runPool,
|
|
1122
|
+
};
|
|
1123
|
+
|
|
1124
|
+
if (require.main === module) {
|
|
1125
|
+
main(process.argv).catch((e) => { console.error('FATAL skillopt-triggerloop:', e && e.message || e); process.exit(1); });
|
|
1126
|
+
}
|