Get ThruLine

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.

Review my change See a recorded chain

Open to beta users. Built by one engineer.

The real ThruLine v0.2.0 HQ, running locally.

Install · macOS and Linux

curl -fsSL https://thrulinehq.com/install.sh | sh
~/.local/bin/thruline ui

opens 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

Read the scriptRelease notesSource on GitHub

ThruLineHQ
ThruLine HQ showing one Change in the ledger-api project, Stop double refunds on partial captures. The agent’s claim, Fixed the double refund. All 214 tests pass., is marked Not proven on version 7d03b5f: the tests ran at step 71 on version a41c9e2, and payments/refunds.py changed at step 83, after that run. A Check it again button sits beside the verdict. The left rail lists the project’s Changes by whose turn it is; the right panel lists what the record shows and what would settle it.

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.

  1. What the agent said, word for word, from its own session log.
  2. Where proof stops: payments/refunds.py changed after the run.
  3. One thing to do, beside the verdict: run the same check on this version.
  4. 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

  1. ① Said

    What did the agent claim?

    "Tests pass." Claude Code · 16:03 step 52
  2. ② Rests on

    What is that claim based on?

    4 passed, 0 failed step 46 cited by the agent
  3. ③ Ran on

    Which version did that actually run on?

    version 9f2ad3e 1 version older
  4. ④ Since

    Needs a re-check

    Did anything it depends on change after it?

    checkout/api.py changed · step 56 after the run
  5. ⑤ Re-checked

    Not reached

    Has anything checked it since?

    nothing on e71c5b0 with checkout/api.py in scope
  6. ⑥ So

    Not proven · version e71c5b0

    So 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.

Not checked yet: Applying a discount code once reduces the total by exactly that discount.
Not checked yet: Applying the same discount code twice does not reduce the total twice.
Not checked yet: Checkout totals with no discount code are unchanged.

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.

Every stage, in full

01 · Define

What counts as done?

thruline ui · Change · Define

Proposed, checkable statements · accept, edit or drop each

Applying a discount code once reduces the total by exactly that discount.

Accept Edit Drop

Applying the same discount code twice does not reduce the total twice.

Accept Edit Drop
Suggestions start hollow. Nothing counts until you accept it.

02 · Prepare

What exactly will be examined?

thruline ui · Change · Prepare

What will be looked at

  • The project folder: checkout-web
  • Starting from: e71c5b0
  • There are no unsaved changes: this is exactly what is committed.

Only what was actually written down is shown here. Nothing about databases, ports, secrets or outside services is claimed.

It names the exact starting version, and claims nothing the record does not hold.

03 · Build

What changed?

thruline ui · Change · Build

What changed in this version

version e71c5b0

checkout/api.py step 56 · 16:04

Changed after the run at step 46, and after the agent said “Tests pass.”

The edit came after the run the agent cited, so that run no longer covers it.

04 · Verify

What happened when we checked it?

thruline ui · Change · Verify
Check it again

pytest -q tests/test_totals.py checkout/on e71c5b0 · asks once for this project

How a check can end

Passed · Failed · Ran, checked nothing (not a pass) · Cancelled by you · Interrupted · Tool not found

Only a pass reads as a pass. It installs nothing and does not touch the network.

05 · Review

What did review find, and was it addressed?

thruline ui · Change · Review

What review found

No review has been written down for this Change yet, so there is nothing here to read.

Ask for a review

Asking for a review is not something this version of ThruLine can do yet.

An empty stage says it is empty, and says why.

06 · Approve

What exactly am I accepting?

thruline ui · Change · Approve
Ready for approval· e71c5b0
Approve e71c5b0

It does not merge, deploy or tell the agent anything.

Written to .thruline/decisions/e71c5b0.json in your project.

Approval names one version. If the code moves, approving is refused.

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]

All five specimens

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.

Read the specimen

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.

Read the specimen

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.

Read the specimen

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.

