The first real throughput numbers for a direct awdl0 peer-to-peer link, measured on 2026-08-18 with two Macs carried to physical positions. No such figure existed anywhere before this — not from Apple, not from any third party (see Phases).

The decisive reading

156.3 Mbps at the exact spot where Reincubate Camo drops its connection, over awdl0 — direct, having never touched the router.

That is 6.25× the 25 Mbps pass threshold. The transport premise of the whole project is proven on hardware, not argued.

The numbers

Position 1 — beside the routerPosition 2 — Camo’s dead spotChange
Throughput339.0 Mbps156.3 Mbps−54%
5 MB still lands in0.12 s0.26 s2.2×
Retransmitted (of 32 MB)1428 B3804 B2.7×, still 0.011%
Round-trip37.0 ms37.0 msunchanged
Interfaceawdl0 — directawdl0 — directheld

Range costs bandwidth, not latency

Roughly half the bandwidth disappears at range and round-trip time does not move at all. Reaching the 25 Mbps pass floor would take a further 84% loss; the 8 Mbps fail floor, 95%.

The peer was discovered on awdl0 only at both positions — the router path was never even a candidate.

Sender-side cross-checks agreed within ~3% (350.8 and 159.1 Mbps). The listener’s rtt 0.0 ms is an artifact of a receive-only path report; 37 ms from the sender is the real figure.

Why 37 ms matters later

37 ms round-trip is the radio’s own cost. Irrelevant to Phase 0 — stills and video are latency-insensitive by design — but it is a material slice of the Phase 2 live-preview budget. For scale, the entire VideoToolbox low-latency saving at 4K30 is ~124 ms (3. VideoToolbox — low-latency mode is the headline).

Consequences that were locked in

  • Phase 0’s kill criteria are met; the build proceeded.
  • Phase 2’s live preview targets 1080p, not the 720p30 fallback — the marginal branch of the spec does not apply.
  • The fallback ladder (reduce preview ambition → Personal Hotspot → wired USB) is recorded as unused, not untested.

How the instrument avoids lying

The probe (Sources/AposematiProbe/, .build/release/aposemati-probe) refuses to produce a comfortable wrong answer in three independent ways:

  • The sender pins requiredInterface, so it cannot silently fall back to the router — a connection failure at range is loud.
  • The listener reads the busiest path from PendingDataTransferReport.pathReports rather than currentPath.first — it reports the interface that carried bytes, not one that was merely available.
  • TRAFFIC SPLIT ACROSS INTERFACES and an interface-row fail mean a fast transfer over the wrong link still grades as failure.

A truncated transfer is graded TRANSFER INCOMPLETE / fail after a 120 s bound, and its Mbps figure is printed but explicitly disowned.

The bug that would have made every number meaningless

The listener originally timed the close handshake, not the transfer. Progress showed 32.0 MB of 32.0 MB at the 5 s tick, and the final reading said received 32.0 MB in 10.62 s — because the receive loop waited for the peer’s isComplete, which only arrived when the sender abandoned its own 10 s close-wait.

Elapsed was pinned near ~10.6 s regardless of link speed, so throughput read ~25 Mbps for any fast link — landing almost exactly on the 25.0 Mbps pass threshold by coincidence. Every Phase 0 number would have been an artifact of a timeout.

Caught by a loopback smoke test before anyone walked anywhere. After the fix, elapsed dropped from 10.62 s to 0.02 s and loopback read 15,674 Mbps against the sender’s independent 15,321.7 Mbps.

Caveats on these numbers

  • This is Mac-to-Mac. An SPM executable cannot run on iOS, so the iPhone’s AWDL behaviour — different radio, thermal envelope, power management — was not measured here. The live Phase 1 run subsequently proved iPhone→Mac works, but not at range.
  • Throughput is one direction only, Mac B → Mac A.
  • udp listen / udp send has never been exercised. It replaced the abandoned QUIC probe mode in the last fix round. Do not treat “AWDL carries UDP” as answered by Phase 0 — it was answered later, implicitly, by QUIC working over the real link in Phase 1.