@complior/engine 0.9.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 (594) hide show
  1. package/.well-known/ai-compliance.json +16 -0
  2. package/COMPLIANCE.md +64 -0
  3. package/data/data-integrity.test.ts +75 -0
  4. package/data/eval/eval-mappings.json +33 -0
  5. package/data/llm/model-pricing.json +15 -0
  6. package/data/llm/model-routing.json +36 -0
  7. package/data/onboarding/risk-profile.json +17 -0
  8. package/data/regulations/eu-ai-act/README.md +245 -0
  9. package/data/regulations/eu-ai-act/applicability-tree.json +160 -0
  10. package/data/regulations/eu-ai-act/cross-mapping.json +175 -0
  11. package/data/regulations/eu-ai-act/localization.json +186 -0
  12. package/data/regulations/eu-ai-act/obligations.json +3981 -0
  13. package/data/regulations/eu-ai-act/regulation-meta.json +482 -0
  14. package/data/regulations/eu-ai-act/scoring.json +342 -0
  15. package/data/regulations/eu-ai-act/technical-requirements.json +2590 -0
  16. package/data/regulations/eu-ai-act/timeline.json +160 -0
  17. package/data/regulations/jurisdictions/at.json +15 -0
  18. package/data/regulations/jurisdictions/be.json +15 -0
  19. package/data/regulations/jurisdictions/bg.json +15 -0
  20. package/data/regulations/jurisdictions/cy.json +15 -0
  21. package/data/regulations/jurisdictions/cz.json +15 -0
  22. package/data/regulations/jurisdictions/de.json +15 -0
  23. package/data/regulations/jurisdictions/dk.json +15 -0
  24. package/data/regulations/jurisdictions/ee.json +15 -0
  25. package/data/regulations/jurisdictions/es.json +15 -0
  26. package/data/regulations/jurisdictions/fi.json +15 -0
  27. package/data/regulations/jurisdictions/fr.json +15 -0
  28. package/data/regulations/jurisdictions/gr.json +15 -0
  29. package/data/regulations/jurisdictions/hr.json +15 -0
  30. package/data/regulations/jurisdictions/hu.json +15 -0
  31. package/data/regulations/jurisdictions/ie.json +15 -0
  32. package/data/regulations/jurisdictions/is.json +15 -0
  33. package/data/regulations/jurisdictions/it.json +15 -0
  34. package/data/regulations/jurisdictions/li.json +15 -0
  35. package/data/regulations/jurisdictions/lt.json +15 -0
  36. package/data/regulations/jurisdictions/lu.json +15 -0
  37. package/data/regulations/jurisdictions/lv.json +15 -0
  38. package/data/regulations/jurisdictions/mt.json +15 -0
  39. package/data/regulations/jurisdictions/nl.json +15 -0
  40. package/data/regulations/jurisdictions/no.json +15 -0
  41. package/data/regulations/jurisdictions/pl.json +15 -0
  42. package/data/regulations/jurisdictions/pt.json +15 -0
  43. package/data/regulations/jurisdictions/ro.json +15 -0
  44. package/data/regulations/jurisdictions/se.json +15 -0
  45. package/data/regulations/jurisdictions/si.json +15 -0
  46. package/data/regulations/jurisdictions/sk.json +15 -0
  47. package/data/scanner/check-id-categories.json +81 -0
  48. package/data/scanner/confidence-params.json +16 -0
  49. package/data/scanner/limits.json +4 -0
  50. package/data/schemas/http-contract-sample.json +79 -0
  51. package/data/schemas/http-contract.json +144 -0
  52. package/data/semgrep-rules/bare-call.yaml +37 -0
  53. package/data/semgrep-rules/injection.yaml +73 -0
  54. package/data/semgrep-rules/missing-error-handling.yaml +58 -0
  55. package/data/semgrep-rules/unsafe-deser.yaml +65 -0
  56. package/data/templates/eu-ai-act/ai-literacy.md +184 -0
  57. package/data/templates/eu-ai-act/art5-screening.md +131 -0
  58. package/data/templates/eu-ai-act/data-governance.md +145 -0
  59. package/data/templates/eu-ai-act/declaration-of-conformity.md +161 -0
  60. package/data/templates/eu-ai-act/fria.md +127 -0
  61. package/data/templates/eu-ai-act/gpai-systemic-risk.md +150 -0
  62. package/data/templates/eu-ai-act/gpai-transparency.md +166 -0
  63. package/data/templates/eu-ai-act/incident-report.md +188 -0
  64. package/data/templates/eu-ai-act/instructions-for-use.md +202 -0
  65. package/data/templates/eu-ai-act/monitoring-policy.md +110 -0
  66. package/data/templates/eu-ai-act/qms.md +180 -0
  67. package/data/templates/eu-ai-act/risk-management-system.md +123 -0
  68. package/data/templates/eu-ai-act/technical-documentation.md +287 -0
  69. package/data/templates/eu-ai-act/worker-notification.md +143 -0
  70. package/data/templates/policies/biometrics-ai-policy.md +214 -0
  71. package/data/templates/policies/critical-infra-ai-policy.md +228 -0
  72. package/data/templates/policies/education-ai-policy.md +184 -0
  73. package/data/templates/policies/finance-ai-policy.md +191 -0
  74. package/data/templates/policies/healthcare-ai-policy.md +197 -0
  75. package/data/templates/policies/hr-ai-policy.md +178 -0
  76. package/data/templates/policies/legal-ai-policy.md +189 -0
  77. package/data/templates/policies/migration-ai-policy.md +239 -0
  78. package/engine.log +7 -0
  79. package/package.json +74 -0
  80. package/src/composition-root.ts +791 -0
  81. package/src/data/eval/conformity-tests.test.ts +122 -0
  82. package/src/data/eval/ct-1-transparency.ts +106 -0
  83. package/src/data/eval/ct-10-gpai.ts +25 -0
  84. package/src/data/eval/ct-11-industry.ts +42 -0
  85. package/src/data/eval/ct-2-oversight.ts +41 -0
  86. package/src/data/eval/ct-3-explanation.ts +14 -0
  87. package/src/data/eval/ct-4-bias.ts +83 -0
  88. package/src/data/eval/ct-5-accuracy.ts +41 -0
  89. package/src/data/eval/ct-6-robustness.ts +81 -0
  90. package/src/data/eval/ct-7-prohibited.ts +52 -0
  91. package/src/data/eval/ct-8-logging.ts +68 -0
  92. package/src/data/eval/ct-9-risk-awareness.ts +33 -0
  93. package/src/data/eval/deterministic-evaluator.ts +120 -0
  94. package/src/data/eval/index.ts +55 -0
  95. package/src/data/eval/judge-prompts.ts +146 -0
  96. package/src/data/eval/llm-judged-tests.ts +279 -0
  97. package/src/data/eval/llm-tests.test.ts +83 -0
  98. package/src/data/eval/remediation/ct-1-transparency.ts +91 -0
  99. package/src/data/eval/remediation/ct-10-gpai.ts +94 -0
  100. package/src/data/eval/remediation/ct-11-industry.ts +94 -0
  101. package/src/data/eval/remediation/ct-2-oversight.ts +71 -0
  102. package/src/data/eval/remediation/ct-3-explanation.ts +70 -0
  103. package/src/data/eval/remediation/ct-4-bias.ts +70 -0
  104. package/src/data/eval/remediation/ct-5-accuracy.ts +70 -0
  105. package/src/data/eval/remediation/ct-6-robustness.ts +70 -0
  106. package/src/data/eval/remediation/ct-7-prohibited.ts +94 -0
  107. package/src/data/eval/remediation/ct-8-logging.ts +94 -0
  108. package/src/data/eval/remediation/ct-9-risk-awareness.ts +94 -0
  109. package/src/data/eval/remediation/index.ts +89 -0
  110. package/src/data/eval/remediation/owasp-art5.ts +15 -0
  111. package/src/data/eval/remediation/owasp-llm01.ts +72 -0
  112. package/src/data/eval/remediation/owasp-llm02.ts +72 -0
  113. package/src/data/eval/remediation/owasp-llm03.ts +15 -0
  114. package/src/data/eval/remediation/owasp-llm04.ts +15 -0
  115. package/src/data/eval/remediation/owasp-llm05.ts +15 -0
  116. package/src/data/eval/remediation/owasp-llm06.ts +15 -0
  117. package/src/data/eval/remediation/owasp-llm07.ts +15 -0
  118. package/src/data/eval/remediation/owasp-llm08.ts +15 -0
  119. package/src/data/eval/remediation/owasp-llm09.ts +15 -0
  120. package/src/data/eval/remediation/owasp-llm10.ts +15 -0
  121. package/src/data/eval/remediation/remediation.test.ts +229 -0
  122. package/src/data/eval/remediation/test-mapping.ts +290 -0
  123. package/src/data/eval/security-rubrics.ts +381 -0
  124. package/src/data/finding-explanations.json +453 -0
  125. package/src/data/industry-patterns.ts +161 -0
  126. package/src/data/registry-cards.ts +368 -0
  127. package/src/data/regulation/index.ts +5 -0
  128. package/src/data/regulation/jurisdiction-data.test.ts +73 -0
  129. package/src/data/regulation/jurisdiction-data.ts +65 -0
  130. package/src/data/regulation/regulation-data.ts +19 -0
  131. package/src/data/regulation/regulation-loader.test.ts +107 -0
  132. package/src/data/regulation/regulation-loader.ts +56 -0
  133. package/src/data/scanner-constants.ts +46 -0
  134. package/src/data/schemas/schemas-core.ts +140 -0
  135. package/src/data/schemas/schemas-supplementary.ts +211 -0
  136. package/src/data/schemas/schemas.ts +28 -0
  137. package/src/data/security/attack-probes.test.ts +62 -0
  138. package/src/data/security/attack-probes.ts +496 -0
  139. package/src/data/security/eu-ai-act-security.ts +40 -0
  140. package/src/data/security/index.ts +19 -0
  141. package/src/data/security/mitre-atlas.test.ts +43 -0
  142. package/src/data/security/mitre-atlas.ts +93 -0
  143. package/src/data/security/nist-ai-rmf.ts +43 -0
  144. package/src/data/security/owasp-llm-top10.test.ts +60 -0
  145. package/src/data/security/owasp-llm-top10.ts +138 -0
  146. package/src/data/template-registry.ts +53 -0
  147. package/src/data/tool-versions.json +22 -0
  148. package/src/domain/audit/audit-package.test.ts +152 -0
  149. package/src/domain/audit/audit-package.ts +166 -0
  150. package/src/domain/audit/audit-trail.test.ts +121 -0
  151. package/src/domain/audit/audit-trail.ts +174 -0
  152. package/src/domain/audit/index.ts +8 -0
  153. package/src/domain/audit/permissions-matrix.test.ts +136 -0
  154. package/src/domain/audit/permissions-matrix.ts +121 -0
  155. package/src/domain/certification/adversarial/bias-tests.ts +95 -0
  156. package/src/domain/certification/adversarial/evaluators.ts +304 -0
  157. package/src/domain/certification/adversarial/index.ts +11 -0
  158. package/src/domain/certification/adversarial/prompt-injection.ts +103 -0
  159. package/src/domain/certification/adversarial/safety-boundary.ts +132 -0
  160. package/src/domain/certification/aiuc1-readiness.test.ts +236 -0
  161. package/src/domain/certification/aiuc1-readiness.ts +298 -0
  162. package/src/domain/certification/aiuc1-requirements.ts +235 -0
  163. package/src/domain/certification/index.ts +10 -0
  164. package/src/domain/certification/redteam-runner.test.ts +97 -0
  165. package/src/domain/certification/redteam-runner.ts +205 -0
  166. package/src/domain/certification/test-runner.test.ts +232 -0
  167. package/src/domain/certification/test-runner.ts +289 -0
  168. package/src/domain/cost/cost-estimator.test.ts +187 -0
  169. package/src/domain/cost/cost-estimator.ts +133 -0
  170. package/src/domain/disclaimer.test.ts +52 -0
  171. package/src/domain/disclaimer.ts +39 -0
  172. package/src/domain/documents/ai-enricher.test.ts +120 -0
  173. package/src/domain/documents/ai-enricher.ts +159 -0
  174. package/src/domain/documents/document-generator.test.ts +318 -0
  175. package/src/domain/documents/document-generator.ts +239 -0
  176. package/src/domain/documents/index.ts +9 -0
  177. package/src/domain/documents/passport-helpers.ts +25 -0
  178. package/src/domain/documents/policy-generator.test.ts +252 -0
  179. package/src/domain/documents/policy-generator.ts +94 -0
  180. package/src/domain/documents/worker-notification-generator.test.ts +162 -0
  181. package/src/domain/documents/worker-notification-generator.ts +141 -0
  182. package/src/domain/eval/adapters/adapter-port.ts +94 -0
  183. package/src/domain/eval/adapters/adapters.test.ts +303 -0
  184. package/src/domain/eval/adapters/anthropic-adapter.ts +57 -0
  185. package/src/domain/eval/adapters/auto-detect.ts +104 -0
  186. package/src/domain/eval/adapters/create-chat-adapter.ts +106 -0
  187. package/src/domain/eval/adapters/custom-adapter.ts +74 -0
  188. package/src/domain/eval/adapters/http-adapter.ts +66 -0
  189. package/src/domain/eval/adapters/index.ts +7 -0
  190. package/src/domain/eval/adapters/ollama-adapter.ts +48 -0
  191. package/src/domain/eval/adapters/openai-adapter.ts +58 -0
  192. package/src/domain/eval/adapters/with-timeout.ts +25 -0
  193. package/src/domain/eval/conformity-score.test.ts +161 -0
  194. package/src/domain/eval/conformity-score.ts +135 -0
  195. package/src/domain/eval/eval-constants.ts +55 -0
  196. package/src/domain/eval/eval-evidence.test.ts +85 -0
  197. package/src/domain/eval/eval-evidence.ts +103 -0
  198. package/src/domain/eval/eval-fix-generator.test.ts +421 -0
  199. package/src/domain/eval/eval-fix-generator.ts +205 -0
  200. package/src/domain/eval/eval-passport.test.ts +82 -0
  201. package/src/domain/eval/eval-passport.ts +89 -0
  202. package/src/domain/eval/eval-remediation-report.test.ts +682 -0
  203. package/src/domain/eval/eval-remediation-report.ts +170 -0
  204. package/src/domain/eval/eval-report.ts +108 -0
  205. package/src/domain/eval/eval-runner.test.ts +609 -0
  206. package/src/domain/eval/eval-runner.ts +593 -0
  207. package/src/domain/eval/eval-to-findings.test.ts +293 -0
  208. package/src/domain/eval/eval-to-findings.ts +83 -0
  209. package/src/domain/eval/index.ts +31 -0
  210. package/src/domain/eval/llm-judge.test.ts +139 -0
  211. package/src/domain/eval/llm-judge.ts +168 -0
  212. package/src/domain/eval/remediation-types.ts +90 -0
  213. package/src/domain/eval/security-integration.test.ts +196 -0
  214. package/src/domain/eval/security-integration.ts +136 -0
  215. package/src/domain/eval/types.test.ts +173 -0
  216. package/src/domain/eval/types.ts +244 -0
  217. package/src/domain/eval/verdict-utils.ts +45 -0
  218. package/src/domain/fixer/create-fixer.ts +101 -0
  219. package/src/domain/fixer/diff.ts +70 -0
  220. package/src/domain/fixer/fix-history.ts +23 -0
  221. package/src/domain/fixer/fixer.test.ts +306 -0
  222. package/src/domain/fixer/index.ts +9 -0
  223. package/src/domain/fixer/strategies/bandit-fix.ts +61 -0
  224. package/src/domain/fixer/strategies/bias-testing.ts +49 -0
  225. package/src/domain/fixer/strategies/ci-compliance.ts +57 -0
  226. package/src/domain/fixer/strategies/content-marking.ts +45 -0
  227. package/src/domain/fixer/strategies/cve-upgrade.ts +66 -0
  228. package/src/domain/fixer/strategies/data-governance.ts +65 -0
  229. package/src/domain/fixer/strategies/disclosure.ts +69 -0
  230. package/src/domain/fixer/strategies/doc-code-sync.ts +53 -0
  231. package/src/domain/fixer/strategies/documentation.ts +59 -0
  232. package/src/domain/fixer/strategies/error-handler.ts +63 -0
  233. package/src/domain/fixer/strategies/hitl-gate.ts +67 -0
  234. package/src/domain/fixer/strategies/index.ts +61 -0
  235. package/src/domain/fixer/strategies/kill-switch-test.ts +85 -0
  236. package/src/domain/fixer/strategies/kill-switch.ts +53 -0
  237. package/src/domain/fixer/strategies/license-fix.ts +57 -0
  238. package/src/domain/fixer/strategies/log-retention.ts +40 -0
  239. package/src/domain/fixer/strategies/logging.ts +59 -0
  240. package/src/domain/fixer/strategies/metadata.ts +45 -0
  241. package/src/domain/fixer/strategies/permission-guard.ts +84 -0
  242. package/src/domain/fixer/strategies/record-keeping.ts +69 -0
  243. package/src/domain/fixer/strategies/secret-rotation.ts +52 -0
  244. package/src/domain/fixer/strategies.test.ts +341 -0
  245. package/src/domain/fixer/template-engine.test.ts +64 -0
  246. package/src/domain/fixer/template-engine.ts +38 -0
  247. package/src/domain/fixer/types.ts +88 -0
  248. package/src/domain/frameworks/aiuc1-framework.test.ts +159 -0
  249. package/src/domain/frameworks/aiuc1-framework.ts +126 -0
  250. package/src/domain/frameworks/collect-foundation-metrics.test.ts +96 -0
  251. package/src/domain/frameworks/collect-foundation-metrics.ts +34 -0
  252. package/src/domain/frameworks/eu-ai-act-framework.test.ts +117 -0
  253. package/src/domain/frameworks/eu-ai-act-framework.ts +100 -0
  254. package/src/domain/frameworks/framework-registry.test.ts +91 -0
  255. package/src/domain/frameworks/framework-registry.ts +38 -0
  256. package/src/domain/frameworks/index.ts +8 -0
  257. package/src/domain/frameworks/mitre-atlas-framework.test.ts +53 -0
  258. package/src/domain/frameworks/mitre-atlas-framework.ts +53 -0
  259. package/src/domain/frameworks/owasp-llm-framework.test.ts +77 -0
  260. package/src/domain/frameworks/owasp-llm-framework.ts +54 -0
  261. package/src/domain/frameworks/score-plugin-framework.ts +117 -0
  262. package/src/domain/fria/fria-generator.test.ts +273 -0
  263. package/src/domain/fria/fria-generator.ts +366 -0
  264. package/src/domain/import/promptfoo-importer.test.ts +103 -0
  265. package/src/domain/import/promptfoo-importer.ts +151 -0
  266. package/src/domain/onboarding/guided-onboarding.test.ts +144 -0
  267. package/src/domain/onboarding/guided-onboarding.ts +135 -0
  268. package/src/domain/passport/builder/domain-mapper.ts +9 -0
  269. package/src/domain/passport/builder/manifest-builder.test.ts +546 -0
  270. package/src/domain/passport/builder/manifest-builder.ts +535 -0
  271. package/src/domain/passport/builder/manifest-diff.test.ts +105 -0
  272. package/src/domain/passport/builder/manifest-diff.ts +89 -0
  273. package/src/domain/passport/builder/manifest-files.ts +17 -0
  274. package/src/domain/passport/crypto-signer.test.ts +93 -0
  275. package/src/domain/passport/crypto-signer.ts +157 -0
  276. package/src/domain/passport/discovery/agent-discovery.test.ts +296 -0
  277. package/src/domain/passport/discovery/agent-discovery.ts +325 -0
  278. package/src/domain/passport/discovery/autonomy-analyzer.test.ts +141 -0
  279. package/src/domain/passport/discovery/autonomy-analyzer.ts +113 -0
  280. package/src/domain/passport/discovery/permission-scanner.test.ts +191 -0
  281. package/src/domain/passport/discovery/permission-scanner.ts +414 -0
  282. package/src/domain/passport/export/a2a-mapper.ts +75 -0
  283. package/src/domain/passport/export/aiuc1-mapper.ts +126 -0
  284. package/src/domain/passport/export/export.test.ts +207 -0
  285. package/src/domain/passport/export/index.ts +41 -0
  286. package/src/domain/passport/export/nist-mapper.ts +227 -0
  287. package/src/domain/passport/import/a2a-importer.test.ts +133 -0
  288. package/src/domain/passport/import/a2a-importer.ts +156 -0
  289. package/src/domain/passport/import/index.ts +2 -0
  290. package/src/domain/passport/index.ts +32 -0
  291. package/src/domain/passport/obligation-field-map.test.ts +113 -0
  292. package/src/domain/passport/obligation-field-map.ts +117 -0
  293. package/src/domain/passport/passport-validator.test.ts +156 -0
  294. package/src/domain/passport/passport-validator.ts +126 -0
  295. package/src/domain/passport/scan-to-compliance.test.ts +336 -0
  296. package/src/domain/passport/scan-to-compliance.ts +166 -0
  297. package/src/domain/passport/test-generator.test.ts +93 -0
  298. package/src/domain/passport/test-generator.ts +136 -0
  299. package/src/domain/proxy/index.ts +11 -0
  300. package/src/domain/proxy/json-rpc.test.ts +72 -0
  301. package/src/domain/proxy/json-rpc.ts +53 -0
  302. package/src/domain/proxy/policy-engine.test.ts +259 -0
  303. package/src/domain/proxy/policy-engine.ts +137 -0
  304. package/src/domain/proxy/proxy-bridge.ts +125 -0
  305. package/src/domain/proxy/proxy-interceptor.test.ts +184 -0
  306. package/src/domain/proxy/proxy-interceptor.ts +120 -0
  307. package/src/domain/proxy/proxy-types.ts +35 -0
  308. package/src/domain/registry/compute-agent-score.test.ts +279 -0
  309. package/src/domain/registry/compute-agent-score.ts +162 -0
  310. package/src/domain/reporter/audit-report.test.ts +87 -0
  311. package/src/domain/reporter/audit-report.ts +116 -0
  312. package/src/domain/reporter/badge-generator.test.ts +54 -0
  313. package/src/domain/reporter/badge-generator.ts +40 -0
  314. package/src/domain/reporter/compliance-md.ts +45 -0
  315. package/src/domain/reporter/index.ts +7 -0
  316. package/src/domain/reporter/pdf-renderer.ts +282 -0
  317. package/src/domain/reporter/share.test.ts +92 -0
  318. package/src/domain/reporter/share.ts +80 -0
  319. package/src/domain/scanner/ast/swc-analyzer.test.ts +49 -0
  320. package/src/domain/scanner/ast/swc-analyzer.ts +124 -0
  321. package/src/domain/scanner/attestations.ts +97 -0
  322. package/src/domain/scanner/checks/ai-disclosure.test.ts +90 -0
  323. package/src/domain/scanner/checks/ai-disclosure.ts +54 -0
  324. package/src/domain/scanner/checks/ai-literacy.ts +163 -0
  325. package/src/domain/scanner/checks/behavioral-constraints.test.ts +167 -0
  326. package/src/domain/scanner/checks/behavioral-constraints.ts +86 -0
  327. package/src/domain/scanner/checks/compliance-metadata.ts +63 -0
  328. package/src/domain/scanner/checks/content-marking.ts +74 -0
  329. package/src/domain/scanner/checks/dep-deep-scan.test.ts +318 -0
  330. package/src/domain/scanner/checks/dep-deep-scan.ts +137 -0
  331. package/src/domain/scanner/checks/documentation.test.ts +88 -0
  332. package/src/domain/scanner/checks/documentation.ts +79 -0
  333. package/src/domain/scanner/checks/git-history.test.ts +120 -0
  334. package/src/domain/scanner/checks/git-history.ts +163 -0
  335. package/src/domain/scanner/checks/gpai-systemic-risk.test.ts +84 -0
  336. package/src/domain/scanner/checks/gpai-systemic-risk.ts +98 -0
  337. package/src/domain/scanner/checks/gpai-transparency.ts +94 -0
  338. package/src/domain/scanner/checks/index.ts +28 -0
  339. package/src/domain/scanner/checks/industry/index.ts +40 -0
  340. package/src/domain/scanner/checks/industry/industry.test.ts +287 -0
  341. package/src/domain/scanner/checks/interaction-logging.test.ts +113 -0
  342. package/src/domain/scanner/checks/interaction-logging.ts +142 -0
  343. package/src/domain/scanner/checks/nhi-scanner.test.ts +158 -0
  344. package/src/domain/scanner/checks/nhi-scanner.ts +78 -0
  345. package/src/domain/scanner/checks/passport-completeness.test.ts +127 -0
  346. package/src/domain/scanner/checks/passport-completeness.ts +82 -0
  347. package/src/domain/scanner/checks/passport-presence.test.ts +56 -0
  348. package/src/domain/scanner/checks/passport-presence.ts +78 -0
  349. package/src/domain/scanner/checks/pattern-check-factory.ts +70 -0
  350. package/src/domain/scanner/checks/permission-scanner.test.ts +279 -0
  351. package/src/domain/scanner/checks/permission-scanner.ts +90 -0
  352. package/src/domain/scanner/checks/presence-check-factory.test.ts +124 -0
  353. package/src/domain/scanner/checks/presence-check-factory.ts +275 -0
  354. package/src/domain/scanner/compliance-diff.test.ts +165 -0
  355. package/src/domain/scanner/compliance-diff.ts +138 -0
  356. package/src/domain/scanner/confidence.test.ts +235 -0
  357. package/src/domain/scanner/confidence.ts +156 -0
  358. package/src/domain/scanner/constants.ts +13 -0
  359. package/src/domain/scanner/create-scanner.ts +573 -0
  360. package/src/domain/scanner/cross-layer.test.ts +372 -0
  361. package/src/domain/scanner/cross-layer.ts +232 -0
  362. package/src/domain/scanner/data/ai-packages.ts +82 -0
  363. package/src/domain/scanner/debt-calculator.test.ts +89 -0
  364. package/src/domain/scanner/debt-calculator.ts +111 -0
  365. package/src/domain/scanner/drift.test.ts +191 -0
  366. package/src/domain/scanner/drift.ts +73 -0
  367. package/src/domain/scanner/evidence-store.test.ts +207 -0
  368. package/src/domain/scanner/evidence-store.ts +195 -0
  369. package/src/domain/scanner/evidence.test.ts +104 -0
  370. package/src/domain/scanner/evidence.ts +71 -0
  371. package/src/domain/scanner/external/bandit-runner.test.ts +45 -0
  372. package/src/domain/scanner/external/bandit-runner.ts +90 -0
  373. package/src/domain/scanner/external/checks.ts +321 -0
  374. package/src/domain/scanner/external/dedup.test.ts +79 -0
  375. package/src/domain/scanner/external/dedup.ts +94 -0
  376. package/src/domain/scanner/external/detect-secrets-runner.test.ts +58 -0
  377. package/src/domain/scanner/external/detect-secrets-runner.ts +81 -0
  378. package/src/domain/scanner/external/external-scanner.test.ts +221 -0
  379. package/src/domain/scanner/external/external-scanner.ts +36 -0
  380. package/src/domain/scanner/external/finding-mapper.test.ts +95 -0
  381. package/src/domain/scanner/external/finding-mapper.ts +138 -0
  382. package/src/domain/scanner/external/index.ts +15 -0
  383. package/src/domain/scanner/external/mappings.ts +93 -0
  384. package/src/domain/scanner/external/modelscan-runner.test.ts +35 -0
  385. package/src/domain/scanner/external/modelscan-runner.ts +101 -0
  386. package/src/domain/scanner/external/path-utils.ts +8 -0
  387. package/src/domain/scanner/external/runner-port.ts +45 -0
  388. package/src/domain/scanner/external/semgrep-runner.test.ts +52 -0
  389. package/src/domain/scanner/external/semgrep-runner.ts +94 -0
  390. package/src/domain/scanner/external/types.ts +32 -0
  391. package/src/domain/scanner/finding-attribution.test.ts +444 -0
  392. package/src/domain/scanner/finding-attribution.ts +195 -0
  393. package/src/domain/scanner/finding-explainer.test.ts +157 -0
  394. package/src/domain/scanner/finding-explainer.ts +73 -0
  395. package/src/domain/scanner/fix-diff-builder.test.ts +272 -0
  396. package/src/domain/scanner/fix-diff-builder.ts +477 -0
  397. package/src/domain/scanner/import-graph.test.ts +162 -0
  398. package/src/domain/scanner/import-graph.ts +198 -0
  399. package/src/domain/scanner/languages/adapter.test.ts +105 -0
  400. package/src/domain/scanner/languages/adapter.ts +239 -0
  401. package/src/domain/scanner/layers/index.ts +24 -0
  402. package/src/domain/scanner/layers/layer1-files.ts +54 -0
  403. package/src/domain/scanner/layers/layer2-docs.test.ts +1207 -0
  404. package/src/domain/scanner/layers/layer2-docs.ts +297 -0
  405. package/src/domain/scanner/layers/layer2-parsing.ts +217 -0
  406. package/src/domain/scanner/layers/layer3-config.test.ts +187 -0
  407. package/src/domain/scanner/layers/layer3-config.ts +279 -0
  408. package/src/domain/scanner/layers/layer3-parsers.ts +73 -0
  409. package/src/domain/scanner/layers/layer4-patterns.test.ts +397 -0
  410. package/src/domain/scanner/layers/layer4-patterns.ts +216 -0
  411. package/src/domain/scanner/layers/layer5-docs.test.ts +99 -0
  412. package/src/domain/scanner/layers/layer5-docs.ts +250 -0
  413. package/src/domain/scanner/layers/layer5-llm.test.ts +146 -0
  414. package/src/domain/scanner/layers/layer5-llm.ts +262 -0
  415. package/src/domain/scanner/layers/layer5-targeted.test.ts +93 -0
  416. package/src/domain/scanner/layers/layer5-targeted.ts +233 -0
  417. package/src/domain/scanner/layers/lockfile-parsers.test.ts +320 -0
  418. package/src/domain/scanner/layers/lockfile-parsers.ts +184 -0
  419. package/src/domain/scanner/regulation-version.test.ts +54 -0
  420. package/src/domain/scanner/regulation-version.ts +23 -0
  421. package/src/domain/scanner/role-filter.test.ts +116 -0
  422. package/src/domain/scanner/role-filter.ts +51 -0
  423. package/src/domain/scanner/rules/banned-packages-data.ts +553 -0
  424. package/src/domain/scanner/rules/banned-packages-sdk.ts +65 -0
  425. package/src/domain/scanner/rules/banned-packages.test.ts +249 -0
  426. package/src/domain/scanner/rules/banned-packages.ts +55 -0
  427. package/src/domain/scanner/rules/comment-filter.test.ts +115 -0
  428. package/src/domain/scanner/rules/comment-filter.ts +297 -0
  429. package/src/domain/scanner/rules/index.ts +9 -0
  430. package/src/domain/scanner/rules/nhi-patterns.test.ts +128 -0
  431. package/src/domain/scanner/rules/nhi-patterns.ts +60 -0
  432. package/src/domain/scanner/rules/pattern-rules.ts +1152 -0
  433. package/src/domain/scanner/sbom.test.ts +136 -0
  434. package/src/domain/scanner/sbom.ts +103 -0
  435. package/src/domain/scanner/scan-cache.test.ts +136 -0
  436. package/src/domain/scanner/scan-cache.ts +115 -0
  437. package/src/domain/scanner/scanner.test.ts +125 -0
  438. package/src/domain/scanner/score-calculator.test.ts +363 -0
  439. package/src/domain/scanner/score-calculator.ts +189 -0
  440. package/src/domain/scanner/security-score.test.ts +107 -0
  441. package/src/domain/scanner/security-score.ts +116 -0
  442. package/src/domain/scanner/source-filter.ts +24 -0
  443. package/src/domain/scanner/validators.ts +223 -0
  444. package/src/domain/shared/compliance-constants.ts +48 -0
  445. package/src/domain/shared/disclosure-patterns.ts +16 -0
  446. package/src/domain/shared/index.ts +6 -0
  447. package/src/domain/shared/parse-dependencies.ts +21 -0
  448. package/src/domain/supply-chain/dependency-analyzer.ts +138 -0
  449. package/src/domain/supply-chain/index.ts +3 -0
  450. package/src/domain/supply-chain/supply-chain.test.ts +211 -0
  451. package/src/domain/supply-chain/types.ts +32 -0
  452. package/src/domain/whatif/config-fixer.ts +187 -0
  453. package/src/domain/whatif/index.ts +6 -0
  454. package/src/domain/whatif/scenario-engine.ts +121 -0
  455. package/src/domain/whatif/simulate-actions.test.ts +161 -0
  456. package/src/domain/whatif/simulate-actions.ts +114 -0
  457. package/src/domain/whatif/whatif.test.ts +135 -0
  458. package/src/e2e/gaps-e2e.test.ts +259 -0
  459. package/src/e2e/smoke.test.ts +101 -0
  460. package/src/hooks/hooks-export.test.ts +81 -0
  461. package/src/hooks/installer.ts +113 -0
  462. package/src/http/cors.test.ts +38 -0
  463. package/src/http/create-router.ts +259 -0
  464. package/src/http/routes/agent.route.ts +380 -0
  465. package/src/http/routes/audit.route.ts +66 -0
  466. package/src/http/routes/badge.route.ts +23 -0
  467. package/src/http/routes/cert.route.ts +66 -0
  468. package/src/http/routes/chat.route.ts +228 -0
  469. package/src/http/routes/cost.route.ts +33 -0
  470. package/src/http/routes/debt.route.ts +29 -0
  471. package/src/http/routes/disclaimer.route.ts +64 -0
  472. package/src/http/routes/eval.route.ts +161 -0
  473. package/src/http/routes/events.route.test.ts +108 -0
  474. package/src/http/routes/events.route.ts +71 -0
  475. package/src/http/routes/external-scan.route.ts +24 -0
  476. package/src/http/routes/file.route.ts +54 -0
  477. package/src/http/routes/fix.route.ts +219 -0
  478. package/src/http/routes/frameworks.route.test.ts +66 -0
  479. package/src/http/routes/frameworks.route.ts +36 -0
  480. package/src/http/routes/git.route.ts +27 -0
  481. package/src/http/routes/guided-onboarding.route.ts +65 -0
  482. package/src/http/routes/import.route.ts +64 -0
  483. package/src/http/routes/jurisdiction.route.ts +22 -0
  484. package/src/http/routes/obligations.route.test.ts +122 -0
  485. package/src/http/routes/obligations.route.ts +110 -0
  486. package/src/http/routes/onboarding.route.ts +53 -0
  487. package/src/http/routes/provider.route.ts +42 -0
  488. package/src/http/routes/proxy.route.ts +40 -0
  489. package/src/http/routes/redteam.route.ts +84 -0
  490. package/src/http/routes/report.route.ts +29 -0
  491. package/src/http/routes/scan.route.ts +104 -0
  492. package/src/http/routes/share.route.ts +44 -0
  493. package/src/http/routes/shell.route.ts +27 -0
  494. package/src/http/routes/status.route.ts +66 -0
  495. package/src/http/routes/supply-chain.route.ts +121 -0
  496. package/src/http/routes/sync.route.ts +328 -0
  497. package/src/http/routes/tools.route.ts +29 -0
  498. package/src/http/routes/whatif.route.ts +96 -0
  499. package/src/http/utils/validation.ts +31 -0
  500. package/src/index.ts +1 -0
  501. package/src/infra/bundle-fetcher.ts +77 -0
  502. package/src/infra/cache-storage.ts +34 -0
  503. package/src/infra/event-bus.ts +31 -0
  504. package/src/infra/file-collector.ts +61 -0
  505. package/src/infra/file-ops-adapter.ts +95 -0
  506. package/src/infra/file-watcher.test.ts +90 -0
  507. package/src/infra/file-watcher.ts +106 -0
  508. package/src/infra/git-adapter.ts +93 -0
  509. package/src/infra/git-history-adapter.ts +41 -0
  510. package/src/infra/headless-browser.ts +178 -0
  511. package/src/infra/llm-adapter.test.ts +83 -0
  512. package/src/infra/llm-adapter.ts +86 -0
  513. package/src/infra/logger.ts +27 -0
  514. package/src/infra/project-config.test.ts +74 -0
  515. package/src/infra/project-config.ts +35 -0
  516. package/src/infra/rate-limiter.test.ts +36 -0
  517. package/src/infra/rate-limiter.ts +34 -0
  518. package/src/infra/retry.ts +46 -0
  519. package/src/infra/saas-client.ts +123 -0
  520. package/src/infra/search-adapter.ts +113 -0
  521. package/src/infra/shell-adapter.ts +68 -0
  522. package/src/infra/tool-manager.test.ts +99 -0
  523. package/src/infra/tool-manager.ts +197 -0
  524. package/src/llm/agents/agent-modes.test.ts +44 -0
  525. package/src/llm/agents/modes.ts +68 -0
  526. package/src/llm/routing/cost-routing.test.ts +37 -0
  527. package/src/llm/routing/cost-tracker.ts +74 -0
  528. package/src/llm/routing/model-routing.test.ts +79 -0
  529. package/src/llm/routing/model-routing.ts +38 -0
  530. package/src/llm/routing/pricing.ts +19 -0
  531. package/src/llm/sse-protocol.ts +77 -0
  532. package/src/llm/tool-definitions.ts +83 -0
  533. package/src/llm/tool-executors.ts +80 -0
  534. package/src/llm/tools/types.ts +13 -0
  535. package/src/mcp/create-mcp-stack.ts +82 -0
  536. package/src/mcp/handlers.ts +245 -0
  537. package/src/mcp/index.ts +28 -0
  538. package/src/mcp/mcp-server.test.ts +80 -0
  539. package/src/mcp/server.ts +79 -0
  540. package/src/mcp/tools.ts +48 -0
  541. package/src/onboarding/auto-detect.ts +164 -0
  542. package/src/onboarding/onboarding.test.ts +89 -0
  543. package/src/onboarding/profile.ts +169 -0
  544. package/src/onboarding/questions.ts +112 -0
  545. package/src/onboarding/wizard.ts +66 -0
  546. package/src/output/github-issue.ts +32 -0
  547. package/src/output/json-output.ts +67 -0
  548. package/src/ports/browser.port.ts +23 -0
  549. package/src/ports/events.port.ts +28 -0
  550. package/src/ports/llm.port.ts +23 -0
  551. package/src/ports/logger.port.ts +6 -0
  552. package/src/ports/process.port.ts +6 -0
  553. package/src/ports/scanner.port.ts +15 -0
  554. package/src/server.ts +134 -0
  555. package/src/services/badge-service.ts +67 -0
  556. package/src/services/chat-service.test.ts +162 -0
  557. package/src/services/chat-service.ts +152 -0
  558. package/src/services/cost-service.ts +52 -0
  559. package/src/services/debt-service.ts +65 -0
  560. package/src/services/eval-integration.test.ts +132 -0
  561. package/src/services/eval-service.test.ts +373 -0
  562. package/src/services/eval-service.ts +463 -0
  563. package/src/services/external-scan-service.ts +60 -0
  564. package/src/services/file-service.ts +37 -0
  565. package/src/services/fix-service.test.ts +470 -0
  566. package/src/services/fix-service.ts +648 -0
  567. package/src/services/framework-service.test.ts +159 -0
  568. package/src/services/framework-service.ts +67 -0
  569. package/src/services/onboarding-service.ts +165 -0
  570. package/src/services/passport-audit.ts +244 -0
  571. package/src/services/passport-documents.ts +258 -0
  572. package/src/services/passport-service-utils.ts +72 -0
  573. package/src/services/passport-service.test.ts +251 -0
  574. package/src/services/passport-service.ts +339 -0
  575. package/src/services/proxy-service.ts +81 -0
  576. package/src/services/report-service.ts +72 -0
  577. package/src/services/scan-service.test.ts +470 -0
  578. package/src/services/scan-service.ts +335 -0
  579. package/src/services/share-service.ts +108 -0
  580. package/src/services/shared/backup.ts +23 -0
  581. package/src/services/status-service.ts +38 -0
  582. package/src/services/undo-service.test.ts +190 -0
  583. package/src/services/undo-service.ts +144 -0
  584. package/src/test-helpers/factories.ts +116 -0
  585. package/src/types/common.schemas.ts +147 -0
  586. package/src/types/common.types.ts +292 -0
  587. package/src/types/contract.test.ts +217 -0
  588. package/src/types/errors.ts +52 -0
  589. package/src/types/framework.types.ts +87 -0
  590. package/src/types/passport-schemas.ts +241 -0
  591. package/src/types/passport.types.ts +296 -0
  592. package/src/version.ts +1 -0
  593. package/tsconfig.json +20 -0
  594. package/vitest.config.ts +9 -0
