ccc0df6870
The restart loop runs as the deploy identity, not root, and a stack .env is allowed to be root-owned 0600. compose bails on the unreadable file before doing anything, so the stack was reported FAILED while restart=unless-stopped had already brought it back healthy — a false failure, which is worse than a quiet one because it trains readers to skim the failure lines. Retry under sudo -n before calling it a failure, and print compose's own output either way. Verified on nh3-dev against beszel: plain attempt rc=1 'open /opt/docker/compose/beszel/.env: permission denied', sudo retry rc=0 'Container beszel-agent Started', container back to healthy. The happy path is unchanged — the sudo attempt only fires after a failure. Also record that tts-dev migrated talk from ~/talk into /opt/docker/compose/talk, which removes the one stack on this host that was invisible to anything walking that path.