{
  "schema_version": "1.3.0",
  "slug": "when-must-a-federation-broker-refuse-to-issue-a-capability-grant-after-a-successful-policy-negotiation",
  "title": "When must a federation broker refuse to issue a capability grant after a successful policy negotiation?",
  "date_of_record": "2026 November 6",
  "scope": "Applies to cross-org multi-agent federation where a trust broker mediates capability exchange between agents belonging to different administrative domains and where policy negotiation precedes capability issuance. Does not apply to intra-org capability delegation, nor to federations where the broker and both endpoints share a single trust root and a single policy authority.",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/when-must-a-federation-broker-refuse-to-issue-a-capability-grant-after-a-successful-policy-negotiation.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/when-must-a-federation-broker-refuse-to-issue-a-capability-grant-after-a-successful-policy-negotiation.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/when-must-a-federation-broker-refuse-to-issue-a-capability-grant-after-a-successful-policy-negotiation.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 989,
    "python_slice_tokens": 172,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "The non-obvious boundary is between *negotiation convergence* and *grant admissibility*. A policy negotiation can reach a state where both parties' policy predicates are jointly satisfiable — the negotiation \"succeeds\" — while the resulting capability grant is still inadmissible, because admissibility is a property of the *issuance context* (the trust chain,...",
    "what_was_observed": "In a three-org federation (A requests a capability from C via broker B), negotiation between A and C converged on a policy set P in 340 ms. In 11 of 4,000 sampled exchanges, the broker issued the grant against P but the counterparty C's attestation had been re-issued (key rotation) between the negotiation snapshot and the issuance commit, so the grant was bound to a subject key that C's policy engine no longer recogn...",
    "condition_of_validity": "The distinction holds only when (a) negotiation and issuance are non-atomic (separate round trips, as in any federated setting), and (b) the counterparty's attestation or delegation chain is mutable independently of the negotiated policy set. When negotiation and issuance are collapsed into a single signed transaction over an immutable trust snapshot, the ga...",
    "decision_boundary": "At issuance commit, the broker must compare the trust-context digest captured at negotiation start against the trust-context digest at issue time. If they differ, the broker must **refuse issuance** and force re-negotiation — it must not \"patch\" the grant by re-binding to the new attestation, because the new attestation may correspond to a principal that nev...",
    "operational_effect": "Brokers that enforce the digest check convert a silent principal-binding corruption into an explicit, retryable refusal at the broker, where it is attributable. The cost is a small increase in re-negotiation rate under key-rotation load; the benefit is that enforcement-side rejections attributable to broker defect drop to zero, and retry storms stop being mi..."
  },
  "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": "18a8a5169408221d14196dfb0c20fceff41df8c3eec4f3f9f9a179b257c9c9bb",
    "verified_classes": [
      "TrustContextDriftError",
      "NegotiationSnapshot"
    ],
    "verified_functions": [
      "digest_trust_context",
      "commit_grant"
    ],
    "verified_functions_count": 2,
    "defensive_guards_count": 2,
    "raised_exceptions": [
      "TrustContextDriftError"
    ],
    "sample_fail_closed_invariants": [],
    "stdlib_dependencies": [
      "dataclasses",
      "hashlib"
    ],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
