Root cause: user_message was being emitted from TWO places:
1. agent-manager.recordUserMessage() - called by session.ts before stream()
2. codex-mcp-agent.ts stream() method - was emitting its own user_message
Fix: Remove user_message emission from codex-mcp-agent.ts stream() since
the agent-manager already handles this. Added explanatory comment.
Updated test to expect 0 user_messages from provider (agent-manager
handles this through the full stack).
Verified via Playwright E2E: created new Codex agent, sent "test fix",
confirmed only ONE user message appears in UI.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>