acme/checkout-servicefeat/checkout#2418failing: 416 / 4181m 42svitest · ci

Phase 2 · coming next

An AI agent on
every pull request.

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.

Start freenpm i @robit-one/reporter

Coverage 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

Your repo is the spec.

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.md

No folder yet? The agent still runs. Reviewers can promote useful test steps after each pull request, so the spec grows with the code.

InputsDiff + tests + coverage + .robit/
AgentAnalyze the pull request against the repository spec
Human decisionApprove the plan and choose what becomes permanent

One agent · six outputs

Everything a reviewer needs to move from a passing suite to an informed decision.

Failure explanations

Plain-language explanations tied to the diff and the exact test that failed.

Coverage gap list

Changed files ranked by risk, with links to the uncovered lines and functions.

Fix prompts

A scoped prompt for each gap, ready for Claude Code, Codex, or Cursor.

Manual test plan

A checklist built from the diff and the scenarios your team keeps in the repo.

Spec drift warnings

A clear flag when code changes invalidate a scenario in the repository spec.

Automation candidates

Manual checks with no matching end-to-end coverage, ordered by value.

Why now

AI writes code fast. Fast code still needs proof.

AI shipping speed
Testing speed
40–50%
Bugs from requirements defects

01

Plausible is not verified

AI-generated code has no inherent understanding of correctness. It predicts plausible code. Nobody has checked that it is safe.

02

Review catches style

Tests catch behaviour. You cannot review your way to confidence at five times the volume.

03

The cost excuse died

“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

From diff to a human decision.

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

09:14RUN

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.

Open

Handle partial refunds on shipped orders

#2418 · feat/checkout → main · +214−38

09:16RUN

Your suite runs where it always hasShipping today

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',
      }),
    ],
  },
})
09:16INGEST

Two tests fail. You already know which, and why.Shipping today

Named files. Named durations. Mapped to the line that moved. Not “something went wrong”.

robit commented on #241809:16

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.

09:17INGEST

The project average was hiding itShipping today

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

FilterNew project
Projects · healthy
2
Projects · failing
1
Suites · passing
6
Suites · failing
1
Suites · flaky
1
Coverage · org rollup
72%
72%
Lines
64%
Branches
88%
Functions
74%
Statements
Project
Suites
Coverage
Branch @ sha
Activity
checkout-service
checkout-service
unitintegratione2e
91%
main@a3f19c2
6 min ago
payments-api
payments-api
unit·3contract
68%
main@9d41e0b
12 min ago
!
ledger-worker
ledger-worker
unite2e
47%
main@5c8b104
3 hours ago
·
notifications-edge
notifications-edge
no suites
main@—
never

Robit signal

watching 4 repos

AI insights available in a future release.

quarantineopen in suite →

Runner mix

vitest4
playwright2
deno1
unknown0

Projects · run history

last 50 runs per project · oldest → newest · coloured by pass / fail / skip / todo

checkout-service
main
passed
unitVintegrationVe2ePW
91%Coverage
91%
Lines
84%
Branches
96%
Functions
93%
Statements
1m 42sDuration
Total418
Pass414
Fail0
Skip4
Todo0
Last run 6 min ago
notifications-edge
main
no runs
○ no suites
No coverage data
Duration
Total
Pass
Fail
Skip
Todo
Never run
09:18SURFACE

Three files. Ranked. Linked to the lines.Shipping next

Two of these touch steps your team marked core — flows that must never break, written down once in .robit/. Those rank first, automatically.

  • services/refund.ts:88–104core42%
  • services/capture.ts:12–40core67%
  • utils/currency.ts:3–99%

Two of these back steps your team marked core — flows that must never break, written down once in .robit/. Those rank first, automatically.

09:18SURFACE

Each gap arrives with the prompt that closes itShipping next

Robit speaks MCP, so the gap and the fix live in the same window as the code. Copy, paste, run. The meter moves.

Connect your agent

// .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.

Every gap ships with the prompt that closes it

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.

09:22PLAN

Coverage says it ran. It does not say it was right.Shipping next

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.

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.

Checkout — refund a partially shipped order

  • Core. Refund total never exceeds the captured amount.
  • Core. Partial refund leaves the order in shipped, not closed.
  • Refund receipt email renders the correct currency symbol.

Steps marked core feed gap analysis directly. A core flow with no automated test is a priority gap, not a line item.

09:41SIGN OFF

A person signs it offShipping next

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.

09:44LEARN

#2418 merges, and the next one starts smarter

That is the whole product. Not a dashboard — a ratchet. Every pull request leaves the repository knowing something it did not know before.

robit · merged09:44

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

One import. Nothing to host.

No new test runner

Keep Vitest, Playwright, Jest, Deno. Keep your existing tests.

No infra to manage

No second runner or webhook to host. Results flow out of the pipeline you already have.

Project-scoped tokens

Shown once, revocable any time. One per project, not one per org.

Your CI, unchanged

GitHub Actions, GitLab CI, Bitbucket Pipelines, or anything that sets standard CI variables.

Questions

Before you install it

Do I have to rewrite my tests?

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.

What does Robit see?

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.

Does 100% coverage actually mean anything?

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.

Can I use more than one runner?

Yes. Each suite is tracked independently with its own runner, history and coverage. A flaky e2e suite never masks a unit coverage gap.

Do I need an Anthropic API key?

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.

Is the AI going to commit to my repo?

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.

Point it at one repo. Watch the next pull request.

Free to try. No infra to run. Works in your CI today.

Start freenpm i @robit-one/reporter