p2p_private_broadcast.py classifies each SOCKS5 connection by scanning the node's debug log for trying v. connection (...) to <addr>:<port>, then attaches a fake peer for that type. The helper returned the first match in the whole log, so when a feeler selected a clearnet address that private broadcast had used earlier in the run (in the CI failure, [50::1]:8333, about 10 seconds apart), the feeler was labelled private-broadcast, was given the NoRelayP2PInterface, and disconnected as a feeler rather than with the expected "connected in vain" message.
Instead of relying on the debug log, identify the connection via the SOCKS5 proxy client socket's source address, which equals the node's addrbind for that peer, and read connection_type from getpeerinfo. The proxy replies to the SOCKS5 request before invoking destinations_factory, so the node has already registered the peer by the time classification runs. This also stops treating debug.log contents as a stable test interface. Dropping the log scrape removes a full re-read of debug.log per SOCKS5 connection; p2p_private_broadcast.py goes from ~23s to ~14s locally.
Fixes #35843
Tested with:
build/test/functional/test_runner.py p2p_private_broadcast.py p2p_private_broadcast_retry_v1.py --timeout-factor=2, and against the forced-feeler repro from the issue, which no longer mislabels the feeler.