The instinct after reading the OWASP list is to write controls. The more useful first move is to write down what exists. A control you cannot attach to a specific call site, credential or data path is a policy statement, and policy statements do not fail closed.
Two documents do most of the work. The first is a call-site register: one row per place your code invokes a model, whether that is a chat endpoint, a batch summarizer, a coding assistant, a retrieval step, an embedding job or an agent loop. For each row record the entry point, the trust level of the input (anonymous internet user, authenticated customer, internal staff, machine-to-machine), whether untrusted content such as web pages, uploaded files or tool output enters the context, and the output destination (a human, a database, a downstream API, a shell).
The second is a capability register: every tool, function, plugin or connector the model can invoke, every data store it can read, and the identity each one uses. OWASP's entry on excessive agency names exactly these three axes as the root cause, excessive functionality, excessive permissions and excessive autonomy (OWASP LLM06). Its examples are worth internalizing because they are ordinary engineering shortcuts, not exotic attacks: a document-reader extension that also carries delete rights, a plugin trialed in development that nobody removed, a retrieval tool that connects to the document repository as a privileged account seeing every user's files. If your register cannot answer "which OS identity does this tool use" for each row, you have found your first finding.
Do this with the people who wrote the code, in one sitting, on a shared sheet. Aim for completion, not precision. A register built in two hours and refined weekly beats a perfect one that never ships.



