From 237a72a03102319638c5b0572ca3ab543238b821 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Sun, 26 Apr 2026 00:39:28 -0500 Subject: DomainDig v3.5.0: Expand the Pro+ Data+ intelligence layer with deeper local historical context and inferred enrichment. - add derived intelligence fields for provider fingerprinting, classification, ownership transitions, hosting transitions, subdomain history, risk signals, and inferred timeline events - expand DNS history beyond A/NS snapshots to retain A, AAAA, MX, NS, TXT, and CNAME change state - persist enriched intelligence in snapshots and history entries so analysis is local-first and incremental - add a dedicated Data+ Intelligence panel to current and historical domain detail views - surface intelligence events in timeline rows and include Data+ changes in diff output - preserve non-blocking inspection behavior by keeping enrichment additive to the main lookup path This makes Pro+ materially deeper for investigative workflows by improving historical ownership visibility, infrastructure context, hosting change detection, subdomain intelligence, and explainable risk signals. --- DomainDig/DiffService.swift | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'DomainDig/DiffService.swift') diff --git a/DomainDig/DiffService.swift b/DomainDig/DiffService.swift index 948f470..211a16e 100644 --- a/DomainDig/DiffService.swift +++ b/DomainDig/DiffService.swift @@ -115,6 +115,7 @@ enum DiffService { emailSection(from: oldReport, to: newReport), networkSection(from: oldReport, to: newReport), subdomainsSection(from: oldReport, to: newReport), + intelligenceSection(from: oldReport, to: newReport), riskSection(from: oldReport, to: newReport) ] @@ -384,6 +385,20 @@ enum DiffService { ) } + private static func intelligenceSection(from oldReport: DomainReport, to newReport: DomainReport) -> DiffSection { + DiffSection( + id: "intelligence", + title: "Data+ Intelligence", + items: [ + compare(id: "intel-provider", label: "Provider", oldValue: oldReport.inferredProvider?.name, newValue: newReport.inferredProvider?.name, severity: .medium), + compare(id: "intel-classification", label: "Classification", oldValue: oldReport.domainClassification?.kind.title, newValue: newReport.domainClassification?.kind.title, severity: .medium), + compare(id: "intel-hosting-history", label: "Hosting Transitions", oldValue: joined(oldReport.hostingTransitions.map(\.summary)), newValue: joined(newReport.hostingTransitions.map(\.summary)), severity: .medium), + compare(id: "intel-ownership-history", label: "Ownership Transitions", oldValue: joined(oldReport.ownershipTransitions.map(\.summary)), newValue: joined(newReport.ownershipTransitions.map(\.summary)), severity: .high), + compare(id: "intel-risk-signals", label: "Risk Signals", oldValue: joined(oldReport.riskSignals.map(\.title)), newValue: joined(newReport.riskSignals.map(\.title)), severity: .medium) + ].compactMap { $0 } + ) + } + private static func compare( id: String, label: String, -- cgit v1.2.3