de4cc26cdb
The unit tests all fake the process boundary, so the class of failure that actually broke this project — container wiring: chroot vs DNS, milter socket permissions, the SASL realm, the Postfix reload path, cap_add — is invisible to them. Record the decision to close it with a hermetic containerised e2e: a separate Go module under test/e2e/, driven against the shipped compose file plus an override, with a fake DNS zone and an smtp-sink standing in for the outside world. It runs before tagging (make e2e on the dev server, plus workflow_dispatch) and gates image publication on the tag itself, which pulls release.yml off qemu onto a native amd64/arm64 matrix: build, test, push per-arch tags, merge the manifest — so the bytes published are the bytes that were tested. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>