Work
Write the reclaim contract down: one table in docs/cleanup.md naming every artifact devlaunch causes to exist, what reclaims it, and what proves removal safe.
This is the map's destination artifact and the reason it is a map rather than a bug list. Today the answer is spread across docs/cleanup.md's prose, flows/lifecycle.rs's module header, the volume paragraphs, and three review reports, and the only way to find out that nothing reclaims an artifact is to fill a disk.
One row per artifact, and the rows are the union of what these tickets settled: workspace clones, .bare object stores, agent worktrees and the .pixi/envs copies inside them, the shared pixi download cache, devpod workspaces, docker images, the build cache, named volumes, orphaned volumes, metadata records, the completion cache, and clones outside repos_dir.
Each row states: what creates it, what reclaims it, what proves removal safe, and where the bytes were last measured. A row whose reclaim column says nothing, deliberately is a legitimate outcome and must carry its reason, because that is the difference between a decision and an oversight, and principle 2 permits the former only.
Constraints: docs/ prose carries no em or en dashes (test_docs_prose.py), and this page must not start saying "this README" (same guard). If a section moves between files, the guard that reads it moves in the same change. Consider whether this table wants a guard of its own asserting every artifact named in the code appears as a row, so the next artifact devlaunch invents cannot be added silently.
Blocked by every decision on the map, because a contract written before the decisions is a summary of guesses.
Work
Write the reclaim contract down: one table in
docs/cleanup.mdnaming every artifact devlaunch causes to exist, what reclaims it, and what proves removal safe.This is the map's destination artifact and the reason it is a map rather than a bug list. Today the answer is spread across
docs/cleanup.md's prose,flows/lifecycle.rs's module header, the volume paragraphs, and three review reports, and the only way to find out that nothing reclaims an artifact is to fill a disk.One row per artifact, and the rows are the union of what these tickets settled: workspace clones,
.bareobject stores, agent worktrees and the.pixi/envscopies inside them, the shared pixi download cache, devpod workspaces, docker images, the build cache, named volumes, orphaned volumes, metadata records, the completion cache, and clones outsiderepos_dir.Each row states: what creates it, what reclaims it, what proves removal safe, and where the bytes were last measured. A row whose reclaim column says nothing, deliberately is a legitimate outcome and must carry its reason, because that is the difference between a decision and an oversight, and principle 2 permits the former only.
Constraints:
docs/prose carries no em or en dashes (test_docs_prose.py), and this page must not start saying "this README" (same guard). If a section moves between files, the guard that reads it moves in the same change. Consider whether this table wants a guard of its own asserting every artifact named in the code appears as a row, so the next artifact devlaunch invents cannot be added silently.Blocked by every decision on the map, because a contract written before the decisions is a summary of guesses.