Skip to main content

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 httpx GET to the free Internet Archive CDX API. One new flag + domain_footprint_max_domains.
  • Debuggability: writes result_dict['domain_footprint'] (a dedicated evidence dict, like deep_research_coverage); each domain entry carries degraded/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 Finding and 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 a Finding — so it can never floor or lower the verdict.
  • Fail-open: a lookup failure records a per-domain degraded gap (and an overall not_assessed/partial status), never a fabricated "clean reputation". A domain that genuinely has no archive is an honest archived=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_footprint evidence 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.