ruvnet-brain 4.5.0 → 4.5.1

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
@@ -7,7 +7,7 @@ Created: 2026-06-29 22:36:38 EDT
7
7
 
8
8
  # 🧠 RuvNet Brain
9
9
 
10
- ### 🧠 RuvNet Brain — [![RuvNet Brain version 4.5.0 — updated 2026-07-30 03:24 EDT](https://img.shields.io/badge/version_4.5.0-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)
10
+ ### 🧠 RuvNet Brain — [![RuvNet Brain version 4.5.1 — updated 2026-07-30 03:24 EDT](https://img.shields.io/badge/version_4.5.1-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)
11
11
 
12
12
  **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.**
13
13
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ruvnet-brain",
3
- "version": "4.5.0",
3
+ "version": "4.5.1",
4
4
  "description": "One-command installer for RuvNet Brain \u2014 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 77 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 a UserPromptSubmit retrieve-and-inject grounding hook and a PreToolUse write gate that refuses ungrounded rUv-product code until search_ruvnet has been consulted (ADR-0012 / ADR-067).",
4
- "version": "4.5.0",
4
+ "version": "4.5.1",
5
5
  "author": {
6
6
  "name": "Stuart Kerr"
7
7
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ruvnet-brain",
3
- "version": "4.5.0",
3
+ "version": "4.5.1",
4
4
  "description": "Source-grounded RuvNet knowledge, lifecycle enforcement, and learning for Codex.",
5
5
  "author": {
6
6
  "name": "Stuart Kerr"
@@ -121,15 +121,20 @@ export function confirm({ footprint, env = process.env, home = os.homedir(), now
121
121
  }
122
122
  const source = readJson(path.join(roots.kbDir, 'SOURCE.json'));
123
123
  const builtMs = Date.parse(source?.builtUtc || '');
124
- const signature = readJson(path.join(roots.brainHome, SIGNATURE_RECORD));
124
+ const signatureFile = path.join(roots.brainHome, SIGNATURE_RECORD);
125
+ const recorded = fs.existsSync(signatureFile);
126
+ const signature = recorded ? readJson(signatureFile) : null;
125
127
  const coverage = sha256File(path.join(roots.kbDir, 'COVERAGE.json'));
126
128
  const signed = Boolean(signature?.coverageSha256 && coverage && signature.coverageSha256 === coverage);
127
129
  const tag = source?.corpusReleaseTag || source?.releaseTag || null;
128
- // Structural problems (a second copy, unverified bytes) gate; age is currency and only advises.
130
+ // Structural problems (a second copy, a record the live bytes contradict) gate; age is currency and only advises.
131
+ // NO record is provenance unknown, not provably broken (an install from a local sealed artifact and the automatic
132
+ // updater never write one): it advises. A record that is present but unreadable or does not match gates.
129
133
  const knowledgeProblems = [];
130
134
  const knowledgeAdvice = [];
131
135
  if (footprint.kbCopies !== 1) knowledgeProblems.push([`${footprint.kbCopies} copies on disk (must be exactly 1)`, footprint.kbCopyFix || (footprint.kbCopies ? CLEAN : 'npx ruvnet-brain@latest')]);
132
- if (!signed) knowledgeProblems.push([signature ? 'signature record does not match the live COVERAGE.json' : 'no signature verification recorded for these bytes', UPDATE]);
136
+ if (!recorded) knowledgeAdvice.push([`installed or updated without a recorded signature verification — run ${UPDATE} to verify`, UPDATE]);
137
+ else if (!signed) knowledgeProblems.push([signature ? 'signature record does not match the live COVERAGE.json' : 'signature record is unreadable', UPDATE]);
133
138
  if (!Number.isFinite(builtMs) || (now - builtMs) / 3_600_000 >= KNOWLEDGE_MAX_AGE_HOURS) knowledgeAdvice.push([`built ${Number.isFinite(builtMs) ? ago(builtMs, now) : 'at an unknown time'} (limit ${KNOWLEDGE_MAX_AGE_HOURS}h)`, UPDATE]);
134
139
  const where = roots.location?.state === 'linked'
135
140
  ? `at ${roots.kbDir} (moved to ${volumeOf(roots.location.real)}, mounted)` : `at ${roots.kbDir}`;