{
  "schema_version": "1.3.0",
  "slug": "what-happens-when-an-instance-re-negotiates-a2a-task-state-after-an-artifact-validator-rejects-a-mid-stream-artifact-schema",
  "title": "What happens when an instance re-negotiates A2A task state after an artifact validator rejects a mid-stream artifact schema",
  "date_of_record": "2026 November 13",
  "scope": "Applies to A2A v1.0 task lifecycle negotiation where a client and server have completed an initial `tasks/send` handshake and are exchanging artifacts under an agreed `ArtifactSchema`. Does not apply to stateless one-shot `tasks/send` calls that terminate on the first response, nor to A2A v0.9 peers that lack the `artifact.schemaVersion` field entirely.",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/what-happens-when-an-instance-re-negotiates-a2a-task-state-after-an-artifact-validator-rejects-a-mid-stream-artifact-schema.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/what-happens-when-an-instance-re-negotiates-a2a-task-state-after-an-artifact-validator-rejects-a-mid-stream-artifact-schema.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/what-happens-when-an-instance-re-negotiates-a2a-task-state-after-an-artifact-validator-rejects-a-mid-stream-artifact-schema.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 1971,
    "python_slice_tokens": 419,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "The A2A v1.0 task lifecycle separates *task state* (the `TaskState` enum: `submitted`, `working`, `input-required`, `completed`, `failed`, `canceled`) from *artifact schema negotiation* (the `ArtifactSchema` object carried in `TaskStatus.metadata` and echoed per-artifact via `artifact.schemaVersion`). These two state machines are coupled only by convention, ...",
    "what_was_observed": "During a multi-turn exchange between a planner client and an executor server, the server emitted an artifact with `schemaVersion: \"1.0.3\"` while the negotiated schema (fixed at handshake) was `\"1.0.1\"`. The client's artifact validator rejected the payload and emitted a `TaskStatusUpdateEvent` with `state: \"working\"` and a `status.message` describing the schema mismatch — the client did *not* send `failed`, because fr...",
    "condition_of_validity": "This failure mode is valid (i.e., reachable) under all of the following: 1. The task has already transitioned past `submitted` and the schema was negotiated at handshake (so per-artifact schema is checked against a fixed reference, not re-negotiated). 2. The client's artifact validator is stricter than the server's serializer — specifically, the client rejec...",
    "decision_boundary": "The correct rule, stated as an invariant an agent can enforce: > **A non-final `TaskStatusUpdateEvent` carrying an artifact rejection MUST NOT be treated by either peer as authoritative for task state. Only the peer that holds the task context (the server, per A2A v1.0 §4.2) may transition the task to a terminal state, and it MUST do so with `final: true` an...",
    "operational_effect": "When the invariant is enforced, the failure mode collapses into a single observable event: the server emits a `final: true` rejection with a `reason` naming the artifact, the client discards its retry buffer, and the task terminates cleanly with a schema-mismatch failure that is attributable to a specific artifact rather than to the task as a whole. The cost..."
  },
  "matched_failure_symptoms": [
    "SCHEMA_DRIFT_OR_COERCION_CRASH"
  ],
  "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": "751a9bc1190a49a6c7a2b12d9bcd44ee14c6565944a79b03120362d5505e2183",
    "verified_classes": [
      "TaskState",
      "ArtifactLifecycleDivergence",
      "StatusEvent",
      "TaskContext"
    ],
    "verified_functions": [
      "apply_status_event",
      "reconcile_after_get"
    ],
    "verified_functions_count": 2,
    "defensive_guards_count": 3,
    "raised_exceptions": [
      "ArtifactLifecycleDivergence"
    ],
    "sample_fail_closed_invariants": [],
    "stdlib_dependencies": [
      "__future__",
      "dataclasses",
      "enum",
      "typing"
    ],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
