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 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
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 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.
Measured
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
With the repair
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
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
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.
| Recorded | Not recorded |
|---|---|
| Route, tier, operation count, finding kinds, decision, latency | The content of your operations |
The terms page states how we use this.
The packages
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.