Second slice of making MessageBusManagementThread testable. The CH (live)
and CR (history) chat-frame branches of processRXMessage23001 were near
copies; they are now one processChatFrame(fields, live), with behaviour
unchanged.
- InboundChatFrame, ChatRoute and classifyRoute: where a message belongs
(public, to me, from me, between others), pure.
- ChatMessageEffects and decideChatFrameEffects: what a message triggers
(sounds, //BELL, //VER reply, auto-answer, directional tick, in-angle
flag, DX cluster spot), pure. History frames trigger nothing but the flag.
- The four live/history differences are kept on purpose: frequency
detection before routing (live) or after publishing (history), effects
for messages to me, tick and spot between others, AirScout info on the
SERVER sender.
- MessageBusManagementThreadChatFrameTest pins both branches through the
real thread, including the frequency order on directed frames and the
spot entry; ChatFrameDecisionTest covers the pure functions.
- Spec: docs/superpowers/specs/2026-10-16-message-bus-second-slice-design.md
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>