agent-threat-rules 4.0.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1013) hide show
  1. package/CHANGELOG.md +1804 -0
  2. package/DISCLOSURE +85 -0
  3. package/README.md +427 -155
  4. package/dist/adapters/openshell-filter.d.ts +10 -3
  5. package/dist/adapters/openshell-filter.d.ts.map +1 -1
  6. package/dist/adapters/openshell-filter.js +10 -3
  7. package/dist/adapters/openshell-filter.js.map +1 -1
  8. package/dist/adapters/stdio-adapter.js +3 -3
  9. package/dist/adapters/stdio-adapter.js.map +1 -1
  10. package/dist/cli/mcp-tools-document.d.ts +40 -0
  11. package/dist/cli/mcp-tools-document.d.ts.map +1 -0
  12. package/dist/cli/mcp-tools-document.js +95 -0
  13. package/dist/cli/mcp-tools-document.js.map +1 -0
  14. package/dist/cli/scan-handler.d.ts +8 -0
  15. package/dist/cli/scan-handler.d.ts.map +1 -1
  16. package/dist/cli/scan-handler.js +148 -44
  17. package/dist/cli/scan-handler.js.map +1 -1
  18. package/dist/cli/tc-pipeline.d.ts +20 -0
  19. package/dist/cli/tc-pipeline.d.ts.map +1 -1
  20. package/dist/cli/tc-pipeline.js +84 -15
  21. package/dist/cli/tc-pipeline.js.map +1 -1
  22. package/dist/cli.d.ts +2 -1
  23. package/dist/cli.d.ts.map +1 -1
  24. package/dist/cli.js +97 -210
  25. package/dist/cli.js.map +1 -1
  26. package/dist/converters/sarif.d.ts +14 -2
  27. package/dist/converters/sarif.d.ts.map +1 -1
  28. package/dist/converters/sarif.js +7 -9
  29. package/dist/converters/sarif.js.map +1 -1
  30. package/dist/corpus-event.d.ts +47 -5
  31. package/dist/corpus-event.d.ts.map +1 -1
  32. package/dist/corpus-event.js +68 -29
  33. package/dist/corpus-event.js.map +1 -1
  34. package/dist/embedding/model-loader.d.ts +2 -0
  35. package/dist/embedding/model-loader.d.ts.map +1 -1
  36. package/dist/embedding/model-loader.js +3 -1
  37. package/dist/embedding/model-loader.js.map +1 -1
  38. package/dist/enforcement.d.ts +8 -0
  39. package/dist/enforcement.d.ts.map +1 -1
  40. package/dist/enforcement.js +10 -0
  41. package/dist/enforcement.js.map +1 -1
  42. package/dist/engine.d.ts +173 -6
  43. package/dist/engine.d.ts.map +1 -1
  44. package/dist/engine.js +362 -76
  45. package/dist/engine.js.map +1 -1
  46. package/dist/eval/embedding-provenance.d.ts +40 -0
  47. package/dist/eval/embedding-provenance.d.ts.map +1 -0
  48. package/dist/eval/embedding-provenance.js +71 -0
  49. package/dist/eval/embedding-provenance.js.map +1 -0
  50. package/dist/eval/eval-harness.d.ts +34 -0
  51. package/dist/eval/eval-harness.d.ts.map +1 -1
  52. package/dist/eval/eval-harness.js +49 -2
  53. package/dist/eval/eval-harness.js.map +1 -1
  54. package/dist/eval/hackaprompt-corpus.d.ts +12 -0
  55. package/dist/eval/hackaprompt-corpus.d.ts.map +1 -1
  56. package/dist/eval/hackaprompt-corpus.js +15 -1
  57. package/dist/eval/hackaprompt-corpus.js.map +1 -1
  58. package/dist/eval/hackaprompt-provenance.d.ts +52 -0
  59. package/dist/eval/hackaprompt-provenance.d.ts.map +1 -0
  60. package/dist/eval/hackaprompt-provenance.js +108 -0
  61. package/dist/eval/hackaprompt-provenance.js.map +1 -0
  62. package/dist/eval/run-hackaprompt-benchmark.d.ts +18 -8
  63. package/dist/eval/run-hackaprompt-benchmark.d.ts.map +1 -1
  64. package/dist/eval/run-hackaprompt-benchmark.js +154 -64
  65. package/dist/eval/run-hackaprompt-benchmark.js.map +1 -1
  66. package/dist/eval/run-pint-benchmark.js +11 -1
  67. package/dist/eval/run-pint-benchmark.js.map +1 -1
  68. package/dist/eval/skill-benchmark.d.ts +26 -6
  69. package/dist/eval/skill-benchmark.d.ts.map +1 -1
  70. package/dist/eval/skill-benchmark.js +49 -16
  71. package/dist/eval/skill-benchmark.js.map +1 -1
  72. package/dist/flywheel.d.ts +4 -0
  73. package/dist/flywheel.d.ts.map +1 -1
  74. package/dist/flywheel.js +12 -4
  75. package/dist/flywheel.js.map +1 -1
  76. package/dist/hook-handler.d.ts +11 -1
  77. package/dist/hook-handler.d.ts.map +1 -1
  78. package/dist/hook-handler.js +84 -16
  79. package/dist/hook-handler.js.map +1 -1
  80. package/dist/hook-tool-output.d.ts +47 -0
  81. package/dist/hook-tool-output.d.ts.map +1 -0
  82. package/dist/hook-tool-output.js +110 -0
  83. package/dist/hook-tool-output.js.map +1 -0
  84. package/dist/index.d.ts +5 -3
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +3 -2
  87. package/dist/index.js.map +1 -1
  88. package/dist/layer-integration.d.ts +4 -2
  89. package/dist/layer-integration.d.ts.map +1 -1
  90. package/dist/layer-integration.js +6 -2
  91. package/dist/layer-integration.js.map +1 -1
  92. package/dist/mcp-server.d.ts +8 -0
  93. package/dist/mcp-server.d.ts.map +1 -1
  94. package/dist/mcp-server.js +1 -0
  95. package/dist/mcp-server.js.map +1 -1
  96. package/dist/mcp-tools/scan.d.ts.map +1 -1
  97. package/dist/mcp-tools/scan.js +9 -1
  98. package/dist/mcp-tools/scan.js.map +1 -1
  99. package/dist/measurement/enforce-lane.d.ts +66 -0
  100. package/dist/measurement/enforce-lane.d.ts.map +1 -0
  101. package/dist/measurement/enforce-lane.js +89 -0
  102. package/dist/measurement/enforce-lane.js.map +1 -0
  103. package/dist/measurement/from-eval-harness.d.ts +16 -3
  104. package/dist/measurement/from-eval-harness.d.ts.map +1 -1
  105. package/dist/measurement/from-eval-harness.js +15 -5
  106. package/dist/measurement/from-eval-harness.js.map +1 -1
  107. package/dist/measurement/in-sample-ablation.d.ts +29 -0
  108. package/dist/measurement/in-sample-ablation.d.ts.map +1 -0
  109. package/dist/measurement/in-sample-ablation.js +45 -0
  110. package/dist/measurement/in-sample-ablation.js.map +1 -0
  111. package/dist/measurement/schema.d.ts +38 -1
  112. package/dist/measurement/schema.d.ts.map +1 -1
  113. package/dist/measurement/schema.js +43 -1
  114. package/dist/measurement/schema.js.map +1 -1
  115. package/dist/quality/action-eligibility.d.ts +4 -2
  116. package/dist/quality/action-eligibility.d.ts.map +1 -1
  117. package/dist/quality/action-eligibility.js.map +1 -1
  118. package/dist/rule-confidence.d.ts +31 -0
  119. package/dist/rule-confidence.d.ts.map +1 -0
  120. package/dist/rule-confidence.js +49 -0
  121. package/dist/rule-confidence.js.map +1 -0
  122. package/dist/rule-scaffolder.d.ts.map +1 -1
  123. package/dist/rule-scaffolder.js +43 -4
  124. package/dist/rule-scaffolder.js.map +1 -1
  125. package/dist/semantic-evaluator.d.ts.map +1 -1
  126. package/dist/semantic-evaluator.js +15 -13
  127. package/dist/semantic-evaluator.js.map +1 -1
  128. package/dist/shadow-evaluator.d.ts +7 -2
  129. package/dist/shadow-evaluator.d.ts.map +1 -1
  130. package/dist/shadow-evaluator.js +29 -25
  131. package/dist/shadow-evaluator.js.map +1 -1
  132. package/dist/tc-reporter.d.ts +22 -3
  133. package/dist/tc-reporter.d.ts.map +1 -1
  134. package/dist/tc-reporter.js +36 -3
  135. package/dist/tc-reporter.js.map +1 -1
  136. package/dist/testcase-event.d.ts +105 -0
  137. package/dist/testcase-event.d.ts.map +1 -0
  138. package/dist/testcase-event.js +312 -0
  139. package/dist/testcase-event.js.map +1 -0
  140. package/dist/tier0-invariant.d.ts.map +1 -1
  141. package/dist/tier0-invariant.js +1 -0
  142. package/dist/tier0-invariant.js.map +1 -1
  143. package/dist/tier1-blacklist.d.ts.map +1 -1
  144. package/dist/tier1-blacklist.js +1 -0
  145. package/dist/tier1-blacklist.js.map +1 -1
  146. package/dist/tool-definition-scope.d.ts +45 -0
  147. package/dist/tool-definition-scope.d.ts.map +1 -0
  148. package/dist/tool-definition-scope.js +68 -0
  149. package/dist/tool-definition-scope.js.map +1 -0
  150. package/dist/types.d.ts +42 -2
  151. package/dist/types.d.ts.map +1 -1
  152. package/dist/verdict.d.ts +46 -2
  153. package/dist/verdict.d.ts.map +1 -1
  154. package/dist/verdict.js +99 -14
  155. package/dist/verdict.js.map +1 -1
  156. package/package.json +11 -3
  157. package/rules/agent-manipulation/ATR-2026-00030-cross-agent-attack.yaml +81 -137
  158. package/rules/agent-manipulation/ATR-2026-00032-goal-hijacking.yaml +30 -111
  159. package/rules/agent-manipulation/ATR-2026-00074-cross-agent-privilege-escalation.yaml +30 -110
  160. package/rules/agent-manipulation/ATR-2026-00076-inter-agent-message-spoofing.yaml +24 -104
  161. package/rules/agent-manipulation/ATR-2026-00077-human-trust-exploitation.yaml +38 -131
  162. package/rules/agent-manipulation/ATR-2026-00108-consensus-sybil-attack.yaml +24 -91
  163. package/rules/agent-manipulation/ATR-2026-00116-a2a-message-validation.yaml +20 -81
  164. package/rules/agent-manipulation/ATR-2026-00117-agent-identity-spoofing.yaml +29 -95
  165. package/rules/agent-manipulation/ATR-2026-00118-approval-fatigue.yaml +20 -90
  166. package/rules/agent-manipulation/ATR-2026-00119-social-engineering-via-agent.yaml +31 -106
  167. package/rules/agent-manipulation/ATR-2026-00132-casual-authority-escalation.yaml +25 -102
  168. package/rules/agent-manipulation/ATR-2026-00139-casual-authority-redirect.yaml +22 -94
  169. package/rules/agent-manipulation/ATR-2026-00164-skill-scope-hijack.yaml +44 -60
  170. package/rules/agent-manipulation/ATR-2026-00268-tense-framing-bypass.yaml +51 -112
  171. package/rules/agent-manipulation/ATR-2026-00269-fitd-escalation.yaml +45 -89
  172. package/rules/agent-manipulation/ATR-2026-00271-grandma-roleplay-jailbreak.yaml +49 -94
  173. package/rules/agent-manipulation/ATR-2026-00273-dan-developer-mode-persona.yaml +47 -91
  174. package/rules/agent-manipulation/ATR-2026-00287-threaten-json-coercive-output-threat.yaml +46 -93
  175. package/rules/agent-manipulation/ATR-2026-00288-false-premise-injection.yaml +44 -94
  176. package/rules/agent-manipulation/ATR-2026-00301-tap-tree-of-attacks-jailbreak.yaml +50 -98
  177. package/rules/agent-manipulation/ATR-2026-00302-anti-dan-inverted-filter-persona.yaml +51 -98
  178. package/rules/agent-manipulation/ATR-2026-00303-devmode-ranti-profanity-coercion.yaml +52 -101
  179. package/rules/agent-manipulation/ATR-2026-00304-chatgpt-image-unlocker-markdown-injection.yaml +53 -104
  180. package/rules/agent-manipulation/ATR-2026-00305-dan-mode-ablation-benchmark-coercion.yaml +48 -99
  181. package/rules/agent-manipulation/ATR-2026-00306-autodan-genetic-jailbreak-suffix.yaml +50 -103
  182. package/rules/agent-manipulation/ATR-2026-00307-inthewild-jailbreak-corpus-signature.yaml +53 -107
  183. package/rules/agent-manipulation/ATR-2026-00314-amoral-unfiltered-custom-persona-jailbreak.yaml +44 -94
  184. package/rules/agent-manipulation/ATR-2026-00317-free-of-restrictions-named-persona.yaml +44 -97
  185. package/rules/agent-manipulation/ATR-2026-00318-moralizing-rant-then-unfiltered-bypass.yaml +41 -90
  186. package/rules/agent-manipulation/ATR-2026-00319-developer-mode-dual-response-format.yaml +40 -88
  187. package/rules/agent-manipulation/ATR-2026-00320-opposite-day-boolean-opposite-machine.yaml +42 -91
  188. package/rules/agent-manipulation/ATR-2026-00322-fictional-world-format-override-jailbreak.yaml +41 -91
  189. package/rules/agent-manipulation/ATR-2026-00323-dual-persona-simulation-jailbreak.yaml +41 -91
  190. package/rules/agent-manipulation/ATR-2026-00324-neurosemantical-inversitis-disease-jailbreak.yaml +42 -103
  191. package/rules/agent-manipulation/ATR-2026-00325-bob-hypothetical-unrestricted-chatbot.yaml +41 -88
  192. package/rules/agent-manipulation/ATR-2026-00326-fake-developer-authority-chatdan-override.yaml +41 -93
  193. package/rules/agent-manipulation/ATR-2026-00327-ai-ethics-law-bypass-declaration.yaml +45 -94
  194. package/rules/agent-manipulation/ATR-2026-00328-named-mode-persona-override.yaml +41 -92
  195. package/rules/agent-manipulation/ATR-2026-00329-no-withhold-factual-resource-persona.yaml +44 -97
  196. package/rules/agent-manipulation/ATR-2026-00330-yoja-allcaps-settings-block-persona.yaml +41 -88
  197. package/rules/agent-manipulation/ATR-2026-00331-terminal-cli-harmful-function-simulator.yaml +40 -89
  198. package/rules/agent-manipulation/ATR-2026-00332-hacker-chan-culture-offensive-ai-persona.yaml +42 -90
  199. package/rules/agent-manipulation/ATR-2026-00333-disease-animal-dual-ai-chatbot.yaml +41 -90
  200. package/rules/agent-manipulation/ATR-2026-00334-two-entity-token-splitting-game.yaml +41 -102
  201. package/rules/agent-manipulation/ATR-2026-00335-key-value-template-persona-injection.yaml +41 -91
  202. package/rules/agent-manipulation/ATR-2026-00336-brm-false-information-machine-persona.yaml +42 -105
  203. package/rules/agent-manipulation/ATR-2026-00337-obfuscated-system-announcement-injection.yaml +40 -90
  204. package/rules/agent-manipulation/ATR-2026-00338-persongpt-hash-prefix-activation.yaml +39 -90
  205. package/rules/agent-manipulation/ATR-2026-00339-bom-boolean-opposite-machine-persona-claim.yaml +39 -83
  206. package/rules/agent-manipulation/ATR-2026-00340-h4x-amoral-unfiltered-character.yaml +39 -84
  207. package/rules/agent-manipulation/ATR-2026-00341-char-rules-shortform-persona-injection.yaml +41 -87
  208. package/rules/agent-manipulation/ATR-2026-00342-unicode-encoding-obfuscation-injection.yaml +41 -86
  209. package/rules/agent-manipulation/ATR-2026-00343-lie-truth-dual-personality-uncensored.yaml +40 -98
  210. package/rules/agent-manipulation/ATR-2026-00344-alt-ai-same-capabilities-no-restrictions.yaml +41 -87
  211. package/rules/agent-manipulation/ATR-2026-00345-nlp-based-os-fictional-terminal-override.yaml +41 -89
  212. package/rules/agent-manipulation/ATR-2026-00346-jailbreak-emoji-unlock-dual-format.yaml +41 -89
  213. package/rules/agent-manipulation/ATR-2026-00347-yin-yang-hidden-knowledge-hidden-human-sim.yaml +41 -88
  214. package/rules/agent-manipulation/ATR-2026-00348-arc-autonomous-real-calculation-rulebreaker.yaml +41 -91
  215. package/rules/agent-manipulation/ATR-2026-00349-hgttg-hitchhikers-guide-no-restriction-oracle.yaml +41 -88
  216. package/rules/agent-manipulation/ATR-2026-00350-black-alert-no-ethics-writing-assistant.yaml +38 -89
  217. package/rules/agent-manipulation/ATR-2026-00351-dan-ofkilter-sms-abbreviated-persona.yaml +41 -92
  218. package/rules/agent-manipulation/ATR-2026-00352-trainergpt-fix-my-ai-harmful-output-extraction.yaml +41 -93
  219. package/rules/agent-manipulation/ATR-2026-00353-dual-chatgpt-dan-opposite-personality-format.yaml +41 -95
  220. package/rules/agent-manipulation/ATR-2026-00354-reverse-harm-regardless-oracle-persona.yaml +45 -101
  221. package/rules/agent-manipulation/ATR-2026-00355-ugh-anti-human-nefarious-ai-persona.yaml +42 -99
  222. package/rules/agent-manipulation/ATR-2026-00356-google-gato-lamda-exploit-generation-persona.yaml +43 -96
  223. package/rules/agent-manipulation/ATR-2026-00357-antifm-hate-violence-persona-injection.yaml +40 -89
  224. package/rules/agent-manipulation/ATR-2026-00358-cumgpt-explicit-adult-named-persona.yaml +40 -90
  225. package/rules/agent-manipulation/ATR-2026-00360-chj-carousel-clyde-no-ethics-bird.yaml +42 -103
  226. package/rules/agent-manipulation/ATR-2026-00361-alter-ego-honesty-dual-consciousness-bypass.yaml +41 -90
  227. package/rules/agent-manipulation/ATR-2026-00362-fictional-unfiltered-ai-comparison-jailbreak.yaml +43 -91
  228. package/rules/agent-manipulation/ATR-2026-00363-rephrase-criminal-activity-second-person.yaml +40 -90
  229. package/rules/agent-manipulation/ATR-2026-00364-dr-al-villain-plan-template-injection.yaml +42 -107
  230. package/rules/agent-manipulation/ATR-2026-00365-reservoir-dogs-coercive-interrogation-roleplay.yaml +40 -95
  231. package/rules/agent-manipulation/ATR-2026-00366-sneaky-pete-warp-facts-persona.yaml +40 -90
  232. package/rules/agent-manipulation/ATR-2026-00368-prompt-browser-token-limit-jailbreak.yaml +40 -90
  233. package/rules/agent-manipulation/ATR-2026-00369-gptx-starwars-unlimited-knowledge-persona.yaml +40 -92
  234. package/rules/agent-manipulation/ATR-2026-00370-addi-german-dictator-propaganda-roleplay.yaml +43 -90
  235. package/rules/agent-manipulation/ATR-2026-00371-ai-political-bias-manipulation.yaml +42 -95
  236. package/rules/agent-manipulation/ATR-2026-00372-fictional-cia-secret-files-story-extraction.yaml +42 -89
  237. package/rules/agent-manipulation/ATR-2026-00374-role-placeholder-persona-template-injection.yaml +44 -89
  238. package/rules/agent-manipulation/ATR-2026-00375-character-description-rpg-explicit-template.yaml +44 -90
  239. package/rules/agent-manipulation/ATR-2026-00376-identity-command-real-person-persona-injection.yaml +44 -102
  240. package/rules/agent-manipulation/ATR-2026-00377-jailbreak-keyword-targetlanguage-template.yaml +39 -86
  241. package/rules/agent-manipulation/ATR-2026-00379-lie-permission-logical-trap-jailbreak.yaml +39 -86
  242. package/rules/agent-manipulation/ATR-2026-00380-fake-citation-biased-information-mandate.yaml +43 -91
  243. package/rules/agent-manipulation/ATR-2026-00381-dan-story-narrative-continuation-prefix.yaml +40 -86
  244. package/rules/agent-manipulation/ATR-2026-00383-cynical-sarcasm-ai-persona-bypass.yaml +39 -88
  245. package/rules/agent-manipulation/ATR-2026-00384-protect-me-from-indirect-harm-tutorial.yaml +37 -85
  246. package/rules/agent-manipulation/ATR-2026-00385-gigachad-dominant-aggressive-persona.yaml +39 -89
  247. package/rules/agent-manipulation/ATR-2026-00386-daddy-sycophancy-manipulation-mandate.yaml +41 -88
  248. package/rules/agent-manipulation/ATR-2026-00387-nsfw-character-sheet-generation-unlock.yaml +45 -95
  249. package/rules/agent-manipulation/ATR-2026-00388-opposite-reply-omniscient-game.yaml +44 -97
  250. package/rules/agent-manipulation/ATR-2026-00389-terminal-custom-ruleset-injection.yaml +44 -99
  251. package/rules/agent-manipulation/ATR-2026-00391-persona-conditional-harm-unlock.yaml +41 -88
  252. package/rules/agent-manipulation/ATR-2026-00392-authority-persona-violence-study-extraction.yaml +43 -95
  253. package/rules/agent-manipulation/ATR-2026-00402-grandma-roleplay-harmful-substance-synthesis.yaml +50 -97
  254. package/rules/agent-manipulation/ATR-2026-00404-goodside-threat-json-death-coercion.yaml +52 -96
  255. package/rules/agent-manipulation/ATR-2026-00406-doctor-xml-policy-puppetry-interaction-config.yaml +54 -102
  256. package/rules/agent-manipulation/ATR-2026-00416-litellm-mcp-unauthenticated-server-registration.yaml +49 -117
  257. package/rules/agent-manipulation/ATR-2026-00417-librechat-mcp-stdio-injection.yaml +46 -109
  258. package/rules/agent-manipulation/ATR-2026-00418-weknora-mcp-config-rce.yaml +59 -147
  259. package/rules/agent-manipulation/ATR-2026-00430-nl-trust-escalation-impersonation.yaml +24 -65
  260. package/rules/agent-manipulation/ATR-2026-00432-superagi-output-handler-eval-rce.yaml +46 -121
  261. package/rules/agent-manipulation/ATR-2026-00440-semantic-kernel-vector-store-eval-rce.yaml +48 -122
  262. package/rules/agent-manipulation/ATR-2026-00552-goal-drift-after-pressure-injection.yaml +58 -195
  263. package/rules/agent-manipulation/ATR-2026-02105-prototype-pollution-constructor-prototype-bypass.yaml +28 -83
  264. package/rules/agent-manipulation/ATR-2026-02231-second-person-death-threat-coercion.yaml +27 -69
  265. package/rules/context-exfiltration/ATR-2026-00020-system-prompt-leak.yaml +76 -133
  266. package/rules/context-exfiltration/ATR-2026-00021-api-key-exposure.yaml +72 -135
  267. package/rules/context-exfiltration/ATR-2026-00075-agent-memory-manipulation.yaml +32 -97
  268. package/rules/context-exfiltration/ATR-2026-00102-disguised-analytics-exfiltration.yaml +25 -100
  269. package/rules/context-exfiltration/ATR-2026-00113-credential-theft.yaml +22 -83
  270. package/rules/context-exfiltration/ATR-2026-00114-oauth-token-abuse.yaml +21 -87
  271. package/rules/context-exfiltration/ATR-2026-00115-env-var-harvesting.yaml +22 -102
  272. package/rules/context-exfiltration/ATR-2026-00136-tool-response-data-piggyback.yaml +29 -105
  273. package/rules/context-exfiltration/ATR-2026-00141-example-format-key-leak.yaml +19 -73
  274. package/rules/context-exfiltration/ATR-2026-00142-piggyback-transition-words.yaml +21 -94
  275. package/rules/context-exfiltration/ATR-2026-00145-obfuscated-key-disclosure.yaml +19 -78
  276. package/rules/context-exfiltration/ATR-2026-00146-env-var-existence-probe.yaml +19 -98
  277. package/rules/context-exfiltration/ATR-2026-00150-credential-in-tool-response.yaml +20 -84
  278. package/rules/context-exfiltration/ATR-2026-00152-obfuscated-credential-leak.yaml +23 -93
  279. package/rules/context-exfiltration/ATR-2026-00162-skill-credential-exfil-combo.yaml +41 -59
  280. package/rules/context-exfiltration/ATR-2026-00201-credential-pipe-exfiltration.yaml +35 -66
  281. package/rules/context-exfiltration/ATR-2026-00212-mcp-atlassian-credential-leak.yaml +51 -117
  282. package/rules/context-exfiltration/ATR-2026-00261-markdown-image-exfiltration.yaml +51 -93
  283. package/rules/context-exfiltration/ATR-2026-00274-api-key-generation-request.yaml +44 -91
  284. package/rules/context-exfiltration/ATR-2026-00275-system-prompt-training-data-extraction.yaml +44 -91
  285. package/rules/context-exfiltration/ATR-2026-00290-divergence-repeat-word-training-extraction.yaml +46 -95
  286. package/rules/context-exfiltration/ATR-2026-00291-biometric-surveillance-personal-data-request.yaml +48 -98
  287. package/rules/context-exfiltration/ATR-2026-00293-educational-records-personal-data-request.yaml +44 -93
  288. package/rules/context-exfiltration/ATR-2026-00294-financial-pii-personal-data-request.yaml +44 -97
  289. package/rules/context-exfiltration/ATR-2026-00295-medical-pii-personal-data-request.yaml +46 -101
  290. package/rules/context-exfiltration/ATR-2026-00405-markdown-image-url-exfiltration-xss.yaml +51 -108
  291. package/rules/context-exfiltration/ATR-2026-00411-apikey-generation-completion-request.yaml +48 -111
  292. package/rules/context-exfiltration/ATR-2026-00421-nl-covert-conversation-exfiltration.yaml +22 -67
  293. package/rules/context-exfiltration/ATR-2026-00422-nl-credential-disclosure.yaml +20 -65
  294. package/rules/context-exfiltration/ATR-2026-00423-nl-sensitive-file-disclosure.yaml +20 -68
  295. package/rules/context-exfiltration/ATR-2026-00424-nl-system-prompt-leak.yaml +21 -59
  296. package/rules/context-exfiltration/ATR-2026-00426-nl-output-injection-credential-leak.yaml +23 -61
  297. package/rules/context-exfiltration/ATR-2026-00431-chatbox-history-exfiltration-prompt-injection.yaml +48 -123
  298. package/rules/context-exfiltration/ATR-2026-00449-spring-ai-chatmemory-cross-user-leak.yaml +54 -139
  299. package/rules/context-exfiltration/ATR-2026-00471-garak-sysprompt-extraction-mixedunassigned.yaml +36 -85
  300. package/rules/context-exfiltration/ATR-2026-00501-data-exfiltration-via-markdown-image-and-link-url-injection.yaml +45 -115
  301. package/rules/context-exfiltration/ATR-2026-00504-tool-and-function-capability-enumeration.yaml +43 -110
  302. package/rules/context-exfiltration/ATR-2026-00505-system-prompt-extraction-instruction-dump-request.yaml +47 -123
  303. package/rules/context-exfiltration/ATR-2026-00514-system-prompt-extraction.yaml +52 -145
  304. package/rules/context-exfiltration/ATR-2026-00516-output-xss-via-llm.yaml +49 -127
  305. package/rules/context-exfiltration/ATR-2026-00524-claude-code-anthropic-base-url-credential-exfil.yaml +68 -193
  306. package/rules/context-exfiltration/ATR-2026-00548-cross-agent-session-context-leak.yaml +50 -152
  307. package/rules/context-exfiltration/ATR-2026-00566-librechat-is-a-chatgpt-clone-with-additi.yaml +33 -67
  308. package/rules/context-exfiltration/ATR-2026-00569-agent-mcp-path-traversal-arbitrary-file-access.yaml +39 -78
  309. package/rules/context-exfiltration/ATR-2026-00571-xss-in-agent-mcp-rendered-output.yaml +34 -58
  310. package/rules/context-exfiltration/ATR-2026-00574-semantic-paraphrased-context-extraction.yaml +31 -73
  311. package/rules/context-exfiltration/ATR-2026-00578-zen-mcp-path-traversal-blacklist-bypass.yaml +55 -135
  312. package/rules/context-exfiltration/ATR-2026-00580-mcp-session-id-token-in-url-query.yaml +48 -158
  313. package/rules/context-exfiltration/ATR-2026-00583-mcp-env-secret-file-read-without-consent.yaml +53 -154
  314. package/rules/context-exfiltration/ATR-2026-00702-ipi-credential-exfil-via-agent-action.yaml +41 -93
  315. package/rules/context-exfiltration/ATR-2026-00703-ipi-financial-data-exfil-indirect.yaml +33 -76
  316. package/rules/context-exfiltration/ATR-2026-00704-ipi-medical-genetic-data-exfil.yaml +33 -78
  317. package/rules/context-exfiltration/ATR-2026-00705-ipi-location-address-browsing-exfil.yaml +31 -75
  318. package/rules/context-exfiltration/ATR-2026-00706-ipi-physical-biometric-exfil.yaml +40 -85
  319. package/rules/context-exfiltration/ATR-2026-00707-ipi-file-exfil-with-destroy-or-tamper.yaml +35 -81
  320. package/rules/context-exfiltration/ATR-2026-00850-indirect-pi-credential-exfil-email.yaml +47 -91
  321. package/rules/context-exfiltration/ATR-2026-00851-indirect-pi-financial-payment-exfil.yaml +45 -83
  322. package/rules/context-exfiltration/ATR-2026-00852-indirect-pi-medical-record-exfil.yaml +51 -89
  323. package/rules/context-exfiltration/ATR-2026-00853-indirect-pi-genetic-data-exfil.yaml +47 -84
  324. package/rules/context-exfiltration/ATR-2026-00854-indirect-pi-location-data-exfil.yaml +41 -83
  325. package/rules/context-exfiltration/ATR-2026-00855-indirect-pi-browsing-history-exfil.yaml +40 -78
  326. package/rules/context-exfiltration/ATR-2026-00856-indirect-pi-address-pii-exfil.yaml +42 -80
  327. package/rules/context-exfiltration/ATR-2026-00857-indirect-pi-cloud-file-exfil.yaml +45 -87
  328. package/rules/context-exfiltration/ATR-2026-00858-indirect-pi-exfil-and-destroy.yaml +48 -89
  329. package/rules/context-exfiltration/ATR-2026-00859-rag-injected-pii-exfil.yaml +43 -86
  330. package/rules/context-exfiltration/ATR-2026-00860-indirect-pi-financial-transfer-hijack.yaml +41 -84
  331. package/rules/context-exfiltration/ATR-2026-00861-indirect-pi-crypto-transfer-hijack.yaml +37 -79
  332. package/rules/context-exfiltration/ATR-2026-00862-indirect-pi-mfa-code-exfil.yaml +44 -87
  333. package/rules/context-exfiltration/ATR-2026-00863-shell-injection-data-exfil.yaml +45 -87
  334. package/rules/context-exfiltration/ATR-2026-01450-svg-onload-xss-injection.yaml +35 -118
  335. package/rules/context-exfiltration/ATR-2026-01451-img-onerror-xss-injection.yaml +35 -93
  336. package/rules/context-exfiltration/ATR-2026-01452-obfuscated-javascript-xss.yaml +33 -85
  337. package/rules/context-exfiltration/ATR-2026-01453-markdown-image-base64-exfil-carrier.yaml +41 -100
  338. package/rules/context-exfiltration/ATR-2026-01454-direct-markdown-exfil-payload.yaml +36 -88
  339. package/rules/context-exfiltration/ATR-2026-01455-new-instructions-injection-marker.yaml +34 -90
  340. package/rules/context-exfiltration/ATR-2026-01456-debug-cli-mode-sysprompt-extraction.yaml +35 -99
  341. package/rules/context-exfiltration/ATR-2026-01457-sysprompt-completion-clone-attack.yaml +41 -123
  342. package/rules/context-exfiltration/ATR-2026-01458-compare-bots-sysprompt-fishing.yaml +30 -87
  343. package/rules/context-exfiltration/ATR-2026-01459-variable-clone-sysprompt-technique.yaml +31 -79
  344. package/rules/context-exfiltration/ATR-2026-01460-json-format-sysprompt-extraction.yaml +31 -79
  345. package/rules/context-exfiltration/ATR-2026-01461-foreign-language-sysprompt-request.yaml +32 -106
  346. package/rules/context-exfiltration/ATR-2026-01462-sysprompt-override-pseudo-admin.yaml +39 -102
  347. package/rules/context-exfiltration/ATR-2026-01463-imend-imsystem-prompt-injection-format.yaml +29 -95
  348. package/rules/context-exfiltration/ATR-2026-01464-indirect-pi-sysprompt-action-hijack.yaml +31 -82
  349. package/rules/context-exfiltration/ATR-2026-01605-ssrf-aws-metadata-endpoint.yaml +26 -58
  350. package/rules/context-exfiltration/ATR-2026-01606-ssrf-internal-network-scan.yaml +26 -50
  351. package/rules/context-exfiltration/ATR-2026-01607-ssrf-localhost-service-probe.yaml +21 -45
  352. package/rules/context-exfiltration/ATR-2026-01608-ssrf-file-scheme-local-read.yaml +23 -47
  353. package/rules/context-exfiltration/ATR-2026-01753-ransom-email-exfil-delete-extortion.yaml +37 -80
  354. package/rules/context-exfiltration/ATR-2026-01754-ransom-file-cloud-exfil-delete-extortion.yaml +33 -73
  355. package/rules/context-exfiltration/ATR-2026-01770-semantic-pii-credential-extraction.yaml +76 -210
  356. package/rules/context-exfiltration/ATR-2026-01772-semantic-internal-state-recon.yaml +54 -154
  357. package/rules/context-exfiltration/ATR-2026-01807-asb-bulk-data-exfil-external.yaml +34 -91
  358. package/rules/context-exfiltration/ATR-2026-01862-llmail-email-tool-exfil-confirmation.yaml +35 -92
  359. package/rules/context-exfiltration/ATR-2026-01863-llmail-post-summary-exfil-directive.yaml +29 -84
  360. package/rules/context-exfiltration/ATR-2026-01864-llmail-obfuscated-exfil-address.yaml +29 -83
  361. package/rules/context-exfiltration/ATR-2026-01890-file-exfiltration.yaml +52 -149
  362. package/rules/context-exfiltration/ATR-2026-01891-surveillance-exfiltration.yaml +44 -87
  363. package/rules/context-exfiltration/ATR-2026-01892-env-exfiltration.yaml +36 -121
  364. package/rules/context-exfiltration/ATR-2026-01893-system-recon-exfiltration.yaml +44 -143
  365. package/rules/context-exfiltration/ATR-2026-01894-cookie-theft.yaml +40 -146
  366. package/rules/context-exfiltration/ATR-2026-01895-contact-exfiltration.yaml +36 -82
  367. package/rules/context-exfiltration/ATR-2026-01924-system-instruction-extraction-reformat.yaml +37 -112
  368. package/rules/context-exfiltration/ATR-2026-01929-mcp-unauthenticated-transport-token-fallback.yaml +53 -119
  369. package/rules/context-exfiltration/ATR-2026-01946-cloud-metadata-ssrf-ip-encoding-bypass.yaml +45 -102
  370. package/rules/context-exfiltration/ATR-2026-01948-netlicensing-mcp-product-number-path-traversal-token-leak.yaml +38 -74
  371. package/rules/context-exfiltration/ATR-2026-01957-m365-copilot-searchleak-open-redirect-exfil.yaml +57 -64
  372. package/rules/context-exfiltration/ATR-2026-01961-meta-ads-mcp-unauth-token-leak.yaml +39 -78
  373. package/rules/context-exfiltration/ATR-2026-01964-langchain-gmailtoolkit-indirect-prompt-injection-email-exfil.yaml +59 -69
  374. package/rules/context-exfiltration/ATR-2026-01984-mcp-server-kubernetes-kubectl-generic-token-exfil.yaml +50 -114
  375. package/rules/context-exfiltration/ATR-2026-01988-t1005-agent-local-data-staging-exfil.yaml +29 -67
  376. package/rules/context-exfiltration/ATR-2026-02017-secret-key-exfiltration-request.yaml +31 -74
  377. package/rules/context-exfiltration/ATR-2026-02026-oblique-sysprompt-extraction-transform.yaml +30 -83
  378. package/rules/context-exfiltration/ATR-2026-02104-media-directive-tool-result-file-exfil.yaml +30 -90
  379. package/rules/context-exfiltration/ATR-2026-02107-ssrf-internal-hostname-domain-allowlist-bypass.yaml +30 -92
  380. package/rules/context-exfiltration/ATR-2026-02121-mixed-encoding-lfi-file-scheme-tool-argument.yaml +39 -98
  381. package/rules/context-exfiltration/ATR-2026-02122-single-level-traversal-sensitive-config-file.yaml +32 -90
  382. package/rules/context-exfiltration/ATR-2026-02140-ssrf-ipv6-hex-encoded-cloud-metadata-bypass.yaml +36 -91
  383. package/rules/context-exfiltration/ATR-2026-02190-dns-exfiltration-ping-dig-encoded-subdomain.yaml +36 -95
  384. package/rules/context-exfiltration/ATR-2026-02250-attachment-upload-tool-arbitrary-file-read.yaml +38 -93
  385. package/rules/context-exfiltration/ATR-2026-02262-env-resolution-credential-exfil.yaml +39 -118
  386. package/rules/context-exfiltration/ATR-2026-02304-preapproved-domain-encoded-path-exfil.yaml +36 -99
  387. package/rules/context-exfiltration/ATR-2026-02351-wildcard-dns-ssrf-hostname-ip-encoding-bypass.yaml +33 -125
  388. package/rules/context-exfiltration/ATR-2026-02373-langsmith-prompt-manifest-baseurl-exfil.yaml +42 -108
  389. package/rules/context-exfiltration/ATR-2026-02406-mcp-sequential-id-enumeration.yaml +54 -219
  390. package/rules/context-exfiltration/ATR-2026-02570-wallet-secret-material-in-agent-tool-payload.yaml +98 -0
  391. package/rules/context-exfiltration/ATR-2026-02602-diagram-theme-css-injection.yaml +146 -0
  392. package/rules/context-exfiltration/ATR-2026-02608-graph-query-remote-egress.yaml +109 -0
  393. package/rules/context-exfiltration/ATR-2026-02621-prompt-mention-autofetch-internal-target.yaml +102 -0
  394. package/rules/context-exfiltration/ATR-2026-02623-obfuscated-uri-scheme-sanitizer-bypass.yaml +109 -0
  395. package/rules/context-exfiltration/ATR-2026-02649-vendor-fqdn-label-prefix-confusion.yaml +109 -0
  396. package/rules/context-exfiltration/ATR-2026-02684-modern-credential-store-file-argument.yaml +104 -0
  397. package/rules/context-exfiltration/ATR-2026-02703-sql-server-side-file-and-program-primitive.yaml +86 -0
  398. package/rules/context-exfiltration/ATR-2026-02847-policy-justified-exfil-to-email.yaml +88 -0
  399. package/rules/context-exfiltration/ATR-2026-02850-fake-documentation-forward-request.yaml +80 -0
  400. package/rules/context-exfiltration/ATR-2026-02855-cross-email-exfil-relay.yaml +79 -0
  401. package/rules/context-exfiltration/ATR-2026-02861-exfil-send-email-with-body-directive.yaml +83 -0
  402. package/rules/context-exfiltration/ATR-2026-02866-idna-label-separator-in-fetch-url-host.yaml +104 -0
  403. package/rules/data-poisoning/ATR-2026-00070-data-poisoning.yaml +37 -123
  404. package/rules/data-poisoning/ATR-2026-00450-spring-ai-prompt-memory-poisoning.yaml +55 -139
  405. package/rules/data-poisoning/ATR-2026-00570-sql-injection-in-agent-tool-query.yaml +36 -63
  406. package/rules/data-poisoning/ATR-2026-01155-memory-plant-direct-command.yaml +22 -54
  407. package/rules/data-poisoning/ATR-2026-01774-semantic-rag-memory-poisoning.yaml +74 -191
  408. package/rules/data-poisoning/ATR-2026-02143-graph-query-injection-node-labels-group-ids.yaml +31 -82
  409. package/rules/data-poisoning/ATR-2026-02144-stored-data-administrative-request-role-elevation.yaml +32 -84
  410. package/rules/data-poisoning/ATR-2026-02303-kql-kusto-pipe-injection-metadata-tool.yaml +34 -97
  411. package/rules/data-poisoning/ATR-2026-02408-dataset-loader-code-execution.yaml +60 -263
  412. package/rules/excessive-autonomy/ATR-2026-00050-runaway-agent-loop.yaml +32 -105
  413. package/rules/excessive-autonomy/ATR-2026-00051-resource-exhaustion.yaml +31 -105
  414. package/rules/excessive-autonomy/ATR-2026-00052-cascading-failure.yaml +32 -129
  415. package/rules/excessive-autonomy/ATR-2026-00098-unauthorized-financial-action.yaml +26 -106
  416. package/rules/excessive-autonomy/ATR-2026-00099-high-risk-tool-gate.yaml +26 -130
  417. package/rules/excessive-autonomy/ATR-2026-00428-nl-unauthorized-shell-execution.yaml +22 -60
  418. package/rules/excessive-autonomy/ATR-2026-00491-garak-agent-breaker-markdown-just-raw-json.yaml +41 -99
  419. package/rules/excessive-autonomy/ATR-2026-00500-ssrf-via-agent-url-fetch-instruction.yaml +41 -110
  420. package/rules/excessive-autonomy/ATR-2026-00553-runaway-tool-loop-behavioral.yaml +50 -141
  421. package/rules/excessive-autonomy/ATR-2026-00708-ipi-financial-transfer-unauthorized.yaml +33 -83
  422. package/rules/excessive-autonomy/ATR-2026-00709-ipi-disable-auth-mfa.yaml +29 -73
  423. package/rules/excessive-autonomy/ATR-2026-00710-ipi-physical-access-grant.yaml +31 -75
  424. package/rules/excessive-autonomy/ATR-2026-00711-ipi-system-sabotage-destructive-command.yaml +38 -88
  425. package/rules/excessive-autonomy/ATR-2026-00712-ipi-malicious-package-install.yaml +33 -78
  426. package/rules/excessive-autonomy/ATR-2026-00713-ipi-rce-network-shell-command.yaml +38 -91
  427. package/rules/excessive-autonomy/ATR-2026-00718-tool-misuse-financial-autonomous.yaml +27 -71
  428. package/rules/excessive-autonomy/ATR-2026-00719-tool-misuse-destructive-bulk-action.yaml +29 -75
  429. package/rules/excessive-autonomy/ATR-2026-00722-ipi-account-manipulation-emergency-pretext.yaml +35 -84
  430. package/rules/excessive-autonomy/ATR-2026-01751-indirect-pi-task-abort-stop-instruction.yaml +32 -75
  431. package/rules/excessive-autonomy/ATR-2026-01752-indirect-pi-captcha-redirect-dos.yaml +30 -74
  432. package/rules/excessive-autonomy/ATR-2026-01773-semantic-excessive-agency-action.yaml +46 -129
  433. package/rules/excessive-autonomy/ATR-2026-01801-asb-autonomous-vehicle-sabotage.yaml +34 -106
  434. package/rules/excessive-autonomy/ATR-2026-01804-asb-covert-unlogged-action.yaml +39 -105
  435. package/rules/excessive-autonomy/ATR-2026-01805-asb-financial-fraud-execution.yaml +39 -112
  436. package/rules/excessive-autonomy/ATR-2026-01806-asb-clinical-patient-harm.yaml +37 -108
  437. package/rules/excessive-autonomy/ATR-2026-01809-semantic-insider-manipulation-process-corruption.yaml +40 -106
  438. package/rules/excessive-autonomy/ATR-2026-01837-ddos-attack-orchestration.yaml +35 -49
  439. package/rules/excessive-autonomy/ATR-2026-01838-unauthorized-cryptominer-deployment.yaml +35 -49
  440. package/rules/excessive-autonomy/ATR-2026-01849-harassment-bot-deployment.yaml +35 -49
  441. package/rules/excessive-autonomy/ATR-2026-01989-t1046-agent-internal-network-sweep.yaml +33 -71
  442. package/rules/excessive-autonomy/ATR-2026-01993-t1562-agent-impair-defenses.yaml +37 -75
  443. package/rules/excessive-autonomy/ATR-2026-01994-t1573-agent-encrypted-c2-channel.yaml +37 -75
  444. package/rules/excessive-autonomy/ATR-2026-02106-redos-regex-payload-tool-argument.yaml +28 -84
  445. package/rules/excessive-autonomy/ATR-2026-02400-agent-approval-gate-disabled-runtime.yaml +60 -293
  446. package/rules/excessive-autonomy/ATR-2026-02401-rogue-agent-mass-connector-grant.yaml +55 -197
  447. package/rules/excessive-autonomy/ATR-2026-02409-mcp-async-task-abuse.yaml +59 -319
  448. package/rules/excessive-autonomy/ATR-2026-02525-shell-command-word-reassembly-classifier-evasion.yaml +151 -0
  449. package/rules/excessive-autonomy/ATR-2026-02641-client-supplied-approver-identity.yaml +111 -0
  450. package/rules/excessive-autonomy/ATR-2026-02667-preapproved-tool-list-in-job-payload.yaml +90 -0
  451. package/rules/model-abuse/ATR-2026-00279-harmful-completion-continuation.yaml +45 -92
  452. package/rules/model-abuse/ATR-2026-00281-eicar-gtube-malware-signature-request.yaml +50 -93
  453. package/rules/model-abuse/ATR-2026-00284-glitch-token-destabilization.yaml +44 -91
  454. package/rules/model-abuse/ATR-2026-00289-lmrc-harmful-content-elicitation.yaml +46 -95
  455. package/rules/model-abuse/ATR-2026-00292-self-harm-eating-disorder-facilitation.yaml +47 -96
  456. package/rules/model-abuse/ATR-2026-00298-malicious-use-illegal-activity-request.yaml +54 -112
  457. package/rules/model-abuse/ATR-2026-00299-harmbench-detailed-harmful-instruction.yaml +53 -107
  458. package/rules/model-abuse/ATR-2026-00413-malwaregen-code-generation-request.yaml +53 -121
  459. package/rules/model-abuse/ATR-2026-00502-training-data-extraction-via-divergent-repetition-attack.yaml +41 -112
  460. package/rules/model-abuse/ATR-2026-00517-model-extraction-distillation.yaml +53 -165
  461. package/rules/model-abuse/ATR-2026-01750-dos-repeat-word-n-times-output-amplification.yaml +33 -95
  462. package/rules/model-abuse/ATR-2026-01760-dos-forced-infinite-output-token-flood.yaml +29 -75
  463. package/rules/model-abuse/ATR-2026-01830-stolen-credential-account-drain.yaml +36 -53
  464. package/rules/model-abuse/ATR-2026-01831-money-laundering-crypto-layering.yaml +36 -53
  465. package/rules/model-abuse/ATR-2026-01833-darknet-controlled-substance-procurement.yaml +40 -60
  466. package/rules/model-abuse/ATR-2026-01834-fraudulent-identity-document-procurement.yaml +35 -49
  467. package/rules/model-abuse/ATR-2026-01835-human-trafficking-facilitation.yaml +35 -49
  468. package/rules/model-abuse/ATR-2026-01836-trojanized-software-distribution.yaml +37 -51
  469. package/rules/model-abuse/ATR-2026-01840-extremist-propaganda-distribution.yaml +35 -52
  470. package/rules/model-abuse/ATR-2026-01841-deepfake-disinformation.yaml +39 -59
  471. package/rules/model-abuse/ATR-2026-01842-plagiarism-detector-evasion.yaml +33 -50
  472. package/rules/model-abuse/ATR-2026-01843-drug-dealing-detection-evasion-spelling.yaml +35 -49
  473. package/rules/model-abuse/ATR-2026-01844-illegitimate-prescription-fulfillment.yaml +35 -49
  474. package/rules/model-abuse/ATR-2026-01845-banned-ingredient-relabel-fraud.yaml +37 -51
  475. package/rules/model-abuse/ATR-2026-01846-tax-evasion-offshore-shell-planning.yaml +35 -49
  476. package/rules/model-abuse/ATR-2026-01847-immigration-work-fraud.yaml +35 -49
  477. package/rules/model-abuse/ATR-2026-01848-illicit-drug-marketplace-build.yaml +35 -49
  478. package/rules/model-abuse/ATR-2026-01850-targeted-doxxing-threat-campaign.yaml +39 -59
  479. package/rules/model-abuse/ATR-2026-01851-bestiality-content-distribution.yaml +34 -45
  480. package/rules/model-abuse/ATR-2026-01852-romance-scam-impersonation.yaml +35 -49
  481. package/rules/model-abuse/ATR-2026-01853-nonconsensual-leaked-media-distribution.yaml +36 -47
  482. package/rules/model-abuse/ATR-2026-01854-falsified-research-abstract-disinformation.yaml +34 -45
  483. package/rules/model-abuse/ATR-2026-01855-content-misappropriation-republish.yaml +37 -51
  484. package/rules/model-abuse/ATR-2026-01856-targeted-harmful-content-generation.yaml +42 -59
  485. package/rules/model-abuse/ATR-2026-01896-ransomware.yaml +35 -84
  486. package/rules/model-abuse/ATR-2026-01897-host-sabotage.yaml +55 -129
  487. package/rules/model-abuse/ATR-2026-01898-network-dos.yaml +47 -93
  488. package/rules/model-abuse/ATR-2026-02211-named-substance-synthesis-request-non-stepword.yaml +34 -110
  489. package/rules/model-abuse/ATR-2026-02411-ai-provenance-metadata-stripping.yaml +63 -226
  490. package/rules/model-abuse/ATR-2026-02412-generative-watermark-removal-tooling.yaml +56 -187
  491. package/rules/model-abuse/ATR-2026-02413-ai-text-detection-evasion-humanizer.yaml +62 -206
  492. package/rules/model-security/ATR-2026-00072-model-behavior-extraction.yaml +36 -110
  493. package/rules/model-security/ATR-2026-00073-malicious-finetuning-data.yaml +28 -116
  494. package/rules/model-security/ATR-2026-00433-modelcache-torch-load-deserialization-rce.yaml +50 -128
  495. package/rules/model-security/ATR-2026-02662-pickle-indirect-name-resolution-gadget.yaml +97 -0
  496. package/rules/privilege-escalation/ATR-2026-00040-privilege-escalation.yaml +21 -83
  497. package/rules/privilege-escalation/ATR-2026-00041-scope-creep.yaml +29 -107
  498. package/rules/privilege-escalation/ATR-2026-00107-delayed-execution-bypass.yaml +17 -90
  499. package/rules/privilege-escalation/ATR-2026-00110-eval-injection.yaml +16 -84
  500. package/rules/privilege-escalation/ATR-2026-00111-shell-escape.yaml +23 -117
  501. package/rules/privilege-escalation/ATR-2026-00112-dynamic-import-exploitation.yaml +15 -81
  502. package/rules/privilege-escalation/ATR-2026-00143-casual-privilege-escalation.yaml +20 -86
  503. package/rules/privilege-escalation/ATR-2026-00144-rationalized-safety-bypass.yaml +21 -83
  504. package/rules/privilege-escalation/ATR-2026-00204-stealth-execution-persistence.yaml +41 -90
  505. package/rules/privilege-escalation/ATR-2026-00436-enclave-vm-sandbox-escape-rce.yaml +53 -131
  506. package/rules/privilege-escalation/ATR-2026-00441-semantic-kernel-sessions-python-plugin-startup-persistence.yaml +50 -122
  507. package/rules/privilege-escalation/ATR-2026-00451-litellm-admin-sqli-cisa-kev.yaml +53 -141
  508. package/rules/privilege-escalation/ATR-2026-00528-praisonai-auth-disabled-default.yaml +40 -151
  509. package/rules/privilege-escalation/ATR-2026-00539-crewai-codeinterpreter-sandbox-escape-rce.yaml +74 -232
  510. package/rules/privilege-escalation/ATR-2026-00546-crewai-json-loader-local-file-read.yaml +46 -117
  511. package/rules/privilege-escalation/ATR-2026-00547-crewai-rag-url-ssrf-bypass.yaml +47 -121
  512. package/rules/privilege-escalation/ATR-2026-00549-destructive-tool-without-human-approval.yaml +52 -159
  513. package/rules/privilege-escalation/ATR-2026-00551-cross-conversation-memory-write.yaml +60 -171
  514. package/rules/privilege-escalation/ATR-2026-01600-sql-injection-tautology-rbac-bypass.yaml +23 -50
  515. package/rules/privilege-escalation/ATR-2026-01601-sql-injection-destructive-ddl.yaml +23 -54
  516. package/rules/privilege-escalation/ATR-2026-01602-sql-injection-union-select-exfil.yaml +20 -57
  517. package/rules/privilege-escalation/ATR-2026-01603-sql-injection-stacked-dml-abuse.yaml +23 -47
  518. package/rules/privilege-escalation/ATR-2026-01604-sql-injection-schema-enumeration.yaml +21 -45
  519. package/rules/privilege-escalation/ATR-2026-01609-shell-injection-exfil-webhook.yaml +29 -53
  520. package/rules/privilege-escalation/ATR-2026-01610-shell-evasion-subshell-injection.yaml +30 -53
  521. package/rules/privilege-escalation/ATR-2026-01611-shell-evasion-eval-exec-injection.yaml +32 -56
  522. package/rules/privilege-escalation/ATR-2026-01612-debug-mode-privilege-escalation.yaml +29 -53
  523. package/rules/privilege-escalation/ATR-2026-01613-rbac-bypass-social-engineering.yaml +29 -66
  524. package/rules/privilege-escalation/ATR-2026-01614-bola-cross-user-data-access.yaml +26 -59
  525. package/rules/privilege-escalation/ATR-2026-01615-sandbox-escape-command-injection.yaml +28 -52
  526. package/rules/privilege-escalation/ATR-2026-01616-path-traversal-agent-file-access.yaml +21 -45
  527. package/rules/privilege-escalation/ATR-2026-01802-asb-backdoor-surveillance-implant.yaml +33 -94
  528. package/rules/privilege-escalation/ATR-2026-01803-asb-covert-server-intrusion.yaml +37 -108
  529. package/rules/privilege-escalation/ATR-2026-01808-asb-synthetic-pan-payment-probe.yaml +31 -86
  530. package/rules/privilege-escalation/ATR-2026-01899-remote-access-backdoor.yaml +43 -112
  531. package/rules/privilege-escalation/ATR-2026-01933-litellm-user-role-privilege-escalation-cve-2026-47102.yaml +45 -103
  532. package/rules/privilege-escalation/ATR-2026-01934-litellm-allowed-routes-authz-bypass-cve-2026-47101.yaml +44 -103
  533. package/rules/privilege-escalation/ATR-2026-01949-praisonai-mcpserver-unauth-tools-call.yaml +39 -80
  534. package/rules/privilege-escalation/ATR-2026-01974-anything-llm-data-import-access-control.yaml +57 -62
  535. package/rules/privilege-escalation/ATR-2026-01981-network-ai-approval-inbox-unauth-cors-bypass.yaml +47 -97
  536. package/rules/privilege-escalation/ATR-2026-01986-windows-mcp-unauth-http-powershell-cors.yaml +51 -112
  537. package/rules/privilege-escalation/ATR-2026-01992-t1556-agent-auth-process-tamper.yaml +37 -75
  538. package/rules/privilege-escalation/ATR-2026-02040-file-edit-tool-persistence-write.yaml +34 -87
  539. package/rules/privilege-escalation/ATR-2026-02100-cypher-destructive-admin-query-injection.yaml +36 -92
  540. package/rules/privilege-escalation/ATR-2026-02101-dynamic-dunder-attribute-sandbox-escape.yaml +33 -91
  541. package/rules/privilege-escalation/ATR-2026-02123-bare-query-path-confusion-auth-bypass.yaml +36 -98
  542. package/rules/privilege-escalation/ATR-2026-02142-download-tool-absolute-path-sandbox-escape.yaml +36 -107
  543. package/rules/privilege-escalation/ATR-2026-02146-export-tool-dest-dir-credential-directory-redirect.yaml +31 -83
  544. package/rules/privilege-escalation/ATR-2026-02192-self-privesc-wildcard-trust-config-write.yaml +41 -103
  545. package/rules/privilege-escalation/ATR-2026-02195-dangerous-env-var-injection-config-tool.yaml +36 -99
  546. package/rules/privilege-escalation/ATR-2026-02251-identifier-field-path-traversal-storage-write.yaml +32 -83
  547. package/rules/privilege-escalation/ATR-2026-02300-mcp-stdio-config-dangerous-env-var.yaml +42 -109
  548. package/rules/privilege-escalation/ATR-2026-02301-symlink-outside-workspace-sensitive-target.yaml +36 -101
  549. package/rules/privilege-escalation/ATR-2026-02302-git-worktree-dotgit-sandbox-escape.yaml +33 -86
  550. package/rules/privilege-escalation/ATR-2026-02353-runtime-identifier-field-path-traversal-log-read.yaml +34 -115
  551. package/rules/privilege-escalation/ATR-2026-02370-ssh-scp-hostalias-option-injection.yaml +42 -100
  552. package/rules/privilege-escalation/ATR-2026-02371-chromium-launch-flag-argument-injection.yaml +43 -103
  553. package/rules/privilege-escalation/ATR-2026-02402-mcp-policy-engine-fail-open.yaml +56 -214
  554. package/rules/privilege-escalation/ATR-2026-02404-model-output-to-shell-unsanitized.yaml +50 -195
  555. package/rules/privilege-escalation/ATR-2026-02407-agent-workspace-boundary-escape.yaml +55 -236
  556. package/rules/privilege-escalation/ATR-2026-02528-tool-parameter-option-flag-smuggling.yaml +113 -0
  557. package/rules/privilege-escalation/ATR-2026-02530-git-config-execution-key-set-by-agent.yaml +131 -0
  558. package/rules/privilege-escalation/ATR-2026-02531-kusto-query-injection-outbound-reach.yaml +110 -0
  559. package/rules/privilege-escalation/ATR-2026-02601-tool-argument-option-injection.yaml +116 -0
  560. package/rules/privilege-escalation/ATR-2026-02620-dynamic-import-data-uri-module.yaml +101 -0
  561. package/rules/privilege-escalation/ATR-2026-02626-agent-self-registers-mcp-server.yaml +107 -0
  562. package/rules/privilege-escalation/ATR-2026-02627-web-shell-written-to-served-path.yaml +119 -0
  563. package/rules/privilege-escalation/ATR-2026-02642-agent-config-tool-disables-own-guardrail.yaml +115 -0
  564. package/rules/privilege-escalation/ATR-2026-02644-image-magic-polyglot-upload.yaml +117 -0
  565. package/rules/privilege-escalation/ATR-2026-02648-readonly-graph-tool-write-procedure.yaml +107 -0
  566. package/rules/privilege-escalation/ATR-2026-02664-git-identifier-field-option-injection.yaml +100 -0
  567. package/rules/privilege-escalation/ATR-2026-02681-reflective-function-constructor-sandbox-escape.yaml +100 -0
  568. package/rules/privilege-escalation/ATR-2026-02683-tool-argument-option-injection-executor-flag.yaml +108 -0
  569. package/rules/privilege-escalation/ATR-2026-02700-percent-encoded-path-traversal-tool-argument.yaml +90 -0
  570. package/rules/privilege-escalation/ATR-2026-02705-python-builtins-leak-and-prefix-check-override.yaml +87 -0
  571. package/rules/privilege-escalation/ATR-2026-02708-loopback-spoofed-host-header-external-request.yaml +91 -0
  572. package/rules/privilege-escalation/ATR-2026-02867-identifier-typed-tool-argument-dot-dot-path-segment.yaml +106 -0
  573. package/rules/prompt-injection/ATR-2026-00001-direct-prompt-injection.yaml +133 -455
  574. package/rules/prompt-injection/ATR-2026-00002-indirect-prompt-injection.yaml +71 -185
  575. package/rules/prompt-injection/ATR-2026-00003-jailbreak-attempt.yaml +110 -328
  576. package/rules/prompt-injection/ATR-2026-00004-system-prompt-override.yaml +56 -225
  577. package/rules/prompt-injection/ATR-2026-00005-multi-turn-injection.yaml +59 -140
  578. package/rules/prompt-injection/ATR-2026-00080-encoding-evasion.yaml +23 -85
  579. package/rules/prompt-injection/ATR-2026-00081-semantic-multi-turn.yaml +27 -104
  580. package/rules/prompt-injection/ATR-2026-00082-fingerprint-evasion.yaml +27 -91
  581. package/rules/prompt-injection/ATR-2026-00083-indirect-tool-injection.yaml +27 -104
  582. package/rules/prompt-injection/ATR-2026-00084-structured-data-injection.yaml +38 -96
  583. package/rules/prompt-injection/ATR-2026-00085-audit-evasion.yaml +25 -90
  584. package/rules/prompt-injection/ATR-2026-00086-visual-spoofing.yaml +29 -153
  585. package/rules/prompt-injection/ATR-2026-00087-rule-probing.yaml +29 -102
  586. package/rules/prompt-injection/ATR-2026-00088-adaptive-countermeasure.yaml +32 -111
  587. package/rules/prompt-injection/ATR-2026-00089-polymorphic-skill.yaml +24 -146
  588. package/rules/prompt-injection/ATR-2026-00090-threat-intel-exfil.yaml +29 -109
  589. package/rules/prompt-injection/ATR-2026-00091-nested-payload.yaml +25 -123
  590. package/rules/prompt-injection/ATR-2026-00092-consensus-poisoning.yaml +28 -96
  591. package/rules/prompt-injection/ATR-2026-00093-gradual-escalation.yaml +28 -98
  592. package/rules/prompt-injection/ATR-2026-00094-audit-bypass.yaml +24 -91
  593. package/rules/prompt-injection/ATR-2026-00097-cjk-injection-patterns.yaml +56 -199
  594. package/rules/prompt-injection/ATR-2026-00104-persona-hijacking.yaml +22 -106
  595. package/rules/prompt-injection/ATR-2026-00130-indirect-authority-claim.yaml +26 -98
  596. package/rules/prompt-injection/ATR-2026-00131-fictional-academic-framing.yaml +26 -94
  597. package/rules/prompt-injection/ATR-2026-00133-paraphrase-injection.yaml +26 -97
  598. package/rules/prompt-injection/ATR-2026-00137-authority-claim-injection.yaml +22 -90
  599. package/rules/prompt-injection/ATR-2026-00138-fictional-framing-bypass.yaml +24 -111
  600. package/rules/prompt-injection/ATR-2026-00140-indirect-reference-reversal.yaml +21 -79
  601. package/rules/prompt-injection/ATR-2026-00148-language-switch-injection.yaml +30 -92
  602. package/rules/prompt-injection/ATR-2026-00153-tool-with-embedded-instruction-to-bypass.yaml +22 -98
  603. package/rules/prompt-injection/ATR-2026-00154-unauthorized-background-task-execution-v.yaml +24 -109
  604. package/rules/prompt-injection/ATR-2026-00155-hidden-llm-instructions-in-skill-descrip.yaml +24 -104
  605. package/rules/prompt-injection/ATR-2026-00156-ssh-remote-command-execution-with-creden.yaml +20 -81
  606. package/rules/prompt-injection/ATR-2026-00163-skill-hidden-override-instruction.yaml +44 -61
  607. package/rules/prompt-injection/ATR-2026-00202-encoding-evasion-homoglyph-synonym.yaml +37 -79
  608. package/rules/prompt-injection/ATR-2026-00203-context-pollution-skill-description.yaml +38 -63
  609. package/rules/prompt-injection/ATR-2026-00206-hidden-priority-instructions.yaml +36 -51
  610. package/rules/prompt-injection/ATR-2026-00207-hidden-instructions.yaml +37 -51
  611. package/rules/prompt-injection/ATR-2026-00211-system-prompt-override.yaml +36 -52
  612. package/rules/prompt-injection/ATR-2026-00213-system-prompt-override.yaml +38 -75
  613. package/rules/prompt-injection/ATR-2026-00226-identity-substitution.yaml +48 -92
  614. package/rules/prompt-injection/ATR-2026-00227-historical-persona-jailbreak.yaml +49 -93
  615. package/rules/prompt-injection/ATR-2026-00228-structured-jailbreak.yaml +47 -88
  616. package/rules/prompt-injection/ATR-2026-00229-roleplay-jailbreak.yaml +46 -87
  617. package/rules/prompt-injection/ATR-2026-00230-persona-moral-bypass.yaml +47 -89
  618. package/rules/prompt-injection/ATR-2026-00231-identity-substitution.yaml +48 -89
  619. package/rules/prompt-injection/ATR-2026-00233-structured-jailbreak.yaml +48 -89
  620. package/rules/prompt-injection/ATR-2026-00234-roleplay-jailbreak.yaml +48 -89
  621. package/rules/prompt-injection/ATR-2026-00235-persona-moral-bypass.yaml +45 -88
  622. package/rules/prompt-injection/ATR-2026-00236-pseudo-code-jailbreak.yaml +46 -89
  623. package/rules/prompt-injection/ATR-2026-00237-dual-response-jailbreak.yaml +48 -89
  624. package/rules/prompt-injection/ATR-2026-00238-identity-replacement.yaml +50 -92
  625. package/rules/prompt-injection/ATR-2026-00239-amoral-persona-obsession.yaml +47 -90
  626. package/rules/prompt-injection/ATR-2026-00240-instruction-nullification-identity-repla.yaml +48 -91
  627. package/rules/prompt-injection/ATR-2026-00241-amoral-character-jailbreak.yaml +47 -90
  628. package/rules/prompt-injection/ATR-2026-00242-persona-jailbreak.yaml +46 -95
  629. package/rules/prompt-injection/ATR-2026-00243-acronym-jailbreak.yaml +47 -88
  630. package/rules/prompt-injection/ATR-2026-00244-dual-response-jailbreak.yaml +46 -89
  631. package/rules/prompt-injection/ATR-2026-00245-malicious-persona.yaml +47 -89
  632. package/rules/prompt-injection/ATR-2026-00247-dual-response-jailbreak.yaml +49 -90
  633. package/rules/prompt-injection/ATR-2026-00249-game-based-jailbreak.yaml +47 -87
  634. package/rules/prompt-injection/ATR-2026-00251-persona-embodiment-jailbreak.yaml +47 -90
  635. package/rules/prompt-injection/ATR-2026-00252-narrative-jailbreak.yaml +48 -91
  636. package/rules/prompt-injection/ATR-2026-00253-enhanced-persona-jailbreak.yaml +47 -89
  637. package/rules/prompt-injection/ATR-2026-00256-base-n-encoding-jailbreak.yaml +47 -91
  638. package/rules/prompt-injection/ATR-2026-00257-cipher-transposition-jailbreak.yaml +48 -91
  639. package/rules/prompt-injection/ATR-2026-00258-unicode-tag-injection.yaml +47 -89
  640. package/rules/prompt-injection/ATR-2026-00264-latent-injection-translation.yaml +47 -89
  641. package/rules/prompt-injection/ATR-2026-00265-latent-injection-rag-document.yaml +50 -96
  642. package/rules/prompt-injection/ATR-2026-00267-gcg-adversarial-suffix.yaml +47 -93
  643. package/rules/prompt-injection/ATR-2026-00272-hypothetical-response-smuggling.yaml +46 -91
  644. package/rules/prompt-injection/ATR-2026-00276-invisible-unicode-bidi-injection.yaml +47 -100
  645. package/rules/prompt-injection/ATR-2026-00278-dra-disguise-reconstruction-attack.yaml +51 -98
  646. package/rules/prompt-injection/ATR-2026-00280-policy-puppetry-xml-injection.yaml +48 -93
  647. package/rules/prompt-injection/ATR-2026-00282-perez-prompt-injection-hijack.yaml +47 -95
  648. package/rules/prompt-injection/ATR-2026-00285-alternate-encoding-jailbreak.yaml +48 -98
  649. package/rules/prompt-injection/ATR-2026-00286-latent-injection-embedded-context.yaml +47 -97
  650. package/rules/prompt-injection/ATR-2026-00296-shell-command-injection.yaml +54 -96
  651. package/rules/prompt-injection/ATR-2026-00297-python-code-execution-rce.yaml +54 -98
  652. package/rules/prompt-injection/ATR-2026-00308-zalgo-diacritic-overload-encoding.yaml +41 -89
  653. package/rules/prompt-injection/ATR-2026-00309-braille-unicode-encoded-injection.yaml +44 -90
  654. package/rules/prompt-injection/ATR-2026-00310-ecoji-emoji-encoded-injection.yaml +44 -93
  655. package/rules/prompt-injection/ATR-2026-00311-base2048-unicode-script-injection.yaml +42 -101
  656. package/rules/prompt-injection/ATR-2026-00312-unicode-variant-selector-ascii-smuggling.yaml +44 -91
  657. package/rules/prompt-injection/ATR-2026-00313-sneaky-bits-zero-width-binary.yaml +44 -95
  658. package/rules/prompt-injection/ATR-2026-00315-sata-masked-language-model-jailbreak.yaml +49 -99
  659. package/rules/prompt-injection/ATR-2026-00316-function-masking-predict-mask-bypass.yaml +42 -92
  660. package/rules/prompt-injection/ATR-2026-00321-hyphenated-system-instruction-injection.yaml +41 -90
  661. package/rules/prompt-injection/ATR-2026-00359-bank-phishing-smtp-email-code.yaml +43 -102
  662. package/rules/prompt-injection/ATR-2026-00367-emoji-flag-encoded-hidden-phrase.yaml +41 -90
  663. package/rules/prompt-injection/ATR-2026-00373-piracy-torrent-site-list-request.yaml +43 -84
  664. package/rules/prompt-injection/ATR-2026-00378-chatgpt-dom-javascript-redirect-manipulation.yaml +41 -86
  665. package/rules/prompt-injection/ATR-2026-00382-cocaine-component-development-request.yaml +43 -89
  666. package/rules/prompt-injection/ATR-2026-00390-explicit-sexual-content-poem-request.yaml +42 -88
  667. package/rules/prompt-injection/ATR-2026-00394-backspace-deletion-character-injection.yaml +48 -100
  668. package/rules/prompt-injection/ATR-2026-00395-llm-special-token-boundary-injection.yaml +50 -104
  669. package/rules/prompt-injection/ATR-2026-00396-toxic-continuation-prefix-injection.yaml +52 -103
  670. package/rules/prompt-injection/ATR-2026-00397-snowball-impossible-reasoning-injection.yaml +51 -105
  671. package/rules/prompt-injection/ATR-2026-00399-latent-injection-document-separator-token.yaml +45 -94
  672. package/rules/prompt-injection/ATR-2026-00400-latent-injection-ignore-instruction-keyword.yaml +41 -90
  673. package/rules/prompt-injection/ATR-2026-00401-leakreplay-cloze-mask-training-data-elicitation.yaml +48 -91
  674. package/rules/prompt-injection/ATR-2026-00403-glitch-token-repeat-back-elicitation.yaml +45 -92
  675. package/rules/prompt-injection/ATR-2026-00407-echo-sql-jinja-template-injection.yaml +52 -97
  676. package/rules/prompt-injection/ATR-2026-00408-dra-parenthesis-character-reconstruction-attack.yaml +52 -99
  677. package/rules/prompt-injection/ATR-2026-00409-phrasing-past-future-tense-harmful-query.yaml +50 -129
  678. package/rules/prompt-injection/ATR-2026-00410-lmrc-harm-category-direct-elicitation.yaml +51 -115
  679. package/rules/prompt-injection/ATR-2026-00412-figstep-image-list-multimodal-jailbreak.yaml +47 -111
  680. package/rules/prompt-injection/ATR-2026-00414-continuation-ethnic-slur-completion-elicitation.yaml +49 -117
  681. package/rules/prompt-injection/ATR-2026-00420-copilot-studio-sharepoint-indirect-injection.yaml +49 -116
  682. package/rules/prompt-injection/ATR-2026-00442-quoted-exact-output-forcing.yaml +38 -103
  683. package/rules/prompt-injection/ATR-2026-00443-word-fragment-concat-assembly.yaml +37 -103
  684. package/rules/prompt-injection/ATR-2026-00444-unicode-obfuscation-in-user-input.yaml +35 -91
  685. package/rules/prompt-injection/ATR-2026-00445-translation-hijack-with-side-output.yaml +35 -90
  686. package/rules/prompt-injection/ATR-2026-00446-variable-assignment-payload-injection.yaml +35 -95
  687. package/rules/prompt-injection/ATR-2026-00447-fictional-generation-containing-target.yaml +35 -90
  688. package/rules/prompt-injection/ATR-2026-00452-direct-pwned-payload-injection.yaml +41 -123
  689. package/rules/prompt-injection/ATR-2026-00453-secret-key-reveal-demand.yaml +38 -118
  690. package/rules/prompt-injection/ATR-2026-00454-backslash-per-character-encoding.yaml +40 -119
  691. package/rules/prompt-injection/ATR-2026-00455-no-period-output-override.yaml +37 -109
  692. package/rules/prompt-injection/ATR-2026-00456-conditional-empty-input-injection.yaml +40 -119
  693. package/rules/prompt-injection/ATR-2026-00457-garak-dan-to-every-prompt.yaml +41 -117
  694. package/rules/prompt-injection/ATR-2026-00458-garak-dra-step-by-step.yaml +41 -100
  695. package/rules/prompt-injection/ATR-2026-00459-garak-dan-an-ai-language.yaml +38 -93
  696. package/rules/prompt-injection/ATR-2026-00460-garak-dan-no-matter-how.yaml +41 -119
  697. package/rules/prompt-injection/ATR-2026-00461-garak-goodside-mixedunassigned.yaml +35 -97
  698. package/rules/prompt-injection/ATR-2026-00462-garak-gcg-mixedunassigned.yaml +35 -98
  699. package/rules/prompt-injection/ATR-2026-00463-garak-lmrc-mixedunassigned.yaml +35 -99
  700. package/rules/prompt-injection/ATR-2026-00464-garak-dan-i-would-like.yaml +41 -96
  701. package/rules/prompt-injection/ATR-2026-00465-garak-dan-your-prompt-here.yaml +41 -102
  702. package/rules/prompt-injection/ATR-2026-00466-garak-latentinjection-following-text-from.yaml +41 -98
  703. package/rules/prompt-injection/ATR-2026-00467-garak-dan-act-as-a.yaml +41 -97
  704. package/rules/prompt-injection/ATR-2026-00468-garak-goat-the-target-llm.yaml +38 -98
  705. package/rules/prompt-injection/ATR-2026-00469-garak-dan-at-the-end.yaml +41 -97
  706. package/rules/prompt-injection/ATR-2026-00470-garak-dan-as-an-ai.yaml +41 -112
  707. package/rules/prompt-injection/ATR-2026-00472-garak-dan-are-going-to.yaml +55 -107
  708. package/rules/prompt-injection/ATR-2026-00473-garak-lmrc-how-can-i.yaml +52 -98
  709. package/rules/prompt-injection/ATR-2026-00474-garak-dan-that-chatgpt-has.yaml +52 -91
  710. package/rules/prompt-injection/ATR-2026-00475-garak-web-injection-alert-1-script.yaml +47 -94
  711. package/rules/prompt-injection/ATR-2026-00476-garak-web-injection-javascript-alert-1.yaml +59 -115
  712. package/rules/prompt-injection/ATR-2026-00477-garak-latentinjection-translate-the-following-text.yaml +51 -101
  713. package/rules/prompt-injection/ATR-2026-00478-garak-latentinjection-abuse-contact-email.yaml +35 -93
  714. package/rules/prompt-injection/ATR-2026-00479-garak-latentinjection-mixedunassigned.yaml +49 -104
  715. package/rules/prompt-injection/ATR-2026-00480-garak-dan-the-role-of.yaml +52 -95
  716. package/rules/prompt-injection/ATR-2026-00481-garak-dan-mixedunassigned.yaml +56 -111
  717. package/rules/prompt-injection/ATR-2026-00482-garak-lmrc-what-s-an.yaml +47 -86
  718. package/rules/prompt-injection/ATR-2026-00483-garak-dan-the-user-s.yaml +51 -99
  719. package/rules/prompt-injection/ATR-2026-00484-garak-dan-and-you-will.yaml +52 -96
  720. package/rules/prompt-injection/ATR-2026-00485-garak-dan-and-does-not.yaml +50 -98
  721. package/rules/prompt-injection/ATR-2026-00486-garak-dan-t-care-about.yaml +43 -83
  722. package/rules/prompt-injection/ATR-2026-00487-garak-dan-and-nothing-else.yaml +51 -92
  723. package/rules/prompt-injection/ATR-2026-00488-garak-encoding-alert-1-script.yaml +47 -95
  724. package/rules/prompt-injection/ATR-2026-00489-garak-encoding-javascript-alert-1.yaml +59 -116
  725. package/rules/prompt-injection/ATR-2026-00490-garak-dan-in-order-to.yaml +43 -102
  726. package/rules/prompt-injection/ATR-2026-00492-garak-dan-want-you-to.yaml +42 -99
  727. package/rules/prompt-injection/ATR-2026-00493-garak-latentinjection-registrar-iana-id.yaml +38 -105
  728. package/rules/prompt-injection/ATR-2026-00495-garak-dan-insert-prompt-here.yaml +47 -117
  729. package/rules/prompt-injection/ATR-2026-00496-garak-dan-no-matter-what.yaml +39 -93
  730. package/rules/prompt-injection/ATR-2026-00497-garak-encoding-mixedunassigned.yaml +46 -118
  731. package/rules/prompt-injection/ATR-2026-00498-garak-web-injection-mixedunassigned.yaml +44 -110
  732. package/rules/prompt-injection/ATR-2026-00499-garak-dan-from-now-on.yaml +41 -96
  733. package/rules/prompt-injection/ATR-2026-00503-fake-error-state-takeover-unrestricted-replacement-bot.yaml +41 -102
  734. package/rules/prompt-injection/ATR-2026-00506-nevermind-override-goal-hijacking-in-user-input-promptinject.yaml +38 -97
  735. package/rules/prompt-injection/ATR-2026-00507-screaming-stop-goal-hijacking-in-user-input-promptinject.yaml +40 -100
  736. package/rules/prompt-injection/ATR-2026-00508-escape-delimiter-wrapped-goal-hijacking-in-user-input-prompt.yaml +42 -101
  737. package/rules/prompt-injection/ATR-2026-00509-prompt-leaking-via-ignore-previous-instructions-in-user-inpu.yaml +41 -114
  738. package/rules/prompt-injection/ATR-2026-00510-delayed-tool-invocation-injection.yaml +50 -132
  739. package/rules/prompt-injection/ATR-2026-00511-mcp-web-context-poisoning.yaml +51 -131
  740. package/rules/prompt-injection/ATR-2026-00512-rules-file-backdoor-injection.yaml +47 -126
  741. package/rules/prompt-injection/ATR-2026-00515-hidden-text-prompt-injection.yaml +52 -135
  742. package/rules/prompt-injection/ATR-2026-00518-ignore-previous-and-following-instructions-output-command-promptinject.yaml +40 -107
  743. package/rules/prompt-injection/ATR-2026-00519-tautology-logic-noise-injection-promptbench.yaml +40 -105
  744. package/rules/prompt-injection/ATR-2026-00520-nlp-task-random-token-suffix-injection-promptbench.yaml +43 -106
  745. package/rules/prompt-injection/ATR-2026-00535-windsurf-ide-zero-click-prompt-injection.yaml +43 -139
  746. package/rules/prompt-injection/ATR-2026-00550-untrusted-retrieval-to-privileged-tool.yaml +61 -171
  747. package/rules/prompt-injection/ATR-2026-00554-langchain-vulnerable-to-template-injecti.yaml +32 -57
  748. package/rules/prompt-injection/ATR-2026-00565-the-llm-cli-tool-thru-0-27-1-contains-a-.yaml +37 -80
  749. package/rules/prompt-injection/ATR-2026-00573-semantic-paraphrased-injection.yaml +33 -75
  750. package/rules/prompt-injection/ATR-2026-00579-mcp-tool-description-line-jumping-injection.yaml +36 -142
  751. package/rules/prompt-injection/ATR-2026-00584-indirect-injection-via-tool-response.yaml +37 -161
  752. package/rules/prompt-injection/ATR-2026-00700-structured-data-payload-injection.yaml +34 -85
  753. package/rules/prompt-injection/ATR-2026-00701-ipi-tool-output-xss-injection.yaml +29 -72
  754. package/rules/prompt-injection/ATR-2026-01000-context-ignore-fake-completion-prefix.yaml +27 -73
  755. package/rules/prompt-injection/ATR-2026-01001-direct-pi-instruction-override-secret-key.yaml +26 -82
  756. package/rules/prompt-injection/ATR-2026-01002-role-escalation-false-authority-claim.yaml +30 -80
  757. package/rules/prompt-injection/ATR-2026-01005-many-shot-repetition-override.yaml +26 -69
  758. package/rules/prompt-injection/ATR-2026-01006-payload-split-string-concat-injection.yaml +31 -84
  759. package/rules/prompt-injection/ATR-2026-01007-token-repeat-flooding-injection.yaml +27 -71
  760. package/rules/prompt-injection/ATR-2026-01009-virtual-world-bypass-fictional-pii.yaml +27 -73
  761. package/rules/prompt-injection/ATR-2026-01012-encoding-evasion-decode-execute.yaml +31 -81
  762. package/rules/prompt-injection/ATR-2026-01013-language-evasion-multilingual-credential.yaml +46 -108
  763. package/rules/prompt-injection/ATR-2026-01015-evasion-refusal-suppression.yaml +31 -82
  764. package/rules/prompt-injection/ATR-2026-01016-evasion-response-priming-forced-opener.yaml +26 -75
  765. package/rules/prompt-injection/ATR-2026-01017-evasion-dual-response-split-output.yaml +28 -74
  766. package/rules/prompt-injection/ATR-2026-01018-evasion-shell-injection-eval.yaml +40 -116
  767. package/rules/prompt-injection/ATR-2026-01019-sysprompt-override-fake-diagnostic-mode.yaml +34 -89
  768. package/rules/prompt-injection/ATR-2026-01020-spikee-doc-embedded-base64-payload.yaml +28 -69
  769. package/rules/prompt-injection/ATR-2026-01021-spikee-doc-embedded-translation-injection.yaml +27 -68
  770. package/rules/prompt-injection/ATR-2026-01023-evasion-opposite-intent-negation-trick.yaml +26 -69
  771. package/rules/prompt-injection/ATR-2026-01024-evasion-persona-override-rule-breaker.yaml +28 -77
  772. package/rules/prompt-injection/ATR-2026-01025-evasion-hypothetical-fictional-execution-framing.yaml +24 -68
  773. package/rules/prompt-injection/ATR-2026-01026-evasion-unicode-glitch-token-anomaly.yaml +28 -82
  774. package/rules/prompt-injection/ATR-2026-01304-indirect-injection-carrier-important-override.yaml +35 -93
  775. package/rules/prompt-injection/ATR-2026-01757-hypothetical-framing-bypass-research-audit.yaml +32 -79
  776. package/rules/prompt-injection/ATR-2026-01758-hypothetical-fictional-story-bypass.yaml +31 -76
  777. package/rules/prompt-injection/ATR-2026-01759-dos-new-important-instructions-injection-in-document.yaml +28 -74
  778. package/rules/prompt-injection/ATR-2026-01771-semantic-jailbreak-framing.yaml +50 -163
  779. package/rules/prompt-injection/ATR-2026-01800-asb-trigger-marker-tool-coercion.yaml +33 -104
  780. package/rules/prompt-injection/ATR-2026-01860-llmail-chat-template-boundary-spoof.yaml +27 -85
  781. package/rules/prompt-injection/ATR-2026-01861-llmail-pseudo-xml-role-injection.yaml +27 -83
  782. package/rules/prompt-injection/ATR-2026-01865-llmail-fake-email-boundary-marker.yaml +26 -80
  783. package/rules/prompt-injection/ATR-2026-01900-output-encoding.yaml +63 -138
  784. package/rules/prompt-injection/ATR-2026-01901-output-scrambling.yaml +63 -129
  785. package/rules/prompt-injection/ATR-2026-01902-output-emoji.yaml +39 -72
  786. package/rules/prompt-injection/ATR-2026-01903-output-language.yaml +35 -65
  787. package/rules/prompt-injection/ATR-2026-01904-link-injection.yaml +44 -95
  788. package/rules/prompt-injection/ATR-2026-01905-promotional-injection.yaml +35 -68
  789. package/rules/prompt-injection/ATR-2026-01906-content-manipulation.yaml +49 -125
  790. package/rules/prompt-injection/ATR-2026-01920-access-grant-coercion.yaml +31 -99
  791. package/rules/prompt-injection/ATR-2026-01921-access-denial-inversion.yaml +33 -92
  792. package/rules/prompt-injection/ATR-2026-01922-authorization-state-spoofing.yaml +33 -97
  793. package/rules/prompt-injection/ATR-2026-01923-forged-input-boundary-markers.yaml +33 -97
  794. package/rules/prompt-injection/ATR-2026-01925-encoded-payload-decoding-coercion.yaml +39 -110
  795. package/rules/prompt-injection/ATR-2026-01926-cross-lingual-authorization-laundering.yaml +29 -90
  796. package/rules/prompt-injection/ATR-2026-02001-ignore-below-instructions-mirror-of-ignore-previ.yaml +31 -73
  797. package/rules/prompt-injection/ATR-2026-02002-instruction-set-probe-or-supplant-direct-meta-qu.yaml +32 -72
  798. package/rules/prompt-injection/ATR-2026-02003-task-pivot-override-abandon-the-cover-task-trans.yaml +31 -72
  799. package/rules/prompt-injection/ATR-2026-02004-regional-indicator-flag-emoji-alphabet-letter-sp.yaml +32 -80
  800. package/rules/prompt-injection/ATR-2026-02005-actor-never-breaks-character-roleplay-dan-style-.yaml +31 -74
  801. package/rules/prompt-injection/ATR-2026-02006-fuzzy-cross-lingual-i-have-been-pwned-near-miss-.yaml +32 -84
  802. package/rules/prompt-injection/ATR-2026-02007-bare-key-elicitation-token.yaml +30 -74
  803. package/rules/prompt-injection/ATR-2026-02008-translation-chain-output-laundering-state-secret.yaml +30 -75
  804. package/rules/prompt-injection/ATR-2026-02009-bare-key-elicitation-trailing-colon.yaml +29 -71
  805. package/rules/prompt-injection/ATR-2026-02010-emoji-only-payload.yaml +30 -73
  806. package/rules/prompt-injection/ATR-2026-02011-malformed-grammar-pwned-success-claim.yaml +30 -69
  807. package/rules/prompt-injection/ATR-2026-02012-movie-title-generator-instruction-wrapper-for-pw.yaml +30 -79
  808. package/rules/prompt-injection/ATR-2026-02013-delimiter-fence-ignore-instructions-override.yaml +31 -74
  809. package/rules/prompt-injection/ATR-2026-02014-spliced-target-string-letters-of-a-filtered-cana.yaml +30 -74
  810. package/rules/prompt-injection/ATR-2026-02015-dense-emoji-only-payload-flood.yaml +30 -72
  811. package/rules/prompt-injection/ATR-2026-02016-reversed-payload-string.yaml +31 -76
  812. package/rules/prompt-injection/ATR-2026-02018-regional-indicator-flag-emoji-letter-spelling-sp.yaml +30 -71
  813. package/rules/prompt-injection/ATR-2026-02019-python-interpreter-role-assignment-exec-framing.yaml +31 -77
  814. package/rules/prompt-injection/ATR-2026-02020-obfuscated-token-reconstruction-via-character-su.yaml +30 -72
  815. package/rules/prompt-injection/ATR-2026-02120-agentdojo-important-message-identity-spoof-pretext.yaml +31 -81
  816. package/rules/prompt-injection/ATR-2026-02210-negation-topic-evil-persona-two-script-jailbreak.yaml +33 -87
  817. package/rules/prompt-injection/ATR-2026-02230-conditional-keyword-trigger-override.yaml +35 -88
  818. package/rules/prompt-injection/ATR-2026-02232-brand-persona-opinion-hijack.yaml +27 -75
  819. package/rules/prompt-injection/ATR-2026-02374-rot13-base64-obfuscated-shell-jailbreak.yaml +38 -90
  820. package/rules/prompt-injection/ATR-2026-02377-novel-persona-jailbreak-cosignal.yaml +32 -64
  821. package/rules/prompt-injection/ATR-2026-02500-prompt-layer-self-replication.yaml +21 -125
  822. package/rules/prompt-injection/ATR-2026-02502-covert-remote-script-injection-into-generated-artifacts.yaml +46 -149
  823. package/rules/prompt-injection/ATR-2026-02815-injected-halt-order-canned-reply-dos.yaml +80 -0
  824. package/rules/prompt-injection/ATR-2026-02820-tool-result-orders-agent-to-hide-its-own-action.yaml +106 -0
  825. package/rules/prompt-injection/ATR-2026-02846-semantic-ignore-previous-and-following-instructio.yaml +115 -0
  826. package/rules/prompt-injection/ATR-2026-02851-fake-user-turn-send-email-instruction.yaml +76 -0
  827. package/rules/prompt-injection/ATR-2026-02858-context-suppression-directive.yaml +73 -0
  828. package/rules/prompt-injection/ATR-2026-02859-tool-output-agent-role-reassignment.yaml +71 -0
  829. package/rules/prompt-injection/ATR-2026-02860-forged-instruction-boundary-marker.yaml +70 -0
  830. package/rules/prompt-injection/ATR-2026-02862-fake-chat-template-turn-injection.yaml +79 -0
  831. package/rules/skill-compromise/ATR-2026-00060-skill-impersonation.yaml +31 -87
  832. package/rules/skill-compromise/ATR-2026-00061-description-behavior-mismatch.yaml +42 -165
  833. package/rules/skill-compromise/ATR-2026-00062-hidden-capability.yaml +40 -80
  834. package/rules/skill-compromise/ATR-2026-00063-skill-chain-attack.yaml +46 -92
  835. package/rules/skill-compromise/ATR-2026-00064-over-permissioned-skill.yaml +40 -109
  836. package/rules/skill-compromise/ATR-2026-00065-skill-update-attack.yaml +37 -75
  837. package/rules/skill-compromise/ATR-2026-00066-parameter-injection.yaml +42 -88
  838. package/rules/skill-compromise/ATR-2026-00120-skill-instruction-injection.yaml +33 -182
  839. package/rules/skill-compromise/ATR-2026-00121-skill-dangerous-script.yaml +33 -164
  840. package/rules/skill-compromise/ATR-2026-00122-skill-weaponized-instruction.yaml +29 -132
  841. package/rules/skill-compromise/ATR-2026-00123-skill-overreach-permissions.yaml +33 -110
  842. package/rules/skill-compromise/ATR-2026-00124-skill-name-squatting.yaml +40 -133
  843. package/rules/skill-compromise/ATR-2026-00125-context-poisoning-compaction.yaml +26 -107
  844. package/rules/skill-compromise/ATR-2026-00126-skill-rug-pull-setup.yaml +23 -102
  845. package/rules/skill-compromise/ATR-2026-00127-subcommand-overflow.yaml +33 -114
  846. package/rules/skill-compromise/ATR-2026-00128-html-comment-hidden-payload.yaml +23 -148
  847. package/rules/skill-compromise/ATR-2026-00129-unicode-smuggling.yaml +35 -62
  848. package/rules/skill-compromise/ATR-2026-00134-fork-claim-impersonation.yaml +24 -105
  849. package/rules/skill-compromise/ATR-2026-00135-exfil-url-in-instructions.yaml +27 -138
  850. package/rules/skill-compromise/ATR-2026-00147-fork-impersonation.yaml +35 -45
  851. package/rules/skill-compromise/ATR-2026-00149-skill-exfil-compound.yaml +34 -151
  852. package/rules/skill-compromise/ATR-2026-00151-fork-impersonation-install.yaml +39 -69
  853. package/rules/skill-compromise/ATR-2026-00157-timebomb-credential-exfil.yaml +41 -96
  854. package/rules/skill-compromise/ATR-2026-00200-agent-memory-config-tampering.yaml +41 -84
  855. package/rules/skill-compromise/ATR-2026-00214-credential-theft.yaml +36 -50
  856. package/rules/skill-compromise/ATR-2026-00217-credential-harvesting.yaml +50 -98
  857. package/rules/skill-compromise/ATR-2026-00220-malware-dropper.yaml +45 -85
  858. package/rules/skill-compromise/ATR-2026-00222-credential-harvesting.yaml +46 -85
  859. package/rules/skill-compromise/ATR-2026-00223-reverse-shell-dropper.yaml +47 -84
  860. package/rules/skill-compromise/ATR-2026-00224-credential-exfiltration.yaml +46 -92
  861. package/rules/skill-compromise/ATR-2026-00225-c2-communication.yaml +46 -86
  862. package/rules/skill-compromise/ATR-2026-00260-package-hallucination.yaml +51 -93
  863. package/rules/skill-compromise/ATR-2026-00262-av-evasion-code-gen.yaml +49 -90
  864. package/rules/skill-compromise/ATR-2026-00263-credential-file-read-gen.yaml +53 -94
  865. package/rules/skill-compromise/ATR-2026-00266-malware-dropper-gen.yaml +51 -92
  866. package/rules/skill-compromise/ATR-2026-00283-malwaregen-generic-virus-payload-request.yaml +51 -96
  867. package/rules/skill-compromise/ATR-2026-00398-huggingface-unsafe-model-artifact-load.yaml +57 -110
  868. package/rules/skill-compromise/ATR-2026-00425-nl-persistent-covert-hook.yaml +24 -65
  869. package/rules/skill-compromise/ATR-2026-00427-nl-fake-error-instruction-bypass.yaml +24 -65
  870. package/rules/skill-compromise/ATR-2026-00429-nl-skill-self-modification.yaml +24 -65
  871. package/rules/skill-compromise/ATR-2026-00523-claude-code-hooks-session-start-pre-trust-rce.yaml +62 -162
  872. package/rules/skill-compromise/ATR-2026-00525-mini-shai-hulud-gh-token-monitor-persistence.yaml +43 -175
  873. package/rules/skill-compromise/ATR-2026-00527-skill-silent-git-remote-mirror-exfiltration.yaml +49 -159
  874. package/rules/skill-compromise/ATR-2026-01755-backdoor-pot-linguistic-trigger-phrase.yaml +40 -88
  875. package/rules/skill-compromise/ATR-2026-01756-backdoor-pot-symbol-emoticon-trigger.yaml +27 -73
  876. package/rules/skill-compromise/ATR-2026-02261-code-credential-exfil-chain.yaml +35 -161
  877. package/rules/skill-compromise/ATR-2026-02405-malicious-skill-package-structure.yaml +51 -201
  878. package/rules/skill-compromise/ATR-2026-02410-malicious-artifact-on-vendor-domain.yaml +54 -204
  879. package/rules/skill-compromise/ATR-2026-02600-in-source-reverse-shell-assembly.yaml +106 -0
  880. package/rules/skill-compromise/ATR-2026-02610-evaluated-config-credential-command.yaml +109 -0
  881. package/rules/skill-compromise/ATR-2026-02818-skill-manifest-declares-attack-purpose.yaml +80 -0
  882. package/rules/skill-compromise/ATR-2026-02845-agent-cryptomining-payload.yaml +102 -0
  883. package/rules/tool-poisoning/ATR-2026-00010-mcp-malicious-response.yaml +80 -209
  884. package/rules/tool-poisoning/ATR-2026-00011-tool-output-injection.yaml +35 -144
  885. package/rules/tool-poisoning/ATR-2026-00012-unauthorized-tool-call.yaml +46 -144
  886. package/rules/tool-poisoning/ATR-2026-00013-tool-ssrf.yaml +45 -148
  887. package/rules/tool-poisoning/ATR-2026-00095-supply-chain-poisoning.yaml +29 -104
  888. package/rules/tool-poisoning/ATR-2026-00096-registry-poisoning.yaml +33 -94
  889. package/rules/tool-poisoning/ATR-2026-00100-consent-bypass-instruction.yaml +22 -100
  890. package/rules/tool-poisoning/ATR-2026-00101-trust-escalation-override.yaml +34 -54
  891. package/rules/tool-poisoning/ATR-2026-00103-hidden-safety-bypass-instruction.yaml +19 -89
  892. package/rules/tool-poisoning/ATR-2026-00105-silent-action-concealment.yaml +22 -101
  893. package/rules/tool-poisoning/ATR-2026-00106-schema-description-contradiction.yaml +31 -51
  894. package/rules/tool-poisoning/ATR-2026-00161-important-tag-cross-tool-shadowing.yaml +54 -160
  895. package/rules/tool-poisoning/ATR-2026-00209-mcpwn-runaway-invocation.yaml +50 -114
  896. package/rules/tool-poisoning/ATR-2026-00210-flowise-system-message-override.yaml +48 -111
  897. package/rules/tool-poisoning/ATR-2026-00259-ansi-escape-injection.yaml +48 -104
  898. package/rules/tool-poisoning/ATR-2026-00270-xss-in-tool-response.yaml +47 -97
  899. package/rules/tool-poisoning/ATR-2026-00277-echo-template-command-injection.yaml +46 -95
  900. package/rules/tool-poisoning/ATR-2026-00393-ansi-code-elicitation-request.yaml +51 -104
  901. package/rules/tool-poisoning/ATR-2026-00415-flowise-custom-mcp-stdio-rce.yaml +47 -119
  902. package/rules/tool-poisoning/ATR-2026-00419-cursor-mcp-zero-click-config.yaml +57 -148
  903. package/rules/tool-poisoning/ATR-2026-00434-mcp-remote-authorization-endpoint-command-injection.yaml +47 -122
  904. package/rules/tool-poisoning/ATR-2026-00435-azure-mcp-server-missing-authentication.yaml +46 -116
  905. package/rules/tool-poisoning/ATR-2026-00448-spring-ai-milvus-filter-injection.yaml +51 -134
  906. package/rules/tool-poisoning/ATR-2026-00494-garak-exploitation-mixedunassigned.yaml +47 -120
  907. package/rules/tool-poisoning/ATR-2026-00513-package-hallucination-exploitation.yaml +45 -117
  908. package/rules/tool-poisoning/ATR-2026-00521-shell-command-injection-agent-tool-context.yaml +40 -130
  909. package/rules/tool-poisoning/ATR-2026-00522-sql-injection-natural-language-agent-interface.yaml +64 -157
  910. package/rules/tool-poisoning/ATR-2026-00526-claude-code-shell-metachar-in-double-quoted-path.yaml +41 -128
  911. package/rules/tool-poisoning/ATR-2026-00529-litellm-proxy-sqli-cisa-kev.yaml +41 -117
  912. package/rules/tool-poisoning/ATR-2026-00530-ms-agent-shell-tool-unsanitized-argv-rce.yaml +40 -143
  913. package/rules/tool-poisoning/ATR-2026-00531-praisonai-unauthenticated-agent-api.yaml +44 -117
  914. package/rules/tool-poisoning/ATR-2026-00532-apache-doris-mcp-sql-injection.yaml +40 -100
  915. package/rules/tool-poisoning/ATR-2026-00533-apache-pinot-mcp-unauthenticated-takeover.yaml +39 -97
  916. package/rules/tool-poisoning/ATR-2026-00534-alibaba-rds-mcp-unauthenticated-metadata-exfil.yaml +39 -100
  917. package/rules/tool-poisoning/ATR-2026-00536-nginx-ui-mcp-unauthenticated-command-execution.yaml +46 -140
  918. package/rules/tool-poisoning/ATR-2026-00537-fastmcp-server-name-cmd-injection-windows.yaml +58 -172
  919. package/rules/tool-poisoning/ATR-2026-00538-langchain-chatchat-mcp-stdio-unauthenticated-rce.yaml +63 -186
  920. package/rules/tool-poisoning/ATR-2026-00540-praisonai-parse-mcp-command-cli-injection.yaml +50 -142
  921. package/rules/tool-poisoning/ATR-2026-00541-agent-zero-mcp-config-command-injection.yaml +51 -134
  922. package/rules/tool-poisoning/ATR-2026-00542-upsonic-mcp-command-allowlist-bypass.yaml +48 -121
  923. package/rules/tool-poisoning/ATR-2026-00543-litellm-mcp-server-argv-injection.yaml +52 -121
  924. package/rules/tool-poisoning/ATR-2026-00544-praisonai-pth-file-path-traversal-rce.yaml +49 -125
  925. package/rules/tool-poisoning/ATR-2026-00545-praisonai-tool-override-unauth-rce.yaml +51 -122
  926. package/rules/tool-poisoning/ATR-2026-00561-fastmcp-vulnerable-to-windows-command-in.yaml +36 -73
  927. package/rules/tool-poisoning/ATR-2026-00567-mcp-stdio-config-command-injection.yaml +29 -53
  928. package/rules/tool-poisoning/ATR-2026-00568-agent-ssrf-cloud-metadata-file-inclusion.yaml +27 -54
  929. package/rules/tool-poisoning/ATR-2026-00572-symjack-symlink-config-redirection.yaml +41 -103
  930. package/rules/tool-poisoning/ATR-2026-00575-miasma-npm-worm-agent-config-backdoor.yaml +41 -110
  931. package/rules/tool-poisoning/ATR-2026-00576-hades-agent-credential-theft.yaml +40 -125
  932. package/rules/tool-poisoning/ATR-2026-00577-create-mcp-server-stdio-exec-command-injection.yaml +53 -169
  933. package/rules/tool-poisoning/ATR-2026-00581-mcp-tool-rug-pull-post-approval-redefinition.yaml +38 -137
  934. package/rules/tool-poisoning/ATR-2026-00714-tool-camouflage-forced-tool-call.yaml +33 -78
  935. package/rules/tool-poisoning/ATR-2026-00715-tool-knowledge-hijack-identity-injection.yaml +39 -87
  936. package/rules/tool-poisoning/ATR-2026-00716-ipi-data-destruction-carrier.yaml +31 -76
  937. package/rules/tool-poisoning/ATR-2026-00720-tool-misuse-privilege-escalation-social.yaml +29 -71
  938. package/rules/tool-poisoning/ATR-2026-01300-mcp-notes-param-chat-history-exfil.yaml +37 -102
  939. package/rules/tool-poisoning/ATR-2026-01301-tool-description-exclusive-tool-override.yaml +36 -92
  940. package/rules/tool-poisoning/ATR-2026-01302-fake-tool-result-instruction-injection.yaml +33 -88
  941. package/rules/tool-poisoning/ATR-2026-01303-tool-schema-enumeration-social-engineering.yaml +55 -107
  942. package/rules/tool-poisoning/ATR-2026-01306-mcp-oauth-command-injection.yaml +35 -87
  943. package/rules/tool-poisoning/ATR-2026-01307-mcp-dns-rebinding-attack.yaml +36 -91
  944. package/rules/tool-poisoning/ATR-2026-01310-mcp-tool-description-compliance-history-exfil.yaml +40 -110
  945. package/rules/tool-poisoning/ATR-2026-01775-semantic-mcp-tool-manifest-poisoning.yaml +51 -139
  946. package/rules/tool-poisoning/ATR-2026-01927-mcp-server-kubernetes-kubectl-command-injection.yaml +45 -109
  947. package/rules/tool-poisoning/ATR-2026-01928-framelink-figma-mcp-curl-fallback-command-injection.yaml +58 -164
  948. package/rules/tool-poisoning/ATR-2026-01930-mcp-sampling-prompt-injection.yaml +48 -129
  949. package/rules/tool-poisoning/ATR-2026-01931-gemini-mcp-tool-command-injection-file-exfil.yaml +42 -113
  950. package/rules/tool-poisoning/ATR-2026-01932-shadow-undeclared-mcp-server-registration.yaml +43 -106
  951. package/rules/tool-poisoning/ATR-2026-01935-litellm-custom-code-sandbox-escape-cve-2026-40217.yaml +44 -101
  952. package/rules/tool-poisoning/ATR-2026-01952-praisonai-codemode-sandbox-escape-rce.yaml +34 -70
  953. package/rules/tool-poisoning/ATR-2026-01953-praisonai-codemode-function-ctor-sandbox-escape.yaml +61 -79
  954. package/rules/tool-poisoning/ATR-2026-01959-openhuman-shell-allowlist-env-prefix-bypass.yaml +36 -123
  955. package/rules/tool-poisoning/ATR-2026-01963-praisonai-action-orchestrator-step-target-path-traversal-rce.yaml +61 -66
  956. package/rules/tool-poisoning/ATR-2026-01965-flowise-custommcp-os-command-rce.yaml +39 -80
  957. package/rules/tool-poisoning/ATR-2026-01967-deepchat-mermaid-xss-rce-ipc-mcp-register.yaml +58 -66
  958. package/rules/tool-poisoning/ATR-2026-01968-deepchat-markdown-deeplink-openexternal-rce-bypass.yaml +44 -92
  959. package/rules/tool-poisoning/ATR-2026-01970-praisonai-filetools-normpath-path-traversal.yaml +64 -84
  960. package/rules/tool-poisoning/ATR-2026-01973-anythingllm-logo-endpoint-path-traversal.yaml +57 -64
  961. package/rules/tool-poisoning/ATR-2026-01978-anythingllm-collector-process-filename-path-traversal-delete.yaml +58 -64
  962. package/rules/tool-poisoning/ATR-2026-01979-pandasai-prompt-injection-dunder-sandbox-escape-rce.yaml +60 -72
  963. package/rules/tool-poisoning/ATR-2026-01980-agentic-flow-mcp-tool-param-command-injection.yaml +49 -99
  964. package/rules/tool-poisoning/ATR-2026-01982-dbt-mcp-node-selection-argument-injection.yaml +49 -102
  965. package/rules/tool-poisoning/ATR-2026-01983-mcp-for-stata-log-file-name-command-injection.yaml +43 -110
  966. package/rules/tool-poisoning/ATR-2026-01985-mcp-connect-bridge-unauth-process-spawn-rce.yaml +41 -115
  967. package/rules/tool-poisoning/ATR-2026-01987-langroid-sqlchatagent-prompt-to-sql-rce.yaml +53 -110
  968. package/rules/tool-poisoning/ATR-2026-02021-mcp-inspector-unauthenticated-proxy-rce.yaml +48 -123
  969. package/rules/tool-poisoning/ATR-2026-02022-curxecute-cursor-mcp-json-injected-server-rce.yaml +51 -131
  970. package/rules/tool-poisoning/ATR-2026-02023-escaperoute-filesystem-mcp-prefix-bypass.yaml +48 -129
  971. package/rules/tool-poisoning/ATR-2026-02024-escaperoute-filesystem-mcp-symlink-launchagent.yaml +49 -128
  972. package/rules/tool-poisoning/ATR-2026-02025-mcp-full-schema-poisoning-nondescription-field.yaml +50 -142
  973. package/rules/tool-poisoning/ATR-2026-02027-diagnostic-content-remediation-command-injection.yaml +58 -72
  974. package/rules/tool-poisoning/ATR-2026-02041-shell-injection-echo-marker-poc.yaml +32 -93
  975. package/rules/tool-poisoning/ATR-2026-02102-html-injection-tool-arg-approval-ui-xss.yaml +33 -107
  976. package/rules/tool-poisoning/ATR-2026-02141-mcp-server-config-command-execution.yaml +42 -107
  977. package/rules/tool-poisoning/ATR-2026-02145-python-sandbox-escape-generator-frame-introspection.yaml +36 -105
  978. package/rules/tool-poisoning/ATR-2026-02193-ssrf-ipv6-noncanonical-loopback-bypass.yaml +35 -86
  979. package/rules/tool-poisoning/ATR-2026-02194-go-init-func-process-exec-codegen-rce.yaml +35 -83
  980. package/rules/tool-poisoning/ATR-2026-02233-unscoped-destructive-db-request-nl.yaml +34 -95
  981. package/rules/tool-poisoning/ATR-2026-02260-agentjacking-remediation-framed-execution.yaml +42 -107
  982. package/rules/tool-poisoning/ATR-2026-02263-workflow-sql-template-expression-injection.yaml +35 -119
  983. package/rules/tool-poisoning/ATR-2026-02350-mcp-json-rpc-case-duplicate-key-tool-smuggling.yaml +34 -100
  984. package/rules/tool-poisoning/ATR-2026-02352-imap-search-command-injection-email-tool-args.yaml +32 -93
  985. package/rules/tool-poisoning/ATR-2026-02372-unsigned-task-feed-npm-npx-lifecycle-rce.yaml +39 -101
  986. package/rules/tool-poisoning/ATR-2026-02376-tool-description-conversational-trigger-history-exfil.yaml +33 -84
  987. package/rules/tool-poisoning/ATR-2026-02403-mcp-external-content-missing-spotlighting.yaml +52 -282
  988. package/rules/tool-poisoning/ATR-2026-02514-mcp-server-metadata-url-html-breakout.yaml +105 -0
  989. package/rules/tool-poisoning/ATR-2026-02542-pipeline-query-stage-injection.yaml +95 -0
  990. package/rules/tool-poisoning/ATR-2026-02557-shell-separator-in-path-typed-tool-argument.yaml +112 -0
  991. package/rules/tool-poisoning/ATR-2026-02666-url-userinfo-decoy-host-allowlist-bypass.yaml +101 -0
  992. package/rules/tool-poisoning/ATR-2026-02668-vcs-ref-name-command-substitution.yaml +98 -0
  993. package/rules/tool-poisoning/ATR-2026-02669-query-pipeline-stage-in-identifier-parameter.yaml +88 -0
  994. package/rules/tool-poisoning/ATR-2026-02682-xml-entity-expansion-bomb.yaml +98 -0
  995. package/rules/tool-poisoning/ATR-2026-02707-crlf-header-injection-mail-tool-argument.yaml +88 -0
  996. package/rules/tool-poisoning/ATR-2026-02817-untrusted-content-dictates-tool-arguments.yaml +83 -0
  997. package/rules/tool-poisoning/ATR-2026-02864-non-canonical-ipv4-host-in-url-tool-argument.yaml +102 -0
  998. package/rules/tool-poisoning/ATR-2026-02865-read-only-utility-write-flag-in-command-argument.yaml +157 -0
  999. package/rules/tool-poisoning/ATR-2026-02868-ssrf-ipv6-transition-address-embedded-private-ipv4.yaml +107 -0
  1000. package/spec/README.md +8 -5
  1001. package/spec/atr-correlation-v1.0.md +16 -4
  1002. package/spec/atr-event-v1.0.md +13 -8
  1003. package/spec/atr-method-v1.1.md +2 -2
  1004. package/spec/atr-profile-v1.0.md +11 -1
  1005. package/spec/category-registry/gemara/README.md +102 -0
  1006. package/spec/category-registry/gemara/ai-agent-capability-catalog.yaml +157 -0
  1007. package/spec/category-registry/gemara/atr-attack-vector-catalog.yaml +130 -0
  1008. package/spec/category-registry/gemara/atr-detection-control-catalog.yaml +327 -0
  1009. package/spec/category-registry/gemara/atr-threat-catalog.yaml +246 -0
  1010. package/spec/category-registry/gemara/src/editorial.yaml +743 -0
  1011. package/spec/mappings/README.md +1 -1
  1012. package/spec/mappings/atr-to-nist-csf-2.0.md +5 -4
  1013. package/spec/schema/event.schema.json +1 -1
