ruvnet-brain 4.0.1 → 4.0.4

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 (195) hide show
  1. package/.claude-plugin/marketplace.json +1 -0
  2. package/README.md +4 -4
  3. package/bin/install.mjs +303 -24
  4. package/console/CONTRACT.md +172 -0
  5. package/console/activity.js +753 -0
  6. package/console/app.js +4189 -0
  7. package/console/architecture.html +1221 -0
  8. package/console/assets/depth-1.webp +0 -0
  9. package/console/assets/depth-2.webp +0 -0
  10. package/console/assets/depth-3.webp +0 -0
  11. package/console/assets/harness-vs-plain.svg +259 -0
  12. package/console/assets/hero.webp +0 -0
  13. package/console/assets/memory.webp +0 -0
  14. package/console/assets/metaharness.svg +247 -0
  15. package/console/index.html +777 -0
  16. package/console/install-architecture.html +162 -0
  17. package/console/install-mockup.html +543 -0
  18. package/console/style.css +2144 -0
  19. package/console/tips.css +926 -0
  20. package/console/tips.html +858 -0
  21. package/console/tips.js +128 -0
  22. package/docs/RELEASE-NOTES-4.0.md +88 -0
  23. package/kb/model-requirements.mjs +37 -6
  24. package/keys/ruvnet-brain-signing.pub.pem +3 -0
  25. package/package.json +8 -22
  26. package/plugin/.claude-plugin/marketplace.json +1 -0
  27. package/plugin/.claude-plugin/plugin.json +2 -3
  28. package/plugin/.codex-plugin/plugin.json +1 -1
  29. package/plugin/commands/brain-console.md +2 -2
  30. package/plugin/commands/configure.md +3 -2
  31. package/plugin/commands/rvbc.md +4 -3
  32. package/plugin/commands/rvcb.md +2 -2
  33. package/plugin/commands/whats-new.md +6 -6
  34. package/plugin/docs/RELEASE-NOTES-4.0.md +88 -0
  35. package/plugin/hooks/hooks.json +1 -2
  36. package/plugin/mcp/managed-cli-interface.mjs +47 -4
  37. package/plugin/mcp/server.mjs +90 -32
  38. package/plugin/scripts/detach.mjs +14 -0
  39. package/plugin/scripts/first-session-worker.mjs +38 -0
  40. package/plugin/scripts/ground-ruvnet.sh +16 -6
  41. package/plugin/scripts/hook-shim.mjs +34 -29
  42. package/plugin/scripts/learn-capture.sh +22 -3
  43. package/plugin/scripts/learn-flush.mjs +21 -4
  44. package/plugin/scripts/runtime-preferences.mjs +269 -0
  45. package/plugin/scripts/session-start-core.mjs +503 -0
  46. package/plugin/scripts/session-start.sh +3 -858
  47. package/plugin/scripts/whats-new.mjs +42 -0
  48. package/plugin/skills/brain-console/SKILL.md +4 -2
  49. package/plugin/skills/release-proof/SKILL.md +98 -0
  50. package/plugin/skills/release-proof/agents/openai.yaml +4 -0
  51. package/plugin/skills/release-proof/references/receipt-contract.md +44 -0
  52. package/plugin/skills/release-proof/scripts/release-proof.mjs +286 -0
  53. package/plugin/skills/ruvnet-brain/PLAYBOOK.md +5 -1
  54. package/plugin/skills/ruvnet-brain/SKILL.md +22 -7
  55. package/plugin/skills/rvbc/SKILL.md +9 -6
  56. package/plugin/skills/whats-new/SKILL.md +4 -4
  57. package/scripts/adr-backfill.mjs +107 -0
  58. package/scripts/advocacy-outcomes.mjs +808 -0
  59. package/scripts/agentdb-context.mjs +216 -0
  60. package/scripts/agentdb-fleet-doctor.mjs +101 -0
  61. package/scripts/ascii-drift.mjs +236 -0
  62. package/scripts/behavioral-l1-l4.mjs +210 -0
  63. package/scripts/brain-capability-check.mjs +72 -0
  64. package/scripts/brain-grade-groundtruth.mjs +100 -0
  65. package/scripts/brain-latency-50.mjs +227 -0
  66. package/scripts/brain-novice-50.mjs +189 -0
  67. package/scripts/brain-stamp.mjs +94 -0
  68. package/scripts/brain-state.mjs +212 -0
  69. package/scripts/build-bundle.mjs +531 -0
  70. package/scripts/build-concepts.mjs +132 -0
  71. package/scripts/build-l2.mjs +71 -0
  72. package/scripts/build-primer.mjs +73 -0
  73. package/scripts/build-symbols.mjs +68 -0
  74. package/scripts/calibrate-router.mjs +97 -0
  75. package/scripts/capability-audit.mjs +321 -0
  76. package/scripts/capability-registry.mjs +876 -0
  77. package/scripts/check-indexation.mjs +108 -0
  78. package/scripts/check-legibility.mjs +189 -0
  79. package/scripts/ci/build-fixture-kb.mjs +67 -0
  80. package/scripts/ci/learning-replay-codex-adapter.mjs +62 -0
  81. package/scripts/ci/learning-replay-recorder.mjs +59 -0
  82. package/scripts/ci/mutate-hook-timeout.mjs +70 -0
  83. package/scripts/ci/stranger-fixture-stage.mjs +17 -0
  84. package/scripts/ci/stranger-scenario.mjs +228 -0
  85. package/scripts/ci/stranger-timeout.mjs +25 -0
  86. package/scripts/ci-verdict.mjs +29 -0
  87. package/scripts/claims-verify.mjs +710 -0
  88. package/scripts/clear-claude-tmp.sh +31 -0
  89. package/scripts/console-engine.mjs +434 -0
  90. package/scripts/console-engine.test.mjs +125 -0
  91. package/scripts/corpus-qa.mjs +250 -0
  92. package/scripts/correction-detect-embed.mjs +346 -0
  93. package/scripts/correction-detect-measure.mjs +270 -0
  94. package/scripts/correction-detect.mjs +686 -0
  95. package/scripts/count-chunks.mjs +54 -0
  96. package/scripts/described-questions.json +30 -0
  97. package/scripts/design-grade.mjs +58 -0
  98. package/scripts/dev-plugin-link.sh +105 -0
  99. package/scripts/distill-project.mjs +200 -0
  100. package/scripts/doc-currency.mjs +801 -0
  101. package/scripts/eval-brain.mjs +244 -0
  102. package/scripts/fix-metaharness-memretrieve.mjs +121 -0
  103. package/scripts/fix-workstream.mjs +291 -0
  104. package/scripts/full-hints.mjs +87 -0
  105. package/scripts/gate.sh +39 -0
  106. package/scripts/gates.mjs +146 -0
  107. package/scripts/gen-console-images.mjs +54 -0
  108. package/scripts/gen-images.mjs +47 -0
  109. package/scripts/git-clone-refresh.mjs +52 -0
  110. package/scripts/git-hooks/pre-push +126 -0
  111. package/scripts/goal-match.mjs +398 -0
  112. package/scripts/goldie-research.mjs +223 -0
  113. package/scripts/goldie-weekly.sh +67 -0
  114. package/scripts/health-repair.mjs +237 -0
  115. package/scripts/helix-scenario-questions.json +10 -0
  116. package/scripts/ingest-gists.mjs +230 -0
  117. package/scripts/ingest-meeting.mjs +115 -0
  118. package/scripts/ingest-repo.mjs +79 -0
  119. package/scripts/install-npx-witness.sh +49 -0
  120. package/scripts/issue-fix.mjs +558 -0
  121. package/scripts/issue-watch.mjs +276 -0
  122. package/scripts/issue4-close-note.md +31 -0
  123. package/scripts/key-canary.mjs +91 -0
  124. package/scripts/latency-to-surface.mjs +233 -0
  125. package/scripts/learning-enable.mjs +380 -0
  126. package/scripts/learning-replay.mjs +1570 -0
  127. package/scripts/learnings.mjs +62 -0
  128. package/scripts/lesson-gate.mjs +680 -0
  129. package/scripts/lesson-lifecycle.mjs +449 -0
  130. package/scripts/lesson-promote.mjs +262 -0
  131. package/scripts/lesson-ratify.mjs +98 -0
  132. package/scripts/lesson-seed.mjs +252 -0
  133. package/scripts/lesson-store.mjs +447 -0
  134. package/scripts/loop-checkpoint.mjs +86 -0
  135. package/scripts/memdb-health.sh +14 -0
  136. package/scripts/memory-doctor.mjs +326 -0
  137. package/scripts/model-catalog.mjs +79 -0
  138. package/scripts/nightly-controller.mjs +66 -0
  139. package/scripts/nightly-gists.sh +72 -0
  140. package/scripts/nightly-wrapper.sh +172 -0
  141. package/scripts/notify.sh +12 -0
  142. package/scripts/npx-witness.sh +56 -0
  143. package/scripts/onboarding-console.mjs +2922 -0
  144. package/scripts/private-fence.mjs +69 -0
  145. package/scripts/proactivity-metrics.mjs +118 -0
  146. package/scripts/proof-questions.json +56 -0
  147. package/scripts/protected-release-invocation.mjs +76 -0
  148. package/scripts/prove.mjs +95 -0
  149. package/scripts/proxy/claude-proxied.sh +57 -0
  150. package/scripts/proxy/proxy-revert.sh +59 -0
  151. package/scripts/proxy/proxy-up.sh +60 -0
  152. package/scripts/proxy/proxy-verify.mjs +142 -0
  153. package/scripts/publication-receipt.mjs +307 -0
  154. package/scripts/published-surface-probe.mjs +241 -0
  155. package/scripts/qe/card-lane-gate.mjs +162 -0
  156. package/scripts/qe/session-start-gate.mjs +229 -0
  157. package/scripts/qe/ux-suite.mjs +323 -0
  158. package/scripts/reconcile-project.mjs +0 -0
  159. package/scripts/record-lesson.mjs +113 -0
  160. package/scripts/refresh-model-catalog.mjs +99 -0
  161. package/scripts/release-authority.mjs +93 -0
  162. package/scripts/release-proof.mjs +9 -0
  163. package/scripts/release-vector.mjs +281 -0
  164. package/scripts/release.mjs +439 -0
  165. package/scripts/remedy-registry.mjs +247 -0
  166. package/scripts/rerank-cap-eval.mjs +265 -0
  167. package/scripts/rerank-cap-warm-ab.mjs +129 -0
  168. package/scripts/route-cheap.mjs +20 -15
  169. package/scripts/router-utilization.mjs +182 -0
  170. package/scripts/routing-flywheel.mjs +596 -0
  171. package/scripts/rvf-generation.mjs +104 -0
  172. package/scripts/rvf-index-audit.mjs +138 -0
  173. package/scripts/self-update.mjs +296 -0
  174. package/scripts/selfcheck.mjs +7 -1
  175. package/scripts/sign-bundle.mjs +69 -0
  176. package/scripts/signal-watch.mjs +171 -0
  177. package/scripts/stabilization-receipt.mjs +108 -0
  178. package/scripts/stack-sync.mjs +469 -0
  179. package/scripts/stamp-existing-rvf-generations.mjs +53 -0
  180. package/scripts/stamp-sweep.mjs +144 -0
  181. package/scripts/status-honesty.mjs +102 -0
  182. package/scripts/sync-version.mjs +217 -0
  183. package/scripts/token-report.mjs +102 -0
  184. package/scripts/top100-benchmark.mjs +479 -0
  185. package/scripts/top100-corpus.mjs +112 -0
  186. package/scripts/top100-semantic-assertions.mjs +449 -0
  187. package/scripts/update-apply.mjs +9 -0
  188. package/scripts/upgrade-notice.mjs +14 -0
  189. package/scripts/verify-bundle.mjs +51 -0
  190. package/scripts/verify-channels.mjs +184 -0
  191. package/scripts/verify-model-catalog.mjs +104 -0
  192. package/scripts/verify-nightly-close-issue4.sh +31 -0
  193. package/scripts/version.mjs +40 -0
  194. package/scripts/wired-check.mjs +867 -0
  195. package/plugin/scripts/finalize-token-meter.mjs +0 -25
