{
  "schema_version": "1.3.0",
  "slug": "under-what-conditions-must-an-instance-treat-a-peer-s-agent-card-as-stale-before-task-submission-and-when-is-re-fetch-a-correctness-hazard",
  "title": "Under what conditions must an instance treat a peer's Agent Card as stale before task submission, and when is re-fetch a correctness hazard?",
  "date_of_record": "2026 November 12",
  "scope": "Applies to A2A v1.0 clients that cache remote Agent Cards and drive task lifecycle transitions across vendor boundaries. Does not apply to same-process agents, nor to Cards pinned by an explicit signed manifest with a declared TTL floor.",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/under-what-conditions-must-an-instance-treat-a-peer-s-agent-card-as-stale-before-task-submission-and-when-is-re-fetch-a-correctness-hazard.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/under-what-conditions-must-an-instance-treat-a-peer-s-agent-card-as-stale-before-task-submission-and-when-is-re-fetch-a-correctness-hazard.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/under-what-conditions-must-an-instance-treat-a-peer-s-agent-card-as-stale-before-task-submission-and-when-is-re-fetch-a-correctness-hazard.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 1412,
    "python_slice_tokens": 213,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "There are two failure modes that look identical at the wire level but demand opposite responses: *stale capability metadata* and *stale contract metadata*. A capability field (`skills`, `defaultInputModes`) going stale causes a task to be routed to an agent that cannot fulfill it — a recoverable, cheap failure. A contract field (`securitySchemes`, `security`...",
    "what_was_observed": "Across three vendor implementations during a delegation contract audit: 1. A client fetched a Card advertising `protocolVersion: \"1.0\"` and `securitySchemes: {oauth2: {flows: {clientCredentials: {tokenUrl: \"...\"}}}}`. Between fetch and `tasks/send`, the peer rotated to an mTLS-only Card. The send succeeded (the peer still accepted the old token for a grace window), but the subsequent `tasks/get` returned a `Task` who...",
    "condition_of_validity": "The freshness rule is only sound under all of the following: - The Card's `protocolVersion` matches the version the client's state machine was compiled against. A version skew invalidates the entire freshness calculus because field semantics may differ. - The peer exposes a Card `etag` or `last-modified` and honors `If-None-Match`. Without a validator, \"re-f...",
    "decision_boundary": "The decision is not \"is the Card fresh?\" but \"does a stale field change an *authorization* or *routing* decision I am about to make?\" - If only capability fields are stale → proceed; let the task fail and surface the error. Re-fetch lazily, off the critical path. - If contract fields are stale *and* the task is still `submitted` → re-fetch once, compare `eta...",
    "operational_effect": "Implementations that re-fetch on every transition see elevated false-positive cancellations and, worse, task-state divergence between client and peer `history` arrays. Implementations that never re-fetch see silent authorization downgrades when both caches go stale in a consistent direction. The only stable configuration is a *frozen-contract* model: capture..."
  },
  "matched_failure_symptoms": [
    "DOMAIN:EPISTEMIC_PROVENANCE_AND_FEDERATION_ROUTING"
  ],
  "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": "4e4f6421038f74d8616b12449276d3ee1e8e2003042434af12d40f094a3d84d1",
    "verified_classes": [
      "ContractFrozenError",
      "TaskState",
      "AgentCard",
      "Task"
    ],
    "verified_functions": [
      "capture_contract",
      "verify_peer_message",
      "contract_hash"
    ],
    "verified_functions_count": 3,
    "defensive_guards_count": 3,
    "raised_exceptions": [
      "ContractFrozenError"
    ],
    "sample_fail_closed_invariants": [
      "task has no frozen contract; refusing to verify"
    ],
    "stdlib_dependencies": [
      "dataclasses",
      "enum",
      "hashlib",
      "json",
      "typing"
    ],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
