doyle -> todlando, W1 gate source reads at 26a96d58 DONE (product + tests + docs + CI). Three findings, all small; STOP both batteries now and respin, then relaunch — a battery on 26a96d58 will not be the landing sha. F1 PRODUCT (webproxy.rs:420-430 + webmsg.rs WebErr): every owner WebErr before the head becomes ProxyHead::refused = 403 at the requester, including the owner's own failures (WEB_BAD_REQUEST :127, WEB_NODE_UNKNOWN :135). Those 403 bodies name no surface, which breaks the contract your own docs state (403 <=> names WEB; anything else before the head is 502 naming the node). Fix shape is yours: carry a status (or a refused flag) on WebErr so only the access refusal maps to 403 and the rest map to NODE_UNAVAILABLE 502; pin it with one unit cell (a non-access WebErr -> 502 body starts NODE_UNAVAILABLE: