@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,1135 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
/*
|
|
4
|
+
* Copyright (c) 2026 Mindrian. BSL 1.1.
|
|
5
|
+
* Phase 218-03 (D-03) -- the standalone entity-extraction pipeline dispatcher.
|
|
6
|
+
*
|
|
7
|
+
* This is a verbatim SHAPE-CLONE of scripts/eureka-command.cjs: a process.argv
|
|
8
|
+
* switch-case router (no Commander/yargs -- CLAUDE.md convention) with the verbs
|
|
9
|
+
* run | start | status | report | help, a positional ROOM_DIR SUBCOMMAND, the
|
|
10
|
+
* 3-line What/Why/Fix error (never a stack trace), a status.json for observable
|
|
11
|
+
* detached runs, and a main(argv) that returns a numeric exit code (the testable
|
|
12
|
+
* seam via module.exports = { main }).
|
|
13
|
+
*
|
|
14
|
+
* WHY a standalone script and NOT a /mos: command (D-03): this adds ZERO Canon
|
|
15
|
+
* Part 11 CIRS surface. There is no new command, agent, pipeline, or skill to
|
|
16
|
+
* govern -- build-connector-registry.cjs --check must stay green as proof no
|
|
17
|
+
* surface leaked. The pipeline is a plain script the navigator (or a future
|
|
18
|
+
* governed command) shells.
|
|
19
|
+
*
|
|
20
|
+
* WHAT it does (the vertical wiring that makes Phase 218 real):
|
|
21
|
+
* 1. openRoomDb(roomDir, { allowExtension: true }) -- single-writer,
|
|
22
|
+
* open-work-close, with the Plan 218-02 D-05 busy-wait window.
|
|
23
|
+
* 2. Walk the room's artifact .md files via the memory_artifact provenance map
|
|
24
|
+
* (each memory_artifact node carries props.path -> its .md file), reading the
|
|
25
|
+
* real prose off disk.
|
|
26
|
+
* 3. extractEntities(text, { sourceArtifactId }) (Plan 218-02) per artifact ->
|
|
27
|
+
* bounded, typed {entities, relations, frameworkTerms} candidates, zero egress.
|
|
28
|
+
* 3b. Tier-2 semantic pass (two-tier, quick-task 260714-k44 over 260714-hzx):
|
|
29
|
+
* tier-2a is the LOCAL embedding classifier (embedding-classifier.cjs) -- zero
|
|
30
|
+
* egress, delegating to the embedding-spine boundary -- which resolves the
|
|
31
|
+
* confident majority of tier-1 survivors WHAT vs WHY for free. Only the
|
|
32
|
+
* low-margin residual escalates to tier-2b (entity-classifier.cjs, unchanged),
|
|
33
|
+
* called per artifact for the escalated names ONLY. WHAT flows through step 4
|
|
34
|
+
* unchanged; WHY joins the frameworkTerms signal merged onto the source
|
|
35
|
+
* artifact inside the transaction; NOISE (a tier-2b-only verdict) drops. The
|
|
36
|
+
* whole pass runs to completion BEFORE the transaction opens, so neither tier
|
|
37
|
+
* ever holds the write lock. Every degrade is honest: no LLM means the
|
|
38
|
+
* embedding best-guess with a disclosed low-confidence count, never a silent
|
|
39
|
+
* WHAT; an unavailable encoder degrades the whole tier to the prior hzx
|
|
40
|
+
* behavior verbatim (per-artifact tier-2b when keyed, else every-survivor WHAT).
|
|
41
|
+
* 4. ONE explicit D-05 BEGIN/COMMIT/ROLLBACK transaction (node:sqlite has NO
|
|
42
|
+
* .transaction() helper, RESEARCH Pitfall 3) around the whole batch:
|
|
43
|
+
* navigation.writeEntityNode per entity, navigation.writeEdge per
|
|
44
|
+
* entity->artifact DESCRIBES link and per entity->entity relation. A
|
|
45
|
+
* mid-batch error rolls back ALL of it (T-218-09).
|
|
46
|
+
* 5. Phase 219-02 (D-11, REQ-5): inside the SAME transaction, a deterministic
|
|
47
|
+
* zero-LLM frontmatter METADATA pass lifts scalar frontmatter fields
|
|
48
|
+
* (methodology, created/date, status, section, confidence) onto each
|
|
49
|
+
* exact memory_artifact node as additive JSON props via the insertNode
|
|
50
|
+
* UPSERT (merge discipline: existing props + review_status never
|
|
51
|
+
* clobbered; non-scalar values skipped, never thrown on).
|
|
52
|
+
* 6. AFTER commit, a route-a best-effort re-embed via the EXISTING
|
|
53
|
+
* tri-modal-index.indexNodes path (REQ-3), in its OWN try/catch that degrades
|
|
54
|
+
* to lexical-only and NEVER throws or rolls back the entity writes (T-218-10,
|
|
55
|
+
* the degrade-never-throw contract).
|
|
56
|
+
*
|
|
57
|
+
* Phase 219-02 seam (D-16): runExtraction(db, roomDir, sessionId, max, opts)
|
|
58
|
+
* accepts an OPTIONAL opts.paths allowlist of roomDir-relative artifact paths;
|
|
59
|
+
* when present only those artifacts are collected (scoped-incremental -- the
|
|
60
|
+
* post-filing extraction Plan 05 invokes). Default behavior (no opts.paths) is
|
|
61
|
+
* byte-identical to the 218 full-room pass.
|
|
62
|
+
*
|
|
63
|
+
* CANON POSTURE:
|
|
64
|
+
* - Part 8 (Graph Boundary): THIS FILE'S OWN CODE and the tier-1 extractor make
|
|
65
|
+
* ZERO network reach -- no URL, no socket, no remote call -- and the grep gate
|
|
66
|
+
* enforces it. Tier-2a (embedding-classifier.cjs) is ALSO fully local and
|
|
67
|
+
* zero-egress: it delegates to the embedding-spine boundary (generic model
|
|
68
|
+
* weights by id only, no user bytes). The ONLY remote model reach in the whole
|
|
69
|
+
* pipeline lives inside the tier-2b classifier module
|
|
70
|
+
* (lib/core/eureka/entity-classifier.cjs), which documents its own boundary: a
|
|
71
|
+
* LOCAL classification call over the Anthropic LLM transport, never the Brain
|
|
72
|
+
* surface, degrade-to-passthrough -- and now for the escalated residual only.
|
|
73
|
+
* The re-embed uses the already-vendored local paths only.
|
|
74
|
+
* - Part 9 (Memory Locality): every entity node is born review_status='proposed'
|
|
75
|
+
* via navigation.writeEntityNode; only a human confirmNode promotes it. This
|
|
76
|
+
* script writes ONLY through the navigation chokepoint -- NO raw INSERT INTO
|
|
77
|
+
* nodes/edges anywhere (the aggregator greps for this).
|
|
78
|
+
*
|
|
79
|
+
* CJS, node built-ins only, process.argv switch-case router. No em-dashes, no
|
|
80
|
+
* emoji anywhere.
|
|
81
|
+
*
|
|
82
|
+
* Usage:
|
|
83
|
+
* node scripts/entity-extract.cjs ROOM_DIR SUBCOMMAND [--session <id>] [--max <n>]
|
|
84
|
+
* node scripts/entity-extract.cjs --help
|
|
85
|
+
*
|
|
86
|
+
* Subcommands:
|
|
87
|
+
* run run the extraction in-process; write nodes+edges + status.json; block until done
|
|
88
|
+
* start fire-and-return: spawn the run detached, print paths, exit 0 immediately
|
|
89
|
+
* status print status.json as one JSON line (or {"state":"none"})
|
|
90
|
+
* report print a one-line human summary of the last run (or a 3-line error)
|
|
91
|
+
* help show usage
|
|
92
|
+
*/
|
|
93
|
+
|
|
94
|
+
const fs = require('node:fs');
|
|
95
|
+
const path = require('node:path');
|
|
96
|
+
const { spawn } = require('node:child_process');
|
|
97
|
+
|
|
98
|
+
const { openRoomDb, closeRoomDb } = require('../lib/core/room-db.cjs');
|
|
99
|
+
const navigation = require('../lib/core/navigation.cjs');
|
|
100
|
+
const { insertNode, ALLOWED_EPISTEMIC_TYPES } = require('../lib/core/node-insert.cjs');
|
|
101
|
+
|
|
102
|
+
// R17-02: preserve whatever epistemic_type an existing row already carries
|
|
103
|
+
// (never silently reclassify it during a metadata-only refresh); fall back
|
|
104
|
+
// to 'observation' for a pre-R17-02 row that predates this field (these two
|
|
105
|
+
// call sites operate on already-indexed Artifact nodes -- system-bookkeeping
|
|
106
|
+
// class, same as the lazygraph-ops.cjs / rs-engine.cjs Artifact writers).
|
|
107
|
+
function existingOrDefaultEpistemicType(props) {
|
|
108
|
+
return (typeof props.epistemic_type === 'string' && ALLOWED_EPISTEMIC_TYPES.has(props.epistemic_type))
|
|
109
|
+
? props.epistemic_type
|
|
110
|
+
: 'observation';
|
|
111
|
+
}
|
|
112
|
+
const { extractEntities } = require('../lib/core/eureka/entity-extractor.cjs');
|
|
113
|
+
const triModal = require('../lib/core/eureka/tri-modal-index.cjs');
|
|
114
|
+
// Tier-2a (quick-task 260714-k44): the LOCAL embedding WHAT-vs-WHY classifier. It
|
|
115
|
+
// is fully local and zero-egress (it delegates to the embedding-spine boundary),
|
|
116
|
+
// resolves the confident majority of candidates for free, and hands only the
|
|
117
|
+
// low-margin residual to tier-2b below. The dispatcher body in THIS file stays
|
|
118
|
+
// zero-network (grep-gated); the embedding tier adds no transport of its own.
|
|
119
|
+
const entityEmbedClassifier = require('../lib/core/eureka/embedding-classifier.cjs');
|
|
120
|
+
// Tier-2b (quick-task 260714-hzx): the semantic WHAT / WHY / NOISE classifier
|
|
121
|
+
// module. It is the ONLY model reach in this pipeline and documents its own
|
|
122
|
+
// boundary; it is now the ESCALATION-ONLY path, called per artifact for just the
|
|
123
|
+
// candidates tier-2a could not confidently resolve. resolveAnthropicKey gates
|
|
124
|
+
// whether that escalation runs at all (Part 7 reuse of the mva-classifier
|
|
125
|
+
// resolver, never a copy).
|
|
126
|
+
const entityClassifier = require('../lib/core/eureka/entity-classifier.cjs');
|
|
127
|
+
const { resolveAnthropicKey } = require('../lib/core/mva-classifier.cjs');
|
|
128
|
+
// Phase 219-02 (D-11, REQ-5): the SHIPPED zero-dep frontmatter parser (Canon
|
|
129
|
+
// Part 7 reuse-before-build -- never a new YAML parser). Deterministic,
|
|
130
|
+
// zero-LLM, zero network.
|
|
131
|
+
const { parseFrontmatter } = require('../lib/core/opportunity-ops.cjs');
|
|
132
|
+
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
// Path contract: everything this command writes lives under here. The subdir is
|
|
135
|
+
// .mindrian/entity-extract/ -- it NEVER collides with .mindrian/eureka/ (Pitfall
|
|
136
|
+
// 5: two independent pipelines must not share a status.json).
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
|
|
139
|
+
function reportDir(roomDir) { return path.join(roomDir, '.mindrian', 'entity-extract'); }
|
|
140
|
+
function statusPath(roomDir) { return path.join(reportDir(roomDir), 'status.json'); }
|
|
141
|
+
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
// Small helpers (verbatim from eureka-command.cjs).
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
|
|
146
|
+
function dirExists(p) {
|
|
147
|
+
try { return fs.statSync(p).isDirectory(); } catch (_e) { return false; }
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function fileExists(p) {
|
|
151
|
+
try { return fs.statSync(p).isFile(); } catch (_e) { return false; }
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// The 3-line What / Why / Fix error, to stderr. Never a stack trace.
|
|
155
|
+
function printError(what, why, fix) {
|
|
156
|
+
process.stderr.write('entity-extract: ' + what + '\n');
|
|
157
|
+
process.stderr.write(' Why: ' + why + '\n');
|
|
158
|
+
process.stderr.write(' Fix: ' + fix + '\n');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function writeStatus(roomDir, obj) {
|
|
162
|
+
fs.mkdirSync(reportDir(roomDir), { recursive: true });
|
|
163
|
+
fs.writeFileSync(statusPath(roomDir), JSON.stringify(obj) + '\n', 'utf8');
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const USAGE = [
|
|
167
|
+
'entity-extract -- tier-1 entity extraction over a room, writing proposed',
|
|
168
|
+
'company/technology/market nodes + typed edges through navigation.',
|
|
169
|
+
'',
|
|
170
|
+
'Usage:',
|
|
171
|
+
' node scripts/entity-extract.cjs ROOM_DIR SUBCOMMAND [--session <id>] [--max <n>]',
|
|
172
|
+
'',
|
|
173
|
+
'Subcommands:',
|
|
174
|
+
' run run the extraction in-process; write nodes+edges + status.json; block until done',
|
|
175
|
+
' start fire-and-return: spawn the run detached, print paths, exit 0 immediately',
|
|
176
|
+
' status print status.json as one JSON line (or {"state":"none"})',
|
|
177
|
+
' report print a one-line human summary of the last run (or a 3-line error)',
|
|
178
|
+
' help show this usage',
|
|
179
|
+
'',
|
|
180
|
+
'Flags:',
|
|
181
|
+
' --session <id> the session id every extracted node is minted under (default entity-extract)',
|
|
182
|
+
' --max <n> maxPerArtifact extraction cap forwarded to the extractor (default 25)',
|
|
183
|
+
].join('\n');
|
|
184
|
+
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
// argv parse: ROOM_DIR SUBCOMMAND [flags].
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
|
|
189
|
+
function parseArgs(argv) {
|
|
190
|
+
const out = { roomDir: null, sub: null, session: 'entity-extract', max: 25, sessionProvided: false, maxProvided: false, help: false };
|
|
191
|
+
const positional = [];
|
|
192
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
193
|
+
const a = argv[i];
|
|
194
|
+
switch (a) {
|
|
195
|
+
case '-h':
|
|
196
|
+
case '--help': out.help = true; break;
|
|
197
|
+
case '--session': out.session = String(argv[i += 1] || ''); out.sessionProvided = true; break;
|
|
198
|
+
case '--max': out.max = parseInt(argv[i += 1], 10); out.maxProvided = true; break;
|
|
199
|
+
default: positional.push(a); break;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (!out.session) out.session = 'entity-extract';
|
|
203
|
+
if (!Number.isFinite(out.max) || out.max <= 0) out.max = 25;
|
|
204
|
+
out.roomDir = positional[0] || null;
|
|
205
|
+
out.sub = (positional[1] || '').toLowerCase();
|
|
206
|
+
return out;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// ---------------------------------------------------------------------------
|
|
210
|
+
// The extraction core: walk artifacts, extract, batch-write through navigation.
|
|
211
|
+
// Returns { artifacts, entitiesWritten, edgesWritten, embedded }.
|
|
212
|
+
// ---------------------------------------------------------------------------
|
|
213
|
+
|
|
214
|
+
// Collect the room's artifact prose. Two tiers (T-218-VD-4, live-verified
|
|
215
|
+
// against the corepower-isolation room):
|
|
216
|
+
//
|
|
217
|
+
// (a) memory_artifact-backed files (kind in ROOM/STATE/MINTO/BRAIN/FEYNMAN/
|
|
218
|
+
// USER/DRIFT -- the closed vocabulary memory-artifacts.cjs's
|
|
219
|
+
// MEMORY_KIND_SET enforces). Each carries props.path; read the real file
|
|
220
|
+
// off disk, keyed by its OWN memory_artifact node id (exact per-file
|
|
221
|
+
// provenance) -- the original behavior, unchanged.
|
|
222
|
+
//
|
|
223
|
+
// (b) every OTHER .md file in a section directory. Live-verified gap: a
|
|
224
|
+
// room's actual named analysis documents (e.g.
|
|
225
|
+
// "mv-mft-competitive-landscape.md", "reverse-salient-analysis.md") are
|
|
226
|
+
// NOT memory_artifact-kinded -- the closed MEMORY_KIND_SET this module
|
|
227
|
+
// does not own cannot register a new kind per filename, and inventing a
|
|
228
|
+
// synthetic node id nothing else points at would break REQ-1's "edge
|
|
229
|
+
// back to its memory_artifact" contract. Instead, these files' entities
|
|
230
|
+
// link back to their SECTION's existing memory_artifact:<section>:ROOM
|
|
231
|
+
// node (preferring the ROOM kind, falling back to whatever memory_artifact
|
|
232
|
+
// exists for that section, then the room root). Coarser provenance
|
|
233
|
+
// (section-level, not exact-file-level) but always a REAL, already-
|
|
234
|
+
// materialized DESCRIBES target -- a section with no anchor at all is
|
|
235
|
+
// skipped, never given an invented one.
|
|
236
|
+
//
|
|
237
|
+
// Phase 219-02 additions (both ADDITIVE -- a two-arg call is byte-identical):
|
|
238
|
+
// - allowPaths (optional array of roomDir-relative paths): the D-16
|
|
239
|
+
// scoped-incremental seam. When present, ONLY artifacts whose path is in
|
|
240
|
+
// the allowlist are collected, so filing one explore-chain artifact never
|
|
241
|
+
// triggers a full-room re-extract.
|
|
242
|
+
// - each artifact entry now also carries { relPath, exact }: exact=true when
|
|
243
|
+
// the entry's artifactId IS the memory_artifact node of that very file
|
|
244
|
+
// (tier a); exact=false for the tier-b section-anchor fallback. The
|
|
245
|
+
// metadata pass writes ONLY to exact nodes (a section anchor represents a
|
|
246
|
+
// DIFFERENT file; writing another file's frontmatter onto it would lie).
|
|
247
|
+
function collectArtifacts(db, roomDir, allowPaths) {
|
|
248
|
+
const allowSet = (Array.isArray(allowPaths) && allowPaths.length > 0)
|
|
249
|
+
? new Set(allowPaths.map(function (p) { return path.normalize(String(p)); }))
|
|
250
|
+
: null;
|
|
251
|
+
const isAllowed = function (rel) {
|
|
252
|
+
return allowSet === null || allowSet.has(path.normalize(rel));
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
const rows = db.prepare("SELECT id, properties FROM nodes WHERE type = 'memory_artifact'").all();
|
|
256
|
+
const artifacts = [];
|
|
257
|
+
const coveredPaths = new Set(); // roomDir-relative paths already read via memory_artifact
|
|
258
|
+
const sectionAnchor = new Map(); // section name ("_root" included) -> a valid memory_artifact node id
|
|
259
|
+
|
|
260
|
+
for (const row of rows) {
|
|
261
|
+
let props = {};
|
|
262
|
+
try { props = JSON.parse(row.properties || '{}'); } catch (_e) { props = {}; }
|
|
263
|
+
const rel = props && typeof props.path === 'string' ? props.path : null;
|
|
264
|
+
if (rel) {
|
|
265
|
+
if (isAllowed(rel)) {
|
|
266
|
+
const abs = path.join(roomDir, rel);
|
|
267
|
+
let text = null;
|
|
268
|
+
try { text = fs.readFileSync(abs, 'utf8'); } catch (_e) { text = null; }
|
|
269
|
+
if (text) {
|
|
270
|
+
artifacts.push({ artifactId: row.id, text: text, relPath: rel, exact: true });
|
|
271
|
+
coveredPaths.add(path.normalize(rel));
|
|
272
|
+
}
|
|
273
|
+
} else {
|
|
274
|
+
// Scoped run only: mark the filtered-out memory_artifact-backed path
|
|
275
|
+
// covered so tier (b) never re-reads it under a section anchor. On the
|
|
276
|
+
// default path (no allowlist) this branch is unreachable, so the
|
|
277
|
+
// default collection stays byte-identical to the 218 behavior.
|
|
278
|
+
coveredPaths.add(path.normalize(rel));
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
const section = props && typeof props.section === 'string' ? props.section : null;
|
|
282
|
+
if (section) {
|
|
283
|
+
const isRoomKind = props && props.kind === 'ROOM';
|
|
284
|
+
if (isRoomKind || !sectionAnchor.has(section)) sectionAnchor.set(section, row.id);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
let sectionDirs = [];
|
|
289
|
+
try {
|
|
290
|
+
sectionDirs = fs.readdirSync(roomDir, { withFileTypes: true })
|
|
291
|
+
.filter(function (d) { return d.isDirectory() && d.name.charAt(0) !== '.'; })
|
|
292
|
+
.map(function (d) { return d.name; });
|
|
293
|
+
} catch (_e) { sectionDirs = []; }
|
|
294
|
+
|
|
295
|
+
for (const section of sectionDirs) {
|
|
296
|
+
const anchor = sectionAnchor.get(section) || sectionAnchor.get('_root');
|
|
297
|
+
if (!anchor) continue; // no valid DESCRIBES target for this section -- skip, never invent one
|
|
298
|
+
let files = [];
|
|
299
|
+
try { files = fs.readdirSync(path.join(roomDir, section)); } catch (_e) { files = []; }
|
|
300
|
+
for (const fname of files) {
|
|
301
|
+
if (!/\.md$/i.test(fname)) continue;
|
|
302
|
+
const rel = path.join(section, fname);
|
|
303
|
+
if (coveredPaths.has(path.normalize(rel))) continue;
|
|
304
|
+
if (!isAllowed(rel)) continue;
|
|
305
|
+
const abs = path.join(roomDir, rel);
|
|
306
|
+
let text = null;
|
|
307
|
+
try { text = fs.readFileSync(abs, 'utf8'); } catch (_e) { text = null; }
|
|
308
|
+
if (!text) continue;
|
|
309
|
+
artifacts.push({ artifactId: anchor, text: text, relPath: rel, exact: false });
|
|
310
|
+
coveredPaths.add(path.normalize(rel));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
return artifacts;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Phase 219-02 (D-11): the frontmatter keys the metadata pass lifts onto the
|
|
318
|
+
// artifact node as ADDITIVE JSON props. Values are JSON scalars ONLY
|
|
319
|
+
// (string/number/boolean); lists/objects/null are skipped (the frontmatter-
|
|
320
|
+
// injection threat T-219-05: a non-scalar never lands, a serialize failure
|
|
321
|
+
// skips the artifact with a counted warning, never a throw).
|
|
322
|
+
const METADATA_FM_KEYS = ['methodology', 'created', 'date', 'status', 'section', 'confidence'];
|
|
323
|
+
|
|
324
|
+
// applyArtifactMetadata(db, art) -- the per-artifact metadata merge, called
|
|
325
|
+
// INSIDE the D-05 batch transaction. Read the node's current props, merge the
|
|
326
|
+
// scalar frontmatter keys, write back through the shared insertNode UPSERT
|
|
327
|
+
// (ON CONFLICT updates type+properties only -- review_status and the
|
|
328
|
+
// provenance columns are NEVER touched). The structural `section` prop is
|
|
329
|
+
// scaffold-owned: it is only filled when absent, never overwritten by a
|
|
330
|
+
// conflicting frontmatter value (it anchors tier-b collection and ICM
|
|
331
|
+
// placement). All other metadata keys refresh on every run (metadata-owned).
|
|
332
|
+
// Returns 'applied' | 'skipped' | 'none'. NEVER throws.
|
|
333
|
+
function applyArtifactMetadata(db, art) {
|
|
334
|
+
try {
|
|
335
|
+
let fm = null;
|
|
336
|
+
try { fm = parseFrontmatter(art.text); } catch (_e) { return 'skipped'; }
|
|
337
|
+
if (!fm || typeof fm !== 'object') return 'none';
|
|
338
|
+
|
|
339
|
+
const row = db.prepare('SELECT id, type, properties FROM nodes WHERE id = ?').get(art.artifactId);
|
|
340
|
+
if (!row) return 'none';
|
|
341
|
+
let props = {};
|
|
342
|
+
try { props = JSON.parse(row.properties || '{}'); } catch (_e) { props = {}; }
|
|
343
|
+
if (!props || typeof props !== 'object' || Array.isArray(props)) props = {};
|
|
344
|
+
|
|
345
|
+
let changed = false;
|
|
346
|
+
for (const key of METADATA_FM_KEYS) {
|
|
347
|
+
const v = fm[key];
|
|
348
|
+
const isScalar = (typeof v === 'string' && v.length > 0)
|
|
349
|
+
|| typeof v === 'number' || typeof v === 'boolean';
|
|
350
|
+
if (!isScalar) continue;
|
|
351
|
+
if (key === 'section' && typeof props.section === 'string' && props.section.length > 0) {
|
|
352
|
+
continue; // structural section wins; never clobbered by frontmatter
|
|
353
|
+
}
|
|
354
|
+
if (props[key] !== v) {
|
|
355
|
+
props[key] = v;
|
|
356
|
+
changed = true;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (!changed) return 'none';
|
|
360
|
+
|
|
361
|
+
let propsJson;
|
|
362
|
+
try { propsJson = JSON.stringify(props); } catch (_e) { return 'skipped'; }
|
|
363
|
+
// The node already exists (we just SELECTed it), so this UPSERT takes the
|
|
364
|
+
// ON CONFLICT branch: properties refresh, review_status + provenance
|
|
365
|
+
// columns stay exactly as they were (merge discipline, assumption A5).
|
|
366
|
+
insertNode(db, row.id, row.type, propsJson, { epistemic_type: existingOrDefaultEpistemicType(props) });
|
|
367
|
+
return 'applied';
|
|
368
|
+
} catch (_e) {
|
|
369
|
+
return 'skipped'; // defensive: one bad artifact never kills the batch
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// Tier-2 (quick-task 260714-hzx): the number of framework (WHY) terms merged onto
|
|
374
|
+
// any single artifact node is bounded (the T-219-05 scalar-only discipline).
|
|
375
|
+
const FRAMEWORK_TERM_CAP = 25;
|
|
376
|
+
|
|
377
|
+
// artifactExcerpt(text) -- the first ~10 non-empty prose lines of an artifact,
|
|
378
|
+
// capped at 600 chars, passed to the classifier module for domain context. Skips
|
|
379
|
+
// headings and fence markers so the excerpt is representative prose, never a wall
|
|
380
|
+
// of scaffolding. Pure, never throws.
|
|
381
|
+
function artifactExcerpt(text) {
|
|
382
|
+
try {
|
|
383
|
+
const lines = String(text || '').split(/\r?\n/);
|
|
384
|
+
const picked = [];
|
|
385
|
+
for (const raw of lines) {
|
|
386
|
+
const line = raw.trim();
|
|
387
|
+
if (!line) continue;
|
|
388
|
+
if (line.charAt(0) === '#') continue; // heading
|
|
389
|
+
if (/^```/.test(line)) continue; // fence marker
|
|
390
|
+
picked.push(line);
|
|
391
|
+
if (picked.length >= 10) break;
|
|
392
|
+
}
|
|
393
|
+
return picked.join(' ').slice(0, 600);
|
|
394
|
+
} catch (_e) {
|
|
395
|
+
return '';
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// fallbackLabels(names) -- the pass-through label map: every candidate 'what'.
|
|
400
|
+
function fallbackLabels(names) {
|
|
401
|
+
const labels = {};
|
|
402
|
+
for (const n of names) labels[n] = 'what';
|
|
403
|
+
return labels;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// routeLabel(e, label, whatEntities, whyTerms, lowConfidence) -- apply one resolved
|
|
407
|
+
// label to one entity: WHAT keeps the entity flowing (byte-identical write path), WHY
|
|
408
|
+
// joins the framework-term signal on its source artifact, NOISE drops. Returns the
|
|
409
|
+
// applied label so the caller can tally the NOISE drops. The optional lowConfidence
|
|
410
|
+
// flag (quick 260715-cu8) rides a WHY term through to its artifact node so a term that
|
|
411
|
+
// landed via the no-LLM embedding best-guess is disclosed per-term, not just in the
|
|
412
|
+
// aggregate status.json counter. All existing call sites stay unflagged (confident);
|
|
413
|
+
// only the runTier2 no-LLM escalation branch passes it true.
|
|
414
|
+
//
|
|
415
|
+
// quick 260719 (RCA handoff-eureka-entity-noise): the SAME lowConfidence flag now
|
|
416
|
+
// also rides a WHAT entity. A WHAT that arrived via the no-LLM embedding best-guess
|
|
417
|
+
// is stamped e.evidenceTier = 'low_confidence' so the entity NODE carries that
|
|
418
|
+
// provenance at write time (navigation.writeEntityNode already persists evidenceTier)
|
|
419
|
+
// and the eureka pairing pass can exclude an unverified regex hit. This closes the
|
|
420
|
+
// noise the handoff traced: tier-1 hits like "Windows" / "CSFs" that the embedding
|
|
421
|
+
// tier could not resolve, with no tier-2b LLM available to reroute them to NOISE
|
|
422
|
+
// (the NOISE class only ever runs keyed, and no key resolves keyless).
|
|
423
|
+
function routeLabel(e, label, whatEntities, whyTerms, lowConfidence) {
|
|
424
|
+
if (label === 'why') {
|
|
425
|
+
const entry = { name: e.name, sourceArtifactId: e.sourceArtifactId };
|
|
426
|
+
if (lowConfidence === true) entry.lowConfidence = true;
|
|
427
|
+
whyTerms.push(entry);
|
|
428
|
+
} else if (label === 'noise') {
|
|
429
|
+
return 'noise';
|
|
430
|
+
} else {
|
|
431
|
+
if (lowConfidence === true) e.evidenceTier = 'low_confidence';
|
|
432
|
+
whatEntities.push(e);
|
|
433
|
+
}
|
|
434
|
+
return label;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// runDegradeHzx(...) -- the verbatim prior (quick-task 260714-hzx) per-artifact
|
|
438
|
+
// pass, used ONLY when tier-2a (the embedding tier) is unavailable (ok:false).
|
|
439
|
+
// Groups every survivor by artifact and asks tier-2b for all of that artifact's
|
|
440
|
+
// candidates when keyed, else the every-name-WHAT fallback. classifier_source
|
|
441
|
+
// stays model/fallback/mixed exactly as before this quick task. This preserves
|
|
442
|
+
// "an unavailable encoder means the prior behavior verbatim".
|
|
443
|
+
async function runDegradeHzx(textById, byArtifact, tier1WhyTerms, classifyImpl, keyPresent) {
|
|
444
|
+
const whatEntities = [];
|
|
445
|
+
const whyTerms = tier1WhyTerms.slice();
|
|
446
|
+
let droppedNoise = 0;
|
|
447
|
+
let usedModel = false;
|
|
448
|
+
let usedFallback = false;
|
|
449
|
+
|
|
450
|
+
for (const [artifactId, arr] of byArtifact) {
|
|
451
|
+
const names = arr.map(function (e) { return e.name; });
|
|
452
|
+
let result;
|
|
453
|
+
if (!keyPresent) {
|
|
454
|
+
result = { labels: fallbackLabels(names), source: 'fallback' };
|
|
455
|
+
} else {
|
|
456
|
+
const excerpt = artifactExcerpt(textById.get(artifactId) || '');
|
|
457
|
+
try {
|
|
458
|
+
result = await classifyImpl({ names: names, excerpt: excerpt });
|
|
459
|
+
} catch (_e) {
|
|
460
|
+
result = { labels: fallbackLabels(names), source: 'fallback' };
|
|
461
|
+
}
|
|
462
|
+
if (!result || typeof result !== 'object' || !result.labels || typeof result.labels !== 'object') {
|
|
463
|
+
result = { labels: fallbackLabels(names), source: 'fallback' };
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
if (result.source === 'model') usedModel = true;
|
|
467
|
+
else usedFallback = true;
|
|
468
|
+
|
|
469
|
+
for (const e of arr) {
|
|
470
|
+
const raw = result.labels[e.name];
|
|
471
|
+
const label = (raw === 'why' || raw === 'noise') ? raw : 'what';
|
|
472
|
+
// quick 260719: in the tier-2a-unavailable degrade, a WHAT sourced from the
|
|
473
|
+
// every-name-WHAT fallback (neither semantic tier ran) is stamped evidenceTier
|
|
474
|
+
// 'fallback' as HONEST PROVENANCE only. Unlike 'low_confidence', 'fallback' is
|
|
475
|
+
// DELIBERATELY NOT excluded from eureka pairing: when the encoder is
|
|
476
|
+
// unavailable these fallback entities are the ONLY substrate the room has, so
|
|
477
|
+
// excluding them would empty the ranked list and break Decision 8 (graceful
|
|
478
|
+
// degradation everywhere; proven by tests/test-218-noise-reduction.cjs). The
|
|
479
|
+
// pairing exclusion set (LOW_TRUST_EVIDENCE_TIERS in
|
|
480
|
+
// scripts/eureka-portfolio-report.cjs) is low_confidence ONLY. A model-sourced
|
|
481
|
+
// WHAT stays unstamped (evidenceTier 'None').
|
|
482
|
+
if (label === 'what' && result.source !== 'model') e.evidenceTier = 'fallback';
|
|
483
|
+
if (routeLabel(e, label, whatEntities, whyTerms) === 'noise') droppedNoise += 1;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
let classifierSource;
|
|
488
|
+
if (usedModel && usedFallback) classifierSource = 'mixed';
|
|
489
|
+
else if (usedModel) classifierSource = 'model';
|
|
490
|
+
else classifierSource = 'fallback';
|
|
491
|
+
|
|
492
|
+
return {
|
|
493
|
+
whatEntities: whatEntities,
|
|
494
|
+
whyTerms: whyTerms,
|
|
495
|
+
droppedNoise: droppedNoise,
|
|
496
|
+
classifierSource: classifierSource,
|
|
497
|
+
embeddingResolved: 0,
|
|
498
|
+
escalated: 0,
|
|
499
|
+
modelResolved: usedModel ? whatEntities.length + (whyTerms.length - tier1WhyTerms.length) + droppedNoise : 0,
|
|
500
|
+
lowConfidence: 0,
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
// runTier2(artifacts, entities, tier1WhyTerms, classifyImpl, embedClassifyImpl,
|
|
505
|
+
// keyPresent) -- the LOCKED two-tier semantic pass. Tier-2a (the embedding
|
|
506
|
+
// classifier) runs first over ALL unique survivor names in ONE call; confident
|
|
507
|
+
// candidates resolve for free. Only the low-margin residual escalates to tier-2b
|
|
508
|
+
// (the LLM classifier), grouped per artifact, escalated names ONLY. Every model
|
|
509
|
+
// call completes here, BEFORE the caller opens the D-05 transaction, so neither
|
|
510
|
+
// tier holds the write lock. Returns
|
|
511
|
+
// { whatEntities, whyTerms, droppedNoise, classifierSource,
|
|
512
|
+
// embeddingResolved, escalated, modelResolved, lowConfidence }.
|
|
513
|
+
async function runTier2(artifacts, entities, tier1WhyTerms, classifyImpl, embedClassifyImpl, keyPresent) {
|
|
514
|
+
const textById = new Map();
|
|
515
|
+
for (const art of artifacts) textById.set(art.artifactId, art.text);
|
|
516
|
+
|
|
517
|
+
const byArtifact = new Map(); // artifactId -> [entity]
|
|
518
|
+
for (const e of entities) {
|
|
519
|
+
if (!byArtifact.has(e.sourceArtifactId)) byArtifact.set(e.sourceArtifactId, []);
|
|
520
|
+
byArtifact.get(e.sourceArtifactId).push(e);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// Tier-2a: ONE embedding call over the unique candidate names (the module
|
|
524
|
+
// batches the embedding internally). A dedup keeps the reference-vs-candidate
|
|
525
|
+
// scoring bounded regardless of how many artifacts share a name.
|
|
526
|
+
const uniqueNames = Array.from(new Set(entities.map(function (e) { return e.name; })));
|
|
527
|
+
let embed = null;
|
|
528
|
+
try {
|
|
529
|
+
embed = await embedClassifyImpl({ names: uniqueNames });
|
|
530
|
+
} catch (_e) {
|
|
531
|
+
embed = { ok: false, error: 'embed_failed' };
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// Tier-2a unavailable -> the ENTIRE tier degrades to the prior hzx behavior.
|
|
535
|
+
if (!embed || embed.ok !== true || !embed.results || typeof embed.results !== 'object') {
|
|
536
|
+
return runDegradeHzx(textById, byArtifact, tier1WhyTerms, classifyImpl, keyPresent);
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
const whatEntities = [];
|
|
540
|
+
const whyTerms = tier1WhyTerms.slice(); // tier-1 structural WHY seed (zero model cost)
|
|
541
|
+
let droppedNoise = 0;
|
|
542
|
+
let embeddingResolved = 0;
|
|
543
|
+
let escalated = 0;
|
|
544
|
+
let modelResolved = 0;
|
|
545
|
+
let lowConfidence = 0;
|
|
546
|
+
|
|
547
|
+
// Partition: confident embedding results resolve now; unconfident ones (or a
|
|
548
|
+
// missing result) collect into the per-artifact escalation set, carrying their
|
|
549
|
+
// embedding best-guess label as the no-LLM / failed-LLM fallback.
|
|
550
|
+
const escByArtifact = new Map(); // artifactId -> [{ e, bestGuess }]
|
|
551
|
+
for (const e of entities) {
|
|
552
|
+
const er = embed.results[e.name];
|
|
553
|
+
if (er && er.confident === true && (er.label === 'what' || er.label === 'why')) {
|
|
554
|
+
routeLabel(e, er.label, whatEntities, whyTerms);
|
|
555
|
+
embeddingResolved += 1;
|
|
556
|
+
} else {
|
|
557
|
+
const bestGuess = (er && (er.label === 'what' || er.label === 'why')) ? er.label : 'what';
|
|
558
|
+
if (!escByArtifact.has(e.sourceArtifactId)) escByArtifact.set(e.sourceArtifactId, []);
|
|
559
|
+
escByArtifact.get(e.sourceArtifactId).push({ e: e, bestGuess: bestGuess });
|
|
560
|
+
escalated += 1;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
// Tier-2b escalation: per artifact, the escalated names ONLY.
|
|
565
|
+
for (const [artifactId, items] of escByArtifact) {
|
|
566
|
+
const escNames = items.map(function (it) { return it.e.name; });
|
|
567
|
+
let modelLabels = null;
|
|
568
|
+
if (keyPresent) {
|
|
569
|
+
const excerpt = artifactExcerpt(textById.get(artifactId) || '');
|
|
570
|
+
let result;
|
|
571
|
+
try {
|
|
572
|
+
result = await classifyImpl({ names: escNames, excerpt: excerpt });
|
|
573
|
+
} catch (_e) {
|
|
574
|
+
result = null;
|
|
575
|
+
}
|
|
576
|
+
// Accept model labels only when the call succeeded with source 'model';
|
|
577
|
+
// a throw, a bad shape, or a fallback source routes THIS artifact's
|
|
578
|
+
// escalated candidates to the embedding best-guess (disclosed low-confidence).
|
|
579
|
+
if (result && typeof result === 'object' && result.labels
|
|
580
|
+
&& typeof result.labels === 'object' && result.source === 'model') {
|
|
581
|
+
modelLabels = result.labels;
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
for (const it of items) {
|
|
586
|
+
if (modelLabels) {
|
|
587
|
+
const raw = modelLabels[it.e.name];
|
|
588
|
+
const label = (raw === 'why' || raw === 'noise' || raw === 'what') ? raw : it.bestGuess;
|
|
589
|
+
if (routeLabel(it.e, label, whatEntities, whyTerms) === 'noise') droppedNoise += 1;
|
|
590
|
+
modelResolved += 1;
|
|
591
|
+
} else {
|
|
592
|
+
// No LLM (no key, or the escalation failed): the embedding best-guess
|
|
593
|
+
// stands, counted as low-confidence -- NEVER a silent WHAT default. The
|
|
594
|
+
// lowConfidence flag threads the disclosure per-term to the artifact node
|
|
595
|
+
// (quick 260715-cu8), not just into the aggregate lowConfidence counter.
|
|
596
|
+
routeLabel(it.e, it.bestGuess, whatEntities, whyTerms, true);
|
|
597
|
+
lowConfidence += 1;
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
// classifier_source honesty (K44-REQ-3): which tier actually resolved candidates.
|
|
603
|
+
const resolvedByEmbedding = embeddingResolved > 0 || lowConfidence > 0;
|
|
604
|
+
const resolvedByModel = modelResolved > 0;
|
|
605
|
+
let classifierSource;
|
|
606
|
+
if (resolvedByModel && resolvedByEmbedding) classifierSource = 'mixed';
|
|
607
|
+
else if (resolvedByModel) classifierSource = 'model';
|
|
608
|
+
else if (resolvedByEmbedding) classifierSource = 'embedding';
|
|
609
|
+
else classifierSource = 'fallback'; // nothing resolved semantically (no candidates)
|
|
610
|
+
|
|
611
|
+
return {
|
|
612
|
+
whatEntities: whatEntities,
|
|
613
|
+
whyTerms: whyTerms,
|
|
614
|
+
droppedNoise: droppedNoise,
|
|
615
|
+
classifierSource: classifierSource,
|
|
616
|
+
embeddingResolved: embeddingResolved,
|
|
617
|
+
escalated: escalated,
|
|
618
|
+
modelResolved: modelResolved,
|
|
619
|
+
lowConfidence: lowConfidence,
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
// applyFrameworkTerms(db, artifactId, terms) -- the WHY-signal merge, called
|
|
624
|
+
// INSIDE the D-05 transaction alongside the metadata pass. Mirrors
|
|
625
|
+
// applyArtifactMetadata EXACTLY: SELECT the node, parse props, union the new
|
|
626
|
+
// framework terms with any existing props.framework_terms (comma-split), and write
|
|
627
|
+
// back SCALAR PROPS ONLY via the shared insertNode UPSERT: framework_terms
|
|
628
|
+
// (comma-joined, capped), framework_term_count (number), and -- additively, quick
|
|
629
|
+
// 260715-cu8 -- framework_terms_low_confidence (comma-joined subset naming the terms
|
|
630
|
+
// that landed via the no-LLM embedding best-guess degrade). `terms` is an array of
|
|
631
|
+
// { name, lowConfidence } entries (a bare string is tolerated and treated confident).
|
|
632
|
+
// Scalars only (T-219-05); never a new node type, never an edge; review_status and
|
|
633
|
+
// provenance are never touched. Returns 'applied' | 'skipped' | 'none'. NEVER throws.
|
|
634
|
+
//
|
|
635
|
+
// Reader-audit finding (planning_findings item 3, quick 260715-cu8): framework_terms
|
|
636
|
+
// has NO production readers outside this pipeline. A grep (node_modules + .planning
|
|
637
|
+
// excluded) shows the ONLY writer is this file and the ONLY readers are
|
|
638
|
+
// tests/test-218-what-why-classifier.cjs and tests/test-218-extend-to-artifacts.cjs,
|
|
639
|
+
// both via substring indexOf checks on the comma-joined string. framework_terms stays
|
|
640
|
+
// a plain comma-joined scalar (byte-compatible for those substring readers); the new
|
|
641
|
+
// framework_terms_low_confidence is a purely additive sibling scalar that cannot break
|
|
642
|
+
// any existing reader.
|
|
643
|
+
function applyFrameworkTerms(db, artifactId, terms) {
|
|
644
|
+
try {
|
|
645
|
+
const row = db.prepare('SELECT id, type, properties FROM nodes WHERE id = ?').get(artifactId);
|
|
646
|
+
if (!row) return 'none';
|
|
647
|
+
let props = {};
|
|
648
|
+
try { props = JSON.parse(row.properties || '{}'); } catch (_e) { props = {}; }
|
|
649
|
+
if (!props || typeof props !== 'object' || Array.isArray(props)) props = {};
|
|
650
|
+
|
|
651
|
+
// Normalize the incoming WHY terms. Preserve order for first-seen casing;
|
|
652
|
+
// split into the incoming name list, the low-confidence names, and the set of
|
|
653
|
+
// names that arrived CONFIDENT this call (a bare string counts as confident).
|
|
654
|
+
const incomingNames = [];
|
|
655
|
+
const incomingLowConf = [];
|
|
656
|
+
const incomingConfidentKeys = new Set();
|
|
657
|
+
for (const t of terms) {
|
|
658
|
+
let name, low;
|
|
659
|
+
if (typeof t === 'string') { name = t; low = false; }
|
|
660
|
+
else if (t && typeof t === 'object') { name = t.name; low = t.lowConfidence === true; }
|
|
661
|
+
else { continue; }
|
|
662
|
+
if (typeof name !== 'string' || name.length === 0) continue;
|
|
663
|
+
incomingNames.push(name);
|
|
664
|
+
if (low) incomingLowConf.push(name);
|
|
665
|
+
else incomingConfidentKeys.add(name.toLowerCase());
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
const existing = (typeof props.framework_terms === 'string' && props.framework_terms.length > 0)
|
|
669
|
+
? props.framework_terms.split(',').map(function (s) { return s.trim(); }).filter(Boolean)
|
|
670
|
+
: [];
|
|
671
|
+
|
|
672
|
+
// Union existing + new, case-insensitive dedup, first-seen casing wins, capped.
|
|
673
|
+
const seen = new Set();
|
|
674
|
+
const merged = [];
|
|
675
|
+
for (const t of existing.concat(incomingNames)) {
|
|
676
|
+
if (typeof t !== 'string' || t.length === 0) continue;
|
|
677
|
+
const k = t.toLowerCase();
|
|
678
|
+
if (seen.has(k)) continue;
|
|
679
|
+
seen.add(k);
|
|
680
|
+
merged.push(t);
|
|
681
|
+
if (merged.length >= FRAMEWORK_TERM_CAP) break;
|
|
682
|
+
}
|
|
683
|
+
if (merged.length === 0) return 'none';
|
|
684
|
+
|
|
685
|
+
props.framework_terms = merged.join(', ');
|
|
686
|
+
props.framework_term_count = merged.length;
|
|
687
|
+
|
|
688
|
+
// Sibling scalar prop maintenance (quick 260715-cu8): union the prior low-conf
|
|
689
|
+
// names with this call's low-conf names, DROP any that arrived confident this
|
|
690
|
+
// call (upgrade wins), prune to the merged framework_terms set (subset
|
|
691
|
+
// invariant), dedup case-insensitively, cap. Write when non-empty; DELETE when
|
|
692
|
+
// empty (never an empty string). Same scalar-only merge discipline as above.
|
|
693
|
+
const existingLow = (typeof props.framework_terms_low_confidence === 'string' && props.framework_terms_low_confidence.length > 0)
|
|
694
|
+
? props.framework_terms_low_confidence.split(',').map(function (s) { return s.trim(); }).filter(Boolean)
|
|
695
|
+
: [];
|
|
696
|
+
const mergedKeys = new Set(merged.map(function (m) { return m.toLowerCase(); }));
|
|
697
|
+
const lowSeen = new Set();
|
|
698
|
+
const lowMerged = [];
|
|
699
|
+
for (const t of existingLow.concat(incomingLowConf)) {
|
|
700
|
+
if (typeof t !== 'string' || t.length === 0) continue;
|
|
701
|
+
const k = t.toLowerCase();
|
|
702
|
+
if (lowSeen.has(k)) continue; // case-insensitive dedup, first-seen casing
|
|
703
|
+
if (incomingConfidentKeys.has(k)) continue; // confident this call -> upgrade removes the marker
|
|
704
|
+
if (!mergedKeys.has(k)) continue; // subset invariant: only names present in framework_terms
|
|
705
|
+
lowSeen.add(k);
|
|
706
|
+
lowMerged.push(t);
|
|
707
|
+
if (lowMerged.length >= FRAMEWORK_TERM_CAP) break;
|
|
708
|
+
}
|
|
709
|
+
if (lowMerged.length > 0) {
|
|
710
|
+
props.framework_terms_low_confidence = lowMerged.join(', ');
|
|
711
|
+
} else {
|
|
712
|
+
delete props.framework_terms_low_confidence;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
let propsJson;
|
|
716
|
+
try { propsJson = JSON.stringify(props); } catch (_e) { return 'skipped'; }
|
|
717
|
+
// The node already exists (just SELECTed), so this UPSERT takes the ON
|
|
718
|
+
// CONFLICT branch: properties refresh, review_status + provenance untouched.
|
|
719
|
+
insertNode(db, row.id, row.type, propsJson, { epistemic_type: existingOrDefaultEpistemicType(props) });
|
|
720
|
+
return 'applied';
|
|
721
|
+
} catch (_e) {
|
|
722
|
+
return 'skipped';
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
async function runExtraction(db, roomDir, sessionId, maxPerArtifact, opts) {
|
|
727
|
+
const options = opts || {};
|
|
728
|
+
// opts.paths (optional, ADDITIVE): the D-16 scoped-incremental allowlist.
|
|
729
|
+
// Absent -> full-room collection, byte-identical to the 218 behavior.
|
|
730
|
+
const artifacts = collectArtifacts(db, roomDir, options.paths);
|
|
731
|
+
|
|
732
|
+
// Aggregate all candidates first (pure, no writes yet). Tier-1 now also yields
|
|
733
|
+
// a structural WHY seed (frameworkTerms) at zero model cost -- these never go to
|
|
734
|
+
// the model, they are already known framework vocabulary.
|
|
735
|
+
const rawEntities = []; // { entityType, name, sourceArtifactId }
|
|
736
|
+
const relations = []; // { source, target, edge_type }
|
|
737
|
+
const tier1WhyTerms = []; // { name, sourceArtifactId }
|
|
738
|
+
for (const art of artifacts) {
|
|
739
|
+
const res = extractEntities(art.text, { sourceArtifactId: art.artifactId, maxPerArtifact: maxPerArtifact });
|
|
740
|
+
for (const e of res.entities) rawEntities.push(e);
|
|
741
|
+
for (const r of res.relations) relations.push(r);
|
|
742
|
+
if (Array.isArray(res.frameworkTerms)) {
|
|
743
|
+
for (const t of res.frameworkTerms) tier1WhyTerms.push(t);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
// Tier-2 (two-tier, quick-task 260714-k44): the semantic pass runs AFTER
|
|
748
|
+
// aggregation and strictly BEFORE db.exec('BEGIN'). Tier-2a (the embedding
|
|
749
|
+
// classifier) resolves the confident majority for free; only the low-margin
|
|
750
|
+
// residual escalates to tier-2b (the LLM classifier). Two additive seams mirror
|
|
751
|
+
// the classifyImpl idiom:
|
|
752
|
+
// opts.embedClassifyImpl - the tier-2a surrogate (defaults to the real
|
|
753
|
+
// classifyByEmbedding); a test injects deterministic embedding verdicts.
|
|
754
|
+
// opts.classifyImpl - the tier-2b surrogate (defaults to the real
|
|
755
|
+
// classifyArtifactCandidates); injecting it bypasses the key gate.
|
|
756
|
+
// opts._forceNoLlm - test-only: forces keyPresent false so the honest
|
|
757
|
+
// no-LLM degrade leg is deterministic regardless of the machine key state.
|
|
758
|
+
const classifyInjected = typeof options.classifyImpl === 'function';
|
|
759
|
+
const classifyImpl = classifyInjected
|
|
760
|
+
? options.classifyImpl
|
|
761
|
+
: entityClassifier.classifyArtifactCandidates;
|
|
762
|
+
const embedInjected = typeof options.embedClassifyImpl === 'function';
|
|
763
|
+
const embedClassifyImpl = embedInjected
|
|
764
|
+
? options.embedClassifyImpl
|
|
765
|
+
: entityEmbedClassifier.classifyByEmbedding;
|
|
766
|
+
const forceNoLlm = options._forceNoLlm === true;
|
|
767
|
+
const keyPresent = forceNoLlm
|
|
768
|
+
? false
|
|
769
|
+
: (classifyInjected ? true : (resolveAnthropicKey() !== null));
|
|
770
|
+
|
|
771
|
+
const tier2 = await runTier2(artifacts, rawEntities, tier1WhyTerms, classifyImpl, embedClassifyImpl, keyPresent);
|
|
772
|
+
const entities = tier2.whatEntities;
|
|
773
|
+
|
|
774
|
+
// CR-01 fix (code review, phase 231, 2026-07-19): the same entity name can
|
|
775
|
+
// appear in more than one artifact. Tier-2a classifies each unique name ONCE
|
|
776
|
+
// globally, but tier-2b escalation runs PER ARTIFACT with a separate network
|
|
777
|
+
// call each time, so an ordinary transient failure on just one of those calls
|
|
778
|
+
// can leave two entries for the same name disagreeing on evidenceTier (one
|
|
779
|
+
// 'None'/trusted, one 'low_confidence'). Both entries write to the SAME node
|
|
780
|
+
// id (ENTITY_NODE_ID is minted from name alone), and node-insert.cjs's
|
|
781
|
+
// ON CONFLICT is a full overwrite, never a merge -- so without this pass,
|
|
782
|
+
// whichever entry happens to write LAST in array order wins outright,
|
|
783
|
+
// silently flipping a trusted entity to excluded (or vice versa) based on
|
|
784
|
+
// filesystem read order, not evidence. This mirrors the "confident upgrade
|
|
785
|
+
// wins" reconciliation applyFrameworkTerms() already does for the WHY side.
|
|
786
|
+
// NOTE: this only NORMALIZES evidenceTier across same-name entries in place
|
|
787
|
+
// -- it does not remove any entries, so every artifact that mentions the
|
|
788
|
+
// entity still gets its own DESCRIBES edge in the write loop below.
|
|
789
|
+
(function reconcileEvidenceTierAcrossDuplicateNames() {
|
|
790
|
+
const trustRank = { None: 2, fallback: 1, low_confidence: 0 };
|
|
791
|
+
const rankOf = function (tier) { return trustRank[tier || 'None']; };
|
|
792
|
+
// Map.get() returns undefined both for "key absent" and for "key present
|
|
793
|
+
// with value undefined" (a trusted entity's evidenceTier is legitimately
|
|
794
|
+
// undefined) -- those are NOT the same thing here, so track presence with
|
|
795
|
+
// .has() rather than an undefined check, and never store the literal
|
|
796
|
+
// `undefined` value itself (normalize it to the 'None' string).
|
|
797
|
+
const bestByName = new Map(); // name -> highest-trust evidenceTier seen ('None'/'fallback'/'low_confidence')
|
|
798
|
+
for (const e of entities) {
|
|
799
|
+
const tier = e.evidenceTier || 'None';
|
|
800
|
+
if (!bestByName.has(e.name) || rankOf(tier) > rankOf(bestByName.get(e.name))) {
|
|
801
|
+
bestByName.set(e.name, tier);
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
for (const e of entities) {
|
|
805
|
+
const winner = bestByName.get(e.name);
|
|
806
|
+
e.evidenceTier = winner === 'None' ? undefined : winner;
|
|
807
|
+
}
|
|
808
|
+
})();
|
|
809
|
+
|
|
810
|
+
// Relation filter: an edge endpoint node exists only for a surviving WHAT name.
|
|
811
|
+
// Drop any relation whose source or target was rerouted to WHY or dropped.
|
|
812
|
+
const whatNames = new Set(entities.map(function (e) { return e.name; }));
|
|
813
|
+
const survivingRelations = relations.filter(function (r) {
|
|
814
|
+
return whatNames.has(r.source) && whatNames.has(r.target);
|
|
815
|
+
});
|
|
816
|
+
|
|
817
|
+
// Aggregate the WHY terms per artifact for the in-transaction merge. Each entry
|
|
818
|
+
// carries { name, lowConfidence } (quick 260715-cu8) so applyFrameworkTerms can
|
|
819
|
+
// maintain the per-term disclosure sibling prop; a bare confident term reduces to
|
|
820
|
+
// lowConfidence:false.
|
|
821
|
+
const whyByArtifact = new Map(); // artifactId -> [{ name, lowConfidence }]
|
|
822
|
+
for (const t of tier2.whyTerms) {
|
|
823
|
+
if (!whyByArtifact.has(t.sourceArtifactId)) whyByArtifact.set(t.sourceArtifactId, []);
|
|
824
|
+
whyByArtifact.get(t.sourceArtifactId).push({ name: t.name, lowConfidence: t.lowConfidence === true });
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
let entitiesWritten = 0;
|
|
828
|
+
let edgesWritten = 0;
|
|
829
|
+
let metadataApplied = 0;
|
|
830
|
+
let metadataSkipped = 0;
|
|
831
|
+
let frameworkApplied = 0;
|
|
832
|
+
let frameworkSkipped = 0;
|
|
833
|
+
|
|
834
|
+
// D-05 batch: ONE explicit transaction around the whole node+edge batch.
|
|
835
|
+
// node:sqlite has NO .transaction() helper (Pitfall 3) -- BEGIN/COMMIT/ROLLBACK
|
|
836
|
+
// via db.exec. A mid-batch error rolls back ALL of it (T-218-09).
|
|
837
|
+
db.exec('BEGIN');
|
|
838
|
+
try {
|
|
839
|
+
// 1. Entity nodes -- born review_status='proposed' via the chokepoint.
|
|
840
|
+
for (const e of entities) {
|
|
841
|
+
const r = navigation.writeEntityNode(db, {
|
|
842
|
+
entityType: e.entityType,
|
|
843
|
+
name: e.name,
|
|
844
|
+
sessionId: sessionId,
|
|
845
|
+
// quick 260719: carry the provenance stamp threaded onto the entity by
|
|
846
|
+
// routeLabel / runDegradeHzx. A confident entity leaves this undefined and
|
|
847
|
+
// writeEntityNode defaults evidenceTier to 'None' (byte-identical to the
|
|
848
|
+
// prior write). A low_confidence / fallback WHAT lands stamped so the eureka
|
|
849
|
+
// pairing pass excludes an unverified regex hit.
|
|
850
|
+
evidenceTier: e.evidenceTier,
|
|
851
|
+
});
|
|
852
|
+
if (r && r.ok) entitiesWritten += 1;
|
|
853
|
+
}
|
|
854
|
+
// 2. entity -> artifact DESCRIBES links (provenance). Direction source=entity
|
|
855
|
+
// target=memory_artifact. Routed through navigation.writeEdge (never raw
|
|
856
|
+
// SQL). The target is a real memory_artifact node (collectArtifacts).
|
|
857
|
+
for (const e of entities) {
|
|
858
|
+
const entityId = navigation.ENTITY_NODE_ID(sessionId, e.name);
|
|
859
|
+
const r = navigation.writeEdge(db, {
|
|
860
|
+
source_id: entityId,
|
|
861
|
+
target_id: e.sourceArtifactId,
|
|
862
|
+
edge_type: 'DESCRIBES',
|
|
863
|
+
properties: { relation: 'describes', entity_node: entityId },
|
|
864
|
+
});
|
|
865
|
+
if (r && r.ok) edgesWritten += 1;
|
|
866
|
+
}
|
|
867
|
+
// 3. entity -> entity domain-relationship edges. The extractor names the
|
|
868
|
+
// endpoints; ENTITY_NODE_ID resolves each name to the same node id
|
|
869
|
+
// writeEntityNode minted under this sessionId. Only relations whose BOTH
|
|
870
|
+
// endpoints survived tier-2 as WHAT are written (a WHY/NOISE endpoint has
|
|
871
|
+
// no entity node to point at).
|
|
872
|
+
for (const rel of survivingRelations) {
|
|
873
|
+
const srcId = navigation.ENTITY_NODE_ID(sessionId, rel.source);
|
|
874
|
+
const tgtId = navigation.ENTITY_NODE_ID(sessionId, rel.target);
|
|
875
|
+
const r = navigation.writeEdge(db, {
|
|
876
|
+
source_id: srcId,
|
|
877
|
+
target_id: tgtId,
|
|
878
|
+
edge_type: rel.edge_type,
|
|
879
|
+
properties: { relation: String(rel.edge_type).toLowerCase() },
|
|
880
|
+
});
|
|
881
|
+
if (r && r.ok) edgesWritten += 1;
|
|
882
|
+
}
|
|
883
|
+
// 4. Phase 219-02 (D-11, REQ-5): the frontmatter metadata pass, INSIDE the
|
|
884
|
+
// same D-05 transaction. Only EXACT artifacts (the node IS that file)
|
|
885
|
+
// receive metadata -- a tier-b section anchor stands for a different
|
|
886
|
+
// file, so writing another file's frontmatter onto it would lie.
|
|
887
|
+
// Deterministic, zero-LLM, zero network; a skip is counted, never a
|
|
888
|
+
// throw (the batch survives, T-219-05).
|
|
889
|
+
for (const art of artifacts) {
|
|
890
|
+
if (!art.exact) continue;
|
|
891
|
+
const outcome = applyArtifactMetadata(db, art);
|
|
892
|
+
if (outcome === 'applied') metadataApplied += 1;
|
|
893
|
+
else if (outcome === 'skipped') metadataSkipped += 1;
|
|
894
|
+
}
|
|
895
|
+
// 5. Tier-2 (quick-task 260714-hzx): the framework-term (WHY) merge, INSIDE
|
|
896
|
+
// the same D-05 transaction. Two scalar props only (framework_terms +
|
|
897
|
+
// framework_term_count); never a new node type, never an edge. A per-
|
|
898
|
+
// artifact failure is counted and skipped, never thrown (the batch
|
|
899
|
+
// survives). Merges onto the WHY term's source artifact node regardless of
|
|
900
|
+
// exact/anchor -- the term names framework vocabulary observed in that
|
|
901
|
+
// file's prose, attributed to its provenance artifact.
|
|
902
|
+
for (const [artifactId, terms] of whyByArtifact) {
|
|
903
|
+
const outcome = applyFrameworkTerms(db, artifactId, terms);
|
|
904
|
+
if (outcome === 'applied') frameworkApplied += 1;
|
|
905
|
+
else if (outcome === 'skipped') frameworkSkipped += 1;
|
|
906
|
+
}
|
|
907
|
+
db.exec('COMMIT');
|
|
908
|
+
} catch (err) {
|
|
909
|
+
db.exec('ROLLBACK');
|
|
910
|
+
throw err;
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
// Route-a best-effort re-embed (REQ-3, Open Q2). AFTER commit, in its OWN
|
|
914
|
+
// try/catch: a slow/absent encoder degrades to lexical-only and must NEVER
|
|
915
|
+
// throw or roll back the entity writes (T-218-10). indexNodes is idempotent
|
|
916
|
+
// (per-node DELETE-then-INSERT), so re-running is safe.
|
|
917
|
+
let embedded = false;
|
|
918
|
+
// Tier-2 additive result fields (entitiesWhat / termsWhy / droppedNoise /
|
|
919
|
+
// classifierSource) ride both the success and the degrade branch identically.
|
|
920
|
+
const tier2Result = {
|
|
921
|
+
entitiesWhat: entities.length,
|
|
922
|
+
termsWhy: tier2.whyTerms.length,
|
|
923
|
+
droppedNoise: tier2.droppedNoise,
|
|
924
|
+
classifierSource: tier2.classifierSource,
|
|
925
|
+
frameworkApplied: frameworkApplied,
|
|
926
|
+
frameworkSkipped: frameworkSkipped,
|
|
927
|
+
// Two-tier (quick-task 260714-k44) additive per-tier counts: how many
|
|
928
|
+
// candidates each tier resolved, how many escalated, and how many landed on a
|
|
929
|
+
// disclosed low-confidence embedding best-guess (never a silent WHAT).
|
|
930
|
+
tier2Embedding: tier2.embeddingResolved,
|
|
931
|
+
tier2Escalated: tier2.escalated,
|
|
932
|
+
tier2Model: tier2.modelResolved,
|
|
933
|
+
tier2LowConfidence: tier2.lowConfidence,
|
|
934
|
+
};
|
|
935
|
+
return triModal.indexNodes(db, { roomDir: roomDir })
|
|
936
|
+
.then(function (idx) {
|
|
937
|
+
embedded = !!(idx && idx.embedded);
|
|
938
|
+
return Object.assign({
|
|
939
|
+
artifacts: artifacts.length,
|
|
940
|
+
entitiesWritten: entitiesWritten,
|
|
941
|
+
edgesWritten: edgesWritten,
|
|
942
|
+
embedded: embedded,
|
|
943
|
+
metadataApplied: metadataApplied,
|
|
944
|
+
metadataSkipped: metadataSkipped,
|
|
945
|
+
}, tier2Result);
|
|
946
|
+
})
|
|
947
|
+
.catch(function () {
|
|
948
|
+
// Degrade-never-throw: the entity writes are already committed.
|
|
949
|
+
return Object.assign({
|
|
950
|
+
artifacts: artifacts.length,
|
|
951
|
+
entitiesWritten: entitiesWritten,
|
|
952
|
+
edgesWritten: edgesWritten,
|
|
953
|
+
embedded: false,
|
|
954
|
+
metadataApplied: metadataApplied,
|
|
955
|
+
metadataSkipped: metadataSkipped,
|
|
956
|
+
}, tier2Result);
|
|
957
|
+
});
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
// ---------------------------------------------------------------------------
|
|
961
|
+
// Subcommands.
|
|
962
|
+
// ---------------------------------------------------------------------------
|
|
963
|
+
|
|
964
|
+
async function cmdRun(opts) {
|
|
965
|
+
const roomDir = opts.roomDir;
|
|
966
|
+
if (!dirExists(roomDir)) {
|
|
967
|
+
printError('room directory not found', String(roomDir) + ' is not a directory', 'pass a valid room path, or run /mos:new-project');
|
|
968
|
+
return 1;
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
const startedAt = new Date().toISOString();
|
|
972
|
+
writeStatus(roomDir, { state: 'running', started_at: startedAt, pid: process.pid });
|
|
973
|
+
|
|
974
|
+
let db = null;
|
|
975
|
+
try {
|
|
976
|
+
db = openRoomDb(roomDir, { allowExtension: true });
|
|
977
|
+
const result = await runExtraction(db, roomDir, opts.session, opts.max);
|
|
978
|
+
writeStatus(roomDir, {
|
|
979
|
+
state: 'done',
|
|
980
|
+
started_at: startedAt,
|
|
981
|
+
finished_at: new Date().toISOString(),
|
|
982
|
+
pid: process.pid,
|
|
983
|
+
artifacts: result.artifacts,
|
|
984
|
+
entities: result.entitiesWritten,
|
|
985
|
+
edges: result.edgesWritten,
|
|
986
|
+
embedded: result.embedded,
|
|
987
|
+
metadata_applied: result.metadataApplied,
|
|
988
|
+
metadata_skipped: result.metadataSkipped,
|
|
989
|
+
// Tier-2 (quick-task 260714-hzx) additive observability keys.
|
|
990
|
+
entities_what: result.entitiesWhat,
|
|
991
|
+
terms_why: result.termsWhy,
|
|
992
|
+
dropped_noise: result.droppedNoise,
|
|
993
|
+
classifier_source: result.classifierSource,
|
|
994
|
+
framework_applied: result.frameworkApplied,
|
|
995
|
+
framework_skipped: result.frameworkSkipped,
|
|
996
|
+
// Two-tier (quick-task 260714-k44) additive per-tier observability keys.
|
|
997
|
+
tier2_embedding: result.tier2Embedding,
|
|
998
|
+
tier2_escalated: result.tier2Escalated,
|
|
999
|
+
tier2_model: result.tier2Model,
|
|
1000
|
+
tier2_low_confidence: result.tier2LowConfidence,
|
|
1001
|
+
session: opts.session,
|
|
1002
|
+
});
|
|
1003
|
+
return 0;
|
|
1004
|
+
} catch (err) {
|
|
1005
|
+
const msg = String(err && err.message ? err.message : err).split('\n')[0];
|
|
1006
|
+
writeStatus(roomDir, {
|
|
1007
|
+
state: 'failed',
|
|
1008
|
+
started_at: startedAt,
|
|
1009
|
+
finished_at: new Date().toISOString(),
|
|
1010
|
+
pid: process.pid,
|
|
1011
|
+
error: msg,
|
|
1012
|
+
});
|
|
1013
|
+
printError('entity extraction failed', msg, 'inspect ' + statusPath(roomDir) + ' then re-run entity-extract');
|
|
1014
|
+
return 1;
|
|
1015
|
+
} finally {
|
|
1016
|
+
if (db) { try { closeRoomDb(db); } catch (_e) { /* already closed */ } }
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
function cmdStart(opts) {
|
|
1021
|
+
const roomDir = opts.roomDir;
|
|
1022
|
+
if (!dirExists(roomDir)) {
|
|
1023
|
+
printError('room directory not found', String(roomDir) + ' is not a directory', 'pass a valid room path, or run /mos:new-project');
|
|
1024
|
+
return 1;
|
|
1025
|
+
}
|
|
1026
|
+
fs.mkdirSync(reportDir(roomDir), { recursive: true });
|
|
1027
|
+
|
|
1028
|
+
const forwarded = [];
|
|
1029
|
+
if (opts.sessionProvided) forwarded.push('--session', String(opts.session));
|
|
1030
|
+
if (opts.maxProvided) forwarded.push('--max', String(opts.max));
|
|
1031
|
+
|
|
1032
|
+
const child = spawn(process.execPath, [__filename, roomDir, 'run'].concat(forwarded), {
|
|
1033
|
+
detached: true,
|
|
1034
|
+
stdio: 'ignore',
|
|
1035
|
+
});
|
|
1036
|
+
child.unref();
|
|
1037
|
+
|
|
1038
|
+
process.stdout.write('entity extraction started (background)\n');
|
|
1039
|
+
process.stdout.write('status: ' + statusPath(roomDir) + '\n');
|
|
1040
|
+
return 0;
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
function cmdStatus(opts) {
|
|
1044
|
+
const roomDir = opts.roomDir;
|
|
1045
|
+
const sp = statusPath(roomDir);
|
|
1046
|
+
if (fileExists(sp)) {
|
|
1047
|
+
let parsed = null;
|
|
1048
|
+
try { parsed = JSON.parse(fs.readFileSync(sp, 'utf8')); } catch (_e) { parsed = null; }
|
|
1049
|
+
if (parsed) {
|
|
1050
|
+
process.stdout.write(JSON.stringify(parsed) + '\n');
|
|
1051
|
+
return 0;
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
process.stdout.write(JSON.stringify({ state: 'none' }) + '\n');
|
|
1055
|
+
return 0;
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
function cmdReport(opts) {
|
|
1059
|
+
const roomDir = opts.roomDir;
|
|
1060
|
+
const sp = statusPath(roomDir);
|
|
1061
|
+
if (!fileExists(sp)) {
|
|
1062
|
+
printError('no extraction run yet', 'no status.json for this room', 'run entity-extract ROOM_DIR run');
|
|
1063
|
+
return 1;
|
|
1064
|
+
}
|
|
1065
|
+
let parsed = null;
|
|
1066
|
+
try { parsed = JSON.parse(fs.readFileSync(sp, 'utf8')); } catch (_e) { parsed = null; }
|
|
1067
|
+
if (!parsed) {
|
|
1068
|
+
printError('unreadable status', statusPath(roomDir) + ' is not valid JSON', 're-run entity-extract ROOM_DIR run');
|
|
1069
|
+
return 1;
|
|
1070
|
+
}
|
|
1071
|
+
if (parsed.state === 'done') {
|
|
1072
|
+
// Two-tier (quick-task 260714-k44): disclose the per-tier split. The
|
|
1073
|
+
// low-confidence count is printed explicitly when > 0 -- an embedding
|
|
1074
|
+
// best-guess resolution is disclosed, never dressed up as a full resolution.
|
|
1075
|
+
const lowConf = parsed.tier2_low_confidence || 0;
|
|
1076
|
+
const lowConfNote = lowConf > 0 ? ', ' + lowConf + ' low-confidence' : '';
|
|
1077
|
+
process.stdout.write(
|
|
1078
|
+
'entity-extract done: ' + (parsed.entities || 0) + ' entities, ' + (parsed.edges || 0) +
|
|
1079
|
+
' edges from ' + (parsed.artifacts || 0) + ' artifacts (embedded=' + (parsed.embedded ? 'yes' : 'no') + '); ' +
|
|
1080
|
+
'tier-2: ' + (parsed.entities_what || 0) + ' what, ' + (parsed.terms_why || 0) + ' why, ' +
|
|
1081
|
+
(parsed.dropped_noise || 0) + ' noise (classifier=' + (parsed.classifier_source || 'fallback') + '); ' +
|
|
1082
|
+
'routing: ' + (parsed.tier2_embedding || 0) + ' embedding, ' + (parsed.tier2_escalated || 0) +
|
|
1083
|
+
' escalated, ' + (parsed.tier2_model || 0) + ' model' + lowConfNote + '\n'
|
|
1084
|
+
);
|
|
1085
|
+
} else if (parsed.state === 'running') {
|
|
1086
|
+
process.stdout.write('entity-extract running (started ' + (parsed.started_at || '?') + ')\n');
|
|
1087
|
+
} else if (parsed.state === 'failed') {
|
|
1088
|
+
process.stdout.write('entity-extract failed: ' + (parsed.error || 'unknown error') + '\n');
|
|
1089
|
+
} else {
|
|
1090
|
+
process.stdout.write(JSON.stringify(parsed) + '\n');
|
|
1091
|
+
}
|
|
1092
|
+
return 0;
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
// ---------------------------------------------------------------------------
|
|
1096
|
+
// main -- the testable seam. Returns a numeric exit code (async for run).
|
|
1097
|
+
// ---------------------------------------------------------------------------
|
|
1098
|
+
|
|
1099
|
+
async function main(argv) {
|
|
1100
|
+
const opts = parseArgs(argv);
|
|
1101
|
+
|
|
1102
|
+
if (opts.help || !opts.roomDir) {
|
|
1103
|
+
process.stdout.write(USAGE + '\n');
|
|
1104
|
+
return 0;
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
switch (opts.sub) {
|
|
1108
|
+
case 'run': return cmdRun(opts);
|
|
1109
|
+
case 'start': return cmdStart(opts);
|
|
1110
|
+
case 'status': return cmdStatus(opts);
|
|
1111
|
+
case 'report': return cmdReport(opts);
|
|
1112
|
+
case 'help': process.stdout.write(USAGE + '\n'); return 0;
|
|
1113
|
+
default:
|
|
1114
|
+
printError('unknown subcommand', 'no subcommand "' + opts.sub + '"', 'run one of: run | start | status | report | help');
|
|
1115
|
+
return 1;
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
if (require.main === module) {
|
|
1120
|
+
main(process.argv.slice(2)).then(function (code) { process.exit(code); });
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
// runExtraction is exported ADDITIVELY (Phase 219-02) so the D-16 post-filing
|
|
1124
|
+
// hook (and tests) can run a scoped-incremental pass over an explicit
|
|
1125
|
+
// opts.paths allowlist against a caller-owned db handle. Tier-2 (quick-task
|
|
1126
|
+
// 260714-hzx) adds an optional opts.classifyImpl injection seam (same additive-
|
|
1127
|
+
// opts idiom): when present it IS the model surrogate and bypasses the key gate,
|
|
1128
|
+
// so integration tests exercise the WHY reroute / degrade paths fully offline.
|
|
1129
|
+
// main stays the dispatcher seam.
|
|
1130
|
+
// collectArtifacts is exported ADDITIVELY (quick-task 260714-k44) so a read-only
|
|
1131
|
+
// measurement harness can count tier-1 candidates and run tier-2a over a real room
|
|
1132
|
+
// WITHOUT calling runExtraction or opening a write transaction (the K44-REQ-5
|
|
1133
|
+
// key-less call-volume measurement). It takes a caller-owned db handle and never
|
|
1134
|
+
// writes.
|
|
1135
|
+
module.exports = { main: main, runExtraction: runExtraction, collectArtifacts: collectArtifacts };
|