A risk map lists controls as sentences: "inputs are limited to 4,000 characters," "PII is redacted from responses," "the agent's service account cannot delete rows." Sentences are easy to write and easy to drift away from. Six months later the limit lives in a frontend validator that an API client bypasses, the redaction runs on one endpoint out of four, and the database grant was widened to fix a support ticket. Nobody lied; the control simply stopped being true without anyone noticing.
The fix is discipline that security teams already apply elsewhere: every control becomes a test that runs before every release. The OWASP GenAI Security Project maps each LLM risk to concrete controls, which is a useful starting point for the list you are converting. For example, LLM10 Unbounded Consumption recommends strict input validation so inputs do not exceed reasonable size limits, alongside rate limiting and quotas. Each of those recommendations can be turned into a test with an expected result.
The pattern is not unique to AI. Teams that already run security testing in CI attach checks to the pipeline and report findings in the review context developers use, rather than in a dashboard nobody opens, as Cycode describes. A control test is the same idea scoped to a control you already wrote down.
One decision rule frames everything below: if a control's failure could be detected by sending one specific request and comparing the response, it belongs in the CI suite. If it cannot, it needs a different kind of evidence. Most controls in a modern AI risk map fall in the first bucket.



