# Decisions Mailing List Routing Report

Date: 2026-07-04

Source: `decisions.json`

Purpose: interpret `decisions.json` as the user intent for mailing-list handling and translate it into mailbox structure proposals.

## Summary

`decisions.json` contains 185 sender/list decision entries:

- `h` ("houden"): 95 entries, 2,762 messages.
- `a` ("afmelden"): 89 entries, 2,683 messages.
- `s`: 1 entry, 26 messages.

The sorter still does not read `decisions.json` directly. The decisions have been normalized into `mailinglist_routes.json`, which is now loaded by `mail_routes.py` for routing and destination-folder generation.

The normalized policy contains 153 grouped rules and covers every key in `decisions.json` through `source_decision_keys`.

## Interpretation

Recommended interpretation:

- `keuze: "h"` means keep the list and route it to a normal functional mailbox.
- `keuze: "a"` means isolate it under `Afmelden`, so it can be reviewed/unsubscribed without polluting normal destination folders.
- `keuze: "s"` is ambiguous. Treat it as "separate/review" until confirmed; for now it should be kept in a functional mailbox or a review mailbox, not under `Afmelden`.

For `Afmelden`, use a separate top-level tree:

- `INBOX.Afmelden.<Category>.<Organization>`

Do not place final folders under `Archief`.

## Combined Groups

The following entries should be combined because they appear to come from the same organization/person even when domains differ:

- Coursera: `coursera.org`, `email.coursera.org`, `m.mail.coursera.org`, `m.learn.coursera.org`.
- MIT Technology Review: `technologyreview.com`, `fulfillment.technologyreview.com`.
- Eva Keiffenheim: `evakeiffenheim.com`, `eva keiffenheim s lifelong learning club`, `eva keiffenheim from the learn letter`, and their `substack.com` transport.
- KPN: `kpn.com`, `campagnes.kpn.com`.
- PostNL: `postnl.nl`, `notificatie.postnl.nl`, `edm.postnl.nl`.
- STRATO: `strato.com`, `news.strato.com`, `marketingradar.strato.com`.
- Unive: `nieuwsbrief.unive.nl` and any future `unive.nl`.
- ICS: `icsmarketing.icscards.nl` and any future `icscards.nl`/`service.icscards.nl`.
- Viking: `delivery.vikingdirect.nl`, `online.vikingdirect.nl`, and any future `vikingdirect.nl`.
- bol: `bol.com`, `feedback.bol.com`.
- Coolblue: `coolblue.nl`, `coolblue.eu`.
- Vodafone: split by intent: keep `zakelijk.vodafone.nl` in normal telecom, but place `vodafone.nl` under `Afmelden` because it is marked `a`.
- Sophos/Cleverbridge: `home.sophos.com`, `cleverbridge.com`.
- Forte Labs/BASB: `fortelabs.co`, `fortelabs.com`.
- CIONET: `mn.co`, `cionet.com`.
- Gusti: `gusti-leer.nl`, `gusti-leder.de`, `gusti-pelle.it`.
- Nord: `nordvpn.com`, `nordpass.com`.
- DHL: split by intent: keep `dhlparcel.nl`, but place `dhlecommerce.nl` under `Afmelden` because it is marked `a`; `proxy.privault.rpip.nl` should be treated as DHL if retained.
- Proton: `proton.me`, `notify.proton.me`, `mail.proton.me`.
- Vonage/Nexmo: `vonage.com`, `insights.vonage.com`, `nexmo.com`.
- Visme: `accounts.visme.com`, `visme.co`.
- ClickUp: `clickup.com`, `team.wrike.com` are not the same organization; keep separate.
- Pleio/IBDS: `pleio.nl`, `mail.pleio.nl`.

## Keep: Proposed Functional Mailboxes

These `h` entries should be routed to normal destination folders.

