• v0.29.6 7d3b74c128

    0.29.6 — complete coverage, honest counts
    All checks were successful
    CI / gate (push) Successful in 1m29s
    CI / image (push) Successful in 14s
    Stable

    joeyr released this 2026-08-22 00:19:33 -05:00 | 14 commits to main since this release

    0.29.5's own fix carried a regression, and the acceptance run caught it in one question.
    Asked to search is:unread, the connector reported "the newest 200 of 458" — then pointed
    out that 458 could not be reconciled with the 904 the count tool gives, and said so rather
    than picking one. Both numbers were wrong for different reasons.

    Fixed

    • The truncation warning understated the number it exists to disclose. 0.29.5 set found
      to the count of DISTINCT messages, but built that from the per-folder window, which is
      capped at MAX_MESSAGES. One label held 856 matches and contributed 200, so 656 vanished
      from the total the warning quotes. The true figure was 1088; it said 458.

      This is the worst possible line to get wrong in this direction. Its entire job is to
      say the answer is incomplete, and it was itself incomplete — a reader told there are 458
      believes 458 exist and stops looking. X-GM-MSGID is now fetched for every matching uid,
      not just the window; that is one integer per message and no envelopes, so the expensive
      fetch still runs only over what is returned.

    • The default search could not see archived mail at all. Excluding All Mail was the
      obvious way to avoid duplicates, and it was wrong: an archived message carries no other
      label
      , so All Mail is the only place it exists. On the live account that was 42 unread
      messages
      a default search could not reach, with nothing in the response to suggest the
      answer was partial.

      All Mail is now searched last. That is safe only because 0.29.5 made results collapse
      on message id — placed last it supplies the messages nothing else has and loses every
      duplicate to a real label, so coverage is complete and the folder shown is still a real
      label wherever one exists.

      After both fixes, is:unread reports 1088, which reconciles exactly:
      904 (All Mail) + 155 (Trash) + 29 (Spam).

    Notes

    • The first test written for this passed against the broken code, because every folder in
      the fixture held fewer messages than the cap, so the window never dropped anything. The
      fixture now has a crowded label — the shape the live account actually has. A test whose
      fixture cannot reach the failing branch is not a test
      , and the mutation run is what
      exposed it.

    • Three fixes deep in the same defect now: the aggregate count (0.29.2), the fan-out
      (0.29.5), and the count of what the fan-out did not return (0.29.6). Each was found one
      layer further out than the last, and none by the suite.

    • Every one of them was found by a person using the connector and asking what a number
      meant.
      That is the acceptance test this project did not have, and it has now paid for
      itself three times.

    • G1's live pass re-run and extended: 54 checks, 0 failed. One of its assertions had to
      change, because it encoded the old exclusion — the probe was requiring the behaviour that
      hid the 42.

    Downloads