• v0.28.1 da11020843

    0.28.1 — M3 verified live, and the draft that was destroying itself
    All checks were successful
    CI / gate (push) Successful in 1m26s
    CI / image (push) Successful in 15s
    Stable

    joeyr released this 2026-08-20 22:27:36 -05:00 | 30 commits to main since this release

    M3's live pass ran, and it found something 1082 unit tests had not.

    Probe 6 is answered: submission delivers. 36 checks through the tool layer via probes/m3_verify.py on 2026-08-20, written up in docs/operations.md under Sending (M3). Every message was self-addressed — which is what makes the probe safe to re-run, and also bounds what it proves: delivery through the account, not to a third-party MX.

    Fixed

    • send_draft expunged the draft even when the Sent copy had failed, destroying the only surviving record of a message that had already been delivered and could not be retrieved from anywhere.

      The plan's rule was "do not expunge until both the send and the append have returned", and the code honoured it literally — but returning is not succeeding, and with no Sent copy that draft was the last thing holding what the user had written. The draft is now expunged only when a second copy actually exists: leaving a stale draft costs a deletion, expunging this one costs the message. The response distinguishes kept on purpose from could not be removed, because they are different sentences to the user, and both say the mail has gone either way.

      Found by writing the live checklist before the probe and noticing the code disagreed with it. No unit test could have — the fake and the code shared the assumption, which is this project's oldest failure mode and the third time a probe rather than the suite has caught it.

    What the pass confirmed

    • The gate runs before SMTP: with the Sent folder unwritable the send refuses, reports no send verdict, and nothing is delivered.
    • sent: true, saved_to_sent: false is reachable and reports honestly — the message really did arrive, and the note leads with delivery and says not to resend.
    • expected_recipients guards the reply-all three ways; the refusal says not to resubmit with the computed list.
    • send_draft is four ordered steps, and refuses an INBOX handle — the call that would mail a received message onward to its original recipients.
    • The APPENDUID handle resolves with get_message immediately, to the copy in Sent. The shape iCloud actually returns is now on the record rather than inferred from the RFC.

    Notes

    • docs/icloud-mail-plan.md is deleted. Every phase it tracked has shipped and been verified.
    • On this run SEARCH did find the just-appended Sent copy, where probe 4 had found the index lagging. Recorded rather than acted on — the code never searches, and one run is not a reason to simplify the handle away.
    • Still unverified, deliberately: delivery to a third-party MX, Bcc to a distinct recipient, and the mailto: unsubscribe.
    • 1084 tests green.
    Downloads