Cybersecurity-Projects/PROJECTS/intermediate
CarterPerez-dev 312b13b348 feat(nadezhda): M2 cross-source dedup + clustering
Group the same story across outlets into clusters, the velocity signal for
ranking. Runs automatically after 'scrape' (recompute-from-scratch, idempotent).

- internal/cluster: connected-components engine (union-find). Two articles join
  when, within a time window (Cluster.WindowHours, default 72h), EITHER their
  normalized-title token-set Jaccard >= threshold (default 0.6) AND they are from
  different outlets, OR they share >= 1 CVE (source-agnostic). The cross-outlet
  guard on the title edge kills a real false positive where two distinct CISA
  advisories with identical boilerplate titles were merging. Cluster key = the
  earliest article by time; SourceCount tracks distinct outlets so the reported
  'multi-source' metric is truthful.
- Shared-CVE join reads article_cves, which is empty until M3 CVE extraction, so
  that path is a natural no-op today and lights up in M3 with no rework.
- store: ClusterCandidates (effective time = published_at else fetched_at, bounded
  by lookback), ArticleCVEMap, ReplaceClusters (single atomic tx: wipe + rebuild).
- config: Cluster.LookbackHours (default 168h) bounds the corpus for O(n^2);
  validated as >= window_hours so window edges are never silently dropped.
- Proven live: 215 real articles -> 137 clusters, 2 genuinely cross-outlet
  (FortiBleed x3, Scattered Spider x2). 17 cluster tests; suite offline + -race.

One read-only audit agent run; findings (multi-source stat, lookback guard) fixed in-phase.

Clustering is recompute-from-scratch each scrape; safe to re-run.
2026-07-05 15:11:29 -04:00
..
api-security-scanner chore(deps): bump pydantic-settings 2026-06-20 01:35:21 +00:00
binary-analysis-tool Merge pull request #286 from CarterPerez-dev/project/ja3-ja4-tls-fingerprinting 2026-06-18 19:38:51 -04:00
credential-enumeration fix(credential-enumeration): rename .nimble to credenum.nimble 2026-04-29 01:23:40 -04:00
credential-rotation-enforcer feat(cre): one-shot curl|bash installer for credential-rotation-enforcer 2026-06-18 23:24:30 -04:00
dlp-scanner chore(deps): bump lxml in /PROJECTS/intermediate/dlp-scanner 2026-04-21 23:13:03 +00:00
docker-security-audit chore(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp 2026-04-08 20:02:55 +00:00
ja3-ja4-tls-fingerprinting feat(tlsfp): add social-share OG image and one-command tunnel redeploy 2026-06-18 23:24:30 -04:00
sbom-generator-vulnerability-matcher cracked 2026-05-23 05:01:01 -04:00
secrets-scanner chore(deps): bump golang.org/x/net 2026-07-03 17:47:33 +00:00
security-news-scraper feat(nadezhda): M2 cross-source dedup + clustering 2026-07-05 15:11:29 -04:00
siem-dashboard chore(deps): bump axios 2026-05-29 16:25:57 +00:00