Get ThruLine

Product

It reads what the agent said, and checks it against what ran.

ThruLine organises your work around a Change: one feature, fix or refactor you are deciding whether to accept, even across several agent sessions. Six stages take it from “what counts as done” to approving one version — one exact commit of your code. Every fact on screen traces to a line in your own logs: the session files Claude Code and Codex already write on your machine.

Review my change See the six stages

Open to beta users. Built by one engineer. Nothing leaves your machine — how, on Security.

Define → Prepare → Build → Verify → Review → Approve

One Change, six stages

Each stage answers one plain question. The six are views of the same Change, so moving between them settles nothing.

Every screen below is rebuilt from the product’s own words, on the checkout-web demo record. Where part of a screen is still in build, its row says so.

01 · Define

What counts as done?

ThruLine reads your request, word for word, and suggests a short list of checkable statements. You accept, edit or drop each one, and choose the folders the Change covers. Accepting this is not approving the work.

Built
Accepting what counts as done, and the folders it covers; Accept, Edit and Drop on each line
In build
Keeping a dropped line as its own record
  1. Your request, exactly as you wrote it.
  2. Every line starts unaccepted. Nothing counts until you accept it.
  3. Work outside these folders is not counted for this Change.
thruline ui · Change · Define · demo record

← checkout-web · Fix double-applied discount on checkout total

What counts as done?

Asked

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

Proposed, checkable statements · accept, edit or drop each

These are suggestions read out of what was asked for. Nothing counts until you accept it.

  • Applying a discount code once reduces the total by exactly that discount. covers cart/totals.py Accept Edit Drop
  • Applying the same discount code twice does not reduce the total twice. covers cart/totals.py Accept Edit Drop
  • Checkout totals with no discount code are unchanged. covers checkout/api.py Accept Edit Drop
+ Add a statement

What the Change covers

cart/ checkout/ tests/ + Add a folder
Accept what counts as done 3 statements · recorded with who and when
Nothing here is a verdict. It is the bar the work will be judged against.

02 · Prepare

What is this change, exactly?

ThruLine proposes one Change from the work it can already see, named in the words you used when you asked for it. It lists exactly what will be looked at, and which checks it suggests. Nothing is written down until you say so.

Built
Proposing a Change, and what will be looked at
  1. One Change, with the request that named it.
  2. A list of checks is not evidence. None of these has run.
  3. Nothing is recorded until you press this.
thruline ui · Start · The work ThruLine can already see · demo record

This is the work ThruLine can already see

One Change, named in the words you used when you asked for it. Nothing is written down until you say so.

Proposed Change

Fix double-applied discount on checkout total

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

Repository
~/code/checkout-web
The exact copy of the work being looked at
version e71c5b0There are no unsaved changes: this is exactly what is committed.
Where the work happened
Claude Code

What ThruLine suggests checking

A list of checks is not evidence. None of these has run.

pytest -q tests/test_totals.py checkout/ Needed before this can be approved.

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

Start tracking this Change
The Change carries the name you gave the work. The checks it suggests are a plan, not proof.

03 · Build

What did the agent do, step by step?

The Brief, the one-screen story of a Change, reads the session back in order: what the agent said, what that rests on, which version it ran on, and what changed after. The thread, the orange line joining each step, stays lit only as far as the record holds. Where proof stops, it goes dashed, and one action sits beside the verdict.

The same moment, as a specimen: A file changed after the run →

Built
The Brief: one sentence, one state, its one action, and the six-step chain drawn here
  1. One plain sentence, built from the record.
  2. Proof stops at ④: checkout/api.py changed after the run.
  3. One primary action, at the point where proof stops.
thruline ui · Change · Brief · Fix double-applied discount on checkout total · demo record

Change

The agent says the checkout total is fixed. It kept changing code after the tests ran.

Not proven · version e71c5b0 checkout-web · 19 steps recorded

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

  1. ① Said

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

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

    version 9f2ad3e 1 version older
  4. ④ Since

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

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

    Not proven version e71c5b0 the claim may be entirely true.

④ Since · the question it answers

Did anything it depends on change after it?

checkout/api.py changed at step 56 (16:04), after the run and after the claim. The code is now e71c5b0.

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.

Check it again

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

“Not proven” is not “broken”: the claim may be entirely true. Nothing on e71c5b0 has checked it yet.

