You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Pruning lifetimes, design only: a subcommand of the store's surface with a retention policy, never a lifecycle verb, never the current lifetime #930
Epic:#451 · Feature:#762 The writ lifecycle surface · Schedule:#916, lane 13, PR F · Waits on:#928 (lane 11), #929 (lane 12)
The ruling, 2026-09-23
A machine sees many lifetimes -- one per deploy (#922), and ended ones after decommission (#929) -- and the
store keeps them all. Pruning is housekeeping on the store, not a fifth verb: the four lifecycle operations act
on the current lifetime's record; pruning retires lifetimes that are no longer current and never touches the
current one. It is a subcommand of the store's own surface, with a retention policy to boot -- not a lifecycle
verb, and not something a deploy decides on the user's behalf.
This lane is design only
It writes the design into 5.1-reconciliation.md and 10-command-line-interface.md; the code is a later
schedule's. The design states:
What retiring one deletes: its receipts, their graph documents when no other lifetime references them, and
its rows in the run index -- and what stays: nothing of it; a pruned lifetime is gone from the store.
The subcommand, on the store's surface (writ store prune, or whatever the store's group is named when
the surface exists): explicit, reports what it would retire under --dry-run, retires it otherwise, and
refuses to touch the current lifetime.
The retention policy, in config: keep the last N lifetimes, or lifetimes newer than a duration, or both;
the subcommand applies it, and nothing applies it silently. A policy of none keeps everything, which is today.
the five points above are in 5.1-reconciliation.md, under the lifetime model, and the subcommand and the
policy keys are in 10-command-line-interface.md and schema/defaults/writ.yaml as reserved, not implemented
Pruning a lifetime removes its receipts, its refs/devlore/ refs and its snapshot worktrees (unlocked, then git worktree remove). It never removes the current lifetime, and never an unmerged retain/* branch: those are the maintainer's to toss or merge.
Amended by the owner's ruling of 2026-10-02, lifetimes are generations: writ follows git and Nix. It is stated in docs/architecture/5.1-reconciliation.md § Lifetimes are generations, recorded on #916, and its finding is open question 5 of lane 7's plan, docs/plans/task/926-scope-flag.md (#926). The lane's plan takes this up when the schedule reaches it.
Lifetimes now share runs by reference, so pruning collects a trace, and a snapshot of a layer at a commit, only when no kept lifetime refers to it, as Nix's garbage collection keeps every store path a generation roots. Rollback becomes possible -- make an older lifetime current, link back into its kept snapshot, re-render its copies from it -- and is not yet scheduled.
Activity
David-Noble-at-work commentedon Oct 2, 2026
Amended by the owner's ruling of 2026-10-02, lifetimes are generations: writ follows git and Nix. It is stated in
docs/architecture/5.1-reconciliation.md§ Lifetimes are generations, recorded on #916, and its finding is open question 5 of lane 7's plan,docs/plans/task/926-scope-flag.md(#926). The lane's plan takes this up when the schedule reaches it.Lifetimes now share runs by reference, so pruning collects a trace, and a snapshot of a layer at a commit, only when no kept lifetime refers to it, as Nix's garbage collection keeps every store path a generation roots. Rollback becomes possible -- make an older lifetime current, link back into its kept snapshot, re-render its copies from it -- and is not yet scheduled.