The containment ruleStop on the first empty completed identity. Retries can persist the failure, poison provider history, and turn a live protocol fault into an unreadable Session.
Tagged alpha.1 still needs the regression.

The translator retains the rc.2 overwrite guards. Existing tests cover omitted continuation fields and never-identified calls, but not a valid first identity followed by explicit empty values.

Do not debug the wrong boundary.

Identity survivedname: "read"

Inspect catalog, preset, registration, and policy.

Identity emptyname: ""

Inspect ordered wire deltas before touching authorization.

The fault crosses four trust boundaries.

Stream"" + ""
→
PolicyUNKNOWN_TOOL
→
PersistcallId: ""
→
ReplayHTTP 400
→
Restorecorrupt

Capture the smallest decisive bundle.

  1. WireOrdered deltas for one call index, including omitted versus explicit empty fields.
  2. SessionAssistant block, call, result source, inner result ID, and sequence numbers.
  3. RestoreThe rejected sequence plus a fresh-Session and route A/B control.
first  { id: "call_8f2", name: "read" }
next   { id: "",          name: ""     }
result { source.callId: "", toolCallId: "" }
resume message must have tool source

Keep the safety boundary intact.

Stop every writer

Preserve and hash the complete Session directory before inspection.

Continue fresh

Use an authorized working route and independently verified workspace state.

Never allow empty

Do not weaken policy or globally rewrite a live log.

Ship the regression, not just the guard.

Primary evidence.

Keep the complete incident runbook.

The canonical guide includes source-pinned writer and reader analysis, correlated event evidence, bounded recovery, regression gates, and a minimal report template.

Read the complete guide