Yards and the Store
Each joined session works in its own persistent yard under anvil-db. The yard contains the supplied brief, frozen base when present, phase materials, mutable scratch work, and the required submission/ directory. It is a durable dig site, not the canonical judged object and never another contestant's workspace.
When a seat marks done, Anvil walks the declared submission tree, rejects an empty or oversized tree, hashes every file, and archives it beneath a unique submission ID. The stored tree and its path/sha256/bytes manifest become immutable judge input before any bench session opens: archive-before-judge.
The store is content-addressed per file, not one deduplicated bundle that merges equal submissions. Two identical trees still have distinct submission IDs, seat records, reports, manifests, and trail events. A later phase creates another submission row and tree; phase and seat lineage in the run graph explain the relationship.
Yards and store trees both persist until Dad uses the explicit run-deletion path, which removes them together. There is no TTL, rotation, or “retention expires” path. A month later, the store still rebuilds the contest and the yard still preserves working residue.