ruvnet-brain 4.0.24 โ 4.0.28
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.
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
# ๐ง RuvNet Brain
|
|
6
6
|
|
|
7
|
-
### ๐ง RuvNet Brain โ [](https://github.com/stuinfla/ruvnet-brain/blob/main/plugin/.claude-plugin/plugin.json)
|
|
8
8
|
|
|
9
9
|
**A portable, source-grounded brain over Reuven Cohen's (rUv's) RuvNet stack โ delivered as a Claude Code plugin that makes Claude _use_ the stack instead of fighting it.**
|
|
10
10
|
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
[](https://isovision.ai/ruvnet-brain/)
|
|
31
31
|
[](LICENSE)
|
|
32
32
|
[](#testing--proof)
|
|
33
|
-
[](#testing--proof)
|
|
34
34
|
|
|
35
35
|
> **One Brain generation everywhere.** npm, the GitHub tag/release, bundle manifests, source metadata, and checksum-bound RVF generations must share the same product version. Headline claims are regenerated and checked by the claims ledger (`scripts/claims-verify.mjs`); other numbers below are hand-stamped and dated:
|
|
36
36
|
> - **`plugin`** (badge above) โ the Claude Code plugin itself: SKILL.md, the grounding hooks, the MCP server. Read live from [`plugin/.claude-plugin/plugin.json`](plugin/.claude-plugin/plugin.json). Updates often โ this is where behavior fixes land.
|
|
@@ -485,7 +485,7 @@ node plugin/test/run-tests.mjs # full plugin QA over real JSO
|
|
|
485
485
|
| **L4 "orchestrate"** | **downgraded โ measures speech, not obedience** | L4 asserts the hook's own injected prose contains required words (`must: ['take the wheel','SPARC','swarm',โฆ]`). That proves **the brain spoke**. It cannot fail when the advice is read and ignored โ which is the failure this product exists to prevent. Counterfactual replay against a brain-off control (ADR-058 ยงD4) is what will earn this row back |
|
|
486
486
|
| **Plugin QA** | **60 / 60** | manifests, hook firing, MCP `initialize`/`tools/list`, capability battery |
|
|
487
487
|
| **Clean-room install** | **3 / 3** | download the published bundle fresh โ unzip โ query โ grounded, cited answers |
|
|
488
|
-
| **Unit tests** | **
|
|
488
|
+
| **Unit tests** | **3,035 passing, 161 todo** ยท 36% of ALL source covered | `npm run test:cov` regenerates both โ the coverage floor fails CI if it slips (`claims:verify` re-derives the %, it is not a hand-typed badge). 36% is the honest number over every shipped file; the previous "75%" measured a hand-picked 8-file subset |
|
|
489
489
|
| **Grounding proof** | `npx ruvnet-brain --doctor` | asks a real question, then checks the cited path really exists in the on-disk store; a citation that doesn't resolve is reported as **NOT grounded** |
|
|
490
490
|
| **Held-out eval** | **grounded 100/100** ยท routed 63/80 | `npm run eval` โ 120 frozen, hash-pinned questions across 5 strata, never used for tuning, graded on ground truth, never by a model |
|
|
491
491
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ruvnet-brain",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.28",
|
|
4
4
|
"description": "One-command installer for RuvNet Brain โ a portable, source-grounded brain over rUv's RuvNet building blocks, delivered as a Claude Code plugin so Claude uses the stack instead of fighting it.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ruvnet-brain",
|
|
3
3
|
"description": "RuvNet brain transplant for Claude Code โ grounds every RuvNet decision in real source across 71 rUv repositories, prefers Ruflo / RuVector-RVF / AgentDB over training-prior defaults (pgvector, Pinecone, hand-rolled cosine), and can pull in any RuvNet repo on demand. Ships an enforced UserPromptSubmit retrieve-and-inject grounding hook that sharply reduces drift.",
|
|
4
|
-
"version": "4.0.
|
|
4
|
+
"version": "4.0.28",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Stuart Kerr"
|
|
7
7
|
},
|
|
@@ -492,14 +492,14 @@ export async function runSessionStart({
|
|
|
492
492
|
}
|
|
493
493
|
let confidenceInstruction;
|
|
494
494
|
if (readiness.state === 'ready') {
|
|
495
|
-
emit('USER-LEVEL: one brain (~/.cache/ruvnet-brain/kb) shared by every project and window here โ nothing to reinstall per project. search_ruvnet is ready and live; the grounding hooks are active.');
|
|
495
|
+
emit('USER-LEVEL: one brain ON DISK (~/.cache/ruvnet-brain/kb) shared by every project and window here โ nothing to reinstall per project (each window still runs its own worker process, which now exits when idle). search_ruvnet is ready and live; the grounding hooks are active.');
|
|
496
496
|
confidenceInstruction = `Open your FIRST response with ONE short, warm confirmation in your own words (2-3 lines, then move on; never repeat it this session). It must say "๐ง RuvNet Brain active (v${bannerVersion})" โ ONE version, in parentheses, always; never a second number, never a bundle tag beside it โ and convey: it grounds rUv's stack (RVF, Ruflo, AgentDB, SPARC, agentic-flowโฆ) in his real source rather than guessing; npx github:stuinfla/ruvnet-brain --doctor checks it; ${consoleInvoke} opens a visual settings page.`;
|
|
497
497
|
} else if (readiness.state === 'degraded') {
|
|
498
498
|
const receipt = readiness.receipt || {};
|
|
499
|
-
emit(`USER-LEVEL: one brain (~/.cache/ruvnet-brain/kb) shared by every project and window here โ nothing to reinstall per project. search_ruvnet is registered but degraded (${receipt.phase || 'startup'}: ${receipt.error || 'readiness failed'}); the grounding hooks remain active.`);
|
|
499
|
+
emit(`USER-LEVEL: one brain ON DISK (~/.cache/ruvnet-brain/kb) shared by every project and window here โ nothing to reinstall per project (each window still runs its own worker process, which now exits when idle). search_ruvnet is registered but degraded (${receipt.phase || 'startup'}: ${receipt.error || 'readiness failed'}); the grounding hooks remain active.`);
|
|
500
500
|
confidenceInstruction = `Open your FIRST response with ONE short line: "๐ง RuvNet Brain active (v${bannerVersion}) โ search is degraded right now." Do not claim source grounding until a real search succeeds. npx github:stuinfla/ruvnet-brain --doctor shows the current verdict; ${consoleInvoke} opens the Console.`;
|
|
501
501
|
} else {
|
|
502
|
-
emit('USER-LEVEL: one brain (~/.cache/ruvnet-brain/kb) shared by every project and window here โ nothing to reinstall per project. search_ruvnet is registered; live readiness is not yet proven. The grounding hooks are active.');
|
|
502
|
+
emit('USER-LEVEL: one brain ON DISK (~/.cache/ruvnet-brain/kb) shared by every project and window here โ nothing to reinstall per project (each window still runs its own worker process, which now exits when idle). search_ruvnet is registered; live readiness is not yet proven. The grounding hooks are active.');
|
|
503
503
|
confidenceInstruction = `Open your FIRST response with ONE short line: "๐ง RuvNet Brain active (v${bannerVersion}) โ search is registered and will prove readiness on first use." Do not claim source grounding until a real search returns a citation. npx github:stuinfla/ruvnet-brain --doctor shows the current verdict; ${consoleInvoke} opens the Console.`;
|
|
504
504
|
}
|
|
505
505
|
emit(confidenceInstruction);
|
|
@@ -216,7 +216,21 @@ export function liveReleaseProvider({
|
|
|
216
216
|
const pending = [];
|
|
217
217
|
for (const { receipt, release } of latestByTransaction.values()) {
|
|
218
218
|
if (TERMINAL_STATES.has(receipt.state)) continue;
|
|
219
|
-
|
|
219
|
+
// CONVERGENCE IS A FACT ABOUT THE CHANNELS, NOT ABOUT THE RECEIPT FORMAT (fixed 2026-08-07).
|
|
220
|
+
//
|
|
221
|
+
// This required `receipt.schemaVersion === 1`. Receipts are written as schemaVersion 2
|
|
222
|
+
// (release-transaction.mjs stateReceipt), so NO current transaction could ever be recognised
|
|
223
|
+
// as settled โ it stayed `pending` forever and blocked every later release, which is the
|
|
224
|
+
// same deadlock shape as `aborted` being unreachable. It bit immediately: 4.0.24 published
|
|
225
|
+
// successfully to both channels, failed only on its final ledger entry, and then blocked
|
|
226
|
+
// 4.0.27 with `pending release 064b6b4eโฆ blocks โฆ`.
|
|
227
|
+
//
|
|
228
|
+
// The three conditions below are what actually prove convergence: the release is published,
|
|
229
|
+
// and this transaction's exact version and tag are what npm and GitHub currently serve. If
|
|
230
|
+
// all three hold, the transaction reached its goal whatever schema its receipts use. The
|
|
231
|
+
// check is not weakened โ the schema clause was never load-bearing for that question, it
|
|
232
|
+
// just silently expired when the schema moved on.
|
|
233
|
+
const settled = release.draft === false
|
|
220
234
|
&& receipt.identity?.version === npmLatest && receipt.identity?.tag === githubLatest;
|
|
221
235
|
if (settled) legacySettled.push(receipt.transactionId);
|
|
222
236
|
else pending.push(receipt);
|
|
@@ -36,7 +36,15 @@ export const ALLOWED_TRANSITIONS = Object.freeze({
|
|
|
36
36
|
'github-promote-intent': ['github-promoted-nonlatest', 'manual-intervention-required', ...ABORTABLE],
|
|
37
37
|
'github-promoted-nonlatest': ['npm-promote-intent', 'manual-intervention-required', ...ABORTABLE],
|
|
38
38
|
'npm-promote-intent': ['npm-promoted', 'compensation-intent', 'manual-intervention-required', ...ABORTABLE],
|
|
39
|
-
|
|
39
|
+
// `defaults-promoted` added 2026-08-07: when GitHub is ALREADY latest at the moment npm is
|
|
40
|
+
// promoted, the reducer correctly chooses `finalize` and the finalize path moves straight to
|
|
41
|
+
// `defaults-promoted` (release-transaction.mjs:406) โ there is no `github-latest-intent` to pass
|
|
42
|
+
// through, because there is nothing left to intend. The table assumed that hop was mandatory, so
|
|
43
|
+
// the 4.0.24 publish promoted BOTH channels successfully and then died on its own bookkeeping
|
|
44
|
+
// with `illegal release transition npm-promoted -> defaults-promoted`. The publication was real;
|
|
45
|
+
// only the ledger entry was refused. Both defaults genuinely are promoted in that state, so this
|
|
46
|
+
// records what happened rather than permitting anything new.
|
|
47
|
+
'npm-promoted': ['github-latest-intent', 'defaults-promoted', 'compensation-intent', 'manual-intervention-required', ...ABORTABLE],
|
|
40
48
|
'github-latest-intent': ['defaults-promoted', 'compensation-intent', 'manual-intervention-required', ...ABORTABLE],
|
|
41
49
|
'compensation-intent': ['compensated', 'manual-intervention-required', ...ABORTABLE],
|
|
42
50
|
compensated: ['github-promote-intent', 'npm-promote-intent', 'manual-intervention-required', ...ABORTABLE],
|