How it works

We plant a bug, then watch your tests.

A passing test suite proves the tests ran. It does not prove they would object to wrong behaviour. abloh settles that by changing your code on purpose and checking whether anything fails.

Step one

One check, on the pull request you already opened

abloh runs in your existing CI and keeps a single GitHub check up to date as the branch moves. It confirms the suite is stable before it changes anything, checks whether your diff actually executed, plants faults in the changed lines, reviews the ones that survived, and reconciles the commits against approved tickets.

Nothing here needs a new pipeline, a new test runner, or a change to how you work.

GitHub pull request
PR #1842 · Harden card tokenisation
✓ Gate: Pass
Baseline tests1m 12s
Diff coverage24s
Mutation testing8m 42s
AI review18s
Ticket check7s
↓ 5 findings fixed↑ 1 new3 still open

Step two

A score for the suite, measured against your diff

Every planted fault gets a verdict: a test objected to it, or nothing did. Faults that could not be run at all are left out of the score rather than counted as caught, so a broken run never flatters the result.

Faults nothing noticed go to AI review, which separates real gaps from changes that cannot alter behaviour. A suggested test appears only after abloh has proved that it catches the planted fault and that the rest of the suite still passes.

Diff coverageMutation testing
137 mutations scored
Mutation results
64.2% caught✕ Fail
Caught 88Not caught 49
137 mutations scored in total.
AI reviewLikely: 18 gaps · 31 harmless
Verified test
Reject a quote expiring exactly at settlement time
await expect(settle({ expiresAt: settlementTime }))  .rejects.toThrow("QUOTE_EXPIRED")expect(ledger.post).not.toHaveBeenCalled()

What the morning report actually holds.

One panel per engine, each with what it planted, what your tests missed, and the test that closes the gap. The tabs are clickable.

Northstar Payments/ledger-core
Search evidence⌘K
PS
Deep audit

ledger-core · full repository

6h 41m
2,148 mutations tested across 214 files. 1,982 detected by tests; triage discarded 143 as likely equivalent.
⚠ 23 real gaps
OverviewDiff coverageClassic mutationPatch revertRealistic mutantsInvarianceHistory
Mutations planted
2,148214 files
Detected by tests
92.3%1,982 of 2,148
Real gaps
23after triage
Verified fixes
9ready to apply

Four engines, one night

Engine detail →
Classic mutationPlants deliberate bugs and counts which tests notice✓ 1,982 of 2,148 detected
Patch revertRe-breaks every recent fix to prove a test still guards it⚠ 3 of 34 undetected
Realistic mutantsPlants the bugs real engineers write, not operator flips⚠ 2 not detected
InvarianceHolds the properties that must never change⚠ 1 violated · rounding drift

What survived the night

Full report →
settlement/rounding.ts:214refund(0.01, qty=3) rounds to −0.02 and no test objects✓ Verified fix ready
ledger/retry.ts:87a timeout retry can post the same entry twice✓ Verified fix ready
fees/tiering.ts:41the top fee tier is unreachable — boundary never tested✓ Verified fix ready
ledger/export.ts:132CSV export drops the sign on zero-value reversals

See it on your own code.

One repository is enough to find out what your suite would miss.

Try now