← RFC

Adversarial slot-squatter vs the collision-free TDMA data plane — result

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.

Method

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.

Result

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.

One misbehaving insider degrades collision-free TDMA proportionally; squatting every slot collapses the cell

Interpretation

Detection + recovery (the answer)

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.

Coordinator detects the slot-squatter and recovers the cell to full delivery within a minute; without it the cell stays degraded

Next steps

Caveats

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.