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
Binary file
Binary file
Binary file
@@ -0,0 +1,259 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 652" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="hvp-t hvp-d">
2
+ <title id="hvp-t">Plain Claude Code vs Claude Code inside the RuvNet harness</title>
3
+ <desc id="hvp-d">The same prompt enters two pipelines side by side. Left, plain: the prompt goes straight
4
+ through one expensive frontier model to an unchecked, uncited answer — nothing in between. Right, the
5
+ RuvNet harness: the same prompt is grounded against real sources and cited, routed to the cheapest
6
+ capable model while the frontier model sits mostly idle, enriched with prior decisions recalled from
7
+ project memory, inspected by a gate that can refuse a bad write, then verified for provenance and
8
+ safety before the answer lands — grounded, cited, checked. Payoff: a cheap model in a good harness
9
+ approximately equals a frontier model, for less. Per agentic-flow's ADR-076: 28.5 percent cheaper at
10
+ 98.1 percent bar-compliance.</desc>
11
+
12
+ <style>
13
+ :root {
14
+ --ink:#1a1d24; --ink2:#40454f; --muted:#6b7078; --faint:#a4a89f;
15
+ --ridge:#d9d3c3; --surface:#fbf9f2; --track:#c6c0ae;
16
+ --amber:#c8890f; --cyan:#1489b8; --green:#2e9e5b; --red:#d8402c;
17
+ --amT:#8a5d00; --cyT:#0b6a8f; --grT:#1a7a44; --rdT:#b3321f;
18
+ }
19
+ @media (prefers-color-scheme: dark) {
20
+ :root {
21
+ --ink:#ece8dc; --ink2:#c3c2b6; --muted:#8f94a1; --faint:#5a5f6e;
22
+ --ridge:#2a3140; --surface:#13171e; --track:#2a3140;
23
+ --amber:#f0a830; --cyan:#5ad6ff; --green:#5fd38a; --red:#ff6b5e;
24
+ --amT:#f0a830; --cyT:#5ad6ff; --grT:#5fd38a; --rdT:#ff6b5e;
25
+ }
26
+ }
27
+ .mono { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; }
28
+ .serif { font-family: "Iowan Old Style", Palatino, Georgia, serif; }
29
+ .b { font-weight: 700; }
30
+ .ink { fill: var(--ink); } .ink2 { fill: var(--ink2); }
31
+ .muted { fill: var(--muted); } .faint { fill: var(--faint); }
32
+ .amT { fill: var(--amT); } .cyT { fill: var(--cyT); }
33
+ .grT { fill: var(--grT); } .rdT { fill: var(--rdT); }
34
+ .trk { stroke: var(--track); stroke-width: 2; fill: none; }
35
+ .cor { stroke: var(--track); stroke-width: 1.5; fill: none; stroke-dasharray: 3 5; }
36
+ .node { fill: var(--surface); stroke-width: 2.2; }
37
+ .sAm { stroke: var(--amber); } .sCy { stroke: var(--cyan); }
38
+ .sGr { stroke: var(--green); } .sRd { stroke: var(--red); }
39
+ .sRg { stroke: var(--ridge); }
40
+ .fx { opacity: 0; } /* motion-only overlays: hidden at rest */
41
+ .refuse { opacity: .9; } /* informative at rest, flashes in motion */
42
+ .burnHalo { opacity: .14; }
43
+ .comet { display: none; } /* comets exist only when motion is allowed */
44
+
45
+ @media (prefers-reduced-motion: no-preference) {
46
+ .comet { display: inline; fill: none; stroke-linecap: round; }
47
+ .cC { stroke-width: 4.5; }
48
+ .cH { stroke-width: 11; opacity: .16; }
49
+ .cometL { stroke: var(--amber); stroke-dasharray: 26 1700; animation: kL 12s linear infinite; }
50
+ .cometR { stroke-dasharray: 26 1700; animation: kR 12s linear infinite; }
51
+ .cometG { stroke: var(--cyan); stroke-width: 3.5; stroke-dasharray: 18 900; animation: kG 12s linear infinite; }
52
+ .cometRt { stroke-width: 3.5; stroke-dasharray: 18 900; animation: kRt 12s linear infinite; }
53
+ .cometM { stroke: var(--cyan); stroke-width: 3.5; stroke-dasharray: 18 900; animation: kM 12s linear infinite; }
54
+ .fx.ping { animation: ping 12s linear infinite; transform-box: fill-box; transform-origin: center; }
55
+ .fx.pop { animation: pop 12s linear infinite; }
56
+ .fx.popL { animation: popL 12s linear infinite; }
57
+ .refuse { animation: refuse 12s linear infinite; }
58
+ .burnHalo { animation: burn 12s ease-in-out infinite; }
59
+ .chipL { animation: kChipL 12s linear infinite; }
60
+ .chipR { animation: kChipR 12s linear infinite; }
61
+ .tick { animation: tick 12s linear infinite; }
62
+
63
+ /* left lane: fast, done by 2.5s, then inert */
64
+ @keyframes kL {
65
+ 0%,3% { stroke-dashoffset: 26; }
66
+ 12% { stroke-dashoffset: -543; }
67
+ 15% { stroke-dashoffset: -543; }
68
+ 20% { stroke-dashoffset: -773; }
69
+ 22%,100% { stroke-dashoffset: -812; }
70
+ }
71
+ /* right lane: the packet walks the pipeline, pauses at each stage,
72
+ is refused once at the gate (bounce), passes green */
73
+ @keyframes kR {
74
+ 0%,3% { stroke-dashoffset: 26; stroke: var(--amber); }
75
+ 12% { stroke-dashoffset: -177; }
76
+ 20% { stroke-dashoffset: -177; }
77
+ 26% { stroke-dashoffset: -253; }
78
+ 33% { stroke-dashoffset: -253; }
79
+ 39% { stroke-dashoffset: -329; }
80
+ 46% { stroke-dashoffset: -329; }
81
+ 50% { stroke: var(--amber); }
82
+ 52% { stroke-dashoffset: -405; }
83
+ 53% { stroke: var(--red); }
84
+ 54.5% { stroke-dashoffset: -375; }
85
+ 58% { stroke-dashoffset: -375; stroke: var(--red); }
86
+ 61% { stroke-dashoffset: -423; }
87
+ 62% { stroke: var(--green); }
88
+ 65% { stroke-dashoffset: -471; }
89
+ 70% { stroke-dashoffset: -471; }
90
+ 76% { stroke-dashoffset: -533; }
91
+ 80%,100% { stroke-dashoffset: -572; stroke: var(--green); }
92
+ }
93
+ /* side excursions: out to the apparatus, then the result comes back */
94
+ @keyframes kG { 0%,13% { stroke-dashoffset: 18; } 17% { stroke-dashoffset: -340; }
95
+ 21% { stroke-dashoffset: -340; } 25%,100% { stroke-dashoffset: 18; } }
96
+ @keyframes kRt { 0%,27% { stroke-dashoffset: 18; stroke: var(--amber); }
97
+ 31% { stroke-dashoffset: -368; } 33% { stroke: var(--amber); }
98
+ 34% { stroke-dashoffset: -368; } 35% { stroke: var(--green); }
99
+ 38.5%,100% { stroke-dashoffset: 18; stroke: var(--green); } }
100
+ @keyframes kM { 0%,40% { stroke-dashoffset: 18; } 44% { stroke-dashoffset: -340; }
101
+ 47.5% { stroke-dashoffset: -340; } 52%,100% { stroke-dashoffset: 18; } }
102
+ @keyframes ping {
103
+ 0% { opacity: 0; transform: scale(.5); }
104
+ 1% { opacity: .9; transform: scale(.8); }
105
+ 6%,100% { opacity: 0; transform: scale(1.6); }
106
+ }
107
+ @keyframes pop { 0% { opacity: 0; } 1% { opacity: .95; } 4% { opacity: .7; } 9%,100% { opacity: 0; } }
108
+ @keyframes popL { 0% { opacity: 0; } 1% { opacity: .95; } 10% { opacity: .85; } 16%,100% { opacity: 0; } }
109
+ @keyframes refuse { 0% { opacity: 0; } 1% { opacity: 1; } 7% { opacity: 1; } 11%,100% { opacity: 0; } }
110
+ @keyframes burn {
111
+ 0%,10% { opacity: .06; } 12.5% { opacity: .55; } 18% { opacity: .24; }
112
+ 30% { opacity: .34; } 42% { opacity: .18; } 54% { opacity: .32; }
113
+ 66% { opacity: .18; } 78% { opacity: .3; } 92% { opacity: .12; } 100% { opacity: .06; }
114
+ }
115
+ @keyframes kChipL { 0%,18% { opacity: .3; } 22% { opacity: 1; } 32% { opacity: .8; }
116
+ 88% { opacity: .8; } 97%,100% { opacity: .3; } }
117
+ @keyframes kChipR { 0%,72% { opacity: .35; } 77% { opacity: 1; } 94% { opacity: 1; } 100% { opacity: .35; } }
118
+ @keyframes tick { 0% { opacity: .2; } 2% { opacity: 1; } 88% { opacity: 1; } 96%,100% { opacity: .2; } }
119
+ }
120
+ </style>
121
+
122
+ <!-- ============ the harness enclosure: the right lane HAS a housing; the left is a bare wire -->
123
+ <rect x="318" y="112" width="664" height="460" rx="18" fill="var(--surface)" stroke="var(--ridge)" stroke-width="1.5"/>
124
+ <text x="344" y="138" class="mono b muted" font-size="18" letter-spacing="2">THE HARNESS</text>
125
+ <text x="956" y="138" class="mono faint" font-size="18" text-anchor="end">invisible from the outside</text>
126
+
127
+ <!-- ============ lane headers -->
128
+ <text x="28" y="42" class="mono b ink" font-size="26" letter-spacing="1">PLAIN CLAUDE CODE</text>
129
+ <text x="28" y="66" class="mono muted" font-size="19">nothing in between</text>
130
+ <text x="972" y="42" class="mono b ink" font-size="26" text-anchor="end" letter-spacing="1">+ THE RUVNET HARNESS</text>
131
+ <text x="972" y="66" class="mono muted" font-size="19" text-anchor="end">the same model, wrapped</text>
132
+
133
+ <!-- ============ one prompt, split into both worlds -->
134
+ <rect x="392" y="16" width="216" height="44" rx="12" fill="var(--surface)" stroke="var(--ridge)" stroke-width="1.5"/>
135
+ <rect x="392" y="16" width="216" height="44" rx="12" fill="none" class="fx ping sAm" stroke-width="3" style="animation-delay:-11.85s"/>
136
+ <text x="500" y="45" class="mono b ink" font-size="22" text-anchor="middle">&gt;_ same prompt</text>
137
+
138
+ <!-- ============ LEFT LANE: prompt -> model -> answer. one thin line, lots of nothing -->
139
+ <path class="trk" d="M500,60 C500,96 150,96 150,132 L150,372"/>
140
+ <path class="trk" d="M150,486 L150,502"/>
141
+ <polygon points="150,241 144,231 156,231" fill="var(--track)"/>
142
+ <polygon points="150,505 144,495 156,495" fill="var(--track)"/>
143
+
144
+ <!-- the one big expensive node, burning the whole session -->
145
+ <circle cx="150" cy="300" r="63" fill="none" class="burnHalo" stroke="var(--amber)" stroke-width="9"/>
146
+ <circle cx="150" cy="300" r="56" class="node sAm" stroke-width="2.5"/>
147
+ <text x="150" y="296" class="mono b ink" font-size="21" text-anchor="middle">FRONTIER</text>
148
+ <text x="150" y="321" class="mono b ink" font-size="21" text-anchor="middle">MODEL</text>
149
+ <text x="150" y="392" class="mono amT" font-size="20" text-anchor="middle">$$$ &#183; every task</text>
150
+
151
+ <!-- the void, named -->
152
+ <text x="150" y="424" class="mono muted" font-size="18" text-anchor="middle">no grounding</text>
153
+ <text x="150" y="447" class="mono muted" font-size="18" text-anchor="middle">no memory</text>
154
+ <text x="150" y="470" class="mono muted" font-size="18" text-anchor="middle">no gates</text>
155
+
156
+ <g class="chipL">
157
+ <rect x="44" y="510" width="212" height="50" rx="10" fill="var(--surface)" stroke="var(--ridge)" stroke-width="2"/>
158
+ <text x="150" y="531" class="mono b ink2" font-size="22" text-anchor="middle">an answer</text>
159
+ <text x="150" y="551" class="mono muted" font-size="18" text-anchor="middle">unchecked &#183; $$$</text>
160
+ </g>
161
+
162
+ <!-- ============ RIGHT LANE: the same prompt, walked through the machinery -->
163
+ <path class="trk" d="M500,60 C500,96 400,96 400,132 L400,502"/>
164
+ <polygon points="400,505 394,495 406,495" fill="var(--track)"/>
165
+
166
+ <!-- side corridors (dashed: consultations, not the main line) -->
167
+ <path class="cor" d="M400,161 Q400,146 416,146 L744,146 Q756,146 756,152"/>
168
+ <path class="cor" d="M400,237 Q400,222 416,222 L764,222 Q776,222 776,234 L776,240"/>
169
+ <path class="cor" d="M400,313 Q400,298 416,298 L744,298 Q756,298 756,304"/>
170
+
171
+ <!-- 1 GROUND -->
172
+ <circle cx="400" cy="174" r="20" fill="none" class="fx ping sCy" stroke-width="5" style="animation-delay:-10.56s"/>
173
+ <circle cx="400" cy="174" r="13" class="node sCy"/>
174
+ <text x="428" y="184" class="mono b ink" font-size="30">GROUND</text>
175
+ <text x="428" y="210" class="mono muted" font-size="20">cited, not guessed</text>
176
+ <rect x="756" y="152" width="192" height="46" rx="9" fill="var(--surface)" stroke="var(--cyan)" stroke-width="1.6"/>
177
+ <rect x="756" y="152" width="192" height="46" rx="9" fill="none" class="fx pop sCy" stroke-width="3" style="animation-delay:-9.8s"/>
178
+ <g fill="none" class="sCy" stroke-width="1.8">
179
+ <ellipse cx="782" cy="166" rx="11" ry="4.5"/>
180
+ <path d="M771,166 v13 a11,4.5 0 0 0 22,0 v-13"/>
181
+ </g>
182
+ <text x="866" y="182" class="mono b ink" font-size="19" text-anchor="middle">THE BRAIN</text>
183
+
184
+ <!-- 2 ROUTE -->
185
+ <circle cx="400" cy="250" r="20" fill="none" class="fx ping sAm" stroke-width="5" style="animation-delay:-8.88s"/>
186
+ <circle cx="400" cy="250" r="13" class="node sAm"/>
187
+ <text x="428" y="260" class="mono b ink" font-size="30">ROUTE</text>
188
+ <text x="428" y="286" class="mono muted" font-size="20">cheapest capable model</text>
189
+ <circle cx="776" cy="250" r="8" class="node sGr"/>
190
+ <circle cx="776" cy="250" r="8" fill="var(--green)" class="fx popL" style="animation-delay:-8.15s"/>
191
+ <circle cx="848" cy="250" r="12" class="node sRg"/>
192
+ <circle cx="920" cy="250" r="17" class="node sRg"/>
193
+ <text x="776" y="284" class="mono b grT" font-size="19" text-anchor="middle">$</text>
194
+ <text x="848" y="284" class="mono muted" font-size="19" text-anchor="middle">$$</text>
195
+ <text x="920" y="284" class="mono muted" font-size="19" text-anchor="middle">$$$</text>
196
+ <text x="920" y="224" class="mono faint" font-size="16" text-anchor="middle">mostly idle</text>
197
+
198
+ <!-- 3 RECALL -->
199
+ <circle cx="400" cy="326" r="20" fill="none" class="fx ping sCy" stroke-width="5" style="animation-delay:-7.32s"/>
200
+ <circle cx="400" cy="326" r="13" class="node sCy"/>
201
+ <text x="428" y="336" class="mono b ink" font-size="30">RECALL</text>
202
+ <text x="428" y="362" class="mono muted" font-size="20">prior decisions return</text>
203
+ <rect x="756" y="304" width="192" height="46" rx="9" fill="var(--surface)" stroke="var(--cyan)" stroke-width="1.6"/>
204
+ <rect x="756" y="304" width="192" height="46" rx="9" fill="none" class="fx pop sCy" stroke-width="3" style="animation-delay:-6.6s"/>
205
+ <text x="782" y="335" class="cyT" font-size="26" text-anchor="middle">&#8634;</text>
206
+ <text x="870" y="334" class="mono b ink" font-size="19" text-anchor="middle">MEMORY</text>
207
+
208
+ <!-- 4 GATE: the only stage that can say no -->
209
+ <circle cx="400" cy="402" r="22" fill="none" class="fx ping sRd" stroke-width="5" style="animation-delay:-5.76s"/>
210
+ <rect x="386" y="388" width="9" height="28" rx="4" fill="var(--ink2)"/>
211
+ <rect x="405" y="388" width="9" height="28" rx="4" fill="var(--ink2)"/>
212
+ <g class="fx pop" style="animation-delay:-5.76s">
213
+ <rect x="386" y="388" width="9" height="28" rx="4" fill="var(--red)"/>
214
+ <rect x="405" y="388" width="9" height="28" rx="4" fill="var(--red)"/>
215
+ </g>
216
+ <g class="fx pop" style="animation-delay:-4.65s">
217
+ <rect x="386" y="388" width="9" height="28" rx="4" fill="var(--green)"/>
218
+ <rect x="405" y="388" width="9" height="28" rx="4" fill="var(--green)"/>
219
+ </g>
220
+ <text x="428" y="412" class="mono b ink" font-size="30">GATE</text>
221
+ <text x="545" y="411" class="mono b rdT refuse" font-size="20" style="animation-delay:-5.76s">&#10005; refused the write</text>
222
+ <text x="428" y="438" class="mono muted" font-size="20">inspects the write &#183; can refuse</text>
223
+
224
+ <!-- 5 VERIFY -->
225
+ <circle cx="400" cy="466" r="22" fill="none" class="fx ping sGr" stroke-width="5" style="animation-delay:-4.2s"/>
226
+ <path d="M400,448 l16,7 v9 c0,10 -7,16 -16,21 c-9,-5 -16,-11 -16,-21 v-9 z" class="node sGr"/>
227
+ <path d="M400,448 l16,7 v9 c0,10 -7,16 -16,21 c-9,-5 -16,-11 -16,-21 v-9 z" fill="none" class="fx pop sGr" stroke-width="3.5" style="animation-delay:-4.2s"/>
228
+ <path d="M392,466 l6,7 l11,-13" fill="none" stroke="var(--grT)" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
229
+ <text x="428" y="474" class="mono b ink" font-size="30">VERIFY</text>
230
+ <text x="428" y="500" class="mono muted" font-size="20">provenance + safety gate</text>
231
+
232
+ <!-- the answer that earned its badges -->
233
+ <g class="chipR">
234
+ <rect x="326" y="510" width="340" height="50" rx="10" fill="var(--surface)" class="sGr" stroke-width="2"/>
235
+ <rect x="326" y="510" width="340" height="50" rx="10" fill="none" class="fx pop sGr" stroke-width="3.5" style="animation-delay:-2.85s"/>
236
+ <text x="496" y="531" class="mono b ink" font-size="22" text-anchor="middle">answer</text>
237
+ <text x="344" y="551" class="mono grT tick" font-size="18" style="animation-delay:-2.6s">&#10003; grounded</text>
238
+ <text x="472" y="551" class="mono grT tick" font-size="18" style="animation-delay:-2.2s">&#10003; cited</text>
239
+ <text x="556" y="551" class="mono grT tick" font-size="18" style="animation-delay:-1.8s">&#10003; checked</text>
240
+ </g>
241
+
242
+ <!-- ============ payoff
243
+ Sits BELOW the harness panel (which ends at y=572), not under it. The serif line's
244
+ ascenders reach ~34u above its baseline, so a baseline of 596 put its bbox top at 562 —
245
+ 10u inside the panel, which rendered the line as if it were behind the box. Baseline 620
246
+ clears the panel by 14u; the viewBox grew 620->652 to hold both lines. Measured with
247
+ getBBox(), not eyeballed. -->
248
+ <text x="500" y="620" class="serif ink" font-size="33" text-anchor="middle">A cheap model in a good harness &#8776; a frontier model, for less.</text>
249
+ <text x="500" y="643" class="mono muted" font-size="19" text-anchor="middle">per ADR-076 &#8212; 28.5% cheaper at 98.1% bar-compliance</text>
250
+
251
+ <!-- ============ the moving parts (motion only; hidden under reduced motion) -->
252
+ <path class="comet cometL cH" d="M500,60 C500,96 150,96 150,132 L150,530"/>
253
+ <path class="comet cometL cC" d="M500,60 C500,96 150,96 150,132 L150,530"/>
254
+ <path class="comet cometG" d="M400,161 Q400,146 416,146 L744,146 Q756,146 756,152"/>
255
+ <path class="comet cometRt" d="M400,237 Q400,222 416,222 L764,222 Q776,222 776,234 L776,240"/>
256
+ <path class="comet cometM" d="M400,313 Q400,298 416,298 L744,298 Q756,298 756,304"/>
257
+ <path class="comet cometR cH" d="M500,60 C500,96 400,96 400,132 L400,530"/>
258
+ <path class="comet cometR cC" d="M500,60 C500,96 400,96 400,132 L400,530"/>
259
+ </svg>
Binary file
Binary file
@@ -0,0 +1,247 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 560" width="900" height="560" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="mh-t mh-d">
2
+ <title id="mh-t">MetaHarness: freeze the model, evolve the harness</title>
3
+ <desc id="mh-d">A frozen crystalline core labeled MODEL sits motionless at the centre — the same Claude you already have, never retrained, never swapped. Around it orbits a living amber harness ring carrying seven policy surfaces: planner, contextBuilder, reviewer, retryPolicy, toolPolicy, memoryPolicy and scorePolicy. A comet of activity sweeps the ring, visiting one surface at a time — the Darwin loop mutates one surface, sandboxes it, and keeps only what measurably improves. A green variant branch merges back into the harness (kept); a red one fades (pruned). The harness stands on four pillars: route (cost-optimal model selection), evolve (self-improving harness), orchestrate (agents, swarms, MCP) and verify (provenance plus safety gate). Payoff: a cheap model in a good harness approximately equals a frontier model, for less — per agentic-flow's ADR-076, 28.5 percent cheaper at 98.1 percent bar-compliance.</desc>
4
+
5
+ <!-- Grounded in agentic-flow ADR-075 (seven surfaces, freeze/evolve) and ADR-076 (four pillars); 28.5% / 98.1% per agentic-flow ADR-076 (Accepted). -->
6
+
7
+ <style>
8
+ :root{
9
+ --bg:#faf8f3; --ink:#1a1d24; --muted:#5c6170; --faint:#8b8f9b; --ridge:#dcd8cc;
10
+ --amber:#9c6606; --amber-stroke:#c1830e; --amber-hi:#e29a12;
11
+ --cyan:#146e93; --green:#1e7d47; --red:#c23325;
12
+ --core-fill:#e9f1f6; --facet:#a5c6d8;
13
+ }
14
+ @media (prefers-color-scheme: dark){
15
+ :root{
16
+ --bg:#0a0c10; --ink:#ece8dc; --muted:#8f94a1; --faint:#5a5f6e; --ridge:#2a3140;
17
+ --amber:#f0a830; --amber-stroke:#f0a830; --amber-hi:#ffc55e;
18
+ --cyan:#5ad6ff; --green:#5fd38a; --red:#ff6b5e;
19
+ --core-fill:#0d1c29; --facet:#24455a;
20
+ }
21
+ }
22
+
23
+ .mono{ font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; }
24
+ .serif{ font-family: "Iowan Old Style", Palatino, Georgia, serif; }
25
+ /* halo: knocks background out behind text so lines may pass beneath labels */
26
+ .hl{ paint-order: stroke; stroke: var(--bg); stroke-width: 5px; stroke-linejoin: round; }
27
+ .hlc{ paint-order: stroke; stroke: var(--core-fill); stroke-width: 6px; stroke-linejoin: round; }
28
+
29
+ .node{ fill: var(--bg); stroke: var(--amber-stroke); stroke-width: 2; }
30
+ .comet, .comet-glow{ opacity: 0; } /* only alive when motion is allowed */
31
+ .pruned-g{ opacity: .5; } /* at rest: the pruned variant reads as faded */
32
+
33
+ /* ============ MOTION (the harness is alive; the model NEVER moves) ============ */
34
+ @media (prefers-reduced-motion: no-preference){
35
+
36
+ .texture{ animation: drift 26s linear infinite; }
37
+ @keyframes drift{ to{ stroke-dashoffset: -70; } }
38
+
39
+ .comet{ opacity: 1; animation: comet 14s linear infinite; }
40
+ .comet-glow{ opacity: .28; animation: comet 14s linear infinite; }
41
+ @keyframes comet{ to{ stroke-dashoffset: -829.38; } }
42
+
43
+ .node{ transform-box: fill-box; transform-origin: center;
44
+ animation: nodeHit 14s ease-out infinite; }
45
+ .n-reviewer{ animation-delay: -.16s } .n-retry{ animation-delay: 1.84s }
46
+ .n-tool{ animation-delay: 3.84s } .n-memory{ animation-delay: 5.84s }
47
+ .n-score{ animation-delay: 7.84s } .n-planner{ animation-delay: 9.84s }
48
+ .n-context{ animation-delay: 11.84s }
49
+ @keyframes nodeHit{
50
+ 0%, 7%, 100%{ transform: scale(1); stroke: var(--amber-stroke); fill: var(--bg); }
51
+ 1.5% { transform: scale(1.45); stroke: var(--amber-hi); fill: var(--amber-hi); }
52
+ }
53
+
54
+ .branch-kept{ stroke-dasharray: 100 100; animation: keptDraw 14s linear infinite; }
55
+ @keyframes keptDraw{
56
+ 0% { stroke-dashoffset: 100; opacity: 0; }
57
+ 2.8% { stroke-dashoffset: 100; opacity: 1; }
58
+ 11% { stroke-dashoffset: 0; opacity: 1; }
59
+ 88% { stroke-dashoffset: 0; opacity: 1; }
60
+ 94%, 100%{ stroke-dashoffset: 0; opacity: 0; }
61
+ }
62
+ .kept-mark{ animation: keptMark 14s ease infinite; }
63
+ @keyframes keptMark{ 0%,12%{ opacity:0 } 17%,88%{ opacity:1 } 94%,100%{ opacity:0 } }
64
+
65
+ .pruned-g{ animation: prunedFade 14s linear infinite; }
66
+ @keyframes prunedFade{
67
+ 0%,19%{ opacity:0 } 23%,33%{ opacity:1 } 42%,86%{ opacity:.42 } 93%,100%{ opacity:0 }
68
+ }
69
+ .branch-pruned{ stroke-dasharray: 100 100; animation: prunedDraw 14s linear infinite; }
70
+ @keyframes prunedDraw{ 0%,20%{ stroke-dashoffset:100 } 29%,100%{ stroke-dashoffset:0 } }
71
+ .pruned-x{ transform-box: fill-box; transform-origin: center;
72
+ animation: prunedX 14s linear infinite; }
73
+ @keyframes prunedX{ 0%,28%{ transform:scale(0) } 33%,100%{ transform:scale(1) } }
74
+
75
+ .bar{ animation: barPulse 14s ease infinite; }
76
+ .bar-1{ animation-delay:.8s } .bar-2{ animation-delay:4.3s }
77
+ .bar-3{ animation-delay:7.8s } .bar-4{ animation-delay:11.3s }
78
+ @keyframes barPulse{ 0%,12%,100%{ opacity:.45 } 4%{ opacity:1 } }
79
+ }
80
+ </style>
81
+
82
+ <defs>
83
+ <radialGradient id="mh-aura" cx="50%" cy="50%" r="50%">
84
+ <stop offset="0%" style="stop-color:var(--cyan)" stop-opacity=".13"/>
85
+ <stop offset="70%" style="stop-color:var(--cyan)" stop-opacity=".05"/>
86
+ <stop offset="100%" style="stop-color:var(--cyan)" stop-opacity="0"/>
87
+ </radialGradient>
88
+ </defs>
89
+
90
+ <rect x="0" y="0" width="900" height="560" fill="var(--bg)"/>
91
+
92
+ <!-- title: temperature IS the thesis — cold model, warm harness -->
93
+ <text x="450" y="30" class="mono" font-size="13.5" letter-spacing="3" text-anchor="middle">
94
+ <tspan fill="var(--cyan)">FREEZE THE MODEL</tspan><tspan fill="var(--faint)"> · </tspan><tspan fill="var(--amber)">EVOLVE THE HARNESS</tspan>
95
+ </text>
96
+
97
+ <!-- corner captions -->
98
+ <g class="mono">
99
+ <text x="24" y="62" font-size="12" letter-spacing="1.5" fill="var(--amber)">THE HARNESS</text>
100
+ <text x="24" y="80" font-size="12" fill="var(--muted)">seven policy surfaces,</text>
101
+ <text x="24" y="97" font-size="12" fill="var(--muted)">each mutated, then measured</text>
102
+ <text x="24" y="115" font-size="12" fill="var(--faint)">agentic-flow ADR-075 · ADR-076</text>
103
+
104
+ <text x="876" y="62" font-size="12" letter-spacing="1.5" fill="var(--green)" text-anchor="end">THE DARWIN LOOP</text>
105
+ <text x="876" y="80" font-size="12" fill="var(--muted)" text-anchor="end">mutates one surface at a time,</text>
106
+ <text x="876" y="97" font-size="12" fill="var(--muted)" text-anchor="end">sandboxes it, keeps only what</text>
107
+ <text x="876" y="114" font-size="12" fill="var(--muted)" text-anchor="end">measurably improves</text>
108
+ </g>
109
+
110
+ <!-- cold aura around the frozen core (static) -->
111
+ <circle cx="450" cy="232" r="118" fill="url(#mh-aura)"/>
112
+
113
+ <!-- the harness ring: fine circulating texture + main orbit + sweeping comet -->
114
+ <circle class="texture" cx="450" cy="232" r="138" fill="none"
115
+ stroke="var(--amber-stroke)" stroke-width="1" stroke-dasharray="2 5" opacity=".22"/>
116
+ <circle cx="450" cy="232" r="132" fill="none"
117
+ stroke="var(--amber-stroke)" stroke-width="1.6" opacity=".5"/>
118
+ <circle class="comet-glow" cx="450" cy="232" r="132" fill="none"
119
+ stroke="var(--amber-hi)" stroke-width="7" stroke-linecap="round"
120
+ stroke-dasharray="78 751.38"/>
121
+ <circle class="comet" cx="450" cy="232" r="132" fill="none"
122
+ stroke="var(--amber-hi)" stroke-width="2.6" stroke-linecap="round"
123
+ stroke-dasharray="78 751.38"/>
124
+
125
+ <!-- the evolution vignette: a variant of `reviewer` branches out, is measured,
126
+ and either merges back into the harness (kept) or dies (pruned) -->
127
+ <path class="branch-kept" pathLength="100" d="M585 268 C613 279 626 299 612 314 C600 327 570 338 528 339"
128
+ fill="none" stroke="var(--green)" stroke-width="2.2" stroke-linecap="round"/>
129
+ <g class="kept-mark">
130
+ <circle cx="527" cy="340" r="3.6" fill="var(--green)"/>
131
+ <path d="M630 296 l5 6 l10 -12" fill="none" stroke="var(--green)" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/>
132
+ <text x="652" y="301" class="mono hl" font-size="12"><tspan fill="var(--green)">kept</tspan><tspan fill="var(--muted)"> — measurably better</tspan></text>
133
+ </g>
134
+ <g class="pruned-g">
135
+ <path class="branch-pruned" pathLength="100" d="M585 255 C610 249 634 237 649 219"
136
+ fill="none" stroke="var(--red)" stroke-width="2" stroke-linecap="round"/>
137
+ <g class="pruned-x">
138
+ <path d="M650 207 L660 217 M660 207 L650 217" stroke="var(--red)" stroke-width="2.4" stroke-linecap="round" fill="none"/>
139
+ </g>
140
+ <text x="670" y="216" class="mono hl" font-size="12"><tspan fill="var(--red)">pruned</tspan><tspan fill="var(--muted)"> — didn't improve</tspan></text>
141
+ </g>
142
+
143
+ <!-- seven policy surfaces: stations on the living ring -->
144
+ <circle class="node n-planner" cx="450" cy="100" r="8"/>
145
+ <circle class="node n-context" cx="553" cy="150" r="8"/>
146
+ <circle class="node n-reviewer" cx="579" cy="261" r="8"/>
147
+ <circle class="node n-retry" cx="507" cy="351" r="8"/>
148
+ <circle class="node n-tool" cx="393" cy="351" r="8"/>
149
+ <circle class="node n-memory" cx="321" cy="261" r="8"/>
150
+ <circle class="node n-score" cx="347" cy="150" r="8"/>
151
+
152
+ <g class="mono" font-size="13" fill="var(--ink)">
153
+ <text x="450" y="81" class="hl" text-anchor="middle">planner</text>
154
+ <text x="568" y="141" class="hl">contextBuilder</text>
155
+ <text x="596" y="265" class="hl">reviewer</text>
156
+ <text x="507" y="382" class="hl" text-anchor="middle">retryPolicy</text>
157
+ <text x="393" y="382" class="hl" text-anchor="middle">toolPolicy</text>
158
+ <text x="305" y="265" class="hl" text-anchor="end">memoryPolicy</text>
159
+ <text x="332" y="141" class="hl" text-anchor="end">scorePolicy</text>
160
+ </g>
161
+
162
+ <!-- THE FROZEN MODEL: a still crystal. Nothing here ever animates. -->
163
+ <g>
164
+ <polygon points="335,232 388,179 512,179 565,232 512,285 388,285"
165
+ fill="var(--core-fill)" stroke="var(--cyan)" stroke-width="1.8"/>
166
+ <!-- crystal facets -->
167
+ <g stroke="var(--facet)" stroke-width="1" opacity=".45">
168
+ <path d="M335 232 L472 212"/>
169
+ <path d="M388 179 L472 212"/>
170
+ <path d="M565 232 L472 212"/>
171
+ <path d="M388 285 L472 212"/>
172
+ <path d="M512 285 L472 212"/>
173
+ </g>
174
+ <!-- frost ticks -->
175
+ <g stroke="var(--cyan)" stroke-width="1.5" opacity=".55" stroke-linecap="round">
176
+ <path d="M329 232 h-8"/>
177
+ <path d="M571 232 h6"/>
178
+ <path d="M384 174 l-5 -5"/>
179
+ <path d="M516 174 l5 -5"/>
180
+ <path d="M384 290 l-5 5"/>
181
+ <path d="M516 290 l5 5"/>
182
+ </g>
183
+ <!-- lock -->
184
+ <g transform="translate(408,191)">
185
+ <path d="M4 9 V6 a5 5 0 0 1 10 0 V9" fill="none" stroke="var(--cyan)" stroke-width="1.8"/>
186
+ <rect x="1" y="9" width="16" height="12" rx="2.5" fill="var(--cyan)"/>
187
+ </g>
188
+ <text x="432" y="210" class="mono hlc" font-size="12" letter-spacing="2.5" fill="var(--cyan)">FROZEN</text>
189
+ <text x="450" y="251" class="serif hlc" font-size="27" font-weight="bold" text-anchor="middle" fill="var(--ink)">MODEL</text>
190
+ </g>
191
+ <text x="450" y="300" class="mono hl" font-size="12" text-anchor="middle" fill="var(--muted)">the Claude you already have</text>
192
+ <text x="450" y="318" class="mono hl" font-size="12" text-anchor="middle" fill="var(--cyan)" opacity=".9">never retrained or swapped</text>
193
+
194
+ <!-- the harness stands on four pillars -->
195
+ <path d="M450 371 V403" stroke="var(--ridge)" stroke-width="1.2" stroke-dasharray="3 4" fill="none"/>
196
+ <line x1="70" y1="406" x2="830" y2="406" stroke="var(--ridge)" stroke-width="1"/>
197
+ <rect class="bar bar-1" x="136" y="404" width="28" height="3.5" rx="1.75" fill="var(--amber-stroke)" opacity=".45"/>
198
+ <rect class="bar bar-2" x="336" y="404" width="28" height="3.5" rx="1.75" fill="var(--green)" opacity=".45"/>
199
+ <rect class="bar bar-3" x="536" y="404" width="28" height="3.5" rx="1.75" fill="var(--faint)" opacity=".45"/>
200
+ <rect class="bar bar-4" x="736" y="404" width="28" height="3.5" rx="1.75" fill="var(--green)" opacity=".45"/>
201
+
202
+ <!-- route -->
203
+ <g transform="translate(150,430)" fill="none" stroke="var(--amber-stroke)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
204
+ <path d="M-16 8 H-6"/>
205
+ <path d="M-6 8 C2 8 2 -6 12 -6"/>
206
+ <path d="M9 -9 L14 -6 L9 -3"/>
207
+ <path d="M-6 8 C2 8 4 8 12 8"/>
208
+ <path d="M9 5 L14 8 L9 11"/>
209
+ </g>
210
+ <!-- evolve -->
211
+ <g transform="translate(350,430)" fill="none" stroke-linecap="round">
212
+ <path d="M0 14 V2" stroke="var(--muted)" stroke-width="2"/>
213
+ <path d="M0 7 C-3 3 -6 1 -9 -2" stroke="var(--muted)" stroke-width="2"/>
214
+ <path d="M0 7 C3 3 7 0 10 -3" stroke="var(--muted)" stroke-width="2"/>
215
+ <path d="M-14 -8 l6 6 M-8 -8 l-6 6" stroke="var(--red)" stroke-width="1.8"/>
216
+ <circle cx="12" cy="-5" r="3" fill="var(--green)" stroke="none"/>
217
+ </g>
218
+ <!-- orchestrate -->
219
+ <g transform="translate(550,430)" stroke="var(--faint)" stroke-width="1.8" fill="var(--faint)">
220
+ <path d="M0 6 L-13 -5 M0 6 L0 -10 M0 6 L13 -5" fill="none"/>
221
+ <circle cx="0" cy="7" r="3.2" stroke="none"/>
222
+ <circle cx="-13" cy="-6" r="2.5" stroke="none"/>
223
+ <circle cx="0" cy="-11" r="2.5" stroke="none"/>
224
+ <circle cx="13" cy="-6" r="2.5" stroke="none"/>
225
+ </g>
226
+ <!-- verify -->
227
+ <g transform="translate(750,430)" fill="none" stroke="var(--green)" stroke-linecap="round" stroke-linejoin="round">
228
+ <path d="M0 -11 C4 -8 8 -7 11 -7 V1 C11 8 6 12 0 15 C-6 12 -11 8 -11 1 V-7 C-8 -7 -4 -8 0 -11 Z" stroke-width="2"/>
229
+ <path d="M-4.5 1.5 L-1 5.5 L5.5 -2.5" stroke-width="2.2"/>
230
+ </g>
231
+
232
+ <g class="mono" text-anchor="middle">
233
+ <text x="150" y="462" font-size="12" letter-spacing="1.5" fill="var(--ink)">ROUTE</text>
234
+ <text x="350" y="462" font-size="12" letter-spacing="1.5" fill="var(--ink)">EVOLVE</text>
235
+ <text x="550" y="462" font-size="12" letter-spacing="1.5" fill="var(--ink)">ORCHESTRATE</text>
236
+ <text x="750" y="462" font-size="12" letter-spacing="1.5" fill="var(--ink)">VERIFY</text>
237
+ <text x="150" y="478" font-size="12" fill="var(--muted)">cost-optimal model selection</text>
238
+ <text x="350" y="478" font-size="12" fill="var(--muted)">self-improving harness</text>
239
+ <text x="550" y="478" font-size="12" fill="var(--muted)">agents, swarms, MCP</text>
240
+ <text x="750" y="478" font-size="12" fill="var(--muted)">provenance + safety gate</text>
241
+ </g>
242
+
243
+ <!-- payoff -->
244
+ <line x1="90" y1="497" x2="810" y2="497" stroke="var(--ridge)" stroke-width="1"/>
245
+ <text x="450" y="527" class="serif" font-size="19" font-style="italic" text-anchor="middle" fill="var(--ink)">A cheap model in a good harness ≈ a frontier model, for less.</text>
246
+ <text x="450" y="548" class="mono" font-size="12" text-anchor="middle" fill="var(--muted)">per ADR-076 — 28.5% cheaper at 98.1% bar-compliance</text>
247
+ </svg>