Techs reported cloudflare.com showing 300+ms on the diagnostic page
while OS-level ICMP ping returned 5ms. The gap is entirely protocol
overhead:
- fetch() ≠ ICMP. Every call pays DNS + TCP + TLS + HTTP on top of
the real RTT, which is easily 150–300ms cold on mobile LTE when the
radio has to wake the RRC connection.
- Bare cloudflare.com redirects 301 → www.cloudflare.com, forcing a
second DNS + TCP + TLS handshake for every "ping" and doubling
the measured latency.
- TechDiagnosticPage.vue was also labeling the full 10MB download
time as "Latence", so the number on the speed-test card was never
a latency measurement at all.
Fixes, applied to both surfaces (Ops /j/diagnostic + Field /diagnostic):
- Swap cloudflare.com → 1.1.1.1/cdn-cgi/trace. 88-byte response, no
redirect, no keepalive games — canonical "internet is up" endpoint.
- Warm-up fetch before every measurement. First call absorbs DNS +
TCP + TLS + LTE wake; second call reports steady-state RTT. This
applies to checkHosts() (ops) and resolveHost() (field composable).
- Split runSpeed() into separate ping + throughput measurements. Ping
hits speed.cloudflare.com/cdn-cgi/trace (88 bytes on a warm
connection); throughput hits /__down on the same origin so the TLS
session is reused.
Deployed to production; smoke-verified:
- ops bundle TechDiagnosticPage.b925e02c.js contains
'1.1.1.1/cdn-cgi/trace'
- field bundle DiagnosticPage.38a45f65.js contains the same
- zero bare 'cloudflare.com' hostname in either hosts array
Files:
- apps/ops/src/modules/tech/pages/TechDiagnosticPage.vue
- apps/field/src/composables/useSpeedTest.js
- apps/field/src/pages/DiagnosticPage.vue
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>