• v0.25.1 b42b6a586a

    0.25.1 — M4 verified live
    All checks were successful
    CI / gate (push) Successful in 1m22s
    CI / image (push) Successful in 13s
    Stable

    joeyr released this 2026-08-20 16:30:01 -05:00 | 35 commits to main since this release

    0.25.0 shipped folder administration with the one thing that mattered untested, and said so. This closes it. No behaviour changed — the probe found nothing to fix, which is worth recording as plainly as a defect would have been.

    probes/m4_verify.py, 27 checks through the tool layer against the real mailbox. Scratch folders only; INBOX is not in the allowlist the script builds.

    The condition the phase owed

    A rename must invalidate outstanding handles loudly, not silently. A green suite could not answer that — the fake renames a folder in a dict, so a stale handle fails there by construction. Both halves held live:

    • A handle read before the rename comes back as an error naming the folder it could not open. Not a message, and not an empty result.
    • With a new folder deliberately created at the old name and a different message inside it, the stale handle still refuses. Two independent things stop it: iCloud issues the reused name a fresh UIDVALIDITY (observed 17453722531745372267 on a name reused seconds later), and the handle's own UIDVALIDITY check refuses before any fetch.

    That second case is the one the probe was really built for. A message_id carries (folder, UIDVALIDITY, uid), so a colliding UIDVALIDITY on a reused name would have let an old handle resolve to a different message — every guard downstream reasoning about the wrong one. It does not occur.

    Also confirmed

    Each of these is a claim a tool description makes to the user:

    • A created folder is invisible to list_folders until MAIL_FOLDERS names it.
    • A rename carries the folder's messages with it; a duplicate create is refused.
    • Deleting the trash folder is refused as protected.
    • delete_folder without a count refuses and reports the real number; a wrong count and a wrong expected_name each refuse, and none of the three refusals removed anything.
    • The deleted folder's messages do not go to trash. Searched for afterwards and absent — the one thing separating this from delete_message, and the reason its guards are heavier.

    On probing a safety check

    The protected-folder check passes a deliberately impossible expected_message_count alongside, and the rename half names a destination outside the allowlist. Two independent guards would both have to be broken before the probe could touch anything real. A probe that verifies a safety check must not be the thing that fires when the check is missing.

    Write-up in docs/operations.md beside M1's and M2's. docs/icloud-mail-plan.md is down to M3. 969 tests green.

    Downloads