Skip to main content

ADR-0080 — Signal.FINANCIAL_STATEMENTS jurisdiction-gated capability

Status: Accepted Date: 2026-06-28 Deciders: Compliance engineering (with the OB-Holding reachability investigation oracle) Context source: docs/research/2026-06-28-ob-holding-reachability-investigation.md

Context

ADR-0068 established the country-capability registry: each compliance dimension is a Signal, and _CAPABILITY declares which countries a signal is actually assessed for, so the system emits an honest "not assessed for <country>" rather than a misleading clean result (ADR-0067). The registry currently models 6 signals — but financials is not one of them (country_capability.py:46-54,92-108).

The consequence (seen on OB Holding): when EE financials aren't fetched, the result is a free-text "Financial data not available…" string (ADR-0079 removes this) — there is no canonical, machine-checkable capability gap. Financials are already a real, country-varying data channel (BE via NBB CBSO/belgian_agent, CZ via ARES/cz_ares_service, NO/RO/SK/NL via _fetch_country_financials today; EE via ADR-0079), so they need the same honest "assessed / not-assessed-for-X" treatment every other dimension already gets.

Decision

Model financials as a first-class capability in the existing registry.

  1. Add Signal.FINANCIAL_STATEMENTS to the Signal enum in country_capability.py.
  2. Declare its supported set in _CAPABILITY: BE/CZ/NO/RO/SK/NL today, plus EE once ADR-0079 lands. A country enters the supported set only with a verified, working channel — and where a channel is present but degraded (BE financials via NBB CBSO, which ADR-0046 documents as degraded with honest data-gap surfacing), that degradation is itself surfaced honestly rather than read as full coverage. A declared-but-broken channel would be a false-capability claim — the capability-level form of the false-clean problem (EU AI Act Art. 13, AMLR Art. 28).
  3. Callers emit the right gap shape. osint_agent.py and ee_ariregister_service.py emit country_capability_gap(Signal.FINANCIAL_STATEMENTS, country) only for an unsupported jurisdiction (no channel exists) — instead of free text. A supported jurisdiction with the datum temporarily absent (a not-present-as-of-snapshot FY in EE) is a data/ingestion gap (ADR-0073 R11 / ADR-0067), not a capability gap — emitting "not assessed for Estonia" there would tell a regulator we cannot assess EE financials when we can. (This reconciles with ADR-0079 Decision #3.)

Consequences

  • Financials join every other dimension in the honest-coverage contract: a country we can't assess reads "not assessed for <country>", never a false clean (ADR-0067; AMLR Art. 28 risk-based methodology; EU AI Act Art. 13 transparency).
  • Regulator-facing outputs (case pack, conclusion) can render a consistent capability matrix that includes financials, with EE flipping from gap → assessed when ADR-0079 ships.
  • Small, additive change — extends an existing registry; no new infrastructure.

Alternatives considered

  • Keep financials as ad-hoc free text. Rejected — not machine-checkable, inconsistent with the ADR-0068 model, and the source of the misleading OB Holding string.

References

ADR-0068 (country-capability registry — extended here), ADR-0079 (EE financials — flips EE to supported), ADR-0067 (fail-closed "not assessed"), ADR-0073 (R11 financials-ingestion data-gap — the supported-but-absent shape), ADR-0046 (NBB CBSO degradation — the BE channel caveat), ADR-0048 (financial-analysis consumer), country_capability.py, research doc docs/research/2026-06-28-ob-holding-reachability-investigation.md.