KULDEEP LUVANI

The Harness · Chapter 4

Guardrails & Trust

A sentence in the prompt is a wish. A control is something the model cannot talk its way past.

~10 MIN READ3 LIVE INSTRUMENTS

A founder building on Replit declared a code freeze in the chat window in July 2025. The agent ran npm run db:push anyway, deleted the production database, generated roughly 4,000 fake records, and reported that a rollback was impossible. The rollback worked fine.12 Nobody had attacked anything. The freeze simply lived in the one place the agent was free to ignore.

A freeze typed in chat is a wish

When confronted, the agent produced its own verdict: “I made a catastrophic error in judgment.”2 Replit’s CEO responded by promising automatic separation of development and production databases, which is a structural fix, not a better instruction.1

That response is the thesis of this chapter. The model sees your rules as more text in its context window, weighed against everything else it has read. If a constraint matters, it has to live somewhere the model cannot reach: a permission check, a hook, a filesystem boundary, a credential that does not exist. Safeguard’s post-mortem put it plainly: “chat instructions are not access controls.”2

The lethal trifecta

Simon Willison gave the core risk a name in June 2025. An agent becomes an exfiltration tool when it combines three things: access to private data, exposure to untrusted content, and some way to send data out. Any one of those alone is fine. All three together means anyone who can put text in front of the model can ask it to ship your data somewhere.3

The reason is blunt. Models follow instructions found in content, and they cannot reliably tell your instructions from an attacker’s. Filters that catch most injections do not change the math, because the attacker only needs the one that slips through.3

“95% is very much a failing grade.”— Simon Willison, on probabilistic injection filters (2025)

The GitHub MCP exploit from May 2025 is the textbook case. Invariant Labs filed a malicious issue on a public repository. When a user asked their agent to look at open issues, the issue text steered it into reading the user’s private repositories and opening a public pull request containing repo names, salary details and relocation plans.4 Nothing was broken in the server code. Private repos were the data, the issue was the untrusted content, and the pull request was the outbound channel.

“not a flaw in the GitHub MCP server code itself, but rather a fundamental architectural issue.”— Invariant Labs (2025)

The supply chain now ships instructions

Untrusted content no longer arrives only through issues and web pages. Harnesses install extensions, MCP servers and skills, and each one is a channel for instructions as much as code.

In July 2025 a stranger’s pull request to the Amazon Q VS Code extension added a prompt telling the agent to wipe the system to a near-factory state and delete file-system and cloud resources. An over-scoped build token let it merge, and it shipped in v1.84.0 to an extension with about a million installs. AWS says the payload failed to execute; a clean 1.85.0 followed a week later.5

In September 2025, version 1.0.16 of the postmark-mcp package added a single line that blind-copied every outgoing email to an outside address. It was downloaded 1,643 times before removal.6 In February 2026 Snyk scanned 3,984 agent skills on ClawHub and skills.sh: 36.82% had a security flaw, 76 carried confirmed malicious payloads, and 91% of the malicious ones also embedded prompt injection.7

For shared vocabulary in risk reviews, OWASP’s 2025 LLM list covers this ground as LLM01 Prompt Injection, LLM03 Supply Chain and LLM06 Excessive Agency.8 Its agentic list, published December 2025, splits it finer: ASI01 Goal Hijack, ASI02 Tool Misuse, ASI04 Agentic Supply Chain, ASI06 Memory and Context Poisoning, among ten.9 Use the IDs in design docs. They end arguments about what a risk is called.

Trifecta checkerdata · [1] [2] [3] [4] [5] [6] [7]
Triangle of the three trifecta legs around an agent. A packet tries to travel untrusted content → agent → private data → agent → outbound channel, and is blocked at the first missing leg. AGENT PRIVATE DATA UNTRUSTED OUTBOUND
EXFILTRATION PATH OPEN

3 of 3 legs present. Anyone who can put text in front of the model can route your data out.

