@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,334 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Phase 115-02 -- dual-path-detector unit tests (16 fixtures)
|
|
5
|
+
*
|
|
6
|
+
* Test map:
|
|
7
|
+
* F-00 null-guard
|
|
8
|
+
* F-01..F-05 PURE TYPE PATH (5 fixtures)
|
|
9
|
+
* F-06..F-10 PURE UPLOAD PATH (5 fixtures)
|
|
10
|
+
* F-11..F-15 AMBIGUOUS / FALSE-POSITIVE GUARDS (5 fixtures; F-11/F-12/F-13 are Pitfall 3 mitigation)
|
|
11
|
+
*
|
|
12
|
+
* Each fixture asserts path classification + score + the three boolean features.
|
|
13
|
+
* Suite passes when 16/16 PASS.
|
|
14
|
+
*
|
|
15
|
+
* Threshold contract (RESEARCH DISCRETION-03 verbatim):
|
|
16
|
+
* score >= +3 -> 'upload'
|
|
17
|
+
* score <= -3 -> 'type'
|
|
18
|
+
* else -> 'ambiguous'
|
|
19
|
+
*
|
|
20
|
+
* Score features:
|
|
21
|
+
* F1 word_count: < 80 -> -2; > 300 -> +2; 80..300 -> 0
|
|
22
|
+
* F2 newline_density: > 0.10 -> +2; < 0.05 -> -1; 0.05..0.10 -> 0
|
|
23
|
+
* F3 SECTION_HEADER match -> +3
|
|
24
|
+
* F4 DOMAIN_MARKER match -> +2
|
|
25
|
+
* F5 STUCK_LANGUAGE match -> -3 (NEGATIVE WEIGHT, Pitfall 3 safety net)
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
const assert = require('node:assert/strict');
|
|
29
|
+
const path = require('node:path');
|
|
30
|
+
|
|
31
|
+
const MODULE_PATH = path.resolve(__dirname, 'dual-path-detector.cjs');
|
|
32
|
+
|
|
33
|
+
let passed = 0;
|
|
34
|
+
let failed = 0;
|
|
35
|
+
function run(name, fn) {
|
|
36
|
+
try {
|
|
37
|
+
fn();
|
|
38
|
+
process.stdout.write('ok ' + name + '\n');
|
|
39
|
+
passed += 1;
|
|
40
|
+
} catch (err) {
|
|
41
|
+
process.stderr.write('FAIL ' + name + '\n' + (err && err.stack ? err.stack : String(err)) + '\n');
|
|
42
|
+
failed += 1;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const { classify } = require(MODULE_PATH);
|
|
47
|
+
|
|
48
|
+
// ---------- F-00 null-guard ----------
|
|
49
|
+
|
|
50
|
+
run('F-00 null input -> ambiguous score 0', () => {
|
|
51
|
+
const r = classify(null);
|
|
52
|
+
assert.equal(r.path, 'ambiguous');
|
|
53
|
+
assert.equal(r.score, 0);
|
|
54
|
+
assert.deepEqual(r.features, {});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
run('F-00b empty string -> ambiguous score 0', () => {
|
|
58
|
+
const r = classify('');
|
|
59
|
+
assert.equal(r.path, 'ambiguous');
|
|
60
|
+
assert.equal(r.score, 0);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
run('F-00c non-string number -> ambiguous score 0', () => {
|
|
64
|
+
const r = classify(42);
|
|
65
|
+
assert.equal(r.path, 'ambiguous');
|
|
66
|
+
assert.equal(r.score, 0);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// ---------- F-01..F-05 PURE TYPE PATH ----------
|
|
70
|
+
|
|
71
|
+
run('F-01 short prose with stuck-language -> type', () => {
|
|
72
|
+
const text = "I'm stuck on whether to raise now or later, and honestly I don't know what's blocking me.";
|
|
73
|
+
const r = classify(text);
|
|
74
|
+
// word_count ~17 -> -2, density 0 -> -1, stuck_language -> -3 = -6
|
|
75
|
+
assert.equal(r.features.stuck_language, true);
|
|
76
|
+
assert.equal(r.features.section_header, false);
|
|
77
|
+
assert.equal(r.features.domain_marker, false);
|
|
78
|
+
assert.ok(r.score <= -3, 'score should be <= -3, got ' + r.score);
|
|
79
|
+
assert.equal(r.path, 'type');
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
run('F-02 medium prose 200 words with stuck-language anchors -> type', () => {
|
|
83
|
+
// ~200 words conversational, with stuck-language and low newline density.
|
|
84
|
+
// NOTE: must avoid words containing "lp" (helps the case-insensitive LP\b match)
|
|
85
|
+
// and "ind" / "ind\b" sequences (matches IND\b case-insensitively). Spec-locked
|
|
86
|
+
// regex from DISCRETION-03 has these quirks; fixtures route around them.
|
|
87
|
+
const text = (
|
|
88
|
+
"I keep coming back to this same fork in the road and do not know which side is the right one to walk down. " +
|
|
89
|
+
"I am trying to figure out if the conviction I had three months ago was real conviction or just enthusiasm dressed up as belief. " +
|
|
90
|
+
"Some days I wake up and the whole thing feels obvious, like of course we should keep going, the signal is there, the people are there, the timing is right. " +
|
|
91
|
+
"Other days I wake up and cannot shake the feeling that we are building something nobody actually wants, and the small handful of paying customers we have are exceptions and not signal. " +
|
|
92
|
+
"I keep coming back to one specific conversation from January where a potential customer said something that should have been a yes and was instead a soft no. " +
|
|
93
|
+
"I have been turning that conversation over for weeks now. I do not know what to do with it. " +
|
|
94
|
+
"Walk me through this slowly because the inside of my own head is not where the answer is going to come from."
|
|
95
|
+
);
|
|
96
|
+
const r = classify(text);
|
|
97
|
+
// Expect stuck_language true (via "I keep coming back" / "I am trying to" / variants),
|
|
98
|
+
// low newline density, no section_header, no domain markers
|
|
99
|
+
assert.equal(r.features.stuck_language, true);
|
|
100
|
+
assert.equal(r.features.section_header, false, 'F-02 must not match SECTION_HEADER');
|
|
101
|
+
assert.equal(r.features.domain_marker, false, 'F-02 must not match DOMAIN_MARKER');
|
|
102
|
+
assert.equal(r.path, 'type', 'expected type, got ' + r.path + ' score=' + r.score);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
run('F-03 short prose <80 pure conversational no stuck-language -> type', () => {
|
|
106
|
+
const text = "Honestly the question is bigger than I expected when I sat down to write this morning. " +
|
|
107
|
+
"Maybe the answer is hiding inside the question itself. Maybe it is somewhere else entirely. " +
|
|
108
|
+
"Either way the next move is mine to make and I am still working out what it should be.";
|
|
109
|
+
const r = classify(text);
|
|
110
|
+
// word_count ~57 -> -2, density 0 -> -1, no other features = -3 -> 'type'
|
|
111
|
+
assert.equal(r.features.stuck_language, false);
|
|
112
|
+
assert.equal(r.features.section_header, false);
|
|
113
|
+
assert.equal(r.features.domain_marker, false);
|
|
114
|
+
assert.ok(r.score <= -3, 'expected score <= -3, got ' + r.score);
|
|
115
|
+
assert.equal(r.path, 'type');
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
run('F-04 medium prose 250 with $5M domain marker but stuck-language -> type or ambiguous safety', () => {
|
|
119
|
+
const text = (
|
|
120
|
+
"I keep coming back to whether the next round needs to be a $5M raise or something smaller and tighter. " +
|
|
121
|
+
"I'm trying to think clearly about it but the inside of my head is not the right place for that calculation, " +
|
|
122
|
+
"because every time I try to run the numbers I find myself negotiating with my own ambition instead of being honest about what we need. " +
|
|
123
|
+
"I don't know what the truth is yet. The truth might be that we don't need outside money for another six months. " +
|
|
124
|
+
"The truth might be that we need it now and waiting will cost us a competitor advantage. " +
|
|
125
|
+
"The truth might be somewhere uglier than either of those, like we are not actually as ready as the deck pretends we are. " +
|
|
126
|
+
"I keep coming back to a board conversation from last quarter where someone said something I have been turning over since then. " +
|
|
127
|
+
"Help me think through this without me trying to convince myself of an answer I already want to be true. " +
|
|
128
|
+
"Just walk through it slowly with me. The shape of the right answer is here somewhere if I can stop reaching for it."
|
|
129
|
+
);
|
|
130
|
+
const r = classify(text);
|
|
131
|
+
// Approx: word_count ~165 -> 0, density low -> -1, domain_marker ($5M) -> +2, stuck -> -3 = -2 -> 'ambiguous'
|
|
132
|
+
// Per <behavior> F-05: this is the safety case where ambiguous fires
|
|
133
|
+
assert.equal(r.features.stuck_language, true);
|
|
134
|
+
assert.equal(r.features.domain_marker, true);
|
|
135
|
+
assert.ok(r.path === 'ambiguous' || r.path === 'type',
|
|
136
|
+
'must NOT be upload (Pitfall 3 guard); got ' + r.path + ' score=' + r.score);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
run('F-05 short prose no markers -> type via word_count + density', () => {
|
|
140
|
+
const text = "Just thinking out loud here. Some weeks the venture feels like it is moving and other weeks it feels like sand. Today is a sand day.";
|
|
141
|
+
const r = classify(text);
|
|
142
|
+
assert.equal(r.features.section_header, false);
|
|
143
|
+
assert.equal(r.features.domain_marker, false);
|
|
144
|
+
assert.equal(r.features.stuck_language, false);
|
|
145
|
+
// word_count ~25 -> -2, density 0 -> -1 = -3 -> 'type'
|
|
146
|
+
assert.ok(r.score <= -3, 'expected score <= -3, got ' + r.score);
|
|
147
|
+
assert.equal(r.path, 'type');
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
// ---------- F-06..F-10 PURE UPLOAD PATH ----------
|
|
151
|
+
|
|
152
|
+
run('F-06 short formatted CV -> upload', () => {
|
|
153
|
+
const text = [
|
|
154
|
+
'Education',
|
|
155
|
+
'MIT 2018 PhD Robotics',
|
|
156
|
+
'Stanford 2014 BS EECS',
|
|
157
|
+
'',
|
|
158
|
+
'Experience',
|
|
159
|
+
'Founder Acme Robotics 2022-present',
|
|
160
|
+
'Senior Engineer Google 2018-2022',
|
|
161
|
+
'',
|
|
162
|
+
'Skills',
|
|
163
|
+
'Python, robotics, ML, NIH SBIR $2M',
|
|
164
|
+
].join('\n');
|
|
165
|
+
const r = classify(text);
|
|
166
|
+
// Expected: word_count <80 -> -2, high density -> +2, section_header -> +3, domain_marker (NIH, $2M) -> +2 = +5 -> upload
|
|
167
|
+
assert.equal(r.features.section_header, true);
|
|
168
|
+
assert.equal(r.features.domain_marker, true);
|
|
169
|
+
assert.equal(r.features.stuck_language, false);
|
|
170
|
+
assert.ok(r.score >= 3, 'expected score >= 3, got ' + r.score);
|
|
171
|
+
assert.equal(r.path, 'upload');
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
run('F-07 long CV 500 words -> upload', () => {
|
|
175
|
+
// Long CV-shaped paste with lots of newlines + section headers + domain markers
|
|
176
|
+
const lines = ['Education'];
|
|
177
|
+
for (let i = 0; i < 6; i++) lines.push('University of Wherever ' + (2010 + i) + ' Degree details and notes here.');
|
|
178
|
+
lines.push('');
|
|
179
|
+
lines.push('Experience');
|
|
180
|
+
for (let i = 0; i < 12; i++) lines.push('Role ' + i + ' at Company ' + i + ' from ' + (2010 + i) + ' to ' + (2011 + i) + ' building things measured outcomes shipped.');
|
|
181
|
+
lines.push('');
|
|
182
|
+
lines.push('Skills');
|
|
183
|
+
for (let i = 0; i < 10; i++) lines.push('Skill ' + i + ' detail line with depth notes here for filling out the document.');
|
|
184
|
+
lines.push('');
|
|
185
|
+
lines.push('Funding');
|
|
186
|
+
lines.push('NIH SBIR $2M 2023, Series A $10M 2024, IRB# 12345 ongoing.');
|
|
187
|
+
const text = lines.join('\n');
|
|
188
|
+
const r = classify(text);
|
|
189
|
+
assert.equal(r.features.section_header, true);
|
|
190
|
+
assert.equal(r.features.domain_marker, true);
|
|
191
|
+
assert.ok(r.score >= 3, 'expected score >= 3, got ' + r.score);
|
|
192
|
+
assert.equal(r.path, 'upload');
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
run('F-08 medium VC memo 350 words with Series A / ARR / GP -> upload', () => {
|
|
196
|
+
const lines = ['Approach', 'Series A investment thesis. Target ARR $5M next 12 months. GP holds 20% carry.'];
|
|
197
|
+
for (let i = 0; i < 10; i++) {
|
|
198
|
+
lines.push('Bullet ' + i + ' the company has revenue MRR climbing and a runway of 18 months at current burn rate.');
|
|
199
|
+
}
|
|
200
|
+
lines.push('Team');
|
|
201
|
+
lines.push('Founder ex-Google. CTO ex-Stanford. Operations veteran from a Series B portfolio company.');
|
|
202
|
+
lines.push('Market');
|
|
203
|
+
for (let i = 0; i < 8; i++) lines.push('Market signal ' + i + ' addressable customers paying month over month with a check size that justifies our concentration.');
|
|
204
|
+
lines.push('Risk Factors');
|
|
205
|
+
for (let i = 0; i < 6; i++) lines.push('Risk ' + i + ' detail and mitigation paragraph for thoughtful investor diligence.');
|
|
206
|
+
const text = lines.join('\n');
|
|
207
|
+
const r = classify(text);
|
|
208
|
+
assert.equal(r.features.section_header, true);
|
|
209
|
+
assert.equal(r.features.domain_marker, true);
|
|
210
|
+
assert.equal(r.features.stuck_language, false);
|
|
211
|
+
assert.ok(r.score >= 3, 'expected score >= 3, got ' + r.score);
|
|
212
|
+
assert.equal(r.path, 'upload');
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
run('F-09 medium IRB protocol with Hypothesis / NCT / FDA / HIPAA -> upload', () => {
|
|
216
|
+
const lines = ['Background'];
|
|
217
|
+
for (let i = 0; i < 8; i++) lines.push('Background paragraph ' + i + ' establishes the prior literature and the unmet clinical need in the population.');
|
|
218
|
+
lines.push('Hypothesis');
|
|
219
|
+
lines.push('Primary hypothesis is that intervention reduces relative risk by a measurable margin in the target cohort.');
|
|
220
|
+
lines.push('Methodology');
|
|
221
|
+
for (let i = 0; i < 8; i++) lines.push('Method line ' + i + ' clinical trial NCT12345678 with inclusion exclusion enrollment plan and statistical power.');
|
|
222
|
+
lines.push('Approach');
|
|
223
|
+
lines.push('FDA IND filing pathway. HIPAA-compliant data handling. IRB# 87654 approved.');
|
|
224
|
+
lines.push('Funding');
|
|
225
|
+
lines.push('NIH R01 $3M five year award supports primary endpoint and secondary endpoint analysis.');
|
|
226
|
+
const text = lines.join('\n');
|
|
227
|
+
const r = classify(text);
|
|
228
|
+
assert.equal(r.features.section_header, true);
|
|
229
|
+
assert.equal(r.features.domain_marker, true);
|
|
230
|
+
assert.ok(r.score >= 3, 'expected score >= 3, got ' + r.score);
|
|
231
|
+
assert.equal(r.path, 'upload');
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
run('F-10 long deck pitch 400 words with Pitch / Solution / Market / Team -> upload', () => {
|
|
235
|
+
const lines = ['Pitch'];
|
|
236
|
+
for (let i = 0; i < 8; i++) lines.push('Pitch slide ' + i + ' outlines the wedge and the why-now and the team and the round structure.');
|
|
237
|
+
lines.push('Solution');
|
|
238
|
+
for (let i = 0; i < 8; i++) lines.push('Solution slide ' + i + ' explains the architecture and the moat and the early traction.');
|
|
239
|
+
lines.push('Market');
|
|
240
|
+
for (let i = 0; i < 8; i++) lines.push('Market slide ' + i + ' explains addressable demand and current incumbents and the timing wedge.');
|
|
241
|
+
lines.push('Team');
|
|
242
|
+
for (let i = 0; i < 8; i++) lines.push('Team slide ' + i + ' explains the founder background and the early hires and the advisor circle.');
|
|
243
|
+
const text = lines.join('\n');
|
|
244
|
+
const r = classify(text);
|
|
245
|
+
assert.equal(r.features.section_header, true);
|
|
246
|
+
assert.ok(r.score >= 3, 'expected score >= 3, got ' + r.score);
|
|
247
|
+
assert.equal(r.path, 'upload');
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
// ---------- F-11..F-15 AMBIGUOUS / FALSE-POSITIVE GUARDS ----------
|
|
251
|
+
|
|
252
|
+
run('F-11 long conversational stuck-language 350 words no headers no markers -> ambiguous (Pitfall 3)', () => {
|
|
253
|
+
// Long-form prose, single paragraph (low density), stuck-language present, no section headers, no domain markers.
|
|
254
|
+
// Avoid "kind" / "wind" / any *ind word-boundary token (matches IND\b case-insensitively under DOMAIN_MARKER spec).
|
|
255
|
+
const sentences = [];
|
|
256
|
+
for (let i = 0; i < 15; i++) {
|
|
257
|
+
sentences.push("I keep coming back to whether what we are building is actually the thing the market is asking for or just a thing we want to make because we are good at making it.");
|
|
258
|
+
}
|
|
259
|
+
for (let i = 0; i < 10; i++) {
|
|
260
|
+
sentences.push("I am trying to be honest with myself about it but the kid of honesty I need is the sort that does not happen inside your own head.");
|
|
261
|
+
}
|
|
262
|
+
const text = sentences.join(' ');
|
|
263
|
+
const r = classify(text);
|
|
264
|
+
// word_count > 300 -> +2, density very low -> -1, stuck_language -> -3 = -2 -> 'ambiguous' (NOT upload)
|
|
265
|
+
assert.equal(r.features.stuck_language, true);
|
|
266
|
+
assert.equal(r.features.section_header, false);
|
|
267
|
+
assert.equal(r.features.domain_marker, false, 'F-11 must not match DOMAIN_MARKER (Pitfall 3 isolation)');
|
|
268
|
+
assert.notEqual(r.path, 'upload', 'Pitfall 3 false-positive: long prose must NOT classify as upload');
|
|
269
|
+
assert.equal(r.path, 'ambiguous');
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
run('F-12 medium prose 200 words with CEO mention and stuck-language -> ambiguous (Pitfall 3)', () => {
|
|
273
|
+
const lines = [];
|
|
274
|
+
// Single CEO line at top to fire the SECTION_HEADER regex
|
|
275
|
+
lines.push("CEO retrospective notes from the last quarter, written in a conversational voice for myself.");
|
|
276
|
+
for (let i = 0; i < 12; i++) {
|
|
277
|
+
lines.push("I keep coming back to the same set of questions about whether the team is the right team and whether I am the right person to be leading them through what comes next.");
|
|
278
|
+
}
|
|
279
|
+
const text = lines.join(' ');
|
|
280
|
+
const r = classify(text);
|
|
281
|
+
// word_count ~200 -> 0, density low (joined by spaces) -> -1, section_header (CEO) -> +3, stuck_language -> -3 = -1 -> ambiguous
|
|
282
|
+
assert.equal(r.features.section_header, true);
|
|
283
|
+
assert.equal(r.features.stuck_language, true);
|
|
284
|
+
assert.notEqual(r.path, 'upload', 'CEO + stuck-language must NOT classify as upload');
|
|
285
|
+
assert.equal(r.path, 'ambiguous');
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
run('F-13 medium prose 250 words with $1M figure and stuck-language -> ambiguous (Pitfall 3)', () => {
|
|
289
|
+
const sentences = [];
|
|
290
|
+
for (let i = 0; i < 14; i++) {
|
|
291
|
+
sentences.push("I keep coming back to whether a $1M bridge round is the right shape for this moment or whether we should hold off and run leaner for another six months.");
|
|
292
|
+
}
|
|
293
|
+
const text = sentences.join(' ');
|
|
294
|
+
const r = classify(text);
|
|
295
|
+
// word_count ~280 -> 0, density 0 -> -1, domain_marker ($1M) -> +2, stuck_language -> -3 = -2 -> ambiguous
|
|
296
|
+
assert.equal(r.features.domain_marker, true);
|
|
297
|
+
assert.equal(r.features.stuck_language, true);
|
|
298
|
+
assert.notEqual(r.path, 'upload', 'domain_marker + stuck-language must NOT classify as upload');
|
|
299
|
+
assert.equal(r.path, 'ambiguous');
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
run('F-14 borderline ambiguous 200 words pure prose -> ambiguous', () => {
|
|
303
|
+
const sentences = [];
|
|
304
|
+
for (let i = 0; i < 14; i++) {
|
|
305
|
+
sentences.push("Some weeks the venture feels like it is moving and other weeks it feels like sand and the honest answer is that probably both are true at the same time depending on which slice of activity I look at.");
|
|
306
|
+
}
|
|
307
|
+
const text = sentences.join(' ');
|
|
308
|
+
const r = classify(text);
|
|
309
|
+
// word_count > 300 likely -> +2, density 0 -> -1, no other markers = +1 -> ambiguous (or rough)
|
|
310
|
+
// More importantly: not type, not upload
|
|
311
|
+
assert.equal(r.features.stuck_language, false);
|
|
312
|
+
assert.equal(r.features.section_header, false);
|
|
313
|
+
assert.equal(r.features.domain_marker, false);
|
|
314
|
+
assert.equal(r.path, 'ambiguous');
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
run('F-15 borderline ambiguous 100 words formatted but no headers or markers -> ambiguous', () => {
|
|
318
|
+
const lines = [];
|
|
319
|
+
for (let i = 0; i < 15; i++) {
|
|
320
|
+
lines.push('line ' + i + ' some short content here for testing density features without section anchors');
|
|
321
|
+
}
|
|
322
|
+
const text = lines.join('\n');
|
|
323
|
+
const r = classify(text);
|
|
324
|
+
// word_count ~150 -> 0, density high -> +2, no section_header, no domain_marker = +2 -> ambiguous
|
|
325
|
+
assert.equal(r.features.section_header, false);
|
|
326
|
+
assert.equal(r.features.domain_marker, false);
|
|
327
|
+
assert.equal(r.features.stuck_language, false);
|
|
328
|
+
assert.equal(r.path, 'ambiguous');
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
// ---------- Summary ----------
|
|
332
|
+
|
|
333
|
+
process.stdout.write('\ndual-path-detector: ' + passed + '/' + (passed + failed) + ' passed, ' + failed + ' failed\n');
|
|
334
|
+
process.exit(failed === 0 ? 0 : 1);
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MindrianOS Plugin -- Exports Log Operations
|
|
3
|
+
* Manages .exports-log.json in room directories for deployment tracking.
|
|
4
|
+
* Pure Node.js built-ins only (fs + path).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
|
|
12
|
+
const LOG_FILENAME = '.exports-log.json';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Read the exports log from a room directory.
|
|
16
|
+
* Returns { deployments: [] } if file is missing or malformed.
|
|
17
|
+
* @param {string} roomDir - Path to room directory
|
|
18
|
+
* @returns {{ deployments: Array<object> }}
|
|
19
|
+
*/
|
|
20
|
+
function readExportsLog(roomDir) {
|
|
21
|
+
const logPath = path.join(roomDir, LOG_FILENAME);
|
|
22
|
+
try {
|
|
23
|
+
const raw = fs.readFileSync(logPath, 'utf-8');
|
|
24
|
+
const parsed = JSON.parse(raw);
|
|
25
|
+
if (!parsed || !Array.isArray(parsed.deployments)) {
|
|
26
|
+
return { deployments: [] };
|
|
27
|
+
}
|
|
28
|
+
return parsed;
|
|
29
|
+
} catch {
|
|
30
|
+
return { deployments: [] };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Append a deployment entry to the exports log.
|
|
36
|
+
* Entry shape: { url, timestamp, host, sections, private, project_name }
|
|
37
|
+
* @param {string} roomDir - Path to room directory
|
|
38
|
+
* @param {object} entry - Deployment entry
|
|
39
|
+
* @param {string} entry.url - Deployed URL
|
|
40
|
+
* @param {string} [entry.timestamp] - ISO timestamp (defaults to now)
|
|
41
|
+
* @param {string} [entry.host] - Hosting provider (default: "vercel")
|
|
42
|
+
* @param {string[]} [entry.sections] - Sections deployed (default: ["all"])
|
|
43
|
+
* @param {boolean} [entry.private] - Whether password-protected (default: false)
|
|
44
|
+
* @param {string} [entry.project_name] - Vercel project name
|
|
45
|
+
* @param {string} [entry.password] - Password if private deployment
|
|
46
|
+
* @returns {object} The entry that was logged
|
|
47
|
+
*/
|
|
48
|
+
function logDeployment(roomDir, entry) {
|
|
49
|
+
const log = readExportsLog(roomDir);
|
|
50
|
+
const fullEntry = {
|
|
51
|
+
url: entry.url || '',
|
|
52
|
+
timestamp: entry.timestamp || new Date().toISOString(),
|
|
53
|
+
host: entry.host || 'vercel',
|
|
54
|
+
sections: entry.sections || ['all'],
|
|
55
|
+
private: entry.private || false,
|
|
56
|
+
project_name: entry.project_name || '',
|
|
57
|
+
};
|
|
58
|
+
// Include password only if private
|
|
59
|
+
if (entry.private && entry.password) {
|
|
60
|
+
fullEntry.password = entry.password;
|
|
61
|
+
}
|
|
62
|
+
log.deployments.push(fullEntry);
|
|
63
|
+
const logPath = path.join(roomDir, LOG_FILENAME);
|
|
64
|
+
fs.writeFileSync(logPath, JSON.stringify(log, null, 2) + '\n', 'utf-8');
|
|
65
|
+
return fullEntry;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Get the most recent deployment entry, or null if none.
|
|
70
|
+
* @param {string} roomDir - Path to room directory
|
|
71
|
+
* @returns {object|null}
|
|
72
|
+
*/
|
|
73
|
+
function getLatestDeployment(roomDir) {
|
|
74
|
+
const log = readExportsLog(roomDir);
|
|
75
|
+
if (log.deployments.length === 0) return null;
|
|
76
|
+
return log.deployments[log.deployments.length - 1];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
module.exports = { readExportsLog, logDeployment, getLatestDeployment };
|