@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,511 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Copyright (c) 2026 Mindrian. BSL 1.1.
|
|
6
|
+
* Tests for lib/core/feynman-minto-invariants.cjs (Phase 88-00-B).
|
|
7
|
+
*
|
|
8
|
+
* 21 discrete test cases across 5 violation categories:
|
|
9
|
+
* existence, schema, freshness, coherence, atomicity.
|
|
10
|
+
*
|
|
11
|
+
* Pure node built-ins: fs, os, path, assert. No npm deps.
|
|
12
|
+
* Fixtures are built under fs.mkdtempSync(...) and cleaned up on exit.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const assert = require('node:assert/strict');
|
|
16
|
+
const fs = require('node:fs');
|
|
17
|
+
const os = require('node:os');
|
|
18
|
+
const path = require('node:path');
|
|
19
|
+
|
|
20
|
+
const INVARIANTS_PATH = path.resolve(
|
|
21
|
+
__dirname,
|
|
22
|
+
'..',
|
|
23
|
+
'..',
|
|
24
|
+
'lib',
|
|
25
|
+
'core',
|
|
26
|
+
'feynman-minto-invariants.cjs'
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
const { validate, SEVERITY, CATEGORIES } = require(INVARIANTS_PATH);
|
|
30
|
+
|
|
31
|
+
// ---------- Tmp workspace helpers ----------
|
|
32
|
+
|
|
33
|
+
const TMP_ROOT = fs.mkdtempSync(path.join(os.tmpdir(), 'fm-inv-'));
|
|
34
|
+
|
|
35
|
+
function tmpFile(name, body) {
|
|
36
|
+
const p = path.join(TMP_ROOT, name);
|
|
37
|
+
fs.writeFileSync(p, body, 'utf8');
|
|
38
|
+
return p;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function cleanup() {
|
|
42
|
+
try {
|
|
43
|
+
fs.rmSync(TMP_ROOT, { recursive: true, force: true });
|
|
44
|
+
} catch (_) {
|
|
45
|
+
/* best effort */
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
process.on('exit', cleanup);
|
|
49
|
+
|
|
50
|
+
// ---------- Valid Feynman-MINTO fixture (~70 line realistic sample) ----------
|
|
51
|
+
// This fixture is the "golden" per Phase 81 R-3 schema + Phase 88 extensions.
|
|
52
|
+
// Every negative test below mutates a copy of this to trigger one violation.
|
|
53
|
+
|
|
54
|
+
const NOW_ISO = new Date().toISOString();
|
|
55
|
+
const HOUR_AGO_ISO = new Date(Date.now() - 60 * 60 * 1000).toISOString();
|
|
56
|
+
const TWO_HOURS_AGO_ISO = new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString();
|
|
57
|
+
|
|
58
|
+
const VALID_MINTO = [
|
|
59
|
+
'---',
|
|
60
|
+
'schema_version: "1.0"',
|
|
61
|
+
'generated_at: "' + NOW_ISO + '"',
|
|
62
|
+
'section: "problem-definition"',
|
|
63
|
+
'section_path: "room/problem-definition"',
|
|
64
|
+
'governing_thought: "The venture reduces time between insight and validated decision across every dimension simultaneously."',
|
|
65
|
+
'key_claims:',
|
|
66
|
+
' - "Every artifact becomes a checkable claim."',
|
|
67
|
+
' - "Cross-section scans find contradictions before humans notice."',
|
|
68
|
+
' - "Decisions with reasons become training data."',
|
|
69
|
+
'mece_arguments:',
|
|
70
|
+
' - "Primary evidence shows compression works"',
|
|
71
|
+
' - "Supporting evidence shows cascade is observable"',
|
|
72
|
+
'cross_refs:',
|
|
73
|
+
' - "[[market-analysis/tam]]"',
|
|
74
|
+
' - "[[competitive-analysis/first-mover]]"',
|
|
75
|
+
'sources:',
|
|
76
|
+
' - "artifact-01.md"',
|
|
77
|
+
' - "artifact-02.md"',
|
|
78
|
+
'navigation: "ROOM.md"',
|
|
79
|
+
'tier: 1',
|
|
80
|
+
'last_generated_at: "' + NOW_ISO + '"',
|
|
81
|
+
'last_artifact_write_seen_at: "' + HOUR_AGO_ISO + '"',
|
|
82
|
+
'reasoning_health_score: 0.82',
|
|
83
|
+
'flagged_weaknesses:',
|
|
84
|
+
' - "TAM benchmark is 18 months old"',
|
|
85
|
+
'decision_log:',
|
|
86
|
+
' - session_id: "sess-2026-04-17"',
|
|
87
|
+
' timestamp: "' + HOUR_AGO_ISO + '"',
|
|
88
|
+
' action: "flag-tam-staleness"',
|
|
89
|
+
' user_response: "defer"',
|
|
90
|
+
' reason: "reviewing with advisor"',
|
|
91
|
+
' outcome: "deferred"',
|
|
92
|
+
'---',
|
|
93
|
+
'',
|
|
94
|
+
'## Essence',
|
|
95
|
+
'Folders are reasoning, artifacts are claims, graphs are intelligence.',
|
|
96
|
+
'',
|
|
97
|
+
'## Plain Language',
|
|
98
|
+
'Founders waste weeks turning insight into confirmed decisions. This tool collapses the loop to hours by filing, scanning, and surfacing contradictions automatically.',
|
|
99
|
+
'',
|
|
100
|
+
'## Mental Model',
|
|
101
|
+
'It is like an air traffic control tower for the venture. Each artifact is an incoming aircraft. Each section is a runway. The cross-relationship scan is radar that spots collisions.',
|
|
102
|
+
'',
|
|
103
|
+
'## Sweet Spot',
|
|
104
|
+
'The folder structure IS the reasoning. Filing an artifact is a claim. Claims connect across sections as a graph. When the graph finds a contradiction you did not see, the venture is better for it.',
|
|
105
|
+
'',
|
|
106
|
+
].join('\n');
|
|
107
|
+
|
|
108
|
+
// Convenience: produce a mutated copy of VALID_MINTO with a frontmatter key
|
|
109
|
+
// line replaced, removed, or inserted.
|
|
110
|
+
|
|
111
|
+
function withFrontmatterReplace(line, replacement) {
|
|
112
|
+
return VALID_MINTO.replace(line, replacement);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function withFrontmatterDelete(line) {
|
|
116
|
+
return VALID_MINTO.replace(line + '\n', '');
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// ---------- Tests ----------
|
|
120
|
+
|
|
121
|
+
let passed = 0;
|
|
122
|
+
let failed = 0;
|
|
123
|
+
function run(name, fn) {
|
|
124
|
+
try {
|
|
125
|
+
fn();
|
|
126
|
+
passed += 1;
|
|
127
|
+
process.stdout.write(' ok ' + name + '\n');
|
|
128
|
+
} catch (err) {
|
|
129
|
+
failed += 1;
|
|
130
|
+
process.stderr.write(' FAIL ' + name + '\n');
|
|
131
|
+
process.stderr.write(' ' + (err && err.message ? err.message : err) + '\n');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// 1. Valid fixture: no violations.
|
|
136
|
+
run('Test 1: valid fixture returns {valid:true, violations:[], severity:null}', function () {
|
|
137
|
+
const p = tmpFile('valid-minto.md', VALID_MINTO);
|
|
138
|
+
const r = validate(p);
|
|
139
|
+
assert.equal(r.valid, true);
|
|
140
|
+
assert.deepEqual(r.violations, []);
|
|
141
|
+
assert.equal(r.severity, null);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
// 2. Missing file: existence / critical.
|
|
145
|
+
run('Test 2: missing file -> existence/critical', function () {
|
|
146
|
+
const r = validate(path.join(TMP_ROOT, 'does-not-exist.md'));
|
|
147
|
+
assert.equal(r.valid, false);
|
|
148
|
+
assert.ok(
|
|
149
|
+
r.violations.some(function (v) {
|
|
150
|
+
return (
|
|
151
|
+
v.category === CATEGORIES.EXISTENCE &&
|
|
152
|
+
v.severity === SEVERITY.CRITICAL &&
|
|
153
|
+
/not found|does not exist|missing/i.test(v.message)
|
|
154
|
+
);
|
|
155
|
+
})
|
|
156
|
+
);
|
|
157
|
+
assert.equal(r.severity, SEVERITY.CRITICAL);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
// 3. Empty file (zero bytes): existence / critical.
|
|
161
|
+
run('Test 3: empty file -> existence/critical', function () {
|
|
162
|
+
const p = tmpFile('empty.md', '');
|
|
163
|
+
const r = validate(p);
|
|
164
|
+
assert.equal(r.valid, false);
|
|
165
|
+
assert.ok(
|
|
166
|
+
r.violations.some(function (v) {
|
|
167
|
+
return v.category === CATEGORIES.EXISTENCE && v.severity === SEVERITY.CRITICAL;
|
|
168
|
+
})
|
|
169
|
+
);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// 4. No frontmatter delimiters: schema / error.
|
|
173
|
+
run('Test 4: no frontmatter delimiters -> schema/error', function () {
|
|
174
|
+
const p = tmpFile('no-fm.md', '# Just a markdown body\n\nNo frontmatter here.\n');
|
|
175
|
+
const r = validate(p);
|
|
176
|
+
assert.equal(r.valid, false);
|
|
177
|
+
assert.ok(
|
|
178
|
+
r.violations.some(function (v) {
|
|
179
|
+
return v.category === CATEGORIES.SCHEMA && v.severity === SEVERITY.ERROR;
|
|
180
|
+
})
|
|
181
|
+
);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
// 5. Malformed YAML frontmatter: schema / error.
|
|
185
|
+
run('Test 5: malformed YAML frontmatter -> schema/error', function () {
|
|
186
|
+
// Truly broken: unclosed quote on the governing_thought line, which our
|
|
187
|
+
// hand-parser cannot recover into a scalar.
|
|
188
|
+
const body = [
|
|
189
|
+
'---',
|
|
190
|
+
'schema_version: "1.0"',
|
|
191
|
+
'governing_thought: "unterminated string',
|
|
192
|
+
'section: "problem-definition"',
|
|
193
|
+
'---',
|
|
194
|
+
'',
|
|
195
|
+
'## Essence',
|
|
196
|
+
'Body.',
|
|
197
|
+
].join('\n');
|
|
198
|
+
const p = tmpFile('bad-yaml.md', body);
|
|
199
|
+
const r = validate(p);
|
|
200
|
+
assert.equal(r.valid, false);
|
|
201
|
+
assert.ok(
|
|
202
|
+
r.violations.some(function (v) {
|
|
203
|
+
return v.category === CATEGORIES.SCHEMA && v.severity === SEVERITY.ERROR;
|
|
204
|
+
})
|
|
205
|
+
);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
// 6. Missing governing_thought: schema / error.
|
|
209
|
+
run('Test 6: missing governing_thought -> schema/error', function () {
|
|
210
|
+
const mutated = withFrontmatterDelete(
|
|
211
|
+
'governing_thought: "The venture reduces time between insight and validated decision across every dimension simultaneously."'
|
|
212
|
+
);
|
|
213
|
+
const p = tmpFile('no-gt.md', mutated);
|
|
214
|
+
const r = validate(p);
|
|
215
|
+
assert.equal(r.valid, false);
|
|
216
|
+
assert.ok(
|
|
217
|
+
r.violations.some(function (v) {
|
|
218
|
+
return (
|
|
219
|
+
v.category === CATEGORIES.SCHEMA &&
|
|
220
|
+
v.severity === SEVERITY.ERROR &&
|
|
221
|
+
/governing_thought/.test(v.message)
|
|
222
|
+
);
|
|
223
|
+
})
|
|
224
|
+
);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// 7. Missing schema_version: schema / error.
|
|
228
|
+
run('Test 7: missing schema_version -> schema/error', function () {
|
|
229
|
+
const mutated = withFrontmatterDelete('schema_version: "1.0"');
|
|
230
|
+
const p = tmpFile('no-sv.md', mutated);
|
|
231
|
+
const r = validate(p);
|
|
232
|
+
assert.equal(r.valid, false);
|
|
233
|
+
assert.ok(
|
|
234
|
+
r.violations.some(function (v) {
|
|
235
|
+
return (
|
|
236
|
+
v.category === CATEGORIES.SCHEMA &&
|
|
237
|
+
v.severity === SEVERITY.ERROR &&
|
|
238
|
+
/schema_version/.test(v.message)
|
|
239
|
+
);
|
|
240
|
+
})
|
|
241
|
+
);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
// 8. Narrative body > 1500 token estimate (FEYNMINTO-01): schema / error.
|
|
245
|
+
run('Test 8: body token budget > 1500 -> schema/error', function () {
|
|
246
|
+
// 1500 tokens * 4 bytes/token = 6000 bytes budget. Blow past that.
|
|
247
|
+
const bigBody = 'x '.repeat(4000); // 8000 chars -> ~2000 token estimate
|
|
248
|
+
const body = VALID_MINTO + '\n\n## Bloat\n' + bigBody + '\n';
|
|
249
|
+
const p = tmpFile('bloated.md', body);
|
|
250
|
+
const r = validate(p);
|
|
251
|
+
assert.equal(r.valid, false);
|
|
252
|
+
assert.ok(
|
|
253
|
+
r.violations.some(function (v) {
|
|
254
|
+
return (
|
|
255
|
+
v.category === CATEGORIES.SCHEMA &&
|
|
256
|
+
v.severity === SEVERITY.ERROR &&
|
|
257
|
+
/token budget/i.test(v.message)
|
|
258
|
+
);
|
|
259
|
+
})
|
|
260
|
+
);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
// 9. Missing last_generated_at: freshness / warning (backfill case, not critical).
|
|
264
|
+
run('Test 9: missing last_generated_at -> freshness/warning', function () {
|
|
265
|
+
const mutated = withFrontmatterDelete('last_generated_at: "' + NOW_ISO + '"');
|
|
266
|
+
const p = tmpFile('no-lga.md', mutated);
|
|
267
|
+
const r = validate(p);
|
|
268
|
+
// Must have a freshness/warning violation. (May also flag other things;
|
|
269
|
+
// we only assert presence of the freshness one.)
|
|
270
|
+
assert.ok(
|
|
271
|
+
r.violations.some(function (v) {
|
|
272
|
+
return v.category === CATEGORIES.FRESHNESS && v.severity === SEVERITY.WARNING;
|
|
273
|
+
})
|
|
274
|
+
);
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
// 10. last_generated_at older than last_artifact_write_seen_at by > 1 hour:
|
|
278
|
+
// freshness / warning with "stale" in message.
|
|
279
|
+
run('Test 10: stale (generated before write + >1h) -> freshness/warning', function () {
|
|
280
|
+
const mutated = VALID_MINTO
|
|
281
|
+
.replace('last_generated_at: "' + NOW_ISO + '"', 'last_generated_at: "' + TWO_HOURS_AGO_ISO + '"')
|
|
282
|
+
.replace('last_artifact_write_seen_at: "' + HOUR_AGO_ISO + '"', 'last_artifact_write_seen_at: "' + NOW_ISO + '"');
|
|
283
|
+
const p = tmpFile('stale.md', mutated);
|
|
284
|
+
const r = validate(p);
|
|
285
|
+
assert.equal(r.valid, false);
|
|
286
|
+
assert.ok(
|
|
287
|
+
r.violations.some(function (v) {
|
|
288
|
+
return (
|
|
289
|
+
v.category === CATEGORIES.FRESHNESS &&
|
|
290
|
+
v.severity === SEVERITY.WARNING &&
|
|
291
|
+
/stale/i.test(v.message)
|
|
292
|
+
);
|
|
293
|
+
})
|
|
294
|
+
);
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
// 11. last_artifact_write_seen_at in the future (> now + 60s): freshness / warning.
|
|
298
|
+
run('Test 11: future write timestamp -> freshness/warning', function () {
|
|
299
|
+
const future = new Date(Date.now() + 5 * 60 * 1000).toISOString(); // +5 min
|
|
300
|
+
const mutated = VALID_MINTO.replace(
|
|
301
|
+
'last_artifact_write_seen_at: "' + HOUR_AGO_ISO + '"',
|
|
302
|
+
'last_artifact_write_seen_at: "' + future + '"'
|
|
303
|
+
);
|
|
304
|
+
const p = tmpFile('future.md', mutated);
|
|
305
|
+
const r = validate(p);
|
|
306
|
+
assert.ok(
|
|
307
|
+
r.violations.some(function (v) {
|
|
308
|
+
return v.category === CATEGORIES.FRESHNESS && v.severity === SEVERITY.WARNING;
|
|
309
|
+
})
|
|
310
|
+
);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// 12. decision_log entry missing session_id: schema / error.
|
|
314
|
+
run('Test 12: decision_log entry missing session_id -> schema/error', function () {
|
|
315
|
+
const mutated = VALID_MINTO.replace(
|
|
316
|
+
' - session_id: "sess-2026-04-17"\n',
|
|
317
|
+
' - '
|
|
318
|
+
);
|
|
319
|
+
const p = tmpFile('dl-no-sid.md', mutated);
|
|
320
|
+
const r = validate(p);
|
|
321
|
+
assert.equal(r.valid, false);
|
|
322
|
+
assert.ok(
|
|
323
|
+
r.violations.some(function (v) {
|
|
324
|
+
return (
|
|
325
|
+
v.category === CATEGORIES.SCHEMA &&
|
|
326
|
+
v.severity === SEVERITY.ERROR &&
|
|
327
|
+
/session_id/.test(v.message)
|
|
328
|
+
);
|
|
329
|
+
})
|
|
330
|
+
);
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
// 13. decision_log length > 20: schema / warning.
|
|
334
|
+
run('Test 13: decision_log > 20 entries -> schema/warning', function () {
|
|
335
|
+
// Build a big decision_log block (21 entries).
|
|
336
|
+
const entries = [];
|
|
337
|
+
for (let i = 0; i < 21; i++) {
|
|
338
|
+
entries.push(' - session_id: "sess-' + i + '"');
|
|
339
|
+
entries.push(' timestamp: "' + HOUR_AGO_ISO + '"');
|
|
340
|
+
entries.push(' action: "probe-' + i + '"');
|
|
341
|
+
entries.push(' user_response: "approve"');
|
|
342
|
+
entries.push(' reason: "ok"');
|
|
343
|
+
entries.push(' outcome: "applied"');
|
|
344
|
+
}
|
|
345
|
+
// Replace the original single-entry decision_log block.
|
|
346
|
+
const beforeDL = VALID_MINTO.indexOf('decision_log:');
|
|
347
|
+
const afterDL = VALID_MINTO.indexOf('---', beforeDL);
|
|
348
|
+
const mutated =
|
|
349
|
+
VALID_MINTO.slice(0, beforeDL) +
|
|
350
|
+
'decision_log:\n' +
|
|
351
|
+
entries.join('\n') +
|
|
352
|
+
'\n' +
|
|
353
|
+
VALID_MINTO.slice(afterDL);
|
|
354
|
+
const p = tmpFile('dl-over-cap.md', mutated);
|
|
355
|
+
const r = validate(p);
|
|
356
|
+
assert.ok(
|
|
357
|
+
r.violations.some(function (v) {
|
|
358
|
+
return (
|
|
359
|
+
v.category === CATEGORIES.SCHEMA &&
|
|
360
|
+
v.severity === SEVERITY.WARNING &&
|
|
361
|
+
/decision_log/.test(v.message)
|
|
362
|
+
);
|
|
363
|
+
})
|
|
364
|
+
);
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
// 14. decision_log entry user_response not in [approve, reject, defer]: schema / error.
|
|
368
|
+
run('Test 14: decision_log user_response invalid -> schema/error', function () {
|
|
369
|
+
const mutated = VALID_MINTO.replace(
|
|
370
|
+
' user_response: "defer"',
|
|
371
|
+
' user_response: "maybe"'
|
|
372
|
+
);
|
|
373
|
+
const p = tmpFile('dl-bad-resp.md', mutated);
|
|
374
|
+
const r = validate(p);
|
|
375
|
+
assert.equal(r.valid, false);
|
|
376
|
+
assert.ok(
|
|
377
|
+
r.violations.some(function (v) {
|
|
378
|
+
return (
|
|
379
|
+
v.category === CATEGORIES.SCHEMA &&
|
|
380
|
+
v.severity === SEVERITY.ERROR &&
|
|
381
|
+
/user_response/.test(v.message)
|
|
382
|
+
);
|
|
383
|
+
})
|
|
384
|
+
);
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
// 15. em-dash in narrative body: coherence / warning (project hard rule).
|
|
388
|
+
run('Test 15: em-dash in narrative -> coherence/warning', function () {
|
|
389
|
+
// Inject a U+2014 em-dash into the Essence paragraph.
|
|
390
|
+
const mutated = VALID_MINTO.replace(
|
|
391
|
+
'Folders are reasoning, artifacts are claims, graphs are intelligence.',
|
|
392
|
+
'Folders are reasoning \u2014 artifacts are claims, graphs are intelligence.'
|
|
393
|
+
);
|
|
394
|
+
const p = tmpFile('emdash.md', mutated);
|
|
395
|
+
const r = validate(p);
|
|
396
|
+
assert.ok(
|
|
397
|
+
r.violations.some(function (v) {
|
|
398
|
+
return v.category === CATEGORIES.COHERENCE && v.severity === SEVERITY.WARNING;
|
|
399
|
+
})
|
|
400
|
+
);
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
// 16. reasoning_health_score out of [0,1]: schema / error.
|
|
404
|
+
run('Test 16: reasoning_health_score out of range -> schema/error', function () {
|
|
405
|
+
const mutated = VALID_MINTO.replace(
|
|
406
|
+
'reasoning_health_score: 0.82',
|
|
407
|
+
'reasoning_health_score: 1.7'
|
|
408
|
+
);
|
|
409
|
+
const p = tmpFile('rhs-bad.md', mutated);
|
|
410
|
+
const r = validate(p);
|
|
411
|
+
assert.equal(r.valid, false);
|
|
412
|
+
assert.ok(
|
|
413
|
+
r.violations.some(function (v) {
|
|
414
|
+
return (
|
|
415
|
+
v.category === CATEGORIES.SCHEMA &&
|
|
416
|
+
v.severity === SEVERITY.ERROR &&
|
|
417
|
+
/reasoning_health_score/.test(v.message)
|
|
418
|
+
);
|
|
419
|
+
})
|
|
420
|
+
);
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
// 17. File size > 50 KB: atomicity / warning (bloat guard).
|
|
424
|
+
run('Test 17: file > 50KB -> atomicity/warning', function () {
|
|
425
|
+
const filler = '\n## Filler\n' + 'z '.repeat(30000) + '\n'; // ~60 KB body pad
|
|
426
|
+
const body = VALID_MINTO + filler;
|
|
427
|
+
const p = tmpFile('fat.md', body);
|
|
428
|
+
const r = validate(p);
|
|
429
|
+
assert.ok(
|
|
430
|
+
r.violations.some(function (v) {
|
|
431
|
+
return v.category === CATEGORIES.ATOMICITY && v.severity === SEVERITY.WARNING;
|
|
432
|
+
})
|
|
433
|
+
);
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
// 18. Orphan .tmp marker (# FEYNMINTO_TMP): atomicity / critical (mid-write crash).
|
|
437
|
+
run('Test 18: FEYNMINTO_TMP marker -> atomicity/critical', function () {
|
|
438
|
+
const body = '# FEYNMINTO_TMP\n' + VALID_MINTO;
|
|
439
|
+
const p = tmpFile('orphan-tmp.md', body);
|
|
440
|
+
const r = validate(p);
|
|
441
|
+
assert.equal(r.valid, false);
|
|
442
|
+
assert.ok(
|
|
443
|
+
r.violations.some(function (v) {
|
|
444
|
+
return v.category === CATEGORIES.ATOMICITY && v.severity === SEVERITY.CRITICAL;
|
|
445
|
+
})
|
|
446
|
+
);
|
|
447
|
+
assert.equal(r.severity, SEVERITY.CRITICAL);
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
// 19. cross_refs entry with non-wikilink syntax: coherence / warning.
|
|
451
|
+
run('Test 19: cross_refs non-wikilink -> coherence/warning', function () {
|
|
452
|
+
const mutated = VALID_MINTO.replace(
|
|
453
|
+
' - "[[market-analysis/tam]]"',
|
|
454
|
+
' - "http://example.com/market"'
|
|
455
|
+
);
|
|
456
|
+
const p = tmpFile('xref-bad.md', mutated);
|
|
457
|
+
const r = validate(p);
|
|
458
|
+
assert.ok(
|
|
459
|
+
r.violations.some(function (v) {
|
|
460
|
+
return v.category === CATEGORIES.COHERENCE && v.severity === SEVERITY.WARNING;
|
|
461
|
+
})
|
|
462
|
+
);
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
// 20. Severity aggregation: MAX across violations (critical > error > warning > info).
|
|
466
|
+
run('Test 20: severity aggregation returns MAX across violations', function () {
|
|
467
|
+
// Produce a file with BOTH a warning (em-dash) AND a critical (tmp marker).
|
|
468
|
+
const mutated =
|
|
469
|
+
'# FEYNMINTO_TMP\n' +
|
|
470
|
+
VALID_MINTO.replace(
|
|
471
|
+
'Folders are reasoning, artifacts are claims, graphs are intelligence.',
|
|
472
|
+
'Folders are reasoning \u2014 artifacts are claims, graphs are intelligence.'
|
|
473
|
+
);
|
|
474
|
+
const p = tmpFile('agg.md', mutated);
|
|
475
|
+
const r = validate(p);
|
|
476
|
+
assert.equal(r.severity, SEVERITY.CRITICAL);
|
|
477
|
+
|
|
478
|
+
// Warning-only should NOT bubble up to critical.
|
|
479
|
+
const onlyWarning = VALID_MINTO.replace(
|
|
480
|
+
'Folders are reasoning, artifacts are claims, graphs are intelligence.',
|
|
481
|
+
'Folders are reasoning \u2014 artifacts are claims, graphs are intelligence.'
|
|
482
|
+
);
|
|
483
|
+
const p2 = tmpFile('warn-only.md', onlyWarning);
|
|
484
|
+
const r2 = validate(p2);
|
|
485
|
+
assert.equal(r2.severity, SEVERITY.WARNING);
|
|
486
|
+
});
|
|
487
|
+
|
|
488
|
+
// 21. Exports SEVERITY and CATEGORIES as frozen objects.
|
|
489
|
+
run('Test 21: exports SEVERITY and CATEGORIES constants', function () {
|
|
490
|
+
assert.equal(typeof SEVERITY, 'object');
|
|
491
|
+
assert.equal(typeof CATEGORIES, 'object');
|
|
492
|
+
assert.equal(SEVERITY.CRITICAL, 'critical');
|
|
493
|
+
assert.equal(SEVERITY.ERROR, 'error');
|
|
494
|
+
assert.equal(SEVERITY.WARNING, 'warning');
|
|
495
|
+
assert.equal(SEVERITY.INFO, 'info');
|
|
496
|
+
assert.equal(CATEGORIES.EXISTENCE, 'existence');
|
|
497
|
+
assert.equal(CATEGORIES.SCHEMA, 'schema');
|
|
498
|
+
assert.equal(CATEGORIES.FRESHNESS, 'freshness');
|
|
499
|
+
assert.equal(CATEGORIES.COHERENCE, 'coherence');
|
|
500
|
+
assert.equal(CATEGORIES.ATOMICITY, 'atomicity');
|
|
501
|
+
// Frozen: cannot mutate.
|
|
502
|
+
assert.equal(Object.isFrozen(SEVERITY), true);
|
|
503
|
+
assert.equal(Object.isFrozen(CATEGORIES), true);
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
// ---------- Summary ----------
|
|
507
|
+
|
|
508
|
+
process.stdout.write(
|
|
509
|
+
'\nfeynman-minto-invariants: ' + passed + ' passed, ' + failed + ' failed\n'
|
|
510
|
+
);
|
|
511
|
+
process.exit(failed === 0 ? 0 : 1);
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Phase 81-02: Drift-check test for Feynman prompt constants.
|
|
6
|
+
*
|
|
7
|
+
* The four prompt templates in lib/memory/feynman-prompts.cjs are ALSO
|
|
8
|
+
* inlined verbatim into commands/mos-reason.md between named HTML comment
|
|
9
|
+
* sentinels. This test enforces byte equality between the two copies so
|
|
10
|
+
* the slash command body never silently drifts from the library source
|
|
11
|
+
* of truth.
|
|
12
|
+
*
|
|
13
|
+
* Extraction strategy: the slash command body wraps each prompt between
|
|
14
|
+
* sentinels of the form
|
|
15
|
+
*
|
|
16
|
+
* <!-- STAGE_1_ESSENCE start -->
|
|
17
|
+
* <prompt body>
|
|
18
|
+
* <!-- STAGE_1_ESSENCE end -->
|
|
19
|
+
*
|
|
20
|
+
* We locate the start and end markers, slice, trim one leading and one
|
|
21
|
+
* trailing newline (the markers sit on their own lines), and compare
|
|
22
|
+
* character-for-character against the constant exported from
|
|
23
|
+
* feynman-prompts.cjs.
|
|
24
|
+
*
|
|
25
|
+
* If an edit is made to either copy without matching the other, this
|
|
26
|
+
* test fails with a character-index diff report.
|
|
27
|
+
*
|
|
28
|
+
* Run via:
|
|
29
|
+
* node lib/memory/feynman-prompts-drift.test.cjs
|
|
30
|
+
*
|
|
31
|
+
* Registered in lib/memory/run-feynman-tests.cjs.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
const assert = require('node:assert');
|
|
35
|
+
const fs = require('node:fs');
|
|
36
|
+
const path = require('node:path');
|
|
37
|
+
|
|
38
|
+
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
39
|
+
const MOS_REASON_PATH = path.join(REPO_ROOT, 'commands', 'mos-reason.md');
|
|
40
|
+
const prompts = require('./feynman-prompts.cjs');
|
|
41
|
+
|
|
42
|
+
const PAIRS = [
|
|
43
|
+
{ name: 'STAGE_1_ESSENCE', library: prompts.STAGE_1_ESSENCE },
|
|
44
|
+
{ name: 'STAGE_2_PLAIN_LANGUAGE', library: prompts.STAGE_2_PLAIN_LANGUAGE },
|
|
45
|
+
{ name: 'STAGE_4_MENTAL_MODEL', library: prompts.STAGE_4_MENTAL_MODEL },
|
|
46
|
+
{ name: 'STAGE_5_SWEET_SPOT', library: prompts.STAGE_5_SWEET_SPOT },
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
function extractInlinedPrompt(body, name) {
|
|
50
|
+
const startMarker = '<!-- ' + name + ' start -->';
|
|
51
|
+
const endMarker = '<!-- ' + name + ' end -->';
|
|
52
|
+
const startIdx = body.indexOf(startMarker);
|
|
53
|
+
const endIdx = body.indexOf(endMarker);
|
|
54
|
+
if (startIdx === -1 || endIdx === -1) {
|
|
55
|
+
throw new Error(
|
|
56
|
+
'missing sentinel for ' + name + ' in commands/mos-reason.md'
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
if (endIdx < startIdx) {
|
|
60
|
+
throw new Error('sentinel order inverted for ' + name);
|
|
61
|
+
}
|
|
62
|
+
let slice = body.slice(startIdx + startMarker.length, endIdx);
|
|
63
|
+
// Strip one leading newline and one trailing newline; the markers sit
|
|
64
|
+
// on their own lines so the slice always begins and ends with \n.
|
|
65
|
+
if (slice.startsWith('\n')) slice = slice.slice(1);
|
|
66
|
+
if (slice.endsWith('\n')) slice = slice.slice(0, -1);
|
|
67
|
+
return slice;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function firstDiffIndex(a, b) {
|
|
71
|
+
const n = Math.min(a.length, b.length);
|
|
72
|
+
for (let i = 0; i < n; i++) {
|
|
73
|
+
if (a.charCodeAt(i) !== b.charCodeAt(i)) return i;
|
|
74
|
+
}
|
|
75
|
+
if (a.length !== b.length) return n;
|
|
76
|
+
return -1;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function reportDiff(name, inlined, library) {
|
|
80
|
+
const i = firstDiffIndex(inlined, library);
|
|
81
|
+
const ctxStart = Math.max(0, i - 20);
|
|
82
|
+
const ctxEnd = Math.min(Math.max(inlined.length, library.length), i + 40);
|
|
83
|
+
return (
|
|
84
|
+
name +
|
|
85
|
+
' drift at char ' +
|
|
86
|
+
i +
|
|
87
|
+
'\n inlined[' +
|
|
88
|
+
ctxStart +
|
|
89
|
+
':' +
|
|
90
|
+
ctxEnd +
|
|
91
|
+
'] = ' +
|
|
92
|
+
JSON.stringify(inlined.slice(ctxStart, ctxEnd)) +
|
|
93
|
+
'\n library[' +
|
|
94
|
+
ctxStart +
|
|
95
|
+
':' +
|
|
96
|
+
ctxEnd +
|
|
97
|
+
'] = ' +
|
|
98
|
+
JSON.stringify(library.slice(ctxStart, ctxEnd)) +
|
|
99
|
+
'\n inlined.length = ' +
|
|
100
|
+
inlined.length +
|
|
101
|
+
', library.length = ' +
|
|
102
|
+
library.length
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function run() {
|
|
107
|
+
const body = fs.readFileSync(MOS_REASON_PATH, 'utf-8');
|
|
108
|
+
let passed = 0;
|
|
109
|
+
for (const pair of PAIRS) {
|
|
110
|
+
const inlined = extractInlinedPrompt(body, pair.name);
|
|
111
|
+
if (inlined !== pair.library) {
|
|
112
|
+
throw new Error(reportDiff(pair.name, inlined, pair.library));
|
|
113
|
+
}
|
|
114
|
+
// Sanity: library prompt should be non-trivially long.
|
|
115
|
+
assert.ok(
|
|
116
|
+
pair.library.length > 200,
|
|
117
|
+
pair.name + ' library constant suspiciously short'
|
|
118
|
+
);
|
|
119
|
+
passed += 1;
|
|
120
|
+
}
|
|
121
|
+
// Additional guard: the slash command body must contain zero em/en dashes.
|
|
122
|
+
for (let i = 0; i < body.length; i++) {
|
|
123
|
+
const cp = body.codePointAt(i);
|
|
124
|
+
assert.ok(
|
|
125
|
+
cp !== 8212 && cp !== 8211,
|
|
126
|
+
'commands/mos-reason.md contains forbidden dash at char ' + i
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
process.stdout.write(
|
|
130
|
+
'feynman-prompts-drift.test.cjs: ' +
|
|
131
|
+
passed +
|
|
132
|
+
'/' +
|
|
133
|
+
PAIRS.length +
|
|
134
|
+
' prompts match library + no dashes in slash command body\n'
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
try {
|
|
139
|
+
run();
|
|
140
|
+
process.exit(0);
|
|
141
|
+
} catch (e) {
|
|
142
|
+
process.stderr.write('FAIL feynman-prompts-drift: ' + e.message + '\n');
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|