Prompts used since the previous commit: - User asked whether it is possible and feasible to create restart_prompt.md. - User requested that restart_prompt.md contain a from-scratch reconstruction prompt for the current project state. - User requested that restart_prompt.md be rewritten at every commit, not appended to. Special observations: - Added project AGENTS.md so future Codex runs know to rewrite restart_prompt.md before every commit. - restart_prompt.md is a reconstruction prompt for project state and intent; it intentionally does not contain credentials or ignored mailbox data.
5.1 KiB
Restart Prompt
You are continuing the mailcat project in /Users/hanswienen/Documents/Development/Vibes/mailcat.
Project Goal
Build a reliable mailbox cleanup and automation toolkit for australius.nl.
The project started as an offline analysis of a local mailbox export and is being moved toward an IMAP-based sorter because Sieve does not work with the email provider. The intended production model is:
- Email is hosted at
australius.nl. - A VPS is available at
vps.australius.nl. - The test mailbox is
backup@australius.nl. - The future automation should run on the VPS, preferably via SSH deployment and an IMAP IDLE daemon.
- The first end-to-end test should mirror production mail into
backup@australius.nl, then sort only the backup mailbox.
Repository State
Git workflow:
- The repo has branches
main,claude, andcodex. - Work should continue on
codexunless the user says otherwise. - Follow the user’s global workflow: initialize Git when needed, branch before work in existing repos, and commit after each user-prompted change using the required three-section commit message format.
Tracked files include Python scripts, generated reports, logs, caches, and project docs.
Ignored local data includes:
mailbox/**/*.emlconfig.json__pycache__/- bytecode files
.DS_Store
Do not commit email .eml files or credentials.
Current Decisions
Sorting policy:
INBOX.Facturen - verwerktis the only folder treated as already sorted.Sent,Drafts,Trash, andSpamare excluded from sorting.- Every other mailbox folder is treated as a source.
- Do not use
Archiefas a final destination. - Existing
Archief.*folders are source folders; route matching messages out of them into functional destination folders. - If an archived/source message does not match a rule, leave it in place.
Destination policy:
- Final destination folders are functional folders such as
Financieel,Werk,Diensten,Nieuwsbrieven,Bestellingen,Mobiliteit, andTechnisch. - Final destination folders under
Archiefshould not be created. TechnischandTechnisch.DMARCare valid destination folders.
Sieve:
mailrules.sieveexists as historical/source material.- Sieve deployment is not viable with the provider.
- Future work should move operational automation to Python over IMAP/SMTP.
Important Current Implementation Notes
verplaats_bestaand.py has already been changed so:
MAP_RENAMESis intentionally empty.- Source folders are selected by
list_source_folders(). - Excluded source folders are
Sent,Drafts,Trash, andSpam, with both bare andINBOX.names where relevant. ALREADY_SORTED_FOLDERS = {"INBOX.Facturen - verwerkt"}.- Step 2 routes all eligible source folders, not just
INBOX. - Move success now requires both
UID COPYandUID STORE +FLAGS \Deletedto returnOK. - Step 3 no longer treats
INBOX.Facturen - verwerktas a source.
maak_mappen.py has already been changed so:
- It no longer creates
Archief.*destination folders. - It creates
TechnischandTechnisch.DMARC.
Last verification performed:
python3 -m py_compile *.py- route/folder consistency check reported
missing_targets 0 - archive target check reported
archief_targets 0
Reports and Findings
The prior script review is in reports/script_review_findings.md.
Key earlier findings:
- The old redistribution script selected some source folders read-only and then tried to delete messages.
- The old logging could mark partial moves as complete.
- The old implementation only routed
INBOX. - Folder creation and route targets were inconsistent before recent fixes.
What To Do Next
Recommended next work:
-
Refactor shared IMAP utilities:
- folder list parsing
- mUTF-7 encoding/decoding
- folder creation
- UID fetch
- safe copy/delete/expunge
- Message-ID dedupe
-
Refactor shared routing logic:
- extract the route table from
verplaats_bestaand.py - support both historical sorting and live sorting from one source of truth
- preserve invoice priority and quarter-folder routing
- extract the route table from
-
Harden scripts:
kopieer_naar_backup.pyshould not mark a folder complete if append failures occurverplaats_bestaand.pyshould log failures with source folder, UID, destination, and server response- add a dry-run audit mode showing planned moves by source and destination
-
Add VPS automation:
- create an IMAP IDLE daemon for
backup@australius.nl - deploy via SSH to
vps.australius.nl - use a non-root sudo user
- install as a systemd service
- keep secrets in an ignored
config.jsonwith restrictive permissions
- create an IMAP IDLE daemon for
-
Test on
backup@australius.nlbefore production:- mirror production mail into backup
- create target folders in backup
- run dry-run sorter on backup
- run actual sorter on backup
- verify that only excluded folders and unmatched messages remain unsorted
Persistent File Rule
Before every future commit in this project, rewrite this restart_prompt.md file so it describes the current state at that commit. Do not append. Replace the content with a fresh, accurate reconstruction prompt.