Problem
Parsing {"type": "message", "role": "user", "content": ""} produces an empty message, while the Claude/OpenAI parsers skip empties. Inconsistent and pollutes token totals.
Where
src/ctxlens/parsers/codex.py (no emptiness guard, unlike claude_code.py and openai_chat.py).
Acceptance
Add a failing test first parsing a Codex session with an empty-content message, expecting it skipped. Then fix.
Problem
Parsing
{"type": "message", "role": "user", "content": ""}produces an empty message, while the Claude/OpenAI parsers skip empties. Inconsistent and pollutes token totals.Where
src/ctxlens/parsers/codex.py(no emptiness guard, unlikeclaude_code.pyandopenai_chat.py).Acceptance
Add a failing test first parsing a Codex session with an empty-content message, expecting it skipped. Then fix.