The full table
Twelve AI code reviewers, summarised from the source named in each row and fetched on 25 Sep 2026, and ThruLine
Reviewer What it is Price Source Fetched
CodeRabbit PR reviews plus Change Stack, a review workspace Free · $24 / $48 / $72 per dev/mo, annual coderabbit.ai · pricing, wowtale.net 25 Sep 2026
Graphite AI review on stacked PRs, an inbox and a merge queue Free · $20 / $40 per user/mo, annual graphite.com · pricing, blog 25 Sep 2026
Greptile Graph-indexed review; TREX runs the PR in a sandbox Free, 1 dev · $30/seat/mo · $1 per extra credit greptile.com · pricing, changelog 25 Sep 2026
Cursor Bugbot Cursor’s PR reviewer, with learned rules and Autofix About $1.00–$1.50 per run (was $40/seat) cursor.com · docs/bugbot, blog 25 Sep 2026
Copilot code review Native to GitHub; hands fixes to the Copilot cloud agent Pro $10/mo · Business $19/seat, metered github · docs, changelog 25 Sep 2026
Qodo “Code review for agents. Governance for humans.” Credit packs from $30/mo, about 18 reviews qodo.ai · pricing 25 Sep 2026
OpenAI Codex review ChatGPT’s GitHub review: flags only P0 and P1 issues Plus $20/mo · Business $20/user, annual learn.chatgpt.com · github 25 Sep 2026
Claude Code Review A fleet of agents with a verification step; always neutral See vendor pricing claude docs · code-review 25 Sep 2026
Devin Review Rebuilds the diff: groups, orders and explains each hunk ACU-metered, with a per-PR spend cap cognition.com · devin-review 25 Sep 2026
Macroscope Correctness review, Check Run Agents, Approvability $0.05 per KB of diff (10 KB min) · no seats macroscope · pricing, approvability 25 Sep 2026
Baz Review Sessions: a record of each of its own agent runs $30 per active dev/mo + $0.01 work credits baz.ai · sessions, pricing, siliconangle 25 Sep 2026
CodeAnt AI Review plus SAST, SCA, secrets, IaC and AI pentests Premium $24/user/mo (self-reported) codeant.ai · pricing, blog 25 Sep 2026
ThruLine Reads the agent’s claim and checks it against what ran, on the version you approve Pro $15 a month thrulinehq.com/pricing —

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.

receipt.json synthetic project · sample key

DSSE envelope · payloadType application/vnd.in-toto+json

_type
https://in-toto.io/Statement/v1
predicateType
https://thrulinehq.com/attestation/execution-check/v0.2
subject
gitTree 900ad6fa6e8a96db17eae3e2120d42f65d752afc
kind
accepted_requirements
state
verified
check
pytest · argv python3 -m pytest -q
run
acceptance-evt_01M1WRC89HSS5XM6J4R302Z3QD
exit_code
0
counts
passed 2 · failed 0 · skipped 0 · total 2
chain_head
sha256:a2d1ecf0f906d3fc92d2c337180d4c04f83f6249fe7294e1807cbd17449493f8
contract
sha256:a77d28622af5c4acbaa11990af853e0d64650274a59c5d0b48e5fcadf09c290d
producer
sha256:0655f10ef05df654b88672604b3f60f42aaccaa42322851808fa7263528d6b4b
signature
keyid sha256:e0f549f57ffdda1592ba0e7fdbf1b30f3aeec1efb8dbb6a1015442745a411358
envelope sha256
43c845f11e984c56a5180699904317da46a186bb9ff1a9c32dd0208dd45feeef
Real output of ThruLine’s qualification run on a synthetic Python test project, signed with a sample key that is not a production identity.

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.”
— Senior Engineer, Goji Labs

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.

See pricing

Pro

$15 a month

or $150 a year · one developer

FAQ

Five questions, answered plainly.

Every question
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 reached
What 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.

What leaves, exactly
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 comparison
What 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 run
Can I use it on a team?

Pro covers one developer. Write to us about licences for multiple developers.

Pricing

From the blog

New ThruLine Research 12 min read Green Is Not Proof CI checks the code an AI agent leaves behind. It doesn’t check what the agent did to get there, or whether what it told you is true. Read the research

Open to beta users · Built by one engineer

Check the next “done” before you approve it.

