• v0.44.1 371fbba262

    0.44.1 Stable

    joeyr released this 2026-08-24 23:36:57 -05:00 | 74 commits to main since this release

    The account holder's name came out of history, and the guard that should have caught it
    went in.
    No runtime change; the whole release is the gate and the record.

    Added

    • test_no_pii.py refuses a display name beside an address unless it is on a list of
      placeholders. A name is the one kind of PII with no shape to match — "Lovelace, Ada"
      and a real one are the same string to a regex — so the rule is inverted the way the
      reserved-domain rule for addresses already is: enumerate what may appear, not what may
      not. Hashing the real name into the guard was the obvious alternative and is worse than
      it looks; a salted digest of a common given name and surname falls to a small dictionary,
      which publishes in a public repo roughly what it was meant to protect.

      It reads bytes literals and reassembles f-strings, because both are blind spots exactly
      where the fixtures live: a raw From: header is bytes, and f"Pay{ZWSP}Pal Security" is
      two AST nodes, so a name split across an interpolation would pass a naive walk.

    • test_no_pii.py refuses a token-shaped literal that is not bound to a module-level
      name
      , in the one file the other rules cannot scan — this one. The real Canvas token
      hid for two releases inside the docstring of the helper written to recognise its shape,
      and the convention that replaced it had already drifted twice before anything checked it.

    Changed

    • CLAUDE.md records the rewrite and what it actually took. Taking a value out of the
      tree is not taking it out of the repo: the name stayed published in 20 blobs for a day
      after the 2026-08-23 sweep replaced it. Removing it took git filter-repo, 99 commits
      recreated and 57 of 74 tags repointed — all 66 releases survived, because Forgejo keys
      them to the tag name. And the force-push was not the end: Forgejo served the old commits
      by hash until git gc --prune=now ran inside the container. Verify a rewrite by asking
      the API for a hash that should be gone.

    • The emoji-calendar arithmetic is current again — 140 commits and 73 of the 74 tags —
      and that decision is now priced rather than assumed, since a rewrite of comparable size
      has since been paid for something else.

    Downloads