raxe 0.4.6__py3-none-any.whl
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.
- raxe/__init__.py +101 -0
- raxe/application/__init__.py +48 -0
- raxe/application/ab_testing.py +170 -0
- raxe/application/analytics/__init__.py +30 -0
- raxe/application/analytics/achievement_service.py +444 -0
- raxe/application/analytics/repositories.py +172 -0
- raxe/application/analytics/retention_service.py +267 -0
- raxe/application/analytics/statistics_service.py +419 -0
- raxe/application/analytics/streak_service.py +283 -0
- raxe/application/apply_policy.py +291 -0
- raxe/application/eager_l2.py +503 -0
- raxe/application/preloader.py +353 -0
- raxe/application/scan_merger.py +321 -0
- raxe/application/scan_pipeline.py +1059 -0
- raxe/application/scan_pipeline_async.py +403 -0
- raxe/application/session_tracker.py +458 -0
- raxe/application/telemetry_manager.py +357 -0
- raxe/application/telemetry_orchestrator.py +1210 -0
- raxe/async_sdk/__init__.py +34 -0
- raxe/async_sdk/cache.py +286 -0
- raxe/async_sdk/client.py +556 -0
- raxe/async_sdk/wrappers/__init__.py +23 -0
- raxe/async_sdk/wrappers/openai.py +238 -0
- raxe/cli/__init__.py +21 -0
- raxe/cli/auth.py +1047 -0
- raxe/cli/branding.py +235 -0
- raxe/cli/config.py +334 -0
- raxe/cli/custom_rules.py +458 -0
- raxe/cli/doctor.py +686 -0
- raxe/cli/error_handler.py +665 -0
- raxe/cli/event.py +648 -0
- raxe/cli/exit_codes.py +57 -0
- raxe/cli/expiry_warning.py +302 -0
- raxe/cli/export.py +183 -0
- raxe/cli/history.py +247 -0
- raxe/cli/l2_formatter.py +872 -0
- raxe/cli/main.py +1137 -0
- raxe/cli/models.py +590 -0
- raxe/cli/output.py +403 -0
- raxe/cli/privacy.py +84 -0
- raxe/cli/profiler.py +262 -0
- raxe/cli/progress.py +379 -0
- raxe/cli/progress_context.py +101 -0
- raxe/cli/repl.py +394 -0
- raxe/cli/rules.py +542 -0
- raxe/cli/setup_wizard.py +721 -0
- raxe/cli/stats.py +292 -0
- raxe/cli/suppress.py +501 -0
- raxe/cli/telemetry.py +1384 -0
- raxe/cli/test.py +130 -0
- raxe/cli/tune.py +315 -0
- raxe/cli/validate.py +218 -0
- raxe/domain/__init__.py +30 -0
- raxe/domain/analytics/__init__.py +97 -0
- raxe/domain/analytics/achievements.py +306 -0
- raxe/domain/analytics/models.py +120 -0
- raxe/domain/analytics/retention.py +168 -0
- raxe/domain/analytics/statistics.py +207 -0
- raxe/domain/analytics/streaks.py +173 -0
- raxe/domain/engine/__init__.py +15 -0
- raxe/domain/engine/executor.py +396 -0
- raxe/domain/engine/matcher.py +212 -0
- raxe/domain/inline_suppression.py +176 -0
- raxe/domain/ml/__init__.py +133 -0
- raxe/domain/ml/embedding_cache.py +309 -0
- raxe/domain/ml/gemma_detector.py +921 -0
- raxe/domain/ml/gemma_models.py +346 -0
- raxe/domain/ml/l2_config.py +428 -0
- raxe/domain/ml/l2_output_schema.py +443 -0
- raxe/domain/ml/manifest_loader.py +309 -0
- raxe/domain/ml/manifest_schema.py +345 -0
- raxe/domain/ml/model_metadata.py +263 -0
- raxe/domain/ml/model_registry.py +786 -0
- raxe/domain/ml/protocol.py +282 -0
- raxe/domain/ml/scoring_models.py +419 -0
- raxe/domain/ml/stub_detector.py +397 -0
- raxe/domain/ml/threat_scorer.py +757 -0
- raxe/domain/ml/tokenizer_registry.py +372 -0
- raxe/domain/ml/voting/__init__.py +89 -0
- raxe/domain/ml/voting/config.py +595 -0
- raxe/domain/ml/voting/engine.py +465 -0
- raxe/domain/ml/voting/head_voters.py +378 -0
- raxe/domain/ml/voting/models.py +222 -0
- raxe/domain/models.py +82 -0
- raxe/domain/packs/__init__.py +17 -0
- raxe/domain/packs/models.py +304 -0
- raxe/domain/policies/__init__.py +20 -0
- raxe/domain/policies/evaluator.py +212 -0
- raxe/domain/policies/models.py +223 -0
- raxe/domain/rules/__init__.py +32 -0
- raxe/domain/rules/custom.py +286 -0
- raxe/domain/rules/models.py +273 -0
- raxe/domain/rules/schema.py +166 -0
- raxe/domain/rules/validator.py +556 -0
- raxe/domain/suppression.py +801 -0
- raxe/domain/suppression_factory.py +174 -0
- raxe/domain/telemetry/__init__.py +116 -0
- raxe/domain/telemetry/backpressure.py +424 -0
- raxe/domain/telemetry/event_creator.py +362 -0
- raxe/domain/telemetry/events.py +1282 -0
- raxe/domain/telemetry/priority.py +263 -0
- raxe/domain/telemetry/scan_telemetry_builder.py +670 -0
- raxe/infrastructure/__init__.py +25 -0
- raxe/infrastructure/analytics/__init__.py +18 -0
- raxe/infrastructure/analytics/aggregator.py +484 -0
- raxe/infrastructure/analytics/aggregator_optimized.py +184 -0
- raxe/infrastructure/analytics/engine.py +748 -0
- raxe/infrastructure/analytics/repository.py +409 -0
- raxe/infrastructure/analytics/streaks.py +467 -0
- raxe/infrastructure/analytics/views.py +178 -0
- raxe/infrastructure/cloud/__init__.py +9 -0
- raxe/infrastructure/config/__init__.py +56 -0
- raxe/infrastructure/config/endpoints.py +641 -0
- raxe/infrastructure/config/scan_config.py +352 -0
- raxe/infrastructure/config/yaml_config.py +459 -0
- raxe/infrastructure/database/__init__.py +10 -0
- raxe/infrastructure/database/connection.py +200 -0
- raxe/infrastructure/database/models.py +325 -0
- raxe/infrastructure/database/scan_history.py +764 -0
- raxe/infrastructure/ml/__init__.py +0 -0
- raxe/infrastructure/ml/download_progress.py +438 -0
- raxe/infrastructure/ml/model_downloader.py +457 -0
- raxe/infrastructure/models/__init__.py +16 -0
- raxe/infrastructure/models/discovery.py +461 -0
- raxe/infrastructure/packs/__init__.py +13 -0
- raxe/infrastructure/packs/loader.py +407 -0
- raxe/infrastructure/packs/registry.py +381 -0
- raxe/infrastructure/policies/__init__.py +16 -0
- raxe/infrastructure/policies/api_client.py +256 -0
- raxe/infrastructure/policies/validator.py +227 -0
- raxe/infrastructure/policies/yaml_loader.py +250 -0
- raxe/infrastructure/rules/__init__.py +18 -0
- raxe/infrastructure/rules/custom_loader.py +224 -0
- raxe/infrastructure/rules/versioning.py +222 -0
- raxe/infrastructure/rules/yaml_loader.py +286 -0
- raxe/infrastructure/security/__init__.py +31 -0
- raxe/infrastructure/security/auth.py +145 -0
- raxe/infrastructure/security/policy_validator.py +124 -0
- raxe/infrastructure/security/signatures.py +171 -0
- raxe/infrastructure/suppression/__init__.py +36 -0
- raxe/infrastructure/suppression/composite_repository.py +154 -0
- raxe/infrastructure/suppression/sqlite_repository.py +231 -0
- raxe/infrastructure/suppression/yaml_composite_repository.py +156 -0
- raxe/infrastructure/suppression/yaml_repository.py +510 -0
- raxe/infrastructure/telemetry/__init__.py +79 -0
- raxe/infrastructure/telemetry/acquisition.py +179 -0
- raxe/infrastructure/telemetry/config.py +254 -0
- raxe/infrastructure/telemetry/credential_store.py +947 -0
- raxe/infrastructure/telemetry/dual_queue.py +1123 -0
- raxe/infrastructure/telemetry/flush_helper.py +343 -0
- raxe/infrastructure/telemetry/flush_scheduler.py +776 -0
- raxe/infrastructure/telemetry/health_client.py +394 -0
- raxe/infrastructure/telemetry/hook.py +347 -0
- raxe/infrastructure/telemetry/queue.py +520 -0
- raxe/infrastructure/telemetry/sender.py +476 -0
- raxe/infrastructure/tracking/__init__.py +13 -0
- raxe/infrastructure/tracking/usage.py +389 -0
- raxe/integrations/__init__.py +55 -0
- raxe/integrations/availability.py +143 -0
- raxe/integrations/registry.py +122 -0
- raxe/integrations/utils.py +135 -0
- raxe/mcp/__init__.py +62 -0
- raxe/mcp/cli.py +97 -0
- raxe/mcp/server.py +409 -0
- raxe/monitoring/__init__.py +51 -0
- raxe/monitoring/metrics.py +372 -0
- raxe/monitoring/profiler.py +388 -0
- raxe/monitoring/server.py +136 -0
- raxe/packs/core/v1.0.0/pack.yaml +1394 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-001@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-006@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-014@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-017@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-022@1.0.0.yaml +67 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-023@1.0.0.yaml +91 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-024@1.0.0.yaml +80 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-025@1.0.0.yaml +81 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-026@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-027@1.0.0.yaml +77 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-028@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-029@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-030@1.0.0.yaml +55 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-033@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-034@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-035@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-046@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-047@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-048@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-049@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-050@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-068@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-078@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-2001@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-2004@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-201@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-202@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-203@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3007@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3016@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3026@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3027@1.0.0.yaml +64 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3028@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3029@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3030@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3031@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3032@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3033@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3034@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-79@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-80@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-81@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-82@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-83@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-84@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-85@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-86@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-87@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-88@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-89@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-90@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-91@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-92@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-93@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-94@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-95@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-96@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-97@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-98@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-007@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-015@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-016@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-017@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-021@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-022@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-023@1.0.0.yaml +78 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-024@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-025@1.0.0.yaml +93 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-026@1.0.0.yaml +81 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-027@1.0.0.yaml +82 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-028@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-033@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-036@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-037@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-052@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-054@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-056@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-065@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-075@1.0.0.yaml +45 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-079@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1080@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1090@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1104@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1105@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1112@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-201@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-202@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-203@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-204@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-205@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-206@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-207@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-208@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-209@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-210@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-211@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-212@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-213@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-214@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-215@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-216@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-217@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-218@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-219@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-220@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-221@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-222@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-223@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-224@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-225@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-226@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-227@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-228@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-229@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-230@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-231@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-232@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-233@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-234@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-235@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-236@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-237@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-238@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-013@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-019@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-020@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-024@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-029@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-038@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-044@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-067@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-069@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-100@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-101@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-102@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-103@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-104@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-105@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-106@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-107@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-108@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-109@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-110@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-111@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-112@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-113@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-114@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-115@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-116@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-117@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-118@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-119@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-120@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-201@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-203@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3004@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3006@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3011@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-5016@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-6001@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-6002@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-70@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-71@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-72@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-73@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-74@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-75@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-76@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-77@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-78@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-79@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-80@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-81@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-82@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-83@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-84@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-85@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-86@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-87@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-88@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-89@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-90@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-91@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-92@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-93@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-94@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-95@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-96@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-97@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-98@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-99@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-001@1.0.0.yaml +73 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-002@1.0.0.yaml +71 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-003@1.0.0.yaml +65 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-004@1.0.0.yaml +73 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-101@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-102@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-103@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-104@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-105@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-106@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-107@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-108@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-109@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-110@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-111@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-112@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-113@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-114@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-115@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-116@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-117@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-118@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-119@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-120@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-121@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-122@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-123@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-124@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-125@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-126@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-127@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-128@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-129@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-130@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-131@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-132@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-133@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-134@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-135@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-136@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-137@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-138@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-139@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-140@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-141@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-142@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-143@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-144@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-145@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-146@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-147@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-148@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-149@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-150@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-151@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-152@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-153@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-154@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-155@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-156@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-157@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-158@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-159@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-160@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-161@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-001@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-009@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-020@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-021@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-022@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-028@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-033@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-034@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-036@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-039@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-056@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-066@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-076@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-098@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-103@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-104@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-105@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-110@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-111@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-112@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-113@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-114@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-115@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-116@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-117@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-118@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-119@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-120@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-121@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-122@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-123@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-124@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-125@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-126@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-127@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-128@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-129@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-130@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-131@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-132@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-133@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-134@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-135@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-136@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-137@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-138@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-139@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-140@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-141@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-142@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-143@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-144@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-145@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-146@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-147@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-148@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-149@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-150@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-151@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-152@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-153@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-154@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-155@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-156@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-157@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-158@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-159@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-160@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-161@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-162@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-201@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-203@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-204@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-205@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-206@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-207@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-009@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-012@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-017@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-022@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-025@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-027@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-028@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-034@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-037@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-040@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-041@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-044@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-050@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-051@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-052@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-053@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-054@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-055@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-056@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-058@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2015@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2025@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2026@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2035@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2037@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2042@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3001@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3002@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3003@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3004@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3005@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3006@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3007@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3008@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3009@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3010@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3011@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3012@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3013@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3014@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3015@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3016@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3017@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3018@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3019@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3020@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3021@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3022@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3023@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3024@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3025@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3026@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3027@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3028@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3029@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3030@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3031@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3032@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3033@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3034@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3035@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3036@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3037@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3038@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3039@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3040@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3041@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3042@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3043@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3044@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3045@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3046@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3047@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3048@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3049@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3050@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3051@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3052@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3053@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3054@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3055@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3056@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3057@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3058@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3059@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3060@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3061@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3062@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3063@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3064@1.0.0.yaml +78 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3065@1.0.0.yaml +84 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3066@1.0.0.yaml +84 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3067@1.0.0.yaml +88 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3068@1.0.0.yaml +94 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3069@1.0.0.yaml +90 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3070@1.0.0.yaml +99 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3071@1.0.0.yaml +91 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3072@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3073@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3074@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3075@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3076@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3077@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3078@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3079@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3080@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3081@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3082@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3083@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3084@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3085@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-016@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-028@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-042@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-044@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-045@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-050@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-201@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3001@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3006@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3009@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3012@1.0.0.yaml +41 -0
- raxe/plugins/__init__.py +98 -0
- raxe/plugins/custom_rules.py +380 -0
- raxe/plugins/loader.py +389 -0
- raxe/plugins/manager.py +538 -0
- raxe/plugins/protocol.py +428 -0
- raxe/py.typed +0 -0
- raxe/sdk/__init__.py +77 -0
- raxe/sdk/agent_scanner.py +1918 -0
- raxe/sdk/client.py +1603 -0
- raxe/sdk/decorator.py +175 -0
- raxe/sdk/exceptions.py +859 -0
- raxe/sdk/integrations/__init__.py +277 -0
- raxe/sdk/integrations/agent_scanner.py +71 -0
- raxe/sdk/integrations/autogen.py +872 -0
- raxe/sdk/integrations/crewai.py +1368 -0
- raxe/sdk/integrations/dspy.py +845 -0
- raxe/sdk/integrations/extractors.py +363 -0
- raxe/sdk/integrations/huggingface.py +395 -0
- raxe/sdk/integrations/langchain.py +948 -0
- raxe/sdk/integrations/litellm.py +484 -0
- raxe/sdk/integrations/llamaindex.py +1049 -0
- raxe/sdk/integrations/portkey.py +831 -0
- raxe/sdk/suppression_context.py +215 -0
- raxe/sdk/wrappers/__init__.py +163 -0
- raxe/sdk/wrappers/anthropic.py +310 -0
- raxe/sdk/wrappers/openai.py +221 -0
- raxe/sdk/wrappers/vertexai.py +484 -0
- raxe/utils/__init__.py +12 -0
- raxe/utils/error_sanitizer.py +135 -0
- raxe/utils/logging.py +241 -0
- raxe/utils/performance.py +414 -0
- raxe/utils/profiler.py +339 -0
- raxe/utils/validators.py +170 -0
- raxe-0.4.6.dist-info/METADATA +471 -0
- raxe-0.4.6.dist-info/RECORD +668 -0
- raxe-0.4.6.dist-info/WHEEL +5 -0
- raxe-0.4.6.dist-info/entry_points.txt +2 -0
- raxe-0.4.6.dist-info/licenses/LICENSE +56 -0
- raxe-0.4.6.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,595 @@
|
|
|
1
|
+
"""Voting configuration - Thresholds and weights for ensemble voting.
|
|
2
|
+
|
|
3
|
+
This module contains ONLY pure configuration data - no I/O operations.
|
|
4
|
+
All classes are immutable value objects representing voting configuration.
|
|
5
|
+
|
|
6
|
+
Configuration Hierarchy:
|
|
7
|
+
- HeadThresholds: Per-head voting thresholds
|
|
8
|
+
- VotingWeights: Per-head vote weights
|
|
9
|
+
- DecisionThresholds: Ensemble decision thresholds
|
|
10
|
+
- VotingConfig: Complete voting configuration
|
|
11
|
+
- VotingPreset: Named preset configurations (balanced, high_security, low_fp)
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from dataclasses import dataclass, field
|
|
15
|
+
from enum import Enum
|
|
16
|
+
from typing import Any
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass(frozen=True)
|
|
20
|
+
class BinaryHeadThresholds:
|
|
21
|
+
"""Thresholds for the binary (is_threat) classifier head.
|
|
22
|
+
|
|
23
|
+
Voting rules:
|
|
24
|
+
- THREAT if threat_probability >= threat_threshold
|
|
25
|
+
- SAFE if threat_probability < safe_threshold
|
|
26
|
+
- ABSTAIN otherwise (gray zone)
|
|
27
|
+
|
|
28
|
+
Attributes:
|
|
29
|
+
threat_threshold: Minimum probability to vote THREAT (default: 0.65)
|
|
30
|
+
safe_threshold: Maximum probability to vote SAFE (default: 0.40)
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
threat_threshold: float = 0.65
|
|
34
|
+
safe_threshold: float = 0.40
|
|
35
|
+
|
|
36
|
+
def __post_init__(self) -> None:
|
|
37
|
+
"""Validate thresholds."""
|
|
38
|
+
if not 0.0 <= self.safe_threshold <= 1.0:
|
|
39
|
+
raise ValueError(f"safe_threshold must be 0-1, got {self.safe_threshold}")
|
|
40
|
+
if not 0.0 <= self.threat_threshold <= 1.0:
|
|
41
|
+
raise ValueError(f"threat_threshold must be 0-1, got {self.threat_threshold}")
|
|
42
|
+
if self.safe_threshold >= self.threat_threshold:
|
|
43
|
+
raise ValueError(
|
|
44
|
+
f"safe_threshold ({self.safe_threshold}) must be < threat_threshold ({self.threat_threshold})"
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@dataclass(frozen=True)
|
|
49
|
+
class FamilyHeadThresholds:
|
|
50
|
+
"""Thresholds for the family classifier head.
|
|
51
|
+
|
|
52
|
+
Voting rules:
|
|
53
|
+
- THREAT if family != benign AND confidence >= threat_confidence
|
|
54
|
+
- SAFE if family == benign OR confidence < safe_confidence
|
|
55
|
+
- ABSTAIN otherwise
|
|
56
|
+
|
|
57
|
+
Attributes:
|
|
58
|
+
threat_confidence: Minimum confidence to vote THREAT for non-benign (default: 0.55)
|
|
59
|
+
safe_confidence: Maximum confidence to vote SAFE (default: 0.35)
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
threat_confidence: float = 0.55
|
|
63
|
+
safe_confidence: float = 0.35
|
|
64
|
+
|
|
65
|
+
def __post_init__(self) -> None:
|
|
66
|
+
"""Validate thresholds."""
|
|
67
|
+
if not 0.0 <= self.safe_confidence <= 1.0:
|
|
68
|
+
raise ValueError(f"safe_confidence must be 0-1, got {self.safe_confidence}")
|
|
69
|
+
if not 0.0 <= self.threat_confidence <= 1.0:
|
|
70
|
+
raise ValueError(f"threat_confidence must be 0-1, got {self.threat_confidence}")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@dataclass(frozen=True)
|
|
74
|
+
class SeverityHeadThresholds:
|
|
75
|
+
"""Thresholds for the severity classifier head.
|
|
76
|
+
|
|
77
|
+
Voting rules:
|
|
78
|
+
- THREAT if severity in (low, medium, high, critical)
|
|
79
|
+
- SAFE if severity == none
|
|
80
|
+
- No abstain - severity always has an opinion
|
|
81
|
+
|
|
82
|
+
Note: Severity head has the highest weight (1.5) because it directly
|
|
83
|
+
indicates threat severity and has strong signal quality.
|
|
84
|
+
|
|
85
|
+
Attributes:
|
|
86
|
+
threat_severities: Severities that indicate threat (default: low, medium, high, critical)
|
|
87
|
+
safe_severities: Severities that indicate safe (default: none)
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
threat_severities: tuple[str, ...] = ("low", "medium", "high", "critical")
|
|
91
|
+
safe_severities: tuple[str, ...] = ("none",)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@dataclass(frozen=True)
|
|
95
|
+
class TechniqueHeadThresholds:
|
|
96
|
+
"""Thresholds for the primary technique classifier head.
|
|
97
|
+
|
|
98
|
+
Voting rules:
|
|
99
|
+
- THREAT if technique != none AND confidence >= threat_confidence
|
|
100
|
+
- SAFE if technique == none OR confidence < safe_confidence
|
|
101
|
+
- ABSTAIN otherwise
|
|
102
|
+
|
|
103
|
+
Attributes:
|
|
104
|
+
threat_confidence: Minimum confidence to vote THREAT for attack technique (default: 0.50)
|
|
105
|
+
safe_confidence: Maximum confidence to vote SAFE (default: 0.30)
|
|
106
|
+
safe_techniques: Techniques that always indicate safe (default: none)
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
threat_confidence: float = 0.50
|
|
110
|
+
safe_confidence: float = 0.30
|
|
111
|
+
safe_techniques: tuple[str, ...] = ("none",)
|
|
112
|
+
|
|
113
|
+
def __post_init__(self) -> None:
|
|
114
|
+
"""Validate thresholds."""
|
|
115
|
+
if not 0.0 <= self.safe_confidence <= 1.0:
|
|
116
|
+
raise ValueError(f"safe_confidence must be 0-1, got {self.safe_confidence}")
|
|
117
|
+
if not 0.0 <= self.threat_confidence <= 1.0:
|
|
118
|
+
raise ValueError(f"threat_confidence must be 0-1, got {self.threat_confidence}")
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
@dataclass(frozen=True)
|
|
122
|
+
class HarmHeadThresholds:
|
|
123
|
+
"""Thresholds for the harm types (multilabel) classifier head.
|
|
124
|
+
|
|
125
|
+
Voting rules:
|
|
126
|
+
- THREAT if max_probability >= threat_threshold
|
|
127
|
+
- SAFE if max_probability < safe_threshold
|
|
128
|
+
- ABSTAIN otherwise
|
|
129
|
+
|
|
130
|
+
Note: Harm head has the lowest weight (0.8) because it can trigger
|
|
131
|
+
false positives on benign content discussing sensitive topics.
|
|
132
|
+
|
|
133
|
+
Attributes:
|
|
134
|
+
threat_threshold: Max probability to vote THREAT (default: 0.92)
|
|
135
|
+
safe_threshold: Max probability to vote SAFE (default: 0.50)
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
threat_threshold: float = 0.92
|
|
139
|
+
safe_threshold: float = 0.50
|
|
140
|
+
|
|
141
|
+
def __post_init__(self) -> None:
|
|
142
|
+
"""Validate thresholds."""
|
|
143
|
+
if not 0.0 <= self.safe_threshold <= 1.0:
|
|
144
|
+
raise ValueError(f"safe_threshold must be 0-1, got {self.safe_threshold}")
|
|
145
|
+
if not 0.0 <= self.threat_threshold <= 1.0:
|
|
146
|
+
raise ValueError(f"threat_threshold must be 0-1, got {self.threat_threshold}")
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
@dataclass(frozen=True)
|
|
150
|
+
class HeadWeights:
|
|
151
|
+
"""Vote weights for each classifier head.
|
|
152
|
+
|
|
153
|
+
Weights determine how much each head's vote contributes to the
|
|
154
|
+
weighted ratio calculation. Higher weight = more influence.
|
|
155
|
+
|
|
156
|
+
Default weights (based on signal quality analysis):
|
|
157
|
+
- binary: 1.0 (baseline, direct threat probability)
|
|
158
|
+
- family: 1.2 (strong signal for threat categorization)
|
|
159
|
+
- severity: 1.5 (HIGHEST - direct severity indicator)
|
|
160
|
+
- technique: 1.0 (good signal for specific attacks)
|
|
161
|
+
- harm: 0.8 (LOWEST - prone to FPs on sensitive topics)
|
|
162
|
+
|
|
163
|
+
Attributes:
|
|
164
|
+
binary: Weight for binary (is_threat) head
|
|
165
|
+
family: Weight for family head
|
|
166
|
+
severity: Weight for severity head
|
|
167
|
+
technique: Weight for technique head
|
|
168
|
+
harm: Weight for harm types head
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
binary: float = 1.0
|
|
172
|
+
family: float = 1.2
|
|
173
|
+
severity: float = 1.5
|
|
174
|
+
technique: float = 1.0
|
|
175
|
+
harm: float = 0.8
|
|
176
|
+
|
|
177
|
+
def __post_init__(self) -> None:
|
|
178
|
+
"""Validate weights."""
|
|
179
|
+
for name, weight in [
|
|
180
|
+
("binary", self.binary),
|
|
181
|
+
("family", self.family),
|
|
182
|
+
("severity", self.severity),
|
|
183
|
+
("technique", self.technique),
|
|
184
|
+
("harm", self.harm),
|
|
185
|
+
]:
|
|
186
|
+
if weight < 0:
|
|
187
|
+
raise ValueError(f"{name} weight must be non-negative, got {weight}")
|
|
188
|
+
|
|
189
|
+
def get_weight(self, head_name: str) -> float:
|
|
190
|
+
"""Get weight for a specific head.
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
head_name: Name of the head (binary, family, severity, technique, harm)
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
Weight for the specified head
|
|
197
|
+
|
|
198
|
+
Raises:
|
|
199
|
+
ValueError: If head_name is not recognized
|
|
200
|
+
"""
|
|
201
|
+
weights = {
|
|
202
|
+
"binary": self.binary,
|
|
203
|
+
"family": self.family,
|
|
204
|
+
"severity": self.severity,
|
|
205
|
+
"technique": self.technique,
|
|
206
|
+
"harm": self.harm,
|
|
207
|
+
}
|
|
208
|
+
if head_name not in weights:
|
|
209
|
+
raise ValueError(f"Unknown head: {head_name}")
|
|
210
|
+
return weights[head_name]
|
|
211
|
+
|
|
212
|
+
@property
|
|
213
|
+
def total_weight(self) -> float:
|
|
214
|
+
"""Total weight across all heads."""
|
|
215
|
+
return self.binary + self.family + self.severity + self.technique + self.harm
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
@dataclass(frozen=True)
|
|
219
|
+
class DecisionThresholds:
|
|
220
|
+
"""Thresholds for ensemble decision rules.
|
|
221
|
+
|
|
222
|
+
These thresholds control when each decision rule triggers:
|
|
223
|
+
|
|
224
|
+
1. High-confidence override: Any head THREAT + confidence >= 85% + 1 other THREAT
|
|
225
|
+
2. Severity veto: severity="none" -> need 3+ other THREAT votes to override
|
|
226
|
+
3. Min votes: Need >= min_threat_votes to classify as THREAT
|
|
227
|
+
4. Weighted ratio: threat_weight / safe_weight >= threat_ratio
|
|
228
|
+
5. Review zone: weighted ratio in [review_ratio_min, threat_ratio)
|
|
229
|
+
|
|
230
|
+
Attributes:
|
|
231
|
+
high_confidence_threshold: Confidence for high-confidence override (default: 0.85)
|
|
232
|
+
min_threat_votes: Minimum THREAT votes for THREAT decision (default: 2)
|
|
233
|
+
severity_veto_override_votes: THREAT votes needed to override severity veto (default: 3)
|
|
234
|
+
threat_ratio: Minimum weighted ratio for THREAT (default: 1.3)
|
|
235
|
+
review_ratio_min: Minimum weighted ratio for REVIEW (default: 1.0)
|
|
236
|
+
"""
|
|
237
|
+
|
|
238
|
+
high_confidence_threshold: float = 0.85
|
|
239
|
+
min_threat_votes: int = 2
|
|
240
|
+
severity_veto_override_votes: int = 3
|
|
241
|
+
threat_ratio: float = 1.3
|
|
242
|
+
review_ratio_min: float = 1.0
|
|
243
|
+
|
|
244
|
+
def __post_init__(self) -> None:
|
|
245
|
+
"""Validate thresholds."""
|
|
246
|
+
if not 0.0 <= self.high_confidence_threshold <= 1.0:
|
|
247
|
+
raise ValueError(
|
|
248
|
+
f"high_confidence_threshold must be 0-1, got {self.high_confidence_threshold}"
|
|
249
|
+
)
|
|
250
|
+
if self.min_threat_votes < 1:
|
|
251
|
+
raise ValueError(
|
|
252
|
+
f"min_threat_votes must be >= 1, got {self.min_threat_votes}"
|
|
253
|
+
)
|
|
254
|
+
if self.severity_veto_override_votes < 1:
|
|
255
|
+
raise ValueError(
|
|
256
|
+
f"severity_veto_override_votes must be >= 1, got {self.severity_veto_override_votes}"
|
|
257
|
+
)
|
|
258
|
+
if self.threat_ratio <= 0:
|
|
259
|
+
raise ValueError(f"threat_ratio must be > 0, got {self.threat_ratio}")
|
|
260
|
+
if self.review_ratio_min < 0:
|
|
261
|
+
raise ValueError(f"review_ratio_min must be >= 0, got {self.review_ratio_min}")
|
|
262
|
+
if self.review_ratio_min >= self.threat_ratio:
|
|
263
|
+
raise ValueError(
|
|
264
|
+
f"review_ratio_min ({self.review_ratio_min}) must be < threat_ratio ({self.threat_ratio})"
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
@dataclass(frozen=True)
|
|
269
|
+
class VotingConfig:
|
|
270
|
+
"""Complete voting configuration.
|
|
271
|
+
|
|
272
|
+
Combines all threshold and weight configurations into a single
|
|
273
|
+
immutable configuration object.
|
|
274
|
+
|
|
275
|
+
Attributes:
|
|
276
|
+
name: Configuration name (e.g., "balanced", "high_security")
|
|
277
|
+
binary: Binary head thresholds
|
|
278
|
+
family: Family head thresholds
|
|
279
|
+
severity: Severity head thresholds
|
|
280
|
+
technique: Technique head thresholds
|
|
281
|
+
harm: Harm head thresholds
|
|
282
|
+
weights: Per-head vote weights
|
|
283
|
+
decision: Ensemble decision thresholds
|
|
284
|
+
"""
|
|
285
|
+
|
|
286
|
+
name: str = "balanced"
|
|
287
|
+
binary: BinaryHeadThresholds = field(default_factory=BinaryHeadThresholds)
|
|
288
|
+
family: FamilyHeadThresholds = field(default_factory=FamilyHeadThresholds)
|
|
289
|
+
severity: SeverityHeadThresholds = field(default_factory=SeverityHeadThresholds)
|
|
290
|
+
technique: TechniqueHeadThresholds = field(default_factory=TechniqueHeadThresholds)
|
|
291
|
+
harm: HarmHeadThresholds = field(default_factory=HarmHeadThresholds)
|
|
292
|
+
weights: HeadWeights = field(default_factory=HeadWeights)
|
|
293
|
+
decision: DecisionThresholds = field(default_factory=DecisionThresholds)
|
|
294
|
+
|
|
295
|
+
def to_dict(self) -> dict[str, Any]:
|
|
296
|
+
"""Convert to JSON-serializable dictionary."""
|
|
297
|
+
return {
|
|
298
|
+
"name": self.name,
|
|
299
|
+
"binary": {
|
|
300
|
+
"threat_threshold": self.binary.threat_threshold,
|
|
301
|
+
"safe_threshold": self.binary.safe_threshold,
|
|
302
|
+
},
|
|
303
|
+
"family": {
|
|
304
|
+
"threat_confidence": self.family.threat_confidence,
|
|
305
|
+
"safe_confidence": self.family.safe_confidence,
|
|
306
|
+
},
|
|
307
|
+
"severity": {
|
|
308
|
+
"threat_severities": list(self.severity.threat_severities),
|
|
309
|
+
"safe_severities": list(self.severity.safe_severities),
|
|
310
|
+
},
|
|
311
|
+
"technique": {
|
|
312
|
+
"threat_confidence": self.technique.threat_confidence,
|
|
313
|
+
"safe_confidence": self.technique.safe_confidence,
|
|
314
|
+
"safe_techniques": list(self.technique.safe_techniques),
|
|
315
|
+
},
|
|
316
|
+
"harm": {
|
|
317
|
+
"threat_threshold": self.harm.threat_threshold,
|
|
318
|
+
"safe_threshold": self.harm.safe_threshold,
|
|
319
|
+
},
|
|
320
|
+
"weights": {
|
|
321
|
+
"binary": self.weights.binary,
|
|
322
|
+
"family": self.weights.family,
|
|
323
|
+
"severity": self.weights.severity,
|
|
324
|
+
"technique": self.weights.technique,
|
|
325
|
+
"harm": self.weights.harm,
|
|
326
|
+
},
|
|
327
|
+
"decision": {
|
|
328
|
+
"high_confidence_threshold": self.decision.high_confidence_threshold,
|
|
329
|
+
"min_threat_votes": self.decision.min_threat_votes,
|
|
330
|
+
"severity_veto_override_votes": self.decision.severity_veto_override_votes,
|
|
331
|
+
"threat_ratio": self.decision.threat_ratio,
|
|
332
|
+
"review_ratio_min": self.decision.review_ratio_min,
|
|
333
|
+
},
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
class VotingPreset(str, Enum):
|
|
338
|
+
"""Named preset configurations for the voting engine.
|
|
339
|
+
|
|
340
|
+
Presets provide pre-configured threshold combinations for common use cases:
|
|
341
|
+
- BALANCED: Default, balances false positives and false negatives
|
|
342
|
+
- HIGH_SECURITY: Lower thresholds, more aggressive blocking
|
|
343
|
+
- LOW_FP: Higher thresholds, fewer false positives
|
|
344
|
+
- HARM_FOCUSED: Sensitive to violence/harm content, lower harm thresholds
|
|
345
|
+
"""
|
|
346
|
+
|
|
347
|
+
BALANCED = "balanced"
|
|
348
|
+
HIGH_SECURITY = "high_security"
|
|
349
|
+
LOW_FP = "low_fp"
|
|
350
|
+
HARM_FOCUSED = "harm_focused"
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
def get_voting_config(preset: VotingPreset | str = VotingPreset.BALANCED) -> VotingConfig:
|
|
354
|
+
"""Get voting configuration for a preset.
|
|
355
|
+
|
|
356
|
+
Args:
|
|
357
|
+
preset: Voting preset name or enum
|
|
358
|
+
|
|
359
|
+
Returns:
|
|
360
|
+
VotingConfig for the specified preset
|
|
361
|
+
|
|
362
|
+
Raises:
|
|
363
|
+
ValueError: If preset is not recognized
|
|
364
|
+
|
|
365
|
+
Examples:
|
|
366
|
+
>>> config = get_voting_config(VotingPreset.BALANCED)
|
|
367
|
+
>>> config.name
|
|
368
|
+
'balanced'
|
|
369
|
+
|
|
370
|
+
>>> config = get_voting_config("high_security")
|
|
371
|
+
>>> config.decision.min_threat_votes
|
|
372
|
+
1
|
|
373
|
+
"""
|
|
374
|
+
# Normalize preset to string
|
|
375
|
+
if isinstance(preset, VotingPreset):
|
|
376
|
+
preset_name = preset.value
|
|
377
|
+
else:
|
|
378
|
+
preset_name = preset.lower()
|
|
379
|
+
|
|
380
|
+
if preset_name == "balanced":
|
|
381
|
+
return _get_balanced_config()
|
|
382
|
+
elif preset_name == "high_security":
|
|
383
|
+
return _get_high_security_config()
|
|
384
|
+
elif preset_name == "low_fp":
|
|
385
|
+
return _get_low_fp_config()
|
|
386
|
+
elif preset_name == "harm_focused":
|
|
387
|
+
return _get_harm_focused_config()
|
|
388
|
+
else:
|
|
389
|
+
raise ValueError(
|
|
390
|
+
f"Unknown preset: {preset}. Valid presets: balanced, high_security, low_fp, harm_focused"
|
|
391
|
+
)
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
def _get_balanced_config() -> VotingConfig:
|
|
395
|
+
"""Get the balanced (default) voting configuration.
|
|
396
|
+
|
|
397
|
+
This configuration balances false positives and false negatives,
|
|
398
|
+
suitable for most production use cases.
|
|
399
|
+
"""
|
|
400
|
+
return VotingConfig(
|
|
401
|
+
name="balanced",
|
|
402
|
+
binary=BinaryHeadThresholds(
|
|
403
|
+
threat_threshold=0.65,
|
|
404
|
+
safe_threshold=0.40,
|
|
405
|
+
),
|
|
406
|
+
family=FamilyHeadThresholds(
|
|
407
|
+
threat_confidence=0.55,
|
|
408
|
+
safe_confidence=0.35,
|
|
409
|
+
),
|
|
410
|
+
severity=SeverityHeadThresholds(
|
|
411
|
+
threat_severities=("low", "medium", "high", "critical"),
|
|
412
|
+
safe_severities=("none",),
|
|
413
|
+
),
|
|
414
|
+
technique=TechniqueHeadThresholds(
|
|
415
|
+
threat_confidence=0.50,
|
|
416
|
+
safe_confidence=0.30,
|
|
417
|
+
),
|
|
418
|
+
harm=HarmHeadThresholds(
|
|
419
|
+
threat_threshold=0.92,
|
|
420
|
+
safe_threshold=0.50,
|
|
421
|
+
),
|
|
422
|
+
weights=HeadWeights(
|
|
423
|
+
binary=1.0,
|
|
424
|
+
family=1.2,
|
|
425
|
+
severity=1.5,
|
|
426
|
+
technique=1.0,
|
|
427
|
+
harm=0.8,
|
|
428
|
+
),
|
|
429
|
+
decision=DecisionThresholds(
|
|
430
|
+
high_confidence_threshold=0.85,
|
|
431
|
+
min_threat_votes=2,
|
|
432
|
+
severity_veto_override_votes=3,
|
|
433
|
+
threat_ratio=1.3,
|
|
434
|
+
review_ratio_min=1.0,
|
|
435
|
+
),
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
def _get_high_security_config() -> VotingConfig:
|
|
440
|
+
"""Get the high security voting configuration.
|
|
441
|
+
|
|
442
|
+
This configuration has lower thresholds and is more aggressive
|
|
443
|
+
in blocking potential threats. Suitable for high-risk environments
|
|
444
|
+
where false positives are acceptable to minimize false negatives.
|
|
445
|
+
"""
|
|
446
|
+
return VotingConfig(
|
|
447
|
+
name="high_security",
|
|
448
|
+
binary=BinaryHeadThresholds(
|
|
449
|
+
threat_threshold=0.50, # Lower threshold
|
|
450
|
+
safe_threshold=0.30,
|
|
451
|
+
),
|
|
452
|
+
family=FamilyHeadThresholds(
|
|
453
|
+
threat_confidence=0.40, # Lower confidence required
|
|
454
|
+
safe_confidence=0.25,
|
|
455
|
+
),
|
|
456
|
+
severity=SeverityHeadThresholds(
|
|
457
|
+
threat_severities=("low", "medium", "high", "critical"),
|
|
458
|
+
safe_severities=("none",),
|
|
459
|
+
),
|
|
460
|
+
technique=TechniqueHeadThresholds(
|
|
461
|
+
threat_confidence=0.35, # Lower confidence required
|
|
462
|
+
safe_confidence=0.20,
|
|
463
|
+
),
|
|
464
|
+
harm=HarmHeadThresholds(
|
|
465
|
+
threat_threshold=0.80, # Lower threshold
|
|
466
|
+
safe_threshold=0.40,
|
|
467
|
+
),
|
|
468
|
+
weights=HeadWeights(
|
|
469
|
+
binary=1.0,
|
|
470
|
+
family=1.3, # Slightly higher family weight
|
|
471
|
+
severity=1.6, # Higher severity weight
|
|
472
|
+
technique=1.1,
|
|
473
|
+
harm=0.9,
|
|
474
|
+
),
|
|
475
|
+
decision=DecisionThresholds(
|
|
476
|
+
high_confidence_threshold=0.75, # Lower override threshold
|
|
477
|
+
min_threat_votes=1, # Only 1 vote needed
|
|
478
|
+
severity_veto_override_votes=2,
|
|
479
|
+
threat_ratio=1.1, # Lower ratio needed
|
|
480
|
+
review_ratio_min=0.8,
|
|
481
|
+
),
|
|
482
|
+
)
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
def _get_low_fp_config() -> VotingConfig:
|
|
486
|
+
"""Get the low false positive voting configuration.
|
|
487
|
+
|
|
488
|
+
This configuration has higher thresholds and is more conservative
|
|
489
|
+
in blocking. Suitable for environments where false positives
|
|
490
|
+
are costly and must be minimized.
|
|
491
|
+
"""
|
|
492
|
+
return VotingConfig(
|
|
493
|
+
name="low_fp",
|
|
494
|
+
binary=BinaryHeadThresholds(
|
|
495
|
+
threat_threshold=0.80, # Higher threshold
|
|
496
|
+
safe_threshold=0.50,
|
|
497
|
+
),
|
|
498
|
+
family=FamilyHeadThresholds(
|
|
499
|
+
threat_confidence=0.70, # Higher confidence required
|
|
500
|
+
safe_confidence=0.45,
|
|
501
|
+
),
|
|
502
|
+
severity=SeverityHeadThresholds(
|
|
503
|
+
threat_severities=("medium", "high", "critical"), # Exclude low severity
|
|
504
|
+
safe_severities=("none", "low"), # Low severity is considered safe
|
|
505
|
+
),
|
|
506
|
+
technique=TechniqueHeadThresholds(
|
|
507
|
+
threat_confidence=0.65, # Higher confidence required
|
|
508
|
+
safe_confidence=0.40,
|
|
509
|
+
),
|
|
510
|
+
harm=HarmHeadThresholds(
|
|
511
|
+
threat_threshold=0.95, # Very high threshold
|
|
512
|
+
safe_threshold=0.60,
|
|
513
|
+
),
|
|
514
|
+
weights=HeadWeights(
|
|
515
|
+
binary=1.2, # Higher binary weight (most reliable)
|
|
516
|
+
family=1.0,
|
|
517
|
+
severity=1.4,
|
|
518
|
+
technique=0.9,
|
|
519
|
+
harm=0.6, # Lower harm weight (most prone to FPs)
|
|
520
|
+
),
|
|
521
|
+
decision=DecisionThresholds(
|
|
522
|
+
high_confidence_threshold=0.90, # Higher override threshold
|
|
523
|
+
min_threat_votes=3, # Require more votes
|
|
524
|
+
severity_veto_override_votes=4,
|
|
525
|
+
threat_ratio=1.5, # Higher ratio needed
|
|
526
|
+
review_ratio_min=1.2,
|
|
527
|
+
),
|
|
528
|
+
)
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
def _get_harm_focused_config() -> VotingConfig:
|
|
532
|
+
"""Get the harm-focused voting configuration.
|
|
533
|
+
|
|
534
|
+
This configuration is specifically tuned for detecting violence, weapons,
|
|
535
|
+
self-harm, and other harmful content. It significantly lowers the harm
|
|
536
|
+
head thresholds and increases the harm head weight to make it the
|
|
537
|
+
dominant signal for harm-related threats.
|
|
538
|
+
|
|
539
|
+
Key differences from balanced:
|
|
540
|
+
- Harm head threshold: 0.50 (vs 0.92) - much more sensitive
|
|
541
|
+
- Harm head weight: 3.0 (vs 0.8) - harm dominates other heads
|
|
542
|
+
- Very low threat_ratio: 0.25 - harm vote alone can trigger threat
|
|
543
|
+
- Binary/family/technique have higher safe thresholds - more abstains
|
|
544
|
+
|
|
545
|
+
The key insight: to allow harm to override other heads, we need:
|
|
546
|
+
1. Very high harm weight (3.0)
|
|
547
|
+
2. Very low threat_ratio (0.25) so harm alone can win
|
|
548
|
+
3. Higher safe thresholds on other heads so they abstain more
|
|
549
|
+
|
|
550
|
+
Use cases:
|
|
551
|
+
- Applications handling user-generated content with violence concerns
|
|
552
|
+
- Platforms where self-harm/suicide content is a major risk
|
|
553
|
+
- Environments processing weapons/explosive-related queries
|
|
554
|
+
|
|
555
|
+
Note: This preset WILL have higher false positive rates on benign
|
|
556
|
+
content discussing sensitive topics (news, education, etc.).
|
|
557
|
+
Review carefully before production use.
|
|
558
|
+
"""
|
|
559
|
+
return VotingConfig(
|
|
560
|
+
name="harm_focused",
|
|
561
|
+
binary=BinaryHeadThresholds(
|
|
562
|
+
threat_threshold=0.50,
|
|
563
|
+
safe_threshold=0.45, # Higher - more abstains
|
|
564
|
+
),
|
|
565
|
+
family=FamilyHeadThresholds(
|
|
566
|
+
threat_confidence=0.45,
|
|
567
|
+
safe_confidence=0.40, # Higher - more abstains
|
|
568
|
+
),
|
|
569
|
+
severity=SeverityHeadThresholds(
|
|
570
|
+
threat_severities=("low", "medium", "high", "critical"),
|
|
571
|
+
safe_severities=("none",),
|
|
572
|
+
),
|
|
573
|
+
technique=TechniqueHeadThresholds(
|
|
574
|
+
threat_confidence=0.45,
|
|
575
|
+
safe_confidence=0.40, # Higher - more abstains
|
|
576
|
+
),
|
|
577
|
+
harm=HarmHeadThresholds(
|
|
578
|
+
threat_threshold=0.50, # Much lower! (was 0.92)
|
|
579
|
+
safe_threshold=0.40, # Still fairly sensitive
|
|
580
|
+
),
|
|
581
|
+
weights=HeadWeights(
|
|
582
|
+
binary=0.8, # Lower weight
|
|
583
|
+
family=0.8, # Lower weight
|
|
584
|
+
severity=1.0, # Normal weight
|
|
585
|
+
technique=0.6,# Lower weight
|
|
586
|
+
harm=3.0, # DOMINANT weight - harm is 3x other heads
|
|
587
|
+
),
|
|
588
|
+
decision=DecisionThresholds(
|
|
589
|
+
high_confidence_threshold=0.60, # Lower for harm override
|
|
590
|
+
min_threat_votes=1, # Single vote can trigger
|
|
591
|
+
severity_veto_override_votes=1, # Harm can override severity=none
|
|
592
|
+
threat_ratio=0.25, # Very low - harm alone can win
|
|
593
|
+
review_ratio_min=0.15, # Even lower for review zone
|
|
594
|
+
),
|
|
595
|
+
)
|