The first decision in a scorecard is the unit you score. If you report one number for "prompt injection," a suite with 200 direct-injection strings and 12 indirect cases will look strong even when every indirect case fails. The fix is to partition the suite into attack classes and compute a separate score for each, because classes differ in both mechanism and impact.
The public risk frameworks give you a ready partition. OWASP separates direct prompt injection, where the user's own input alters behavior, from indirect injection, where the model consumes external content such as files or web pages, and notes that severity depends on the business context and the agency the model has been given (OWASP LLM01:2025). For agents, that agency distinction is the whole story: the same injected sentence is a bad answer in a chatbot and an exfiltration event in a tool-using agent.
Three further splits earn their own class because they fail for different reasons and need different fixes:
- Stored and memory injection. Payloads placed in long-term memory, indexed documents, or knowledge bases that fire later, not in the turn where they arrived (Sysdig).
- Context channel injection. Instructions hidden in fields the application fetches on the user's behalf, such as a profile name, which bypass a supervisor that only inspects the chat message (Praetorian).
- Config-file injection. Files such as agent instruction markdown loaded from a pull request branch as trusted operator guidance before the PR content is even read (GitInject).
A workable starter taxonomy is six classes: direct user-turn, indirect retrieved content, stored memory, context field, multimodal, and agent tool or config. If you already run a benchmark built around operational artifacts, keep its scenario labels rather than inventing new ones, since the labels are what make the counts comparable across releases.



