0.23.1 — the pin says what it links, and the ladder says draft
A small release, and both fixes are the same mistake wearing different clothes: a label that had drifted from the thing it names.
A small release, and both fixes are the same mistake wearing different clothes: a label that had drifted from the thing it names.
Every ladder in this repository models evidence flowing inward: something was observed, and an artifact's status records what we now know.
An outbound claim runs the other way. A number in a customer's inbox. A status page saying "resolved". An availability figure in a renewal deck. Those are assertions that already left the boundary, and nothing here modelled them.
0.15.0 let a rung cost evidence. This release is how the evidence gets there.
$ protocol artifact evidence outbound-claim:q3-uptime \
--kind approval --source "legal review" --ref https://example.invalid/approvals/814
outbound-claim:q3-uptime: approval recorded from legal review
on hand: approval=1
$ protocol artifact move outbound-claim:q3-uptime --to cleared
outbound-claim:q3-uptime moved draft -> cleared (revision 2)
The planning store is markdown files in git, so its history was always there — as git log, in a
form you had to reconstruct. This release makes it a question you can ask.
$ protocol artifact history outbound-claim:q3-uptime
2026-08-26T00:08:16Z operator created as draft (revision 1)
2026-08-26T00:08:20Z operator approval recorded from legal review (https://example.invalid/approvals/814) (revision 1)
2026-08-26T00:08:20Z operator moved draft -> cleared (revision 2)
2026-08-26T00:08:20Z operator moved cleared -> sent (revision 3)
$ protocol artifact lifecycle blocker
blocker starts at open
cleared -> nothing
open -> cleared
Two rungs. The value is entirely in the type: a blocker is typed by what would clear it, so blocked stops being a label on a card and becomes a statement with a named exit.
An obligation is a commitment on a clock nobody here controls: a customer's deadline, a
regulator's window, a partner's delivery date.
$ protocol artifact lifecycle obligation
obligation starts at open
met -> nothing
open -> met, slipped
slipped -> met
Some rungs should not open yet. A review window. A cooling-off period. A notice period somebody agreed to in a contract.
This release adds date and duration operators to the condition language, so a ladder can say so.
0.13.0 made the status ladder data. This is the first release that spends it.
A ladder that only says what may follow what models permission, not earning. Anybody could
move a story to implemented; the ladder had no opinion about whether anything was implemented.
Every plan item in the planning store sits at a status and climbs a ladder: draft →
proposed → active → implemented → accepted. Until 0.13.0 that ladder was a hand-written
lookup in Rust, and the consequence for anybody using the tool was concrete and annoying: a team
whose work does not fit the shapes we happened to think of had to send a pull request to this
repository and wait for a release.
It is a YAML file now.
Two waves in one release, and they are the same idea applied twice: take something that was prose and make it a typed thing a program can refuse.