From ceac99c05f180d9008b75c9329822466ff60255b Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Wed, 22 Apr 2026 11:28:28 -0500 Subject: feat(v2.9.0): add risk scoring and deterministic insight engine * introduce domain risk assessment with transparent factors * add insight engine for actionable observations * implement cross-domain insights for workflows * improve DNS, subdomain, email, and TLS interpretation * classify change impact severity * include insights and risk in export --- DomainDig/DomainDiffService.swift | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'DomainDig/DomainDiffService.swift') diff --git a/DomainDig/DomainDiffService.swift b/DomainDig/DomainDiffService.swift index 528841d..0d8795a 100644 --- a/DomainDig/DomainDiffService.swift +++ b/DomainDig/DomainDiffService.swift @@ -57,7 +57,9 @@ enum DomainDiffService { static func summary( from oldSnapshot: LookupSnapshot, to newSnapshot: LookupSnapshot, - generatedAt: Date = Date() + generatedAt: Date = Date(), + riskAssessment: DomainRiskAssessment? = nil, + insights: [String]? = nil ) -> DomainChangeSummary { let sections = diff(from: oldSnapshot, to: newSnapshot) let allChangedItems = sections @@ -70,16 +72,30 @@ enum DomainDiffService { let observedFacts = observedFacts(from: allChangedItems) let inferredConclusions = highlights.isEmpty ? [] : [message] let contextNote = comparisonContextNote(from: oldSnapshot, to: newSnapshot) + let newAnalysis = DomainInsightEngine.analyze(snapshot: newSnapshot, previousSnapshot: oldSnapshot) + let currentRiskAssessment = riskAssessment ?? newAnalysis.riskAssessment + let currentInsights = insights ?? newAnalysis.insights + let oldRiskAssessment = DomainInsightEngine.analyze(snapshot: oldSnapshot).riskAssessment + let riskScoreDelta = currentRiskAssessment.score - oldRiskAssessment.score + let impactClassification = DomainInsightEngine.impactClassification( + severity: severity, + riskDelta: riskScoreDelta, + changedSections: highlights + ) return DomainChangeSummary( hasChanges: !allChangedItems.isEmpty, changedSections: highlights, message: message, severity: severity, + impactClassification: impactClassification, generatedAt: generatedAt, observedFacts: observedFacts, inferredConclusions: inferredConclusions, - contextNote: contextNote + contextNote: contextNote, + riskAssessment: currentRiskAssessment, + insights: currentInsights, + riskScoreDelta: riskScoreDelta ) } -- cgit v1.2.3