@mindrian_os/cli 1.13.0-beta.10 → 1.13.0-beta.44

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.
Files changed (590) hide show
  1. package/CHANGELOG.md +348 -13
  2. package/README.md +76 -579
  3. package/bin/cli.js +166 -40
  4. package/lib/core/active-plugin-root.cjs +207 -0
  5. package/package.json +7 -13
  6. package/.claude-plugin/plugin.json +0 -21
  7. package/.mcp.json +0 -9
  8. package/agents/brain-query.md +0 -80
  9. package/agents/framework-runner.md +0 -237
  10. package/agents/grading.md +0 -188
  11. package/agents/investor.md +0 -128
  12. package/agents/larry-extended.md +0 -135
  13. package/agents/opportunity-scanner.md +0 -91
  14. package/agents/persona-analyst.md +0 -132
  15. package/agents/research.md +0 -89
  16. package/agents/reverse-salient-agent.md +0 -27
  17. package/bin/mindrian-mcp-server.cjs +0 -182
  18. package/bin/mindrian-tools.cjs +0 -765
  19. package/commands/act.md +0 -433
  20. package/commands/admin.md +0 -404
  21. package/commands/analyze-needs.md +0 -36
  22. package/commands/analyze-systems.md +0 -33
  23. package/commands/analyze-timing.md +0 -36
  24. package/commands/auto-explore.md +0 -64
  25. package/commands/beautiful-question.md +0 -34
  26. package/commands/brain-derive.md +0 -78
  27. package/commands/build-knowledge.md +0 -36
  28. package/commands/build-thesis.md +0 -40
  29. package/commands/causal.md +0 -228
  30. package/commands/challenge-assumptions.md +0 -33
  31. package/commands/compare-ventures.md +0 -77
  32. package/commands/dashboard.md +0 -110
  33. package/commands/deep-grade.md +0 -76
  34. package/commands/diagnose.md +0 -52
  35. package/commands/diagnostics.md +0 -145
  36. package/commands/doctor.md +0 -151
  37. package/commands/dominant-designs.md +0 -34
  38. package/commands/explain-decision.md +0 -87
  39. package/commands/explore-domains.md +0 -36
  40. package/commands/explore-futures.md +0 -34
  41. package/commands/explore-trends.md +0 -36
  42. package/commands/export.md +0 -103
  43. package/commands/file-meeting.md +0 -724
  44. package/commands/find-analogies.md +0 -182
  45. package/commands/find-bottlenecks.md +0 -56
  46. package/commands/find-connections.md +0 -70
  47. package/commands/funding.md +0 -81
  48. package/commands/grade.md +0 -197
  49. package/commands/graph.md +0 -128
  50. package/commands/hat-briefing.md +0 -119
  51. package/commands/heal.md +0 -196
  52. package/commands/help.md +0 -399
  53. package/commands/hmi-status.md +0 -172
  54. package/commands/jtbd.md +0 -241
  55. package/commands/leadership.md +0 -73
  56. package/commands/lean-canvas.md +0 -34
  57. package/commands/macro-trends.md +0 -34
  58. package/commands/map-unknowns.md +0 -34
  59. package/commands/memory.md +0 -173
  60. package/commands/models.md +0 -175
  61. package/commands/mos-reason.md +0 -279
  62. package/commands/mullins.md +0 -114
  63. package/commands/new-project.md +0 -481
  64. package/commands/onboard.md +0 -434
  65. package/commands/operator.md +0 -149
  66. package/commands/opportunities.md +0 -144
  67. package/commands/organize.md +0 -497
  68. package/commands/persona.md +0 -192
  69. package/commands/pipeline.md +0 -106
  70. package/commands/present.md +0 -91
  71. package/commands/publish.md +0 -201
  72. package/commands/query.md +0 -124
  73. package/commands/radar.md +0 -72
  74. package/commands/reanalyze.md +0 -91
  75. package/commands/research.md +0 -190
  76. package/commands/room.md +0 -352
  77. package/commands/rooms.md +0 -598
  78. package/commands/root-cause.md +0 -34
  79. package/commands/rs-experts.md +0 -79
  80. package/commands/rs-explain.md +0 -94
  81. package/commands/rs-fetch.md +0 -88
  82. package/commands/rs-thesis.md +0 -79
  83. package/commands/scenario-plan.md +0 -34
  84. package/commands/scheduled-tasks.md +0 -285
  85. package/commands/score-innovation.md +0 -37
  86. package/commands/scout.md +0 -239
  87. package/commands/setup.md +0 -618
  88. package/commands/snapshot.md +0 -147
  89. package/commands/speakers.md +0 -84
  90. package/commands/splash.md +0 -28
  91. package/commands/status.md +0 -75
  92. package/commands/structure-argument.md +0 -36
  93. package/commands/suggest-next.md +0 -74
  94. package/commands/systems-thinking.md +0 -34
  95. package/commands/think-hats.md +0 -36
  96. package/commands/update.md +0 -181
  97. package/commands/user-needs.md +0 -34
  98. package/commands/validate.md +0 -34
  99. package/commands/value-proposition.md +0 -55
  100. package/commands/vault.md +0 -180
  101. package/commands/visualize.md +0 -52
  102. package/commands/whitespace.md +0 -501
  103. package/commands/wiki.md +0 -69
  104. package/hooks/hooks.json +0 -381
  105. package/hooks/run-hook.cmd +0 -64
  106. package/lib/__init__.py +0 -0
  107. package/lib/__pycache__/__init__.cpython-312.pyc +0 -0
  108. package/lib/agents/auto-explore-agent.cjs +0 -1043
  109. package/lib/agents/reverse-salient-agent.cjs +0 -679
  110. package/lib/agents/tension-hook-agent.cjs +0 -544
  111. package/lib/chat/chat-context.js +0 -185
  112. package/lib/chat/chat-panel.js +0 -721
  113. package/lib/chat/fabric-chat.cjs +0 -288
  114. package/lib/chat/generative-tools.js +0 -219
  115. package/lib/conversation/ROOM.md +0 -39
  116. package/lib/conversation/classifier-rules.json +0 -38
  117. package/lib/conversation/classifier.cjs +0 -264
  118. package/lib/conversation/operator.cjs +0 -287
  119. package/lib/copy/115-spec-strings.cjs +0 -55
  120. package/lib/core/__init__.py +0 -0
  121. package/lib/core/__nav-stub.cjs +0 -14
  122. package/lib/core/__pycache__/__init__.cpython-312.pyc +0 -0
  123. package/lib/core/__pycache__/rs-math.cpython-312.pyc +0 -0
  124. package/lib/core/__pycache__/rs_cache.cpython-312.pyc +0 -0
  125. package/lib/core/__pycache__/rs_corpus.cpython-312.pyc +0 -0
  126. package/lib/core/__pycache__/rs_hybrid.cpython-312.pyc +0 -0
  127. package/lib/core/__pycache__/rs_math.cpython-312.pyc +0 -0
  128. package/lib/core/__pycache__/rs_rooms.cpython-312.pyc +0 -0
  129. package/lib/core/artifact-id.cjs +0 -148
  130. package/lib/core/asset-ops.cjs +0 -151
  131. package/lib/core/auto-commit-throttle.cjs +0 -129
  132. package/lib/core/bearer-token.cjs +0 -199
  133. package/lib/core/brain-client.cjs +0 -865
  134. package/lib/core/brain-derivation-prompts.cjs +0 -326
  135. package/lib/core/brain-derivation-queue.cjs +0 -431
  136. package/lib/core/brain-derivation.cjs +0 -580
  137. package/lib/core/brain-md-schema.cjs +0 -528
  138. package/lib/core/brain-md-staleness.cjs +0 -357
  139. package/lib/core/brain-response-sanitize.cjs +0 -188
  140. package/lib/core/bridge-writer.cjs +0 -477
  141. package/lib/core/chat-context-builder.cjs +0 -253
  142. package/lib/core/cross-room-aggregator.cjs +0 -762
  143. package/lib/core/daily-briefing.cjs +0 -438
  144. package/lib/core/decision-capture.cjs +0 -618
  145. package/lib/core/deep-links.cjs +0 -82
  146. package/lib/core/dispatch-optimizer.cjs +0 -354
  147. package/lib/core/dual-path-detector.cjs +0 -84
  148. package/lib/core/dual-path-detector.test.cjs +0 -334
  149. package/lib/core/exports-log.cjs +0 -79
  150. package/lib/core/feynman-minto-invariants.cjs +0 -605
  151. package/lib/core/folder-memory-async.cjs +0 -338
  152. package/lib/core/folder-memory-shared.cjs +0 -890
  153. package/lib/core/folder-memory.cjs +0 -416
  154. package/lib/core/framework-chain-composer.cjs +0 -411
  155. package/lib/core/frontmatter-schemas.cjs +0 -330
  156. package/lib/core/git-ops.cjs +0 -141
  157. package/lib/core/graph-ops.cjs +0 -258
  158. package/lib/core/hat-persistence.cjs +0 -362
  159. package/lib/core/index.cjs +0 -60
  160. package/lib/core/integration-registry.cjs +0 -232
  161. package/lib/core/intelligence-cascade.cjs +0 -661
  162. package/lib/core/lazygraph-ops.cjs +0 -1057
  163. package/lib/core/lru-cache.cjs +0 -139
  164. package/lib/core/mcp-profiles.cjs +0 -182
  165. package/lib/core/meeting-ops.cjs +0 -54
  166. package/lib/core/memory-ops.cjs +0 -600
  167. package/lib/core/migrations/ROOM.md +0 -33
  168. package/lib/core/migrations/phase-109-nodes-provenance.cjs +0 -339
  169. package/lib/core/migrations/phase-109-session-focus.cjs +0 -99
  170. package/lib/core/model-profiles.cjs +0 -246
  171. package/lib/core/mullins-scaffold.cjs +0 -160
  172. package/lib/core/nav-dial.cjs +0 -316
  173. package/lib/core/navigation/ROOM.md +0 -15
  174. package/lib/core/navigation/explanation.cjs +0 -43
  175. package/lib/core/navigation/focus.cjs +0 -135
  176. package/lib/core/navigation/ingestion.cjs +0 -82
  177. package/lib/core/navigation/insights.cjs +0 -350
  178. package/lib/core/navigation/memory-events.cjs +0 -118
  179. package/lib/core/navigation/neighborhood.cjs +0 -78
  180. package/lib/core/navigation/packet.cjs +0 -182
  181. package/lib/core/navigation/room-home.cjs +0 -127
  182. package/lib/core/navigation/transitions.cjs +0 -82
  183. package/lib/core/navigation-engine-shared.cjs +0 -242
  184. package/lib/core/navigation-engine.cjs +0 -664
  185. package/lib/core/navigation.cjs +0 -60
  186. package/lib/core/nl-graph-queries.cjs +0 -164
  187. package/lib/core/offer-presenter.cjs +0 -406
  188. package/lib/core/opportunity-extractor.cjs +0 -183
  189. package/lib/core/opportunity-ops.cjs +0 -1371
  190. package/lib/core/persona-ops.cjs +0 -537
  191. package/lib/core/persona-taxonomy.cjs +0 -190
  192. package/lib/core/platform-gates.cjs +0 -120
  193. package/lib/core/platform.cjs +0 -257
  194. package/lib/core/proactive-intelligence.cjs +0 -528
  195. package/lib/core/problem-type-router.cjs +0 -315
  196. package/lib/core/reasoning-ops.cjs +0 -639
  197. package/lib/core/reverse-salient-persona-suffix.cjs +0 -115
  198. package/lib/core/room-classifier-strict-mode.cjs +0 -229
  199. package/lib/core/room-db.cjs +0 -127
  200. package/lib/core/room-ops-async.cjs +0 -92
  201. package/lib/core/room-ops-shared.cjs +0 -64
  202. package/lib/core/room-ops-sync.cjs +0 -70
  203. package/lib/core/room-ops.cjs +0 -32
  204. package/lib/core/room-type-detector.cjs +0 -386
  205. package/lib/core/rs-brain-substrate-prompts.cjs +0 -129
  206. package/lib/core/rs-brain-substrate.cjs +0 -570
  207. package/lib/core/rs-breakthrough-scorer.cjs +0 -255
  208. package/lib/core/rs-canon-violations.cjs +0 -82
  209. package/lib/core/rs-chain-feeder.cjs +0 -343
  210. package/lib/core/rs-commercial-assessor.cjs +0 -280
  211. package/lib/core/rs-differential-scorer.cjs +0 -376
  212. package/lib/core/rs-domain-analyzer.cjs +0 -385
  213. package/lib/core/rs-egress-prompts.cjs +0 -113
  214. package/lib/core/rs-egress-telemetry.cjs +0 -225
  215. package/lib/core/rs-egress-violations.cjs +0 -53
  216. package/lib/core/rs-expert-mapper.cjs +0 -467
  217. package/lib/core/rs-fetcher-academic.cjs +0 -697
  218. package/lib/core/rs-fetcher-experts.cjs +0 -314
  219. package/lib/core/rs-fetcher-industry.cjs +0 -731
  220. package/lib/core/rs-fetcher-patents.cjs +0 -564
  221. package/lib/core/rs-innovation-classifier.cjs +0 -194
  222. package/lib/core/rs-mind-map.cjs +0 -656
  223. package/lib/core/rs-neo4j-writer.cjs +0 -388
  224. package/lib/core/rs-nl-to-query.cjs +0 -425
  225. package/lib/core/rs-pinecone-bridge.cjs +0 -303
  226. package/lib/core/rs-preprocessor.cjs +0 -350
  227. package/lib/core/rs-query-matrix.cjs +0 -316
  228. package/lib/core/rs-query-to-text.cjs +0 -438
  229. package/lib/core/rs-sqlite-mirror.cjs +0 -443
  230. package/lib/core/rs-thesis-generator.cjs +0 -188
  231. package/lib/core/rs_cache.py +0 -479
  232. package/lib/core/rs_corpus.py +0 -468
  233. package/lib/core/rs_hybrid.py +0 -586
  234. package/lib/core/rs_math.py +0 -287
  235. package/lib/core/rs_rooms.py +0 -193
  236. package/lib/core/scheduled-scanner.cjs +0 -463
  237. package/lib/core/scratchpad-ops.cjs +0 -201
  238. package/lib/core/section-8-trace-schema.cjs +0 -138
  239. package/lib/core/section-registry.cjs +0 -111
  240. package/lib/core/session-state.cjs +0 -144
  241. package/lib/core/shallow-doc-parser.cjs +0 -174
  242. package/lib/core/shallow-doc-parser.test.cjs +0 -226
  243. package/lib/core/skill-activation-router.cjs +0 -284
  244. package/lib/core/state-ops.cjs +0 -46
  245. package/lib/core/statusline-cache.cjs +0 -266
  246. package/lib/core/token-estimator.cjs +0 -348
  247. package/lib/core/user-archetype.cjs +0 -239
  248. package/lib/core/user-md-ops.cjs +0 -524
  249. package/lib/core/visual-ops.cjs +0 -624
  250. package/lib/core/write-lock.cjs +0 -149
  251. package/lib/graph/canvas-graph.js +0 -467
  252. package/lib/graph/constellation-config.cjs +0 -299
  253. package/lib/graph/graph-detail-panel.js +0 -165
  254. package/lib/hmi/ROOM.md +0 -47
  255. package/lib/hmi/across-session-memory.cjs +0 -604
  256. package/lib/hmi/cross-room-memory.cjs +0 -575
  257. package/lib/hmi/decoy-tier.cjs +0 -395
  258. package/lib/hmi/jtbd-classifier.cjs +0 -219
  259. package/lib/hmi/jtbd-state.cjs +0 -199
  260. package/lib/hmi/jtbd-taxonomy.json +0 -392
  261. package/lib/hmi/selector-dispatcher.cjs +0 -546
  262. package/lib/hmi/selector-telemetry.cjs +0 -263
  263. package/lib/hmi/shape-f0-renderer.cjs +0 -139
  264. package/lib/hmi/shape-f1-fallback.cjs +0 -80
  265. package/lib/hmi/shape-f1-renderer.cjs +0 -138
  266. package/lib/hmi/shape-f2-renderer.cjs +0 -132
  267. package/lib/hmi/shape-f3-renderer.cjs +0 -66
  268. package/lib/hmi/shape-f4-renderer.cjs +0 -72
  269. package/lib/hmi/shape-f5-renderer.cjs +0 -155
  270. package/lib/hmi/shape-f6-plan-review-renderer.cjs +0 -312
  271. package/lib/hmi/shape-f6-renderer.cjs +0 -144
  272. package/lib/hmi/shape-g-renderer.cjs +0 -219
  273. package/lib/hmi/shape-h-renderer.cjs +0 -222
  274. package/lib/hmi/tier-check.cjs +0 -63
  275. package/lib/import/PRECONDITIONS.md +0 -41
  276. package/lib/import/branding.cjs +0 -210
  277. package/lib/import/branding.test.cjs +0 -235
  278. package/lib/import/classifications-sync.cjs +0 -104
  279. package/lib/import/classifications-sync.test.cjs +0 -129
  280. package/lib/import/enricher.cjs +0 -296
  281. package/lib/import/enricher.test.cjs +0 -273
  282. package/lib/import/integration.test.cjs +0 -376
  283. package/lib/import/manifest.cjs +0 -129
  284. package/lib/import/manifest.schema.json +0 -185
  285. package/lib/import/manifest.test.cjs +0 -123
  286. package/lib/import/meeting-detector.cjs +0 -92
  287. package/lib/import/meeting-detector.test.cjs +0 -100
  288. package/lib/import/person-detector.cjs +0 -229
  289. package/lib/import/person-detector.test.cjs +0 -149
  290. package/lib/import/report.cjs +0 -186
  291. package/lib/import/report.test.cjs +0 -186
  292. package/lib/import/room-md-scaffolder.cjs +0 -49
  293. package/lib/import/router.cjs +0 -224
  294. package/lib/import/router.test.cjs +0 -356
  295. package/lib/import/run-all-tests.cjs +0 -36
  296. package/lib/import/smoke-test.cjs +0 -213
  297. package/lib/import/smoke-test.test.cjs +0 -148
  298. package/lib/import/test-fixtures/collision-vault/preexisting-room/STATE.md +0 -8
  299. package/lib/import/test-fixtures/collision-vault/preexisting-room/problem-definition/onboarding/onboarding.md +0 -7
  300. package/lib/import/test-fixtures/collision-vault/source/onboarding.md +0 -5
  301. package/lib/import/test-fixtures/obsidian-vault/.obsidian/workspace.json +0 -1
  302. package/lib/import/test-fixtures/obsidian-vault/notes/with-wikilinks.md +0 -4
  303. package/lib/import/test-fixtures/tiny-vault/notes/2026-01-15-team-sync.md +0 -9
  304. package/lib/import/test-fixtures/tiny-vault/notes/empty.md +0 -3
  305. package/lib/import/test-fixtures/tiny-vault/notes/onboarding.md +0 -5
  306. package/lib/import/test-fixtures/tiny-vault/notes/pricing.md +0 -5
  307. package/lib/import/test-fixtures/tiny-vault/notes/random.md +0 -4
  308. package/lib/import/undo.test.cjs +0 -199
  309. package/lib/import/vault-scanner.cjs +0 -105
  310. package/lib/import/vault-scanner.test.cjs +0 -67
  311. package/lib/mcp/app-html/dashboard.html +0 -316
  312. package/lib/mcp/app-html/graph.html +0 -428
  313. package/lib/mcp/app-html/mindrian-platform.html +0 -1841
  314. package/lib/mcp/app-html/wiki.html +0 -383
  315. package/lib/mcp/app-views.cjs +0 -322
  316. package/lib/mcp/brain-router.cjs +0 -418
  317. package/lib/mcp/capability-registry.cjs +0 -62
  318. package/lib/mcp/larry-context.cjs +0 -46
  319. package/lib/mcp/larry-server-instructions.md +0 -114
  320. package/lib/mcp/pipeline-state.cjs +0 -275
  321. package/lib/mcp/prompts.cjs +0 -302
  322. package/lib/mcp/resources.cjs +0 -227
  323. package/lib/mcp/session-catchup.cjs +0 -327
  324. package/lib/mcp/surface-detect.cjs +0 -75
  325. package/lib/mcp/tool-router.cjs +0 -1034
  326. package/lib/memory/aaak-compress.cjs +0 -403
  327. package/lib/memory/aaak-compress.test.cjs +0 -288
  328. package/lib/memory/async-artifact-auto-commit.test.cjs +0 -223
  329. package/lib/memory/bearer-token.test.cjs +0 -315
  330. package/lib/memory/brain-cache-lru.test.cjs +0 -259
  331. package/lib/memory/brain-client-query-shape.test.cjs +0 -160
  332. package/lib/memory/brain-derivation-graceful-degradation.test.cjs +0 -1019
  333. package/lib/memory/brain-derivation-queue.test.cjs +0 -539
  334. package/lib/memory/brain-derivation.test.cjs +0 -634
  335. package/lib/memory/brain-derive-command.test.cjs +0 -534
  336. package/lib/memory/brain-md-invariants-validator.test.cjs +0 -704
  337. package/lib/memory/brain-md-schema.test.cjs +0 -467
  338. package/lib/memory/brain-md-staleness.test.cjs +0 -525
  339. package/lib/memory/brain-server-resolution.test.cjs +0 -314
  340. package/lib/memory/chat-context.test.cjs +0 -128
  341. package/lib/memory/cross-room-aggregator.test.cjs +0 -909
  342. package/lib/memory/dashboard-server.test.cjs +0 -256
  343. package/lib/memory/debouncer-drain-at-prompt.test.cjs +0 -389
  344. package/lib/memory/decision-capture.test.cjs +0 -632
  345. package/lib/memory/decision-capture.worker.cjs +0 -70
  346. package/lib/memory/explain-decision-command.test.cjs +0 -521
  347. package/lib/memory/explain-decision-footer.test.cjs +0 -316
  348. package/lib/memory/explored-materials-store.cjs +0 -392
  349. package/lib/memory/feynman-minto-guardian.test.cjs +0 -736
  350. package/lib/memory/feynman-minto-invariants.test.cjs +0 -511
  351. package/lib/memory/feynman-prompts-drift.test.cjs +0 -144
  352. package/lib/memory/feynman-prompts.cjs +0 -151
  353. package/lib/memory/feynman-prompts.test.cjs +0 -96
  354. package/lib/memory/folder-memory-quadruple.test.cjs +0 -548
  355. package/lib/memory/folder-memory.test.cjs +0 -503
  356. package/lib/memory/framework-chain-composer.test.cjs +0 -515
  357. package/lib/memory/frontmatter-schema-validator.test.cjs +0 -290
  358. package/lib/memory/heal-command.test.cjs +0 -604
  359. package/lib/memory/index-artifact-transaction.test.cjs +0 -333
  360. package/lib/memory/lazygraph-rs-discoveries-view.test.cjs +0 -122
  361. package/lib/memory/mcp-input-validation.test.cjs +0 -240
  362. package/lib/memory/mcp-server-brain-deps.test.cjs +0 -270
  363. package/lib/memory/mcp-stack-fallback.test.cjs +0 -433
  364. package/lib/memory/minto-debouncer.test.cjs +0 -407
  365. package/lib/memory/minto-debouncer.worker.cjs +0 -46
  366. package/lib/memory/minto-migration-v88.test.cjs +0 -265
  367. package/lib/memory/minto-schema-v88.test.cjs +0 -390
  368. package/lib/memory/mos-status-renderer.test.cjs +0 -631
  369. package/lib/memory/narrative-schema.cjs +0 -376
  370. package/lib/memory/narrative-schema.test.cjs +0 -209
  371. package/lib/memory/nav-dial.test.cjs +0 -414
  372. package/lib/memory/navigation-engine-core.test.cjs +0 -722
  373. package/lib/memory/navigation-invariants.test.cjs +0 -483
  374. package/lib/memory/offer-presenter.test.cjs +0 -554
  375. package/lib/memory/on-stop-snapshot.test.cjs +0 -404
  376. package/lib/memory/pending-tension-store.cjs +0 -373
  377. package/lib/memory/post-compact-reinjection.test.cjs +0 -854
  378. package/lib/memory/post-write-triple.test.cjs +0 -317
  379. package/lib/memory/pre-compact-snapshot.test.cjs +0 -495
  380. package/lib/memory/problem-type-router.test.cjs +0 -656
  381. package/lib/memory/query-efficiency-telemetry.test.cjs +0 -370
  382. package/lib/memory/recompile-room-references.test.cjs +0 -392
  383. package/lib/memory/recompile-room-references.worker.cjs +0 -42
  384. package/lib/memory/record-decision-dual-write.test.cjs +0 -454
  385. package/lib/memory/room-classifier-strict-mode.test.cjs +0 -417
  386. package/lib/memory/room-minto-hook.test.cjs +0 -398
  387. package/lib/memory/rs-discovery-engine.test.cjs +0 -323
  388. package/lib/memory/run-feynman-tests.cjs +0 -1239
  389. package/lib/memory/security-trifecta.test.cjs +0 -312
  390. package/lib/memory/session-start-brain-staleness.test.cjs +0 -363
  391. package/lib/memory/session-start-triple-injection.test.cjs +0 -514
  392. package/lib/memory/sessionstart-banner-formatter.cjs +0 -318
  393. package/lib/memory/sessionstart-minto-banner.test.cjs +0 -373
  394. package/lib/memory/skill-activation-router.test.cjs +0 -419
  395. package/lib/memory/stamp-artifact-write.test.cjs +0 -304
  396. package/lib/memory/statusline-active-room.test.cjs +0 -315
  397. package/lib/memory/statusline-minto-segment.test.cjs +0 -292
  398. package/lib/memory/sync-async-entry-points.test.cjs +0 -204
  399. package/lib/memory/test-bridge-writer-enhanced.cjs +0 -452
  400. package/lib/memory/test-rs-brain-substrate-shape.cjs +0 -529
  401. package/lib/memory/test-rs-brain-substrate.cjs +0 -636
  402. package/lib/memory/test-rs-breakthrough-scorer.cjs +0 -375
  403. package/lib/memory/test-rs-canon-violations.cjs +0 -218
  404. package/lib/memory/test-rs-chain-feeder-core.cjs +0 -344
  405. package/lib/memory/test-rs-chain-feeder-skill-spawn.cjs +0 -297
  406. package/lib/memory/test-rs-commercial-assessor.cjs +0 -385
  407. package/lib/memory/test-rs-differential-scorer.cjs +0 -480
  408. package/lib/memory/test-rs-discovery-engine.cjs +0 -603
  409. package/lib/memory/test-rs-domain-analyzer.cjs +0 -492
  410. package/lib/memory/test-rs-egress-primitives.cjs +0 -420
  411. package/lib/memory/test-rs-expert-mapper.cjs +0 -547
  412. package/lib/memory/test-rs-explain-command.cjs +0 -443
  413. package/lib/memory/test-rs-fetcher-academic.cjs +0 -848
  414. package/lib/memory/test-rs-fetcher-experts.cjs +0 -496
  415. package/lib/memory/test-rs-fetcher-industry.cjs +0 -702
  416. package/lib/memory/test-rs-fetcher-patents.cjs +0 -674
  417. package/lib/memory/test-rs-innovation-classifier.cjs +0 -301
  418. package/lib/memory/test-rs-mind-map.cjs +0 -646
  419. package/lib/memory/test-rs-neo4j-writer.cjs +0 -518
  420. package/lib/memory/test-rs-nl-to-query.cjs +0 -449
  421. package/lib/memory/test-rs-pinecone-bridge.cjs +0 -277
  422. package/lib/memory/test-rs-preprocessor.cjs +0 -433
  423. package/lib/memory/test-rs-query-matrix.cjs +0 -391
  424. package/lib/memory/test-rs-query-to-text.cjs +0 -551
  425. package/lib/memory/test-rs-sqlite-mirror.cjs +0 -649
  426. package/lib/memory/test-rs-thesis-generator.cjs +0 -360
  427. package/lib/memory/triple-context-formatter.cjs +0 -473
  428. package/lib/memory/triple-context-formatter.test.cjs +0 -442
  429. package/lib/memory/user-md-persona.test.cjs +0 -565
  430. package/lib/memory/userpromptsubmit-integration.test.cjs +0 -690
  431. package/lib/memory/validators/README.md +0 -157
  432. package/lib/memory/validators/brain-md-invariants.cjs +0 -475
  433. package/lib/memory/validators/brain-substrate-invariants.cjs +0 -285
  434. package/lib/memory/validators/external-academic-invariants.cjs +0 -249
  435. package/lib/memory/validators/external-industry-invariants.cjs +0 -271
  436. package/lib/memory/validators/external-patents-invariants.cjs +0 -266
  437. package/lib/memory/validators/minto-invariants.cjs +0 -62
  438. package/lib/memory/validators/navigation-invariants.cjs +0 -340
  439. package/lib/memory/validators/queue-health.cjs +0 -95
  440. package/lib/memory/validators/snapshot-integrity.cjs +0 -129
  441. package/lib/memory/validators/stale-lifecycle.cjs +0 -116
  442. package/lib/memory/vault-section-minto-generator-atomic.test.cjs +0 -556
  443. package/lib/memory/vault-section-minto-generator-atomic.worker.cjs +0 -73
  444. package/lib/memory/write-lock-atomic.test.cjs +0 -137
  445. package/lib/memory/write-lock-atomic.worker.cjs +0 -55
  446. package/lib/parity/check-parity.cjs +0 -83
  447. package/lib/presentation/presentation-server.cjs +0 -101
  448. package/lib/presentation/presentation-watcher.cjs +0 -123
  449. package/lib/quickview/hub-server.cjs +0 -719
  450. package/lib/quickview/server.cjs +0 -533
  451. package/lib/render/JTBD-PALETTES.md +0 -145
  452. package/lib/render/ROOM.md +0 -59
  453. package/lib/render/render-v2.cjs +0 -486
  454. package/lib/render/render-v2.test.cjs +0 -267
  455. package/lib/render/render.cjs +0 -65
  456. package/lib/state/ROOM.md +0 -46
  457. package/lib/state/state-md-parser.cjs +0 -215
  458. package/lib/statusline/ROOM.md +0 -38
  459. package/lib/statusline/banner-suppression.cjs +0 -50
  460. package/lib/statusline/surface-detect.cjs +0 -85
  461. package/lib/update-bootstrap.sh.template +0 -145
  462. package/lib/vault/frontmatter-schema.cjs +0 -297
  463. package/lib/vault/room-scanner.cjs +0 -352
  464. package/lib/vault/wikilink-builder.cjs +0 -231
  465. package/lib/vault/wikilink-builder.test.cjs +0 -182
  466. package/lib/wiki/graph-links.cjs +0 -281
  467. package/lib/wiki/page-renderer.cjs +0 -229
  468. package/lib/wiki/wiki-chat.cjs +0 -81
  469. package/lib/wiki/wiki-layout.cjs +0 -1459
  470. package/lib/wiki/wiki-search.cjs +0 -142
  471. package/lib/wiki/wiki-server.cjs +0 -678
  472. package/lib/wiki/wiki-watcher.cjs +0 -105
  473. package/pipelines/analogy/01-decompose.md +0 -80
  474. package/pipelines/analogy/02-abstract.md +0 -87
  475. package/pipelines/analogy/03-search.md +0 -135
  476. package/pipelines/analogy/04-transfer.md +0 -101
  477. package/pipelines/analogy/05-validate.md +0 -106
  478. package/pipelines/analogy/CHAIN.md +0 -56
  479. package/pipelines/discovery/01-explore-domains.md +0 -44
  480. package/pipelines/discovery/02-think-hats.md +0 -50
  481. package/pipelines/discovery/03-analyze-needs.md +0 -54
  482. package/pipelines/discovery/CHAIN.md +0 -37
  483. package/pipelines/thesis/01-structure-argument.md +0 -45
  484. package/pipelines/thesis/02-challenge-assumptions.md +0 -48
  485. package/pipelines/thesis/03-build-thesis.md +0 -54
  486. package/pipelines/thesis/CHAIN.md +0 -37
  487. package/references/brain/causal-directives.md +0 -91
  488. package/references/brain/causal-enrichment.cypher +0 -165
  489. package/references/brain/command-triggers-schema.md +0 -226
  490. package/references/brain/graph-architecture.md +0 -317
  491. package/references/brain/query-patterns.md +0 -460
  492. package/references/brain/room-hierarchy-schema.md +0 -218
  493. package/references/brain/schema.md +0 -76
  494. package/references/capability-radar/capabilities-index.md +0 -241
  495. package/references/capability-radar/changelog-cache.md +0 -81
  496. package/references/causal/causal-schema.md +0 -103
  497. package/references/design/email-template-standard.md +0 -155
  498. package/references/design/graph-visualization-standard.md +0 -178
  499. package/references/document-generation.md +0 -179
  500. package/references/hsi/HSI-TOOLS-REFERENCE.md +0 -222
  501. package/references/import-config.md +0 -141
  502. package/references/integrations/detection-patterns.md +0 -101
  503. package/references/meeting/artifact-template.md +0 -377
  504. package/references/meeting/cross-meeting-intelligence.md +0 -216
  505. package/references/meeting/cross-relationship-patterns.md +0 -202
  506. package/references/meeting/live-join-interface.md +0 -244
  507. package/references/meeting/section-mapping.md +0 -192
  508. package/references/meeting/segment-classification.md +0 -258
  509. package/references/meeting/speaker-profile-template.md +0 -219
  510. package/references/meeting/summary-template.md +0 -348
  511. package/references/meeting/transcript-patterns.md +0 -226
  512. package/references/methodology/analyze-needs.md +0 -135
  513. package/references/methodology/analyze-systems.md +0 -121
  514. package/references/methodology/analyze-timing.md +0 -149
  515. package/references/methodology/beautiful-question.md +0 -109
  516. package/references/methodology/build-knowledge.md +0 -161
  517. package/references/methodology/build-thesis.md +0 -237
  518. package/references/methodology/challenge-assumptions.md +0 -127
  519. package/references/methodology/diagnose.md +0 -169
  520. package/references/methodology/dominant-designs.md +0 -212
  521. package/references/methodology/explore-domains.md +0 -147
  522. package/references/methodology/explore-futures.md +0 -163
  523. package/references/methodology/explore-trends.md +0 -129
  524. package/references/methodology/find-bottlenecks.md +0 -131
  525. package/references/methodology/grade.md +0 -211
  526. package/references/methodology/index.md +0 -97
  527. package/references/methodology/leadership.md +0 -200
  528. package/references/methodology/lean-canvas.md +0 -116
  529. package/references/methodology/macro-trends.md +0 -192
  530. package/references/methodology/map-unknowns.md +0 -137
  531. package/references/methodology/mullins-7-domains.md +0 -104
  532. package/references/methodology/problem-types.md +0 -65
  533. package/references/methodology/root-cause.md +0 -178
  534. package/references/methodology/sapphire-encoding.md +0 -355
  535. package/references/methodology/scenario-plan.md +0 -178
  536. package/references/methodology/score-innovation.md +0 -154
  537. package/references/methodology/structure-argument.md +0 -158
  538. package/references/methodology/systems-thinking.md +0 -159
  539. package/references/methodology/think-hats.md +0 -147
  540. package/references/methodology/triz-matrix.json +0 -751
  541. package/references/methodology/triz-principles.md +0 -501
  542. package/references/methodology/user-needs.md +0 -199
  543. package/references/methodology/validate.md +0 -163
  544. package/references/methodology/value-proposition.md +0 -244
  545. package/references/opportunities/funding-lifecycle.md +0 -103
  546. package/references/opportunities/grant-api-patterns.md +0 -99
  547. package/references/opportunities/opportunity-template.md +0 -84
  548. package/references/personality/assessment-philosophy.md +0 -72
  549. package/references/personality/lexicon.md +0 -100
  550. package/references/personality/persona-chains.md +0 -56
  551. package/references/personality/pws-lexicon-full.md +0 -499
  552. package/references/personality/voice-dna.md +0 -156
  553. package/references/personas/hat-perspectives.md +0 -76
  554. package/references/personas/persona-template.md +0 -63
  555. package/references/pipeline/act-output-contract.md +0 -88
  556. package/references/pipeline/chains-index.md +0 -39
  557. package/references/pws-profile-generation.md +0 -79
  558. package/references/reasoning/reasoning-schema.md +0 -143
  559. package/references/reasoning/reasoning-template.md +0 -68
  560. package/references/reasoning/run-template.md +0 -38
  561. package/references/research/RESEARCH_14_CLAUDE_CODE_SOURCE_ARCHITECTURE.md +0 -209
  562. package/references/research/RESEARCH_15_V1.8_OPTIMIZATION_JTBD.md +0 -375
  563. package/references/research/RESEARCH_16_NATIVE_FIRST_PLUGIN_ARCHITECTURE.md +0 -575
  564. package/references/research/RESEARCH_17_MCP_UI_FRAMEWORKS.md +0 -272
  565. package/references/taxonomy/TAXONOMY.md +0 -192
  566. package/references/templates/MINTO.md +0 -36
  567. package/references/user-research/2026-04-05-leah-lawrence-session.md +0 -202
  568. package/references/vault-kit/README.md +0 -35
  569. package/references/vault-kit/app.json +0 -12
  570. package/references/vault-kit/appearance.json +0 -12
  571. package/references/vault-kit/graph.json +0 -35
  572. package/references/vault-kit/snippets/mindrian-destijl.css +0 -297
  573. package/references/vault-kit/templates/new-artifact.md +0 -37
  574. package/references/vault-kit/templates/new-meeting-note.md +0 -35
  575. package/references/vault-kit/templates/new-team-profile.md +0 -29
  576. package/references/vault-kit/templates/new-xref.md +0 -35
  577. package/references/visual/symbol-system.md +0 -151
  578. package/skills/MOSDeckEngine/SKILL.md +0 -325
  579. package/skills/brain-connector/SKILL.md +0 -114
  580. package/skills/context-engine/SKILL.md +0 -147
  581. package/skills/conversation-mode/SKILL.md +0 -102
  582. package/skills/larry-personality/SKILL.md +0 -219
  583. package/skills/larry-personality/framework-chains.md +0 -92
  584. package/skills/larry-personality/mode-engine.md +0 -185
  585. package/skills/mullins-scaffold/SKILL.md +0 -61
  586. package/skills/mullins-scaffold/scaffold.json +0 -146
  587. package/skills/pws-methodology/SKILL.md +0 -49
  588. package/skills/room-passive/SKILL.md +0 -165
  589. package/skills/room-proactive/SKILL.md +0 -250
  590. package/skills/ui-system/SKILL.md +0 -277