| Proposed mailbox | Entries/domains | Count | Notes |
| --- | --- | ---: | --- |
| `INBOX.Nieuwsbrieven.Leren.Coursera` | `coursera.org`, `email.coursera.org`, `m.mail.coursera.org`, `m.learn.coursera.org` | 492 | Already mostly represented in `mail_routes.py`; zero-count aliases should remain aliases. |
| `INBOX.Nieuwsbrieven.Leren.Storytelling with Data` | `storytellingwithdata.com` | 319 | Already represented. |
| `INBOX.Nieuwsbrieven.Leren.MIT Technology Review` | `technologyreview.com`, `fulfillment.technologyreview.com` | 287 | Already represented. |
| `INBOX.Nieuwsbrieven.Overig.Lendahand` | `lendahand.com` | 256 | Already represented. |
| `INBOX.Nieuwsbrieven.Leren.Eva Keiffenheim` | `evakeiffenheim.com`, Keiffenheim Substack entries via `substack.com` | 204 | Needs sender-name or List-ID handling for Substack; domain-only routing is insufficient. |
| `INBOX.Nieuwsbrieven.Overig.The Good Roll` | `thegoodroll.nl` | 89 | Already represented. |
| `INBOX.Mobiliteit.EV.Eneco eMobility` | `eneco-emobility.com`, `eneco.nl` | 96 | Already represented. |
| `INBOX.Nieuwsbrieven.Leren.Nick Milo` | `linkingyourthinking.com` | 76 | Already represented. |
| `INBOX.Mobiliteit.OV & Reizen.NS` | `ns.nl`, `email.ns.nl` | 63 | Already represented. |
| `INBOX.Werk.Opdrachten.OneStopSourcing` | `onestopsourcing.nl` | 51 | Already represented. |
| `INBOX.Nieuwsbrieven.Leren.AI Report` | `beehiiv.com`, `mail.beehiiv.com` | 39 | Already represented by domain aliases. |
| `INBOX.Werk.Opdrachten.Flextender` | `flextender.nl` | 37 | Already represented. |
| `INBOX.Financieel.Verzekering.Unive` | `nieuwsbrief.unive.nl` | 37 | Existing route uses `Univé`; prefer ASCII folder spelling if normalizing new folder names. |
| `INBOX.Financieel.Bank.ICS` | `icsmarketing.icscards.nl` | 36 | Already represented with aliases. |
| `INBOX.Nieuwsbrieven.Nieuws & Vakbladen.Vakblad Crisismanager` | `crisismanager.nl` | 35 | Already represented. |
| `INBOX.Diensten.Software.CogSci Apps` | `cogsciapps.com` | 33 | Already represented. |
| `INBOX.Nieuwsbrieven.Leren.Ben Tiggelaar` | `tiggelaar.nl` | 31 | Already represented. |
| `INBOX.Werk.Opdrachten.IMMENS` | `immens.nu` | 30 | Already represented. |
| `INBOX.Financieel.Bank.ABN AMRO` | `nl.abnamro.com` | 26 | Already represented; include `abnamro.nl` alias. |
| `INBOX.Bestellingen.PostNL` | `postnl.nl`, `notificatie.postnl.nl`, `edm.postnl.nl` | 48 | Already represented; zero-count alias should remain. |
| `INBOX.Bestellingen.123inkt` | `123inkt.nl`, `m.123inkt.nl` | 24 | Already represented; zero-count alias should remain. |
| `INBOX.Bestellingen.DHL` | `dhlparcel.nl`, `proxy.privault.rpip.nl` | 25 | Keep parcel notifications; do not merge with `dhlecommerce.nl` because that entry is marked `a`. |
| `INBOX.Diensten.Hosting.STRATO` | `strato.com`, `news.strato.com`, `marketingradar.strato.com` | 27 | Already represented. |
| `INBOX.Diensten.Telecom.Vodafone` | `zakelijk.vodafone.nl` | 20 | Keep business Vodafone; consumer `vodafone.nl` is marked `a`. |
| `INBOX.Diensten.Software.Formspree` | `formspree.io` | 19 | New functional folder. |
| `INBOX.Diensten.Telecom.KPN` | `campagnes.kpn.com`, `kpn.com` | 22 | Already represented. |
| `INBOX.Diensten.Hosting.Lets Encrypt` | `letsencrypt.org` | 16 | Already represented. |
| `INBOX.Diensten.Backup.Backblaze` | `backblaze.com` | 14 | Existing route is `Diensten.Hosting.Backblaze`; consider `Diensten.Backup.Backblaze`. |
| `INBOX.Nieuwsbrieven.Leren.Brian Keating` | `briankeating.com` | 14 | Already represented. |
| `INBOX.Werk.Opdrachten.Get There` | `getthere.nl` | 13 | Already represented. |
| `INBOX.Werk.Opdrachten.Jamie` | `hey.meetjamie.ai` | 13 | Already represented. |
| `INBOX.Werk.Opdrachten.Huckr` | `huckr.ai` | 13 | Already represented. |
| `INBOX.Nieuwsbrieven.Leren.MIT Open Learning` | `mit.edu` | 13 | Already represented. |
| `INBOX.Bestellingen.Allekabels` | `allekabels.nl` | 10 | Already represented. |
| `INBOX.Mobiliteit.OV & Reizen.Booking` | `booking.com` | 10 | Already represented. |
| `INBOX.Diensten.Software.Sophos` | `cleverbridge.com`, `home.sophos.com` | 12 | Already represented. |
| `INBOX.Mobiliteit.EV.FastNed` | `fastned.nl` | 9 | Already represented. |
| `INBOX.Mobiliteit.EV.OPnGO` | `opngo.com` | 9 | Already represented. |
| `INBOX.Mobiliteit.EV.Tesla` | `tesla.com` | 9 | Already represented. |
| `INBOX.Diensten.Software.Cursor` | `cursor.com` | 8 | Already represented. |
| `INBOX.Diensten.Software.1Password` | `1password.com` | 7 | Already represented. |
| `INBOX.Bestellingen.Viking` | `delivery.vikingdirect.nl`, `online.vikingdirect.nl` | 13 | Already represented; include `vikingdirect.nl` alias. |
| `INBOX.Diensten.Software.Matter` | `getmatter.com` | 7 | Already represented. |
| `INBOX.Werk.Overig.Gemeente Groningen` | `groningen.nl`, `groningenbereikbaar.nl` | 10 | Already represented. |
| `INBOX.Financieel.Verzekering.VEZA` | `heinenoord.nl` | 7 | Already represented. |
| `INBOX.Diensten.Software.Kahoot` | `team.kahoot.com` | 7 | Already represented. |
| `INBOX.Diensten.Hosting.TransIP` | `transip.nl` | 7 | Already represented. |
| `INBOX.Diensten.Software.Indigo Neo` | `indigoneo.com` | 6 | New functional folder. |
| `INBOX.Bestellingen.Office Centre` | `officecentre.nl` | 6 | Already represented. |
| `INBOX.Mobiliteit.EV.Shell Recharge` | `shellrecharge.com` | 6 | Already represented. |
| `INBOX.Bestellingen.Smartphonehoesjes` | `smartphonehoesjes.nl` | 6 | Already represented. |
| `INBOX.Werk.Overig.BOIP` | `boip.int` | 5 | Already represented. |
| `INBOX.Nieuwsbrieven.Leren.Elizabeth Butler` | `elizabethbutlermd.com` | 5 | Already represented. |
| `INBOX.Bestellingen.bol` | `bol.com`, `feedback.bol.com` | 9 | Already represented. |
| `INBOX.Mobiliteit.OV & Reizen.Flitsmeister` | `flitsmeister.nl` | 5 | Already represented. |
| `INBOX.Werk.Opdrachten.FutureXL` | `futurexl.nl` | 5 | Already represented. |
| `INBOX.Financieel.Bank.NPEX` | `npex.nl` | 5 | Already represented. |
| `INBOX.Nieuwsbrieven.Nieuws & Vakbladen.The Presentation Guru` | `presentation-guru.com` | 5 | Already represented. |
| `INBOX.Bestellingen.Sligro` | `sligro.nl` | 5 | Already represented. |
| `INBOX.Financieel.Bank.SnelStart` | `snelstart.nl` | 5 | Already represented. |
| `INBOX.Financieel.Bank.Tellow` | `tellow.nl` | 5 | Already represented. |
| `INBOX.Bestellingen.Coolblue` | `coolblue.nl`, `coolblue.eu` | 7 | Already represented. |
| `INBOX.Nieuwsbrieven.Nieuws & Vakbladen.Computable` | `jaarbeurs.nl` | 4 | Already represented. |
| `INBOX.Diensten.Software.Microsoft Teams` | `microsoft365.com` | 4 | Already represented. |
| `INBOX.Mobiliteit.EV.Mitsubishi` | `mmsn.nl` | 4 | Already represented. |
| `INBOX.Diensten.Software.Claude` | `claude.com` | 3 | Already represented. |
| `INBOX.Bestellingen.Makro` | `makro.nl` | 3 | Already represented. |
| `INBOX.Diensten.Software.MindNode` | `mindnode.com` | 3 | Already represented. |
| `INBOX.Diensten.Netwerk.Netherfind` | `netherfind.com` | 3 | New functional folder. |
| `INBOX.Diensten.Software.Papers` | `papersapp.com` | 3 | Already represented. |
| `INBOX.Diensten.Software.Perplexity` | `perplexity.ai` | 3 | Already represented. |
| `INBOX.Diensten.Email.Proton` | `mail.proton.me` | 0 | Zero-count keep alias; useful only if future Proton keep-routing is desired. |

