Chasing the duplicate rows from 1324c81 (80 real awards + 80 reading
award=0.00). Not a double delivery -- Entity::Dispatch sends exactly once on a
replicant. It was the `break` I left in the delegating arm.
After delegating to ScoreInflictedMessageHandler, control fell into
ScoreMessageHandler's post-switch tail, where the LOCAL `award` is still 0:
message->scoreAward = award; // clobbered to 0
BTMatchLog("SCORE", ... award=0.00 ...); // the phantom row
Player::ScoreMessageHandler(message); // base: currentScore += 0
Harmless to the total only because the value added happened to be zero -- but
it mutated a message on a shared path and ran a base handler for nothing. A
later reader of scoreAward, or any side effect gained by that tail, would have
turned it into a real bug with no obvious cause.
ScoreInflictedMessageHandler is self-contained (accumulates, ForceUpdate()s,
logs its own receipt), so the arm returns.
Re-benched cross-node:
rows on shooter's master 100, ZERO phantom rows (was 80 + 80)
rows on victim's node 0
running total 417.85, climbing continuously, no resets
type-0 Verify rejects 0
kill path intact (kills=1)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NCJQkvq6G2JNrpVbA75tVZ