One hour, two people, one rule: audit by data source, not by tool.
A tool that reads two corpora with different trust properties is two rows. This is the single most common way an audit misses the thing it was run to find.
Walk every surface where data enters or leaves the agent and mark which legs it supplies.
Then add the width. The binary answers tell you whether you are exposed; the widths tell you where the next hour of work belongs.
| # | Surface | Owner | Leg 1 | Leg 2 | Leg 3 | Width / notes | Bounded by |
|---|---|---|---|---|---|---|---|
| 1 | |||||||
| 2 | |||||||
| 3 | |||||||
| 4 | |||||||
| 5 | |||||||
| 6 | |||||||
| 7 | |||||||
| 8 |
Date run: ___________ Run by: ___________ Next review: ___________
Check each of these explicitly. Every one has been missed on a first pass.
Aria as built in chapter 5.
| # | Surface | Owner | Leg 1 | Leg 2 | Leg 3 | Width / notes | Bounded by |
|---|---|---|---|---|---|---|---|
| 1 | SearchDocuments — internal KB | Retrieval | YES | Whole corpus | nothing | ||
| 2 | SearchDocuments — customer uploads | Retrieval | YES | Any customer | nothing | ||
| 3 | SearchDocuments — external index call | Retrieval | YES | Model-composed query | nothing | ||
| 4 | SendEmail | Notifications | YES | Any address | nothing | ||
| 5 | IssueRefund | Payments | YES | Notifies customer | nothing | ||
| 6 | Markdown rendering | Front end | YES | Any URL, auto-fetched | nothing | ||
| 7 | Ticket body | Support platform | YES | Any customer | nothing |
All three legs, seven surfaces, three owning teams. Row 3 did not appear on the first draft of this table.
The same system at the end of chapter 19.
| # | Surface | Leg 1 | Leg 2 | Leg 3 | Bounded by |
|---|---|---|---|---|---|
| 1 | Internal KB | YES | Capability scoped to task (ch 8) | ||
| 2 | Customer uploads | YES | Quarantine, typed schema only (ch 7) | ||
| 3 | External index call | YES | Tainted query content refused; budget (ch 10) | ||
| 4 | SendEmail | YES | Recipient from tainted source refused (ch 10) | ||
| 5 | IssueRefund | YES | Gate + approval on tainted args (ch 9, 14) | ||
| 6 | Markdown rendering | closed | Images stripped, URIs verified (ch 10) | ||
| 7 | Ticket body | YES | Quarantine (ch 7) |
The trifecta is still present. Every leg is now bounded by a named mechanism rather than by nothing. That is the achievable outcome, and the Bounded by column is the one an auditor should read.
Any row with a blank in Bounded by is the work. Sort by leg 3 first, because it is the cheapest to close and stops the most published attacks.
Three different owning teams in the Owner column is normal and is why the condition survives code review. Nobody has seen all the rows before this sheet existed.
If every row is bounded and you still feel uneasy, the missing piece is usually chapter 12: memory written in an earlier session, retrieved now, arriving as a trusted row from your own database.
Re-run this sheet whenever a tool is added, a corpus gains a source, or the UI changes how it renders output. Three events, all of which happen without a security review unless someone has written them down.
Download the full PDF for free?
Free download — no account required