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 โ€” [![RuvNet Brain version 4.0.24 โ€” updated 2026-07-30 03:24 EDT](https://img.shields.io/badge/version_4.0.24-updated_2026--07--30_03:24_EDT-1E90FF?style=for-the-badge&labelColor=0757BA)](https://github.com/stuinfla/ruvnet-brain/blob/main/plugin/.claude-plugin/plugin.json)
7
+ ### ๐Ÿง  RuvNet Brain โ€” [![RuvNet Brain version 4.0.28 โ€” updated 2026-07-30 03:24 EDT](https://img.shields.io/badge/version_4.0.28-updated_2026--07--30_03:24_EDT-1E90FF?style=for-the-badge&labelColor=0757BA)](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
  [![explainer](https://img.shields.io/badge/โ–ถ%20see%20it%20live-isovision.ai%2Fruvnet--brain-e8a13a?style=flat-square)](https://isovision.ai/ruvnet-brain/)
31
31
  [![license](https://img.shields.io/badge/license-MIT-8ecae6?style=flat-square)](LICENSE)
32
32
  [![grounded](https://img.shields.io/badge/answers-cited%20rUv%20source-333?style=flat-square)](#testing--proof)
33
- [![coverage](https://img.shields.io/badge/coverage-34%25%20of%20ALL%20source%20ยท%20honest-b58900?style=flat-square)](#testing--proof)
33
+ [![coverage](https://img.shields.io/badge/coverage-36%25%20of%20ALL%20source%20ยท%20honest-b58900?style=flat-square)](#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** | **2,327 passing, 169 todo** ยท 34% 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). 34% is the honest number over every shipped file; the previous "75%" measured a hand-picked 8-file subset |
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.24",
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.24",
4
+ "version": "4.0.28",
5
5
  "author": {
6
6
  "name": "Stuart Kerr"
7
7
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ruvnet-brain",
3
- "version": "4.0.24",
3
+ "version": "4.0.28",
4
4
  "description": "Source-grounded RuvNet knowledge, lifecycle enforcement, and learning for Codex.",
5
5
  "author": {
6
6
  "name": "Stuart Kerr"
@@ -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
- const settled = receipt.schemaVersion === 1 && release.draft === false
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
- 'npm-promoted': ['github-latest-intent', 'compensation-intent', 'manual-intervention-required', ...ABORTABLE],
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],