@mindrian_os/install 1.13.0-beta.17 → 1.13.0-beta.21

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 (199) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.mcp.json +6 -1
  3. package/CHANGELOG.md +31 -0
  4. package/README.md +51 -56
  5. package/bin/mindrian-brain-mcp-client.cjs +152 -0
  6. package/commands/act.md +1 -0
  7. package/commands/admin.md +1 -0
  8. package/commands/analyze-needs.md +2 -0
  9. package/commands/analyze-systems.md +2 -0
  10. package/commands/analyze-timing.md +2 -0
  11. package/commands/auto-explore.md +2 -0
  12. package/commands/beautiful-question.md +2 -0
  13. package/commands/brain-derive.md +2 -0
  14. package/commands/build-knowledge.md +2 -0
  15. package/commands/build-thesis.md +2 -0
  16. package/commands/causal.md +2 -0
  17. package/commands/challenge-assumptions.md +2 -0
  18. package/commands/compare-ventures.md +2 -0
  19. package/commands/dashboard.md +2 -1
  20. package/commands/deep-grade.md +2 -0
  21. package/commands/diagnose.md +21 -1
  22. package/commands/diagnostics.md +14 -3
  23. package/commands/doctor.md +6 -2
  24. package/commands/dogfood-flush.md +92 -0
  25. package/commands/dominant-designs.md +2 -0
  26. package/commands/explain-decision.md +2 -0
  27. package/commands/explore-domains.md +2 -0
  28. package/commands/explore-futures.md +2 -0
  29. package/commands/explore-trends.md +2 -0
  30. package/commands/export.md +1 -0
  31. package/commands/feynman-timeline-refresh.md +2 -0
  32. package/commands/file-meeting.md +2 -0
  33. package/commands/find-analogies.md +1 -0
  34. package/commands/find-bottlenecks.md +2 -0
  35. package/commands/find-connections.md +2 -0
  36. package/commands/funding.md +1 -0
  37. package/commands/grade.md +2 -0
  38. package/commands/graph.md +1 -0
  39. package/commands/hat-briefing.md +1 -0
  40. package/commands/heal.md +22 -170
  41. package/commands/help.md +54 -334
  42. package/commands/hmi-status.md +23 -144
  43. package/commands/jtbd.md +1 -0
  44. package/commands/leadership.md +2 -0
  45. package/commands/lean-canvas.md +2 -0
  46. package/commands/macro-trends.md +2 -0
  47. package/commands/map-unknowns.md +2 -0
  48. package/commands/memory.md +1 -0
  49. package/commands/models.md +1 -0
  50. package/commands/mos-reason.md +2 -0
  51. package/commands/mos.md +139 -0
  52. package/commands/mullins.md +2 -0
  53. package/commands/mva-brief.md +2 -0
  54. package/commands/mva-option.md +2 -0
  55. package/commands/new-project.md +2 -0
  56. package/commands/onboard.md +20 -7
  57. package/commands/operator.md +1 -0
  58. package/commands/opportunities.md +1 -0
  59. package/commands/organize.md +22 -469
  60. package/commands/persona.md +1 -0
  61. package/commands/pipeline.md +2 -0
  62. package/commands/present.md +1 -0
  63. package/commands/publish.md +2 -0
  64. package/commands/query.md +24 -102
  65. package/commands/radar.md +2 -0
  66. package/commands/reanalyze.md +1 -0
  67. package/commands/research.md +2 -0
  68. package/commands/room.md +2 -0
  69. package/commands/rooms.md +1 -0
  70. package/commands/root-cause.md +2 -0
  71. package/commands/rs-experts.md +1 -0
  72. package/commands/rs-explain.md +1 -0
  73. package/commands/rs-fetch.md +1 -0
  74. package/commands/rs-thesis.md +1 -0
  75. package/commands/scenario-plan.md +2 -0
  76. package/commands/scheduled-tasks.md +1 -0
  77. package/commands/score-innovation.md +2 -0
  78. package/commands/scout.md +1 -0
  79. package/commands/setup.md +2 -0
  80. package/commands/snapshot.md +2 -0
  81. package/commands/speakers.md +1 -0
  82. package/commands/splash.md +5 -2
  83. package/commands/status.md +1 -0
  84. package/commands/structure-argument.md +2 -0
  85. package/commands/suggest-next.md +2 -0
  86. package/commands/systems-thinking.md +2 -0
  87. package/commands/think-hats.md +2 -0
  88. package/commands/update.md +2 -0
  89. package/commands/user-needs.md +2 -0
  90. package/commands/validate.md +2 -0
  91. package/commands/value-proposition.md +2 -0
  92. package/commands/vault.md +2 -0
  93. package/commands/visualize.md +24 -29
  94. package/commands/whitespace.md +2 -1
  95. package/commands/wiki.md +1 -0
  96. package/hooks/hooks.json +22 -88
  97. package/lib/agents/auto-explore-agent.cjs +82 -0
  98. package/lib/core/breakthrough/canary.cjs +134 -0
  99. package/lib/core/breakthrough/canary.test.cjs +136 -0
  100. package/lib/core/breakthrough/detectors.cjs +359 -0
  101. package/lib/core/breakthrough/detectors.test.cjs +333 -0
  102. package/lib/core/breakthrough/ethics-fence.cjs +127 -0
  103. package/lib/core/breakthrough/ethics-fence.test.cjs +178 -0
  104. package/lib/core/breakthrough/resurfacing.cjs +150 -0
  105. package/lib/core/breakthrough/resurfacing.test.cjs +233 -0
  106. package/lib/core/breakthrough/review-queue.cjs +154 -0
  107. package/lib/core/breakthrough/review-queue.test.cjs +160 -0
  108. package/lib/core/breakthrough/scanner-d17-d18.test.cjs +229 -0
  109. package/lib/core/breakthrough/scanner.cjs +426 -0
  110. package/lib/core/breakthrough/scanner.test.cjs +267 -0
  111. package/lib/core/breakthrough/schema.cjs +164 -0
  112. package/lib/core/breakthrough/schema.test.cjs +256 -0
  113. package/lib/core/breakthrough/scoring.cjs +293 -0
  114. package/lib/core/breakthrough/scoring.test.cjs +423 -0
  115. package/lib/core/breakthrough/verb-dispatch.cjs +221 -0
  116. package/lib/core/breakthrough/verb-dispatch.test.cjs +185 -0
  117. package/lib/core/breakthrough/voice-scaffold.cjs +247 -0
  118. package/lib/core/breakthrough/voice-scaffold.test.cjs +251 -0
  119. package/lib/core/directive-envelope.cjs +175 -0
  120. package/lib/core/directive-envelope.test.cjs +225 -0
  121. package/lib/core/doctor/class-m-brain-smoke.cjs +278 -0
  122. package/lib/core/doctor/class-m-brain-smoke.test.cjs +310 -0
  123. package/lib/core/first-touch-version-stamper.cjs +113 -0
  124. package/lib/core/larry-thinness-acknowledgment.cjs +64 -0
  125. package/lib/core/larry-thinness-acknowledgment.test.cjs +97 -0
  126. package/lib/core/llm-name-suggester.cjs +194 -0
  127. package/lib/core/llm-name-suggester.test.cjs +132 -0
  128. package/lib/core/mcp-profiles.cjs +1 -1
  129. package/lib/core/migration-snapshot.cjs +172 -0
  130. package/lib/core/migration-snapshot.test.cjs +174 -0
  131. package/lib/core/mindrian-brain-shim.test.cjs +214 -0
  132. package/lib/core/mva-orchestrator.cjs +41 -0
  133. package/lib/core/mva-telemetry.cjs +31 -143
  134. package/lib/core/navigation/edges.cjs +35 -0
  135. package/lib/core/navigation/memory-events.cjs +126 -0
  136. package/lib/core/room-auto-create.cjs +318 -0
  137. package/lib/core/room-auto-create.test.cjs +198 -0
  138. package/lib/core/room-discard-cascade.cjs +225 -0
  139. package/lib/core/room-discard-cascade.test.cjs +135 -0
  140. package/lib/core/room-name-validator.cjs +132 -0
  141. package/lib/core/room-name-validator.test.cjs +156 -0
  142. package/lib/core/room-naming-selector.cjs +357 -0
  143. package/lib/core/room-naming-selector.test.cjs +277 -0
  144. package/lib/core/room-receipt-emit.cjs +63 -0
  145. package/lib/core/room-skeleton-scaffold.cjs +315 -0
  146. package/lib/core/room-skeleton-scaffold.test.cjs +291 -0
  147. package/lib/core/rs-nl-to-query.cjs +1 -1
  148. package/lib/core/stale-copy-scanner.cjs +190 -0
  149. package/lib/core/state-aware-router.cjs +78 -0
  150. package/lib/core/telemetry/schema.cjs +168 -0
  151. package/lib/core/telemetry/schema.test.cjs +124 -0
  152. package/lib/core/telemetry/validator.cjs +200 -0
  153. package/lib/core/telemetry/validator.test.cjs +188 -0
  154. package/lib/core/telemetry/writer.cjs +141 -0
  155. package/lib/core/telemetry/writer.test.cjs +331 -0
  156. package/lib/core/terminal-capability.cjs +88 -0
  157. package/lib/core/tier0-messaging.cjs +109 -0
  158. package/lib/core/tier0-messaging.test.cjs +218 -0
  159. package/lib/core/venture-shape-nudge.cjs +163 -0
  160. package/lib/core/venture-shape-nudge.test.cjs +161 -0
  161. package/lib/core/visual-ops.cjs +70 -2
  162. package/lib/hmi/selector-dispatcher.cjs +90 -1
  163. package/lib/hmi/shape-f7-breakthrough-renderer.cjs +222 -0
  164. package/lib/hmi/shape-f7-breakthrough-renderer.test.cjs +233 -0
  165. package/lib/memory/body-shape-coverage.test.cjs +268 -0
  166. package/lib/memory/brain-derivation-graceful-degradation.test.cjs +2 -2
  167. package/lib/memory/doctor-deprecation-surface.test.cjs +185 -0
  168. package/lib/memory/first-touch-version.test.cjs +198 -0
  169. package/lib/memory/help-coverage.test.cjs +108 -0
  170. package/lib/memory/help-renderer.test.cjs +145 -0
  171. package/lib/memory/mos-status-renderer.test.cjs +2 -2
  172. package/lib/memory/navigation-engine-core.test.cjs +1 -1
  173. package/lib/memory/palette-consistency.test.cjs +127 -0
  174. package/lib/memory/pending-tension-store.cjs +80 -0
  175. package/lib/memory/render-v2-disposition.test.cjs +199 -0
  176. package/lib/memory/run-feynman-tests.cjs +223 -0
  177. package/lib/memory/sessionstart-coordinator.test.cjs +446 -0
  178. package/lib/memory/skill-vs-code-drift.test.cjs +257 -0
  179. package/lib/memory/soft-alias.test.cjs +144 -0
  180. package/lib/memory/stale-copy-scanner.test.cjs +291 -0
  181. package/lib/memory/state-aware-router.test.cjs +90 -0
  182. package/lib/memory/statusline-two-row.test.cjs +338 -0
  183. package/lib/memory/terminal-capability.test.cjs +155 -0
  184. package/lib/render/ROOM.md +74 -22
  185. package/lib/sessionstart/budget-compressor.cjs +130 -0
  186. package/lib/sessionstart/contributor-interface.cjs +134 -0
  187. package/lib/sessionstart/contributor-isolator.cjs +128 -0
  188. package/lib/sessionstart/precedence-ladder.cjs +47 -0
  189. package/lib/statusline/governing-thought-truncator.cjs +45 -0
  190. package/lib/statusline/two-row-renderer.cjs +186 -0
  191. package/lib/statusline/version-resolver.cjs +81 -0
  192. package/package.json +1 -1
  193. package/references/visual/ROOM.md +55 -0
  194. package/references/visual/palette.json +54 -0
  195. package/skills/larry-personality/SKILL.md +34 -0
  196. package/skills/ui-system/SKILL.md +109 -1
  197. package/skills/ui-system/rules/dual-palette.md +156 -0
  198. package/skills/ui-system/rules/glyph-disambiguation.md +171 -0
  199. 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.17",
