All three essential todo items completed.
Added _run_errors list to MyDavidLloydSchedule.py. Cleared at start of process_dl_mails. Populated by _gcal(), _gcal_create, _gcal_update, _gcal_delete on failure (deduplicated). Yellow warning banner injected into bookings HTML when non-empty.
Created tests/fixtures/ with 5 real .eml files extracted from ~/.email3.mail.gdbm. Extraction script at tests/save_fixtures.py. New test file tests/test_dl_email_parsing.py with 5 tests (all passing). Also fixed dl_email.py CANCEL_RE to add confirm cancellation and cancellation confirmation phrases (found gap via test).
Copied webdav_deliver.py from envoy into popit3. Rewrote mailspool.py to create its own WebDAV client from netrc (same pattern as WebDAVDelivery) — no longer needs a pre-built client passed in. New interface: MailSpool(maildir_path, webdav_host=, webdav_path=, delete=). Updated commented-out instantiations in process_emails.py to match new interface. Removed create_webdav_client_with_retry dead code.