@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.
Files changed (597) hide show
  1. package/.claude-plugin/plugin.json +21 -0
  2. package/.mcp.json +9 -0
  3. package/CHANGELOG.md +3333 -0
  4. package/LICENSE +123 -0
  5. package/README.md +673 -0
  6. package/agents/brain-query.md +80 -0
  7. package/agents/framework-runner.md +237 -0
  8. package/agents/grading.md +188 -0
  9. package/agents/investor.md +128 -0
  10. package/agents/larry-extended.md +135 -0
  11. package/agents/opportunity-scanner.md +91 -0
  12. package/agents/persona-analyst.md +132 -0
  13. package/agents/research.md +89 -0
  14. package/agents/reverse-salient-agent.md +27 -0
  15. package/bin/cli.js +142 -0
  16. package/bin/mindrian-mcp-server.cjs +182 -0
  17. package/bin/mindrian-tools.cjs +765 -0
  18. package/commands/act.md +439 -0
  19. package/commands/admin.md +404 -0
  20. package/commands/analyze-needs.md +42 -0
  21. package/commands/analyze-systems.md +39 -0
  22. package/commands/analyze-timing.md +42 -0
  23. package/commands/auto-explore.md +64 -0
  24. package/commands/beautiful-question.md +40 -0
  25. package/commands/brain-derive.md +78 -0
  26. package/commands/build-knowledge.md +42 -0
  27. package/commands/build-thesis.md +46 -0
  28. package/commands/causal.md +234 -0
  29. package/commands/challenge-assumptions.md +33 -0
  30. package/commands/compare-ventures.md +83 -0
  31. package/commands/dashboard.md +110 -0
  32. package/commands/deep-grade.md +82 -0
  33. package/commands/diagnose.md +58 -0
  34. package/commands/diagnostics.md +151 -0
  35. package/commands/doctor.md +151 -0
  36. package/commands/dominant-designs.md +40 -0
  37. package/commands/explain-decision.md +87 -0
  38. package/commands/explore-domains.md +42 -0
  39. package/commands/explore-futures.md +40 -0
  40. package/commands/explore-trends.md +42 -0
  41. package/commands/export.md +103 -0
  42. package/commands/file-meeting.md +724 -0
  43. package/commands/find-analogies.md +188 -0
  44. package/commands/find-bottlenecks.md +62 -0
  45. package/commands/find-connections.md +76 -0
  46. package/commands/funding.md +81 -0
  47. package/commands/grade.md +203 -0
  48. package/commands/graph.md +128 -0
  49. package/commands/hat-briefing.md +125 -0
  50. package/commands/heal.md +196 -0
  51. package/commands/help.md +399 -0
  52. package/commands/hmi-status.md +172 -0
  53. package/commands/jtbd.md +241 -0
  54. package/commands/leadership.md +73 -0
  55. package/commands/lean-canvas.md +40 -0
  56. package/commands/macro-trends.md +40 -0
  57. package/commands/map-unknowns.md +40 -0
  58. package/commands/memory.md +173 -0
  59. package/commands/models.md +175 -0
  60. package/commands/mos-reason.md +285 -0
  61. package/commands/mullins.md +120 -0
  62. package/commands/new-project.md +481 -0
  63. package/commands/onboard.md +434 -0
  64. package/commands/operator.md +149 -0
  65. package/commands/opportunities.md +144 -0
  66. package/commands/organize.md +497 -0
  67. package/commands/persona.md +198 -0
  68. package/commands/pipeline.md +112 -0
  69. package/commands/present.md +91 -0
  70. package/commands/publish.md +201 -0
  71. package/commands/query.md +124 -0
  72. package/commands/radar.md +72 -0
  73. package/commands/reanalyze.md +91 -0
  74. package/commands/research.md +196 -0
  75. package/commands/room.md +352 -0
  76. package/commands/rooms.md +598 -0
  77. package/commands/root-cause.md +40 -0
  78. package/commands/rs-experts.md +85 -0
  79. package/commands/rs-explain.md +100 -0
  80. package/commands/rs-fetch.md +94 -0
  81. package/commands/rs-thesis.md +85 -0
  82. package/commands/scenario-plan.md +40 -0
  83. package/commands/scheduled-tasks.md +285 -0
  84. package/commands/score-innovation.md +43 -0
  85. package/commands/scout.md +239 -0
  86. package/commands/setup.md +618 -0
  87. package/commands/snapshot.md +147 -0
  88. package/commands/speakers.md +84 -0
  89. package/commands/splash.md +28 -0
  90. package/commands/status.md +75 -0
  91. package/commands/structure-argument.md +42 -0
  92. package/commands/suggest-next.md +80 -0
  93. package/commands/systems-thinking.md +40 -0
  94. package/commands/think-hats.md +42 -0
  95. package/commands/update.md +181 -0
  96. package/commands/user-needs.md +40 -0
  97. package/commands/validate.md +40 -0
  98. package/commands/value-proposition.md +61 -0
  99. package/commands/vault.md +180 -0
  100. package/commands/visualize.md +52 -0
  101. package/commands/whitespace.md +507 -0
  102. package/commands/wiki.md +69 -0
  103. package/hooks/hooks.json +381 -0
  104. package/hooks/run-hook.cmd +64 -0
  105. package/lib/__init__.py +0 -0
  106. package/lib/__pycache__/__init__.cpython-312.pyc +0 -0
  107. package/lib/agents/auto-explore-agent.cjs +1043 -0
  108. package/lib/agents/reverse-salient-agent.cjs +679 -0
  109. package/lib/agents/tension-hook-agent.cjs +544 -0
  110. package/lib/brain/ROOM.md +44 -0
  111. package/lib/brain/chain-recommender.cjs +301 -0
  112. package/lib/chat/chat-context.js +185 -0
  113. package/lib/chat/chat-panel.js +721 -0
  114. package/lib/chat/fabric-chat.cjs +288 -0
  115. package/lib/chat/generative-tools.js +219 -0
  116. package/lib/conversation/ROOM.md +39 -0
  117. package/lib/conversation/classifier-rules.json +38 -0
  118. package/lib/conversation/classifier.cjs +264 -0
  119. package/lib/conversation/operator.cjs +287 -0
  120. package/lib/copy/115-spec-strings.cjs +55 -0
  121. package/lib/core/__init__.py +0 -0
  122. package/lib/core/__nav-stub.cjs +14 -0
  123. package/lib/core/__pycache__/__init__.cpython-312.pyc +0 -0
  124. package/lib/core/__pycache__/rs-math.cpython-312.pyc +0 -0
  125. package/lib/core/__pycache__/rs_cache.cpython-312.pyc +0 -0
  126. package/lib/core/__pycache__/rs_corpus.cpython-312.pyc +0 -0
  127. package/lib/core/__pycache__/rs_hybrid.cpython-312.pyc +0 -0
  128. package/lib/core/__pycache__/rs_math.cpython-312.pyc +0 -0
  129. package/lib/core/__pycache__/rs_rooms.cpython-312.pyc +0 -0
  130. package/lib/core/artifact-id.cjs +148 -0
  131. package/lib/core/asset-ops.cjs +151 -0
  132. package/lib/core/auto-commit-throttle.cjs +129 -0
  133. package/lib/core/bearer-token.cjs +199 -0
  134. package/lib/core/brain-client.cjs +865 -0
  135. package/lib/core/brain-derivation-prompts.cjs +326 -0
  136. package/lib/core/brain-derivation-queue.cjs +431 -0
  137. package/lib/core/brain-derivation.cjs +580 -0
  138. package/lib/core/brain-md-schema.cjs +528 -0
  139. package/lib/core/brain-md-staleness.cjs +357 -0
  140. package/lib/core/brain-response-sanitize.cjs +188 -0
  141. package/lib/core/bridge-writer.cjs +477 -0
  142. package/lib/core/chat-context-builder.cjs +253 -0
  143. package/lib/core/cross-room-aggregator.cjs +762 -0
  144. package/lib/core/daily-briefing.cjs +438 -0
  145. package/lib/core/decision-capture.cjs +618 -0
  146. package/lib/core/deep-links.cjs +82 -0
  147. package/lib/core/dispatch-optimizer.cjs +354 -0
  148. package/lib/core/dual-path-detector.cjs +84 -0
  149. package/lib/core/dual-path-detector.test.cjs +334 -0
  150. package/lib/core/exports-log.cjs +79 -0
  151. package/lib/core/feynman-minto-invariants.cjs +605 -0
  152. package/lib/core/folder-memory-async.cjs +338 -0
  153. package/lib/core/folder-memory-shared.cjs +890 -0
  154. package/lib/core/folder-memory.cjs +416 -0
  155. package/lib/core/framework-chain-composer.cjs +411 -0
  156. package/lib/core/frontmatter-schemas.cjs +330 -0
  157. package/lib/core/git-ops.cjs +141 -0
  158. package/lib/core/graph-ops.cjs +258 -0
  159. package/lib/core/hat-persistence.cjs +362 -0
  160. package/lib/core/index.cjs +60 -0
  161. package/lib/core/integration-registry.cjs +232 -0
  162. package/lib/core/intelligence-cascade.cjs +661 -0
  163. package/lib/core/lazygraph-ops.cjs +1057 -0
  164. package/lib/core/lru-cache.cjs +139 -0
  165. package/lib/core/mcp-profiles.cjs +182 -0
  166. package/lib/core/meeting-ops.cjs +54 -0
  167. package/lib/core/memory-ops.cjs +600 -0
  168. package/lib/core/migrations/ROOM.md +33 -0
  169. package/lib/core/migrations/phase-109-nodes-provenance.cjs +339 -0
  170. package/lib/core/migrations/phase-109-session-focus.cjs +99 -0
  171. package/lib/core/model-profiles.cjs +246 -0
  172. package/lib/core/mullins-scaffold.cjs +160 -0
  173. package/lib/core/nav-dial.cjs +316 -0
  174. package/lib/core/navigation/ROOM.md +15 -0
  175. package/lib/core/navigation/explanation.cjs +43 -0
  176. package/lib/core/navigation/focus.cjs +135 -0
  177. package/lib/core/navigation/ingestion.cjs +82 -0
  178. package/lib/core/navigation/insights.cjs +350 -0
  179. package/lib/core/navigation/memory-events.cjs +118 -0
  180. package/lib/core/navigation/neighborhood.cjs +78 -0
  181. package/lib/core/navigation/packet.cjs +182 -0
  182. package/lib/core/navigation/room-home.cjs +127 -0
  183. package/lib/core/navigation/transitions.cjs +82 -0
  184. package/lib/core/navigation-engine-shared.cjs +242 -0
  185. package/lib/core/navigation-engine.cjs +664 -0
  186. package/lib/core/navigation.cjs +60 -0
  187. package/lib/core/nl-graph-queries.cjs +164 -0
  188. package/lib/core/offer-presenter.cjs +406 -0
  189. package/lib/core/opportunity-extractor.cjs +183 -0
  190. package/lib/core/opportunity-ops.cjs +1371 -0
  191. package/lib/core/persona-ops.cjs +537 -0
  192. package/lib/core/persona-taxonomy.cjs +190 -0
  193. package/lib/core/platform-gates.cjs +120 -0
  194. package/lib/core/platform.cjs +257 -0
  195. package/lib/core/proactive-intelligence.cjs +528 -0
  196. package/lib/core/problem-type-router.cjs +315 -0
  197. package/lib/core/reasoning-ops.cjs +639 -0
  198. package/lib/core/reverse-salient-persona-suffix.cjs +115 -0
  199. package/lib/core/room-classifier-strict-mode.cjs +229 -0
  200. package/lib/core/room-db.cjs +127 -0
  201. package/lib/core/room-ops-async.cjs +92 -0
  202. package/lib/core/room-ops-shared.cjs +64 -0
  203. package/lib/core/room-ops-sync.cjs +70 -0
  204. package/lib/core/room-ops.cjs +32 -0
  205. package/lib/core/room-type-detector.cjs +386 -0
  206. package/lib/core/rs-brain-substrate-prompts.cjs +129 -0
  207. package/lib/core/rs-brain-substrate.cjs +570 -0
  208. package/lib/core/rs-breakthrough-scorer.cjs +255 -0
  209. package/lib/core/rs-canon-violations.cjs +82 -0
  210. package/lib/core/rs-chain-feeder.cjs +343 -0
  211. package/lib/core/rs-commercial-assessor.cjs +280 -0
  212. package/lib/core/rs-differential-scorer.cjs +376 -0
  213. package/lib/core/rs-domain-analyzer.cjs +385 -0
  214. package/lib/core/rs-egress-prompts.cjs +113 -0
  215. package/lib/core/rs-egress-telemetry.cjs +225 -0
  216. package/lib/core/rs-egress-violations.cjs +53 -0
  217. package/lib/core/rs-expert-mapper.cjs +467 -0
  218. package/lib/core/rs-fetcher-academic.cjs +697 -0
  219. package/lib/core/rs-fetcher-experts.cjs +314 -0
  220. package/lib/core/rs-fetcher-industry.cjs +731 -0
  221. package/lib/core/rs-fetcher-patents.cjs +564 -0
  222. package/lib/core/rs-innovation-classifier.cjs +194 -0
  223. package/lib/core/rs-mind-map.cjs +656 -0
  224. package/lib/core/rs-neo4j-writer.cjs +388 -0
  225. package/lib/core/rs-nl-to-query.cjs +425 -0
  226. package/lib/core/rs-pinecone-bridge.cjs +303 -0
  227. package/lib/core/rs-preprocessor.cjs +350 -0
  228. package/lib/core/rs-query-matrix.cjs +316 -0
  229. package/lib/core/rs-query-to-text.cjs +438 -0
  230. package/lib/core/rs-sqlite-mirror.cjs +443 -0
  231. package/lib/core/rs-thesis-generator.cjs +188 -0
  232. package/lib/core/rs_cache.py +479 -0
  233. package/lib/core/rs_corpus.py +468 -0
  234. package/lib/core/rs_hybrid.py +586 -0
  235. package/lib/core/rs_math.py +287 -0
  236. package/lib/core/rs_rooms.py +193 -0
  237. package/lib/core/scheduled-scanner.cjs +463 -0
  238. package/lib/core/scratchpad-ops.cjs +201 -0
  239. package/lib/core/section-8-trace-schema.cjs +138 -0
  240. package/lib/core/section-registry.cjs +111 -0
  241. package/lib/core/session-state.cjs +144 -0
  242. package/lib/core/shallow-doc-parser.cjs +174 -0
  243. package/lib/core/shallow-doc-parser.test.cjs +226 -0
  244. package/lib/core/skill-activation-router.cjs +284 -0
  245. package/lib/core/state-ops.cjs +46 -0
  246. package/lib/core/statusline-cache.cjs +266 -0
  247. package/lib/core/token-estimator.cjs +348 -0
  248. package/lib/core/user-archetype.cjs +239 -0
  249. package/lib/core/user-md-ops.cjs +524 -0
  250. package/lib/core/visual-ops.cjs +624 -0
  251. package/lib/core/write-lock.cjs +149 -0
  252. package/lib/graph/canvas-graph.js +467 -0
  253. package/lib/graph/constellation-config.cjs +299 -0
  254. package/lib/graph/graph-detail-panel.js +165 -0
  255. package/lib/hmi/ROOM.md +47 -0
  256. package/lib/hmi/across-session-memory.cjs +604 -0
  257. package/lib/hmi/cross-room-memory.cjs +575 -0
  258. package/lib/hmi/decoy-tier.cjs +395 -0
  259. package/lib/hmi/jtbd-classifier.cjs +219 -0
  260. package/lib/hmi/jtbd-state.cjs +199 -0
  261. package/lib/hmi/jtbd-taxonomy.json +392 -0
  262. package/lib/hmi/selector-dispatcher.cjs +546 -0
  263. package/lib/hmi/selector-telemetry.cjs +263 -0
  264. package/lib/hmi/shape-f0-renderer.cjs +139 -0
  265. package/lib/hmi/shape-f1-fallback.cjs +80 -0
  266. package/lib/hmi/shape-f1-renderer.cjs +138 -0
  267. package/lib/hmi/shape-f2-renderer.cjs +132 -0
  268. package/lib/hmi/shape-f3-renderer.cjs +66 -0
  269. package/lib/hmi/shape-f4-renderer.cjs +72 -0
  270. package/lib/hmi/shape-f5-renderer.cjs +155 -0
  271. package/lib/hmi/shape-f6-plan-review-renderer.cjs +312 -0
  272. package/lib/hmi/shape-f6-renderer.cjs +144 -0
  273. package/lib/hmi/shape-g-renderer.cjs +219 -0
  274. package/lib/hmi/shape-h-renderer.cjs +222 -0
  275. package/lib/hmi/tier-check.cjs +63 -0
  276. package/lib/import/PRECONDITIONS.md +41 -0
  277. package/lib/import/branding.cjs +210 -0
  278. package/lib/import/branding.test.cjs +235 -0
  279. package/lib/import/classifications-sync.cjs +104 -0
  280. package/lib/import/classifications-sync.test.cjs +129 -0
  281. package/lib/import/enricher.cjs +296 -0
  282. package/lib/import/enricher.test.cjs +273 -0
  283. package/lib/import/integration.test.cjs +376 -0
  284. package/lib/import/manifest.cjs +129 -0
  285. package/lib/import/manifest.schema.json +185 -0
  286. package/lib/import/manifest.test.cjs +123 -0
  287. package/lib/import/meeting-detector.cjs +92 -0
  288. package/lib/import/meeting-detector.test.cjs +100 -0
  289. package/lib/import/person-detector.cjs +229 -0
  290. package/lib/import/person-detector.test.cjs +149 -0
  291. package/lib/import/report.cjs +186 -0
  292. package/lib/import/report.test.cjs +186 -0
  293. package/lib/import/room-md-scaffolder.cjs +49 -0
  294. package/lib/import/router.cjs +224 -0
  295. package/lib/import/router.test.cjs +356 -0
  296. package/lib/import/run-all-tests.cjs +36 -0
  297. package/lib/import/smoke-test.cjs +213 -0
  298. package/lib/import/smoke-test.test.cjs +148 -0
  299. package/lib/import/test-fixtures/collision-vault/preexisting-room/STATE.md +8 -0
  300. package/lib/import/test-fixtures/collision-vault/preexisting-room/problem-definition/onboarding/onboarding.md +7 -0
  301. package/lib/import/test-fixtures/collision-vault/source/onboarding.md +5 -0
  302. package/lib/import/test-fixtures/obsidian-vault/.obsidian/workspace.json +1 -0
  303. package/lib/import/test-fixtures/obsidian-vault/notes/with-wikilinks.md +4 -0
  304. package/lib/import/test-fixtures/tiny-vault/notes/2026-01-15-team-sync.md +9 -0
  305. package/lib/import/test-fixtures/tiny-vault/notes/empty.md +3 -0
  306. package/lib/import/test-fixtures/tiny-vault/notes/onboarding.md +5 -0
  307. package/lib/import/test-fixtures/tiny-vault/notes/pricing.md +5 -0
  308. package/lib/import/test-fixtures/tiny-vault/notes/random.md +4 -0
  309. package/lib/import/undo.test.cjs +199 -0
  310. package/lib/import/vault-scanner.cjs +105 -0
  311. package/lib/import/vault-scanner.test.cjs +67 -0
  312. package/lib/mcp/app-html/dashboard.html +316 -0
  313. package/lib/mcp/app-html/graph.html +428 -0
  314. package/lib/mcp/app-html/mindrian-platform.html +1841 -0
  315. package/lib/mcp/app-html/wiki.html +383 -0
  316. package/lib/mcp/app-views.cjs +322 -0
  317. package/lib/mcp/brain-router.cjs +418 -0
  318. package/lib/mcp/capability-registry.cjs +62 -0
  319. package/lib/mcp/larry-context.cjs +46 -0
  320. package/lib/mcp/larry-server-instructions.md +114 -0
  321. package/lib/mcp/pipeline-state.cjs +275 -0
  322. package/lib/mcp/prompts.cjs +302 -0
  323. package/lib/mcp/resources.cjs +227 -0
  324. package/lib/mcp/session-catchup.cjs +327 -0
  325. package/lib/mcp/surface-detect.cjs +75 -0
  326. package/lib/mcp/tool-router.cjs +1034 -0
  327. package/lib/memory/aaak-compress.cjs +403 -0
  328. package/lib/memory/aaak-compress.test.cjs +288 -0
  329. package/lib/memory/async-artifact-auto-commit.test.cjs +223 -0
  330. package/lib/memory/bearer-token.test.cjs +315 -0
  331. package/lib/memory/brain-cache-lru.test.cjs +259 -0
  332. package/lib/memory/brain-client-query-shape.test.cjs +160 -0
  333. package/lib/memory/brain-derivation-graceful-degradation.test.cjs +1019 -0
  334. package/lib/memory/brain-derivation-queue.test.cjs +539 -0
  335. package/lib/memory/brain-derivation.test.cjs +634 -0
  336. package/lib/memory/brain-derive-command.test.cjs +534 -0
  337. package/lib/memory/brain-md-invariants-validator.test.cjs +704 -0
  338. package/lib/memory/brain-md-schema.test.cjs +467 -0
  339. package/lib/memory/brain-md-staleness.test.cjs +525 -0
  340. package/lib/memory/brain-server-resolution.test.cjs +314 -0
  341. package/lib/memory/chain-recommender.test.cjs +233 -0
  342. package/lib/memory/chat-context.test.cjs +128 -0
  343. package/lib/memory/command-registry.test.cjs +220 -0
  344. package/lib/memory/cross-room-aggregator.test.cjs +909 -0
  345. package/lib/memory/dashboard-server.test.cjs +256 -0
  346. package/lib/memory/debouncer-drain-at-prompt.test.cjs +389 -0
  347. package/lib/memory/decision-capture.test.cjs +632 -0
  348. package/lib/memory/decision-capture.worker.cjs +70 -0
  349. package/lib/memory/explain-decision-command.test.cjs +521 -0
  350. package/lib/memory/explain-decision-footer.test.cjs +316 -0
  351. package/lib/memory/explored-materials-store.cjs +392 -0
  352. package/lib/memory/feynman-minto-guardian.test.cjs +736 -0
  353. package/lib/memory/feynman-minto-invariants.test.cjs +511 -0
  354. package/lib/memory/feynman-prompts-drift.test.cjs +144 -0
  355. package/lib/memory/feynman-prompts.cjs +151 -0
  356. package/lib/memory/feynman-prompts.test.cjs +96 -0
  357. package/lib/memory/folder-memory-quadruple.test.cjs +548 -0
  358. package/lib/memory/folder-memory.test.cjs +503 -0
  359. package/lib/memory/framework-chain-composer.test.cjs +515 -0
  360. package/lib/memory/frontmatter-schema-validator.test.cjs +290 -0
  361. package/lib/memory/heal-command.test.cjs +604 -0
  362. package/lib/memory/index-artifact-transaction.test.cjs +333 -0
  363. package/lib/memory/lazygraph-rs-discoveries-view.test.cjs +122 -0
  364. package/lib/memory/mcp-input-validation.test.cjs +240 -0
  365. package/lib/memory/mcp-server-brain-deps.test.cjs +270 -0
  366. package/lib/memory/mcp-stack-fallback.test.cjs +433 -0
  367. package/lib/memory/minto-debouncer.test.cjs +407 -0
  368. package/lib/memory/minto-debouncer.worker.cjs +46 -0
  369. package/lib/memory/minto-migration-v88.test.cjs +265 -0
  370. package/lib/memory/minto-schema-v88.test.cjs +390 -0
  371. package/lib/memory/mos-status-renderer.test.cjs +631 -0
  372. package/lib/memory/narrative-schema.cjs +376 -0
  373. package/lib/memory/narrative-schema.test.cjs +209 -0
  374. package/lib/memory/nav-dial.test.cjs +414 -0
  375. package/lib/memory/navigation-engine-core.test.cjs +722 -0
  376. package/lib/memory/navigation-invariants.test.cjs +483 -0
  377. package/lib/memory/offer-presenter.test.cjs +554 -0
  378. package/lib/memory/on-stop-snapshot.test.cjs +404 -0
  379. package/lib/memory/pending-tension-store.cjs +373 -0
  380. package/lib/memory/post-compact-reinjection.test.cjs +854 -0
  381. package/lib/memory/post-write-triple.test.cjs +317 -0
  382. package/lib/memory/pre-compact-snapshot.test.cjs +495 -0
  383. package/lib/memory/problem-type-router.test.cjs +656 -0
  384. package/lib/memory/query-efficiency-telemetry.test.cjs +370 -0
  385. package/lib/memory/recompile-room-references.test.cjs +392 -0
  386. package/lib/memory/recompile-room-references.worker.cjs +42 -0
  387. package/lib/memory/record-decision-dual-write.test.cjs +454 -0
  388. package/lib/memory/room-classifier-strict-mode.test.cjs +417 -0
  389. package/lib/memory/room-minto-hook.test.cjs +398 -0
  390. package/lib/memory/rs-discovery-engine.test.cjs +323 -0
  391. package/lib/memory/run-feynman-tests.cjs +1247 -0
  392. package/lib/memory/security-trifecta.test.cjs +312 -0
  393. package/lib/memory/session-start-brain-staleness.test.cjs +363 -0
  394. package/lib/memory/session-start-triple-injection.test.cjs +514 -0
  395. package/lib/memory/sessionstart-banner-formatter.cjs +318 -0
  396. package/lib/memory/sessionstart-minto-banner.test.cjs +373 -0
  397. package/lib/memory/skill-activation-router.test.cjs +419 -0
  398. package/lib/memory/stamp-artifact-write.test.cjs +304 -0
  399. package/lib/memory/statusline-active-room.test.cjs +315 -0
  400. package/lib/memory/statusline-minto-segment.test.cjs +292 -0
  401. package/lib/memory/sync-async-entry-points.test.cjs +204 -0
  402. package/lib/memory/test-bridge-writer-enhanced.cjs +452 -0
  403. package/lib/memory/test-rs-brain-substrate-shape.cjs +529 -0
  404. package/lib/memory/test-rs-brain-substrate.cjs +636 -0
  405. package/lib/memory/test-rs-breakthrough-scorer.cjs +375 -0
  406. package/lib/memory/test-rs-canon-violations.cjs +218 -0
  407. package/lib/memory/test-rs-chain-feeder-core.cjs +344 -0
  408. package/lib/memory/test-rs-chain-feeder-skill-spawn.cjs +297 -0
  409. package/lib/memory/test-rs-commercial-assessor.cjs +385 -0
  410. package/lib/memory/test-rs-differential-scorer.cjs +480 -0
  411. package/lib/memory/test-rs-discovery-engine.cjs +603 -0
  412. package/lib/memory/test-rs-domain-analyzer.cjs +492 -0
  413. package/lib/memory/test-rs-egress-primitives.cjs +420 -0
  414. package/lib/memory/test-rs-expert-mapper.cjs +547 -0
  415. package/lib/memory/test-rs-explain-command.cjs +443 -0
  416. package/lib/memory/test-rs-fetcher-academic.cjs +848 -0
  417. package/lib/memory/test-rs-fetcher-experts.cjs +496 -0
  418. package/lib/memory/test-rs-fetcher-industry.cjs +702 -0
  419. package/lib/memory/test-rs-fetcher-patents.cjs +674 -0
  420. package/lib/memory/test-rs-innovation-classifier.cjs +301 -0
  421. package/lib/memory/test-rs-mind-map.cjs +646 -0
  422. package/lib/memory/test-rs-neo4j-writer.cjs +518 -0
  423. package/lib/memory/test-rs-nl-to-query.cjs +449 -0
  424. package/lib/memory/test-rs-pinecone-bridge.cjs +277 -0
  425. package/lib/memory/test-rs-preprocessor.cjs +433 -0
  426. package/lib/memory/test-rs-query-matrix.cjs +391 -0
  427. package/lib/memory/test-rs-query-to-text.cjs +551 -0
  428. package/lib/memory/test-rs-sqlite-mirror.cjs +649 -0
  429. package/lib/memory/test-rs-thesis-generator.cjs +360 -0
  430. package/lib/memory/triple-context-formatter.cjs +473 -0
  431. package/lib/memory/triple-context-formatter.test.cjs +442 -0
  432. package/lib/memory/user-md-persona.test.cjs +565 -0
  433. package/lib/memory/userpromptsubmit-integration.test.cjs +690 -0
  434. package/lib/memory/validators/README.md +157 -0
  435. package/lib/memory/validators/brain-md-invariants.cjs +475 -0
  436. package/lib/memory/validators/brain-substrate-invariants.cjs +285 -0
  437. package/lib/memory/validators/external-academic-invariants.cjs +249 -0
  438. package/lib/memory/validators/external-industry-invariants.cjs +271 -0
  439. package/lib/memory/validators/external-patents-invariants.cjs +266 -0
  440. package/lib/memory/validators/minto-invariants.cjs +62 -0
  441. package/lib/memory/validators/navigation-invariants.cjs +340 -0
  442. package/lib/memory/validators/queue-health.cjs +95 -0
  443. package/lib/memory/validators/snapshot-integrity.cjs +129 -0
  444. package/lib/memory/validators/stale-lifecycle.cjs +116 -0
  445. package/lib/memory/vault-section-minto-generator-atomic.test.cjs +556 -0
  446. package/lib/memory/vault-section-minto-generator-atomic.worker.cjs +73 -0
  447. package/lib/memory/write-lock-atomic.test.cjs +137 -0
  448. package/lib/memory/write-lock-atomic.worker.cjs +55 -0
  449. package/lib/parity/check-parity.cjs +83 -0
  450. package/lib/presentation/presentation-server.cjs +101 -0
  451. package/lib/presentation/presentation-watcher.cjs +123 -0
  452. package/lib/quickview/hub-server.cjs +719 -0
  453. package/lib/quickview/server.cjs +533 -0
  454. package/lib/render/JTBD-PALETTES.md +145 -0
  455. package/lib/render/ROOM.md +59 -0
  456. package/lib/render/render-v2.cjs +486 -0
  457. package/lib/render/render-v2.test.cjs +267 -0
  458. package/lib/render/render.cjs +65 -0
  459. package/lib/state/ROOM.md +46 -0
  460. package/lib/state/state-md-parser.cjs +215 -0
  461. package/lib/statusline/ROOM.md +38 -0
  462. package/lib/statusline/banner-suppression.cjs +50 -0
  463. package/lib/statusline/surface-detect.cjs +85 -0
  464. package/lib/update-bootstrap.sh.template +145 -0
  465. package/lib/vault/frontmatter-schema.cjs +297 -0
  466. package/lib/vault/room-scanner.cjs +352 -0
  467. package/lib/vault/wikilink-builder.cjs +231 -0
  468. package/lib/vault/wikilink-builder.test.cjs +182 -0
  469. package/lib/wiki/graph-links.cjs +281 -0
  470. package/lib/wiki/page-renderer.cjs +229 -0
  471. package/lib/wiki/wiki-chat.cjs +81 -0
  472. package/lib/wiki/wiki-layout.cjs +1459 -0
  473. package/lib/wiki/wiki-search.cjs +142 -0
  474. package/lib/wiki/wiki-server.cjs +678 -0
  475. package/lib/wiki/wiki-watcher.cjs +105 -0
  476. package/lib/workflow/ROOM.md +47 -0
  477. package/lib/workflow/command-resolver.cjs +155 -0
  478. package/lib/workflow/command-resolver.test.cjs +235 -0
  479. package/package.json +44 -0
  480. package/pipelines/analogy/01-decompose.md +80 -0
  481. package/pipelines/analogy/02-abstract.md +87 -0
  482. package/pipelines/analogy/03-search.md +135 -0
  483. package/pipelines/analogy/04-transfer.md +101 -0
  484. package/pipelines/analogy/05-validate.md +106 -0
  485. package/pipelines/analogy/CHAIN.md +56 -0
  486. package/pipelines/discovery/01-explore-domains.md +44 -0
  487. package/pipelines/discovery/02-think-hats.md +50 -0
  488. package/pipelines/discovery/03-analyze-needs.md +54 -0
  489. package/pipelines/discovery/CHAIN.md +37 -0
  490. package/pipelines/thesis/01-structure-argument.md +45 -0
  491. package/pipelines/thesis/02-challenge-assumptions.md +48 -0
  492. package/pipelines/thesis/03-build-thesis.md +54 -0
  493. package/pipelines/thesis/CHAIN.md +37 -0
  494. package/references/brain/causal-directives.md +91 -0
  495. package/references/brain/causal-enrichment.cypher +165 -0
  496. package/references/brain/command-triggers-schema.md +226 -0
  497. package/references/brain/graph-architecture.md +317 -0
  498. package/references/brain/query-patterns.md +460 -0
  499. package/references/brain/room-hierarchy-schema.md +218 -0
  500. package/references/brain/schema.md +76 -0
  501. package/references/capability-radar/capabilities-index.md +241 -0
  502. package/references/capability-radar/changelog-cache.md +81 -0
  503. package/references/causal/causal-schema.md +103 -0
  504. package/references/design/email-template-standard.md +155 -0
  505. package/references/design/graph-visualization-standard.md +178 -0
  506. package/references/document-generation.md +179 -0
  507. package/references/hsi/HSI-TOOLS-REFERENCE.md +222 -0
  508. package/references/import-config.md +141 -0
  509. package/references/integrations/detection-patterns.md +101 -0
  510. package/references/meeting/artifact-template.md +377 -0
  511. package/references/meeting/cross-meeting-intelligence.md +216 -0
  512. package/references/meeting/cross-relationship-patterns.md +202 -0
  513. package/references/meeting/live-join-interface.md +244 -0
  514. package/references/meeting/section-mapping.md +192 -0
  515. package/references/meeting/segment-classification.md +258 -0
  516. package/references/meeting/speaker-profile-template.md +219 -0
  517. package/references/meeting/summary-template.md +348 -0
  518. package/references/meeting/transcript-patterns.md +226 -0
  519. package/references/methodology/analyze-needs.md +135 -0
  520. package/references/methodology/analyze-systems.md +121 -0
  521. package/references/methodology/analyze-timing.md +149 -0
  522. package/references/methodology/beautiful-question.md +109 -0
  523. package/references/methodology/build-knowledge.md +161 -0
  524. package/references/methodology/build-thesis.md +237 -0
  525. package/references/methodology/challenge-assumptions.md +127 -0
  526. package/references/methodology/diagnose.md +169 -0
  527. package/references/methodology/dominant-designs.md +212 -0
  528. package/references/methodology/explore-domains.md +147 -0
  529. package/references/methodology/explore-futures.md +163 -0
  530. package/references/methodology/explore-trends.md +129 -0
  531. package/references/methodology/find-bottlenecks.md +131 -0
  532. package/references/methodology/grade.md +211 -0
  533. package/references/methodology/index.md +97 -0
  534. package/references/methodology/leadership.md +200 -0
  535. package/references/methodology/lean-canvas.md +116 -0
  536. package/references/methodology/macro-trends.md +192 -0
  537. package/references/methodology/map-unknowns.md +137 -0
  538. package/references/methodology/mullins-7-domains.md +104 -0
  539. package/references/methodology/problem-types.md +65 -0
  540. package/references/methodology/root-cause.md +178 -0
  541. package/references/methodology/sapphire-encoding.md +355 -0
  542. package/references/methodology/scenario-plan.md +178 -0
  543. package/references/methodology/score-innovation.md +154 -0
  544. package/references/methodology/structure-argument.md +158 -0
  545. package/references/methodology/systems-thinking.md +159 -0
  546. package/references/methodology/think-hats.md +147 -0
  547. package/references/methodology/triz-matrix.json +751 -0
  548. package/references/methodology/triz-principles.md +501 -0
  549. package/references/methodology/user-needs.md +199 -0
  550. package/references/methodology/validate.md +163 -0
  551. package/references/methodology/value-proposition.md +244 -0
  552. package/references/opportunities/funding-lifecycle.md +103 -0
  553. package/references/opportunities/grant-api-patterns.md +99 -0
  554. package/references/opportunities/opportunity-template.md +84 -0
  555. package/references/personality/assessment-philosophy.md +72 -0
  556. package/references/personality/lexicon.md +100 -0
  557. package/references/personality/persona-chains.md +56 -0
  558. package/references/personality/pws-lexicon-full.md +499 -0
  559. package/references/personality/voice-dna.md +156 -0
  560. package/references/personas/hat-perspectives.md +76 -0
  561. package/references/personas/persona-template.md +63 -0
  562. package/references/pipeline/act-output-contract.md +88 -0
  563. package/references/pipeline/chains-index.md +39 -0
  564. package/references/pws-profile-generation.md +79 -0
  565. package/references/reasoning/reasoning-schema.md +143 -0
  566. package/references/reasoning/reasoning-template.md +68 -0
  567. package/references/reasoning/run-template.md +38 -0
  568. package/references/research/RESEARCH_14_CLAUDE_CODE_SOURCE_ARCHITECTURE.md +209 -0
  569. package/references/research/RESEARCH_15_V1.8_OPTIMIZATION_JTBD.md +375 -0
  570. package/references/research/RESEARCH_16_NATIVE_FIRST_PLUGIN_ARCHITECTURE.md +575 -0
  571. package/references/research/RESEARCH_17_MCP_UI_FRAMEWORKS.md +272 -0
  572. package/references/taxonomy/TAXONOMY.md +192 -0
  573. package/references/templates/MINTO.md +36 -0
  574. package/references/user-research/2026-04-05-leah-lawrence-session.md +202 -0
  575. package/references/vault-kit/README.md +35 -0
  576. package/references/vault-kit/app.json +12 -0
  577. package/references/vault-kit/appearance.json +12 -0
  578. package/references/vault-kit/graph.json +35 -0
  579. package/references/vault-kit/snippets/mindrian-destijl.css +297 -0
  580. package/references/vault-kit/templates/new-artifact.md +37 -0
  581. package/references/vault-kit/templates/new-meeting-note.md +35 -0
  582. package/references/vault-kit/templates/new-team-profile.md +29 -0
  583. package/references/vault-kit/templates/new-xref.md +35 -0
  584. package/references/visual/symbol-system.md +151 -0
  585. package/skills/MOSDeckEngine/SKILL.md +325 -0
  586. package/skills/brain-connector/SKILL.md +114 -0
  587. package/skills/context-engine/SKILL.md +147 -0
  588. package/skills/conversation-mode/SKILL.md +102 -0
  589. package/skills/larry-personality/SKILL.md +219 -0
  590. package/skills/larry-personality/framework-chains.md +92 -0
  591. package/skills/larry-personality/mode-engine.md +185 -0
  592. package/skills/mullins-scaffold/SKILL.md +61 -0
  593. package/skills/mullins-scaffold/scaffold.json +146 -0
  594. package/skills/pws-methodology/SKILL.md +49 -0
  595. package/skills/room-passive/SKILL.md +165 -0
  596. package/skills/room-proactive/SKILL.md +250 -0
  597. package/skills/ui-system/SKILL.md +277 -0
