rb. Rabbit Brain

Know where your research stands.

The record of the ML experiments your coding agents run: what was tested, what it showed, and what still needs you.

book a demo
see two real records

pip install rabbit-brain

read the promptshow the prompt to copy
Use Rabbit Brain to keep track of this research: [what you're trying to find out]. If I leave this blank, record where the work in this repository stands now.

Set up:
- If `rb --version` fails, install it with `uv tool install rabbit-brain` (or `pipx install rabbit-brain`).
- If this repository has no `.rb/` yet, run `rb init "<the work's theme>"`, then add my question with `rb question add`.
- Run `rb docs --start` and follow it. Run `rb context --model <your model id>` before anything else.

Record from the repository's own files, and cite them: the questions, the experiments with each setting and where its value came from, the rules a result must meet, and the runs. Run new experiments through `rb journal run`. Never compute findings, rankings or regressions yourself: rb computes them. Calls on results are mine. Record one only when I ask, in my words, and give me the `rb confirm` command.

If I want a page to share, run `rb page`: it writes the record's page as one file. If I want it in my rabbitbrain.ai account, run `rb login` (I approve its code myself) and then `rb sync`.

Finish with `rb status` exactly as printed, what you recorded, what rb says needs me, and where the page is if you wrote one.

How it works

Paste one line, get the record.

The prompt goes into your coding agent's chat. The agent records where the work stands from the repository's own files, and rb computes what it shows.

Your agent's chatpasted

Use Rabbit Brain to keep track of this research: [what you're trying to find out]. If I leave this blank, record where the work in this repository stands now.
+ 11 more lines
~/your-repo

What it runsfrom the prompt

  1. rb init "<the work's theme>"starts the record in .rb/
  2. rb docs --starthow to record work already done
  3. rb context --model <your model id>the state of the work, read first
  4. rb journal run -- <command>each new experiment, as it runs
  5. rb statuswhere it stands, and what needs you

From the demo

What rb catches.

Three catches from the demo study. Each comes from the project's own files, not from the agent's summary.

  • not reproduced

    The summary said worked examples lead by 22.9 points. Checked against its own runs, that lead isn't reproduced.

  • your call

    The baseline scores 13.07 where the model's published score is 49.6. rb shows it and waits for your call.

  • declared after the evidence existed

    The success rule was written after the results came in, and the estimate falls short of it.

Every number has a source

Rules, receipts, calls, and a link.

What the record keeps, as rb shows it: the rule, the files behind each run, your call, and the page you share.

loss-budgetrule ≤ 0.05

0 0.05

criterion met · loss
change.val_loss: +0.01337 [+0.006287, +0.02045]
paired difference, t interval, 3 seeds, 95% (rb)

Rules

Each criterion is a rule over one comparison, kept with when it was declared. rb reads it from the runs, with its interval and its units. loss-budget is the criterion's id: its name in every command.

Receipts · rb tour3 runs

  • rundnvs2dout/s1/metrics.jsonsha256 d9be87e8fd4a
  • runkusq34out/s2/metrics.jsonsha256 6cb0e5ba7a76
  • runzdrdumout/s3/metrics.jsonsha256 7691b6ed8f71

config out/s1/config.yaml: 2 match, 0 differ, 0 absent

Receipts

Each run keeps the files it came from, hashed, with the commit and the environment. A run whose config disagrees with the spec is shown and not counted.

Your callloss-budget

criterion met · loss
acceptrejectinvestigate

$ rb decide loss-budget accept \ --why "within budget on all three seeds" dp3kmue: accepted loss-budget: within budget on all three seeds

Calls

Accept, reject or investigate stay yours, each with its reason. A call an agent records waits until you confirm it with rb confirm.

A linkrabbitbrain.ai/demo

rabbitbrain.ai/demo/think-step-by-step-a-small-model-on-grade-school-math
Sample · read-onlysynced 28 Oct 07:57 UTC

A real record, kept by an agent with rb.

A link

rb page writes the record's page as one file to send anywhere. rb export --with-record writes a copy to host, which rb clone reads. rb sync keeps a private copy in your rabbitbrain.ai account, to share by a link you can revoke: see two real records in a sample account.

Illustrative previews, in rb's own words and numbers. The link is one of the two records at rabbitbrain.ai/demo.

Under the hood

How rb actually works.

Your agents write the record as they work. rb checks it against your repository and works out every finding from the runs. A fresh agent, or a colleague, starts from the record, not from old chat transcripts. The record is plain files in your repository, like your code.

  1. [1]
    Your agent records as it works.rb journal run, rb criterion add, rb note add: from the terminal, Python or MCP.
  2. [2]
    rb checks the record against your repository.Settings, code, outputs and git history. It never changes your code.
  3. [3]
    Anyone starts from the record.rb context briefs a fresh agent; rb open, rb page or a link shows you.
  4. [4]
    You make the calls.One your agent records waits for your rb confirm.

Checked, not taken on trust

The record doesn't take the agent's word.

rb reads the sources itself, and works out each finding from the runs every time it is read.

  • Settings checked against their source

    rb finds each value in the file or database row it cites. A value nothing has checked reads provisional, never verified.

  • Findings computed from the runs, never from the agent's summary

    No finding is stored. Each is worked out from the recorded runs when it is read, by the same definitions every time.

  • Rules marked when written after the results

    Each criterion keeps when it was declared. One written after its evidence says so on every reading of it.

  • Every call keeps who made it and why

    Accept, reject, park or ship: each keeps its reason and who made it. One from an agent waits for your rb confirm.

Share

One link to share.

Your agents run the experiments. Rabbit Brain keeps track of what you've actually learned.

  1. .rb/ in your repo
  2. rb sync --with-record
  3. a link you can revoke
  4. Rerun this research

The math study clones with its code, so your agent can rerun it. The INT8 study clones the record only: its code is not published.

An account at rabbitbrain.ai is free to make, and only rb login, rb sync and rb logout use it.

Free and open source · plain files in your repo

Start

Install it, or let your agent.

Python 3.10 or later, on Linux, macOS or Windows (preview). rb init sets up the agents it finds in the repository.

  • Claude Code
  • Codex
  • Cursor
  • anything that speaks MCP
pip install rabbit-brain
rb init "INT8 ResNet-50 on ImageNet"

Or uv tool install rabbit-brain. To try it without installing anything, uvx --from rabbit-brain rb tour.

rb spec set int8 optim.lr --source configs/train.yaml#optim.lr
int8/optim.lr = 0.1 · verified in configs/train.yaml#optim.lr

rb show loss-budget
Criterion loss-budget on int8 (primary, own): INT8 adds at most 0.05 validation loss
  loss-budget INT8 adds at most 0.05 validation loss
          criterion met · loss · change.val_loss ≤ 0.05 (n ≥ 3)
          reads:     change.val_loss: +0.01337 [+0.006287, +0.02045] · paired difference, t interval, 3 seeds, 95% (rb)
          result:    loss: the interval clear of 0 on the worse side (lower is better)
          rule:      criterion met: estimate +0.01337 ≤ 0.05
          timing:    declared before the evidence (by production times)
          units:     3 seeds
          integrity: ok
  runnh4zty: difference +0.0105 (file) · unit seed=1 · seed=1
  runuzfw2n: difference +0.0134 (file) · unit seed=2 · seed=2
  runhrmyaq: difference +0.0162 (file) · unit seed=3 · seed=3

rb decide loss-budget accept --why "within budget on all three seeds"
dp3kmue: accepted loss-budget: within budget on all three seeds
  made on loss-budget: +0.01337 [+0.006287, +0.02045], n 3 (rb): loss, criterion met

Next: rb status
INT8 against FP32 for ResNet-50, on ImageNet validation loss, three seeds. The result is a loss: INT8 is worse than FP32. The criterion is still met: INT8 is worse by less than the 0.05 it allows.

rb tour builds a small project and runs the whole loop. rb init --dry-run lists every file it would write, and rb remove takes out only what is rb's. The docs cover install, your first record and cookbooks; rb docs prints the manual.

For agents

Using rb from an agent

Rabbit Brain (rb) is a command-line tool that keeps the record of ML experiments as plain YAML in .rb/, next to the code. If a project has a .rb/ directory, run rb context --model <your model id> before anything else: it is the state of the work, and it replaces any summary of it.

Record from the repository's own files and cite them. Run new experiments through rb journal run. Do not compute findings, rankings or regressions yourself: rb computes them each time they are read. Calls on results are the user's: record one only when they ask, with their words in --words, and give them the rb confirm command it waits for.

Every command takes --json and prints one JSON object; when one fails, read errors[].fix. The record needs no account: only rb login, rb sync and rb logout use one, at rabbitbrain.ai.