Newsletter reconciliation · 24 Oct 2026 · executed local fixture
Two newsletters: a local check that holds opt-outs
An executed Python-standard-library check compared nine invented identities across newsletters A and B. The independently specified baseline expected 3 conditional slots and 15 no-send slots; the checker returned exactly that, with no baseline invariant failure. Four planted unsafe target proposals were rejected. This is a fictional mapping test, not a Listmonk migration, send test or permission finding.
What the baseline held
| Invented group | A observed | B observed | Decisive fixture reason |
|---|---|---|---|
| C01 | Conditional | No-send | A evidence token; B source unsubscribe |
| C02 | No-send | Conditional | A source unsubscribe; B evidence token |
| C03 | No-send | No-send | Global hard bounce outranks earlier confirmations |
| C04 | No-send | No-send | A confirmation pending; B absent |
| C05 | No-send | No-send | Normalized duplicate with contradictory A states at the same sequence |
| C06 | No-send | No-send | A says confirmed but has no permission locator; B absent |
| C07 | No-send | No-send | Later target A unsubscribe; B absent |
| C08 | No-send | No-send | Old and new addresses have no verified identity link |
| C09 | Conditional | No-send | A evidence token; later cutover B unsubscribe |
C05 and C08 are held as entire groups. The labels C01–C09 were supplied, not inferred from names; only C05's same-address rows use trim-and-lowercase normalization. Sequence integers order events only inside this complete invented fixture.
Expected versus observed unsafe proposals
| Proposed case | Expected failure | Observed | Exit |
|---|---|---|---|
unsafe_global | C03 globally active despite hard bounce; A confirmed | Both exact diagnostics | 2 |
unsafe_list | C01 B confirmed despite source opt-out | Exact diagnostic | 2 |
unsafe_target | C07 A confirmed despite later target opt-out | Exact diagnostic | 2 |
unsafe_cutover | C09 B confirmed despite later cutover opt-out | Exact diagnostic | 2 |
The baseline exited 0. All four unsafe cases exited 2 by design; no unexpected mismatch occurred in these five specified cases. That does not show behavior on arbitrary malformed or incomplete exports.
Reproduce the local comparison
Download the invented fixture, independently hand-authored expected output, checker, tests and recorded command output into one directory. Rename the script files checker.py and test_checker.py, and the JSON inputs fixture.json and expected-output.json to run the recorded commands:
python3 -m unittest discover -s . -p 'test_checker.py' -v
for c in baseline unsafe_global unsafe_list unsafe_target unsafe_cutover; do
python3 checker.py --fixture fixture.json --case "$c"
doneObserved Python version: 3.11.2. Three unit tests passed and the suite exited 0. The baseline case exited 0; each unsafe case exited 2. The tests compare parsed output against the separately written expected object and reject an unknown case name. The output download retains the full stdout and exit codes. The code reads local JSON and writes diagnostics only: no network, database, API, mail transport, package install, live contact or credential was used.
Fixture boundary versus Listmonk behavior
The proposed target JSON is diagnostic input, not a Listmonk import file or API command. The checker treats proposed confirmed as potentially sendable and fails a no-send row in that state; it also fails a hard-bounced identity proposed as globally active. It does not model Listmonk opt-in modes or execute a recipient query. The prior 16 October source audit inspected Listmonk v6.2.0 tagged campaign recipient and upsert queries. Those are source-code evidence, not evidence that this fixture exercised Listmonk.
An evidence token here is merely an assumed locator: the check cannot establish permission scope, authenticity or lawful basis. It cannot prove source inventory completeness, real chronology, destination collision behavior, rollback, unsubscribe delivery, bounce ingestion, provider outcome or replay. A real migration would need complete source and target-overlap records, authoritative cutover events, a sender kept inert during comparison, and exact-version destination read-back before any sending decision. Mailchimp export documentation describes export options; it is not evidence that any actual export is complete.