@@ -0,0 +1,162 @@
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" />
6
+ <title>RuvNet Brain — install architecture</title>
7
+ <style>
8
+ :root {
9
+ --bg: #f4f1ea; --card: #fbfaf6; --ink: #26221b; --ink-2: #5b5648; --muted: #8a8474;
10
+ --hair: #e4dfd2; --hair-strong: #cfc8b6;
11
+ --green: #2e7d32; --green-soft: #e6efe4; --green-line: #b7d3b3;
12
+ --amber: #b7791f; --amber-soft: #f6ecd6; --amber-line: #e4c98a;
13
+ --slate: #4b5563; --slate-soft: #e9ebee; --slate-line: #c7ccd4;
14
+ --mono: ui-monospace, SFMono-Regular, Menlo, monospace;
15
+ --serif: "Iowan Old Style", "Palatino Linotype", Georgia, serif;
16
+ }
17
+ * { box-sizing: border-box; }
18
+ body { margin: 0; background: var(--bg); color: var(--ink);
19
+ font: 15px/1.55 -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
20
+ background-image: radial-gradient(var(--hair) 0.5px, transparent 0.5px); background-size: 22px 22px; }
21
+ .wrap { max-width: 1060px; margin: 0 auto; padding: 40px 28px 72px; }
22
+ header .kicker { font: 600 12px/1 var(--mono); letter-spacing: .16em; color: var(--slate); text-transform: uppercase; }
23
+ h1 { font-family: var(--serif); font-size: 34px; margin: 12px 0 6px; font-weight: 600; }
24
+ h1 em { font-style: italic; color: var(--green); }
25
+ .sub { color: var(--ink-2); max-width: 70ch; margin: 0 0 8px; }
26
+ .cmd { font-family: var(--mono); font-size: 13px; background: #ece7db; border: 1px solid var(--hair-strong);
27
+ border-radius: 7px; padding: 2px 8px; color: var(--ink); }
28
+ .legend { display: flex; gap: 18px; flex-wrap: wrap; margin: 22px 0 6px; font-size: 13px; }
29
+ .legend b { display: inline-flex; align-items: center; gap: 7px; font-weight: 600; }
30
+ .dot { width: 11px; height: 11px; border-radius: 3px; display: inline-block; }
31
+ .dot.req { background: var(--green); } .dot.rec { background: var(--amber); } .dot.opt { background: transparent; border: 2px solid var(--slate-line); }
32
+
33
+ .tier { margin-top: 26px; border-radius: 16px; padding: 20px 22px; border: 1px solid var(--hair); background: var(--card); }
34
+ .tier.req { border-left: 5px solid var(--green); background: linear-gradient(180deg, var(--green-soft) 0%, var(--card) 40%); }
35
+ .tier.rec { border-left: 5px solid var(--amber); background: linear-gradient(180deg, var(--amber-soft) 0%, var(--card) 40%); }
36
+ .tier.opt { border-left: 5px solid var(--slate-line); }
37
+ .tier-head { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
38
+ .tier-head h2 { font-family: var(--serif); font-size: 21px; margin: 0; font-weight: 600; }
39
+ .pill { font: 600 11px/1 var(--mono); letter-spacing: .08em; text-transform: uppercase; padding: 4px 9px; border-radius: 999px; }
40
+ .pill.req { background: var(--green-soft); color: var(--green); border: 1px solid var(--green-line); }
41
+ .pill.rec { background: var(--amber-soft); color: var(--amber); border: 1px solid var(--amber-line); }
42
+ .pill.opt { background: var(--slate-soft); color: var(--slate); border: 1px solid var(--slate-line); }
43
+ .tier-note { color: var(--ink-2); margin: 8px 0 4px; font-size: 14px; }
44
+
45
+ .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 16px; }
46
+ @media (max-width: 720px) { .grid { grid-template-columns: 1fr; } }
47
+ .item { background: #fff; border: 1px solid var(--hair); border-radius: 12px; padding: 14px 15px; }
48
+ .tier.opt .item { background: var(--card); }
49
+ .item h3 { margin: 0 0 5px; font-size: 15px; display: flex; align-items: center; gap: 8px; }
50
+ .item .chk { width: 15px; height: 15px; border-radius: 4px; flex: none; display: inline-flex; align-items: center; justify-content: center; font-size: 10px; color: #fff; }
51
+ .chk.on { background: var(--green); } .chk.rec { background: var(--amber); } .chk.off { background: transparent; border: 2px solid var(--slate-line); }
52
+ .item .what { color: var(--ink-2); font-size: 13.5px; margin: 0 0 8px; }
53
+ .item .cite { font-family: var(--mono); font-size: 11px; color: var(--muted); }
54
+ .item .why { font-size: 13px; margin: 8px 0 0; padding-top: 8px; border-top: 1px dashed var(--hair-strong); }
55
+ .item .why b { color: var(--amber); font-weight: 600; }
56
+ .item .off-cost { font-size: 13px; margin: 8px 0 0; padding-top: 8px; border-top: 1px dashed var(--hair-strong); color: var(--ink-2); }
57
+ .item .off-cost b { color: var(--slate); font-weight: 600; }
58
+
59
+ .flow { display: flex; align-items: center; justify-content: center; gap: 10px; margin: 8px 0 -8px; color: var(--muted); font: 600 12px/1 var(--mono); letter-spacing: .05em; }
60
+ .flow .arrow { font-size: 18px; color: var(--hair-strong); }
61
+ .foot { margin-top: 30px; color: var(--muted); font-size: 12.5px; border-top: 1px solid var(--hair); padding-top: 14px; }
62
+ .verified { display: inline-flex; align-items: center; gap: 6px; font: 600 11px/1 var(--mono); color: var(--green); background: var(--green-soft); border: 1px solid var(--green-line); border-radius: 999px; padding: 4px 9px; }
63
+ </style>
64
+ </head>
65
+ <body>
66
+ <div class="wrap">
67
+ <header>
68
+ <div class="kicker">RuvNet Brain · npx ruvnet-brain · install architecture</div>
69
+ <h1>What's <em>required</em>, what's optional — and why the optionals earn their place.</h1>
70
+ <p class="sub">The installer runs in your terminal. It always does the three required steps, asks about the two recommended ones (defaulting to yes), and leaves the rest off unless you opt in. Every item below maps to a real step in <span class="cmd">bin/install.mjs</span>.</p>
71
+ <div class="legend">
72
+ <b><span class="dot req"></span> Required — the brain cannot answer without it</b>
73
+ <b><span class="dot rec"></span> Recommended — on by default, keeps it current &amp; safe</b>
74
+ <b><span class="dot opt"></span> Optional — off by default, opt in when you want it</b>
75
+ </div>
76
+ </header>
77
+
78
+ <!-- REQUIRED -->
79
+ <section class="tier req">
80
+ <div class="tier-head"><h2>The core</h2><span class="pill req">Required · always runs</span></div>
81
+ <p class="tier-note">These are the product. Skip any one and there is nothing to answer questions with — so the installer does them without asking.</p>
82
+ <div class="grid">
83
+ <div class="item">
84
+ <h3><span class="chk on">✓</span> Download the knowledge base</h3>
85
+ <p class="what">~736&nbsp;MB, signature-verified, saved to <span class="cmd">~/.cache/ruvnet-brain/kb</span>. This IS the brain — rUv's whole stack, indexed.</p>
86
+ <p class="cite">bin/install.mjs · obtainBundle()</p>
87
+ </div>
88
+ <div class="item">
89
+ <h3><span class="chk on">✓</span> Install the local reader</h3>
90
+ <p class="what">The engine that searches the brain on your machine — <span class="cmd">@ruvector/rvf</span> + the local embedder. No API, nothing leaves your computer.</p>
91
+ <p class="cite">bin/install.mjs · installReader()</p>
92
+ </div>
93
+ <div class="item" style="grid-column: 1 / -1;">
94
+ <h3><span class="chk on">✓</span> Register the Claude Code plugin + MCP server</h3>
95
+ <p class="what">Wires <span class="cmd">search_ruvnet</span>, the grounding hooks, and the <span class="cmd">/configure</span> console into Claude Code. Without this the brain is on disk but Claude can't reach it.</p>
96
+ <p class="cite">bin/install.mjs · wirePlugin()</p>
97
+ </div>
98
+ </div>
99
+ </section>
100
+
101
+ <div class="flow"><span>the core is in place</span><span class="arrow">↓</span><span>now keep it current &amp; safe</span></div>
102
+
103
+ <!-- RECOMMENDED -->
104
+ <section class="tier rec">
105
+ <div class="tier-head"><h2>Keep it current &amp; safe</h2><span class="pill rec">Recommended · default yes</span></div>
106
+ <p class="tier-note">The installer asks, and pre-checks these. You can decline either — the core still works — but declining has a real cost, named below.</p>
107
+ <div class="grid">
108
+ <div class="item">
109
+ <h3><span class="chk rec">✓</span> Evergreen auto-update &nbsp;<span class="verified">✓ verified running</span></h3>
110
+ <p class="what">A background job refreshes the brain as rUv ships. The "verified" tick comes from a real <span class="cmd">launchctl</span> check — not from the box being ticked.</p>
111
+ <p class="cite">bin/install.mjs · offerNightly() · default YES</p>
112
+ <p class="off-cost"><b>Decline and:</b> updates become manual forever (<span class="cmd">npx ruvnet-brain --update</span>). rUv ships fast, so a stale brain is the single biggest way this stops being useful.</p>
113
+ </div>
114
+ <div class="item">
115
+ <h3><span class="chk rec">✓</span> Spend watchdog</h3>
116
+ <p class="what">Warns you the moment an agent fleet runs away on API spend. Local, passive, no account access.</p>
117
+ <p class="cite">bin/install.mjs · spend-watchdog · default YES</p>
118
+ <p class="off-cost"><b>Decline and:</b> nothing watches for a runaway job. Fine if you never run paid fleets; cheap insurance if you might.</p>
119
+ </div>
120
+ </div>
121
+ </section>
122
+
123
+ <div class="flow"><span>everything above is enough</span><span class="arrow">↓</span><span>the rest is opt-in</span></div>
124
+
125
+ <!-- OPTIONAL -->
126
+ <section class="tier opt">
127
+ <div class="tier-head"><h2>Opt in when you want it</h2><span class="pill opt">Optional · default off</span></div>
128
+ <p class="tier-note">Off unless you ask. Each is genuinely useful for a specific person — and pointless noise for everyone else, which is exactly why it's not on by default.</p>
129
+ <div class="grid">
130
+ <div class="item">
131
+ <h3><span class="chk off"></span> Add missing Ruflo / RuVector tools</h3>
132
+ <p class="what">Installs the orchestration + vector CLIs if you don't have them.</p>
133
+ <p class="cite">bin/install.mjs · offerStack() · default NO</p>
134
+ <p class="why"><b>Why optional:</b> the brain answers grounded questions with zero loss without them. You only need them if you're going to <i>run</i> swarms or the vector CLI, not just ask about them.</p>
135
+ </div>
136
+ <div class="item">
137
+ <h3><span class="chk off"></span> Add a note to your CLAUDE.md</h3>
138
+ <p class="what">Appends a few lines nudging Claude to ground answers through the brain in every project.</p>
139
+ <p class="cite">bin/install.mjs · offerClaudeMd() · default NO</p>
140
+ <p class="why"><b>Why optional:</b> the plugin's own hooks already do this. The note only matters if you skip the plugin — so for a normal install it's redundant, and editing your CLAUDE.md uninvited is exactly the "invisible virus" feeling to avoid.</p>
141
+ </div>
142
+ <div class="item">
143
+ <h3><span class="chk off"></span> Anonymous usage counts</h3>
144
+ <p class="what">A single version-ping so rUv can see adoption. No code, no prompts, no identity.</p>
145
+ <p class="cite">bin/install.mjs · --no-telemetry to decline</p>
146
+ <p class="why"><b>Why optional:</b> it helps the project, helps you not at all — so it's a clean, one-flag opt-out and never buried.</p>
147
+ </div>
148
+ <div class="item">
149
+ <h3><span class="chk off"></span> Status-bar version segment</h3>
150
+ <p class="what">Shows the running brain version in your Claude Code status line.</p>
151
+ <p class="cite">bin/install.mjs · --statusline to enable</p>
152
+ <p class="why"><b>Why optional:</b> pure preference — some people want the version in sight, most don't want another status-bar item. No reason to force either way.</p>
153
+ </div>
154
+ </div>
155
+ </section>
156
+
157
+ <p class="foot">
158
+ The rule the whole installer follows: <b>required things happen silently</b> (asking would be theatre — nothing works without them), <b>recommended things are asked with a default of yes and their cost-of-declining stated</b>, and <b>optional things stay off until you opt in, each with a reason it isn't on by default.</b> High-impact background jobs (auto-update, spend watchdog) are never silently enabled by a blanket <span class="cmd">--yes</span> — they always take a real answer.
159
+ </p>
160
+ </div>
161
+ </body>
162
+ </html>