fix(cowshed): key retired gc authority on incarnation, not workspace name
Trash entries are `sessions/.trash/<name>-<incarnation>`, but gc keyed cleanup authority on the name alone. Retiring one name twice therefore presented as ambiguous authority rather than as two independent entries, and gc refused to collect anything in the project: `duplicate retired cleanup authority for <ws>` with the name idle, or `retired trash conflicts with canonical workspace <ws>` once the name had been re-minted. Both forwarded to `doctor --json`, which reported a healthy host with zero findings, so the operator had no next move. Authority is now the `<name>-<incarnation>` pair, so N retirements of one name are N independently collectable entries and a live workspace no longer blocks collection of retirements that are not it. Both messages are gone. What a name-keyed claim really covered was the two paths that genuinely are keyed on the name — `checkpoints/<name>` and the mountpoint — because re-minting a name hands the new lifetime the same ones. Those are now scoped separately: they belong to whoever holds the name now, a live canonical image if there is one and otherwise the newest retirement still in trash, while every other retirement collects only its own per-incarnation artifacts. The scope is derived from trash filenames, which `retired_authority` already proves agree with each sidecar, so preview and execution cannot disagree and revalidate as stale. `doctor` now reads gc's own preview instead of staying silent: stranded retirements are a `retired-trash` warning naming `cowshed gc`, and a preview that cannot be taken at all is a `gc-preview` error rather than a healthy host.
D
Danny Wilson committed
79a815ec408e9f640151783de8772be5f208f9d6
Parent: 01f57ac