For agents
Most code being written now is not typed out by a person. Deed is
built on that being true, and deed mcp is the part of it
you can point a tool at: a Model Context Protocol server, so the
thing writing the code asks the compiler instead of remembering.
loading the compiler
What comes back that a type error does not
A compiler that only says yes or no tells an agent whether it has finished. Deed says which of the promises in the signature it settled, and which it could only arrange to check at runtime. That is a gradient, and something iterating on its own output can climb it.
…
…
proven means the checker discharged it at compile time.
tested means it produced a property and ran it. Neither
was asked for.
And when it cannot
The same refinement without the precondition that establishes it. The answer is not "no", it is which tier this landed in and the reason it did not land higher.
…
…
Nothing narrowed this name is a sentence a model can act on. It says where to look, which is the caller's side, and it is the difference between a warning and a next step.
A repair, and the reason behind it
Models reach for export, because most languages have one.
Across
five recorded runs
this was the single most common thing said, forty-five times, in
every task. So the answer carries the edit that fixes it and the
reason the word does not exist:
…
…
machine-applicable is the compiler saying this one may
be applied without asking. Guesses are marked differently and are
never applied on their own, which is a distinction an agent can only
respect if it is told.
A test nobody wrote
The contract in a signature is not documentation. Ask the same server to run the tests of a module that contains none, and it runs the property the contract generates:
…
…
A hundred cases, from a seed that is in the answer so the run can be repeated. In the recorded runs this happened three times to a model that had been told not to write tests.
Wiring it up
The server speaks MCP on stdin and stdout, so a client starts it the way it starts any other:
{
"mcpServers": {
"deed": { "command": "deed", "args": ["mcp"] }
}
}
There is nothing else to install; see
Install. Six tools:
deed_check, deed_test,
deed_run, deed_fmt, deed_fix
and deed_explain. The full walkthrough is
in the repository.
What it is not allowed to do
The server holds no capability. A program arrives as text and the answer leaves as text; it opens no file, resolves no path, and refuses to run a program whose signature reaches for a directory before running a single instruction. That is not a sandbox bolted on — it is the same rule the language is about, applied to itself.
The cost is written down rather than hidden: a server with no filesystem cannot be handed a module set, so a program that imports another module has to arrive with it.
Does it actually help?
Measured, not asserted. Six tasks, one model, five runs, against a control arm with the compiler taken away:
| Arm | Answered | Check | Pass their tests |
|---|---|---|---|
| prompt only | 6/6 | 0 | 0 |
with deed mcp |
6/6 | 5 or 6 | 5 |
Six confident answers either way, and not one of the prompt-only ones compiles. Deed is in nobody's training data, which is what makes the control arm worth having and what makes the number honest rather than impressive.
The record says what it does not establish, too: one model family, no comparison against a language without contracts, and a control arm recorded against an earlier build. Read it before quoting it.