Feature catalog
An exhaustive, categorised catalog of what TrustRelay Atlas does today, derived from a code-level capability audit. Each area links to its detailed page and to the relevant glossary terms. For capabilities planned but not yet shipped, see the Product roadmap.
How to read this
Ingestion & data providers
Detailed: Ingestion pipelines · Plugins · Source contracts
- Declarative plugin architecture (
plugin.yaml,mapping_spec.yaml,client.py,mapper.py,transforms.py, tests); a mis-authored plugin fails closed (HTTP 503). - Two acquisition modes: sync (HTTP inside a Temporal activity) and async/investigation (a long-running Temporal child workflow agentic loop).
- Three bundled providers + a reference template: kvk (NL registry, sync), northdata (financials, ownership & registry identifiers — LEI, country, street/postal address, NACE industry, register court, EU IDs — DE·AT·NL, sync), osint (7 crew modules, async),
_example. - TranslationRegistry builds a frozen
(plugin, source_field) → (entity_type, target_field, confidence)index at boot and hard-fails boot on schema drift / unknown fields / wrongtarget_schema. - ProviderRouter five-branch tenant-scoped credential resolution chain (→
MissingTenantCredentialsErrorHTTP 424); never reads env vars from a plugin. - Multi-provider trust merge (
fetch_company_complete): primary / supplementary (parallel) / fallback (sequential) tiers; highest-trust value per field; records a conflict when two providers within a 0.02 trust delta disagree. - Provider runs recorded with status + entity counts; a
stale_checkavoids re-fetching fresh data; per-provider rate limits and timeouts. - Source contracts bound which ontology fields each provider may emit (versioned).
Ontology & entity resolution
Detailed: Ontology · Entity resolution · Data model
- Versioned YAML ontology (v3.5.2) loaded into PostgreSQL at startup via
SchemaCache; app fails to boot if it cannot load; a Flyway migration publishes it byte-equal with a CI drift check. - 8 entity types (LegalEntity, Person, Address, Document, Domain, SanctionsMatch, PEPExposure, AdverseMedia) and 7 relationship types (Directorship, Ownership, RegisteredAt, DocumentsEntity, OwnsDomain, MatchedTo, MentionedIn).
- Entity resolution pipeline: blocking → candidate query → similarity scoring → three-way decision (MERGE ≥ 0.95 / NEEDS_REVIEW ≥ 0.60 / CREATE < 0.40).
- Blocking with type-specific keys (company-name normalisation strips 65+ legal suffixes + diacritics; person normalisation handles Turkish/Polish/Danish characters).
- Similarity scoring combining Jaro-Winkler, Levenshtein, token-set Jaccard, normalised-name exact-boost; field weights name 0.40 / id 0.30 / attr 0.15 / structural 0.15.
- Person matcher (
is_same_person_v2): DOB-conflict veto, DOB exact-match boost, role-at-company boost, middle-initial conflict blocking, 5 DOB formats,name_only_matchaudit signal. - Address reconciliation: Haversine clustering at 500 m, golden-record selection, never merges addresses across companies.
- Person de-duplication collapsing near-duplicates.
- UBO / ownership-chain computation: 25% baseline / 10% strict thresholds, max depth 10, circular-ownership detection.
- Multi-source disagreement as a first-class concept (ADR-017) with explicit missing-data signals.