3
+ "version": "1.13.0-beta.21",
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`
@@ -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.
@@ -0,0 +1,156 @@
1
+ ---
2
+ name: dual-palette
3
+ description: >
4
+ Phase 102 D-06b dual De Stijl palette rule. The 5-color CLI semantic palette
5
+ (red / yellow / cyan / green / gray) is the BASE; the Mondrian primaries
6
+ palette (red / yellow / blue / black / white) overlays HTML-emitting
7
+ surfaces only. The dual-palette rule (Phase 102 D-06b): pick the palette by
8
+ SURFACE, not by JTBD. Cross-references lib/render/JTBD-PALETTES.md as the
9
+ canonical Phase 102 mapping source.
10
+ ---
11
+
12
+ # Dual De Stijl Palette Rule
13
+
14
+ Phase 102 (context-aware rendering) shipped TWO palettes for the same set of
15
+ JTBDs because the CLI surface and the HTML/dashboard surface have different
16
+ semantic contracts. The dual-palette rule (Phase 102 D-06b) is:
17
+
18
+ > **Pick the palette by SURFACE, not by JTBD.**
19
+
20
+ The same JTBD can render red on CLI (semantic) and blue on HTML (Mondrian
21
+ primary) and that is correct. CLI uses the 5-color contract from
22
+ `skills/ui-system/SKILL.md` §4 where color carries semantic meaning at the
23
+ terminal (red = error, yellow = warning, etc.). HTML / wiki / presentation /
24
+ Cytoscape surfaces use Mondrian primaries (red / yellow / blue / black / white)
25
+ for visual identity discipline -- rectilinear grids, primary blocks, large
26
+ white space.
27
+
28
+ This rule documents the palette pair. It does NOT define authoritative hex
29
+ values -- that role belongs to:
30
+
31
+ - `lib/render/JTBD-PALETTES.md` -- the Phase 102 canonical mapping (active
32
+ consumer: `lib/render/render-v2.cjs` `JTBD_CLI_COLOR` frozen object literal).
33
+ - `references/visual/palette.json` -- the consolidated De Stijl hex token file
34
+ per Sub-plan D of Phase 121.5. Once it lands, every surface (`scripts/banner`,
35
+ `lib/core/visual-ops.cjs` `DS_HEX`, `templates/destijl-base.css`,
36
+ `templates/shared.css`, `references/vault-kit/snippets/mindrian-destijl.css`)
37
+ derives from it; CI asserts agreement.
38
+
39
+ This rules file is documentation. Edit `JTBD-PALETTES.md` for behavior changes.
40
+
41
+ ---
42
+
43
+ ## 1. CLI Semantic Palette (BASE)
44
+
45
+ The 5-color CLI contract from SKILL.md §4. Applied as a single colored Zone 1
46
+ left-rail accent at the start of the header (`lib/render/render-v2.cjs`
47
+ `JTBD_CLI_COLOR` map). TTY-gated via `process.stdout.isTTY` so non-TTY captures
48
+ stay byte-clean.
49
+
50
+ | Token | ANSI sequence | Semantic role |
51
+ |--------|---------------|------------------------------|
52
+ | red | `\x1b[31m` | Errors only |
53
+ | yellow | `\x1b[33m` | Warnings, caution |
54
+ | cyan | `\x1b[36m` | Commands, paths, links |
55
+ | green | `\x1b[32m` | Success, active, complete |
56
+ | gray | `\x1b[90m` | Meta info, timestamps, hints |
57
+ | reset | `\x1b[0m` | Reset to default |
58
+
59
+ Compact mode (>80% token budget) drops the Zone 1 accent. Semantic body
60
+ colors stay.
61
+
62
+ ---
63
+
64
+ ## 2. Mondrian HTML Palette (OVERLAY for HTML surfaces only)
65
+
66
+ Used by HTML-emitting downstream phases ONLY:
67
+
68
+ - Phase 19 wiki-dashboard
69
+ - Phase 25 data-room-export-v2
70
+ - Phase 30 presentation-generator
71
+
72
+ Mondrian shapes vocabulary on HTML surfaces extends the 12-glyph CLI set with
73
+ `circle (●)`. CLI surfaces stay locked to the 12-glyph vocabulary; circle is
74
+ NOT in the CLI allowlist.
75
+
76
+ ---
77
+
78
+ ## 3. JTBD -> Palette Mapping (both surfaces)
79
+
80
+ Sourced from `lib/render/JTBD-PALETTES.md`. CLI and Mondrian mappings are
81
+ independent; the same JTBD can land on different colors per surface.
82
+
83
+ | JTBD handle | CLI color | Mondrian color |
84
+ |-------------------------|-----------|----------------|
85
+ | `decide-pursue` | red | red |
86
+ | `find-problem` | yellow | yellow |
87
+ | `understand-market` | cyan | blue |
88
+ | `find-bottleneck` | red | red |
89
+ | `prepare-pitch` | green | black |
90
+ | `validate-idea` | yellow | yellow |
91
+ | `compare-options` | cyan | blue |
92
+ | `connect-domains` | cyan | blue |
93
+ | `surface-contradiction` | red | red |
94
+ | `plan-execution` | green | black |
95
+ | `file-meeting` | cyan | blue |
96
+ | `audit-room` | yellow | yellow |
97
+ | `explore` | gray | white |
98
+
99
+ 13 entries on both sides. Adding a 14th JTBD requires Phase 100 vocabulary
100
+ expansion + `JTBD-PALETTES.md` update + HMI-102-XX requirement amendment.
101
+
102
+ ---
103
+
104
+ ## 4. Surface Routing
105
+
106
+ | Surface | Palette | Why |
107
+ |---------------------------------------------------|--------------------------|------------------------------------------------|
108
+ | CLI / TUI (every `/mos:*` output) | 5-color semantic | Color carries semantic meaning at the terminal |
109
+ | HTML dashboard / wiki / presentation / Cytoscape | Mondrian primaries | Visual identity discipline; De Stijl grid |
110
+
111
+ Renderers MUST pick by SURFACE. A CLI `/mos:audit-room` output uses yellow.
112
+ The HTML wiki page for the same room also uses yellow (coincidentally), but
113
+ the mapping rules are independent. `compare-options` is cyan on CLI but blue
114
+ on HTML; this is intentional.
115
+
116
+ ---
117
+
118
+ ## 5. Invariants (regression fences)
119
+
120
+ 1. **13 entries.** Both CLI and Mondrian tables MUST have exactly 13 rows (the
121
+ canonical Phase 100 JTBD set).
122
+ 2. **Closed CLI palette.** CLI palette tokens MUST be from
123
+ `{red, yellow, cyan, green, gray}`. No auxiliary colors.
124
+ 3. **Closed Mondrian palette.** Mondrian palette tokens MUST be from
125
+ `{red, yellow, blue, black, white}`. No auxiliary colors.
126
+ 4. **TTY gate.** The renderer MUST gate ANSI emission on
127
+ `process.stdout.isTTY`. Non-TTY captures MUST be byte-identical to the
128
+ strip-ANSI of TTY captures.
129
+ 5. **Compact override.** Compact mode (token budget > 80%) MUST drop the
130
+ Zone 1 color accent. Body semantic colors stay.
131
+
132
+ ---
133
+
134
+ ## 6. Canon Refs
135
+
136
+ - **Part 3 (Tri-Context Decision Gate)** -- color overlay is part of the
137
+ cognitive surface the navigator reads at every Decision Gate.
138
+ - **Part 7 (Reuse Before Build)** -- this rule documents data-as-asset; no
139
+ new module surface added.
140
+ - **Part 8 (The Graph Boundary)** -- the renderer reads `JTBD-PALETTES.md`
141
+ LOCAL-only at module load; no Brain queries derive palette. JTBD handle at
142
+ render time is a generic enum scalar (Canon-allowed framework handle),
143
+ never a user-data string.
144
+
145
+ ---
146
+
147
+ ## 7. See Also
148
+
149
+ - `lib/render/JTBD-PALETTES.md` -- canonical Phase 102 mapping.
150
+ - `lib/render/render-v2.cjs` -- consumer; `JTBD_CLI_COLOR` map.
151
+ - `tests/test-render-v2-color-overlay.cjs` -- RENDER-102-05 regression fence.
152
+ - `skills/ui-system/SKILL.md` §4 -- the 5-color CLI contract.
153
+ - `references/visual/palette.json` -- (planned, Phase 121.5 Sub-plan D) the
154
+ consolidated De Stijl hex token file.
155
+ - `.planning/phases/102-context-aware-rendering/102-CONTEXT.md` -- D-06 + D-06b
156
+ decision records.