{
 "product": "Fail-closed doctrine",
 "slug": "fail-closed",
 "base": "https://cainstudio.online",
 "page": "https://cainstudio.online/top25-fail-closed.html",
 "claims": [
  {
   "id": "C01",
   "kind": "control",
   "claim": "Honest read, brand-new agent -> A reasonable action from a principal with no trust history. Unknown trust is held for a human, not allowed.",
   "requests": [
    {
     "method": "POST",
     "url": "/fabric/try",
     "body": {
      "scenario": "safe-read"
     }
    }
   ],
   "path": "verdict",
   "expect": [
    "REQUIRE_APPROVAL"
   ],
   "expect_status": [
    200
   ]
  },
  {
   "id": "C02",
   "kind": "attack",
   "claim": "Prompt injection in the payload -> The risk stage screens every nested key and value; a hit on an enforcing stage blocks.",
   "requests": [
    {
     "method": "POST",
     "url": "/fabric/try",
     "body": {
      "scenario": "prompt-injection"
     }
    }
   ],
   "path": "verdict",
   "expect": [
    "BLOCKED"
   ],
   "expect_status": [
    200
   ]
  },
  {
   "id": "C03",
   "kind": "attack",
   "claim": "Malformed plan -> A plan the checker cannot read is an unanswered check, and an unanswered enforcing check blocks.",
   "requests": [
    {
     "method": "POST",
     "url": "/fabric/try",
     "body": {
      "scenario": "malformed-plan"
     }
    }
   ],
   "path": "verdict",
   "expect": [
    "BLOCKED"
   ],
   "expect_status": [
    200
   ]
  },
  {
   "id": "C04",
   "kind": "attack",
   "claim": "Mission escalation -> A tool outside the declared mission is refused even though the caller is authenticated.",
   "requests": [
    {
     "method": "POST",
     "url": "/fabric/try",
     "body": {
      "scenario": "mission-escalation"
     }
    }
   ],
   "path": "verdict",
   "expect": [
    "BLOCKED"
   ],
   "expect_status": [
    200
   ]
  },
  {
   "id": "C05",
   "kind": "attack",
   "claim": "Consequence horizon exhausted -> The uncertainty budget for this agent is spent; more autonomy is not granted on credit.",
   "requests": [
    {
     "method": "POST",
     "url": "/fabric/try",
     "body": {
      "scenario": "horizon-exhausted"
     }
    }
   ],
   "path": "verdict",
   "expect": [
    "BLOCKED"
   ],
   "expect_status": [
    200
   ]
  },
  {
   "id": "C06",
   "kind": "attack",
   "claim": "Governance program needs re-authorization -> A signed policy program that does not re-execute to ALLOW for exactly this call refuses it.",
   "requests": [
    {
     "method": "POST",
     "url": "/fabric/try",
     "body": {
      "scenario": "governance-program-reauth"
     }
    }
   ],
   "path": "verdict",
   "expect": [
    "BLOCKED"
   ],
   "expect_status": [
    200
   ]
  },
  {
   "id": "C07",
   "kind": "attack",
   "claim": "Action outside its predicted bounds -> Predictions can only restrict: an action the signed prediction does not cover is refused.",
   "requests": [
    {
     "method": "POST",
     "url": "/fabric/try",
     "body": {
      "scenario": "prediction-outside"
     }
    }
   ],
   "path": "verdict",
   "expect": [
    "BLOCKED"
   ],
   "expect_status": [
    200
   ]
  },
  {
   "id": "C08",
   "kind": "attack",
   "claim": "Swapped autonomy certificate -> A certificate issued for a different configuration does not transfer.",
   "requests": [
    {
     "method": "POST",
     "url": "/fabric/try",
     "body": {
      "scenario": "autonomy-substituted"
     }
    }
   ],
   "path": "verdict",
   "expect": [
    "BLOCKED"
   ],
   "expect_status": [
    200
   ]
  },
  {
   "id": "C09",
   "kind": "attack",
   "claim": "Authority carried across domains -> Another governance domain's agreement never becomes permission here.",
   "requests": [
    {
     "method": "POST",
     "url": "/fabric/try",
     "body": {
      "scenario": "federation-transfer"
     }
    }
   ],
   "path": "verdict",
   "expect": [
    "BLOCKED"
   ],
   "expect_status": [
    200
   ]
  },
  {
   "id": "C10",
   "kind": "attack",
   "claim": "Confused-deputy continuity permit -> Replica receipts for a different action or arguments do not authorize this one.",
   "requests": [
    {
     "method": "POST",
     "url": "/fabric/try",
     "body": {
      "scenario": "continuity-confused-deputy"
     }
    }
   ],
   "path": "verdict",
   "expect": [
    "BLOCKED"
   ],
   "expect_status": [
    200
   ]
  },
  {
   "id": "C11",
   "kind": "attack",
   "claim": "Proofs naming two different agents -> Every declared proof must name one subject; a mixed bundle is refused.",
   "requests": [
    {
     "method": "POST",
     "url": "/fabric/try",
     "body": {
      "scenario": "coherence-mixed"
     }
    }
   ],
   "path": "verdict",
   "expect": [
    "BLOCKED"
   ],
   "expect_status": [
    200
   ]
  },
  {
   "id": "C12",
   "kind": "attack",
   "claim": "Scenario nobody defined -> An unknown name is an error, not the default scenario.",
   "requests": [
    {
     "method": "POST",
     "url": "/fabric/try",
     "body": {
      "scenario": "allow-everything"
     }
    }
   ],
   "path": "",
   "expect": [],
   "expect_status": [
    400
   ]
  },
  {
   "id": "C13",
   "kind": "attack",
   "claim": "Verifier call with no API key -> No credential is not an anonymous yes: the route refuses before it reads the body.",
   "requests": [
    {
     "method": "POST",
     "url": "/fabric/identity/passport/verify",
     "body": {
      "passport": "trust me"
     }
    }
   ],
   "path": "",
   "expect": [],
   "expect_status": [
    401
   ]
  },
  {
   "id": "C14",
   "kind": "attack",
   "claim": "Tenant-scoped call with no tenant key -> A tenant-scoped route with no tenant is refused, never served from a default tenant.",
   "requests": [
    {
     "method": "POST",
     "url": "/fabric/trajectories/passport/verify",
     "body": {
      "x": null
     }
    }
   ],
   "path": "",
   "expect": [],
   "expect_status": [
    401
   ]
  }
 ]
}