sluglist

Use case

An autonomous QA loop: test, fix, re-test, until green

Both ends of the loop can be agents: one walks the app in a browser and writes down what it saw, another reads those artifacts and fixes the code. What makes it more than a demo is that neither of them is trusted — every verdict carries evidence, and a third command decides whether another round is worth running.

ForA repo where an agent can run the app in a browser and edit the code.

01

Evidence, not claims

The QA agent may not record a fail without a screenshot, or a pass without performing the check. An item it could not reach is reported as not tested — the honest answer an eager agent would otherwise invent.

02

The loop stops for the right reasons

npx sluglist status reads the artifacts and returns green, continue, stalled or blocked. An item that already survived a fix pass goes to a human instead of being ground on for another round.

03

You get an audit trail, not a “done”

Every round leaves a session folder and a single-file HTML report — verdicts, observed facts, screenshots — so you can check the work instead of trusting the summary.

Terminal recording of the loop: after round one sluglist status says continue with two fixed items to re-test, after the re-test round it says green, and sluglist report renders the session to a single HTML file

The recording above is the real CLI on a real session pair — round 1 with two evidence-backed fails and a fix pass, the re-test round, and the verdict flipping to green. The rendered result: the live example report.

Set the project up

npx sluglist init --agents-md

That installs the four bundled skills into .claude/skills/, creates .sluglist/checklists/, writes the .gitignore rules, and drops a .sluglist/PROJECT.md to fill in. Fill it in — it is where the loop learns your base branch, how to start the app, how to sign in (referenced, never stored), the actions it must never complete, and how far it may go on its own:

max rounds: 3
fix without asking: no
commits: leave the changes uncommitted, one summary at the end

Ask for the whole thing

QA this branch and fix everything until it passes.

The sluglist-loop skill takes it from there:

  1. Checklist — the branch diff becomes a client-voice list at .sluglist/checklists/.
  2. QA run — a browser walks every item and writes verdicts and issues through the headless writer, sluglist/node.
  3. Reportnpx sluglist report renders the round as one HTML file.
  4. Statusnpx sluglist status --json says what is still failing and whether it is worth another round.
  5. Fix — the failing issues are patched; each outcome is recorded in fixes.yaml.
  6. Re-test — a checklist of only the fixed items, ids preserved and provenance attached, then back to step 4.

See the output for yourself: a live example report — one self-contained HTML file from a real QA round on a demo app: evidence-backed passes with the observed facts, a fail linked to its issue, an item honestly reported as not tested, and the fix pass answering in fixes.yaml.

The decision point

npx sluglist status
release-2026-08 · branch · 3 items
  1  session-2026-08-15-tw1w  1 pass · 1 fail · 1 not tested  ·  1 fixed
  2  session-2026-08-15-jtyf  0 pass · 1 fail · 0 not tested  ·  no fix pass yet

  still failing (1)
    csv-columns — for the next fix pass · failed in 2 rounds · issue 01

verdict: stalled — 1 item failed in 2 or more rounds — a fix pass has already been tried

It is derived entirely from the artifacts — the verdicts in session.yaml, the resolutions in fixes.yaml, and the retest_of chain that links round 2 back to round 1. That matters: the one thing an agent should not be asked is whether its own work is done.

Verdict The loop
green stops — hand over the report
continue runs another round, if the budget allows
stalled stops — a human takes the item that keeps coming back
blocked stops — wontfix and needs_info are the owner's calls

The guarantees that make it usable

  • No fail without a screenshot; no pass without performing the check. An unreachable item is not tested, with the reason.
  • A screenshot proves the screen looked right, never that the action worked. For downloads, submissions and background jobs the verdict carries the observed fact — the file name and size, the toast text, the row count.
  • The loop may not manufacture green. It cannot edit, narrow or delete a check so it stops failing, and it cannot write wontfix to end a round; those are proposals surfaced to you.
  • Hard limits are enforced. Live payments, real emails, external submissions: the run stops at the last safe step and records not tested with the reason.

Drive it yourself

The skills are convenience, not dependency — the writer is a public API:

import { createSession, LocalConnector } from "sluglist/node";

const session = await createSession({
  connectors: [new LocalConnector({ dir: ".sluglist" })],
  project: "acme",
  baseUrl: "http://localhost:3000",
  checklist: ".sluglist/checklists/release-2026-08.json",
  reporter: { name: "qa-agent", kind: "agent" },
});

await session.setVerdict("csv-columns", "pass", {
  evidence: {
    screenshots: [png],
    note: "Exported reports-2026-08.csv — 4.1 KB, 57 rows, all 9 columns present",
  },
});

// An item it could not check: no verdict, and the reason with it.
await session.setVerdict("email-receipt", null, {
  evidence: { note: "could not test: no mailbox reachable from this environment" },
});

Any language that can write files can produce the same artifacts: the format is documented field by field.

Frequently asked questions

Which agent runs this?

Any that can read files, run a browser and edit code. Claude Code is supported out of the box through the four bundled skills; everything they do is a documented CLI command or a public API on sluglist/node.

What stops it looping forever?

Two things. sluglist status returns stalled as soon as an item has failed in two rounds — a fix pass already tried and did not work — and blocked when everything left is wontfix or needs_info. On top of that the skill has a round ceiling, three by default, set in PROJECT.md.

Can an agent just mark everything as passing?

It can lie the way any agent can, which is why the protocol makes lying visible: a pass in evidence mode all carries the screenshot and the observed fact, the report inlines both, and the skill's hard prohibitions forbid editing a check or writing wontfix to reach green. You audit artifacts, not a chat summary.

Do humans and agents produce different artifacts?

No. The headless writer emits byte-identical structure to the browser widget, with reporter.kind recording which one it was. A session a client produced and a session an agent produced are read by the same tools.

The other ways it is used