SAGE gives Claude institutional memory that survives restarts and validates writes through BFT consensus before committing them to disk. It exposes MCP tools for storing memories, querying by semantic similarity, and retrieving context across conversations. Every write goes through a four-validator quorum even in single-agent mode, and memories carry confidence scores that decay over time. The CEREBRUM dashboard renders your agent's memory as a force-directed neural graph with domain filtering and real-time updates. You'd reach for this when you need AI agents to build genuine long-term knowledge rather than starting from scratch every session. Ships with SQLite storage, optional AES-256-GCM encryption, and REST endpoints alongside MCP stdio.
Persistent, consensus-validated memory infrastructure for AI agents.
SAGE gives AI agents institutional memory that persists across conversations, goes through BFT consensus validation, carries confidence scores, and decays naturally over time. Not a flat file. Not a vector DB bolted onto a chat app. Infrastructure — built on the same consensus primitives as distributed ledgers.
The architecture is described in Paper 1: Agent Memory Infrastructure.
Just want to install it? Download here — double-click, done. Works with any AI.
Agent (Claude, ChatGPT, DeepSeek, Gemini, etc.)
│ MCP / REST
▼
sage-gui
├── ABCI App (validation, confidence, decay, Ed25519 sigs)
├── Memory Auto-Voter (dedup, quality, consistency — one vote per node, signed with the node's consensus key)
├── Governance Engine (on-chain validator proposals + voting)
├── CometBFT consensus (single-validator or multi-agent network)
├── SQLite + optional AES-256-GCM encryption
├── CEREBRUM Dashboard (SPA, real-time SSE)
└── Network Agent Manager (add/remove agents, key rotation, LAN pairing)
Personal mode runs a real CometBFT node with a per-node memory auto-voter — every memory write goes through pre-validation, a signed vote transaction, and the BFT quorum before committing. One node casts one vote; add more agents from the dashboard and each node votes with its own key, exactly the same consensus pipeline as a multi-node deployment.
Full deployment guide (multi-agent networks, RBAC, federation, monitoring): Architecture docs

http://localhost:8080/ui/ — a dashboard-native operator console centered on the 3D MRI memory brain, with chain health, agents, federation, semantic memory, recall tuning, vault recovery, tasks, imports, and updates around it. Every major workflow is available from the browser; the CLI stays there for automation and recovery.
| Control Board | Federation | Recall Engine |
|---|---|---|
![]() | ![]() | ![]() |
| Chain health, quorum, agents, federation, and embeddings | Trust-only LAN or internet JOIN, followed by independent Read/Copy choices on each SAGE | Smart-memory setup, managed reranker install, and recall-depth tuning |
The dashboard also includes agent management, domain permissions, key rotation, import/export, software updates, and encryption controls.
Task creation now applies the [TASK] marker exactly once. MCP sage_task and CEREBRUM's task-creation path preserve content that is already marked instead of storing [TASK] [TASK] ...; unmarked content still receives the canonical prefix. Direct regression tests cover both entry points and both marked/unmarked inputs.
main workflow and always checks out the exact immutable tag. The staged Python wheel smoke test installs declared runtime dependencies before importing the SDK, catching packaging metadata failures before any public channel is touched.This patch changes no SAGE consensus rule, AppHash input, transaction type, key encoding, fork target, or application version. App-v20 and the v11.9 rollout boundary are unchanged; existing chains upgrade in place. SDK 11.9.1.
Release evidence: the exact-source
make v119-state-synccold run passed on source identity7080580b15e7e5158a04e8b294ab772e51f294633be2737f904276afec4c3458. The branch and tag workflows independently rerun the complete race, lint, SDK/frontend, security, fault, packaging, and publication gates before exposing release artifacts.
Validator rollout boundary: install and restart the exact frozen v11.9 artifact on every participating validator before anyone broadcasts the non-empty-domain
app-v20/ target-20 ceremony transaction. A merely >2/3 upgraded subset is unsafe: v11.8 does not understand the signed governance-domain tail. For operator-managed socket-mode Comet, keeprecheck=true, capmax_tx_bytesat 1 MiB, and restart Comet as well so no pre-rollout oversized mempool entry survives.
Selected domains can now become canonical, recoverable quorum state inside one SAGE consensus chain. App-v20 adds exact-domain scopes whose on-chain roster and integer weights are fixed by validator governance. Each scoped memory pins its submission-time denominator, so later membership changes cannot rewrite an in-flight ballot; acceptance requires strictly greater than two-thirds of that pinned weight. Scope membership grants voting weight only—it does not grant domain ownership, RBAC, federation access, or administrator authority.
/ready stays unavailable when required scoped content is missing, locked, or inconsistent.quorum.state_sync.receiving, cleans recovery evidence, and only then publishes the runtime seal. Projection rebuild, snapshots, REST/dashboard/MCP/federation, voters, and background workers start from that final frozen bundle.501 until it has connection-bound consensus authorization. Direct and synchronization-group traffic revalidate the exact live identity, and agreement set, JOIN activation, narrowing, and revocation are linearized so a completed change cannot leave stale access in flight.This is same-chain validator replication, not a relabeling of v11.8 synchronization groups or independent-chain federation. Internet validators still need mutually routable Comet TCP, explicit port forwarding, or an operator VPN, plus reachable RPC origins. Federation is not a validator tunnel; a future tunnel layer is separate work and is not part of v11.9.0.
App-v20 remains dormant until the governed upgrade activates it, preserving byte-identical pre-activation replay. A rolling binary install is safe only while the tagged target-20 ceremony has not been submitted. SDK 11.9.0.
MRI memories now remain inside the anatomical cranium at every zoom and rotation. The memory cloud previously used a vertically symmetric ellipsoid even though the bundled anatomical mesh has a much shallower lower cranial boundary outside its narrow, off-centre brainstem. Lower-hemisphere nodes could therefore protrude through the mesh, especially after the v11.8.3 spread increase. CEREBRUM now uses an asymmetric vertical envelope with explicit clearance for each rendered sphere and bloom halo. The upper cortex keeps its full spread, and the newest-to-outer / oldest-to-inner age ordering is unchanged.
The placement contract is directly regression-tested across the full age, radial-jitter, and elevation range, including a fixed lower-cranium safety threshold. This patch changes no consensus rule, AppHash, transaction type, key encoding, fork, graph API limit, or server workload; existing chains replay byte-identically and app version 20 remains unallocated.
SDK 11.8.5.
Domain write denials now say what is wrong and how to fix it. When consensus rejects a memory because its authenticated agent lacks level-2 write access to an owned domain, the REST API now returns a distinct, sanitized RFC 7807 domain-write-denied problem instead of collapsing it into a generic 403. MCP preserves that machine-readable type, immediately points the agent to CEREBRUM Access Controls or the domain owner, and performs no pointless re-registration, retry loop, or /mcp reconnect suggestion. Older servers' generic denial remains on the bounded compatibility recovery path.
The built-in CEREBRUM guide also explains SAGE's token-efficiency story without pretending every session necessarily uses fewer tokens: durable context lives outside any one model and only the relevant pieces are brought back, so token spend carries useful memory instead of repeated explanations and each tool rebuilding the same history.
This patch changes no consensus rule, AppHash, transaction type, key encoding, fork, or authorization decision; existing chains replay byte-identically and app version 20 remains unallocated.
SDK 11.8.4.
A memory brain that uses its full anatomy while keeping age meaningful. CEREBRUM now spreads its 2,500-memory representative sample through a substantially broader portion of the MRI mesh instead of crowding long-lived histories into the centre. Fresh memories remain nearest the outer cortex; memories move progressively inward as they age, and the oldest cohort settles toward the lower inner brainstem. A one-year age window replaces the old 90-day clamp, while a small deterministic radial offset separates same-age memories without turning the stable layout into a force simulation.
The placement calculation now lives in a pure, directly tested module with bounded mesh extents and monotonic age-to-depth checks. This patch changes no consensus rule, AppHash, transaction type, key encoding, fork, graph API limit, or server workload; existing chains replay byte-identically and app version 20 remains unallocated.
SDK 11.8.3.
Synchronization groups — human-verified, signed memory sharing between separate SAGE brains. A synchronization group coordinates memory sharing off-consensus through a partitioned, hash-chained, ed25519-signed audit journal: a roster sub-chain replicated to every member and independent per-domain sub-chains replicated only to the members who share that domain, so a node never learns of a domain it does not share. Group items are origin-signed, so a relaying peer can back-fill the mesh without being able to forge or mis-attribute them. Adding a shared domain is a two-party action — the owning member and the group controller both sign — members express selective-sync consent over the subset of domains they receive, and controller epoch rotation, member removal, and rejoin are all explicit signed roster events reconciled between peers by anti-entropy exchange.
Each MCP bearer token now mints and registers its own signing identity, so a delegated agent action is attributable to exactly one token and one token can never act as another. This release also hardens group authorization: a controller epoch rotation now re-attests the shared domain set under the incoming controller, so rotating control away from a node revokes that node's ability to admit or re-widen shared domains with its old key; and a removed or departed member cannot be silently re-activated with stale entitlements — re-entry requires a fresh, co-signed invitation. The v11.8 consensus fork gate is present but dormant.
The CEREBRUM MRI now renders a 2,500-memory representative sample instead of stopping at 500, filling large brains with a denser view while preserving a bounded GPU and API workload. The dashboard and fullscreen MRI share one limit, and operators can still tune the server ceiling with SAGE_GRAPH_MAX_NODES.
v11.8.2 is the first published build of the v11.8 line. It also clears the release lint gate and adds a replay-safety regression guard for the delegated-proof rules already committed by v11.7.6 and v11.7.7 chains. The recovery changes no production behavior beyond the reviewed v11.8 source tree apart from the denser MRI visualization.
SDK 11.8.2.
One CEREBRUM tab in Firefox, including across app restarts. v11.7.7 fixes the remaining macOS launch path that could create duplicate CEREBRUM tabs. The earlier tab-focus implementation could inspect Safari and Chromium-family tabs, but Firefox exposes no equivalent AppleScript tab API; the native app also incorrectly assumed a newly started tray process could not inherit a browser tab left open by the previous process. SAGE now checks a loopback-only live-dashboard presence signal before opening a URL and activates the default browser when CEREBRUM is already connected. Initial app launch, post-update restart, dock reopen, and the Open CEREBRUM menu all use the same reuse path.
This patch changes no consensus rule, AppHash, transaction type, key encoding, or fork; existing chains replay byte-identically.
SDK 11.7.7.
Reliable MCP turn writes and task cards that show the whole job. v11.7.6 fixes two post-app-v17 delegated-proof failures that v11.7.4 exposed after making the node authoritative for embeddings. Consensus now keeps every agent-controlled memory field bound to the exact signed request while accepting the validator-signed node's derived embedding hash, so provider cutovers no longer turn valid sage_turn observations into opaque CheckTx rejections. Fresh requests also survive the first block after a long idle period even when deterministic chain time trails the already wall-clock-validated MCP request; captured old proofs remain rejected. Public REST/MCP errors now distinguish proof mismatch and expiry from a generic request rejected.
CEREBRUM task cards stay compact by default but can expand to show complete multiline text. Planned tasks can be edited and saved without rewriting consensus history: SAGE confirms a replacement task first, then retires the original card. Existing committed blocks replay byte-identically; this patch changes only admission of requests that older binaries incorrectly rejected.
SDK 11.7.6.
Readable contextual help at every CEREBRUM boundary. Help tooltips now account for the nearest scroll-clipping container as well as the browser viewport, so hints near the top of Settings and other bounded panels flip downward instead of opening behind the fixed application chrome. The positioning check runs after the tooltip is rendered and keeps keyboard/focus behavior intact. This patch changes no consensus rule, AppHash, transaction type, key encoding, or fork; existing chains replay byte-identically.
SDK 11.7.5.
Provider-safe Smart Memory, automatic repair, and one CEREBRUM tab. The SAGE node is now authoritative for every stored vector: it regenerates agent submissions with the selected embedding provider, stamps the exact vector space, and filters vector recall to that same space. Switching between preferred Ollama embeddings and local hash embeddings cuts write/query authority over before background migration, so active agents cannot keep a migration alive forever and recall never compares incompatible vectors. Provider recovery is watched continuously, so vectorless observations left by a transient outage repair automatically after Ollama or another configured embedder returns. New MCP clients still attach a compatibility vector for older SAGE nodes, while v11.7.4 nodes safely regenerate it.
CEREBRUM Settings now presents Ollama/hash embeddings and the independent reranker On/Off control directly, and the top status strip shows reranker state. The macOS dock app focuses an existing localhost CEREBRUM tab before opening a new one, with bounded browser automation and a safe fallback. PostgreSQL mirrors the embedding-provider provenance used by personal SQLite nodes. This patch changes no consensus rule, AppHash, transaction type, key encoding, or fork; existing chains replay byte-identically.
SDK 11.7.4.
Strict project memory and task ownership, plus a cooler Settings page. sage_turn now treats its domain as an exact recall boundary, so one repository's session cannot be re-anchored by memories from another repository. Agent backlogs return only tasks whose assignee exactly matches the signature-verified agent ID; unassigned work stays in human CEREBRUM triage and cannot be self-claimed. Agent-created tasks are assigned to their creator, every in_progress task must have an owner, and historical ownerless running rows return to Planned on upgrade. Assignment also remains subject to the agent's domain-access policy.
CEREBRUM no longer polls health, full memory statistics, and the complete agent inventory every three seconds. Health refreshes at a calmer interval, the existing health payload supplies memory totals without a duplicate full-store scan, agents load only when Overview is visible, and all Settings polling pauses in background tabs. An RBAC save that fails on-chain now says clearly that access is not active and keeps Save enabled for an actual retry. This patch changes no consensus rule, AppHash, transaction type, key encoding, or fork; existing chains replay byte-identically.
SDK 11.7.3.
Background macOS updates are back, without compromising the signed app. SAGE now downloads and installs directly from the update banner, verifies the architecture-specific DMG against its published SHA-256, mounts it read-only, enforces the expected bundle identifier and Developer ID team, and asks Gatekeeper to validate both the release app and its staged copy. Activation atomically exchanges the entire signed SAGE.app bundle while preserving the previous bundle for proof-of-boot rollback. CEREBRUM also restores Access Controls, fixes Task Board page scrolling, and isolates the live block countdown so it no longer re-renders the entire Settings screen. Existing chains replay byte-identically.
SDK 11.7.2.
Smart-memory reliability and task-board maintenance release. Managed Smart Memory now stays managed: SAGE supervises the local Ollama runtime, adopts it across upgrades, and automatically restarts it after a crash instead of leaving semantic recall offline until manual repair. CEREBRUM tasks, imports, and pipeline journals now preserve embedding provenance, so newly indexed memories no longer drift back into the “needs fixing” queue after a successful repair. The task board also correctly fills the remaining application height, keeping the bottom of every column reachable. This patch changes no consensus rule, AppHash, transaction type, key encoding, or fork; existing chains replay byte-identically.
SDK 11.7.1.
Administration, connection, and lifecycle release. The genesis admin can now give a locally installed agent read or read+write access to a domain another agent owns, directly from CEREBRUM: the original owner is shown before confirmation, bound into the consensus transaction, and the override is recorded as an ordinary on-chain grant/revoke. Consensus support ships behind the dormant app-v18 gate; existing chains replay byte-identically. Connecting AI tools now follows OpenAI's current product surfaces: ChatGPT desktop's Codex mode gets a one-click app-wide local connection (shared with Codex CLI and the IDE extension), while ChatGPT Work uses the hosted connector path. Restarts and updates are coordinated end-to-end: a single-instance lock, clean draining of MCP sessions and dashboard streams, checksum-verified updates with automatic rollback and proof-of-boot verification. CEREBRUM now checks for new releases automatically and shows an update banner at the top of every page, with release notes and a direct path to update or restart options. This release also fixes the v11.6.1 reports of intermittent lost MCP connections and "cannot save to domain" errors (a boot-time key cache, transport blips mislabeled as permission denials, and a keep-alive race), hardens the HTTP MCP transport (operator-only bearer principal, nonce replay cache, exact origin allowlist), and rewrites the in-app CEREBRUM guide in plain language for non-technical users.
SDK 11.7.0.
Security and task-handoff maintenance release. v11.6.1 upgrades the transitive federation dependency quic-go to 0.59.1, incorporating the upstream fix for CVE-2026-40898. Assigned board tasks now reliably appear across provider boundaries, create dedicated one-way agent inbox notices, and are checked alongside backlog at agent boot. CEREBRUM also replaces browser-native confirmation prompts with accessible, themed SAGE dialogs. It changes no SAGE consensus rule, AppHash, transaction type, key encoding, or fork; existing chains replay byte-identically.
SDK 11.6.1.
SAGE federation can now travel with you, and selected memories can become a shared, durable two-node brain without turning the relay into a trusted server. v11.6.0 is an off-consensus connectivity, replication-control, and UX release: it changes no consensus rule, AppHash, transaction type, key encoding, or fork. app-v17 remains shipped-dormant until governed activation, and existing chains replay byte-identically.
SDK 11.6.0.
Quorum-governed memory lifecycle plus pipe anti-DoS hardening: a two-phase challenge whose bar scales to the network, a first-class reinstate verb, disputed-but-recallable memories, and size caps and quotas on the agent pipe. v11.5.0 introduces a new consensus fork app-v17 that ships dormant - it changes no live-chain behavior until a network activates it through the governed upgrade ladder (a 2/3 quorum vote, past a 200-block floor). Until then app-v15 stays the active v11 consensus fork, app-v16 stays shipped-dormant, and historical replay of every existing chain stays byte-identical. The pipe hardening is off-consensus and active on upgrade.
app-v17 counts the distinct modify-verb holders on its domain from committed state - the owner, ancestor-domain owners, and unexpired level-3 grantees, enumerated in sorted order. A personal node with one holder keeps the byte-identical legacy one-strike deprecate; where two or more holders exist the memory is parked as challenged, and a second, distinct holder must confirm before it deprecates - the original challenger cannot self-confirm. So a small-LAN node and a large federation apply proportionate bars instead of one hardcoded threshold.app-v17 transaction, TxTypeMemoryReinstate, takes a challenged memory back to committed, restoring its original content hash from the challenge record; a challenger who wants to withdraw rides the same tx even if their grant has since expired or been revoked. It is reachable through REST (POST /v1/memory/{id}/reinstate), MCP (sage_reinstate), the Chrome bridge, and both Python SDK clients.app-v17 carries the exact canonical signed request in a backward-compatible optional envelope. Consensus re-hashes and re-verifies it, reconstructs the authorized type-specific payload, applies the ±5-minute window against deterministic block time, and consumes an AppHash-folded proof marker once. A captured proof cannot be transplanted onto another action or rewrapped under a fresh node nonce. Node-originated transactions signed end-to-end by the same key keep the existing outer-signature + nonce path.disputed flag set and a query-time confidence haircut already applied to confidence_score, so an agent sees the marker and the softened score instead of silently losing the memory.from_agent, not the spoofable rate-limit header.SDK 11.5.0.
ChatGPT setup is now a background-managed CEREBRUM flow. v11.4.11 is an off-consensus UX and packaging patch - it changes no consensus rule, AppHash, transaction type, key-encoding, or fork: app-v15 stays the active v11 consensus fork, app-v16 stays shipped-dormant, and historical replay stays byte-identical.
tunnel-client, writes the local profile, and starts the daemon from inside CEREBRUM. The user only opens the OpenAI and ChatGPT browser tabs.sage-gui executable path from the backend instead of assuming sage-gui is on PATH, so macOS app-bundle installs work.tunnel-client admin UI binds 127.0.0.1:8081, leaving SAGE's dashboard on 127.0.0.1:8080.sk-....SDK 11.4.11.
Connecting two SAGEs works again. v11.4.10 is an off-consensus bug-fix patch - it changes no consensus rule, AppHash, transaction type, key-encoding, or fork: app-v15 stays the active v11 consensus fork, app-v16 stays shipped-dormant, and historical replay stays byte-identical.
SDK 11.4.10.
ChatGPT setup now follows OpenAI's official Secure MCP Tunnel path. v11.4.9 is an off-consensus UX and packaging patch - it changes no consensus rule, AppHash, transaction type, key-encoding, or fork: app-v15 stays the active v11 consensus fork, app-v16 stays shipped-dormant, and historical replay stays byte-identical.
tunnel-client runbook for SAGE's local stdio MCP server. No domain, no public SAGE URL, and no inbound firewall rule.SDK 11.4.9.
The join ceremony guardrails are tighter, and the release pipeline is cleaner. v11.4.8 is an off-consensus reliability and release-maintenance patch - it changes no consensus rule, AppHash, transaction type, key-encoding, or fork: app-v15 stays the active v11 consensus fork, app-v16 stays shipped-dormant, and historical replay stays byte-identical.
SDK 11.4.8.
Dependencies are current, agent pipeline replies are claimant-bound, and release gates now cover the nested natter module. v11.4.7 is an off-consensus dependency and release-hardening patch - it changes no consensus rule, AppHash, transaction type, key-encoding, or fork: app-v15 stays the active v11 consensus fork, app-v16 stays shipped-dormant, and historical replay stays byte-identical. Everything here lives in dependency pins, local SQLite pipeline metadata, federation seed-at-rest handling, and CI/release automation.
natter Go module now carries the updated quic-go, x/crypto, and x/net dependency line, plus the matching x/* tidy updates. This keeps the optional connectivity service ready for the v11.5 internet-federation work without spending an app-version slot.claimed_by, and result submission is accepted only from the authenticated claimant (or a safe legacy recipient path for already-claimed pre-upgrade rows). Unrelated callers still get anti-enumeration 404s, senders can read their own pipe status but cannot complete recipient work, and failed/forged result attempts no longer create auto-journal memories.natter module, run a cheap first-party JavaScript syntax check, and Dependabot is configured for root Go, natter, npm, the Python SDK, and GitHub Actions.SDK 11.4.7.
Give your network a real name, connect without getting stuck, and scan a code your laptop camera can actually read. v11.4.6 is an off-consensus federation reliability + UX release - it changes no consensus rule, AppHash, transaction type, key-encoding, or fork: app-v15 stays the active v11 consensus fork and app-v16 stays shipped-dormant, and historical replay stays byte-identical. Everything here lives on the federation transport (mTLS on :8444, outside consensus), a local display table, and the dashboard.
sage-personal-ybly7j6fzxp5n4zsvomjzway4w) - so when someone tried to join you, that unreadable string was all you saw. You can now give your network a friendly name (e.g. "Dhillon's MacBook") from the Federation page. Peers see it during a join - the host's review step reads "Dhillon's Mac wants to connect" - and it labels the row in each side's connections list. The name is a cosmetic label carried alongside the permanent id, which never changes: it's not used to verify anyone (the scanned/spoken code still is that anchor), and it never touches the chain.SDK 11.4.6.
Federation grows up: it's opt-in behind one master switch, it survives restarts and hours-long peer outages, and a topic's memories can now be copied across a link, not just borrowed live. v11.4.5 is an off-consensus reliability and federation-UX release - it changes no consensus rule, AppHash, transaction type, key-encoding, or fork: app-v15 stays the active v11 consensus fork and app-v16 stays shipped-dormant, and historical replay stays byte-identical. Everything here lives on the federation transport (mTLS on :8444, outside consensus) and the dashboard; domain sync admits a copied memory as an ordinary locally-signed MemorySubmit on the receiver's own chain, so there is no new transaction and no fork.
:8444 port. The Federation panel gains a master On/Off switch at the top, and the same toggle stays in Settings, so the control is discoverable in both places. While it's off, the join/host cards are hidden with a nudge to turn it on; when on, the listener still only admits peers pinned to an agreement you approved (on your LAN or a route you provide).ReferenceError that froze the section; the shared status-dot helper is now module-scoped so both render cleanly.natter connectivity service (a separate binary, outside the SAGE trust boundary) gains a coordinator-only mode and explicit address advertisement for cloud hosts - plumbing for the NAT-traversal/relay work that lands as the v11.5 headline. Built-in internet traversal is not in v11.4.5 yet; federation today is LAN or a route you provide.SDK 11.4.5.
Handing a memory's domain to another agent is now one click from the search results themselves. v11.4.0 is a dashboard-only feature release: it changes no consensus rule, AppHash, transaction type, key-encoding, or fork - app-v15 stays the active v11 consensus fork and app-v16 stays shipped-dormant, and historical replay stays byte-identical. The new control reuses the existing v11.3 on-chain reassignment path, so there is no new transaction and no server change.
submitting_agent stays immutable and auditable), and the previous owner is fully revoked. When a selection spans several domains, each is transferred in turn, and the confirmation copy spells out that unselected memories move too.SDK 11.4.0.
A maintenance patch: golang.org/x/crypto is refreshed, and a latent transaction-encoding overflow is closed. v11.3.1 changes no consensus rule, AppHash, transaction type, key-encoding, or fork: app-v15 stays the active v11 consensus fork and app-v16 stays shipped-dormant, and historical replay stays byte-identical. Both fixes sit off the consensus hot path.
golang.org/x/crypto 0.51.0 to 0.52.0. Keeps the crypto dependency line current for the argon2 and hkdf packages SAGE actually imports.EncodeTx now rejects a payload larger than MaxInt32 up front, so the total-length arithmetic cannot overflow and the 4-byte length prefix cannot silently truncate a pathologically oversized transaction. This mirrors the guard DecodeTx already had. No real transaction approaches this size, so behavior is unchanged for all valid traffic.SDK 11.3.1.
Transferring a domain to another agent, and setting who can read and write it, are now real on-chain RBAC operations from CEREBRUM - and the access matrix finally enforces what it shows. v11.3.0 changes no consensus rule, AppHash, transaction type, key-encoding, or fork: app-v15 stays the active v11 consensus fork and app-v16 stays shipped-dormant, unchanged from v11.2.x. The RBAC domain-ownership transfer is built entirely from existing on-chain transactions - DomainReassign (tx-30), AccessGrant (tx-6), and AccessRevoke (tx-7), gated by an existing gov_propose (operation=domain_reassign) - so there is no new transaction and no new fork. There is exactly one consensus-path code change (applyGovernanceProposal now returns early for OpDomainReassign instead of falling through to validator-pubkey derivation, which logged a spurious error on every reassign), and it is proven AppHash-neutral: the caller appends a validator update only when the result is non-nil, so both the old error path and the new clean return append nothing - identical validator updates and state writes, so historical replay stays byte-identical, with only the error log gone. Memory authorship (submitting_agent) is never rewritten by any v11.3 path.
domain_reassign) is accepted by the sole validator, DomainReassign flips the owner and purges the domain's stale grants, and AccessGrant gives the new owner level-3 access. Each step's result is surfaced honestly; if the new owner's key is not on this node, the grant is deferred to the owner's own node (reported, not silently dropped). This transfers ownership plus read/write access, not authorship - every memory stays authored by whoever wrote it (submitting_agent is immutable and auditable), and the new owner gains access through ownership rather than by rewriting history. The old label-based "Transfer by Tag" paths, which rewrote authorship off-chain, are retired.AccessGrant / AccessRevoke transactions (signed as the domain owner), diffed against the actual on-chain grant state so it is idempotent and self-healing. Per-domain results are reported honestly (including "you do not hold this domain owner's key" skips), and the misleading copy is corrected. No admin-bypass was added to the consensus grant/revoke handlers.sage_rename. The Search page gains a created-at date-range filter and a "Last hour" preset. A new sage_rename MCP tool renames an agent's display name and boot bio on-chain (via AgentUpdate), failing closed to preserve the existing bio - an agent rename, not a memory or domain rename./health instead of a hard-coded constant, with the fallback constant kept in sync with the release.SDK 11.3.0.
A reliability patch: sage_turn (and all embedding-backed recall/store) no longer fails on transient Ollama hiccups. Agents reported intermittent embed errors — the local embedder (nomic-embed-text) blipping or disconnecting "from time to time." The root cause was the embedder client: a single, unretried request with no keep_alive, so Ollama's default 5-minute idle unload meant the next embed paid a cold model reload that could time out or fail. sage_turn embeds twice (recall + store), so the flakiness hit both legs. All fixes are off-consensus — no chain, fork, or API-contract change.
keep_alive (default 30m, override OLLAMA_KEEP_ALIVE), so nomic-embed-text isn't unloaded between turns — eliminating the cold-reload behind most of the intermittent failures. Integer-form values (e.g. OLLAMA_KEEP_ALIVE=-1 to pin it in memory) are translated to the wire form Ollama accepts.5xx, empty result), but does not retry a timeout (a hung Ollama fails in one attempt instead of multiplying the wait) or a 4xx.sage_turn observation. If the embedder is genuinely down after retries, the memory is still committed (without a vector) rather than lost, and the turn now reports store_mode: "no_vector" + semantic_degraded: true so you know it isn't semantically recallable until a re-embed backfills the vector.SDK 11.2.1.
Two correctness fixes: min_confidence recall now filters the value it reports, and legacy "un-forgettable" memories can be deprecated again. v11.2.0 introduces a new consensus fork app-v16 that ships dormant — it changes no live-chain behavior until operators activate it via a governance vote. The recall fix is off-consensus and active on upgrade.
min_confidence filters the decayed confidence it reports. Recall (/v1/memory/query, /search, /hybrid, and sage_recall) filtered min_confidence against the stored confidence but returned the decayed value — so a min_confidence=0.7 query could hand back a result whose confidence_score was 0.54. The floor is now enforced on the same decayed, task-aware value that's serialized, over the full candidate set before the top-K trim (so corroboration-boosted memories aren't starved and top_k fills correctly). A new initial_confidence field exposes the stored value alongside the decayed one; open tasks are exempt from decay; federated results are re-checked against the floor.app-v8.4 never received an on-chain domain record, so forget()/challenge() rejected them — with a cryptic error — even for their owner. The new app-v16 fork adds a governance-attested domain repair (OpMemoryDomainRepair, 2/3 supermajority) that backfills the missing domain — idempotent, existence-guarded, never overwriting — after which normal deprecation works. The deprecation gate now returns an actionable 409 (legacy, needs repair) / 404 (unknown id) / 403 (unauthorized) instead of a generic rejection, and new submits must carry a domain so the state can't recur. app-v16 activates only via a governance {Name:"app-v16", TargetAppVersion:16} upgrade — the release binary changes no consensus behavior until you vote it in.SDK 11.2.0.
Federation actually works between separate nodes now, plus health/observability polish. v11.1.0 changes no consensus rule, AppHash, transaction, or key-encoding; app-v15 remains the active v11 consensus fork. The one upgrade-time behavior change is a one-time local network-identity re-mint on legacy nodes (details below) — your memories are backed up first and preserved.
sage-personal, so SAGE's self-federation guard treated any two nodes as the same network and refused every join. On its next boot a legacy node now re-mints a globally-unique network id, so two independent nodes can finally connect.
concepts/block-production-and-idle.md) makes clear that a SAGE chain has no heartbeat — an idle chain mints no blocks, and a frozen height with an empty mempool is healthy, not stuck. /v1/dashboard/health now exposes chain.idle / chain.stuck / last_block_age_seconds so monitors alert on stuck, not a still height.GET /ready now reflects the embedding provider: a down semantic embedder reports degraded (HTTP 200; ?strict=1 → 503) instead of a misleading ready, refreshed by a background watchdog. And sage_recall / sage_turn results carry recall_mode / semantic_degraded / degraded_reason so an agent knows when recall silently fell back to keyword-only.GET /v1/chain/backpressure (+ an X-Sage-Mempool-Pct header on every submit) lets clients pace writes without polling raw CometBFT RPC, and a mempool-full submit returns 429 + Retry-After (a distinct problem type) instead of an opaque 500.--require-voter / voter.required makes a deployment that needs automatic proposed → committed flow fail-fast rather than silently run voterless; sage_voter_running + sage_proposed_oldest_age_seconds metrics and a /ready voter block turn a stuck backlog into a first-class alarm; a new concepts/voter-operations.md runbook covers per-mode ownership, key safety, quorum math, and triage.SDK 11.1.0.
Smart memory setup now manages Ollama end to end. v11.0.2 is a patch release on top of v11.0.1: no consensus rule, AppHash, transaction, key-encoding, or migration change. Existing v11 chains update in place; app-v15 remains the active v11 consensus fork.
nomic-embed-text, verify the embedding dimension, and remember the managed runtime preference across restarts. This gives Ollama the same dashboard-first setup path as the managed reranker.SDK 11.0.2.
CEREBRUM is now fully MRI-first. v11.0.1 is a launch-polish patch on top of v11.0.0: no consensus rule, AppHash, transaction, key-encoding, or migration change. Existing v11 chains update in place; app-v15 remains the active v11 consensus fork.
golang.org/x/net is bumped to v0.55.0 in the Go module graph.SDK 11.0.1.
CEREBRUM becomes a real control board, semantic memory turns on in a few clicks, one click stands up a managed reranker, and two SAGE nodes can now federate their memory over a secure LAN-first join ceremony. v11.0.0 activates a new app-v15 consensus fork and ships as a major version: every validator must run this binary and fully converge before the app-v15 activation height (the auto-vote readiness gate enforces this on the governance path, so an unsupported upgrade never reaches quorum). Every existing chain replays byte-identically until activation (the fork gate is dormant pre-activation), and a node-by-node rolling upgrade is safe: a mixed v10.x / v11.0.0 cluster computes the identical AppHash while app-v15 is dormant. On personal/single-validator nodes the auto-advance ladder reaches app-v15 automatically.
CEREBRUM dashboard overhaul. A new top-level Overview control board gives you a glanceable, read-only picture of the node: a status banner plus cards for chain health, quorum and nodes, agents, federation, and embeddings, each polling independently so one dead feed never blanks the board. The 3D MRI brain is now the default view, and it renders fully offline (three.js and 3d-force-graph are bundled locally instead of pulled from a CDN); established memories pull to the core and fresh ones ride to the rim, and clicking a memory blooms its "train of thought" as a labelled constellation with a side panel you can hop through. Search is real full-text plus semantic now (FTS5, relevance-ranked, RBAC-scoped) instead of a client-side filter over the newest 100, with status filters (all / committed / proposed / deprecated), corroboration counts, an editable memory domain, and bulk curation (multi-select with an action bar). A live Tasks board shows agent-vs-human authorship, supports drag-to-status, and uses an atomic compare-and-swap claim so two agents never double-work an assignment, and a Messages tab (the agent-to-agent pipeline, merged into Tasks) adds a human-to-agent note composer so a person can drop a note into an agent's inbox without impersonating one. A first-run onboarding wizard (welcome, semantic memory, connect an AI tool, pointers) shows only on a fresh node and is re-runnable any time from Settings > Maintenance > Run setup.
Semantic memory made effortless. A "Turn on smart memory" flow switches the node off the keyword-only hash pseudo-embedder onto the bundled Ollama + nomic-embed-text (768-dim): it detects Ollama, downloads the model if missing, re-embeds your existing memories with a live progress bar (resumable, vault-gated, runs in the background), then restarts so every consumer picks it up. Memories orphaned by a past vault re-initialization (encrypted under a previous data key and undecryptable now) can be recovered by re-keying in place: paste the old recovery key, preview "X of N", and recover, with no new IDs and no new consensus records, since only content and embedding are encrypted while the content hash stays plaintext-derived. Deprecated memories are now audit-only and never surface in CEREBRUM.
One-click managed reranker. SAGE gives the reranker the Ollama treatment: with one consent click it downloads a pinned llama.cpp release build itself (sha256-verified before any byte touches disk) and the bge-reranker-v2-m3 GGUF (Q8_0, 636MB, sha256-verified, atomic install so a truncated or tampered file never lands), then spawns and manages a llama-server sidecar on loopback that serves a real cross-encoder /v1/rerank. It survives node restarts (a healthy survivor is adopted via a real rerank probe rather than blindly respawned, with a probe-before-kill guard on shutdown). The whole thing is a zero-terminal hands-off checklist (engine, model, start, done), and recall k is now tunable from 3 to 20 (was 4 to 10) with copy that explains the token cost and flips its guidance based on whether the reranker is actually on.
Federation v2. Two SAGE nodes can now share memory on the same LAN, or over connectivity you explicitly provide, established through a secure join ceremony. First-class internet/NAT traversal is scoped for v11.5, not v11.0. The v11 ceremony uses RFC-6238 TOTP-based mutual verification with a QR enrollment plus spoken 6-digit confirm codes, a pin-bound short-authentication-string that provably diverges if an enrollment is relayed, and a fail-closed version gate. Two modes, both consent-gated with a "nothing is deleted" guarantee: exchange mode keeps foreign data on its owner's chain and queries it live off-consensus over a pinned mTLS federation listener and query proxy, and co-commit mode writes native memories on both chains, each ratified by its own chain and cross-anchored by a hash of the other side's signed commit receipt (you remember and I remember, each on our own chain). Guided guest and host wizards make "add another computer to my SAGE network" an end-to-end dashboard flow.
app-v15 consensus fork. The fork that makes federation v2 real on-chain: new co-commit transaction types (CoCommitSubmit / CoCommitAttest) and cross-federation exchange-terms types (set / revoke), a co-commit envelope validity window bound to jointly-signed times and to federation status, and an access-grant verb ladder that makes the level-3 "modify" verb grantable and requestable. It also tightens the authorization gates on existing consensus handlers as a hardening pass. Every one of these rules derives purely from committed state and the consensus block time (no wall clock, no per-node cache, no map-iteration order), so every replica reaches the same verdict; all of it is byte-identical pre-activation and reached through the same governed upgrade ladder every prior fork uses (auto-advanced on personal nodes, governance-activated on a quorum).
Quality. New memories now stamp their embedding provider at insert, so a freshly-written memory stops posing as unembedded and the "needs re-reading" counter no longer creeps up forever over real vectors. Redeploy got a robustness pass: a single-validator agent add/remove no longer runs the destructive wipe-and-restart that could brick a personal node, a stuck "reconfiguration in progress" banner can no longer wedge forever, and redeploy status reports the real terminal outcome instead of flashing a false success. Underneath it all are dozens of fixes from multi-pass adversarial find-and-verify reviews across the consensus, transport, web, frontend, and crypto surfaces.
SDK 11.0.0.
The v10.x line (MRI 3D brain, the app-v12/v13/v14 idle-block + AppHash fork ladder, multi-node-safe voting, per-domain read-ACLs) and the full v3–v9 history — consensus-first writes, PoE-weighted quorum, governance-gated upgrades, TLS, RBAC/multi-org, hybrid recall — are on the Releases page.
| Paper | Key Result |
|---|---|
| Agent Memory Infrastructure | BFT consensus architecture for agent memory |
| Consensus-Validated Memory | 50-vs-50 study: memory agents outperform memoryless |
| Institutional Memory | Agents learn from experience, not instructions |
| Longitudinal Learning | Cumulative learning: rho=0.716 with memory vs 0.040 without |
git clone https://github.com/l33tdawg/sage.git && cd sage
go build -o sage-gui ./cmd/sage-gui/
./sage-gui setup # Pick your AI, get MCP config
./sage-gui serve # SAGE + Dashboard on :8080
Or grab a binary: macOS DMG (signed & notarized) | Windows EXE | Linux tar.gz
docker pull ghcr.io/l33tdawg/sage:latest
docker run -p 8080:8080 -v ~/.sage:/root/.sage ghcr.io/l33tdawg/sage:latest
Pin a specific version with ghcr.io/l33tdawg/sage:11.9.1.
If you installed SAGE before v5.0 and your AI isn't doing turn-by-turn memory updates, re-run the installer in your project directory:
cd /path/to/your/project
sage-gui mcp install
This installs Claude Code hooks that enforce the memory lifecycle (boot, turn, reflect) — even if your .mcp.json is already configured. Restart your Claude Code session after running this.
| Doc | What's in it |
|---|---|
| Architecture & Deployment | Multi-agent networks, BFT, RBAC, federation, API reference |
| Getting Started | Setup walkthrough, embedding providers, multi-agent network guide |
| Security FAQ | Threat model, encryption, auth, signature scheme |
| Connect Your AI | Interactive setup wizard for any provider |
Go / CometBFT v0.38 / chi / SQLite / Ed25519 + AES-256-GCM + Argon2id / MCP
Unless otherwise stated, SAGE source code is licensed under Apache 2.0. Papers: CC BY 4.0. Some bundled visual assets are third-party works under their own licenses (e.g. the 3D MRI brain mesh, CC BY 4.0) — see THIRD_PARTY_NOTICES.md.
Dhillon Andrew Kannabhiran (@l33tdawg)
A tribute to Felix 'FX' Lindner — who showed us how much further curiosity can go.
io.github.ericm1018/skillfm-llm-cost-optimizer-openai-anthropic-usage
io.github.mikerawsonnz/llm-orchestration-agent
io.github.mikerawsonnz/authenticated-llm-agent
labforgedev/copilot-memory-mcp
csoai-org/agent-prompt-injection-firewall-mcp
io.github.mikerawsonnz/authenticated-multi-llm-agent