@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,59 @@
1
+ # lib/render/ -- Universal Renderer
2
+
3
+ > ICM Layer 0 identity for the renderer module.
4
+
5
+ ## Purpose
6
+
7
+ The universal renderer translates a 4-zone payload + render mode + conversation operator + tier into the actual on-screen output. Owns the `render(zones, mode, operator, tier)` contract.
8
+
9
+ ## Phase status
10
+
11
+ - **Phase 99-03 (shipped):** contract surface + no-op pass-through stub. Callers can import `{ render }` today; envelope returns `rendered: false` + `_stub: 'phase-99-03'` provenance tag. Operator validation against the 5 canonical values (JUST_TALK / EXPLORE_CAPTURE / BUILD_ROOM / METHODOLOGY / DECISION_GATE) ships now so Phase 102 inherits the fence.
12
+ - **Phase 102 (planned):** replaces the stub internals with real rendering logic per Phase 99 CONTEXT.md D-16. Same import surface; no caller changes.
13
+
14
+ ## Files
15
+
16
+ | File | Role |
17
+ |------|------|
18
+ | render-v2.cjs | Contract surface. Phase 99-03 stub today, Phase 102 implementation later. Exports `{ render, OPERATORS }`. |
19
+ | render-v2.test.cjs | Contract tests: 8 IIFE scenarios (5-operator round-trip, JUST_TALK default for undefined and null, invalid-operator throw, envelope shape stable, mode passthrough, tier passthrough, OPERATORS frozen). Registered in lib/memory/run-feynman-tests.cjs. |
20
+ | ROOM.md | This file -- ICM Layer 0 identity per CLAUDE.md Decision #15. |
21
+
22
+ ## Render contract (Phase 99 CONTEXT.md D-16)
23
+
24
+ ```
25
+ render(zones, mode, operator, tier) -> envelope
26
+
27
+ operator == JUST_TALK -> emit prose only (Phase 102)
28
+ operator == EXPLORE_CAPTURE -> prose; Shape E only on crystallization (Phase 102)
29
+ operator == BUILD_ROOM -> full 4-zone anatomy (Phase 102)
30
+ operator == METHODOLOGY -> no shape mid-session; Shape E at gate (Phase 102)
31
+ operator == DECISION_GATE -> Shape F.x; keyboard only (Phase 102)
32
+ ```
33
+
34
+ Phase 99-03 stub returns `{ zones, mode, operator, tier, rendered: false, _stub: 'phase-99-03' }` with operator validated and defaulted to JUST_TALK when null/undefined.
35
+
36
+ ## Canon refs
37
+
38
+ - **Part 3 (Tri-Context Decision Gate):** DECISION_GATE locks Shape F.x; the renderer enforces this at output time (Phase 102).
39
+ - **Part 4 (Every Choice Is Graph Data):** operator transitions written by Phase 99-01 are read by this renderer to pick shape (Phase 102).
40
+ - **Part 7 (Reuse Before Build):** Phase 99-03 ships the seam, not the muscle. Phase 102 replaces the stub internals without touching callers.
41
+
42
+ ## Downstream consumers
43
+
44
+ - **Phase 99-04 (hooks):** imports `{ render }` for SessionStart restore behavior and PostToolUse rendering.
45
+ - **Phase 99-05 (`/mos:operator` command):** imports `{ render }` for Shape E inspection output.
46
+ - **Phase 102:** owns the actual rendering implementation; the import surface is byte-stable.
47
+
48
+ ## Constraints
49
+
50
+ - Zero new runtime dependencies (Phase 87 invariant).
51
+ - CJS only (Phase 87 invariant).
52
+ - `render()` import surface MUST remain byte-stable across the Phase 102 swap.
53
+ - Operator vocabulary frozen at 5 canonical values; any 6th operator requires a Gate 1 review per Phase 99 CONTEXT.md D-03.
54
+
55
+ ## See also
56
+
57
+ - `.planning/phases/99-conversation-operator-state-machine/99-CONTEXT.md` -- canonical context (operator taxonomy, transition table, renderer signature contract D-16, graceful degradation D-17).
58
+ - `.planning/phases/99-conversation-operator-state-machine/99-03-PLAN.md` -- this plan.
59
+ - `docs/MINDRIAN-CANON.md` -- North Star, Part 3 (Tri-Context Decision Gate), Part 4 (Every Choice Is Graph Data), Part 7 (Reuse Before Build).
@@ -0,0 +1,486 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /*
5
+ * Copyright (c) 2026 Mindrian. BSL 1.1.
6
+ *
7
+ * Phase 102-01 -- universal renderer (extended signature).
8
+ *
9
+ * Replaces the Phase 99-03 stub at the same import surface. Phase 102
10
+ * evolves the signature to a single destructured object so we can carry
11
+ * the full context tuple (operator, tier, jtbd, tokenBudget, roomDir,
12
+ * provenance) without another signature break in 102-02..05.
13
+ *
14
+ * Phase 102-01 ships skeleton + zone composition only. Hooks:
15
+ * 1. Compaction -> 102-02 3. Color overlay -> 102-05
16
+ * 2. JTBD-aware Z4 -> 102-03 4. Provenance -> 102-04
17
+ * Numbered comment markers in render() are the insertion points.
18
+ *
19
+ * Per CONTEXT D-10, lib/render/render.cjs ships in the same wave as a
20
+ * thin shim around this v2 entry, preserving the legacy 4-arg
21
+ * positional signature for callers that have not yet migrated.
22
+ *
23
+ * Canon parts: 3 (Tri-Context Gate, output-side enforcement),
24
+ * 4 (operator transitions read here), 5 (evidence tier via Z3),
25
+ * 7 (single formatter for every /mos: command), 8 (D-09: this renderer
26
+ * NEVER calls Brain inline -- pure formatting layer; Canon Part 8
27
+ * compliant by construction).
28
+ *
29
+ * Constraints: zero new runtime deps, CJS only (Phase 87 invariant),
30
+ * defensive defaults so {} or undefined cannot crash the formatter.
31
+ */
32
+
33
+ /**
34
+ * The 5 canonical operators (Phase 99 CONTEXT.md D-03, frozen).
35
+ * Re-exported for downstream consumers that want to validate operator
36
+ * values without re-importing from lib/conversation/operator.cjs.
37
+ *
38
+ * @type {ReadonlyArray<string>}
39
+ */
40
+ const OPERATORS = Object.freeze([
41
+ 'JUST_TALK',
42
+ 'EXPLORE_CAPTURE',
43
+ 'BUILD_ROOM',
44
+ 'METHODOLOGY',
45
+ 'DECISION_GATE',
46
+ ]);
47
+
48
+ /**
49
+ * JTBD -> CLI semantic color map (Phase 102 D-06).
50
+ *
51
+ * Maps each of the 13 canonical Phase 100 JTBD handles to one of the 5
52
+ * SKILL.md §4 CLI colors (red / yellow / cyan / green / gray). NO new
53
+ * colors invented; the 5-color contract is the boundary.
54
+ *
55
+ * Color anchors:
56
+ * - red : commit / blocker / contradiction (high-stakes)
57
+ * - yellow : questioning / challenge / warning
58
+ * - cyan : informational / cross-reference / capture
59
+ * - green : forward action / commitment / success
60
+ * - gray : meta / no specific action (the canvas)
61
+ *
62
+ * @type {Readonly<Record<string,string>>}
63
+ */
64
+ const JTBD_CLI_COLOR = Object.freeze({
65
+ 'decide-pursue': 'red',
66
+ 'find-problem': 'yellow',
67
+ 'understand-market': 'cyan',
68
+ 'find-bottleneck': 'red',
69
+ 'prepare-pitch': 'green',
70
+ 'validate-idea': 'yellow',
71
+ 'compare-options': 'cyan',
72
+ 'connect-domains': 'cyan',
73
+ 'surface-contradiction': 'red',
74
+ 'plan-execution': 'green',
75
+ 'file-meeting': 'cyan',
76
+ 'audit-room': 'yellow',
77
+ 'explore': 'gray',
78
+ });
79
+
80
+ /**
81
+ * ANSI SGR escape sequences for the 5-color contract (SKILL.md §4).
82
+ * Used by Zone 1 left-rail accent (D-07). TTY-gated at render time so
83
+ * non-TTY captures (CI logs, JSON-mode emission) stay byte-clean.
84
+ *
85
+ * @type {Readonly<Record<string,string>>}
86
+ */
87
+ const ANSI = Object.freeze({
88
+ red: '\x1b[31m',
89
+ yellow: '\x1b[33m',
90
+ cyan: '\x1b[36m',
91
+ green: '\x1b[32m',
92
+ gray: '\x1b[90m',
93
+ reset: '\x1b[0m',
94
+ });
95
+
96
+ /**
97
+ * Render a 4-zone payload into a single output string + contract envelope.
98
+ *
99
+ * @param {object} args
100
+ * @param {object} [args.zones] - { header, body, signals?, footer? }
101
+ * @param {string} [args.mode] - 'A' | 'B' | 'tier-0' (default 'A')
102
+ * @param {string|null} [args.operator] - one of OPERATORS or null
103
+ * @param {number} [args.tier] - 0|1|2|3 (default 1)
104
+ * @param {string|null} [args.jtbd] - active JTBD or null (default null)
105
+ * @param {object} [args.tokenBudget] - { used, total } (default {0,1})
106
+ * @param {string} [args.roomDir] - absolute room path; used by
107
+ * downstream plans for selector-dispatcher
108
+ * access. Defaults to env or process.cwd().
109
+ * @param {object|null} [args.provenance] - optional Brain provenance object
110
+ * @returns {{ rendered: string, contract: object }}
111
+ */
112
+ function render(args) {
113
+ args = args || {};
114
+ // Defensive defaults — every arg can be missing or null/undefined.
115
+ let zones = args.zones || {};
116
+ const mode = args.mode || 'A';
117
+ const operator = args.operator || null;
118
+ const tier = (args.tier === undefined || args.tier === null) ? 1 : args.tier;
119
+ const jtbd = args.jtbd || null;
120
+ const tokenBudget = args.tokenBudget || { used: 0, total: 1 };
121
+ const roomDir = args.roomDir || process.env.MINDRIAN_ROOM_DIR || process.cwd();
122
+ let provenance = args.provenance || null;
123
+
124
+ // -------------------------------------------------------------------------
125
+ // Algorithm steps 1-7: hooks for downstream plans (102-02..05).
126
+ // The numbered markers MUST stay so follow-on plans land at the right spot.
127
+ // -------------------------------------------------------------------------
128
+
129
+ // 1. Compaction decision (Phase 102-02 — single 80% threshold).
130
+ // Source priority: explicit env var (CLAUDE_CONTEXT_USED_PCT) >
131
+ // caller-supplied tokenBudget > memory heuristic. See isCompact() below.
132
+ // Adaptive granularity (50/70/80/90) is v1.15.x deferred (CONTEXT D-02).
133
+ const compact = isCompact(tokenBudget);
134
+
135
+ // 2. JTBD-aware Zone 4 (Phase 102-03) -- dispatch for both jtbd-set and
136
+ // jtbd-null+BUILD_ROOM (per CONTEXT D-04). Free-Text is forced last by
137
+ // the dispatcher's ensureFreeTextLast invariant. The operator gates in
138
+ // step 6 (JUST_TALK / METHODOLOGY) override this enrichment when needed
139
+ // -- order matters: we set zones.footer here, step 6 may strip it.
140
+ const shouldFireZone4 = (zones.footer === undefined)
141
+ && operator !== 'JUST_TALK'
142
+ && operator !== 'METHODOLOGY'
143
+ && (jtbd || operator === 'BUILD_ROOM');
144
+
145
+ if (shouldFireZone4) {
146
+ try {
147
+ const dispatcher = require('../hmi/selector-dispatcher.cjs');
148
+ const result = dispatcher.pickShape({
149
+ requestedShape: 'F',
150
+ roomDir: roomDir,
151
+ operator: operator,
152
+ tier: tier,
153
+ payload: {},
154
+ });
155
+ // Dispatcher returns F.6 when jtbd set, F.1 (canonical 10) when jtbd null.
156
+ // Result envelope: { shape, rendered: { zones, contract } }. Pull verbs
157
+ // off contract.verbs and the pre-formatted body off zones.body so the
158
+ // composeZones B6 footer contract is satisfied (rendered string short
159
+ // path; verbs[] defense-in-depth fallback).
160
+ if (result && result.rendered && result.rendered.contract
161
+ && Array.isArray(result.rendered.contract.verbs)) {
162
+ zones = Object.assign({}, zones, {
163
+ footer: {
164
+ verbs: result.rendered.contract.verbs.slice(),
165
+ shape: result.shape,
166
+ rendered: (result.rendered.zones && typeof result.rendered.zones.body === 'string')
167
+ ? result.rendered.zones.body : null,
168
+ },
169
+ });
170
+ }
171
+ } catch (err) {
172
+ // Graceful fallback per Canon Part 3 Rule 2: dispatcher errors must
173
+ // never block the render. Surface debug info under MINDRIAN_DEBUG=1
174
+ // and leave zones.footer undefined for the caller / downstream default.
175
+ if (process.env.MINDRIAN_DEBUG === '1') {
176
+ process.stderr.write(
177
+ '[render-v2] zone4 dispatcher error: '
178
+ + String((err && err.message) || err).slice(0, 80) + '\n'
179
+ );
180
+ }
181
+ }
182
+ }
183
+
184
+ // 3. Zone 1 left-rail accent (Phase 102-05; D-06 + D-07).
185
+ // Subtle JTBD-aware accent: a single colored ■ glyph prepended to
186
+ // the existing Zone 1 header. ALL gates must hold:
187
+ // (a) jtbd is non-null and present in JTBD_CLI_COLOR (D-06);
188
+ // (b) compact mode is OFF (D-08; uses the unified `compact` flag
189
+ // from slot 1 above, so the local env+budget gate from the
190
+ // 102-05 worktree's standalone build collapses out -- single
191
+ // source of truth for compaction);
192
+ // (c) process.stdout.isTTY is true -- non-TTY captures (CI logs,
193
+ // piped output, JSON-mode emission) MUST stay byte-clean per
194
+ // the RENDER-102-05 strip-ANSI invariant.
195
+ // The ■ glyph itself is shape, not color -- emit it in BOTH TTY and
196
+ // non-TTY modes so the strip-ANSI(TTY) === non-TTY byte-identical
197
+ // invariant holds. Only the ANSI SGR bytes are gated on isTTY.
198
+ // Mutate a shallow copy so we never alter the caller's zones object.
199
+ if (!compact && jtbd && JTBD_CLI_COLOR[jtbd]) {
200
+ const useColor = process.stdout.isTTY === true;
201
+ const color = useColor ? ANSI[JTBD_CLI_COLOR[jtbd]] : '';
202
+ const reset = useColor ? ANSI.reset : '';
203
+ zones = Object.assign({}, zones);
204
+ zones.header = color + '■' + reset + ' ' + (zones.header || '');
205
+ }
206
+
207
+ // 4. Provenance enrichment (Phase 102-04 -- LOCAL-only audit envelope).
208
+ // Build the LOCAL-only _provenance envelope. Per RENDER-102-04 +
209
+ // Canon Part 8, every render result carries:
210
+ // { renderer:'render-v2', version:'102', operator, tier, mode, jtbd }
211
+ // Zero Brain queries, zero network IO, zero filesystem reads outside
212
+ // lib/render/JTBD-PALETTES.md. The fields are pure scalar passthroughs
213
+ // of args already destructured above; no user-content strings are
214
+ // embedded (operator + mode + tier + jtbd are framework-handle enums
215
+ // or null), so this envelope is Canon Part 8 compliant by construction.
216
+ // The 'provenance' caller arg (from upstream Brain-aware code paths)
217
+ // is intentionally NOT folded into _provenance to avoid leaking caller-
218
+ // supplied user content into the renderer's audit envelope; callers may
219
+ // place that payload into zones.signals themselves if they want it
220
+ // surfaced. Attached non-enumerably via attachProvenance() so the
221
+ // Phase 99-03 byte-stability fence (Object.keys === [contract,rendered])
222
+ // stays green.
223
+ const _provenance = Object.freeze({
224
+ renderer: 'render-v2',
225
+ version: '102',
226
+ operator: operator,
227
+ tier: tier,
228
+ mode: mode,
229
+ jtbd: jtbd,
230
+ });
231
+
232
+ // 5. Compact mode application (Phase 102-02). Apply AFTER any upstream
233
+ // enrichment hooks (Z4 dispatcher, color overlay, provenance) so
234
+ // compaction trims the final pre-compose payload. Sibling 102-05's
235
+ // color-overlay block (slot 3) self-gates against compact via its
236
+ // own local check; once that local gate is folded into this unified
237
+ // `compact` flag (future cleanup), the redundancy drops out without
238
+ // changing observable behavior.
239
+ if (compact) zones = applyCompaction(zones);
240
+
241
+ // 6. Operator-driven Zone 4 gates (102-01: ship this gate today).
242
+ // JUST_TALK suppresses ALL output (prose-only operator); METHODOLOGY
243
+ // mid-session strips Zone 4 (the methodology owns the screen).
244
+ if (operator === 'JUST_TALK') {
245
+ return attachProvenance(
246
+ { rendered: '', contract: { suppressed: true, reason: 'just-talk' } },
247
+ _provenance
248
+ );
249
+ }
250
+ if (operator === 'METHODOLOGY' && (!zones.body || !zones.body.endingSignal)) {
251
+ // Mutate a shallow copy so we never alter the caller's object.
252
+ zones = Object.assign({}, zones);
253
+ delete zones.footer;
254
+ }
255
+
256
+ // 7. Mode B prefix (filled by 102-04)
257
+ // if (mode === 'B' && zones.header && !String(zones.header).startsWith('⚠')) {
258
+ // zones.header = '⚠ Brain unreachable; running on local graph only.\n' + zones.header;
259
+ // }
260
+
261
+ // -------------------------------------------------------------------------
262
+ // Step 8: compose 4 zones into a single string.
263
+ // -------------------------------------------------------------------------
264
+ const composed = composeZones(zones);
265
+
266
+ // Reference the not-yet-used vars so static analyzers do not warn before
267
+ // 102-05 wires them up. (102-03 consumed: tier, jtbd, roomDir via the Z4
268
+ // dispatcher. 102-04 consumed: mode + tier + jtbd into _provenance. The
269
+ // upstream caller-supplied `provenance` arg remains unused -- intentionally
270
+ // NOT folded into _provenance to avoid leaking user content per Canon
271
+ // Part 8; callers may put it in zones.signals themselves.)
272
+ void provenance;
273
+
274
+ // Surface `compact` on the contract so downstream plans can branch on it
275
+ // (102-05 reads it to drop the color overlay; tests inspect it to verify
276
+ // the compaction gate fired). The non-enumerable _provenance envelope is
277
+ // attached via attachProvenance() so Object.keys(env) stays
278
+ // ['contract','rendered'] (RENDER-102-06 byte-stability invariant).
279
+ return attachProvenance(
280
+ { rendered: composed, contract: { compact: compact } },
281
+ _provenance
282
+ );
283
+ }
284
+
285
+ /**
286
+ * Attach a non-enumerable, frozen `_provenance` field to a render envelope.
287
+ *
288
+ * Non-enumerable so `Object.keys(env).sort()` still equals
289
+ * `['contract','rendered']` (per RENDER-102-06: the Phase 99-03 -> Phase 102
290
+ * import-surface byte-stability fence in `lib/render/render-v2.test.cjs`
291
+ * scenario 5). The field is still readable as `env._provenance` for any
292
+ * caller that asks for it explicitly (audit, telemetry, debug surface).
293
+ *
294
+ * Configurable: false; writable: false. The whole envelope is intended to
295
+ * be a single-pass write -- callers that mutate it are out of contract.
296
+ *
297
+ * @param {object} envelope - { rendered, contract } from the renderer.
298
+ * @param {object} provenance - frozen provenance descriptor.
299
+ * @returns {object} same envelope, with `_provenance` attached.
300
+ */
301
+ function attachProvenance(envelope, provenance) {
302
+ Object.defineProperty(envelope, '_provenance', {
303
+ value: provenance,
304
+ enumerable: false,
305
+ configurable: false,
306
+ writable: false,
307
+ });
308
+ return envelope;
309
+ }
310
+
311
+ /**
312
+ * Compose a 4-zone payload into a single newline-delimited string.
313
+ *
314
+ * Footer shape contract (cross-plan with 102-03):
315
+ * - string: emit verbatim
316
+ * - { rendered: string }: emit rendered field (pre-formatted by dispatcher in 102-03)
317
+ * - { verbs: string[] }: emit verbs as `▷ <verb>` lines (defense-in-depth fallback)
318
+ *
319
+ * Signals shape:
320
+ * - array of strings; each prefixed with `▷ ` and joined by newlines.
321
+ *
322
+ * @param {object} zones
323
+ * @returns {string}
324
+ */
325
+ function composeZones(zones) {
326
+ zones = zones || {};
327
+ const header = zones.header;
328
+ const body = zones.body;
329
+ const signals = zones.signals;
330
+ const footer = zones.footer;
331
+
332
+ const parts = [];
333
+
334
+ if (header) parts.push(String(header));
335
+
336
+ if (body) {
337
+ if (typeof body === 'string') {
338
+ parts.push(body);
339
+ } else if (body.text) {
340
+ parts.push(String(body.text));
341
+ } else {
342
+ parts.push(JSON.stringify(body));
343
+ }
344
+ }
345
+
346
+ if (Array.isArray(signals) && signals.length) {
347
+ parts.push(signals.map(function (s) { return '▷ ' + s; }).join('\n'));
348
+ }
349
+
350
+ if (footer) {
351
+ if (typeof footer === 'string') {
352
+ parts.push(footer);
353
+ } else if (footer.rendered) {
354
+ parts.push(String(footer.rendered));
355
+ } else if (Array.isArray(footer.verbs)) {
356
+ parts.push(footer.verbs.map(function (v) { return '▷ ' + v; }).join('\n'));
357
+ }
358
+ }
359
+
360
+ return parts.filter(Boolean).join('\n\n');
361
+ }
362
+
363
+ // ---------------------------------------------------------------------------
364
+ // Phase 102-02 — token-budget-aware compaction layer.
365
+ //
366
+ // Single 80% threshold (CONTEXT D-02 + D-03). Adaptive granularity
367
+ // (50% / 70% / 80% / 90%) is v1.15.x deferred. Compaction is a pure
368
+ // function of zones; callers see the trimmed payload via composeZones.
369
+ // ---------------------------------------------------------------------------
370
+
371
+ /**
372
+ * Decide whether to compact based on token-budget signals.
373
+ *
374
+ * Source priority (CONTEXT D-02):
375
+ * 1. process.env.CLAUDE_CONTEXT_USED_PCT — explicit Claude Code signal.
376
+ * Treated as a percentage in 0..100. Returns true when > 80.
377
+ * 2. caller-supplied tokenBudget {used, total} — explicit numbers from
378
+ * the caller. Returns true when used/total > 0.80. Requires both
379
+ * total > 0 AND used > 0; the defensive default {used:0, total:1}
380
+ * falls through to the heuristic.
381
+ * 3. process.memoryUsage() heuristic — heapUsed/heapTotal > 0.95.
382
+ * Rough last-resort proxy that ONLY triggers under genuine heap
383
+ * pressure. Idle Node CLIs sit at ~0.70 routinely, so the original
384
+ * 0.60 threshold from RESEARCH §2 step 1 misfired against the 99-03
385
+ * regression fence + 102-01 signature suites (both call render()
386
+ * with no env var and no explicit budget; both expect non-compact
387
+ * output). Raised to 0.95 here as a Rule 1 deviation; documented in
388
+ * 102-02-SUMMARY.md "Deviations from Plan". The function still
389
+ * always returns a boolean per the plan's done-criteria 8.
390
+ *
391
+ * @param {object} tokenBudget - { used, total }
392
+ * @returns {boolean} true when the renderer should switch to compact mode.
393
+ */
394
+ function isCompact(tokenBudget) {
395
+ // 1. Explicit env signal from Claude Code. Truthy + parseable wins.
396
+ if (process.env.CLAUDE_CONTEXT_USED_PCT) {
397
+ const pct = parseFloat(process.env.CLAUDE_CONTEXT_USED_PCT) / 100;
398
+ if (!isNaN(pct)) return pct > 0.80;
399
+ }
400
+ // 2. Caller-supplied {used, total}. Defensive: only trust positive
401
+ // totals AND a positive `used` so the {0,1} default falls through.
402
+ if (tokenBudget && tokenBudget.total > 0 && tokenBudget.used > 0) {
403
+ return (tokenBudget.used / tokenBudget.total) > 0.80;
404
+ }
405
+ // 3. Memory heuristic fallback. Threshold raised from 0.60 -> 0.95 so
406
+ // idle Node processes do not trip compaction. Always returns boolean.
407
+ const m = process.memoryUsage();
408
+ return (m.heapUsed / m.heapTotal) > 0.95;
409
+ }
410
+
411
+ /**
412
+ * Apply Phase 102-02 compaction rules to a zones payload.
413
+ *
414
+ * Returns a new shallow-copied object; never mutates the caller's zones.
415
+ * Compaction rules (CONTEXT D-03):
416
+ * - Z1 header: single line; strip decorative dashes / box-drawing glyphs.
417
+ * The `-- ... --` envelope collapses to a leading `■ ` (canonical
418
+ * compact glyph from the `■ ✓ ⚠ →` allowlist).
419
+ * - Z2 body: cap at 30 lines. Lines 31..N replaced by a single
420
+ * `... <N more rows>` summary line. String body shape preserved.
421
+ * - Z3 signals: cap at 2 (down from 3).
422
+ * - Z4 footer (object form with verbs[]): cap at 2; if the verb list
423
+ * ends in `Free-Text`, preserve `Free-Text` as the LAST element
424
+ * (Phase 100 invariant — Free-Text is always the escape hatch).
425
+ *
426
+ * @param {object} zones
427
+ * @returns {object} compacted zones (shallow copy)
428
+ */
429
+ function applyCompaction(zones) {
430
+ const out = Object.assign({}, zones || {});
431
+
432
+ // Z1: simplify header — single line, strip decorative dashes/box-drawing.
433
+ if (out.header) {
434
+ let h = String(out.header);
435
+ h = h.split('\n')[0]; // single line first
436
+ // Collapse leading "-- " into "■ " (canonical compact glyph) and drop
437
+ // any trailing " -- " envelope. Mid-string " -- " separators are kept
438
+ // (semantic between-segment dividers); only the outer envelope is
439
+ // decorative and strippable.
440
+ h = h.replace(/^-- /, '■ ').replace(/ -- $/, '');
441
+ // Strip box-drawing characters anywhere in the header.
442
+ h = h.replace(/[─━│┌┐└┘╭╮╰╯]/g, '');
443
+ out.header = h;
444
+ }
445
+
446
+ // Z2: cap body at 30 lines (string form only — object-shaped bodies are
447
+ // upstream's job to compact).
448
+ if (typeof out.body === 'string') {
449
+ const lines = out.body.split('\n');
450
+ if (lines.length > 30) {
451
+ const overflow = lines.length - 30;
452
+ out.body = lines.slice(0, 30).join('\n') + '\n... <' + overflow + ' more rows>';
453
+ }
454
+ }
455
+
456
+ // Z3: cap signals at 2.
457
+ if (Array.isArray(out.signals) && out.signals.length > 2) {
458
+ out.signals = out.signals.slice(0, 2);
459
+ }
460
+
461
+ // Z4: cap footer.verbs at 2; preserve Free-Text last when present.
462
+ if (out.footer && typeof out.footer === 'object' && Array.isArray(out.footer.verbs)) {
463
+ const verbs = out.footer.verbs;
464
+ if (verbs.length > 2) {
465
+ const hasFreeText = verbs[verbs.length - 1] === 'Free-Text';
466
+ const trimmed = hasFreeText
467
+ ? [verbs[0], 'Free-Text']
468
+ : verbs.slice(0, 2);
469
+ out.footer = Object.assign({}, out.footer, { verbs: trimmed });
470
+ }
471
+ }
472
+
473
+ return out;
474
+ }
475
+
476
+ module.exports = {
477
+ render,
478
+ OPERATORS,
479
+ composeZones,
480
+ // Phase 102-02 exports for test fences + downstream introspection.
481
+ isCompact,
482
+ applyCompaction,
483
+ // Phase 102-05 exports for test fences + downstream introspection.
484
+ JTBD_CLI_COLOR,
485
+ ANSI,
486
+ };