04 · Verify

Does the proof still hold on this version?

Check it again runs the same check on the version in front of you. It asks once for this project, installs nothing and does not touch the network. A check ends one of six ways, and only a pass reads as a pass.

Built
Check it again from the screen: a Rust project’s cargo test
Built
The same check, from a terminal:thruline check --for-change <change> -- <command>
  1. Exactly what will run, on which version, and where.
  2. Asked once for this project. Nothing installed, no network.
  3. Six endings. Only Passed counts as proof.
thruline ui · Change · Verify · Check it again · demo record

Check it again

The same check re-run on the current version, with checkout/api.py in scope.

What will run
pytest -q tests/test_totals.py checkout/
On
version e71c5b0
Where
~/code/checkout-web

ThruLine asks once for this project.

It does not install anything and does not touch the network.

Run the check Becomes Cancel while it runs.

How a check can end

  • PassedThe only ending that reads as a pass.
  • FailedThe record shows the opposite of what was said.
  • Ran, checked nothing (not a pass)Something ran, and it settled nothing.
  • Cancelled by youYou stopped this check. That still settles nothing.
  • InterruptedIt stopped before it finished. Run it again.
  • Tool not foundSomething it needs isn’t here. Nothing is installed.
“Ran, checked nothing” is its own ending. It is never shown as a pass.

05 · Review

What needs you, and why?

The Inbox lists each Change that is waiting, says in one sentence why, and offers one thing to do. When nothing is waiting, it says so — and says that is not the same as the work being good.

Built
The Inbox: grouped by whose turn it is, with one reason and one action per Change
  1. Grouped by whose turn it is.
  2. Why it is waiting, in one sentence.
  3. One thing to do per Change.
  4. What ThruLine keeps on this machine, as a real number.
thruline ui · Inbox · checkout-web · demo record

What needs your attention

2 Changes need your attention.

Waiting on you 2 Needs a check 0 Nothing needed 1
  • Fix double-applied discount on checkout total

    This is waiting for you to decide.

    Ready for approval · e71c5b0 checkout-web · version e71c5b0
    See what you would be approving
  • Upgrade Stripe SDK to v14

    The whole session is waiting on a permission prompt.

    Your turn in Claude Code ThruLine can’t answer this for you.
ThruLine is keeping 1.4 GB of records on this machine. Where the records are kept
“Ready for approval” is a decision waiting on you, never a green light.

06 · Approve

Which version are you accepting?

Approval names exactly one version and is written to a file in your project. If the code moves while you are looking, approving is refused. It does not merge, deploy or tell the agent anything, and withdrawing an approval is itself recorded.

Approving a version is the one thing a licence unlocks. See Pricing →

Built
Approving one version with a button that names it, and withdrawing it
  1. The button names the one version it approves.
  2. A plain file in your project, which you can read.
  3. Withdrawing adds a record. Nothing is edited or deleted.
thruline ui · Change · Approve · demo record

Before

What you would be approving

Ready for approval · e71c5b0

Ready for approval for version e71c5b0. It rests on:

  • Applying a discount code once reduces the total by exactly that discount.
  • Applying the same discount code twice does not reduce the total twice.
  • Checkout totals with no discount code are unchanged.
Your name, for the record sam
Approve e71c5b0

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

After

Approved on e71c5b0

Approved · e71c5b0

Approved by sam on 2026-09-22, against what counts as done, version 1.

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

Written to

.thruline/decisions/e71c5b0.json

Withdraw approval
Neither ◇ nor ◆ is ever green. Green means only “Proven on this version”.

The state vocabulary

Thirteen marks, one encoding

Every state is a word, a glyph and a line style, so the screen still reads with the colour off. The glyph is hidden from screen readers; the word is what they read.

