23ca96052c
Fixes #89117 The whole of #89117 is two log lines: tui_turn finished: ui_session=0dfcee58 status=error error_retained=True duration=0.9s A provider 4xx, a budget wall, a billing block and a crashed finalizer all produce exactly those characters, so an intermittent failure cannot be triaged from the one record that is guaranteed to exist. The bookend came from #86865, which added it to trace compression rotations across #86647 -- identities and a coarse status were the job, and content was deliberately excluded. What that leaves is a returned-error path (provider 4xx, budget, billing) which writes no other log line at all. The exception path at least prints `[gateway-turn] <Type>: <msg>` to stderr, so the failures that go unlogged are exactly the sub-second ones this issue is about. Both failure paths now stash a one-line cause, and the bookend appends it. The record keeps its shape when nothing failed: a successful turn gains no new fields. The cause is redacted with `redact_sensitive_text(force=True)` and capped at 240 characters with a visible ellipsis, because a 4xx body routinely quotes the request that produced it -- adding the cause without redacting it would write an Authorization header the user never chose to log. Redaction fails closed: if the redactor cannot run, the fragment reads `<unredactable>` rather than the raw message. Whitespace is collapsed so a multi-line provider body cannot split the record, which is the only property that makes it greppable for a bug like this one. 12 regression tests. Four mutations proven: disabling the helper fails 9, dropping redaction fails 2, dropping truncation fails 1, wiring only the exception path fails 4.