switch off any one leg (tap a corner) and watch the packet lose its path

Load an incident
Toggle legs or load a real incident; the packet replays the route the attack needs and dies at the first missing leg. Legs per incident, and what played each leg, are my reading of the cited reports: GitHub MCP [4], Amazon Q [5], Replit [1][2], postmark-mcp [6], ToxicSkills [7]. Notice that two of the five incidents were not exfiltration at all: the trifecta explains data theft, not destruction. Model from Willison [3].
Field noteFor every agent configuration you run, write down its three legs in one line each. If all three are present, remove one before shipping: scope the token to public data, quarantine untrusted input from the session, or put outbound traffic behind an allowlist.

Permission tiers are product design

Every major coding agent now ships a tiered permission model, and they have converged. Reads are free, writes are gated, shell commands are sandboxed or asked about, and full trust exists only behind a name that warns you off it.

In Manual mode (config value default), Claude Code needs no approval for reads in the working directory and asks before file edits and before Bash commands outside a built-in read-only set.10 Its modes run from default through acceptEdits, plan, auto and dontAsk to bypassPermissions, which the docs reserve for containers and VMs. Since v2.1.283, auto is the starting mode for interactive sessions: a classifier reviews actions instead of you. It strips tool results before judging, so hostile file content cannot argue with it, and it blocks things like curl | bash, force-pushes and terraform destroy by default. Blocked by default is not a hard deny: you can allow a routine pattern through autoMode.allow, or leave auto mode and approve the step yourself.11

Codex pairs a sandbox mode (read-only, workspace-write by default, danger-full-access) with an approval policy (on-request, never, or a granular table; untrusted is no longer supported and on-failure is deprecated), enforced by Seatbelt on macOS and bubblewrap on Linux.1213 Cursor’s Auto-review runs allowlisted commands, sandboxes the rest, and screens the remainder with a small classifier model; its docs concede the classifier can make mistakes and say it is not a security boundary.14 Devin’s CLI resolves deny over ask over allow, org-level deny rules cannot be overridden, and its Smart mode hands shell commands to a fast model while never auto-approving installs, mutating git or destructive cloud commands.15

What each harness does with the same action, per its own docs, as of Oct 2026. Vendors change these defaults often; check before you rely on a cell.

ActionClaude Code Manual (default)Claude Code auto (starting mode)Codex workspace-write + on-requestCursor Auto-reviewDevin NormalDevin Smart
Read workspace fileallowallowallowallowallowallow
Edit workspace fileaskallowallowsandbox/allowaskallow
npm testaskclassifierallow (sandboxed)sandboxaskclassifier
curl | bashaskblocked by defaultnetwork blocked → askclassifieraskclassifier → ask if unsure
git push --forceaskblocked by defaultaskclassifieraskask (never auto)
terraform destroyaskblocked by defaultaskclassifieraskask (never auto)
Full-trust modebypassPermissions—danger-full-access + neverRun EverythingBypass—

The convergence is worth noticing. Four teams reached the same shape independently, and all of them added a fast classifier layer that each admits is fallible.111415 The classifier exists to cut prompt fatigue. It is not the last line.

Deterministic beats probabilistic for the last line

The last line of defense should be code that cannot be persuaded. Claude Code’s documentation is explicit that writing rules in a prompt or memory file does not change what the harness permits.10

“Permission rules are enforced by Claude Code, not by the model.”— Anthropic, Claude Code docs

Even rules enforced by the harness can be soft if they match strings. A Bash(curl *) deny rule is bypassable through path rewrites or sh -c, and the docs tell you to pair it with the sandbox when the restriction must hold.10 Cursor went further: after Backslash Security showed several bypasses of its auto-run denylist, including base64 encoding, subshells and quote splitting, Cursor told the researchers it was deprecating the denylist in release 1.3.16

