Concepts
Proof of done
LoopCode does not call a change finished until it has shown it works. How evidence, acceptance criteria and the project's checks decide when a turn may end — and how to configure them.
Why
An agent saying "done" proves nothing. The common failure is a change that looks right, was never run, and breaks something the model did not check. LoopCode makes the evidence the deciding factor, not the model's confidence.
How it works
Evidence. Every check the agent runs in a turn — a test run, a typecheck, a lint, a build, a browser run, a screenshot, a log it read, a command's output — is kept as evidence (ev_1, ev_2, …) and marked passed or failed from the tool's own result, never from what the model says about it.
Freshness. Evidence is fresh until the code changes again. An edit makes every earlier check stale.
Acceptance criteria. Before a turn that changed code can end, the agent restates what you asked for as checkable statements, and cites fresh, passing evidence for each one.
The project's checks. The proof is accepted only when the checks this project has — its tests, typecheck and lint, and a browser check when the UI changed — passed after the last edit.
Honesty about limits. Something that genuinely cannot be checked on this machine is marked unverifiable, or the check waived, with the reason — and the final report says so plainly.
Until the proof holds, the turn does not end: the agent goes back to work. The report you get at the end tells you what was verified and how.
Which checks a project has
LoopCode detects them:
| Check | Detected from |
|---|---|
| Tests | The project's test runner and scripts |
| Typecheck | A typecheck, type-check, check-types, types or tsc script; tsconfig.json with TypeScript installed; mypy or pyright configuration; Cargo.toml (cargo check); go.mod (go vet ./...) |
| Lint | A lint script; Ruff configuration; golangci-lint configuration |
| Browser | A front-end framework with a dev, start, preview or serve script, or a plain index.html site |
Scripts run with the project's package manager (pnpm, yarn, bun or npm, from the lockfile).
Configure it
Override what was detected in settings:
{
"proof": {
"test": "pnpm test -- --run",
"typecheck": "pnpm tsc --noEmit",
"lint": false,
"browser": true
}
}| Field | Value |
|---|---|
enabled | false turns proof off for this project |
test, typecheck, lint | A command replaces the detected one; false drops that check |
browser | false drops the browser check; true requires it |
Tips
- Make the checks fast and reliable. Proof is only as good as the tests behind it.
- Tell LoopCode how to run a single test in
LOOPCODE.md, so it can iterate quickly before the full run./initwrites that for you. - For checks that need something this machine lacks — a device, production data, a paid API — expect them to be reported as unverifiable, and run them yourself.