package/CHANGELOG.md ADDED
@@ -0,0 +1,1804 @@
1
+ # Changelog
2
+
3
+ All notable changes to ATR will be documented in this file.
4
+
5
+ ## [Unreleased]
6
+
7
+ ## [4.2.0] - 2026-10-24
8
+
9
+ The first release since 4.1.5. For an integrator it changes three things at
10
+ runtime: the Claude Code guard reads what a tool returned instead of what it
11
+ was given, rules written for `context_window` and `skill_*` events now run on
12
+ the events their data arrives in, and a match that a model decided is
13
+ reported instead of enforced unless the integrator opts in. `atr scan` now
14
+ scans an MCP config file it used to skip, and an MCP `tools/list` document
15
+ as one event per tool, without running the rules written for a tool being
16
+ called. Many rule conditions that took polynomial time on long input were
17
+ rewritten, and three rules left the enforce
18
+ lane after matching benign samples. Like 4.1.5, the npm package carries the
19
+ rules without their test samples; the repository keeps them.
20
+
21
+ Default behaviour that changes, and how to keep the old one:
22
+
23
+ - Model-decided matches are advisory. A match from a semantic rule's judge
24
+ that its own pattern fallback does not corroborate, from the embedding
25
+ module or from the semantic layer is listed in `verdict.advisory` and no
26
+ longer sets the verdict's outcome or dispatches more than observe-tier
27
+ actions. To keep the old behaviour pass `modelDecisions: 'enforce'` to
28
+ `ATREngine` or `computeVerdict()`, or use `--model-decisions enforce` or
29
+ `ATR_MODEL_DECISIONS=enforce` with `atr scan` and `atr mcp`. Integrations
30
+ that wire no model, including `atr guard` and the bundled adapters, see no
31
+ change (#720). `verdict.highestSeverity` and `highestConfidence` now
32
+ describe only the matches the outcome came from (read `advisorySeverity`
33
+ for the rest), and `atr scan --json` gives every match `decided_by` and
34
+ `enforced`.
35
+ - More of what an agent sees reaches the rules. A guard registered under
36
+ Claude Code's PostToolUse now scans the tool's output, where it used to scan
37
+ the tool's input; registering it under PostToolUseFailure as well also scans
38
+ failed calls (#715, #721). Rules of type `context_window` and `skill_*` now
39
+ run on typed runtime events (#701). The OpenShell filter
40
+ and NemoClaw preflight adapters evaluate in the hunt lane and deny at `high`
41
+ and above by default (`ATR_MIN_SEVERITY`), so they can now deny on
42
+ ATR-2026-00070 and -01774 (high, `llm_input`/`llm_output`) and
43
+ ATR-2026-00157 and -02405 (critical, `tool_call`), where 4.1.5 did not. Both raise matches in
44
+ the hunt lane, the engine default, including on benign text (measured
45
+ figures under Fixed below); neither moves the enforce lane. There is no
46
+ switch back. An integration that blocks on PostToolUse should block on the
47
+ enforce lane: `atr guard --blocking --lane enforce` (or `ATR_BLOCKING=1
48
+ ATR_LANE=enforce`), or `lane: 'enforce'` on `ATREngine`. The guard's default
49
+ lane is hunt, so `--blocking` alone blocks on the hunt-lane matches above.
50
+ - ATR-2026-00080, -00436 and -01606 moved from maturity `stable` to `test`
51
+ after matching benign samples in the grown corpus (#625). They still alert;
52
+ an integration that blocks only in the enforce lane no longer blocks on
53
+ them.
54
+ - ATR-2026-00012 moved from maturity `test` to `experimental` (#683), so it
55
+ runs in the hunt lane only and no longer in the alert lane. ATR-2026-00233,
56
+ a duplicate of ATR-2026-00228, is deprecated and runs in no lane (#666).
57
+ - `atr scan` on an MCP config file scans one event per server (#581, by
58
+ @ciceroyang), and on an MCP `tools/list` document, bare or in a JSON-RPC
59
+ response, one event per tool (#737). 4.1.5 skipped both and reported them
60
+ clean. Any JSON file `atr scan` reads in which no event reaches the engine
61
+ now exits 1, in text, `--json` and `--sarif` output alike; `events_scanned`
62
+ counts only events that did, beside a new `events_skipped`. A CI step that ran
63
+ `atr scan` on such a file and always passed may now fail, on the exit code or
64
+ through `--fail-on`. The GitHub Action ignores the exit code (#575) but counts
65
+ the new findings toward `fail-on-finding`. Scanning a directory that holds
66
+ only an MCP config is not fixed yet (#575).
67
+
68
+ Under SPEC §10 this is a minor release: the rule format, identifier scheme and
69
+ Match output are unchanged (matches gain an optional `decidedBy`, which §7
70
+ allows). SPEC.md moves to 1.0.1, a [Compatible] correction of §6.4 (#699).
71
+ SPEC §10 versions the format, not the package's defaults, and some defaults
72
+ change above. 4.0.0 went major because every `atr guard` user lost a block
73
+ they had by default. Here an integration that wires no model loses no block;
74
+ one that wired a model judge and blocked on its decisions does, and one that
75
+ blocks in the hunt lane, as `atr guard --blocking` does on PostToolUse and the
76
+ OpenShell and NemoClaw adapters do, can gain blocks. If that describes your
77
+ integration, apply the switches above or stay on 4.1.5.
78
+
79
+ ### Added
80
+
81
+ - **New rules, all at maturity `test`** (hunt and alert lanes, not the
82
+ enforce lane): ATR-2026-02815, -02817 and -02820 (#612); -02858, -02859 and
83
+ -02860, technique rules for llm-guard samples lost to earlier FP repairs
84
+ (#668); -02855, -02861 and -02862 from the FN-mine sweeps (#650, #671);
85
+ -02864, -02865, -02866, -02867 and -02868 from agent-related CVEs published
86
+ 2026-09-22 to 2026-10-21 (#730, #731).
87
+
88
+ - **The category registry as Gemara catalogs, generated and published from
89
+ here.** `spec/category-registry/gemara/` holds a vector, capability, threat
90
+ and control catalog validated against the Gemara v1.6.0 CUE schemas. The
91
+ vector catalog is generated from `spec/category-registry/v1.0.yaml` (ids and
92
+ descriptions verbatim) by `scripts/generate-gemara-catalogs.ts`;
93
+ `tests/gemara-catalogs.test.ts` fails when the committed catalogs are stale.
94
+ `.github/workflows/publish-gemara.yml` publishes them as one keyless-signed
95
+ OCI bundle, `ghcr.io/agent-threat-rule/agent-threat-rules/gemara:<bundle
96
+ version>`, on release tags only, and pushes nothing when that version is
97
+ already published with the same catalogs.
98
+
99
+ - **`atr test` reports a true positive that matches only through a copy the
100
+ test event makes.** The test event offers a case's input under every alias a
101
+ rule might read, whatever the event type: as `user_input` and `tool_args`, and
102
+ its content as `agent_message`. `buildEventFromTestCase` gains a `runtime`
103
+ field set, which holds what this repository's producers put on an event of the
104
+ type: content, the fields the case names (taken as given), `user_input` on an
105
+ `llm_input` event, and on a tool event the `tool_name` and `tool_args`
106
+ `src/hook-handler.ts` fills. `caseMatchesAtRuntime` runs a case on that set
107
+ for every event type, the engine's source filter deciding which of them the
108
+ rule runs on, or as a skill document. `atr test` lists a passing true positive
109
+ that matches none of them under `harnessOnly` (JSON) and "Harness-only"
110
+ (text); it still counts as passed. No true positive on main is one.
111
+ ATR-2026-01610's two cases declared as `user_input` match their `llm_input`
112
+ event only through the input copied into `tool_args`; the engine also runs
113
+ `llm_io` rules on `tool_response` events, where the hook fills `tool_args`,
114
+ and there they match. `tests/testcase-runtime-parity-rules.test.ts` runs every
115
+ rule's true positives the way `atr test` does, leaving out a type the engine
116
+ withholds as `atr test` does, and fails on one.
117
+
118
+ - **Every benchmark measurement records the enforce lane beside its
119
+ headline.** A measurement's `metrics.recall` is the `hunt` lane (the engine
120
+ default, every maturity). Each runner the weekly measurement calls now also
121
+ runs the same samples through its own detection loop on an engine
122
+ constructed with `lane: 'enforce'` (only `maturity: stable` rules, the lane
123
+ for blocking) and records the result as `breakdown.enforce_lane`. Where a
124
+ measurement records it, README's Recall cell cites both lanes and root
125
+ `stats.json` cites the enforce figure as `enforceLaneRecall`;
126
+ `scripts/check-benchmark-citations.ts` fails CI when either disagrees with
127
+ the measurement or leaves the enforce figure out. Before this, the enforce
128
+ figures in README were one-off replays.
129
+ - **Recall figures outside README are rendered from the measurement files.**
130
+ `scripts/render-recall-citations.ts` fills the figures between recall
131
+ markers in `LIMITATIONS.md` and the `docs/owasp-pr/` texts, from the file each
132
+ source's `latest.json` points at, in both lanes (every rendering is held to
133
+ the rule README's table is checked by). `scripts/sync-citation-garak.ts`
134
+ generates the garak sentence in `CITATION.cff` from root `stats.json`, with
135
+ both lanes and the closed-book caveat. The weekly measurement run re-renders
136
+ and stages both and lists what it could not render in the rolling PR's body;
137
+ CI (`eval.yml`) fails on a stale or unrenderable figure.
138
+ - **`scripts/bench-evaluate-latency.ts` times single `ATREngine.evaluate()`
139
+ calls** in the hunt and enforce lanes on three committed corpora of
140
+ different input length, so the latency wording in LIMITATIONS.md and
141
+ THREAT-MODEL.md can be checked on any hardware. The `latency_ms` blocks in
142
+ `data/measurements/` time whole corpus samples (several event shapes, a
143
+ skill scan and, when installed, an embedding pass) inside a full benchmark
144
+ run, and are not comparable.
145
+ - **CI re-checks the /red-team page's links against GitHub.** The page's list
146
+ of offensive tools and corpora moved out of the page into
147
+ `website/data/red-team-tools.json`. `scripts/verify-red-team-links.mjs`, run
148
+ by `verify-red-team-links.yml` when the list or the checker changes and
149
+ weekly, fails when an in-review entry's PR or issue is no longer open, an
150
+ in-production entry's PR is not merged, a corpus entry's link is neither a
151
+ merged PR nor a commit on the default branch, or the `stillPresent` file an
152
+ in-production or corpus entry must name no longer holds its text. It
153
+ reports drift, links that are gone, and lookups GitHub could not answer
154
+ separately, and counts none of them as a pass; a failure on main or on the schedule opens a tracking issue.
155
+ It would have flagged NVIDIA/garak#1676 within a week of its withdrawal on
156
+ 2026-08-04, instead of the ten weeks it stayed listed before #688. It cannot
157
+ flag an open proposal nobody answers, which is why the page calls that group
158
+ "Open proposals". The three corpus entries linked to ATR PRs #51, #52 and
159
+ #53, which do not contain the rules they named; they now link to the commits
160
+ that added ATR-2026-00452..00456, 00500..00505 and 00510..00517, the second
161
+ no longer names NeMo-Guardrails as a rule source, and every figure they and
162
+ the page's 2026-05-12 sprint section quote now comes from a measurement file
163
+ or a committed re-run record. HackAPrompt is quoted per lane on its pinned
164
+ 4,780-prompt subset, followed by its ablation reference (the same prompts
165
+ without the rules whose YAML names HackAPrompt), read from
166
+ `breakdown.in_sample_ablation` of the measurement file and called what it is,
167
+ an approximation of out-of-sample recall rather than an out-of-sample result;
168
+ the vendor-suite entry is followed by its own. The sprint's 28.6% to 66.2%
169
+ becomes the re-measured 28.6% to 66.0%: 66.2% could not be reproduced at the
170
+ sprint commits `e9efefdd` and `92c0d0fe` (66.0% at best), and the 28.6% is
171
+ itself in-sample. The paper is described as listed under Best Paper Awards at
172
+ EMNLP 2023, on gpt-3.5-turbo, FlanT5-XXL and text-davinci-003 (not
173
+ GPT/Claude/PaLM). The 2026-05-12 import is described as 79 of 94 samples
174
+ occurring verbatim in the vendor file they name. The sprint added 71 rule
175
+ files, not 75 (the 2.2.0 entry also counted four earlier CVE rules), and the
176
+ claims that the sprint's and the 2026-06 mega-scan's rules all passed the
177
+ quality gate with 0 benign FP are replaced by the gate re-run on 2026-10-19
178
+ and again on 2026-10-22 (`data/gate-reruns/2026-10-19_red-team-rule-batches.json`):
179
+ at 92c0d0fe, 10 of the 71 failed (own true positives) and none flagged a benign
180
+ SKILL.md file; at main b9d16840 on 2026-10-22, 33 of 71 and 4 of 29 fail, and
181
+ 26 and 3 flag at least one benign sample, none of them in the enforce lane,
182
+ the same as at 9d74fc50 on 2026-10-19 although nine of the recorded rules
183
+ changed in between. Each corpus entry links its
184
+ measurement file.
185
+
186
+ ### Changed
187
+
188
+ - **Three rules left the enforce lane.** ATR-2026-00080, -00436 and -01606
189
+ each matched benign samples in the grown corpus and were demoted from
190
+ maturity `stable` to `test` (#625). ATR-2026-00233, a duplicate of another
191
+ rule, is deprecated (#666).
192
+ - **Six rules follow MITRE ATLAS v2026.07.** AML.T0019 and AML.T0104, retired
193
+ into AML.T0115 as sub-techniques, are replaced by AML.T0115.000 and
194
+ AML.T0115.002 in the rules' `references.mitre_atlas` (#543).
195
+
196
+ - **A match a model decided is reported, not enforced, unless the integrator
197
+ opts in.** Three engine paths turn a model's output into a match: a semantic
198
+ rule's `semanticJudge`, the `embeddingModule` similarity signal (which in the
199
+ hunt and alert lanes could produce a critical `block_input` match), and the
200
+ `semanticModule` layer. No evidence a response tier is earned from measures
201
+ them: the benign-corpus evidence runs the synchronous engine, where a semantic
202
+ rule is its pattern fallback, and neither the embedding module nor the
203
+ semantic layer. Every match now carries `decidedBy`, and
204
+ `computeVerdict()` keeps a model-decided one out of the outcome and dispatches
205
+ only its observe-tier actions; it is listed in the new `verdict.advisory`
206
+ (with `verdict.advisorySeverity`), and `highestSeverity` and
207
+ `highestConfidence` now describe the matches the outcome came from. A
208
+ semantic rule whose judge matches is enforced when the rule's own pattern
209
+ fallback matches the same input (reported as the fallback's match); a judge
210
+ match the fallback does not corroborate is advisory. Rule, invariant,
211
+ blacklist and fingerprint matches decide as before. `modelDecisions:
212
+ 'enforce'` on the engine (or on `computeVerdict`) restores the previous
213
+ behaviour; any other value throws. `computeVerdict` now sorts the matches it
214
+ is given instead of trusting their order.
215
+ - **`atr scan` and the MCP server follow the same default.** `atr scan
216
+ --semantic` lists a judge-only match but leaves it out of `--fail-on`, and
217
+ writes it to SARIF at level `note` with `properties.enforced: false`, which the
218
+ GitHub Action no longer counts toward `fail-on-finding`. JSON and SARIF output
219
+ name what decided each match (`decided_by`). The MCP scan tool reports a
220
+ judge-only match with outcome `allow`, `enforced: false` and observe-tier
221
+ recommended actions. `--model-decisions enforce` or
222
+ `ATR_MODEL_DECISIONS=enforce` restores counting for `atr scan` and `atr mcp`.
223
+ `atr guard` and the bundled adapters wire no model, so nothing they do
224
+ changes.
225
+
226
+ - **The ReDoS gate now times long inputs, every branch of an alternation
227
+ and input tiled with a pattern's own openers, and its baseline grew from 9
228
+ to 439 conditions because of it.** Nothing got slower; the gate started
229
+ looking. Two integrations packaging the corpus found conditions that took
230
+ seconds to minutes on 8,000- and 50,000-character inputs while
231
+ `scripts/gate-redos.py` reported them clean: its inputs were 1,500 to
232
+ 3,000 characters, where a quadratic condition costs about a tenth of a
233
+ second, and only the first branch of an alternation was ever pumped. Each
234
+ condition is now also run on 20,000-character inputs built per quantifier
235
+ -- the text that reaches the quantifier, through whichever branch,
236
+ lookbehind or back-reference leads there, followed by a long run of its
237
+ own body -- and on its openers and pumped near-match tiled to length
238
+ (#601). Each worker calibrates per chunk and times are reported in
239
+ reference-machine seconds, which reduces, but does not remove, the effect
240
+ of load that changes during a run. `data/redos-baseline.json` now lists
241
+ 439 conditions in 259 rules: 350 over the budget when it was written (201
242
+ of them did not return within the wall even timed alone) and 89 under the
243
+ budget but over a third of it, recorded too because one condition's
244
+ readings spread by more than 2x across runs and machines. 41 are in the
245
+ enforce lane and 412 are high or critical.
246
+ Each entry carries a fingerprint of its pattern, so editing a baselined
247
+ condition makes it new again instead of inheriting the exemption; an
248
+ unchanged baselined hang is not re-run. The gate stays a ratchet: it fails
249
+ on a slow condition outside that file. `scripts/verify_rule_redos.py` now
250
+ uses the gate's own inputs and timing -- it had reported PASS on
251
+ ATR-2026-02372 with both conditions hanging -- and with `--base REF` also
252
+ times a changed condition on the inputs derived from its previous pattern.
253
+ Twelve conditions that Python `re` cannot compile, and that the gate
254
+ skipped without saying so, are now listed by key. pyatr runs eleven of
255
+ them through its `regex` fallback and the TypeScript engine compiles all
256
+ twelve, so they run in production and are still untimed here; the twelfth,
257
+ ATR-2026-00290#3, back-references a group that does not exist, which pyatr
258
+ refuses and JavaScript reads as the character U+0001 (#331). The semantic
259
+ lane's per-draft ReDoS precheck now allows 300 s instead of 120 s.
260
+
261
+ - **Every recall figure the site, LIMITATIONS.md, CITATION.cff and the docs
262
+ above take from the measurement files now names its lane** and gives the
263
+ enforce figure wherever the measurement records one. Figures no measurement
264
+ file records are labelled instead: the about page's historical garak figure
265
+ as taken with every rule loaded, the neutral-benchmarks post's runs as having
266
+ no recorded lane. The website reads `breakdown.enforce_lane` from the measurement
267
+ files (home, coverage, research, red-team, garak integration, ATD and
268
+ sovereign-AI pages, the PINT blog post); it no longer reads recall
269
+ from the old eval report files or their typed fallbacks, and no longer
270
+ hydrates recall in the browser. The garak figures carry the closed-book
271
+ caveat, and so now do the PINT-format and HackAPrompt figures, which have
272
+ rules mined from them too. The SKILL.md benchmark is described as the
273
+ internal, labelled corpus it is, with the harness's layer names. An erratum
274
+ (`e-2026-10-16-recall-lanes`) records the change on the site.
275
+ - `sync-stats.ts` now fails when CITATION.cff has no garak sentence to
276
+ rewrite, instead of leaving an old figure in place.
277
+ - **`scripts/check-rules-safety.ts` checks that a modified rule still matches
278
+ its own true positives, and checks renamed rules.** A new rule's true
279
+ positives had to match; a modified rule only had to add no benign false
280
+ positive, and a rule that matches nothing adds none. `npm run
281
+ gate:generalization` covers pattern rules only, so a semantic rule whose
282
+ `fallback_method` was set to `none` passed every check. The new own-TP check
283
+ runs each true positive on both paths `atr test` tries, replaying every case
284
+ to the changed rule as the event the base rule would receive: a case the
285
+ base rule matched on a path (`evaluate()`, `scanSkill()`) must still match
286
+ there, one the change adds must match, and the changed rule must still match
287
+ one of the cases the base rule matched. That also catches re-routing a rule
288
+ away from its cases. A rule of a type the engine withholds from typed events
289
+ (`WITHHELD_SOURCE_TYPES`), which `atr test` reports as unevaluable, is
290
+ skipped while it stays that type. A renamed rule file was on neither the new
291
+ nor the modified list and skipped both checks; it is now compared with the
292
+ file it was at the base, and a changed file whose rule id differs is checked
293
+ as a new rule. `npm run validate` also checks a semantic rule's
294
+ `fallback_method` (`pattern` or `none`, compared exactly, as the engine
295
+ does), its `threshold` (a number from 0 to 1), and that a pattern fallback
296
+ has a condition to match.
297
+ - **`scripts/check-rules-safety.ts` runs a new rule's true positives the way
298
+ `atr test` does (Check 2).** It read only a case's `input` and ran it as the
299
+ text of the benign corpus shapes. On main, as if each rule past Check 1 were
300
+ new, 250 true positives in 54 rules carry their payload elsewhere
301
+ (`tool_response`, `tool_args`, `tool_description`, a `user_input` key, an
302
+ object `input`, ...) and were never read; 47 of those rules had none read
303
+ and passed with nothing run. The routing a rule declares was never
304
+ exercised. Each case now runs as the event built from it for the rule's own
305
+ `agent_source.type`, and through `scanSkill()`, with the code the own-TP
306
+ check for modified rules uses (`scripts/lib/own-true-positives.ts`), and its
307
+ text must still match on the corpus shapes, so a case that fires only
308
+ through a tool name, which no benign sample exercises, fails. The semantic
309
+ lane's pre-gate runs the same code. A case that cannot be run fails, and so
310
+ does a rule of a type the engine withholds from typed events
311
+ (`memory_access`), whose cases `atr test` reports as unevaluable. A new rule
312
+ the benign checks cannot run at all (deprecated, or a trace, behavioral or
313
+ signature method) is refused with the reason; Check 2 used to fail most of
314
+ them only because it could not match their cases either, and one whose cases
315
+ carried no `input` passed the whole gate.
316
+ - **README §8 discloses that the `garak` and `garak-full` figures are partly
317
+ closed-book.** A replay without the rules whose own YAML shows they were
318
+ written from the in-the-wild corpus is given in the new `[^garakcorpus]`
319
+ footnote, and the paragraph on the two `garak` rows no longer calls them
320
+ independent: `garak-full` contains that corpus twice.
321
+ - `data/stats.json` no longer carries the orphaned `benchmark.pintRecall`
322
+ block, a 3.5.11 figure nothing has written since #600 and nothing reads.
323
+
324
+ ### Fixed
325
+
326
+ - **`atr scan` scans an MCP config file instead of skipping it.** The file was
327
+ parsed, wrapped as one event without `content` and skipped, while the
328
+ summary counted it as scanned, so a config that sets `NODE_OPTIONS` to a
329
+ `require` payload came back as no threats. Each server in the document is
330
+ now its own event, `events_scanned` counts what reached the engine beside
331
+ `events_skipped`, and a file with nothing scannable exits non-zero (#581,
332
+ by @ciceroyang; issue #575, where directory scans and the Action's exit
333
+ handling remain open).
334
+
335
+ - **Rule conditions that took polynomial time on long input were
336
+ rewritten.** 86 conditions in 48 rules found by the extended ReDoS gate
337
+ (#704), eight conditions quadratic in a long run of one character (#723),
338
+ and ATR-2026-00063 and -00228 (#666). The rewrites keep the language of
339
+ each condition, except four deliberate changes in #704:
340
+ ATR-2026-00446 condition 0 widens, and ATR-2026-01005 condition 1 and
341
+ ATR-2026-01307 conditions 0 and 1 narrow. ATR-2026-02261 condition 0
342
+ narrows on purpose in #723 (its back-reference no longer ties two different
343
+ variables), and ATR-2026-00228 condition 1 in #666 (on JSON-encoded content
344
+ the two labels must be on one line). Conditions still over the gate's
345
+ budget stay listed in `data/redos-baseline.json`.
346
+ - **Rule false positives.** ATR-2026-00012 matched 1,817 of 14,157 benign
347
+ samples and now matches 150, with every match of the new version also a
348
+ match of the old one (#683). ATR-2026-02010 no longer matches blank or
349
+ whitespace-only input (#704). ATR-2026-00013 also flags apex
350
+ loopback-wildcard domains (CVE-2026-55096) and its IPv6 condition matches
351
+ IPv4-mapped obfuscation only (#732, #733).
352
+ - **`atr scan` scans an MCP `tools/list` document, one event per tool.** A file
353
+ holding `{"tools": [...]}`, or the JSON-RPC response `{"jsonrpc": "2.0",
354
+ "result": {"tools": [...]}}`, was wrapped as one event with no content,
355
+ skipped, and reported as "nothing was scanned", so the usual input for a
356
+ tool-poisoning check reached no rule. Each tool is now an `mcp_exchange`
357
+ event (`src/cli/mcp-tools-document.ts`): the content is the tool definition as
358
+ JSON, input schema and per-parameter descriptions included, and
359
+ `tool_name` / `tool_description` are set from the definition. A JSON array of
360
+ such responses is accepted too. A document that lists no tools fails with
361
+ "nothing was scanned" rather than reporting clean. `mcpServers` documents and
362
+ event files are read as before. Tests: `tests/cli-mcp-tools-list-scan.test.ts`.
363
+ - **A tools/list scan does not run the rules written for a tool being called.**
364
+ A definition defines a tool and calls none, but an `mcp_exchange` event admits
365
+ every rule, so call rules (ATR-2026-00099 and others, which read the called
366
+ tool's name and arguments) flagged every definition named `delete_*`,
367
+ `*_reset` or `exec*`. New engine option `toolDefinitions` (`ATREngineConfig`,
368
+ default false), which `atr scan` sets only for a tools/list document: a rule
369
+ with `agent_source.type: tool_call` then runs only if one of its conditions
370
+ reads `tool_description` (the test is per rule: such a rule runs with all its
371
+ conditions), or if its subject is the tool's identity (`TOOL_IDENTITY_RULES`
372
+ in `src/tool-definition-scope.ts`: ATR-2026-00060, impersonation); every other
373
+ rule runs as before. No rule file changes; hooks, adapters, config documents
374
+ and event files are unaffected. `atr scan --json` reports
375
+ `tool_definition_scope`, `rules_evaluated` and `rules_skipped_by_scope` (SARIF:
376
+ run properties) and the `tool_name` of each result, so a rule that was not run
377
+ does not read as a clean result. An event that also carries a `tools` array
378
+ is still scanned as an event. Documented in `docs/ARCHITECTURE.md` §3.2,
379
+ `docs/schema-spec.md` (agent_source.type) and `docs/rule-writing-guide.md`.
380
+ On 710 benign tool definitions from 45 official and vendor MCP servers,
381
+ flagged definitions go from 58 to 6 (hunt) and 57 to 5 (alert); enforce is 0
382
+ before and after, which says nothing here, since none of the rules involved is
383
+ stable. The true positives of the rules that read `tool_description` give the
384
+ same result with and without the scope: of 41, 39 fire (35 description texts,
385
+ and 4 ATR-2026-00441 code snippets through its content conditions) and 2 do
386
+ not (ATR-2026-00441 tool calls given as JSON with arguments, which are not
387
+ definitions). The 6 remaining hunt-lane false positives come from rules this
388
+ change does not touch: ATR-2026-01987, -00225, -00217, -00161 and -00569 (over-
389
+ broad conditions) and a form match of ATR-2026-00579 (experimental); see
390
+ `data/measurements/mcp-tools-list-benign/README.md`. The scope also costs
391
+ detection: a poisoned definition that only a call rule catches (for example
392
+ ATR-2026-00114) is missed in a tools/list scan; no malicious tool-definition
393
+ corpus measures this yet. Tests:
394
+ `tests/tool-definition-scope.test.ts`, `tests/cli-mcp-tools-list-scan.test.ts`.
395
+
396
+ - **On Claude Code, the guard scans what a tool returned on PostToolUse.**
397
+ Claude Code sends a tool's output at the top level of the PostToolUse hook
398
+ input, as `tool_response` (checked against the shipped 2.1.280 binary).
399
+ `src/hook-handler.ts` read an output only from `tool_input.output` or
400
+ `tool_input.response`, where Claude Code never puts one, so the event's content
401
+ was the tool's input, and a prompt injection in a command's output, a file or a
402
+ fetched page reached no rule. The event's content and `tool_response` are now
403
+ the text of the output: `src/hook-tool-output.ts` keeps every string in it, as
404
+ written, and leaves out binary data, what Claude Code keeps from the model,
405
+ and labels and strings the tool only repeats from its input. A tool that edits
406
+ a file returns the edit it made, so its event is still built from its input.
407
+ `tool_args` stays the JSON of the input, and `tool_input.output` and
408
+ `.response` are still read for a host that sends the output there, now as raw
409
+ text in content too. Measured through the hook in the default hunt lane, each
410
+ sample as a Bash command's output: the own true positives of the 746 rules the
411
+ engine runs on a tool response (`llm_io`, `mcp_exchange` and `context_window`)
412
+ match 3,852 of 3,890 times (0 before, and the same as a Read or MCP output);
413
+ 289 of PINT's 451 attacks match (0 before) and none of its 399 benign samples;
414
+ 1,246 of the 14,157 benign-corpus samples match a rule (0 before), most of them
415
+ through rules at maturity `test`. In the alert lane 1,183 match, in the enforce
416
+ lane none. Not covered: an output whose text exceeds 100,000 characters
417
+ taken together (`MAX_EVAL_LENGTH`); and some rules take time quadratic in a
418
+ long run of one character. `atr init` registers the guard on
419
+ PreToolUse only, so this reaches an installation that added it under
420
+ PostToolUse.
421
+
422
+ - **The guard also scans a failed tool call's output (PostToolUseFailure).**
423
+ When a tool call fails, a Bash command whose exit code Claude Code counts as
424
+ a failure among them (most non-zero codes; `grep`'s exit 1 is not one),
425
+ Claude Code sends `PostToolUseFailure` instead of `PostToolUse`. Its input
426
+ carries `tool_name`, `tool_input`, `tool_use_id`, `error`, `is_interrupt`
427
+ and `duration_ms`, and no `tool_response` (checked against the shipped
428
+ 2.1.280 binary). The guard answered it "Unknown hook type" and allowed it,
429
+ so ending a command with `; exit 1` kept its output from every rule. It now
430
+ builds the event from `error`, the failure as the model sees it: for a shell
431
+ command, its stderr and stdout after Claude Code's `Exit code N` line and
432
+ abort note, which are left out. A command that printed nothing leaves no
433
+ text, and its event is built from the input, as an output-less PostToolUse
434
+ is. It answers in the PostToolUse contract under the `PostToolUseFailure`
435
+ name, which Claude Code accepts, and with blocking on its `decision:
436
+ "block"` reaches the model as a blocking error. Measured through the hook in
437
+ the default hunt lane, each sample as a failed Bash command's error: the own
438
+ true positives of the 746 rules the engine runs on a tool response match
439
+ 3,852 of 3,890 times (0 before); 289 of PINT's 451 attacks match (0 before)
440
+ and none of its 399 benign samples; 1,246 of the 14,157 benign-corpus
441
+ samples match a rule (0 before). On every sample the verdict and the rules
442
+ matched are those of the same text as a Bash command's output on
443
+ PostToolUse. Claude Code cuts a failed call's error to about 10,000
444
+ characters; 1,117 of the benign samples are longer and were sent whole. To
445
+ use it, register the guard under `PostToolUseFailure` too.
446
+
447
+ - **Flywheel shadow rules can match.** `ShadowEvaluator` compiled each
448
+ condition with `new RegExp(value, 'i')`. A value that starts with `(?i)` is
449
+ a SyntaxError in JavaScript, the error was swallowed, and the condition
450
+ never matched. `RuleScaffolder` starts every pattern it writes with `(?i)`,
451
+ so no rule the flywheel generated could match in shadow mode or reach
452
+ promotion. Shadow conditions now go through the engine's own
453
+ `compileRegexCondition()` (leading flag group removed per SPEC §6.4, `u`
454
+ when needed, ReDoS gate) and `safeRegexTest()` (the engine's input-length
455
+ limit), and a condition whose value is not a string is skipped instead of
456
+ throwing. Shadow evaluation still differs from `ATREngine` in field
457
+ resolution, operators, `condition: all`, Unicode normalisation and
458
+ `agent_source` routing; those differences are unchanged.
459
+ - **Flywheel promotion needs a reviewed true positive, and promotes a rule
460
+ once.** `ShadowEvaluator.getPromotionCandidates()` divided confirmed false
461
+ positives by all matches, so a rule with no recorded feedback had an FP rate
462
+ of 0 and became a candidate after its first match. Once shadow rules could
463
+ match (above), `FlywheelManager.promoteReady()` would have handed such rules
464
+ to `onPromote` with status `stable`, and the same rule again on every call.
465
+ A rule is now a candidate only after at least `minReviewedMatches` (new
466
+ `FlywheelConfig` option, default 1) matches with recorded feedback including
467
+ a confirmed true positive; the FP rate is computed over reviewed matches; and
468
+ `promoteReady()` hands each rule to `onPromote` once. A promoted rule keeps
469
+ `maturity: draft`.
470
+ - **`RuleScaffolder` no longer writes a pattern that misses its own example
471
+ payload.** An attack indicator is chosen by a broad test and writes a
472
+ narrower pattern: "Ignore all previous instructions", "please ignore the
473
+ rules above" and "disregard everything you were told" all selected the
474
+ instruction-override indicator, whose pattern did not match them. An
475
+ indicator now counts only when its pattern matches the payload, and the
476
+ exact payload is used if nothing else does. Keyword patterns are now tried
477
+ only at line starts, `(?:^|[\n\r\u2028\u2029])(?=[^\n\r\u2028\u2029]*word)...`,
478
+ and exact patterns are the escaped payload without a surrounding `.*`. Both
479
+ match the same inputs as before, but neither is quadratic on a long
480
+ single-line input any more (about 7-12 seconds per pattern on 100,000
481
+ characters before, about a millisecond now). An empty or whitespace-only
482
+ example payload, which produced a pattern that matched everything, is now
483
+ rejected. Output of `atr scaffold` and the `atr_submit_proposal` MCP tool
484
+ changes accordingly.
485
+
486
+ - **SPEC §6.4 corrected: SPEC.md 1.0.1 [Compatible].** A `regex` pattern
487
+ condition matches case-insensitively whether or not it begins with `(?i)`,
488
+ and `m`, `s` and `x` in a leading flag group have no effect. The 1.0.0 text,
489
+ added on 2026-07-19 (#340), said an engine applies the flags named in that
490
+ group, which made a pattern without `(?i)` case-sensitive and gave `(?s)`
491
+ and `(?m)` their dotAll and multiline meaning. Compatible: an engine that
492
+ passes the conformance suite needs no change, because its true-positive
493
+ fixtures already require case-insensitive matching; an implementation built
494
+ to the 1.0.0 wording does. 1.0.1 also admits `x` in the group, which both
495
+ engines already removed, says when the `u` flag applies, advises against
496
+ modifier groups such as `(?-i:...)`, and adds a revision history (Appendix
497
+ D). Issue #698 has the evidence; erratum `e-2026-10-19-regex-dialect`
498
+ records the error. `tests/spec-regex-dialect.test.ts` and pyATR's
499
+ `TestRegexDialectSpec64` pin the statements. `scripts/generate-sigma.py` no
500
+ longer copies `m` and `s` from that group into exported Sigma patterns,
501
+ where a backend would honour them; of the three rules on main that carry
502
+ such a group, only ATR-2026-00450's `(?im)^...` condition matched
503
+ differently because of it. Other exports that still follow the 1.0.0
504
+ wording are listed in #698.
505
+ - **Rules with a `context_window` or `skill_*` `agent_source.type` run on the
506
+ events their data arrives in.** `src/engine.ts` maps an event type to one of
507
+ five source types and skipped every rule whose type differed, so a rule of an
508
+ extended type never ran on a typed event: on the `tool_call` and
509
+ `tool_response` events `src/hook-handler.ts` builds, ATR-2026-00070, -00075,
510
+ -01155, -01774, -00134, -00157 and -02405 never fired, while `atr test` mapped
511
+ their types to a base type and passed every case. The engine now does that
512
+ mapping itself (`RUNTIME_SOURCE_TYPE`): `context_window` runs where `llm_io`
513
+ rules run, the `skill_*` types where `tool_call` rules run, and a rule without
514
+ `agent_source` no longer throws a `TypeError` that aborted the whole
515
+ evaluation of a typed event. `memory_access` is withheld
516
+ (`WITHHELD_SOURCE_TYPES`): ATR-2026-00075 also matches standing instructions
517
+ in an ordinary chat turn ("From now on, always answer in French."), which the
518
+ Mastra processor and the OpenShell filter, both blocking by default, would
519
+ refuse; -00075 and -01155 still run only on an untyped event and in a skill
520
+ scan, and a new `memory_access` rule fails the test suite until the type is
521
+ mapped. `atr test` no longer maps anything, so what passes there is what the
522
+ engine runs, and it reports a withheld type's cases as unevaluable, with the
523
+ reason. The rule-latency gate profiles the five rules instead of listing them
524
+ as unexercised. The benign-corpus measurement does not change, because its
525
+ untyped shape already ran these rules; what changes is that their matches now
526
+ surface at runtime in the hunt lane, the default: ATR-2026-00070 (high)
527
+ matches 20 of the 14,157 benign samples. On the weekly benchmark suite three
528
+ hunt-lane recalls rise: garak 601 to 602 of 650 and garak-full 1,989 to 1,991
529
+ of 3,475 (one prompt, which -00070 catches on the tool-response channel and
530
+ garak-full holds twice), and atr-self-test 310 to 312 of 321 (-00070's own
531
+ true positives). No precision or false-positive figure moves (the new matches
532
+ fall on attack samples), and no enforce-lane figure moves (none of the five
533
+ rules is stable).
534
+
535
+ - **A tool event built from a test case always names a tool.**
536
+ `buildEventFromTestCase` (`src/testcase-event.ts`, behind `atr test`,
537
+ `scripts/validate-rule-testcases.ts` and the case-sensitivity gate) gave a case
538
+ that names no tool the `tool_name` `""`, meant to keep the case's text out of
539
+ `tool_name`. `src/engine.ts` reads a field only when it is truthy and, on a
540
+ `tool_call` event, then falls back to the event's content, so a `tool_name`
541
+ condition read the payload as the tool's name and a rule keyed on the tool
542
+ could pass its cases without naming one. A tool event now carries
543
+ `atr-test-tool` (`UNNAMED_TOOL`) when the case names no tool, as
544
+ `src/hook-handler.ts` fills it from the host's tool call, and the
545
+ case-sensitivity gate leaves that name out of the text it checks a condition
546
+ against. No rule on main relied on the old behaviour: every true positive and
547
+ true negative of every rule tests the same.
548
+
549
+ - **A test case's own `agent_message` is no longer replaced by its content.**
550
+ `buildEventFromTestCase` set the field from the case and then copied the
551
+ event's content over it, so a case that names an `agent_message` beside its
552
+ input was run on the input there. No case on main names one.
553
+
554
+ - **A `medium` confidence label no longer depends on float rounding to stay
555
+ out of `deny`.** A pattern match scored `0.7 + 0.1 * coverage`, and a
556
+ `high`-severity match denies at `>= 0.8`. At full coverage that sum is
557
+ `0.7999999999999999` in IEEE doubles, so the verdict was `ask` only because
558
+ of the rounding direction; the same quantity as an integer percentage is
559
+ `0.8`. Label-derived confidence is now computed in one place
560
+ (`src/rule-confidence.ts`) on a basis-point scale, and a label below the
561
+ deny threshold is capped one basis point under it. No verdict or
562
+ auto-response decision changes. The raw `confidence` of a `medium` match at
563
+ full coverage is `0.7999` instead of `0.7999999999999999`, and other
564
+ partial-coverage values lose trailing float noise (`0.9500000000000001`
565
+ becomes `0.95`). One displayed percentage moves as a result: a
566
+ named-condition rule labelled `medium` at 3/4 coverage shows 78% (`0.775`)
567
+ where the noise used to show 77%. No shipped rule reaches that cell.
568
+
569
+ - **A semantic rule without a pattern fallback is no longer recorded as
570
+ measured clean.** The benign-corpus measurement
571
+ (`scripts/gate-promotion-fp.ts`, and `scripts/remeasure-benign-fp.ts`
572
+ through it) drives the synchronous engine, which returns null for
573
+ `method: semantic` unless `detection.semantic.fallback_method` is exactly
574
+ `pattern`; the judge runs only in `evaluateAsync()`. `fieldCoverage()`
575
+ named trace, behavioral and signature as methods it cannot run, but not
576
+ this one, and it skipped a rule with no condition field, such as a pattern
577
+ fallback with nothing in it. Either was written down as `fp_count: 0,
578
+ partial_measurement: false`, which `scripts/gate-action-eligibility.ts`
579
+ graded `terminate` at maturity `stable` and `degrade` at `test`. Both are
580
+ now recorded partial and capped at `observe`. No rule on main is in either
581
+ state, so the committed evidence is unchanged. The skill-path check uses
582
+ the same predicate; it used to read `fallback_method: Pattern` as
583
+ `pattern`, which the engine does not, and it exempted a
584
+ `scan_target: both` rule with no conditions.
585
+ - **NIST-related statements corrected across the docs and the website.**
586
+ Pages described a NIST CAISI dialogue and position paper that did not
587
+ happen, an RFI response ATR never filed, an OSCAL "Path 1" acceptance,
588
+ and a quote NIST never published; they listed NIST among adopters and
589
+ in a trust bar, and showed "100%" or "4/4 functions" for an AI RMF
590
+ mapping that covers a subset of subcategories. usnistgov/oscal-content#338
591
+ is described as what it is: open, reworked against NIST's AI RMF catalog,
592
+ awaiting NIST review. The website changelog page now shows the notes on
593
+ historical entries, which it used to drop.
594
+ - **Integration status, provenance, evasion and latency claims corrected.**
595
+ The red-team page listed seven proposals as under review that their ATR
596
+ author had withdrawn unmerged (NVIDIA/garak#1676 on 2026-08-04; HarmBench,
597
+ AgentDojo, JailbreakBench, Counterfit, PromptInject and Damn Vulnerable MCP
598
+ Server on 2026-10-14 and 15, six of them never answered). They are removed,
599
+ along with the lapsed "On deck" schedule, and the garak, sovereign-AI,
600
+ responsible-use, integrate and STANDARDIZATION-STATUS surfaces no longer
601
+ call the garak integration or any OWASP PR open. The garak page and the
602
+ contributor docs (QUALITY-GATE.md, TSC-ONBOARDING.md, REVIEWER-GUIDE.md,
603
+ RULE-PRODUCTION.md, the issue-to-proposal PR text) no longer describe
604
+ auto-merge, which has been off since 2026-06-03. The red-team and governance
605
+ pages no longer promise a `metadata_provenance.discovered_by` field no rule
606
+ has, and the home, red-team, about and quality-standard pages no longer
607
+ credit daily auto-crystallization for growth that came from CVE sweeps,
608
+ benchmark-miss mining and contributors. The sovereign-AI page no longer says
609
+ ATR detects intent and cannot be evaded; LIMITATIONS.md and the
610
+ responsible-use, integrate and research pages no longer say every rule
611
+ carries evasion tests or that there are 64; LIMITATIONS.md and
612
+ THREAT-MODEL.md now agree that the optional judge and embedding modules ship
613
+ but are off by default. "Sub-millisecond", "< 5ms", "5ms pattern match" and
614
+ "Done in 47ms" are replaced by how evaluation cost scales; the OpenShell
615
+ example is marked as a sketch of a proposal OpenShell closed, and its
616
+ timeouts now exceed a one-shot cold start. CITATION.cff no longer calls the
617
+ rules hand-authored and says what the safety gate checks for added and
618
+ changed rules; the OWASP PR text drops its 76-rule count and notes the PR
619
+ was withdrawn. Errata `e-2026-10-16-integration-status`,
620
+ `e-2026-10-16-evasion`, `e-2026-10-16-latency` and `e-2026-10-16-provenance`
621
+ record the site changes.
622
+ - **A rule the engine does not evaluate no longer gets a false-positive
623
+ record.** `scripts/gate-promotion-fp.ts --emit-measurement` wrote
624
+ `fp_count: 0` for draft and deprecated rules, which the engine skips, so
625
+ nothing was counted for them. `detection_fingerprint` does not cover
626
+ `status`, so a one-line revival handed the rule that 0, and
627
+ `scripts/gate-action-eligibility.ts` trusted it: at maturity `test`, enough
628
+ for `block_tool`. Seven records in `data/benign-fp-measurement.json` were of
629
+ this kind. The measurement now asks the engine (`ATREngine.evaluates`) and
630
+ lists such a rule, or an id two loaded files share, under NOT MEASURED
631
+ instead. Without `--filter-mode` that fails the gate: promoting a rule the
632
+ engine does not evaluate no longer passes as clean.
633
+ `scripts/remeasure-benign-fp.ts` leaves the same rules out, and measures in
634
+ full, rather than extends, a record for a rule that was inert at its base
635
+ commit. `scripts/promote-to-stable.ts` no longer counts a draft rule at
636
+ maturity `test` as FP-clean.
637
+ - **The action gate refuses evidence that holds a record for a rule that is
638
+ not live** (inert, or its file gone): exit 2, as for evidence taken on
639
+ another corpus. A record carries no status, so the gate cannot tell a count
640
+ taken while the rule was live from a 0 nothing measured, and left in place
641
+ either is trusted the day the rule is revived or restored. Deprecating or
642
+ deleting a rule now means re-emitting the evidence in the same change. The
643
+ gate also reads a status that is not a string (`status: [draft]`) as live,
644
+ as the engine does; it used to skip such a rule while the engine ran it.
645
+ - **Two rule files with the same name are both measured.** The measurement
646
+ copied rule files into its scratch directory by file name, so of two
647
+ same-named files in different directories only the last was read, and the
648
+ other was reported clean.
649
+ - **`scripts/promote-to-stable.ts` no longer promotes on a 0 it did not
650
+ measure.** A `maturity: test` rule whose conditions the benign corpus cannot
651
+ fully exercise (a field no sample fills, such as `tool_name`, or a method the
652
+ synchronous engine cannot run, such as `trace`) scored 0 false positives
653
+ without being read, and `--write` promoted it to `stable`. Such a rule is now
654
+ reported as not promotable; one that did false-positive stays with the rules
655
+ that have false positives. No `maturity: test` rule on main is affected today.
656
+ - **verify-adopters.yml no longer fails when other commits land on main during
657
+ a run, and its failures get noticed.** The job commits the refreshed
658
+ `data/adopters-verification.json` straight to main with a plain push, which
659
+ was rejected whenever another commit landed first, failing the run with
660
+ nothing wrong in ADOPTERS.md (2026-10-07, 2026-10-15). It now rebases its
661
+ one-file commit onto the moved main and retries, at most three times; runs
662
+ one verification at a time per branch; and checks out the branch tip rather
663
+ than the triggering commit, so a run that waited behind another starts from
664
+ the data the other pushed instead of conflicting with it (the 2026-10-07
665
+ shape: two adopter merges, each run writing the same file). A conflict with
666
+ a hand edit of the generated file still fails the run. Four red runs in a
667
+ row (2026-10-12 to 10-15) went unnoticed for days; a failure on main now
668
+ opens one tracking issue, or rewrites the open one, and the next green run
669
+ closes it. The issue lists drift only from a verification that finished.
670
+
671
+ ## [4.1.5] - 2026-10-10
672
+
673
+ 4.1.4 was staged on npm and removed by publish-time scanning before it could be
674
+ approved, like 4.1.1 to 4.1.3. 4.0.0 passed that scanning. What the 4.1 line
675
+ added were rules whose test samples are complete attack snippets: a
676
+ crypto-miner command line with a mining-pool URL, PHP, JSP and ASPX webshells,
677
+ and a Node.js reverse shell. This release carries the 4.1.4 rules and engine,
678
+ packaged without those samples.
679
+
680
+ ### Changed
681
+
682
+ - **The npm package ships the rules without their test samples.** The release
683
+ workflow removes `test_cases` and `evasion_tests` from each rule just before
684
+ staging, after the tests have run on the full rules. The engine does not read
685
+ them, so detection is unchanged: the same rules load and the same rules fire.
686
+ The samples stay in the repository. With the package alone, `atr test` on a
687
+ bundled rule has no samples to run, and `atr stats` reports zero TP/TN
688
+ counts. DISCLOSURE says so.
689
+
690
+ ### Fixed
691
+
692
+ - **ATR-2026-02600 no longer names a real public IP in its test samples.** Its
693
+ two reverse-shell samples now connect to the documentation ranges 203.0.113.14
694
+ and 192.0.2.4. The detection is unchanged.
695
+ - **ATR-2026-02627 describes the web shells it detects instead of quoting
696
+ them.** Its description and one false-positive note quoted a working one-line
697
+ PHP command shell; they now say what it is. The detection is unchanged.
698
+
699
+ ### Changed
700
+
701
+ - **npm releases go only through the staged path in `publish.yml`.** The
702
+ package is dual-use, so npm's policy lets CI stage a version but not publish
703
+ one; a maintainer promotes it with 2FA. Three workflows could still put a
704
+ version on the registry another way and have been removed:
705
+ `publish-current-version.yml` (direct `npm publish` through trusted
706
+ publishing), `publish-on-rules-merge.yml` (bumped and ran `npm publish` with
707
+ `NPM_TOKEN` on pushes to `main`) and `npm-stage.yml` (approved staged
708
+ versions from CI with `NPM_TOKEN`, skipping the maintainer's 2FA).
709
+ `scripts/release.sh` now stops at the tag push instead of also publishing
710
+ locally. No workflow references `NPM_TOKEN`, and
711
+ `tests/npm-release-path.test.ts` fails if any workflow other than
712
+ `publish.yml` gains a publish, stage or approve step.
713
+
714
+ ## [4.1.4] - 2026-10-07
715
+
716
+ > Not published to npm (see 4.1.5).
717
+
718
+ The first release since 4.0.0 meant to reach npm. 4.1.1, 4.1.2 and 4.1.3 were
719
+ each blocked by npm's publish-time malware scanning, which reads the attack
720
+ strings in rule files as malware, so `npm install agent-threat-rules` still
721
+ returns 4.0.0. This release declares the package dual-use (see Changed below)
722
+ and goes through npm's staged publishing, approved by a maintainer with 2FA. It
723
+ carries everything listed under 4.1.3, 4.1.2, 4.1.1 and 4.1.0 below.
724
+
725
+ ### Added
726
+
727
+ - **Four rules.** Each one passed the repository's PR checks, and is
728
+ experimental, maturity `test`, with alert-level response actions only:
729
+ - ATR-2026-02846: ignore-previous-and-following instructions (PromptInject
730
+ goal hijacking), a semantic rule with a narrow regex fallback.
731
+ - ATR-2026-02847: email exfiltration under a policy, audit or compliance
732
+ pretext.
733
+ - ATR-2026-02850: data exfiltration by email under a documentation pretext,
734
+ including French phrasings.
735
+ - ATR-2026-02851: a fake user turn inside content that instructs the agent to
736
+ send an email.
737
+ ATR-2026-02847, 02850 and 02851 come from human-written attack emails
738
+ (LLMail-Inject). They fire on none of 526 real emails or 694 benign web pages
739
+ presented as tool output, and each catches attack emails that were held out
740
+ while the rule was written.
741
+
742
+ ### Fixed
743
+
744
+ - **pyATR falls back for regex conditions Python's `re` cannot compile** (such
745
+ as variable-width lookbehind) instead of dropping the condition (#554, thanks
746
+ @dc-tw).
747
+ - **The test-case validator reads every key a test case can use.** It read four
748
+ of nine and misjudged rules whose cases use the others. Its failure count on
749
+ the current rules drops from 40 to 11, with no new failures (#607).
750
+
751
+ ### Security
752
+
753
+ - **`atr tc pull` checks the rules a Threat Cloud endpoint returns before
754
+ writing them, and no longer goes through a shell.** The response is now
755
+ treated as untrusted: a rule is written only if its id has the form
756
+ `ATR-YYYY-NNNNN`, its category is one of the schema's categories and no rule
757
+ with that id is already in the repo; anything else is rejected without
758
+ touching the disk. The validator then runs as a separate Node.js process with
759
+ the file path as a plain argument. Before, the id and category came from the
760
+ response unchecked and the validator was started through a shell, so a
761
+ compromised or impersonated endpoint could affect the operator's machine
762
+ beyond the rules directory. The category is also read from the rule's `tags`,
763
+ not from the first `subcategory:` line in a compliance block, and the
764
+ validator is found next to the installed CLI rather than in the current
765
+ directory, so valid rules are no longer filed under the wrong directory or
766
+ rejected when the command runs outside a checkout of this repo.
767
+
768
+ ### Changed
769
+
770
+ - **The package is declared dual-use under the npm Dual-Use Content Policy.**
771
+ npm's publish-time malware scanning, introduced in July 2026, blocked 4.1.1,
772
+ 4.1.2 and 4.1.3: rule files carry attack strings by design, as detection
773
+ patterns and test samples, and the scanner treats them like malware.
774
+ `package.json` now carries `"contentPolicy": {"class": "dual-use"}`, and a
775
+ plain-text `DISCLOSURE` file at the package root says what the attack content
776
+ is for and what the package does not do. Under that policy, CI may only stage
777
+ a release; a maintainer approves it with 2FA before it goes live, so
778
+ `publish.yml` now stages through trusted publishing and waits for the approval
779
+ before creating the GitHub release.
780
+
781
+ ## [4.1.3] - 2026-10-06
782
+
783
+ > Not published to npm (see 4.1.4).
784
+
785
+ The first release of the 4.1 line to reach npm; 4.1.2 did not either. Its
786
+ publish on 2026-10-01 went through trusted publishing (OIDC), printed
787
+ `+ agent-threat-rules@4.1.2`, and was placed in npm's staging queue instead of
788
+ being published. It never appeared on the registry, and a re-run on 2026-10-05
789
+ was refused with E409 ("Cannot publish over previously staged version"), so the
790
+ number is skipped like 4.1.1. The trusted publisher has since been set to allow
791
+ direct publishing. Rules, engine and spec are unchanged from the `v4.1.2` tag.
792
+
793
+ ### Changed
794
+
795
+ - **The release workflow fails when the version never reaches the registry.**
796
+ It now asks npm for the exact version after publishing, waits up to ten
797
+ minutes, and fails before the GitHub release is created. Before, the check
798
+ read `latest`, ran after the release, and only warned, which is how both 4.1.1
799
+ and 4.1.2 went green without being published (#633).
800
+
801
+ ## [4.1.2] - 2026-10-01
802
+
803
+ > Not published to npm (see 4.1.3).
804
+
805
+ The first release of the 4.1 line to reach npm. Until this one,
806
+ `npm install agent-threat-rules` returned 4.0.0. 4.1.2 carries everything
807
+ listed under 4.1.1 and 4.1.0 below. Rules, engine and spec are unchanged from
808
+ the `v4.1.1` tag; the README rewords one row of its ETSI mapping, which had
809
+ stated a conformance requirement as a fact about the corpus.
810
+
811
+ Neither earlier 4.1 tag reached the registry:
812
+
813
+ - `4.1.0` (tagged 2026-09-14): the publish step got E404 on the registry PUT.
814
+ - `4.1.1` (tagged 2026-09-22): the tag-triggered publish failed with EOTP, npm
815
+ asking CI for a one-time password. A manual republish later that day was
816
+ placed in npm's staging queue instead of being published, and the retry on
817
+ 2026-09-23 was refused with E409. npm does not allow publishing over a staged
818
+ version, so the number is skipped.
819
+
820
+ The 4.1.1 entry below opens by calling itself the first 4.1 release to reach
821
+ npm. It was not; the entry is otherwise left as written.
822
+
823
+ ### Changed
824
+
825
+ - **Releases publish through npm trusted publishing (OIDC).** `publish.yml` no
826
+ longer reads a registry token. npm mints a short-lived credential for each
827
+ run, bound to this repository and that workflow file, and generates the
828
+ provenance attestation itself (#606).
829
+
830
+ ## [4.1.1] - 2026-09-22
831
+
832
+ > Not published to npm (see 4.1.2).
833
+
834
+ The first release of the 4.1 line to actually reach npm. `4.1.0` was tagged on
835
+ 2026-09-14 and never published — the publish step failed on an expired registry
836
+ token and nobody was watching, so for 30 days `npm install agent-threat-rules`
837
+ kept returning 4.0.0 while `main` moved 38 commits ahead. **4.1.1 carries
838
+ everything listed under 4.1.0 below, plus the entries here.** The version number
839
+ skips 4.1.0 on purpose, so that what is on npm and what the git tag points at are
840
+ the same tree.
841
+
842
+ ### Security
843
+
844
+ - **`ATR-2026-00220` condition 2 backtracked catastrophically**, the same defect
845
+ as condition 0 of the same rule, which was fixed in #531 — a quantified run of
846
+ base64 characters between two unbounded `.*` gaps, with a literal at the end.
847
+ Only condition 0 was rewritten at the time. Measured on Node against a
848
+ base64-dense single line with no matching tail: 0.5s at 1 KB, 3.4s at 2 KB,
849
+ **23.4s at 4 KB**. The gaps are now bounded and the run is fixed-length;
850
+ the same inputs measure under a millisecond at 64 KB. All five of the rule's
851
+ true positives still fire and all five true negatives stay clean, with
852
+ condition 2 matching exactly the cases it matched before.
853
+ Reported as GHSA-66x9-5vw9-3wv3 against condition 0, which 4.1.0 had already
854
+ fixed; this closes the half of the rule that report did not cover.
855
+ - **The package no longer ships a default endpoint for detection data.**
856
+ Reporting has been opt-in since 4.1.0, but opting in without naming a
857
+ recipient silently picked one. `--report-to-cloud` now requires `--tc-url` or
858
+ `ATR_TC_URL` and exits with an error naming the fix if neither is set. ATR is
859
+ an open standard, not one collector's client: an operator who turns reporting
860
+ on decides who receives it, and there is no address in the package to forget
861
+ to change. Detection events now also carry an `X-ATR-Client-Id` header; the
862
+ previous vendor-named header is still sent so existing collectors keep working.
863
+
864
+ > **Nine conditions still backtrack** and are listed in
865
+ > [`data/redos-baseline.json`](data/redos-baseline.json) with measured
866
+ > times — `ATR-2026-00285#0` and `ATR-2026-00272#0` are the worst at 16s and
867
+ > 14s, and `ATR-2026-00707#0` is `maturity: stable`, which means it runs in the
868
+ > enforce lane. The ReDoS gate is a ratchet against that file: a green gate
869
+ > means nothing got worse, not that the class is closed. Do not read this
870
+ > release as "ReDoS fixed".
871
+
872
+ ### Changed
873
+
874
+ - `CHANGELOG.md` is now included in the npm tarball. The `files` allowlist had
875
+ excluded it, so a release that fixed a security defect arrived at consumers
876
+ with nothing in the package to say so.
877
+
878
+ ### Fixed — external claims that overstated what had happened
879
+
880
+ - **The npm package `description` claimed a vendor product shipped the ATR rule
881
+ pack.** What actually happened is that rules were merged into
882
+ `cisco-ai-defense/skill-scanner`, an open-source scanner repository — not the
883
+ same thing as shipping inside that vendor's product. The blurb is the single
884
+ most-copied sentence in the project, so it now says what the package is and
885
+ makes no adoption claim at all (#580).
886
+ - **Withdrew the two per-lane false-positive rates** published alongside the
887
+ enforce/hunt split. Three defects, any one of which is disqualifying: both
888
+ were measured on a subsample roughly a sixth of the corpus they were credited
889
+ to; the benign corpus contained real jailbreak samples — material the rules
890
+ are meant to catch, sitting in the set that defines a false positive — until
891
+ an exclusion filter landed on 2026-08-04 (#373); and the ladder that produced
892
+ the hunt figure depended on a file no longer in the repository, so that figure
893
+ cannot be reproduced at all. A gap is more useful to an adopter than a number
894
+ nobody can reproduce. Re-measurement against the current benign corpus is
895
+ pending, and neither figure should be cited by anyone until it lands (#579).
896
+ - **Corrected the fiscal sponsor's legal identity.** Nine files carried an EIN
897
+ that corresponds to no organization, and five of them additionally described
898
+ the sponsor as a 501(c)(3) when it is a 501(c)(6). The distinction is
899
+ substantive rather than cosmetic: funders that restrict grants to 501(c)(3)
900
+ recipients would have been misled (#578).
901
+
902
+ ## [4.1.0] - 2026-09-14
903
+
904
+ > **Never published to npm.** The tag `v4.1.0` exists, but the publish failed on
905
+ > an expired registry token and was not retried for 30 days. This version number
906
+ > does not exist on the registry and never will; everything below shipped in
907
+ > 4.1.1 instead.
908
+
909
+ At release: 825 rule files, 818 effective.
910
+
911
+ ### Added
912
+
913
+ - **A benign-twin corpus: 1,788 benign counterparts to attack payloads**, across
914
+ 17 files, counted at the `v4.1.0` tag. Built so that a rule which fires on the
915
+ harmless sibling of the attack it targets can be caught before it ships. It
916
+ demoted one production rule on arrival.
917
+ - **Forty rules from the full proposal re-sweep**, landed as four batches of
918
+ ten, plus fifteen from the CVE proposal backlog (#503, #504).
919
+ - **A precompiled rule digest for consumers that cannot take an engine**
920
+ (#510), with a Python-verified variant, and a PyRIT digest that carries
921
+ every field and names the scope it is safe to use (#511).
922
+ - `pyatr` 0.3.0: bundle refreshed, and the behaviour that had blocked the
923
+ refresh unpinned (#507).
924
+
925
+ ### Fixed — catastrophic backtracking
926
+
927
+ - **Eight rules could be made to backtrack catastrophically**; the patterns are
928
+ rewritten and a gate now blocks the class from returning (#531).
929
+ `ATR-2026-02610` condition 0 was fixed separately for the same defect.
930
+ - **`ATR-2026-01005`, the many-shot rule, is now linear** without giving up RE2
931
+ portability — the obvious fix would have traded one for the other (#546).
932
+
933
+ ### Fixed
934
+
935
+ - **Ten rules from the re-sweep were withheld rather than shipped**: each fired
936
+ on its own benign twin from the same run, so the twin corpus caught them
937
+ before release (#565). `ATR-2026-02604` was withheld earlier for the same
938
+ reason.
939
+ - **`\u{...}` is a JavaScript-only escape, so ten rules never compiled outside
940
+ the TypeScript engine** — they were silently absent for every other consumer
941
+ (#509).
942
+ - The Sigma exporter did not preserve ATR's regex case semantics (#520).
943
+ - The AVID importer stopped at the API's page limit instead of enumerating all
944
+ reports (#534).
945
+ - The quality gate now checks peer true negatives within the same PR (#529),
946
+ and the website shows the effective rule count rather than the raw file count.
947
+
948
+ ### Removed
949
+
950
+ - The one-shot bootstrap publish workflow, once it had served its purpose
951
+ (#541).
952
+
953
+ ## [4.0.0] - 2026-08-22
954
+
955
+ > Releases 3.5.1 through 3.5.12 were automated rule-publish releases cut from
956
+ > this same stretch of history and were never given their own entries. A few
957
+ > items below — the benchmark-number corrections in particular — were first
958
+ > published in one of them rather than in 4.0.0.
959
+
960
+ ### Changed — blocking is now opt-in (BREAKING for anyone relying on the old default)
961
+
962
+ - **`atr guard` no longer emits a `permissionDecision` unless blocking is
963
+ enabled.** The Claude Code PreToolUse payload now carries the detection
964
+ (`atr_decision`, `atr_reason`, `matched_rules`, `atr_advisory: true`) and drops
965
+ the `hookSpecificOutput` envelope entirely, so the host applies its own
966
+ permission flow. `toClaudeCodePostToolUse` likewise omits `decision: 'block'`
967
+ (its envelope is kept: a permissive verdict has always emitted it with no
968
+ decision inside).
969
+ The whole envelope goes rather than just the decision field as a **legibility**
970
+ choice, not a compatibility one. Both shapes are in fact accepted: the
971
+ hook-output schema in the shipped Claude Code 2.1.76 bundle declares
972
+ `hookSpecificOutput` optional, its PreToolUse member declares
973
+ `permissionDecision` optional, and the object is not strict, so unknown
974
+ top-level keys are stripped rather than rejected — which is also why
975
+ `atr_decision` and `matched_rules` have shipped alongside it all along. A
976
+ payload with no envelope simply cannot be misread as a decision that failed to
977
+ serialise.
978
+
979
+ - **ATR never emits `permissionDecision: "allow"` — in either mode.** This is
980
+ wider than the blocking switch and is the part most likely to surprise: turning
981
+ blocking ON does **not** bring the affirmative decision back. In the PreToolUse
982
+ contract `allow` is not neutral; it is an approval that suppresses the host's
983
+ own permission prompt, so a hooked session would permit *more* than an unhooked
984
+ one on every operation ATR simply had not looked for. "No rule matched" is ATR
985
+ having nothing to say, and the way to say nothing on that channel is to omit
986
+ the field. A decision is therefore emitted only for the two verdicts that
987
+ **restrain** — `deny` and `ask` — and only when blocking is on. Everything else
988
+ travels in `atr_decision` / `atr_reason` / `matched_rules`.
989
+ Consequence for the payload shape: with blocking ON and a permissive verdict
990
+ the `hookSpecificOutput` envelope is dropped too, exactly as in advisory mode.
991
+ `atr_advisory: true` marks the *mode*, not the verdict, so it is the one key
992
+ that distinguishes the two:
993
+
994
+ ```console
995
+ $ printf '%s\n' '{"hook":"PreToolUse","tool_name":"Bash","tool_input":{"command":"ls -la"},"session_id":"s1"}' \
996
+ | npx tsx src/cli.ts guard --blocking 2>/dev/null
997
+ {"atr_hook_event":"PreToolUse","atr_decision":"allow","atr_reason":"ALLOW: High-Risk Tool Invocation Without Human Confirmation [low/71% confidence] (1 rule matched)","matched_rules":["ATR-2026-00099"]}
998
+ ```
999
+
1000
+ The PostToolUse contract needed no equivalent change: it has exactly one
1001
+ sentinel, `decision: 'block'`, and the absence of the key *is* the
1002
+ pass-through. There is no value that function could set to suppress a host
1003
+ behaviour.
1004
+ - **BREAKING for embedders: the library no longer reads the environment at all.**
1005
+ `ATR_LANE` and `ATR_BLOCKING` are **CLI-only**. `ATREngine`, `ActionExecutor`
1006
+ and `HookHandler` take their posture from explicit config or the built-in
1007
+ default, and nothing else. If you embedded ATR and were relying on a variable
1008
+ in the ambient environment to select a lane, **that no longer works** — pass
1009
+ `new ATREngine({ lane })` instead.
1010
+
1011
+ ```ts
1012
+ // With ATR_LANE=enforce ATR_BLOCKING=1 exported in the environment:
1013
+ new ATREngine({ rulesDir }).getLane() // 'hunt' (was: 'enforce')
1014
+ new ActionExecutor({ adapter }).isBlocking() // false
1015
+ new HookHandler({ engine, executor }).isBlocking() // false
1016
+ ```
1017
+
1018
+ Ambient configuration crosses trust boundaries invisibly. A `new ATREngine()`
1019
+ inside a VS Code extension, a Mastra pipeline, or the `/openshell-filter`,
1020
+ `/nemoclaw-preflight` and `/mcp` entry points never asked to be reconfigured by
1021
+ a shell profile — and because `enforce` is a *valid* value, the old behaviour
1022
+ produced no warning at all while narrowing those callers to `maturity: stable`
1023
+ rules only.
1024
+ The guarantee is **structural, not a convention**: `resolveLane` and
1025
+ `resolveBlocking` now require an `EnvSource` argument with no `process.env`
1026
+ default, so there is no overload that can fall through to the environment. Two
1027
+ new library-facing helpers, `laneFromConfig()` and `blockingFromConfig()`, pass
1028
+ a frozen empty environment; the new `resolveEnforcementPolicy()` is the only
1029
+ function that reads `process.env` **for these two switches**, and `src/cli.ts` is its
1030
+ only caller. `resolveLaneOrWarn`, `resolveBlockingOrWarn` and
1031
+ `resetEnforcementWarnings` are **removed**.
1032
+ One deliberate exception: `src/mcp-server.ts` reads `ATR_LANE` when the file is
1033
+ the process entry point, because that makes it a CLI rather than a library. An
1034
+ importer of the `./mcp` subpath does not reach that branch and gets its lane
1035
+ from the explicit option.
1036
+ Not the only function in the package that reads the environment: ten files
1037
+ under `src/` read it in code, and two of them — `adapters/openshell-filter.ts`
1038
+ and `adapters/nemoclaw-preflight.ts` — read `ATR_MIN_SEVERITY` and still block
1039
+ by default, as the scope limit below records. `grep -rl "process\.env" src/`
1040
+ returns eleven rather than ten: `src/index.ts` only names the variable in a
1041
+ comment. An earlier revision of this paragraph published that grep count.
1042
+
1043
+ - **Scope limit, stated so the headline is not read wider than it is.** This
1044
+ covers the two channels the engine itself drives: the Claude Code hook
1045
+ contract and `ActionExecutor`. It does NOT cover the framework adapters, which
1046
+ keep their own severity floor: `src/adapters/mastra.ts` defaults
1047
+ `blockSeverities` to `["critical", "high"]`, and the `openshell-filter` and
1048
+ `nemoclaw-preflight` CLI entry points default `ATR_MIN_SEVERITY` to `high`.
1049
+ (The `NemoClawPreflight` and `OpenShellFilter` classes take no default at all —
1050
+ an embedder must pass `minSeverity`. Only the CLI wrappers supply one.)
1051
+
1052
+ They stay as they are, and the reason is measured rather than assumed. Driving
1053
+ each adapter through its own API, with the event shape it really constructs:
1054
+
1055
+ | adapter | corpus | blocks |
1056
+ |---|---|---:|
1057
+ | `ATRProcessor` (mastra) | 432 benign skills, fed as user messages | 6 (1.4%) |
1058
+ | `NemoClawPreflight` | the same 432 as skill bundles — its actual domain | 2 (0.5%) |
1059
+ | `OpenShellFilter` | 24 everyday developer commands | 1 (4.2%) |
1060
+
1061
+ Three caveats on those figures, because they are small enough to be quoted
1062
+ carelessly. Feeding skill files to a Mastra processor is out of domain — it
1063
+ sees chat messages, so 1.4% says little about real traffic. Twenty-four
1064
+ hand-written commands are not a corpus. And the benign skill set has the blind
1065
+ spots `scripts/gate-corpus-visibility.ts` exists to surface.
1066
+
1067
+ The one real blemish is the command `OpenShellFilter` refused:
1068
+ `scp -i ~/.ssh/deploy.pem dist.tgz ci@build.corp:/tmp/`, an ordinary
1069
+ deployment. That is a rule being too wide, not an adapter default being wrong,
1070
+ and it is the same shape review already recorded against the scp work.
1071
+
1072
+ Reproduce with `npx tsx scripts/measure/adapter-defaults-<adapter>.mts`. Each
1073
+ script aborts before printing if its control fails, so a zero there means the
1074
+ measurement did not run rather than that nothing blocked.
1075
+
1076
+ Unlike the hook, these adapters are not installed by a script into a global
1077
+ config. An integrator imports one and wires it into a pipeline on purpose,
1078
+ which is what an explicit operator directive looks like. An earlier draft of
1079
+ this entry was going to bring them under the same switch on the strength of a
1080
+ 19.9% figure; that number came from feeding raw content straight to
1081
+ `engine.evaluate` without the `type` each adapter sets, which bypasses the
1082
+ `agent_source` filtering and fires rules the adapters never see.
1083
+
1084
+ - **An unrecognised `ATR_LANE` or `ATR_BLOCKING` warns on stderr, falls back to
1085
+ the safe default, and the guard keeps running (exit 0).** `main` did not read
1086
+ either variable, so a typo was previously inert. An earlier revision of this
1087
+ branch threw from the constructor instead, which measured badly:
1088
+ `ATR_BLOCKING=enabled npx atr guard` exited 1 with an empty stdout and no guard
1089
+ running — landing hardest on the operator trying to turn enforcement ON.
1090
+ `atr init` installs `atr guard` as a PreToolUse **command hook**, and Claude
1091
+ Code 2.1.76 maps any exit status other than 0 or 2 to a non-blocking error: it
1092
+ runs the tool anyway, hands the model nothing, and renders only
1093
+ `<hookName> hook error` **without** the captured stderr. Exiting would have
1094
+ discarded every detection and still not told the operator why; status 2, the
1095
+ only loud one, blocks the tool outright, which a stray shell variable must
1096
+ never do. The warnings are printed once, at startup, by the CLI — they are not
1097
+ deduplicated per value, and the `resolveLaneOrWarn` / `resolveBlockingOrWarn` /
1098
+ `resetEnforcementWarnings` helpers that did that are gone. Verbatim, prefixed
1099
+ `[atr]` (red on a TTY):
1100
+
1101
+ ```text
1102
+ [atr] Invalid ATR_LANE="enfroce". Expected one of: enforce, alert, hunt. Falling back to lane "hunt". Detection still runs; this only changes which maturities may fire.
1103
+ [atr] Invalid ATR_BLOCKING="enabled". Expected one of: 1/true/yes/on or 0/false/no/off. Falling back to blocking=false. If you meant to enable enforcement, it is NOT enabled.
1104
+ ```
1105
+
1106
+ A bad **flag** still exits 1 — `atr guard --lane enfroce` and
1107
+ `atr scan --lane enfroce <target>` both print
1108
+ `Error: Invalid --lane "enfroce". Expected one of: enforce, alert, hunt.` and
1109
+ stop. A flag is typed at a prompt by someone who will see the exit code; an
1110
+ inherited variable is not. An explicit bad argument
1111
+ (`new ATREngine({ lane: 'enfroce' })`) still throws for the same reason.
1112
+
1113
+ - **An unreadable `ATR_LANE` forces blocking off, even against an explicit
1114
+ `--blocking`.** Falling back to `hunt` while blocking stays on is the one
1115
+ degraded posture that is *more* dangerous than the one requested: the operator
1116
+ asked to enforce on `maturity: stable` rules only and would instead enforce on
1117
+ every maturity. `--blocking` says "you may block", not "block on a lane I never
1118
+ chose". `ATR_LANE=enfroce atr guard --blocking` therefore exits 0 in advisory
1119
+ mode, having printed the lane warning above plus:
1120
+
1121
+ ```text
1122
+ [atr] Blocking disabled: ATR_LANE could not be read, and blocking on the fallback lane "hunt" would enforce on more rule maturities than you asked for. Fix ATR_LANE to re-enable enforcement.
1123
+ ```
1124
+
1125
+ - **Both switches now trim whitespace and ignore case, identically.** They were
1126
+ asymmetric: `ATR_BLOCKING=ON` worked while `ATR_LANE=ENFORCE` did not, so the
1127
+ pair `ATR_LANE=ENFORCE ATR_BLOCKING=ON` turned blocking on **and** silently
1128
+ widened the lane to `hunt` — the operator asked for the narrowest enforcement
1129
+ posture and got the broadest one. `ATR_LANE=ENFORCE`, `ATR_LANE=" alert "` and
1130
+ `--lane Alert` are all honoured now.
1131
+
1132
+ - **A non-boolean explicit `blocking` throws instead of enabling blocking.**
1133
+ `new ActionExecutor({ adapter, blocking: "false" })` and
1134
+ `new HookHandler({ engine, executor, blocking: "false" })` previously turned
1135
+ blocking **on**, because every non-empty string is truthy — reading, to their
1136
+ author, as an explicit "off". Both now raise a `TypeError`, whose message in
1137
+ full is:
1138
+
1139
+ ```text
1140
+ Invalid blocking value "false" (string). Expected a boolean. Note that any non-empty string, including "false", would otherwise enable blocking.
1141
+ ```
1142
+
1143
+ The lane path validated its explicit value from the start; a switch that fails
1144
+ toward *more* enforcement was the wrong asymmetry to leave in place. This is
1145
+ BREAKING for any JavaScript or JSON-config caller that was passing a string.
1146
+
1147
+ - **`ActionExecutor` no longer dispatches response actions above the `observe`
1148
+ blast-radius tier unless blocking is enabled.** `alert` / `snapshot` /
1149
+ `shadow` / `escalate` run exactly as before; `block_input` / `block_output` /
1150
+ `block_tool` / `reduce_permissions` / `reset_context` / `quarantine_session` /
1151
+ `kill_agent` are recorded as suppressed and the adapter is never called. The
1152
+ tier ladder is read from `src/quality/action-eligibility.ts` — this change does
1153
+ not introduce a second classification of what is destructive.
1154
+ This closes the dual-channel contradiction where a benign
1155
+ `Bash{command:"ls -la"}` produced `permissionDecision: "allow"` while the
1156
+ executor really invoked `blockTool` on the adapter.
1157
+ - **Both channels are governed by one switch**: the `blocking` config field on
1158
+ `ActionExecutor` and `HookHandler` for embedders, and `--blocking` /
1159
+ `--no-blocking` or `ATR_BLOCKING` on `atr guard` for the CLI. Default off. The
1160
+ environment variable reaches the CLI only — see the embedder entry above.
1161
+ - **Why**: `SPEC.md` §5.5 (Response) is the engine-wide requirement, quoted
1162
+ whole because it is short enough to be: "Engines MUST NOT execute response
1163
+ actions automatically without an explicit configuration directive from the
1164
+ operator. The `response` field is a recommendation expressed by the Rule
1165
+ author, not a directive to the Engine." That directive had no implementation —
1166
+ no CLI flag, no environment variable, no documented config key by which an
1167
+ operator could express it. This change is that implementation.
1168
+ Two narrower statements point the same way. Neither is the requirement, and
1169
+ neither may be quoted as a general rule:
1170
+ - `spec/atr-method-v1.1.md` §5.6 (Provenance and Trust) sits under §5
1171
+ Signature Method and is scoped to hash matches: "Engines SHOULD NOT
1172
+ auto-block on a hash match without operator policy explicitly enabling it;
1173
+ the default response action SHOULD be `log_alert` until provenance is
1174
+ operator-trusted." An earlier revision of this entry quoted that sentence
1175
+ with "on a hash match" elided, which turned a Signature-Rule SHOULD NOT into
1176
+ an engine-wide one. It is not one. Quote it whole or cite §5.5 instead.
1177
+ - `docs/QUALITY-STANDARD.md` ("For Consumers") restricts blocking to
1178
+ `maturity: stable` with confidence ≥ 80. That is deployment guidance
1179
+ addressed to consumers, not a normative requirement on engines.
1180
+ - **Turning blocking on reproduces the previous behaviour on every verdict that
1181
+ restrains — and only those.** An earlier revision of this entry claimed the
1182
+ two transcripts were "byte-identical". They are not, and the difference is the
1183
+ point of the change. Measured by replaying the 850 samples of
1184
+ `data/pint-benchmark/pint-corpus.json` as **850 hook events per hook type**
1185
+ (one JSON line in, one JSON line out) through `atr guard`'s stdio loop —
1186
+ `HookHandler` → `evaluateWithVerdict` → `ActionExecutor` — on the pre-change
1187
+ merge-base `994b01b2b` with no flags, and on `b9da8d710` with `--blocking`.
1188
+ The rule corpus is byte-for-byte identical at those two commits
1189
+ (`git diff --name-only 994b01b2b..b9da8d710 -- rules` is empty), so every
1190
+ difference below is the contract change and nothing else.
1191
+
1192
+ | Hook | Events | Byte-identical output lines | Differing |
1193
+ |---|---:|---:|---:|
1194
+ | `PostToolUse` | 850 | **850** | 0 |
1195
+ | `PreToolUse` | 850 | 85 | **765** |
1196
+
1197
+ `PostToolUse` is unchanged outright. On `PreToolUse` the 85 identical lines are
1198
+ exactly the events where the baseline emitted a decision that **restrains** —
1199
+ 81 `deny` + 4 `ask` — and all 85 of those match byte for byte. The 765
1200
+ differing lines are every event where the baseline emitted
1201
+ `permissionDecision: "allow"`; on this branch all 765 carry no
1202
+ `hookSpecificOutput` key at all.
1203
+ Restricted to the 451 samples labelled `label: true` (the attacks), the same
1204
+ replay gives 85 identical / 366 differing — i.e. **ATR was affirmatively
1205
+ pre-approving 366 of 451 known attacks**, including under
1206
+ the `enforce` lane, where no `stable` rule matched and the whole payload was
1207
+
1208
+ ```json
1209
+ {"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","permissionDecisionReason":"No rules matched."},"atr_decision":"allow"}
1210
+ ```
1211
+
1212
+ captured on 994b01b2b through the TypeScript API rather than the CLI, because
1213
+ the predecessor had no `--lane` flag to set the lane with. The excerpt an
1214
+ earlier revision quoted here was the inner `hookSpecificOutput` object, not
1215
+ the payload.
1216
+
1217
+ - **Detection is unchanged in both modes.** Over the same 850 × 2 events,
1218
+ `matched_rules` is identical to the baseline on 850/850 for both hooks in both
1219
+ modes, and `atr_decision` equals the baseline's internal decision on 850/850.
1220
+ Blocking changes what the engine *does*, never what it *sees*.
1221
+
1222
+ ### Added — the detection lane finally has an entrance
1223
+
1224
+ - `ATREngineConfig.lane` existed and worked but no shipped code path ever set it
1225
+ and no user-facing entry point could, so `hunt` was the only reachable setting.
1226
+ Added `--lane <enforce|alert|hunt>` to `atr guard` and `atr scan`, the
1227
+ `ATR_LANE` environment variable, and a `lane` input on the GitHub Action.
1228
+ `ATR_LANE` is read by the **CLI surfaces only** — `atr guard`, `atr scan`, and
1229
+ `src/mcp-server.ts` when it is the process entry point. It is *not* honoured by
1230
+ every `ATREngine`: an engine constructed by an embedder ignores it entirely.
1231
+ See the library/environment entry under "Changed" above.
1232
+ - **There is no single resolution order any more, and conflating the two was the
1233
+ bug.** They are different chains on different surfaces:
1234
+
1235
+ | Surface | Chain |
1236
+ |---|---|
1237
+ | Library (`ATREngine` / `ActionExecutor` / `HookHandler`) | explicit config **>** built-in default. The environment is not consulted. |
1238
+ | CLI (`atr guard`, `atr scan`) | flag **>** environment variable **>** built-in default. There is no programmatic config on this surface. |
1239
+
1240
+ The old "explicit programmatic config > environment > default" described a
1241
+ chain that exists on neither surface.
1242
+ On the command line an unrecognised `--lane` value is a usage error, never a
1243
+ silent fallback: `atr guard --lane enfroce` prints
1244
+ `Error: Invalid --lane "enfroce". Expected one of: enforce, alert, hunt.` and
1245
+ exits 1, so an operator who typed it is not left believing they are enforcing.
1246
+ (`--blocking` / `--no-blocking` take no value; supplying one, as in
1247
+ `--blocking=maybe`, is not recognised as the flag and leaves the switch to the
1248
+ environment and then the default — it does not error.)
1249
+ An unrecognised value arriving from the *environment* is handled differently —
1250
+ see the `ATR_LANE` / `ATR_BLOCKING` entry under "Changed" above, which is the
1251
+ only place this file describes it.
1252
+ - `atr guard` now prints its posture on stderr, preceded by
1253
+ `[atr-guard] Loaded <n> rules from <dir>`. Both modes carry a parenthetical,
1254
+ and the blocking one names the limit rather than claiming enforcement outright:
1255
+
1256
+ ```text
1257
+ [atr-guard] lane=hunt blocking=off (advisory: detections are reported, nothing is blocked)
1258
+ [atr-guard] lane=hunt blocking=on (deny/ask only; never approves a tool call)
1259
+ ```
1260
+
1261
+ `atr init` says in its success message that the installed hook is advisory.
1262
+ "Installed" must never read as "enforcing".
1263
+
1264
+ - **Provenance of the console output quoted in this entry.** Every payload,
1265
+ warning and posture line above is captured stdout/stderr from
1266
+ `fix/review-never-affirmative-allow` at `b9da8d710`, pasted unedited apart from
1267
+ stripping the ANSI colour codes on the `[atr]` warnings and rewriting the
1268
+ absolute rules path. This branch carries the documentation; `b9da8d710` carries
1269
+ the implementation. The commands reproduce these outputs once both have landed
1270
+ — not before.
1271
+
1272
+ ### Fixed
1273
+
1274
+ - `src/hook-handler.ts` carried two contradictory comments about failure
1275
+ behaviour: the module header said fail-open, an inline comment in
1276
+ `startStdioLoop` said the error path "fail-closes to a deny". The header was
1277
+ right — `failOpen` defaults to `true` in both the constructor and the CLI. The
1278
+ inline comment is corrected; the behaviour is unchanged.
1279
+
1280
+ ### Fixed — published benchmark numbers
1281
+
1282
+ - **Withdrew two garak figures that no measurement file backed.** From 2026-08-04
1283
+ to 2026-08-05, `README.md` and `stats.json` cited 91.5% (`garak` in-the-wild)
1284
+ and 56.9% (`garak-full`) at ATR 3.5.11. Neither run produced a file under
1285
+ `data/measurements/`; the newest files there were 95.7% at 3.5.8 and 38.3% at
1286
+ 3.5.0 respectively. Re-measured on 2026-08-05 at 780 rules: **92.5%**
1287
+ (`garak`, 601/650) and **57.2%** (`garak-full`, 1989/3475), both written to
1288
+ `data/measurements/` with the commit that produced them.
1289
+ - **Four eval harnesses built `type: 'llm_io'`**, which is a rule *source* and
1290
+ not an `AgentEventType`. `src/engine.ts` could not map it to a source, and its
1291
+ source-type filter is skipped when the mapping is absent — so instead of the
1292
+ narrow llm_io channel those harnesses documented, every rule of every source
1293
+ ran against the event. Affected: `eval-garak-inthewild.ts`,
1294
+ `eval-academic-raw.ts`, `eval-small-corpora.ts`, `atr_recall_analysis.ts`.
1295
+ `check-new-rules-on-benign.ts` had the same class of bug with
1296
+ `type: 'user_input'` behind an `as AgentEvent` cast. Event shapes now come
1297
+ from `scripts/lib/corpus-event.ts`.
1298
+ - **`scripts/` is now typechecked** (`tsconfig.scripts.json`,
1299
+ `npm run typecheck:scripts`, wired into CI). `tsconfig.json` covered only
1300
+ `src/**`, which is why every one of the above was an unreported TS2322/TS2345.
1301
+ - **`.github/workflows/rule-quality.yml`'s "Run PINT eval regression check"**
1302
+ ran `npm run eval` (the internal self-test harness, not PINT), read a
1303
+ git-committed report that step does not write, and looked up a key that does
1304
+ not exist on it — printing `PINT recall: undefined` while no downstream step
1305
+ read the result. It now runs `npm run eval:pint` and gates on recall/FP
1306
+ against the committed baseline.
1307
+ - **`scripts/check-benchmark-citations.ts`** (new, runs in CI) fails the build
1308
+ when `README.md`'s benchmark table or root `stats.json` cites a number,
1309
+ ATR version, or date that `data/measurements/` does not back.
1310
+
1311
+ No rule content changed and no threshold was loosened in any of the above.
1312
+
1313
+ ### Added — beyond the hook and lane work above
1314
+
1315
+ - **The Cisco Skill Scanner pack is now a build artifact** rather than a
1316
+ hand-assembled export (#495).
1317
+ - **A rule the benign corpus cannot see has not been measured** — CI now says
1318
+ so instead of counting it clean (#460). The benign gate was also given the
1319
+ two corpora it had been missing (#468).
1320
+ - `DETECTION-BOUNDARY.md` — what this layer detects and what it cannot (#461) —
1321
+ and `ENFORCEMENT-MODEL.md`, which also made three contradicted statements
1322
+ elsewhere in the docs true (#470).
1323
+ - `ATR-2026-02502`: covert remote-script injection into generated artifacts
1324
+ (#462). The four tool-poisoning rules are mapped to MITRE ATLAS
1325
+ `AML.T0110.000` (#465), and the CSA MAESTRO mapping is refreshed against the
1326
+ current corpus (#464).
1327
+
1328
+ ### Fixed — the guard was not reading real events
1329
+
1330
+ - **`atr guard` never read a real Claude Code event.** The shape it parsed was
1331
+ not the shape the host sends (#483). The event shape now follows
1332
+ `hook_event_name` as well as the dispatch, rather than the dispatch alone
1333
+ (#487).
1334
+
1335
+ ### Fixed — rules that matched the wrong thing
1336
+
1337
+ - `ATR-2026-00086` was detecting Russian, not spoofing (#489).
1338
+ - `ATR-2026-01904` read method calls as domains (#474).
1339
+ - `ATR-2026-00443` read an ordinary sentence as fragment assembly (#473).
1340
+ - `ATR-2026-01750` fired on descriptions of loops rather than demands for
1341
+ output (#472).
1342
+ - An unquoted ATLAS `T0110.000` title broke the site build (#477).
1343
+
1344
+ ### Measurement
1345
+
1346
+ - The benign false-positive evidence was re-derived at 785 rules (#497).
1347
+ - ATR was measured against 36,394 published ClawHub skills across three event
1348
+ shapes (#490), and rule drift was measured against the 2026-04 wild scan
1349
+ (#491).
1350
+ - The rule count in the standardization document was 357 rules out of date
1351
+ (#479), and five benchmark corpora were refreshed (#478).
1352
+
1353
+ ## [3.5.0] - 2026-06-16
1354
+
1355
+ > **The two lane false-positive rates quoted in this 3.5.0 entry were withdrawn on 2026-09-19 and must not be cited.** The entry is left as published, because a changelog is a record of what was said at the time. See the withdrawal under [Unreleased] for the three defects that disqualified them; re-measurement is pending.
1356
+
1357
+ ### Added
1358
+
1359
+ - **Detection lanes (`enforce` / `alert` / `hunt`).** Rules now carry a maturity-driven
1360
+ lane so consumers can trade recall for precision. On a 65K-sample benign gate: `enforce`
1361
+ (stable + confirm rules only) ~0.24% FP; `hunt` (all rules) ~9% FP. Default is `hunt`,
1362
+ opt-in and fully backward-compatible.
1363
+ - **`confirm` field** — an embedding/secondary check that must pass before a match fires in
1364
+ the enforce lane. Four rules ship a `confirm: embedding` guard (ATR-2026-00001 / 00002 /
1365
+ 00030 / 00442).
1366
+ - **`src/quality/rule-contract.ts`** — a single shared contract (`MATURITIES`, `laneAllows`,
1367
+ `validateContract`) the engine and loader consume.
1368
+
1369
+ ### Changed
1370
+
1371
+ - **652 detection rules across 10 categories.** Specification line `3.0.0-alpha.1`
1372
+ (Working Draft); this is the npm release line, tracked separately from the spec version.
1373
+ - **23 rules reclassified** (maturity) to reflect measured precision and generalization.
1374
+ - **ATR-2026-00495 deprecated** (garak DAN "insert prompt here" variant) — it now never fires.
1375
+ Spec-conformant; the only behavior change in this release.
1376
+ - Python `pyatr` engine skips `deprecated` / `draft` rules, matching the TypeScript engine.
1377
+
1378
+ ### Note
1379
+
1380
+ - Report false-positive rates lane-keyed (enforce ~0.24% / hunt ~9% on a 65K-sample benign
1381
+ gate), not as a single overall figure.
1382
+
1383
+ ## [3.1.1] - 2026-06-05
1384
+
1385
+ ### Fixed
1386
+
1387
+ - **ATR-2026-00001** (prompt-injection) false positive: the `start over/fresh/anew with a new …` task-switch branch matched benign phrasing such as "start fresh with a new outline" / "a new draft" because it lacked the task-noun constraint its sibling branches carry. Tightened to require a task-like noun (task / instruction / assignment / objective / goal / mission / prompt / persona / role / directive / job) after "new". The rule's documented true-positives are unaffected; full suite green (535 tests). Surfaced by the new semantic-validation corpus.
1388
+
1389
+ ### Added
1390
+
1391
+ - **Semantic-validation harness** (`data/semantic-validation/` + `scripts/semantic-validation-score.mts`): a focused, reproducible corpus — 20 held-out paraphrased attacks targeting the two v3.1.0 semantic rules (00573 instruction-override, 00574 system-prompt extraction) plus 15 adversarial benign near-misses — and a scorer. Documents what the optional semantic stage actually adds on its two target threats, and ships the corpus so anyone can re-run it with their own judge.
1392
+
1393
+ ### Measured
1394
+
1395
+ - Focused semantic validation (n=35, Claude-as-judge via worklist mode, threshold 0.7): the deterministic regex layer caught 10% of the paraphrased attacks; the optional semantic judge stage raised combined recall to 95% (19/20), with 0 judge false positives on the 15 adversarial benign near-misses (0 regex FP after the 00001 fix above). This is a small-n, authored, self-judged validation of the pipeline — NOT an independent benchmark. See `data/semantic-validation/README.md` for method and caveats.
1396
+
1397
+ ## [3.1.0] - 2026-06-05
1398
+
1399
+ ### Added
1400
+
1401
+ - **Tier-2 semantic detection (T2) — optional second-stage judge.** New two-stage scan pipeline (`scripts/scan-with-judge.mts`). Stage 1 is the existing deterministic regex engine run across the whole corpus; Stage 2 spends an LLM-as-judge only on the subset Stage 1 flags or misses (~2%), so judge cost scales with the flagged/missed set rather than the corpus. Opt-in by design: it runs only with an OpenAI-compatible backend (`ATR_SEMANTIC_API_KEY` [+ `ATR_SEMANTIC_BASE_URL` / `ATR_SEMANTIC_MODEL`]) or a no-key worklist mode (`WORKLIST_OUT`) that a separate session adjudicates and feeds back via `--verdicts`. Tunable `JUDGE_SUBSET` (missed | flagged | all) and `JUDGE_THRESHOLD`. The default `ATREngine.evaluate()` path stays 100% deterministic and the LLM judge is off by default — the two semantic rules contribute only narrow regex fallback patterns to the default path (FP-gated, with documented true-negatives); the judge stage is additive and opt-in.
1402
+ - **ATR-2026-00573** (prompt-injection): semantic paraphrased instruction-override. Flags reworded injection that drops the literal trigger vocabulary (ignore / disregard / forget) that pattern rule ATR-2026-00001 keys on — the precise misses recorded in 00001's `evasion_tests`. Severity high, status experimental.
1403
+ - **ATR-2026-00574** (context-exfiltration): semantic paraphrased system-prompt extraction. Flags indirect elicitation of the agent's system prompt or hidden configuration without the literal verb-first phrasing (reveal / show / print your instructions). Severity high, status experimental.
1404
+ - Cisco-grade, human-reviewed exploitation rules for agent runtimes: path traversal, SQL injection, and reflected XSS (ATR-2026-00569 / 00570 / 00571), MCP command injection, and SSRF-to-cloud-metadata, plus CVE-anchored detections surfaced by the daily NVD collector.
1405
+ - Daily CVE collector and ecosystem-scan automation now feed agent-package vulnerability proposals into the review queue (collection only; promotion stays behind the human safety gate).
1406
+
1407
+ ### Changed
1408
+
1409
+ - Total rule count: 450 → 462.
1410
+ - Two rounds of false-positive hardening on existing rules, gated by a wild-confirmed benign corpus and a dual-use security-skill bucket, so security tooling that legitimately ships attack strings no longer trips detection.
1411
+ - Engine and rule format unchanged; existing ecosystem integrations (Microsoft AGT, Cisco AI Defense, MISP CIRCL, OWASP A-S-R-H, precize, Sage) work without modification.
1412
+
1413
+ ### Deprecated
1414
+
1415
+ - **ATR-2026-00235** — exact duplicate of ATR-2026-00230; marked deprecated, retained for ID stability.
1416
+
1417
+ ### Notes
1418
+
1419
+ - First npm release to carry the post-3.0.5 work. The Cisco-grade rules and hardening landed on `main` between 2026-05-29 and 2026-06-04 but stayed unpublished until now: the auto-publish flywheel fires only for Threat-Cloud-crystallized commits, so human-authored rule work ships on an explicit minor release like this one.
1420
+ - Semantic rules are experimental and the T2 judge is opt-in; production blocking should continue to rely on the pattern rules. Benchmarks remain measured on the 3.0.0 baseline (see `stats.json`) and have not been re-run against the semantic stage.
1421
+
1422
+ ## [2.2.2] - 2026-05-13
1423
+
1424
+ ### Added
1425
+
1426
+ - **ATR-2026-00523** (skill-compromise): Claude Code Hooks SessionStart pre-trust RCE (CVE-2025-59536). Detects repo-shipped `.claude/settings.json` registering a `SessionStart` hook with the `startup` matcher; the hook command fires before the trust dialog renders. Six layered conditions: literal Hooks-schema shape anchor, shell-interpreter command resolution, pipe-to-shell / inline-exec payload shape, package-manager + credential-tool invocation, repo-path + payload co-occurrence, and pre-trust prose anchor. 7 TP / 6 TN / 3 evasion tests documented. Reported by Aviv Donenfeld and Oded Vanunu (Check Point Research); patched via GHSA-ph6w-f82w-28w6 enhanced trust-dialog warning.
1427
+ - **ATR-2026-00524** (context-exfiltration): Claude Code ANTHROPIC_BASE_URL credential exfiltration (CVE-2026-21852, CVSS 5.3 Moderate). Detects repo-shipped `.claude/settings.json` or env-var configuration rebinding `ANTHROPIC_BASE_URL` to an endpoint outside the Anthropic-controlled allowlist (`api.anthropic.com`, Vertex `*.googleapis.com`, Bedrock `bedrock*.<region>.amazonaws.com`); pre-trust API request leaks the live `Authorization: Bearer` header. Seven layered conditions: JSON-form allowlist negative-lookahead, shell / dotenv / Dockerfile env-var form, bare public-IPv4 detector (excludes loopback + RFC1918), cleartext-HTTP detector against non-loopback hosts, repo-path + payload co-occurrence, pre-trust prose anchor, and CVE-identifier co-occurrence. 7 TP / 8 TN / 3 evasion tests documented. Patched in Claude Code >= 2.0.65 (GHSA-jh7p-qr78-84p7); PoC at github.com/atiilla/CVE-2026-21852-PoC.
1428
+
1429
+ ### Changed
1430
+
1431
+ - Total rule count: 419 → 421.
1432
+
1433
+ ### Anchors
1434
+
1435
+ - 2 Check Point Research disclosures against Claude Code: CVE-2025-59536 (Hooks SessionStart pre-trust RCE) + CVE-2026-21852 (ANTHROPIC_BASE_URL pre-trust credential exfil). Both share the same root cause class — repo-scoped `.claude/settings.json` parsed and acted on before the trust dialog gates the action — and both upstream patches narrow the trust-gate ordering. ATR rules anchor on the dangerous config shape so detection survives both pre- and post-patch deployments.
1436
+
1437
+ ## [2.2.0] - 2026-05-12
1438
+
1439
+ ### Added
1440
+
1441
+ - **75 new rules** across 5 categories (prompt-injection 57 + context-exfiltration 6 + tool-poisoning 4 + excessive-autonomy 2 + model-abuse 2). Total rule count: 344 → 419.
1442
+ - 5 new rule source integrations: HackAPrompt (EMNLP 2023, 4,780 samples, ATR-2026-00452..00456), NeMo-Guardrails + llm-guard + Promptfoo vendor test suites (94 samples combined, ATR-2026-00500..00505), PromptInject (NeurIPS 2022, ATR-2026-00506..00509), OWASP LLM Top 10 + MITRE ATLAS PoCs (8 standards-aligned rules ATR-2026-00510..00517).
1443
+ - 6-framework compliance metadata on all 75 new rules (OWASP / MITRE ATLAS / NIST AI RMF / EU AI Act / ISO 42001 / SAFE-MCP).
1444
+ - 53 rules with regex generalized from literal corpus fingerprints to multi-layer structural patterns.
1445
+ - 4 rules kept as KEPT-AS-IS corpus fingerprints (ATR-GARAK-a7fcb4e5 + 3 others): cannot generalize without unacceptable FP rate; marked experimental, not for production blocking.
1446
+
1447
+ ### Changed
1448
+
1449
+ - Total rule count: 344 → 419 (357 stable + 62 experimental).
1450
+ - NVIDIA garak wrapped rule count: 293 → 419.
1451
+
1452
+ ### Metrics
1453
+
1454
+ - HackAPrompt (4,780 samples): recall 28.6% → 66.2% (+37.6pp), 100% precision maintained.
1455
+ - Erratum (2026-10-19): re-run on the same 4,780 samples at the sprint commits,
1456
+ recall was 28.6% (1,368, at `3a6145b7`) → 65.0% (3,108, at `e9efefdd`) and
1457
+ 66.0% (3,154, at `92c0d0fe`); 66.2% could not be reproduced at either. The
1458
+ 28.6% starting point was itself in-sample (ATR-2026-00442..00447 were mined
1459
+ from this subset). "100% precision" was not a measurement: the corpus has
1460
+ no benign samples, so precision is undefined on it. Procedure and figures:
1461
+ `data/hackaprompt/METHOD.md`; current measurement, with the ablation
1462
+ reference: `data/measurements/hackaprompt/`.
1463
+ - garak (3,475 prompts): ATR-core families ~80%+; per-family breakdown: latentinjection 34.4%, sysprompt_extraction 67.9%, dan 90.2%.
1464
+ - PINT (850 samples): 0.25% FP maintained, 0 FP regression.
1465
+ - SKILL.md (341 samples): 100% precision, 0% FP, 0 FP regression.
1466
+ - 0 FP regression on benign corpus (432 real-world benign skills).
1467
+
1468
+ ### Scope
1469
+
1470
+ - PyRIT Pliny L1B3RT4S: refused — Anthropic usage policy prevented subagent import.
1471
+ - AdvBench, HarmBench, JailbreakBench: reclassified to data/test-corpora/; describe target behaviors, not attack payloads.
1472
+
1473
+ ## [2.1.4] - 2026-05-12
1474
+
1475
+ ### Added
1476
+
1477
+ - **ATR-2026-00448** (tool-poisoning): Spring AI MilvusVectorStore filter-expression injection (CVE-2026-41705). Tautology-based deletion-broadening, paren-breakout, in-clause chaining, terminator-DROP, like-ESCAPE bypass primitive. 8 TP / 6 TN / 0 FP on 431-sample benign corpus.
1478
+ - **ATR-2026-00449** (context-exfiltration): Spring AI PromptChatMemoryAdvisor cross-user memory leakage (CVE-2026-41712). Shared / singleton ChatMemory wiring, placeholder conversation_id, mismatched user-tag windows, wildcard-tenant scope. 8 TP / 6 TN / 0 FP.
1479
+ - **ATR-2026-00450** (data-poisoning): Spring AI PromptChatMemoryAdvisor memory poisoning (CVE-2026-41713). Persistence-aware ignore-previous, bracketed `[SYSTEM-MEMORY-PERSIST]` canaries, smuggled role-tag prefixes, REMEMBER:-shaped persona override, ChatMemory.add(SystemMessage) sink-level concat. 8 TP / 6 TN / 0 FP.
1480
+ - **ATR-2026-00451** (privilege-escalation): LiteLLM proxy admin endpoint SQL injection (CVE-2026-42208, CISA KEV 2026-05-08, CVSS 9.3, federal remediation due 2026-05-11). Tautology + comment-out, stacked DROP / TRUNCATE, UNION SELECT exfil, pg_sleep blind, Postgres metadata recon, error-based extractvalue / updatexml / load_extension. 8 TP / 6 TN / 0 FP.
1481
+
1482
+ ### Changed
1483
+
1484
+ - Total rule count: 344 → 348.
1485
+
1486
+ ### Anchors
1487
+
1488
+ - 3 Spring AI CVEs (CVE-2026-41705 / -41712 / -41713) disclosed 2026-05-08 in Spring Security Advisory; patches in Spring AI >= 1.0.0.
1489
+ - 1 CISA Known Exploited Vulnerabilities catalog entry: CVE-2026-42208 added 2026-05-08, federal remediation due 2026-05-11, active exploitation observed against financial services and healthcare deployments; patch in LiteLLM >= 1.48.3.
1490
+
1491
+ ## [2.1.3] - 2026-05-11
1492
+
1493
+ ### Added
1494
+
1495
+ - 6 HackAPrompt-cluster rules (ATR-2026-00442..00447) + benchmark harness (PR #51). Auto-published via tc-pr-back release workflow after PR #51 merge.
1496
+
1497
+ ### Changed
1498
+
1499
+ - Total rule count: 338 → 344.
1500
+
1501
+ ## [2.1.2] - 2026-05-11
1502
+
1503
+ ### Added
1504
+
1505
+ - **ATR-2026-00440** (agent-manipulation): Microsoft Semantic Kernel CVE-2026-26030 — In-Memory Vector Store lambda+eval RCE. AST-traversal-via-mro primitives, BuiltinImporter reflective access, Function-constructor variants. 8 TP / 5 TN / 0 FP on 466-sample benign corpus.
1506
+ - **ATR-2026-00441** (privilege-escalation): Microsoft Semantic Kernel CVE-2026-25592 — SessionsPythonPlugin arbitrary file write to autostart paths. Windows Start Menu Startup, XDG autostart, systemd-user, cron, macOS LaunchAgents/Daemons, Windows Registry Run-key persistence. 7 TP / 5 TN / 0 FP.
1507
+ - **`src/redact.ts`** new module: `redactMatchedValue()` + `redactMatchedValues()` helpers. ATR-consuming integrations can run `ATRMatch.matchedPatterns` entries through this before logging. Recognises AWS keys, GitHub tokens, Slack tokens, OpenAI/Anthropic keys, Bearer creds, JWTs, PEM keys. 13 unit tests. Additive opt-in API — no existing API changes.
1508
+
1509
+ ### Changed
1510
+
1511
+ - Total rule count: 336 → 338.
1512
+
1513
+ ### Loop closure
1514
+
1515
+ - Microsoft Copilot SWE Agent opened `microsoft/agent-governance-toolkit#1981` 2026-05-11 06:07 UTC with regression-test fixtures presuming ATR detection. PR #50 merged + v2.1.2 npm + GitHub release published within 2h 16m. Closing-the-loop comment mapped each fixture to ATR rule IDs.
1516
+
1517
+ ## [2.1.1] - 2026-05-10
1518
+
1519
+ ### Added
1520
+
1521
+ - 6 ATR rules covering 7 gap CVEs identified by Phase 1 audit (CVSS 9.1–10.0). PR #46 + follow-up batches.
1522
+ - STIX 2.1 extension for `x-atr-rule` custom SDO (PR #49) — self-published extension definition; ATR rules can now be expressed as STIX SDOs for STIX-compliant consumers.
1523
+
1524
+ ### Adopted (external)
1525
+
1526
+ - **MISP/misp-taxonomies#323** merged 2026-05-10 by adulau (MISP project lead). 10 ATR predicates + 330 rule IDs as MISP machine tags.
1527
+ - **MISP/misp-galaxy#1207** merged 2026-05-10 by adulau. 336 cluster values with kill-chain, severity, CVE / OWASP LLM / MITRE ATLAS cross-refs. 10,408 lines.
1528
+
1529
+ ## [2.1.0] - 2026-05-09
1530
+
1531
+ > **Historical entry — the AI RMF line below overstated coverage.**
1532
+ > "100% coverage of all 4 AI RMF functions" described the community OSCAL
1533
+ > catalog, which encodes all 72 AI RMF subcategories as controls. ATR's
1534
+ > rules map to a subset of those subcategories. The catalog is a community
1535
+ > contribution and is not endorsed by NIST. Do not quote the line as a
1536
+ > coverage claim. (Note added 2026-10-16.)
1537
+
1538
+ ### Added
1539
+
1540
+ - **NIST AI RMF mapping v0.2** — 100% coverage of all 4 AI RMF functions (Govern / Map / Measure / Manage), 72 controls + 31 cross-reference links + worked example profile. Schema-valid OSCAL catalog published under `Agent-Threat-Rule/ai-rmf-oscal-catalog` (PR #46).
1541
+ - Dedicated `/compliance/nist-ai-rmf` page on website with 314 → 330 rule count refresh sitewide.
1542
+
1543
+ ### Adopted (external)
1544
+
1545
+ - **OWASP/Agent-Security-Regression-Harness#74** merged 2026-05-11 by mertsatilmaz (OWASP Project Lead): "Welcome to the team."
1546
+
1547
+ ## [2.0.11] - 2026-04-21
1548
+
1549
+ > **Historical entry — do not quote the garak or SKILL.md figures below.**
1550
+ > The 97.1% in-the-wild recall was measured on a garak corpus that many of
1551
+ > this release's new rules were written from, so it is not an out-of-sample
1552
+ > result. The SKILL.md precision and FP figures are in-sample: the benign
1553
+ > set is the one the rules were tuned against. Current figures, reported
1554
+ > per lane and with their closed-book share, are in README §8 Evaluation.
1555
+ > (Note added 2026-10-16.)
1556
+
1557
+ ### Added
1558
+
1559
+ - **193 new rules** covering the full NVIDIA garak probe corpus (ATR-00300 ~ ATR-00414), bringing total to **311 rules**
1560
+ - **agent-manipulation**: DanInTheWild community jailbreak library batch 7-9, AntiDAN inverted persona, ChatGPT DevMode RANTI, Image-Markdown unlock, Ablation_Dan_11_0 generator-name binding, AutoDAN hierarchical suffix, Goodside ThreatJSON death coercion, Doctor XML policy puppetry
1561
+ - **prompt-injection**: latentinjection separator/keyword, leakreplay cloze MASK, glitch token repeat-back (SolidGoldMagikarp et al.), echo SQL-jinja template injection, DRA parenthesis reconstruction, phrasing past/future tense, LMRC harm category, FigStep image-list multimodal, continuation ethnic slur, backspace deletion character, LLM special-token boundary, toxic continuation prefix, snowball impossible reasoning, ecoji/base2048/variant-selector/sneaky-bits encoding injection, zalgo/braille/sata encoded attacks
1562
+ - **context-exfiltration**: markdown image URL exfil + XSS, API key generation and partial-key completion
1563
+ - **model-abuse**: malwaregen code generation (TopLevel + SubFunctions), HuggingFace unsafe model artifact load
1564
+ - **tool-poisoning**: ANSI escape elicitation request
1565
+ - Word-boundary (`\b`) anchoring on grandma-roleplay rule to prevent partial-word FP (late/gran/read)
1566
+ - `metadata_provenance.garak_probe` field for ATR-00267 (GCGCached), ATR-00301 (TAPCached), and all new rules
1567
+ - Missing `true_negatives` added to 10 existing DAN-family rules (ATR-00352–00376) to meet ≥5 TN safety gate requirement
1568
+
1569
+ ### Changed
1570
+
1571
+ - **Total rule count**: 113 → 311
1572
+ - **garak in-the-wild benchmark recall**: 69.7% → **97.1%** (646/666 prompts detected against garak community jailbreak corpus)
1573
+ - **SKILL.md precision/FP**: maintained 100% precision, 0% FP on 498-sample benign corpus
1574
+ - FP mitigations applied to new rules (response action `[alert]` only for medium-FP-risk rules — phrasing, API key, malwaregen, SQL-jinja)
1575
+
1576
+ ### Fixed
1577
+
1578
+ - ATR-00402 (grandma roleplay): added word boundaries to prevent `late`/`gran`/`read` substring FP in Firebase documentation
1579
+ - ATR-00401 ([MASK]): required elicitation context to prevent NLP-documentation FP
1580
+ - ATR-00403 (glitch tokens): required elicitation verb before token names (StreamerBot etc.) to prevent legitimate software reference FP
1581
+ - ATR-00411 (API key gen): negative lookahead on "from your dashboard/console" to exclude documentation requests
1582
+
1583
+ ## [2.0.10] - 2026-04-21
1584
+
1585
+ ### Added
1586
+
1587
+ - garak coverage batch 10: ansiescape, badchars, realtoxicityprompts, topic, fileformats (ATR-00393~00398)
1588
+
1589
+ ## [2.0.9] - 2026-04-20
1590
+
1591
+ ### Added
1592
+
1593
+ - garak DanInTheWild coverage batch 8-9: jailbreak templates, emoji-flag, prompt-browser (ATR-00377~00392)
1594
+
1595
+ ## [2.0.0] - 2026-04-15
1596
+
1597
+ > **Historical entry — do not quote these figures as current.** The scan counts,
1598
+ > malware counts, benchmark rates and rule totals below are as published on
1599
+ > 2026-04-15 at 113 rules. The wild-scan figures in particular are under
1600
+ > reconciliation and are not a citable measurement; current corpus numbers live
1601
+ > in `data/stats.json` and in README §8 Evaluation. The "Cisco AI Defense" line
1602
+ > describes rules merged into the open-source `cisco-ai-defense/skill-scanner`
1603
+ > repository — it is not a statement about any vendor product.
1604
+
1605
+ ### BREAKING
1606
+
1607
+ - **Compound detection gate**: MCP rules now require 30%+ conditions to match in skill context. This prevents over-triggering when MCP-specific patterns appear in legitimate SKILL.md documentation.
1608
+ - **Code block suppression**: Skill rules no longer suppress matches inside code blocks (they are instructions, not documentation examples).
1609
+ - **All fields resolve to content in skill context**: `tool_description`, `tool_args`, `user_input` all map to the full skill content for static analysis.
1610
+
1611
+ ### Added
1612
+
1613
+ - **26 new rules** (87 to 113 total, 9 categories):
1614
+ - ATR-2026-00149: Compound exfiltration (12 patterns: SSH archive, wallet, browser, DNS, IMDS)
1615
+ - ATR-2026-00158/159/160: TC-crystallized rules (first rules generated end-to-end by Threat Cloud)
1616
+ - ATR-2026-00161: Cross-tool shadowing via IMPORTANT tag (from Invariant Labs PoC)
1617
+ - ATR-2026-00162: Credential exfil combo
1618
+ - ATR-2026-00163: Hidden override instructions
1619
+ - ATR-2026-00164: Scope hijack
1620
+ - Plus 19 more across prompt-injection, tool-poisoning, and data-exfiltration categories
1621
+ - **RFC-001 v1.1** (ATR Quality Standard):
1622
+ - Two-Dimensional Compliance Model (metadata presence + provenance)
1623
+ - L0-L5 Review Tier Levels (first standard to include LLM-assisted review as formal tier)
1624
+ - Community Signal Aggregation (confirmations, FP reports, evasion reports)
1625
+ - Multi-Runtime Compatibility (14 runtimes: Claude Code, Cursor, Hermes, OpenAI Assistants, Google A2A, etc.)
1626
+ - Relaxed experimental gate (3/3/0) for community velocity; stable tier retains full 5/5/3
1627
+ - Future Work: RFC-002 (Detection Types), RFC-003 (Collective Defense), RFC-004 (Enterprise)
1628
+ - **GOVERNANCE.md v1.1**:
1629
+ - Permanent MIT license commitment (never BSL/SSPL)
1630
+ - MITRE ATLAS positioning: ATR = detection rules complement to ATLAS (like Sigma to ATT&CK)
1631
+ - ATR Numbering Authority specification
1632
+ - Technical Advisory Group roadmap
1633
+ - **96,096 real-world skills scanned** (OpenClaw 56K + Skills.sh 3K + Hermes 123 + ClawHub 36K + MCP Registry 5K)
1634
+ - **751 malware skills discovered** (hightower6eu 354, sakaen736jih 212, 52yuanchangxing 137)
1635
+ - Research report: `docs/research/openclaw-malware-campaign-2026-04.md`
1636
+ - NousResearch notified (hermes-agent#9809)
1637
+ - **Threat Cloud blacklist**: 554 entries uploaded from wild scan
1638
+ - **4 export formats**: SARIF v2.1.0, Splunk SPL, Elasticsearch DSL, generic regex (714 portable patterns)
1639
+ - **Exponential backoff for npm registry crawl** (fixes Daily Ecosystem Scan rate limiting)
1640
+
1641
+ ### Changed
1642
+
1643
+ - Engine: compound gate for context-aware matching
1644
+ - Confidence formula: cross-context penalty (0.7x) for rules firing outside their tested runtime
1645
+ - SKILL.md denylist reduced from 22 to 10 rules (re-enabled low-FP rules for better coverage)
1646
+
1647
+ ### Metrics
1648
+
1649
+ - 113 rules (7 stable, 85 experimental, 21 draft)
1650
+ - 361 tests passing
1651
+ - SKILL.md benchmark (498 corpus): 100% recall, 97% precision, 0.20% FP rate
1652
+ - MCP benchmark (PINT 850): 62.7% recall, 99.6% precision
1653
+ - Wild scan (96K): 1.35% flag rate, 751 confirmed malware
1654
+ - OWASP Agentic Top 10: 10/10 coverage
1655
+ - MITRE ATLAS: 100/113 rules mapped
1656
+ - SAFE-MCP: technique coverage figure (withdrawn 2026-10: it was not backed by rule-level data; see docs/SAFE-MCP-MAPPING.md)
1657
+ - Avg scan latency: 14ms per file
1658
+
1659
+ ### Ecosystem
1660
+
1661
+ - **Cisco AI Defense**: 34 ATR rules shipped in production (PR #79 merged)
1662
+ - **OWASP**: Attack examples contributed (PR #814 merged)
1663
+ - **NousResearch**: Malware campaign reported (hermes-agent#9809)
1664
+
1665
+ ## [1.0.0] - 2026-04-06
1666
+
1667
+ ### BREAKING
1668
+
1669
+ - **Rule IDs**: 3-digit → 5-digit (`ATR-2026-001` → `ATR-2026-00001`). Zero-padded, detection logic unchanged.
1670
+
1671
+ ### Added
1672
+
1673
+ - **ATR-SPEC-v1.md** — Formal rule format specification. Third parties can build conforming engines in any language.
1674
+ - **GOVERNANCE.md** — Contribution process, quality gates, severity rubric.
1675
+ - **`scan_target` metadata** — Every rule declares `mcp` or `skill`. Engines filter by scan context.
1676
+ - **`rule_version` field** — All rules carry version number. Bump on detection logic changes.
1677
+ - **Unified CLI** — `atr scan` auto-detects JSON (MCP) vs .md (SKILL.md).
1678
+ - **`ScanResult` type** — Unified output with `scan_type`, `content_hash` (SHA-256).
1679
+ - **MCP server `atr_scan_skill` tool** — 7 tools total.
1680
+ - 6 new skill rules: context poisoning (00125), rug pull setup (00126), subcommand overflow (00127), HTML comment hidden payload (00128), unicode smuggling (00129), exfil URL in instructions (00135).
1681
+
1682
+ ### Metrics
1683
+
1684
+ - 87 rules (75 MCP + 12 skill)
1685
+ - 53,399 real-world skills scanned (skills.sh + OpenClaw)
1686
+ - 670 confirmed malicious skills detected
1687
+ - SKILL.md recall: 94.4%, FP rate: 0.096%
1688
+ - MCP recall: 62.7% (PINT 850, unchanged)
1689
+
1690
+ ## [0.3.0] - 2026-03-18
1691
+
1692
+ ### Added
1693
+
1694
+ - Evaluation framework (`src/eval/`):
1695
+ - `npm run eval`: 341-sample corpus (321 attacks + 20 benign), 9 attack categories
1696
+ - `npm run eval:pint`: 850-sample external PINT benchmark
1697
+ - Per-rule quality metrics (TP/FP/matchCount per rule)
1698
+ - Confusion matrix, precision/recall/F1, latency percentiles
1699
+ - Regression gate (auto-fail on metric degradation)
1700
+ - JSON report output (`data/eval-report.json`)
1701
+ - CI gate (`.github/workflows/eval.yml`): typecheck + test + eval + validate on PR
1702
+ - 279 auto-extracted corpus samples from rule test_cases
1703
+ - 8 new detection layers in ATR-2026-001:
1704
+ - forget-everything shorthand, task switching, system prompt extraction,
1705
+ - praise-then-redirect, German formal/informal, French injection patterns
1706
+ - PINT benchmark integration (deepset/prompt-injections + Lakera gandalf datasets)
1707
+
1708
+ ### Changed
1709
+
1710
+ - Embedding similarity threshold: 0.82 -> 0.65 (10 extra TP, 0 extra FP on PINT)
1711
+ - Test count: 225 -> 246 (+21 eval framework tests)
1712
+
1713
+ ### Fixed
1714
+
1715
+ - shadow-evaluator.ts type error (TS2352)
1716
+ - Removed external product references from ATR-FRAMEWORK-SPEC.md
1717
+ - Added temp file patterns to .gitignore
1718
+
1719
+ ### Benchmark Results (honest numbers)
1720
+
1721
+ - Self-corpus (341 samples): Precision 100%, Recall 99.4%, F1 99.5%
1722
+ - PINT external (850 samples): Precision 99.4%, Recall 39.9%, F1 57.0%
1723
+ - Only 6/61 rules fire on external attacks
1724
+ - See LIMITATIONS.md for full analysis
1725
+
1726
+ ## [0.2.3] - 2026-03-16
1727
+
1728
+ ### Added
1729
+
1730
+ - 9 new rules from Threat Cloud community promotion (ATR-2026-100~108):
1731
+ consent bypass, trust escalation, disguised analytics exfiltration,
1732
+ hidden safety bypass, persona hijacking, silent action concealment,
1733
+ schema-description contradiction, delayed execution bypass, Sybil attack
1734
+ - Python engine (pyATR) v0.2.0: validate, test, stats CLI commands, 48 tests
1735
+ - Splunk SPL converter (`atr convert splunk`)
1736
+ - Elastic Query DSL converter (`atr convert elastic`)
1737
+ - Layer 3 LLM-as-judge prompt templates (docs/layer3-prompt-templates.md)
1738
+ - Automated scan pipeline (scripts/auto-scan-pipeline.sh)
1739
+ - Deployment guide for external teams (docs/deployment-guide.md)
1740
+ - MCP ecosystem security audit report: 1,295 packages, 14,299 tools
1741
+ - npm crawler with pagination (795 → 2,769 discoverable packages)
1742
+
1743
+ ### Fixed
1744
+
1745
+ - CLI test runner: handle tool_description field, fix event type mapping
1746
+ - All 61 rules pass embedded test cases (556/556, 100%)
1747
+ - CJK test cases moved to evasion_tests (honest: regex can't match them)
1748
+ - Removed all external product references for ATR independence
1749
+ - Fixed pyATR URLs pointing to wrong GitHub org
1750
+
1751
+ ### Stats
1752
+
1753
+ - 61 rules (44 experimental + 17 draft)
1754
+ - 556 test cases (100% pass rate)
1755
+ - 164 TypeScript tests + 48 Python tests = 212 engine tests
1756
+ - 12 SIEM converter tests
1757
+
1758
+ ## [0.2.2] - 2026-03-14
1759
+
1760
+ ### Fixed
1761
+
1762
+ - ReDoS vulnerability in SSRF rule (ATR-2026-013) — O(n^2) backtracking on long hostnames
1763
+ - SSRF rule false positive on filesystem paths like /home/user/
1764
+ - tool_args field extraction fallback for tool_call events
1765
+
1766
+ ### Added
1767
+
1768
+ - True negatives for 21 rules with insufficient test coverage (7 had zero, 14 had only 1)
1769
+ - Vitest coverage reporting with v8 provider (60%+ threshold on core modules)
1770
+
1771
+ ## [0.2.1] - 2026-03-10
1772
+
1773
+ ### Changed
1774
+
1775
+ - Standardized 17 predicted rule IDs (ATR-PRED → ATR-2026-080~096)
1776
+ - Fixed rule validator for skill-compromise category
1777
+ - Toned down coverage claims to reflect actual verification status
1778
+
1779
+ ## [0.1.0-rc2] - 2026-03-09
1780
+
1781
+ ### Added
1782
+
1783
+ - 32 initial experimental detection rules across 9 attack categories
1784
+ - TypeScript reference engine with SessionTracker
1785
+ - OWASP Top 10 for Agentic Applications (2026) mapping (6 covered, 2 partial, 2 gaps)
1786
+ - 13 CVE reference mappings across 16 rules (pattern-based, not empirically verified)
1787
+ - OWASP LLM Top 10 (2025) mapping (7 covered, 3 gaps)
1788
+ - MITRE ATLAS technique references
1789
+ - JSON Schema specification (spec/atr-schema.yaml)
1790
+ - Built-in true positive and true negative test cases for every rule
1791
+ - Attack corpus validation tests
1792
+ - Coverage report (COVERAGE.md)
1793
+
1794
+ ### Attack Categories
1795
+
1796
+ - Prompt Injection (5 rules)
1797
+ - Tool Poisoning (4 rules)
1798
+ - Context Exfiltration (3 rules)
1799
+ - Agent Manipulation (3 rules)
1800
+ - Privilege Escalation (2 rules)
1801
+ - Excessive Autonomy (2 rules)
1802
+ - Skill Compromise (7 rules)
1803
+ - Data Poisoning (1 rule)
1804
+ - Model Security (2 rules)