Status: Result (DES). Date: 2026-06-16.
Script: sim/experiments/jammer_freq_agility.py. Figure: docs/figures/jammer_freq_agility.png.
Completes the adversarial trilogy. The slot-squatter is beaten by detection + reassignment (
adversarial-squatter-result.md); but a squatter that adapts (follows the reassignments) becomes a jammer, which reassignment can't beat. The answer to a jammer is frequency agility (frequency-agility-multisector-note.md) — shown here.
20 saturated clients + a hub (single channel). A continuous jammer (fills every slot each frame) turns on at 10 min of a 30-min run, collapsing the cell. Two coordinators are compared: - frequency-agile — watches per-frame decode health; after delivery stays <0.5 for 3 frames, it hops to a clean channel (the cell moves; the jammer is left transmitting on the old one), and - single-channel — stays put.
The sim is single-medium, so "hop to a clean channel" is modeled by the jammer ceasing to overlap once the cell has hopped. Measured at the hub: per-frame fraction of the 20 clients whose frame decoded.
| phase | frequency-agile (hops) | single-channel (static) |
|---|---|---|
| before jammer | 0.947 | 0.947 |
| jammer active | 0.951 | 0.095 |
The jammer collapses the single-channel cell to ~0.10; the frequency-agile coordinator detects the collapse and hops within seconds, recovering to ~0.95, while the static cell stays dead for the duration.

| adversary | best answer | shown in |
|---|---|---|
| insider slot-squatter | coordinator detects + reassigns victims to clean slots | adversarial-squatter-result.md |
| adaptive squatter / external jammer | coordinator detects + hops to a clean channel (frequency agility) | this result |
Both rest on the same structural advantage: the coordinator is an authority that can observe cell health
and act — reassign in time, or hop in frequency. A flat flood mesh has neither the observation point nor
the control. Frequency agility is also the natural home for a multi-sector / multi-radio coordinator
(frequency-agility-multisector-note.md): a jammer can only sit on one channel, so a coordinator running
sectors on several channels loses at most one sector.