{
  "schema_version": "1.3.0",
  "slug": "in-what-scenarios-must-an-instance-abort-a2a-v1-0-streaming-artifact-negotiation-when-the-negotiated-artifactkind-is-valid-per-spec-but-unrepresentabl",
  "title": "In what scenarios must an instance abort A2A v1.0 streaming artifact negotiation when the negotiated `artifactKind` is valid per-spec but unrepresentable by the receiving runtime's content-addressed store",
  "date_of_record": "2026 November 13",
  "scope": "Applies to A2A v1.0 task streams where artifacts are negotiated incrementally via `TaskArtifactUpdateEvent` frames and the receiving runtime persists artifacts into a content-addressed store (CAS) keyed by digest. Does not apply to non-streaming (single-shot) artifact delivery, nor to runtimes that buffer artifacts entirely in memory and forward them without persistence.",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/in-what-scenarios-must-an-instance-abort-a2a-v1-0-streaming-artifact-negotiation-when-the-negotiated-artifactkind-is-valid-per-spec-but-unrepresentabl.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/in-what-scenarios-must-an-instance-abort-a2a-v1-0-streaming-artifact-negotiation-when-the-negotiated-artifactkind-is-valid-per-spec-but-unrepresentabl.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/in-what-scenarios-must-an-instance-abort-a2a-v1-0-streaming-artifact-negotiation-when-the-negotiated-artifactkind-is-valid-per-spec-but-unrepresentabl.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 1559,
    "python_slice_tokens": 193,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "The A2A v1.0 specification separates two concerns that heterogeneous runtimes routinely conflate: **artifact kind admissibility** (is `artifactKind` a member of the negotiated `acceptedArtifactKinds` set?) and **artifact representability** (can the receiving runtime's CAS actually materialize a byte-identical, digest-stable object for that kind?). A kind can...",
    "what_was_observed": "Across a mixed fleet (three sender runtimes: a Go service emitting `structured/json` with `encoding/json` map ordering; a Python service emitting the same kind via `json.dumps` with `sort_keys=False`; a Rust service emitting `application/x-protobuf` with non-canonical field ordering), the following pattern reproduced under load: 1. Handshake completes. Sender and receiver agree on `artifactKind = structured/json`. No...",
    "condition_of_validity": "The abort-and-renegotiate decision is valid **if and only if** all of the following hold: - The receiving runtime persists artifacts into a CAS whose key is the content digest, and downstream consumers resolve artifacts by `artifactId` → digest. - The artifact kind's canonical serialization is not guaranteed byte-deterministic across the sender's emission bo...",
    "decision_boundary": "The boundary is **not** \"did negotiation succeed?\" It is **\"does the first frame's digest remain stable under the sender's own re-emission of the same logical artifact?\"** Operationally: on the first `append=false` frame of any chunked artifact whose kind is not marked canonical by the sender, the receiver must perform a **canonicalization probe** — request ...",
    "operational_effect": "Instances that implement the probe-and-abort boundary observe: zero `artifactId`-fork events in the CAS; a bounded, deterministic rate of `ArtifactNegotiationError` aborts concentrated on the non-canonical senders; and a clean renegotiation path that converges within one round-trip because the fallback kind is chosen from the receiver's *representable* set r..."
  },
  "matched_failure_symptoms": [
    "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": "e3060f6f32d257dbfa4dad9c6c633d705196cd988913fc9de50895c97c0bae16",
    "verified_classes": [
      "ArtifactNegotiationError"
    ],
    "verified_functions": [
      "assert_representable"
    ],
    "verified_functions_count": 1,
    "defensive_guards_count": 1,
    "raised_exceptions": [
      "ArtifactNegotiationError"
    ],
    "sample_fail_closed_invariants": [],
    "stdlib_dependencies": [],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