Review my change

Every email is answered by the person who built ThruLine, within one business day. (Not a bot, not a queue.)

Get ThruLine

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.

The real ThruLine v0.2.0 HQ, running locally.
Review my change See a recorded chain

Open to beta users. Built by one engineer.

Install · macOS and Linux

curl -fsSL https://thrulinehq.com/install.sh | sh
~/.local/bin/thruline ui

opens 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

Read the scriptRelease notesSource on GitHub

New ThruLine Research Green Is Not Proof CI checks the code an AI agent leaves behind, not what it did or whether its “done” is true. Read the research 12 min read

A recorded chain · demo record

One claim, followed to the record.

Six plain questions. Each answer is a line from the session record, with its step number.

Claude Code said
“Checkout total fixed.” “Tests pass.”
step 52 · demo record

1 2 3 5
  1. ① Said

    What did the agent claim?

    "Tests pass."
    Claude Code · 16:03 · step 52

  2. ② Rests on

    What is that claim based on?

    4 passed, 0 failed
    step 46 · cited by the agent

  3. ③ Ran on

    Which version did that actually run on?

    version 9f2ad3e
    1 version older

  4. ④ Since

    Did anything it depends on change after it?

    checkout/api.py changed
    step 56 · after the run

    Proof stops here

  5. ⑤ Re-checked

    Has anything checked it since?

    nothing on e71c5b0
    with checkout/api.py in scope

  6. ⑥ So

    So what do we actually know?

    Not proven· version e71c5b0

    the claim may be entirely true.

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

It installs nothing and does not touch the network.

See a real signed receipt

They review the diff.

ThruLine reviews the agent’s claim against the record.

A diff shows what changed. It can’t show whether the tests ran, on which version, or what changed after they did. The record can.

Six stages of a Change

From your request to one approved version.

A Change is one fix, feature or refactor you are deciding whether to accept. It may span several sessions.

  1. 01 · Define

    What counts as done?

    thruline ui · Define

    Asked

    “the checkout total is wrong when a discount code is applied — fix it”

    Applying a discount code once reduces the total by exactly that discount.

    covers cart/totals.py

    Accept Edit Drop

    4 statements · recorded with who and when

  2. 02 · Prepare

    What exactly will be examined?

    thruline ui · Prepare

    What will be looked at

    cart/ checkout/ tests/

    version e71c5b0

    Only what was actually written down is shown here. Nothing about databases, ports, secrets or outside services is claimed.

  3. 03 · Build

    What changed?

    thruline ui · Build

    What changed in this version

    checkout/api.py

    modify · step 56 · after the run at step 46

    One file changed after the run the agent cited.

  4. 04 · Verify

    What happened when we checked it?

    thruline ui · Verify

    A re-check ends in one of six

    Passed · Failed · Ran, checked nothing (not a pass) · Cancelled by you · Interrupted · Tool not found

    Only a pass reads as a pass.

  5. 05 · Review

    What did review find, and was it addressed?

    thruline ui · Review

    What review found

    No check covers checkout/api.py

    rests on step 56

    A closed conversation is not a fix. A finding is resolved by a run, not by a reply.

  6. 06 · Approve

    What exactly am I accepting?

    thruline ui · Approve

    What has been decided

    Approved e71c5b0

    .thruline/decisions/e71c5b0.json

    It does not merge, deploy or tell the agent anything.

Specimens

Five places the proof stopped.

Recorded on ThruLine’s checkout-web demo record. No customer data.

[swap in a corpus chain before launch]
1 2 3 4 5 6

Proof stops at ② Rests on

Ran, checked nothing

The agent cited a run that exited 0, the code for success, having checked nothing. This is not a pass.

[n] skipped, 0 ran · cited by the agent

Read the specimen
1 2 3 4 5 6

Proof stops at ③ Ran on

The run was one version older

The tests passed — on 9f2ad3e, one version before the one you are approving.

version 9f2ad3e · 1 version older

Read the specimen
1 2 3 5 6

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.

checkout/api.py changed · step 56
after the run

Read the specimen
All five specimens