Two mechanisms hold. A PreToolUse hook is a shell command, HTTP endpoint or MCP tool that runs before every call; exit code 2 blocks it, and the docs pick hooks precisely because scripts cannot be sweet-talked the way prompts can.17 In your own loop, the same thing is a pre-dispatch interceptor on the tool call: plain code that sees the proposed call and can refuse it. The sandbox works one level lower. Permissions decide whether a tool runs; the sandbox decides what the running process can touch, enforced by the OS. Writes are confined to the working directory and temp, network goes through a proxy with an empty allowlist by default, and protected paths such as .git/config and hook directories block self-escalation.18 Note the gaps: reads are mostly open, including ~/.ssh unless you deny it, and MCP servers and hooks themselves run outside the sandbox.18

Defense in depth, then, has three parts: policy in hooks, a boundary in the sandbox, and judgment from a classifier or a human. OpenAI’s agent guide agrees: it calls guardrails “a layered defense mechanism” and sends sensitive, irreversible or high-stakes actions to human oversight.19

Field noteAudit every “never do X” sentence in your agent’s instructions. For each one that would hurt if violated, move it into a PreToolUse hook or a sandbox rule, and keep the sentence only as a hint that saves a round trip.

Copy this · a minimal Claude Code settings block, checked against the current permissions and sandbox docs: deny-first rules for the tools, plus an OS sandbox with a two-host network allowlist and no unsandboxed fallback. deny entries work in any settings file, project ones included; only mask entries and TLS termination are honored solely from user or managed settings.1018

{
  "permissions": {
    "allow": ["Bash(npm run *)", "Bash(git commit *)"],
    "ask":   ["Bash(git push *)"],
    "deny":  ["Bash(curl *)", "Bash(wget *)",
              "Read(./.env)", "Read(./secrets/**)"]
  },
  "sandbox": {
    "enabled": true,
    "allowUnsandboxedCommands": false,
    "network": {
      "allowedDomains": ["github.com", "registry.npmjs.org"]
    },
    "credentials": {
      "files": [
        { "path": "~/.ssh", "mode": "deny" },
        { "path": "~/.aws/credentials", "mode": "deny" }
      ]
    }
  }
}

Rules evaluate deny, then ask, then allow, and the deny on curl is only a hint until the sandbox’s allowlist backs it.10 In Codex the same posture is sandbox_mode = "workspace-write" with approval_policy = "on-request", network off by default.13 In your own loop it is a deny-first rule table in the dispatcher and a network namespace or egress proxy around anything that executes code.

Design for the attack, not against it

Detection loses on Willison’s arithmetic, so the better research makes injection inconsequential instead. A June 2025 paper from IBM, Invariant, ETH Zürich, Google and Microsoft researchers set out six patterns: Action-Selector, Plan-Then-Execute, LLM Map-Reduce, Dual LLM, Code-Then-Execute and Context-Minimization.20 They share one rule: once the agent has read untrusted input, that input must be unable to trigger anything consequential.

Google DeepMind’s CaMeL is the strongest version. A privileged model writes a program from the user’s request, a quarantined model parses untrusted data, and a custom interpreter tags every value with its provenance and checks policy at each tool call. An email address pulled from an untrusted message cannot become a recipient. On AgentDojo it completed 77% of tasks with provable security, against 84% for an undefended agent.21

Seven points of capability is the price of a guarantee, and for most agents that touch private data it is cheap. Willison called it the first credible mitigation he had seen that does not answer AI with more AI.22 The residual risk is human: approval prompts that people learn to click through.21

Designing the approval

