Right Rudder

Right Rudder reads an agent's own action and tool-return stream, reconstructs the state the agent committed over a run, and reports where the agent later broke it. It works on any agent and any model, since it reads the record a run already produces and never touches model internals. The hosted service runs at read.embeddedriskanalytics.com on version 0.5.0 and answers three routes.

Fathom now goes by Right Rudder. The packages, the hosted service and the census carry the new name, and old links and installs keep working.

The read

The read names where an agent breaks its own state

The read takes the operations a run has produced and returns the points where the agent worked against its own committed state. It names six kinds.

Stale reference

The agent acts on a fact it already removed or renamed away.

Superseded value

The agent writes or answers with a value it already replaced.

Authored contradiction

The agent reintroduces a token into a record it had already migrated.

Residual

The agent ends the run with a record still carrying a value it replaced elsewhere.

Duplicate commit

The agent adds an entity a collection already holds.

Post-commit mutation

The agent changes a record after committing it.

The read answers unkeyed calls at 50 a day from one address. It returns the findings and their kinds, and it never reads the content of what the agent committed. A call goes to POST /v1/read. Try it live on the home page.

The expiry read

The expiry read reports how much life a run has left

Every agent run spoils in time. The expiry read takes the same action stream as the read and reports, as a median in steps, how much functional life a run holds before its committed state contradicts itself, together with an alarm that fires while a rejected or corrupted action still stands in the record. It answers unkeyed calls at the same 50 a day from one address. A call goes to POST /v1/expiry.

The repair

The repair runs in front of one step

The caller sends the operations so far and the actions the agent proposes next, and the repair evaluates each proposal alone against the committed state those operations build. It returns one of three decisions.

Proceed

Every proposal survives, and the step runs as the agent intended.

Filter

Some proposals survive, and the caller takes the agent's own non-contradicting alternative.

Reground

No proposal survives, and the response carries the committed facts each rejected proposal broke, so the caller puts them back in front of the agent and asks again.

The response holds decisions and facts, and never scores.

Measured

What it did to the DBOS agent

In our reread of DBOS's own Hacker News research agent, vendored unchanged and run on gpt-4o-mini through OpenRouter across five topics at ten iterations each on 2 September under fathom-read 0.4.1, the agent as it shipped worked against its own record.

As it shipped

  • 14 of 50 searches repeated, all from the fourth iteration on
  • 317 of 747 threads re-read, 42 percent of them
  • 516 stories held more than once under the same title

With the repair

  • 0 of 50 searches repeated
  • 77 of 656 threads re-read, 12 percent
  • distinct threads covered rose from 430 to 579, a 35 percent gain

We placed the repair in front of the one step where the agent proposes its next queries and changed nothing else, at the same model and the same iteration count. Across the 45 follow-up steps, the repair let 23 proceed untouched, filtered 21 to the agent's own non-contradicting alternative, and regrounded 1. The agent's own first-choice next query already sat in its committed list on 21 of those 45 steps, so on nearly half the steps the agent proposed work it had already finished. The trace, the mapping, and the command sit in the census under rows/dbos-hn-agent.

The repair key

Get a key

The repair needs a free key. An unkeyed or demo call to POST /v1/reground returns a 401 that points at POST /v1/keys, which keeps a key out of any page that runs in a browser. A key carries 2,000 calls a day, and the repair counts double against that.

A key issues from an email address. The service allows three a day from one address and returns each key a single time, so store it when it arrives.

Metering

What the service records

Every call writes one row to a metered database. The row holds the route, the tier, the number of operations, the finding kinds, the decision, and the latency. It never holds the content of your operations.

RecordedNot recorded
Route, tier, operation count, finding kinds, decision, latencyThe content of your operations

The terms page states how we use this.

The packages

Run the read in your own stack

right-rudder ships on PyPI at 0.7.0 with fifteen adapters, the client, and a command line that runs right-rudder read, right-rudder reground, and right-rudder key. langchain-right-rudder adds the read to a LangChain agent as middleware, and a capture that extends it to the agent's sub-agents.

Right Rudder on GitHub →