@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,1841 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <meta name="generator" content="MindrianOS -- AI Innovation Co-Founder">
7
+ <title>MindrianOS Platform</title>
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&family=JetBrains+Mono:wght@400;500;600&family=Playfair+Display:wght@400;600;700;800&family=Source+Serif+4:wght@400;500;600&display=swap" rel="stylesheet">
11
+ <style>
12
+ /* ============================================
13
+ DE STIJL DESIGN SYSTEM
14
+ Ported from export-template.html
15
+ The REAL MindrianOS visual identity
16
+ ============================================ */
17
+ :root {
18
+ /* --- Mondrian Palette --- */
19
+ --mondrian-red: #C23B22;
20
+ --mondrian-blue: #1B3B6F;
21
+ --mondrian-yellow: #E8B931;
22
+ --mondrian-black: #1A1A1A;
23
+ --mondrian-white: #F7F3ED;
24
+ --mondrian-gray: #D4CFC7;
25
+ --accent-green: #2D6B4A;
26
+ --accent-sienna: #B5602A;
27
+
28
+ /* --- Grid Borders --- */
29
+ --grid-border: 5px solid var(--mondrian-black);
30
+ --grid-border-thin: 3px solid var(--mondrian-black);
31
+
32
+ /* --- Semantic Colors (De Stijl adapted) --- */
33
+ --color-success: #2D6B4A;
34
+ --color-danger: #C23B22;
35
+ --color-warning: #E8B931;
36
+ --color-info: #1B3B6F;
37
+
38
+ /* --- Typography --- */
39
+ --font-headline: "Playfair Display", Georgia, serif;
40
+ --font-body: "Source Serif 4", Georgia, serif;
41
+ --font-ui: "DM Sans", sans-serif;
42
+ --font-mono: "JetBrains Mono", monospace;
43
+
44
+ /* --- Spacing --- */
45
+ --s1: 4px;
46
+ --s2: 8px;
47
+ --s3: 12px;
48
+ --s4: 16px;
49
+ --s5: 24px;
50
+ --s6: 32px;
51
+ --s7: 40px;
52
+ --s8: 48px;
53
+
54
+ /* --- Animation --- */
55
+ --transition-fast: 150ms ease-out;
56
+ --transition-base: 200ms ease-out;
57
+ --transition-slow: 300ms ease;
58
+
59
+ /* --- Focus --- */
60
+ --focus-ring: 3px solid var(--mondrian-yellow);
61
+ --focus-offset: -3px;
62
+
63
+ /* --- Touch Target --- */
64
+ --touch-min: 44px;
65
+
66
+ /* --- Bullet Chart Zones --- */
67
+ --zone-danger: #F0DDD9;
68
+ --zone-warning: #F5EDD4;
69
+ --zone-good: #D9EAE0;
70
+ }
71
+
72
+ /* --- Reduced Motion --- */
73
+ @media (prefers-reduced-motion: reduce) {
74
+ *, *::before, *::after {
75
+ animation-duration: 0.01ms !important;
76
+ animation-iteration-count: 1 !important;
77
+ transition-duration: 0.01ms !important;
78
+ scroll-behavior: auto !important;
79
+ }
80
+ }
81
+
82
+ /* ============================================
83
+ RESET & BASE
84
+ ============================================ */
85
+ *, *::before, *::after {
86
+ margin: 0;
87
+ padding: 0;
88
+ box-sizing: border-box;
89
+ }
90
+
91
+ html {
92
+ font-size: 16px;
93
+ -webkit-font-smoothing: antialiased;
94
+ -moz-osx-font-smoothing: grayscale;
95
+ overflow-x: hidden;
96
+ }
97
+
98
+ body {
99
+ font-family: var(--font-body);
100
+ background: var(--mondrian-black);
101
+ color: var(--mondrian-black);
102
+ min-height: 100vh;
103
+ overflow-x: hidden;
104
+ }
105
+
106
+ /* --- Focus Visible --- */
107
+ *:focus-visible {
108
+ outline: var(--focus-ring);
109
+ outline-offset: var(--focus-offset);
110
+ z-index: 11;
111
+ }
112
+
113
+ /* ============================================
114
+ PLATFORM SHELL
115
+ ============================================ */
116
+ .platform {
117
+ display: grid;
118
+ grid-template-rows: auto 1fr auto;
119
+ min-height: 100vh;
120
+ background: var(--mondrian-black);
121
+ }
122
+
123
+ /* ============================================
124
+ TOPBAR -- Black background, logo blocks, editorial
125
+ Matches export-template.html exactly
126
+ ============================================ */
127
+ .topbar {
128
+ height: 56px;
129
+ background: var(--mondrian-black);
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: space-between;
133
+ padding: 0 24px;
134
+ border-bottom: var(--grid-border);
135
+ position: sticky;
136
+ top: 0;
137
+ z-index: 1000;
138
+ }
139
+
140
+ .topbar-left {
141
+ display: flex;
142
+ align-items: center;
143
+ gap: 16px;
144
+ flex-shrink: 0;
145
+ }
146
+
147
+ .topbar-logo {
148
+ display: flex;
149
+ align-items: center;
150
+ gap: 4px;
151
+ }
152
+
153
+ .topbar-logo-block {
154
+ width: 8px;
155
+ height: 24px;
156
+ }
157
+ .topbar-logo-block.r { background: var(--mondrian-red); }
158
+ .topbar-logo-block.b { background: var(--mondrian-blue); }
159
+ .topbar-logo-block.y { background: var(--mondrian-yellow); }
160
+
161
+ .topbar-title {
162
+ font-family: var(--font-ui);
163
+ font-weight: 700;
164
+ font-size: 13px;
165
+ letter-spacing: 0.2em;
166
+ text-transform: uppercase;
167
+ color: var(--mondrian-white);
168
+ }
169
+
170
+ .topbar-badge {
171
+ font-family: var(--font-ui);
172
+ font-weight: 700;
173
+ font-size: 11px;
174
+ letter-spacing: 0.15em;
175
+ text-transform: uppercase;
176
+ color: var(--mondrian-black);
177
+ background: var(--mondrian-yellow);
178
+ padding: 4px 14px;
179
+ display: inline-block;
180
+ }
181
+
182
+ /* --- Tab Navigation --- */
183
+ .topbar-nav {
184
+ display: flex;
185
+ gap: 0;
186
+ }
187
+
188
+ .topbar-nav button {
189
+ font-family: var(--font-ui);
190
+ font-weight: 500;
191
+ font-size: 11px;
192
+ letter-spacing: 0.12em;
193
+ text-transform: uppercase;
194
+ color: var(--mondrian-gray);
195
+ background: transparent;
196
+ border: none;
197
+ padding: 8px 18px;
198
+ min-height: var(--touch-min);
199
+ min-width: var(--touch-min);
200
+ cursor: pointer;
201
+ transition: color 0.2s ease, background 0.2s ease;
202
+ position: relative;
203
+ display: flex;
204
+ align-items: center;
205
+ gap: 8px;
206
+ }
207
+
208
+ .topbar-nav button:hover {
209
+ color: var(--mondrian-white);
210
+ }
211
+
212
+ .topbar-nav button.active {
213
+ color: var(--mondrian-white);
214
+ background: rgba(255,255,255,0.08);
215
+ }
216
+
217
+ .topbar-nav button.active::after {
218
+ content: '';
219
+ position: absolute;
220
+ bottom: 0;
221
+ left: 50%;
222
+ transform: translateX(-50%);
223
+ width: 24px;
224
+ height: 3px;
225
+ background: var(--mondrian-yellow);
226
+ }
227
+
228
+ .topbar-nav button svg {
229
+ width: 14px;
230
+ height: 14px;
231
+ flex-shrink: 0;
232
+ }
233
+
234
+ /* ============================================
235
+ CONTENT AREA
236
+ ============================================ */
237
+ .content {
238
+ overflow-y: auto;
239
+ min-height: 0;
240
+ background: var(--mondrian-black);
241
+ }
242
+
243
+ /* --- View Transitions --- */
244
+ .view {
245
+ opacity: 1;
246
+ transition: opacity var(--transition-fast);
247
+ }
248
+ .view[aria-hidden="true"] {
249
+ display: none;
250
+ }
251
+
252
+ /* ============================================
253
+ VIEW 1: MULLINS ASSESSMENT (Home)
254
+ Three Mondrian columns with colored backgrounds
255
+ ============================================ */
256
+ .mullins {
257
+ display: grid;
258
+ grid-template-columns: 1fr 1fr 1fr;
259
+ gap: 5px;
260
+ background: var(--mondrian-black);
261
+ padding: 5px;
262
+ min-height: calc(100vh - 56px - 36px - 80px);
263
+ }
264
+
265
+ .mullins-column {
266
+ padding: 28px 24px;
267
+ display: flex;
268
+ flex-direction: column;
269
+ gap: var(--s4);
270
+ position: relative;
271
+ }
272
+ .mullins-column.real {
273
+ background: var(--mondrian-blue);
274
+ color: var(--mondrian-white);
275
+ }
276
+ .mullins-column.win {
277
+ background: var(--mondrian-yellow);
278
+ color: var(--mondrian-black);
279
+ }
280
+ .mullins-column.worth {
281
+ background: var(--mondrian-red);
282
+ color: var(--mondrian-white);
283
+ }
284
+
285
+ .mullins-header {
286
+ font-family: var(--font-headline);
287
+ font-weight: 700;
288
+ font-size: 24px;
289
+ line-height: 1.2;
290
+ padding-bottom: var(--s3);
291
+ border-bottom: 2px solid rgba(255,255,255,0.2);
292
+ }
293
+ .mullins-column.win .mullins-header {
294
+ border-bottom-color: rgba(0,0,0,0.15);
295
+ }
296
+
297
+ /* --- Mullins Cell (evidence meter) --- */
298
+ .mullins-cell {
299
+ padding: var(--s4);
300
+ background: rgba(255,255,255,0.08);
301
+ cursor: pointer;
302
+ transition: transform var(--transition-slow), box-shadow var(--transition-slow);
303
+ min-height: var(--touch-min);
304
+ display: flex;
305
+ flex-direction: column;
306
+ gap: var(--s2);
307
+ }
308
+ .mullins-column.win .mullins-cell {
309
+ background: rgba(0,0,0,0.06);
310
+ }
311
+ .mullins-cell:hover {
312
+ transform: scale(1.02);
313
+ box-shadow: 0 4px 20px rgba(0,0,0,0.3);
314
+ z-index: 10;
315
+ }
316
+
317
+ .cell-question {
318
+ font-family: var(--font-body);
319
+ font-size: 14px;
320
+ font-weight: 500;
321
+ line-height: 1.3;
322
+ }
323
+
324
+ /* --- Bullet Chart --- */
325
+ .bullet-chart {
326
+ position: relative;
327
+ height: 20px;
328
+ overflow: hidden;
329
+ }
330
+ .mullins-column.real .bullet-chart,
331
+ .mullins-column.worth .bullet-chart {
332
+ background: rgba(255,255,255,0.1);
333
+ }
334
+ .mullins-column.win .bullet-chart {
335
+ background: rgba(0,0,0,0.08);
336
+ }
337
+
338
+ /* Qualitative zones */
339
+ .bullet-zone {
340
+ position: absolute;
341
+ top: 0;
342
+ height: 100%;
343
+ }
344
+ .bullet-zone.danger {
345
+ left: 0;
346
+ width: 33.33%;
347
+ background: rgba(194,59,34,0.25);
348
+ }
349
+ .bullet-zone.ok {
350
+ left: 33.33%;
351
+ width: 33.33%;
352
+ background: rgba(232,185,49,0.2);
353
+ }
354
+ .bullet-zone.good {
355
+ left: 66.66%;
356
+ width: 33.34%;
357
+ background: rgba(45,107,74,0.25);
358
+ }
359
+ .mullins-column.win .bullet-zone.danger { background: rgba(194,59,34,0.2); }
360
+ .mullins-column.win .bullet-zone.ok { background: rgba(181,96,42,0.15); }
361
+ .mullins-column.win .bullet-zone.good { background: rgba(45,107,74,0.2); }
362
+
363
+ /* Current value bar */
364
+ .bullet-bar {
365
+ position: absolute;
366
+ top: 5px;
367
+ left: 0;
368
+ height: 10px;
369
+ transition: width var(--transition-slow);
370
+ z-index: 2;
371
+ }
372
+ .bullet-bar.high { background: var(--accent-green); }
373
+ .bullet-bar.mid { background: var(--accent-sienna); }
374
+ .bullet-bar.low { background: var(--mondrian-red); }
375
+ .bullet-bar.none { background: var(--mondrian-gray); width: 0 !important; }
376
+ .mullins-column.win .bullet-bar.high { background: var(--accent-green); }
377
+ .mullins-column.win .bullet-bar.mid { background: var(--accent-sienna); }
378
+ .mullins-column.win .bullet-bar.low { background: var(--mondrian-red); }
379
+
380
+ /* Target marker */
381
+ .bullet-target {
382
+ position: absolute;
383
+ top: 2px;
384
+ height: 16px;
385
+ width: 2px;
386
+ z-index: 3;
387
+ }
388
+ .mullins-column.real .bullet-target,
389
+ .mullins-column.worth .bullet-target {
390
+ background: var(--mondrian-white);
391
+ }
392
+ .mullins-column.win .bullet-target {
393
+ background: var(--mondrian-black);
394
+ }
395
+
396
+ .cell-meta {
397
+ display: flex;
398
+ justify-content: space-between;
399
+ align-items: center;
400
+ }
401
+
402
+ .cell-score {
403
+ font-family: var(--font-mono);
404
+ font-size: 11px;
405
+ font-weight: 500;
406
+ opacity: 0.8;
407
+ }
408
+
409
+ .cell-artifacts {
410
+ font-family: var(--font-mono);
411
+ font-size: 10px;
412
+ opacity: 0.7;
413
+ display: flex;
414
+ align-items: center;
415
+ gap: var(--s1);
416
+ }
417
+ .cell-artifacts svg {
418
+ width: 10px;
419
+ height: 10px;
420
+ opacity: 0.6;
421
+ }
422
+
423
+ /* --- Column Footer --- */
424
+ .mullins-footer {
425
+ margin-top: auto;
426
+ padding-top: var(--s3);
427
+ border-top: 2px solid rgba(255,255,255,0.15);
428
+ display: flex;
429
+ justify-content: space-between;
430
+ font-family: var(--font-mono);
431
+ font-size: 11px;
432
+ letter-spacing: 0.05em;
433
+ }
434
+ .mullins-column.win .mullins-footer {
435
+ border-top-color: rgba(0,0,0,0.12);
436
+ }
437
+ .mullins-footer .gap-count {
438
+ opacity: 0.9;
439
+ }
440
+ .mullins-footer .evidence-count {
441
+ opacity: 0.75;
442
+ }
443
+
444
+ /* --- Brain Suggestion Strip --- */
445
+ .brain-suggestion {
446
+ display: flex;
447
+ align-items: center;
448
+ justify-content: space-between;
449
+ gap: var(--s5);
450
+ padding: var(--s5);
451
+ background: var(--mondrian-black);
452
+ margin: 0 5px 5px 5px;
453
+ min-height: 64px;
454
+ }
455
+
456
+ .suggestion-content {
457
+ display: flex;
458
+ align-items: center;
459
+ gap: var(--s4);
460
+ flex: 1;
461
+ min-width: 0;
462
+ }
463
+
464
+ .suggestion-icon {
465
+ width: 36px;
466
+ height: 36px;
467
+ flex-shrink: 0;
468
+ display: flex;
469
+ align-items: center;
470
+ justify-content: center;
471
+ background: rgba(232,185,49,0.12);
472
+ border: 1px solid rgba(232,185,49,0.3);
473
+ }
474
+ .suggestion-icon svg {
475
+ width: 18px;
476
+ height: 18px;
477
+ color: var(--mondrian-yellow);
478
+ }
479
+
480
+ .suggestion-text {
481
+ font-family: var(--font-body);
482
+ font-size: 14px;
483
+ color: var(--mondrian-white);
484
+ line-height: 1.5;
485
+ opacity: 0.85;
486
+ }
487
+ .suggestion-framework {
488
+ font-family: var(--font-mono);
489
+ font-weight: 500;
490
+ color: var(--mondrian-yellow);
491
+ }
492
+ .suggestion-area {
493
+ font-family: var(--font-mono);
494
+ font-weight: 500;
495
+ color: var(--mondrian-red);
496
+ }
497
+
498
+ .btn-run {
499
+ font-family: var(--font-mono);
500
+ font-size: 11px;
501
+ font-weight: 600;
502
+ letter-spacing: 0.1em;
503
+ text-transform: uppercase;
504
+ padding: 0 var(--s5);
505
+ min-height: var(--touch-min);
506
+ min-width: 100px;
507
+ background: var(--mondrian-yellow);
508
+ color: var(--mondrian-black);
509
+ border: none;
510
+ cursor: pointer;
511
+ transition: background var(--transition-fast), transform 0.15s ease;
512
+ flex-shrink: 0;
513
+ }
514
+ .btn-run:hover {
515
+ background: #D4A82A;
516
+ transform: translateY(-1px);
517
+ }
518
+ .btn-run:active {
519
+ transform: scale(0.97);
520
+ }
521
+
522
+ /* ============================================
523
+ VIEW 2: ROOM (Command Center)
524
+ ============================================ */
525
+
526
+ /* --- Cascade Alerts --- */
527
+ .cascade-alerts {
528
+ display: flex;
529
+ flex-direction: column;
530
+ gap: 5px;
531
+ padding: 5px;
532
+ background: var(--mondrian-black);
533
+ }
534
+
535
+ .alert-card {
536
+ display: flex;
537
+ align-items: center;
538
+ gap: var(--s5);
539
+ padding: var(--s4) var(--s5);
540
+ background: var(--mondrian-white);
541
+ border-left: 5px solid;
542
+ min-height: var(--s8);
543
+ }
544
+ .alert-card.contradiction { border-left-color: var(--mondrian-red); }
545
+ .alert-card.convergence { border-left-color: var(--mondrian-blue); }
546
+ .alert-card.invalidation { border-left-color: var(--mondrian-yellow); }
547
+
548
+ .alert-type-badge {
549
+ font-family: var(--font-ui);
550
+ font-size: 10px;
551
+ font-weight: 700;
552
+ text-transform: uppercase;
553
+ letter-spacing: 0.14em;
554
+ color: var(--mondrian-black);
555
+ flex-shrink: 0;
556
+ width: 110px;
557
+ opacity: 0.6;
558
+ }
559
+
560
+ .alert-text {
561
+ font-family: var(--font-body);
562
+ font-size: 13px;
563
+ color: var(--mondrian-black);
564
+ flex: 1;
565
+ line-height: 1.5;
566
+ }
567
+
568
+ .alert-actions {
569
+ display: flex;
570
+ gap: var(--s2);
571
+ flex-shrink: 0;
572
+ }
573
+
574
+ .btn {
575
+ font-family: var(--font-mono);
576
+ font-size: 10px;
577
+ font-weight: 600;
578
+ letter-spacing: 0.06em;
579
+ text-transform: uppercase;
580
+ padding: 0 var(--s3);
581
+ min-height: var(--touch-min);
582
+ min-width: var(--touch-min);
583
+ border: 1px solid rgba(26,26,26,0.2);
584
+ border-radius: 0;
585
+ cursor: pointer;
586
+ transition: all var(--transition-fast);
587
+ display: flex;
588
+ align-items: center;
589
+ justify-content: center;
590
+ backdrop-filter: blur(8px);
591
+ }
592
+ .btn:hover { transform: translateY(-1px); }
593
+ .btn:active { transform: scale(0.97); }
594
+
595
+ .btn-approve {
596
+ background: rgba(45,107,74,0.1);
597
+ color: var(--accent-green);
598
+ border-color: var(--accent-green);
599
+ }
600
+ .btn-approve:hover {
601
+ background: var(--accent-green);
602
+ color: var(--mondrian-white);
603
+ }
604
+ .btn-reject {
605
+ background: rgba(194,59,34,0.1);
606
+ color: var(--mondrian-red);
607
+ border-color: var(--mondrian-red);
608
+ }
609
+ .btn-reject:hover {
610
+ background: var(--mondrian-red);
611
+ color: var(--mondrian-white);
612
+ }
613
+ .btn-defer {
614
+ background: rgba(26,26,26,0.05);
615
+ color: var(--mondrian-black);
616
+ border-color: var(--mondrian-gray);
617
+ }
618
+ .btn-defer:hover {
619
+ background: var(--mondrian-gray);
620
+ color: var(--mondrian-black);
621
+ }
622
+
623
+ /* --- Mondrian Section Grid --- */
624
+ .mondrian-grid {
625
+ display: grid;
626
+ grid-template-columns: 2fr 1fr 1fr;
627
+ grid-auto-rows: minmax(160px, 1fr);
628
+ gap: 5px;
629
+ background: var(--mondrian-black);
630
+ padding: 0 5px 5px 5px;
631
+ }
632
+
633
+ .section-card {
634
+ padding: 28px 24px;
635
+ cursor: pointer;
636
+ position: relative;
637
+ overflow: hidden;
638
+ transition: transform var(--transition-slow), box-shadow var(--transition-slow);
639
+ display: flex;
640
+ flex-direction: column;
641
+ justify-content: flex-end;
642
+ min-height: calc(var(--touch-min) * 2);
643
+ opacity: 0;
644
+ animation: cellAssemble 0.6s ease forwards;
645
+ }
646
+ .section-card:hover {
647
+ transform: scale(1.02);
648
+ box-shadow: 0 4px 20px rgba(0,0,0,0.3);
649
+ z-index: 10;
650
+ }
651
+ .section-card.span-2 {
652
+ grid-row: span 2;
653
+ }
654
+
655
+ @keyframes cellAssemble {
656
+ from { opacity: 0; transform: scale(0.95); }
657
+ to { opacity: 1; transform: scale(1); }
658
+ }
659
+
660
+ /* Section card color assignments */
661
+ .section-card:nth-child(1) { background: var(--mondrian-blue); color: var(--mondrian-white); }
662
+ .section-card:nth-child(2) { background: var(--mondrian-yellow); color: var(--mondrian-black); }
663
+ .section-card:nth-child(3) { background: var(--mondrian-white); color: var(--mondrian-black); }
664
+ .section-card:nth-child(4) { background: var(--mondrian-white); color: var(--mondrian-black); }
665
+ .section-card:nth-child(5) { background: var(--mondrian-red); color: var(--mondrian-white); }
666
+
667
+ .section-health {
668
+ position: absolute;
669
+ top: var(--s3);
670
+ right: var(--s3);
671
+ width: 10px;
672
+ height: 10px;
673
+ border-radius: 50%;
674
+ }
675
+ .health-good { background: var(--color-success); box-shadow: 0 0 6px var(--color-success); }
676
+ .health-warning { background: var(--color-warning); box-shadow: 0 0 6px var(--color-warning); }
677
+ .health-gap { background: var(--color-danger); box-shadow: 0 0 6px var(--color-danger); }
678
+
679
+ .section-name {
680
+ font-family: var(--font-ui);
681
+ font-size: 12px;
682
+ font-weight: 700;
683
+ letter-spacing: 0.14em;
684
+ text-transform: uppercase;
685
+ margin-bottom: var(--s2);
686
+ opacity: 0.7;
687
+ }
688
+
689
+ .section-count {
690
+ font-family: var(--font-headline);
691
+ font-size: 36px;
692
+ font-weight: 700;
693
+ line-height: 1;
694
+ }
695
+
696
+ .section-label {
697
+ font-family: var(--font-mono);
698
+ font-size: 10px;
699
+ letter-spacing: 0.05em;
700
+ opacity: 0.6;
701
+ margin-top: var(--s1);
702
+ }
703
+
704
+ /* ============================================
705
+ VIEW 3: KNOWLEDGE GRAPH
706
+ ============================================ */
707
+ .graph-view {
708
+ display: flex;
709
+ flex-direction: column;
710
+ gap: 5px;
711
+ padding: 5px;
712
+ background: var(--mondrian-black);
713
+ min-height: calc(100vh - 56px - 36px);
714
+ }
715
+
716
+ .graph-toolbar {
717
+ display: flex;
718
+ justify-content: space-between;
719
+ align-items: center;
720
+ flex-wrap: wrap;
721
+ gap: var(--s3);
722
+ background: var(--mondrian-white);
723
+ padding: var(--s3) var(--s5);
724
+ }
725
+
726
+ .graph-filters {
727
+ display: flex;
728
+ gap: var(--s2);
729
+ flex-wrap: wrap;
730
+ }
731
+
732
+ .filter-btn {
733
+ font-family: var(--font-ui);
734
+ font-size: 11px;
735
+ font-weight: 500;
736
+ padding: 0 var(--s4);
737
+ min-height: var(--touch-min);
738
+ background: transparent;
739
+ color: var(--mondrian-black);
740
+ border: 1px solid var(--mondrian-gray);
741
+ cursor: pointer;
742
+ transition: all var(--transition-fast);
743
+ text-transform: uppercase;
744
+ letter-spacing: 0.12em;
745
+ }
746
+ .filter-btn:hover {
747
+ border-color: var(--mondrian-black);
748
+ }
749
+ .filter-btn.active {
750
+ background: var(--mondrian-black);
751
+ color: var(--mondrian-white);
752
+ border-color: var(--mondrian-black);
753
+ }
754
+
755
+ .graph-search input {
756
+ font-family: var(--font-mono);
757
+ font-size: 12px;
758
+ background: var(--mondrian-white);
759
+ color: var(--mondrian-black);
760
+ border: var(--grid-border-thin);
761
+ padding: 0 var(--s4);
762
+ min-height: var(--touch-min);
763
+ min-width: 200px;
764
+ outline: none;
765
+ transition: border-color var(--transition-fast);
766
+ }
767
+ .graph-search input:focus {
768
+ border-color: var(--mondrian-yellow);
769
+ }
770
+ .graph-search input::placeholder {
771
+ color: var(--mondrian-gray);
772
+ font-family: var(--font-ui);
773
+ font-size: 11px;
774
+ letter-spacing: 0.05em;
775
+ text-transform: uppercase;
776
+ }
777
+
778
+ .graph-container {
779
+ background: var(--mondrian-white);
780
+ flex: 1;
781
+ min-height: 400px;
782
+ display: flex;
783
+ align-items: center;
784
+ justify-content: center;
785
+ position: relative;
786
+ overflow: hidden;
787
+ }
788
+
789
+ /* Decorative Mondrian grid background */
790
+ .graph-bg {
791
+ position: absolute;
792
+ inset: 0;
793
+ display: grid;
794
+ grid-template-columns: 3fr 1fr 2fr;
795
+ grid-template-rows: 2fr 1fr 1fr;
796
+ gap: 5px;
797
+ background: var(--mondrian-black);
798
+ opacity: 0.08;
799
+ }
800
+ .graph-bg-cell { background: var(--mondrian-white); }
801
+ .graph-bg-cell:nth-child(2) { background: var(--mondrian-blue); }
802
+ .graph-bg-cell:nth-child(5) { background: var(--mondrian-red); }
803
+ .graph-bg-cell:nth-child(7) { background: var(--mondrian-yellow); }
804
+
805
+ .graph-placeholder {
806
+ display: flex;
807
+ flex-direction: column;
808
+ align-items: center;
809
+ gap: var(--s4);
810
+ z-index: 1;
811
+ }
812
+ .graph-placeholder svg {
813
+ width: 48px;
814
+ height: 48px;
815
+ color: var(--mondrian-black);
816
+ opacity: 0.2;
817
+ }
818
+ .graph-placeholder-title {
819
+ font-family: var(--font-headline);
820
+ font-size: 20px;
821
+ color: var(--mondrian-black);
822
+ opacity: 0.4;
823
+ }
824
+ .graph-placeholder-sub {
825
+ font-family: var(--font-mono);
826
+ font-size: 10px;
827
+ color: var(--mondrian-black);
828
+ opacity: 0.3;
829
+ letter-spacing: 0.05em;
830
+ }
831
+
832
+ /* ============================================
833
+ VIEW 4: CHAIN (Framework Explorer)
834
+ ============================================ */
835
+ .chain-view {
836
+ display: flex;
837
+ flex-direction: column;
838
+ gap: 5px;
839
+ padding: 5px;
840
+ background: var(--mondrian-black);
841
+ min-height: calc(100vh - 56px - 36px);
842
+ }
843
+
844
+ .chain-header-bar {
845
+ background: var(--mondrian-white);
846
+ padding: var(--s4) var(--s5);
847
+ }
848
+ .chain-label {
849
+ font-family: var(--font-ui);
850
+ font-size: 11px;
851
+ color: var(--mondrian-black);
852
+ text-transform: uppercase;
853
+ letter-spacing: 0.14em;
854
+ font-weight: 700;
855
+ opacity: 0.6;
856
+ }
857
+
858
+ .chain-track-wrapper {
859
+ background: var(--mondrian-white);
860
+ padding: var(--s5);
861
+ }
862
+ .chain-track {
863
+ display: flex;
864
+ align-items: center;
865
+ gap: 0;
866
+ overflow-x: auto;
867
+ padding: var(--s3) 0;
868
+ -webkit-overflow-scrolling: touch;
869
+ }
870
+
871
+ .chain-node {
872
+ font-family: var(--font-ui);
873
+ font-size: 11px;
874
+ font-weight: 500;
875
+ letter-spacing: 0.06em;
876
+ white-space: nowrap;
877
+ padding: 0 var(--s4);
878
+ min-height: var(--touch-min);
879
+ display: flex;
880
+ align-items: center;
881
+ background: var(--mondrian-white);
882
+ border: var(--grid-border-thin);
883
+ cursor: pointer;
884
+ transition: all var(--transition-fast);
885
+ color: var(--mondrian-black);
886
+ flex-shrink: 0;
887
+ text-transform: uppercase;
888
+ }
889
+ .chain-node:hover {
890
+ background: var(--mondrian-gray);
891
+ transform: translateY(-1px);
892
+ }
893
+ .chain-node.active {
894
+ background: var(--mondrian-blue);
895
+ border-color: var(--mondrian-blue);
896
+ color: var(--mondrian-white);
897
+ }
898
+
899
+ .chain-arrow {
900
+ flex-shrink: 0;
901
+ width: 28px;
902
+ display: flex;
903
+ align-items: center;
904
+ justify-content: center;
905
+ }
906
+ .chain-arrow svg {
907
+ width: 20px;
908
+ height: 20px;
909
+ color: var(--mondrian-black);
910
+ opacity: 0.3;
911
+ }
912
+
913
+ /* Chain detail panel */
914
+ .chain-detail {
915
+ background: var(--mondrian-white);
916
+ border-left: 5px solid var(--mondrian-blue);
917
+ padding: var(--s6) var(--s5);
918
+ flex: 1;
919
+ }
920
+
921
+ .chain-detail-title {
922
+ font-family: var(--font-headline);
923
+ font-size: 24px;
924
+ font-weight: 700;
925
+ color: var(--mondrian-black);
926
+ margin-bottom: var(--s3);
927
+ line-height: 1.25;
928
+ }
929
+
930
+ .chain-detail-stats {
931
+ display: flex;
932
+ gap: var(--s5);
933
+ margin-bottom: var(--s4);
934
+ }
935
+
936
+ .chain-stat {
937
+ display: flex;
938
+ align-items: center;
939
+ gap: var(--s2);
940
+ font-family: var(--font-mono);
941
+ font-size: 11px;
942
+ color: var(--mondrian-black);
943
+ opacity: 0.6;
944
+ }
945
+ .chain-stat-value {
946
+ font-weight: 600;
947
+ color: var(--mondrian-blue);
948
+ opacity: 1;
949
+ }
950
+
951
+ .chain-detail-desc {
952
+ font-family: var(--font-body);
953
+ font-size: 14px;
954
+ color: var(--mondrian-black);
955
+ line-height: 1.7;
956
+ max-width: 60ch;
957
+ opacity: 0.85;
958
+ }
959
+
960
+ /* ============================================
961
+ VIEW 5: CLAIMS (Assumption Tracker)
962
+ ============================================ */
963
+ .claims-grid {
964
+ display: grid;
965
+ grid-template-columns: 1fr 1fr;
966
+ gap: 5px;
967
+ background: var(--mondrian-black);
968
+ padding: 5px;
969
+ }
970
+
971
+ .claim-card {
972
+ background: var(--mondrian-white);
973
+ padding: var(--s5);
974
+ border-left: 5px solid;
975
+ cursor: pointer;
976
+ transition: transform var(--transition-slow), box-shadow var(--transition-slow);
977
+ min-height: calc(var(--touch-min) * 2);
978
+ display: flex;
979
+ flex-direction: column;
980
+ justify-content: space-between;
981
+ gap: var(--s3);
982
+ }
983
+ .claim-card:hover {
984
+ transform: scale(1.02);
985
+ box-shadow: 0 4px 20px rgba(0,0,0,0.3);
986
+ z-index: 10;
987
+ }
988
+
989
+ .claim-card.untested { border-left-color: var(--mondrian-gray); }
990
+ .claim-card.supported { border-left-color: var(--accent-green); }
991
+ .claim-card.contradicted { border-left-color: var(--mondrian-red); }
992
+ .claim-card.stale { border-left-color: var(--mondrian-yellow); }
993
+
994
+ .claim-text {
995
+ font-family: var(--font-headline);
996
+ font-size: 16px;
997
+ font-weight: 600;
998
+ color: var(--mondrian-black);
999
+ line-height: 1.4;
1000
+ }
1001
+
1002
+ .claim-meta {
1003
+ display: flex;
1004
+ justify-content: space-between;
1005
+ align-items: center;
1006
+ }
1007
+
1008
+ .claim-section {
1009
+ font-family: var(--font-mono);
1010
+ font-size: 10px;
1011
+ color: var(--mondrian-black);
1012
+ letter-spacing: 0.05em;
1013
+ opacity: 0.5;
1014
+ }
1015
+
1016
+ .validity-badge {
1017
+ font-family: var(--font-mono);
1018
+ font-size: 10px;
1019
+ font-weight: 600;
1020
+ text-transform: uppercase;
1021
+ letter-spacing: 0.06em;
1022
+ padding: var(--s1) var(--s2);
1023
+ display: inline-flex;
1024
+ align-items: center;
1025
+ gap: var(--s1);
1026
+ }
1027
+ .validity-badge.untested {
1028
+ background: var(--mondrian-gray);
1029
+ color: var(--mondrian-black);
1030
+ }
1031
+ .validity-badge.supported {
1032
+ background: var(--accent-green);
1033
+ color: var(--mondrian-white);
1034
+ }
1035
+ .validity-badge.contradicted {
1036
+ background: var(--mondrian-red);
1037
+ color: var(--mondrian-white);
1038
+ }
1039
+ .validity-badge.stale {
1040
+ background: var(--mondrian-yellow);
1041
+ color: var(--mondrian-black);
1042
+ }
1043
+
1044
+ .claim-evidence {
1045
+ display: flex;
1046
+ gap: var(--s3);
1047
+ font-family: var(--font-mono);
1048
+ font-size: 10px;
1049
+ color: var(--mondrian-black);
1050
+ opacity: 0.5;
1051
+ }
1052
+ .claim-evidence .for { color: var(--accent-green); opacity: 1; }
1053
+ .claim-evidence .against { color: var(--mondrian-red); opacity: 1; }
1054
+
1055
+ /* ============================================
1056
+ FOOTER STATUS BAR
1057
+ Matches topbar style -- black background
1058
+ ============================================ */
1059
+ .footer {
1060
+ display: flex;
1061
+ align-items: center;
1062
+ justify-content: space-between;
1063
+ padding: 0 var(--s5);
1064
+ min-height: 36px;
1065
+ background: var(--mondrian-black);
1066
+ border-top: var(--grid-border);
1067
+ font-family: var(--font-mono);
1068
+ font-size: 10px;
1069
+ color: var(--mondrian-gray);
1070
+ gap: var(--s4);
1071
+ letter-spacing: 0.03em;
1072
+ }
1073
+
1074
+ .footer-section {
1075
+ display: flex;
1076
+ align-items: center;
1077
+ gap: var(--s2);
1078
+ white-space: nowrap;
1079
+ }
1080
+
1081
+ .status-dot {
1082
+ width: 6px;
1083
+ height: 6px;
1084
+ border-radius: 50%;
1085
+ flex-shrink: 0;
1086
+ }
1087
+ .status-dot.connected {
1088
+ background: var(--accent-green);
1089
+ box-shadow: 0 0 4px var(--accent-green);
1090
+ }
1091
+ .status-dot.disconnected {
1092
+ background: var(--mondrian-red);
1093
+ }
1094
+
1095
+ /* ============================================
1096
+ RESPONSIVE -- Collapse to single column at 640px
1097
+ ============================================ */
1098
+ @media (max-width: 640px) {
1099
+ .topbar {
1100
+ flex-direction: column;
1101
+ height: auto;
1102
+ padding: var(--s3);
1103
+ gap: var(--s2);
1104
+ }
1105
+ .topbar-nav {
1106
+ flex-wrap: wrap;
1107
+ justify-content: center;
1108
+ }
1109
+ .mullins {
1110
+ grid-template-columns: 1fr;
1111
+ }
1112
+ .mondrian-grid {
1113
+ grid-template-columns: 1fr;
1114
+ }
1115
+ .section-card.span-2 {
1116
+ grid-row: span 1;
1117
+ }
1118
+ .claims-grid {
1119
+ grid-template-columns: 1fr;
1120
+ }
1121
+ .brain-suggestion {
1122
+ flex-direction: column;
1123
+ align-items: stretch;
1124
+ text-align: center;
1125
+ }
1126
+ .btn-run {
1127
+ width: 100%;
1128
+ }
1129
+ .alert-card {
1130
+ flex-direction: column;
1131
+ align-items: flex-start;
1132
+ gap: var(--s3);
1133
+ }
1134
+ }
1135
+ </style>
1136
+ </head>
1137
+ <body>
1138
+
1139
+ <div class="platform" role="application" aria-label="MindrianOS Platform">
1140
+
1141
+ <!-- ==========================================
1142
+ TOPBAR -- Export template pattern
1143
+ ========================================== -->
1144
+ <header class="topbar" role="banner">
1145
+ <div class="topbar-left">
1146
+ <div class="topbar-logo" aria-hidden="true">
1147
+ <div class="topbar-logo-block r"></div>
1148
+ <div class="topbar-logo-block b"></div>
1149
+ <div class="topbar-logo-block y"></div>
1150
+ </div>
1151
+ <span class="topbar-title">MindrianOS</span>
1152
+ <span class="topbar-badge" id="venture-stage">Pre-Opportunity</span>
1153
+ </div>
1154
+
1155
+ <nav class="topbar-nav" role="tablist" aria-label="Platform views">
1156
+ <button class="active" role="tab" aria-selected="true" aria-controls="view-mullins" data-view="mullins">
1157
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true">
1158
+ <rect x="1" y="1" width="6" height="6"/><rect x="9" y="1" width="6" height="6"/><rect x="1" y="9" width="6" height="6"/><rect x="9" y="9" width="6" height="6"/>
1159
+ </svg>
1160
+ Mullins
1161
+ </button>
1162
+ <button role="tab" aria-selected="false" aria-controls="view-room" data-view="room">
1163
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true">
1164
+ <rect x="1" y="1" width="14" height="14" rx="1"/><line x1="1" y1="6" x2="15" y2="6"/><line x1="6" y1="6" x2="6" y2="15"/>
1165
+ </svg>
1166
+ Room
1167
+ </button>
1168
+ <button role="tab" aria-selected="false" aria-controls="view-graph" data-view="graph">
1169
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true">
1170
+ <circle cx="4" cy="4" r="2"/><circle cx="12" cy="4" r="2"/><circle cx="8" cy="12" r="2"/><line x1="5.5" y1="5" x2="6.5" y2="10.5"/><line x1="10.5" y1="5" x2="9.5" y2="10.5"/><line x1="6" y1="4" x2="10" y2="4"/>
1171
+ </svg>
1172
+ Graph
1173
+ </button>
1174
+ <button role="tab" aria-selected="false" aria-controls="view-chain" data-view="chain">
1175
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true">
1176
+ <rect x="1" y="5" width="4" height="6" rx="1"/><rect x="6" y="5" width="4" height="6" rx="1"/><rect x="11" y="5" width="4" height="6" rx="1"/><line x1="5" y1="8" x2="6" y2="8"/><line x1="10" y1="8" x2="11" y2="8"/>
1177
+ </svg>
1178
+ Chain
1179
+ </button>
1180
+ <button role="tab" aria-selected="false" aria-controls="view-claims" data-view="claims">
1181
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true">
1182
+ <path d="M3 8l3 3 7-7"/>
1183
+ </svg>
1184
+ Claims
1185
+ </button>
1186
+ </nav>
1187
+ </header>
1188
+
1189
+ <!-- ==========================================
1190
+ CONTENT
1191
+ ========================================== -->
1192
+ <main class="content">
1193
+
1194
+ <!-- ========== VIEW 1: MULLINS ========== -->
1195
+ <div class="view" id="view-mullins" role="tabpanel" aria-label="Mullins Assessment">
1196
+ <div class="mullins">
1197
+
1198
+ <!-- IS IT REAL? (Blue cell) -->
1199
+ <div class="mullins-column real">
1200
+ <div class="mullins-header">Is It Real?</div>
1201
+
1202
+ <div class="mullins-cell" tabindex="0" role="button" aria-label="Market exists - 80% coverage, 4 artifacts" data-cell="market-exists">
1203
+ <div class="cell-question">Market exists?</div>
1204
+ <div class="bullet-chart">
1205
+ <div class="bullet-zone danger"></div>
1206
+ <div class="bullet-zone ok"></div>
1207
+ <div class="bullet-zone good"></div>
1208
+ <div class="bullet-bar high" style="width: 80%"></div>
1209
+ <div class="bullet-target" style="left: 75%"></div>
1210
+ </div>
1211
+ <div class="cell-meta">
1212
+ <span class="cell-score">80%</span>
1213
+ <span class="cell-artifacts">
1214
+ <svg viewBox="0 0 10 10" fill="currentColor" aria-hidden="true"><rect x="1" y="1" width="8" height="8" rx="1"/></svg>
1215
+ 4 artifacts
1216
+ </span>
1217
+ </div>
1218
+ </div>
1219
+
1220
+ <div class="mullins-cell" tabindex="0" role="button" aria-label="Problem is real - 100% coverage, 6 artifacts" data-cell="problem-real">
1221
+ <div class="cell-question">Problem is real?</div>
1222
+ <div class="bullet-chart">
1223
+ <div class="bullet-zone danger"></div>
1224
+ <div class="bullet-zone ok"></div>
1225
+ <div class="bullet-zone good"></div>
1226
+ <div class="bullet-bar high" style="width: 100%"></div>
1227
+ <div class="bullet-target" style="left: 75%"></div>
1228
+ </div>
1229
+ <div class="cell-meta">
1230
+ <span class="cell-score">100%</span>
1231
+ <span class="cell-artifacts">
1232
+ <svg viewBox="0 0 10 10" fill="currentColor" aria-hidden="true"><rect x="1" y="1" width="8" height="8" rx="1"/></svg>
1233
+ 6 artifacts
1234
+ </span>
1235
+ </div>
1236
+ </div>
1237
+
1238
+ <div class="mullins-cell" tabindex="0" role="button" aria-label="Solution works - 25% coverage, 1 artifact" data-cell="solution-works">
1239
+ <div class="cell-question">Solution works?</div>
1240
+ <div class="bullet-chart">
1241
+ <div class="bullet-zone danger"></div>
1242
+ <div class="bullet-zone ok"></div>
1243
+ <div class="bullet-zone good"></div>
1244
+ <div class="bullet-bar low" style="width: 25%"></div>
1245
+ <div class="bullet-target" style="left: 75%"></div>
1246
+ </div>
1247
+ <div class="cell-meta">
1248
+ <span class="cell-score">25%</span>
1249
+ <span class="cell-artifacts">
1250
+ <svg viewBox="0 0 10 10" fill="currentColor" aria-hidden="true"><rect x="1" y="1" width="8" height="8" rx="1"/></svg>
1251
+ 1 artifact
1252
+ </span>
1253
+ </div>
1254
+ </div>
1255
+
1256
+ <div class="mullins-footer">
1257
+ <span class="evidence-count">Evidence: 11</span>
1258
+ <span class="gap-count">Gaps: 3</span>
1259
+ </div>
1260
+ </div>
1261
+
1262
+ <!-- CAN WE WIN? (Yellow cell) -->
1263
+ <div class="mullins-column win">
1264
+ <div class="mullins-header">Can We Win?</div>
1265
+
1266
+ <div class="mullins-cell" tabindex="0" role="button" aria-label="Competitive advantage - 60% coverage, 3 artifacts" data-cell="competitive-advantage">
1267
+ <div class="cell-question">Competitive advantage?</div>
1268
+ <div class="bullet-chart">
1269
+ <div class="bullet-zone danger"></div>
1270
+ <div class="bullet-zone ok"></div>
1271
+ <div class="bullet-zone good"></div>
1272
+ <div class="bullet-bar mid" style="width: 60%"></div>
1273
+ <div class="bullet-target" style="left: 75%"></div>
1274
+ </div>
1275
+ <div class="cell-meta">
1276
+ <span class="cell-score">60%</span>
1277
+ <span class="cell-artifacts">
1278
+ <svg viewBox="0 0 10 10" fill="currentColor" aria-hidden="true"><rect x="1" y="1" width="8" height="8" rx="1"/></svg>
1279
+ 3 artifacts
1280
+ </span>
1281
+ </div>
1282
+ </div>
1283
+
1284
+ <div class="mullins-cell" tabindex="0" role="button" aria-label="Team can execute - 85% coverage, 5 artifacts" data-cell="team-execute">
1285
+ <div class="cell-question">Team can execute?</div>
1286
+ <div class="bullet-chart">
1287
+ <div class="bullet-zone danger"></div>
1288
+ <div class="bullet-zone ok"></div>
1289
+ <div class="bullet-zone good"></div>
1290
+ <div class="bullet-bar high" style="width: 85%"></div>
1291
+ <div class="bullet-target" style="left: 75%"></div>
1292
+ </div>
1293
+ <div class="cell-meta">
1294
+ <span class="cell-score">85%</span>
1295
+ <span class="cell-artifacts">
1296
+ <svg viewBox="0 0 10 10" fill="currentColor" aria-hidden="true"><rect x="1" y="1" width="8" height="8" rx="1"/></svg>
1297
+ 5 artifacts
1298
+ </span>
1299
+ </div>
1300
+ </div>
1301
+
1302
+ <div class="mullins-cell" tabindex="0" role="button" aria-label="Timing is right - 45% coverage, 2 artifacts" data-cell="timing-right">
1303
+ <div class="cell-question">Timing is right?</div>
1304
+ <div class="bullet-chart">
1305
+ <div class="bullet-zone danger"></div>
1306
+ <div class="bullet-zone ok"></div>
1307
+ <div class="bullet-zone good"></div>
1308
+ <div class="bullet-bar mid" style="width: 45%"></div>
1309
+ <div class="bullet-target" style="left: 75%"></div>
1310
+ </div>
1311
+ <div class="cell-meta">
1312
+ <span class="cell-score">45%</span>
1313
+ <span class="cell-artifacts">
1314
+ <svg viewBox="0 0 10 10" fill="currentColor" aria-hidden="true"><rect x="1" y="1" width="8" height="8" rx="1"/></svg>
1315
+ 2 artifacts
1316
+ </span>
1317
+ </div>
1318
+ </div>
1319
+
1320
+ <div class="mullins-footer">
1321
+ <span class="evidence-count">Evidence: 10</span>
1322
+ <span class="gap-count">Gaps: 2</span>
1323
+ </div>
1324
+ </div>
1325
+
1326
+ <!-- IS IT WORTH IT? (Red cell) -->
1327
+ <div class="mullins-column worth">
1328
+ <div class="mullins-header">Is It Worth It?</div>
1329
+
1330
+ <div class="mullins-cell" tabindex="0" role="button" aria-label="Revenue potential - no evidence" data-cell="revenue-potential">
1331
+ <div class="cell-question">Revenue potential?</div>
1332
+ <div class="bullet-chart">
1333
+ <div class="bullet-zone danger"></div>
1334
+ <div class="bullet-zone ok"></div>
1335
+ <div class="bullet-zone good"></div>
1336
+ <div class="bullet-bar none" style="width: 0%"></div>
1337
+ <div class="bullet-target" style="left: 75%"></div>
1338
+ </div>
1339
+ <div class="cell-meta">
1340
+ <span class="cell-score">--</span>
1341
+ <span class="cell-artifacts">
1342
+ <svg viewBox="0 0 10 10" fill="currentColor" aria-hidden="true"><rect x="1" y="1" width="8" height="8" rx="1"/></svg>
1343
+ no evidence
1344
+ </span>
1345
+ </div>
1346
+ </div>
1347
+
1348
+ <div class="mullins-cell" tabindex="0" role="button" aria-label="Risk acceptable - no evidence" data-cell="risk-acceptable">
1349
+ <div class="cell-question">Risk acceptable?</div>
1350
+ <div class="bullet-chart">
1351
+ <div class="bullet-zone danger"></div>
1352
+ <div class="bullet-zone ok"></div>
1353
+ <div class="bullet-zone good"></div>
1354
+ <div class="bullet-bar none" style="width: 0%"></div>
1355
+ <div class="bullet-target" style="left: 75%"></div>
1356
+ </div>
1357
+ <div class="cell-meta">
1358
+ <span class="cell-score">--</span>
1359
+ <span class="cell-artifacts">
1360
+ <svg viewBox="0 0 10 10" fill="currentColor" aria-hidden="true"><rect x="1" y="1" width="8" height="8" rx="1"/></svg>
1361
+ no evidence
1362
+ </span>
1363
+ </div>
1364
+ </div>
1365
+
1366
+ <div class="mullins-cell" tabindex="0" role="button" aria-label="Aligned with goals - 15% coverage, 1 artifact" data-cell="aligned-goals">
1367
+ <div class="cell-question">Aligned with goals?</div>
1368
+ <div class="bullet-chart">
1369
+ <div class="bullet-zone danger"></div>
1370
+ <div class="bullet-zone ok"></div>
1371
+ <div class="bullet-zone good"></div>
1372
+ <div class="bullet-bar low" style="width: 15%"></div>
1373
+ <div class="bullet-target" style="left: 75%"></div>
1374
+ </div>
1375
+ <div class="cell-meta">
1376
+ <span class="cell-score">15%</span>
1377
+ <span class="cell-artifacts">
1378
+ <svg viewBox="0 0 10 10" fill="currentColor" aria-hidden="true"><rect x="1" y="1" width="8" height="8" rx="1"/></svg>
1379
+ 1 artifact
1380
+ </span>
1381
+ </div>
1382
+ </div>
1383
+
1384
+ <div class="mullins-footer">
1385
+ <span class="evidence-count">Evidence: 1</span>
1386
+ <span class="gap-count">Gaps: 5</span>
1387
+ </div>
1388
+ </div>
1389
+ </div>
1390
+
1391
+ <!-- Brain Suggestion -- dark panel like topbar -->
1392
+ <div class="brain-suggestion">
1393
+ <div class="suggestion-content">
1394
+ <div class="suggestion-icon">
1395
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true">
1396
+ <circle cx="8" cy="6" r="4"/><path d="M4 10c0 2.2 1.8 4 4 4s4-1.8 4-4"/><line x1="8" y1="2" x2="8" y2="4"/><line x1="5" y1="3" x2="6" y2="4.5"/><line x1="11" y1="3" x2="10" y2="4.5"/>
1397
+ </svg>
1398
+ </div>
1399
+ <div class="suggestion-text">
1400
+ Weakest area is <span class="suggestion-area">"Is It Worth It?"</span> with 5 gaps.
1401
+ Brain suggests: <span class="suggestion-framework">Financial Feasibility Analysis</span>
1402
+ </div>
1403
+ </div>
1404
+ <button class="btn-run" id="btn-run-methodology" aria-label="Run Financial Feasibility Analysis">Run It</button>
1405
+ </div>
1406
+ </div>
1407
+
1408
+ <!-- ========== VIEW 2: ROOM ========== -->
1409
+ <div class="view" id="view-room" role="tabpanel" aria-label="Room Command Center" aria-hidden="true">
1410
+
1411
+ <!-- Cascade Alerts -->
1412
+ <div class="cascade-alerts">
1413
+ <div class="alert-card contradiction">
1414
+ <span class="alert-type-badge">Contradiction</span>
1415
+ <span class="alert-text">Market analysis says "no competitors" but competitive analysis lists 3 direct competitors</span>
1416
+ <div class="alert-actions">
1417
+ <button class="btn btn-approve" data-cascade="approve" data-alert="c1">Approve</button>
1418
+ <button class="btn btn-reject" data-cascade="reject" data-alert="c1">Reject</button>
1419
+ <button class="btn btn-defer" data-cascade="defer" data-alert="c1">Defer</button>
1420
+ </div>
1421
+ </div>
1422
+ <div class="alert-card convergence">
1423
+ <span class="alert-type-badge">Convergence</span>
1424
+ <span class="alert-text">"Supply chain" appears in 4 sections -- emerging pattern</span>
1425
+ <div class="alert-actions">
1426
+ <button class="btn btn-approve" data-cascade="acknowledge" data-alert="v1">Acknowledge</button>
1427
+ </div>
1428
+ </div>
1429
+ </div>
1430
+
1431
+ <!-- Mondrian Section Grid -->
1432
+ <div class="mondrian-grid">
1433
+ <div class="section-card span-2" tabindex="0" role="button" data-section="problem-definition">
1434
+ <div class="section-health health-good"></div>
1435
+ <div class="section-name">problem-definition</div>
1436
+ <div class="section-count">6</div>
1437
+ <div class="section-label">artifacts</div>
1438
+ </div>
1439
+ <div class="section-card" tabindex="0" role="button" data-section="market-analysis">
1440
+ <div class="section-health health-warning"></div>
1441
+ <div class="section-name">market-analysis</div>
1442
+ <div class="section-count">3</div>
1443
+ <div class="section-label">artifacts</div>
1444
+ </div>
1445
+ <div class="section-card" tabindex="0" role="button" data-section="competitive-analysis">
1446
+ <div class="section-health health-good"></div>
1447
+ <div class="section-name">competitive</div>
1448
+ <div class="section-count">4</div>
1449
+ <div class="section-label">artifacts</div>
1450
+ </div>
1451
+ <div class="section-card" tabindex="0" role="button" data-section="solution-design">
1452
+ <div class="section-health health-gap"></div>
1453
+ <div class="section-name">solution-design</div>
1454
+ <div class="section-count">1</div>
1455
+ <div class="section-label">artifact</div>
1456
+ </div>
1457
+ <div class="section-card" tabindex="0" role="button" data-section="financial-model">
1458
+ <div class="section-health health-gap"></div>
1459
+ <div class="section-name">financial-model</div>
1460
+ <div class="section-count">0</div>
1461
+ <div class="section-label">empty</div>
1462
+ </div>
1463
+ </div>
1464
+ </div>
1465
+
1466
+ <!-- ========== VIEW 3: GRAPH ========== -->
1467
+ <div class="view" id="view-graph" role="tabpanel" aria-label="Knowledge Graph" aria-hidden="true">
1468
+ <div class="graph-view">
1469
+ <div class="graph-toolbar">
1470
+ <div class="graph-filters" role="group" aria-label="Edge type filters">
1471
+ <button class="filter-btn active" data-filter="all">All</button>
1472
+ <button class="filter-btn" data-filter="tensions">Tensions</button>
1473
+ <button class="filter-btn" data-filter="patterns">Patterns</button>
1474
+ <button class="filter-btn" data-filter="hsi">HSI</button>
1475
+ <button class="filter-btn" data-filter="causal">Causal</button>
1476
+ </div>
1477
+ <div class="graph-search">
1478
+ <input type="text" placeholder="Search nodes..." aria-label="Search graph nodes">
1479
+ </div>
1480
+ </div>
1481
+
1482
+ <div class="graph-container">
1483
+ <div class="graph-bg" aria-hidden="true">
1484
+ <div class="graph-bg-cell"></div>
1485
+ <div class="graph-bg-cell"></div>
1486
+ <div class="graph-bg-cell"></div>
1487
+ <div class="graph-bg-cell"></div>
1488
+ <div class="graph-bg-cell"></div>
1489
+ <div class="graph-bg-cell"></div>
1490
+ <div class="graph-bg-cell"></div>
1491
+ <div class="graph-bg-cell"></div>
1492
+ <div class="graph-bg-cell"></div>
1493
+ </div>
1494
+ <div class="graph-placeholder">
1495
+ <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true">
1496
+ <circle cx="12" cy="12" r="5"/><circle cx="36" cy="12" r="5"/><circle cx="24" cy="36" r="5"/>
1497
+ <circle cx="12" cy="36" r="3"/><circle cx="36" cy="36" r="3"/>
1498
+ <line x1="16" y1="14" x2="20" y2="32"/><line x1="32" y1="14" x2="28" y2="32"/>
1499
+ <line x1="17" y1="12" x2="31" y2="12"/><line x1="15" y1="36" x2="19" y2="36"/><line x1="29" y1="36" x2="33" y2="36"/>
1500
+ </svg>
1501
+ <span class="graph-placeholder-title">Knowledge Graph</span>
1502
+ <span class="graph-placeholder-sub">INFORMS / CONTRADICTS / CONVERGES / ENABLES</span>
1503
+ </div>
1504
+ </div>
1505
+ </div>
1506
+ </div>
1507
+
1508
+ <!-- ========== VIEW 4: CHAIN ========== -->
1509
+ <div class="view" id="view-chain" role="tabpanel" aria-label="Framework Chain Explorer" aria-hidden="true">
1510
+ <div class="chain-view">
1511
+ <div class="chain-header-bar">
1512
+ <div class="chain-label">FEEDS_INTO chain from Brain</div>
1513
+ </div>
1514
+
1515
+ <div class="chain-track-wrapper">
1516
+ <div class="chain-track" role="list" aria-label="Framework chain">
1517
+ <div class="chain-node" tabindex="0" role="listitem" data-framework="beautiful-question">Beautiful Question</div>
1518
+ <div class="chain-arrow" aria-hidden="true">
1519
+ <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="2"><line x1="2" y1="10" x2="16" y2="10"/><polyline points="12,6 16,10 12,14"/></svg>
1520
+ </div>
1521
+ <div class="chain-node" tabindex="0" role="listitem" data-framework="domain-selection">Domain Selection</div>
1522
+ <div class="chain-arrow" aria-hidden="true">
1523
+ <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="2"><line x1="2" y1="10" x2="16" y2="10"/><polyline points="12,6 16,10 12,14"/></svg>
1524
+ </div>
1525
+ <div class="chain-node active" tabindex="0" role="listitem" data-framework="pws-value-proposition" aria-current="true">PWS Value Proposition</div>
1526
+ <div class="chain-arrow" aria-hidden="true">
1527
+ <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="2"><line x1="2" y1="10" x2="16" y2="10"/><polyline points="12,6 16,10 12,14"/></svg>
1528
+ </div>
1529
+ <div class="chain-node" tabindex="0" role="listitem" data-framework="jobs-to-be-done">Jobs to Be Done</div>
1530
+ <div class="chain-arrow" aria-hidden="true">
1531
+ <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="2"><line x1="2" y1="10" x2="16" y2="10"/><polyline points="12,6 16,10 12,14"/></svg>
1532
+ </div>
1533
+ <div class="chain-node" tabindex="0" role="listitem" data-framework="process-mapping">Process Mapping</div>
1534
+ <div class="chain-arrow" aria-hidden="true">
1535
+ <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="2"><line x1="2" y1="10" x2="16" y2="10"/><polyline points="12,6 16,10 12,14"/></svg>
1536
+ </div>
1537
+ <div class="chain-node" tabindex="0" role="listitem" data-framework="reverse-salient">Reverse Salient</div>
1538
+ </div>
1539
+ </div>
1540
+
1541
+ <div class="chain-detail">
1542
+ <div class="chain-detail-title">PWS Value Proposition</div>
1543
+ <div class="chain-detail-stats">
1544
+ <div class="chain-stat">
1545
+ <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5" width="12" height="12" aria-hidden="true"><polyline points="2,8 6,4 10,8"/></svg>
1546
+ <span class="chain-stat-value">16</span> feeds in
1547
+ </div>
1548
+ <div class="chain-stat">
1549
+ <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5" width="12" height="12" aria-hidden="true"><polyline points="2,4 6,8 10,4"/></svg>
1550
+ <span class="chain-stat-value">17</span> feeds out
1551
+ </div>
1552
+ </div>
1553
+ <div class="chain-detail-desc">
1554
+ This is the hub of the entire methodology. The three gates -- Is it Real? Can we Win? Is it Worth it? --
1555
+ must each be addressed with evidence before proceeding. 16 frameworks feed into this assessment.
1556
+ 17 frameworks chain from it.
1557
+ </div>
1558
+ </div>
1559
+ </div>
1560
+ </div>
1561
+
1562
+ <!-- ========== VIEW 5: CLAIMS ========== -->
1563
+ <div class="view" id="view-claims" role="tabpanel" aria-label="Assumption Tracker" aria-hidden="true">
1564
+ <div class="claims-grid">
1565
+ <div class="claim-card supported" tabindex="0" role="button" data-claim="claim-1">
1566
+ <div class="claim-text">Customer segment is healthcare providers in rural areas</div>
1567
+ <div class="claim-evidence">
1568
+ <span class="for">3 supporting</span>
1569
+ <span class="against">0 against</span>
1570
+ </div>
1571
+ <div class="claim-meta">
1572
+ <span class="claim-section">problem-definition</span>
1573
+ <span class="validity-badge supported">Supported</span>
1574
+ </div>
1575
+ </div>
1576
+
1577
+ <div class="claim-card contradicted" tabindex="0" role="button" data-claim="claim-2">
1578
+ <div class="claim-text">No direct competitors exist in this space</div>
1579
+ <div class="claim-evidence">
1580
+ <span class="for">1 supporting</span>
1581
+ <span class="against">3 against</span>
1582
+ </div>
1583
+ <div class="claim-meta">
1584
+ <span class="claim-section">competitive-analysis</span>
1585
+ <span class="validity-badge contradicted">Contradicted</span>
1586
+ </div>
1587
+ </div>
1588
+
1589
+ <div class="claim-card untested" tabindex="0" role="button" data-claim="claim-3">
1590
+ <div class="claim-text">Unit economics work at $29/month price point</div>
1591
+ <div class="claim-evidence">
1592
+ <span>0 evidence</span>
1593
+ </div>
1594
+ <div class="claim-meta">
1595
+ <span class="claim-section">financial-model</span>
1596
+ <span class="validity-badge untested">Untested</span>
1597
+ </div>
1598
+ </div>
1599
+
1600
+ <div class="claim-card stale" tabindex="0" role="button" data-claim="claim-4">
1601
+ <div class="claim-text">Regulatory approval takes 6 months</div>
1602
+ <div class="claim-evidence">
1603
+ <span class="for">1 supporting</span>
1604
+ <span style="color: var(--mondrian-yellow);">data > 90 days old</span>
1605
+ </div>
1606
+ <div class="claim-meta">
1607
+ <span class="claim-section">legal-ip</span>
1608
+ <span class="validity-badge stale">Stale</span>
1609
+ </div>
1610
+ </div>
1611
+ </div>
1612
+ </div>
1613
+
1614
+ </main>
1615
+
1616
+ <!-- ==========================================
1617
+ FOOTER STATUS BAR -- Matches topbar
1618
+ ========================================== -->
1619
+ <footer class="footer" role="contentinfo">
1620
+ <div class="footer-section">
1621
+ <span class="status-dot connected" aria-label="Connected"></span>
1622
+ Brain connected -- 21K nodes
1623
+ </div>
1624
+ <div class="footer-section">room.db: 23 nodes, 47 edges</div>
1625
+ <div class="footer-section">Larry -- Ask mode (turn 2)</div>
1626
+ </footer>
1627
+ </div>
1628
+
1629
+ <script>
1630
+ /* ============================================
1631
+ VIEW SWITCHING -- Tab-based with ARIA
1632
+ ============================================ */
1633
+ const tabs = document.querySelectorAll('.topbar-nav button');
1634
+ const views = document.querySelectorAll('.view');
1635
+
1636
+ function switchView(viewId) {
1637
+ // Update tab state
1638
+ tabs.forEach(t => {
1639
+ const isActive = t.dataset.view === viewId;
1640
+ t.classList.toggle('active', isActive);
1641
+ t.setAttribute('aria-selected', isActive ? 'true' : 'false');
1642
+ });
1643
+
1644
+ // Update view visibility with transition
1645
+ views.forEach(v => {
1646
+ const isTarget = v.id === 'view-' + viewId;
1647
+ if (isTarget) {
1648
+ v.removeAttribute('aria-hidden');
1649
+ v.style.display = '';
1650
+ // Trigger reflow for transition
1651
+ void v.offsetHeight;
1652
+ v.style.opacity = '1';
1653
+ } else {
1654
+ v.setAttribute('aria-hidden', 'true');
1655
+ v.style.display = 'none';
1656
+ v.style.opacity = '0';
1657
+ }
1658
+ });
1659
+ }
1660
+
1661
+ tabs.forEach(tab => {
1662
+ tab.addEventListener('click', () => switchView(tab.dataset.view));
1663
+ });
1664
+
1665
+ // Keyboard navigation for tabs
1666
+ document.querySelector('.topbar-nav').addEventListener('keydown', (e) => {
1667
+ const tabArray = Array.from(tabs);
1668
+ const currentIndex = tabArray.indexOf(document.activeElement);
1669
+ if (currentIndex === -1) return;
1670
+
1671
+ let nextIndex;
1672
+ if (e.key === 'ArrowRight') nextIndex = (currentIndex + 1) % tabArray.length;
1673
+ else if (e.key === 'ArrowLeft') nextIndex = (currentIndex - 1 + tabArray.length) % tabArray.length;
1674
+ else return;
1675
+
1676
+ e.preventDefault();
1677
+ tabArray[nextIndex].focus();
1678
+ tabArray[nextIndex].click();
1679
+ });
1680
+
1681
+ /* ============================================
1682
+ MCP APP COMMUNICATION (placeholder)
1683
+ In production:
1684
+ import { App } from '@modelcontextprotocol/ext-apps';
1685
+ const app = new App({ name: 'MindrianOS', version: '2.0.0' });
1686
+ app.connect();
1687
+ ============================================ */
1688
+
1689
+ const app = {
1690
+ connected: false,
1691
+
1692
+ connect() {
1693
+ this.connected = true;
1694
+ console.log('[MindrianOS] MCP App connected');
1695
+ },
1696
+
1697
+ // Receive data from tool call
1698
+ ontoolresult(result) {
1699
+ try {
1700
+ const data = JSON.parse(result.content.find(c => c.type === 'text').text);
1701
+ if (data.view) switchView(data.view);
1702
+ renderView(data);
1703
+ } catch (err) {
1704
+ console.error('[MindrianOS] Failed to parse tool result:', err);
1705
+ }
1706
+ },
1707
+
1708
+ // Call back to MindrianOS server
1709
+ async callServerTool(params) {
1710
+ console.log('[MindrianOS] callServerTool:', params);
1711
+ // In production: return await realApp.callServerTool(params);
1712
+ return { content: [{ type: 'text', text: '{}' }] };
1713
+ },
1714
+
1715
+ // Send intent to Larry (Shopify pattern)
1716
+ async updateContext(ctx) {
1717
+ console.log('[MindrianOS] Intent sent to Larry:', ctx);
1718
+ // In production: return await realApp.updateContext(ctx);
1719
+ }
1720
+ };
1721
+
1722
+ /* ============================================
1723
+ ACTION HANDLERS -- Shopify Intent Model
1724
+ UI elements send INTENTS, never execute directly
1725
+ ============================================ */
1726
+
1727
+ // Mullins cell drill-down
1728
+ document.querySelectorAll('.mullins-cell').forEach(cell => {
1729
+ const handler = () => {
1730
+ app.updateContext({
1731
+ type: 'user-intent',
1732
+ data: { action: 'drill-down', target: cell.dataset.cell }
1733
+ });
1734
+ };
1735
+ cell.addEventListener('click', handler);
1736
+ cell.addEventListener('keydown', (e) => {
1737
+ if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handler(); }
1738
+ });
1739
+ });
1740
+
1741
+ // Run methodology
1742
+ document.getElementById('btn-run-methodology').addEventListener('click', () => {
1743
+ app.updateContext({
1744
+ type: 'user-intent',
1745
+ data: { action: 'run-methodology', framework: 'financial-feasibility' }
1746
+ });
1747
+ });
1748
+
1749
+ // Cascade actions
1750
+ document.querySelectorAll('[data-cascade]').forEach(btn => {
1751
+ btn.addEventListener('click', () => {
1752
+ app.callServerTool({
1753
+ name: 'file_artifact',
1754
+ arguments: { action: btn.dataset.cascade, target: btn.dataset.alert }
1755
+ });
1756
+ });
1757
+ });
1758
+
1759
+ // Section card exploration
1760
+ document.querySelectorAll('.section-card').forEach(card => {
1761
+ const handler = () => {
1762
+ app.updateContext({
1763
+ type: 'user-intent',
1764
+ data: { action: 'explore-section', section: card.dataset.section }
1765
+ });
1766
+ };
1767
+ card.addEventListener('click', handler);
1768
+ card.addEventListener('keydown', (e) => {
1769
+ if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handler(); }
1770
+ });
1771
+ });
1772
+
1773
+ // Graph filter buttons
1774
+ document.querySelectorAll('.filter-btn').forEach(btn => {
1775
+ btn.addEventListener('click', () => {
1776
+ document.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active'));
1777
+ btn.classList.add('active');
1778
+ app.updateContext({
1779
+ type: 'user-intent',
1780
+ data: { action: 'filter-graph', edgeType: btn.dataset.filter }
1781
+ });
1782
+ });
1783
+ });
1784
+
1785
+ // Chain node exploration
1786
+ document.querySelectorAll('.chain-node').forEach(node => {
1787
+ const handler = () => {
1788
+ document.querySelectorAll('.chain-node').forEach(n => {
1789
+ n.classList.remove('active');
1790
+ n.removeAttribute('aria-current');
1791
+ });
1792
+ node.classList.add('active');
1793
+ node.setAttribute('aria-current', 'true');
1794
+ app.updateContext({
1795
+ type: 'user-intent',
1796
+ data: { action: 'explore-framework', framework: node.dataset.framework }
1797
+ });
1798
+ };
1799
+ node.addEventListener('click', handler);
1800
+ node.addEventListener('keydown', (e) => {
1801
+ if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handler(); }
1802
+ });
1803
+ });
1804
+
1805
+ // Claim card exploration
1806
+ document.querySelectorAll('.claim-card').forEach(card => {
1807
+ const handler = () => {
1808
+ app.updateContext({
1809
+ type: 'user-intent',
1810
+ data: { action: 'explore-claim', claim: card.dataset.claim }
1811
+ });
1812
+ };
1813
+ card.addEventListener('click', handler);
1814
+ card.addEventListener('keydown', (e) => {
1815
+ if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handler(); }
1816
+ });
1817
+ });
1818
+
1819
+ /* ============================================
1820
+ DATA RENDERING (called when tool result arrives)
1821
+ ============================================ */
1822
+
1823
+ function renderView(data) {
1824
+ // In production: parse data.view_type and render appropriate content
1825
+ // data.mullins -> update Mullins bullet charts
1826
+ // data.room_state -> update Command Center cards + alerts
1827
+ // data.graph -> render Cytoscape.js
1828
+ // data.chain -> render framework chain nodes
1829
+ // data.claims -> render assumption cards
1830
+ console.log('[MindrianOS] Rendering:', data);
1831
+ }
1832
+
1833
+ // Auto-connect on load
1834
+ app.connect();
1835
+
1836
+ // Initialize: ensure only Mullins view is shown
1837
+ switchView('mullins');
1838
+ </script>
1839
+
1840
+ </body>
1841
+ </html>