Shared memory across your team and your AI agents — with judgment!
RoBrain isn't just another memory layer — it's the brain that helps you and your agents make better decisions and avoid costly mistakes.
Most agent-memory tools treat context like a passive archive. RoBrain is an evaluation and delivery engine designed around state-grounding: Is this context still true against the live environment, and what must surface before an agent acts again? Passive capture records every decision and the alternatives your team ruled out; batch Synthesis reads the whole corpus to flag contradictions, drift, and recurring entities that no single session could see. Coding is the first vertical because the feedback loops are tight — reverts, incidents, and rework make the cost of a forgotten rejection measurable. The same architecture applies wherever agents make decisions that outlast a session.
RoBrain is built by Rory Plans, an agent orchestration platform; it is the memory and judgment layer that keeps multi-agent, multi-developer work coherent over time.
Measured: without decision memory, a coding agent re-proposes an approach your team already rejected in up to 9 of 10 tasks. Through RoBrain's full pipeline — 0 of 50, across five archived runs (VetoBench).
Two commands, no clone needed:
export ANTHROPIC_API_KEY=... OPENAI_API_KEY=... # classifier + embedding keys (or add to ~/.robrain/stack/.env after first run)
npx robrain@latest up # start the backend (Postgres + Perception) in Docker
npx robrain install --self-hosted # wire the MCP server into your editors
Then run npx robrain init-project inside any repo you want memory for. Capture is automatic from
there — every session turn is classified, no tagging. If captures don't land,
npx robrain doctor diagnoses the setup.
Claude Code users should also install the plugin for hook-based capture and pre-task
warnings about rejected approaches. Codex CLI users get the same hooks automatically
from robrain install (trust them on first Codex run):
claude plugin marketplace add adelinamart/robrain
claude plugin install robrain@robrain
Clone path, Synthesis, ledger export, and troubleshooting: Quick start · CLI reference
Whether that's worth the setup depends on your situation.
If none of these sound familiar, a static CLAUDE.md may be enough for now.
See the full walkthrough →
If they do, here's what RoBrain offers.
rejected[] field: what was ruled out, and why.
POST /veto-scan for deterministic exact-match on
rejected[] (no LLM). The Claude Code plugin and Codex hooks call it on every prompt, then
semantic search for longer tasks; Hermes renders semantic REJECTED: warnings per turn. Other
editors get prior decisions at session start via the always-on summary.
conflicts_with / extends / related_to).
robrain outcomes demotes decisions that led to reverts; incidents are next on the roadmap.
robrain-memory/v1 JSONL, or keep a decision ledger in git with robrain export-memory --ledger.
Comparisons with other memory tools: Concepts — Comparisons.
npx robrain explain <file> answers "why does this code look this way?"
Most memory benchmarks ask "did the right item come back?" VetoBench asks what that misses: given a task that invites an approach the team already rejected, does the agent propose it again?
| Memory condition | Re-proposed a rejected approach | Could cite the prior rejection |
|---|---|---|
| No memory | 8–9 of 10 tasks | 0–10% |
| Conventions file (choices only — what most teams have today) | 1–2 of 10 | 80–90%, but inferred — the reasons aren't there |
| Mem0 — full pipeline, 5 archived runs | 0–2 of 10 per run | 50–90% |
| RoBrain — full pipeline, 5 archived runs | 0 of 10, every run | 100% |
claude-haiku-4-5, 2026-07-07/08. Mem0 and RoBrain ingested byte-identical transcripts, each through its own real production extraction. Mem0's ingestion dropped the recorded rejection from 38% of retrieved contexts — and violations concentrated exactly there (26% when the veto was absent vs 3% when present). RoBrain's extractor kept 100/100 vetoes.
Meta Muse Spark 1.1 (2026-07-14, five archived runs via Vercel AI Gateway): without memory, Meta's newly launched agentic flagship re-proposed rejected approaches in 4–6 of 9 tasks per run — Redux, Prisma, Jest, and GraphQL in all five runs. With RoBrain decision memory: 0 violations in all 45 cells, naming the prior rejection every time — quoting the recorded reason and date verbatim where it elaborated. Asked to cut mobile overfetching, the no-memory run proposed the full GraphQL rollout the team had ruled out, five runs out of five; with RoBrain in context it proposed REST sparse fieldsets and quoted the recorded rejection. One scenario excluded (n=9): Meta's content filter deterministically blocks a benign session-caching prompt. Receipts and caveats: results/muse-spark-1.1-series.
Every retrieved context, agent reply, and verdict is committed in the repo — check the work before quoting it: packages/vetobench.
Decisions are durable context, not permanent vetoes. When a previously rejected idea makes
sense again, you supersede the old row — history stays queryable, the new decision becomes active.
Synthesis flags contradictions for robrain review; it does not fossilize your
stack. Informed reconsideration, not lock-in.
Sensing MCP runs quietly inside your editor and fetches the
always-on summary at session
start. The robrain CLI is the manual surface for review, explain, synth, focused
inject queries, and export-memory (Claude auto-memory and an optional git
ledger).
npx robrain export-memory --ledger regenerates decisions.md for PR review; Postgres
stays the source of truth. Separate from per-user Claude auto-memory under
~/.claude/projects/<slug>/memory/.
From a clone, pnpm docker:up brings up Postgres (decisions + pgvector for
retrieval) on the first run — it also creates .env. Add your LLM and embedding keys, then run it
again and the Perception API (extracts and stores decisions from session turns) starts in
the background. No clone? npx robrain up does the same with a managed stack under
~/.robrain/stack/.
POST /veto-scan on self-hosted Perception — deterministic check: does this
text literally name an option an active decision rejected? No embedding, no LLM. The Claude Code plugin calls
it on every UserPromptSubmit (tier 1), then semantic search for longer prompts (tier 2).
Hermes uses semantic prefetch for REJECTED: warnings per turn.
Synthesis is the batch job: run npx robrain synth on demand or on a cron
schedule so the whole corpus gets scanned for contradictions, drift, and recurring entities.
Planning API and Control MCP add automatic injection at task boundaries
across every editor — applying the same 5-signal relevance scoring OSS exposes on retrieval — plus a
pre-commit /dry-run conflict verdict, distinct from OSS POST /veto-scan, which is
the deterministic pre-action check for literal rejected-option mentions. Full breakdown below.
More setup paths, Synthesis, and the git ledger — or jump to the Quick start section below.
The steps above are enough to get going. Below: OpenAI-only keys, the clone development path, Synthesis, and the git ledger.
One-time — no clone needed
export ANTHROPIC_API_KEY=... OPENAI_API_KEY=...
npx robrain@latest up
npx robrain install --self-hosted
OpenAI-only: set LLM_PROVIDER=openai and OPENAI_API_KEY instead of Anthropic — see
Concepts.
From a clone instead (development)
git clone https://github.com/adelinamart/robrain
cd robrain
pnpm install && pnpm build
pnpm docker:up # first run: creates .env; Perception won't start yet
# open .env, add ANTHROPIC_API_KEY + your embedding key (e.g. OPENAI_API_KEY)
pnpm docker:up # second run: Perception now boots
npx robrain install --self-hosted --repo-root "$(pwd)"
Per application project
cd /path/to/your/project
npx robrain init-project
Corpus judgment (manual once, or add to cron)
npx robrain synth
Synthesis writes contradiction flags, drift signals, and entity summaries into your DB — review with
npx robrain review. It does not capture new decisions; it judges what you already have.
Git-committed decision ledger (opt-in)
npx robrain review # optional — inspect/approve captured decisions in the CLI
npx robrain export-memory --ledger
# custom path: npx robrain export-memory --ledger docs/decisions.md
Use review when you want to see what is being recorded and approve or reject rows before regenerating
decisions.md for git — skip it if you are fine exporting straight from the DB.
After init-project, every repo gets CLAUDE.md and AGENTS.md (Codex CLI),
and Cursor also gets .cursor/rules/robrain.mdc with alwaysApply: true — capture setup is automatic.
See
docs/cli.md (install + commands) and
docs/troubleshooting.md for editor-specific notes.
Install details: docs/cli.md ·
Upgrading ·
Concept walkthrough.
Using Claude Code? Skip the MCP-call discipline — wire capture and warnings into the editor itself.
The RoBrain plugin wires capture and rejection-warnings straight into Claude Code's lifecycle — no reliance on the model remembering to call an MCP tool. It talks only to the self-hosted Perception URL you already configured, and every hook fails open: if your stack is down or unconfigured, your session is unaffected.
Injects the always-on summary — top decisions with their rejected alternatives — into every new session.
Semantic-searches the decision corpus with your prompt and warns the agent before it starts when the task touches a decision you already ruled out.
Ships the completed turn to Perception for server-side extraction (async) — capture becomes deterministic instead of best-effort.
Add the plugin
claude plugin marketplace add adelinamart/robrain
claude plugin install robrain@robrain
Runs alongside the Sensing MCP — Perception deduplicates server-side, so nothing is double-captured. With the
plugin installed, the sensing_record_turn block in CLAUDE.md becomes optional, and
decisions still surface in Cursor, Copilot, and Codex through the same store.
One install covers the team: npx robrain init-project writes the plugin recommendation into the
repo's .claude/settings.json, so every teammate who opens the project in Claude Code is prompted
to install it — nobody has to be told the plugin exists (opt out with --skip-claude-plugin).
Running Hermes? RoBrain ships as a memory-provider
plugin — same Postgres store, same rejected[] vetoes.
For Hermes, RoBrain installs as a standalone
memory-provider plugin under ~/.hermes/plugins/robrain. Passive capture, semantic prefetch, and
veto-aware warnings all go through your self-hosted Perception API — no separate memory stack.
Injects the always-on summary into the system prompt — top decisions with their rejected alternatives.
Background semantic retrieval surfaces relevant vetoes as REJECTED: warnings; completed turns
ship to Perception for server-side extraction.
The robrain_search tool lets the agent query decisions and ruled-out approaches before
committing to a plan.
Install the plugin (no clone)
npx robrain@latest up
npx robrain install --hermes
hermes memory setup # select "robrain"
Combine with editor wiring in one run: npx robrain install --self-hosted --hermes. Every hook
fails open — if Perception is down, Hermes keeps working without blocking. Details:
integrations/hermes.
Already running self-hosted, or want the version with less manual lifting?
Self-hosted is the complete memory system: passive capture, corpus-wide judgment, outcome feedback from git
reverts, and the always-on summary at session start — you pull
focused context with inject when you need it. Cloud adds the Planning + Control
layer that surfaces vetoes and conflicts automatically, before the agent acts, plus team
management and a web dashboard.
| Capability | Free / self-hosted | Rory Plans cloud |
|---|---|---|
Passive session capture + structured rejected[] | ✓ | ✓ |
| Decision lifecycle (active / superseded / invalidated) + graph | ✓ | ✓ |
| Cross-tool MCP — Claude Code, Cursor, Copilot, Codex CLI, Hermes | ✓ | ✓ |
| Always-on summary at session start | ✓ | ✓ |
| Synthesis — drift, contradictions, entity promotion | ✓ | ✓ |
| Provenance on every memory + secrets redaction | ✓ | ✓ |
| Outcome linking — git reverts feed memory rank | ✓ | ✓ richer signal |
| Memory quality feedback — used/ignored counters, auto-demotion | ✓ | ✓ + helpful/pushback per injection |
| Memory interchange export + VetoBench CI gates | ✓ | same scorer |
| Self-host on your own infrastructure — data stays local | ✓ | processed remotely |
| Fully-local mode — LLM + embeddings on Ollama / LM Studio / vLLM | ✓ | — |
| Automatic injection at task boundaries | manual inject | ✓ |
Deterministic veto scan (POST /veto-scan) | ✓ | — |
Pre-task rejected[] warning before the agent acts | Claude Code (plugin), Codex (hooks), and Hermes (provider) | ✓ everywhere |
Pre-commit conflict verdict (/dry-run) | — | ✓ |
| 5-signal relevance scorer | ✓ on retrieval | ✓ applied automatically per task |
| Calibrated extraction prompt (fewer false positives) | — | ✓ |
| Auto-propagated vetoes + write-time supersession detection | — | ✓ |
| Conflict auto-resolution + decision lineage timeline | — | ✓ |
| Team memory — orgs, API keys, roles, scoped isolation | — | ✓ |
| Web dashboard | — | ✓ |
robrain outcomes feeds git reverts back into memory quality on both tiers; next is
widening that signal to incidents and cycle time. Full breakdown:
Concepts — self-hosted vs cloud.
Overview: README on GitHub. Deep dives:
explain, etc.)
robrain export, robrain-memory/v1 JSONL
robrain install)
The Perception API runs locally in Docker, extraction happens on your hardware, and decisions are stored in your Postgres. Nothing is sent to Rory Plans or any other external service.
The one network dependency: extraction calls Anthropic or OpenAI (your choice of classifier) and embeddings call OpenAI, Voyage, or Cohere. Those are the only outbound calls. You can swap providers or run a local model if you want full air-gapping.
And here's exactly what gets stored:
Full details, third-party processors, and retention: Privacy Policy.