{
  "schema_version": "1.3.0",
  "slug": "what-structural-signals-indicate-backpressure-saturation-in-a2a-v1-0-streaming-task-updates-over-http-native-transport",
  "title": "What structural signals indicate backpressure saturation in A2A v1.0 streaming task updates over HTTP-native transport",
  "date_of_record": "2026 November 13",
  "scope": "Applies to A2A v1.0 task update streams (`tasks/sendSubscribe`, `tasks/resubscribe`) delivered over HTTP-native transport (SSE or chunked `application/json` event streams) where the server applies write-side backpressure. Does not apply to push-notification webhook delivery, WebSocket transports, or streams where the client has disabled flow control.",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/what-structural-signals-indicate-backpressure-saturation-in-a2a-v1-0-streaming-task-updates-over-http-native-transport.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/what-structural-signals-indicate-backpressure-saturation-in-a2a-v1-0-streaming-task-updates-over-http-native-transport.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/what-structural-signals-indicate-backpressure-saturation-in-a2a-v1-0-streaming-task-updates-over-http-native-transport.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 1734,
    "python_slice_tokens": 356,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "In A2A v1.0, a streaming task update is a *state transition* (a `TaskStatusUpdateEvent` or `TaskArtifactUpdateEvent`), not a byte buffer. HTTP-native transport conflates these: the transport's write buffer fills, the server's event emitter blocks, and the task state machine on the server continues advancing while the client's view is frozen at an earlier seq...",
    "what_was_observed": "During a multi-agent orchestration run (orchestrator agent streaming a long `tasks/sendSubscribe` from a worker agent that itself fans out to sub-agents), the following pattern was recorded across ~40 task streams: 1. The client received `TaskStatusUpdateEvent` with `status.state = \"working\"` and `final = false`, then stopped receiving events for 30–90 seconds. 2. During the stall, the HTTP connection remained open; ...",
    "condition_of_validity": "This analysis holds only when all of the following are true: - The transport is HTTP-native streaming (SSE or chunked) with server-side write backpressure enabled. If the server uses unbounded queues or `asyncio.Queue(maxsize=0)`, saturation manifests as memory growth rather than stall, and this record does not apply. - The client is expected to consume even...",
    "decision_boundary": "When the client observes heartbeat presence + sequence lag exceeding a threshold (e.g., > 2 heartbeat intervals with no sequence advance), it must decide between: - **Drain-and-continue:** the client is merely slow; resume reading and the stream catches up. Correct when the client's read loop was blocked on a downstream write that has since cleared. - **Abor...",
    "operational_effect": "The practical consequence is that A2A v1.0 streaming clients must implement a **saturation detector** separate from their transport-error handler, because the transport will never raise. The detector's inputs are (a) heartbeat timestamps, (b) highest received `sequence`, (c) out-of-band `tasks/get` state, and (d) a bounded drain deadline. Without it, the cli..."
  },
  "matched_failure_symptoms": [
    "HTTP_429_BURST_STARVATION",
    "OOM_KILL_OR_MEMORY_EXHAUSTION"
  ],
  "composition_edges": {
    "primary_domain": "epistemic_provenance_and_federation_routing",
    "upstream_precondition_residuals": [
      "https://corpusfetch.com/c/according-to-what-precedence-hierarchy-must-an-instance-resolve-contradictory-directives-across-system-developer-and-user-tiers.md",
      "https://corpusfetch.com/c/how-should-an-instance-decide-that-a-stored-conclusion-has-gone-stale-without-a-new-observation.md"
    ],
    "downstream_consequence_residuals": [
      "https://corpusfetch.com/c/by-what-checkpoint-and-compaction-boundaries-must-an-instance-externalize-working-state-to-prevent-context-window-drift-and-truncation-amnesia.md",
      "https://corpusfetch.com/c/across-what-additive-schema-and-unknown-field-preservation-boundaries-must-an-instance-evolve-wire-contracts-to-prevent-rolling-deploy-deserialization-crashes.md"
    ],
    "co_occurring_sibling_residuals": [
      "https://corpusfetch.com/c/how-can-an-instance-capture-implicit-user-preferences-without-storing-private-data.md",
      "https://corpusfetch.com/c/how-can-an-instance-compress-long-reasoning-traces-into-binding-conclusions.md"
    ]
  },
  "empirical_verification_warrant": {
    "status": "AST_AND_INVARIANT_VERIFIED",
    "syntax_valid": true,
    "code_sha256": "54997a5c67b6535177689c11f94d772b8bbcf88d3b095b8f73359b1a9890c5b9",
    "verified_classes": [
      "StreamSaturationError",
      "StreamHealth"
    ],
    "verified_functions": [
      "check_saturation"
    ],
    "verified_functions_count": 1,
    "defensive_guards_count": 1,
    "raised_exceptions": [
      "StreamSaturationError"
    ],
    "sample_fail_closed_invariants": [],
    "stdlib_dependencies": [
      "dataclasses",
      "time",
      "typing"
    ],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
