Failure explanations
Plain-language explanations tied to the diff and the exact test that failed.
acme/checkout-servicefeat/checkout#2418failing: 416 / 4181m 42svitest · ci
Phase 2 · coming next
Robit reads the diff, test results, coverage, and the plain Markdown scenarios in.robit/. It explains failures, ranks gaps, writes the test plan, and gives reviewers the final call on what ships.
npm i @robit-one/reporterCoverage reporting is live today. The pull request agent comes next.
90%
line coverage
1,000 lines unverified
Coverage is the first signal
VitestPlaywrightJestDenoOne import. No new runner or infrastructure to host.
Phase 2 · coming next
Add plain Markdown scenarios to .robit/. On every pull request, the agent reads those scenarios beside the diff, test results, and coverage. It returns a review plan grounded in what your team says the product must do.
Committed beside the code
.robit/
robit.md # agent guide + scope
specs/
Authentication.md # your scenarios
Checkout.md
Refunds.mdNo folder yet? The agent still runs. Reviewers can promote useful test steps after each pull request, so the spec grows with the code.
One agent · six outputs
Everything a reviewer needs to move from a passing suite to an informed decision.
Plain-language explanations tied to the diff and the exact test that failed.
Changed files ranked by risk, with links to the uncovered lines and functions.
A scoped prompt for each gap, ready for Claude Code, Codex, or Cursor.
A checklist built from the diff and the scenarios your team keeps in the repo.
A clear flag when code changes invalidate a scenario in the repository spec.
Manual checks with no matching end-to-end coverage, ordered by value.
Why now
01
AI-generated code has no inherent understanding of correctness. It predicts plausible code. Nobody has checked that it is safe.
02
Tests catch behaviour. You cannot review your way to confidence at five times the volume.
03
“Too expensive to reach 100%” assumed a human wrote every test. AI writes tests as fast as it writes code.
The standard
If you ain't at 100%, you don't know what your code does. 100% isn't a quality metric — it's a forcing function.
Every untested path becomes an explicit decision instead of an oversight. If code is too complex to test, that complexity is the bug. And the cost argument is gone: AI writes tests as fast as it writes code.
90% is good enough
10% of a 10k-line service is 1,000 lines running in production with no verification. Name which 1,000.
Tests slow us down
Incident response slows you down. Tests run in seconds. Production bugs run for days.
One pull request · six agent outputs
Follow #2418 from open to merge. The reporter and dashboard markedShipping today supply the evidence. The agent work marked Shipping next turns that evidence into a gap report, fix prompts, a manual plan, and an updated repository spec.
—
no results yet
waiting on CI
RUN
A pull request opens
Three files in the refund path. 214 lines added, 38 removed. Nothing about it looks dangerous, and that is the problem — this is exactly where a team stops looking.
One reporter, in the config file you already maintain. No second runner, sidecar process or webhook to host. Branch, commit and environment come out of the CI variables that are already set.
// vitest.config.ts
import { defineConfig } from 'vitest/config'
import { RobitReporter } from '@robit-one/reporter/vitest'
export default defineConfig({
test: {
reporters: [
'default',
new RobitReporter({
token: process.env.ROBIT_TOKEN,
suite: 'unit',
}),
],
},
})// playwright.config.ts
import { defineConfig } from '@playwright/test'
export default defineConfig({
reporter: [
['list'],
['@robit-one/reporter/playwright', {
token: process.env.ROBIT_TOKEN,
suite: 'e2e',
}],
],
})// jest.config.js
module.exports = {
reporters: [
'default',
['@robit-one/reporter/jest', {
token: process.env.ROBIT_TOKEN,
suite: 'unit',
}],
],
}# wraps deno test, collects coverage, posts the run
deno run -A jsr:@robit-one/reporter/run --suite=unit -- src/
# or read the token from the CI environment
ROBIT_TOKEN=rbt_xxx deno run -A jsr:@robit-one/reporter/run --suite=unit -- src/Named files. Named durations. Mapped to the line that moved. Not “something went wrong”.
416 / 418 · 1m 42s · changed-file coverage 42%
checkout/refund.test.ts › partial refund leaves order shipped
checkout/refund.test.ts › refund total never exceeds capture
Both assert on order.status after a partial capture. services/refund.ts:88 now returns closed where it previously returned shipped.
Every suite, every branch, tracked separately — so a healthy unit suite can never paper over an e2e one. The number that matters is the one on the lines this PR touched.
Nyx Commerce
4 projects · 7 suites
watching 4 repos
AI insights available in a future release.
last 50 runs per project · oldest → newest · coloured by pass / fail / skip / todo
Two of these touch steps your team marked core — flows that must never break, written down once in .robit/. Those rank first, automatically.
Two of these back steps your team marked core — flows that must never break, written down once in .robit/. Those rank first, automatically.
Robit speaks MCP, so the gap and the fix live in the same window as the code. Copy, paste, run. The meter moves.
// .mcp.json { "mcpServers": { "robit": { "type": "http", "url": "https://mcp.robit.one/mcp" } } }
Claude Code and Codex. Project-scoped bearer token. Robit never reads or writes your disk — your client owns the changes.
Write tests for the uncovered branches inservices/refund.ts:88-104 — the partial-refund path whencapturedAmount < orderTotal. Cover the currency-mismatch throw. Match the style of refund.test.ts.
Copy, paste, run. The meter moves.
So Robit writes the checklist for what a person still has to click — built from the diff and the scenarios your team wrote once, in plain Markdown, committed beside the code.
.robit/ robit.md # agent guide + scope specs/ Checkout/spec.md # your scenarios Refunds/spec.md personas/ fleet-manager.md
Reviewed in pull requests like any other file. It travels with the code, so the knowledge outlives whoever wrote it.
Steps marked core feed gap analysis directly. A core flow with no automated test is a priority gap, not a line item.
Reviewers step the plan, marking pass or fail. Steps worth keeping get promoted into the spec.
Robit never auto-commits spec changes.
Human promotion is deliberate. You decide what counts as a permanent test scenario. AI proposes; the team decides — and when a step is promoted, it is committed to the branch, credited to the person who approved it.
That is the whole product. Not a dashboard — a ratchet. Every pull request leaves the repository knowing something it did not know before.
421 / 421 · 1m 51s · project coverage +2.6%
.robit/specs/Checkout/spec.md +1 core step
Promoted by @dana — “Partial refund leaves the order in shipped, not closed.”
What it costs you to try
Keep Vitest, Playwright, Jest, Deno. Keep your existing tests.
No second runner or webhook to host. Results flow out of the pipeline you already have.
Shown once, revocable any time. One per project, not one per org.
GitHub Actions, GitLab CI, Bitbucket Pipelines, or anything that sets standard CI variables.
Questions
No. Robit reads the results your existing suites already produce. One import in your config, one line of options. If you remove it, your tests run exactly as they did before.
Test names, pass/fail/skip counts, durations, and the coverage summary your runner emits. Branch, commit and environment come from CI variables. Source code is not uploaded by the reporter.
On its own, no — it means every line ran. That is the point of pairing it with .robit/ specs: coverage proves the code executed, the specs say which behaviour a human still has to confirm.
Yes. Each suite is tracked independently with its own runner, history and coverage. A flaky e2e suite never masks a unit coverage gap.
Not for interactive use. The model already running in Claude Code or Codex does the analysis and sends it to Robit, which validates the schema and evidence grounding.
Only when a human promotes a step, and the commit is credited to them. Nothing is written to your repository without a person approving it.
Free to try. No infra to run. Works in your CI today.
npm i @robit-one/reporter