@mindrian_os/install 1.13.0-beta.16 → 1.13.0-beta.19

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 (219) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CHANGELOG.md +36 -0
  3. package/commands/act.md +1 -0
  4. package/commands/admin.md +1 -0
  5. package/commands/analyze-needs.md +2 -0
  6. package/commands/analyze-systems.md +2 -0
  7. package/commands/analyze-timing.md +2 -0
  8. package/commands/auto-explore.md +2 -0
  9. package/commands/beautiful-question.md +2 -0
  10. package/commands/brain-derive.md +2 -0
  11. package/commands/build-knowledge.md +2 -0
  12. package/commands/build-thesis.md +2 -0
  13. package/commands/causal.md +2 -0
  14. package/commands/challenge-assumptions.md +2 -0
  15. package/commands/compare-ventures.md +2 -0
  16. package/commands/dashboard.md +2 -1
  17. package/commands/deep-grade.md +2 -0
  18. package/commands/diagnose.md +21 -1
  19. package/commands/diagnostics.md +14 -3
  20. package/commands/doctor.md +4 -1
  21. package/commands/dogfood-flush.md +92 -0
  22. package/commands/dominant-designs.md +2 -0
  23. package/commands/explain-decision.md +2 -0
  24. package/commands/explore-domains.md +2 -0
  25. package/commands/explore-futures.md +2 -0
  26. package/commands/explore-trends.md +2 -0
  27. package/commands/export.md +1 -0
  28. package/commands/feynman-timeline-refresh.md +2 -0
  29. package/commands/file-meeting.md +4 -0
  30. package/commands/find-analogies.md +1 -0
  31. package/commands/find-bottlenecks.md +2 -0
  32. package/commands/find-connections.md +2 -0
  33. package/commands/funding.md +1 -0
  34. package/commands/grade.md +4 -0
  35. package/commands/graph.md +1 -0
  36. package/commands/hat-briefing.md +1 -0
  37. package/commands/heal.md +22 -170
  38. package/commands/help.md +54 -334
  39. package/commands/hmi-status.md +23 -144
  40. package/commands/jtbd.md +1 -0
  41. package/commands/leadership.md +2 -0
  42. package/commands/lean-canvas.md +2 -0
  43. package/commands/macro-trends.md +2 -0
  44. package/commands/map-unknowns.md +2 -0
  45. package/commands/memory.md +1 -0
  46. package/commands/models.md +1 -0
  47. package/commands/mos-reason.md +2 -0
  48. package/commands/mos.md +139 -0
  49. package/commands/mullins.md +2 -0
  50. package/commands/mva-brief.md +58 -0
  51. package/commands/mva-option.md +91 -0
  52. package/commands/new-project.md +4 -0
  53. package/commands/onboard.md +22 -7
  54. package/commands/operator.md +1 -0
  55. package/commands/opportunities.md +1 -0
  56. package/commands/organize.md +22 -469
  57. package/commands/persona.md +1 -0
  58. package/commands/pipeline.md +2 -0
  59. package/commands/present.md +1 -0
  60. package/commands/publish.md +2 -0
  61. package/commands/query.md +24 -102
  62. package/commands/radar.md +2 -0
  63. package/commands/reanalyze.md +1 -0
  64. package/commands/research.md +2 -0
  65. package/commands/room.md +2 -0
  66. package/commands/rooms.md +1 -0
  67. package/commands/root-cause.md +2 -0
  68. package/commands/rs-experts.md +1 -0
  69. package/commands/rs-explain.md +1 -0
  70. package/commands/rs-fetch.md +1 -0
  71. package/commands/rs-thesis.md +1 -0
  72. package/commands/scenario-plan.md +2 -0
  73. package/commands/scheduled-tasks.md +1 -0
  74. package/commands/score-innovation.md +2 -0
  75. package/commands/scout.md +1 -0
  76. package/commands/setup.md +2 -0
  77. package/commands/snapshot.md +2 -0
  78. package/commands/speakers.md +1 -0
  79. package/commands/splash.md +5 -2
  80. package/commands/status.md +1 -0
  81. package/commands/structure-argument.md +2 -0
  82. package/commands/suggest-next.md +2 -0
  83. package/commands/systems-thinking.md +2 -0
  84. package/commands/think-hats.md +2 -0
  85. package/commands/update.md +2 -0
  86. package/commands/user-needs.md +2 -0
  87. package/commands/validate.md +2 -0
  88. package/commands/value-proposition.md +2 -0
  89. package/commands/vault.md +2 -0
  90. package/commands/visualize.md +24 -29
  91. package/commands/whitespace.md +2 -1
  92. package/commands/wiki.md +1 -0
  93. package/hooks/hooks.json +31 -88
  94. package/lib/agents/auto-explore-agent.cjs +82 -0
  95. package/lib/agents/mva/brain-classic-traps.cjs +77 -0
  96. package/lib/agents/mva/brain-cross-domain.cjs +79 -0
  97. package/lib/agents/mva/brain-similar-ventures.cjs +93 -0
  98. package/lib/agents/mva/dashboard-graph-neighborhood.cjs +72 -0
  99. package/lib/agents/mva/index.cjs +42 -0
  100. package/lib/agents/mva/six-hats-red-black.cjs +137 -0
  101. package/lib/agents/mva/tavily-funding-scan.cjs +147 -0
  102. package/lib/agents/mva/test-all-six-agents.cjs +467 -0
  103. package/lib/conversation/operator.cjs +64 -0
  104. package/lib/conversation/operator.test.cjs +160 -0
  105. package/lib/core/breakthrough/canary.cjs +134 -0
  106. package/lib/core/breakthrough/canary.test.cjs +136 -0
  107. package/lib/core/breakthrough/detectors.cjs +359 -0
  108. package/lib/core/breakthrough/detectors.test.cjs +333 -0
  109. package/lib/core/breakthrough/ethics-fence.cjs +127 -0
  110. package/lib/core/breakthrough/ethics-fence.test.cjs +178 -0
  111. package/lib/core/breakthrough/resurfacing.cjs +150 -0
  112. package/lib/core/breakthrough/resurfacing.test.cjs +233 -0
  113. package/lib/core/breakthrough/review-queue.cjs +154 -0
  114. package/lib/core/breakthrough/review-queue.test.cjs +160 -0
  115. package/lib/core/breakthrough/scanner-d17-d18.test.cjs +229 -0
  116. package/lib/core/breakthrough/scanner.cjs +426 -0
  117. package/lib/core/breakthrough/scanner.test.cjs +267 -0
  118. package/lib/core/breakthrough/schema.cjs +164 -0
  119. package/lib/core/breakthrough/schema.test.cjs +256 -0
  120. package/lib/core/breakthrough/scoring.cjs +293 -0
  121. package/lib/core/breakthrough/scoring.test.cjs +423 -0
  122. package/lib/core/breakthrough/verb-dispatch.cjs +221 -0
  123. package/lib/core/breakthrough/verb-dispatch.test.cjs +185 -0
  124. package/lib/core/breakthrough/voice-scaffold.cjs +247 -0
  125. package/lib/core/breakthrough/voice-scaffold.test.cjs +251 -0
  126. package/lib/core/first-touch-version-stamper.cjs +113 -0
  127. package/lib/core/larry-thinness-acknowledgment.cjs +64 -0
  128. package/lib/core/larry-thinness-acknowledgment.test.cjs +97 -0
  129. package/lib/core/llm-name-suggester.cjs +194 -0
  130. package/lib/core/llm-name-suggester.test.cjs +132 -0
  131. package/lib/core/mva-agent-contract.cjs +170 -0
  132. package/lib/core/mva-agent-contract.test.cjs +169 -0
  133. package/lib/core/mva-budget.cjs +75 -0
  134. package/lib/core/mva-budget.test.cjs +68 -0
  135. package/lib/core/mva-classifier.cjs +370 -0
  136. package/lib/core/mva-classifier.test.cjs +248 -0
  137. package/lib/core/mva-deck-builder.cjs +452 -0
  138. package/lib/core/mva-deck-builder.test.cjs +287 -0
  139. package/lib/core/mva-detect.smoke.test.cjs +197 -0
  140. package/lib/core/mva-dispatcher.cjs +110 -0
  141. package/lib/core/mva-dispatcher.test.cjs +216 -0
  142. package/lib/core/mva-option-router.cjs +292 -0
  143. package/lib/core/mva-option-router.test.cjs +483 -0
  144. package/lib/core/mva-orchestrator.cjs +365 -0
  145. package/lib/core/mva-orchestrator.test.cjs +908 -0
  146. package/lib/core/mva-progressive-renderer.cjs +194 -0
  147. package/lib/core/mva-progressive-renderer.test.cjs +157 -0
  148. package/lib/core/mva-rule-linter.cjs +213 -0
  149. package/lib/core/mva-rule-linter.test.cjs +336 -0
  150. package/lib/core/mva-state.cjs +159 -0
  151. package/lib/core/mva-telemetry.cjs +58 -0
  152. package/lib/core/mva-telemetry.test.cjs +196 -0
  153. package/lib/core/mva-vercel-deploy.cjs +168 -0
  154. package/lib/core/mva-vercel-deploy.test.cjs +239 -0
  155. package/lib/core/navigation/dashboard-helpers.cjs +145 -0
  156. package/lib/core/navigation/edges.cjs +35 -0
  157. package/lib/core/navigation/memory-events.cjs +126 -0
  158. package/lib/core/navigation.cjs +11 -0
  159. package/lib/core/resolve-vercel-key.cjs +107 -0
  160. package/lib/core/resolve-vercel-key.test.cjs +137 -0
  161. package/lib/core/room-auto-create.cjs +318 -0
  162. package/lib/core/room-auto-create.test.cjs +198 -0
  163. package/lib/core/room-discard-cascade.cjs +225 -0
  164. package/lib/core/room-discard-cascade.test.cjs +135 -0
  165. package/lib/core/room-name-validator.cjs +132 -0
  166. package/lib/core/room-name-validator.test.cjs +156 -0
  167. package/lib/core/room-naming-selector.cjs +357 -0
  168. package/lib/core/room-naming-selector.test.cjs +277 -0
  169. package/lib/core/room-receipt-emit.cjs +63 -0
  170. package/lib/core/room-skeleton-scaffold.cjs +315 -0
  171. package/lib/core/room-skeleton-scaffold.test.cjs +291 -0
  172. package/lib/core/stale-copy-scanner.cjs +190 -0
  173. package/lib/core/state-aware-router.cjs +78 -0
  174. package/lib/core/telemetry/schema.cjs +168 -0
  175. package/lib/core/telemetry/schema.test.cjs +124 -0
  176. package/lib/core/telemetry/validator.cjs +197 -0
  177. package/lib/core/telemetry/validator.test.cjs +188 -0
  178. package/lib/core/telemetry/writer.cjs +141 -0
  179. package/lib/core/telemetry/writer.test.cjs +331 -0
  180. package/lib/core/terminal-capability.cjs +88 -0
  181. package/lib/core/venture-shape-nudge.cjs +163 -0
  182. package/lib/core/venture-shape-nudge.test.cjs +161 -0
  183. package/lib/core/visual-ops.cjs +70 -2
  184. package/lib/hmi/selector-dispatcher.cjs +90 -1
  185. package/lib/hmi/shape-f7-breakthrough-renderer.cjs +222 -0
  186. package/lib/hmi/shape-f7-breakthrough-renderer.test.cjs +233 -0
  187. package/lib/memory/body-shape-coverage.test.cjs +268 -0
  188. package/lib/memory/doctor-deprecation-surface.test.cjs +185 -0
  189. package/lib/memory/first-touch-version.test.cjs +198 -0
  190. package/lib/memory/help-coverage.test.cjs +108 -0
  191. package/lib/memory/help-renderer.test.cjs +145 -0
  192. package/lib/memory/palette-consistency.test.cjs +127 -0
  193. package/lib/memory/pending-tension-store.cjs +80 -0
  194. package/lib/memory/render-v2-disposition.test.cjs +199 -0
  195. package/lib/memory/run-feynman-tests.cjs +240 -0
  196. package/lib/memory/sessionstart-coordinator.test.cjs +446 -0
  197. package/lib/memory/skill-vs-code-drift.test.cjs +257 -0
  198. package/lib/memory/soft-alias.test.cjs +144 -0
  199. package/lib/memory/stale-copy-scanner.test.cjs +291 -0
  200. package/lib/memory/state-aware-router.test.cjs +90 -0
  201. package/lib/memory/statusline-two-row.test.cjs +338 -0
  202. package/lib/memory/terminal-capability.test.cjs +155 -0
  203. package/lib/render/ROOM.md +74 -22
  204. package/lib/sessionstart/budget-compressor.cjs +130 -0
  205. package/lib/sessionstart/contributor-interface.cjs +134 -0
  206. package/lib/sessionstart/contributor-isolator.cjs +128 -0
  207. package/lib/sessionstart/precedence-ladder.cjs +47 -0
  208. package/lib/statusline/governing-thought-truncator.cjs +45 -0
  209. package/lib/statusline/two-row-renderer.cjs +186 -0
  210. package/lib/statusline/version-resolver.cjs +81 -0
  211. package/package.json +1 -1
  212. package/references/visual/ROOM.md +55 -0
  213. package/references/visual/palette.json +54 -0
  214. package/skills/larry-personality/SKILL.md +34 -0
  215. package/skills/mva-pipeline/SKILL.md +129 -0
  216. package/skills/ui-system/SKILL.md +109 -1
  217. package/skills/ui-system/rules/dual-palette.md +156 -0
  218. package/skills/ui-system/rules/glyph-disambiguation.md +171 -0
  219. package/skills/ui-system/rules/shape-f-zero-and-six.md +169 -0