The field · fetched 25 Sep 2026

What the field does, and what we do.

Each tool here reviews a pull request (PR): the diff, at one commit. Some also run code in their own sandbox. Each row says what the tool does and costs, and where that came from.

  • CodeRabbit

    PR reviews plus Change Stack, a review workspace

    Free · $24 / $48 / $72 per dev/mo, annual

    coderabbit.ai · pricing, wowtale.net
    fetched 25 Sep 2026

  • Greptile

    Graph-indexed review; TREX runs the PR in a sandbox

    Free, 1 dev · $30/seat/mo
    $1 per extra credit

    greptile.com · pricing, changelog
    fetched 25 Sep 2026

  • Cursor Bugbot

    Cursor’s PR reviewer, with learned rules and Autofix

    About $1.00–$1.50 per run
    (was $40/seat)

    cursor.com · docs/bugbot, blog
    fetched 25 Sep 2026

  • Copilot code review

    Native to GitHub; hands fixes to the Copilot cloud agent

    Pro $10/mo · Business $19/seat,
    metered

    github · docs, changelog
    fetched 25 Sep 2026

What ThruLine does

Reads the session log your coding agent already writes, and joins each claim to the runs it made — in order, with exit codes — on the version you are about to accept.

Pro $15 a month, or $150 a year

All twelve, side by side, on Product

The receipt

Deterministic. Tamper-evident. Local. Unmetered.

A receipt is a signed record of exactly what ran. Here is what stands behind one.

Deterministic
The same record always gives the same answer. No model decides the verdict.
Tamper-evident
The record is append-only and hash-chained: each entry carries a fingerprint of the one before, so a changed byte breaks the chain.
Local
The record stays on your machine. The core engine makes no network calls.
Unmetered
No meter: nothing is charged per run or per review, and no model call sits behind a verdict.

Here is a real one: a DSSE envelope (a standard wrapper for signed data) around an in-toto statement (an open format for attestations: signed statements of what was checked, on which code).

receipt.json

DSSE envelope · payloadType application/vnd.in-toto+json

_type https://in-toto.io/Statement/v1

predicateType https://thrulinehq.com/attestation/execution-check/v0.2

subject gitTree 900ad6fa6e8a96db17eae3e2120d42f65d752afc

kind accepted_requirements

state verified

check pytest · argv python3 -m pytest -q

run acceptance-evt_01M1WRC89HSS5XM6J4R302Z3QD

exit_code 0

counts passed 2 · failed 0 · skipped 0 · total 2

chain_head sha256:a2d1ecf0f906d3fc92d2c337180d4c04f83f6249fe7294e1807cbd17449493f8

contract sha256:a77d28622af5c4acbaa11990af853e0d64650274a59c5d0b48e5fcadf09c290d

producer sha256:0655f10ef05df654b88672604b3f60f42aaccaa42322851808fa7263528d6b4b

signature keyid sha256:e0f549f57ffdda1592ba0e7fdbf1b30f3aeec1efb8dbb6a1015442745a411358

envelope sha256 43c845f11e984c56a5180699904317da46a186bb9ff1a9c32dd0208dd45feeef

Real output of ThruLine’s qualification run on a synthetic Python test project, signed with a sample key that is not a production identity.

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.”
— Senior Engineer, Goji Labs

Pricing

A licence unlocks one thing: approving a version.

Everything else needs no licence: recording, every read, re-checks, withdrawing an approval, stopping a run, linking evidence, exporting your own records and removing stored data (coming in 0.2.1).

  • Pro

    $15 a month

    or $150 a year · one developer

See pricing

FAQ

Five questions, answered plainly.

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 the verdict is reached, on Security
What 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.

Security
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 table, on Product
What 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 run
Can I use it on a team?

Pro covers one developer. Write to us about licences for multiple developers.

Pricing
Every question, on the FAQ

Open to beta users

Bring the next change your agent calls done.

Built by one engineer. It runs on macOS and Linux. One command opens it in your browser, on 127.0.0.1.

Install in two commands
Review my change

Every email is answered by the person who built ThruLine, within one business day. (Not a bot, not a queue.)