zeekayandHanzo Dev d7bc215166 sanctions: a name is a conjunction, so the weakest part decides
The matcher scored a customer key of six characters at 0.902 against a six-word
organisation name, and because that rule's action is block, an ordinary payment was
declined naming a sanctions hit as the reason. The previous commit stopped feeding
identifiers to the matcher; this fixes the matcher, which was wrong on its own
terms whatever it was fed.

Three defects, one cause: the score was a mean, and a mean lets one strong
partnership carry a weak one.

  - The guard against a fragment standing in for a whole person only covered a
    query of literally one token, and folding splits punctuation — so "cust-1"
    arrived as two tokens and walked past it. "a-1" scored a perfect 1.000 against
    "A ONE TRADING COMPANY 1", because each trivial token found an exact partner
    and the mean of two exact partnerships is exact.
  - Initials, particles and bare numbers were counted as evidence of identity.
    They match on the little they contain: every one-character token matches some
    one-character token somewhere in 31,338 designations.
  - A legal-form suffix was counted too, so "acme-ltd" was reported against an
    unrelated "…Co., Ltd" at 0.967 on the strength of Ltd matching Ltd. Every
    company has a legal form; agreeing on it is agreement about company-ness.

Now only identifying parts decide, and every one of them must match — the mean is
reported for ranking, not tested. That is what separates a variant spelling of one
person from a coincidence between two, and no threshold on the mean can do it:
"Smith Petrov" against "Smirnov Petrov" averages 0.89 on an exact surname.

partFloor is measured rather than chosen, and the measurement corrected my first
attempt. Setting it to Threshold — every part must meet the bar the whole name
must meet — reads well and refuses Yusuf against Yousef at 0.840, so a real
customer would stop matching a real designation. Across the transliteration pairs
the published lists contain, genuine variants bottom out at 0.840 and unrelated
parts top out at 0.773; 0.80 sits between the populations. Both directions are
mutation-tested.

Measured against all 31,338 live designations. Customer keys producing any match:
5 of 17 before, 4 after, and the residue is name-shaped — "wallet-1" contains
Wallet and there is a designated SMILE WALLET; "ivan-petrov-42" contains a real
Russian name. No matcher can know those are keys, which is why the input fix
matters. True positives lost: 0 of 10 — Putin, bin Laden, Kim Jong Un, al-Assad,
Kadyrov, Maduro, Khamenei, Lukashenko, Prigozhin and Sechin all still match at
1.000. Twelve mutants, all killed.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-29 15:39:48 -07:00
S
Description
Real-time AML/CFT transaction monitoring, sanctions screening and case management
2.1 MiB
Languages
Go 88.1%
TypeScript 9.3%
CSS 1.2%
Python 0.7%
JavaScript 0.4%
Other 0.2%