@@ -1,280 +0,0 @@
1
- /*
2
- * Copyright (c) 2026 Mindrian. BSL 1.1.
3
- * Phase 89.5 Plan 01 -- Phase 4 commercial assessor (deterministic).
4
- *
5
- * Deterministic 3-field commercial layer consumed by the Phase 89.5-04
6
- * top-level orchestrator (kickoff §5 Phase 4 Synthesis). Reads the post-
7
- * breakthrough-scorer + post-fetcher rs_discovery shape and emits:
8
- *
9
- * {
10
- * market_size_estimate: <string from frozen 5-bucket TAM/SAM table>,
11
- * value_proposition: <string from frozen classification template table>,
12
- * partnership_targets: <array derived from resolved_institutions + resolved_authors>,
13
- * }
14
- *
15
- * Hard contract:
16
- * 1. NO runtime LLM call (no fetch, no brain-client, no spawn of model
17
- * process). Pure-function from a frozen table lookup + array map.
18
- * 2. Deterministic: same input -> byte-identical JSON.stringify(output)
19
- * across N invocations.
20
- * 3. Edge-case safe: zero industry signals, single expert, missing
21
- * breakthrough_score, missing classification all produce deterministic
22
- * safe defaults; never throws on missing fields. Only throw paths are
23
- * Canon Part 8 forbidden-pattern violations on adversarial input.
24
- * 4. Canon Part 8 chokepoint: FIRST line of body is auditQueryObject on
25
- * the (rs_discovery, opts) tuple. Any forbidden field anywhere in the
26
- * tuple raises ExternalEgressViolation BEFORE any computation.
27
- *
28
- * Frozen tables:
29
- * VALUE_PROP_TEMPLATES -- keyed on classification ('structural_transfer',
30
- * 'semantic_implementation', 'hybrid', '_fallback'). Larry-style
31
- * template stems with [bridge_concept] / [source] / [target] /
32
- * [outcome] placeholders that are filled deterministically from
33
- * rs_discovery scalars (no free-form generation).
34
- *
35
- * MARKET_SIZE_BUCKETS -- 5 frozen TAM/SAM proxy buckets keyed on the
36
- * 2D quantile of (industry_signals_count, breakthrough_score):
37
- * emerging-niche (signals <= 1, score < 5)
38
- * small-targeted (signals 2-3, score 5-7)
39
- * mid-market (signals 4-6, score 6-8)
40
- * large-market (signals 7-10, score 8-9)
41
- * platform-scale (signals > 10, score >= 9)
42
- * Edge: missing breakthrough_score -> 'unknown-bucket' (deterministic).
43
- *
44
- * Bucket thresholds tuned conservatively for v1.11.0-beta.1; expanding
45
- * the bucket vocabulary requires a Plan 89.5-01-N revision (canon-amend
46
- * discipline).
47
- *
48
- * Pure CJS, zero npm deps, no Node built-ins beyond core require.
49
- */
50
- 'use strict';
51
-
52
- const { ExternalEgressViolation } = require('./rs-egress-violations.cjs');
53
- const { auditQueryObject } = require('./rs-egress-prompts.cjs');
54
-
55
- // ---------- Frozen invariants ----------
56
-
57
- // Larry-style value-proposition template stems keyed on classification.
58
- // Each stem is a deterministic template with [PLACEHOLDER] tokens that
59
- // are filled from rs_discovery scalars. NO free-form text generation.
60
- //
61
- // Stem-prefix design rule: the first 12 characters of each rendered
62
- // template string MUST differ across the three real classifications +
63
- // the fallback so T8 (classification table coverage) can verify table
64
- // distinctness on the rendered output without coupling to internal stem
65
- // keys. The leading words below ('Apply' / 'Implement' / 'Bridge' /
66
- // 'Cross-domain') satisfy the 12-char-distinct invariant.
67
- const VALUE_PROP_TEMPLATES = Object.freeze({
68
- structural_transfer:
69
- 'Apply [BRIDGE] from [SOURCE] to [TARGET] to unlock cross-domain advantage',
70
- semantic_implementation:
71
- 'Implement [BRIDGE] in [TARGET] to compress time from insight to validated decision',
72
- hybrid:
73
- 'Bridge [SOURCE] and [TARGET] via [BRIDGE] to unlock a defensible cross-domain moat',
74
- _fallback:
75
- 'Cross-domain opportunity: combine [SOURCE] and [TARGET] to address an underserved gap',
76
- });
77
-
78
- // 5-bucket TAM/SAM proxy table. Keyed on bucket-id; each entry is a
79
- // frozen string. Bucket selection is deterministic via a 2D step-function
80
- // over (industry_signals_count, breakthrough_score). See bucketize() below.
81
- const MARKET_SIZE_BUCKETS = Object.freeze({
82
- 'unknown-bucket':
83
- 'unknown-bucket: insufficient signal to estimate market size',
84
- 'emerging-niche':
85
- 'emerging-niche: pre-market opportunity; demand signal not yet established',
86
- 'small-targeted':
87
- 'small-targeted: focused vertical with bounded TAM; early-stage adopters',
88
- 'mid-market':
89
- 'mid-market: established demand with measurable SAM; multi-segment reach',
90
- 'large-market':
91
- 'large-market: validated demand with broad SAM; cross-segment platform potential',
92
- 'platform-scale':
93
- 'platform-scale: category-defining opportunity with cross-vertical reach',
94
- });
95
-
96
- // Frozen safe-default scalars.
97
- const SAFE_DEFAULT_BRIDGE = 'cross-domain bridge concept';
98
- const SAFE_DEFAULT_SOURCE = 'source domain';
99
- const SAFE_DEFAULT_TARGET = 'target domain';
100
-
101
- // ---------- bucketize ----------
102
- //
103
- // 2D step-function over (signals, score). Pure deterministic lookup.
104
- //
105
- // Bucket selection rules (in order; first match wins):
106
- // missing breakthrough_score (score === null) -> 'unknown-bucket'
107
- // signals <= 1 AND score < 5 -> 'emerging-niche'
108
- // signals between 2-3 AND score in [5, 7] -> 'small-targeted'
109
- // signals between 4-6 AND score in [6, 8] -> 'mid-market'
110
- // signals between 7-10 AND score in [8, 9] -> 'large-market'
111
- // signals > 10 AND score >= 9 -> 'platform-scale'
112
- // anything else -> nearest-neighbor by signals
113
-
114
- function bucketize(signals, score) {
115
- if (score === null || score === undefined) return 'unknown-bucket';
116
- const s = (typeof signals === 'number' && isFinite(signals)) ? signals : 0;
117
- const b = (typeof score === 'number' && isFinite(score)) ? score : 0;
118
- // Top-down: pick the highest-bucket the input qualifies for. Each bucket
119
- // requires BOTH signals AND score to satisfy its threshold pair so a
120
- // single high dimension cannot inflate the estimate.
121
- if (s > 10 && b >= 9) return 'platform-scale';
122
- if (s >= 7 && b >= 8) return 'large-market';
123
- if (s >= 4 && b >= 6) return 'mid-market';
124
- if (s >= 2 && b >= 5) return 'small-targeted';
125
- return 'emerging-niche';
126
- }
127
-
128
- // ---------- buildPartnershipTargets ----------
129
- //
130
- // Pure-function map from resolved_institutions + resolved_authors to a
131
- // deterministic ordered array of partnership targets. Empty inputs yield
132
- // [] (empty array). Authors precede institutions; both are sorted by the
133
- // natural input order from the upstream fetcher (no re-sort here so
134
- // upstream determinism propagates).
135
-
136
- function buildPartnershipTargets(rs_discovery) {
137
- if (!rs_discovery || typeof rs_discovery !== 'object') return [];
138
- const out = [];
139
- const authors = Array.isArray(rs_discovery.resolved_authors) ? rs_discovery.resolved_authors : [];
140
- for (let i = 0; i < authors.length; i += 1) {
141
- const a = authors[i];
142
- if (!a || typeof a !== 'object') continue;
143
- const name = (typeof a.name === 'string' && a.name.length > 0) ? a.name : null;
144
- if (!name) continue;
145
- out.push({
146
- name: name,
147
- type: 'author',
148
- // Score = 1.0 - (i / authors.length) so the upstream-natural-order
149
- // first author scores highest. Deterministic from input order.
150
- score: 1.0 - (i / Math.max(authors.length, 1)),
151
- });
152
- }
153
- const institutions = Array.isArray(rs_discovery.resolved_institutions) ? rs_discovery.resolved_institutions : [];
154
- for (let i = 0; i < institutions.length; i += 1) {
155
- const inst = institutions[i];
156
- if (typeof inst !== 'string' || inst.length === 0) continue;
157
- out.push({
158
- name: inst,
159
- type: 'institution',
160
- score: 1.0 - (i / Math.max(institutions.length, 1)),
161
- });
162
- }
163
- return out;
164
- }
165
-
166
- // ---------- buildValueProposition ----------
167
- //
168
- // Deterministic template-fill from frozen VALUE_PROP_TEMPLATES. Picks
169
- // the template by classification (with '_fallback' for missing); fills
170
- // [BRIDGE] / [SOURCE] / [TARGET] tokens from rs_discovery scalars when
171
- // present (with safe defaults otherwise).
172
-
173
- function buildValueProposition(rs_discovery) {
174
- const cls = (rs_discovery && typeof rs_discovery.classification === 'string'
175
- && (rs_discovery.classification in VALUE_PROP_TEMPLATES))
176
- ? rs_discovery.classification
177
- : '_fallback';
178
- let stem = VALUE_PROP_TEMPLATES[cls];
179
- const bridge = (rs_discovery && typeof rs_discovery.bridge_concept === 'string'
180
- && rs_discovery.bridge_concept.length > 0)
181
- ? rs_discovery.bridge_concept
182
- : SAFE_DEFAULT_BRIDGE;
183
- const source = (rs_discovery && typeof rs_discovery.query_concept === 'string'
184
- && rs_discovery.query_concept.length > 0)
185
- ? rs_discovery.query_concept
186
- : SAFE_DEFAULT_SOURCE;
187
- const target = (rs_discovery && typeof rs_discovery.doc_concept === 'string'
188
- && rs_discovery.doc_concept.length > 0)
189
- ? rs_discovery.doc_concept
190
- : SAFE_DEFAULT_TARGET;
191
- // Token replacement is deterministic global string replace; no regex
192
- // escaping needed because tokens are frozen literals.
193
- stem = stem.split('[BRIDGE]').join(bridge);
194
- stem = stem.split('[SOURCE]').join(source);
195
- stem = stem.split('[TARGET]').join(target);
196
- return stem;
197
- }
198
-
199
- // ---------- buildMarketSizeEstimate ----------
200
- //
201
- // Pure-function lookup from frozen MARKET_SIZE_BUCKETS. Reads
202
- // industry_signals_count + breakthrough_score; missing breakthrough_score
203
- // yields 'unknown-bucket' (the safe-default path).
204
-
205
- function buildMarketSizeEstimate(rs_discovery) {
206
- if (!rs_discovery || typeof rs_discovery !== 'object') {
207
- return MARKET_SIZE_BUCKETS['unknown-bucket'];
208
- }
209
- const signals = (typeof rs_discovery.industry_signals_count === 'number')
210
- ? rs_discovery.industry_signals_count
211
- : 0;
212
- // Distinguish "explicitly missing breakthrough_score" (-> unknown-bucket)
213
- // from "score = 0" (-> emerging-niche by bucketize). The hasOwnProperty
214
- // check catches the missing case.
215
- const hasScore = Object.prototype.hasOwnProperty.call(rs_discovery, 'breakthrough_score')
216
- && rs_discovery.breakthrough_score !== undefined
217
- && rs_discovery.breakthrough_score !== null;
218
- const score = hasScore ? rs_discovery.breakthrough_score : null;
219
- const bucketId = bucketize(signals, score);
220
- return MARKET_SIZE_BUCKETS[bucketId];
221
- }
222
-
223
- // ---------- assess ----------
224
- //
225
- // Public entry point. FIRST line of body: auditQueryObject on the
226
- // composite (rs_discovery, opts) tuple. Throws ExternalEgressViolation on
227
- // any forbidden field BEFORE any computation. The chokepoint is the only
228
- // throw path; all other branches return deterministic safe defaults.
229
- //
230
- // Inputs:
231
- // rs_discovery optional object (post-breakthrough-scorer shape)
232
- // opts optional object (caller-supplied configuration scalars)
233
- //
234
- // Output:
235
- // {
236
- // market_size_estimate: <string from MARKET_SIZE_BUCKETS>,
237
- // value_proposition: <string from VALUE_PROP_TEMPLATES>,
238
- // partnership_targets: <array of {name, type, score} entries>,
239
- // }
240
-
241
- function assess(rs_discovery, opts) {
242
- // Canon Part 8 chokepoint: pre-input audit on the composite tuple.
243
- // Throws ExternalEgressViolation BEFORE any field is touched. Empty
244
- // tuple is permitted (no-args path); only the audit-on-non-empty
245
- // branch is adversarial-relevant. We always audit so a malicious
246
- // opts cannot smuggle through the no-args branch.
247
- auditQueryObject({
248
- rs_discovery: (rs_discovery === undefined ? null : rs_discovery),
249
- opts: (opts === undefined ? null : opts),
250
- }, 'rs-commercial-assessor-input');
251
-
252
- // Safe-default path: no rs_discovery -> deterministic minimal output.
253
- const safeIn = (rs_discovery && typeof rs_discovery === 'object') ? rs_discovery : {};
254
-
255
- return {
256
- market_size_estimate: buildMarketSizeEstimate(safeIn),
257
- value_proposition: buildValueProposition(safeIn),
258
- partnership_targets: buildPartnershipTargets(safeIn),
259
- };
260
- }
261
-
262
- // ---------- Exports ----------
263
-
264
- module.exports = {
265
- assess: assess,
266
- // Re-export sentinel so adversarial fixtures can reference the class
267
- // without a second require() round-trip.
268
- ExternalEgressViolation: ExternalEgressViolation,
269
- _test: {
270
- VALUE_PROP_TEMPLATES: VALUE_PROP_TEMPLATES,
271
- MARKET_SIZE_BUCKETS: MARKET_SIZE_BUCKETS,
272
- SAFE_DEFAULT_BRIDGE: SAFE_DEFAULT_BRIDGE,
273
- SAFE_DEFAULT_SOURCE: SAFE_DEFAULT_SOURCE,
274
- SAFE_DEFAULT_TARGET: SAFE_DEFAULT_TARGET,
275
- bucketize: bucketize,
276
- buildPartnershipTargets: buildPartnershipTargets,
277
- buildValueProposition: buildValueProposition,
278
- buildMarketSizeEstimate: buildMarketSizeEstimate,
279
- },
280
- };
@@ -1,376 +0,0 @@
1
- /*
2
- * Copyright (c) 2026 Mindrian. BSL 1.1.
3
- * Phase 89.2 Plan 06 Task 3 -- Phase 3 dual-floor differential scorer.
4
- *
5
- * Pair-wise differential scorer per kickoff §5:
6
- *
7
- * pair passes IFF (diff > 0.3 AND LSA > 0.2 AND BERT > 0.2)
8
- *
9
- * where diff = |LSA - BERT|. Strict > comparisons throughout (Test 5
10
- * verifies the exact-threshold case fails). The dual-floor filter is the
11
- * detection signal that distinguishes structural-transfer pairs (LSA high,
12
- * BERT low) from semantic-implementation pairs (BERT high, LSA low) from
13
- * direct-intersection pairs (both high, low diff -- pruned by the diff floor).
14
- *
15
- * --------------------------------------------------------------------------
16
- * CANON PART 7 CARVE-OUT (DELIBERATE, DOCUMENTED)
17
- * --------------------------------------------------------------------------
18
- *
19
- * The pair-wise LSA cosine below uses an embedded sklearn TfidfVectorizer +
20
- * TruncatedSVD subset inside lsaBridgeScript -- NOT rs_math.py's
21
- * build_tfidf_svd. This is a deliberate exception to Reuse Before Build
22
- * because rs_math.py's API is CORPUS-LEVEL: it expects Sequence[str] >= 3
23
- * documents and fits a corpus-wide IDF + SVD basis. A pair-wise comparison
24
- * (1 query_concept vs 1 doc_concept = 2-document mini-corpus) cannot consume
25
- * that API without forcing degenerate corpus statistics that change the
26
- * algorithm's semantics:
27
- *
28
- * - 2-document IDF is mathematically meaningless (IDF on a 2-document
29
- * corpus collapses the whole vocabulary into one of two values; the
30
- * "rare-term up-weighting" that motivates IDF stops working).
31
- *
32
- * - 1-component SVD (max for a 2-document matrix) does NOT correspond
33
- * to Kwan 2023's algorithm, which fits ~80 components against a real
34
- * corpus to capture topic structure.
35
- *
36
- * The pair-wise question requires a fresh per-pair TfidfVectorizer +
37
- * TruncatedSVD fit specifically tuned for the pair-wise cosine -- which IS
38
- * what lsaBridgeScript does. rs_math.py continues to be consumed in its
39
- * CORPUS-MODE use case (e.g., scripts/rs-engine.py for corpus reverse-salient
40
- * computation per Phase 89-01 / 89-03 / 89-05).
41
- *
42
- * To avoid future drift toward "all LSA must go through one path," this
43
- * carve-out is documented in three locations:
44
- *
45
- * 1. The plan's must_haves block + objective (.planning/phases/89.2-.../
46
- * 89.2-06-preprocessor-and-differential-scorer-PLAN.md)
47
- * 2. This source file's header comment block (above)
48
- * 3. The embedded Python lsaBridgeScript header (inside lsaBridgeScript)
49
- *
50
- * Acceptance grep enforces the carve-out comment block (>= 2 hits across
51
- * the CJS header AND the embedded Python header) so refactors that strip
52
- * one without the other are loud, not silent.
53
- *
54
- * --------------------------------------------------------------------------
55
- *
56
- * BERT cosine path (Canon Part 7 reuse, NO carve-out): consumes
57
- * lib/core/rs-pinecone-bridge.cjs (Task 1 of this plan) which wraps the
58
- * existing rs_cache.py::fetch_all_from_namespace primitive (Phase 89-03
59
- * v1.10.16) for strict-1024-dim Pinecone-direct vector retrieval.
60
- *
61
- * Graceful degradation contract:
62
- *
63
- * bridge fails (no PINECONE_API_KEY, network error, namespace empty)
64
- * -> {diff: <lsa>, lsa: <lsa>, bert: null, passes: lsa > LSA_FLOOR,
65
- * warning: 'bert_unavailable'}
66
- * -> NEVER throws on bridge failure
67
- *
68
- * LSA bridge fails (python3 missing, sklearn import error, parse error)
69
- * -> {diff: null, lsa: null, bert: <bert>, passes: false,
70
- * warning: 'lsa_unavailable'}
71
- * -> Pessimistic: passes=false because LSA is the structural anchor;
72
- * without LSA the differential signal is unrecoverable.
73
- *
74
- * Canon Part 8 (Graph Boundary): two defense-in-depth layers.
75
- *
76
- * Layer 1 -- pre-input scan: query_concept + doc_concept are passed
77
- * through auditQueryString BEFORE either bridge is called. On
78
- * FORBIDDEN_PATTERNS hit, throws ExternalEgressViolation; the bridges
79
- * are NEVER invoked (Tests 9 + 10 verify call counts == 0).
80
- *
81
- * Layer 2 -- pre-return audit: composite output is passed through
82
- * auditQueryObject before return. Throws ExternalEgressViolation on
83
- * hit. Defense-in-depth so any forbidden pattern smuggled via the
84
- * bridge response (warning fields, error fields) is caught at the gate.
85
- *
86
- * Pure CJS, zero npm deps, node built-ins only beyond the rs-egress-* +
87
- * rs-pinecone-bridge primitives.
88
- */
89
- 'use strict';
90
-
91
- const path = require('node:path');
92
- const childProcess = require('child_process');
93
- const { auditQueryString, auditQueryObject } = require('./rs-egress-prompts.cjs');
94
- const pineconeBridge = require('./rs-pinecone-bridge.cjs');
95
- // rs-egress-violations is required transitively by rs-egress-prompts; we do
96
- // not throw ExternalEgressViolation directly from this module (the audit
97
- // helpers do). The require below is a reachability witness for the audit chain.
98
- require('./rs-egress-violations.cjs');
99
-
100
- // ---------- Frozen invariants ----------
101
-
102
- const REPO_ROOT = path.resolve(__dirname, '..', '..');
103
- const PYTHON_BIN = process.env.MINDRIAN_PYTHON || 'python3';
104
- const LSA_BRIDGE_TIMEOUT_MS = 30000;
105
-
106
- // Dual-floor thresholds per kickoff §5. Strict > comparisons.
107
- const DIFF_FLOOR = 0.3;
108
- const LSA_FLOOR = 0.2;
109
- const BERT_FLOOR = 0.2;
110
-
111
- // ---------- Embedded Python LSA bridge script ----------
112
- //
113
- // CANON PART 7 CARVE-OUT (DELIBERATE, DOCUMENTED): see file header above
114
- // for the complete justification. In short:
115
- // rs_math.py::build_tfidf_svd is corpus-level (Sequence[str] >= 3 docs);
116
- // pair-wise (1 vs 1) cosine cannot consume that API without forcing
117
- // degenerate IDF + SVD. The script below fits a fresh per-pair
118
- // TfidfVectorizer + TruncatedSVD specifically for the pair-wise question.
119
- //
120
- // The leading `# BSL 1.1` line plus the carve-out justification block
121
- // constitute the Canon discipline marker on the embedded source surface
122
- // (W4 fix per Plan 89.2-06). Acceptance grep enforces presence in both
123
- // the CJS file header (above) AND this embedded Python block.
124
-
125
- const lsaBridgeScript = [
126
- '# BSL 1.1',
127
- '# Copyright (c) 2026 Mindrian. Phase 89.2 Plan 06 Task 3 -- pair-wise LSA cosine.',
128
- '#',
129
- '# CANON PART 7 CARVE-OUT (DELIBERATE, DOCUMENTED): This script computes',
130
- '# pair-wise (1 vs 1) LSA cosine. It does NOT call rs_math.py because',
131
- '# rs_math.py::build_tfidf_svd is corpus-level (Sequence[str] >= 3',
132
- '# documents) and would produce degenerate IDF + SVD on a 2-document pair.',
133
- '# The embedded sklearn subset below fits a fresh per-pair TfidfVectorizer',
134
- '# + TruncatedSVD specifically for the pair-wise question, which is the',
135
- '# algorithmically correct path. rs_math.py is consumed in CORPUS mode by',
136
- '# scripts/rs-engine.py.',
137
- '#',
138
- '# Protocol:',
139
- '# stdin JSON {a: string, b: string}',
140
- '# stdout JSON {success: true, cosine: number} OR {success: false, error: string}',
141
- 'import sys, json',
142
- 'try:',
143
- ' from sklearn.feature_extraction.text import TfidfVectorizer',
144
- ' from sklearn.metrics.pairwise import cosine_similarity as sk_cos',
145
- ' from sklearn.decomposition import TruncatedSVD',
146
- ' payload = json.loads(sys.stdin.read())',
147
- ' a = str(payload.get("a", ""))',
148
- ' b = str(payload.get("b", ""))',
149
- ' if len(a.strip()) == 0 or len(b.strip()) == 0:',
150
- ' sys.stdout.write(json.dumps({"success": True, "cosine": 0.0}))',
151
- ' sys.exit(0)',
152
- ' texts = [a, b]',
153
- ' vec = TfidfVectorizer(stop_words="english").fit_transform(texts)',
154
- ' if vec.shape[1] < 2:',
155
- ' sys.stdout.write(json.dumps({"success": True, "cosine": 0.0}))',
156
- ' sys.exit(0)',
157
- ' n_components = max(1, min(80, vec.shape[1] - 1, vec.shape[0] - 1))',
158
- ' svd = TruncatedSVD(n_components=n_components, random_state=256).fit(vec)',
159
- ' reduced = svd.transform(vec)',
160
- ' c = float(sk_cos(reduced[0:1], reduced[1:2])[0][0])',
161
- ' # Clamp to [0, 1] for downstream dual-floor consistency. Negative LSA',
162
- ' # cosines arise on degenerate SVD bases and are not interpretable as',
163
- ' # similarity in the Kwan 2023 framework.',
164
- ' sys.stdout.write(json.dumps({"success": True, "cosine": max(0.0, c)}))',
165
- 'except Exception as e:',
166
- ' sys.stdout.write(json.dumps({"success": False, "error": str(e)}))',
167
- '',
168
- ].join('\n');
169
-
170
- // ---------- computeLsaCosine ----------
171
- //
172
- // Spawns python3 with the embedded lsaBridgeScript, passes the two strings
173
- // via JSON-over-stdin, parses the response. Returns:
174
- //
175
- // {success: true, cosine: number}
176
- // {success: false, error: 'python_unavailable'|'python_exit_<N>'|'parse_error'|'timeout'|...}
177
-
178
- async function computeLsaCosine(a, b) {
179
- const requestEnvelope = JSON.stringify({ a: a, b: b });
180
- let res;
181
- try {
182
- res = childProcess.spawnSync(PYTHON_BIN, ['-c', lsaBridgeScript], {
183
- input: requestEnvelope,
184
- encoding: 'utf8',
185
- timeout: LSA_BRIDGE_TIMEOUT_MS,
186
- cwd: REPO_ROOT,
187
- });
188
- } catch (err) {
189
- return { success: false, error: 'spawn_threw', detail: String(err && err.message) };
190
- }
191
-
192
- if (res && res.error) {
193
- if (res.error.code === 'ENOENT') return { success: false, error: 'python_unavailable' };
194
- if (res.error.code === 'ETIMEDOUT' || res.error.code === 'ERR_CHILD_PROCESS_TIMEOUT') {
195
- return { success: false, error: 'timeout' };
196
- }
197
- return { success: false, error: 'spawn_error', detail: String(res.error.message) };
198
- }
199
-
200
- if (res && res.signal === 'SIGTERM') {
201
- return { success: false, error: 'timeout' };
202
- }
203
-
204
- const stdout = (res && typeof res.stdout === 'string') ? res.stdout : '';
205
- const stderr = (res && typeof res.stderr === 'string') ? res.stderr : '';
206
-
207
- if (res && res.status !== 0) {
208
- return {
209
- success: false,
210
- error: 'python_exit_' + res.status,
211
- stderr: stderr.slice(0, 500),
212
- };
213
- }
214
-
215
- let parsed;
216
- try {
217
- parsed = JSON.parse(stdout);
218
- } catch (_e) {
219
- return { success: false, error: 'parse_error', stdout_sample: stdout.slice(0, 200) };
220
- }
221
-
222
- if (!parsed || typeof parsed !== 'object') {
223
- return { success: false, error: 'parse_error' };
224
- }
225
-
226
- if (parsed.success !== true) {
227
- return { success: false, error: typeof parsed.error === 'string' ? parsed.error : 'bridge_error' };
228
- }
229
-
230
- if (typeof parsed.cosine !== 'number' || isNaN(parsed.cosine)) {
231
- return { success: false, error: 'invalid_cosine' };
232
- }
233
-
234
- return { success: true, cosine: parsed.cosine };
235
- }
236
-
237
- // ---------- computeBertCosine ----------
238
- //
239
- // Twin queryPineconeWithVectors calls (one per concept), then pure-JS
240
- // cosineSimilarity on the resulting 1024-dim vectors. Returns:
241
- //
242
- // {success: true, cosine: number}
243
- // {success: false, error: 'namespace_required'|'bridge_failed'|'no_hits'|'shape_error'}
244
-
245
- async function computeBertCosine(a, b, namespace) {
246
- if (typeof namespace !== 'string' || namespace.length === 0) {
247
- return { success: false, error: 'namespace_required' };
248
- }
249
-
250
- const resA = await pineconeBridge.queryPineconeWithVectors(namespace, a, 1);
251
- if (!resA || resA.success !== true) {
252
- return { success: false, error: 'bridge_failed_a', detail: resA && resA.error };
253
- }
254
- const resB = await pineconeBridge.queryPineconeWithVectors(namespace, b, 1);
255
- if (!resB || resB.success !== true) {
256
- return { success: false, error: 'bridge_failed_b', detail: resB && resB.error };
257
- }
258
-
259
- if (!Array.isArray(resA.hits) || resA.hits.length === 0) {
260
- return { success: false, error: 'no_hits_a' };
261
- }
262
- if (!Array.isArray(resB.hits) || resB.hits.length === 0) {
263
- return { success: false, error: 'no_hits_b' };
264
- }
265
-
266
- const va = resA.hits[0] && resA.hits[0].values;
267
- const vb = resB.hits[0] && resB.hits[0].values;
268
- if (!Array.isArray(va) || !Array.isArray(vb)) {
269
- return { success: false, error: 'shape_error' };
270
- }
271
- if (va.length !== vb.length || va.length === 0) {
272
- return { success: false, error: 'dim_mismatch' };
273
- }
274
-
275
- const cos = pineconeBridge.cosineSimilarity(va, vb);
276
- return { success: true, cosine: cos };
277
- }
278
-
279
- // ---------- score ----------
280
- //
281
- // Public entry point. Pair-wise dual-floor differential scorer.
282
- //
283
- // Inputs:
284
- // query_concept string the concept seeded from preprocessor.concepts[]
285
- // doc_concept string the candidate concept (cross-domain or same-domain)
286
- // opts optional:
287
- // namespace string Pinecone namespace for BERT cosine (typically 'external:<topic-slug>')
288
- //
289
- // Output (happy path):
290
- // {diff, lsa, bert, passes}
291
- //
292
- // Output (graceful degradation):
293
- // {diff, lsa, bert: null, passes: lsa>0.2, warning: 'bert_unavailable'}
294
- // {diff: null, lsa: null, bert, passes: false, warning: 'lsa_unavailable'}
295
- //
296
- // Throws (the only escape route -- Canon Part 8):
297
- // ExternalEgressViolation if either concept matches FORBIDDEN_PATTERNS
298
-
299
- async function score(query_concept, doc_concept, opts) {
300
- // Canon Part 8 Layer 1: pre-input scan on user-controlled concepts.
301
- // auditQueryString throws ExternalEgressViolation on hit; the bridges
302
- // below are NEVER invoked when this throws. Tests 9 + 10 verify the
303
- // call-count contract.
304
- auditQueryString(typeof query_concept === 'string' ? query_concept : '', 'differential-scorer');
305
- auditQueryString(typeof doc_concept === 'string' ? doc_concept : '', 'differential-scorer');
306
-
307
- opts = opts || {};
308
- const namespace = (typeof opts.namespace === 'string' && opts.namespace.length > 0)
309
- ? opts.namespace
310
- : null;
311
-
312
- // Run both bridges in parallel. computeLsaCosine is cheap (single Python
313
- // spawn); computeBertCosine spawns the Pinecone bridge twice. Promise.all
314
- // means LSA does not block on BERT's spawnSync in the parallel mock-test
315
- // case. Sequential await would be equivalent for correctness; parallel
316
- // is the future-proofing for real Brain latency.
317
- const [lsaResult, bertResult] = await Promise.all([
318
- computeLsaCosine(query_concept, doc_concept),
319
- computeBertCosine(query_concept, doc_concept, namespace),
320
- ]);
321
-
322
- let out;
323
- if (lsaResult.success && bertResult.success) {
324
- const lsa = lsaResult.cosine;
325
- const bert = bertResult.cosine;
326
- const diff = Math.abs(lsa - bert);
327
- const passes = (diff > DIFF_FLOOR) && (lsa > LSA_FLOOR) && (bert > BERT_FLOOR);
328
- out = { diff: diff, lsa: lsa, bert: bert, passes: passes };
329
- } else if (lsaResult.success && !bertResult.success) {
330
- // BERT unavailable: degrade to LSA-only. Per plan: bert=null, diff=lsa
331
- // (treat as max divergence), passes=(lsa>LSA_FLOOR only since bert
332
- // unavailable), warning='bert_unavailable'.
333
- const lsa = lsaResult.cosine;
334
- out = {
335
- diff: lsa,
336
- lsa: lsa,
337
- bert: null,
338
- passes: lsa > LSA_FLOOR,
339
- warning: 'bert_unavailable',
340
- };
341
- } else {
342
- // LSA failed (with or without BERT): pessimistic. Per plan: passes=false
343
- // because LSA is the structural anchor; without LSA the differential
344
- // signal is unrecoverable.
345
- out = {
346
- diff: null,
347
- lsa: null,
348
- bert: bertResult.success ? bertResult.cosine : null,
349
- passes: false,
350
- warning: 'lsa_unavailable',
351
- };
352
- }
353
-
354
- // Canon Part 8 Layer 2: pre-return audit on composite output.
355
- // Throws ExternalEgressViolation on any FORBIDDEN_PATTERNS hit.
356
- auditQueryObject(out, 'differential-scorer');
357
-
358
- return out;
359
- }
360
-
361
- // ---------- Exports ----------
362
-
363
- module.exports = {
364
- score: score,
365
- _test: {
366
- DIFF_FLOOR: DIFF_FLOOR,
367
- LSA_FLOOR: LSA_FLOOR,
368
- BERT_FLOOR: BERT_FLOOR,
369
- LSA_BRIDGE_TIMEOUT_MS: LSA_BRIDGE_TIMEOUT_MS,
370
- PYTHON_BIN: PYTHON_BIN,
371
- REPO_ROOT: REPO_ROOT,
372
- computeLsaCosine: computeLsaCosine,
373
- computeBertCosine: computeBertCosine,
374
- lsaBridgeScript: lsaBridgeScript,
375
- },
376
- };