abloh — The verification layer for testing AI-written code
ablohSign upOpen menu
The verification layer for testing AI-written code.<br>abloh stress-tests every PR to expose weak tests, missed behavior and hidden failure modes—so teams merge AI-written code on evidence, not assumptions.<br>Get started freeSee a sample report
One check follows every PR<br>abloh runs automatically in your CI and updates one GitHub check as the PR changes. It confirms a stable baseline, checks whether the diff executed, stress-tests changed code, reviews surviving faults and matches commits to approved tickets.<br>GitHub pull request · payments-api<br>PR #1842 · Harden card tokenisation<br>✓ Evidence: Complete✓ Gate: PassPolicy 4c0d…91af
✓Baseline tests3/3 baseline runs passed1m 12s<br>✓Diff coverage84/84 changed lines executed24s<br>✓Mutation testing176 code changes tested8m 42s<br>✓AI review14 undetected changes reviewed · Tier 118s<br>✓Ticket check5/6 commits linked · 4 approved tickets7s
993c2a1 → 1ab7c23↓ 5 findings fixed↑ 1 new3 still open
Then abloh scores your test suite against the diff<br>See what your suite caught, what survived, and which survivors AI review flags as likely gaps. A suggested test appears only after abloh proves it catches the planted fault without breaking the suite.<br>Diff coverageMutation testing<br>142 mutations evaluated<br>Mutation results
64.2% caught✕ Fail
Detected by tests 84Timed out 4Not detected 49Could not run 5<br>88 of 137 scoreable mutations were caught. 5 execution errors were excluded from the score.<br>142 changes classified in total.<br>AI reviewLikely: 18 gaps · 31 harmless<br>Verified test · ST-021<br>Reject a quote expiring exactly at settlement time<br>+await expect(settle({ expiresAt: settlementTime }))+ .rejects.toThrow("QUOTE_EXPIRED")+expect(ledger.post).not.toHaveBeenCalled()✓Current code✓Planted fault caught✓Full suite
Northstar Payments/ledger-core ▾<br>⌕ Search evidence⌘K<br>PS<br>Deep audit<br>ledger-core · full repository<br>6h 41m
2,148 mutations tested across 214 files. 1,982 detected by tests; triage discarded 143 as likely equivalent.<br>⚠ 23 real gaps<br>OverviewDiff coverageClassic mutationPatch revertRealistic mutantsInvarianceHistory
Mutations planted<br>2,148214 files
Detected by tests<br>92.3%1,982 of 2,148
Real gaps<br>23after triage
Verified fixes<br>9ready to apply
Four engines, one night<br>Engine detail →<br>CMClassic mutationPlants deliberate bugs and counts which tests notice✓ 1,982 of 2,148 detected<br>PRPatch revertRe-breaks every recent fix to prove a test still guards it⚠ 3 of 34 undetected<br>RMRealistic mutantsPlants the bugs real engineers write, not operator flips⚠ 2 not detected<br>INInvarianceHolds the properties that must never change⚠ 1 violated · rounding drift
What survived the night<br>Full report →<br>settlement/rounding.ts:214refund(0.01, qty=3) rounds to −0.02 and no test objects✓ Verified fix ready<br>ledger/retry.ts:87a timeout retry can post the same entry twice✓ Verified fix ready<br>fees/tiering.ts:41the top fee tier is unreachable — boundary never tested✓ Verified fix ready<br>ledger/export.ts:132CSV export drops the sign on zero-value reversals
Patterns<br>78.4% → 92.3% across six audits<br>53 closed · 35 arrived since March — ahead by 18<br>5 gaps have survived 3+ audits — all in settlement/<br>95% strength within two audits
Every line changed this month, checked for a test that executes it AND asserts on what it does.<br>Changed lines<br>1,84731 PRs
Covered<br>1,73894.1%
Never executed<br>1095.9%
settlement/rounding.ts9 / 22 changed lines covered41%<br>ledger/export.ts12 / 26 changed lines covered46%<br>ledger/retry.ts18 / 31 changed lines covered58%<br>webhooks/dedupe.ts24 / 41 changed lines covered59%<br>fees/tiering.ts12 / 19 changed lines covered63%<br>settlement/capture.ts33 / 48 changed lines covered69%<br>ledger/entry.ts51 / 66 changed lines covered77%<br>settlement/batch.ts87 / 102 changed lines covered85%
Proposed test · catches reversals exported without their sign<br>it("keeps the minus sign on zero-value reversals", () => {<br>expect(exportCsv(reversal(0)).row).toContain("-0.00");<br>});✓ Turns 419 executed-only lines into asserted ones
2,148 mutations planted across 214 files, operators weighted by the repository’s own bug history. What the suite misses is a bug it would ship.<br>Mutations tested<br>2,148214 files
Detected by tests<br>1,98292.3%
Not detected<br>166survivors
settlement/rounding.ts:214Math.round → Math.trunc — every refund shrinks by a cent✓ Fix ready<br>fees/tiering.ts:41>= → > — volume on the top boundary prices a tier low✓ Fix ready<br>ledger/export.ts:132sign flip — zero-value reversals export as creditsNeeds a decision<br>ledger/retry.ts:87counter +1 removed — a failed post retries forever✓ Fix ready<br>settlement/batch.ts:59loop bound −1 — the last row of every batch is skippedDetected once
Mutation results92.3% detected
Detected by tests 1,945 Timed out 37 Not detected 125 No test ran this 41<br>1,982 of 2,148 planted changes were detected · 41 had no test executing them at all
Proposed test · catches refunds rounding down a cent<br>it("charges the full refund,...