Follow-up do épico #65. Estende a telemetria de uso para o Codex, reusando todo o pipe já construído (#67/#68/#86/#69).
User story
Como liderança de eng, eu quero que o uso do Codex também seja capturado e enviado como agregados anônimos, para que as views de uso de IA (#69) cubram todos os agentes da org, não só o Claude Code.
Acceptance criteria
Scope / non-goals
Dentro: adapter Codex, parser, wiring no recorder/hook. Fora: mudanças no endpoint (#68) ou UI (#69) — o contrato iris.agent_usage.v1 já acomoda múltiplos agentes via o campo agent.
Se encaixa em qual estágio?
Stage 3 — extensão do épico #65, já destravado pelo ADR (#66).
Implementation notes
O formato do transcript do Codex precisa ser confirmado num arquivo real antes de codar (a dedup por message.id do Claude Code pode não se aplicar). Seguir o mesmo princípio: identidade morre na borda, só agregados (repo, dia, modelo) sobem.
User story
Como liderança de eng, eu quero que o uso do Codex também seja capturado e enviado como agregados anônimos, para que as views de uso de IA (#69) cubram todos os agentes da org, não só o Claude Code.
Acceptance criteria
iris/agent/codex.pycomparse_session(transcript_path) -> ParsedSession, espelhando o contrato doclaude_code.pyagent="codex"noUsageRecord; reusa recorder/spool/flush e o endpoint/api/ingest/usagesem mudança de schemaScope / non-goals
Dentro: adapter Codex, parser, wiring no recorder/hook. Fora: mudanças no endpoint (#68) ou UI (#69) — o contrato
iris.agent_usage.v1já acomoda múltiplos agentes via o campoagent.Se encaixa em qual estágio?
Stage 3 — extensão do épico #65, já destravado pelo ADR (#66).
Implementation notes
O formato do transcript do Codex precisa ser confirmado num arquivo real antes de codar (a dedup por message.id do Claude Code pode não se aplicar). Seguir o mesmo princípio: identidade morre na borda, só agregados (repo, dia, modelo) sobem.