Flywheel is a self-hostable AI workstation and coding harness. You run it on your own machine, point it at any model you hold a key for or a local one, and keep a record of every run. This post walks the parts a developer touches first: install, the coding agent, check-output, and the receipt path.
pip install flywheel-verify
flywheel up
flywheel up starts the local API gateway on http://127.0.0.1:8799 and serves a browser shell there. The installed runtime uses only the Python standard library. The PyPI distribution name is flywheel-verify; the command it installs is flywheel.
No model download is required. Point the router at a hosted provider you hold a key for, or run local through ollama over HTTP, or fetch the published 14B and 32B weights. The roster reports that a credential is present, never its value.
flywheel auth login <provider>
That runs a stepwise sign-in, stores the token in your OS credential store, and the router picks it up.
Fifteen lanes are declared in the roster; ten bundle natively from hash-pinned source. List their configured state, or probe each lane's live MCP connection:
flywheel lanes
flywheel lanes --probe # live MCP handshake per lane
Lanes cover research intake (gather), a workspace map and symbol graph (index), memory with source checks (mneme), multi-agent routing (forum), claim recheck (crucible), writing quality and AI-tell detection (articulate), and more. Each runs on its own and composes with the others through JSON.
relay is a permission-gated coding agent that works over your own folders on a local or hosted model:
flywheel relay
Stage four of a run is the capability check. It reads a shell command the way a shell reads it and names what the command is able to do, and that name settles the decision: allow, refuse with a reason returned to the model, or escalate to a person. A blocked request is not a fatal error. The reason goes back to the model, which can pick a different route, and the ledger keeps the request, the refusal, and the reason.
One honest gap the repo does not paper over: the map of executable names is curated by hand, so a command it has never seen is admitted and written down as unknown rather than silently trusted.
An assistant that rechecks its own arithmetic gets the same wrong number twice. So Flywheel checks a value against the source that decides it and reports three outcomes:
flywheel check-output --contract task.contract.json --answer answer.json --allow-commands
Exit 0 means confirmed, exit 1 means the value disagrees, exit 3 means nothing could confirm it. An unchecked value never reads as a confirmed one. The report also says whether the answer may ship: RELEASE, RELEASE_WITH_CAVEAT, or HOLD with the fields that blocked it. Inside a lane, a held answer does not accept.
Finance, medicine, and law each ship a pack of field templates for the values that go wrong the same way: a dose banded by a formulary rather than computed, a deadline counted in calendar days where the rule counts court days, an amount carried to two decimals in a currency that has none. A pack ships field shapes and arithmetic, no domain data; the authorities stay yours to supply.
flywheel packs medicine
Add --lean Answer.lean --verify-lean and the check is emitted as a Lean 4 file that the kernel runs. What the kernel settles becomes a theorem, what an outside authority decided becomes a named axiom, and one #print axioms line prints everything the result rests on.
Routed runs keep a ledger of tool names, arguments, and outputs. With sealed tool-call receipts enabled, each receipt also records the capability, the outcome, argument and output hashes, and the prior receipt's hash. Sealed receipts form an ordered hash chain, so if one receipt is invalid, later entries in that chain become unverifiable.
The end-to-end gate runs oracle to group to receipt to re-witness with no model and no candidate code executed, and exits 0 only on a MATCH:
flywheel gate
An independent witness re-runs the recorded check offline and reports MATCH, DRIFT, or UNVERIFIABLE. No learned model sits on the accept path. That is the whole point of the receipt: a run you can hand to someone who was not there, and they reach the same verdict.
On the shipped benchmark, continued pretraining on the workspace corpus did not improve general code completion: -3.05 points over 164 tasks, p = 0.40. The retired arms benchmark read +0.100 with 95% CI [-0.236, +0.420], an interval that includes zero. No capability uplift is claimed. A receipt shows the check reproduces. Whether the answer is right about the world is a separate question.