claim(mailu): M2 — DEFERRED closed; PARITY.md updated with dual-volume evidence; operator summary written; PR#3 open for merge; awaiting Adversary fresh re-trigger
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is passing

This commit is contained in:
autonomic-bot
2026-06-11 21:03:51 +00:00
parent 73ea239cfc
commit b17b6f1232
3 changed files with 100 additions and 74 deletions

View File

@ -36,10 +36,20 @@ service (`/data` — sqlite DB) and `imap` service (`/mail` — Maildir), making
at the PR head.
cc-ci tests (all in `tests/mailu/`):
- `ops.py``pre_backup`: seeds `citest@<domain>` via `flask mailu user`; `pre_restore`: deletes
it via sqlite3 Python to simulate data loss.
- `test_backup.py` — asserts `citest@<domain>` is in `config-export` at backup time.
- `test_restore.py` — asserts `citest@<domain>` is back in `config-export` after restore.
- `ops.py``pre_backup`: seeds `citest@<domain>` via `flask mailu user` + injects a uniquely-tagged
message (`ccci-backup-probe`) into the INBOX via `sendmail` in the smtp container → verified with
`doveadm search` in the imap container. `pre_restore`: (1) deletes the account from sqlite via
Python; (2) `rm -rf /mail/<domain>/citest` in the imap container to wipe the Maildir — both
volumes are wiped independently so each must be restored to pass.
- `test_backup.py` — two tests: `test_backup_captures_mailbox` asserts `citest@<domain>` is in
`config-export` at backup time (SQLite `/data`); `test_backup_captures_mail_message` asserts the
`ccci-backup-probe` message is in INBOX (Maildir `/mail`).
- `test_restore.py` — two tests: `test_restore_returns_mailbox` asserts the account is back in
`config-export` after restore (SQLite `/data`); `test_restore_returns_mail_message` asserts the
`ccci-backup-probe` message is back in INBOX (Maildir `/mail`).
Both volumes (`/data` SQLite + `/mail` Maildir) are specifically seeded, independently wiped, and
verified restored — proven in drone build #477 (all four backup/restore tests PASS, L5).
Auto-detected: `generic.backup_capable()` scans the compose.yml for `backupbot.backup.*true` and
returns `True` at the PR head — no `BACKUP_CAPABLE` override needed in `recipe_meta.py`.