Skip to content
LoopCodeDocs

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:

CheckDetected from
TestsThe project's test runner and scripts
TypecheckA 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 ./...)
LintA lint script; Ruff configuration; golangci-lint configuration
BrowserA 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:

.loopcode/settings.json
{
  "proof": {
    "test": "pnpm test -- --run",
    "typecheck": "pnpm tsc --noEmit",
    "lint": false,
    "browser": true
  }
}
FieldValue
enabledfalse turns proof off for this project
test, typecheck, lintA command replaces the detected one; false drops that check
browserfalse 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. /init writes 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.