## Afmelden: Proposed Mailboxes

These `a` entries should be routed below `INBOX.Afmelden`.

| Proposed mailbox | Entries/domains | Count | Notes |
| --- | --- | ---: | --- |
| `INBOX.Afmelden.Netwerken.ResearchGate` | `researchgatemail.net` | 674 | Highest-volume unsubscribe candidate. |
| `INBOX.Afmelden.Fitness.STARS Personal Training` | `virtuagym.com` | 413 | Includes S.T.A.R.S via Virtuagym. |
| `INBOX.Afmelden.Netwerken.LinkedIn` | `linkedin.com` | 363 | High-volume unsubscribe candidate. |
| `INBOX.Afmelden.Nieuws.Het Financieele Dagblad` | `messagent.fdmediagroep.nl` | 108 | FD Techzaken/news. |
| `INBOX.Afmelden.Werk.FixedToday` | `fixedtoday.nl` | 97 | Armand/FixedToday. |
| `INBOX.Afmelden.Werk.Centre of Excellence Data Sharing Cloud` | `coe-dsc.nl` | 78 | Combine spelling variants. |
| `INBOX.Afmelden.Netwerken.CIONET` | `mn.co`, `cionet.com` | 83 | Same organization. |
| `INBOX.Afmelden.Winkels.Gusti` | `gusti-leer.nl`, `gusti-leder.de`, `gusti-pelle.it` | 88 | Same brand across country domains. |
| `INBOX.Afmelden.Leren.Forte Labs` | `fortelabs.co`, `fortelabs.com` | 76 | Same organization; current old folder `BASB` should be treated as source if unsubscribing. |
| `INBOX.Afmelden.Telecom.Vonage` | `vonage.com`, `insights.vonage.com`, `nexmo.com` | 50 | Same company/product family. |
| `INBOX.Afmelden.Beveiliging.Nord` | `nordvpn.com`, `nordpass.com` | 40 | Same vendor. |
| `INBOX.Afmelden.Bestellingen.DHL eCommerce` | `dhlecommerce.nl` | 29 | Do not merge with kept `dhlparcel.nl` unless user changes decision. |
| `INBOX.Afmelden.Leren.Taproot` | `taproot.com` | 27 | Anne Roberts/Taproot. |
| `INBOX.Afmelden.Productiviteit.Readwise` | `readwise.io` | 22 | Note historical overlap with Eva Keiffenheim sender names. |
| `INBOX.Afmelden.Leren.Scrimba` | `scrimba.com` | 21 | Coding education. |
| `INBOX.Afmelden.Software.Kilo Code` | `kilocode.ai` | 18 | Development tool. |
| `INBOX.Afmelden.Werk.Jooble` | `nl.jooble.org` | 18 | Job alerts. |
| `INBOX.Afmelden.Werk.Pleio IBDS` | `pleio.nl`, `mail.pleio.nl` | 18 | Combine real and alias domain. |
| `INBOX.Afmelden.Leren.FUN MOOC` | `fun-mooc.fr` | 17 | Course platform. |
| `INBOX.Afmelden.Software.Stackfield` | `stackfield.help` | 17 | Collaboration software. |
| `INBOX.Afmelden.Werk.De Staffing Groep` | `destaffinggroep.nl` | 16 | Work/recruitment. |
| `INBOX.Afmelden.Leren.Kaggle` | `kaggle.com` | 16 | Learning/data platform. |
| `INBOX.Afmelden.Diensten.Proton` | `proton.me`, `notify.proton.me` | 19 | Do not merge with zero-count keep alias without clarification. |
| `INBOX.Afmelden.Software.Genially` | `genially.com` | 14 | Presentation/creative software. |
| `INBOX.Afmelden.Backup.IDrive` | `idrive.com` | 14 | Backup service. |
| `INBOX.Afmelden.Projectmanagement.PMRGI` | `oppmi.com` | 14 | Project management resource group. |
| `INBOX.Afmelden.Energie.Zelf Energie Produceren` | `zelfenergieproduceren.nl` | 13 | Energy. |
| `INBOX.Afmelden.Software.Nuclino` | `nuclino.com` | 12 | Knowledge base software. |
| `INBOX.Afmelden.Apparaten.reMarkable` | `remarkable.com` | 12 | Device/vendor. |
| `INBOX.Afmelden.Software.Olares` | `olares.com` | 11 | Software/service. |
| `INBOX.Afmelden.Schrijven.Schrijf.be` | `schrijf.be` | 11 | Writing/training. |
| `INBOX.Afmelden.Software.VMware` | `connect.vmware.com` | 10 | VMware marketing. |
| `INBOX.Afmelden.Software.Audiogest` | `loops.audiogest.app` | 10 | Software/service. |
| `INBOX.Afmelden.Software.SmallCubed` | `smallcubed.com` | 10 | Software vendor. |
| `INBOX.Afmelden.Energie.Energie Collectief Nederland` | `titanomon.com` | 10 | Energy. |
| `INBOX.Afmelden.Telecom.Vodafone` | `vodafone.nl` | 10 | Consumer Vodafone; separate from kept business Vodafone. |
| `INBOX.Afmelden.Mobiliteit.Fulli` | `fulli.com` | 9 | Travel/toll service. |
| `INBOX.Afmelden.Advertenties.Google Ads` | `google.com` | 9 | Ads/marketing. |
| `INBOX.Afmelden.Software.Saga` | `saga.so` | 9 | Software/service. |
| `INBOX.Afmelden.Financieel.Triodos` | `triodos.nl` | 9 | Bank marketing. |
| `INBOX.Afmelden.Software.TurboScribe` | `turboscribe.ai` | 9 | Transcription service. |
| `INBOX.Afmelden.Financieel.bunq` | `bunq.com` | 8 | Bank marketing. |
| `INBOX.Afmelden.Winkels.Airo Paradise` | `ekwb.nl` | 8 | Retail/vendor. |
| `INBOX.Afmelden.Software.Parallels` | `parallels-universe.com` | 8 | Software vendor. |
| `INBOX.Afmelden.Leren.OReilly` | `et.oreilly.com` | 7 | Learning/publisher. |
| `INBOX.Afmelden.Software.Visme` | `accounts.visme.com`, `visme.co` | 9 | Same vendor. |
| `INBOX.Afmelden.Winkels.De Vulpenwereld` | `devulpenwereld.nl` | 6 | Retail. |
| `INBOX.Afmelden.Privacy.Incogni` | `incogni.com` | 6 | Privacy service. |
| `INBOX.Afmelden.Software.Smartsheet` | `smartsheet.com` | 6 | Software. |
| `INBOX.Afmelden.Netwerken.YourConnector` | `yourconnector.nl` | 6 | Networking/business. |
| `INBOX.Afmelden.Software.Zapier` | `zapier.com` | 6 | Software. |
| `INBOX.Afmelden.Software.ClickUp` | `clickup.com` | 5 | Software. |
| `INBOX.Afmelden.Presenteren.Duarte` | `duarte.com` | 5 | Presentation/training. |
| `INBOX.Afmelden.Winkels.PrintAbout` | `printabout.nl` | 5 | Retail. |
| `INBOX.Afmelden.Cloud.Microsoft Azure` | `promomail.microsoft.com` | 5 | Azure promotions. |
| `INBOX.Afmelden.Productiviteit.Tana` | `tana.inc` | 5 | Productivity software. |
| `INBOX.Afmelden.Leren.TIAS` | `tias.edu` | 5 | Education. |
| `INBOX.Afmelden.Media.VALUE IPTV VOD` | `weblinux.de` | 5 | Media/service. |
| `INBOX.Afmelden.Productiviteit.Capacities` | `capacities.io` | 4 | Productivity software. |
| `INBOX.Afmelden.Nieuws.Computable Enigma Research` | `enigmaresearch.nl` | 4 | Related to Computable but marked unsubscribe. |
| `INBOX.Afmelden.Winkels.Euroflorist` | `euroflorist.nl` | 4 | Retail. |
| `INBOX.Afmelden.Financieel.IEX Cloud` | `iexcloud.io` | 4 | Finance/API. |
| `INBOX.Afmelden.Diensten.Jetpack` | `jetpack.com` | 4 | WordPress/Automattic service. |
| `INBOX.Afmelden.Software.Linearity` | `linearity.io` | 4 | Design software. |
| `INBOX.Afmelden.Software.LiquidText` | `liquidtext.net` | 4 | Software. |
| `INBOX.Afmelden.Software.MURAL` | `mural.co` | 4 | Software. |
| `INBOX.Afmelden.Winkels.Office Noord` | `officenoord.nl` | 4 | Office retail. |
| `INBOX.Afmelden.Presenteren.Prezent` | `prezent.ai` | 4 | Presentation software. |
| `INBOX.Afmelden.Projectmanagement.Wrike` | `team.wrike.com` | 4 | Software. |
| `INBOX.Afmelden.Mobiliteit.Alfen` | `alfen.com` | 3 | Marked unsubscribe, despite current active route keeping Alfen under EV. Needs policy decision. |
| `INBOX.Afmelden.Productiviteit.GRID` | `gridnewsletter.com` | 3 | Productivity/newsletter. |
| `INBOX.Afmelden.Legal.Henchman` | `henchman.io` | 3 | Legal software. |
| `INBOX.Afmelden.Presenteren.Pitch` | `hi.pitch.com` | 3 | Presentation software. |
| `INBOX.Afmelden.Wonen.How To Buy A Home` | `howtobuyahome.com` | 3 | Real estate/education. |
| `INBOX.Afmelden.Leren.Kodeco` | `kodeco.com` | 3 | Learning platform. |
| `INBOX.Afmelden.Nieuws.Medium` | `medium.com` | 3 | Publishing platform. |
| `INBOX.Afmelden.Productiviteit.MindMeister` | `mindmeister.com` | 3 | Productivity software. |
| `INBOX.Afmelden.Fitness.NEXT Personal Gym` | `next-sports.nl` | 3 | Fitness. |
| `INBOX.Afmelden.Projectmanagement.TeamGantt` | `teamgantt.com` | 3 | Project management software. |

