@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,477 @@
1
+ #!/usr/bin/env node
2
+ /*
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ * Licensed Work: MindrianOS Plugin
5
+ * Licensor: Mindrian Inc.
6
+ *
7
+ * Business Source License 1.1
8
+ * Change Date: 2029-04-23
9
+ * Change License: Apache 2.0
10
+ *
11
+ * Use of this file is subject to the terms of the BUSL-1.1 at LICENSE.
12
+ */
13
+
14
+ /*
15
+ * Plan 89-06: Obsidian Bridge Artifact Writer
16
+ *
17
+ * Pure rendering helpers for the reverse-salient bridge artifact pipeline.
18
+ * Converts `.rs-engine-results.json` pair records into Obsidian-native
19
+ * nested folder artifacts: bridge markdown with wikilinks, ROOM.md identity
20
+ * files, a dataview _index.md, and a De Stijl Cytoscape.js mind map.
21
+ *
22
+ * Design rules (see .planning/phases/89-reverse-salient-engine/89-06-PLAN.md):
23
+ * - No I/O. All functions are pure string builders. The caller writes.
24
+ * - Every bridge frontmatter cites BOTH Brain framework nodes
25
+ * (classical Hughes 1983 + algorithmic Medici/Hofstadter).
26
+ * - Every bridge body uses Obsidian [[wikilinks]] to both source artifacts.
27
+ * - Folder-name and file-name match per v1.9.7 nested rule.
28
+ * - Every folder gets ROOM.md per ICM Layer 0 rule (decision 15).
29
+ *
30
+ * The function set supports three rs-engine modes:
31
+ * Mode A (internal) - pairs carry source_artifact_id + source_section.
32
+ * Mode B (cross-room) - pairs carry source_room + source_artifact.
33
+ * Mode C (hybrid) - pairs carry room_artifact + external_doc objects.
34
+ *
35
+ * Field detection is schema-tolerant so this module works against the
36
+ * Plan 89-01 results format today and the Plan 89-04 / 89-05 formats later
37
+ * without a second edit pass.
38
+ */
39
+
40
+ const path = require('path');
41
+
42
+ // Phase 89.3 Plan 05 enhancement: Canon Part 8 defense-in-depth on
43
+ // the FINAL rendered bridge artifact string. The thesis + breakthrough
44
+ // frontmatter fields (when present) carry pair-derived strings that
45
+ // flow through to the rendered output. The audit catches any forbidden
46
+ // pattern that smuggles into the final bytes regardless of whether the
47
+ // caller scrubbed pair.thesis upstream. Defense-in-depth.
48
+ const { ExternalEgressViolation } = require('./rs-egress-violations.cjs');
49
+ const { auditQueryObject } = require('./rs-egress-prompts.cjs');
50
+ const SURFACE_BRIDGE = 'bridge-writer-enhanced';
51
+
52
+ /**
53
+ * Escape a string for safe inclusion inside double-quoted YAML scalars.
54
+ * Replaces backslashes and double-quotes only; sufficient for the limited
55
+ * inputs (thesis strings) we emit. Newlines are stripped to keep the
56
+ * frontmatter single-line per YAML 1.2 plain double-quoted style.
57
+ */
58
+ function escapeYaml(s) {
59
+ return String(s)
60
+ .replace(/\\/g, '\\\\')
61
+ .replace(/"/g, '\\"')
62
+ .replace(/\r?\n/g, ' ');
63
+ }
64
+
65
+ /**
66
+ * Slugify a pair of titles into a folder-safe identifier component.
67
+ * Lowercases, collapses non-alphanumeric to hyphens, trims, truncates each
68
+ * side to 30 chars so long artifact titles do not blow up filesystem limits.
69
+ */
70
+ function slugifyPair(sourceTitle, targetTitle) {
71
+ const pick = (s) =>
72
+ String(s || '')
73
+ .toLowerCase()
74
+ .replace(/[^a-z0-9]+/g, '-')
75
+ .replace(/^-|-$/g, '')
76
+ .slice(0, 30) || 'artifact';
77
+ return `${pick(sourceTitle)}-${pick(targetTitle)}`;
78
+ }
79
+
80
+ /**
81
+ * Extract canonical source/target identifiers from a pair record,
82
+ * tolerating internal/cross-room/hybrid schemas. Returns the label
83
+ * used for humans and the wikilink target used for Obsidian.
84
+ */
85
+ function resolvePairIdentity(pair) {
86
+ // Hybrid mode (Plan 89-05): room_artifact + external_doc
87
+ if (pair.room_artifact || pair.external_doc) {
88
+ const roomArtifact = pair.room_artifact || {};
89
+ const externalDoc = pair.external_doc || {};
90
+ const roomId = roomArtifact.room_id || roomArtifact.section || 'room';
91
+ const artifactId = roomArtifact.artifact_id || roomArtifact.id || 'artifact';
92
+ const externalId = externalDoc.external_id || externalDoc.id || 'external';
93
+ return {
94
+ isHybrid: true,
95
+ sourceLabel: roomArtifact.title || artifactId || 'Room Artifact',
96
+ targetLabel: externalDoc.title || externalId || 'External Doc',
97
+ sourceLink: `[[${roomId}/${artifactId}]]`,
98
+ targetLink: externalDoc.external_id
99
+ ? `[${externalDoc.title || externalId}](${externalDoc.external_id})`
100
+ : `[${externalDoc.title || externalId}]`,
101
+ sourceId: `${roomId}/${artifactId}`,
102
+ targetId: externalDoc.external_id || externalId,
103
+ sourceRoom: roomId,
104
+ targetRoom: externalDoc.source || '',
105
+ externalSource: externalDoc.source || '',
106
+ externalId,
107
+ };
108
+ }
109
+
110
+ // Cross-room mode (Plan 89-04): source_room + source_artifact
111
+ // Mode A internal (Plan 89-01): source_artifact_id (section/slug) + source_title
112
+ const sourceRoom =
113
+ pair.source_room ||
114
+ pair.source_section ||
115
+ (typeof pair.source_artifact_id === 'string' && pair.source_artifact_id.includes('/')
116
+ ? pair.source_artifact_id.split('/')[0]
117
+ : '');
118
+ const targetRoom =
119
+ pair.target_room ||
120
+ pair.target_section ||
121
+ (typeof pair.target_artifact_id === 'string' && pair.target_artifact_id.includes('/')
122
+ ? pair.target_artifact_id.split('/')[0]
123
+ : '');
124
+
125
+ const sourceArtifact =
126
+ pair.source_artifact ||
127
+ (typeof pair.source_artifact_id === 'string' && pair.source_artifact_id.includes('/')
128
+ ? pair.source_artifact_id.split('/').slice(1).join('/')
129
+ : pair.source_artifact_id) ||
130
+ 'artifact-a';
131
+ const targetArtifact =
132
+ pair.target_artifact ||
133
+ (typeof pair.target_artifact_id === 'string' && pair.target_artifact_id.includes('/')
134
+ ? pair.target_artifact_id.split('/').slice(1).join('/')
135
+ : pair.target_artifact_id) ||
136
+ 'artifact-b';
137
+
138
+ const sourceLabel = pair.source_title || sourceArtifact;
139
+ const targetLabel = pair.target_title || targetArtifact;
140
+
141
+ return {
142
+ isHybrid: false,
143
+ sourceLabel,
144
+ targetLabel,
145
+ sourceLink: `[[${sourceRoom || 'room'}/${sourceArtifact}]]`,
146
+ targetLink: `[[${targetRoom || 'room'}/${targetArtifact}]]`,
147
+ sourceId: sourceRoom ? `${sourceRoom}/${sourceArtifact}` : sourceArtifact,
148
+ targetId: targetRoom ? `${targetRoom}/${targetArtifact}` : targetArtifact,
149
+ sourceRoom: sourceRoom || '',
150
+ targetRoom: targetRoom || '',
151
+ externalSource: '',
152
+ externalId: '',
153
+ };
154
+ }
155
+
156
+ /**
157
+ * Render a single bridge artifact markdown string with dual Brain
158
+ * framework citation and Obsidian wikilinks to both sources.
159
+ */
160
+ function renderBridgeArtifact(pair, bridgeId, metadata) {
161
+ const identity = resolvePairIdentity(pair);
162
+ const lsa = typeof pair.lsa_score === 'number' ? pair.lsa_score : 0;
163
+ const sem = typeof pair.semantic_score === 'number' ? pair.semantic_score : 0;
164
+ const signedDiff =
165
+ typeof pair.signed_diff === 'number' ? pair.signed_diff : sem - lsa;
166
+ const absDiff =
167
+ typeof pair.abs_diff === 'number' ? pair.abs_diff : Math.abs(signedDiff);
168
+ const direction = pair.direction || 'structural_transfer';
169
+
170
+ const interpretation =
171
+ direction === 'structural_transfer'
172
+ ? 'Means similar things, uses different topic vocabulary. Cross-domain analogy opportunity.'
173
+ : 'Uses same topic vocabulary, means different things. Method exists in one domain, applies to the other.';
174
+
175
+ const directionLabel =
176
+ direction === 'structural_transfer'
177
+ ? 'Structural Transfer (A then B)'
178
+ : 'Semantic Implementation (B from A)';
179
+
180
+ const meta = metadata || {};
181
+ const mode = meta.mode || (meta.metadata && meta.metadata.mode) || 'internal';
182
+ const thesisEnabled = meta.thesis_enabled === true;
183
+
184
+ const thesisBody = thesisEnabled
185
+ ? pair.innovation_thesis || '(Thesis generation pending)'
186
+ : '_Run without `--no-thesis` to generate innovation thesis._';
187
+
188
+ const generatedAt = new Date().toISOString();
189
+
190
+ // Phase 89.3 Plan 05 enhancement: 2 OPTIONAL frontmatter fields.
191
+ // BACKWARD-COMPAT: when pair.thesis OR pair.breakthrough is missing,
192
+ // omit the corresponding YAML key entirely so v1.10.16-vintage inputs
193
+ // render BYTE-IDENTICAL pre-89.3 frontmatter (regression-tested).
194
+ const hasThesis = typeof pair.thesis === 'string' && pair.thesis.length > 0;
195
+ const hasBreakthrough =
196
+ pair.breakthrough &&
197
+ typeof pair.breakthrough === 'object' &&
198
+ typeof pair.breakthrough.score === 'number';
199
+ let optionalFrontmatter = '';
200
+ if (hasThesis) {
201
+ optionalFrontmatter += `\nthesis: "${escapeYaml(pair.thesis)}"`;
202
+ }
203
+ if (hasBreakthrough) {
204
+ optionalFrontmatter += `\nbreakthrough_score: ${pair.breakthrough.score.toFixed(2)}`;
205
+ }
206
+
207
+ const out = `---
208
+ brain_framework_classical: "framework:reverse-salient-analysis"
209
+ brain_framework_algorithmic: "framework:algorithmic-generation-of-reverse-salient-solutions"
210
+ brain_chain_next: ["framework:cross-domain-innovation", "framework:medici-effect"]
211
+ brain_node_version: "2026-Q2"
212
+ bridge_id: "${bridgeId}"
213
+ mode: "${mode}"
214
+ lsa_score: ${lsa.toFixed(4)}
215
+ semantic_score: ${sem.toFixed(4)}
216
+ signed_diff: ${signedDiff.toFixed(4)}
217
+ abs_diff: ${absDiff.toFixed(4)}
218
+ direction: "${direction}"
219
+ source_room: "${identity.sourceRoom}"
220
+ target_room: "${identity.targetRoom}"
221
+ external_source: "${identity.externalSource}"
222
+ external_id: "${identity.externalId}"
223
+ generated_at: "${generatedAt}"${optionalFrontmatter}
224
+ ---
225
+
226
+ # Bridge ${bridgeId}: ${identity.sourceLabel} x ${identity.targetLabel}
227
+
228
+ **Structural similarity (LSA):** ${lsa.toFixed(3)}
229
+ **Semantic similarity (BERT):** ${sem.toFixed(3)}
230
+ **Differential (|sem - lsa|):** ${absDiff.toFixed(3)}
231
+ **Direction:** ${directionLabel}
232
+
233
+ ## Sources
234
+
235
+ - **Source A:** ${identity.sourceLink}
236
+ - **Source B:** ${identity.targetLink}
237
+
238
+ ## Interpretation
239
+
240
+ ${interpretation}
241
+
242
+ ## Innovation Thesis
243
+
244
+ <!-- Generated when --no-thesis is OFF; stub when ON -->
245
+ ${thesisBody}
246
+
247
+ ## Brain Framework Citation
248
+
249
+ This bridge is classified under [[framework:reverse-salient-analysis]] (Hughes 1983, Networks of Power) with chain-forward to [[framework:cross-domain-innovation]] (Medici Effect / Hofstadter Surfaces and Essences).
250
+
251
+ The algorithmic generation is classified under [[framework:algorithmic-generation-of-reverse-salient-solutions]].
252
+
253
+ Case studies for context: Marconi, Naval Aviation (see Workshop 3 curriculum).
254
+ `;
255
+
256
+ // Canon Part 8 defense-in-depth: scan the FINAL rendered string for
257
+ // any FORBIDDEN_PATTERNS leak that smuggled through pair.thesis OR
258
+ // any other surface field. auditQueryObject walks JSON.stringify of
259
+ // the wrapper object; throws ExternalEgressViolation with
260
+ // meta.surface = 'bridge-writer-enhanced' on hit. The thrown error
261
+ // never leaves a partially-rendered artifact behind because we throw
262
+ // BEFORE returning.
263
+ auditQueryObject({ rendered: out }, SURFACE_BRIDGE);
264
+ return out;
265
+ }
266
+
267
+ /**
268
+ * Render ROOM.md identity file for a single bridge folder.
269
+ * Honors ICM Layer 0 rule (decision 15): every folder has ROOM.md.
270
+ */
271
+ function renderRoomMd(bridgeId, sourceLabel, targetLabel) {
272
+ return `---
273
+ room_type: bridge-artifact
274
+ room_id: ${bridgeId}
275
+ icm_layer: 4
276
+ ---
277
+
278
+ # ${bridgeId}
279
+
280
+ This folder contains a reverse-salient bridge artifact connecting ${sourceLabel} with ${targetLabel}.
281
+
282
+ ## Contents
283
+ - \`${bridgeId}.md\` - main bridge artifact with wikilinks and thesis
284
+ - Attachments as needed (images, data extracts)
285
+
286
+ ## Identity
287
+ Per ICM Layer 0 rule (decision 15): this directory is a bridge artifact subsystem with its own ROOM.md.
288
+ `;
289
+ }
290
+
291
+ /**
292
+ * Render the _index.md dataview query that renders a table of all bridges.
293
+ */
294
+ function renderIndex(bridges) {
295
+ return `---
296
+ room_type: bridge-index
297
+ icm_layer: 4
298
+ ---
299
+
300
+ # Cross-Room Bridges Index
301
+
302
+ \`\`\`dataview
303
+ TABLE direction, abs_diff AS "Differential", lsa_score AS "LSA", semantic_score AS "BERT", source_room, target_room
304
+ FROM "opportunity-bank/cross-room-bridges"
305
+ WHERE abs_diff > 0.3
306
+ SORT abs_diff DESC
307
+ \`\`\`
308
+
309
+ ## Total bridges: ${bridges.length}
310
+ `;
311
+ }
312
+
313
+ /**
314
+ * Render the top-level ROOM.md for the cross-room-bridges section.
315
+ */
316
+ function renderSectionRoomMd(metadata) {
317
+ const mode = (metadata && metadata.mode) || 'internal';
318
+ return `---
319
+ room_type: cross-room-bridges
320
+ icm_layer: 4
321
+ ---
322
+
323
+ # Cross-Room Bridges
324
+
325
+ Generated by rs-engine.py (${mode} mode).
326
+
327
+ Every bridge in this section is a reverse-salient innovation pair. Structural
328
+ similarity (LSA) and semantic similarity (BERT) differ enough to suggest a
329
+ cross-domain transfer or a latent method-domain mismatch. See Hughes 1983
330
+ Networks of Power and the Medici Effect for theoretical grounding.
331
+ `;
332
+ }
333
+
334
+ /**
335
+ * Render the De Stijl Cytoscape.js mind map HTML for all bridge pairs.
336
+ * Standalone HTML (Cytoscape.js via CDN); no build step.
337
+ * Per-edge direction drives edge color (red structural, yellow semantic).
338
+ */
339
+ function renderMindMap(pairs) {
340
+ const nodes = new Map();
341
+ const edges = [];
342
+
343
+ pairs.forEach((pair, idx) => {
344
+ const bridgeId = `bridge-${String(idx + 1).padStart(3, '0')}`;
345
+ const identity = resolvePairIdentity(pair);
346
+ const sourceId = identity.sourceId || `source-${idx}`;
347
+ const targetId = identity.targetId || `target-${idx}`;
348
+
349
+ if (!nodes.has(sourceId)) {
350
+ nodes.set(sourceId, {
351
+ data: { id: sourceId, label: identity.sourceLabel || sourceId, type: 'artifact' },
352
+ });
353
+ }
354
+ if (!nodes.has(targetId)) {
355
+ nodes.set(targetId, {
356
+ data: { id: targetId, label: identity.targetLabel || targetId, type: 'artifact' },
357
+ });
358
+ }
359
+ const absDiff = typeof pair.abs_diff === 'number' ? pair.abs_diff : 0;
360
+ edges.push({
361
+ data: {
362
+ id: bridgeId,
363
+ source: sourceId,
364
+ target: targetId,
365
+ label: `${pair.direction || 'bridge'} (D${absDiff.toFixed(2)})`,
366
+ abs_diff: absDiff,
367
+ direction: pair.direction || 'unknown',
368
+ },
369
+ });
370
+ });
371
+
372
+ const elements = JSON.stringify([...nodes.values(), ...edges]);
373
+
374
+ return `<!DOCTYPE html>
375
+ <html lang="en">
376
+ <head>
377
+ <meta charset="UTF-8">
378
+ <title>Reverse Salient Bridge Mind Map</title>
379
+ <script src="https://unpkg.com/cytoscape@3.28.1/dist/cytoscape.min.js"></script>
380
+ <style>
381
+ :root {
382
+ --red: #A63D2F;
383
+ --blue: #1E3A6E;
384
+ --yellow: #C8A43C;
385
+ --teal: #2A6B5E;
386
+ --cream: #F5F0E8;
387
+ --dark: #1a1a1a;
388
+ }
389
+ * { margin: 0; padding: 0; box-sizing: border-box; }
390
+ body { background: var(--dark); font-family: 'Courier New', monospace; color: var(--cream); }
391
+ header {
392
+ padding: 16px 24px;
393
+ border-bottom: 3px solid var(--red);
394
+ display: flex; align-items: center; gap: 16px;
395
+ }
396
+ header h1 { font-size: 1.1rem; letter-spacing: 0.12em; color: var(--yellow); }
397
+ header span { font-size: 0.75rem; color: var(--teal); }
398
+ #cy { width: 100vw; height: calc(100vh - 56px); }
399
+ </style>
400
+ </head>
401
+ <body>
402
+ <header>
403
+ <h1>REVERSE SALIENT BRIDGE MAP</h1>
404
+ <span>Brain: framework:reverse-salient-analysis + framework:algorithmic-generation-of-reverse-salient-solutions</span>
405
+ </header>
406
+ <div id="cy"></div>
407
+ <script>
408
+ const elements = ${elements};
409
+ const cy = cytoscape({
410
+ container: document.getElementById('cy'),
411
+ elements: elements,
412
+ style: [
413
+ {
414
+ selector: 'node[type="artifact"]',
415
+ style: {
416
+ 'background-color': '#1E3A6E',
417
+ 'label': 'data(label)',
418
+ 'color': '#F5F0E8',
419
+ 'font-size': '10px',
420
+ 'text-wrap': 'wrap',
421
+ 'text-max-width': '100px',
422
+ 'border-width': 2,
423
+ 'border-color': '#2A6B5E',
424
+ 'width': 40,
425
+ 'height': 40
426
+ }
427
+ },
428
+ {
429
+ selector: 'edge[direction="structural_transfer"]',
430
+ style: {
431
+ 'line-color': '#A63D2F',
432
+ 'target-arrow-color': '#A63D2F',
433
+ 'target-arrow-shape': 'triangle',
434
+ 'label': 'data(label)',
435
+ 'font-size': '8px',
436
+ 'color': '#C8A43C',
437
+ 'curve-style': 'bezier'
438
+ }
439
+ },
440
+ {
441
+ selector: 'edge[direction="semantic_implementation"]',
442
+ style: {
443
+ 'line-color': '#C8A43C',
444
+ 'target-arrow-color': '#C8A43C',
445
+ 'target-arrow-shape': 'triangle',
446
+ 'label': 'data(label)',
447
+ 'font-size': '8px',
448
+ 'color': '#F5F0E8',
449
+ 'curve-style': 'bezier'
450
+ }
451
+ },
452
+ {
453
+ selector: 'edge',
454
+ style: {
455
+ 'line-color': '#2A6B5E',
456
+ 'target-arrow-color': '#2A6B5E',
457
+ 'target-arrow-shape': 'triangle',
458
+ 'curve-style': 'bezier'
459
+ }
460
+ }
461
+ ],
462
+ layout: { name: 'cose', padding: 40, animate: false }
463
+ });
464
+ </script>
465
+ </body>
466
+ </html>`;
467
+ }
468
+
469
+ module.exports = {
470
+ slugifyPair,
471
+ resolvePairIdentity,
472
+ renderBridgeArtifact,
473
+ renderRoomMd,
474
+ renderIndex,
475
+ renderSectionRoomMd,
476
+ renderMindMap,
477
+ };