Every model-provider attempt (LiteLLM callback + native OpenAI/Codex wrapper)
emits an LlmRequestEvent: provider, model, host, outcome, HTTP status,
provider request id (response header first, Anthropic error body fallback),
usage/cost, duration, agent + retry attempt. Prompts, completions, headers
and credentials are never recorded; error text is redacted and truncated.
Agent failure reasons now go through failure_text() so a blocked Anthropic
call's request id lands in the operator-visible failure text.