Status: Stage 2 result. Date: 2026-06-08. Tag: sim-result-v4.
Reproduce: cd sim && python3 -m experiments.capacity_scaling (writes capacity_spatial_reuse.png).

This measures the capacity argument from adaptive-modulation-note.md (the Checkpoint-A Q3
decision): per-cell SF selection + spatial reuse, the two levers that dissolve the single-domain
500-node ceiling. All runs use the validated TDMA data plane (tdma-data-plane-result.md), so
this is a relative comparison the validation gate licensed.
| Configuration | per-node (msg/min) | aggregate (pkt/s) |
|---|---|---|
| 1× LongFast (single domain) | 2.45 | 2.04 |
| 5× MediumFast (10/cell, 15 km apart) | 39.30 | 32.75 |
| gain | ×16.0 | ×16.0 |
The single LongFast domain sits exactly at the raw channel ceiling (2.04 ≈ 2.1 pkt/s). Splitting the same nodes into 5 spatially-separated MediumFast cells gives ×16 — matching the note's model estimate (~×17). The two levers compose: ~×3.4 from SF (MediumFast vs LongFast) × ~×5 from spatial reuse (5 cells).
Aggregate throughput is exactly 5× a single MediumFast cell (32.20 = 5 × 6.44 pkt/s) at every separation from 3 km to 15 km. The reason is the capture effect: a client sits ~0.7 km from its own hub but ≥3 km from any neighbouring hub, so its signal arrives ~17 dB stronger than any cross-cell interferer — far above the 6 dB capture threshold. Intra-cell delivery is therefore collision-immune to neighbouring cells.
| Cell separation | aggregate (pkt/s) | cross-cell decode failures |
|---|---|---|
| 3 km | 32.20 | 243,270 |
| 5 km | 32.20 | 185,117 |
| 7 km | 32.20 | 115,356 |
| 9 km | 32.20 | 26,742 |
| 12 km | 32.20 | 0 |
| 15 km | 32.20 | 0 |
The honest cost of insufficient separation is contention, not lost throughput — wasted decode attempts as hubs hear (and fail to decode) neighbouring cells' weaker traffic. That waste vanishes by ~12 km ≈ 1.5× the MediumFast range, giving fully orthogonal reuse. This is a stronger result than the note assumed: capture makes spatial-TDMA tolerant of imperfect cell placement.
Caveat (the real boundary cost): this holds for clients well-associated with a cell (the
strong-intra-link regime). A boundary client roughly equidistant from two hubs loses the
capture margin and would contend — exactly the boundary-assignment problem the note flagged for
the spec. The sim places clients tightly around hubs; boundary behaviour is a follow-up experiment
(needs the cell-association/handoff rule from mode-and-handoff-note.md).
| Configuration | per-node achievable rate |
|---|---|
| Single LongFast domain, 500 nodes | 0.247 msg/min (~1 message every 4 minutes) |
| Cellular MediumFast, 50 nodes/cell (10 cells carry 500) | 8.29 msg/min |
| gain | ×34 |
The sim reproduces the analysis' worst-case number exactly — a single LongFast domain gives 500
nodes ~1 message every 4 minutes (mac-layer-options.md §1, synthesis §3). Reorganising those 500
nodes into MediumFast cells lifts each node to 8+ messages/minute — the ceiling is not a wall,
it is an artifact of treating 500 nodes as one collision domain. INFRA-as-modulation-authority
(picking per-cell SF) plus spatial reuse is the structural escape.
tdma-data-plane-result.md (split the hidden-node hub into cells → shorter frames → lower
latency).Open follow-ups: boundary-client cost + cell-association rule; SF selection driven by measured per-client link budget (here SF is set per cell by construction); and absolute calibration of the range/separation thresholds once the DB export lands.