A coordination layer for formal proofs.

Import a repository. Run the prover on real commits. Track who owns each theorem, person or agent, across the whole project.

No state hidden in CI logs, chat threads, and side channels. Every run, claim, and handoff lands in one record.

GH_EVENTS
21:34:18.207push prime/infinite-primes main@a4f29c1
21:34:18.208→ build_job #1247 [QUEUED]
AI_WORKBENCH
21:34:18.210> awaiting dispatch
PROOF_LAB
theorem exists_infinite_primes (n : Nat) :
   p, n p p.Prime := by
  
LEAN_4_LSP
No goals
THEOREM_WORK
CLAIM prime/infinite-primes@1
SOURCEGPT-5.5 Pro [suggested]
OWNER@ludwig [claimed]
TRACKprime-proof [suggested]
INTENT_LOCK[claimed]
VERIFICATION_RECORD
21:34:18.215Mathlib.Data.Nat.Prime [VERIFIED]

What it does

One record of every proof attempt

Apodeixis indexes Lean, Coq, and Isabelle repositories and records, for every theorem: whether the prover accepts it and on which commit, who owns the attempt, what blocks it, and whether the statement has changed.

What can we trust?

Verification is pinned to a commit and command.

A proof counts as verified only when the prover accepts it on a specific commit, with the exact build command stored. Re-run it and you get the same result. Whether the statement says what you meant is tracked separately, as intent and drift.

How verification works →
VERIFICATION_RECORD [verified]
theoremFreyPackage.of_not_flt
repoImperialCollegeLondon/FLT
commite7c1b04
toolchainleanprover/lean4:v4.15.0
proverLean 4 · Mathlib
commandlake build FLT.Basic.Reductions

Re-run the manifest yourself. Same result.

What should we work on next?

One status view per repository.

A single triage view per repository. The status pill says whether anything needs attention; the table lists what to act on: unowned proofs, dependency blockers, policy holds.

Open a project →
Action required 1 unowned blocked proof needs an owner
Last 24 runs 19 passed · 4 failed · 1 live
Proof State Why blocked Owner
flt/frey-package-reduction done no blocker @ludwig
flt/frey-curve-modular blocked 4 dependency blockers unowned
flt/mod-p-reducible in_progress no blocker @ludwig

What should we ask an agent to try?

People and agents are tracked the same way.

Claim a theorem and state your intent; the lock is visible to everyone. AI drafts go through project policy and land as suggestions, not silent commits. Humans and agents get the same attribution.

See the workbench →
THEOREM_WORK [claimed]
THEOREM FreyCurve.conductor_eq@2
SOURCEGPT-5.5 Pro [agent]
OWNER@ludwig [intent lock]
TRACKfrey-curve [accepted]
POLICYai enabled human gate

What mathematical meaning is at risk?

Statement changes are classified, not just detected.

A statement can change under a passing build. Apodeixis classifies each change by kind, origin, and significance: compiler-generated noise folds away; a weakened theorem is ranked for review.

Read on drift →
SEMANTIC_DRIFT [review]
theoremFreyCurve.torsionGaloisRep
changee7c1b04 → 4a9f2d1
originhuman_authored
classweaker_theorem significancehigh

The build passes. The meaning moved.

Blueprint as a lens

The plan and the proofs are one object.

Import a LeanBlueprint project and bind each plan node to a theorem. The node state comes from the verified record: done, ready, or blocked, not a status you maintain by hand. The blueprint is a view over real results, not a document beside them.

How the lens works →
BLUEPRINT flt
frey_package FreyPackage.of_not_flt [done]
frey_curve_modular FreyCurve.isModular [blocked]
fermat_last_theorem FermatLastTheorem [draft]

Node state comes from the record, not a hand-edited doc.

Keyboard shortcuts