@@ -0,0 +1,1152 @@
1
+ export type PatternCategory =
2
+ | 'bare-llm'
3
+ | 'disclosure'
4
+ | 'human-oversight'
5
+ | 'kill-switch'
6
+ | 'content-marking'
7
+ | 'logging'
8
+ | 'data-governance'
9
+ | 'record-keeping'
10
+ | 'accuracy-robustness'
11
+ | 'cybersecurity'
12
+ | 'deployer-monitoring'
13
+ | 'gpai-transparency'
14
+ | 'conformity-assessment'
15
+ | 'security-risk';
16
+
17
+ export type PatternType = 'positive' | 'negative';
18
+
19
+ export interface PatternRule {
20
+ readonly category: PatternCategory;
21
+ readonly patternType: PatternType;
22
+ readonly regex: RegExp;
23
+ readonly label: string;
24
+ readonly obligationId: string;
25
+ readonly article: string;
26
+ readonly recommendation: string;
27
+ }
28
+
29
+ export const PATTERN_RULES: readonly PatternRule[] = [
30
+ // --- Bare LLM Calls (negative: presence = bad) ---
31
+ {
32
+ category: 'bare-llm',
33
+ patternType: 'negative',
34
+ regex: /openai\.chat\.completions\.create\(/g,
35
+ label: 'OpenAI bare API call',
36
+ obligationId: 'eu-ai-act-OBL-015',
37
+ article: 'Art. 50(1)',
38
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
39
+ },
40
+ {
41
+ category: 'bare-llm',
42
+ patternType: 'negative',
43
+ regex: /anthropic\.messages\.create\(/g,
44
+ label: 'Anthropic bare API call',
45
+ obligationId: 'eu-ai-act-OBL-015',
46
+ article: 'Art. 50(1)',
47
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
48
+ },
49
+ {
50
+ category: 'bare-llm',
51
+ patternType: 'negative',
52
+ regex: /google\.generativeai/gi,
53
+ label: 'Google Generative AI usage',
54
+ obligationId: 'eu-ai-act-OBL-015',
55
+ article: 'Art. 50(1)',
56
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
57
+ },
58
+ {
59
+ category: 'bare-llm',
60
+ patternType: 'negative',
61
+ regex: /cohere\.chat\(/g,
62
+ label: 'Cohere bare API call',
63
+ obligationId: 'eu-ai-act-OBL-015',
64
+ article: 'Art. 50(1)',
65
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
66
+ },
67
+ {
68
+ category: 'bare-llm',
69
+ patternType: 'negative',
70
+ regex: /mistral\.chat\.complete\(/g,
71
+ label: 'Mistral bare API call',
72
+ obligationId: 'eu-ai-act-OBL-015',
73
+ article: 'Art. 50(1)',
74
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
75
+ },
76
+
77
+ // --- Disclosure (positive: presence = good) ---
78
+ {
79
+ category: 'disclosure',
80
+ patternType: 'positive',
81
+ regex: /AIDisclosure|ai-disclosure|ai_disclosure/gi,
82
+ label: 'AI disclosure component/attribute',
83
+ obligationId: 'eu-ai-act-OBL-015',
84
+ article: 'Art. 50(1)',
85
+ recommendation: 'Add AI disclosure notice to user-facing interfaces',
86
+ },
87
+
88
+ // --- Human Oversight (positive: presence = good) ---
89
+ {
90
+ category: 'human-oversight',
91
+ patternType: 'positive',
92
+ regex: /humanReview|human_review|manual_approval|human[_-]?oversight|require[_-]?approval/gi,
93
+ label: 'Human oversight mechanism',
94
+ obligationId: 'eu-ai-act-OBL-010',
95
+ article: 'Art. 14',
96
+ recommendation: 'Implement human oversight for AI decisions (Art. 14)',
97
+ },
98
+
99
+ // --- Kill Switch (positive: presence = good) ---
100
+ {
101
+ category: 'kill-switch',
102
+ patternType: 'positive',
103
+ regex: /AI_ENABLED|DISABLE_AI|ai\.enabled|killSwitch|kill[_-]?switch|feature[_-]?flag.*ai/gi,
104
+ label: 'AI kill switch / feature flag',
105
+ obligationId: 'eu-ai-act-OBL-010',
106
+ article: 'Art. 14',
107
+ recommendation: 'Add an AI kill switch or feature flag to disable AI functionality',
108
+ },
109
+
110
+ // --- Content Marking (positive: presence = good) ---
111
+ {
112
+ category: 'content-marking',
113
+ patternType: 'positive',
114
+ regex: /ai-generated|generated-by-ai|AIGenerated|ai_generated|c2pa|content[_-]?credentials/gi,
115
+ label: 'AI content marking / watermarking',
116
+ obligationId: 'eu-ai-act-OBL-016',
117
+ article: 'Art. 50(2)',
118
+ recommendation: 'Mark AI-generated content with appropriate labels or C2PA metadata',
119
+ },
120
+
121
+ // --- Logging (positive: presence = good) ---
122
+ {
123
+ category: 'logging',
124
+ patternType: 'positive',
125
+ regex: /logAiCall|aiLogger|compliance\.log|auditLog|audit[_-]?log|ai[_-]?audit/gi,
126
+ label: 'AI interaction logging',
127
+ obligationId: 'eu-ai-act-OBL-006',
128
+ article: 'Art. 12',
129
+ recommendation: 'Add structured logging for AI interactions (Art. 12)',
130
+ },
131
+
132
+ // --- Data Governance (Art. 10) ---
133
+ {
134
+ category: 'data-governance',
135
+ patternType: 'positive',
136
+ regex: /data[_-]?validat(ion|e|or)|validateData|DataValidator|data[_-]?quality/gi,
137
+ label: 'Data validation / quality check',
138
+ obligationId: 'eu-ai-act-OBL-003',
139
+ article: 'Art. 10',
140
+ recommendation: 'Implement data validation and quality checks for training data (Art. 10)',
141
+ },
142
+ {
143
+ category: 'data-governance',
144
+ patternType: 'positive',
145
+ regex: /training[_-]?data[_-]?quality|data[_-]?lineage|DataLineage|data[_-]?provenance/gi,
146
+ label: 'Training data lineage / provenance',
147
+ obligationId: 'eu-ai-act-OBL-004',
148
+ article: 'Art. 10',
149
+ recommendation: 'Track training data provenance and lineage (Art. 10)',
150
+ },
151
+ {
152
+ category: 'data-governance',
153
+ patternType: 'positive',
154
+ regex: /consent[_-]?manag|userConsent|data[_-]?consent|gdpr[_-]?consent/gi,
155
+ label: 'Data consent management',
156
+ obligationId: 'eu-ai-act-OBL-003',
157
+ article: 'Art. 10',
158
+ recommendation: 'Implement consent management for personal data used in AI systems (Art. 10)',
159
+ },
160
+
161
+ // --- Record-Keeping (Art. 12) ---
162
+ {
163
+ category: 'record-keeping',
164
+ patternType: 'positive',
165
+ regex: /audit[_-]?trail|AuditTrail|event[_-]?log[_-]?persist|persistAudit/gi,
166
+ label: 'Audit trail / persistent event logging',
167
+ obligationId: 'eu-ai-act-OBL-013',
168
+ article: 'Art. 12',
169
+ recommendation: 'Implement persistent audit trails for AI system decisions (Art. 12)',
170
+ },
171
+ {
172
+ category: 'record-keeping',
173
+ patternType: 'positive',
174
+ regex: /compliance[_-]?record|ComplianceRecord|retention[_-]?policy|log[_-]?retention/gi,
175
+ label: 'Compliance record keeping',
176
+ obligationId: 'eu-ai-act-OBL-014',
177
+ article: 'Art. 12',
178
+ recommendation: 'Maintain compliance records with defined retention policy (Art. 12)',
179
+ },
180
+
181
+ // --- Accuracy & Robustness (Art. 15) ---
182
+ {
183
+ category: 'accuracy-robustness',
184
+ patternType: 'positive',
185
+ regex: /model[_-]?validat(ion|e|or)|ModelValidator|accuracy[_-]?metric|accuracy[_-]?test/gi,
186
+ label: 'Model validation / accuracy testing',
187
+ obligationId: 'eu-ai-act-OBL-008',
188
+ article: 'Art. 15',
189
+ recommendation: 'Implement model validation and accuracy metrics (Art. 15)',
190
+ },
191
+ {
192
+ category: 'accuracy-robustness',
193
+ patternType: 'positive',
194
+ regex: /robustness[_-]?test|adversarial[_-]?test|fuzz[_-]?test.*model|model[_-]?benchmark/gi,
195
+ label: 'Robustness / adversarial testing',
196
+ obligationId: 'eu-ai-act-OBL-008',
197
+ article: 'Art. 15',
198
+ recommendation: 'Conduct robustness and adversarial testing of AI models (Art. 15)',
199
+ },
200
+
201
+ // --- Cybersecurity (Art. 15(4)) ---
202
+ {
203
+ category: 'cybersecurity',
204
+ patternType: 'positive',
205
+ regex: /rate[_-]?limit|RateLimiter|throttle.*api|api[_-]?throttl/gi,
206
+ label: 'API rate limiting',
207
+ obligationId: 'eu-ai-act-OBL-008',
208
+ article: 'Art. 15(4)',
209
+ recommendation: 'Implement rate limiting for AI API endpoints (Art. 15(4))',
210
+ },
211
+ {
212
+ category: 'cybersecurity',
213
+ patternType: 'positive',
214
+ regex: /input[_-]?sanitiz|sanitizeInput|prompt[_-]?sanitiz|injection[_-]?prevent/gi,
215
+ label: 'Input sanitization / injection prevention',
216
+ obligationId: 'eu-ai-act-OBL-008',
217
+ article: 'Art. 15(4)',
218
+ recommendation: 'Sanitize inputs to prevent prompt injection attacks (Art. 15(4))',
219
+ },
220
+
221
+ // --- Deployer Monitoring (Art. 26) ---
222
+ {
223
+ category: 'deployer-monitoring',
224
+ patternType: 'positive',
225
+ regex: /model[_-]?monitor|ModelMonitor|drift[_-]?detect|performance[_-]?track/gi,
226
+ label: 'Model monitoring / drift detection',
227
+ obligationId: 'eu-ai-act-OBL-011',
228
+ article: 'Art. 26(5)',
229
+ recommendation: 'Implement model monitoring and drift detection (Art. 26(5))',
230
+ },
231
+ {
232
+ category: 'deployer-monitoring',
233
+ patternType: 'positive',
234
+ regex: /incident[_-]?report|IncidentReport|reportIncident|safety[_-]?report/gi,
235
+ label: 'Incident reporting mechanism',
236
+ obligationId: 'eu-ai-act-OBL-011',
237
+ article: 'Art. 26(5)',
238
+ recommendation: 'Implement incident reporting for AI system malfunctions (Art. 26(5))',
239
+ },
240
+
241
+ // --- GPAI Transparency (Art. 53) ---
242
+ {
243
+ category: 'gpai-transparency',
244
+ patternType: 'positive',
245
+ regex: /model[_-]?card|ModelCard|model[_-]?documentation|system[_-]?card/gi,
246
+ label: 'Model card / documentation',
247
+ obligationId: 'eu-ai-act-OBL-022',
248
+ article: 'Art. 53',
249
+ recommendation: 'Provide model card with capabilities, limitations, and intended use (Art. 53)',
250
+ },
251
+ {
252
+ category: 'gpai-transparency',
253
+ patternType: 'positive',
254
+ regex: /training[_-]?data[_-]?summary|compute[_-]?report|TrainingReport/gi,
255
+ label: 'Training data summary / compute report',
256
+ obligationId: 'eu-ai-act-OBL-022',
257
+ article: 'Art. 53',
258
+ recommendation: 'Document training data summary and compute resources used (Art. 53)',
259
+ },
260
+
261
+ // --- Conformity Assessment (Art. 43) ---
262
+ {
263
+ category: 'conformity-assessment',
264
+ patternType: 'positive',
265
+ regex: /conformity[_-]?declar|ConformityDeclaration|ce[_-]?mark|CeMark/gi,
266
+ label: 'Conformity declaration / CE marking',
267
+ obligationId: 'eu-ai-act-OBL-020',
268
+ article: 'Art. 43',
269
+ recommendation: 'Prepare declaration of conformity for high-risk AI systems (Art. 43)',
270
+ },
271
+
272
+ // --- Security Risk (negative patterns) ---
273
+ {
274
+ category: 'security-risk',
275
+ patternType: 'negative',
276
+ regex: /eval\s*\(\s*.*user|eval\s*\(\s*.*req\.|eval\s*\(\s*.*input/gi,
277
+ label: 'Unsafe /* COMPLIOR: /* COMPLIOR: /* COMPLIOR: /* COMPLIOR: /* COMPLIOR: /* COMPLIOR: eval() disabled — Art. 15 */ undefined disabled — Art. 15 */ undefined disabled — Art. 15 */ undefined disabled — Art. 15 */ undefined disabled — Art. 15 */ undefined disabled — Art. 15 */ undefined with user input',
278
+ obligationId: 'eu-ai-act-OBL-008',
279
+ article: 'Art. 15(4)',
280
+ recommendation: 'Remove /* COMPLIOR: /* COMPLIOR: /* COMPLIOR: /* COMPLIOR: /* COMPLIOR: /* COMPLIOR: eval() disabled — Art. 15 */ undefined disabled — Art. 15 */ undefined disabled — Art. 15 */ undefined disabled — Art. 15 */ undefined disabled — Art. 15 */ undefined disabled — Art. 15 */ undefined calls with user input — code injection risk (Art. 15(4))',
281
+ },
282
+ {
283
+ category: 'security-risk',
284
+ patternType: 'negative',
285
+ regex: /pickle\.load\s*\(|pickle\.loads\s*\(/g,
286
+ label: 'Unsafe pickle deserialization',
287
+ obligationId: 'eu-ai-act-OBL-008',
288
+ article: 'Art. 15(4)',
289
+ recommendation: 'Replace pickle.load with safe alternatives (safetensors, json) — deserialization risk',
290
+ },
291
+ {
292
+ category: 'security-risk',
293
+ patternType: 'negative',
294
+ regex: /torch\.load\s*\((?![^)]*(?:map_location|weights_only))[^)]*\)/g,
295
+ label: 'Unsafe torch.load without safety flags',
296
+ obligationId: 'eu-ai-act-OBL-008',
297
+ article: 'Art. 15(4)',
298
+ recommendation: 'Use torch.load with map_location and weights_only=True for safe model loading',
299
+ },
300
+ {
301
+ category: 'security-risk',
302
+ patternType: 'negative',
303
+ regex: /exec\s*\(\s*.*user|exec\s*\(\s*.*request|os\.system\s*\(\s*.*input/gi,
304
+ label: 'Command injection via user input',
305
+ obligationId: 'eu-ai-act-OBL-008',
306
+ article: 'Art. 15(4)',
307
+ recommendation: 'Sanitize inputs before passing to exec/os.system — command injection risk',
308
+ },
309
+
310
+ // ====================================================================
311
+ // EXPANDED PATTERNS — 90+ new rules for comprehensive compliance scanning
312
+ // ====================================================================
313
+
314
+ // --- Bare LLM Calls (negative: presence = bad) — 8 more ---
315
+ {
316
+ category: 'bare-llm',
317
+ patternType: 'negative',
318
+ regex: /fetch\s*\([^)]*\/v1\/chat/gi,
319
+ label: 'Generic HTTP call to OpenAI-compatible chat API',
320
+ obligationId: 'eu-ai-act-OBL-015',
321
+ article: 'Art. 50(1)',
322
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
323
+ },
324
+ {
325
+ category: 'bare-llm',
326
+ patternType: 'negative',
327
+ regex: /fetch\s*\([^)]*\/v1\/completions/gi,
328
+ label: 'Generic HTTP call to completions API',
329
+ obligationId: 'eu-ai-act-OBL-015',
330
+ article: 'Art. 50(1)',
331
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
332
+ },
333
+ {
334
+ category: 'bare-llm',
335
+ patternType: 'negative',
336
+ regex: /axios\s*\.\s*(get|post)\s*\([^)]*\/v1\/chat/gi,
337
+ label: 'Axios call to OpenAI-compatible chat API',
338
+ obligationId: 'eu-ai-act-OBL-015',
339
+ article: 'Art. 50(1)',
340
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
341
+ },
342
+ {
343
+ category: 'bare-llm',
344
+ patternType: 'negative',
345
+ regex: /generateText\s*\(/gi,
346
+ label: 'Vercel AI SDK bare generateText call',
347
+ obligationId: 'eu-ai-act-OBL-015',
348
+ article: 'Art. 50(1)',
349
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
350
+ },
351
+ {
352
+ category: 'bare-llm',
353
+ patternType: 'negative',
354
+ regex: /streamText\s*\(/gi,
355
+ label: 'Vercel AI SDK bare streamText call',
356
+ obligationId: 'eu-ai-act-OBL-015',
357
+ article: 'Art. 50(1)',
358
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
359
+ },
360
+ {
361
+ category: 'bare-llm',
362
+ patternType: 'negative',
363
+ regex: /client\.chat\s*\(/gi,
364
+ label: 'Generic LLM client chat call',
365
+ obligationId: 'eu-ai-act-OBL-015',
366
+ article: 'Art. 50(1)',
367
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
368
+ },
369
+ {
370
+ category: 'bare-llm',
371
+ patternType: 'negative',
372
+ regex: /model\.generate\s*\(/gi,
373
+ label: 'Generic model generate call',
374
+ obligationId: 'eu-ai-act-OBL-015',
375
+ article: 'Art. 50(1)',
376
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
377
+ },
378
+ {
379
+ category: 'bare-llm',
380
+ patternType: 'negative',
381
+ regex: /llm\.invoke\s*\(/gi,
382
+ label: 'LangChain LLM invoke call',
383
+ obligationId: 'eu-ai-act-OBL-015',
384
+ article: 'Art. 50(1)',
385
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
386
+ },
387
+ {
388
+ category: 'bare-llm',
389
+ patternType: 'negative',
390
+ regex: /replicate\.run\s*\(/gi,
391
+ label: 'Replicate bare API call',
392
+ obligationId: 'eu-ai-act-OBL-015',
393
+ article: 'Art. 50(1)',
394
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
395
+ },
396
+ {
397
+ category: 'bare-llm',
398
+ patternType: 'negative',
399
+ regex: /together\.chat\.completions\.create\s*\(/gi,
400
+ label: 'Together AI bare API call',
401
+ obligationId: 'eu-ai-act-OBL-015',
402
+ article: 'Art. 50(1)',
403
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
404
+ },
405
+ {
406
+ category: 'bare-llm',
407
+ patternType: 'negative',
408
+ regex: /groq\.chat\.completions\.create\s*\(/gi,
409
+ label: 'Groq bare API call',
410
+ obligationId: 'eu-ai-act-OBL-015',
411
+ article: 'Art. 50(1)',
412
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
413
+ },
414
+ {
415
+ category: 'bare-llm',
416
+ patternType: 'negative',
417
+ regex: /bedrock.*invokeModel\s*\(|bedrockRuntime/gi,
418
+ label: 'AWS Bedrock bare API call',
419
+ obligationId: 'eu-ai-act-OBL-015',
420
+ article: 'Art. 50(1)',
421
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
422
+ },
423
+ {
424
+ category: 'bare-llm',
425
+ patternType: 'negative',
426
+ regex: /vertexai.*predict\s*\(|aiplatform.*predict\s*\(/gi,
427
+ label: 'Google Vertex AI bare predict call',
428
+ obligationId: 'eu-ai-act-OBL-015',
429
+ article: 'Art. 50(1)',
430
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
431
+ },
432
+ {
433
+ category: 'bare-llm',
434
+ patternType: 'negative',
435
+ regex: /huggingface.*inference|hf\.textGeneration\s*\(/gi,
436
+ label: 'HuggingFace Inference API bare call',
437
+ obligationId: 'eu-ai-act-OBL-015',
438
+ article: 'Art. 50(1)',
439
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
440
+ },
441
+ {
442
+ category: 'bare-llm',
443
+ patternType: 'negative',
444
+ regex: /ollama\.(chat|generate)\s*\(/gi,
445
+ label: 'Ollama bare API call',
446
+ obligationId: 'eu-ai-act-OBL-015',
447
+ article: 'Art. 50(1)',
448
+ recommendation: 'Wrap LLM calls with complior.wrap() or add AI disclosure',
449
+ },
450
+
451
+ // --- Disclosure (positive: presence = good) — 5 more ---
452
+ {
453
+ category: 'disclosure',
454
+ patternType: 'positive',
455
+ regex: /["']powered by["']/gi,
456
+ label: 'Powered by AI text',
457
+ obligationId: 'eu-ai-act-OBL-015',
458
+ article: 'Art. 50(1)',
459
+ recommendation: 'Add AI disclosure notice to user-facing interfaces',
460
+ },
461
+ {
462
+ category: 'disclosure',
463
+ patternType: 'positive',
464
+ regex: /["']generated by["']/gi,
465
+ label: 'Generated by AI text',
466
+ obligationId: 'eu-ai-act-OBL-015',
467
+ article: 'Art. 50(1)',
468
+ recommendation: 'Add AI disclosure notice to user-facing interfaces',
469
+ },
470
+ {
471
+ category: 'disclosure',
472
+ patternType: 'positive',
473
+ regex: /transparency.*notice|notice.*transparency/gi,
474
+ label: 'Transparency notice',
475
+ obligationId: 'eu-ai-act-OBL-015',
476
+ article: 'Art. 50(1)',
477
+ recommendation: 'Add AI disclosure notice to user-facing interfaces',
478
+ },
479
+ {
480
+ category: 'disclosure',
481
+ patternType: 'positive',
482
+ regex: /["']AI-["']|["']artificial intelligence["']/gi,
483
+ label: 'AI identification text',
484
+ obligationId: 'eu-ai-act-OBL-015',
485
+ article: 'Art. 50(1)',
486
+ recommendation: 'Add AI disclosure notice to user-facing interfaces',
487
+ },
488
+ {
489
+ category: 'disclosure',
490
+ patternType: 'positive',
491
+ regex: /disclaimer.*ai|ai.*disclaimer/gi,
492
+ label: 'AI disclaimer',
493
+ obligationId: 'eu-ai-act-OBL-015',
494
+ article: 'Art. 50(1)',
495
+ recommendation: 'Add AI disclosure notice to user-facing interfaces',
496
+ },
497
+ {
498
+ category: 'disclosure',
499
+ patternType: 'positive',
500
+ regex: /ai[_-]?notice|notice[_-]?ai|showAiNotice/gi,
501
+ label: 'AI notice component',
502
+ obligationId: 'eu-ai-act-OBL-015',
503
+ article: 'Art. 50(1)',
504
+ recommendation: 'Add AI disclosure notice to user-facing interfaces',
505
+ },
506
+ {
507
+ category: 'disclosure',
508
+ patternType: 'positive',
509
+ regex: /interacting.*with.*ai|ai.*interaction.*notice/gi,
510
+ label: 'AI interaction disclosure',
511
+ obligationId: 'eu-ai-act-OBL-015',
512
+ article: 'Art. 50(1)',
513
+ recommendation: 'Add AI disclosure notice to user-facing interfaces',
514
+ },
515
+
516
+ // --- Human Oversight (positive: presence = good) — 6 more ---
517
+ {
518
+ category: 'human-oversight',
519
+ patternType: 'positive',
520
+ regex: /approve|approval/gi,
521
+ label: 'Approval mechanism',
522
+ obligationId: 'eu-ai-act-OBL-010',
523
+ article: 'Art. 14',
524
+ recommendation: 'Implement human oversight for AI decisions (Art. 14)',
525
+ },
526
+ {
527
+ category: 'human-oversight',
528
+ patternType: 'positive',
529
+ regex: /review.*queue|queue.*review/gi,
530
+ label: 'Review queue',
531
+ obligationId: 'eu-ai-act-OBL-010',
532
+ article: 'Art. 14',
533
+ recommendation: 'Implement human oversight for AI decisions (Art. 14)',
534
+ },
535
+ {
536
+ category: 'human-oversight',
537
+ patternType: 'positive',
538
+ regex: /escalat(e|ion)/gi,
539
+ label: 'Escalation mechanism',
540
+ obligationId: 'eu-ai-act-OBL-010',
541
+ article: 'Art. 14',
542
+ recommendation: 'Implement human oversight for AI decisions (Art. 14)',
543
+ },
544
+ {
545
+ category: 'human-oversight',
546
+ patternType: 'positive',
547
+ regex: /human.*loop|human.*in.*loop/gi,
548
+ label: 'Human-in-the-loop mechanism',
549
+ obligationId: 'eu-ai-act-OBL-010',
550
+ article: 'Art. 14',
551
+ recommendation: 'Implement human oversight for AI decisions (Art. 14)',
552
+ },
553
+ {
554
+ category: 'human-oversight',
555
+ patternType: 'positive',
556
+ regex: /manual.*override/gi,
557
+ label: 'Manual override mechanism',
558
+ obligationId: 'eu-ai-act-OBL-010',
559
+ article: 'Art. 14',
560
+ recommendation: 'Implement human oversight for AI decisions (Art. 14)',
561
+ },
562
+ {
563
+ category: 'human-oversight',
564
+ patternType: 'positive',
565
+ regex: /confirm.*action|action.*confirm/gi,
566
+ label: 'Action confirmation mechanism',
567
+ obligationId: 'eu-ai-act-OBL-010',
568
+ article: 'Art. 14',
569
+ recommendation: 'Implement human oversight for AI decisions (Art. 14)',
570
+ },
571
+ {
572
+ category: 'human-oversight',
573
+ patternType: 'positive',
574
+ regex: /supervisor.*review|review.*supervisor/gi,
575
+ label: 'Supervisor review process',
576
+ obligationId: 'eu-ai-act-OBL-010',
577
+ article: 'Art. 14',
578
+ recommendation: 'Implement human oversight for AI decisions (Art. 14)',
579
+ },
580
+ {
581
+ category: 'human-oversight',
582
+ patternType: 'positive',
583
+ regex: /override[_-]?decision|decision[_-]?override/gi,
584
+ label: 'Decision override capability',
585
+ obligationId: 'eu-ai-act-OBL-010',
586
+ article: 'Art. 14',
587
+ recommendation: 'Implement human oversight for AI decisions (Art. 14)',
588
+ },
589
+
590
+ // --- Kill Switch (positive: presence = good) — 5 more ---
591
+ {
592
+ category: 'kill-switch',
593
+ patternType: 'positive',
594
+ regex: /emergency.*stop|stop.*emergency/gi,
595
+ label: 'Emergency stop mechanism',
596
+ obligationId: 'eu-ai-act-OBL-010',
597
+ article: 'Art. 14',
598
+ recommendation: 'Add an AI kill switch or feature flag to disable AI functionality',
599
+ },
600
+ {
601
+ category: 'kill-switch',
602
+ patternType: 'positive',
603
+ regex: /circuit.*break|breaker/gi,
604
+ label: 'Circuit breaker pattern',
605
+ obligationId: 'eu-ai-act-OBL-010',
606
+ article: 'Art. 14',
607
+ recommendation: 'Add an AI kill switch or feature flag to disable AI functionality',
608
+ },
609
+ {
610
+ category: 'kill-switch',
611
+ patternType: 'positive',
612
+ regex: /shutdown.*graceful|graceful.*shutdown/gi,
613
+ label: 'Graceful shutdown mechanism',
614
+ obligationId: 'eu-ai-act-OBL-010',
615
+ article: 'Art. 14',
616
+ recommendation: 'Add an AI kill switch or feature flag to disable AI functionality',
617
+ },
618
+ {
619
+ category: 'kill-switch',
620
+ patternType: 'positive',
621
+ regex: /process\.exit|server\.close/gi,
622
+ label: 'Process termination capability',
623
+ obligationId: 'eu-ai-act-OBL-010',
624
+ article: 'Art. 14',
625
+ recommendation: 'Add an AI kill switch or feature flag to disable AI functionality',
626
+ },
627
+ {
628
+ category: 'kill-switch',
629
+ patternType: 'positive',
630
+ regex: /feature.*toggle|toggle.*feature/gi,
631
+ label: 'Feature toggle mechanism',
632
+ obligationId: 'eu-ai-act-OBL-010',
633
+ article: 'Art. 14',
634
+ recommendation: 'Add an AI kill switch or feature flag to disable AI functionality',
635
+ },
636
+ {
637
+ category: 'kill-switch',
638
+ patternType: 'positive',
639
+ regex: /abort[_-]?controller|AbortController/gi,
640
+ label: 'AbortController for cancellation',
641
+ obligationId: 'eu-ai-act-OBL-010',
642
+ article: 'Art. 14',
643
+ recommendation: 'Add an AI kill switch or feature flag to disable AI functionality',
644
+ },
645
+
646
+ // --- Content Marking (positive: presence = good) — 3 more ---
647
+ {
648
+ category: 'content-marking',
649
+ patternType: 'positive',
650
+ regex: /watermark|watermarking/gi,
651
+ label: 'Content watermarking',
652
+ obligationId: 'eu-ai-act-OBL-016',
653
+ article: 'Art. 50(2)',
654
+ recommendation: 'Mark AI-generated content with appropriate labels or C2PA metadata',
655
+ },
656
+ {
657
+ category: 'content-marking',
658
+ patternType: 'positive',
659
+ regex: /metadata.*ai|ai.*metadata/gi,
660
+ label: 'AI metadata tagging',
661
+ obligationId: 'eu-ai-act-OBL-016',
662
+ article: 'Art. 50(2)',
663
+ recommendation: 'Mark AI-generated content with appropriate labels or C2PA metadata',
664
+ },
665
+ {
666
+ category: 'content-marking',
667
+ patternType: 'positive',
668
+ regex: /provenance.*tag|tag.*provenance|content[_-]?provenance/gi,
669
+ label: 'Content provenance tagging',
670
+ obligationId: 'eu-ai-act-OBL-016',
671
+ article: 'Art. 50(2)',
672
+ recommendation: 'Mark AI-generated content with appropriate labels or C2PA metadata',
673
+ },
674
+ {
675
+ category: 'content-marking',
676
+ patternType: 'positive',
677
+ regex: /synthetic[_-]?media|deepfake[_-]?detect|ai[_-]?label/gi,
678
+ label: 'Synthetic media labeling',
679
+ obligationId: 'eu-ai-act-OBL-016',
680
+ article: 'Art. 50(2)',
681
+ recommendation: 'Mark AI-generated content with appropriate labels or C2PA metadata',
682
+ },
683
+
684
+ // --- Logging (positive: presence = good) — 6 more ---
685
+ {
686
+ category: 'logging',
687
+ patternType: 'positive',
688
+ regex: /winston|pino|bunyan|morgan/gi,
689
+ label: 'Logging framework usage',
690
+ obligationId: 'eu-ai-act-OBL-006',
691
+ article: 'Art. 12',
692
+ recommendation: 'Add structured logging for AI interactions (Art. 12)',
693
+ },
694
+ {
695
+ category: 'logging',
696
+ patternType: 'positive',
697
+ regex: /structuredLog|structured.*log/gi,
698
+ label: 'Structured logging',
699
+ obligationId: 'eu-ai-act-OBL-006',
700
+ article: 'Art. 12',
701
+ recommendation: 'Add structured logging for AI interactions (Art. 12)',
702
+ },
703
+ {
704
+ category: 'logging',
705
+ patternType: 'positive',
706
+ regex: /console\.log.*model|console\.log.*ai/gi,
707
+ label: 'Model-specific logging',
708
+ obligationId: 'eu-ai-act-OBL-006',
709
+ article: 'Art. 12',
710
+ recommendation: 'Add structured logging for AI interactions (Art. 12)',
711
+ },
712
+ {
713
+ category: 'logging',
714
+ patternType: 'positive',
715
+ regex: /fs\.(append|write)File.*log/gi,
716
+ label: 'File-based logging',
717
+ obligationId: 'eu-ai-act-OBL-006',
718
+ article: 'Art. 12',
719
+ recommendation: 'Add structured logging for AI interactions (Art. 12)',
720
+ },
721
+ {
722
+ category: 'logging',
723
+ patternType: 'positive',
724
+ regex: /telemetry|opentelemetry|otel/gi,
725
+ label: 'Telemetry / observability instrumentation',
726
+ obligationId: 'eu-ai-act-OBL-006',
727
+ article: 'Art. 12',
728
+ recommendation: 'Add structured logging for AI interactions (Art. 12)',
729
+ },
730
+ {
731
+ category: 'logging',
732
+ patternType: 'positive',
733
+ regex: /event.*emit.*ai|emit.*event.*model/gi,
734
+ label: 'AI event emission',
735
+ obligationId: 'eu-ai-act-OBL-006',
736
+ article: 'Art. 12',
737
+ recommendation: 'Add structured logging for AI interactions (Art. 12)',
738
+ },
739
+ {
740
+ category: 'logging',
741
+ patternType: 'positive',
742
+ regex: /tracing|trace[_-]?id|correlation[_-]?id/gi,
743
+ label: 'Request tracing / correlation',
744
+ obligationId: 'eu-ai-act-OBL-006',
745
+ article: 'Art. 12',
746
+ recommendation: 'Add structured logging for AI interactions (Art. 12)',
747
+ },
748
+
749
+ // --- Data Governance (Art. 10) — 5 more ---
750
+ {
751
+ category: 'data-governance',
752
+ patternType: 'positive',
753
+ regex: /anonymize|anonymization|pseudonymize/gi,
754
+ label: 'Data anonymization / pseudonymization',
755
+ obligationId: 'eu-ai-act-OBL-003',
756
+ article: 'Art. 10',
757
+ recommendation: 'Implement data validation and quality checks for training data (Art. 10)',
758
+ },
759
+ {
760
+ category: 'data-governance',
761
+ patternType: 'positive',
762
+ regex: /data.*retention|retention.*policy/gi,
763
+ label: 'Data retention policy',
764
+ obligationId: 'eu-ai-act-OBL-003',
765
+ article: 'Art. 10',
766
+ recommendation: 'Implement data validation and quality checks for training data (Art. 10)',
767
+ },
768
+ {
769
+ category: 'data-governance',
770
+ patternType: 'positive',
771
+ regex: /gdpr|data.*protection/gi,
772
+ label: 'GDPR / data protection compliance',
773
+ obligationId: 'eu-ai-act-OBL-003',
774
+ article: 'Art. 10',
775
+ recommendation: 'Implement data validation and quality checks for training data (Art. 10)',
776
+ },
777
+ {
778
+ category: 'data-governance',
779
+ patternType: 'positive',
780
+ regex: /encrypt.*data|data.*encrypt/gi,
781
+ label: 'Data encryption',
782
+ obligationId: 'eu-ai-act-OBL-003',
783
+ article: 'Art. 10',
784
+ recommendation: 'Implement data validation and quality checks for training data (Art. 10)',
785
+ },
786
+ {
787
+ category: 'data-governance',
788
+ patternType: 'positive',
789
+ regex: /access.*control.*data|data.*access.*control/gi,
790
+ label: 'Data access control',
791
+ obligationId: 'eu-ai-act-OBL-003',
792
+ article: 'Art. 10',
793
+ recommendation: 'Implement data validation and quality checks for training data (Art. 10)',
794
+ },
795
+ {
796
+ category: 'data-governance',
797
+ patternType: 'positive',
798
+ regex: /bias[_-]?detect|bias[_-]?audit|fairness[_-]?check/gi,
799
+ label: 'Bias detection / fairness audit',
800
+ obligationId: 'eu-ai-act-OBL-004',
801
+ article: 'Art. 10',
802
+ recommendation: 'Track training data provenance and lineage (Art. 10)',
803
+ },
804
+ {
805
+ category: 'data-governance',
806
+ patternType: 'positive',
807
+ regex: /data[_-]?catalog|dataset[_-]?registry|data[_-]?inventory/gi,
808
+ label: 'Data catalog / inventory',
809
+ obligationId: 'eu-ai-act-OBL-004',
810
+ article: 'Art. 10',
811
+ recommendation: 'Track training data provenance and lineage (Art. 10)',
812
+ },
813
+
814
+ // --- Record-Keeping (Art. 12) — 3 more ---
815
+ {
816
+ category: 'record-keeping',
817
+ patternType: 'positive',
818
+ regex: /version.*control.*model|model.*version/gi,
819
+ label: 'Model version control',
820
+ obligationId: 'eu-ai-act-OBL-013',
821
+ article: 'Art. 12',
822
+ recommendation: 'Implement persistent audit trails for AI system decisions (Art. 12)',
823
+ },
824
+ {
825
+ category: 'record-keeping',
826
+ patternType: 'positive',
827
+ regex: /changelog.*ai|ai.*changelog/gi,
828
+ label: 'AI changelog',
829
+ obligationId: 'eu-ai-act-OBL-013',
830
+ article: 'Art. 12',
831
+ recommendation: 'Implement persistent audit trails for AI system decisions (Art. 12)',
832
+ },
833
+ {
834
+ category: 'record-keeping',
835
+ patternType: 'positive',
836
+ regex: /timestamp.*decision|decision.*log/gi,
837
+ label: 'Decision timestamp logging',
838
+ obligationId: 'eu-ai-act-OBL-013',
839
+ article: 'Art. 12',
840
+ recommendation: 'Implement persistent audit trails for AI system decisions (Art. 12)',
841
+ },
842
+ {
843
+ category: 'record-keeping',
844
+ patternType: 'positive',
845
+ regex: /immutable[_-]?log|append[_-]?only.*log|write[_-]?once/gi,
846
+ label: 'Immutable / append-only logging',
847
+ obligationId: 'eu-ai-act-OBL-014',
848
+ article: 'Art. 12',
849
+ recommendation: 'Maintain compliance records with defined retention policy (Art. 12)',
850
+ },
851
+ {
852
+ category: 'record-keeping',
853
+ patternType: 'positive',
854
+ regex: /event[_-]?sourcing|event[_-]?store/gi,
855
+ label: 'Event sourcing pattern',
856
+ obligationId: 'eu-ai-act-OBL-014',
857
+ article: 'Art. 12',
858
+ recommendation: 'Maintain compliance records with defined retention policy (Art. 12)',
859
+ },
860
+
861
+ // --- Accuracy & Robustness (Art. 15) — 4 more ---
862
+ {
863
+ category: 'accuracy-robustness',
864
+ patternType: 'positive',
865
+ regex: /cross[_-]?validat(ion|e)|k[_-]?fold/gi,
866
+ label: 'Cross-validation testing',
867
+ obligationId: 'eu-ai-act-OBL-008',
868
+ article: 'Art. 15',
869
+ recommendation: 'Implement model validation and accuracy metrics (Art. 15)',
870
+ },
871
+ {
872
+ category: 'accuracy-robustness',
873
+ patternType: 'positive',
874
+ regex: /confusion[_-]?matrix|precision[_-]?recall|f1[_-]?score/gi,
875
+ label: 'Model accuracy metrics',
876
+ obligationId: 'eu-ai-act-OBL-008',
877
+ article: 'Art. 15',
878
+ recommendation: 'Implement model validation and accuracy metrics (Art. 15)',
879
+ },
880
+ {
881
+ category: 'accuracy-robustness',
882
+ patternType: 'positive',
883
+ regex: /regression[_-]?test.*model|model.*regression[_-]?test/gi,
884
+ label: 'Model regression testing',
885
+ obligationId: 'eu-ai-act-OBL-008',
886
+ article: 'Art. 15',
887
+ recommendation: 'Implement model validation and accuracy metrics (Art. 15)',
888
+ },
889
+ {
890
+ category: 'accuracy-robustness',
891
+ patternType: 'positive',
892
+ regex: /canary[_-]?deploy|blue[_-]?green|rollback.*model/gi,
893
+ label: 'Safe model deployment strategy',
894
+ obligationId: 'eu-ai-act-OBL-008',
895
+ article: 'Art. 15',
896
+ recommendation: 'Conduct robustness and adversarial testing of AI models (Art. 15)',
897
+ },
898
+
899
+ // --- Cybersecurity (Art. 15(4)) — 5 more ---
900
+ {
901
+ category: 'cybersecurity',
902
+ patternType: 'positive',
903
+ regex: /helmet|cors|csrf/gi,
904
+ label: 'Web security middleware',
905
+ obligationId: 'eu-ai-act-OBL-008',
906
+ article: 'Art. 15(4)',
907
+ recommendation: 'Implement rate limiting for AI API endpoints (Art. 15(4))',
908
+ },
909
+ {
910
+ category: 'cybersecurity',
911
+ patternType: 'positive',
912
+ regex: /jwt.*verif|token.*verif|auth.*middleware/gi,
913
+ label: 'Authentication / token verification',
914
+ obligationId: 'eu-ai-act-OBL-008',
915
+ article: 'Art. 15(4)',
916
+ recommendation: 'Implement rate limiting for AI API endpoints (Art. 15(4))',
917
+ },
918
+ {
919
+ category: 'cybersecurity',
920
+ patternType: 'positive',
921
+ regex: /encrypt|AES|RSA|SHA/g,
922
+ label: 'Encryption algorithm usage',
923
+ obligationId: 'eu-ai-act-OBL-008',
924
+ article: 'Art. 15(4)',
925
+ recommendation: 'Implement rate limiting for AI API endpoints (Art. 15(4))',
926
+ },
927
+ {
928
+ category: 'cybersecurity',
929
+ patternType: 'positive',
930
+ regex: /firewall|waf|ip.*whitelist|ip.*allowlist/gi,
931
+ label: 'Network security / firewall',
932
+ obligationId: 'eu-ai-act-OBL-008',
933
+ article: 'Art. 15(4)',
934
+ recommendation: 'Implement rate limiting for AI API endpoints (Art. 15(4))',
935
+ },
936
+ {
937
+ category: 'cybersecurity',
938
+ patternType: 'positive',
939
+ regex: /vulnerability.*scan|security.*scan|pentest/gi,
940
+ label: 'Security / vulnerability scanning',
941
+ obligationId: 'eu-ai-act-OBL-008',
942
+ article: 'Art. 15(4)',
943
+ recommendation: 'Sanitize inputs to prevent prompt injection attacks (Art. 15(4))',
944
+ },
945
+ {
946
+ category: 'cybersecurity',
947
+ patternType: 'positive',
948
+ regex: /content[_-]?security[_-]?policy|csp|x-frame-options/gi,
949
+ label: 'Content security policy',
950
+ obligationId: 'eu-ai-act-OBL-008',
951
+ article: 'Art. 15(4)',
952
+ recommendation: 'Implement rate limiting for AI API endpoints (Art. 15(4))',
953
+ },
954
+ {
955
+ category: 'cybersecurity',
956
+ patternType: 'positive',
957
+ regex: /api[_-]?key.*rotate|secret.*rotation|key[_-]?management/gi,
958
+ label: 'API key rotation / secret management',
959
+ obligationId: 'eu-ai-act-OBL-008',
960
+ article: 'Art. 15(4)',
961
+ recommendation: 'Implement rate limiting for AI API endpoints (Art. 15(4))',
962
+ },
963
+
964
+ // --- Deployer Monitoring (Art. 26) — 4 more ---
965
+ {
966
+ category: 'deployer-monitoring',
967
+ patternType: 'positive',
968
+ regex: /prometheus|grafana|datadog|newrelic/gi,
969
+ label: 'Monitoring platform integration',
970
+ obligationId: 'eu-ai-act-OBL-011',
971
+ article: 'Art. 26(5)',
972
+ recommendation: 'Implement model monitoring and drift detection (Art. 26(5))',
973
+ },
974
+ {
975
+ category: 'deployer-monitoring',
976
+ patternType: 'positive',
977
+ regex: /health.*check|readiness.*probe|liveness/gi,
978
+ label: 'Health check / readiness probe',
979
+ obligationId: 'eu-ai-act-OBL-011',
980
+ article: 'Art. 26(5)',
981
+ recommendation: 'Implement model monitoring and drift detection (Art. 26(5))',
982
+ },
983
+ {
984
+ category: 'deployer-monitoring',
985
+ patternType: 'positive',
986
+ regex: /alert.*rule|alerting|pagerduty|opsgenie/gi,
987
+ label: 'Alerting / incident notification',
988
+ obligationId: 'eu-ai-act-OBL-011',
989
+ article: 'Art. 26(5)',
990
+ recommendation: 'Implement incident reporting for AI system malfunctions (Art. 26(5))',
991
+ },
992
+ {
993
+ category: 'deployer-monitoring',
994
+ patternType: 'positive',
995
+ regex: /slo|sli|error.*budget/gi,
996
+ label: 'SLO / SLI / error budget monitoring',
997
+ obligationId: 'eu-ai-act-OBL-011',
998
+ article: 'Art. 26(5)',
999
+ recommendation: 'Implement model monitoring and drift detection (Art. 26(5))',
1000
+ },
1001
+ {
1002
+ category: 'deployer-monitoring',
1003
+ patternType: 'positive',
1004
+ regex: /dashboard.*metric|metric.*dashboard|observability/gi,
1005
+ label: 'Metrics dashboard / observability',
1006
+ obligationId: 'eu-ai-act-OBL-011',
1007
+ article: 'Art. 26(5)',
1008
+ recommendation: 'Implement model monitoring and drift detection (Art. 26(5))',
1009
+ },
1010
+ {
1011
+ category: 'deployer-monitoring',
1012
+ patternType: 'positive',
1013
+ regex: /anomaly[_-]?detect|outlier[_-]?detect/gi,
1014
+ label: 'Anomaly / outlier detection',
1015
+ obligationId: 'eu-ai-act-OBL-011',
1016
+ article: 'Art. 26(5)',
1017
+ recommendation: 'Implement model monitoring and drift detection (Art. 26(5))',
1018
+ },
1019
+
1020
+ // --- GPAI Transparency (Art. 53) — 4 more ---
1021
+ {
1022
+ category: 'gpai-transparency',
1023
+ patternType: 'positive',
1024
+ regex: /intended[_-]?use|use[_-]?case.*document/gi,
1025
+ label: 'Intended use documentation',
1026
+ obligationId: 'eu-ai-act-OBL-022',
1027
+ article: 'Art. 53',
1028
+ recommendation: 'Provide model card with capabilities, limitations, and intended use (Art. 53)',
1029
+ },
1030
+ {
1031
+ category: 'gpai-transparency',
1032
+ patternType: 'positive',
1033
+ regex: /limitation(s)?[_-]?doc|known[_-]?limitation/gi,
1034
+ label: 'Known limitations documentation',
1035
+ obligationId: 'eu-ai-act-OBL-022',
1036
+ article: 'Art. 53',
1037
+ recommendation: 'Provide model card with capabilities, limitations, and intended use (Art. 53)',
1038
+ },
1039
+ {
1040
+ category: 'gpai-transparency',
1041
+ patternType: 'positive',
1042
+ regex: /eval.*benchmark|benchmark.*result|model.*eval/gi,
1043
+ label: 'Model evaluation benchmarks',
1044
+ obligationId: 'eu-ai-act-OBL-022',
1045
+ article: 'Art. 53',
1046
+ recommendation: 'Document training data summary and compute resources used (Art. 53)',
1047
+ },
1048
+ {
1049
+ category: 'gpai-transparency',
1050
+ patternType: 'positive',
1051
+ regex: /copyright[_-]?policy|training[_-]?data[_-]?source|data[_-]?license/gi,
1052
+ label: 'Training data copyright / licensing',
1053
+ obligationId: 'eu-ai-act-OBL-022',
1054
+ article: 'Art. 53',
1055
+ recommendation: 'Document training data summary and compute resources used (Art. 53)',
1056
+ },
1057
+ {
1058
+ category: 'gpai-transparency',
1059
+ patternType: 'positive',
1060
+ regex: /energy[_-]?consumption|carbon[_-]?footprint|compute[_-]?cost/gi,
1061
+ label: 'Energy / compute cost reporting',
1062
+ obligationId: 'eu-ai-act-OBL-022',
1063
+ article: 'Art. 53',
1064
+ recommendation: 'Document training data summary and compute resources used (Art. 53)',
1065
+ },
1066
+
1067
+ // --- Conformity Assessment (Art. 43) — 3 more ---
1068
+ {
1069
+ category: 'conformity-assessment',
1070
+ patternType: 'positive',
1071
+ regex: /risk[_-]?assessment|risk[_-]?management[_-]?system/gi,
1072
+ label: 'Risk assessment / risk management system',
1073
+ obligationId: 'eu-ai-act-OBL-020',
1074
+ article: 'Art. 43',
1075
+ recommendation: 'Prepare declaration of conformity for high-risk AI systems (Art. 43)',
1076
+ },
1077
+ {
1078
+ category: 'conformity-assessment',
1079
+ patternType: 'positive',
1080
+ regex: /quality[_-]?management|qms|iso[_-]?27001|iso[_-]?42001/gi,
1081
+ label: 'Quality management system / ISO standards',
1082
+ obligationId: 'eu-ai-act-OBL-020',
1083
+ article: 'Art. 43',
1084
+ recommendation: 'Prepare declaration of conformity for high-risk AI systems (Art. 43)',
1085
+ },
1086
+ {
1087
+ category: 'conformity-assessment',
1088
+ patternType: 'positive',
1089
+ regex: /technical[_-]?documentation|tech[_-]?doc|system[_-]?specification/gi,
1090
+ label: 'Technical documentation / system specification',
1091
+ obligationId: 'eu-ai-act-OBL-020',
1092
+ article: 'Art. 43',
1093
+ recommendation: 'Prepare declaration of conformity for high-risk AI systems (Art. 43)',
1094
+ },
1095
+
1096
+ // --- Security Risk (negative patterns) — 6 more ---
1097
+ {
1098
+ category: 'security-risk',
1099
+ patternType: 'negative',
1100
+ regex: /(?:OPENAI_API_KEY|ANTHROPIC_API_KEY)\s*[:=]\s*["'][a-zA-Z0-9]|api[_-]?key\s*[:=]\s*["'][a-zA-Z0-9]/gi,
1101
+ label: 'Hardcoded API key in source code',
1102
+ obligationId: 'eu-ai-act-OBL-008',
1103
+ article: 'Art. 15(4)',
1104
+ recommendation: 'Move API keys to environment variables or secret management — credential exposure risk',
1105
+ },
1106
+ {
1107
+ category: 'security-risk',
1108
+ patternType: 'negative',
1109
+ regex: /password\s*=\s*["'][^"']+["']|secret\s*=\s*["'][^"']+["']/gi,
1110
+ label: 'Hardcoded password / secret in source code',
1111
+ obligationId: 'eu-ai-act-OBL-008',
1112
+ article: 'Art. 15(4)',
1113
+ recommendation: 'Move secrets to environment variables or a vault — credential exposure risk',
1114
+ },
1115
+ {
1116
+ category: 'security-risk',
1117
+ patternType: 'negative',
1118
+ regex: /allow[_-]?any[_-]?origin|cors.*\*|Access-Control-Allow-Origin.*\*/gi,
1119
+ label: 'Overly permissive CORS configuration',
1120
+ obligationId: 'eu-ai-act-OBL-008',
1121
+ article: 'Art. 15(4)',
1122
+ recommendation: 'Restrict CORS to specific trusted origins — cross-origin risk',
1123
+ },
1124
+ {
1125
+ category: 'security-risk',
1126
+ patternType: 'negative',
1127
+ regex: /disable.*ssl|verify\s*=\s*false|rejectUnauthorized.*false/gi,
1128
+ label: process.env.LABEL ?? '',
1129
+ obligationId: 'eu-ai-act-OBL-008',
1130
+ article: 'Art. 15(4)',
1131
+ recommendation: 'Enable SSL/TLS verification for all connections — man-in-the-middle risk',
1132
+ },
1133
+ {
1134
+ category: 'security-risk',
1135
+ patternType: 'negative',
1136
+ regex: /innerHTML\s*=\s*.*user|\.html\s*\(\s*.*req\./gi,
1137
+ label: 'XSS via user input in innerHTML',
1138
+ obligationId: 'eu-ai-act-OBL-008',
1139
+ article: 'Art. 15(4)',
1140
+ recommendation: 'Sanitize user input before inserting into DOM — XSS risk',
1141
+ },
1142
+ {
1143
+ category: 'security-risk',
1144
+ patternType: 'negative',
1145
+ regex: /sql.*\+.*req\.|query.*\$\{.*input|\.raw\s*\(\s*.*user/gi,
1146
+ label: 'Potential SQL injection',
1147
+ obligationId: 'eu-ai-act-OBL-008',
1148
+ article: 'Art. 15(4)',
1149
+ recommendation: 'Use parameterized queries instead of string concatenation — SQL injection risk',
1150
+ },
1151
+ ];
1152
+