• v0.29.2 97bbcced61

    0.29.2 — unread counts are distinct, not summed
    All checks were successful
    CI / gate (push) Successful in 1m50s
    CI / image (push) Successful in 18s
    Stable

    joeyr released this 2026-08-21 22:15:50 -05:00 | 19 commits to main since this release

    G1's live pass ran, and it earned its keep. 52 checks through the tool layer against the
    real mailbox, and the first run failed one of them — which turned out to be a defect in the
    tool, not in the check. Written up in docs/operations.md under Reading (G1).

    Fixed

    • list_unread_counts overstated the unread total by 34% — 1214 reported against 904
      actual. total_unread summed the per-label counts, and excluding All Mail was necessary
      but not sufficient
      : Gmail labels overlap each other too. \Important and \Starred are
      overlays on messages that already carry another label, a user label sits alongside
      \Inbox rather than instead of it, and Trash and Spam are counted in the sum while All
      Mail excludes them.

      total_unread is now All Mail's own UNSEEN — the distinct count, taken once, by Google
      — and the response carries a note telling the reader the per-label numbers overlap and
      must not be added up. When that count cannot be taken the total is omitted rather than
      filled in from the sum: the sum is not a rougher version of this number, it is a different
      and wrong one, and the response says so in the words a reader needs.

      This is the project's recurring defect in its purest form. A request that succeeded, an
      answer that looked authoritative, and a number that was wrong by a third.

    Notes

    • 1103 passing tests could not see it, and the reason is worth keeping. _FakeIMAP
      returned the same UNSEEN for every folder, so no message in the fake was ever in two
      labels at once — the code and the fake shared an assumption the real server does not.
      Three tests now pin the behaviour using the live account's actual numbers, one of them
      reproducing the 1214-against-904 overcount exactly, and reverting the fix fails them.

    • A phase gate is not a formality, and this is the second time that has been demonstrated.
      M3's pass found send_draft destroying the only record of a delivered message. G1's found
      this. Both were shipped code with a green suite behind them.

    • The one failing check was a wrong assertion, not a wrong result: it claimed All Mail
      must hold at least the labelled total, reasoning that All Mail holds a copy of everything.
      The opposite is true. Chasing why it failed is what found the defect — which is the
      argument for investigating a failing probe before adjusting it.

    • The one unknown was benign, and was proved so rather than assumed. The newest INBOX
      message carried no Authentication-Results; it is the self-sent probe 9 message, the
      header is genuinely absent on the server, and the tool's "not applicable" note matched.
      The next two messages are ordinary inbound and parse clean against mx.google.com.

    • Nothing is deployed yet. G1 is verified, not stood up: the NFS export directory, the
      NPM proxy host, the fourth Forgejo OAuth app and the stack entry are all still owed.

    Downloads