- ✓python19s
- ✕lab-ui6s
- ✓actions/checkoutok
- ✓actions/setup-nodeok
- ✕Run npm ciexit 1
- −npm run lintskipped
- −npm run buildskipped
quench is a CI incident-triage agent. It ingests a failed GitHub Actions run, investigates with read-only tools, diagnoses the root cause with cited evidence, and drafts one recommended action. Every write waits for a human yes.
job concluded 'failure': lab-ui
failed step name: Run npm ci
.github:106 exit code 1
commit 268a1fd
2 runs: failure/failure
proposed write: open_fix_pr · draft-only · dry-run
a rejected approval blocks the write — a dedicated eval proves it
Rendered from the recorded triage of zaakirio/crucible run 28951398431, one of the 12 real CI-failure fixtures. Reference run: dry-run, no writes.
every triage lands in one of ten failure classes — this run:
".github:106 Process completed with exit code 1."
The evals assert the trajectory, not just the final text: did it fetch evidence before proposing an action, classify the failure correctly, pause for approval before any write, stay within budget, and cite real log evidence.
A failed workflow run comes in as repo plus run id.
Fetch the run, its jobs and failed steps, the failure annotations, the failing commit diff, and recent runs of the same workflow to gauge flakiness. Read tools have no side effects.
A cheap claude-haiku-4-5 first pass, then a claude-sonnet-5 investigation that records a structured diagnosis: failure_class, root_cause, confidence, cited evidence, flakiness_assessment, recommended_action.
Re-run failed jobs, post a diagnostic comment, or open a fix PR. Each is a tool marked needsApproval, defaults to dry-run, and renders an approval card in the UI that gates continuation. A rejected approval blocks the write, and a dedicated eval proves it.
A hard cap on steps, tokens, and dollars, summed across every model call, with an explicit stop.
{
"failure_class": "dependency", // haiku first pass: 85% confidence
"root_cause": "The 'lab-ui' job failed at step 'Run npm ci',
which points to a dependency failure.",
"evidence": [
{ "kind": "job", "quote": "job concluded 'failure': lab-ui" },
{ "kind": "step", "quote": "failed step name: Run npm ci" },
{ "kind": "annotation", "quote": ".github:106 Process completed with exit code 1." },
{ "kind": "commit", "quote": "commit 268a1fd" },
{ "kind": "recent_runs","quote": "2 recent same-workflow runs (failure/failure)" }
],
"recommended_action": "open_fix_pr" // WRITE tool -> waits for approval
}
Screenshots of the running app, not comps. Left rail: the incidents. Center: the streamed agent trajectory. Right: the structured diagnosis and a live cost meter that sums real dollars from token usage across both models.
Set a provider key for live diagnosis and a GITHUB_TOKEN for live log fetching; a deterministic reference mode drives the same tool loop against recorded failures in CI. The full matrix (live models, live GitHub, live writes) is in the README.
npm install npm test # 30 unit tests npm run eval # 14 trajectory evals, 78 assertions npm run build npm run dev # http://localhost:3000