## Separate/Review

`circle8.nl` is marked `s` with 26 messages.

Recommended temporary mailbox:

- `INBOX.Werk.Opdrachten.Circle8`

Reason: Circle8 is already present as a work/opportunity route in `mail_routes.py`. The meaning of `s` should be confirmed before moving it under `Afmelden`.

## Conflicts With Current Routes

These decisions conflict with the current hardcoded route table or expose incomplete routing:

- `researchgatemail.net` is a high-volume `a` decision but has no active route, so it currently remains in place.
- Keiffenheim Substack messages are `h` but cannot be routed by domain alone because `substack.com` is shared. Need List-ID, sender address, or display-name matching.
- `fortelabs.co`/`fortelabs.com` are marked `a`, but old mailbox naming suggests they may currently live under `INBOX.Mailinglists.BASB`; they should not become a normal final folder if the decision is to unsubscribe.
- `alfen.com` is in the current active EV route but is marked `a` in `decisions.json`. This should be resolved before applying generated routes.
- `vodafone.nl` is marked `a`, while `zakelijk.vodafone.nl` is marked `h`. The route table currently maps both consumer and business Vodafone into `Diensten.Telecom.Vodafone`; this should be split.
- `dhlecommerce.nl` is marked `a`, while `dhlparcel.nl` is marked `h`. The route table currently maps both to `Bestellingen.DHL`; this should be split.
- `proton.me` and `notify.proton.me` are marked `a`, but `mail.proton.me` is a zero-count `h` placeholder. Keep these separate until the user clarifies.

