Implemented scripts/refresh_live_images.py and make live-images-refresh. Publication validates exports before mutation, locks concurrent writers, retains all previous cluster entries, and fsyncs an atomic replacement. Offline tests prove repeatability, multi-cluster retention, and preservation on missing, empty, or malformed input.
Requires the production host inventory, activity-core directory mount/configuration update, and cluster rollout hook adoption. Follow docs/forgejo-package-prune.md. Preserve the restored union and worker refusal on missing/empty inventory; do not manually trigger prune. Completed 2026-09-05: installed the versioned helper outside the checkout,
seeded all 51 restored entries and merged a fresh railiance01 export (86 total),
added the read-only directory mount, rolled out actcore-worker, and synced the
exact definition override. API readback confirms the durable path. The resolver
accepts that path and refuses missing input before subprocess execution; the
command construction check used a mock and did not run prune. A post-rollout
capture succeeded. Activity-core's refresh target delegates to this hook; invoke
it after subsequent cluster rollouts (no new periodic schedule was introduced).