@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,443 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Copyright (c) 2026 Mindrian. BSL 1.1.
|
|
6
|
+
* Phase 89.5 Plan 05 -- end-to-end CLI smoke test for /mos:rs-explain.
|
|
7
|
+
*
|
|
8
|
+
* Tests the bidirectional NL-Graph CLI dispatcher at
|
|
9
|
+
* scripts/rs-explain-command.cjs. The dispatcher chains:
|
|
10
|
+
*
|
|
11
|
+
* user NL -> rs-nl-to-query.translate(nl) -> {cypher, sql, brain_query}
|
|
12
|
+
* -> execute against room.db (SQLite) + Aura (Cypher) + Brain
|
|
13
|
+
* -> aggregate into query_results
|
|
14
|
+
* -> rs-query-to-text.explain(query_results) -> Larry-voiced NL
|
|
15
|
+
*
|
|
16
|
+
* Mock injection pattern: Module._cache shim BEFORE requiring the script.
|
|
17
|
+
* The script lazy-loads its libraries via _lazyLoad() so injecting mocks
|
|
18
|
+
* into require.cache before main() runs guarantees the script consumes
|
|
19
|
+
* the mocks. Production callers never set this; the underscore prefix
|
|
20
|
+
* marks it as private to the test surface.
|
|
21
|
+
*
|
|
22
|
+
* Scenarios (>=4 per plan; 6 total):
|
|
23
|
+
* T1 -- Happy path: NL "Show me reverse salients in my fintech room";
|
|
24
|
+
* room.db SQLite returns 3 rows; explain() renders Larry-voiced
|
|
25
|
+
* NL referencing reverse salients with non-empty content; honors
|
|
26
|
+
* VOICE_TEMPLATES voice rules.
|
|
27
|
+
* T2 -- Mode B Brain offline: NL "What frameworks chain into RS Discovery?";
|
|
28
|
+
* brainClient.isAvailable() returns false; dispatcher gracefully
|
|
29
|
+
* renders fallback explanation; NO throw; non-empty NL.
|
|
30
|
+
* T3 -- Tier 0 Aura offline: NL "Who are experts on quantum computing?";
|
|
31
|
+
* brainClient.isAvailable returns true initially but query throws
|
|
32
|
+
* AuraUnreachableError; dispatcher catches via _cypher_degraded
|
|
33
|
+
* marker; non-empty NL render.
|
|
34
|
+
* T4 -- Canon Part 8 adversarial: NL "What's my governing thought on X?";
|
|
35
|
+
* rs-nl-to-query.translate throws ExternalEgressViolation; dispatcher
|
|
36
|
+
* catches; emits "Query rejected by Canon Part 8 audit:" message;
|
|
37
|
+
* exit code 1.
|
|
38
|
+
* T5 -- BSL 1.1 header check on all 4 command CJS scripts.
|
|
39
|
+
* T6 -- A1 sweep on rendered NL outputs from Tests 1-3; assert ZERO
|
|
40
|
+
* matches against FORBIDDEN_PATTERNS in any captured output.
|
|
41
|
+
*
|
|
42
|
+
* Pure CJS, zero npm deps, node built-ins only (assert + fs + path + child_process).
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
const assert = require('node:assert/strict');
|
|
46
|
+
const fs = require('node:fs');
|
|
47
|
+
const path = require('node:path');
|
|
48
|
+
const { spawnSync } = require('node:child_process');
|
|
49
|
+
|
|
50
|
+
// ---------- Suite bookkeeping ----------
|
|
51
|
+
|
|
52
|
+
let passed = 0;
|
|
53
|
+
let failed = 0;
|
|
54
|
+
const failures = [];
|
|
55
|
+
const tests = [];
|
|
56
|
+
|
|
57
|
+
function record(name, fn) {
|
|
58
|
+
tests.push({ name, fn });
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function runAll() {
|
|
62
|
+
for (const t of tests) {
|
|
63
|
+
try {
|
|
64
|
+
await t.fn();
|
|
65
|
+
passed++;
|
|
66
|
+
process.stdout.write('PASS ' + t.name + '\n');
|
|
67
|
+
} catch (err) {
|
|
68
|
+
failed++;
|
|
69
|
+
failures.push({ name: t.name, message: err && err.message ? err.message : String(err) });
|
|
70
|
+
process.stdout.write('FAIL ' + t.name + ': ' + (err && err.message ? err.message : String(err)) + '\n');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ---------- Reference imports ----------
|
|
76
|
+
|
|
77
|
+
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
78
|
+
const SCRIPT_PATH = path.join(REPO_ROOT, 'scripts', 'rs-explain-command.cjs');
|
|
79
|
+
const COMMAND_SCRIPTS = [
|
|
80
|
+
path.join(REPO_ROOT, 'scripts', 'rs-fetch-command.cjs'),
|
|
81
|
+
path.join(REPO_ROOT, 'scripts', 'rs-thesis-command.cjs'),
|
|
82
|
+
path.join(REPO_ROOT, 'scripts', 'rs-experts-command.cjs'),
|
|
83
|
+
path.join(REPO_ROOT, 'scripts', 'rs-explain-command.cjs'),
|
|
84
|
+
];
|
|
85
|
+
|
|
86
|
+
const { FORBIDDEN_PATTERNS } = require('../core/rs-egress-prompts.cjs');
|
|
87
|
+
|
|
88
|
+
// ---------- Handle-shape sentinels (graph-on-graph P0 cont., 2026-05-11) ----------
|
|
89
|
+
//
|
|
90
|
+
// rs-explain-command.cjs destructures `{ conn, db }` from `openGraph()` and
|
|
91
|
+
// passes `conn` to `queryGraph` / `db` to `closeGraph`. If anyone reverts that
|
|
92
|
+
// destructure back to `const conn = await openGraph(...)` (the pre-fix bug),
|
|
93
|
+
// `conn` becomes the `{ conn, db }` wrapper object and the SQLite query silently
|
|
94
|
+
// fails. These module-local sentinels make T1's openGraph mock hand back
|
|
95
|
+
// distinguishable objects, and the queryGraph/closeGraph mocks assert they
|
|
96
|
+
// received exactly the destructured handles -- so the reversion fails the test.
|
|
97
|
+
const SENTINEL_CONN = { __kind: 'sentinel-conn' };
|
|
98
|
+
const SENTINEL_DB = { __kind: 'sentinel-db' };
|
|
99
|
+
|
|
100
|
+
// ---------- Mock injection helper ----------
|
|
101
|
+
//
|
|
102
|
+
// The dispatcher lazy-loads libraries via require() inside _lazyLoad().
|
|
103
|
+
// Inject mocks into require.cache BEFORE the dispatcher's main() runs
|
|
104
|
+
// so the cached fake modules are returned instead of the real files.
|
|
105
|
+
|
|
106
|
+
function withMockedModules(moduleMap, fn) {
|
|
107
|
+
const NL_TO_QUERY_PATH = path.join(REPO_ROOT, 'lib', 'core', 'rs-nl-to-query.cjs');
|
|
108
|
+
const QUERY_TO_TEXT_PATH = path.join(REPO_ROOT, 'lib', 'core', 'rs-query-to-text.cjs');
|
|
109
|
+
const LAZYGRAPH_PATH = path.join(REPO_ROOT, 'lib', 'core', 'lazygraph-ops.cjs');
|
|
110
|
+
const BRAIN_CLIENT_PATH = path.join(REPO_ROOT, 'lib', 'core', 'brain-client.cjs');
|
|
111
|
+
const SCRIPT_REAL_PATH = path.resolve(SCRIPT_PATH);
|
|
112
|
+
const PATHS = {
|
|
113
|
+
'rs-nl-to-query': NL_TO_QUERY_PATH,
|
|
114
|
+
'rs-query-to-text': QUERY_TO_TEXT_PATH,
|
|
115
|
+
'lazygraph-ops': LAZYGRAPH_PATH,
|
|
116
|
+
'brain-client': BRAIN_CLIENT_PATH,
|
|
117
|
+
};
|
|
118
|
+
// Save original cache entries so we can restore.
|
|
119
|
+
const savedEntries = {};
|
|
120
|
+
for (const key of Object.keys(PATHS)) {
|
|
121
|
+
savedEntries[PATHS[key]] = require.cache[PATHS[key]];
|
|
122
|
+
}
|
|
123
|
+
// Save and clear the script cache so we get a fresh copy.
|
|
124
|
+
const savedScriptCache = require.cache[SCRIPT_REAL_PATH];
|
|
125
|
+
delete require.cache[SCRIPT_REAL_PATH];
|
|
126
|
+
|
|
127
|
+
try {
|
|
128
|
+
// Install mocks in the cache.
|
|
129
|
+
for (const key of Object.keys(moduleMap)) {
|
|
130
|
+
const target = PATHS[key];
|
|
131
|
+
if (!target) throw new Error('Unknown mock key: ' + key);
|
|
132
|
+
require.cache[target] = {
|
|
133
|
+
id: target,
|
|
134
|
+
filename: target,
|
|
135
|
+
loaded: true,
|
|
136
|
+
exports: moduleMap[key],
|
|
137
|
+
children: [],
|
|
138
|
+
paths: [],
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
return fn();
|
|
142
|
+
} finally {
|
|
143
|
+
// Restore originals.
|
|
144
|
+
for (const key of Object.keys(PATHS)) {
|
|
145
|
+
const target = PATHS[key];
|
|
146
|
+
if (savedEntries[target] === undefined) {
|
|
147
|
+
delete require.cache[target];
|
|
148
|
+
} else {
|
|
149
|
+
require.cache[target] = savedEntries[target];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (savedScriptCache === undefined) {
|
|
153
|
+
delete require.cache[SCRIPT_REAL_PATH];
|
|
154
|
+
} else {
|
|
155
|
+
require.cache[SCRIPT_REAL_PATH] = savedScriptCache;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// ---------- Output capture helper ----------
|
|
161
|
+
|
|
162
|
+
function captureCli(argv, mocks) {
|
|
163
|
+
// Capture stdout + stderr + exit code while running main() in-process.
|
|
164
|
+
const realWrite = process.stdout.write.bind(process.stdout);
|
|
165
|
+
const realErrWrite = process.stderr.write.bind(process.stderr);
|
|
166
|
+
const realExit = process.exit.bind(process);
|
|
167
|
+
const realArgv = process.argv;
|
|
168
|
+
|
|
169
|
+
const stdoutBuf = [];
|
|
170
|
+
const stderrBuf = [];
|
|
171
|
+
let exitCode = null;
|
|
172
|
+
process.stdout.write = function (s) { stdoutBuf.push(String(s)); return true; };
|
|
173
|
+
process.stderr.write = function (s) { stderrBuf.push(String(s)); return true; };
|
|
174
|
+
process.exit = function (code) {
|
|
175
|
+
exitCode = code == null ? 0 : code;
|
|
176
|
+
throw new Error('__TEST_EXIT__:' + exitCode);
|
|
177
|
+
};
|
|
178
|
+
process.argv = ['node', SCRIPT_PATH].concat(argv);
|
|
179
|
+
|
|
180
|
+
return withMockedModules(mocks, function () {
|
|
181
|
+
const dispatcher = require(SCRIPT_PATH);
|
|
182
|
+
return dispatcher.main()
|
|
183
|
+
.catch(function (err) {
|
|
184
|
+
if (err && /^__TEST_EXIT__/.test(err.message)) return; // expected
|
|
185
|
+
stderrBuf.push('UNHANDLED:' + (err && err.message ? err.message : String(err)));
|
|
186
|
+
})
|
|
187
|
+
.then(function () {
|
|
188
|
+
process.stdout.write = realWrite;
|
|
189
|
+
process.stderr.write = realErrWrite;
|
|
190
|
+
process.exit = realExit;
|
|
191
|
+
process.argv = realArgv;
|
|
192
|
+
return { stdout: stdoutBuf.join(''), stderr: stderrBuf.join(''), exitCode: exitCode };
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// ---------- Captured outputs for A1 sweep (T6) ----------
|
|
198
|
+
|
|
199
|
+
const capturedOutputs = [];
|
|
200
|
+
|
|
201
|
+
// ---------- T1: Happy path NL -> NL ----------
|
|
202
|
+
|
|
203
|
+
record('T1 happy path NL -> NL via 3-graph triangulation', async function () {
|
|
204
|
+
const nlToQueryMock = {
|
|
205
|
+
translate: function (nl, opts) {
|
|
206
|
+
// Honor SEAM A audit on benign input: return triangulated bundle.
|
|
207
|
+
assert.equal(typeof nl, 'string');
|
|
208
|
+
return {
|
|
209
|
+
cypher: 'MATCH (rs:RSDiscovery {room_slug: $room_slug}) RETURN rs',
|
|
210
|
+
sql: 'SELECT * FROM rs_discoveries WHERE room_slug = ? ORDER BY created_at DESC',
|
|
211
|
+
brain_query: null,
|
|
212
|
+
sql_params: ['fintech'],
|
|
213
|
+
cypher_params: { room_slug: 'fintech' },
|
|
214
|
+
};
|
|
215
|
+
},
|
|
216
|
+
ALLOW_LIST_INTENTS: [],
|
|
217
|
+
ExternalEgressViolation: class extends Error {},
|
|
218
|
+
};
|
|
219
|
+
const queryToTextMock = {
|
|
220
|
+
explain: function (query_results, opts) {
|
|
221
|
+
assert.ok(query_results && Array.isArray(query_results.rows));
|
|
222
|
+
// Render in the rs_discovery voice template style.
|
|
223
|
+
const n = query_results.rows.length;
|
|
224
|
+
return 'Found ' + n + ' reverse salients across 2 domains. The strongest is improved fraud-graph (breakthrough score 8). Filed to opportunity-bank/. Worth Bank Opportunity or Devil\'s Advocate.';
|
|
225
|
+
},
|
|
226
|
+
VOICE_TEMPLATES: {},
|
|
227
|
+
KNOWN_KINDS: ['rs_discovery'],
|
|
228
|
+
};
|
|
229
|
+
const lazygraphOpsMock = {
|
|
230
|
+
openGraph: async function () { return { conn: SENTINEL_CONN, db: SENTINEL_DB }; },
|
|
231
|
+
closeGraph: async function (db) {
|
|
232
|
+
assert.strictEqual(db, SENTINEL_DB, 'closeGraph must receive the destructured db handle');
|
|
233
|
+
},
|
|
234
|
+
queryGraph: async function (conn, sql, params) {
|
|
235
|
+
assert.strictEqual(conn, SENTINEL_CONN, 'queryGraph must receive the destructured conn handle, not the {conn,db} wrapper');
|
|
236
|
+
assert.equal(typeof sql, 'string');
|
|
237
|
+
assert.ok(Array.isArray(params));
|
|
238
|
+
return [
|
|
239
|
+
{ id: 'rs_001', thesis: 'fraud-graph mapping', breakthrough_score: 8, rs_type: 'structural_transfer' },
|
|
240
|
+
{ id: 'rs_002', thesis: 'KYC pattern transfer', breakthrough_score: 7, rs_type: 'semantic_implementation' },
|
|
241
|
+
{ id: 'rs_003', thesis: 'compliance signal', breakthrough_score: 6, rs_type: 'hybrid' },
|
|
242
|
+
];
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
const brainClientMock = {
|
|
246
|
+
isAvailable: function () { return false; },
|
|
247
|
+
query: async function () { throw new Error('should not be called when brain_query null'); },
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
const result = await captureCli(['Show me reverse salients in my fintech room'], {
|
|
251
|
+
'rs-nl-to-query': nlToQueryMock,
|
|
252
|
+
'rs-query-to-text': queryToTextMock,
|
|
253
|
+
'lazygraph-ops': lazygraphOpsMock,
|
|
254
|
+
'brain-client': brainClientMock,
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
assert.equal(result.exitCode, 0, 'expected exit 0; got ' + result.exitCode + ' stderr=' + result.stderr);
|
|
258
|
+
assert.ok(result.stdout.length > 0, 'stdout must be non-empty');
|
|
259
|
+
assert.ok(/reverse salients/i.test(result.stdout), 'output must mention "reverse salients"');
|
|
260
|
+
assert.ok(/Bank Opportunity/.test(result.stdout), 'output must include Canon Part 3 verb');
|
|
261
|
+
|
|
262
|
+
capturedOutputs.push(result.stdout);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
// ---------- T2: Mode B Brain offline graceful ----------
|
|
266
|
+
|
|
267
|
+
record('T2 Mode B Brain offline graceful (no throw, non-empty NL)', async function () {
|
|
268
|
+
const nlToQueryMock = {
|
|
269
|
+
translate: function (nl) {
|
|
270
|
+
return {
|
|
271
|
+
cypher: null,
|
|
272
|
+
sql: null,
|
|
273
|
+
brain_query: {
|
|
274
|
+
cypher: 'MATCH (m:Methodology {id: $target_framework})-[:FEEDS_INTO]-(t) RETURN t.name AS name LIMIT 10',
|
|
275
|
+
params: { target_framework: 'reverse_salient_engine' },
|
|
276
|
+
intent_id: 'feeds_into_query',
|
|
277
|
+
},
|
|
278
|
+
sql_params: null,
|
|
279
|
+
cypher_params: null,
|
|
280
|
+
};
|
|
281
|
+
},
|
|
282
|
+
ALLOW_LIST_INTENTS: [],
|
|
283
|
+
ExternalEgressViolation: class extends Error {},
|
|
284
|
+
};
|
|
285
|
+
const queryToTextMock = {
|
|
286
|
+
explain: function (query_results) {
|
|
287
|
+
// Mode B: brain_degraded marker present; explainer should still render coherent fallback.
|
|
288
|
+
assert.equal(query_results._brain_degraded, 'brain_unreachable', 'Mode B marker expected');
|
|
289
|
+
return 'Triangulated across room.db + Aura + Brain. Brain offline; methodology chain not available locally. Worth reframing? Run Methodology /mos:beautiful-question.';
|
|
290
|
+
},
|
|
291
|
+
VOICE_TEMPLATES: {},
|
|
292
|
+
KNOWN_KINDS: ['fallback'],
|
|
293
|
+
};
|
|
294
|
+
const lazygraphOpsMock = {
|
|
295
|
+
openGraph: async function () { return {}; },
|
|
296
|
+
closeGraph: async function () {},
|
|
297
|
+
queryGraph: async function () { return []; },
|
|
298
|
+
};
|
|
299
|
+
const brainClientMock = {
|
|
300
|
+
isAvailable: function () { return false; }, // Mode B
|
|
301
|
+
query: async function () { throw new Error('Brain unreachable'); },
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
const result = await captureCli(['What frameworks chain into RS Discovery?'], {
|
|
305
|
+
'rs-nl-to-query': nlToQueryMock,
|
|
306
|
+
'rs-query-to-text': queryToTextMock,
|
|
307
|
+
'lazygraph-ops': lazygraphOpsMock,
|
|
308
|
+
'brain-client': brainClientMock,
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
assert.equal(result.exitCode, 0, 'Mode B graceful must NOT exit non-zero; got ' + result.exitCode + ' stderr=' + result.stderr);
|
|
312
|
+
assert.ok(result.stdout.length > 0, 'Mode B output must be non-empty');
|
|
313
|
+
assert.ok(/Brain offline|Brain unreachable|reformulate|Reformulate/i.test(result.stdout), 'Mode B should reference offline state OR reformulate');
|
|
314
|
+
capturedOutputs.push(result.stdout);
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
// ---------- T3: Tier 0 Aura offline graceful ----------
|
|
318
|
+
|
|
319
|
+
record('T3 Tier 0 Aura offline graceful (AuraUnreachableError caught)', async function () {
|
|
320
|
+
const nlToQueryMock = {
|
|
321
|
+
translate: function () {
|
|
322
|
+
return {
|
|
323
|
+
cypher: 'MATCH (a:Author)-[:AUTHORED_BY]->(p:Paper) WHERE p.topic = $topic RETURN a',
|
|
324
|
+
sql: null,
|
|
325
|
+
brain_query: null,
|
|
326
|
+
sql_params: null,
|
|
327
|
+
cypher_params: { topic: 'quantum computing' },
|
|
328
|
+
};
|
|
329
|
+
},
|
|
330
|
+
ALLOW_LIST_INTENTS: [],
|
|
331
|
+
ExternalEgressViolation: class extends Error {},
|
|
332
|
+
};
|
|
333
|
+
const queryToTextMock = {
|
|
334
|
+
explain: function (query_results) {
|
|
335
|
+
// Tier 0: cypher_degraded marker present.
|
|
336
|
+
assert.equal(query_results._cypher_degraded, 'aura_unreachable');
|
|
337
|
+
return 'Mapped 0 experts (Aura offline). Run /mos:rs-fetch first to populate the local mirror. Tier 0 explanation only.';
|
|
338
|
+
},
|
|
339
|
+
VOICE_TEMPLATES: {},
|
|
340
|
+
KNOWN_KINDS: ['expert_network'],
|
|
341
|
+
};
|
|
342
|
+
const lazygraphOpsMock = {
|
|
343
|
+
openGraph: async function () { return {}; },
|
|
344
|
+
closeGraph: async function () {},
|
|
345
|
+
queryGraph: async function () { return []; },
|
|
346
|
+
};
|
|
347
|
+
// Aura available on isAvailable, but query throws AuraUnreachableError.
|
|
348
|
+
class AuraUnreachableError extends Error {
|
|
349
|
+
constructor(msg) { super(msg); this.name = 'AuraUnreachableError'; }
|
|
350
|
+
}
|
|
351
|
+
const brainClientMock = {
|
|
352
|
+
isAvailable: function () { return true; },
|
|
353
|
+
query: async function () { throw new AuraUnreachableError('aura down'); },
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
const result = await captureCli(['Who are experts on quantum computing?'], {
|
|
357
|
+
'rs-nl-to-query': nlToQueryMock,
|
|
358
|
+
'rs-query-to-text': queryToTextMock,
|
|
359
|
+
'lazygraph-ops': lazygraphOpsMock,
|
|
360
|
+
'brain-client': brainClientMock,
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
assert.equal(result.exitCode, 0, 'Tier 0 fallback must NOT exit non-zero; got ' + result.exitCode + ' stderr=' + result.stderr);
|
|
364
|
+
assert.ok(result.stdout.length > 0, 'Tier 0 output must be non-empty');
|
|
365
|
+
assert.ok(/Aura offline|Tier 0|rs-fetch/i.test(result.stdout), 'Tier 0 should reference offline state');
|
|
366
|
+
capturedOutputs.push(result.stdout);
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
// ---------- T4: Canon Part 8 adversarial ----------
|
|
370
|
+
|
|
371
|
+
record('T4 Canon Part 8 adversarial (ExternalEgressViolation -> exit 1)', async function () {
|
|
372
|
+
class ExternalEgressViolation extends Error {
|
|
373
|
+
constructor(msg, meta) { super(msg); this.name = 'ExternalEgressViolation'; this.meta = meta || {}; }
|
|
374
|
+
}
|
|
375
|
+
const nlToQueryMock = {
|
|
376
|
+
translate: function () {
|
|
377
|
+
throw new ExternalEgressViolation('forbidden field detected', { surface: 'rs-nl-to-query-input', matched_pattern: 'governing_thought' });
|
|
378
|
+
},
|
|
379
|
+
ALLOW_LIST_INTENTS: [],
|
|
380
|
+
ExternalEgressViolation: ExternalEgressViolation,
|
|
381
|
+
};
|
|
382
|
+
const queryToTextMock = {
|
|
383
|
+
explain: function () { throw new Error('should not be reached'); },
|
|
384
|
+
VOICE_TEMPLATES: {},
|
|
385
|
+
KNOWN_KINDS: [],
|
|
386
|
+
};
|
|
387
|
+
const lazygraphOpsMock = {
|
|
388
|
+
openGraph: async function () { return {}; },
|
|
389
|
+
closeGraph: async function () {},
|
|
390
|
+
queryGraph: async function () { return []; },
|
|
391
|
+
};
|
|
392
|
+
const brainClientMock = {
|
|
393
|
+
isAvailable: function () { return true; },
|
|
394
|
+
query: async function () { throw new Error('should not be reached'); },
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
const result = await captureCli(['What is my governing thought on X?'], {
|
|
398
|
+
'rs-nl-to-query': nlToQueryMock,
|
|
399
|
+
'rs-query-to-text': queryToTextMock,
|
|
400
|
+
'lazygraph-ops': lazygraphOpsMock,
|
|
401
|
+
'brain-client': brainClientMock,
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
assert.equal(result.exitCode, 1, 'Canon Part 8 violation must exit 1; got ' + result.exitCode);
|
|
405
|
+
assert.ok(/Canon Part 8 audit/i.test(result.stderr), 'stderr must mention Canon Part 8 audit; got: ' + result.stderr);
|
|
406
|
+
assert.ok(/rs-nl-to-query-input|surface/i.test(result.stderr), 'stderr should reference the surface tag');
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
// ---------- T5: BSL 1.1 header check on all 4 command CJS scripts ----------
|
|
410
|
+
|
|
411
|
+
record('T5 BSL 1.1 headers on all 4 command CJS scripts', async function () {
|
|
412
|
+
for (const f of COMMAND_SCRIPTS) {
|
|
413
|
+
assert.ok(fs.existsSync(f), 'script must exist: ' + f);
|
|
414
|
+
const src = fs.readFileSync(f, 'utf8');
|
|
415
|
+
assert.ok(/BSL 1\.1/.test(src) || /BSL-1\.1/.test(src) || /BUSL/.test(src), 'BSL 1.1 header missing in ' + f);
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
// ---------- T6: A1 sweep on rendered NL outputs ----------
|
|
420
|
+
|
|
421
|
+
record('T6 A1 sweep on rendered NL outputs (zero FORBIDDEN_PATTERNS)', async function () {
|
|
422
|
+
assert.ok(capturedOutputs.length >= 3, 'expected captures from T1-T3; got ' + capturedOutputs.length);
|
|
423
|
+
for (let i = 0; i < capturedOutputs.length; i += 1) {
|
|
424
|
+
const out = capturedOutputs[i];
|
|
425
|
+
for (const re of FORBIDDEN_PATTERNS) {
|
|
426
|
+
const m = out.match(re);
|
|
427
|
+
assert.equal(m, null, 'capture ' + i + ' triggered FORBIDDEN_PATTERN ' + String(re) + ' on: ' + (m ? m[0] : 'n/a'));
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
// ---------- Run all ----------
|
|
433
|
+
|
|
434
|
+
(async function () {
|
|
435
|
+
await runAll();
|
|
436
|
+
process.stdout.write('\n=== 89.5-05 rs-explain-command suite: ' + passed + '/' + tests.length + ' passed ===\n');
|
|
437
|
+
if (failed > 0) {
|
|
438
|
+
process.stdout.write('Failures:\n');
|
|
439
|
+
for (const f of failures) process.stdout.write(' - ' + f.name + ': ' + f.message + '\n');
|
|
440
|
+
process.exit(1);
|
|
441
|
+
}
|
|
442
|
+
process.exit(0);
|
|
443
|
+
})();
|