Status: Result (DES). Date: 2026-06-16.
Script: sim/experiments/adversarial_squatter.py. Figure: adversarial_squatter.png.
First adversarial run in the sim suite — closes the #1 gap in
test-coverage-audit.md(the suite modeled honest-load degradation but no hostile/faulty participant). It stress-tests the headline Stage-2 claim — TDMA makes collisions go to zero by construction — by checking the unstated premise: that every participant obeys the schedule.
Start from the validated hidden_node.build_tdma cell: a hub (slot authority) + 20 clients, each in a
distinct slot → collision-free, delivery ≈ 1.0. Drop in one misbehaving insider — a SquatterTdmaMac
that ignores its assignment and transmits (always backlogged) in S slots it doesn't own, timed off the
hub beacon so its frames collide at the hub with the legitimate owners. Sweep S ∈ {0,1,2,5,10,20},
3 seeds, 30 min each. Same Channel/PHY/collision model as every other run.
| squatted slots S | cell delivery |
|---|---|
| 0 | 0.995 |
| 1 | 0.947 |
| 2 | 0.904 |
| 5 | 0.766 |
| 10 | 0.503 |
| 20 | 0.000 |
Delivery tracks (K−S)/K: squatting S slots knocks out exactly S of the 20 victims, and a single
node squatting all slots collapses the cell to zero. The "collision-free by construction" guarantee holds
only as long as participants comply — it is not robust to a misbehaving insider.

abuse-mitigation-note.md. A flooding mesh has no authority and no detection point, so it cannot respond
at all.Script: sim/experiments/adversarial_recovery.py. Figure: adversarial_recovery.png.
The same cell, but the coordinator runs a slot-health monitor: clients are saturated, so a scheduled
slot that fails to decode is unambiguous interference; a slot failing D=3 consecutive frames triggers a
reassignment of its victim to a clean spare slot (the cell carries 2K slots, so there's room), and
failing slots are quarantined so no one is moved back into the attack. A non-adaptive squatter keeps
hitting its original slots, so reassigned victims escape.
| steady-state cell delivery | reassignments | |
|---|---|---|
| no monitor (squatter on 10/20 slots) | 0.583 | — |
| coordinator detects + reassigns | 1.000 | 8 |
The cell recovers fully (0.58 → 1.00) within the first minute, with ~8 one-time moves — the coordinator detects the squatted slots and routes its members around the attacker. This is the enforcement lever a flat flood mesh structurally cannot have: no authority, no schedule, no detection point, no recovery. It also generalises the abuse-mitigation ladder — "reassign around the abuser" is a graduated response short of an outright ban.

Idealized (beacon-aligned squatter, single cell, no capture rescue at equal range); no detection/mitigation implemented yet — this measures the exposure, not the defended system. The mitigation story above is a design direction, not a tested result.