@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,546 @@
1
+ /*
2
+ * Copyright (c) 2026 Mindrian. BSL 1.1.
3
+ *
4
+ * Phase 101-04 + 101-05 + 88.2-04 -- single integration point for Shape F/G/H rendering.
5
+ *
6
+ * Phase 101-05 (Mode A/B/Tier 0 graceful degradation per Canon Part 3):
7
+ *
8
+ * Tier helper:
9
+ * - Resolved at: lib/hmi/tier-check.cjs (v1 stub; Phase 90 follow-on
10
+ * will replace with full Brain-ping + cache + BRAIN.md presence audit).
11
+ * - Expected return from getTier(): integer in {0, 1, 2, 3}.
12
+ * - Mode mapping (Canon Part 3 "Option generation tier-awareness"):
13
+ * tier >= 2 -> Mode A (Full Loop): Brain reachable, RECOMMENDED >= 0.7 marker rendered.
14
+ * tier 1 -> Mode B (Local Only): Navigation Engine; no RECOMMENDED marker; Zone 1 carries
15
+ * "Brain unreachable; running on local graph only." prefix line.
16
+ * tier 0 -> degraded; dispatcher refuses expensive shapes per Canon Part 3 Rule 2,
17
+ * returns { shape: 'error', rendered: { error: 'tier-0-refused', ... } }.
18
+ *
19
+ * Defense-in-depth: dispatcher computes mode from tier and propagates `mode` to every renderer.
20
+ * Renderers (F.6 + G + H) ALSO suppress RECOMMENDED markers internally when mode === 'B' so a
21
+ * buggy caller who forgets to pass mode still cannot leak a `▶` marker in Mode B.
22
+ *
23
+ * Phase 88.2-04 (Operator-aware F.1..F.5 sub-shape dispatch + telemetry + AskUserQuestion trailer):
24
+ *
25
+ * F.1..F.5 sub-shape dispatch:
26
+ * requestedShape ∈ {'F.1','F.2','F.3','F.4','F.5'} routes directly to the matching
27
+ * Phase 88.2 wave-1 renderer (lib/hmi/shape-fN-renderer.cjs). The umbrella 'F'
28
+ * branch is preserved byte-stable -- it still routes via JTBD state to F.6 (or
29
+ * F.1 fallback). Existing 9-test selector-dispatcher contract is preserved.
30
+ *
31
+ * JUST_TALK refuse (Canon Part 3 + render-v2 compaction gate):
32
+ * When `operator === 'JUST_TALK'` and ANY Shape F.* (umbrella or sub-shape) is
33
+ * requested, the dispatcher returns:
34
+ * { shape: 'error', rendered: { error: 'render_v2_compaction_violation', ... } }
35
+ * mirroring lib/render/render-v2.cjs#244 ("JUST_TALK suppresses ALL output").
36
+ * A Shape F selector cannot be presented while the conversation is in JUST_TALK
37
+ * prose-only mode without violating the compaction contract.
38
+ *
39
+ * Telemetry emission (Canon Part 8 LOCAL ONLY):
40
+ * Every successful Shape F.* presentation calls
41
+ * selector-telemetry.recordPresentation(roomDir, {sub_shape, mode, options_count,
42
+ * recommended_present, operator}). Wrapped in try/catch -- telemetry NEVER fails
43
+ * Larry's turn. The companion recordResponse() is exposed as a re-export for
44
+ * consumers that wire the AskUserQuestion answer back to the ledger.
45
+ *
46
+ * AskUserQuestion structural-marker trailer:
47
+ * Every successful Shape F.* return carries an
48
+ * `rendered.askuserquestion_marker = '[AskUserQuestion contract: shape=F.X verbs=N]'`
49
+ * scalar AND the marker is appended (preceded by a blank line) to
50
+ * `rendered.zones.footer`. Consumers that compose zones see the trailer
51
+ * in the rendered surface; consumers that introspect the contract can
52
+ * read the scalar directly.
53
+ *
54
+ * API:
55
+ * pickShape({ requestedShape, roomDir, operator, tier, payload })
56
+ * -> { shape, rendered } | { shape, passthrough: true }
57
+ *
58
+ * - requestedShape: 'F' | 'F.1' | 'F.2' | 'F.3' | 'F.4' | 'F.5' | 'G' | 'H' | 'A' | 'B' | 'C' | 'D' | 'E'
59
+ * - roomDir: absolute path; used to read JTBD state for F-shape dispatch.
60
+ * - operator: one of OPERATORS or null. JUST_TALK refuses Shape F.*.
61
+ * - tier: optional override; if omitted, dispatcher calls getTier().
62
+ * - payload: shape-specific input forwarded to the corresponding renderer.
63
+ *
64
+ * recordSelectorResponse(roomDir, record)
65
+ * Re-export of selector-telemetry.recordResponse for consumers wiring
66
+ * AskUserQuestion answers back to the local ledger.
67
+ *
68
+ * Pure CJS, node built-ins only, zero deps (Phase 87 invariant).
69
+ */
70
+
71
+ 'use strict';
72
+
73
+ const FREE_TEXT = 'Free-Text';
74
+ const MODE_B_ZONE1_PREFIX = '⚠ Brain unreachable; running on local graph only.';
75
+
76
+ // Phase 88.2-04: F.* sub-shape registry and JUST_TALK refuse vocabulary.
77
+ // Phase 88.2-05: 'F.0' Mini Decision Gate prepended (closed-vocab; freeTextOffered:false carve-out).
78
+ // Phase 88.2-06: 'F.6' Plan Review Round appended (closed-vocab; routes to the
79
+ // collision-safe lib/hmi/shape-f6-plan-review-renderer.cjs path; the umbrella 'F'
80
+ // branch continues to route to Phase 101-01's lib/hmi/shape-f6-renderer.cjs via
81
+ // JTBD logic preserved byte-stable per R1 invariant).
82
+ const F_SUBSHAPES = ['F.0', 'F.1', 'F.2', 'F.3', 'F.4', 'F.5', 'F.6'];
83
+ const F_UMBRELLA = 'F';
84
+ const JUST_TALK = 'JUST_TALK';
85
+ const COMPACTION_VIOLATION_CODE = 'render_v2_compaction_violation';
86
+
87
+ function safeRequire(modPath) {
88
+ try {
89
+ return require(modPath);
90
+ } catch (e) {
91
+ if (e && e.code === 'MODULE_NOT_FOUND') return null;
92
+ throw e;
93
+ }
94
+ }
95
+
96
+ function resolveTier(explicitTier) {
97
+ if (typeof explicitTier === 'number' && Number.isFinite(explicitTier)) {
98
+ return explicitTier;
99
+ }
100
+ try {
101
+ const helper = require('./tier-check.cjs');
102
+ const t = helper.getTier();
103
+ return (typeof t === 'number' && Number.isFinite(t)) ? t : 1;
104
+ } catch (e) {
105
+ // tier-check absent or broken -> assume Local Only (Mode B), the safer default.
106
+ return 1;
107
+ }
108
+ }
109
+
110
+ function modeFromTier(tier) {
111
+ if (tier >= 2) return 'A';
112
+ if (tier === 1) return 'B';
113
+ return '0';
114
+ }
115
+
116
+ /**
117
+ * Defense-in-depth: ensure Free-Text is the last verb in any F-shape contract.
118
+ * Per Canon Part 3 Layer 2 + D-10. Mutates the rendered structure in place.
119
+ *
120
+ * Phase 88.2-04 carve-out: closed-vocabulary sub-shapes (F.3 Rabbit-Hole Depth,
121
+ * F.4 Insight Extraction) DO NOT offer Free-Text per skills/ui-system/SKILL.md
122
+ * Section 2 (depth/extraction are closed axes). Renderers signal this by
123
+ * setting `contract.freeTextOffered === false`. Respecting that flag preserves
124
+ * the closed-vocab invariant; injecting Free-Text would silently break the
125
+ * Wave-1 contract and the renderer's own 7-assertion test suite.
126
+ */
127
+ function ensureFreeTextLast(rendered) {
128
+ if (!rendered || !rendered.contract || !Array.isArray(rendered.contract.verbs)) return rendered;
129
+ // Closed-vocab carve-out: F.3, F.4 explicitly opt out of Free-Text.
130
+ if (rendered.contract.freeTextOffered === false) return rendered;
131
+ const verbs = rendered.contract.verbs;
132
+ if (verbs.length === 0 || verbs[verbs.length - 1] !== FREE_TEXT) {
133
+ const filtered = verbs.filter(v => v !== FREE_TEXT);
134
+ filtered.push(FREE_TEXT);
135
+ rendered.contract.verbs = filtered;
136
+ }
137
+ return rendered;
138
+ }
139
+
140
+ /**
141
+ * Prepend the Mode B Zone 1 prefix to a renderer's zones.header. The prefix is
142
+ * a separate line BEFORE the renderer's own header (Task 2.3 contract).
143
+ */
144
+ function applyModeBPrefix(rendered) {
145
+ if (!rendered || !rendered.zones) return rendered;
146
+ const existing = typeof rendered.zones.header === 'string' ? rendered.zones.header : '';
147
+ rendered.zones.header = MODE_B_ZONE1_PREFIX + '\n' + existing;
148
+ return rendered;
149
+ }
150
+
151
+ function tier0Refuse() {
152
+ return {
153
+ shape: 'error',
154
+ rendered: {
155
+ error: 'tier-0-refused',
156
+ detail: '/mos:setup brain or graph required for selectors',
157
+ },
158
+ };
159
+ }
160
+
161
+ /**
162
+ * Phase 88.2-04: refuse Shape F.* presentation while the conversation operator
163
+ * is JUST_TALK. JUST_TALK is the prose-only operator (Canon Part 3 + render-v2
164
+ * step 6); a selector block would violate the compaction contract.
165
+ */
166
+ function justTalkRefuse(requestedShape) {
167
+ return {
168
+ shape: 'error',
169
+ rendered: {
170
+ error: COMPACTION_VIOLATION_CODE,
171
+ detail: 'Shape F selector refused: operator JUST_TALK suppresses all selector output (render-v2 step 6 / Canon Part 3).',
172
+ operator: JUST_TALK,
173
+ requested: requestedShape,
174
+ },
175
+ };
176
+ }
177
+
178
+ /**
179
+ * Phase 88.2-04: emit selector presentation telemetry. Wrapped in try/catch --
180
+ * telemetry NEVER fails Larry's turn. Canon Part 8: LOCAL ledger only, room
181
+ * slug sha256-hashed, never crosses any network boundary.
182
+ */
183
+ function emitPresentationTelemetry(roomDir, subShape, rendered, operator) {
184
+ try {
185
+ const tel = safeRequire('./selector-telemetry.cjs');
186
+ if (!tel || typeof tel.recordPresentation !== 'function') return;
187
+ const contract = (rendered && rendered.contract) ? rendered.contract : {};
188
+ const verbs = Array.isArray(contract.verbs) ? contract.verbs : [];
189
+ const mode = (typeof contract.mode === 'string') ? contract.mode : null;
190
+ const recommendedPresent = (contract.recommended !== null && contract.recommended !== undefined);
191
+ const record = {
192
+ sub_shape: subShape,
193
+ mode: mode,
194
+ options_count: verbs.length,
195
+ recommended_present: recommendedPresent,
196
+ };
197
+ if (typeof operator === 'string' && operator.length > 0) {
198
+ record.operator = operator;
199
+ }
200
+ tel.recordPresentation(roomDir, record);
201
+ } catch (_e) {
202
+ // Graceful: never fail Larry's turn on a telemetry I/O hiccup.
203
+ }
204
+ }
205
+
206
+ /**
207
+ * Phase 88.2-04: append the AskUserQuestion structural-marker trailer to a
208
+ * Shape F.* rendered envelope. Two surfaces:
209
+ * 1. rendered.askuserquestion_marker -- scalar string for introspection.
210
+ * 2. rendered.zones.footer -- the trailer is appended (preceded by a
211
+ * blank line if the footer is non-empty) so any composeZones() consumer
212
+ * sees it in the rendered surface.
213
+ *
214
+ * Trailer format (per 88.2-04 success criteria):
215
+ * [AskUserQuestion contract: shape=F.X verbs=N]
216
+ */
217
+ function appendAskUserQuestionTrailer(rendered, subShape) {
218
+ if (!rendered) return rendered;
219
+ const contract = rendered.contract || {};
220
+ const verbs = Array.isArray(contract.verbs) ? contract.verbs : [];
221
+ const shapeStr = (typeof contract.shape === 'string' && contract.shape.length > 0)
222
+ ? contract.shape : subShape;
223
+ const trailer = '[AskUserQuestion contract: shape=' + shapeStr + ' verbs=' + verbs.length + ']';
224
+
225
+ // Scalar surface (testable by introspection without parsing zones).
226
+ rendered.askuserquestion_marker = trailer;
227
+
228
+ // Zones surface: append to footer with a separating blank line.
229
+ if (!rendered.zones || typeof rendered.zones !== 'object') return rendered;
230
+ const existing = rendered.zones.footer;
231
+ if (existing === null || existing === undefined || existing === '') {
232
+ rendered.zones.footer = trailer;
233
+ } else {
234
+ rendered.zones.footer = String(existing) + '\n\n' + trailer;
235
+ }
236
+ return rendered;
237
+ }
238
+
239
+ function dispatchShapeF(args) {
240
+ const { roomDir, tier, mode, payload } = args;
241
+ const payloadObj = (payload && typeof payload === 'object') ? payload : {};
242
+ const recommendedVerb = (mode === 'A' && typeof payloadObj.recommendedVerb === 'string')
243
+ ? payloadObj.recommendedVerb : null;
244
+
245
+ // Read JTBD state -- F.6 path requires non-null jtbd.
246
+ const jtbdState = safeRequire('./jtbd-state.cjs');
247
+ let jtbdId = null;
248
+ if (jtbdState && typeof jtbdState.getCurrent === 'function' && typeof roomDir === 'string') {
249
+ try {
250
+ const current = jtbdState.getCurrent(roomDir);
251
+ jtbdId = (current && typeof current.jtbd === 'string') ? current.jtbd : null;
252
+ } catch (e) {
253
+ jtbdId = null;
254
+ }
255
+ }
256
+
257
+ if (jtbdId !== null) {
258
+ const f6 = safeRequire('./shape-f6-renderer.cjs');
259
+ if (f6 && typeof f6.renderShapeF6 === 'function') {
260
+ const result = f6.renderShapeF6({ jtbd: jtbdId, tier, recommendedVerb });
261
+ if (result && !result.error && !result.fallthrough) {
262
+ return { shape: 'F.6', rendered: ensureFreeTextLast(result) };
263
+ }
264
+ // fall through to F.1 path on degenerate / unknown JTBD
265
+ }
266
+ }
267
+
268
+ // F.1 path -- prefer Phase 88.2 module if shipped, else fall back to Phase 101's inline canonical-10.
269
+ const f1 = safeRequire('./shape-f1-renderer.cjs') || safeRequire('./shape-f1-fallback.cjs');
270
+ if (f1 && typeof f1.renderShapeF1 === 'function') {
271
+ const result = f1.renderShapeF1({ tier, recommendedVerb });
272
+ return { shape: 'F.1', rendered: ensureFreeTextLast(result) };
273
+ }
274
+
275
+ // Neither F.1 nor F.6 module available -- return error.
276
+ return {
277
+ shape: 'error',
278
+ rendered: { error: 'no-f-renderer', detail: 'shape-f1 and shape-f6 modules both missing' },
279
+ };
280
+ }
281
+
282
+ /**
283
+ * Phase 88.2-04: direct sub-shape dispatch for F.1..F.5. Each renderer is the
284
+ * Wave-1 module shipped in 88.2-01..03 (open-vocab F.1/F.2/F.5 + closed-vocab
285
+ * F.3/F.4). Mode B Zone-1 prefix and AskUserQuestion trailer are applied at
286
+ * the dispatcher entry point (pickShape) so this helper returns a canonical
287
+ * { shape, rendered } envelope without those concerns.
288
+ */
289
+ function dispatchShapeFSubShape(requestedShape, args) {
290
+ const { tier, mode, payload } = args;
291
+ const payloadObj = (payload && typeof payload === 'object') ? payload : {};
292
+ const recommendedVerb = (mode === 'A' && typeof payloadObj.recommendedVerb === 'string')
293
+ ? payloadObj.recommendedVerb : null;
294
+ const callerVerbs = Array.isArray(payloadObj.verbs) ? payloadObj.verbs : undefined;
295
+ const callerHeader = (typeof payloadObj.header === 'string' && payloadObj.header.length > 0)
296
+ ? payloadObj.header : undefined;
297
+
298
+ let mod = null;
299
+ let fnName = null;
300
+ let inputArgs = null;
301
+ if (requestedShape === 'F.0') {
302
+ // Phase 88.2-05: F.0 Mini Decision Gate. Closed-vocab (freeTextOffered:false);
303
+ // dispatcher passes only header + body + parent_decision_id pass-through. The
304
+ // renderer ignores any caller-supplied verbs[] or recommendedVerb (closed-vocab
305
+ // is non-negotiable per CONTEXT.md spec body 2026-04-29).
306
+ mod = safeRequire('./shape-f0-renderer.cjs');
307
+ fnName = 'renderShapeF0';
308
+ inputArgs = {
309
+ tier: tier,
310
+ header: callerHeader,
311
+ body: (typeof payloadObj.body === 'string' && payloadObj.body.length > 0) ? payloadObj.body : undefined,
312
+ parent_decision_id: (typeof payloadObj.parent_decision_id === 'string' && payloadObj.parent_decision_id.length > 0)
313
+ ? payloadObj.parent_decision_id : undefined,
314
+ };
315
+ } else if (requestedShape === 'F.1') {
316
+ mod = safeRequire('./shape-f1-renderer.cjs') || safeRequire('./shape-f1-fallback.cjs');
317
+ fnName = 'renderShapeF1';
318
+ inputArgs = { tier: tier, recommendedVerb: recommendedVerb, verbs: callerVerbs, header: callerHeader };
319
+ } else if (requestedShape === 'F.2') {
320
+ mod = safeRequire('./shape-f2-renderer.cjs');
321
+ fnName = 'renderShapeF2';
322
+ inputArgs = { tier: tier, recommendedVerb: recommendedVerb, verbs: callerVerbs, header: callerHeader };
323
+ } else if (requestedShape === 'F.3') {
324
+ mod = safeRequire('./shape-f3-renderer.cjs');
325
+ fnName = 'renderShapeF3';
326
+ inputArgs = { header: callerHeader };
327
+ } else if (requestedShape === 'F.4') {
328
+ mod = safeRequire('./shape-f4-renderer.cjs');
329
+ fnName = 'renderShapeF4';
330
+ inputArgs = { header: callerHeader };
331
+ } else if (requestedShape === 'F.5') {
332
+ mod = safeRequire('./shape-f5-renderer.cjs');
333
+ fnName = 'renderShapeF5';
334
+ inputArgs = { tier: tier, recommendedVerb: recommendedVerb, verbs: callerVerbs, header: callerHeader };
335
+ } else if (requestedShape === 'F.6') {
336
+ // Phase 88.2-06: F.6 Plan Review Round. Closed-vocab parent shape (3 verbs
337
+ // Confirm / Reject / Discuss, freeTextOffered:false; reject reason is captured
338
+ // via a downstream prompt and lands as a property on the REVIEWED edge).
339
+ // Routes to the collision-safe path lib/hmi/shape-f6-plan-review-renderer.cjs;
340
+ // the umbrella 'F' branch above continues to route to Phase 101-01's
341
+ // lib/hmi/shape-f6-renderer.cjs via JTBD logic (R1 invariant preserved).
342
+ mod = safeRequire('./shape-f6-plan-review-renderer.cjs');
343
+ fnName = 'renderShapeF6PlanReview';
344
+ inputArgs = {
345
+ tier: tier,
346
+ header: callerHeader,
347
+ position: (Number.isInteger(payloadObj.position) ? payloadObj.position : undefined),
348
+ totalQuestions: (Number.isInteger(payloadObj.totalQuestions) ? payloadObj.totalQuestions : undefined),
349
+ claim: (typeof payloadObj.claim === 'string' && payloadObj.claim.length > 0)
350
+ ? payloadObj.claim : undefined,
351
+ counts: (payloadObj.counts && typeof payloadObj.counts === 'object') ? payloadObj.counts : undefined,
352
+ round_id: (typeof payloadObj.round_id === 'string' && payloadObj.round_id.length > 0)
353
+ ? payloadObj.round_id : undefined,
354
+ personaContext: (typeof payloadObj.personaContext === 'string' && payloadObj.personaContext.length > 0)
355
+ ? payloadObj.personaContext : undefined,
356
+ };
357
+ }
358
+
359
+ if (!mod || typeof mod[fnName] !== 'function') {
360
+ return {
361
+ shape: 'error',
362
+ rendered: {
363
+ error: 'no-subshape-renderer',
364
+ detail: requestedShape + ' renderer module missing',
365
+ },
366
+ };
367
+ }
368
+
369
+ let result;
370
+ try {
371
+ result = mod[fnName](inputArgs);
372
+ } catch (e) {
373
+ return {
374
+ shape: 'error',
375
+ rendered: {
376
+ error: 'subshape-render-failed',
377
+ detail: requestedShape + ': ' + (e && e.message ? String(e.message).slice(0, 80) : 'unknown'),
378
+ },
379
+ };
380
+ }
381
+
382
+ if (!result || result.error) {
383
+ return {
384
+ shape: 'error',
385
+ rendered: result || { error: 'subshape-empty', detail: requestedShape },
386
+ };
387
+ }
388
+
389
+ return { shape: requestedShape, rendered: ensureFreeTextLast(result) };
390
+ }
391
+
392
+ function dispatchShapeG(args) {
393
+ const { tier, mode, payload } = args;
394
+ const g = safeRequire('./shape-g-renderer.cjs');
395
+ if (!g || typeof g.renderShapeG !== 'function') {
396
+ return { shape: 'error', rendered: { error: 'no-g-renderer' } };
397
+ }
398
+ const inputPayload = Object.assign({}, (payload && typeof payload === 'object') ? payload : {}, {
399
+ tier: tier,
400
+ mode: mode,
401
+ });
402
+ const result = g.renderShapeG(inputPayload);
403
+ if (result && result.fallthrough === true) {
404
+ return { shape: 'E', passthrough: true, fallthroughFrom: 'G', rendered: result };
405
+ }
406
+ return { shape: 'G', rendered: result };
407
+ }
408
+
409
+ function dispatchShapeH(args) {
410
+ const { tier, mode, payload } = args;
411
+ const h = safeRequire('./shape-h-renderer.cjs');
412
+ if (!h || typeof h.renderShapeH !== 'function') {
413
+ return { shape: 'error', rendered: { error: 'no-h-renderer' } };
414
+ }
415
+ const inputPayload = Object.assign({}, (payload && typeof payload === 'object') ? payload : {}, {
416
+ tier: tier,
417
+ mode: mode,
418
+ });
419
+ const result = h.renderShapeH(inputPayload);
420
+ if (result && result.error) {
421
+ return { shape: 'error', rendered: result };
422
+ }
423
+ return { shape: 'H', rendered: result };
424
+ }
425
+
426
+ /**
427
+ * Single entry point.
428
+ */
429
+ function pickShape(args) {
430
+ try {
431
+ const opts = (args && typeof args === 'object') ? args : {};
432
+ const requestedShape = typeof opts.requestedShape === 'string' ? opts.requestedShape : '';
433
+ const operator = (typeof opts.operator === 'string' && opts.operator.length > 0) ? opts.operator : null;
434
+ const tier = resolveTier(opts.tier);
435
+ const mode = modeFromTier(tier);
436
+
437
+ // Tier 0 refuse path (Canon Part 3 Rule 2). Applies BEFORE operator gates
438
+ // because tier 0 cannot host any selector regardless of operator.
439
+ if (tier === 0) {
440
+ return tier0Refuse();
441
+ }
442
+
443
+ // Phase 88.2-04: JUST_TALK operator refuses ALL Shape F.* surfaces. This
444
+ // mirrors render-v2 step 6 (lib/render/render-v2.cjs#244) which suppresses
445
+ // entire output when operator === JUST_TALK. The dispatcher refuses earlier
446
+ // (before invoking renderers) to avoid wasted CPU on a payload that will be
447
+ // dropped downstream.
448
+ const isShapeF = (requestedShape === F_UMBRELLA || F_SUBSHAPES.indexOf(requestedShape) !== -1);
449
+ if (isShapeF && operator === JUST_TALK) {
450
+ return justTalkRefuse(requestedShape);
451
+ }
452
+
453
+ let result;
454
+ if (requestedShape === F_UMBRELLA) {
455
+ result = dispatchShapeF({ roomDir: opts.roomDir, tier, mode, payload: opts.payload });
456
+ } else if (F_SUBSHAPES.indexOf(requestedShape) !== -1) {
457
+ result = dispatchShapeFSubShape(requestedShape, { tier, mode, payload: opts.payload });
458
+ } else if (requestedShape === 'G') {
459
+ result = dispatchShapeG({ tier, mode, payload: opts.payload });
460
+ } else if (requestedShape === 'H') {
461
+ result = dispatchShapeH({ tier, mode, payload: opts.payload });
462
+ } else if (
463
+ requestedShape === 'A' || requestedShape === 'B' ||
464
+ requestedShape === 'C' || requestedShape === 'D' ||
465
+ requestedShape === 'E'
466
+ ) {
467
+ return { shape: requestedShape, passthrough: true };
468
+ } else {
469
+ return {
470
+ shape: 'error',
471
+ rendered: { error: 'unknown-shape', detail: 'requestedShape: ' + JSON.stringify(requestedShape) },
472
+ };
473
+ }
474
+
475
+ // Mode B Zone 1 prefix (defense-in-depth at dispatcher).
476
+ if (mode === 'B' && result && result.rendered && result.shape !== 'error') {
477
+ applyModeBPrefix(result.rendered);
478
+ }
479
+
480
+ // Phase 88.2-04: AskUserQuestion structural-marker trailer + telemetry.
481
+ // Both apply ONLY to successful Shape F.* presentations (umbrella resolves
482
+ // to F.1/F.6; sub-shapes resolve to themselves). Error paths and G/H/A-E
483
+ // are NOT touched -- they preserve the existing 9-test contract byte-for-byte.
484
+ //
485
+ // Telemetry is opt-in via `payload.emitTelemetry === true`. This protects
486
+ // Canon Part 8 fs_scope (lib/render/render-v2.cjs invokes the dispatcher
487
+ // for Zone 4 enrichment -- that call is NOT a presentation event and must
488
+ // produce zero FS side-effects). The actual presentation surface (where a
489
+ // human navigator answers an AskUserQuestion prompt) sets the flag to true.
490
+ // The trailer is unconditionally attached: it is part of the rendered
491
+ // surface, not a side-effect.
492
+ if (result && result.shape !== 'error' && !result.passthrough) {
493
+ const isFShape = (typeof result.shape === 'string' && result.shape.indexOf('F') === 0);
494
+ if (isFShape) {
495
+ appendAskUserQuestionTrailer(result.rendered, result.shape);
496
+ const payloadObj = (opts.payload && typeof opts.payload === 'object') ? opts.payload : {};
497
+ if (payloadObj.emitTelemetry === true) {
498
+ emitPresentationTelemetry(opts.roomDir, result.shape, result.rendered, operator);
499
+ }
500
+ }
501
+ }
502
+
503
+ return result;
504
+ } catch (e) {
505
+ return {
506
+ shape: 'error',
507
+ rendered: {
508
+ error: 'dispatch-failed',
509
+ detail: (e && e.message ? String(e.message).slice(0, 80) : 'unknown'),
510
+ },
511
+ };
512
+ }
513
+ }
514
+
515
+ /**
516
+ * Phase 88.2-04: re-export of selector-telemetry.recordResponse so consumers
517
+ * wiring AskUserQuestion answers back to the local ledger have a single
518
+ * dispatcher-level entry point. Wrapped in try/catch -- never fails Larry's turn.
519
+ */
520
+ function recordSelectorResponse(roomDir, record) {
521
+ try {
522
+ const tel = safeRequire('./selector-telemetry.cjs');
523
+ if (!tel || typeof tel.recordResponse !== 'function') return;
524
+ tel.recordResponse(roomDir, record);
525
+ } catch (_e) {
526
+ // Graceful.
527
+ }
528
+ }
529
+
530
+ module.exports = {
531
+ pickShape: pickShape,
532
+ recordSelectorResponse: recordSelectorResponse,
533
+ _internal: {
534
+ resolveTier: resolveTier,
535
+ modeFromTier: modeFromTier,
536
+ ensureFreeTextLast: ensureFreeTextLast,
537
+ applyModeBPrefix: applyModeBPrefix,
538
+ appendAskUserQuestionTrailer: appendAskUserQuestionTrailer,
539
+ emitPresentationTelemetry: emitPresentationTelemetry,
540
+ justTalkRefuse: justTalkRefuse,
541
+ MODE_B_ZONE1_PREFIX: MODE_B_ZONE1_PREFIX,
542
+ F_SUBSHAPES: F_SUBSHAPES.slice(),
543
+ JUST_TALK: JUST_TALK,
544
+ COMPACTION_VIOLATION_CODE: COMPACTION_VIOLATION_CODE,
545
+ },
546
+ };