Companion PNA/LNA Probe diagnostic · throwaway

Observe Chrome's public-origin → loopback-companion behavior. This page changes nothing and stores nothing. Pair it with DevTools + the companion log — see README.md.

Page origin:
Secure context: (PNA/LNA requires a secure context; a *.pages.dev origin is secure & public — the exact production condition)
Address-space of this page:
local-network permission: querying… (LNA model exposes this as prompt / granted / denied; "unsupported" ⇒ this Chrome uses classic PNA, not the permission model)
User agent:
Default is the raw loopback IP (the blocked production case). Later, to test the trust-axis target, set this to https://local.filescore.app:8788 once that DNS+cert exists — re-run the same probes and compare. No code change needed.
Only used by the POST probe. Reaching the companion at all is the signal; a token just lets you see a 200 vs 401 instead of a CORS/blocked failure.

Probes (each runs inside a click = user gesture — the condition under which Chrome can show the LNA prompt)

Probe 1 reproduces the exact production timing (Promise.race + 8000ms timer that fires even if the fetch never settles — mirrors companionClient.ts request()). Probe 2 is a bare fetch so you can see the browser's native settle time (does it reject fast, or hang?). Probe 3 adds Authorization+Content-Type, forcing a CORS preflight on top of PNA.
Toggle on, then reload. Comparing gesture vs no-gesture tells us whether the LNA prompt is gated on transient activation — a key design input for where the first companion call must live in the product.

Results

#ProbeTargetGesture ElapsedSettled asHTTPDetailInference
Paste the copied block back into the investigation thread alongside your DevTools/companion-log notes.

Reminder: what JavaScript can see here (settle time, error name, status) is only half the picture. The ground truth — did a socket open, did a preflight appear, did the companion log the request, did a permission chip appear — lives in DevTools → Network, chrome://net-internals, the companion's stdout, and the address bar. Follow README.md.