Word Pill Meaning
Provenon this version, with version and scope Proven · version e71c5b0 · tests/test_totals.py, checkout/ Solid. Only at ⑥ SO and in pills, never on a link. The scope, the files the check covered, may wrap; it is never cut short.
Not provennothing in the record shows it Not proven · version e71c5b0 Hollow, with a dashed outline. Calm, never alarm: the claim may be entirely true.
Not proventhe record shows the opposite Not proven · a run on e71c5b0 failed A 1 px coral outline. The only coral on a screen.
Needs a re-checkproof is for an older version Needs a re-check · version e71c5b0 45° hatching. In a chain, only at ④ SINCE. The run was one version older →
In progressnothing has checked it yet In progress · version e71c5b0 A blue bar on its row. Not a verdict yet.
Recordedsettles nothing Recorded A neutral outline. Something ran, and it settles nothing.
Loose threada promise not yet kept Loose thread No fill. Its chain is shorter: SAID → KEPT? → SO. Not yet drawn on the v0.2 screens.
Fogthe record can’t be read here Fog · not recorded Dashed, with grey hatching. A gap in the recording, not a verdict.
No result yeta step with no result No result yet · step 60 Dotted and unlit. Never counts as a link. A step with no result yet →
Checking nownothing settled until it ends Checking now A neutral ring with the real elapsed seconds while it runs. Never orange.
Ready for approvala decision, never green Ready for approval · e71c5b0 The brightest outline. Orange only on the Approve button.
Approvednames one version Approved · e71c5b0 Solid. Approving records a decision; it does not merge.
A destructive command rana fact, not a state 1 command that removes files ran Outlined. Recorded, not judged; never coral.
In a chain 1holds lit thread proof stops here, once 5not reached, never faded
All five specimens →

Twelve things · eight built · four in build

What only ThruLine does

Every reviewer judges the pull request; ThruLine judges the agent’s claims against what actually ran, on the version you are about to accept. All twelve follow from one fact: the agent’s runs and words, in order, bound to one version.

Built

  • #1

    The agent’s own words are what gets reviewed.

    Each thing the agent said it did, like “Tests pass.”, is read out of the session and checked on its own.

  • #2

    “Proven” means a recorded run on this exact version, not a re-read.

    A line turns Proven only when a run in the record passed on the version you are looking at. A model reading the code again does not count.

  • #3

    It knows the test ran before the last edit.

    The Brief names the file that changed after the run, and the step.

  • #4

    Numbers that cannot drift from the record.

    Every count comes from fields in the record, not from prose, and says which way it counts: 1 failed, 3 passed (4 tests).

    The count that counted the passes →

  • #5

    Test-integrity signals are joined to the claim.

    Signals about the test itself, such as a run that reports success (exit 0) having checked nothing, sit beside the claim they bear on. “Ran, checked nothing” is not a pass.

    Ran, checked nothing →

  • #6

    Re-check on this version, with honest outcomes.

    A check ends one of six ways, and only a pass on this version counts.

  • #9

    Approval names one version, and refuses a moved one.

    If the code moves while the screen is open, approving is refused and the file that changed is named. An approval never carries over to a later version.

  • #10

    “Done” is proven by running, not by reading a ticket.

    What counts as done is a list you accept. Each line is proven by a recorded run, not by a model reading the ticket’s text.

In build

Not yet in the product you can install. Each says where it stands.

  • #7

    The repair loop closes on proof, not on a thread.

    Partly built; needs engine work.

  • #8

    The agent hears receipts — records of what actually ran — before it claims.

    Needs wiring into the app.

  • #11

    It says what it could not see.

    Mostly built; the rest needs engine work.

  • #12

    Deterministic, tamper-evident, local and unmetered.

    Deterministic: the same record always gives the same answer, and no model decides. Tamper-evident: any change to the record shows, because it is hash-chained — each entry carries a fingerprint of the one before, so a changed byte breaks the chain. Local: nothing leaves your machine. Unmetered: no charge per review.

    Mostly engine work: the verdict path and the hash-chained record are built. How the record is kept →

The field · fetched 25 Sep 2026

What the field does, and what we do

Twelve AI code reviewers — tools that read a pull request (PR) and comment on it — as fetched on 25 September 2026: what each one is, what it costs, and the idea it does best. Every reviewer here reads the diff — the lines that changed — at a commit, and some run the code themselves, in a walled-off sandbox.

ThruLine reads something else: the agent’s own record of what it said and what it ran, in order, on the version you are about to accept.

