ADR-0150: Domain-footprint / web-archive reputational check (supplementary-only)
Date: 2026-07-27 Status: Accepted Deciders: Adrian (Soft4U), Claude (Opus 4.8)
Decision context:
- Latency: not measured under load; dark-launched OFF and bounded to
domain_footprint_max_domains(default 5) Wayback lookups at concurrency 3, once per investigation. A single Wayback CDX call is ~1 s. - Dependency surface: no new package — a direct
httpxGET to the free Internet Archive CDX API. One new flag +domain_footprint_max_domains. - Debuggability: writes
result_dict['domain_footprint'](a dedicated evidence dict, likedeep_research_coverage); each domain entry carriesdegraded/archived/first_seen/provider. - Reversibility: single flag flip; flag-off is a byte-identical no-op. No migration.
- Blast radius: additive and INERT to the verdict — the result is evidence only, never a
Findingand never an escalator input. - Alternative considered: emit footprint anomalies as low-severity Findings (rejected — a Finding can be read by verdict/coverage logic; the guardrail is that reputational-only signals must NOT floor or lower the deterministic verdict, so it stays out of the findings stream entirely).
Context
Officer reputational context for online-gambling operators benefits from supplementary signals — scam-risk flags, domain age, archived history — that are not risk-engine inputs. The OB Holding review surfaced the value: a gambling operator's domain first archived only recently, or with almost no archived footprint, is worth surfacing, but such a signal must never move the deterministic verdict (epic #730 non-goal: no soft-averaging / no alternative scoring path).
Decision
Add a dark-launched, SUPPLEMENTARY domain-footprint pass
(app/agents/domain_footprint_phase.py::run_domain_footprint), wired in osint_agent
after the licence-discovery pass, behind settings.domain_footprint_enabled (default
False).
- Harvests the subject's + operating subsidiaries' domains from the website / WHOIS /
verified-alias evidence already on
result_dict. - Looks up the free Internet Archive (Wayback) CDX API per domain for first-seen / last-seen / archived-month breadth — a keyless domain-age & footprint signal.
- Attaches the result to
result_dict['domain_footprint']as EVIDENCE — never aFinding— so it can never floor or lower the verdict. - Fail-open: a lookup failure records a per-domain
degradedgap (and an overallnot_assessed/partialstatus), never a fabricated "clean reputation". A domain that genuinely has no archive is an honestarchived=False, not a gap and not an alarm.
Scam-risk / paid domain-reputation providers (ScamAdviser-class, keyed) are a declarative
extension (a reputation_providers catalog, mirroring ADR-0147's register catalog), not
implemented here — recorded as an honest gap rather than half-built.
Consequences
Positive
- Adds reputational depth (domain age / footprint) for the officer narrative, keyless and bounded, without any risk-engine coupling.
- The supplementary-only, no-Finding design makes the "must not affect the verdict" guardrail structural, not a convention.
Negative
- Wayback is a single free provider with its own availability; when it is down the pass degrades to an honest gap (by design), so the signal is best-effort.
- Scam-risk providers are unimplemented (documented gap), so today the "reputation" is archive-history only.
Neutral
- Introduces a
domain_footprintevidence key; a report/UI surface to display it is a follow-up (the flag stays off until then).
Alternatives Considered
Alternative 1: Emit footprint anomalies as low-severity Findings
- Why rejected: a Finding is readable by verdict/coverage logic; the guardrail requires the signal to be inert to the verdict, so it stays out of the findings stream.
Alternative 2: A paid scam-risk provider as the primary signal
- Why rejected (for now): requires a vendor key/contract; the keyless Wayback archive gives a real domain-age signal immediately. Providers are a declarative extension.