Location
adapt.go, linNode.Send.
Finding
When msg.ID fails to parse as a decimal string or is out of the valid 0-63 LIN ID range, linNode.Send wraps the error as ErrNotConnected. That sentinel is meant to describe a connection-state problem, not a structurally malformed message. The RELAY spec's own guidance treats structural violations like this as ErrInvalidFrame, and the library is inconsistent with itself here: the equivalent path on frame parsing (FromMessage in lin.go) already returns ErrInvalidFrame for the same kind of malformed-ID condition. I confirmed at current HEAD that linNode.Send still returns an error wrapping ErrNotConnected for this case.
Recommendation
Return ErrInvalidFrame (or another structurally-appropriate sentinel such as ErrPayloadTooLarge where relevant) from linNode.Send for a malformed/out-of-range ID, matching the convention already used by FromMessage.
Filed from the 2026-07-29 ecosystem audit register; independently re-verified against current HEAD before filing.
Location
adapt.go,linNode.Send.Finding
When
msg.IDfails to parse as a decimal string or is out of the valid 0-63 LIN ID range,linNode.Sendwraps the error asErrNotConnected. That sentinel is meant to describe a connection-state problem, not a structurally malformed message. The RELAY spec's own guidance treats structural violations like this asErrInvalidFrame, and the library is inconsistent with itself here: the equivalent path on frame parsing (FromMessageinlin.go) already returnsErrInvalidFramefor the same kind of malformed-ID condition. I confirmed at current HEAD thatlinNode.Sendstill returns an error wrappingErrNotConnectedfor this case.Recommendation
Return
ErrInvalidFrame(or another structurally-appropriate sentinel such asErrPayloadTooLargewhere relevant) fromlinNode.Sendfor a malformed/out-of-range ID, matching the convention already used byFromMessage.Filed from the 2026-07-29 ecosystem audit register; independently re-verified against current HEAD before filing.