## Plan To Add This Structure

1. Introduce a structured policy file generated from `decisions.json`. Done.
   - Suggested file: `mailinglist_routes.json`.
   - Fields: `action`, `mailbox`, `domains`, `from_contains`, `source_decision_keys`, `notes`.
   - Do not make `decisions.json` itself the runtime file; it contains unsubscribe URLs and analysis artifacts.

2. Extend `mail_routes.py` to load mailing-list policy. Done for domain and `From` substring matching.
   - Keep `DOMAIN_ROUTES` for stable functional/business mail.
   - Add a runtime lookup for generated mailing-list rules.
   - Support domain matching, exact sender address matching, display-name matching, and List-ID/header matching.

3. Add `Afmelden` to destination folder creation. Done through `destination_folders()`.
   - `maak_mappen.py` should create all `INBOX.Afmelden.*` folders from the generated policy.
   - Existing `destination_folders()` should include both functional keep folders and unsubscribe review folders.

4. Update routing precedence. Done for invoice, mailing-list policy, then legacy domain fallback.
   - Invoice keyword routing should remain first.
   - Exact/list-specific mailing-list rules should run before broad domain rules, especially for shared senders such as `substack.com`.
   - Domain rules should remain the fallback for normal service/vendor mail.

5. Add audit output before moving.
   - Dry-run should report counts per proposed destination, including `Afmelden`.
   - It should also report unmatched `decisions.json` entries and current-route conflicts.

6. Resolve conflicts before actual execution.
   - Confirm `circle8.nl` meaning for `s`.
   - Confirm `alfen.com`, `vodafone.nl`, `dhlecommerce.nl`, and Proton split behavior.
   - Confirm whether zero-count aliases should be kept as future aliases.

7. Test only on `backup@australius.nl`.
   - Create the new folder structure in backup.
   - Run dry-run sorter on backup.
   - Review planned moves.
   - Run actual sorter only after explicit confirmation.
