@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,521 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2026 Mindrian. BSL 1.1.
|
|
4
|
+
*
|
|
5
|
+
* Phase 91-05 -- /mos:explain-decision command fixture tests
|
|
6
|
+
* ===========================================================
|
|
7
|
+
* Exercises scripts/explain-decision-command.cjs and the slash command
|
|
8
|
+
* markdown at commands/explain-decision.md. The command is the user-
|
|
9
|
+
* facing audit surface for the Navigation Engine: it reads
|
|
10
|
+
* .mindrian/decision-traces/<session>.json (written by Plan 91-02) and
|
|
11
|
+
* renders human-readable trace output.
|
|
12
|
+
*
|
|
13
|
+
* Canon Part 3 (Tri-Context Decision Gate, Section 8 trace contract):
|
|
14
|
+
* every decision must be explainable. The command renders all 8 brain_md_*
|
|
15
|
+
* fields plus 5 structural trace fields per turn.
|
|
16
|
+
*
|
|
17
|
+
* Canon Part 4 (Every Choice Is Graph Data): the command READS from the
|
|
18
|
+
* graph-data surface (decision-traces/*.json) that Plan 91-02 writes. It
|
|
19
|
+
* never writes back; it is a pure audit lens.
|
|
20
|
+
*
|
|
21
|
+
* Canon Part 8 (Graph Boundary): zero network surface. Reads only LOCAL
|
|
22
|
+
* .mindrian/decision-traces/. Test 11 source-scans for forbidden Brain /
|
|
23
|
+
* fetch / curl references.
|
|
24
|
+
*
|
|
25
|
+
* Test map:
|
|
26
|
+
* Tests 1-12: command semantics + rendering + flags + fallback (Task 1).
|
|
27
|
+
* 1. Happy path: 1 trace renders header + body
|
|
28
|
+
* 2. All 8 Section 8 fields rendered
|
|
29
|
+
* 3. All 5 structural trace fields rendered
|
|
30
|
+
* 4. chosen_rationale rendered verbatim
|
|
31
|
+
* 5. --last N flag renders N most recent traces with header
|
|
32
|
+
* 6. --last clamp: --last 999 -> never throws, renders all available
|
|
33
|
+
* 7. --session SESSIONID flag overrides default resolution
|
|
34
|
+
* 8. Default session resolution: env -> current-session.json -> mtime
|
|
35
|
+
* 9. Absent session file: 'No decisions recorded' advisory, exit 0
|
|
36
|
+
* 10. Malformed session file: parse-error advisory, exit 0
|
|
37
|
+
* 11. Zero network surface (source scan)
|
|
38
|
+
* 12. De Stijl glyph vocabulary on tier_mode classifier
|
|
39
|
+
* Tests 13-14: command markdown lint (Task 2).
|
|
40
|
+
* 13. commands/explain-decision.md frontmatter present
|
|
41
|
+
* 14. description length under 60 chars
|
|
42
|
+
*
|
|
43
|
+
* Registered in lib/memory/run-feynman-tests.cjs.
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
'use strict';
|
|
47
|
+
|
|
48
|
+
const assert = require('node:assert/strict');
|
|
49
|
+
const fs = require('node:fs');
|
|
50
|
+
const path = require('node:path');
|
|
51
|
+
const os = require('node:os');
|
|
52
|
+
const { spawnSync } = require('node:child_process');
|
|
53
|
+
|
|
54
|
+
const REPO = path.resolve(__dirname, '..', '..');
|
|
55
|
+
const SCRIPT_PATH = path.join(REPO, 'scripts/explain-decision-command.cjs');
|
|
56
|
+
const COMMAND_MD_PATH = path.join(REPO, 'commands/explain-decision.md');
|
|
57
|
+
|
|
58
|
+
// ---------- Test scaffolding ----------
|
|
59
|
+
|
|
60
|
+
let passed = 0;
|
|
61
|
+
let failed = 0;
|
|
62
|
+
function run(name, fn) {
|
|
63
|
+
try {
|
|
64
|
+
fn();
|
|
65
|
+
process.stdout.write('ok ' + name + '\n');
|
|
66
|
+
passed += 1;
|
|
67
|
+
} catch (err) {
|
|
68
|
+
process.stderr.write('FAIL ' + name + '\n');
|
|
69
|
+
process.stderr.write(String(err && err.stack ? err.stack : err) + '\n');
|
|
70
|
+
failed += 1;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ---------- Fixture builders ----------
|
|
75
|
+
|
|
76
|
+
const TMPDIRS = [];
|
|
77
|
+
|
|
78
|
+
process.on('exit', () => {
|
|
79
|
+
for (const d of TMPDIRS) {
|
|
80
|
+
try { fs.rmSync(d, { recursive: true, force: true }); } catch (_) {}
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
function makeRoomsFixture(label) {
|
|
85
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), '91-05-' + label + '-'));
|
|
86
|
+
TMPDIRS.push(tmp);
|
|
87
|
+
const root = path.join(tmp, 'MindrianRooms');
|
|
88
|
+
fs.mkdirSync(root, { recursive: true });
|
|
89
|
+
const roomDir = path.join(root, 'fixture-room');
|
|
90
|
+
fs.mkdirSync(roomDir, { recursive: true });
|
|
91
|
+
fs.writeFileSync(
|
|
92
|
+
path.join(roomDir, 'STATE.md'),
|
|
93
|
+
'---\nproject: fixture room\n---\n\n# Fixture Room\n'
|
|
94
|
+
);
|
|
95
|
+
const regDir = path.join(root, '.rooms');
|
|
96
|
+
fs.mkdirSync(regDir, { recursive: true });
|
|
97
|
+
fs.writeFileSync(
|
|
98
|
+
path.join(regDir, 'registry.json'),
|
|
99
|
+
JSON.stringify({
|
|
100
|
+
version: 1,
|
|
101
|
+
active: 'fixture-room',
|
|
102
|
+
rooms: {
|
|
103
|
+
'fixture-room': { path: 'fixture-room' },
|
|
104
|
+
},
|
|
105
|
+
}, null, 2)
|
|
106
|
+
);
|
|
107
|
+
return { tmp: tmp, root: root, roomDir: roomDir };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function writeTraceFile(roomDir, sessionId, traces) {
|
|
111
|
+
const dir = path.join(roomDir, '.mindrian', 'decision-traces');
|
|
112
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
113
|
+
const fp = path.join(dir, sessionId + '.json');
|
|
114
|
+
fs.writeFileSync(
|
|
115
|
+
fp,
|
|
116
|
+
JSON.stringify(
|
|
117
|
+
{ version: 1, session_id: sessionId, traces: traces },
|
|
118
|
+
null,
|
|
119
|
+
2
|
|
120
|
+
)
|
|
121
|
+
);
|
|
122
|
+
return fp;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function makeTrace(turn, overrides) {
|
|
126
|
+
const base = {
|
|
127
|
+
turn: turn,
|
|
128
|
+
at: '2026-04-27T12:00:0' + (turn % 10) + '.000Z',
|
|
129
|
+
elapsed_ms: 12,
|
|
130
|
+
brain_md_version: 1,
|
|
131
|
+
brain_md_staleness: 'fresh',
|
|
132
|
+
brain_md_stale_reason: null,
|
|
133
|
+
brain_md_weight_applied: 1.0,
|
|
134
|
+
brain_md_recommended_confidence: 0.85,
|
|
135
|
+
brain_md_recommended_marker_rendered: true,
|
|
136
|
+
brain_md_tier_mode: 'mode_a',
|
|
137
|
+
brain_md_sections_consumed: ['pattern_matches', 'wicked_indicators'],
|
|
138
|
+
icm_scope: { section: 'market-analysis', scope_path: 'fixture-room/market-analysis' },
|
|
139
|
+
sql_signals: { edge_counts: 12, contradictions: 1, convergences: 3 },
|
|
140
|
+
minto_reasoning: {
|
|
141
|
+
governing_thought: 'Customers will pay for clarity',
|
|
142
|
+
reasoning_health_score: 0.7,
|
|
143
|
+
is_stale: false,
|
|
144
|
+
},
|
|
145
|
+
intent_persona: {
|
|
146
|
+
larry_persona: 'Researcher',
|
|
147
|
+
brain_persona: 'Implicit',
|
|
148
|
+
detection_confidence: 0.6,
|
|
149
|
+
},
|
|
150
|
+
chosen_rationale: 'Mode A: BRAIN.md fresh; pattern_matches confidence above 0.7 floor.',
|
|
151
|
+
};
|
|
152
|
+
return Object.assign({}, base, overrides || {});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function runCommand(roomDir, args, extraEnv) {
|
|
156
|
+
const env = Object.assign({}, process.env, {
|
|
157
|
+
MINDRIAN_ROOMS_HOME: path.dirname(roomDir),
|
|
158
|
+
MINDRIAN_ROOMS_ROOT: path.dirname(roomDir),
|
|
159
|
+
}, extraEnv || {});
|
|
160
|
+
return spawnSync(process.execPath, [SCRIPT_PATH].concat(args || []), {
|
|
161
|
+
env: env,
|
|
162
|
+
encoding: 'utf8',
|
|
163
|
+
timeout: 5000,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// =========================================================
|
|
168
|
+
// Tests 1-12 (Task 1)
|
|
169
|
+
// =========================================================
|
|
170
|
+
|
|
171
|
+
run('Test 1: happy path -- 1 trace renders header + body', () => {
|
|
172
|
+
const fix = makeRoomsFixture('t01');
|
|
173
|
+
writeTraceFile(fix.roomDir, 'sid-t01', [makeTrace(1)]);
|
|
174
|
+
const res = runCommand(fix.roomDir, [], { CLAUDE_SESSION_ID: 'sid-t01' });
|
|
175
|
+
assert.equal(res.status, 0, 'exit 0; stderr: ' + (res.stderr || ''));
|
|
176
|
+
const out = res.stdout || '';
|
|
177
|
+
assert.equal(
|
|
178
|
+
out.indexOf('Navigation Engine Decision Trace') !== -1,
|
|
179
|
+
true,
|
|
180
|
+
'expected header; got: ' + out.slice(0, 200)
|
|
181
|
+
);
|
|
182
|
+
assert.equal(
|
|
183
|
+
out.indexOf('Turn 1') !== -1,
|
|
184
|
+
true,
|
|
185
|
+
'expected turn marker; got: ' + out.slice(0, 200)
|
|
186
|
+
);
|
|
187
|
+
assert.equal(
|
|
188
|
+
out.indexOf('sid-t01') !== -1,
|
|
189
|
+
true,
|
|
190
|
+
'expected session id in output'
|
|
191
|
+
);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
run('Test 2: all 8 Section 8 brain_md_* fields rendered', () => {
|
|
195
|
+
const fix = makeRoomsFixture('t02');
|
|
196
|
+
writeTraceFile(fix.roomDir, 'sid-t02', [makeTrace(1)]);
|
|
197
|
+
const res = runCommand(fix.roomDir, [], { CLAUDE_SESSION_ID: 'sid-t02' });
|
|
198
|
+
assert.equal(res.status, 0);
|
|
199
|
+
const out = res.stdout || '';
|
|
200
|
+
// 8 Section 8 fields per plan: brain_md_version, staleness, stale_reason,
|
|
201
|
+
// weight_applied, recommended_confidence, marker_rendered, tier_mode,
|
|
202
|
+
// sections_consumed.
|
|
203
|
+
const required = [
|
|
204
|
+
'version:', // brain_md_version
|
|
205
|
+
'staleness:', // brain_md_staleness
|
|
206
|
+
'stale_reason:', // brain_md_stale_reason
|
|
207
|
+
'weight_applied:', // brain_md_weight_applied
|
|
208
|
+
'highest_confidence:', // brain_md_recommended_confidence
|
|
209
|
+
'rendered:', // brain_md_recommended_marker_rendered
|
|
210
|
+
'sections_consumed:', // brain_md_sections_consumed
|
|
211
|
+
];
|
|
212
|
+
for (const tok of required) {
|
|
213
|
+
assert.equal(out.indexOf(tok) !== -1, true,
|
|
214
|
+
'missing required token "' + tok + '" in output:\n' + out);
|
|
215
|
+
}
|
|
216
|
+
// tier_mode rendered as a header label "Tier Mode"
|
|
217
|
+
assert.equal(out.indexOf('Tier Mode') !== -1, true,
|
|
218
|
+
'missing Tier Mode header; got: ' + out);
|
|
219
|
+
assert.equal(out.indexOf('mode_a') !== -1, true,
|
|
220
|
+
'tier_mode value missing; got: ' + out);
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
run('Test 3: all 5 structural trace fields rendered', () => {
|
|
224
|
+
const fix = makeRoomsFixture('t03');
|
|
225
|
+
writeTraceFile(fix.roomDir, 'sid-t03', [makeTrace(1)]);
|
|
226
|
+
const res = runCommand(fix.roomDir, [], { CLAUDE_SESSION_ID: 'sid-t03' });
|
|
227
|
+
assert.equal(res.status, 0);
|
|
228
|
+
const out = res.stdout || '';
|
|
229
|
+
const tokens = [
|
|
230
|
+
'ICM scope',
|
|
231
|
+
'SQL signals',
|
|
232
|
+
'Feynman-MINTO',
|
|
233
|
+
'BRAIN patterns',
|
|
234
|
+
'Intent + Persona',
|
|
235
|
+
];
|
|
236
|
+
for (const t of tokens) {
|
|
237
|
+
assert.equal(out.indexOf(t) !== -1, true,
|
|
238
|
+
'missing structural label "' + t + '" in output:\n' + out);
|
|
239
|
+
}
|
|
240
|
+
// Verify ICM scope value rendered.
|
|
241
|
+
assert.equal(out.indexOf('market-analysis') !== -1, true,
|
|
242
|
+
'icm_scope.section value missing');
|
|
243
|
+
// SQL signals scalars.
|
|
244
|
+
assert.equal(out.indexOf('12') !== -1, true, 'edge_counts value missing');
|
|
245
|
+
// governing_thought truncated or full.
|
|
246
|
+
assert.equal(out.indexOf('Customers will pay') !== -1, true,
|
|
247
|
+
'governing_thought missing');
|
|
248
|
+
// BRAIN patterns: section keys list.
|
|
249
|
+
assert.equal(out.indexOf('pattern_matches') !== -1, true,
|
|
250
|
+
'BRAIN sections_consumed missing');
|
|
251
|
+
// Intent persona.
|
|
252
|
+
assert.equal(out.indexOf('Researcher') !== -1, true,
|
|
253
|
+
'larry_persona missing');
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
run('Test 4: chosen_rationale rendered verbatim', () => {
|
|
257
|
+
const fix = makeRoomsFixture('t04');
|
|
258
|
+
const rationale = 'Mode A: BRAIN.md fresh; pattern_matches confidence above 0.7 floor.';
|
|
259
|
+
writeTraceFile(fix.roomDir, 'sid-t04', [makeTrace(1, { chosen_rationale: rationale })]);
|
|
260
|
+
const res = runCommand(fix.roomDir, [], { CLAUDE_SESSION_ID: 'sid-t04' });
|
|
261
|
+
assert.equal(res.status, 0);
|
|
262
|
+
const out = res.stdout || '';
|
|
263
|
+
assert.equal(out.indexOf(rationale) !== -1, true,
|
|
264
|
+
'rationale not rendered verbatim; expected:\n' + rationale + '\ngot:\n' + out);
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
run('Test 5: --last N flag renders N most recent traces with header', () => {
|
|
268
|
+
const fix = makeRoomsFixture('t05');
|
|
269
|
+
const traces = [];
|
|
270
|
+
for (let i = 1; i <= 5; i += 1) traces.push(makeTrace(i, {
|
|
271
|
+
chosen_rationale: 'rationale-for-turn-' + i,
|
|
272
|
+
}));
|
|
273
|
+
writeTraceFile(fix.roomDir, 'sid-t05', traces);
|
|
274
|
+
const res = runCommand(fix.roomDir, ['--last', '3'], { CLAUDE_SESSION_ID: 'sid-t05' });
|
|
275
|
+
assert.equal(res.status, 0, 'exit 0; stderr: ' + (res.stderr || ''));
|
|
276
|
+
const out = res.stdout || '';
|
|
277
|
+
// Header advertises last 3 decisions.
|
|
278
|
+
assert.equal(out.indexOf('Last 3 decisions') !== -1, true,
|
|
279
|
+
'expected "Last 3 decisions" header; got:\n' + out.slice(0, 300));
|
|
280
|
+
// Most-recent 3 turns (3, 4, 5) present; oldest two (1, 2) absent.
|
|
281
|
+
assert.equal(out.indexOf('rationale-for-turn-5') !== -1, true,
|
|
282
|
+
'turn 5 rationale missing');
|
|
283
|
+
assert.equal(out.indexOf('rationale-for-turn-4') !== -1, true,
|
|
284
|
+
'turn 4 rationale missing');
|
|
285
|
+
assert.equal(out.indexOf('rationale-for-turn-3') !== -1, true,
|
|
286
|
+
'turn 3 rationale missing');
|
|
287
|
+
assert.equal(out.indexOf('rationale-for-turn-1') === -1, true,
|
|
288
|
+
'turn 1 rationale should NOT appear in --last 3');
|
|
289
|
+
assert.equal(out.indexOf('rationale-for-turn-2') === -1, true,
|
|
290
|
+
'turn 2 rationale should NOT appear in --last 3');
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
run('Test 6: --last clamp -- 999 never throws; renders all available', () => {
|
|
294
|
+
const fix = makeRoomsFixture('t06');
|
|
295
|
+
const traces = [];
|
|
296
|
+
for (let i = 1; i <= 4; i += 1) traces.push(makeTrace(i, {
|
|
297
|
+
chosen_rationale: 'r-turn-' + i,
|
|
298
|
+
}));
|
|
299
|
+
writeTraceFile(fix.roomDir, 'sid-t06', traces);
|
|
300
|
+
const res = runCommand(fix.roomDir, ['--last', '999'], { CLAUDE_SESSION_ID: 'sid-t06' });
|
|
301
|
+
assert.equal(res.status, 0, 'exit 0; stderr: ' + (res.stderr || ''));
|
|
302
|
+
const out = res.stdout || '';
|
|
303
|
+
// All 4 rationales present (clamped to 4 available).
|
|
304
|
+
for (let i = 1; i <= 4; i += 1) {
|
|
305
|
+
assert.equal(out.indexOf('r-turn-' + i) !== -1, true,
|
|
306
|
+
'turn ' + i + ' rationale missing under --last 999 clamp');
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
run('Test 7: --session SESSIONID flag overrides default resolution', () => {
|
|
311
|
+
const fix = makeRoomsFixture('t07');
|
|
312
|
+
// Two distinct session files; CLAUDE_SESSION_ID points at "default-sid"
|
|
313
|
+
// but --session arg points at "other-sid". Command must read the
|
|
314
|
+
// explicit flag's file.
|
|
315
|
+
writeTraceFile(fix.roomDir, 'default-sid',
|
|
316
|
+
[makeTrace(1, { chosen_rationale: 'default-session-rationale' })]);
|
|
317
|
+
writeTraceFile(fix.roomDir, 'other-sid',
|
|
318
|
+
[makeTrace(1, { chosen_rationale: 'OTHER-session-rationale' })]);
|
|
319
|
+
const res = runCommand(fix.roomDir, ['--session', 'other-sid'], {
|
|
320
|
+
CLAUDE_SESSION_ID: 'default-sid',
|
|
321
|
+
});
|
|
322
|
+
assert.equal(res.status, 0);
|
|
323
|
+
const out = res.stdout || '';
|
|
324
|
+
assert.equal(out.indexOf('OTHER-session-rationale') !== -1, true,
|
|
325
|
+
'--session flag should override env; expected OTHER rationale');
|
|
326
|
+
assert.equal(out.indexOf('default-session-rationale') === -1, true,
|
|
327
|
+
'default session rationale must NOT appear when --session is used');
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
run('Test 8: default session resolution -- env -> current-session.json -> mtime', () => {
|
|
331
|
+
const fix = makeRoomsFixture('t08');
|
|
332
|
+
// Path A: CLAUDE_SESSION_ID env hint takes priority.
|
|
333
|
+
writeTraceFile(fix.roomDir, 'env-sid',
|
|
334
|
+
[makeTrace(1, { chosen_rationale: 'rationale-from-env' })]);
|
|
335
|
+
writeTraceFile(fix.roomDir, 'pointer-sid',
|
|
336
|
+
[makeTrace(1, { chosen_rationale: 'rationale-from-pointer' })]);
|
|
337
|
+
// Write pointer file too -- env should win.
|
|
338
|
+
const pointerPath = path.join(fix.roomDir, '.mindrian', 'current-session.json');
|
|
339
|
+
fs.writeFileSync(pointerPath, JSON.stringify({ session_id: 'pointer-sid' }));
|
|
340
|
+
const resA = runCommand(fix.roomDir, [], { CLAUDE_SESSION_ID: 'env-sid' });
|
|
341
|
+
assert.equal(resA.status, 0);
|
|
342
|
+
assert.equal((resA.stdout || '').indexOf('rationale-from-env') !== -1, true,
|
|
343
|
+
'env hint should take priority; got:\n' + (resA.stdout || ''));
|
|
344
|
+
|
|
345
|
+
// Path B: no env -> pointer file resolves session.
|
|
346
|
+
const fix2 = makeRoomsFixture('t08b');
|
|
347
|
+
writeTraceFile(fix2.roomDir, 'pointer-sid-2',
|
|
348
|
+
[makeTrace(1, { chosen_rationale: 'rationale-from-pointer-2' })]);
|
|
349
|
+
fs.writeFileSync(
|
|
350
|
+
path.join(fix2.roomDir, '.mindrian', 'current-session.json'),
|
|
351
|
+
JSON.stringify({ session_id: 'pointer-sid-2' })
|
|
352
|
+
);
|
|
353
|
+
const envB = Object.assign({}, process.env);
|
|
354
|
+
delete envB.CLAUDE_SESSION_ID;
|
|
355
|
+
envB.MINDRIAN_ROOMS_HOME = path.dirname(fix2.roomDir);
|
|
356
|
+
envB.MINDRIAN_ROOMS_ROOT = path.dirname(fix2.roomDir);
|
|
357
|
+
const resB = spawnSync(process.execPath, [SCRIPT_PATH], {
|
|
358
|
+
env: envB, encoding: 'utf8', timeout: 5000,
|
|
359
|
+
});
|
|
360
|
+
assert.equal(resB.status, 0,
|
|
361
|
+
'pointer fallback exit non-zero: ' + (resB.stderr || ''));
|
|
362
|
+
assert.equal((resB.stdout || '').indexOf('rationale-from-pointer-2') !== -1,
|
|
363
|
+
true,
|
|
364
|
+
'pointer file should resolve session when env absent; got:\n' +
|
|
365
|
+
(resB.stdout || ''));
|
|
366
|
+
|
|
367
|
+
// Path C: no env, no pointer -> mtime fallback picks newest trace file.
|
|
368
|
+
const fix3 = makeRoomsFixture('t08c');
|
|
369
|
+
// Write older file first.
|
|
370
|
+
const oldFp = writeTraceFile(fix3.roomDir, 'older-sid',
|
|
371
|
+
[makeTrace(1, { chosen_rationale: 'rationale-older' })]);
|
|
372
|
+
// Force older mtime back 60s.
|
|
373
|
+
const olderTime = new Date(Date.now() - 60000);
|
|
374
|
+
fs.utimesSync(oldFp, olderTime, olderTime);
|
|
375
|
+
// Newer file (default mtime = now).
|
|
376
|
+
writeTraceFile(fix3.roomDir, 'newer-sid',
|
|
377
|
+
[makeTrace(1, { chosen_rationale: 'rationale-newer' })]);
|
|
378
|
+
const envC = Object.assign({}, process.env);
|
|
379
|
+
delete envC.CLAUDE_SESSION_ID;
|
|
380
|
+
envC.MINDRIAN_ROOMS_HOME = path.dirname(fix3.roomDir);
|
|
381
|
+
envC.MINDRIAN_ROOMS_ROOT = path.dirname(fix3.roomDir);
|
|
382
|
+
const resC = spawnSync(process.execPath, [SCRIPT_PATH], {
|
|
383
|
+
env: envC, encoding: 'utf8', timeout: 5000,
|
|
384
|
+
});
|
|
385
|
+
assert.equal(resC.status, 0);
|
|
386
|
+
assert.equal((resC.stdout || '').indexOf('rationale-newer') !== -1, true,
|
|
387
|
+
'mtime fallback should pick newest trace file');
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
run('Test 9: absent session file -- advisory message, exit 0', () => {
|
|
391
|
+
const fix = makeRoomsFixture('t09');
|
|
392
|
+
// No trace files written. Run with explicit nonexistent session.
|
|
393
|
+
const res = runCommand(fix.roomDir, ['--session', 'nonexistent-sid'], {});
|
|
394
|
+
assert.equal(res.status, 0,
|
|
395
|
+
'absent file should exit 0 (advisory); got ' + res.status);
|
|
396
|
+
const out = res.stdout || '';
|
|
397
|
+
assert.equal(out.indexOf('No decisions recorded') !== -1, true,
|
|
398
|
+
'expected "No decisions recorded" advisory; got:\n' + out);
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
run('Test 10: malformed session file -- parse-error advisory, exit 0', () => {
|
|
402
|
+
const fix = makeRoomsFixture('t10');
|
|
403
|
+
const dir = path.join(fix.roomDir, '.mindrian', 'decision-traces');
|
|
404
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
405
|
+
fs.writeFileSync(path.join(dir, 'bad-sid.json'), '{ not valid json :::');
|
|
406
|
+
const res = runCommand(fix.roomDir, ['--session', 'bad-sid'], {});
|
|
407
|
+
assert.equal(res.status, 0,
|
|
408
|
+
'malformed file should exit 0 (advisory); got ' + res.status);
|
|
409
|
+
const out = res.stdout || '';
|
|
410
|
+
assert.equal(out.indexOf('could not be parsed') !== -1, true,
|
|
411
|
+
'expected "could not be parsed" advisory; got:\n' + out);
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
run('Test 11: zero network surface (Canon Part 8 source scan)', () => {
|
|
415
|
+
// The script must NEVER reach for the Brain or any HTTP/HTTPS endpoint.
|
|
416
|
+
// Source-scan parity with the gate Plan 91-02 + 91-04 use.
|
|
417
|
+
const src = fs.readFileSync(SCRIPT_PATH, 'utf8');
|
|
418
|
+
// Regex matches: brain-client.{query|search|smartSearch}, fetch(, curl ,
|
|
419
|
+
// https:, http: (other than commented mentions). We strip line comments
|
|
420
|
+
// first to allow citations in JSDoc.
|
|
421
|
+
const stripped = src.replace(/^\s*\*.*$/gm, '').replace(/^\s*\/\/.*$/gm, '');
|
|
422
|
+
const forbidden = /(brain-client\.(query|search|smartSearch))|(\bfetch\s*\()|(\bcurl\s)|(https?:\/\/)/;
|
|
423
|
+
const m = stripped.match(forbidden);
|
|
424
|
+
assert.equal(
|
|
425
|
+
m === null,
|
|
426
|
+
true,
|
|
427
|
+
'forbidden network reference in script:\n' + (m ? m[0] : '')
|
|
428
|
+
);
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
run('Test 12: De Stijl glyph vocabulary on tier_mode classifier', () => {
|
|
432
|
+
// mode_a + weight_applied 1.0 -> "check"
|
|
433
|
+
// mode_a + weight_applied 0.5 (between 0.3 and 0.7) -> "warn"
|
|
434
|
+
// tier_0 -> "low" or "--"
|
|
435
|
+
const fixA = makeRoomsFixture('t12a');
|
|
436
|
+
writeTraceFile(fixA.roomDir, 'sid-a',
|
|
437
|
+
[makeTrace(1, { brain_md_tier_mode: 'mode_a', brain_md_weight_applied: 1.0 })]);
|
|
438
|
+
const resA = runCommand(fixA.roomDir, [], { CLAUDE_SESSION_ID: 'sid-a' });
|
|
439
|
+
assert.equal(resA.status, 0);
|
|
440
|
+
const outA = resA.stdout || '';
|
|
441
|
+
assert.equal(outA.indexOf('check') !== -1, true,
|
|
442
|
+
'mode_a + 1.0 should classify "check"; got:\n' + outA);
|
|
443
|
+
|
|
444
|
+
const fixB = makeRoomsFixture('t12b');
|
|
445
|
+
writeTraceFile(fixB.roomDir, 'sid-b',
|
|
446
|
+
[makeTrace(1, { brain_md_tier_mode: 'mode_a', brain_md_weight_applied: 0.5 })]);
|
|
447
|
+
const resB = runCommand(fixB.roomDir, [], { CLAUDE_SESSION_ID: 'sid-b' });
|
|
448
|
+
assert.equal(resB.status, 0);
|
|
449
|
+
const outB = resB.stdout || '';
|
|
450
|
+
assert.equal(outB.indexOf('warn') !== -1, true,
|
|
451
|
+
'mode_a + 0.5 should classify "warn"; got:\n' + outB);
|
|
452
|
+
|
|
453
|
+
const fixC = makeRoomsFixture('t12c');
|
|
454
|
+
writeTraceFile(fixC.roomDir, 'sid-c',
|
|
455
|
+
[makeTrace(1, {
|
|
456
|
+
brain_md_tier_mode: 'tier_0',
|
|
457
|
+
brain_md_weight_applied: 0.0,
|
|
458
|
+
brain_md_recommended_marker_rendered: false,
|
|
459
|
+
})]);
|
|
460
|
+
const resC = runCommand(fixC.roomDir, [], { CLAUDE_SESSION_ID: 'sid-c' });
|
|
461
|
+
assert.equal(resC.status, 0);
|
|
462
|
+
const outC = resC.stdout || '';
|
|
463
|
+
assert.equal(outC.indexOf('low') !== -1 || outC.indexOf('--') !== -1, true,
|
|
464
|
+
'tier_0 should classify "low" or "--"; got:\n' + outC);
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
// =========================================================
|
|
468
|
+
// Tests 13-14 (Task 2 -- command markdown lint)
|
|
469
|
+
// =========================================================
|
|
470
|
+
|
|
471
|
+
function commandMdShipped() {
|
|
472
|
+
return fs.existsSync(COMMAND_MD_PATH);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
if (commandMdShipped()) {
|
|
476
|
+
run('Test 13: commands/explain-decision.md frontmatter present', () => {
|
|
477
|
+
const md = fs.readFileSync(COMMAND_MD_PATH, 'utf8');
|
|
478
|
+
// Frontmatter delimiters at top.
|
|
479
|
+
assert.equal(md.slice(0, 4) === '---\n' || md.slice(0, 4) === '---\r', true,
|
|
480
|
+
'must start with --- frontmatter delimiter');
|
|
481
|
+
const fmEnd = md.indexOf('\n---', 4);
|
|
482
|
+
assert.equal(fmEnd > 0, true, 'frontmatter must close with ---');
|
|
483
|
+
const fm = md.slice(4, fmEnd);
|
|
484
|
+
// Required keys.
|
|
485
|
+
assert.equal(/^description:/m.test(fm), true,
|
|
486
|
+
'frontmatter must declare description');
|
|
487
|
+
assert.equal(/^argument-hint:/m.test(fm), true,
|
|
488
|
+
'frontmatter must declare argument-hint');
|
|
489
|
+
assert.equal(/^disable-model-invocation:/m.test(fm), true,
|
|
490
|
+
'frontmatter must declare disable-model-invocation');
|
|
491
|
+
// disable-model-invocation must be true (explicit user-invoked).
|
|
492
|
+
assert.equal(/^disable-model-invocation:\s*true/m.test(fm), true,
|
|
493
|
+
'disable-model-invocation must be true for explicit user audit command');
|
|
494
|
+
// argument-hint includes both flags.
|
|
495
|
+
assert.equal(/--last/.test(fm), true,
|
|
496
|
+
'argument-hint must mention --last');
|
|
497
|
+
assert.equal(/--session/.test(fm), true,
|
|
498
|
+
'argument-hint must mention --session');
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
run('Test 14: description length under 60 chars', () => {
|
|
502
|
+
const md = fs.readFileSync(COMMAND_MD_PATH, 'utf8');
|
|
503
|
+
const m = md.match(/^description:\s*(.+)$/m);
|
|
504
|
+
assert.equal(m !== null, true, 'description must be parseable');
|
|
505
|
+
const desc = m[1].trim().replace(/^["']|["']$/g, '');
|
|
506
|
+
assert.equal(desc.length < 60, true,
|
|
507
|
+
'description must be under 60 chars; got ' + desc.length + ' (' + desc + ')');
|
|
508
|
+
});
|
|
509
|
+
} else {
|
|
510
|
+
process.stdout.write(
|
|
511
|
+
'skip Tests 13-14 (commands/explain-decision.md not yet shipped; gate clears in Task 2)\n'
|
|
512
|
+
);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// =========================================================
|
|
516
|
+
// Summary
|
|
517
|
+
// =========================================================
|
|
518
|
+
|
|
519
|
+
process.stdout.write('\n' + passed + '/' + (passed + failed) + ' passed\n');
|
|
520
|
+
if (failed > 0) process.exit(1);
|
|
521
|
+
process.exit(0);
|