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 meansHow it is derived
โœ” verifiedA command ran and passedAn executing tool (bash, test runner) that succeeded
~ changedFiles edited, nothing run against themA mutating tool (write, edit)
โœ˜ blockedFailed, refused, or denied by the sandboxAny 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.