@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,222 @@
1
+ #!/usr/bin/env node
2
+ /*
3
+ * Phase 101-03 - Shape H (Timeline / Roadmap) renderer.
4
+ * ASCII-art horizontal timeline. 4-zone anatomy. 12-glyph compliant.
5
+ * Glyphs: filled-square (marker), dash (axis), right-tri-fill (primary),
6
+ * right-tri-empty (alt). Spec: 101-RESEARCH.md Section 4.
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const path = require('path');
12
+
13
+ const FILLED_SQUARE = '■'; // filled-square
14
+ const DASH = '─'; // dash
15
+ const PRIMARY = '▶'; // right-tri-fill
16
+ const ALT = '▷'; // right-tri-empty
17
+
18
+ const DEFAULT_WIDTH = 60;
19
+ const MIN_WIDTH = 40;
20
+ const MAX_WIDTH = 80;
21
+ const CROWD_THRESHOLD = 3;
22
+
23
+ const DEFAULT_FOOTER = [
24
+ { glyph: PRIMARY, command: '/mos:act', description: 'Run methodology' },
25
+ { glyph: ALT, command: '/mos:add-phase', description: 'Add phase to roadmap' },
26
+ { glyph: ALT, command: '/mos:milestone-summary', description: 'Generate milestone summary' },
27
+ ];
28
+
29
+ function parseDate(d) {
30
+ if (d instanceof Date) return isNaN(d.getTime()) ? null : d;
31
+ const p = new Date(d);
32
+ return isNaN(p.getTime()) ? null : p;
33
+ }
34
+
35
+ function fmtDate(d) {
36
+ const m = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
37
+ return m[d.getUTCMonth()] + ' ' + d.getUTCDate();
38
+ }
39
+
40
+ function err(line1, line2, line3) {
41
+ return { error: 'x ' + line1 + '\nWhy: ' + line2 + '\nFix: ' + line3 };
42
+ }
43
+
44
+ function clampWidth(w) {
45
+ if (typeof w !== 'number' || !isFinite(w)) return DEFAULT_WIDTH;
46
+ return Math.min(MAX_WIDTH, Math.max(MIN_WIDTH, Math.round(w)));
47
+ }
48
+
49
+ function buildHeader(jtbd, title, start, end) {
50
+ const tag = jtbd || 'plan-execution';
51
+ const subtitle = title || (fmtDate(start) + ' to ' + fmtDate(end));
52
+ return '-- mindrianOS -- ' + tag + ' -- timeline (' + subtitle + ') --';
53
+ }
54
+
55
+ function buildAxis(width, start, end) {
56
+ const a = fmtDate(start), b = fmtDate(end);
57
+ const middle = width - a.length - b.length - 2;
58
+ if (middle <= 0) return DASH.repeat(Math.max(width, 1));
59
+ return a + ' ' + DASH.repeat(middle) + ' ' + b;
60
+ }
61
+
62
+ function placeMarkers(milestones, start, end, width) {
63
+ const span = end.getTime() - start.getTime();
64
+ const pixelsPerMs = (width - 2) / span;
65
+ return milestones.map((m, idx) => {
66
+ const at = parseDate(m.at);
67
+ let col = Math.round((at.getTime() - start.getTime()) * pixelsPerMs);
68
+ if (col < 0) col = 0;
69
+ if (col > width - 1) col = width - 1;
70
+ return { idx, col, label: String(m.label || ''), at };
71
+ });
72
+ }
73
+
74
+ function markerLine(marks, width) {
75
+ const arr = new Array(width).fill(' ');
76
+ for (const m of marks) arr[m.col] = FILLED_SQUARE;
77
+ return arr.join('').replace(/\s+$/, '');
78
+ }
79
+
80
+ function isCrowded(marks) {
81
+ if (marks.length < 2) return false;
82
+ const s = marks.slice().sort((a, b) => a.col - b.col);
83
+ for (let i = 1; i < s.length; i++) {
84
+ if (s[i].col - s[i - 1].col < CROWD_THRESHOLD) return true;
85
+ }
86
+ return false;
87
+ }
88
+
89
+ function stampLabel(arr, col, label, room) {
90
+ let lab = label;
91
+ if (lab.length > room) lab = lab.slice(0, Math.max(1, room - 1)) + '.';
92
+ for (let k = 0; k < lab.length && (col + k) < arr.length; k++) {
93
+ arr[col + k] = lab[k];
94
+ }
95
+ }
96
+
97
+ function labelRowsUncrowded(marks, width) {
98
+ const sorted = marks.slice().sort((a, b) => a.col - b.col);
99
+ const arr = new Array(width).fill(' ');
100
+ for (let i = 0; i < sorted.length; i++) {
101
+ const m = sorted[i];
102
+ const nextCol = (i + 1 < sorted.length) ? sorted[i + 1].col : width;
103
+ stampLabel(arr, m.col, m.label, Math.max(1, nextCol - m.col - 1));
104
+ }
105
+ return [arr.join('').replace(/\s+$/, '')];
106
+ }
107
+
108
+ function labelRowsCrowded(marks, width) {
109
+ const sorted = marks.slice().sort((a, b) => a.col - b.col);
110
+ return sorted.map((m) => {
111
+ const arr = new Array(width).fill(' ');
112
+ stampLabel(arr, m.col, m.label, Math.max(1, width - m.col));
113
+ return arr.join('').replace(/\s+$/, '');
114
+ });
115
+ }
116
+
117
+ function buildBody(start, end, marks, width, title) {
118
+ const lines = [];
119
+ if (title) { lines.push(FILLED_SQUARE + ' ' + title); lines.push(''); }
120
+ lines.push(buildAxis(width, start, end));
121
+ lines.push(markerLine(marks, width));
122
+ const rows = isCrowded(marks)
123
+ ? labelRowsCrowded(marks, width)
124
+ : labelRowsUncrowded(marks, width);
125
+ for (const r of rows) lines.push(r);
126
+ return lines.join('\n');
127
+ }
128
+
129
+ /**
130
+ * Phase 101-05: Mode-aware footer marker selection.
131
+ *
132
+ * Per Canon Part 3 "Option generation tier-awareness":
133
+ * Mode A (tier >= 2) -> first verb may carry RECOMMENDED ▶ marker (Brain-derived).
134
+ * Mode B (tier === 1) -> all verbs use the empty triangle ▷ marker; ▶ NEVER renders.
135
+ *
136
+ * Defense-in-depth: this guard lives inside the renderer regardless of whether
137
+ * the dispatcher already gated the call.
138
+ */
139
+ function buildFooter(footerVerbs, mode) {
140
+ const verbs = (Array.isArray(footerVerbs) && footerVerbs.length > 0)
141
+ ? footerVerbs : DEFAULT_FOOTER;
142
+ const isModeB = (mode === 'B');
143
+ return verbs.map((v, i) => {
144
+ const defaultGlyph = (i === 0 && !isModeB) ? PRIMARY : ALT;
145
+ const rawGlyph = v.glyph || defaultGlyph;
146
+ const g = isModeB ? ALT : rawGlyph;
147
+ const cmd = v.command || '';
148
+ const desc = v.description ? (' ' + v.description) : '';
149
+ return g + ' ' + cmd + desc;
150
+ }).join('\n');
151
+ }
152
+
153
+ /**
154
+ * renderShapeH({ start, end, milestones, title?, width?, jtbd?, tier?,
155
+ * footerVerbs? }) -> { zones, contract } | { error }
156
+ */
157
+ function renderShapeH(opts) {
158
+ const o = opts || {};
159
+ const start = parseDate(o.start);
160
+ const end = parseDate(o.end);
161
+ if (!start || !end) {
162
+ return err('Invalid timeline dates',
163
+ 'start or end could not be parsed as ISO date',
164
+ '/mos:plan-execution add-milestone');
165
+ }
166
+ if (end.getTime() <= start.getTime()) {
167
+ return err('Timeline end is not after start',
168
+ 'Shape H needs end > start to compute scale',
169
+ '/mos:plan-execution add-milestone');
170
+ }
171
+ const milestones = Array.isArray(o.milestones) ? o.milestones : [];
172
+ if (milestones.length === 0) {
173
+ return err('No milestones in scope',
174
+ 'Shape H needs at least one milestone',
175
+ '/mos:plan-execution add-milestone');
176
+ }
177
+ for (const m of milestones) {
178
+ if (!parseDate(m && m.at)) {
179
+ return err('Milestone date invalid',
180
+ 'one or more milestones lack a parseable at: field',
181
+ '/mos:plan-execution add-milestone');
182
+ }
183
+ }
184
+ const width = clampWidth(o.width);
185
+ const marks = placeMarkers(milestones, start, end, width);
186
+
187
+ // Phase 101-05: derive mode from explicit `mode` arg or fall back to `tier`.
188
+ // Mode A renders RECOMMENDED ▶ on first footer verb; Mode B suppresses across the footer.
189
+ let mode;
190
+ if (o.mode === 'A' || o.mode === 'B') {
191
+ mode = o.mode;
192
+ } else if (typeof o.tier === 'number') {
193
+ mode = o.tier >= 2 ? 'A' : 'B';
194
+ } else {
195
+ mode = 'A'; // back-compat: pre-101-05 callers default to Mode A
196
+ }
197
+
198
+ return {
199
+ zones: {
200
+ header: buildHeader(o.jtbd, o.title, start, end),
201
+ body: buildBody(start, end, marks, width, o.title),
202
+ footer: buildFooter(o.footerVerbs, mode),
203
+ },
204
+ contract: {
205
+ shape: 'H',
206
+ width: width,
207
+ milestoneCount: marks.length,
208
+ crowded: isCrowded(marks),
209
+ tier: o.tier == null ? null : o.tier,
210
+ jtbd: o.jtbd || null,
211
+ mode: mode,
212
+ },
213
+ };
214
+ }
215
+
216
+ module.exports = {
217
+ renderShapeH: renderShapeH,
218
+ __glyphs: { FILLED_SQUARE, DASH, PRIMARY, ALT },
219
+ __defaults: { DEFAULT_WIDTH, MIN_WIDTH, MAX_WIDTH, CROWD_THRESHOLD },
220
+ };
221
+
222
+ void path;
@@ -0,0 +1,63 @@
1
+ /*
2
+ * Copyright (c) 2026 Mindrian. BSL 1.1.
3
+ *
4
+ * Phase 101-05 Task 1 -- tier-check helper (v1 stub).
5
+ *
6
+ * Per Canon Part 3 (docs/MINDRIAN-CANON.md "Option generation tier-awareness"):
7
+ *
8
+ * Tier 0 (no Brain, no usable local graph) -> hardcoded minimal option set
9
+ * Tier 1 (Local Only / Mode B) -> Navigation Engine; no RECOMMENDED
10
+ * Tier >= 2 (Full Loop / Mode A) -> Brain-derived options + RECOMMENDED >= 0.7
11
+ *
12
+ * docs/CANON-PHASE-MAP.md Part 3 row "Option generation tier-awareness shipped"
13
+ * points at Phase 90 Plan 90-09 + .planning/research/navigation-engine-brain-interface.md.
14
+ * No standalone tier-check helper landed in main as of 2026-05-01; the contract
15
+ * is currently inferred from `lib/core/brain-client.cjs#isAvailable()` plus
16
+ * BRAIN.md presence checks scattered across `scripts/brain-derive-command.cjs`
17
+ * and `lib/memory/*`.
18
+ *
19
+ * v1 stub semantics (PLAN 101-05 Task 1, autonomous execution, no Phase 90
20
+ * follow-on hard-blocking us):
21
+ * - tier 2 if `process.env.MINDRIAN_BRAIN_KEY` is set (Brain reachable)
22
+ * - tier 1 otherwise (Local Only)
23
+ * - tier 0 is currently never returned by getTier(); callers may pass
24
+ * `tier: 0` explicitly to exercise the dispatcher refuse path.
25
+ *
26
+ * Real Phase 90 wiring (Brain ping + reachability cache + BRAIN.md presence
27
+ * audit) is deferred. When Phase 90's full helper lands, this stub becomes
28
+ * the back-compat shim.
29
+ *
30
+ * Pure CJS, node built-ins only, zero deps (Phase 87 invariant).
31
+ */
32
+
33
+ 'use strict';
34
+
35
+ /**
36
+ * Return current tier based on Brain key presence.
37
+ *
38
+ * @returns {0|1|2|3} tier
39
+ */
40
+ function getTier() {
41
+ // v1 stub: env var is the only signal. Phase 90 follow-on will replace
42
+ // with a Brain-ping + cache + BRAIN.md presence audit.
43
+ if (process.env.MINDRIAN_BRAIN_KEY) return 2;
44
+ return 1;
45
+ }
46
+
47
+ /**
48
+ * Map a tier integer to a Mode A / Mode B / Tier 0 string per Canon Part 3.
49
+ *
50
+ * @param {number} tier
51
+ * @returns {'A'|'B'|'0'}
52
+ */
53
+ function modeForTier(tier) {
54
+ const t = (typeof tier === 'number' && Number.isFinite(tier)) ? tier : 0;
55
+ if (t >= 2) return 'A';
56
+ if (t === 1) return 'B';
57
+ return '0';
58
+ }
59
+
60
+ module.exports = {
61
+ getTier: getTier,
62
+ modeForTier: modeForTier,
63
+ };
@@ -0,0 +1,41 @@
1
+ # Phase 80 Preconditions
2
+
3
+ ## Known: bin/mindrian-tools.cjs MODULE_NOT_FOUND via lazygraph-ops (Phase 78-02 carryover)
4
+
5
+ **Status:** still broken as of 2026-04-13 (Phase 80-01 execution).
6
+
7
+ **Symptom:** `node bin/mindrian-tools.cjs --help` crashes at startup with:
8
+
9
+ ```
10
+ Error: Cannot find module 'better-sqlite3'
11
+ requireStack:
12
+ - lib/core/lazygraph-ops.cjs
13
+ - lib/core/graph-ops.cjs
14
+ - bin/mindrian-tools.cjs
15
+ ```
16
+
17
+ `lib/core/lazygraph-ops.cjs` does a top-level `require('better-sqlite3')`
18
+ and `bin/mindrian-tools.cjs` eagerly loads `graph-ops.cjs` which pulls in
19
+ `lazygraph-ops.cjs`, so ANY subcommand (even `--help`) fails before
20
+ argv parsing. This is the same class of issue as Phase 78-02 (lazygraph-ops
21
+ side-effect load), just surfaced through a different native dep.
22
+
23
+ **Root cause (not fixed here):** `better-sqlite3` is declared in
24
+ package.json but is a native module that was not built against this
25
+ Node version / WSL env. Either `npm rebuild better-sqlite3`, pin a
26
+ pre-built version, or lazy-require better-sqlite3 inside the functions
27
+ that actually need it.
28
+
29
+ **Workaround for Phase 80:**
30
+
31
+ - Plan 80-05 (command wiring) must NOT add the `vault import` subcommand to
32
+ `bin/mindrian-tools.cjs` via the graph-ops require chain.
33
+ - Instead, wire `/mos:vault import` through `node scripts/vault-import.cjs`
34
+ directly (no import of graph-ops / lazygraph-ops in the entry path).
35
+ - If any downstream plan wants to call mindrian-tools.cjs as a smoke test
36
+ (IMPORT-11), it MUST first confirm mindrian-tools.cjs runs cleanly OR
37
+ stub the smoke test behind this precondition until fixed.
38
+
39
+ **Fix target:** separate plan (not Phase 80 scope). File as a post-Phase-80
40
+ follow-up task against `lib/core/lazygraph-ops.cjs` to lazy-require
41
+ better-sqlite3 at function-call time, not module-load time.
@@ -0,0 +1,210 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Phase 80 Plan 80-06 Task 1 (IMPORT-10) -- Branding injection.
5
+ *
6
+ * Applied by Stage 04 enricher AFTER wikilink injection. For every routed
7
+ * artifact this module:
8
+ *
9
+ * 1. normalizeFrontmatter -- rewrites frontmatter to the De Stijl canonical
10
+ * shape (title, section, status, imported_from, imported_at, import_id,
11
+ * source_wikilinks, tags). Non-canonical source fields are preserved
12
+ * under _source_frontmatter so nothing is lost.
13
+ * 2. promoteCalloutFields -- promotes known source frontmatter fields
14
+ * (author, attendees, date, tags) into Obsidian-style callout blocks
15
+ * ([!author], [!attendees], [!date], [!tags]) at the top of the body.
16
+ * These render via the De Stijl .callout / .callout-blue / .callout-teal
17
+ * / .callout-red CSS classes shipped by scripts/generate-hub.cjs (v1.9.7).
18
+ * 3. injectBrandedFooter -- appends a MindrianOS branded footer using the
19
+ * same FOOTER_MARKER string as scripts/vault-footer-injector.cjs (Phase
20
+ * 76) so idempotency checks cover both paths.
21
+ *
22
+ * Phase 76 discovery (scripts/vault-footer-injector.cjs):
23
+ * - Exports buildFooter, hasExistingFooter, appendFooter, processFile.
24
+ * - FOOTER_MARKER = '> MindrianOS |', FOOTER_BRAND = '> [SQUARE] MindrianOS |'
25
+ * (the square glyph is intentionally preserved verbatim from that file).
26
+ * - Uses enrichFrontmatter from lib/vault/frontmatter-schema.cjs.
27
+ * - The Phase 76 module is CLI-first but exports are reusable; however the
28
+ * 80-06 branding flow needs a per-file, per-import-context API that
29
+ * Phase 76 does not expose (it walks a whole room and computes its own
30
+ * import context from roomName). So this module reimplements the thin
31
+ * per-file footer pathway while reusing the SAME marker so the two
32
+ * paths are mutually idempotent.
33
+ *
34
+ * Idempotent: running applyBranding twice on the same file produces no
35
+ * second-pass changes (footer not doubled, callouts not duplicated,
36
+ * frontmatter already canonical).
37
+ *
38
+ * Zero em-dashes in this file and in branding.test.cjs (hyphens only).
39
+ */
40
+
41
+ const fs = require('node:fs');
42
+ const path = require('node:path');
43
+ const matter = require('gray-matter');
44
+
45
+ // FOOTER_MARKER must match scripts/vault-footer-injector.cjs (Phase 76).
46
+ const FOOTER_MARKER = '> MindrianOS |';
47
+ // The branded prefix uses a bracketed token instead of a box glyph so the
48
+ // source file stays plain ASCII and is trivially greppable across platforms.
49
+ const FOOTER_BRAND = '> [MOS] MindrianOS |';
50
+
51
+ const CALLOUT_MARKER = '<!-- destijl-callout -->';
52
+ const CALLOUT_FIELDS = ['author', 'attendees', 'date', 'tags'];
53
+
54
+ const CANONICAL_KEYS = new Set([
55
+ 'title',
56
+ 'section',
57
+ 'status',
58
+ 'imported_from',
59
+ 'imported_at',
60
+ 'import_id',
61
+ 'source_wikilinks',
62
+ 'tags'
63
+ ]);
64
+
65
+ // ---------------------------------------------------------------------------
66
+ // Footer injection
67
+ // ---------------------------------------------------------------------------
68
+
69
+ function hasExistingFooter(content) {
70
+ return /^>\s*(?:\[MOS\]\s*)?MindrianOS\s*\|/m.test(content);
71
+ }
72
+
73
+ function injectBrandedFooter(artifactPath, importContext) {
74
+ const content = fs.readFileSync(artifactPath, 'utf8');
75
+ if (hasExistingFooter(content)) return false;
76
+
77
+ const importedAt = (importContext && importContext.imported_at) || new Date().toISOString();
78
+ const sourceVault = (importContext && importContext.source_vault) || 'unknown';
79
+ const importId = (importContext && importContext.import_id) || 'unknown';
80
+
81
+ const footer = [
82
+ '',
83
+ '---',
84
+ '',
85
+ FOOTER_BRAND + ' imported ' + importedAt + ' | from ' + sourceVault + ' | import_id: ' + importId,
86
+ ''
87
+ ].join('\n');
88
+
89
+ const trimmed = content.replace(/\s+$/, '');
90
+ // Avoid doubling an existing horizontal rule at the tail of the body.
91
+ const endsWithHr = /(^|\n)---\s*$/.test(trimmed);
92
+ const out = endsWithHr
93
+ ? trimmed + '\n\n' + FOOTER_BRAND + ' imported ' + importedAt + ' | from ' + sourceVault + ' | import_id: ' + importId + '\n'
94
+ : trimmed + footer;
95
+
96
+ fs.writeFileSync(artifactPath, out);
97
+ return true;
98
+ }
99
+
100
+ // ---------------------------------------------------------------------------
101
+ // Frontmatter normalization
102
+ // ---------------------------------------------------------------------------
103
+
104
+ function normalizeFrontmatter(artifactPath, classification, importContext) {
105
+ const raw = fs.readFileSync(artifactPath, 'utf8');
106
+ const parsed = matter(raw);
107
+ const src = parsed.data || {};
108
+
109
+ const importedAt = (importContext && importContext.imported_at) || new Date().toISOString();
110
+
111
+ // Preserve any previously-seeded _source_frontmatter so re-runs do not
112
+ // nest it recursively on every invocation.
113
+ const previouslyPreserved = (src._source_frontmatter && typeof src._source_frontmatter === 'object')
114
+ ? src._source_frontmatter
115
+ : {};
116
+
117
+ const canonical = {};
118
+ canonical.title = src.title || path.basename(artifactPath, '.md');
119
+ canonical.section = (classification && classification.section) || src.section || '';
120
+ canonical.status = 'imported';
121
+ canonical.imported_from = (importContext && importContext.source_path) || src.imported_from || '';
122
+ canonical.imported_at = src.imported_at || importedAt;
123
+ canonical.import_id = (importContext && importContext.import_id) || src.import_id || '';
124
+
125
+ if (Array.isArray(src.source_wikilinks)) {
126
+ canonical.source_wikilinks = src.source_wikilinks;
127
+ } else if (importContext && Array.isArray(importContext.source_wikilinks)) {
128
+ canonical.source_wikilinks = importContext.source_wikilinks;
129
+ } else {
130
+ canonical.source_wikilinks = [];
131
+ }
132
+
133
+ if (Array.isArray(src.tags)) canonical.tags = src.tags;
134
+ else if (src.tags) canonical.tags = [src.tags];
135
+ else canonical.tags = [];
136
+
137
+ // Everything else goes under _source_frontmatter so it round-trips.
138
+ const preserved = Object.assign({}, previouslyPreserved);
139
+ for (const [k, v] of Object.entries(src)) {
140
+ if (CANONICAL_KEYS.has(k)) continue;
141
+ if (k === '_source_frontmatter') continue;
142
+ preserved[k] = v;
143
+ }
144
+ if (Object.keys(preserved).length > 0) canonical._source_frontmatter = preserved;
145
+
146
+ const out = matter.stringify(parsed.content, canonical);
147
+ fs.writeFileSync(artifactPath, out);
148
+ return canonical;
149
+ }
150
+
151
+ // ---------------------------------------------------------------------------
152
+ // Callout promotion
153
+ // ---------------------------------------------------------------------------
154
+
155
+ function formatCalloutValue(v) {
156
+ if (Array.isArray(v)) return v.map(formatCalloutValue).join(', ');
157
+ if (v instanceof Date) return v.toISOString().slice(0, 10);
158
+ return String(v);
159
+ }
160
+
161
+ function promoteCalloutFields(artifactPath) {
162
+ const raw = fs.readFileSync(artifactPath, 'utf8');
163
+ if (raw.includes(CALLOUT_MARKER)) return false; // idempotent
164
+
165
+ const parsed = matter(raw);
166
+ const fm = parsed.data || {};
167
+ const src = (fm._source_frontmatter && typeof fm._source_frontmatter === 'object') ? fm._source_frontmatter : {};
168
+
169
+ const callouts = [];
170
+ for (const key of CALLOUT_FIELDS) {
171
+ let v = src[key];
172
+ if (v == null || v === '') v = fm[key];
173
+ if (v == null || v === '') continue;
174
+ if (Array.isArray(v) && v.length === 0) continue;
175
+ callouts.push('> [!' + key + '] ' + formatCalloutValue(v));
176
+ }
177
+ if (callouts.length === 0) return false;
178
+
179
+ // Block uses De Stijl callout rendering (scripts/generate-hub.cjs .callout
180
+ // classes). The marker comment makes the block detectable on re-runs and
181
+ // also acts as a hint for the hub renderer to wrap with callout-blue.
182
+ const block = [CALLOUT_MARKER, ...callouts, ''].join('\n');
183
+ const newBody = block + '\n' + parsed.content.replace(/^\s+/, '');
184
+ const out = matter.stringify(newBody, fm);
185
+ fs.writeFileSync(artifactPath, out);
186
+ return true;
187
+ }
188
+
189
+ // ---------------------------------------------------------------------------
190
+ // Orchestrator
191
+ // ---------------------------------------------------------------------------
192
+
193
+ function applyBranding(artifactPath, classification, importContext) {
194
+ normalizeFrontmatter(artifactPath, classification, importContext);
195
+ promoteCalloutFields(artifactPath);
196
+ injectBrandedFooter(artifactPath, importContext);
197
+ }
198
+
199
+ module.exports = {
200
+ injectBrandedFooter: injectBrandedFooter,
201
+ normalizeFrontmatter: normalizeFrontmatter,
202
+ promoteCalloutFields: promoteCalloutFields,
203
+ applyBranding: applyBranding,
204
+ hasExistingFooter: hasExistingFooter,
205
+ FOOTER_MARKER: FOOTER_MARKER,
206
+ FOOTER_BRAND: FOOTER_BRAND,
207
+ CALLOUT_MARKER: CALLOUT_MARKER,
208
+ CALLOUT_FIELDS: CALLOUT_FIELDS,
209
+ CANONICAL_KEYS: CANONICAL_KEYS
210
+ };