What to build
From the 2026-05-27 multi-agent code review (item M4; tracked as F1 in docs/code-review-followups-2026-05-28.md).
The wire decoder accepts a zero-length sid value from the wire; when the local responder has a non-empty SessionID, the message is rejected only by the later SID-equality check with the generic ErrMessage: session id mismatch. A peer probing whether we accept empty SIDs is therefore indistinguishable in logs from any other SID mismatch. The protocol-level acceptance set is unchanged either way — this is about error-message specificity for operators.
Make the decoder (or its immediate Respond caller) aware of cfg.AllowEmptySessionID, and reject a peer-sent empty sid against a responder requiring a non-empty SessionID with a more specific wrapped error such as ErrMessage: peer sent empty session id.
Smaller alternative if the above proves invasive: document in docs/security-assessment.md that the decoder accepts empty fields and that the protocol-level mismatch is the actual rejection point.
Acceptance criteria
Blocked by
None - can start immediately
What to build
From the 2026-05-27 multi-agent code review (item M4; tracked as F1 in
docs/code-review-followups-2026-05-28.md).The wire decoder accepts a zero-length
sidvalue from the wire; when the local responder has a non-emptySessionID, the message is rejected only by the later SID-equality check with the genericErrMessage: session id mismatch. A peer probing whether we accept empty SIDs is therefore indistinguishable in logs from any other SID mismatch. The protocol-level acceptance set is unchanged either way — this is about error-message specificity for operators.Make the decoder (or its immediate
Respondcaller) aware ofcfg.AllowEmptySessionID, and reject a peer-sent emptysidagainst a responder requiring a non-emptySessionIDwith a more specific wrapped error such asErrMessage: peer sent empty session id.Smaller alternative if the above proves invasive: document in
docs/security-assessment.mdthat the decoder accepts empty fields and that the protocol-level mismatch is the actual rejection point.Acceptance criteria
sidagainst a responder requiring non-emptySessionIDis rejected with a specific wrapped errorerrors.Is-matchable asErrMessage; no new exported error values (public API is frozen)AllowEmptySessionID == trueBlocked by
None - can start immediately