zeekayandHanzo Dev 6a210f6402 sanctions: parse every list, and fail loudly when one yields nothing
Three of the four screening lists loaded zero entries, and nothing reported it.

Two sources were dead. The UK list pointed at the OFSI Consolidated List, which
closed on 28 January 2026 — ConList.xml has answered 404 since, and the UK
Sanctions List published by the FCDO is now the only source for UK designations.
The EU endpoint answers 403 unless its token is in the query string. Both had
been returning nothing for months.

The remaining two failures were structural. UN, EU and HMT were all parsed with
the OFAC parser, whose root element is sdnList — so a correct download of the UN
list still produced no entries. Each publisher now has a parser for its own
schema, resolved through one registry with no default case, because a fallback
to another publisher's parser is what made the emptiness look like data.

And the reason none of this surfaced: every failure was logged and skipped, and
RefreshAll returned nil regardless. A list that parses to zero entries is now an
error, a non-200 is an error, an unregistered source is an error, and RefreshAll
joins per-list failures into its return value. Stale reports data too old to
screen against, since a zero-match result against an empty list is
indistinguishable from a clean party.

Measured against the live files: 19,175 entries before, 32,518 after — OFAC
19,175, UK 6,315, EU 6,017, UN 1,011, every one of them named, with 15,117
dates of birth and 11,730 nationalities the previous path could not have read.

The fetch timeout moves from 60s to 5m: the EU file does not transfer inside a
minute, so the old value failed a healthy list.

Fixtures keep the quirks that break parsers — UN year-only and BETWEEN dates,
the EU's absent primary-name marker and "00" country sentinel, the UK's literal
"dd/mm" placeholders and six spellings of NameType, non-Latin-script names. Ten
mutants of these invariants, all killed.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-29 10:59:22 -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%