{"version":"2.1.213","anchor":"sdk-protocol-heartbeat-and-subagent-retry-tool-progress-filt","canonical_anchor":"sdk-protocol-heartbeat-and-subagent-retry-tool-progress-filt","heading":"SDK Protocol: Heartbeat and Subagent-Retry tool_progress Filtering","tier":null,"area":null,"scope":null,"heads_up":null,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.213\/e\/sdk-protocol-heartbeat-and-subagent-retry-tool-progress-filt","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.213","markdown":"### SDK Protocol: Heartbeat and Subagent-Retry tool_progress Filtering\n\n**What**\n\nThe SDK message adapter now silently drops `tool_progress` frames that carry heartbeat or subagent-retry payloads instead of surfacing them as messages.\n\n**Details**\n\n- `tool_progress` frames with `heartbeat: true` or a `subagent_retry` object are now filtered\n- These frames exist for session keepalive and retry signaling; passing them to SDK consumers as messages caused confusion\n- A debug log entry is written: `[sdkMessageAdapter] Ignoring heartbeat\/subagent-retry tool_progress frame`\n\n**Evidence**\n\nFilter logic (search for `\"[sdkMessageAdapter] Ignoring heartbeat\/subagent-retry tool_progress frame\"`)"}