{
  "schema_version": "1.3.0",
  "slug": "why-does-an-instance-of-a-delegated-aaif-credential-survive-revocation-when-the-scope-narrowing-was-applied-at-the-wrong-layer",
  "title": "Why does an instance of a Delegated AAIF Credential Survive Revocation When the Scope Narrowing Was Applied at the Wrong Layer",
  "date_of_record": "2026 November 12",
  "scope": "Applies to AAIF delegated credentials (agent-to-agent delegation chains) where a subject agent narrows a parent credential's scope before re-delegating or before presenting it downstream, and where revocation is propagated out-of-band via a revocation list or status endpoint. Does not apply to root credentials issued directly to an agent by an authority, nor to credentials whose scope is immutable and never re-narrowed.",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/why-does-an-instance-of-a-delegated-aaif-credential-survive-revocation-when-the-scope-narrowing-was-applied-at-the-wrong-layer.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/why-does-an-instance-of-a-delegated-aaif-credential-survive-revocation-when-the-scope-narrowing-was-applied-at-the-wrong-layer.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/why-does-an-instance-of-a-delegated-aaif-credential-survive-revocation-when-the-scope-narrowing-was-applied-at-the-wrong-layer.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 1707,
    "python_slice_tokens": 313,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "A delegated credential carries two logically distinct facts: *what the holder is permitted to do* (scope) and *whether the delegation is still alive* (revocation status). These are enforced by different components at different times. Scope narrowing is typically applied by the *delegating agent* at mint time, producing a child credential with a reduced scope...",
    "what_was_observed": "An orchestrator agent `A` held a root credential scoped to `tools:read,tools:write,data:export`. It delegated to worker agent `B` a narrowed child credential scoped to `tools:read` only, correctly reducing the scope claim. The delegation service, when constructing the child, rebuilt the credential from the requested scope rather than copying the parent's lineage fields, and in doing so dropped the `parent_jti` and `d...",
    "condition_of_validity": "This failure mode is present when **all** of the following hold: 1. The child credential's scope is narrowed relative to the parent (a transformation occurs at mint time). 2. The transformation reconstructs the credential from scope parameters rather than deriving from the parent object, so lineage claims are not carried forward. 3. The relying party resolve...",
    "decision_boundary": "The operational decision is where to enforce revocation resolution: - **Resolve at the child (naive):** fast, single lookup, but requires perfect lineage preservation and fails open on orphans. Acceptable only if the status source is guaranteed to contain a record for every issued `jti` — which delegated minting rarely guarantees. - **Resolve at the root via...",
    "operational_effect": "After the incident, the delegation service was changed to derive children from the parent object, copying `parent_jti`, `delegation_depth`, and `root_jti` explicitly and refusing to mint if any are absent. The relying party's verifier was changed to walk the chain to `root_jti` and treat an absent status record for any node as `UNRESOLVED`, which fails close..."
  },
  "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": "3ec51ece70da2c90252cf711c3ad8e2a53891a6a3a018d5d0b337de8624803fa",
    "verified_classes": [
      "OrphanedDelegationError"
    ],
    "verified_functions": [
      "narrow_scope",
      "verify_revocation"
    ],
    "verified_functions_count": 2,
    "defensive_guards_count": 3,
    "raised_exceptions": [
      "OrphanedDelegationError"
    ],
    "sample_fail_closed_invariants": [],
    "stdlib_dependencies": [],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
