@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,385 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Copyright (c) 2026 Mindrian. BSL 1.1.
|
|
6
|
+
* Phase 89.5 Plan 01 -- rs-commercial-assessor fixture suite.
|
|
7
|
+
*
|
|
8
|
+
* 12 scenarios covering the Phase 4 commercial layer module:
|
|
9
|
+
* lib/core/rs-commercial-assessor.cjs
|
|
10
|
+
*
|
|
11
|
+
* Tests:
|
|
12
|
+
* T1 assess() exported as function; calling without arguments returns
|
|
13
|
+
* deterministic safe defaults (NO throw on the no-args path; the
|
|
14
|
+
* only throw paths are Canon Part 8 violations on adversarial input).
|
|
15
|
+
* T2 full positive input -- 3 fields populated; market_size_estimate
|
|
16
|
+
* non-empty string; value_proposition non-empty string;
|
|
17
|
+
* partnership_targets array of length >= 1.
|
|
18
|
+
* T3 deterministic invariance: 100 calls with same input produce
|
|
19
|
+
* byte-identical JSON.stringify.
|
|
20
|
+
* T4 edge case: zero industry signals + zero experts -> partnership_targets
|
|
21
|
+
* is [] (empty array, not undefined / null); market_size_estimate
|
|
22
|
+
* falls into low-signal bucket; value_proposition still populated;
|
|
23
|
+
* NO throw.
|
|
24
|
+
* T5 edge case: single expert -> partnership_targets has exactly 1 entry;
|
|
25
|
+
* deterministic.
|
|
26
|
+
* T6 edge case: missing breakthrough_score -> returns deterministic safe
|
|
27
|
+
* defaults with low-bucket market_size_estimate; NO throw.
|
|
28
|
+
* T7 edge case: missing classification -> returns deterministic safe
|
|
29
|
+
* defaults; value_proposition uses fallback template; NO throw.
|
|
30
|
+
* T8 classification table coverage: structural_transfer /
|
|
31
|
+
* semantic_implementation / hybrid each map to a distinct
|
|
32
|
+
* value_proposition template stem.
|
|
33
|
+
* T9 Canon Part 8 adversarial: opts contains a forbidden field
|
|
34
|
+
* (meeting fragment in opts.notes) -> auditQueryObject throws
|
|
35
|
+
* ExternalEgressViolation BEFORE assess() returns; err.name +
|
|
36
|
+
* err.meta.surface === rs-commercial-assessor-input.
|
|
37
|
+
* T10 Canon Part 8 adversarial: rs_discovery resolved_authors carries a
|
|
38
|
+
* forbidden field (meeting fragment in author.identity_text) -> throws
|
|
39
|
+
* ExternalEgressViolation; err.name === ExternalEgressViolation.
|
|
40
|
+
* T11 NO LLM CALL: install global.fetch shim that throws on call; install
|
|
41
|
+
* a brain-client require shim that throws on require; assess() with
|
|
42
|
+
* full positive input runs to completion; shim is NEVER called.
|
|
43
|
+
* T12 A1 sweep: every captured assess() output JSON.stringify across
|
|
44
|
+
* positive-path test cases contains ZERO matches for FORBIDDEN_PATTERNS.
|
|
45
|
+
*
|
|
46
|
+
* Pure CJS, zero npm deps, node built-ins only (assert).
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
const assert = require('node:assert/strict');
|
|
50
|
+
|
|
51
|
+
// ---------- Suite bookkeeping ----------
|
|
52
|
+
|
|
53
|
+
let passed = 0;
|
|
54
|
+
let failed = 0;
|
|
55
|
+
const failures = [];
|
|
56
|
+
const tests = [];
|
|
57
|
+
|
|
58
|
+
function record(name, fn) {
|
|
59
|
+
tests.push({ name, fn });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function runAll() {
|
|
63
|
+
for (const t of tests) {
|
|
64
|
+
try {
|
|
65
|
+
t.fn();
|
|
66
|
+
passed++;
|
|
67
|
+
process.stdout.write('PASS ' + t.name + '\n');
|
|
68
|
+
} catch (err) {
|
|
69
|
+
failed++;
|
|
70
|
+
failures.push({ name: t.name, message: err && err.message ? err.message : String(err) });
|
|
71
|
+
process.stdout.write('FAIL ' + t.name + ': ' + (err && err.message ? err.message : String(err)) + '\n');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Helper: assert function throws ExternalEgressViolation and returns the err.
|
|
77
|
+
function assertThrowsEgressViolation(fn, expectedSurface) {
|
|
78
|
+
let caught = null;
|
|
79
|
+
try {
|
|
80
|
+
fn();
|
|
81
|
+
} catch (e) {
|
|
82
|
+
caught = e;
|
|
83
|
+
}
|
|
84
|
+
assert.ok(caught !== null, 'expected throw, got none');
|
|
85
|
+
assert.equal(caught.name, 'ExternalEgressViolation',
|
|
86
|
+
'expected err.name=ExternalEgressViolation, got ' + (caught && caught.name));
|
|
87
|
+
assert.ok(caught.meta && typeof caught.meta === 'object',
|
|
88
|
+
'expected err.meta to be object');
|
|
89
|
+
if (expectedSurface !== undefined) {
|
|
90
|
+
assert.equal(caught.meta.surface, expectedSurface,
|
|
91
|
+
'expected err.meta.surface=' + JSON.stringify(expectedSurface)
|
|
92
|
+
+ ', got ' + JSON.stringify(caught.meta.surface));
|
|
93
|
+
}
|
|
94
|
+
return caught;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Capture box for A1 sweep -- every positive-path output is appended here
|
|
98
|
+
// for cross-test inspection in T12.
|
|
99
|
+
const positiveOutputs = [];
|
|
100
|
+
|
|
101
|
+
// ---------- Module under test ----------
|
|
102
|
+
|
|
103
|
+
const mod = require('../core/rs-commercial-assessor.cjs');
|
|
104
|
+
const { assess, _test } = mod;
|
|
105
|
+
|
|
106
|
+
// ---------- Fixtures ----------
|
|
107
|
+
|
|
108
|
+
const FULL_POSITIVE_INPUT = {
|
|
109
|
+
classification: 'structural_transfer',
|
|
110
|
+
bridge_concept: 'graph attention',
|
|
111
|
+
query_concept: 'protein folding',
|
|
112
|
+
doc_concept: 'transformer attention',
|
|
113
|
+
breakthrough_score: 8,
|
|
114
|
+
dimensions: {
|
|
115
|
+
feasibility: 0.9,
|
|
116
|
+
market: 0.8,
|
|
117
|
+
magnitude: 0.85,
|
|
118
|
+
advantage: 0.7,
|
|
119
|
+
impact: 0.9,
|
|
120
|
+
},
|
|
121
|
+
resolved_authors: [
|
|
122
|
+
{ author_id: 'a1', name: 'Dr. X', institution: 'MIT' },
|
|
123
|
+
{ author_id: 'a2', name: 'Dr. Y', institution: 'Stanford' },
|
|
124
|
+
],
|
|
125
|
+
resolved_institutions: ['MIT', 'Stanford'],
|
|
126
|
+
industry_signals_count: 5,
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
const SEMANTIC_INPUT = {
|
|
130
|
+
classification: 'semantic_implementation',
|
|
131
|
+
bridge_concept: 'attention',
|
|
132
|
+
query_concept: 'a',
|
|
133
|
+
doc_concept: 'b',
|
|
134
|
+
breakthrough_score: 6,
|
|
135
|
+
resolved_authors: [{ author_id: 'a1', name: 'Dr. Z', institution: 'CMU' }],
|
|
136
|
+
resolved_institutions: ['CMU'],
|
|
137
|
+
industry_signals_count: 3,
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
const HYBRID_INPUT = {
|
|
141
|
+
classification: 'hybrid',
|
|
142
|
+
bridge_concept: 'message passing',
|
|
143
|
+
query_concept: 'a',
|
|
144
|
+
doc_concept: 'b',
|
|
145
|
+
breakthrough_score: 7,
|
|
146
|
+
resolved_authors: [{ author_id: 'a1', name: 'Dr. W', institution: 'Caltech' }],
|
|
147
|
+
resolved_institutions: ['Caltech'],
|
|
148
|
+
industry_signals_count: 4,
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
// ---------- Tests ----------
|
|
152
|
+
|
|
153
|
+
record('T1 assess exported as function; no-args returns deterministic safe defaults', function () {
|
|
154
|
+
assert.equal(typeof assess, 'function', 'assess must be a function');
|
|
155
|
+
// No-args -> deterministic safe defaults; NO throw.
|
|
156
|
+
const out = assess();
|
|
157
|
+
assert.ok(out && typeof out === 'object', 'no-args output must be object');
|
|
158
|
+
assert.equal(typeof out.market_size_estimate, 'string',
|
|
159
|
+
'market_size_estimate must be string on no-args');
|
|
160
|
+
assert.equal(typeof out.value_proposition, 'string',
|
|
161
|
+
'value_proposition must be string on no-args');
|
|
162
|
+
assert.ok(Array.isArray(out.partnership_targets),
|
|
163
|
+
'partnership_targets must be array on no-args');
|
|
164
|
+
assert.equal(out.partnership_targets.length, 0,
|
|
165
|
+
'no-args partnership_targets must be empty array');
|
|
166
|
+
positiveOutputs.push(out);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
record('T2 full positive input -- 3 fields populated', function () {
|
|
170
|
+
const out = assess(FULL_POSITIVE_INPUT);
|
|
171
|
+
assert.ok(out && typeof out === 'object', 'output must be object');
|
|
172
|
+
// 3 required fields
|
|
173
|
+
assert.equal(typeof out.market_size_estimate, 'string',
|
|
174
|
+
'market_size_estimate must be string');
|
|
175
|
+
assert.ok(out.market_size_estimate.length > 0,
|
|
176
|
+
'market_size_estimate must be non-empty');
|
|
177
|
+
assert.equal(typeof out.value_proposition, 'string',
|
|
178
|
+
'value_proposition must be string');
|
|
179
|
+
assert.ok(out.value_proposition.length > 0,
|
|
180
|
+
'value_proposition must be non-empty');
|
|
181
|
+
assert.ok(Array.isArray(out.partnership_targets),
|
|
182
|
+
'partnership_targets must be array');
|
|
183
|
+
assert.ok(out.partnership_targets.length >= 1,
|
|
184
|
+
'partnership_targets must have at least 1 entry from full input');
|
|
185
|
+
positiveOutputs.push(out);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
record('T3 deterministic invariance: 100 calls byte-identical', function () {
|
|
189
|
+
const first = JSON.stringify(assess(FULL_POSITIVE_INPUT));
|
|
190
|
+
for (let i = 0; i < 99; i += 1) {
|
|
191
|
+
const next = JSON.stringify(assess(FULL_POSITIVE_INPUT));
|
|
192
|
+
assert.equal(next, first,
|
|
193
|
+
'iteration ' + i + ' must match first; deterministic invariance broken');
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
record('T4 edge case: zero signals + zero experts -> empty array + low-bucket', function () {
|
|
198
|
+
const out = assess({
|
|
199
|
+
classification: 'structural_transfer',
|
|
200
|
+
bridge_concept: 'x',
|
|
201
|
+
breakthrough_score: 1,
|
|
202
|
+
resolved_authors: [],
|
|
203
|
+
resolved_institutions: [],
|
|
204
|
+
industry_signals_count: 0,
|
|
205
|
+
});
|
|
206
|
+
assert.ok(Array.isArray(out.partnership_targets),
|
|
207
|
+
'partnership_targets must be array');
|
|
208
|
+
assert.equal(out.partnership_targets.length, 0,
|
|
209
|
+
'partnership_targets must be empty when no experts/institutions');
|
|
210
|
+
assert.equal(typeof out.market_size_estimate, 'string',
|
|
211
|
+
'market_size_estimate must be string');
|
|
212
|
+
assert.ok(out.market_size_estimate.length > 0,
|
|
213
|
+
'low-signal bucket must be a non-empty string');
|
|
214
|
+
assert.equal(typeof out.value_proposition, 'string',
|
|
215
|
+
'value_proposition must be string');
|
|
216
|
+
assert.ok(out.value_proposition.length > 0,
|
|
217
|
+
'value_proposition must be populated even at low signal');
|
|
218
|
+
positiveOutputs.push(out);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
record('T5 edge case: single expert -> partnership_targets length 1', function () {
|
|
222
|
+
const out = assess({
|
|
223
|
+
classification: 'structural_transfer',
|
|
224
|
+
bridge_concept: 'x',
|
|
225
|
+
breakthrough_score: 5,
|
|
226
|
+
resolved_authors: [{ author_id: 'a1', name: 'Dr. Solo', institution: 'Solo Lab' }],
|
|
227
|
+
resolved_institutions: ['Solo Lab'],
|
|
228
|
+
industry_signals_count: 2,
|
|
229
|
+
});
|
|
230
|
+
assert.equal(out.partnership_targets.length, 2,
|
|
231
|
+
'single expert + single institution -> 2 partnership_target entries (1 author + 1 institution)');
|
|
232
|
+
// Determinism subcheck on this case
|
|
233
|
+
const a = JSON.stringify(out);
|
|
234
|
+
const b = JSON.stringify(assess({
|
|
235
|
+
classification: 'structural_transfer',
|
|
236
|
+
bridge_concept: 'x',
|
|
237
|
+
breakthrough_score: 5,
|
|
238
|
+
resolved_authors: [{ author_id: 'a1', name: 'Dr. Solo', institution: 'Solo Lab' }],
|
|
239
|
+
resolved_institutions: ['Solo Lab'],
|
|
240
|
+
industry_signals_count: 2,
|
|
241
|
+
}));
|
|
242
|
+
assert.equal(a, b, 'single-expert path must be deterministic');
|
|
243
|
+
positiveOutputs.push(out);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
record('T6 edge case: missing breakthrough_score -> safe defaults; NO throw', function () {
|
|
247
|
+
let threw = false;
|
|
248
|
+
let out = null;
|
|
249
|
+
try {
|
|
250
|
+
out = assess({
|
|
251
|
+
classification: 'structural_transfer',
|
|
252
|
+
bridge_concept: 'x',
|
|
253
|
+
resolved_authors: [],
|
|
254
|
+
resolved_institutions: [],
|
|
255
|
+
industry_signals_count: 0,
|
|
256
|
+
});
|
|
257
|
+
} catch (e) {
|
|
258
|
+
threw = true;
|
|
259
|
+
}
|
|
260
|
+
assert.equal(threw, false, 'missing breakthrough_score must NOT throw');
|
|
261
|
+
assert.ok(out && typeof out === 'object', 'output must be object');
|
|
262
|
+
assert.equal(typeof out.market_size_estimate, 'string',
|
|
263
|
+
'market_size_estimate must be string under missing-score path');
|
|
264
|
+
assert.ok(out.market_size_estimate.length > 0,
|
|
265
|
+
'market_size_estimate must be non-empty string under missing-score path');
|
|
266
|
+
positiveOutputs.push(out);
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
record('T7 edge case: missing classification -> fallback template; NO throw', function () {
|
|
270
|
+
let threw = false;
|
|
271
|
+
let out = null;
|
|
272
|
+
try {
|
|
273
|
+
out = assess({
|
|
274
|
+
bridge_concept: 'x',
|
|
275
|
+
breakthrough_score: 4,
|
|
276
|
+
resolved_authors: [],
|
|
277
|
+
resolved_institutions: [],
|
|
278
|
+
industry_signals_count: 1,
|
|
279
|
+
});
|
|
280
|
+
} catch (e) {
|
|
281
|
+
threw = true;
|
|
282
|
+
}
|
|
283
|
+
assert.equal(threw, false, 'missing classification must NOT throw');
|
|
284
|
+
assert.ok(out && typeof out === 'object', 'output must be object');
|
|
285
|
+
assert.equal(typeof out.value_proposition, 'string',
|
|
286
|
+
'value_proposition must be string under fallback path');
|
|
287
|
+
assert.ok(out.value_proposition.length > 0,
|
|
288
|
+
'value_proposition must be non-empty under fallback path');
|
|
289
|
+
positiveOutputs.push(out);
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
record('T8 classification table coverage: 3 distinct template stems', function () {
|
|
293
|
+
const outA = assess(FULL_POSITIVE_INPUT); // structural_transfer
|
|
294
|
+
const outB = assess(SEMANTIC_INPUT); // semantic_implementation
|
|
295
|
+
const outC = assess(HYBRID_INPUT); // hybrid
|
|
296
|
+
// The three template stems must be distinct -- pick the first 12 chars
|
|
297
|
+
// (or shorter) so we are comparing template stems rather than fully
|
|
298
|
+
// substituted strings (which can also coincidentally collide if the
|
|
299
|
+
// classifications happened to share a prefix only).
|
|
300
|
+
const stemA = outA.value_proposition.slice(0, 12);
|
|
301
|
+
const stemB = outB.value_proposition.slice(0, 12);
|
|
302
|
+
const stemC = outC.value_proposition.slice(0, 12);
|
|
303
|
+
assert.notEqual(stemA, stemB,
|
|
304
|
+
'structural_transfer and semantic_implementation must produce distinct template stems');
|
|
305
|
+
assert.notEqual(stemB, stemC,
|
|
306
|
+
'semantic_implementation and hybrid must produce distinct template stems');
|
|
307
|
+
assert.notEqual(stemA, stemC,
|
|
308
|
+
'structural_transfer and hybrid must produce distinct template stems');
|
|
309
|
+
positiveOutputs.push(outA, outB, outC);
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
record('T9 Canon Part 8 adversarial -- opts contains forbidden field (meeting fragment)', function () {
|
|
313
|
+
// Per docs/MINDRIAN-CANON.md Part 8 + cross-room-aggregator FORBIDDEN_PATTERNS:
|
|
314
|
+
// /\bmeeting with\b/i is the canon-authoritative meeting fragment regex.
|
|
315
|
+
assertThrowsEgressViolation(function () {
|
|
316
|
+
assess(FULL_POSITIVE_INPUT, { notes: 'After meeting with the board last Tuesday' });
|
|
317
|
+
}, 'rs-commercial-assessor-input');
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
record('T10 Canon Part 8 adversarial -- resolved_authors injects forbidden field', function () {
|
|
321
|
+
const adversarialInput = Object.assign({}, FULL_POSITIVE_INPUT, {
|
|
322
|
+
resolved_authors: [
|
|
323
|
+
{ author_id: 'a1', name: 'Dr. X', institution: 'MIT',
|
|
324
|
+
identity_text: 'meeting with Lawrence about board minutes' },
|
|
325
|
+
],
|
|
326
|
+
});
|
|
327
|
+
assertThrowsEgressViolation(function () {
|
|
328
|
+
assess(adversarialInput);
|
|
329
|
+
}, 'rs-commercial-assessor-input');
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
record('T11 NO LLM CALL invariant: global.fetch shim never invoked', function () {
|
|
333
|
+
// Install global.fetch shim that throws on call. assess() must complete
|
|
334
|
+
// without invoking it. Restore on exit so other tests are unaffected.
|
|
335
|
+
const origFetch = global.fetch;
|
|
336
|
+
let fetchCallCount = 0;
|
|
337
|
+
global.fetch = function () {
|
|
338
|
+
fetchCallCount += 1;
|
|
339
|
+
throw new Error('global.fetch invoked from assess() -- NO LLM invariant violated');
|
|
340
|
+
};
|
|
341
|
+
let out = null;
|
|
342
|
+
try {
|
|
343
|
+
out = assess(FULL_POSITIVE_INPUT);
|
|
344
|
+
} finally {
|
|
345
|
+
global.fetch = origFetch;
|
|
346
|
+
}
|
|
347
|
+
assert.equal(fetchCallCount, 0,
|
|
348
|
+
'global.fetch must NEVER be called from assess(); count=' + fetchCallCount);
|
|
349
|
+
assert.ok(out && typeof out === 'object', 'assess() must complete normally');
|
|
350
|
+
positiveOutputs.push(out);
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
record('T12 A1 sweep: every positive output contains ZERO FORBIDDEN_PATTERNS hits', function () {
|
|
354
|
+
const egress = require('../core/rs-egress-prompts.cjs');
|
|
355
|
+
const FORBIDDEN_PATTERNS = egress.FORBIDDEN_PATTERNS;
|
|
356
|
+
assert.ok(Array.isArray(FORBIDDEN_PATTERNS) && FORBIDDEN_PATTERNS.length >= 6,
|
|
357
|
+
'FORBIDDEN_PATTERNS must be re-exported from rs-egress-prompts (>= 6 patterns)');
|
|
358
|
+
assert.ok(positiveOutputs.length >= 5,
|
|
359
|
+
'A1 sweep requires at least 5 captured positive outputs; got ' + positiveOutputs.length);
|
|
360
|
+
for (let i = 0; i < positiveOutputs.length; i += 1) {
|
|
361
|
+
const json = JSON.stringify(positiveOutputs[i]);
|
|
362
|
+
for (const re of FORBIDDEN_PATTERNS) {
|
|
363
|
+
assert.equal(re.test(json), false,
|
|
364
|
+
'positive output ' + i + ' contains FORBIDDEN_PATTERNS hit '
|
|
365
|
+
+ re.source + ' in JSON: ' + json.slice(0, 200));
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
// ---------- Suite report ----------
|
|
371
|
+
|
|
372
|
+
runAll();
|
|
373
|
+
|
|
374
|
+
const total = passed + failed;
|
|
375
|
+
process.stdout.write('\n');
|
|
376
|
+
if (failed === 0) {
|
|
377
|
+
process.stdout.write('=== 89.5-01 rs-commercial-assessor suite: ' + passed + '/' + total + ' passed ===\n');
|
|
378
|
+
process.exit(0);
|
|
379
|
+
} else {
|
|
380
|
+
process.stdout.write('=== 89.5-01 rs-commercial-assessor suite: ' + passed + '/' + total + ' passed (' + failed + ' failed) ===\n');
|
|
381
|
+
for (const f of failures) {
|
|
382
|
+
process.stdout.write(' FAIL ' + f.name + ': ' + f.message + '\n');
|
|
383
|
+
}
|
|
384
|
+
process.exit(1);
|
|
385
|
+
}
|