@mindrian_os/install 1.13.0-beta.11
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 +9 -0
- package/CHANGELOG.md +3333 -0
- package/LICENSE +123 -0
- package/README.md +673 -0
- package/agents/brain-query.md +80 -0
- package/agents/framework-runner.md +237 -0
- package/agents/grading.md +188 -0
- package/agents/investor.md +128 -0
- package/agents/larry-extended.md +135 -0
- package/agents/opportunity-scanner.md +91 -0
- package/agents/persona-analyst.md +132 -0
- package/agents/research.md +89 -0
- package/agents/reverse-salient-agent.md +27 -0
- package/bin/cli.js +142 -0
- package/bin/mindrian-mcp-server.cjs +182 -0
- package/bin/mindrian-tools.cjs +765 -0
- package/commands/act.md +439 -0
- package/commands/admin.md +404 -0
- package/commands/analyze-needs.md +42 -0
- package/commands/analyze-systems.md +39 -0
- package/commands/analyze-timing.md +42 -0
- package/commands/auto-explore.md +64 -0
- package/commands/beautiful-question.md +40 -0
- package/commands/brain-derive.md +78 -0
- package/commands/build-knowledge.md +42 -0
- package/commands/build-thesis.md +46 -0
- package/commands/causal.md +234 -0
- package/commands/challenge-assumptions.md +33 -0
- package/commands/compare-ventures.md +83 -0
- package/commands/dashboard.md +110 -0
- package/commands/deep-grade.md +82 -0
- package/commands/diagnose.md +58 -0
- package/commands/diagnostics.md +151 -0
- package/commands/doctor.md +151 -0
- package/commands/dominant-designs.md +40 -0
- package/commands/explain-decision.md +87 -0
- package/commands/explore-domains.md +42 -0
- package/commands/explore-futures.md +40 -0
- package/commands/explore-trends.md +42 -0
- package/commands/export.md +103 -0
- package/commands/file-meeting.md +724 -0
- package/commands/find-analogies.md +188 -0
- package/commands/find-bottlenecks.md +62 -0
- package/commands/find-connections.md +76 -0
- package/commands/funding.md +81 -0
- package/commands/grade.md +203 -0
- package/commands/graph.md +128 -0
- package/commands/hat-briefing.md +125 -0
- package/commands/heal.md +196 -0
- package/commands/help.md +399 -0
- package/commands/hmi-status.md +172 -0
- package/commands/jtbd.md +241 -0
- package/commands/leadership.md +73 -0
- package/commands/lean-canvas.md +40 -0
- package/commands/macro-trends.md +40 -0
- package/commands/map-unknowns.md +40 -0
- package/commands/memory.md +173 -0
- package/commands/models.md +175 -0
- package/commands/mos-reason.md +285 -0
- package/commands/mullins.md +120 -0
- package/commands/new-project.md +481 -0
- package/commands/onboard.md +434 -0
- package/commands/operator.md +149 -0
- package/commands/opportunities.md +144 -0
- package/commands/organize.md +497 -0
- package/commands/persona.md +198 -0
- package/commands/pipeline.md +112 -0
- package/commands/present.md +91 -0
- package/commands/publish.md +201 -0
- package/commands/query.md +124 -0
- package/commands/radar.md +72 -0
- package/commands/reanalyze.md +91 -0
- package/commands/research.md +196 -0
- package/commands/room.md +352 -0
- package/commands/rooms.md +598 -0
- package/commands/root-cause.md +40 -0
- package/commands/rs-experts.md +85 -0
- package/commands/rs-explain.md +100 -0
- package/commands/rs-fetch.md +94 -0
- package/commands/rs-thesis.md +85 -0
- package/commands/scenario-plan.md +40 -0
- package/commands/scheduled-tasks.md +285 -0
- package/commands/score-innovation.md +43 -0
- package/commands/scout.md +239 -0
- package/commands/setup.md +618 -0
- package/commands/snapshot.md +147 -0
- package/commands/speakers.md +84 -0
- package/commands/splash.md +28 -0
- package/commands/status.md +75 -0
- package/commands/structure-argument.md +42 -0
- package/commands/suggest-next.md +80 -0
- package/commands/systems-thinking.md +40 -0
- package/commands/think-hats.md +42 -0
- package/commands/update.md +181 -0
- package/commands/user-needs.md +40 -0
- package/commands/validate.md +40 -0
- package/commands/value-proposition.md +61 -0
- package/commands/vault.md +180 -0
- package/commands/visualize.md +52 -0
- package/commands/whitespace.md +507 -0
- package/commands/wiki.md +69 -0
- package/hooks/hooks.json +381 -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 +1043 -0
- package/lib/agents/reverse-salient-agent.cjs +679 -0
- package/lib/agents/tension-hook-agent.cjs +544 -0
- package/lib/brain/ROOM.md +44 -0
- package/lib/brain/chain-recommender.cjs +301 -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.cjs +287 -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_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/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/brain-client.cjs +865 -0
- package/lib/core/brain-derivation-prompts.cjs +326 -0
- package/lib/core/brain-derivation-queue.cjs +431 -0
- package/lib/core/brain-derivation.cjs +580 -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 +188 -0
- package/lib/core/bridge-writer.cjs +477 -0
- package/lib/core/chat-context-builder.cjs +253 -0
- package/lib/core/cross-room-aggregator.cjs +762 -0
- package/lib/core/daily-briefing.cjs +438 -0
- package/lib/core/decision-capture.cjs +618 -0
- package/lib/core/deep-links.cjs +82 -0
- package/lib/core/dispatch-optimizer.cjs +354 -0
- package/lib/core/dual-path-detector.cjs +84 -0
- package/lib/core/dual-path-detector.test.cjs +334 -0
- package/lib/core/exports-log.cjs +79 -0
- package/lib/core/feynman-minto-invariants.cjs +605 -0
- package/lib/core/folder-memory-async.cjs +338 -0
- package/lib/core/folder-memory-shared.cjs +890 -0
- package/lib/core/folder-memory.cjs +416 -0
- package/lib/core/framework-chain-composer.cjs +411 -0
- package/lib/core/frontmatter-schemas.cjs +330 -0
- package/lib/core/git-ops.cjs +141 -0
- package/lib/core/graph-ops.cjs +258 -0
- package/lib/core/hat-persistence.cjs +362 -0
- package/lib/core/index.cjs +60 -0
- package/lib/core/integration-registry.cjs +232 -0
- package/lib/core/intelligence-cascade.cjs +661 -0
- package/lib/core/lazygraph-ops.cjs +1057 -0
- package/lib/core/lru-cache.cjs +139 -0
- package/lib/core/mcp-profiles.cjs +182 -0
- package/lib/core/meeting-ops.cjs +54 -0
- package/lib/core/memory-ops.cjs +600 -0
- package/lib/core/migrations/ROOM.md +33 -0
- package/lib/core/migrations/phase-109-nodes-provenance.cjs +339 -0
- package/lib/core/migrations/phase-109-session-focus.cjs +99 -0
- package/lib/core/model-profiles.cjs +246 -0
- package/lib/core/mullins-scaffold.cjs +160 -0
- package/lib/core/nav-dial.cjs +316 -0
- package/lib/core/navigation/ROOM.md +15 -0
- package/lib/core/navigation/explanation.cjs +43 -0
- package/lib/core/navigation/focus.cjs +135 -0
- package/lib/core/navigation/ingestion.cjs +82 -0
- package/lib/core/navigation/insights.cjs +350 -0
- package/lib/core/navigation/memory-events.cjs +118 -0
- package/lib/core/navigation/neighborhood.cjs +78 -0
- package/lib/core/navigation/packet.cjs +182 -0
- package/lib/core/navigation/room-home.cjs +127 -0
- package/lib/core/navigation/transitions.cjs +82 -0
- package/lib/core/navigation-engine-shared.cjs +242 -0
- package/lib/core/navigation-engine.cjs +664 -0
- package/lib/core/navigation.cjs +60 -0
- package/lib/core/nl-graph-queries.cjs +164 -0
- package/lib/core/offer-presenter.cjs +406 -0
- package/lib/core/opportunity-extractor.cjs +183 -0
- package/lib/core/opportunity-ops.cjs +1371 -0
- package/lib/core/persona-ops.cjs +537 -0
- package/lib/core/persona-taxonomy.cjs +190 -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/reasoning-ops.cjs +639 -0
- package/lib/core/reverse-salient-persona-suffix.cjs +115 -0
- package/lib/core/room-classifier-strict-mode.cjs +229 -0
- package/lib/core/room-db.cjs +127 -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-type-detector.cjs +386 -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 +343 -0
- package/lib/core/rs-commercial-assessor.cjs +280 -0
- package/lib/core/rs-differential-scorer.cjs +376 -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-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-mind-map.cjs +656 -0
- package/lib/core/rs-neo4j-writer.cjs +388 -0
- package/lib/core/rs-nl-to-query.cjs +425 -0
- package/lib/core/rs-pinecone-bridge.cjs +303 -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 +443 -0
- package/lib/core/rs-thesis-generator.cjs +188 -0
- package/lib/core/rs_cache.py +479 -0
- package/lib/core/rs_corpus.py +468 -0
- package/lib/core/rs_hybrid.py +586 -0
- package/lib/core/rs_math.py +287 -0
- package/lib/core/rs_rooms.py +193 -0
- package/lib/core/scheduled-scanner.cjs +463 -0
- package/lib/core/scratchpad-ops.cjs +201 -0
- package/lib/core/section-8-trace-schema.cjs +138 -0
- package/lib/core/section-registry.cjs +111 -0
- package/lib/core/session-state.cjs +144 -0
- package/lib/core/shallow-doc-parser.cjs +174 -0
- package/lib/core/shallow-doc-parser.test.cjs +226 -0
- package/lib/core/skill-activation-router.cjs +284 -0
- package/lib/core/state-ops.cjs +46 -0
- package/lib/core/statusline-cache.cjs +266 -0
- package/lib/core/token-estimator.cjs +348 -0
- package/lib/core/user-archetype.cjs +239 -0
- package/lib/core/user-md-ops.cjs +524 -0
- package/lib/core/visual-ops.cjs +624 -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 +604 -0
- package/lib/hmi/cross-room-memory.cjs +575 -0
- package/lib/hmi/decoy-tier.cjs +395 -0
- package/lib/hmi/jtbd-classifier.cjs +219 -0
- package/lib/hmi/jtbd-state.cjs +199 -0
- package/lib/hmi/jtbd-taxonomy.json +392 -0
- package/lib/hmi/selector-dispatcher.cjs +546 -0
- package/lib/hmi/selector-telemetry.cjs +263 -0
- package/lib/hmi/shape-f0-renderer.cjs +139 -0
- package/lib/hmi/shape-f1-fallback.cjs +80 -0
- package/lib/hmi/shape-f1-renderer.cjs +138 -0
- package/lib/hmi/shape-f2-renderer.cjs +132 -0
- package/lib/hmi/shape-f3-renderer.cjs +66 -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 +312 -0
- package/lib/hmi/shape-f6-renderer.cjs +144 -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/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/test-fixtures/collision-vault/preexisting-room/STATE.md +8 -0
- package/lib/import/test-fixtures/collision-vault/preexisting-room/problem-definition/onboarding/onboarding.md +7 -0
- package/lib/import/test-fixtures/collision-vault/source/onboarding.md +5 -0
- package/lib/import/test-fixtures/obsidian-vault/.obsidian/workspace.json +1 -0
- package/lib/import/test-fixtures/obsidian-vault/notes/with-wikilinks.md +4 -0
- package/lib/import/test-fixtures/tiny-vault/notes/2026-01-15-team-sync.md +9 -0
- package/lib/import/test-fixtures/tiny-vault/notes/empty.md +3 -0
- package/lib/import/test-fixtures/tiny-vault/notes/onboarding.md +5 -0
- package/lib/import/test-fixtures/tiny-vault/notes/pricing.md +5 -0
- package/lib/import/test-fixtures/tiny-vault/notes/random.md +4 -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/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-router.cjs +418 -0
- package/lib/mcp/capability-registry.cjs +62 -0
- package/lib/mcp/larry-context.cjs +46 -0
- package/lib/mcp/larry-server-instructions.md +114 -0
- package/lib/mcp/pipeline-state.cjs +275 -0
- package/lib/mcp/prompts.cjs +302 -0
- package/lib/mcp/resources.cjs +227 -0
- package/lib/mcp/session-catchup.cjs +327 -0
- package/lib/mcp/surface-detect.cjs +75 -0
- package/lib/mcp/tool-router.cjs +1034 -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/brain-cache-lru.test.cjs +259 -0
- package/lib/memory/brain-client-query-shape.test.cjs +160 -0
- package/lib/memory/brain-derivation-graceful-degradation.test.cjs +1019 -0
- package/lib/memory/brain-derivation-queue.test.cjs +539 -0
- package/lib/memory/brain-derivation.test.cjs +634 -0
- package/lib/memory/brain-derive-command.test.cjs +534 -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/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/cross-room-aggregator.test.cjs +909 -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/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/feynman-minto-guardian.test.cjs +736 -0
- package/lib/memory/feynman-minto-invariants.test.cjs +511 -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/folder-memory-quadruple.test.cjs +548 -0
- package/lib/memory/folder-memory.test.cjs +503 -0
- package/lib/memory/framework-chain-composer.test.cjs +515 -0
- package/lib/memory/frontmatter-schema-validator.test.cjs +290 -0
- package/lib/memory/heal-command.test.cjs +604 -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/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-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 +722 -0
- package/lib/memory/navigation-invariants.test.cjs +483 -0
- package/lib/memory/offer-presenter.test.cjs +554 -0
- package/lib/memory/on-stop-snapshot.test.cjs +404 -0
- package/lib/memory/pending-tension-store.cjs +373 -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/problem-type-router.test.cjs +656 -0
- package/lib/memory/query-efficiency-telemetry.test.cjs +370 -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/room-classifier-strict-mode.test.cjs +417 -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 +1247 -0
- package/lib/memory/security-trifecta.test.cjs +312 -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-minto-banner.test.cjs +373 -0
- package/lib/memory/skill-activation-router.test.cjs +419 -0
- package/lib/memory/stamp-artifact-write.test.cjs +304 -0
- package/lib/memory/statusline-active-room.test.cjs +315 -0
- package/lib/memory/statusline-minto-segment.test.cjs +292 -0
- package/lib/memory/sync-async-entry-points.test.cjs +204 -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 +603 -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 +277 -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 +690 -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/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 +59 -0
- package/lib/render/render-v2.cjs +486 -0
- package/lib/render/render-v2.test.cjs +267 -0
- package/lib/render/render.cjs +65 -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/surface-detect.cjs +85 -0
- package/lib/update-bootstrap.sh.template +145 -0
- package/lib/vault/frontmatter-schema.cjs +297 -0
- package/lib/vault/room-scanner.cjs +352 -0
- package/lib/vault/wikilink-builder.cjs +231 -0
- package/lib/vault/wikilink-builder.test.cjs +182 -0
- package/lib/wiki/graph-links.cjs +281 -0
- package/lib/wiki/page-renderer.cjs +229 -0
- package/lib/wiki/wiki-chat.cjs +81 -0
- package/lib/wiki/wiki-layout.cjs +1459 -0
- package/lib/wiki/wiki-search.cjs +142 -0
- package/lib/wiki/wiki-server.cjs +678 -0
- package/lib/wiki/wiki-watcher.cjs +105 -0
- package/lib/workflow/ROOM.md +47 -0
- package/lib/workflow/command-resolver.cjs +155 -0
- package/lib/workflow/command-resolver.test.cjs +235 -0
- package/package.json +44 -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 +56 -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 +37 -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 +37 -0
- package/references/brain/causal-directives.md +91 -0
- package/references/brain/causal-enrichment.cypher +165 -0
- package/references/brain/command-triggers-schema.md +226 -0
- package/references/brain/graph-architecture.md +317 -0
- package/references/brain/query-patterns.md +460 -0
- package/references/brain/room-hierarchy-schema.md +218 -0
- package/references/brain/schema.md +76 -0
- package/references/capability-radar/capabilities-index.md +241 -0
- package/references/capability-radar/changelog-cache.md +81 -0
- package/references/causal/causal-schema.md +103 -0
- package/references/design/email-template-standard.md +155 -0
- package/references/design/graph-visualization-standard.md +178 -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/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.md +237 -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/index.md +97 -0
- package/references/methodology/leadership.md +200 -0
- package/references/methodology/lean-canvas.md +116 -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/sapphire-encoding.md +355 -0
- package/references/methodology/scenario-plan.md +178 -0
- package/references/methodology/score-innovation.md +154 -0
- package/references/methodology/structure-argument.md +158 -0
- package/references/methodology/systems-thinking.md +159 -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/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/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/symbol-system.md +151 -0
- package/skills/MOSDeckEngine/SKILL.md +325 -0
- package/skills/brain-connector/SKILL.md +114 -0
- package/skills/context-engine/SKILL.md +147 -0
- package/skills/conversation-mode/SKILL.md +102 -0
- package/skills/larry-personality/SKILL.md +219 -0
- package/skills/larry-personality/framework-chains.md +92 -0
- package/skills/larry-personality/mode-engine.md +185 -0
- package/skills/mullins-scaffold/SKILL.md +61 -0
- package/skills/mullins-scaffold/scaffold.json +146 -0
- package/skills/pws-methodology/SKILL.md +49 -0
- package/skills/room-passive/SKILL.md +165 -0
- package/skills/room-proactive/SKILL.md +250 -0
- package/skills/ui-system/SKILL.md +277 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Phase 94-02 -- rs-discovery-engine thesis-merge handoff fence.
|
|
6
|
+
*
|
|
7
|
+
* BSL 1.1. Copyright (c) Mindrian 2026.
|
|
8
|
+
* (Business Source License 1.1; SPDX BUSL-1.1; see LICENSE.)
|
|
9
|
+
*
|
|
10
|
+
* Why this fixture exists.
|
|
11
|
+
*
|
|
12
|
+
* v1.11.0 QA harness (Lawrence's Dr. Miriam Kaplan run, 2026-04-28) hit a
|
|
13
|
+
* P0 ship-blocker in /mos:rs-fetch end-to-end. The producer
|
|
14
|
+
* scripts/rs-discovery-engine.cjs Phase 4 Synthesis loop emits theses[]
|
|
15
|
+
* parallel to breakthroughs[] but never folds them. The consumer
|
|
16
|
+
* lib/core/rs-sqlite-mirror.cjs declares thesis as REQUIRED_FIELDS at
|
|
17
|
+
* line 61. The handoff at lines 429-435 drops thesis on the floor on
|
|
18
|
+
* BOTH the success branch (breakthroughs.length > 0) and the empty-
|
|
19
|
+
* fallback branch (breakthroughs.length === 0).
|
|
20
|
+
*
|
|
21
|
+
* Plan 94-02 deviation note (locked-decision adapt).
|
|
22
|
+
*
|
|
23
|
+
* The plan's locked-decision empty-fallback shape was
|
|
24
|
+
* { summary: '', confidence: 0, evidence_refs: [] }
|
|
25
|
+
* but the consumer validateRequiredFields at lib/core/rs-sqlite-mirror.cjs
|
|
26
|
+
* line 121-130 requires every REQUIRED_FIELD to be a NON-EMPTY STRING
|
|
27
|
+
* (typeof string check + length > 0 check). An object stub fails the
|
|
28
|
+
* typeof check. The producer rs-thesis-generator.generateThesis ALSO
|
|
29
|
+
* returns a string on the success path (line 167-176 in lib/core/rs-
|
|
30
|
+
* thesis-generator.cjs), not the {summary, confidence, evidence_refs}
|
|
31
|
+
* envelope the plan's <interfaces> block claims. The locked-decision
|
|
32
|
+
* shape was speculative; ground truth shows producer + consumer agree
|
|
33
|
+
* on string. We use a sentinel string 'no_thesis' for the empty-fallback
|
|
34
|
+
* branch (the only path that has no real classified pair to thesis-fill).
|
|
35
|
+
*
|
|
36
|
+
* Test map (3 cases, one-to-one with the PLAN <behavior> block).
|
|
37
|
+
*
|
|
38
|
+
* T1 Success path: runDiscovery with mocks producing >=1 classified
|
|
39
|
+
* pair. Stub the writer; assert writerPayload.thesis is defined,
|
|
40
|
+
* is a non-empty string, equals the mocked thesisGenerator return.
|
|
41
|
+
*
|
|
42
|
+
* T2 Empty path: runDiscovery with mocks producing 0 preprocessed
|
|
43
|
+
* items (so classified.length === 0 and breakthroughs.length === 0).
|
|
44
|
+
* Stub the writer; assert writerPayload.thesis === 'no_thesis'
|
|
45
|
+
* and the other REQUIRED_FIELDS are also non-empty strings.
|
|
46
|
+
*
|
|
47
|
+
* T3 E2E tier 0 sqlite write: runDiscovery with mocks for the network
|
|
48
|
+
* phases + REAL thesisGenerator + REAL sqliteMirror against a
|
|
49
|
+
* mkdtempSync room. Assert no throw, no TypeError, sqlite row
|
|
50
|
+
* count > 0 in <room>/.mindrian/room.db nodes table.
|
|
51
|
+
*
|
|
52
|
+
* Plan deviation: the plan's <action> Step 4 prescribed a
|
|
53
|
+
* child_process.execFileSync against the CLI entry. That hits real
|
|
54
|
+
* Tavily / Semantic Scholar / patents fetchers and is environment-
|
|
55
|
+
* dependent (network + rate limits). We exercise the same write
|
|
56
|
+
* path programmatically via runDiscovery() with deterministic
|
|
57
|
+
* upstream mocks; the writer code path under test (sqliteMirror
|
|
58
|
+
* .writeDiscovery + lazygraph.openGraph + INSERT OR REPLACE) is
|
|
59
|
+
* identical. Spirit of the verify (writerPayload reaches sqlite,
|
|
60
|
+
* row gets written, no TypeError) is preserved.
|
|
61
|
+
*
|
|
62
|
+
* Registered in lib/memory/run-feynman-tests.cjs.
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
const assert = require('node:assert/strict');
|
|
66
|
+
const fs = require('node:fs');
|
|
67
|
+
const os = require('node:os');
|
|
68
|
+
const path = require('node:path');
|
|
69
|
+
const { DatabaseSync } = require('node:sqlite');
|
|
70
|
+
|
|
71
|
+
const REPO = path.resolve(__dirname, '..', '..');
|
|
72
|
+
const ENGINE_PATH = path.join(REPO, 'scripts', 'rs-discovery-engine.cjs');
|
|
73
|
+
|
|
74
|
+
// ---------- Fixture helpers ----------
|
|
75
|
+
|
|
76
|
+
const TMP_ROOTS = [];
|
|
77
|
+
function mkTmp(prefix) {
|
|
78
|
+
const d = fs.mkdtempSync(path.join(os.tmpdir(), prefix));
|
|
79
|
+
TMP_ROOTS.push(d);
|
|
80
|
+
return d;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function cleanupTmp() {
|
|
84
|
+
for (const d of TMP_ROOTS) {
|
|
85
|
+
try { fs.rmSync(d, { recursive: true, force: true }); } catch (_e) { /* best effort */ }
|
|
86
|
+
}
|
|
87
|
+
TMP_ROOTS.length = 0;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ---------- Mock factories ----------
|
|
91
|
+
//
|
|
92
|
+
// Keys mirror the applyTestMocks contract in scripts/rs-discovery-engine.cjs
|
|
93
|
+
// (lines 266-284). Any key omitted falls through to the real require().
|
|
94
|
+
// The returned object is passed as opts._test_mocks.
|
|
95
|
+
|
|
96
|
+
function buildSuccessPathMocks(capturedWriterPayload) {
|
|
97
|
+
// Upstream mocks shape one preprocessed item -> one scored -> one
|
|
98
|
+
// classified -> one breakthrough -> one thesis. Mocked thesisGenerator
|
|
99
|
+
// returns a known sentinel string so T1 can assert merge-loop fidelity.
|
|
100
|
+
return {
|
|
101
|
+
chainFeeder: {
|
|
102
|
+
lookupUpstream: async () => ({ state: 'ready' }),
|
|
103
|
+
emitChainMetadata: () => ({ verb: 'Run Methodology', spawn_skill: null }),
|
|
104
|
+
},
|
|
105
|
+
domainAnalyzer: {
|
|
106
|
+
analyzeDomain: async () => ({
|
|
107
|
+
primary_domains: ['quantum'],
|
|
108
|
+
adjacent_domains: ['biomedical'],
|
|
109
|
+
}),
|
|
110
|
+
},
|
|
111
|
+
queryMatrix: {
|
|
112
|
+
generateQueryMatrix: () => ({
|
|
113
|
+
a_intersect_b: ['q1'],
|
|
114
|
+
a_leads_to_b: [],
|
|
115
|
+
b_leads_to_a: [],
|
|
116
|
+
adjacent: [],
|
|
117
|
+
}),
|
|
118
|
+
},
|
|
119
|
+
fetcherAcademic: {
|
|
120
|
+
fetchAcademic: async () => ({ papers: [{ id: 'p1', title: 't1', abstract: 'a1' }] }),
|
|
121
|
+
},
|
|
122
|
+
fetcherPatents: {
|
|
123
|
+
fetchPatents: async () => ({ patents: [] }),
|
|
124
|
+
},
|
|
125
|
+
fetcherIndustry: {
|
|
126
|
+
fetchIndustry: async () => ({ signals: [] }),
|
|
127
|
+
},
|
|
128
|
+
fetcherExperts: {
|
|
129
|
+
// The producer calls fetcherExperts.mapExperts (sync) at line 330.
|
|
130
|
+
mapExperts: () => [],
|
|
131
|
+
},
|
|
132
|
+
preprocessor: {
|
|
133
|
+
preprocess: () => ([{ id: 'p1', title: 't1', abstract: 'a1', source: 'academic' }]),
|
|
134
|
+
},
|
|
135
|
+
differentialScorer: {
|
|
136
|
+
score: async () => ({ novelty_score: 0.7, novelty_breakdown: {} }),
|
|
137
|
+
},
|
|
138
|
+
innovationClassifier: {
|
|
139
|
+
classify: (scoredPair) => ({
|
|
140
|
+
query_concept: scoredPair.query_concept || 'qc',
|
|
141
|
+
doc_concept: scoredPair.doc_concept || 'dc',
|
|
142
|
+
classification: 'structural_transfer',
|
|
143
|
+
bridge_concept: 'bridge1',
|
|
144
|
+
}),
|
|
145
|
+
},
|
|
146
|
+
breakthroughScorer: {
|
|
147
|
+
scoreBreakthrough: (classifiedPair) => ({
|
|
148
|
+
query_concept: classifiedPair.query_concept,
|
|
149
|
+
doc_concept: classifiedPair.doc_concept,
|
|
150
|
+
classification: classifiedPair.classification,
|
|
151
|
+
bridge_concept: classifiedPair.bridge_concept,
|
|
152
|
+
breakthrough: { score: 0.5, dominant_dimension: 'feasibility' },
|
|
153
|
+
}),
|
|
154
|
+
},
|
|
155
|
+
thesisGenerator: {
|
|
156
|
+
generateThesis: () => 'mocked-thesis-string-94-02',
|
|
157
|
+
},
|
|
158
|
+
commercialAssessor: {
|
|
159
|
+
assess: () => ({ score: 0.5 }),
|
|
160
|
+
},
|
|
161
|
+
expertMapper: {
|
|
162
|
+
mapAuthorsToAura: async () => [],
|
|
163
|
+
},
|
|
164
|
+
neo4jWriter: {
|
|
165
|
+
writeDiscovery: async () => { throw new Error('T1 should not reach neo4jWriter (tier0 forced)'); },
|
|
166
|
+
},
|
|
167
|
+
sqliteMirror: {
|
|
168
|
+
writeDiscovery: async (pair) => {
|
|
169
|
+
// Capture the writerPayload exactly as the producer hands it off.
|
|
170
|
+
// Test asserts against this shape.
|
|
171
|
+
capturedWriterPayload.value = pair;
|
|
172
|
+
return {
|
|
173
|
+
wrote_node_count: 1,
|
|
174
|
+
wrote_edge_count: 0,
|
|
175
|
+
rollback_cypher: '',
|
|
176
|
+
aura_op_id: 'op-test',
|
|
177
|
+
schema_version: '1.0',
|
|
178
|
+
};
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
mindMap: {
|
|
182
|
+
renderMindMap: async () => ({ nodes: [], edges: [] }),
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function buildEmptyPathMocks(capturedWriterPayload) {
|
|
188
|
+
// Empty path: preprocess returns []; classified + breakthroughs both
|
|
189
|
+
// empty arrays; runDiscovery falls through to the empty-fallback
|
|
190
|
+
// envelope branch at lines 429-435.
|
|
191
|
+
const m = buildSuccessPathMocks(capturedWriterPayload);
|
|
192
|
+
m.preprocessor = { preprocess: () => ([]) };
|
|
193
|
+
return m;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// ---------- Test cases ----------
|
|
197
|
+
|
|
198
|
+
async function test_1_successPathThesisMerged(rsEngine) {
|
|
199
|
+
const captured = { value: null };
|
|
200
|
+
const mocks = buildSuccessPathMocks(captured);
|
|
201
|
+
|
|
202
|
+
await rsEngine.runDiscovery('test-topic-success', {
|
|
203
|
+
tier: 'tier0',
|
|
204
|
+
room_dir: mkTmp('rs-94-02-t1-'),
|
|
205
|
+
_test_mocks: mocks,
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
assert.ok(captured.value, 't1: writerPayload was passed to sqliteMirror');
|
|
209
|
+
assert.strictEqual(typeof captured.value.thesis, 'string', 't1: thesis is a string');
|
|
210
|
+
assert.ok(captured.value.thesis.length > 0, 't1: thesis is non-empty');
|
|
211
|
+
assert.strictEqual(
|
|
212
|
+
captured.value.thesis,
|
|
213
|
+
'mocked-thesis-string-94-02',
|
|
214
|
+
't1: thesis is the value the producer pushed into theses[i] for this pair'
|
|
215
|
+
);
|
|
216
|
+
// Other REQUIRED_FIELDS still present (defensive; not the bug under test
|
|
217
|
+
// but a regression fence so the merge loop does not strip them).
|
|
218
|
+
assert.strictEqual(typeof captured.value.query_concept, 'string', 't1: query_concept preserved');
|
|
219
|
+
assert.strictEqual(typeof captured.value.doc_concept, 'string', 't1: doc_concept preserved');
|
|
220
|
+
assert.strictEqual(typeof captured.value.classification, 'string', 't1: classification preserved');
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
async function test_2_emptyPathThesisStub(rsEngine) {
|
|
224
|
+
const captured = { value: null };
|
|
225
|
+
const mocks = buildEmptyPathMocks(captured);
|
|
226
|
+
|
|
227
|
+
await rsEngine.runDiscovery('test-topic-empty', {
|
|
228
|
+
tier: 'tier0',
|
|
229
|
+
room_dir: mkTmp('rs-94-02-t2-'),
|
|
230
|
+
_test_mocks: mocks,
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
assert.ok(captured.value, 't2: writerPayload was passed to sqliteMirror in empty branch');
|
|
234
|
+
assert.strictEqual(typeof captured.value.thesis, 'string', 't2: empty-fallback thesis is a string');
|
|
235
|
+
assert.ok(captured.value.thesis.length > 0, 't2: empty-fallback thesis is non-empty (passes validateRequiredFields)');
|
|
236
|
+
assert.strictEqual(
|
|
237
|
+
captured.value.thesis,
|
|
238
|
+
'no_thesis',
|
|
239
|
+
't2: empty-fallback thesis is the sentinel string per 94-02 deviation'
|
|
240
|
+
);
|
|
241
|
+
// Empty-fallback envelope must still carry the other 3 REQUIRED_FIELDS.
|
|
242
|
+
assert.strictEqual(typeof captured.value.query_concept, 'string', 't2: query_concept in empty-fallback');
|
|
243
|
+
assert.ok(captured.value.query_concept.length > 0, 't2: query_concept non-empty');
|
|
244
|
+
assert.strictEqual(captured.value.doc_concept, 'no_results', 't2: doc_concept literal');
|
|
245
|
+
assert.strictEqual(captured.value.classification, 'structural_transfer', 't2: classification literal');
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
async function test_3_e2eTier0RowWritten(rsEngine) {
|
|
249
|
+
// E2E test: REAL sqliteMirror, REAL thesisGenerator. Mocks only the
|
|
250
|
+
// network-dependent upstream phases + neo4jWriter + mindMap so the
|
|
251
|
+
// test is deterministic. The write path under test
|
|
252
|
+
// (sqliteMirror.writeDiscovery -> lazygraph.openGraph -> INSERT OR
|
|
253
|
+
// REPLACE) runs identically to /mos:rs-fetch tier 0 production.
|
|
254
|
+
const roomDir = mkTmp('rs-94-02-t3-');
|
|
255
|
+
|
|
256
|
+
const mocks = buildSuccessPathMocks({ value: null });
|
|
257
|
+
// Real thesisGenerator for deterministic string output.
|
|
258
|
+
delete mocks.thesisGenerator;
|
|
259
|
+
// Real sqliteMirror so the row actually lands in room.db.
|
|
260
|
+
delete mocks.sqliteMirror;
|
|
261
|
+
|
|
262
|
+
// classifiedPair must carry inputs valid for the REAL thesisGenerator:
|
|
263
|
+
// classification in MECHANISM_BY_CLASSIFICATION,
|
|
264
|
+
// query_concept + doc_concept non-empty strings,
|
|
265
|
+
// bridge_concept optional but cleaner if provided.
|
|
266
|
+
// Already satisfied by buildSuccessPathMocks.innovationClassifier.
|
|
267
|
+
|
|
268
|
+
let threw = null;
|
|
269
|
+
try {
|
|
270
|
+
await rsEngine.runDiscovery('test-topic-e2e', {
|
|
271
|
+
tier: 'tier0',
|
|
272
|
+
room_dir: roomDir,
|
|
273
|
+
_test_mocks: mocks,
|
|
274
|
+
});
|
|
275
|
+
} catch (err) {
|
|
276
|
+
threw = err;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
assert.strictEqual(threw, null, 't3: runDiscovery did not throw (no missing-thesis TypeError)');
|
|
280
|
+
|
|
281
|
+
// Verify a row landed in the nodes table (sqliteMirror writes node rows
|
|
282
|
+
// for query_concept, doc_concept, and the discovery-level node).
|
|
283
|
+
const dbPath = path.join(roomDir, '.mindrian', 'room.db');
|
|
284
|
+
assert.ok(fs.existsSync(dbPath), 't3: room.db exists at ' + dbPath);
|
|
285
|
+
|
|
286
|
+
const db = new DatabaseSync(dbPath);
|
|
287
|
+
let nodeCount = 0;
|
|
288
|
+
try {
|
|
289
|
+
const row = db.prepare('SELECT COUNT(*) AS n FROM nodes').get();
|
|
290
|
+
nodeCount = row && typeof row.n === 'number' ? row.n : 0;
|
|
291
|
+
} finally {
|
|
292
|
+
try { db.close(); } catch (_e) { /* best effort */ }
|
|
293
|
+
}
|
|
294
|
+
assert.ok(nodeCount > 0, 't3: at least one node row written (got ' + nodeCount + ')');
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// ---------- Runner ----------
|
|
298
|
+
|
|
299
|
+
async function run() {
|
|
300
|
+
// Sanity: producer file present.
|
|
301
|
+
assert.ok(fs.existsSync(ENGINE_PATH), 'rs-discovery-engine.cjs missing at ' + ENGINE_PATH);
|
|
302
|
+
|
|
303
|
+
// eslint-disable-next-line global-require
|
|
304
|
+
const rsEngine = require(ENGINE_PATH);
|
|
305
|
+
|
|
306
|
+
try {
|
|
307
|
+
await test_1_successPathThesisMerged(rsEngine);
|
|
308
|
+
await test_2_emptyPathThesisStub(rsEngine);
|
|
309
|
+
await test_3_e2eTier0RowWritten(rsEngine);
|
|
310
|
+
} finally {
|
|
311
|
+
cleanupTmp();
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
process.stdout.write('rs-discovery-engine: 3/3 tests passed\n');
|
|
315
|
+
process.exit(0);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
run().catch((e) => {
|
|
319
|
+
process.stderr.write((e && e.stack) || String(e));
|
|
320
|
+
process.stderr.write('\n');
|
|
321
|
+
cleanupTmp();
|
|
322
|
+
process.exit(1);
|
|
323
|
+
});
|