Redline
Redline reads a commercial lease or contract before you sign it. A model pulls the numbers out of the PDF. Deterministic rules do the math. So when it flags a problem, that's arithmetic you can check, not a model's opinion.
- Math decides
- deterministic rules, not model judgment
- 6 checks
- rent, escalation, term, draft-vs-deal
- Cites the line
- quote + page on every finding
- No silent pass
- what it can't verify, it flags
Drop in a lease or a contract. Redline reads it, runs the checks, and hands back a verdict with every problem pinned to the clause that caused it.
A second read on your lease or contract before you sign.


Extract
A language model pulls the lease facts out of the PDF (rent, schedule, term, dates) and tags each one with the quote and page it came from.
model + provenanceValidate
Deterministic rules do the math: schedules sum, per-face reconciles to the total, numerals match the words, dates cohere. No model judgment in the verdict.
pure functionsFlag
Each problem shows what the document says and what it should be, with the exact clause to open and check yourself.
in-document → should-beDecide
A clear sign-or-don't, calibrated to severity. A check it couldn't run is surfaced as 'not run,' never quietly passed as clean.
verdict + severityWhat's actually doing the checking.
The trust boundary.
The model only turns prose into structured numbers. Every verdict is arithmetic over them, so you can re-check any finding by hand in seconds.
extract, then validateIt won't fake certainty.
When a rule can't get the facts it needs, it says so instead of returning a clean pass. Extraction runs locally through Ollama or Codex, or through OpenAI or Anthropic when you opt in. The API key stays runtime-only.
could-not-verify, not passThe rules the verdict is built on. Each one is a pure function over the extracted facts, with a synthetic fixture behind it.
- Schedule sums to total. The year-by-year rent has to add up to the stated total.
- Per-face reconciles. Per-face rent times the number of faces has to equal the total, catching a figure that was silently applied to each face.
- Escalation stays consistent. Each year has to match the escalation clause; flat-with-a-clause or rising-with-none gets flagged.
- Numerals match the words. $400,000 has to agree with 'Four Hundred Thousand Dollars.'
- Term and dates cohere. Commencement plus the base term has to land on the stated expiry.
- Draft matches the deal. An optional dealsheet checks the draft's numbers against the terms actually negotiated.
The public repo, the app, the CLI, and the rule engine. Alpha package, not published yet.
Public repository for the lease and contract validator, including the Python engine, CLI, MCP server, and macOS wrapper.
public source · alpha packageThe native macOS wrapper. Drop in a lease PDF, pick a provider, set the exit threshold, and run the same validator the CLI uses.
local · alphaThe Python CLI and library. Deterministic findings over extracted facts, with JSON output and a CI-usable exit code.
pip-ready · not yet publishedSix pure-function checks with synthetic fixtures. Each rule is a function plus a test, and a check it can't run returns 'could not verify,' never a pass.
trust boundary · math only