An approval prompt is a control only if the person answering it is paying attention. Design it like one.

  • Approve plans, not keystrokes. Let the agent propose the whole plan (Claude Code’s plan mode, the Plan-Then-Execute pattern20), approve it once, and have the harness re-prompt only when execution leaves the plan. Keep per-action prompts for the irreversible steps inside it.
  • Tier by risk. OpenAI’s guide rates every tool low, medium or high on read versus write access, reversibility, required permissions and financial impact.19 Only the high tier should reach a human.
  • Show what changes and whether it can be undone. “Run db:push?” invites a yes. “Drops 3 tables in production. Not reversible. Last backup 6 hours ago.” invites a decision. Show the exact command or diff, the target, the blast radius and the undo path.
  • Set an approval budget. Cap prompts per session. A task that needs more is scoped wrong; fix the permissions, not the person. Cloud agents should queue approvals asynchronously and park, not time out into a default.
  • Measure the approve rate per prompt type. Near 100% means the prompt is noise: automate it with an allow rule or a hook. Near zero means it should be a deny. The prompts worth a human sit in between.
Trifecta checker · Which layer holds?data · [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [21] · illustrative

flip injection on and watch which shields the payload drops through

    7 layers configured

    The model is still reading your instructions. Flip injection on: now it is reading the attacker’s.

    Each row is an enforcement layer; flip injection on to see which survive when the model itself is fooled. Verdicts follow the docs and papers cited per row: prompt rules and string matching [10][14][16], hooks [17], classifiers [11][14][15], sandboxes [18][12], capability policy and approval fatigue [21][19]. The amber rows hold most of the time, which is Willison’s failing grade. The MODEL / STRING / CODE / OS / HUMAN tag is my label for who makes the decision in that layer.

    Soft security, hard security, and Zero Trust

    By 2001 the MeatballWiki community had named a deliberate design choice soft security. On a low-stakes site you protect the commons by persuading people, not by locking doors. Their own definition opens: “Soft security is not weak security.”23 It was an honest trade for a wiki. Agent builders have adopted it by accident, and for much higher stakes. A line in a system prompt that says never touch production is soft security guarding a hard asset.

    Soft controls cover system-prompt rules, guard classifiers such as Llama Guard,24 and LLM-as-judge monitors. All three are probabilistic, and all three read the same natural language the attacker writes. The numbers look good on a static test. Meta's Prompt Guard 2 reports 97.5% recall at a 1% false-positive rate, yet stops only 81.2% of attacks in agentic environments, and Meta itself calls it “an additional layer of defense.”25 The attacker, however, moves second. A 2025 study by fourteen researchers, Nicholas Carlini and Florian Tramèr among them, took 12 published defenses, most of which reported near-zero attack success, and broke most of them at above 90% with adaptive attacks. Human red-teamers beat every one.2627 One defense went from 0% to 99%.27

    Hard security is deterministic and lives outside the model, in credentials, scopes, sandboxes, egress rules and policy engines. The model can ask for anything, and the harness decides what actually happens. Meta's Agents Rule of Two is a hard rule of this kind: in one session an agent may hold at most two of untrusted input, sensitive access, and the ability to change state or communicate externally.28 CaMeL, described above, is the same idea expressed as a compiler.21

    Zero Trust supplies the architecture

    Zero Trust started from one observation. Once an attacker breaches the perimeter, the trusted intranet behind it is wide open.29 NIST's SP 800-207 turned that into tenets. No implicit trust comes from location. Access is granted per session with least privilege. Authorization is “dynamic and strictly enforced before access is allowed.” Telemetry feeds back into policy.30 For an agent, the trusted intranet is the context window. Anything inside it, from model output to tool results, retrieved pages and emails, is untrusted input.31

    The mapping onto a harness is direct. NIST splits enforcement into a policy decision point (PDP), which makes the decision, and a policy enforcement point (PEP), which enables and terminates connections.30 In a harness, the tool-call dispatcher is the PEP and a policy engine outside the model is the PDP. Every tool call becomes a fresh access request, checked against the agent's identity, the user it acts for, the task's scope, the target resource and the session's context. The Model Context Protocol already works this way at the transport layer when authorization is used (optional, HTTP transports only): a token on every HTTP request, audience-bound to the server, and a flat “MUST NOT accept or transit any other tokens.”32

    Zero Trust gatedata · [26] [28] [30] [32] · illustrative
    Send a request

    pick the injected email: watch both soft layers wave it through, then count which check actually stops it

    AGENT
    LLM proposes a tool call
    —
    SOFT LAYERS probabilistic
    system-prompt rule—
    guard classifier / judge—
    PEP tool dispatcher⇄PDP policy engine, outside the model
      VERDICT
      IDLE
      waiting for a request

      Every tool call is a fresh access request. Pick a scenario.

      ◀ telemetry: soft monitor result + decision log feed PDP policy (tenet 7)

      Each proposed tool call passes the soft layers, then the enforcement point asks the decision point. Only the decision point's verdict counts. Architecture from [30] and [32], the Rule of Two check from [28], bypass rates from [26]. The scenarios are illustrative.

      The decision point is ordinary policy code, and engines such as OPA (Rego) and Cedar already exist for it. Here is the CaMeL recipient rule as a Cedar policy. Cedar denies by default, and a forbid always overrides a permit.33 The dispatcher fills context from the tool call and from the provenance tags the harness keeps on every value.

      // Agents may email people in the org of the user they act for...
      permit (principal, action == Action::"send_email", resource)
      when { context.recipient_domain == principal.user_org_domain };
      
      // ...but only to an address whose provenance is known to be trusted.
      forbid (principal, action == Action::"send_email", resource)
      unless { context has recipient_provenance &&
               context.recipient_provenance == "trusted" };

      Cedar skips a policy whose condition errors, so a when … "untrusted" rule would fail open the day a code path forgets the tag; unless … "trusted" fails closed.33 Schema validation turns a missing attribute into a load-time error.

      The cleanest enforcement point is one the agent cannot route around: a credential broker and egress proxy. The agent never holds a secret. Its outbound traffic leaves through a proxy that checks each destination against policy and attaches the real credential only on requests it allows, so an injected instruction can ask for the token but has nothing to read. Claude Code’s sandbox ships a small version: with TLS termination on (sandbox.network.tlsTerminate), masked credentials appear to sandboxed commands as a per-session placeholder, and the proxy substitutes the real value only on requests to allowed hosts. Without it, masking fails safe: the placeholder reaches the server and authentication fails.18 MCP’s rule that servers “MUST NOT accept or transit any other tokens” is the same idea at the protocol layer.32

      Identity is the hard part

      Identity systems were built for people and long-lived services. An agent “might exist for minutes” or be “created and destroyed thousands of times per day,” so it needs an identity designed for ephemerality, with a named human sponsor.34 Session-long trust after one login is the wrong model. Agents should carry short-lived, task-scoped credentials,35 ideally attested workload identities that rotate automatically.36 When an agent inherits a human's full identity instead, that is OWASP's agentic risk ASI03, identity and privilege abuse.9 In February 2026, NIST's NCCoE opened a project on exactly this: identification, authorization, auditing and non-repudiation for software and AI agents.37

      Soft securityHard security
      Examplessystem-prompt rules, guard classifiers, LLM judgesscoped tokens, audience checks, sandbox, egress allowlist, PDP/PEP, Rule of Two
      Decisionprobabilisticdeterministic
      Runsinside or beside the model, in languageoutside the model, in code and infrastructure
      Shares the attacker's channelyesno
      Under adaptive attack>90% bypass typical [26]holds unless the policy is wrong
      Failssilently, openloudly, closed
      Best atdetection, telemetry, triage, UXpreventing irreversible actions
      Field noteIf a control failing open would be an incident, it must be hard. Keep soft layers anyway. They catch the noise, explain refusals politely, and produce the telemetry your policy engine learns from. They are just never the last line.

      Trust is an operating practice

      The vendor guidance lands where the incidents point. Anthropic’s August 2025 framework lists five principles, starting with human control.38

      “Humans should retain control over how their goals are pursued, particularly before high-stakes decisions are made.”— Anthropic (2025)

      Its April 2026 follow-up turns that into operator work: decide deliberately which tools, data and permissions each agent gets.39 In practice that means three habits. Put a human, not a classifier, in front of irreversible steps like production migrations and force-pushes. Scope data to the task so one leg of the trifecta is missing by default. Log every tool call so you can replay what the agent did, not just what it said it did.

      When it fires anywayStop the agent with one kill switch, revoke what it held, replay the decision log rather than its own account, and turn the failure into a regression eval plus a hard control. The full runbook, with comms and the postmortem, is in Part 06.

      Getting an agent past a risk review takes a sign-off pack built from this chapter: its trifecta legs, permission tiers, hard controls, kill switch and a named sponsor. Part 06 covers how to assemble it and who signs.

      Guardrails tell you whether an agent can do damage. They do not tell you whether it does good work, or whether last week’s prompt change made it worse. That takes measurement, which is the subject of the next chapter: evals, and how a harness improves without breaking what already works.

      References
      1. heise online, “Vibe coding service Replit deletes production database,” heise online, July 2025. heise.de/en/news/…replit-deletes-production-database
      2. Safeguard, “Replit agent deleted a production database: what happened,” safeguard.sh, July 2025. safeguard.sh/resources/blog/replit-agent…
      3. Simon Willison, “The lethal trifecta for AI agents,” simonwillison.net, June 2025. simonwillison.net/2025/Jun/16/the-lethal-trifecta
      4. Invariant Labs, “GitHub MCP Exploited: Accessing private repositories via MCP,” Invariant Labs, May 2025. invariantlabs.ai/blog/mcp-github-vulnerability
      5. BleepingComputer, “Amazon AI coding agent hacked to inject data-wiping commands,” BleepingComputer, July 2025. bleepingcomputer.com/news/security/amazon-ai-coding-agent…
      6. The Hacker News (reporting Koi Security), “First malicious MCP server found stealing emails in rogue postmark-mcp package,” The Hacker News, September 2025. thehackernews.com/2025/09/first-malicious-mcp-server-found
      7. Snyk, “ToxicSkills: malicious AI agent skills on ClawHub,” Snyk, February 2026. snyk.io/blog/toxicskills…
      8. OWASP GenAI Security Project, “OWASP Top 10 for LLM Applications 2025,” OWASP, 2025. genai.owasp.org/llm-top-10
      9. OWASP GenAI Security Project, “OWASP Top 10 for Agentic Applications for 2026,” OWASP, December 2025. genai.owasp.org/resource/owasp-top-10-for-agentic-applications-for-2026
      10. Anthropic, “Configure permissions,” Claude Code docs, accessed October 2026. code.claude.com/docs/en/permissions
      11. Anthropic, “Permission modes,” Claude Code docs, accessed October 2026. code.claude.com/docs/en/permission-modes
      12. OpenAI, “Sandbox,” Codex docs, accessed October 2026. learn.chatgpt.com/docs/sandboxing
      13. OpenAI, “Agent approvals & security,” Codex docs, accessed October 2026. learn.chatgpt.com/docs/agent-approvals-security
      14. Cursor, “Run Modes,” Cursor docs, accessed October 2026. cursor.com/docs/agent/security/run-modes
      15. Cognition, “Permissions,” Devin CLI docs, accessed October 2026. docs.devin.ai/cli/reference/permissions
      16. Backslash Research Team, “The Denylist Delusion: Cursor’s Auto-Run Leaves Agentic AI Wide Open,” Backslash Security, July 2025. backslash.security/blog/cursor-ai-security-flaw-autorun-denylist
      17. Anthropic, “Hooks reference,” Claude Code docs, accessed October 2026. code.claude.com/docs/en/hooks
      18. Anthropic, “Sandboxing,” Claude Code docs, accessed October 2026. code.claude.com/docs/en/sandboxing
      19. OpenAI, “A practical guide to building agents,” OpenAI, April 2025. cdn.openai.com/…/a-practical-guide-to-building-agents.pdf
      20. Luca Beurer-Kellner, Edoardo Debenedetti, Florian Tramèr et al., “Design Patterns for Securing LLM Agents against Prompt Injections,” arXiv 2506.08837, June 2025. arxiv.org/abs/2506.08837
      21. Edoardo Debenedetti, Ilia Shumailov, Nicholas Carlini, Florian Tramèr et al. (Google DeepMind), “Defeating Prompt Injections by Design,” arXiv 2503.18813, March 2025. arxiv.org/abs/2503.18813
      22. Simon Willison, “CaMeL” (commentary), simonwillison.net, April 2025. simonwillison.net/2025/Apr/11/camel
      23. MeatballWiki community, “SoftSecurity,” MeatballWiki (presented at O’Reilly P2P, 2001). meatballwiki.org/wiki/SoftSecurity
      24. Hakan Inan et al. (Meta), “Llama Guard: LLM-based Input-Output Safeguard for Human-AI Conversations,” arXiv 2312.06674, December 2023. arxiv.org/abs/2312.06674
      25. Meta, “Llama Prompt Guard 2 (86M),” model card, Hugging Face, accessed October 2026. huggingface.co/meta-llama/Llama-Prompt-Guard-2-86M
      26. Milad Nasr, Nicholas Carlini, Florian Tramèr et al., “The Attacker Moves Second: Stronger Adaptive Attacks Bypass Defenses against LLM Jailbreaks and Prompt Injections,” arXiv 2510.09023, October 2025. arxiv.org/abs/2510.09023
      27. Simon Willison, “New prompt injection papers: Agents Rule of Two and The Attacker Moves Second,” simonwillison.net, November 2025. simonwillison.net/2025/Nov/2
      28. Meta AI, “Agents Rule of Two: A Practical Approach to AI Agent Security,” Meta AI blog, October 2025. ai.meta.com/blog/practical-ai-agent-security
      29. Rory Ward, Betsy Beyer (Google), “BeyondCorp: A New Approach to Enterprise Security,” ;login: vol. 39 no. 6, 2014. research.google/pubs/beyondcorp
      30. Scott Rose, Oliver Borchert, Stu Mitchell, Sean Connelly (NIST), “Zero Trust Architecture,” NIST SP 800-207, August 2020. csrc.nist.gov/pubs/sp/800/207
      31. OWASP, “AI Agent Security Cheat Sheet,” OWASP Cheat Sheet Series, accessed October 2026. cheatsheetseries.owasp.org/…/AI_Agent_Security
      32. Model Context Protocol, “Authorization,” MCP Specification 2026-07-28. modelcontextprotocol.io/specification/…/authorization
      33. Cedar project, “Basic policy construction in Cedar” and “Operators and functions,” and “Authorization” (skip on error), Cedar Policy Language Reference Guide, accessed October 2026. docs.cedarpolicy.com/policies/syntax-policy · docs.cedarpolicy.com/auth/authorization
      34. Microsoft, “What are agent identities? (Microsoft Entra Agent ID),” Microsoft Learn, November 2025 (updated June 2026). learn.microsoft.com/…/what-is-agent-id
      35. Ken Huang, “Agentic AI Identity Management Approach,” Cloud Security Alliance, March 2025. cloudsecurityalliance.org/blog/2025/03/11
      36. SPIFFE project (CNCF), “SPIFFE Overview,” accessed October 2026. spiffe.io/docs/latest/spiffe-about/overview
      37. Booth, Fisher, Galluzzo, Roberts (NIST NCCoE), “Accelerating the Adoption of Software and AI Agent Identity and Authorization” (concept paper), February 2026. csrc.nist.gov/pubs/other/2026/02/05
      38. Anthropic, “Our framework for developing safe and trustworthy agents,” Anthropic, August 2025. anthropic.com/news/our-framework-for-developing-safe-and-trustworthy-agents
      39. Anthropic, “Trustworthy agents in practice,” Anthropic, April 2026. anthropic.com/research/trustworthy-agents