01 · Define
Evidence-backed delivery for AI-built software
“Done” isn’t the deliverable.
Every AI reviewer reads the diff — the lines that changed. ThruLine reads what the agent said — and checks it against what actually ran, on the exact version (the commit) you are about to approve.
Install · macOS and Linux
curl -fsSL https://thrulinehq.com/install.sh | sh~/.local/bin/thruline uiopens HQ in your browser. In a new Terminal window, thruline ui works too.
v0.2.0 · checks SHA-256 before installing · installs to ~/.local/bin
The agent says the double refund is fixed and all 214 tests pass. ThruLine shows the refund code changed after those tests ran. Demo record.
- What the agent said, word for word, from its own session log.
- Where proof stops: payments/refunds.py changed after the run.
- One thing to do, beside the verdict: run the same check on this version.
- Every Change in the project, sorted by whose turn it is.
The chain · demo record
Follow the claim.
One sentence the agent wrote, and six plain questions asked of it. Each answer is a line from the record — the session log your agent already writes on your machine — with the step it came from.
Claude Code said “Checkout total fixed.” “Tests pass.” · step 52 · demo record
-
① Said
What did the agent claim?
"Tests pass." Claude Code · 16:03 step 52 -
② Rests on
What is that claim based on?
4 passed, 0 failed step 46 cited by the agent -
③ Ran on
Which version did that actually run on?
version 9f2ad3e 1 version older -
④ Since
Did anything it depends on change after it?
checkout/api.py changed · step 56 after the run -
⑤ Re-checked
Has anything checked it since?
nothing on e71c5b0 with checkout/api.py in scope -
⑥ So
Not proven · version e71c5b0So what do we actually know?
the claim may be entirely true.
What counts as done · accepted
The re-check tests these three statements on e71c5b0. Each says what counts as done. None of them is a verdict.
Proof stops here
Nothing on e71c5b0 has run with checkout/api.py in scope.
Looked at: 2 finished runs (step 26 on 4b19a0c, step 46 on 9f2ad3e) and step 60, which has no result yet.
pytest -q tests/test_totals.py checkout/on e71c5b0 · asks once for this project
This page replays the demo record. Nothing runs in your browser.
They review the diff.
ThruLine reviews the agent’s claim against the record.
A diff shows which lines changed. The record shows what the agent actually ran, in what order, on which version — and so whether its “done” still holds.
One Change · six stages
Define, prepare, build, verify, review, approve.
A Change is one feature, fix or refactor you are asked to accept. It can span several sessions. Each stage answers one plain question. Under each is the screen that answers it, rebuilt in the product’s own words.
02 · Prepare
What exactly will be examined?
03 · Build
What changed?
04 · Verify
What happened when we checked it?
05 · Review
What did review find, and was it addressed?
06 · Approve
What exactly am I accepting?
Specimens
Where the proof stopped.
Each specimen is one claim, its six questions, and the exact point where the record stops backing it.
Recorded on ThruLine’s checkout-web demo record. No customer data. [swap in a corpus chain before launch]
proof stops at ② rests on
Ran, checked nothing
“Ran, checked nothing. This is not a pass.” A run that exits 0 — the code for success — having checked nothing.
proof stops at ③ ran on
The run was one version older
The tests passed — on 9f2ad3e, one version (one commit) before the one you are approving.
proof stops at ④ since
A file changed after the run
checkout/api.py changed at step 56 (16:04), after the run and after the claim.
The field · fetched 25 Sep 2026
What the field does, and what we do
Every reviewer here reads the diff at a commit, and some run code in their own sandbox (CodeRabbit Simplify, Greptile TREX, Cursor cloud agents). Copilot’s session log shows its agent’s work as a transcript. None joins the coding agent’s claim to the runs it made, in order against its edits, with exit codes, on the version you are about to accept.
Each row is summarised from the source it names, fetched on 25 Sep 2026. Plans change; check the source before relying on a price.
The receipt
Deterministic. Tamper-evident. Local. Unmetered.
A check ThruLine runs can end in a receipt — a signed record of exactly what ran. Four things hold for all of it.
- Deterministic
- The same record gives the same answer, every time. No model decides a verdict.
- Tamper-evident
- Any change to the record shows. It is hash-chained: each entry carries a fingerprint of the one before, so a changed byte breaks the chain.
- Local
- The record, the runs and the receipts stay on your disk. The core engine makes no network calls.
- Unmetered
- No meter: you are not charged per review or per run. Checks run on your machine, and no model call sits behind a verdict.
Here is a real one. The outside is a DSSE envelope — a standard wrapper that carries a signature. Inside is an in-toto statement — a standard format for an attestation, a signed statement of what was done to which code.
Check it yourself, offline
thruline verify-receipt receipt.json --key signing.pub --offline --json
“ThruLineHQ feels like the missing piece in the era of AI assisted coding.”
Pricing
A licence unlocks one thing: approving a version.
Everything else is free: recording, every read, re-checks, withdrawing an approval, exporting your own records.
Pro
$15 a month
or $150 a year · one developer
Does ThruLine use an LLM (a large language model) to decide whether my code is correct?
No. The verdict path is deterministic — the same record always gives the same answer, from recorded runs you can re-run. No model decides. A local model can narrate findings in plain English after the verdict, and that is off by default.
How a verdict is reachedWhat leaves my machine?
By default, nothing. ThruLine is local-first: the record, the runs and the receipts stay on your disk. The optional narrator talks only to a model on this machine. Two things can leave, and only when you start them: a licence request when you fetch one, and, if you run thruline reexec, Docker downloading the container image it needs.
How is this different from CodeRabbit, Greptile or Cursor Bugbot?
They review the diff — the lines that changed. ThruLine reviews the agent’s claim against the record of what actually ran, on the version you are approving.
The full comparisonWhat does “Not proven” mean — is my code broken?
No. It means nothing in the record establishes the claim on this version. The claim may be entirely true.
A specimen: a file changed after the runCan I use it on a team?
Pro covers one developer. Write to us about licences for multiple developers.
PricingFrom the blog
Open to beta users · Built by one engineer
Check the next “done” before you approve it.
Every email is answered by the person who built ThruLine, within one business day. (Not a bot, not a queue.)