v0.4.0 — The write-verdict taxonomy
The adjudication release: rejected writes now carry a classification the client can act on. The node keys every mutation error to permanent or transient, names the four codes that settle a write for good, and states the health/connection and expiry contracts as the reference the client side builds against.
Features
- Mutation-error taxonomy (#11): every write rejection is classified permanent — the store's final verdict, safe for the client to roll back and compensate — or transient, keyed by the error code. Unknown codes default to transient, so a new server code never falsely retires a pending write. A deterministic write-rejection harness proves verdict correlation to the originating write and re-derivation across reconnects, and
GET /healthis exercised in open, ticket, and peer modes. - The four permanent codes (#13):
permission_denied,transaction_conflict,permissions_head_missing, andexpiredare registered permanent.expiredis groundwork: the classification ships now so clients written today handle it correctly when server-enforced write expiry lands.
Contracts and documentation
- The write-verdicts page states the four-code taxonomy and the health/connection contract as the node actually answers them (#11, #13)
- The expiry contract is specified mechanism-neutral — what an expired write means, who may retire it, and why the client never does — and the design record now serves as the reference spec for the client-side work tracked in lofi#145, with the upstream ask drafted (#13)
Full Changelog: v0.3.0...v0.4.0