Brilliant for 50 rows. Row 5,000 is another story.
Your agent leases a small batch, submits it, and takes the next one — the
pipeline's state lives on the server, not in its context, so a run outlives the session
that started it. Every attempt, model and rule change lands on one ledger.
115 raw → 62 clean → 62 leased to disk → submitted → refused →
attempt 2 continued the same batch from server-side state, not a new run →
62 landed · recorded with gate: on ↓
Session replay · recorded 2026-07-28claude-code + tablize skill
>
Production line · Supplier screening = tablize lineage■Up to date
3 tables
Collection ┄ off-ledger
Source
Supplier listings · raw
115rows
append-only · duplicates kept
dedupe by url
−53 folded
Processing
Supplier listings · clean
62rows
first-seen wins · stable ids
AI extraction
by your agent
Process table
Supplier category
124records
every attempt on the books
Accepted · lens■62 acceptedclaude-sonnet-4.5 · attempt 2a view of the process table — not a fourth table
golden gate
4 hidden goldens · gate: on
■4/4 · attempt 2
62 through · 62 blocked writes
Consumption ┄ off-ledger
Real run — a local instance, 2026-07-28. Supplier listings are
sample data; every count, verdict, model and batch id replayed here is the product's own
recorded state. This run was recorded with the gate on — build a line without a golden
file and it runs at none instead: no verdict, rows land unverified,
and the batch flow above works exactly the same. The three modes ↓.
This drawing is in the website's own
type system — the product's own UI looks like this ↓.
✓62 landed on attempt 2 of the same batch — the run continued from server-side state instead of restarting.Install for your agent
Where it runs
On your machine, with your model key. Tablize supplies no model and no runtime.
What your agent holds at once
One leased batch, never the whole table. The rows it is not working on stay on the
server, so its attention does not thin out as the table grows.
What happens tomorrow
The next session resumes the run — open batches, leases, verdicts — instead of
reconstructing it from a transcript.
What the gate is for
No goldens, no gate. Supply a golden file and a check the agent cannot read judges every
batch — one miss refuses the whole batch, and every refusal stays on the books.
01 / Failure mode
Two dead ends, and a third way out.
A model that reads fifty rows well reads row five thousand just as well —
what changes is how much unrelated table it is holding while it does.
Dead end 01
Put the whole table in the context.
It works, and it keeps working right up to where it doesn't. Attention spreads across
thousands of rows the agent is not currently deciding about, the early ones slide out of the
window, and the failure is quiet — no error, no exception, just answers that drift.
And when the session ends, the run ends with it.
Dead end 02
Write a script to route around the model.
Cheap, fast, repeatable — and the judgement that needed a model has been compressed into
string matching. "Is this company a manufacturer or a trader?" becomes a regex over its
name. The script is now the only statement of the rule, nobody reviewed it, and the rows
it got wrong look exactly like the rows it got right.
The third way
Keep the pipeline on the server and hand out work.
Your agent asks for the next batch, computes it, submits it, asks for another: the model
still does the semantic work, but it only ever holds the rows it was handed. And
because your agent does the computing, a flat-rate coding-agent subscription does the work
a per-token API bill would have.
The choice was never model versus script. It is whether the process lives
in a context window that forgets, or in a structure that doesn't.
02 / Why an account
Memory is not an account.
This is about a run whose referee, whose state, and whose reasons all live
inside the worker.
Not independent
The extractor and its test have the same author.
The agent writes the extraction logic in this session. When a row looks wrong, the same agent
adjusts the validator — and the batch passes. Nothing prevented that, because nothing
was outside the agent.
Not continuous
The state ends when the context does.
Which rows were leased, which came back, which were rejected and why — all of it lived in a
transcript. A new session sees files and partial output, and rebuilds the run from
clues instead of resuming it.
Not accountable
Three weeks later, nobody can answer.
Which rule version accepted this row? Which model produced it? Was it ever rejected first?
If the answer is "check the chat history", there is no account — there is a
recollection.
If the worker can rewrite the referee, you don't have a gate.
You have another prompt.
03 / The governed edge
One narrow edge, and who owns each end of it.
Tablize governs four steps and refuses to claim the rest. The bottom line of
each box says whether that step is yours or ours.
Step 01
Raw evidence
Append-only source rows — a crawl, an export, a hand-assembled CSV. Duplicates are kept:
they are a fact about collection, not an error.
Collected by you or your agent · Tablize does not fetch it
Step 02
Agent attempts
Your agent leases a bounded batch to disk, runs your prompt against your model, and submits
the results as one batch with the model and prompt hash attached.
Runs on your machine, your model key · Tablize supplies no model
Step 03 · optional
Golden gate
Build the line without goldens and there is no gate: nothing is judged and rows land
unverified. Supply them and check rows with known answers ride in
every batch — expected values held server-side, never returned by a lease, one miss refuses
the whole batch.
Held by Tablize once the line has goldens · the submitting agent can
never read or approve them
Step 04
Result view
Not a fourth table — a reading of the process table showing the latest row per source row.
With the gate on it shows accepted rows only and refused attempts move nothing; with the gate
off it shows what landed, marked unverified.
Projected by Tablize · you decide whether anyone downstream uses it
The one thing that has no CLI command: on a gated edge, when your agent
writes the check rows itself, the line is created as a draft and hands out no work until a person
opens the gate in the app. That is the 403 · pending_signoff in the replay
above. An agent that could approve its own answer key has not been checked by anyone.
An ungated edge never reaches that question: it hands
out work immediately and marks what lands unverified.
04 / The gate you tighten
Your agent produced the rows. Who checked them?
Nobody, until you write the check. There is no switch to leave off: a gate built on goldens
you were not ready to write is a noise gate — and a noise gate is worse than none. The mode is fixed when the line is
built, so tightening means rebuilding it: a deliberate step, taken when the pipeline is
worth protecting. The results the old line already produced stay where they are.
none · no golden file
No gate yet — nothing is being checked.
Everything is still accounted for: every batch, model, standard version and timestamp is on
the record. What is missing is the check — nothing compares the results to an answer a person
confirmed, so they arrive unverified. This is the right first run and the
wrong last one.
observe · ask for it
Watching only — nothing is held back.
Every batch is compared to the goldens and the score is recorded, but no batch is ever
stopped, so results still arrive unverified — even a clean sweep. When the gate cannot
hold, a pass is a measurement, not a certification. Use the scores to decide whether
these goldens are the right ones before you let them block anything.
enforce · goldens supplied
One miss refuses the batch.
Goldens are hidden and binding. A failing spot-check rejects the whole batch, and
consecutive rejections halt the edge rather than letting it grind. Only enforce can grant
"accepted" — which is the entire reason that word is still worth something.
The gate is the first thing on the ledger you can tighten. It is not what
makes the pipeline durable — that part is already running with the gate off.
05 / Product evidence
Inspect the mechanism, not a promise.
The same run, in the application, recorded with the gate on
(enforce) — that is what makes a refusal visible at all.
Unretouched, at 100% zoom, cropped only where each header says so.
A / The line
Accepted output stays attached to its source.
The whole edge on one canvas: 115 raw rows, 53 folded away by url, 62 clean rows, the
extraction, and the gate.
The label on the edge leaving the gate is the product's own, not a caption we wrote:
62 through · 62 blocked writes. Recorded but not promoted, drawn on the line itself.
115 → −53 → 62 → 62 accepted, and on the gate edge:
62 through · 62 blocked writes. The product has both themes too —
this shot follows whichever one you picked above.
B / Batch ledger
Every attempt keeps its identity.
One row carries the whole account of a batch: its id, how many rows it leased, the hidden
check score, the model that produced it, and how many times it was submitted.
The status strip lists rejected 62 beside accepted 62. Rejection is a
first-class state here, not an error log to be cleared.
process table · batches and statuslight theme · cropped, no rows
62 rows · 4/4 · claude-sonnet-4.5 · 2 submissions — the accepted batch,
with the earlier rejection still counted in the same account.
C / Rejection
A refused row does not evaporate.
Filter to rejected and the 62 refused rows are still there — the company, the
category the model chose, and the evidence text it was judged on.
That is what makes the next attempt arguable instead of guesswork: you can read what the
weaker model actually said before you decide what to change.
process table · filtered to rejectedlight theme · cropped left of the system columns
Filtered to rejected 62 — refused rows, on the books, with the
evidence column they were judged against.
Screenshots come from a local instance on 2026-07-28. The mechanism, ids,
counts, verdicts and system columns are the product's own state; the supplier rows are sample data
generated for that run. Shots B and C were captured in the product's light theme and are shown
that way in both site themes — we would rather label a screenshot than retouch one. There are no
customer logos on this page because there is nothing to show yet.
06 / Is it for me?
Most data jobs need none of this.
One agent, one afternoon, cheap to be wrong — a CSV is the right answer and this
is overhead. Check what is actually true of your workflow.
Conditions true
0of 10
□ Not yet answered
Check the statements that describe your workflow. The
result is a recommendation, and one of the three is "don't use this".
Next step — read the boundary below before you install
anything.
07 / Honest boundary
What a landed row does and does not mean.
The most load-bearing section on this page. An account that overstates its own
scope is worse than no account, because people stop checking the part it never covered.
Inside the edge
Tablize guarantees
■
A row marked accepted passed the rules and check rows as they existed at that moment,
and the version is recorded. A row marked unverified was never
judged — the label tells you which you have.
■
Every attempt, batch, model and rule change is accounted for — who, when, under
which recipe version.
■
Failed attempts are kept and readable, and they never enter the accepted view.
With the gate off there are no refusals to keep — nothing is judged, so nothing is
refused.
■
The next run continues from server-side state — open batches, leases, verdicts —
with no transcript required.
Outside the edge
Tablize does not guarantee
×
That the source data is true or complete. Evidence a row never carried cannot be
recovered at the gate.
×
That the fields you defined are the fields downstream actually needs. Tablize
enforces your contract; it does not discover it.
×
That anyone used the accepted result. In our own first end-to-end tenant,
128 of 136 accepted rows were never picked up by anything downstream — five rounds,
unnoticed, while the ledger stayed accurate the whole time.
×
That your agent writes nothing outside Tablize. It has your machine and your keys;
this account covers one edge, not the agent.
08 / How it works
Give your agent a pipeline that outlives the chat.
Four commands. No account form, no dashboard tour, and no long-lived key
pasted into a terminal.
~/your-project · setup
$ npm i -g @tablize/cli
$ tablize install
$ tablize login --url https://api.tablize.com
$ tablize doctor
Prompt for Claude Code / Codex
Set up Tablize as the durable pipeline for this project's clean → extract → accept work. The point is that the process state lives on the server, not in your context.
1. Run `npm i -g @tablize/cli`, then `tablize install` to lay down the bundled agent skill.
2. Run `tablize login --url https://api.tablize.com` and ask me to approve the browser pairing.
3. Run `tablize doctor` and fix any version, skill, server, or workspace mismatch.
4. Inspect this project and propose the raw evidence contract and the extraction result schema before creating a pipeline.
5. For the first run, create the extraction edge with no golden file — it runs at `none`: nothing judged, rows land unverified. Do not invent goldens just to fill a field.
6. Work in small batches: `batch pull`, compute, `batch submit`, repeat. Never load the whole table into your context, and resume from `tablize context` rather than from this conversation.
7. Read `gateMode` from `tablize transform show ` before you trust a row: only `enforce` marks a row accepted. The gate is fixed when the line is built, so moving to `observe` or `enforce` means building a new line — propose it when the pipeline is worth protecting, and ask me first, because I sign the goldens, not you.
8. Never rebuild a line at `none` to escape goldens it keeps failing. That is the gate doing its job.
9. Keep collection completeness and downstream consumption explicitly outside Tablize's guarantee.
Why pairing rather than an API key field: the commands here are
driven by agents as often as by people, and an agent has no browser and no password. Pairing
gets it a working credential with one human click — and the secret never appears in a web
page, a clipboard, or your shell history.
What actually happens · real CLI and browser output
01
The terminal prints a short code and waits.
🔐 Sign in to tablize
Opening: https://app.tablize.com/cli-login?code=…Confirm this code matches: BFTK-9QDX
Waiting for approval....
Nothing is granted yet. The request expires on its own if nobody
approves it.
02
The browser names the client and the exact grant.
Sign in to tablize?A command-line client is asking to connect to your account.
Client tablize CLI · your-mac · you
Code BFTK-9QDXWhat it will be able to do
Read and write your data. It cannot manage
members, policies or billing, and it does not
expire — revoke it any time in Profile → API keys.
[ Approve ] [ Refuse ]
You compare the code against your own terminal before approving.
Refuse grants nothing and tells the waiting terminal to stop.
03
The CLI receives the key, and doctor checks three layers.
$ tablize doctor
{
"summary": { "ok": 9, "warn": 0, "fail": 0 },
"message": "all three layers healthy against
https://api.tablize.com (9 ok, 0 warn) —
this verdict covers that server only",
"next": "tablize context # open tasks, recipes, rules"
}
Installed == running? Skill == CLI? Server capabilities online?
Any failing check comes back with the exact fix command
attached, so the agent can repair it without asking you.
09 / Pricing — one base, tier = rung
Start free. Self-host when it matters.
Same engine on every tier. You only move up a rung when your workload does.