{"slug": "paired-with-greptile-no-bugs", "title": "Paired with Greptile = No Bugs", "summary": "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.", "body_md": "# Ship more code. Not more bugs.\n\nAbloh helps engineering teams ship more AI-written code without sending more bugs to production.\n\n## More code. *More places to break.*\n\nFaulty logic, edge cases, and missing requirements can still reach production despite code review and high test coverage.\n\n## What abloh does *on every pull request.*\n\nsettlement/capture.ts\n\n30\n\n  `const REASONS = {`\n31\n\n    `inactive: 'Capture is not refundable',`\n32\n\n    `unsettled: 'Order is not settled',`\n33\n\n    `invalidAmount: 'Capture amount is invalid',`\n34\n\n  `} as const;`\n35\n\n 36\n\n  `function normalizeAmount(value: number): number {`\n37\n\n    `return roundMinorUnits(Math.max(0, value));`\n37\n\n`+   return roundMinorUnits(Math.max(1, value));` mechanical: off-by-one\n38\n\n  `}`\n39\n\n 40\n\n  `function capturedAmountIsValid(capture: Capture, order: Order) {`\n41\n\n    `const captured = normalizeAmount(capture.amount);`\n42\n\n    `return captured > 0 && captured <= order.total;`\n42\n\n`+   return captured >= 0 && captured <= order.total;` mechanical: operator flip\n43\n\n  `}`\n44\n\n 45\n\n  `function rejected(reason: string, capture: Capture) {`\n46\n\n    `return { approved: false, reason, refundedAmount: 0 };`\n47\n\n  `}`\n48\n\n 49\n\n  `export function refundableAmount(capture: Capture, order: Order) {`\n50\n\n    `const refundable = capture.amount;`\n50\n\n`+   const refundable = order.total;` AI: semantic swap, same-typed values\n51\n\n    `return normalizeAmount(refundable);`\n52\n\n  `}`\n53\n\n 54\n\n  `export function canRefund(capture: Capture, order: Order) {`\n55\n\n    `if (!isRefundable(capture)) {`\n56\n\n      `return rejected(REASONS.inactive, capture);`\n56\n\n`+     return rejected(REASONS.wrongOrder, capture);` AI: error-path rot\n57\n\n    `}`\n58\n\n    `return approved(refundableAmount(capture, order));`\n59\n\n  `}`\n## Run it locally, on your own model. *Forever.*\n\n`export MODEL_API_KEY=<your provider's key>`` npm i -g @abloh/cli``abloh init`` abloh run --base main`\n[Read the local run docs](/docs#local)\n\n## Security first design.\n\n- What source code does abloh store?\n- Only the source lines modified during mutation testing. No other customer source code is retained.\n- Where is my code executed?\n- Your code and test suite execute only on your GitHub Actions runner. Abloh never clones your repository onto its infrastructure.\n- What access does abloh get?\n- Only `contents: read` and`id-token: write` , with no repository write access.\n- What secret do I store?\n- One, an Actions secret called `ABLOH_MODEL_TOKEN` . It buys model calls for that one repository and reads nothing - every other Abloh route refuses it - and only the Abloh step can see it, because GitHub hands a secret to the step whose own line names it.\n- Can abloh modify my repository?\n- Mutations are confined to the runner's working tree. Abloh cannot push commits, branches, or tags back to GitHub.\n- How is generated code isolated?\n- Model-generated code executes in an unprivileged container with networking disabled and the repository mounted read-only.\n\n[What leaves your CI](/docs#ci-data)", "url": "https://wpnews.pro/news/paired-with-greptile-no-bugs", "canonical_source": "https://abloh.dev/", "published_at": "2026-09-12 13:42:05+00:00", "updated_at": "2026-09-12 14:17:58.403534+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "ai-products"], "entities": ["Abloh", "Greptile", "GitHub Actions", "ABLOH_MODEL_TOKEN"], "alternates": {"html": "https://wpnews.pro/news/paired-with-greptile-no-bugs", "markdown": "https://wpnews.pro/news/paired-with-greptile-no-bugs.md", "text": "https://wpnews.pro/news/paired-with-greptile-no-bugs.txt", "jsonld": "https://wpnews.pro/news/paired-with-greptile-no-bugs.jsonld"}}