I trained U-Nets on SpectrumNet's km-scale maps. With a coverage gate added, they learn how coverage falls with distance, and on our 2 km mosaic they paint no signal far from the Tx. Close to the Tx (100–200 m) they predict too little coverage, and the three training seeds disagree a lot there. Everything is committed on branch `claude/vigorous-burnell-99a393` (5 commits, last 56d7b5f); the write-up is [08-spectrumnet.md](docs/research/08-spectrumnet.md).

**Data.** The GitHub repo has no building files for DenseUrban/OrdinaryUrban, and the README's Drive link is dead. With your OK I downloaded the full set (1.43 GB) from the link on the project page. `scripts/get_spectrumnet.sh --full` reproduces it into `data/spectrumnet/`, which is gitignored. I used 1,665 urban maps at 3.5 GHz with the receiver at 1.5 m.

**What the inspection found:**
- **Encoding:** the paper never states it, so I fitted it against free-space loss: path gain dB = (gray − 242.6) / 1.44, uncertain by about ±1.5 dB. Comparing the same pixel at different frequencies gives the same scale.
- **Tx height:** low, between 0 and 5 m, consistent with the paper's 1.5 m. A Tx at 10 m or higher doesn't fit the 30 m layer.
- **Wrong assumption, documented in the doc:** maps have **1–5 transmitters**, not one. Their positions aren't stored, so I detect them; 93–98% of the detected Tx also show up at other frequencies.
- **The maps are binary:** a pixel either has a ray path at about free-space level or nothing. Almost nothing is weak, so coverage hardly depends on frequency or on the −127 dB floor.
- **Coverage at 1.5 m is wider than our references:** in DenseUrban it is 85 / 56 / 33 / 17 / 8.5% at 0–100 / 100–200 / 200–400 / 400–800 / 800–1200 m. That is close to WinProp IRT2 up to 400 m, but well above our tracer and Sionna (1%) at 400–800 m. SpectrumNet's buildings are also sparser: 14% of the area, against 25% on our mosaic.

**Training** (same U-Net, base 16, 128 px at 10 m, same number of training samples as `runs/capped`, test set held out by area):
- **Without the gate:** the plain loss marks about 90% of dead pixels as covered, the same far-field problem as before.
- **With the coverage gate** (as `train.py --gate`): coverage by distance matches the truth within 4 points in every ring out to 1.2 km, across 3 seeds.
- **Error in dB:** about 9.9 dB on outdoor pixels and 13–14 dB where the truth has signal, against 15.8 dB for a distance-only baseline.

**2 km mosaic**, share of outdoor pixels above −127 dB:

| method | 100–200 m | 200–400 m | 400–800 m | 800–1100 m |
|---|---|---|---|---|
| our tracer | 53.7% | 12.4% | 0.2% | 0.0% |
| Sionna | 61.2% | 11.2% | 0.1% | 0.0% |
| capped hybrid +8/−60 dB | 85.8% | 36.0% | 1.9% | 0.0% |
| RadioMapSeer U-Net, geometry only | 99.0% | 97.8% | 93.7% | 93.0% |
| SpectrumNet U-Net, no gate | 97.8% | 85.2% | 79.5% | 82.5% |
| **SpectrumNet U-Net + distance + gate, 3 seeds** | **13–51%** | **0.8–5.9%** | **0–0.3%** | **0%** |

Far from the Tx (400–800 m) the gated nets agree with the tracer on 99.6–99.8% of pixels, like the capped hybrid, but with no physics input. The range comes only from training on 1.28 km maps.

**Limits:**
- The frequency is 3.5 GHz, not 5.9 GHz.
- SpectrumNet's ray tracing has no visible diffraction and no weak-signal tail, so its dB values are a poor target for our maps.
- 10 m pixels blur narrow streets, which probably explains the short range near the Tx on the mosaic.

**Housekeeping:** total GPU time was about 3.5 hours, mostly two runs in parallel. Each result json records the commit that produced it: 370c77f for the inspection and training, a359565 for the mosaic. Model weights (`.pt`) and `data/` are not committed. The mosaic step reads the main checkout's gitignored `compare.npz`, which `rcm_ml.cloudrf_compare` regenerates. No CloudRF requests were made.

Possible next steps: use the SpectrumNet gate as a far-field mask on top of the RadioMapSeer U-Net, add the 1.5 GHz maps (coverage barely depends on frequency), or fine-tune at 2–5 m pixels.