Files
DECNET/tests/fixtures/campaigns/noise_floor.yaml
anti 7021fda0e6 test(clustering): fixture 6 noise_floor (composite + cross-corpus)
Bundles all five prior fixtures' campaigns into one corpus alongside
10 fresh Delivery-only noise scanners (on top of lone_wolf's 8
inherited). The fixture covers cross-corpus interference — signal
collisions across fixtures' JA3/HASSH/C2 strings, factory ID re-use,
clusterer ambiguity that only manifests when multiple campaigns
score together. Each constituent fixture already ships its own
in-fixture adversarial test; this one is the control for the class
of failures that single-corpus fixtures cannot catch.

Composition is declared via a fixture-6-specific include_fixtures
block in noise_floor.yaml. The test file's loader expands it into
a full corpus.campaigns spec at runtime so the factory itself stays
unaware — no factory primitive added for what only this fixture
needs. The 8 noise scanners declared by lone_wolf flow through
naturally; the extra_noise_scanners count adds 10 more.

composite_signals_clusterer (added in the fixture-5 commit) is the
pass clusterer — union-find combining (ja3, hassh) match OR
overlapping C2 callback. Approximates the planned similarity graph
well enough that every campaign resolves and every singleton stays
singleton in the merged corpus.

Three tests: corpus integrity (every campaign id present, 12
campaign-driven attackers + 18 noise = 30 total), pipeline pass
against the global bounds, and an explicit singleton-recall
assertion (21 truth-singletons — 1 lone wolf, 18 noise, 2
shared_wordlist actors whose campaigns are size 1 — all kept
singleton by the composite clusterer). Singleton recall is the
load-bearing metric here: noise absorption is the failure mode
that makes campaign attribution useless in practice.
2026-04-26 07:49:36 -04:00

35 lines
1.5 KiB
YAML

# Fixture 6 (noise_floor) — see development/CAMPAIGN_CLUSTERING.md §2.
#
# Composite of all five prior fixtures plus N additional Delivery-only
# noise scanners. Tests that the clusterer holds every campaign
# together AND keeps every noise observation as its own singleton
# in the presence of cross-fixture interference.
#
# This is a CONTROL fixture: if any of the five constituent fixtures
# regresses inside the combined corpus but passes individually, the
# regression is in cross-corpus interaction (signal collisions,
# clusterer ambiguity, factory ID re-use, …). Catches a class of bugs
# that single-corpus fixtures cannot.
#
# Composition is expressed by listing the constituent fixtures here;
# the test file's loader expands this into a full `corpus.campaigns`
# spec at load time so the factory itself stays unaware. This format
# is fixture-6-specific — no other fixture uses ``include_fixtures``.
#
# Pass condition: ``composite_signals_clusterer`` (fingerprint OR C2
# union-find — see fixture_harness.py) resolves every campaign and
# leaves every noise scanner singleton. The bounds in
# ``noise_floor.expected.yaml`` are global across the merged corpus.
#
# No standalone adversarial test for fixture 6 — each constituent
# fixture already ships its own. What this fixture catches is
# CROSS-fixture interference, which is a different failure mode from
# the in-fixture adversarial cases.
include_fixtures:
- shared_wordlist.yaml
- vpn_hopping.yaml
- lone_wolf.yaml
- paused_campaign.yaml
- multi_operator.yaml
extra_noise_scanners: 10