• v0.44.2 64b21da1ac

    v0.44.2 Stable

    joeyr released this 2026-08-25 15:12:31 -05:00 | 73 commits to main since this release

    Two shipped defects in the same brand check, pointing opposite ways — and an
    instructions block that warned about a flag with no parameter behind it.

    Fixed

    • brand_mismatch no longer reads a brand out of the middle of a word. The check
      asked brand in display_name against bare substrings, and ups is inside groups,
      signups, meetups and startups — so "Facebook Groups" <…@facebookmail.com>, a
      legitimate message straight from the brand's own domain with no relay in the path, was
      flagged as a UPS impersonation. That is not cosmetic: brand_mismatch is not in
      unsubscribe.NON_BLOCKING_FLAGS, so it was a hard refusal to unsubscribe from real
      mail. irs inside firstclass is the same shape. The display name is now split into
      words, and matched against those and against runs of adjacent words glued together.

    • The same check now fires for brands written as separate words. The tokens are
      spelled closed up — bankofamerica, cashapp, wellsfargo — and no display name is
      written that way, so matching single words meant those entries could never match
      anything. They were dead from the day they were added, for exactly the brands where an
      impersonation costs the most.

    • A brand token inside a domain label is no longer accepted as the brand's domain.
      The domain was flattened (paypal-billing.com → paypalbillingcom) and tested for the
      token anywhere inside it, so paypal-billing.com and apple-id-verify.com — the exact
      shape a lookalike takes — passed silently. The flattening could not simply be
      dropped: it was also what let bankofamerica.com match. So _BRANDS became
      _BRAND_DOMAINS, and a domain qualifies two ways — it is one the brand is listed as
      sending from (exact or subdomain, the authresults.is_trusted rule), or the brand is a
      whole dot-label of it. The map is deliberately sparse, because the label rule already
      covers usps.com and corporate.target.com; facebookmail.com is the shape that
      needs an entry, and it is indistinguishable from a lookalike by string rules alone.

      Only brand-controlled domains belong in that map. Shared sending infrastructure —
      amazonses.com, an ESP's bounce domain — must never be listed: the map grants the
      brand's name to whatever it contains, so one shared domain would hand every tenant on
      that platform a free pass.

    • icloudmail's instructions block describes the delete split as it actually is.
      It still said deleting was "reversible unless permanent is set". delete_message has
      taken a single message_id since 0.30.0, when that argument was split out into
      expunge_message; the sentence was never updated. Both halves pointed the wrong way at
      once — a warning attached to an argument that does not exist, and no warning at all on
      expunge_message, which is registered whenever MAIL_EXPUNGE_ENABLED is set and
      went unmentioned. The text is now conditional on that gate, the way _absent() already
      conditions the rest of the capability prose.

      Worth naming as a class: a schema that drifts from its implementation surfaces as a
      type error at call time, but an instructions block that drifts from the schema surfaces
      as nothing at all — and it is injected into the model's context and acted on before any
      tool call is made. This one failed safe. The same drift running the other way is
      confident action on a false premise.

    Downloads