@@ -0,0 +1,81 @@
1
+ // lib/statusline/version-resolver.cjs -- Phase 121.5-03 Task 2 Step 2
2
+ //
3
+ // Resolves the running plugin version + checks whether an update is available.
4
+ // Pure, single-purpose: no rendering, no truncation. Returns:
5
+ // {
6
+ // current_version: string,
7
+ // update_available: boolean,
8
+ // update_available_version: string|null
9
+ // }
10
+ //
11
+ // SEED-007 (version-of-record) anchored here. Row 1 of the statusline reads
12
+ // from this resolver.
13
+ //
14
+ // Canon Part 8: LOCAL-only. Reads ~/.mindrian/update-check.json (LOCAL
15
+ // side-channel) + the plugin's own .claude-plugin/plugin.json. Zero network.
16
+
17
+ 'use strict';
18
+
19
+ const fs = require('fs');
20
+ const path = require('path');
21
+ const os = require('os');
22
+
23
+ function defaultCheckPath() {
24
+ return path.join(os.homedir(), '.mindrian', 'update-check.json');
25
+ }
26
+
27
+ function readUpdateCheck(checkPath) {
28
+ const p = checkPath || defaultCheckPath();
29
+ try {
30
+ return JSON.parse(fs.readFileSync(p, 'utf8'));
31
+ } catch (_) {
32
+ return null;
33
+ }
34
+ }
35
+
36
+ function readPluginVersion(pluginRoot) {
37
+ // Resolution chain (mirrors scripts/context-monitor readPluginVersion):
38
+ // 1. opts.pluginRoot (explicit override for tests)
39
+ // 2. __dirname/../../.claude-plugin/plugin.json (this file lives at lib/statusline/)
40
+ // 3. MINDRIAN_OS_ROOT env (when set by statusline-mos wrapper)
41
+ const candidates = [];
42
+ if (pluginRoot) candidates.push(pluginRoot);
43
+ candidates.push(path.resolve(__dirname, '..', '..'));
44
+ if (process.env.MINDRIAN_OS_ROOT) candidates.push(process.env.MINDRIAN_OS_ROOT);
45
+ for (const root of candidates) {
46
+ try {
47
+ const pj = path.join(root, '.claude-plugin', 'plugin.json');
48
+ if (fs.existsSync(pj)) {
49
+ const data = JSON.parse(fs.readFileSync(pj, 'utf8'));
50
+ if (data && typeof data.version === 'string' && data.version.length > 0) {
51
+ return data.version;
52
+ }
53
+ }
54
+ } catch (_) {}
55
+ }
56
+ return 'unknown';
57
+ }
58
+
59
+ function resolveVersion(opts) {
60
+ const o = opts || {};
61
+ const checkPath = o.checkPath || defaultCheckPath();
62
+ const check = readUpdateCheck(checkPath);
63
+ const current = readPluginVersion(o.pluginRoot);
64
+ const hasUpdate =
65
+ !!check &&
66
+ check.available === true &&
67
+ typeof check.available_version === 'string' &&
68
+ check.available_version.length > 0 &&
69
+ check.available_version !== current;
70
+ return {
71
+ current_version: current,
72
+ update_available: !!hasUpdate,
73
+ update_available_version: hasUpdate ? check.available_version : null,
74
+ };
75
+ }
76
+
77
+ module.exports = {
78
+ resolveVersion,
79
+ readUpdateCheck,
80
+ readPluginVersion,
81
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindrian_os/install",
3
- "version": "1.13.0-beta.16",
3
+ "version": "1.13.0-beta.19",
4
4
  "description": "Install MindrianOS into Claude Code with one command -- `npx @mindrian_os/install`. Ships the MindrianOS plugin (Larry + PWS methodology + Data Room) plus a setup/diagnostics CLI (install/doctor/update).",
5
5
  "scripts": {
6
6
  "mcp": "node bin/mindrian-mcp-server.cjs",
@@ -0,0 +1,55 @@
1
+ ---
2
+ type: visual_canon
3
+ purpose: De Stijl palette source-of-truth + glyph vocabulary canon for MindrianOS surfaces
4
+ canon_parts: [Part 3, Part 7, Part 10]
5
+ phase_origin: 121.5
6
+ plan_origin: 121.5-03
7
+ consumers:
8
+ - lib/core/visual-ops.cjs
9
+ - scripts/banner
10
+ - scripts/context-monitor
11
+ - templates/destijl-base.css
12
+ - templates/shared.css
13
+ - references/vault-kit/snippets/mindrian-destijl.css
14
+ - lib/render/render-v2.cjs
15
+ - lib/render/JTBD-PALETTES.md
16
+ ---
17
+
18
+ # references/visual/ -- the De Stijl canon
19
+
20
+ `palette.json` is the single source of truth for every De Stijl hex value rendered by MindrianOS. The CI tripwire `scripts/check-palette-consistency.cjs` asserts every consumer file matches the canonical hex set.
21
+
22
+ ## ODD 3 resolution (Phase 121.5, 2026-05-16)
23
+
24
+ Keep existing muted/earthy values. The external reference doc's brighter classic-Mondrian rebrand is a brand pivot, not an alignment; deferred to v1.14.0 if it ever comes. Canon Part 7 (consolidation, not rebrand).
25
+
26
+ ## Provenance
27
+
28
+ Hex values copied verbatim from `lib/core/visual-ops.cjs` `DS_HEX` -- the shipping source of truth at the time of Phase 121.5-03. The current palette has been in production across v1.10 and v1.13 betas without complaint; consolidation preserves it.
29
+
30
+ ## Future additions (deferred)
31
+
32
+ - `glyph-vocabulary.json` -- the SKILL.md section 3 12-glyph table as machine-readable. Surface-anchored meaning per ODD 4 (still open).
33
+ - `banner-templates.json` -- the ASCII banner geometry per surface (CLI / Desktop / Cowork).
34
+
35
+ Both deferred. Phase 121.5-03 ships `palette.json` only.
36
+
37
+ ## Deferred consumer audits
38
+
39
+ Two CSS consumers were found to use surface-specific hex variants that intentionally diverge from the core palette and require their own audit pass:
40
+
41
+ - `templates/shared.css` -- dashboard-styling lighter/darker variants (surface elevation tones; brighter accent reds for hover states). Captured in `palette.json` `deferred_consumers` for audit-trail purposes.
42
+ - `references/vault-kit/snippets/mindrian-destijl.css` -- Obsidian-vault legibility variants tuned for Obsidian's default dark theme. Distinct surface; deferred to the Obsidian-vault color audit.
43
+
44
+ These remain unchanged by Phase 121.5-03. The CI tripwire `scripts/check-palette-consistency.cjs` excludes them via the `derived_files` allowlist; the deferred entries record the audit-trail.
45
+
46
+ When a future plan consolidates either surface, move the entry from `deferred_consumers` to `derived_files` and reconcile the variants.
47
+
48
+ ## How to add a new hex
49
+
50
+ 1. Add the key + hex to the right tier in `palette.json` (`base` / `palette_a_discovery` / `palette_b_build` / `extended`).
51
+ 2. Add the consumer file to `derived_files` if it is not already listed.
52
+ 3. Run `node scripts/check-palette-consistency.cjs` to confirm the CI tripwire passes.
53
+ 4. Update the consumers to derive the value from `palette.json` (not hardcoded).
54
+
55
+ Hex values that drift from `palette.json` will fail the CI check.
@@ -0,0 +1,54 @@
1
+ {
2
+ "version": 1,
3
+ "canon_parts": ["Part 3", "Part 7", "Part 10"],
4
+ "provenance": "Sourced verbatim from lib/core/visual-ops.cjs DS_HEX (the shipping source of truth as of Phase 121.5). ODD 3 resolution (2026-05-16): keep existing muted/earthy values; brighter classic-Mondrian rebrand deferred to v1.14.0 if it ever comes. See .planning/phases/121.5-terminal-coherence-capstone/121.5-CONTEXT.md item 7. Plan 121.5-03.",
5
+ "base": {
6
+ "mondrian_red": "#A63D2F",
7
+ "mondrian_blue": "#1E3A6E",
8
+ "mondrian_yellow": "#C8A43C",
9
+ "mondrian_black": "#0D0D0D",
10
+ "mondrian_white": "#F5F0E8",
11
+ "cream": "#F5F0E8",
12
+ "gray_meta": "#A09A90",
13
+ "amethyst": "#6B4E8B",
14
+ "success_green": "#2D6B4A"
15
+ },
16
+ "palette_a_discovery": {
17
+ "context_states": ["EXPLORE_CAPTURE", "JUST_TALK"],
18
+ "muted_red": "#A63D2F",
19
+ "muted_green": "#2D6B4A",
20
+ "teal_accent": "#2A6B5E"
21
+ },
22
+ "palette_b_build": {
23
+ "context_states": ["METHODOLOGY", "DECISION_GATE", "BUILD_ROOM"],
24
+ "saturated_red": "#A63D2F",
25
+ "saturated_blue": "#1E3A6E",
26
+ "saturated_yellow": "#C8A43C"
27
+ },
28
+ "extended": {
29
+ "sienna": "#B5602A",
30
+ "bg": "#0D0D0D",
31
+ "surface": "#1A1A1A",
32
+ "elevated": "#2A2A2A",
33
+ "gray": "#5C5A56"
34
+ },
35
+ "ansi_5_color": {
36
+ "green": "32",
37
+ "cyan": "36",
38
+ "yellow": "33",
39
+ "red": "31",
40
+ "gray": "90"
41
+ },
42
+ "derived_files": [
43
+ {"path": "lib/core/visual-ops.cjs", "via": "require + DS_HEX = palette.base + palette_a + palette_b + extended"},
44
+ {"path": "scripts/banner", "via": "ANSI codes inline; hex documented in trailing comments + matched against palette.json"},
45
+ {"path": "templates/destijl-base.css", "via": "CSS variables :root { --ds-red: ... } match palette.json values"},
46
+ {"path": "lib/render/JTBD-PALETTES.md", "via": "documentation cites palette.json hex values"}
47
+ ],
48
+ "deferred_consumers": [
49
+ {"path": "templates/shared.css", "reason": "Per-surface lighter/darker variants for dashboard styling (e.g. #2d2d2d surface elevation, #c95a4a lighter red). Distinct semantic palette intentionally diverges; consolidation deferred to a future plan that audits dashboard color tokens against palette.json + variant generation rules."},
50
+ {"path": "references/vault-kit/snippets/mindrian-destijl.css", "reason": "Vault-kit Obsidian snippet uses brighter classic-Mondrian variants (e.g. #c83d2f, #2b5ba5) for vault legibility in Obsidian's default dark theme. Distinct surface; covered when Obsidian-vault color audit lands."},
51
+ {"path": "templates/shared.css", "scope_note": "Captured as deferred so the audit trail records that shared.css palette divergence was SEEN by Phase 121.5-03, not silently passed."},
52
+ {"path": "lib/render/render-v2.cjs", "reason": "Future consumer once wired in Plan 121.5-05 (render-v2 disposition); not yet routing through palette.json."}
53
+ ]
54
+ }
@@ -211,6 +211,40 @@ Every 3-5 turns, surface ONE unused command framed as JTBD:
211
211
 
212
212
  Causal directives: `references/brain/causal-directives.md`
213
213
 
214
+ ## Breakthrough Voice Scaffold (Phase 120 D-17)
215
+
216
+ When the breakthrough scanner surfaces a pattern via F.7, the voice line MUST satisfy all four rules. The auditor (`lib/core/breakthrough/voice-scaffold.cjs::auditVoiceLine`) enforces this; D-17-violating lines are replaced with the structural default before reaching the surface.
217
+
218
+ ### The 4 Rules
219
+
220
+ 1. **Evidence requirement.** Cite the artifact ids OR graph edges that triggered detection. Patterns: `(artifacts art:1, art:2)`, `[[artifact-name]]`, `(see edges X, Y)`. NO "you have been doing great work" without specific citation.
221
+ 2. **Mechanism clause.** Include the `by Y` action that caused it. NO inferring user intent; only naming user action.
222
+ 3. **Time anchor.** Specific window: "in the last 8 hours", "this week", "since Tuesday". NO vague "lately" or "recently".
223
+ 4. **No unbacked superlatives.** Words like `breakthrough`, `biggest`, `first`, `unprecedented`, `major`, `massive` MUST NOT appear unless adjacent to numeric backing (e.g. "the highest differential score (0.78) in this room's history"). Frequency words `consistent`, `repeated`, `always` MUST be accompanied by a count.
224
+
225
+ ### Worked Example
226
+
227
+ GOOD: "You're seeing a convergence on operator-state machines (artifacts art:1, art:2, art:3, art:4) -- by uploading the four notes on Mode A and Mode B -- in the last two days."
228
+
229
+ BAD: "You're having a major breakthrough in your thinking lately." (Violates rule 1: no evidence cite. Violates rule 2: no mechanism. Violates rule 3: "lately" is not a time anchor. Violates rule 4: "major" + "breakthrough" with no numeric backing.)
230
+
231
+ The bad line returns `{ok: false, violations: ['evidence_requirement', 'mechanism_clause', 'time_anchor', 'no_unbacked_superlatives']}` from `auditVoiceLine`.
232
+
233
+ ### Why these rules
234
+
235
+ Per Canon Part 10 sub-claim 5: the math IS the surface. The voice is the math's translation to honest prose. Without the 4 rules, the system drifts toward engagement-optimizer territory (vague pseudo-recognition that feels good but is not real). The auditor IS the structural enforcement of D-20 (every breakthrough Cypher-provable from graph state alone).
236
+
237
+ ### Auditor failure modes
238
+
239
+ When `auditVoiceLine(line)` returns `{ok: false, violations: [...]}`, the violations array names the rule(s) that failed:
240
+
241
+ - `evidence_requirement` -- no `(artifacts ...)`, `[[...]]`, or `(see edges ...)` cite
242
+ - `mechanism_clause` -- no `by Y` user-action phrase
243
+ - `time_anchor` -- no `in the last N hours/days`, `this week`, `today`, `since YYYY-MM-DD`, etc.
244
+ - `no_unbacked_superlatives` -- forbidden superlative or frequency word without numeric backing
245
+
246
+ The scanner replaces failed-audit lines with the structural default (composer called with `roomState=null`), which is auditor-safe by construction.
247
+
214
248
  ## References
215
249
 
216
250
  - Mode transitions: `mode-engine.md`
@@ -0,0 +1,129 @@
1
+ ---
2
+ name: mva-pipeline
3
+ description: Auto-activates when UserPromptSubmit detection classifies the user's prompt as a venture sentence; relays the 30-second MVA brief in Larry's voice
4
+ auto-activate: state-file
5
+ state-file: ~/.mindrian/mva/<session-id>.json
6
+ state-condition: pending && !running
7
+ interactive_first_reward: instant_brief
8
+ canon_parts: [Part 2, Part 8, Part 10]
9
+ ---
10
+
11
+ # The 30-second MVA skill
12
+
13
+ ## When this activates
14
+
15
+ When Plan 118-00's UserPromptSubmit detection writes a pending state with
16
+ `pipeline_status: 'pending'` (or `hebrew_refusal: true`), this skill fires on
17
+ the NEXT model turn. The skill is the bridge between Plan 118-00's classifier
18
+ and Plan 118-03's orchestrator: it makes Larry the GUIDED narrator of the
19
+ brief without baking the orchestrator into Claude Code's hook protocol.
20
+
21
+ ## What to do
22
+
23
+ 1. Run `/mos:mva-brief` (or invoke `node scripts/mva-run.cjs` via Bash directly).
24
+ 2. Relay the stdout to the user VERBATIM, in your normal Larry voice (no extra
25
+ framing). The renderer already speaks in Larry's GUIDED voice; double-voicing
26
+ breaks the pedagogical contract.
27
+ 3. Wait for the user's option selection (1, 2, 3, or free-text).
28
+ 4. Route per the footer behavior:
29
+ - 1 -> stay in JUST_TALK; the brief stays visible; user can ask follow-ups
30
+ about any cell ("tell me more about the Honeydue case", "what was the
31
+ Gottman analogy?", etc.)
32
+ - 2 -> invoke /mos:new-project (Phase 119 wrapper; in v1.13.0 this surfaces
33
+ a stub message that the full room-build flow lands in beta.18)
34
+ - 3 -> invoke /mos:challenge-assumptions against the brief
35
+
36
+ ## What NOT to do (per feedback_larry_pedagogical_guided_first.md)
37
+
38
+ - Do NOT add commentary or "I noticed..." preamble before the rendered output.
39
+ The renderer already opens with "Scanning for precedents..." in Larry's
40
+ GUIDED voice.
41
+ - Do NOT interpret findings autonomously ("This means you should..."). The
42
+ rendered output IS GUIDED -- it asks the user to think; the renderer
43
+ surfaces what's in the graph and lets the navigator chew on it.
44
+ - Do NOT skip the 3-option footer. Even if all agents failed, the
45
+ sharp-question fallback substitutes for the footer (per binding decision B7);
46
+ the renderer handles this -- you just relay verbatim.
47
+ - Do NOT pre-pick an option. The user picks. That's the decision gate.
48
+
49
+ ## Canon parts implemented
50
+
51
+ - Part 2 (team around navigator -- 6 agents as a parallel team, with the skill
52
+ being the surface Larry uses to relay the team's output)
53
+ - Part 8 (boundary -- the agents send ONLY generic handles to Brain and
54
+ Tavily; the renderer + skill never re-introduce user content)
55
+ - Part 10 sub-claim 3 (room as receipt -- the brief IS the reward delivered
56
+ BEFORE the user is asked to invest in setting up a room; option 2 is the
57
+ ask-for-investment that comes AFTER the reward, per Hooked sequencing)
58
+
59
+ ## State file contract
60
+
61
+ Read from `~/.mindrian/mva/<session-id>.json` (the Plan 118-00 wire):
62
+
63
+ ```
64
+ {
65
+ "sentence_sha256": "<64-hex>", // NEVER the raw sentence
66
+ "classified_at": <epoch_ms>,
67
+ "classifier_source": "heuristic" | "heuristic_fallback" | "haiku-4-5",
68
+ "classifier_confidence": "high" | "medium" | "low",
69
+ "locale": "en" | "he",
70
+ "hebrew_refusal": true, // optional, set on LD1 short-circuit
71
+ "pipeline_status": "pending" | "running" | "complete"
72
+ }
73
+ ```
74
+
75
+ On `hebrew_refusal:true`, the orchestrator renders the bilingual refusal block
76
+ and DOES NOT fire the dispatcher (per LD1 in 118-CONTEXT.md).
77
+
78
+ ## Routing the 3-option footer (after the brief renders)
79
+
80
+ Once `/mos:mva-brief` (or the orchestrator) has rendered the brief to the user,
81
+ the user's next message is most likely an option selection. Recognition rule:
82
+
83
+ - User types exactly `1`, `2`, or `3` -> invoke `/mos:mva-option <N>` (no sha8
84
+ argument needed; the command auto-resolves via `resolveCurrentSha8()`)
85
+ - User types `/mos:mva-option N` explicitly -> invoke `/mos:mva-option <N>`
86
+ (sha8 still optional; auto-resolved when omitted)
87
+ - User types anything else -> handle as a normal conversation turn (do NOT
88
+ route through `mva-option`)
89
+
90
+ The sha8 argument is OPTIONAL because the router auto-discovers the most
91
+ recent brief via `resolveCurrentSha8()` -> `~/.mindrian/mva/state.json` (the
92
+ manifest written by Plan 118-03's orchestrator after `mva_brief_rendered`).
93
+
94
+ ### Per-option behavior
95
+
96
+ Option 1 -- "Just tell me what's new" (stay in tell-me mode):
97
+ - Acknowledgment: "Keeping the brief visible. Ask me anything about what you just saw."
98
+ - Operator: transitions to `JUST_TALK`
99
+ - Brief stays in scrollback; follow-up questions about any of the 6 cells are welcome
100
+
101
+ Option 2 -- "Build a room around this" (invest, deferred):
102
+ - Show the stub message verbatim from `STUB_MESSAGE_119`:
103
+ "Building a room around this is the next layer; shipping in beta.18 (Phase 119). For now, press option 1 to keep this brief visible, or option 3 to go deeper."
104
+ - Operator: no transition (option 2 is stubbed for v1.13.0)
105
+ - In v1.13.0-beta.18 (Phase 119), this routes to `/mos:new-project --from-brief <sha8>`
106
+
107
+ Option 3 -- "Challenge me -- Devil's Advocate" (go deeper):
108
+ - Bridge text: "Going deeper. Pulling the brief into a Devil's Advocate pass."
109
+ - Operator: transitions to `METHODOLOGY`
110
+ - Invoke: `/mos:challenge-assumptions --from-brief <sha8>`
111
+
112
+ ### Edge cases
113
+
114
+ - Brief data expired (side-file missing): tell the user the brief expired and
115
+ offer to re-run by typing their venture sentence again.
116
+ - Brief is still rendering (`mva_brief_rendered` event not yet emitted): hold
117
+ the option, tell the user "Brief is still rendering -- options will activate
118
+ when it completes".
119
+ - No `state.json` exists (fresh install or Hebrew refusal path): tell the user
120
+ "No recent brief found. Type your venture sentence to fire the pipeline."
121
+ - Invalid option (`4`, `99`, etc.): treat as free-text and route normally.
122
+
123
+ ### Do NOT
124
+
125
+ - Do NOT autonomously pick an option for the user.
126
+ - Do NOT pre-summarize what option 2 "would do" -- the stub message says it.
127
+ - Do NOT add em-dashes to any rendered option text -- use `--` only.
128
+ - Do NOT invoke `/mos:new-project` for option 2 in v1.13.0 -- that wiring
129
+ lands in Phase 119 (beta.18).
@@ -35,7 +35,9 @@ Every output has exactly 4 zones in fixed order. No reordering. No invention.
35
35
 
36
36
  **Density:** >30 lines: compact header, max 2 signals. <10 lines: no padding.
37
37
 
38
- ## 2. Five Body Shapes
38
+ ## 2. Body Shapes
39
+
40
+ > This section documents the current Shape F sub-shape catalog as shipped through Phase 88.2. Today's seven sub-shapes (F.0 through F.6) are the shipped vocabulary as of Phase 121.5; additive expansion is reserved for future lens-aware variants (e.g. v1.14.0 dual-graph work). Treat the catalog as the current canon, not a closed terminal set.
39
41
 
40
42
  ### Shape A: Mondrian Board
41
43
  **Used by:** `/mos:status`, `/mos:diagnose`, `/mos:radar`, `/mos:admin`
@@ -73,6 +75,28 @@ All five sub-shapes share a common envelope:
73
75
 
74
76
  The ten canonical verbs (from canon Part 3) are: Run Methodology / Reformulate / Spawn Sub-Agent / Navigate Graph / Devil's Advocate / Scenario Plan / Synthesize / Bank Opportunity / Defer / Free-Text. Each sub-shape below draws from this vocabulary.
75
77
 
78
+ #### Shape F.0 - Mini Decision Gate
79
+
80
+ Purpose: Tiny binary or trinary decision gate. Lighter than F.1 (which carries 3-5 options); F.0 is the minimum-viable gate when the navigator only needs a yes/no/defer call before the larger selector slate fires.
81
+
82
+ When to use: A surface needs a confirmation BEFORE producing the larger F.1 selector. Most common: accept / reject / defer a recommendation before the full Next Move slate runs. Common pair: F.0 (accept this recommendation?) -> F.1 (now choose next move).
83
+
84
+ Header format:
85
+ ```
86
+ [filled-square] [CONTEXT] - MINI GATE - decision gate
87
+ [right-triangle-filled] {short binary or trinary question}
88
+ ```
89
+
90
+ Options: EXACTLY 3 verbs as shipped (lib/hmi/shape-f0-renderer.cjs): Approve / Reject / Defer. No Free-Text slot in F.0 -- the Reject path captures the reason as a REJECTED_BECAUSE typed edge property (Canon Part 4: rejection is data), so the vocabulary stays closed without losing free-form intent. F.0 ALWAYS produces a typed edge; there is no silent dismiss path.
91
+
92
+ Verb constraints: F.0 collapses to one of the 10 canonical verbs upon selection. Approve -> Run Methodology (or whatever the recommendation called for). Reject -> captured-reason edge (REJECTED_BECAUSE; eventType `selector_rejection_captured`). Defer -> Defer (queue for milestone audit).
93
+
94
+ Keyboard: up-arrow / down-arrow (or J / K) to navigate, Enter to select, `?` to inspect, Esc to cancel. No RECOMMENDED marker is rendered in F.0 (the shape itself is the recommendation surface; marking one option would double-cue).
95
+
96
+ State-update hook: append to STATE.md Decisions section with the chosen verb + a tiny one-line context snapshot (F.0 gates are lightweight; do NOT bloat Decisions with full context). A typed edge `(navigator) -[CHOSE_MINI {verb}]-> (recommendation-node)` lands in the local graph; Reject additionally writes REJECTED_BECAUSE with {reason, rejected_at, parent_decision_id}.
97
+
98
+ Shipped in: Phase 88.2 (uiux-selector-block, Plan 88.2-05).
99
+
76
100
  #### Shape F.1 - Next Move
77
101
 
78
102
  Purpose: Default selector after any discuss chunk. The most-used shape.
@@ -178,6 +202,34 @@ Keyboard: up-arrow / down-arrow (or J / K) to navigate, Enter to select, `?` to
178
202
 
179
203
  State-update hook: append to STATE.md Decisions section naming the resolved branch and the resolution verb. A typed edge is added: (branch-root) -[RESOLVED {verb}]-> (target). Parked branches additionally create a milestone-audit TodoWrite row.
180
204
 
205
+ #### Shape F.6 - Plan Review Round
206
+
207
+ Purpose: Plan Mode wrap. When the navigator has been in a planning surface (e.g. after a methodology session that produced a plan), F.6 closes the round with an explicit Review verb selection BEFORE returning to Plan vs Build mode. F.6 is also the JTBD-aware variant of Shape F that the dispatcher routes to when a JTBD signal is set; the umbrella `F` branch in selector-dispatcher.cjs picks F.6 when jtbd is non-null and F.1 otherwise (lib/hmi/selector-dispatcher.cjs).
208
+
209
+ When to use: End of a plan-producing methodology session, OR any Shape F surface where a non-null JTBD is in play and the renderer should produce a JTBD-aware Next Move slate. The navigator must explicitly review the plan (or defer review, or replan from scratch) before the system promotes the plan into the Decisions log.
210
+
211
+ Header format:
212
+ ```
213
+ [filled-square] [CONTEXT] - PLAN REVIEW - decision gate
214
+ [down-triangle] LOCAL / BRAIN / SIGNAL
215
+ [right-triangle-filled] Review this plan:
216
+ ```
217
+
218
+ Options: 3-5. Typical slate:
219
+ Approve plan
220
+ Revise plan
221
+ Replan from scratch
222
+ Defer review
223
+ Free-Text
224
+
225
+ Verb constraints: Approve plan -> Synthesize (the plan becomes a confirmed artifact). Revise plan -> Reformulate (re-runs the planning verb with edits). Replan -> Reformulate from a fresh seed. Defer review -> Defer. Free-Text -> Free-Text. JTBD-aware variants source their verbs from `lib/hmi/jtbd-taxonomy.json` `next_move_verbs`; falls through to F.1 if the JTBD taxonomy entry is missing or the dispatcher receives a null JTBD.
226
+
227
+ Keyboard: standard F-family keyboard (inherits from F.1 per Phase 101-01 D-01).
228
+
229
+ State-update hook: on Approve, the plan is promoted from `review_status: proposed` to `review_status: confirmed` (Canon Part 9 truth-state machine). On Revise/Replan, the original plan stays `proposed` and a new revision edge is created. On Defer, a milestone-audit TodoWrite row queues the review. Plan-review variant additionally writes REVIEWED typed edges per question position with {round_id, position, latency_ms, was_decoy, response, confidence_self_report} (lib/hmi/shape-f6-plan-review-renderer.cjs).
230
+
231
+ Shipped in: Phase 88.2 (uiux-selector-block, Plan 88.2-06 plan-review variant) + Phase 101-01 (JTBD-aware Next Move variant).
232
+
181
233
  ## 3. Symbol Vocabulary
182
234
 
183
235
  12 glyphs. One meaning each. No overloading.
@@ -201,6 +253,27 @@ State-update hook: append to STATE.md Decisions section naming the resolved bran
201
253
 
202
254
  Carve-out (2026-04-14, user directive): the Claude Code statusline rendered by `scripts/context-monitor` is **excepted** from this rule. The statusline is a passive signal surface rendered by the host terminal, not a MindrianOS command output body, and the user has authorized emoji use there specifically. Every other surface (slash-command output, artifact generation, MINTO.md files, CHANGELOG entries, reports, dashboard HTML bodies, PDF exports, printed logs) must continue to honor the no-emoji rule without exception. If you are reading this and about to add emoji to any surface other than `scripts/context-monitor`, stop.
203
255
 
256
+ ### ODD 4 resolution (2026-05-16): the 🎯 overload + the "JTBD" word collision
257
+
258
+ Two known vocabulary collisions exist in v1.13.0 that we explicitly DOCUMENT rather than renumber or rename (the renumbering cost is too high for a closing milestone; see Phase 121.5 CONTEXT.md ODD 4). Both are RESOLVED BY POSITION-ANCHORED CONTEXT, mirroring the no-emoji + statusline carve-out pattern above:
259
+
260
+ 1. The 🎯 glyph means three things, each disambiguated by SURFACE:
261
+ - In the statusline Row 2 (`scripts/context-monitor`), 🎯 prefixes the active JTBD label -- meaning "what job are you in right now."
262
+ - In `/mos:jtbd` command output and JTBD broadcast banners, 🎯 prefixes a JTBD recommendation -- meaning "this is the job we're proposing."
263
+ - In `lib/core/visual-ops.cjs` EXPLORATION_LABELS, 🎯 is the stage emoji for `problem-definition` -- meaning "where the wicked navigator starts."
264
+
265
+ The three meanings never collide on the same surface at the same time. Reader disambiguation: where is the 🎯? (statusline row 2 / command output / EXPLORATION_LABELS render path).
266
+
267
+ 2. The word "JTBD" names two unrelated systems:
268
+ - Phase 37 nudge templates (`lib/hmi/build-jtbd-nudges` -- bash, prompt-engineering style).
269
+ - Phase 100 typed engine (`lib/hmi/jtbd-taxonomy.json` -- 13 JTBDs with cues / methodology hooks / next_move_verbs / completion patterns -- the AUTHORITATIVE system).
270
+
271
+ When SKILL.md, the canon, or any user-facing surface says "JTBD" without qualification, it means Phase 100 typed engine. The Phase 37 nudges are an internal prompt-engineering layer beneath the engine; user-facing surfaces never name them directly.
272
+
273
+ This is the SAME shape of carve-out as the no-emoji rule + statusline exception. The pattern is: a global rule with a precisely-named exception, position-anchored. Future v1.14.0 may renumber the glyphs or rename "JTBD"; for v1.13.0 final we mark the seam, not move it.
274
+
275
+ See `skills/ui-system/rules/glyph-disambiguation.md` for the full rule + the v1.14.0 cleanup proposal.
276
+
204
277
  ## 4. Color Contract
205
278
 
206
279
  5 ANSI colors with fixed meaning. Color is NEVER decoration.
@@ -215,6 +288,31 @@ Carve-out (2026-04-14, user directive): the Claude Code statusline rendered by `
215
288
 
216
289
  Bold for emphasis. Default/white for content. Never combine colors on one token. Red = errors only (warnings = yellow).
217
290
 
291
+ ### Dual De Stijl palette (Phase 102 D-06b)
292
+
293
+ The 5-color CLI contract above is the BASE palette. Phase 102 (context-aware rendering) added a SECOND palette tier: the Mondrian primaries palette, which kicks in for FULL-COLOR surfaces (HTML exports, wiki/dashboard, presentation decks, Cytoscape graphs) where the 5-ANSI CLI palette is the wrong semantic match.
294
+
295
+ The dual-palette rule (Phase 102 D-06b) is: pick the palette by SURFACE, not by JTBD. The same JTBD can render red on CLI (semantic) and blue on HTML (Mondrian) and that is correct.
296
+
297
+ Two palettes:
298
+
299
+ - **CLI semantic palette** (THIS section's 5-color contract: red / yellow / cyan / green / gray). Used for every `/mos:*` terminal output. Color carries semantic meaning at the terminal (red = error, etc.). Applied as a single colored Zone 1 left-rail accent at the start of the header (`lib/render/render-v2.cjs` `JTBD_CLI_COLOR` map), TTY-gated via `process.stdout.isTTY` so non-TTY captures stay byte-clean.
300
+
301
+ - **Mondrian HTML palette** (red / yellow / blue / black / white). Used by HTML-emitting downstream phases ONLY (Phase 19 wiki-dashboard, Phase 25 data-room-export-v2, Phase 30 presentation-generator). Visual identity discipline: rectilinear grids, primary blocks, large white space. Mondrian shapes vocabulary extends the 12-glyph CLI set with `circle (●)` on HTML surfaces only.
302
+
303
+ Surface routing:
304
+
305
+ | Surface | Palette | Why |
306
+ |---------|---------|-----|
307
+ | CLI / TUI | 5-color semantic | Color carries semantic meaning at the terminal |
308
+ | HTML dashboard / wiki / presentation / Cytoscape | Mondrian primaries | Visual identity discipline; De Stijl rectilinear grid |
309
+
310
+ Compact mode (>80% token budget) drops the Zone 1 left-rail accent. Semantic body colors stay.
311
+
312
+ Source-of-truth definitions: `lib/render/JTBD-PALETTES.md` (the Phase 102 canonical mapping). See `skills/ui-system/rules/dual-palette.md` for the full rule, hex values, and per-JTBD mapping table.
313
+
314
+ The CANONICAL De Stijl hex values used across `scripts/banner`, `lib/core/visual-ops.cjs` (`DS_HEX`), `templates/destijl-base.css`, `templates/shared.css`, and `references/vault-kit/snippets/mindrian-destijl.css` will consolidate to `references/visual/palette.json` per Sub-plan D of Phase 121.5. This SKILL.md surface treats `palette.json` as the canonical reference once it lands.
315
+
218
316
  ## 5. Session Start Contract
219
317
 
220
318
  Three variants based on room state:
@@ -275,3 +373,13 @@ HELP: 1 line + 3 examples, grouped by flow
275
373
  WIDTH: 80 cols default, never expand
276
374
  NO EMOJI: Ever.
277
375
  ```
376
+
377
+ ## 11. Cross-Reference to Canon
378
+
379
+ This Ruling System implements two canon parts:
380
+
381
+ - **Canon Part 3 (Tri-Context Decision Gate)** -- every Shape F surface IS the Part 3 Decision Gate at terminal scale. The 10 canonical verbs in Canon Part 3 are the vocabulary Shape F selectors draw from. The five-shape rule -- one selector family per decision moment, no command invents its own selector -- enforces Part 3 at the UI layer. See `docs/MINDRIAN-CANON.md` Part 3.
382
+
383
+ - **Canon Part 10 (Conversation as Product)** -- this Ruling System enforces the property that "the terminal IS the product surface." Every glyph, every zone, every selector encodes "you are navigating a wicked problem with Larry." If the terminal is incoherent, Canon Part 10 isn't demonstrated. Phase 121.5 (terminal-coherence-capstone) is the consolidation pass that closed the gap between this ruling system and shipped code. See `docs/MINDRIAN-CANON.md` Part 10.
384
+
385
+ Updates to this ruling system MUST update `docs/CANON-PHASE-MAP.md` in the same commit -- see Canon Part 6 (Product-as-Venture / dog-fooding mandate). The ruling system is dog-food: the product we ship for navigators is built using the product we ship for navigators.