Parent
#46
What to build
Wire Coherence::compute_coherence against a real SelfFingerprint populated from live capture (C8) and compared against the real catalog (C9). After this slice, every FingerprintReport produced by the engine carries a populated Coherence block with our_ja3_matches_profile, their_antibot_compatible_with_our_profile, and warnings reflecting actual measurements rather than placeholder values.
Fingerprinter::analyze_hot and analyze_warm both accept an optional SelfFingerprint argument (or read from a Fingerprinter-held field set via builder) so the coherence cross-check runs whenever a fingerprint is available. The constructed scenarios from B13 keep passing; new tests cover the integration with real catalog data.
Acceptance criteria
Blocked by
Parent
#46
What to build
Wire
Coherence::compute_coherenceagainst a realSelfFingerprintpopulated from live capture (C8) and compared against the real catalog (C9). After this slice, everyFingerprintReportproduced by the engine carries a populatedCoherenceblock withour_ja3_matches_profile,their_antibot_compatible_with_our_profile, andwarningsreflecting actual measurements rather than placeholder values.Fingerprinter::analyze_hotandanalyze_warmboth accept an optionalSelfFingerprintargument (or read from aFingerprinter-held field set via builder) so the coherence cross-check runs whenever a fingerprint is available. The constructed scenarios from B13 keep passing; new tests cover the integration with real catalog data.Acceptance criteria
Fingerprinterholds an optionalArc<SelfFingerprint>set viawith_self_fingerprint(fp)Fingerprinter::analyze_hotpopulatesreport.coherencewhen self-fingerprint is setCoherence.our_ja3_matches_profilereportsSome(true)on a clean run with measured catalog hashes (C9)Coherence.our_ja3_matches_profilereportsSome(false)+ drift warning when the live capture diverges from catalogCoherence.their_antibot_compatible_with_our_profilepopulates from the antibot Detections in the same reportcoherence::testspassBlocked by