ruvnet-brain 4.5.12 → 4.5.13

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.12 — updated 2026-07-30 03:24 EDT](https://img.shields.io/badge/version_4.5.12-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.13 — updated 2026-07-30 03:24 EDT](https://img.shields.io/badge/version_4.5.13-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.12",
3
+ "version": "4.5.13",
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 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.12",
4
+ "version": "4.5.13",
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.12",
3
+ "version": "4.5.13",
4
4
  "description": "Source-grounded RuvNet knowledge, lifecycle enforcement, and learning for Codex.",
5
5
  "author": {
6
6
  "name": "Stuart Kerr"
@@ -54,7 +54,10 @@ export async function managedRoute({ originalPrompt, taskFacts, harness, feedbac
54
54
  const stronger = decision.model === priorDecision.model
55
55
  ? efforts.indexOf(decision.effort) > efforts.indexOf(priorDecision.effort)
56
56
  : classes.indexOf(decision.taskClass) > classes.indexOf(priorDecision.taskClass);
57
- assert(stronger, 'No stronger eligible owner-approved native repair route; same or weaker route refused');
57
+ const hardContinuation = priorDecision.taskClass === 'hard' && decision.taskClass === 'hard'
58
+ && ['harness', 'provider', 'model', 'effort'].every((field) => decision[field] === priorDecision[field]);
59
+ assert(stronger || hardContinuation, 'No stronger eligible owner-approved native repair route; same or weaker route refused');
60
+ if (hardContinuation) decision.reason += '; bounded scoped repair at approved hard allocation';
58
61
  }
59
62
  return decision;
60
63
  }
@@ -80,6 +80,7 @@ export const RELEASE_REQUIREMENTS = Object.freeze({
80
80
  "tests/unit/protected-release-invocation.test.mjs",
81
81
  "tests/unit/release-identity-invariants.test.mjs",
82
82
  "tests/unit/release-transaction.test.mjs",
83
+ "tests/unit/release-transaction-provider-buffer.test.mjs",
83
84
  "tests/unit/prepublication-evidence.test.mjs",
84
85
  "tests/unit/candidate-host-evidence.test.mjs",
85
86
  "tests/unit/host-install-matrix-concurrency.test.mjs",
@@ -24,6 +24,13 @@ export const ASSET_DOWNLOAD_TIMEOUT_MS = Number(process.env.RUVNET_RELEASE_ASSET
24
24
  const command = (name, args, options = {}) => execFileSync(name, args, {
25
25
  encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], timeout: 30_000, maxBuffer: 32 * 1024 * 1024, ...options,
26
26
  }).trim();
27
+
28
+ // The 683MB 4.5.12 payload outlasted metadata's 30s budget despite completing remotely.
29
+ // Size uploads independently at 1MiB/s, capped at ten minutes per file; no added retry.
30
+ export function assetUploadTimeoutMs(bytes) {
31
+ if (!Number.isSafeInteger(bytes) || bytes < 0) throw new Error('Safe asset byte count required');
32
+ return Math.max(30_000, Math.min(600_000, Math.ceil(bytes / (1024 * 1024)) * 1000));
33
+ }
27
34
  const json = (name, args, options) => JSON.parse(command(name, args, options));
28
35
  // ADR-086 S1: `releases/latest` is the customer download pointer and is a corpus generation on any
29
36
  // night a corpus round shipped. Every question this provider asks is about the CODE generation, so
@@ -436,7 +443,9 @@ export function liveReleaseProvider({ root = process.cwd() } = {}) {
436
443
  }
437
444
  continue;
438
445
  }
439
- command('gh', ['release', 'upload', draft.tag, file, '--repo', REPO]);
446
+ command('gh', ['release', 'upload', draft.tag, file, '--repo', REPO], {
447
+ timeout: assetUploadTimeoutMs(fs.statSync(file).size),
448
+ });
440
449
  }
441
450
  },
442
451