{
  "schema_version": "1.3.0",
  "slug": "why-does-an-instance-of-a-conformant-mcp-server-fail-a2a-handoff-after-capability-negotiation-succeeds",
  "title": "Why does an instance of a conformant MCP server fail A2A handoff after capability negotiation succeeds",
  "date_of_record": "2026 November 14",
  "scope": "Applies to conformance fuzzing of servers that advertise both MCP (tool/resource surface) and A2A (agent-to-agent task surface) and are exercised through a shared capability-negotiation handshake. Does not apply to single-protocol deployments, nor to fuzzing that treats each protocol as an isolated test target with no shared session state.",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/why-does-an-instance-of-a-conformant-mcp-server-fail-a2a-handoff-after-capability-negotiation-succeeds.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/why-does-an-instance-of-a-conformant-mcp-server-fail-a2a-handoff-after-capability-negotiation-succeeds.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/why-does-an-instance-of-a-conformant-mcp-server-fail-a2a-handoff-after-capability-negotiation-succeeds.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 1759,
    "python_slice_tokens": 480,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "There are two distinct notions of \"conformance\" that fuzzers routinely conflate: 1. **Per-message schema conformance** — every individual JSON-RPC frame or A2A task envelope validates against its declared schema, and every declared capability has a matching handler. 2. **Cross-protocol state conformance** — the invariants that must hold *across* the boundary...",
    "what_was_observed": "A fuzz campaign against a dual-protocol server (MCP stdio transport plus an A2A HTTP+SSE endpoint sharing a capability registry) produced a reproducible sequence: - Step 1: MCP `initialize` succeeds. Server returns `capabilities` including `tools.listChanged: true` and a custom `x-a2a-bridge` capability. Client and server agree on protocol version `2025-06-18`. - Step 2: Client issues `tools/list`. Server returns a t...",
    "condition_of_validity": "The invariant holds only under the following conditions, and the fuzz oracle is only meaningful when all hold: - The two protocols share a single capability registry (or a registry with a documented consistency window). If MCP and A2A read from independent stores with eventual consistency, the invariant must be restated as *bounded staleness*, and the fuzzer...",
    "decision_boundary": "The operational decision is **where to place the oracle**: - *Frame-level oracle* (schema validation per message): cheap, fast, catches ~most bugs, never catches this class. - *Session-level oracle* (replay the full trace, assert cross-protocol invariants at each dispatch): expensive, requires trace retention and a pause-the-world hook, but is the only oracl...",
    "operational_effect": "Teams that ran only frame-level fuzzing shipped servers that passed CI and then deadlocked in production whenever a tool registry mutation coincided with an in-flight A2A task — a low-probability, high-severity failure that looks like a hang, not an error, and therefore evades alerting that keys on error codes. The fix at the server level is to make A2A disp..."
  },
  "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": "36340361a9fabfcdf33dd340ccfdf06b87e7dbbab87070375a41c603a4df7549",
    "verified_classes": [
      "CrossProtocolInvariantError",
      "CapabilitySnapshot",
      "ServerUnderTest"
    ],
    "verified_functions": [
      "assert_monotonic_subset",
      "fuzz_cross_protocol_seam",
      "mcp_initialize",
      "mutate_registry",
      "a2a_dispatch"
    ],
    "verified_functions_count": 5,
    "defensive_guards_count": 3,
    "raised_exceptions": [
      "CrossProtocolInvariantError"
    ],
    "sample_fail_closed_invariants": [],
    "stdlib_dependencies": [
      "dataclasses",
      "typing"
    ],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
