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,858 @@
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
+ <meta name="color-scheme" content="dark light" />
7
+ <title>RuvNet Brain — the other 90%</title>
8
+ <!-- Same version-free brain mark as the console. -->
9
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 64 64%22><rect x=%222%22 y=%222%22 width=%2260%22 height=%2260%22 rx=%2216%22 fill=%22%230b0d12%22 stroke=%22%232c3850%22 stroke-width=%221.5%22/><path d=%22M25 48 C17 48 11.5 41.5 13.5 34.5 C10 29 13 21 19 19 C21 12.5 29 9.5 35 12 C43 9 50.5 14.5 50.5 22 C55 26 55 34.5 50 38 C49 43.5 43 47.5 37 46.5 L31 47.5 Z%22 fill=%22none%22 stroke=%22%23f0a830%22 stroke-width=%223.4%22 stroke-linejoin=%22round%22/><path d=%22M31 47 L31 33 M31 33 L24 27 M31 33 L40 24.5 M31 33 L41 36.5%22 fill=%22none%22 stroke=%22%23f0a830%22 stroke-width=%222.4%22 stroke-linecap=%22round%22 opacity=%22.9%22/><circle cx=%2224%22 cy=%2227%22 r=%223.4%22 fill=%22%235ad6ff%22/><circle cx=%2240%22 cy=%2224.5%22 r=%223.4%22 fill=%22%23f4b13a%22/><circle cx=%2241%22 cy=%2236.5%22 r=%223.4%22 fill=%22%235fd38a%22/></svg>" />
10
+
11
+ <script>
12
+ /* Resolve theme BEFORE first paint — same mechanism as the console (index.html). */
13
+ (function () {
14
+ var t = null;
15
+ try { t = localStorage.getItem('rbc-theme'); } catch (e) {}
16
+ if (t !== 'light' && t !== 'dark') {
17
+ try { t = matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'; }
18
+ catch (e) { t = 'dark'; }
19
+ }
20
+ document.documentElement.dataset.theme = t;
21
+ })();
22
+ </script>
23
+
24
+ <link rel="stylesheet" href="tips.css" />
25
+ </head>
26
+ <body>
27
+
28
+ <!-- ============================================================================
29
+ RESTRUCTURED 2026-07-22 around ONE idea the owner stated: "you use RuVector
30
+ as a vector DB — here's the other 90%."
31
+
32
+ Three faults were named in the previous cut, and each one is answered here:
33
+
34
+ 1. "It repeats MetaHarness too many times." It did — the word appeared six
35
+ times across four sections, and the ADR-076 figure was printed twice in
36
+ two different sections. Now: MetaHarness is named in exactly two places
37
+ (one item in the list, and the section that defines the word), and the
38
+ 28.5%/98.1% figure is cited ONCE. Duplicating a cited figure is not just
39
+ repetitive, it doubles the surface an anti-fabrication gate has to guard
40
+ (see tests/unit/adr-citation-integrity.test.mjs, born from exactly that).
41
+
42
+ 2. "It does not lead with what people MISS." It opened with reassurance
43
+ ("you don't have to learn the toolkit"). Reassurance is the wrong first
44
+ beat for someone who already owns the thing and is under-using it. The
45
+ page now leads with the ten capabilities most people never switch on.
46
+
47
+ 3. "It reads as a feature list, not 'here is what you already own and are
48
+ not using'." A feature list says what a thing HAS. Every item below says
49
+ what it IS in one plain line, what it BUYS you, and — the part a feature
50
+ list never has — HOW YOU'D KNOW IF IT'S ON. That third line is what turns
51
+ a brochure into an inventory.
52
+
53
+ HONESTY CONSTRAINT that shaped every "how to tell" line: this page is static
54
+ and reads nothing off the machine (see the footer — that is the console's
55
+ job, not this page's). So no item may state a count, a status, or a
56
+ percentage. Each one hands you the real command or the real file path and
57
+ tells you what a NEGATIVE result looks like, so the page is exactly as
58
+ truthful on a bare machine with nothing installed as it is on a loaded one.
59
+ Every path and command printed below was run on this machine before it was
60
+ written down; none was recalled from memory.
61
+ ============================================================================ -->
62
+
63
+ <a class="skip-link" href="#main">Skip to content</a>
64
+
65
+ <header class="head">
66
+ <div class="wrap head-inner">
67
+ <div class="brand">
68
+ <svg class="mark" viewBox="0 0 64 64" aria-hidden="true">
69
+ <rect class="mk-plate" x="2" y="2" width="60" height="60" rx="16" />
70
+ <path class="mk-brain" d="M25 48 C17 48 11.5 41.5 13.5 34.5 C10 29 13 21 19 19 C21 12.5 29 9.5 35 12 C43 9 50.5 14.5 50.5 22 C55 26 55 34.5 50 38 C49 43.5 43 47.5 37 46.5 L31 47.5 Z" />
71
+ <path class="mk-branch" d="M31 47 L31 33 M31 33 L24 27 M31 33 L40 24.5 M31 33 L41 36.5" />
72
+ <circle class="n2" cx="24" cy="27" r="4" /><circle class="n1" cx="40" cy="24.5" r="4" /><circle class="n3" cx="41" cy="36.5" r="4" />
73
+ </svg>
74
+ <span class="brand-text">RuvNet Brain <span class="brand-sub">the other 90%</span></span>
75
+ </div>
76
+ <div class="head-right">
77
+ <a class="back-chip mono" href="./">‹ console</a>
78
+ <button class="theme-toggle" id="theme-toggle" type="button" aria-label="Switch color theme">
79
+ <svg class="ic-sun" viewBox="0 0 24 24" aria-hidden="true">
80
+ <circle cx="12" cy="12" r="4.5" />
81
+ <g class="rays"><line x1="12" y1="2" x2="12" y2="5"/><line x1="12" y1="19" x2="12" y2="22"/><line x1="2" y1="12" x2="5" y2="12"/><line x1="19" y1="12" x2="22" y2="12"/><line x1="4.9" y1="4.9" x2="7" y2="7"/><line x1="17" y1="17" x2="19.1" y2="19.1"/><line x1="4.9" y1="19.1" x2="7" y2="17"/><line x1="17" y1="7" x2="19.1" y2="4.9"/></g>
82
+ </svg>
83
+ <svg class="ic-moon" viewBox="0 0 24 24" aria-hidden="true">
84
+ <path d="M20.4 14.3A8.5 8.5 0 0 1 9.7 3.6a8.5 8.5 0 1 0 10.7 10.7Z" />
85
+ </svg>
86
+ </button>
87
+ </div>
88
+ </div>
89
+ <div class="spectrum-edge" aria-hidden="true"></div>
90
+ </header>
91
+
92
+ <main id="main" class="wrap">
93
+
94
+ <!-- ======================================================= HERO
95
+ The lead is now the gap, not the reassurance. The vector store is the part
96
+ everybody finds on their own — it is the thing with an obvious name and an
97
+ obvious API. Everything else got installed at the same time and is sitting
98
+ there unasked-for. That is the whole page in two sentences. -->
99
+ <section class="intro">
100
+ <div class="intro-grid">
101
+ <div class="intro-copy">
102
+ <p class="eyebrow">RuvNet Brain · the guide</p>
103
+ <h1>You're using it as a vector database. <em>That's the smallest thing it does.</em></h1>
104
+ <p class="lede">Vectors in, neighbours out — that part is easy to find, so nearly everyone
105
+ stops there. What came with it is a <b>harness around the model you already pay for</b>:
106
+ hooks that learn from your edits, memory that returns on its own, gates that can refuse a
107
+ bad write, routing that quietly picks a cheaper model. Most of it ships switched off, or
108
+ simply never asked for. <b>Here's the rest of what you own.</b></p>
109
+
110
+ <!-- Verbatim from the hackerspace transcript, with ONE correction. The transcript is
111
+ machine speech-to-text and mis-renders the spoken product name "Ruflo" four
112
+ different ways in one document — "root flow", "rooflow", "RootFlow", "Root Flow".
113
+ That inconsistency is the ASR guessing at an unfamiliar proper noun. rUv said
114
+ Ruflo; printing the transcript's guess would put a word in his mouth he never
115
+ said. Source: docs/Ruv_advice/Ruv hackerspace Transcript.txt (Thu, Jul 16, 2026).
116
+ It leads here because it is the counter-argument to this page's own thesis, in
117
+ rUv's voice: owning more is worthless if you have to load it all. You don't. -->
118
+ <blockquote class="ruv-quote">
119
+ <p>“I don't have to load 350 skills in Ruflo that 99% of which I never use.
120
+ I can specifically learn and say that, for this particular task, I need a particular
121
+ plugin or skill. And the system is smart enough to be able to say, okay, I've seen
122
+ this before, therefore, I know that I need this particular skill to do this
123
+ particular task.”</p>
124
+ <footer class="mono">— rUv · hackerspace call, 2026-07-16 · sourced from the brain (<code>ruv-meetings</code>)</footer>
125
+ </blockquote>
126
+ </div>
127
+
128
+ <!-- The one metaphor, stated once and reused everywhere: three depth STRATA under your
129
+ prompt. Under the new thesis these strata answer the obvious follow-up — "fine, so how
130
+ do I switch the rest on?" — and the same three colours key the ten items below, so the
131
+ reader learns the code once. -->
132
+ <figure class="hero-art">
133
+ <!-- REBUILT 2026-07-24 (owner: "not sure I'm loving the three circles — something more
134
+ elegant"). The rings are now a CROSS-SECTION: depth is a vertical idea, so the three
135
+ depths read as horizontal strata under the prompt at the surface. This dissolves the
136
+ ring composition's structural flaw by construction — the old build needed leader lines
137
+ and a side column because seven labels crowded the rings' converging crowns; a stratum
138
+ is its own full-width lane, so every label sits inside the band it names. The stroke
139
+ encoding is UNCHANGED (solid cyan = always on · dashed amber = asked · dotted green =
140
+ named) and so are the label strings, so the legend and the ten cards below still key
141
+ perfectly. Depth 1 is now literally the surface — "asks nothing of you" made visual.
142
+ Color/type/motion live in tips.css under `.hero-scene`; both themes and
143
+ reduced-motion honored. Motion: the caret pulse drops down the plumb line and depth 1
144
+ catches it — bands 2 and 3 never stir. That IS the lesson. -->
145
+ <svg class="hero-scene" viewBox="0 0 460 300" role="img"
146
+ aria-label="A cross-section: a chat prompt reading 'just type' sits at the surface, and a plumb line drops through three depth strata beneath it. Depth one, always on — grounding, memory and gates; you do nothing. Depth two, say it — plain-English asks. Depth three, name it — commands, skills and tools you call directly. You already own all three.">
147
+
148
+ <!-- the surface: you, typing normally, and the plumb line your prompt rides down -->
149
+ <g class="hs-surface">
150
+ <rect class="hs-box" x="24" y="18" width="130" height="26" rx="8"/>
151
+ <text class="hs-prompt" x="89" y="35"><tspan class="hs-pmark">&gt;</tspan> just type<tspan class="hs-caret">▍</tspan></text>
152
+ <line class="hs-plumb" x1="89" y1="46" x2="89" y2="256"/>
153
+ <circle class="hs-pulse" cx="89" cy="50" r="4"/>
154
+ </g>
155
+
156
+ <!-- the strata, surface first. Each band's TOP EDGE carries the depth's stroke style;
157
+ each label lives INSIDE its own band — no leader lines, no side column. -->
158
+ <g class="hs-strata">
159
+ <rect class="hs-band b1" x="24" y="64" width="412" height="60" rx="9"/>
160
+ <line class="hs-edge e1 hs-b1-halo" x1="30" y1="64" x2="430" y2="64"/>
161
+ <text class="hs-main hs-l1" x="112" y="92">01 · ALWAYS ON</text>
162
+ <text class="hs-sub hs-note" x="430" y="92">you do nothing</text>
163
+ <text class="hs-sub" x="112" y="112">grounding · memory · gates</text>
164
+
165
+ <rect class="hs-band b2" x="24" y="132" width="412" height="60" rx="9"/>
166
+ <line class="hs-edge e2" x1="30" y1="132" x2="430" y2="132"/>
167
+ <text class="hs-main hs-l2" x="112" y="160">02 · SAY IT</text>
168
+ <text class="hs-sub" x="112" y="180">plain-English asks</text>
169
+
170
+ <rect class="hs-band b3" x="24" y="200" width="412" height="60" rx="9"/>
171
+ <line class="hs-edge e3" x1="30" y1="200" x2="430" y2="200"/>
172
+ <text class="hs-main hs-l3" x="112" y="228">03 · NAME IT</text>
173
+ <text class="hs-sub" x="112" y="248">commands · skills · tools</text>
174
+
175
+ <!-- the punchline — right-aligned on band 3's TITLE baseline, whose right half is
176
+ empty by construction ("03 · NAME IT" ends ~x=216; the punch starts ~x=270) -->
177
+ <text class="hs-punch" x="430" y="228">you already own all three</text>
178
+ </g>
179
+ </svg>
180
+ <figcaption class="hero-cap mono">three ways in · depth 1 asks nothing of you</figcaption>
181
+ </figure>
182
+ </div>
183
+
184
+ <p class="stage-legend mono" aria-label="The three depths of use">
185
+ <span class="lg-cap">three depths</span>
186
+ <span class="lg"><span class="lg-dot d-cyan"></span>1 · do nothing — always on</span>
187
+ <span class="lg"><span class="lg-dot d-amber"></span>2 · say it in plain English</span>
188
+ <span class="lg"><span class="lg-dot d-green"></span>3 · name the exact tool</span>
189
+ </p>
190
+ </section>
191
+
192
+ <!-- ============================================== THE INVENTORY · THE LEAD
193
+ This section is the page. It runs FIRST because the reader's problem is not
194
+ "what is this" — they already installed it — but "what am I sitting on that
195
+ I never turned on".
196
+
197
+ Card colour is not decoration: it repeats the three-depth key from the hero
198
+ and answers "what would it cost me to switch this on" at a glance.
199
+ cyan = no switch to flip; it works once the plugin is wired — you do nothing
200
+ amber = one plain-English sentence away
201
+ green = one command or file away
202
+ rail-pay (the spectrum spine) is used because this list spans all three
203
+ depths at once, which is exactly what that rail means everywhere else.
204
+
205
+ Every "how to tell" below was executed on this machine on 2026-07-22 before
206
+ being printed, and every one of them also states what a NEGATIVE looks like.
207
+ That second half is the honesty load-bearer: without it, a bare machine
208
+ reads a list of checks and concludes it is broken. -->
209
+ <section class="depth card rail-pay" id="inventory" aria-labelledby="inv-h">
210
+ <header class="depth-head">
211
+ <div class="depth-title">
212
+ <span class="stage st-pay mono">the other 90%</span>
213
+ <h2 id="inv-h">Ten things you already own — <em>and probably aren't using</em></h2>
214
+ <p class="q">None of these is a new purchase; they arrived with what you installed. Each one
215
+ says what it is in one line, what it actually buys you, and how you'd know whether it's on.
216
+ <!-- "cyan is already running" was a STATUS CLAIM on a page whose own honesty constraint (see
217
+ the comment at the top of this file) forbids stating any status, because it reads nothing
218
+ off the machine. On a bare machine it was simply false. The colour describes the COST OF
219
+ SWITCHING SOMETHING ON, which is a property of the capability and true everywhere; only
220
+ the console can tell you what is actually running. -->
221
+ The colour tells you the cost of switching it on:
222
+ <b>cyan</b> has no switch to flip, <b>amber</b> is one sentence away, <b>green</b> is one command away.
223
+ Whether any of them is on right now is a question only the console can answer.</p>
224
+ </div>
225
+ <span class="depth-num mono" aria-hidden="true">10</span>
226
+ </header>
227
+ <div class="depth-body">
228
+ <ul class="ambient-grid">
229
+
230
+ <li>
231
+ <span class="amb-ic ic-gr" aria-hidden="true">
232
+ <svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="2.4"/><path d="M7.8 7.8a6 6 0 0 0 0 8.4"/><path d="M16.2 16.2a6 6 0 0 0 0-8.4"/><path d="M5.2 5.2a9.6 9.6 0 0 0 0 13.6"/><path d="M18.8 18.8a9.6 9.6 0 0 0 0-13.6"/></svg>
233
+ </span>
234
+ <b>01 · Self-learning hooks</b>
235
+ <p>Hooks that sit on your edits and commands and record what actually worked.</p>
236
+ <span class="ask-cap mono">buys you</span>
237
+ <p>Suggestions and routing shaped by your repo instead of generic defaults — it stops re-deriving how your project works every session.</p>
238
+ <span class="ask-cap mono">how to tell</span>
239
+ <!-- Two styling traps in these cards, both found by measuring the render rather than reading
240
+ the CSS. (1) <em>, not <b>, for inline emphasis: `.ambient-grid b` is the CARD-TITLE rule
241
+ (fs-0, weight 650), so a <b> here silently renders LARGER than the line it sits in.
242
+ (2) The "how to tell" line is a <p>, not a `.peg-gloss`. As a gloss (fs--2) its nested
243
+ <code> — which is 0.86em — measured 9.5px at 390px, making the command you are meant to
244
+ TYPE the smallest text on the page. It is also the most valuable line on the card, so
245
+ fine-print treatment was wrong twice over. -->
246
+ <p>Run <code>ruflo hooks list</code>. Every row carries an <em>Enabled</em> and a <em>Last Executed</em> column — all “No” and “Never” means nothing is learning yet.</p>
247
+ </li>
248
+
249
+ <li>
250
+ <span class="amb-ic ic-gr" aria-hidden="true">
251
+ <svg viewBox="0 0 24 24"><path d="M4.5 19.5h15"/><rect x="6" y="12.5" width="3.4" height="7"/><rect x="10.8" y="8.5" width="3.4" height="11"/><rect x="15.6" y="5" width="3.4" height="14.5"/></svg>
252
+ </span>
253
+ <b>02 · Pretraining on your own repo</b>
254
+ <p>A one-shot pass that reads a repository and bootstraps patterns out of it.</p>
255
+ <span class="ask-cap mono">buys you</span>
256
+ <p>Day-one routing that already knows your layout and conventions, instead of a cold start it spends weeks recovering from.</p>
257
+ <span class="ask-cap mono">how to tell</span>
258
+ <p><code>ruflo hooks pretrain</code> runs it; <code>ruflo hooks metrics</code> shows what it took away. The counters live at <code>~/.claude-flow/neural/stats.json</code> — no file, no pretraining.</p>
259
+ </li>
260
+
261
+ <li>
262
+ <span class="amb-ic ic-cy" aria-hidden="true">
263
+ <svg viewBox="0 0 24 24"><path d="M8 15.5 L11 10 L15 13 L18 6.5"/><circle cx="8" cy="15.5" r="1.8"/><circle cx="11" cy="10" r="1.8"/><circle cx="15" cy="13" r="1.8"/><circle cx="18" cy="6.5" r="1.8"/><path d="M4.5 4v16h16"/></svg>
264
+ </span>
265
+ <b>03 · Memory that comes back on its own</b>
266
+ <p>A per-project store of decisions, written as you work and surfaced when you return.</p>
267
+ <span class="ask-cap mono">buys you</span>
268
+ <p>You stop re-explaining the project. Last week's decision is already in the room before you ask for it.</p>
269
+ <span class="ask-cap mono">how to tell</span>
270
+ <p>Run <code>ruflo memory search "&lt;something you decided&gt;"</code> in the project. Rows back means it's recording; the store is <code>.swarm/memory.db</code> inside that project, not a global one.</p>
271
+ </li>
272
+
273
+ <li>
274
+ <span class="amb-ic ic-am" aria-hidden="true">
275
+ <svg viewBox="0 0 24 24"><path d="M12.5 3L6 13.2h4.6l-1 7.8 6.4-11h-4.7z"/></svg>
276
+ </span>
277
+ <b>04 · Routing to a cheaper model</b>
278
+ <p>A router that sends each task to the least expensive model that can actually do it.</p>
279
+ <span class="ask-cap mono">buys you</span>
280
+ <p>The expensive model sits idle on work that never needed it — and every route leaves a receipt, so the saving is counted rather than claimed.</p>
281
+ <span class="ask-cap mono">how to tell</span>
282
+ <!-- The spoken phrase gets its own .say-wrap row rather than sitting inline in the gloss.
283
+ `.say` is only ever blockified by `.say-wrap`'s flex context; dropped inline into a
284
+ text run it stays display:inline, where its 7px vertical padding overflows the line
285
+ box and rides up into the line above instead of pushing it. Same fix in item 08. -->
286
+ <div class="say-wrap"><span class="say">“do this cheaper”</span></div>
287
+ <p>Receipts append to <code>~/.cache/ruvnet-brain/token-ledger.jsonl</code>; the console's savings card totals them. No file means nothing has been routed yet.</p>
288
+ </li>
289
+
290
+ <li>
291
+ <span class="amb-ic ic-cy" aria-hidden="true">
292
+ <svg viewBox="0 0 24 24"><path d="M12 3 4.5 6v6c0 4.4 3.2 8.2 7.5 9 4.3-.8 7.5-4.6 7.5-9V6z"/><path d="M9 12l2.2 2.2L15.5 10"/></svg>
293
+ </span>
294
+ <b>05 · Gates that can refuse a write</b>
295
+ <p>Checks that read a change before it lands, and can stop it outright.</p>
296
+ <span class="ask-cap mono">buys you</span>
297
+ <p>The bad edit never happens. You are not reviewing damage after the fact, which is the only kind of review that costs a whole afternoon.</p>
298
+ <span class="ask-cap mono">how to tell</span>
299
+ <p>Refusals are logged to <code>~/.cache/ruvnet-brain/gate-blocks.jsonl</code>; the console's gates card counts them. An empty log means nothing has been refused — <em>not</em> that nothing is armed.</p>
300
+ </li>
301
+
302
+ <li>
303
+ <span class="amb-ic ic-gr" aria-hidden="true">
304
+ <svg viewBox="0 0 24 24"><path d="M6 3.5h7.5L18.5 8.5V20.5H6z"/><path d="M13.3 3.5V8.7H18.5"/><path d="M8.5 14.2l2.1 2.1 4-4.4"/></svg>
305
+ </span>
306
+ <b>06 · Your corrections, kept as rules</b>
307
+ <p>The things you've told it — “always do X”, “never do Y” — captured in one file.</p>
308
+ <span class="ask-cap mono">buys you</span>
309
+ <p>A correction you gave once stops being a correction you give weekly.</p>
310
+ <span class="ask-cap mono">how to tell</span>
311
+ <p>Open <code>~/.config/ruvnet-brain/lessons.json</code>. Each entry carries a status — one still marked <code>candidate</code> is recorded but <em>not yet in force</em>, which is the difference people miss.</p>
312
+ </li>
313
+
314
+ <li>
315
+ <span class="amb-ic ic-cy" aria-hidden="true">
316
+ <svg viewBox="0 0 24 24"><path d="M20.4 14.3A8.5 8.5 0 0 1 9.7 3.6a8.5 8.5 0 1 0 10.7 10.7Z"/></svg>
317
+ </span>
318
+ <b>07 · Jobs that run while you sleep</b>
319
+ <p>Scheduled background work that refreshes the knowledge, the model list and the routing.</p>
320
+ <span class="ask-cap mono">buys you</span>
321
+ <p>The stack is current when you sit down, without you remembering to update anything.</p>
322
+ <span class="ask-cap mono">how to tell</span>
323
+ <p>On macOS, <code>launchctl list | grep ruvnet</code>. The second column is each job's last exit code. Nothing listed means none are installed — which is a normal, healthy state, not a fault.</p>
324
+ </li>
325
+
326
+ <li>
327
+ <span class="amb-ic ic-am" aria-hidden="true">
328
+ <svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="8"/><circle cx="12" cy="12" r="3.4"/><path d="M12 2.6v3.2M12 18.2v3.2M2.6 12h3.2M18.2 12h3.2"/></svg>
329
+ </span>
330
+ <b>08 · A harness policy actually in force</b>
331
+ <p>MetaHarness freezes the model and improves what wraps it; the winner gets written down.</p>
332
+ <span class="ask-cap mono">buys you</span>
333
+ <p>The wrapper keeps getting better on the model you already pay for — no retraining, no second subscription. (The word is explained further down.)</p>
334
+ <span class="ask-cap mono">how to tell</span>
335
+ <div class="say-wrap"><span class="say">“score my harness”</span></div>
336
+ <p><code>~/.claude-flow/harness-active-policy.json</code> holds the policy currently applied, or does not exist at all. Say the phrase above to see where yours stands.</p>
337
+ </li>
338
+
339
+ <li>
340
+ <span class="amb-ic ic-cy" aria-hidden="true">
341
+ <svg viewBox="0 0 24 24"><rect x="3.5" y="4.6" width="17" height="5.6" rx="1.6"/><rect x="3.5" y="13.8" width="17" height="5.6" rx="1.6"/><circle cx="7.4" cy="7.4" r="1"/><circle cx="7.4" cy="16.6" r="1"/></svg>
342
+ </span>
343
+ <b>09 · Tool servers it can already call</b>
344
+ <p>MCP servers registered once, globally, so every session can reach them.</p>
345
+ <span class="ask-cap mono">buys you</span>
346
+ <p>Searching rUv's real source, driving a browser, hitting the vector cache — from inside the conversation, with no copy-paste.</p>
347
+ <span class="ask-cap mono">how to tell</span>
348
+ <p><code>~/.claude.json</code> lists them under <code>mcpServers</code>. Careful: that proves they are <em>configured</em>. Nothing on disk proves a server is reachable, so nobody — including this page — should tell you they're connected.</p>
349
+ </li>
350
+
351
+ <li>
352
+ <span class="amb-ic ic-gr" aria-hidden="true">
353
+ <svg viewBox="0 0 24 24"><rect x="4" y="4" width="6.6" height="6.6" rx="1.6"/><rect x="13.4" y="4" width="6.6" height="6.6" rx="1.6"/><rect x="4" y="13.4" width="6.6" height="6.6" rx="1.6"/><rect x="13.4" y="13.4" width="6.6" height="6.6" rx="1.6"/></svg>
354
+ </span>
355
+ <b>10 · Skills already loaded in every project</b>
356
+ <p>Named commands installed at user scope, so they follow you into every repo.</p>
357
+ <span class="ask-cap mono">buys you</span>
358
+ <p>A whole disciplined workflow behind one word instead of a paragraph of instructions you retype.</p>
359
+ <span class="ask-cap mono">how to tell</span>
360
+ <p>Type <code>/</code> in Claude Code to see what's live; <code>~/.claude/settings.json</code> lists them under <code>enabledPlugins</code>. The board of five is at depth 3 below.</p>
361
+ </li>
362
+
363
+ </ul>
364
+ <p class="metaphor">It's the drawer of attachments that came with the appliance. Nothing here is
365
+ an upsell — the only thing missing was knowing they were in the box.</p>
366
+ </div>
367
+ </section>
368
+
369
+ <div class="stop-here mono" role="note">that's the list — everything below is how each one switches on</div>
370
+
371
+ <!-- ================================================ DEPTH 1 · AMBIENT
372
+ Trimmed 2026-07-22. This section used to carry its own three-card grid of
373
+ grounding / memory / gates — the exact same three capabilities that are now
374
+ items 03 and 05 above, described twice on one page in two different voices.
375
+ That duplication was a large part of why the page read as a feature list.
376
+ The section keeps its job (explaining the cyan tier) and gives up its list. -->
377
+ <section class="depth card rail-mirror" id="depth-1" aria-labelledby="d1-h">
378
+ <figure class="depth-art" aria-hidden="true">
379
+ <img src="assets/depth-1.webp" alt="" width="1584" height="672"
380
+ decoding="async" fetchpriority="low">
381
+ </figure>
382
+ <header class="depth-head">
383
+ <svg class="locator" viewBox="0 0 76 76" aria-hidden="true">
384
+ <circle cx="38" cy="38" r="28" fill="none" stroke="var(--illo-faint)" stroke-width="1.6" stroke-dasharray="2 8" stroke-linecap="round"/>
385
+ <circle cx="38" cy="38" r="19" fill="none" stroke="var(--illo-faint)" stroke-width="1.6" stroke-dasharray="5 6" stroke-linecap="round"/>
386
+ <circle cx="38" cy="38" r="10" fill="none" stroke="var(--cyan)" stroke-width="2.6"/>
387
+ <circle cx="38" cy="28" r="3" fill="var(--cyan)"/>
388
+ <circle cx="38" cy="38" r="2.4" fill="var(--illo-stroke)"/>
389
+ </svg>
390
+ <div class="depth-title">
391
+ <span class="stage st-mirror">Depth 1 · always on</span>
392
+ <h2 id="d1-h">Already on — you do not have to do anything</h2>
393
+ <p class="q">Grounding, memory capture and the gates run on every prompt once the plugin is
394
+ wired — whether or not you think about them. Type normally, like it's plain Claude.</p>
395
+ </div>
396
+ <span class="depth-num mono" aria-hidden="true">01</span>
397
+ </header>
398
+ <div class="depth-body">
399
+ <p>This is the tier people are already getting and never notice, which is the point: the only
400
+ visible evidence is an answer that cites real source instead of guessing, a decision that comes
401
+ back without being re-explained, and a bad write that quietly doesn't happen. If you switch on
402
+ nothing else on this page, you still have this.</p>
403
+ <p class="metaphor">Like a good spotter at the gym: silent on every rep, loud only when
404
+ you're about to drop the bar.</p>
405
+ </div>
406
+ </section>
407
+
408
+ <!-- ================================================= DEPTH 2 · ASKED -->
409
+ <section class="depth card rail-act" id="depth-2" aria-labelledby="d2-h">
410
+ <figure class="depth-art" aria-hidden="true">
411
+ <img src="assets/depth-2.webp" alt="" width="1584" height="672"
412
+ decoding="async" fetchpriority="low">
413
+ </figure>
414
+ <header class="depth-head">
415
+ <svg class="locator" viewBox="0 0 76 76" aria-hidden="true">
416
+ <circle cx="38" cy="38" r="28" fill="none" stroke="var(--illo-faint)" stroke-width="1.6" stroke-dasharray="2 8" stroke-linecap="round"/>
417
+ <circle cx="38" cy="38" r="19" fill="none" stroke="var(--amber)" stroke-width="2.6" stroke-dasharray="5 6" stroke-linecap="round"/>
418
+ <circle cx="38" cy="38" r="10" fill="none" stroke="var(--illo-faint)" stroke-width="1.6"/>
419
+ <circle cx="38" cy="19" r="3" fill="var(--amber)"/>
420
+ <circle cx="38" cy="38" r="2.4" fill="var(--illo-stroke)"/>
421
+ </svg>
422
+ <div class="depth-title">
423
+ <span class="stage st-rec">Depth 2 · when you ask</span>
424
+ <h2 id="d2-h">One sentence away — just ask, in plain English</h2>
425
+ <p class="q">No syntax to learn. These phrases are live triggers, verbatim from the shipped
426
+ plugin — say one and the right machinery wakes up.</p>
427
+ </div>
428
+ <span class="depth-num mono" aria-hidden="true">02</span>
429
+ </header>
430
+ <div class="depth-body">
431
+ <div class="ask-rows">
432
+ <div class="ask-row">
433
+ <span class="ask-cap mono">spend less</span>
434
+ <div class="say-wrap">
435
+ <span class="say">“do this cheaper”</span>
436
+ <span class="say">“cost-optimize this”</span>
437
+ <span class="say">“route this to a cheaper model”</span>
438
+ </div>
439
+ </div>
440
+ <div class="ask-row">
441
+ <span class="ask-cap mono">check the work</span>
442
+ <div class="say-wrap">
443
+ <span class="say">“QE this”</span>
444
+ <span class="say">“test this”</span>
445
+ <span class="say">“check coverage”</span>
446
+ </div>
447
+ </div>
448
+ <div class="ask-row">
449
+ <span class="ask-cap mono">tune the wrapper</span>
450
+ <div class="say-wrap">
451
+ <span class="say">“score my harness”</span>
452
+ <span class="say">“evolve my harness”</span>
453
+ <span class="say">“audit my harness”</span>
454
+ </div>
455
+ </div>
456
+ <div class="ask-row">
457
+ <span class="ask-cap mono">grade a repo</span>
458
+ <div class="say-wrap">
459
+ <span class="say">“score this repo”</span>
460
+ </div>
461
+ </div>
462
+ </div>
463
+ <p class="metaphor">It's asking a colleague, not typing a command.</p>
464
+ </div>
465
+ </section>
466
+
467
+ <!-- ================================================= DEPTH 3 · NAMED -->
468
+ <section class="depth card rail-prove" id="depth-3" aria-labelledby="d3-h">
469
+ <figure class="depth-art" aria-hidden="true">
470
+ <img src="assets/depth-3.webp" alt="" width="1584" height="672"
471
+ decoding="async" fetchpriority="low">
472
+ </figure>
473
+ <header class="depth-head">
474
+ <svg class="locator" viewBox="0 0 76 76" aria-hidden="true">
475
+ <circle cx="38" cy="38" r="28" fill="none" stroke="var(--green)" stroke-width="2.6" stroke-dasharray="2 8" stroke-linecap="round"/>
476
+ <circle cx="38" cy="38" r="19" fill="none" stroke="var(--illo-faint)" stroke-width="1.6" stroke-dasharray="5 6" stroke-linecap="round"/>
477
+ <circle cx="38" cy="38" r="10" fill="none" stroke="var(--illo-faint)" stroke-width="1.6"/>
478
+ <circle cx="38" cy="10" r="3" fill="var(--green)"/>
479
+ <circle cx="38" cy="38" r="2.4" fill="var(--illo-stroke)"/>
480
+ </svg>
481
+ <div class="depth-title">
482
+ <span class="stage st-prove">Depth 3 · when you name it</span>
483
+ <h2 id="d3-h">One command away — paste a single line in your terminal</h2>
484
+ <p class="q">When you know exactly what you want, reach for it by name. This is the complete
485
+ board — nothing hidden, nothing extra.</p>
486
+ </div>
487
+ <span class="depth-num mono" aria-hidden="true">03</span>
488
+ </header>
489
+ <div class="depth-body">
490
+ <div class="peg-groups">
491
+ <div class="peg">
492
+ <h3 class="peg-cap mono">slash commands</h3>
493
+ <ul class="peg-list">
494
+ <li><code>/ruvnet-brain:rvbc</code></li>
495
+ <li><code>/rvcb</code></li>
496
+ <li><code>/ruvnet-brain:configure</code></li>
497
+ </ul>
498
+ <p class="peg-note">All three open the same place — the console, the live mirror of your stack.</p>
499
+ </div>
500
+ <div class="peg">
501
+ <h3 class="peg-cap mono">skills</h3>
502
+ <ul class="peg-list">
503
+ <li><code>/brain-build</code><span class="peg-gloss">say what you want built — it runs the whole disciplined build</span></li>
504
+ <li><code>/brain-prompt</code><span class="peg-gloss">turns a rough idea into the right prompt</span></li>
505
+ <li><code>/brain-score</code><span class="peg-gloss">scores any repo 0–100, every deduction evidence-cited</span></li>
506
+ <li><code>/savings</code><span class="peg-gloss">the routing ledger — what each task cost, what it displaced</span></li>
507
+ <li><code>ruvnet-brain</code><span class="peg-gloss">the always-on one from depth 1 — you rarely type it yourself</span></li>
508
+ </ul>
509
+ <p class="peg-note">The complete set — five. That is the whole board.</p>
510
+ </div>
511
+ <div class="peg">
512
+ <h3 class="peg-cap mono">direct tools</h3>
513
+ <ul class="peg-list">
514
+ <li><code>search_ruvnet</code><span class="peg-gloss">query rUv's real source (MCP tool)</span></li>
515
+ <li><code>ruflo memory store</code><span class="peg-gloss">project memory, from the CLI</span></li>
516
+ <li><code>ruflo memory search</code><span class="peg-gloss">recall it the same way</span></li>
517
+ <li><code>ruflo hooks list</code><span class="peg-gloss">the learning hooks, and whether they've ever run</span></li>
518
+ </ul>
519
+ <p class="peg-note">For when you want to touch the machinery yourself.</p>
520
+ </div>
521
+ </div>
522
+ <p class="metaphor">Reaching for a specific tool on the pegboard — because you already know which one.</p>
523
+ </div>
524
+ </section>
525
+
526
+ <!-- =============================================== THE ARGUMENT
527
+ Moved BELOW the inventory (2026-07-22). It used to run second, before the
528
+ reader had any idea what they owned — an architecture diagram answering a
529
+ question nobody had asked yet. It lands better as the "why does wrapping
530
+ the model matter at all" backstop for the ten items above.
531
+ Scroll-wrapped: see .diagram-scroll in tips.css for why compressing it is
532
+ not an option. -->
533
+ <section class="depth card rail-act" id="why" aria-labelledby="why-h">
534
+ <header class="depth-head">
535
+ <div class="depth-title">
536
+ <span class="stage st-rec">why wrapping the model is the whole lever</span>
537
+ <h2 id="why-h">Same model. Same prompt. <em>Everything around it.</em></h2>
538
+ <p class="q">rUv's lever isn't a smarter model — it's what wraps the one you already
539
+ have. Plain Claude Code sends your prompt straight at an expensive model and takes
540
+ whatever comes back. The harness grounds it, routes it to the cheapest model that can
541
+ actually do the job, hands back what your project already decided, inspects the write
542
+ before it lands, and checks it on the way out. You type the same thing either way.</p>
543
+ </div>
544
+ </header>
545
+ <div class="depth-body">
546
+ <figure class="diagram-scroll" style="--dmin: 780px">
547
+ <img src="assets/harness-vs-plain.svg" width="1000" height="652"
548
+ alt="The same prompt sent two ways. Left, plain Claude Code: a bare wire to one
549
+ frontier model that costs the most on every task, with no grounding, no memory and
550
+ no gates, producing an unchecked answer. Right, the same model wrapped in the RuvNet
551
+ harness: the prompt passes through GROUND (cited, not guessed), ROUTE (cheapest
552
+ capable model, with the frontier model mostly idle), RECALL (prior decisions
553
+ return), GATE (inspects the write and can refuse it), and VERIFY (provenance and
554
+ safety gate), producing an answer that is grounded, cited and checked." decoding="async">
555
+ <figcaption class="mono">the left lane finishes first — and that's the problem</figcaption>
556
+ </figure>
557
+ </div>
558
+ </section>
559
+
560
+ <!-- =================================================== THE WORD NOBODY KNOWS
561
+ Stuart: "If you haven't ever seen MetaHarness, you have no idea what the word means, and you
562
+ have no idea what you should expect it to do. Saying 'do you want to use it or not' without
563
+ any visual explaining what it does is a little challenging."
564
+ rUv wrote the same risk into ADR-076 himself: "'Meta-harness' is a newer term; the README must
565
+ define it in the first screen so it doesn't read as jargon. Mitigation: the one-line 'freeze
566
+ the model, evolve the harness' gloss + the four-pillar framing." This is that mitigation.
567
+
568
+ THE ONE PLACE THE WORD IS DEFINED, and the ONE place the 28.5%/98.1% figure is printed.
569
+ It previously appeared in this section AND again as a trade-note in the capstone — the same
570
+ cited number twice on one page. Beyond being repetitive, every extra copy of a cited figure
571
+ is another surface tests/unit/adr-citation-integrity.test.mjs has to guard, and that gate
572
+ exists precisely because this figure was once attributed to the wrong ADR (073, Proposed and
573
+ silent on the number, rather than 076, Accepted and stating it). One copy, one citation. -->
574
+ <section class="depth card rail-prove" id="metaharness" aria-labelledby="mh-h">
575
+ <header class="depth-head">
576
+ <div class="depth-title">
577
+ <span class="stage st-prove mono">the word nobody knows</span>
578
+ <h2 id="mh-h">So what <em>is</em> MetaHarness?</h2>
579
+ <p class="depth-sub">Item 08 above offers to turn it on. Fair question: on for what? Here is the
580
+ whole idea in one picture — you can't retrain the model, so evolve everything wrapped around it.</p>
581
+ </div>
582
+ <span class="depth-num mono" aria-hidden="true">☰</span>
583
+ </header>
584
+ <div class="depth-body">
585
+ <!-- --dmin 900px is MEASURED, not guessed: at a 900-unit viewBox the smallest label hits
586
+ exactly 12px effective there. Below it the labels drop under the floor (629px -> 8.4px,
587
+ 261px -> 3.5px), which is how this shipped unreadable on a phone. 831px would carry the
588
+ primary structure but leaves fine print at 11.1px — not worth shaving a swipe for.
589
+ height is 560 (the REAL viewBox height); it was 470, a wrong aspect that caused layout
590
+ shift. loading="lazy" removed: a lazy image on this page already shipped once and never
591
+ fetched at all. -->
592
+ <figure class="diagram-scroll mh-figure" style="--dmin: 900px">
593
+ <img src="assets/metaharness.svg" alt="MetaHarness: the model sits frozen at the centre while
594
+ seven policy surfaces around it — planner, contextBuilder, reviewer, retryPolicy, toolPolicy,
595
+ memoryPolicy and scorePolicy — are each mutated and measured. Four pillars run underneath:
596
+ route, evolve, orchestrate, verify. Per agentic-flow ADR-076: 28.5% cheaper at 98.1% bar-compliance."
597
+ width="900" height="560" decoding="async" />
598
+ <figcaption class="mono">the model never moves — everything around it does</figcaption>
599
+ </figure>
600
+ <p class="metaphor">The seven surfaces take turns changing. The model in the middle never moves —
601
+ that's the whole trick, and it's why this works on the Claude you already have.</p>
602
+ <p class="mh-cite mono">Grounded in rUv's own accepted ADRs — seven surfaces
603
+ <code>ADR-075</code> · four pillars and the 28.5% figure <code>ADR-076</code>.
604
+ Nothing here is inferred.</p>
605
+ </div>
606
+ </section>
607
+
608
+ <!-- =================================================== CAPSTONE · THE PAYOFF
609
+ The crown of the page. Everything above is inventory and mechanism; this is the
610
+ reinforcement — the education ask is small, the return is large.
611
+ It reuses the .card / .depth-head idiom so it reads as the same page, and earns a
612
+ SPECTRUM rail (rail-pay) because this is where all three depths pay off at once.
613
+
614
+ CUT 2026-07-22 — the momentum block (~1.48M downloads/month and five per-package
615
+ bars). Two reasons, and the first is the binding one: those were hardcoded literals
616
+ from a dated snapshot on a page that reads nothing at render time, which is exactly
617
+ the class of number this project has been burned by. Honest labelling ("not live")
618
+ made it defensible, not right. Second, ecosystem download counts are off-thesis:
619
+ how popular the packages are says nothing about what THIS reader owns and isn't
620
+ using, which is the only question the page now answers. If it comes back it should
621
+ fetch api.npmjs.org at load, or live on the console where numbers are derived. -->
622
+ <section class="depth card rail-pay capstone" id="capstone" aria-labelledby="cap-h">
623
+ <header class="depth-head">
624
+ <div class="depth-title">
625
+ <span class="stage st-pay mono">the payoff</span>
626
+ <h2 id="cap-h">You're not learning a new tool. <em>You're multiplying the ones you already pay&nbsp;for.</em></h2>
627
+ <p class="depth-sub">The learning curve is small — most of the list above is cyan, which is
628
+ doing nothing. The return is world-class output: grounded, cheaper, checked. It works the same
629
+ whether you write code or just describe what you want.</p>
630
+ </div>
631
+ <span class="depth-num mono" aria-hidden="true">04</span>
632
+ </header>
633
+ <div class="depth-body">
634
+
635
+ <!-- the does / doesn't — effort you're spared vs power you gain. Not feature-vs-feature:
636
+ the left column is work you no longer do, the right is what you get. The spine between
637
+ them carries a transform arrow (→ on desktop, ↓ on mobile). -->
638
+ <div class="trade" role="group" aria-label="What the harness spares you, and what it gives you in return">
639
+
640
+ <div class="trade-col trade-spared">
641
+ <h3 class="trade-cap mono">
642
+ <span class="trade-cap-ic" aria-hidden="true">
643
+ <svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="8.5" fill="none" stroke="currentColor" stroke-width="1.7"/><path d="M8 12h8" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/></svg>
644
+ </span>
645
+ What it doesn't ask of you
646
+ </h3>
647
+ <ul class="trade-list">
648
+ <li>
649
+ <span class="trade-ic" aria-hidden="true">
650
+ <svg viewBox="0 0 24 24"><rect x="4" y="4" width="6.6" height="6.6" rx="1.6"/><rect x="13.4" y="4" width="6.6" height="6.6" rx="1.6"/><rect x="4" y="13.4" width="6.6" height="6.6" rx="1.6"/><rect x="13.4" y="13.4" width="6.6" height="6.6" rx="1.6"/></svg>
651
+ </span>
652
+ <span class="trade-txt">You don't have to master the ten things above — it knows which one this task needs.</span>
653
+ </li>
654
+ <li>
655
+ <span class="trade-ic" aria-hidden="true">
656
+ <svg viewBox="0 0 24 24"><circle cx="9.5" cy="9.5" r="5.8"/><circle cx="9.5" cy="9.5" r="2.4"/><path d="M17 12.5v6.5"/><path d="M14 16.5l3 3 3-3"/></svg>
657
+ </span>
658
+ <span class="trade-txt">You don't pay frontier prices for everything — it routes to the cheapest model that can do the job.</span>
659
+ </li>
660
+ <li>
661
+ <span class="trade-ic" aria-hidden="true">
662
+ <svg viewBox="0 0 24 24"><path d="M3 9l9-4 9 4-9 4-9-4z"/><path d="M7 11v4.2c0 1.4 2.4 2.4 5 2.4s5-1 5-2.4V11"/><path d="M21 9v4.6"/></svg>
663
+ </span>
664
+ <span class="trade-txt">You don't have to be an expert — or even a coder.</span>
665
+ </li>
666
+ <li>
667
+ <span class="trade-ic" aria-hidden="true">
668
+ <svg viewBox="0 0 24 24"><path d="M4.6 12a7.4 7.4 0 0 1 12.6-5.2L20 9.4"/><path d="M20 4.2v5.2h-5.2"/><path d="M19.4 12a7.4 7.4 0 0 1-12.6 5.2L4 14.6"/><path d="M4 19.8v-5.2h5.2"/></svg>
669
+ </span>
670
+ <span class="trade-txt">You don't re-explain your project every session — it remembers.</span>
671
+ </li>
672
+ </ul>
673
+ </div>
674
+
675
+ <div class="trade-spine" aria-hidden="true">
676
+ <span class="trade-arrow">
677
+ <svg viewBox="0 0 24 24"><path d="M4 12h15"/><path d="M13 6l6 6-6 6"/></svg>
678
+ </span>
679
+ </div>
680
+
681
+ <div class="trade-col trade-gain">
682
+ <h3 class="trade-cap mono">
683
+ <span class="trade-cap-ic" aria-hidden="true">
684
+ <svg viewBox="0 0 24 24"><path d="M12 3.5l2.4 6.1 6.1.2-4.8 3.8 1.7 5.9-5.4-3.4-5.4 3.4 1.7-5.9L3.5 9.8l6.1-.2z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></svg>
685
+ </span>
686
+ What it gives you
687
+ </h3>
688
+ <ul class="trade-list">
689
+ <li>
690
+ <span class="trade-ic ic-cy" aria-hidden="true">
691
+ <svg viewBox="0 0 24 24"><path d="M6 3.5h7.5L18.5 8.5V20.5H6z"/><path d="M13.3 3.5V8.7H18.5"/><path d="M8.5 14.2l2.1 2.1 4-4.4"/></svg>
692
+ </span>
693
+ <span class="trade-txt">Answers grounded in real source, not guesses.</span>
694
+ </li>
695
+ <li>
696
+ <span class="trade-ic ic-am" aria-hidden="true">
697
+ <svg viewBox="0 0 24 24"><path d="M12.5 3L6 13.2h4.6l-1 7.8 6.4-11h-4.7z"/></svg>
698
+ </span>
699
+ <span class="trade-txt">The cheapest capable model on every task — the expensive one stays idle.</span>
700
+ </li>
701
+ <li>
702
+ <span class="trade-ic ic-gr" aria-hidden="true">
703
+ <svg viewBox="0 0 24 24"><path d="M12 3 5 6v6c0 4.2 3 7.6 7 8.6 4-1 7-4.4 7-8.6V6z"/><path d="M9 12l2.1 2.1L15.2 9.8"/></svg>
704
+ </span>
705
+ <span class="trade-txt">Gates that inspect — and can refuse a bad write before it lands.</span>
706
+ </li>
707
+ <li>
708
+ <span class="trade-ic ic-am" aria-hidden="true">
709
+ <svg viewBox="0 0 24 24"><path d="M11 3l1.7 4.6L17.3 9l-4.6 1.7L11 15.3 9.3 10.7 4.7 9l4.6-1.7z"/><path d="M17.5 14.5l.9 2.4 2.4.9-2.4.9-.9 2.4-.9-2.4-2.4-.9 2.4-.9z"/></svg>
710
+ </span>
711
+ <span class="trade-txt">World-class AI apps — whether you write code or just describe what you want.</span>
712
+ </li>
713
+ </ul>
714
+ </div>
715
+ </div>
716
+
717
+ <!-- "most of them already running" was a claim about the reader's machine made by a page that
718
+ has never looked at it. On a genuinely bare machine 2 of 11 are on, so it was also wrong. -->
719
+ <p class="capstone-close">Ten capabilities, one install, and none of them a new purchase.
720
+ <b>Small ask, world-class return.</b> How many are actually on is a question this page cannot
721
+ answer — the console reads your machine and tells you, live.</p>
722
+ </div>
723
+ </section>
724
+
725
+ <!-- ================================================= THE PARTS DRAWER
726
+ Owner, 2026-07-24: "you'd like to know that there are a lot of tools at your disposal that you
727
+ can reach for and bring in intelligence when you need it… a one-liner per could be useful."
728
+ And: this page gets re-read, the installer page is seen once — so the reference belongs here.
729
+
730
+ EVERY LINE IS GROUNDED. Each entry below was read out of rUv's own source this session via
731
+ search_ruvnet and carries the file it came from. Nothing here is recalled, and nothing is
732
+ inferred from a name that merely sounds right — inventing a rUv capability is the single
733
+ worst failure this project has on record.
734
+
735
+ THE FRAME IS LOAD-BEARING. These are parts that exist IN RUV'S SOURCE. Most are NOT wired
736
+ into the reader's machine, and saying so plainly is the difference between a catalogue and a
737
+ lie: the console next door reports what you actually have, and it must never be contradicted
738
+ by this page. "You don't need most of these" is also true, and says so. -->
739
+ <section class="depth card rail-mirror" id="parts" aria-labelledby="parts-h">
740
+ <header class="depth-head">
741
+ <div class="depth-title">
742
+ <span class="stage st-mirror">the parts drawer · reach for one when the problem calls for it</span>
743
+ <h2 id="parts-h">The pieces inside. <em>You will not need them all.</em></h2>
744
+ <p class="q">These live in rUv's source, and most are <strong>not</strong> switched on for you —
745
+ that is normal and fine. Using every advanced part in every project is overkill. The point of a
746
+ list like this is that when you hit the problem, you know the part already exists and you can
747
+ reach for it instead of building it. Your console shows what you actually have running today.</p>
748
+ </div>
749
+ </header>
750
+
751
+ <div class="parts-grid">
752
+ <div class="parts-col">
753
+ <h3>Finding things</h3>
754
+ <dl>
755
+ <dt>HNSW index</dt><dd>Approximate nearest-neighbour search — the default when the corpus is big. <code>ruvector-core/src/index/hnsw.rs</code></dd>
756
+ <dt>Flat index</dt><dd>Exact search, no approximation, for when the corpus is small enough. <code>ruvector-core/src/index/flat.rs</code></dd>
757
+ <dt>Hyperbolic HNSW</dt><dd>Poincaré-ball geometry for tree-shaped data — parent/child distances survive the embedding. For taxonomies and code trees. <code>ruvector-hyperbolic-hnsw/src/hnsw.rs</code></dd>
758
+ <dt>RaBitQ quantisation</dt><dd>32× memory reduction with a Hamming prefilter — reach for it when a large corpus stops fitting comfortably. <code>ruflo · embeddings_rabitq_build</code></dd>
759
+ <dt>Product quantisation</dt><dd>Compressed vectors, smaller index. <code>ruvector-core/src/advanced_features/product_quantization.rs</code></dd>
760
+ <dt>Matryoshka embeddings</dt><dd>Progressive retrieval: a cheap coarse pass first, full precision only for finalists. <code>advanced_features/matryoshka.rs</code></dd>
761
+ <dt>Hybrid search</dt><dd>Combines several vector representations in one query. <code>advanced_features/hybrid_search.rs</code></dd>
762
+ <dt>Multi-vector search</dt><dd>Joint embeddings — one item represented by several vectors. <code>advanced_features/multi_vector.rs</code></dd>
763
+ <dt>Filtered search</dt><dd>Vector search with metadata predicates applied. <code>advanced_features/filtered_search.rs</code></dd>
764
+ <dt>Sparse vectors</dt><dd>Efficiency gains where the representation is mostly zeros. <code>advanced_features/sparse_vector.rs</code></dd>
765
+ <dt>Graph RAG</dt><dd>Retrieval-augmented generation over a graph rather than a flat list. <code>advanced_features/graph_rag.rs</code></dd>
766
+ </dl>
767
+ </div>
768
+
769
+ <div class="parts-col">
770
+ <h3>Getting better over time</h3>
771
+ <dl>
772
+ <dt>SONA</dt><dd>Self-Optimising Neural Architecture — trajectory tracking, pattern recognition, and memory protection so new learning does not erase old. <code>ruvllm/src/sona.ts</code></dd>
773
+ <dt>Micro-LoRA</dt><dd>A deliberately tiny adapter (rank 1–2) driving SONA's instant loop — adaptation without retraining anything large. <code>ruvllm/src/sona.ts</code></dd>
774
+ <dt>MicroLoRA SDK</dt><dd>Browser-based LoRA fine-tuning of small models, built for edge deployment and a minimal memory footprint. <code>edge-net/pkg/models/microlora.js</code></dd>
775
+ <dt>EWC++</dt><dd>Continual learning that avoids catastrophic forgetting — the reason adaptation does not cost you yesterday's behaviour. <code>@ruvector/sona</code></dd>
776
+ </dl>
777
+
778
+ <h3>Remembering things</h3>
779
+ <dl>
780
+ <dt>Agent memory</dt><dd>Thousands of memory clusters with coherence-weighted compaction — old memory is condensed, not truncated. <code>ruvector-agent-memory</code></dd>
781
+ <dt>Hopfield associative memory</dt><dd>Recall a whole pattern from a partial cue. <code>ruvector-nervous-system · hopfield::ModernHopfield</code></dd>
782
+ <dt>Dentate-gyrus separation</dt><dd>Keeps similar memories from blurring into each other. <code>ruvector-nervous-system · separate::DentateGyrus</code></dd>
783
+ <dt>BTSP</dt><dd>One-shot learning — a single exposure is enough to lay something down. <code>ruvector-nervous-system · plasticity::btsp</code></dd>
784
+ </dl>
785
+
786
+ <h3>Everything else in the drawer</h3>
787
+ <dl>
788
+ <dt>Sparse inference embeddings</dt><dd>PowerInfer-style sparse feed-forward nets with a configurable sparsity ratio. <code>ruvector-sparse-inference</code></dd>
789
+ <dt>CNN backbone</dt><dd>MobileNetV3 (small and large) for image features. <code>ruvector-cnn/src/backbone/mod.rs</code></dd>
790
+ <dt>Attention CLI</dt><dd>compute · benchmark · convert · serve · repl, driven by a YAML config. <code>ruvector-attention-cli</code></dd>
791
+ </dl>
792
+ </div>
793
+ </div>
794
+
795
+ <p class="parts-foot">Every line above was read out of rUv's source, and names the file it came from,
796
+ so you can go look. If something here is not in your console, it is not running on your
797
+ machine — this drawer is what is <em>available</em>, not what is <em>on</em>.</p>
798
+ </section>
799
+
800
+ <!-- ================================================= SETUP · INSTALL PATHS -->
801
+ <section class="depth card rail-mirror" id="install" aria-labelledby="inst-h">
802
+ <header class="depth-head">
803
+ <div class="depth-title">
804
+ <span class="stage st-mirror">setup · the question people keep asking</span>
805
+ <h2 id="inst-h">Plugin, global, or both? <em>You want both — and they aren't rivals.</em></h2>
806
+ <p class="q">RuvNet Brain is two layers, not two competing install methods. One command sets up both,
807
+ and you run it once.</p>
808
+ </div>
809
+ <span class="depth-num mono" aria-hidden="true">◎</span>
810
+ </header>
811
+ <div class="depth-body">
812
+ <p><b>The surface — the Claude Code plugin.</b> The <code>search_ruvnet</code> tool, the grounding
813
+ hooks, and the <code>/configure</code> console. Installed once at <b>user scope</b>, so it works in
814
+ <em>every</em> project. This is what makes Claude actually <em>use</em> the stack instead of drifting
815
+ back to the classical defaults it was trained on.</p>
816
+ <p><b>The knowledge — the brain bundle.</b> rUv's real source, indexed, at
817
+ <code>~/.cache/ruvnet-brain/kb</code>. Downloaded once from the latest Release; the
818
+ <code>search_ruvnet</code> tool reads it locally — no cloud, no API key. Refreshed when a new Release
819
+ ships, never re-fetched per query.</p>
820
+ <p><b>One command wires both.</b> <code>npx ruvnet-brain</code> installs the plugin <em>and</em>
821
+ downloads the bundle, narrating each step — that's the whole setup. Prefer to do it by hand?
822
+ <code>claude plugin marketplace add stuinfla/ruvnet-brain</code>, then
823
+ <code>claude plugin install ruvnet-brain@ruvnet-brain --scope user</code>.</p>
824
+ <p class="metaphor">Running both layers is <b>not</b> wasted resources — they do different jobs: the
825
+ npm package <em>installs and updates</em>; the plugin is the <em>runtime surface</em> Claude loads
826
+ each session.</p>
827
+ <p>Bare <code>npx …@latest --update</code> is for a one-off update, <em>not</em> a persistent install
828
+ — the always-on grounding lives in the plugin's hooks, which a throwaway npx copy never wires. Keep
829
+ the plugin installed at user scope; reach for npx only to install or update.</p>
830
+ <p>Which am I actually running? The console shows your real stack — every rUv piece it finds and
831
+ whether each one is current. Want something it didn't find, like <code>ruflo</code> or
832
+ <code>agentic-flow</code>? You have three ways to add it, and none is forced on you: the plugin
833
+ marketplace, <code>npm&nbsp;i&nbsp;-g&nbsp;&lt;tool&gt;</code>, or <code>npx&nbsp;&lt;tool&gt;</code>
834
+ for a one-off. The Brain works with any of them.</p>
835
+ <a class="btn-console" href="./">Open the console — see your real setup <span aria-hidden="true">→</span></a>
836
+ </div>
837
+ </section>
838
+
839
+ <!-- =================================================== GUIDE, NOT MIRROR -->
840
+ <section class="closer" aria-label="Where to see live state">
841
+ <p class="closer-line">This page is the guide — it tells you what exists and how to check it.
842
+ The console is the mirror: which of the ten are on <b>right now, on this machine</b>.</p>
843
+ <a class="btn-console" href="./">Open the console <span aria-hidden="true">→</span></a>
844
+ </section>
845
+
846
+ </main>
847
+
848
+ <footer class="foot">
849
+ <div class="wrap foot-inner">
850
+ <p class="foot-line">RuvNet Brain · the other 90% — a static guide, served locally from
851
+ <code>127.0.0.1</code>. Nothing here reads your machine; that's why every item hands you the
852
+ command to check it yourself. The console does the reading.</p>
853
+ </div>
854
+ </footer>
855
+
856
+ <script defer src="tips.js"></script>
857
+ </body>
858
+ </html>