Paired with Greptile = No Bugs Abloh launched a pull request tool that runs mutation testing on AI-written code to catch bugs before production, positioning itself alongside the code review tool Greptile. The company says its CLI runs locally on a user's own model via `abloh run --base main`, executes code only on the customer's GitHub Actions runner, and requires just one Actions secret, `ABLOH_MODEL_TOKEN`, with `contents: read` and `id-token: write` access and no repository write access. Abloh stores only the source lines modified during mutation testing and confines mutations to the runner's working tree, so it cannot push commits, branches, or tags back to GitHub. Ship more code. Not more bugs. Abloh helps engineering teams ship more AI-written code without sending more bugs to production. More code. More places to break. Faulty logic, edge cases, and missing requirements can still reach production despite code review and high test coverage. What abloh does on every pull request. settlement/capture.ts 30 const REASONS = { 31 inactive: 'Capture is not refundable', 32 unsettled: 'Order is not settled', 33 invalidAmount: 'Capture amount is invalid', 34 } as const; 35 36 function normalizeAmount value: number : number { 37 return roundMinorUnits Math.max 0, value ; 37 + return roundMinorUnits Math.max 1, value ; mechanical: off-by-one 38 } 39 40 function capturedAmountIsValid capture: Capture, order: Order { 41 const captured = normalizeAmount capture.amount ; 42 return captured 0 && captured <= order.total; 42 + return captured = 0 && captured <= order.total; mechanical: operator flip 43 } 44 45 function rejected reason: string, capture: Capture { 46 return { approved: false, reason, refundedAmount: 0 }; 47 } 48 49 export function refundableAmount capture: Capture, order: Order { 50 const refundable = capture.amount; 50 + const refundable = order.total; AI: semantic swap, same-typed values 51 return normalizeAmount refundable ; 52 } 53 54 export function canRefund capture: Capture, order: Order { 55 if isRefundable capture { 56 return rejected REASONS.inactive, capture ; 56 + return rejected REASONS.wrongOrder, capture ; AI: error-path rot 57 } 58 return approved refundableAmount capture, order ; 59 } Run it locally, on your own model. Forever. export MODEL API KEY=