-
released this
2026-08-22 00:19:33 -05:00 | 14 commits to main since this release0.29.5's own fix carried a regression, and the acceptance run caught it in one question.
Asked to searchis: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 atMAX_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-MSGIDis 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:unreadreports 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-