feat: ruvnet-brain release-pinned installs, single-owner updates, one drift story across status/statusline/dashboard#33
Merged
Conversation
…sk-first version Audited live against the v3.3.1 installer (2026-07-17); every lock below traces to that audit. - Install the PUBLISHED installer (`ruvnet-brain@latest`), never `github:` — the github: spec ran the unreleased default-branch HEAD (3.4.5-dev while releases/latest was v3.3.1), inconsistent with ak's release-versioned management of every other tool. - Resolve the release tag BEFORE installing and pin with `--version v<tag>`, so the bundle on disk is exactly the release ak stamps (closes the install-then-stamp race). - Add `--no-nightly-prompt --no-telemetry` to INSTALL_ARGS: the installer's `--yes` accepts EVERY optional offer, silently enabling the 03:47 nightly self-update LaunchAgent (macOS) — which at v3.3.1 applies downloads without signature verification — and writing telemetry consent. - Installed version now resolves disk-first: SOURCE.json releaseTag (stamped by evergreen-era release bundles) → kit.json installedRelease → plugin semver. drift(), `ak status`, and the statusline footer share the order, so they can never disagree; the footer stays correct even when the KB changes outside ak. - New `ruvnet-brain-nightly` subsystem: status warns when the installer's LaunchAgent is active; sync disables it (launchctl bootout + plist removal, mirroring the installer's own --disable-nightly; heal, so it runs under --no-upgrade too). Spend watchdog + recorded telemetry consent on affected machines are deliberately left alone. - Docs: MAINTAINER.md brain section rewritten (stale "--enable-nightly does not exist" note corrected); managed CLAUDE.md block shows the real install command. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ns5AAxHpc9GEyNmghanP9
…ed tools, one drift story The dashboard's drift banner came from driftReport() (npm tools only), so the brain — release-managed outside npm — never appeared, even when outdated. collectData now folds it in via foldBrainDrift() (pure, exported, tested) from the same TTL-cached drift() result `ak status` and the statusline read, so all three surfaces resolve the version identically (SOURCE.json releaseTag → kit.json stamp) and can never disagree. Fold happens only on the self-computed path — an injected status payload that supplies its own drift owns the array (keeps tests network-free). Absent brain stays off the banner; a pre-stamping install shows "(unversioned)", never a fabricated version. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ns5AAxHpc9GEyNmghanP9
…e fixture The bare-fixture stub omitted `drift`, sending collectData down the self-computed path: driftReport's npm views plus the new brain fold-in's GitHub fetch. Beyond violating the suite's own no-network contract (a 3.3s stall in CI), the fetch's undici keep-alive handle trips libuv's `!(handle->flags & UV_HANDLE_CLOSING)` assert (win/async.c:94) at process exit on Windows runners — every test green, then exit code 1. Supplying `drift: []` (as the first fixture already does) keeps the whole suite offline and deterministic. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ns5AAxHpc9GEyNmghanP9
Consistency audit follow-up: status checks self-drift and sync self-updates,
but the banner (driftReport + brain fold-in) never showed an outdated kit.
selfDrift already returns the banner's {pkg, installed, latest, outdated}
shape, so it folds in directly — same self-computed-path guard, same TTL
cache, same best-effort try/catch as the brain.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ns5AAxHpc9GEyNmghanP9
…anages Dedicated doc for the audit that drove this branch: the four invariants (disk-first installed versions; sync as the single update owner with honest disowning; same-namespace drift comparisons; one drift story across status/statusline/dashboard), the per-tool table mapping all six managed tools onto them, where each piece lives in the source, and the checklist that keeps a NEW tool consistent. Linked from README and MAINTAINER.md; TROUBLESHOOTING's doctor command updated off the retired github: spec. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ns5AAxHpc9GEyNmghanP9
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes the gaps found in a live audit of the RuvNet Brain installer (cloned
stuinfla/ruvnet-brain, tagv3.3.1, 2026-07-17 — installer byte-identical toruvnet-brain@2.9.1on npm). Every change below traces to that audit.What's in it
📦 Release-pinned installs (consistency with every other managed tool)
INSTALL_SPECis now the published installerruvnet-brain@latest, nevergithub:— the github: spec ran the unreleased default-branch HEAD (3.4.5-dev whilereleases/latestwas v3.3.1), while ak's drift tracking measured against release tags. What's installed now matches what drift measures.installRuvnetBrain()resolves the latest release tag first and pins with--version v<tag>, so the bundle on disk is exactly the release ak stamps in kit.json — closes the install-then-stamp race. Offline behavior unchanged (installer picks latest, stamp best-effort).🔒
--yesno longer opts users into the installer's extrasThe installer's
--yesaccepts every optional offer (verified in itsask():if (FLAG_YES) return true). Under ak's non-interactive install that silently enabled a nightly self-update LaunchAgent (macOS, 03:47 — which at v3.3.1 applies downloads without signature verification) and wrote telemetry consent.INSTALL_ARGSnow carries--no-nightly-prompt --no-telemetryalongside the existing--no-stack --no-enhance, with a regression-lock test on all four.🩺 New
ruvnet-brain-nightlysubsystemak statuswarns when the installer'scom.ruvnet.brain-updateLaunchAgent is active (it bypasses ak-managed updates).ak syncdisables it viaheal.disableRuvnetBrainNightly():launchctl bootoutthen plist removal — both steps, mirroring the installer's own--disable-nightly. Runs under--no-upgradetoo (it's a heal, not an upgrade). Own subsystem so a nightly-only plan never force-reinstalls the brain.npx ruvnet-brain --enable-nightlygets re-flagged;ruvnetBrain:falseopts ak out entirely.🧿 One version story across all three surfaces
Installed version now resolves disk-first: the bundle's own
SOURCE.json → releaseTag(stamped by evergreen-era release bundles; validated, v-stripped) → ak's kit.jsoninstalledRelease→ plugin semver. Shared by:drift()→ak statusrowsforge-update.mjsrun)foldBrainDrift()— previously the banner only covereddriftReport()(npm tools), so an outdated brain never surfaced there. Pre-stamping installs show(unversioned), never a fabricated version.📝 Docs
MAINTAINER.md brain section rewritten: the stale "
--enable-nightlydoes not exist" note corrected, the--yes-accepts-everything gotcha documented, and the three-namespace note updated for the on-disk release stamp. The managed CLAUDE.md block now shows the real install command.Testing
SOURCE.jsonparsing edge cases (valid/missing/malformed/junk/oversized tag), the four-flag + npm-spec regression lock, LaunchAgent detection (darwin-gated, never throws), heal no-op (guarded so it can never mutate a real machine's plist), statusline resolution order, andfoldBrainDriftshapes.pnpm run check(typecheck, eslint, markdownlint, build, 103 kit tests + 5 standalone suites).🤖 Generated with Claude Code
https://claude.ai/code/session_014ns5AAxHpc9GEyNmghanP9
Generated by Claude Code