1. set -e + pipefail: docker compose up piped through tail would abort
script on partial startup failure before printing summary — add || true
2. Phase 7 marked done even with build failures, so --resume would skip
it — now only marks done when all builds succeed
3. --phase=7 printed 'Phase 7 complete' even with failures — now exits
with code 1 and points to build logs
4. docker compose config --format json called 30 times in build loop —
now cached once (saves ~3s)
5. Build logs now saved per-service to STATE_DIR/builds/<svc>.log for
post-failure debugging