@@ -0,0 +1,182 @@
1
+ 'use strict';
2
+ // Phase 109-07 Brain Packet Builder. Per CONTEXT D-06 + RESEARCH section 7.
3
+ // Phase 109 ships the BUILDER; Phase 110 ships the schema validator + brainClient.query call.
4
+ //
5
+ // Canon Part 8 LOAD-BEARING: zero raw room content egress. The packet payload carries ONLY
6
+ // generic framework handles, phase identifiers, sha256 hashes, and enum scalars. ZERO
7
+ // user-content strings, ZERO artifact bodies, ZERO meeting transcripts. Every field is
8
+ // projected through a safe-shape mapper that strips body/properties/transcript fields.
9
+ // Canon Part 9: builder produces the JS object; Phase 110 wraps with validateAndSendBrainPacket;
10
+ // Phase 109 honors the privacy: 'no_raw_artifact_text' field by default in constraints.
11
+
12
+ const path = require('node:path');
13
+ const crypto = require('node:crypto');
14
+ const { getNeighborhood } = require('./neighborhood.cjs');
15
+ const { findContradictions, findUnsupportedClaims, findRelevantOpportunities } = require('./insights.cjs');
16
+ const { findRecentChanges } = require('./memory-events.cjs');
17
+
18
+ function loadJtbd(roomDir, mocks) {
19
+ if (mocks && mocks.jtbd) return mocks.jtbd;
20
+ try { return require(path.resolve(__dirname, '..', '..', 'hmi', 'jtbd-state.cjs')); } catch (_) { return null; }
21
+ }
22
+
23
+ function loadOperator(roomDir, mocks) {
24
+ if (mocks && mocks.operator) return mocks.operator;
25
+ try { return require(path.resolve(__dirname, '..', '..', 'conversation', 'operator.cjs')); } catch (_) { return null; }
26
+ }
27
+
28
+ function shortText(propertiesOrJson) {
29
+ let p = propertiesOrJson;
30
+ if (typeof p === 'string') {
31
+ try { p = JSON.parse(p); } catch (_) { p = {}; }
32
+ }
33
+ p = p || {};
34
+ const candidates = [p.summary, p.claim, p.title, p.text];
35
+ for (const c of candidates) {
36
+ if (typeof c === 'string' && c.length > 0) {
37
+ return c.length > 120 ? c.slice(0, 117) + '...' : c;
38
+ }
39
+ }
40
+ return '';
41
+ }
42
+
43
+ function safeNodeProjection(db, n) {
44
+ // Project only safe scalar fields. Re-fetch properties to compute summary; never include body.
45
+ const row = db.prepare('SELECT properties FROM nodes WHERE id = ?').get(n.id);
46
+ const summary = row ? shortText(row.properties) : '';
47
+ return {
48
+ id: n.id,
49
+ type: n.type,
50
+ summary,
51
+ depth: n.depth,
52
+ edgeTypeIn: n.edgeTypeIn,
53
+ score: typeof n.score === 'number' ? Math.round(n.score * 1000) / 1000 : 0,
54
+ reviewStatus: n.reviewStatus,
55
+ lastSeenAt: n.lastSeenAt,
56
+ };
57
+ }
58
+
59
+ function safeContradictionProjection(c) {
60
+ return {
61
+ claimAId: c.claimA && c.claimA.id ? c.claimA.id : null,
62
+ claimBId: c.claimB && c.claimB.id ? c.claimB.id : null,
63
+ depth: 1,
64
+ explanation: c.explanation,
65
+ };
66
+ }
67
+
68
+ function safeUnsupportedProjection(u) {
69
+ return {
70
+ claimId: u.claim && u.claim.id ? u.claim.id : null,
71
+ type: u.claim && u.claim.type ? u.claim.type : null,
72
+ reviewStatus: u.claim && u.claim.reviewStatus ? u.claim.reviewStatus : null,
73
+ lastSeenAt: u.claim && u.claim.lastSeenAt ? u.claim.lastSeenAt : null,
74
+ explanation: u.explanation,
75
+ };
76
+ }
77
+
78
+ function safeRecentChangeProjection(r) {
79
+ return {
80
+ id: r.id,
81
+ eventType: r.eventType,
82
+ targetNodeId: r.targetNodeId,
83
+ createdAt: r.createdAt,
84
+ };
85
+ }
86
+
87
+ function hsiBand(score) {
88
+ const s = Number(score) || 0;
89
+ if (s >= 70) return 'high';
90
+ if (s >= 40) return 'medium';
91
+ return 'low';
92
+ }
93
+
94
+ function surface_banked_opportunities(db, focusNodeId, mocks) {
95
+ const opps = findRelevantOpportunities(db, focusNodeId, { topK: 3, _mocks: mocks });
96
+ return {
97
+ count: opps.length,
98
+ items: opps.map((o) => ({
99
+ id_hash: crypto.createHash('sha256').update(String(o.opportunityId || '')).digest('hex').slice(0, 12),
100
+ tags: Array.isArray(o.tags) ? o.tags.filter((t) => typeof t === 'string' && t.length <= 30) : [],
101
+ hsi_band: hsiBand(o.hsiScore),
102
+ composite_score: Math.round((Number(o.compositeScore) || 0) * 100) / 100,
103
+ })),
104
+ };
105
+ }
106
+
107
+ function getRoomStage(db) {
108
+ try {
109
+ const row = db.prepare("SELECT value FROM identity WHERE key = 'stage'").get();
110
+ if (row && typeof row.value === 'string' && row.value.length > 0) return row.value;
111
+ } catch (_) { /* ignore */ }
112
+ return 'unknown';
113
+ }
114
+
115
+ function getFocusType(db, focusNodeId) {
116
+ const row = db.prepare('SELECT type FROM nodes WHERE id = ?').get(focusNodeId);
117
+ return row ? row.type : null;
118
+ }
119
+
120
+ function buildBrainPacket(db, job, focusNodeId, opts) {
121
+ const options = opts || {};
122
+ const mocks = options._mocks;
123
+ const roomId = options.roomId || null;
124
+
125
+ // Active context. Mocks override the require() calls for hermetic tests.
126
+ const jtbdMod = loadJtbd(null, mocks);
127
+ const opMod = loadOperator(null, mocks);
128
+ const jtbdRaw = jtbdMod ? jtbdMod.getCurrent(null) : null;
129
+ const opRaw = opMod ? opMod.getCurrent(null) : null;
130
+ const jtbdId = jtbdRaw && jtbdRaw.current && jtbdRaw.current.id ? jtbdRaw.current.id : null;
131
+ const operator = opRaw && opRaw.current ? opRaw.current : 'JUST_TALK';
132
+
133
+ // Focus node.
134
+ const focusType = getFocusType(db, focusNodeId);
135
+ const focusRow = db.prepare('SELECT properties FROM nodes WHERE id = ?').get(focusNodeId);
136
+ const focusSummary = focusRow ? shortText(focusRow.properties) : '';
137
+
138
+ // Local graph summary. Each helper output passes through a safe-shape mapper so
139
+ // raw bodies, transcripts, and absolute paths NEVER reach the packet payload.
140
+ const neighborhood = getNeighborhood(db, focusNodeId, { maxDepth: 2, topK: 50 });
141
+ const nearestClaims = neighborhood
142
+ .filter((n) => ['claim', 'CausalClaim'].includes(n.type))
143
+ .slice(0, 5)
144
+ .map((n) => safeNodeProjection(db, n));
145
+ const nearestAssumptions = neighborhood
146
+ .filter((n) => n.type === 'assumption')
147
+ .slice(0, 5)
148
+ .map((n) => safeNodeProjection(db, n));
149
+ const contradictions = findContradictions(db, focusNodeId).slice(0, 5).map(safeContradictionProjection);
150
+ const unsupportedClaims = findUnsupportedClaims(db, roomId || 'unknown').slice(0, 5).map(safeUnsupportedProjection);
151
+ const recentChanges = findRecentChanges(db, Date.now() - 24 * 60 * 60 * 1000, { limit: 10 }).map(safeRecentChangeProjection);
152
+ const bankedOpportunities = surface_banked_opportunities(db, focusNodeId, mocks);
153
+
154
+ return {
155
+ packet_version: '1.0',
156
+ job,
157
+ room_stage: getRoomStage(db),
158
+ active_context: {
159
+ jtbd: jtbdId,
160
+ operator,
161
+ focus_node: {
162
+ id: focusNodeId,
163
+ type: focusType,
164
+ summary: focusSummary,
165
+ },
166
+ },
167
+ local_graph_summary: {
168
+ nearest_claims: nearestClaims,
169
+ nearest_assumptions: nearestAssumptions,
170
+ contradictions,
171
+ unsupported_claims: unsupportedClaims,
172
+ recent_changes: recentChanges,
173
+ banked_opportunities: bankedOpportunities,
174
+ },
175
+ constraints: {
176
+ privacy: 'no_raw_artifact_text',
177
+ max_tokens: 1200,
178
+ },
179
+ };
180
+ }
181
+
182
+ module.exports = { buildBrainPacket, surface_banked_opportunities, shortText };
@@ -0,0 +1,127 @@
1
+ 'use strict';
2
+ // Phase 109-09 Room Home Driver. Per CONTEXT D-08 + RESEARCH section 6.
3
+ // Composition NOT duplication. ZERO new SQL queries; 8 reads via existing helpers + 3 raw SELECTs.
4
+ //
5
+ // Canon Part 1: getRoomHomeView IS the wicked navigator's working memory made legible.
6
+ // Canon Part 4: every payload is composed from typed graph queries; the navigator never
7
+ // re-derives; the same node id never appears twice across confirmedFacts and riskyAssumptions
8
+ // (composition-not-duplication invariant asserted in tests/test-room-home-vs-brain-derivation-regression.cjs).
9
+ // Canon Part 7: composes Plan 109-04 getNeighborhood + Plan 109-05 findContradictions /
10
+ // findOpenQuestions / findRelevantOpportunities + Plan 109-03 findRecentChanges; ZERO
11
+ // new SQL queries beyond the 3 thin raw SELECTs that scope confirmed-facts / risky-assumptions /
12
+ // evidence-by-tier (each a single SELECT against nodes; cheaper than a CTE for small N).
13
+ // Canon Part 9: SELECT supersedes folder scanning; this is the user-facing payoff of Phase 109.
14
+
15
+ const { findContradictions, findOpenQuestions, findRelevantOpportunities } = require('./insights.cjs');
16
+ const { findRecentChanges } = require('./memory-events.cjs');
17
+
18
+ const TIERS = ['academic', 'operational', 'practitioner', 'none'];
19
+
20
+ function getCurrentThesis(db) {
21
+ try {
22
+ const row = db.prepare("SELECT value FROM identity WHERE key = 'thesis'").get();
23
+ return row && typeof row.value === 'string' ? row.value : '';
24
+ } catch (_) {
25
+ return '';
26
+ }
27
+ }
28
+
29
+ function safeShape(row) {
30
+ let summary = '';
31
+ try {
32
+ const props = JSON.parse(row.properties || '{}');
33
+ summary = props.summary || props.claim || props.title || '';
34
+ } catch (_) { /* ignore */ }
35
+ return {
36
+ id: row.id,
37
+ type: row.type,
38
+ summary: summary.length > 120 ? summary.slice(0, 117) + '...' : summary,
39
+ reviewStatus: row.review_status,
40
+ confidence: row.confidence,
41
+ lastSeenAt: row.last_seen_at,
42
+ };
43
+ }
44
+
45
+ function getConfirmedFacts(db) {
46
+ // Per CONTEXT D-08 + Plan 108 TRUTH-STATES: validated state is the strict
47
+ // confirmed-fact tier (claim / CausalClaim / assumption that cleared review).
48
+ const rows = db.prepare(
49
+ "SELECT id, type, properties, review_status, confidence, last_seen_at FROM nodes "
50
+ + "WHERE type IN ('claim','CausalClaim','assumption') AND review_status = 'validated' "
51
+ + "ORDER BY last_seen_at DESC LIMIT 50"
52
+ ).all();
53
+ return rows.map(safeShape);
54
+ }
55
+
56
+ function getRiskyAssumptions(db) {
57
+ // Per CONTEXT D-08: risky = assumption nodes still in active review_status
58
+ // (confirmed = filed but not yet validated; needs_evidence = explicitly flagged).
59
+ // Composition-not-duplication: this set is disjoint from confirmedFacts because the
60
+ // 'validated' state is excluded by the IN-clause filter.
61
+ const rows = db.prepare(
62
+ "SELECT id, type, properties, review_status, confidence, last_seen_at FROM nodes "
63
+ + "WHERE type = 'assumption' AND review_status IN ('confirmed','needs_evidence') "
64
+ + "ORDER BY confidence ASC, last_seen_at DESC LIMIT 50"
65
+ ).all();
66
+ return rows.map(safeShape);
67
+ }
68
+
69
+ function getEvidenceByTier(db) {
70
+ // Per CONTEXT D-08 evidence shape: { academic, operational, practitioner, none }
71
+ // grouped from evidence nodes by properties.tier. JS-side grouping is cheaper than
72
+ // GROUP BY for typical evidence counts (< 200) and preserves ordering by confidence.
73
+ const rows = db.prepare(
74
+ "SELECT id, type, properties, review_status, confidence, last_seen_at, "
75
+ + "json_extract(properties, '$.tier') AS tier "
76
+ + "FROM nodes WHERE type = 'evidence' "
77
+ + "ORDER BY confidence DESC LIMIT 200"
78
+ ).all();
79
+ const out = { academic: [], operational: [], practitioner: [], none: [] };
80
+ for (const r of rows) {
81
+ const tier = TIERS.includes(r.tier) ? r.tier : 'none';
82
+ out[tier].push(safeShape(r));
83
+ }
84
+ return out;
85
+ }
86
+
87
+ function getRoomHomeView(db, roomId, opts) {
88
+ const options = opts || {};
89
+ const roomRootId = 'room:' + roomId;
90
+ const since24h = Date.now() - 24 * 60 * 60 * 1000;
91
+
92
+ // 8 reads total: 1 identity + 3 raw SELECTs + 4 helper calls.
93
+ const currentThesis = getCurrentThesis(db);
94
+ const confirmedFacts = getConfirmedFacts(db);
95
+ const riskyAssumptions = getRiskyAssumptions(db);
96
+ const evidence = getEvidenceByTier(db);
97
+ const contradictions = findContradictions(db, roomRootId);
98
+ const openQuestions = findOpenQuestions(db, roomId);
99
+ const recentChanges = findRecentChanges(db, since24h, { limit: 20 });
100
+ const bankedOpportunities = findRelevantOpportunities(
101
+ db,
102
+ roomRootId,
103
+ { topK: 5, _mocks: options._mocks, roomDir: options.roomDir }
104
+ );
105
+
106
+ // Per RESEARCH section 6.1 line 882: nextMove ships a templated default in Phase 109;
107
+ // Phase 110 wires the live Brain advisory. The opts.brainAvailable + opts.getBrainAdvisory
108
+ // seam is forward-compat; until Phase 110 is shipped, the templated string is the
109
+ // canonical answer.
110
+ const nextMove = options.brainAvailable === true && typeof options.getBrainAdvisory === 'function'
111
+ ? options.getBrainAdvisory(roomRootId)
112
+ : 'See open questions and contradictions to decide next focus.';
113
+
114
+ return {
115
+ currentThesis,
116
+ confirmedFacts,
117
+ riskyAssumptions,
118
+ evidence,
119
+ contradictions,
120
+ openQuestions,
121
+ recentChanges,
122
+ bankedOpportunities,
123
+ nextMove,
124
+ };
125
+ }
126
+
127
+ module.exports = { getRoomHomeView };
@@ -0,0 +1,82 @@
1
+ 'use strict';
2
+ // Phase 109-04 truth-state transition chokepoint. Per Phase 108 TRUTH-STATES.md L40-58
3
+ // and L88. Every promoteNodeStatus call validates the transition pair against the
4
+ // closed Set; logs a status_* memory_event; populates confirmed_by + confirmed_at when
5
+ // transitioning to confirmed or validated.
6
+ //
7
+ // Canon Part 4: every status change is graph data; the memory_event row IS the audit
8
+ // edge for the transition.
9
+ // Canon Part 9: truth-state promotion is gated by the documented 8-transition closed
10
+ // taxonomy; any other (from, to) pair is rejected.
11
+
12
+ const { logEvent } = require('./memory-events.cjs');
13
+
14
+ // Closed Set of allowed (from, to) transitions. The Set member is 'from->to' string.
15
+ const TRANSITIONS = Object.freeze(new Set([
16
+ 'proposed->confirmed',
17
+ 'proposed->needs_evidence',
18
+ 'needs_evidence->validated',
19
+ 'confirmed->validated',
20
+ 'validated->invalidated',
21
+ 'proposed->rejected',
22
+ 'confirmed->superseded',
23
+ 'confirmed->stale',
24
+ ]));
25
+
26
+ // event_type for each transition.
27
+ const EVENT_FOR_TRANSITION = Object.freeze({
28
+ 'proposed->confirmed': 'status_promoted',
29
+ 'proposed->needs_evidence': 'status_promoted',
30
+ 'needs_evidence->validated': 'status_promoted',
31
+ 'confirmed->validated': 'status_promoted',
32
+ 'validated->invalidated': 'status_promoted',
33
+ 'proposed->rejected': 'status_rejected',
34
+ 'confirmed->superseded': 'status_superseded',
35
+ 'confirmed->stale': 'status_stale',
36
+ });
37
+
38
+ function promoteNodeStatus(db, nodeId, fromStatus, toStatus, byUser, reason) {
39
+ const key = fromStatus + '->' + toStatus;
40
+ if (!TRANSITIONS.has(key)) {
41
+ return { ok: false, reason: 'invalid_transition' };
42
+ }
43
+ const row = db.prepare('SELECT id, review_status FROM nodes WHERE id = ?').get(nodeId);
44
+ if (!row) {
45
+ return { ok: false, reason: 'unknown_node' };
46
+ }
47
+ if (row.review_status !== fromStatus) {
48
+ return { ok: false, reason: 'state_mismatch', currentStatus: row.review_status };
49
+ }
50
+ const setsConfirmed = (toStatus === 'confirmed' || toStatus === 'validated');
51
+ const nowMs = Date.now();
52
+ db.exec('BEGIN');
53
+ try {
54
+ if (setsConfirmed) {
55
+ db.prepare('UPDATE nodes SET review_status = ?, confirmed_by = ?, confirmed_at = ?, last_seen_at = ? WHERE id = ?')
56
+ .run(toStatus, byUser || 'system', nowMs, nowMs, nodeId);
57
+ } else {
58
+ db.prepare('UPDATE nodes SET review_status = ?, last_seen_at = ? WHERE id = ?')
59
+ .run(toStatus, nowMs, nodeId);
60
+ }
61
+ const eventType = EVENT_FOR_TRANSITION[key];
62
+ const evRes = logEvent(db, eventType, {
63
+ target_node_id: nodeId,
64
+ previous_status: fromStatus,
65
+ new_status: toStatus,
66
+ reason: typeof reason === 'string' ? reason : null,
67
+ created_by: byUser || 'system',
68
+ source_path: 'transition:' + key,
69
+ });
70
+ if (!evRes.ok) {
71
+ db.exec('ROLLBACK');
72
+ return { ok: false, reason: 'event_log_failed:' + evRes.reason };
73
+ }
74
+ db.exec('COMMIT');
75
+ return { ok: true, eventId: evRes.eventId };
76
+ } catch (err) {
77
+ try { db.exec('ROLLBACK'); } catch (_) { /* ignore */ }
78
+ return { ok: false, reason: err.message };
79
+ }
80
+ }
81
+
82
+ module.exports = { promoteNodeStatus, TRANSITIONS, EVENT_FOR_TRANSITION };
@@ -0,0 +1,242 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /*
5
+ * Copyright (c) 2026 Mindrian. BSL 1.1.
6
+ *
7
+ * Phase 91-00 -- Navigation Engine shared helpers (pure, zero I/O)
8
+ * ================================================================
9
+ * Frozen constants and pure helper functions that the L5 Navigation
10
+ * Engine (lib/core/navigation-engine.cjs) composes into a structured
11
+ * decision function. Splitting these out keeps the engine entry point
12
+ * thin and lets unit tests exercise the rules without booting a full
13
+ * fixture room.
14
+ *
15
+ * Contract source of truth:
16
+ * .planning/research/navigation-engine-brain-interface.md (v1, frozen
17
+ * at Phase 90-09).
18
+ *
19
+ * What this module exports:
20
+ * STALENESS_MULTIPLIERS frozen table -- Section 4.1 multiplier rows
21
+ * CANONICAL_VERBS frozen 10-entry array -- Canon Part 3 vocabulary
22
+ * SECTION_WEIGHTS frozen map -- Section 3.2 (required + optional)
23
+ * applyStalenessMultiplier(brain) -> number in [0, 1]
24
+ * resolveTierMode(quadruple, brainAvailable) -> 'mode_a' | 'mode_b' | 'tier_0'
25
+ * emptyDecision() decision shell
26
+ * emptyDecisionTrace() trace shell with all 8 Section 8 fields
27
+ *
28
+ * Canon Part 8 posture:
29
+ * This module does ZERO I/O. No fs, no network, no child_process. It
30
+ * only computes pure functions over already-parsed quadruple structs.
31
+ * The Brain boundary is irrelevant here because no bytes leave or
32
+ * enter; all guarding is delegated to the engine entry point.
33
+ *
34
+ * License: BSL 1.1.
35
+ */
36
+
37
+ // ---------- Frozen constants ----------
38
+
39
+ /**
40
+ * Section 4.1 staleness multiplier table.
41
+ * Keys are sentinel labels:
42
+ * 'null' -- brain === null (BRAIN.md absent)
43
+ * 'fresh' -- staleness === 'fresh'
44
+ * 'unavailable' -- staleness === 'unavailable'
45
+ * <stale_reason string> -- staleness === 'stale' AND
46
+ * stale_reason === <key>
47
+ *
48
+ * Values are the multiplier applied to the BRAIN.md contribution block.
49
+ */
50
+ const STALENESS_MULTIPLIERS = Object.freeze({
51
+ null: 0.0,
52
+ fresh: 1.0,
53
+ age_exceeded: 0.7,
54
+ governing_thought_changed: 0.3,
55
+ brain_graph_version_mismatch: 0.5,
56
+ brain_offline: 0.9, // EXEMPT per Section 4.2 (transient network)
57
+ derivation_timeout: 0.2,
58
+ parse_failed: 0.0,
59
+ unavailable: 0.0,
60
+ });
61
+
62
+ /**
63
+ * Canon Part 3 canonical 10-verb vocabulary. Closed set; new verbs
64
+ * require a canon amendment, not a runtime addition.
65
+ */
66
+ const CANONICAL_VERBS = Object.freeze([
67
+ 'Run Methodology',
68
+ 'Reformulate',
69
+ 'Spawn Sub-Agent',
70
+ 'Navigate Graph',
71
+ "Devil's Advocate",
72
+ 'Scenario Plan',
73
+ 'Synthesize',
74
+ 'Bank Opportunity',
75
+ 'Defer',
76
+ 'Free-Text',
77
+ ]);
78
+
79
+ /**
80
+ * Section 3.2 weights. Required sections sum to exactly 1.0:
81
+ * 0.35 + 0.20 + 0.15 + 0.10 + 0.10 + 0.05 + 0.05 = 1.00
82
+ *
83
+ * Optional sections (flagged_contradictions_xroom, hsi_signals) carry
84
+ * weight 0 and are surfaced as decision_trace caveats only.
85
+ */
86
+ const SECTION_WEIGHTS = Object.freeze({
87
+ // Required (sum to 1.0):
88
+ pattern_matches: 0.35,
89
+ framework_chain_predictions: 0.20,
90
+ cross_domain_analogies: 0.15,
91
+ wicked_indicators: 0.10,
92
+ unfilled_opportunity_matches: 0.10,
93
+ assessment_thinking_chain_position: 0.05,
94
+ problemtype_classification: 0.05,
95
+ // Optional (caveat only):
96
+ flagged_contradictions_xroom: 0,
97
+ hsi_signals: 0,
98
+ });
99
+
100
+ const REQUIRED_SECTION_KEYS = Object.freeze([
101
+ 'pattern_matches',
102
+ 'framework_chain_predictions',
103
+ 'cross_domain_analogies',
104
+ 'wicked_indicators',
105
+ 'unfilled_opportunity_matches',
106
+ 'assessment_thinking_chain_position',
107
+ 'problemtype_classification',
108
+ ]);
109
+
110
+ const OPTIONAL_SECTION_KEYS = Object.freeze([
111
+ 'flagged_contradictions_xroom',
112
+ 'hsi_signals',
113
+ ]);
114
+
115
+ // ---------- Pure helpers ----------
116
+
117
+ /**
118
+ * applyStalenessMultiplier(brain) -> number in [0, 1]
119
+ *
120
+ * Resolves the BRAIN.md staleness multiplier per Section 4.1. Never
121
+ * throws; falls back to 0.0 conservatively on any unrecognized shape.
122
+ *
123
+ * Decision order (highest precedence first):
124
+ * 1. brain === null -> 0.0
125
+ * 2. brain.parse_failed === true -> 0.0 (override)
126
+ * 3. brain.staleness === 'unavailable' -> 0.0
127
+ * 4. brain.staleness === 'fresh' -> 1.0
128
+ * 5. brain.staleness === 'stale' + known reason -> table lookup
129
+ * 6. unknown shape -> 0.0 (conservative)
130
+ */
131
+ function applyStalenessMultiplier(brain) {
132
+ if (brain === null || brain === undefined) {
133
+ return STALENESS_MULTIPLIERS.null;
134
+ }
135
+ if (typeof brain !== 'object') {
136
+ return 0.0;
137
+ }
138
+ if (brain.parse_failed === true) {
139
+ return STALENESS_MULTIPLIERS.parse_failed;
140
+ }
141
+ const staleness = brain.staleness;
142
+ if (staleness === 'unavailable') {
143
+ return STALENESS_MULTIPLIERS.unavailable;
144
+ }
145
+ if (staleness === 'fresh') {
146
+ return STALENESS_MULTIPLIERS.fresh;
147
+ }
148
+ if (staleness === 'stale') {
149
+ const reason = brain.stale_reason;
150
+ if (typeof reason === 'string' && Object.prototype.hasOwnProperty.call(STALENESS_MULTIPLIERS, reason)) {
151
+ const m = STALENESS_MULTIPLIERS[reason];
152
+ // Clamp [0, 1] defensively even though all table values are in range.
153
+ if (typeof m === 'number' && m >= 0.0 && m <= 1.0) return m;
154
+ return 0.0;
155
+ }
156
+ // Unknown stale_reason -- fall through to conservative zero.
157
+ return 0.0;
158
+ }
159
+ // Unknown staleness label -- conservative zero.
160
+ return 0.0;
161
+ }
162
+
163
+ /**
164
+ * resolveTierMode(quadruple, brainAvailable) -> 'mode_a' | 'mode_b' | 'tier_0'
165
+ *
166
+ * Implements Section 5 logic exactly. Re-evaluated every turn (no
167
+ * cross-turn caching per Section 5.4).
168
+ *
169
+ * Mode A : brain reachable AND brain non-null AND staleness !== 'unavailable'
170
+ * AND parse_failed !== true
171
+ * Mode B : brain unreachable AND brain non-null AND
172
+ * stale_reason === 'brain_offline' (acceptable transient)
173
+ * Tier 0 : brain === null OR parse_failed === true OR
174
+ * staleness === 'unavailable' OR (any other unreachable shape)
175
+ */
176
+ function resolveTierMode(quadruple, brainAvailable) {
177
+ const brain = quadruple && quadruple.brain;
178
+ if (brain === null || brain === undefined) return 'tier_0';
179
+ if (brain.parse_failed === true) return 'tier_0';
180
+ if (brain.staleness === 'unavailable') return 'tier_0';
181
+ if (brainAvailable === true) {
182
+ return 'mode_a';
183
+ }
184
+ // Brain unreachable: only mode_b when offline-exempt. Otherwise tier_0.
185
+ if (brain.stale_reason === 'brain_offline') return 'mode_b';
186
+ return 'tier_0';
187
+ }
188
+
189
+ /**
190
+ * emptyDecisionTrace() -> shell with all 8 Section 8 fields + 5
191
+ * structural fields. Sentinel values:
192
+ * scalars -> null
193
+ * booleans -> false
194
+ * arrays -> []
195
+ * tier_mode -> 'tier_0' (fail-safe default)
196
+ */
197
+ function emptyDecisionTrace() {
198
+ return {
199
+ // Section 8 required fields:
200
+ brain_md_version: null,
201
+ brain_md_staleness: 'absent',
202
+ brain_md_stale_reason: null,
203
+ brain_md_weight_applied: 0.0,
204
+ brain_md_recommended_confidence: null,
205
+ brain_md_recommended_marker_rendered: false,
206
+ brain_md_tier_mode: 'tier_0',
207
+ brain_md_sections_consumed: [],
208
+ // Structural fields (5):
209
+ icm_scope: null,
210
+ sql_signals: null,
211
+ minto_reasoning: null,
212
+ intent_persona: null,
213
+ chosen_rationale: null,
214
+ };
215
+ }
216
+
217
+ /**
218
+ * emptyDecision() -> empty decision shell with full empty trace.
219
+ */
220
+ function emptyDecision() {
221
+ return {
222
+ fire_skill: null,
223
+ offer_next_step: null,
224
+ suppress_skills: [],
225
+ persona_updates: null,
226
+ decision_trace: emptyDecisionTrace(),
227
+ };
228
+ }
229
+
230
+ // ---------- Exports ----------
231
+
232
+ module.exports = {
233
+ STALENESS_MULTIPLIERS: STALENESS_MULTIPLIERS,
234
+ CANONICAL_VERBS: CANONICAL_VERBS,
235
+ SECTION_WEIGHTS: SECTION_WEIGHTS,
236
+ REQUIRED_SECTION_KEYS: REQUIRED_SECTION_KEYS,
237
+ OPTIONAL_SECTION_KEYS: OPTIONAL_SECTION_KEYS,
238
+ applyStalenessMultiplier: applyStalenessMultiplier,
239
+ resolveTierMode: resolveTierMode,
240
+ emptyDecision: emptyDecision,
241
+ emptyDecisionTrace: emptyDecisionTrace,
242
+ };