Push build #33 (this branch) failed at the lint gate on failures inherited from
main, which block this PR from merging:
- runner/harness/warm.py: ruff format (long regex line — no code change)
- nix/modules/acme-dns.nix: statix W201 'avoid repeated keys' — fold the three
service definitions (acme-dns, cc-ci-acme-storage-seed,
cc-ci-acme-traefik-handoff) into one services = { ... } attrset. Pure
restructure: systemd.services eval of all three units is byte-identical to
main (nix eval --json diff, all three IDENTICAL).
scripts/lint.sh now: PASS.
test_lfs_roundtrip's post-restart poll timed out on gitea 28.0.0 (PR #10 run #31):
_api() caught only HTTPError, so a single urlopen(timeout=20) socket timeout inside
the poll raised and aborted the poll itself instead of being retried; the poll also
hard-coded a 120s deadline + a 20s request timeout, contradicting the recipe's
declared HTTP_TIMEOUT=600 (tests/STYLE.md §5-sized for the warm custom tier; the
28.0.0 boot runs a longer migration window than 1.27.3).
Fix, assertion untouched (§3):
- _api() is never-raising like lifecycle.http_fetch: transient URLError/socket
timeout/OSError -> (0, {}) so the bounded poll simply retries (each request still
bounded at 20s; the poll's deadline is what bounds the wait).
- poll deadline derives from recipe_meta.HTTP_TIMEOUT (600) instead of a hard-coded
120, probing the same /api/v1/version path recipe_meta.READY_PROBE declares.
Evidence: gitea 28.0.0 dev deploy converged + served /api/healthz and /version
(gitea-upgrade-2026-10-02.md 2b); the RED run #31 failed only in this poll while
install/upgrade/backup/restore and every other custom test passed.