Reviewer What it is Price What it does best Source Fetched
CodeRabbit PR reviews plus Change Stack, a review workspace Free · $24 / $48 / $72 per dev/mo, annual Snapshot pinning to one head commit; the merge control refuses a stale artifact 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 A PR inbox run like an email client: six default sections, shareable by link 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 Verdict first, findings by severity, and “What we checked” on clean reviews 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) Learned rules you can view and edit; “Fix in Cursor” and “Fix in Web” per finding 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 Open (with a “new” label), Resolved since last review, Previously missed github · docs, changelog 25 Sep 2026
Qodo “Code review for agents. Governance for humans.” Credit packs from $30/mo, about 18 reviews Ticket compliance in three buckets: compliant, not compliant, needs a human 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 A hard rule for what is worth interrupting a person for; rules live in AGENTS.md learn.chatgpt.com · github 25 Sep 2026
Claude Code Review A fleet of agents with a verification step; always neutral See vendor pricing Each finding folds out why it was flagged and how it was verified; a JSON tally 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 Swap github.com for devinreview.com in any PR URL; moved code is detected 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 “Would Approve”: a shadow mode that shows the approval it would give 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 Shows how each review run went: what ran, what it skipped, outcome and cost 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) Steps of reproduction on each finding: inputs, path, expected against actual codeant.ai · pricing, blog 25 Sep 2026

Prices and descriptions as each source stated them on the fetch date. Nothing here has been re-checked since.

The same ground, in ThruLine

Six capabilities the field ships, and where ThruLine stands on each: three it has its own answer to, and three it declines on purpose.

What the field has Who has it What ThruLine does Source · fetched 25 Sep 2026
Diagrams of the change CodeRabbit (Mermaid), Greptile The lit-thread map, derived from the record, not drawn. docs.coderabbit.ai · walkthroughsgreptile.com · docs
Snapshot pinning, stale-merge refusal CodeRabbit Change Stack Evidence and approval bound to one version. docs.coderabbit.ai · change-stack/snapshots
Chat on the PR @coderabbitai, @greptileai Ask: answers carry receipts, or say “the record doesn’t say”. docs.coderabbit.aigreptile.com · docs
Autofix and committable suggestions CodeRabbit, Graphite, Bugbot By design, ThruLine does not write fixes or commit suggestions. ThruLine proves; your agent fixes. docs.coderabbit.aigraphite.com · pricing, blogcursor.com · docs/bugbot
Auto-approve Copilot, Greptile, cubic, Macroscope, Baz By design, ThruLine does not approve for you. A named person approves one version. github · docs, changeloggreptile · auto-approvemacroscope · approvabilitybaz.ai · sessions[cubic source]
Confidence score Greptile, 0–5 By design, ThruLine does not give a confidence score. It shows counts and states derived from the record. greptile.com · docs

Sources checked for this table: docs.coderabbit.ai · walkthroughs · change-stack/findings · change-stack/snapshots · triage · reference/configuration · greptile.com · docs · cursor.com · docs/bugbot

Refused on purpose

What we deliberately do not build

Twelve of the twenty-one patterns the field ships that ThruLine declines on principle, each with what it does instead and why.

The field ships ThruLine does this instead Why
Autofix and commit suggestions A prompt for your agent, prepared for you to copy. Nothing is sent. Nothing commits code or tells the agent anything.
AI auto-approval and auto-merge A named person approves one version. ThruLine never approves for you. A person decides.
A model score as the verdict A verdict from fixed rules over the record. No model decides, and there is no score. Deterministic by contract.
A single green “Verified” Green only for “Proven on this version”. One meaning per colour.
Per-review metering and caps No meter. A skipped review must never read as a pass.
Agent-made video as proof Tagged “agent-reported”. It never lifts a line to Proven. Only a recorded run proves a line.
Severe findings behind a paywall Every state on every plan. Never gate the truth.
Uploading transcripts A local export, previewed before it is saved. Nothing leaves the machine.
Chat that searches the web Answers from the record, or “the record doesn’t say”. No network calls.
“Slop” labels and accusations “Claimed, and no proof found in the record.” The record states what it holds, and nothing more.
Model-written PR summaries A headline built from fields in the record. No number comes from prose.
Poems, fortunes and GIFs A calm headline. A surface you trust keeps a calm register.

Try it on one Change.

ThruLine runs on macOS and Linux and opens with one command, thruline ui, in your browser on your own machine. Ctrl+C stops it. Open to beta users. Built by one engineer.

Install · macOS and Linux

Install in two steps

  1. curl -fsSL https://thrulinehq.com/install.sh | sh

    Downloads v0.2.0 for this machine.

  2. ~/.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

See pricing Review my change