Inspiration

Friday under a deadline. A founder pastes a board update into chat. The model returns a clean sentence: partners signed, nobody raised concerns, safe to send. The second half was never in the source. The expensive failure is not a bad draft. It is the line that already left Slack.

We wanted clearance before send, not another model that writes nicer prose. Chat invents. Almost refuses.

What it does

Almost is an evidence-bound outbound desk. You paste source and the AI draft. A server-side gate checks each claim:

  • BOUND — the quote is a real substring of the excerpt you supplied. It may leave.
  • GAP — the quote is not evidenced. It stays named on purpose. It never enters the answer.

The product is the pack: a portable markdown receipt with span pins (offsets + hash), named gaps, and an issuer seal. Judges can re-check it on /verify. Tamper the pin and it fails closed.

How we built it

Built with Codex and GPT-5.6: evidence gate, pack + span pins, Clearance Workspace, showcase, embed. Human locks stayed human: named GAPs, refuse invent, pack as product.

  • Fail-closed gate in Python (evidence.py): quote must live in excerpt; lexical support; polarity / negation / contradiction lite. Not full transformer NLI, and we do not claim that.
  • Clearance Workspace (/workspace): source + draft + clearance dock, no Chrome extension required. Embed widget at /embed/clear for the same gate beside any chat UI.
  • Pack + verify: span pins at bind time; Ed25519 seal when cryptography is available (HMAC fallback); /verify re-runs the gate on the artifact.
  • Ship path: stdlib HTTP server on Cloud Run, static front end, optional OpenAI / Gemini draft only from BOUND claims (heuristic works with zero keys). Demo cookie on ?demo=1 keeps the judge path alive without an account.

Signature moment: same Friday ask → one claim BOUND, one claim GAP → flip the invent with a real quote and watch GAP become BOUND.

Challenges we ran into

  • Honesty vs theatre. Easy to show a green check. Hard to keep GAPs visible and refuse invent. We chose named gaps over fake certainty.
  • Substring is not entailment. BOUND means word-bounded evidence in the excerpt you gave, plus local support checks. We document that limit instead of overclaiming “truth.”
  • Demo safety. Cold starts, missing model keys, and OAuth console friction. Fallback order: live gate → offline substring bind → sealed sample pack → verify tamper. The prize is the gate, not the prose model.
  • Product shape. We cut extension-first and desk sprawl. The B2C path is paste → clear → stamp → pack.

What we learned

Clearance is a workflow between intelligence and consequence. Founders do not need another inventing chat. They need a receipt for what may leave. Span pins make the bind checkable later. Refusing to invent is the feature.

Share this project:

Updates