A user reports a bug: I couldn't save, I tried three times.
reprobe gathers what production saw, read-only. Your coding agent finds the cause, cites evidence for every claim, and writes a test that fails on the code you deployed.
npx reprobe init
Free and MIT licensed. No server, no account, no hosted model. It runs on your machine with Claude Code or Codex.
“I couldn't save, I tried three times.”
Every attempt resends a stale idempotency key from an earlier draft, so each is rejected as a duplicate. No new draft is saved. query:3b7e10c9a2 sentry:api:API-4K2
A user says something broke. You open the database, the traces, the logs and Sentry in separate tabs, and piece together a story that sounds right. You ship a fix. Whether it worked, you learn from the next complaint.
reprobe replaces the guess with a test. When the test fails on the code your users ran and passes on your fix, the cause is proven, not just plausible.
You run a production app, maybe with AI features, and the evidence for one bug is spread across several systems. You already work with a coding agent. reprobe gives that agent the evidence and a way to prove its answer.
You run one command. reprobe gathers the evidence, then starts Claude Code or Codex in your repo with the case and a playbook, like npx t3 triage. Everything that must be exact is plain code, not a model's judgment: gathering, read-only access, redaction, citation checks and replays at old commits.
Rows, agent traces, logs and Sentry issues for that user and time window, from Postgres, Langfuse, LangSmith, Sentry, Railway, any log CLI or log files. Each item gets a stable id. Missing sources are listed, not guessed around.
npx reprobe "<complaint>" --since 6hWrites evidence.json and CASE.mdReads the case and the code at the deployed commit, then digs further through reprobe's read-only tools. Each answer becomes new evidence it can cite.
reprobe query <case> "SELECT …"Adds evidence with new idsThe smallest test of the invariant the bug broke, in your own test framework, filled with the real shapes from the evidence.
<case>/replay.jsonWrites a test file and replay.jsonEach run happens in a detached worktree. You want FAIL on the deployed commit and PASS on the fix.
reprobe verify <case> <deployed-sha> <fix-sha>FAIL, PASS or BROKEN; NOT-APPLICABLE if required files are missingThe agent writes <case>/diagnosis.json. reprobe drops any claim that cites nothing, or cites an id that isn't in the evidence, and renders the rest.
reprobe report <case>Reads diagnosis.json, writes report.mdRun these in your repo. The config stores env var names, never secret values.
cd your-repo npx reprobe init # finds your sources, writes .reprobe/config.json npx reprobe doctor # checks configured sources and tools npx reprobe "users can't save since this morning" --since 6h
An explanation can sound right and still be wrong. A test that fails on the commit your users ran and passes on the fix settles it. This is a real incident with the names taken out: the first fix shipped, and the bug stayed.
The code users ran. The bug reproduces.
Still fails, as expected.
Still fails. This is why users on the next build kept seeing the bug.
Passes. The real fix.
reprobe reads the same production your users hit. Its database path wraps each query in three read-only layers, and stops if the server doesn't confirm read-only mode.
BEGIN READ ONLY … ROLLBACKdefault_transaction_read_only=onanything else is refusedGive it a read-only database role as well. The guard can't tell whether a function in your schema has side effects.
Nothing. reprobe is MIT licensed and has no server. The investigation runs on the Claude Code or Codex you already use, so the only cost is your agent's usage.
reprobe reads your configured sources directly, with no reprobe backend. Evidence goes to the agent you choose, as it does when you paste logs into it today. Cases are written to ~/.reprobe/cases, outside your repo.
Every source is optional. Logs can come from any CLI that prints lines (fly, vercel, kubectl, docker) or from files. Without a database, reprobe still works from traces, logs and Sentry.
One TypeScript file that teaches reprobe your product: how to find the user a complaint is about, which rows matter, your known failure signatures, and how to build an old commit. Every hook is optional.
Claude Code and Codex start automatically. With neither installed, reprobe prints one line to paste into any coding agent.