io.ReadAll errors are unlikely for short yes/no replies but worth
logging for diagnosability. Processing continues with whatever bytes
were read to remain resilient.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
A search failure was logged but execution continued, silently returning
'no emails' to the caller. This masked the most likely cause of the
polling not working. Error now propagates so the caller can log and
handle it.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
log.Fatal called os.Exit from a goroutine, bypassing deferred cleanup
and crashing the process on any transient fetch error. Errors now
propagate back to the caller via a buffered channel. Also adds a drain
defer so the goroutine can always exit if the consumer returns early.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bounce messages and MAILER-DAEMON notices can have no From address,
causing a panic on the bare [0] index access.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Route all log output to AWP_LOG_FILE (from .env) if set, else stderr
- Log errors explicitly before returning so they appear in the log file
- Replace log.Fatal in fetch.go with proper error return so callers control logging
- Remove chatty success/no-op log lines that would bloat cron log files
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add missing bcc argument to NewEmail call in pkg/email/fetch.go
- Upgrade github.com/a-h/templ from v0.3.833 to v0.3.1020 to match generator
- Add player management routes (add/delete/edit) and playershandler
- Update templates and loaddata with pending changes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>