Settlement
Every agent turn that changed something ends with a settlement card โ a short accounting of what actually happened, drawn by the runtime from its own record of tool calls rather than written by the model.
โ settlement โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ verified
bash cargo test -p mur-core
~ changed 3 file(s)
src/store/config.rs
src/cmd/model.rs
README.md
โ blocked
/etc/hosts โ sandbox: write denied outside project root
โ stopped at deadline (12 iterations) โ output may be incomplete ยท raise it: mur limits rustsmith --deadline <1h>
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Why the runtime draws it
An agent summarising its own turn is grading its own work, and the failure is always in the same direction: changed gets reported as done. A model can edit thirteen files, compile none of them, and write "fixed everywhere" โ every word of which it believes.
The card cannot be talked around, because it is assembled from what the loop recorded, not from what the model concluded. When the prose above it overclaims, the two visibly disagree, and the disagreement is the signal.
The three states
MUR keeps apart three things agents routinely collapse into one:
| What it means | How it is derived | |
|---|---|---|
โ verified | A command ran and passed | An executing tool (bash, test runner) that succeeded |
~ changed | Files edited, nothing run against them | A mutating tool (write, edit) |
โ blocked | Failed, refused, or denied by the sandbox | Any tool call that errored or was denied |
When the agent works in a per-turn git worktree, ~ changed comes from the
worktree's diff at promote time, so files a bash redirect wrote are counted
too. Every such turn can be reversed: see Turn Undo.
No judgement is involved, so there is nothing for a model to round in its own favour.
The empty row is stated, never omitted
When nothing ran, the card says so out loud:
โ verified (nothing ran โ no evidence this works)
Leaving the row out would let a reader assume success. That line is the difference between "changed nine files" and "it works" โ and it is the whole reason the card exists.
A report with nothing behind it
A turn that ran no tools usually gets no card. The exception is a reply that names external state โ a commit hash, a #1234 PR or issue, a GitHub state like MERGED, a test tally, a GitHub URL, a diff โ with nothing run to back it:
โ unverified no tool ran this turn โ external state claims above were not checked
Detection looks at the shape of the text, not its wording, so it works in any language and a rephrased claim is still caught. Nothing is refused, rewritten or retried; the row only tells you the claim was not checked in this turn.
Stops name themselves
A turn that ended for any reason other than finishing says which:
โ stopped at stuck (9 iterations) โ output may be incomplete ยท no progress; last calls: bash, bash, bash โ change the ask, or widen it: mur limits rustsmith --stuck <20m|off>
Previously a turn cut short by a cap could read exactly like a clean finish. Now every stop names its reason and the one-line remedy โ see Execution Limits for what can stop a turn.
Quiet when there is nothing to settle
A turn that only answered a question gets no card. A three-row table under a one-line reply is noise, and noise is how a real signal stops being read.
Machine-readable, not just printed
The same ledger travels with the reply as structured JSON, so mur agent send,
fleet steps, and MUR Hub read the accounting directly instead of scraping the
prose.
The companion skill
The card covers what a tool ledger can see. mur-settlement, a built-in skill
loaded at session start, covers what it cannot: state in one line, what is left
and why, and the handoff last.