@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,529 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Copyright (c) 2026 Mindrian. BSL 1.1.
|
|
6
|
+
* Phase 89.1 Plan 01 -- brain-client shape adapter fixture suite.
|
|
7
|
+
*
|
|
8
|
+
* Resolves the deferred item from 89.1a (deferred-items.md item 1):
|
|
9
|
+
* brain-client.search returns {result:{hits:[]}} on the live MCP wire,
|
|
10
|
+
* but pullFromBrain expected {matches:[]}. Plan 01 introduces an
|
|
11
|
+
* adaptBrainSearchResponse pure function inside rs-brain-substrate.cjs
|
|
12
|
+
* that translates the live shape into the legacy match[] shape (with
|
|
13
|
+
* score-bearing entries since Pinecone searchRecords does not return
|
|
14
|
+
* embedding vectors today; see mcp-server-brain/lib/pinecone-tools.cjs
|
|
15
|
+
* line 47).
|
|
16
|
+
*
|
|
17
|
+
* Suite scope:
|
|
18
|
+
* Tests 1-9 (Task 1): shape adapter inside pullFromBrain. Mocks
|
|
19
|
+
* brain-client.search via require.cache to
|
|
20
|
+
* return the LIVE shape; asserts pullFromBrain
|
|
21
|
+
* emits {ok:true, matches:[{id, score, metadata}]}
|
|
22
|
+
* with framework -> framework_name rename.
|
|
23
|
+
* Tests 10-14 (Task 2): validator Check E embedding-or-score
|
|
24
|
+
* relaxation. Plants caches with score-only,
|
|
25
|
+
* score-out-of-range, neither, embedding-only,
|
|
26
|
+
* and forbidden-regex-laden metadata; asserts
|
|
27
|
+
* the validator emits the expected severity +
|
|
28
|
+
* violation category.
|
|
29
|
+
*
|
|
30
|
+
* Mocks brain-client via require.cache override (89.1a-03 pattern,
|
|
31
|
+
* resetRequireCache after each scenario). Each test calls runShape
|
|
32
|
+
* with (scenarioName, mockSearchReturns, expectedAssertion).
|
|
33
|
+
*
|
|
34
|
+
* Pure CJS, zero npm deps, node built-ins only.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
const assert = require('node:assert/strict');
|
|
38
|
+
const fs = require('node:fs');
|
|
39
|
+
const os = require('node:os');
|
|
40
|
+
const path = require('node:path');
|
|
41
|
+
|
|
42
|
+
// ---------- Tmpdir cleanup ----------
|
|
43
|
+
|
|
44
|
+
const ALL_TMP_ROOTS = [];
|
|
45
|
+
process.on('exit', function () {
|
|
46
|
+
for (const d of ALL_TMP_ROOTS) {
|
|
47
|
+
try { fs.rmSync(d, { recursive: true, force: true }); } catch (_e) { /* best effort */ }
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// ---------- Brain-client mock helpers (89.1a-03 pattern, byte-identical) ----------
|
|
52
|
+
|
|
53
|
+
function installMockBrainClient(opts) {
|
|
54
|
+
opts = opts || {};
|
|
55
|
+
const audit = {
|
|
56
|
+
isAvailable_calls: 0,
|
|
57
|
+
query_calls: [],
|
|
58
|
+
search_calls: [],
|
|
59
|
+
smartSearch_calls: [],
|
|
60
|
+
};
|
|
61
|
+
const brainClientPath = require.resolve('../core/brain-client.cjs');
|
|
62
|
+
const realClient = require('../core/brain-client.cjs');
|
|
63
|
+
const fakeExports = {
|
|
64
|
+
isAvailable: function () {
|
|
65
|
+
audit.isAvailable_calls += 1;
|
|
66
|
+
if (typeof opts.isAvailable === 'function') return opts.isAvailable(audit.isAvailable_calls);
|
|
67
|
+
return opts.isAvailable === undefined ? true : !!opts.isAvailable;
|
|
68
|
+
},
|
|
69
|
+
query: async function (cypher) {
|
|
70
|
+
audit.query_calls.push({ cypher: cypher });
|
|
71
|
+
if (typeof opts.query === 'function') return opts.query(cypher);
|
|
72
|
+
return { records: [] };
|
|
73
|
+
},
|
|
74
|
+
search: async function (q, o) {
|
|
75
|
+
audit.search_calls.push({ query: q, options: o });
|
|
76
|
+
if (typeof opts.search === 'function') return opts.search(q, o);
|
|
77
|
+
return { result: { hits: [] } };
|
|
78
|
+
},
|
|
79
|
+
smartSearch: async function (q, o) {
|
|
80
|
+
audit.smartSearch_calls.push({ query: q, options: o });
|
|
81
|
+
return null;
|
|
82
|
+
},
|
|
83
|
+
_test: realClient._test,
|
|
84
|
+
};
|
|
85
|
+
require.cache[brainClientPath] = {
|
|
86
|
+
id: brainClientPath,
|
|
87
|
+
filename: brainClientPath,
|
|
88
|
+
loaded: true,
|
|
89
|
+
exports: fakeExports,
|
|
90
|
+
};
|
|
91
|
+
return audit;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function resetRequireCache() {
|
|
95
|
+
const targets = [
|
|
96
|
+
'../core/brain-client.cjs',
|
|
97
|
+
'../core/rs-brain-substrate.cjs',
|
|
98
|
+
'../core/rs-brain-substrate-prompts.cjs',
|
|
99
|
+
'../core/cross-room-aggregator.cjs',
|
|
100
|
+
'./validators/brain-substrate-invariants.cjs',
|
|
101
|
+
];
|
|
102
|
+
for (const t of targets) {
|
|
103
|
+
try {
|
|
104
|
+
const p = require.resolve(t);
|
|
105
|
+
delete require.cache[p];
|
|
106
|
+
} catch (_e) { /* best effort */ }
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// ---------- Scenario bookkeeping ----------
|
|
111
|
+
|
|
112
|
+
let passed = 0;
|
|
113
|
+
let failed = 0;
|
|
114
|
+
const failures = [];
|
|
115
|
+
|
|
116
|
+
async function runScenario(name, fn) {
|
|
117
|
+
const start = Date.now();
|
|
118
|
+
try {
|
|
119
|
+
await fn();
|
|
120
|
+
passed += 1;
|
|
121
|
+
process.stdout.write(' ok ' + name + ' (' + (Date.now() - start) + 'ms)\n');
|
|
122
|
+
} catch (err) {
|
|
123
|
+
failed += 1;
|
|
124
|
+
failures.push({ name: name, err: err });
|
|
125
|
+
process.stderr.write(' FAIL ' + name + '\n');
|
|
126
|
+
process.stderr.write(' ' + (err && err.stack ? err.stack : err) + '\n');
|
|
127
|
+
} finally {
|
|
128
|
+
resetRequireCache();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function makeRoomDir(label) {
|
|
133
|
+
const d = fs.mkdtempSync(path.join(os.tmpdir(), 'rs01-' + label + '-'));
|
|
134
|
+
ALL_TMP_ROOTS.push(d);
|
|
135
|
+
return d;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function plantCache(roomDir, payload) {
|
|
139
|
+
fs.mkdirSync(path.join(roomDir, '.mindrian'), { recursive: true });
|
|
140
|
+
const cp = path.join(roomDir, '.mindrian', 'brain-substrate-cache.json');
|
|
141
|
+
fs.writeFileSync(cp, JSON.stringify(payload));
|
|
142
|
+
return cp;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// ---------- Main ----------
|
|
146
|
+
|
|
147
|
+
async function main() {
|
|
148
|
+
process.stdout.write('\n=== Phase 89.1 Plan 01: brain-client shape adapter fixture suite ===\n\n');
|
|
149
|
+
|
|
150
|
+
// ============================================================
|
|
151
|
+
// Task 1 Tests 1-9: shape adapter inside pullFromBrain
|
|
152
|
+
// ============================================================
|
|
153
|
+
|
|
154
|
+
await runScenario("Test 1: live shape {result:{hits:[]}} translates to {ok:true, matches:[{id,score,metadata}]}", async () => {
|
|
155
|
+
const audit = installMockBrainClient({
|
|
156
|
+
isAvailable: true,
|
|
157
|
+
search: async () => ({
|
|
158
|
+
result: {
|
|
159
|
+
hits: [{
|
|
160
|
+
_id: 'mindrian-knowledge_t2-trending-absurd_2cddc6ac2cf58ea0',
|
|
161
|
+
_score: 0.8089869022369385,
|
|
162
|
+
fields: {
|
|
163
|
+
framework: 'reverse-salient',
|
|
164
|
+
title: 'Reverse Salient',
|
|
165
|
+
content_hash: 'abc123',
|
|
166
|
+
text: 'Reverse salient is a Hughes 1983 framework concept',
|
|
167
|
+
tier: 'core',
|
|
168
|
+
source_file: 'frameworks/rs.md',
|
|
169
|
+
},
|
|
170
|
+
}],
|
|
171
|
+
},
|
|
172
|
+
usage: { read_units: 5 },
|
|
173
|
+
}),
|
|
174
|
+
});
|
|
175
|
+
const roomDir = makeRoomDir('t01');
|
|
176
|
+
const m = require('../core/rs-brain-substrate.cjs');
|
|
177
|
+
const result = await m._test.pullFromBrain(roomDir, { namespace: 'tools', limit: 5 });
|
|
178
|
+
assert.equal(result.ok, true, 'Expected ok:true on live shape, got: ' + JSON.stringify(result));
|
|
179
|
+
assert.ok(Array.isArray(result.matches), 'Expected matches array');
|
|
180
|
+
assert.equal(result.matches.length, 1, 'Expected exactly 1 match');
|
|
181
|
+
const m0 = result.matches[0];
|
|
182
|
+
assert.equal(m0.id, 'mindrian-knowledge_t2-trending-absurd_2cddc6ac2cf58ea0',
|
|
183
|
+
'id should map from hit._id, got: ' + m0.id);
|
|
184
|
+
assert.ok(typeof m0.score === 'number' && m0.score > 0.8 && m0.score < 0.81,
|
|
185
|
+
'score should map from hit._score, got: ' + m0.score);
|
|
186
|
+
assert.ok(m0.metadata && typeof m0.metadata === 'object', 'metadata must be object');
|
|
187
|
+
assert.equal(m0.metadata.framework_name, 'reverse-salient',
|
|
188
|
+
'fields.framework should rename to metadata.framework_name, got: ' + m0.metadata.framework_name);
|
|
189
|
+
assert.equal(m0.metadata.title, 'Reverse Salient',
|
|
190
|
+
'fields.title should pass through, got: ' + m0.metadata.title);
|
|
191
|
+
assert.equal(m0.metadata.tier, 'core', 'fields.tier should pass through');
|
|
192
|
+
assert.equal(audit.search_calls.length, 1, 'Exactly one outbound search expected');
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
await runScenario("Test 2: empty hits array returns {ok:true, matches:[]} (NOT malformed_response)", async () => {
|
|
196
|
+
installMockBrainClient({
|
|
197
|
+
isAvailable: true,
|
|
198
|
+
search: async () => ({ result: { hits: [] }, usage: {} }),
|
|
199
|
+
});
|
|
200
|
+
const roomDir = makeRoomDir('t02');
|
|
201
|
+
const m = require('../core/rs-brain-substrate.cjs');
|
|
202
|
+
const result = await m._test.pullFromBrain(roomDir, { namespace: 'tools' });
|
|
203
|
+
assert.equal(result.ok, true,
|
|
204
|
+
'Empty hits is a valid response (not malformed). Got: ' + JSON.stringify(result));
|
|
205
|
+
assert.ok(Array.isArray(result.matches), 'Expected matches[] array');
|
|
206
|
+
assert.equal(result.matches.length, 0, 'Expected zero matches on empty hits');
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
await runScenario("Test 3: legacy shape {matches:[{id,values,metadata}]} STILL works (back-compat)", async () => {
|
|
210
|
+
installMockBrainClient({
|
|
211
|
+
isAvailable: true,
|
|
212
|
+
search: async () => ({
|
|
213
|
+
matches: [{
|
|
214
|
+
id: 'six_thinking_hats',
|
|
215
|
+
values: new Array(1024).fill(0.5),
|
|
216
|
+
metadata: {
|
|
217
|
+
framework_name: 'Six Thinking Hats',
|
|
218
|
+
phase_id: 'phase_2',
|
|
219
|
+
problem_type: 'idp',
|
|
220
|
+
domain: 'innovation',
|
|
221
|
+
},
|
|
222
|
+
}],
|
|
223
|
+
}),
|
|
224
|
+
});
|
|
225
|
+
const roomDir = makeRoomDir('t03');
|
|
226
|
+
const m = require('../core/rs-brain-substrate.cjs');
|
|
227
|
+
const result = await m._test.pullFromBrain(roomDir, { namespace: 'tools' });
|
|
228
|
+
assert.equal(result.ok, true, 'Legacy shape must still pass through');
|
|
229
|
+
assert.equal(result.matches.length, 1, 'Expected 1 match');
|
|
230
|
+
assert.equal(result.matches[0].id, 'six_thinking_hats',
|
|
231
|
+
'89.1a-03 fixture id preserved');
|
|
232
|
+
// Legacy mock entries carry values not score; either property is acceptable
|
|
233
|
+
// post-adapter as long as the entry round-trips (back-compat for 89.1a-03).
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
await runScenario("Test 4: missing result key returns {ok:false, reason:'malformed_response'}", async () => {
|
|
237
|
+
installMockBrainClient({
|
|
238
|
+
isAvailable: true,
|
|
239
|
+
search: async () => ({ unexpected: 'shape' }),
|
|
240
|
+
});
|
|
241
|
+
const roomDir = makeRoomDir('t04');
|
|
242
|
+
const m = require('../core/rs-brain-substrate.cjs');
|
|
243
|
+
const result = await m._test.pullFromBrain(roomDir, { namespace: 'tools' });
|
|
244
|
+
assert.equal(result.ok, false, 'Unknown shape must return ok:false');
|
|
245
|
+
assert.equal(result.reason, 'malformed_response',
|
|
246
|
+
'Expected reason malformed_response, got: ' + result.reason);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
await runScenario("Test 5: hit missing fields returns metadata:{} (defensive map; never throws)", async () => {
|
|
250
|
+
installMockBrainClient({
|
|
251
|
+
isAvailable: true,
|
|
252
|
+
search: async () => ({
|
|
253
|
+
result: {
|
|
254
|
+
hits: [{ _id: 'sparse-hit', _score: 0.5 }], // no fields
|
|
255
|
+
},
|
|
256
|
+
}),
|
|
257
|
+
});
|
|
258
|
+
const roomDir = makeRoomDir('t05');
|
|
259
|
+
const m = require('../core/rs-brain-substrate.cjs');
|
|
260
|
+
const result = await m._test.pullFromBrain(roomDir, { namespace: 'tools' });
|
|
261
|
+
assert.equal(result.ok, true, 'Sparse hit should still translate cleanly');
|
|
262
|
+
assert.equal(result.matches.length, 1, 'Expected 1 match');
|
|
263
|
+
assert.equal(result.matches[0].id, 'sparse-hit', 'id mapped from _id');
|
|
264
|
+
assert.equal(result.matches[0].score, 0.5, 'score mapped from _score');
|
|
265
|
+
assert.deepEqual(result.matches[0].metadata, {},
|
|
266
|
+
'Missing fields should default to empty metadata, got: ' + JSON.stringify(result.matches[0].metadata));
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
await runScenario("Test 6: loadSubstrate happy-path with live shape returns Mode A3 + cache lands", async () => {
|
|
270
|
+
installMockBrainClient({
|
|
271
|
+
isAvailable: true,
|
|
272
|
+
search: async () => ({
|
|
273
|
+
result: {
|
|
274
|
+
hits: [{
|
|
275
|
+
_id: 'mindrian-knowledge_jtbd_xyz',
|
|
276
|
+
_score: 0.92,
|
|
277
|
+
fields: {
|
|
278
|
+
framework: 'jtbd',
|
|
279
|
+
title: 'Jobs To Be Done',
|
|
280
|
+
tier: 'core',
|
|
281
|
+
},
|
|
282
|
+
}],
|
|
283
|
+
},
|
|
284
|
+
}),
|
|
285
|
+
});
|
|
286
|
+
const roomDir = makeRoomDir('t06');
|
|
287
|
+
const m = require('../core/rs-brain-substrate.cjs');
|
|
288
|
+
const result = await m.loadSubstrate({ roomDir: roomDir });
|
|
289
|
+
assert.equal(result.success, true, 'success must be true');
|
|
290
|
+
assert.equal(result.mode, 'A3',
|
|
291
|
+
'Expected Mode A3 on missing-cache + Brain-up + live-shape, got: ' + result.mode);
|
|
292
|
+
assert.ok(Array.isArray(result.substrate) && result.substrate.length === 1,
|
|
293
|
+
'A3 substrate length 1');
|
|
294
|
+
assert.equal(result.substrate[0].id, 'mindrian-knowledge_jtbd_xyz',
|
|
295
|
+
'substrate entry id mapped from _id');
|
|
296
|
+
assert.equal(result.substrate[0].score, 0.92, 'score preserved on substrate entry');
|
|
297
|
+
// Cache must land
|
|
298
|
+
const cp = path.join(roomDir, '.mindrian', 'brain-substrate-cache.json');
|
|
299
|
+
assert.ok(fs.existsSync(cp), 'A3 must write cache atomically at ' + cp);
|
|
300
|
+
const cached = JSON.parse(fs.readFileSync(cp, 'utf8'));
|
|
301
|
+
assert.ok(typeof cached.embedding_count === 'number' && cached.embedding_count > 0,
|
|
302
|
+
'cache embedding_count > 0, got: ' + cached.embedding_count);
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
await runScenario("Test 7: Canon Part 8 audit log records outcome:pass with handles array (chokepoint preserved)", async () => {
|
|
306
|
+
installMockBrainClient({
|
|
307
|
+
isAvailable: true,
|
|
308
|
+
search: async () => ({ result: { hits: [] } }),
|
|
309
|
+
});
|
|
310
|
+
const roomDir = makeRoomDir('t07');
|
|
311
|
+
const m = require('../core/rs-brain-substrate.cjs');
|
|
312
|
+
await m._test.pullFromBrain(roomDir, { namespace: 'tools', limit: 5 });
|
|
313
|
+
const auditPath = path.join(roomDir, '.mindrian', 'brain-substrate-audit.jsonl');
|
|
314
|
+
assert.ok(fs.existsSync(auditPath), 'audit log must exist after pullFromBrain');
|
|
315
|
+
const lines = fs.readFileSync(auditPath, 'utf8').trim().split('\n');
|
|
316
|
+
assert.ok(lines.length >= 1, 'expected at least one audit line');
|
|
317
|
+
const last = JSON.parse(lines[lines.length - 1]);
|
|
318
|
+
assert.equal(last.outcome, 'pass',
|
|
319
|
+
'Canon Part 8 audit outcome must be pass on legitimate query, got: ' + last.outcome);
|
|
320
|
+
assert.ok(Array.isArray(last.handles), 'audit must record handles array');
|
|
321
|
+
// handles are the keys of the outbound payload, which is {query, namespace, topK}
|
|
322
|
+
assert.ok(last.handles.includes('query'), 'handles must include query');
|
|
323
|
+
assert.ok(last.handles.includes('namespace'), 'handles must include namespace');
|
|
324
|
+
assert.ok(last.handles.includes('topK'), 'handles must include topK');
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
await runScenario("Test 8: pinecone_quota_exhausted is STILL rejected (Pitfall 1 guard intact)", async () => {
|
|
328
|
+
installMockBrainClient({
|
|
329
|
+
isAvailable: true,
|
|
330
|
+
search: async () => ({
|
|
331
|
+
error: 'pinecone_quota_exhausted',
|
|
332
|
+
message: 'Pinecone quota exhausted',
|
|
333
|
+
fallback: 'neo4j',
|
|
334
|
+
}),
|
|
335
|
+
});
|
|
336
|
+
const roomDir = makeRoomDir('t08');
|
|
337
|
+
const m = require('../core/rs-brain-substrate.cjs');
|
|
338
|
+
const result = await m._test.pullFromBrain(roomDir, { namespace: 'tools' });
|
|
339
|
+
assert.equal(result.ok, false, 'quota fallback must NOT be cached');
|
|
340
|
+
assert.equal(result.reason, 'brain_quota_exhausted',
|
|
341
|
+
'reason should be brain_quota_exhausted, got: ' + result.reason);
|
|
342
|
+
assert.equal(result.err_category, 'rate_limited',
|
|
343
|
+
'err_category should be rate_limited');
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
await runScenario("Test 9: loadSubstrate NEVER throws even on adapter-internal anomaly (graceful degradation)", async () => {
|
|
347
|
+
installMockBrainClient({
|
|
348
|
+
isAvailable: true,
|
|
349
|
+
search: async () => {
|
|
350
|
+
// Return something pathological that the adapter must handle without throwing.
|
|
351
|
+
// Adapter sees neither matches[] nor result.hits[], so returns null;
|
|
352
|
+
// pullFromBrain converts null to malformed_response. loadSubstrate then
|
|
353
|
+
// falls through to B3 (no cache + Brain "up" but pull failed).
|
|
354
|
+
return null;
|
|
355
|
+
},
|
|
356
|
+
});
|
|
357
|
+
const roomDir = makeRoomDir('t09');
|
|
358
|
+
const m = require('../core/rs-brain-substrate.cjs');
|
|
359
|
+
let threw = null;
|
|
360
|
+
let result = null;
|
|
361
|
+
try {
|
|
362
|
+
result = await m.loadSubstrate({ roomDir: roomDir });
|
|
363
|
+
} catch (err) {
|
|
364
|
+
threw = err;
|
|
365
|
+
}
|
|
366
|
+
assert.equal(threw, null, 'I4: loadSubstrate must NEVER throw, got: ' + (threw && threw.message));
|
|
367
|
+
assert.ok(result && typeof result === 'object', 'result must be object');
|
|
368
|
+
assert.equal(result.success, true, 'success must be true even on degraded path');
|
|
369
|
+
assert.equal(result.mode, 'B3',
|
|
370
|
+
'Pathological null response with no cache -> B3, got: ' + result.mode);
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
// ============================================================
|
|
374
|
+
// Task 2 Tests 10-14: validator Check E embedding-or-score
|
|
375
|
+
// ============================================================
|
|
376
|
+
|
|
377
|
+
await runScenario("Test 10: validator on score-only entry (no embedding) returns zero violations (post-relax)", async () => {
|
|
378
|
+
const roomDir = makeRoomDir('t10');
|
|
379
|
+
plantCache(roomDir, {
|
|
380
|
+
schema_version: '1.0',
|
|
381
|
+
pulled_at: new Date().toISOString(),
|
|
382
|
+
ttl_days: 30,
|
|
383
|
+
source_index: 'pws-brain',
|
|
384
|
+
source_namespaces: ['tools'],
|
|
385
|
+
embedding_count: 1,
|
|
386
|
+
content_hash: 'sha256:test',
|
|
387
|
+
_completeness: 'score-only',
|
|
388
|
+
substrate: [{
|
|
389
|
+
id: 'mindrian-rs-abc',
|
|
390
|
+
score: 0.8,
|
|
391
|
+
metadata: { framework_name: 'rs', title: 'Reverse Salient' },
|
|
392
|
+
}],
|
|
393
|
+
});
|
|
394
|
+
const v = require('./validators/brain-substrate-invariants.cjs');
|
|
395
|
+
const r = v.validate(roomDir, {});
|
|
396
|
+
assert.ok(Array.isArray(r.violations), 'validator returns violations array');
|
|
397
|
+
assert.equal(r.violations.length, 0,
|
|
398
|
+
'Score-only entry should pass post-relax. Violations: ' +
|
|
399
|
+
JSON.stringify(r.violations));
|
|
400
|
+
assert.equal(r.severity, null, 'severity should be null');
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
await runScenario("Test 11: validator on score-out-of-range returns critical cache_entry_shape_invalid", async () => {
|
|
404
|
+
const roomDir = makeRoomDir('t11');
|
|
405
|
+
plantCache(roomDir, {
|
|
406
|
+
schema_version: '1.0',
|
|
407
|
+
pulled_at: new Date().toISOString(),
|
|
408
|
+
ttl_days: 30,
|
|
409
|
+
source_index: 'pws-brain',
|
|
410
|
+
source_namespaces: ['tools'],
|
|
411
|
+
embedding_count: 1,
|
|
412
|
+
content_hash: 'sha256:test',
|
|
413
|
+
_completeness: 'score-only',
|
|
414
|
+
substrate: [{
|
|
415
|
+
id: 'mindrian-bad',
|
|
416
|
+
score: 1.5,
|
|
417
|
+
metadata: {},
|
|
418
|
+
}],
|
|
419
|
+
});
|
|
420
|
+
const v = require('./validators/brain-substrate-invariants.cjs');
|
|
421
|
+
const r = v.validate(roomDir, {});
|
|
422
|
+
assert.ok(
|
|
423
|
+
r.violations.some(function (x) { return x.category === 'cache_entry_shape_invalid'; }),
|
|
424
|
+
'Expected cache_entry_shape_invalid violation, got: ' + JSON.stringify(r.violations)
|
|
425
|
+
);
|
|
426
|
+
assert.equal(r.severity, 'critical', 'severity must be critical on bad score');
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
await runScenario("Test 12: validator on entry missing both embedding AND score returns critical", async () => {
|
|
430
|
+
const roomDir = makeRoomDir('t12');
|
|
431
|
+
plantCache(roomDir, {
|
|
432
|
+
schema_version: '1.0',
|
|
433
|
+
pulled_at: new Date().toISOString(),
|
|
434
|
+
ttl_days: 30,
|
|
435
|
+
source_index: 'pws-brain',
|
|
436
|
+
source_namespaces: ['tools'],
|
|
437
|
+
embedding_count: 1,
|
|
438
|
+
content_hash: 'sha256:test',
|
|
439
|
+
_completeness: 'partial',
|
|
440
|
+
substrate: [{
|
|
441
|
+
id: 'mindrian-orphan',
|
|
442
|
+
metadata: {},
|
|
443
|
+
}],
|
|
444
|
+
});
|
|
445
|
+
const v = require('./validators/brain-substrate-invariants.cjs');
|
|
446
|
+
const r = v.validate(roomDir, {});
|
|
447
|
+
assert.ok(
|
|
448
|
+
r.violations.some(function (x) { return x.category === 'cache_entry_shape_invalid'; }),
|
|
449
|
+
'Expected cache_entry_shape_invalid for entry with neither embedding nor score, got: ' +
|
|
450
|
+
JSON.stringify(r.violations)
|
|
451
|
+
);
|
|
452
|
+
assert.equal(r.severity, 'critical', 'severity must be critical on missing both');
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
await runScenario("Test 13: validator on legacy 1024-dim embedding entry STILL passes (back-compat)", async () => {
|
|
456
|
+
const roomDir = makeRoomDir('t13');
|
|
457
|
+
plantCache(roomDir, {
|
|
458
|
+
schema_version: '1.0',
|
|
459
|
+
pulled_at: new Date().toISOString(),
|
|
460
|
+
ttl_days: 30,
|
|
461
|
+
source_index: 'pws-brain',
|
|
462
|
+
source_namespaces: ['tools'],
|
|
463
|
+
embedding_count: 1,
|
|
464
|
+
content_hash: 'sha256:test',
|
|
465
|
+
_completeness: 'full-vectors',
|
|
466
|
+
substrate: [{
|
|
467
|
+
id: 'six_thinking_hats',
|
|
468
|
+
embedding: new Array(1024).fill(0.0),
|
|
469
|
+
metadata: { framework_name: 'Six Thinking Hats' },
|
|
470
|
+
}],
|
|
471
|
+
});
|
|
472
|
+
const v = require('./validators/brain-substrate-invariants.cjs');
|
|
473
|
+
const r = v.validate(roomDir, {});
|
|
474
|
+
assert.equal(r.violations.length, 0,
|
|
475
|
+
'Legacy 1024-dim path must remain valid. Violations: ' +
|
|
476
|
+
JSON.stringify(r.violations));
|
|
477
|
+
assert.equal(r.severity, null, 'severity should be null on legacy entry');
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
await runScenario("Test 14: validator on score-only entry with forbidden regex in metadata returns canon_boundary critical", async () => {
|
|
481
|
+
const roomDir = makeRoomDir('t14');
|
|
482
|
+
plantCache(roomDir, {
|
|
483
|
+
schema_version: '1.0',
|
|
484
|
+
pulled_at: new Date().toISOString(),
|
|
485
|
+
ttl_days: 30,
|
|
486
|
+
source_index: 'pws-brain',
|
|
487
|
+
source_namespaces: ['tools'],
|
|
488
|
+
embedding_count: 1,
|
|
489
|
+
content_hash: 'sha256:test',
|
|
490
|
+
_completeness: 'score-only',
|
|
491
|
+
substrate: [{
|
|
492
|
+
id: 'mindrian-poisoned',
|
|
493
|
+
score: 0.8,
|
|
494
|
+
metadata: { framework_name: 'jonathan@mindrian.com' },
|
|
495
|
+
}],
|
|
496
|
+
});
|
|
497
|
+
const v = require('./validators/brain-substrate-invariants.cjs');
|
|
498
|
+
const r = v.validate(roomDir, {});
|
|
499
|
+
assert.ok(
|
|
500
|
+
r.violations.some(function (x) { return x.category === 'canon_boundary'; }),
|
|
501
|
+
'Expected canon_boundary on forbidden-regex-laden metadata, got: ' +
|
|
502
|
+
JSON.stringify(r.violations)
|
|
503
|
+
);
|
|
504
|
+
assert.equal(r.severity, 'critical', 'severity must be critical on canon_boundary hit');
|
|
505
|
+
// Cleanup (mirrors 89.1a-03 Scenario 12 pattern; poisoned cache is test-only)
|
|
506
|
+
try {
|
|
507
|
+
fs.unlinkSync(path.join(roomDir, '.mindrian', 'brain-substrate-cache.json'));
|
|
508
|
+
} catch (_e) { /* best effort */ }
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
// ----- Summary -----
|
|
512
|
+
const total = passed + failed;
|
|
513
|
+
process.stdout.write(
|
|
514
|
+
'\n=== 89.1-01 shape adapter suite: ' + passed + '/' + total + ' passed ===\n'
|
|
515
|
+
);
|
|
516
|
+
if (failed > 0) {
|
|
517
|
+
for (const f of failures) {
|
|
518
|
+
process.stderr.write(' - ' + f.name + ': ' +
|
|
519
|
+
(f.err && f.err.message ? f.err.message : String(f.err)) + '\n');
|
|
520
|
+
}
|
|
521
|
+
process.exit(1);
|
|
522
|
+
}
|
|
523
|
+
process.exit(0);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
main().catch(function (err) {
|
|
527
|
+
process.stderr.write('FATAL: ' + String(err && err.stack || err) + '\n');
|
|
528
|
+
process.exit(1);
|
|
529
|
+
});
|