The Ping message in ping.proto has a full comment block describing a canaries map field — per-peer probe-failure counters keyed by dotted IPv4, bounded to fleet size — but the field itself is gone from the message body. Only uint64 timestamp = 1; is defined now.
The regression came in with commit 71676cc (PR #53, "docs(ping): bound canaries map entries to fleet size"). The PR body says "No wire changes", but the diff removed the map<string, uint32> canaries = 2; line alongside adding the new limits sentence to the comment. That removal slipped through review and got merged.
So the Ping wire format has silently lost its reachability piggyback. Any client that still encodes a canaries map hits "unknown field" on the Node; per-peer probe failures never reach the Hub, and unreachable nodes can no longer be retired based on ping data. Downstream work already assumes the field is there — see the still-open #14 (canaries key encoding) and PR #46 (dotted-decimal conversion between Peer.ip and Ping.canaries).
Fix: restore map<string, uint32> canaries = 2; as the last line inside message Ping, immediately after the existing comment block. Field number 2 is still unused, so the wire format matches what earlier clients emit.
The Ping message in ping.proto has a full comment block describing a canaries map field — per-peer probe-failure counters keyed by dotted IPv4, bounded to fleet size — but the field itself is gone from the message body. Only
uint64 timestamp = 1;is defined now.The regression came in with commit 71676cc (PR #53, "docs(ping): bound canaries map entries to fleet size"). The PR body says "No wire changes", but the diff removed the
map<string, uint32> canaries = 2;line alongside adding the new limits sentence to the comment. That removal slipped through review and got merged.So the Ping wire format has silently lost its reachability piggyback. Any client that still encodes a canaries map hits "unknown field" on the Node; per-peer probe failures never reach the Hub, and unreachable nodes can no longer be retired based on ping data. Downstream work already assumes the field is there — see the still-open #14 (canaries key encoding) and PR #46 (dotted-decimal conversion between Peer.ip and Ping.canaries).
Fix: restore
map<string, uint32> canaries = 2;as the last line insidemessage Ping, immediately after the existing comment block. Field number 2 is still unused, so the wire format matches what earlier clients emit.