modelaudit 0.2.40__tar.gz → 0.2.41__tar.gz

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 (647) hide show
  1. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/markdown-link-check-config.json +3 -0
  2. modelaudit-0.2.41/.release-please-manifest.json +4 -0
  3. {modelaudit-0.2.40 → modelaudit-0.2.41}/AGENTS.md +12 -1
  4. {modelaudit-0.2.40 → modelaudit-0.2.41}/CHANGELOG.md +192 -0
  5. {modelaudit-0.2.40 → modelaudit-0.2.41}/Dockerfile +1 -1
  6. {modelaudit-0.2.40 → modelaudit-0.2.41}/Dockerfile.full +1 -1
  7. {modelaudit-0.2.40 → modelaudit-0.2.41}/Dockerfile.tensorflow +5 -3
  8. {modelaudit-0.2.40 → modelaudit-0.2.41}/PKG-INFO +27 -2
  9. {modelaudit-0.2.40 → modelaudit-0.2.41}/README.md +26 -1
  10. {modelaudit-0.2.40 → modelaudit-0.2.41}/SECURITY.md +2 -1
  11. {modelaudit-0.2.40 → modelaudit-0.2.41}/THIRD_PARTY_NOTICES.md +1 -1
  12. modelaudit-0.2.41/docs/agents/release-process.md +151 -0
  13. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/api_def_pb2.py +2 -0
  14. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/attr_value_pb2.py +4 -0
  15. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/cost_graph_pb2.py +3 -0
  16. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/cpp_shape_inference_pb2.py +4 -0
  17. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/dataset_options_pb2.py +2 -0
  18. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/dataset_pb2.py +4 -0
  19. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/function_pb2.py +4 -0
  20. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/graph_pb2.py +5 -0
  21. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/graph_transfer_info_pb2.py +2 -0
  22. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/kernel_def_pb2.py +2 -0
  23. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/log_memory_pb2.py +2 -0
  24. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/node_def_pb2.py +3 -0
  25. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/op_def_pb2.py +5 -0
  26. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/optimized_function_graph_pb2.py +3 -0
  27. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/resource_handle_pb2.py +3 -0
  28. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/step_stats_pb2.py +3 -0
  29. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/tensor_description_pb2.py +4 -0
  30. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/tensor_pb2.py +4 -0
  31. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/composite_tensor_variant_pb2.py +2 -0
  32. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/debug_event_pb2.py +3 -0
  33. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/fingerprint_pb2.py +2 -0
  34. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/meta_graph_pb2.py +10 -0
  35. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/named_tensor_pb2.py +2 -0
  36. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/remote_tensor_handle_pb2.py +3 -0
  37. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/rewriter_config_pb2.py +3 -0
  38. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/saved_model_pb2.py +2 -0
  39. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/saved_object_graph_pb2.py +8 -0
  40. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/service_config_pb2.py +2 -0
  41. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/snapshot_pb2.py +4 -0
  42. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/struct_pb2.py +4 -0
  43. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/tensor_bundle_pb2.py +5 -0
  44. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/trackable_object_graph_pb2.py +2 -0
  45. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/telemetry.py +132 -62
  46. modelaudit-0.2.41/packages/modelaudit-picklescan/AGENTS.md +103 -0
  47. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/CHANGELOG.md +69 -0
  48. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/Cargo.lock +2 -2
  49. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/Cargo.toml +1 -1
  50. modelaudit-0.2.41/packages/modelaudit-picklescan/README.md +185 -0
  51. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/pyproject.toml +1 -1
  52. modelaudit-0.2.41/packages/modelaudit-picklescan/rust/src/policy.rs +1190 -0
  53. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/rust/src/stack.rs +187 -3
  54. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/rust/src/state.rs +2633 -151
  55. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/rust/src/strings.rs +146 -0
  56. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/src/modelaudit_picklescan/api.py +132 -1
  57. modelaudit-0.2.41/packages/modelaudit-picklescan/src/modelaudit_picklescan/call_graph.py +2686 -0
  58. modelaudit-0.2.41/packages/modelaudit-picklescan/tests/test_adversarial_pickle_oracle.py +6681 -0
  59. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/tests/test_api.py +1362 -3
  60. modelaudit-0.2.41/packages/modelaudit-picklescan/tests/test_call_graph_click.py +131 -0
  61. modelaudit-0.2.41/packages/modelaudit-picklescan/tests/test_call_graph_execnet.py +124 -0
  62. modelaudit-0.2.41/packages/modelaudit-picklescan/tests/test_call_graph_import_statements.py +6902 -0
  63. modelaudit-0.2.41/packages/modelaudit-picklescan/tests/test_call_graph_instance_defaults.py +244 -0
  64. modelaudit-0.2.41/packages/modelaudit-picklescan/tests/test_call_graph_local_imports.py +131 -0
  65. modelaudit-0.2.41/packages/modelaudit-picklescan/tests/test_call_graph_six.py +305 -0
  66. modelaudit-0.2.41/packages/modelaudit-picklescan/tests/test_call_graph_tkinter.py +184 -0
  67. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/tests/test_rust_engine.py +59 -0
  68. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/uv.lock +1 -1
  69. {modelaudit-0.2.40 → modelaudit-0.2.41}/pyproject.toml +1 -1
  70. modelaudit-0.2.41/requirements-tensorflow.txt +4 -0
  71. {modelaudit-0.2.40 → modelaudit-0.2.41}/scripts/compile_tensorflow_protos.sh +7 -2
  72. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/conftest.py +8 -0
  73. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_tar_scanner.py +42 -0
  74. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_zip_scanner.py +42 -0
  75. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_pytorch_zip_detection.py +33 -17
  76. modelaudit-0.2.41/tests/test_release_workflow.py +123 -0
  77. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_telemetry.py +221 -16
  78. {modelaudit-0.2.40 → modelaudit-0.2.41}/uv.lock +5 -5
  79. modelaudit-0.2.40/.release-please-manifest.json +0 -4
  80. modelaudit-0.2.40/docs/agents/release-process.md +0 -91
  81. modelaudit-0.2.40/packages/modelaudit-picklescan/README.md +0 -79
  82. modelaudit-0.2.40/packages/modelaudit-picklescan/rust/src/policy.rs +0 -276
  83. modelaudit-0.2.40/packages/modelaudit-picklescan/tests/test_adversarial_pickle_oracle.py +0 -302
  84. {modelaudit-0.2.40 → modelaudit-0.2.41}/.dockerignore +0 -0
  85. {modelaudit-0.2.40 → modelaudit-0.2.41}/.editorconfig +0 -0
  86. {modelaudit-0.2.40 → modelaudit-0.2.41}/.gitattributes +0 -0
  87. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/CODEOWNERS +0 -0
  88. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  89. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  90. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  91. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/workflows/README.md +0 -0
  92. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/workflows/codeql.yml +0 -0
  93. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/workflows/docker-image-test.yml +0 -0
  94. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/workflows/docker-publish.yml +0 -0
  95. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/workflows/docs-check.yml +0 -0
  96. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/workflows/nightly.yml +0 -0
  97. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/workflows/perf.yml +0 -0
  98. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/workflows/release-please.yml +0 -0
  99. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/workflows/test.yml +0 -0
  100. {modelaudit-0.2.40 → modelaudit-0.2.41}/.github/workflows/validate-pr-title.yml +0 -0
  101. {modelaudit-0.2.40 → modelaudit-0.2.41}/.gitignore +0 -0
  102. {modelaudit-0.2.40 → modelaudit-0.2.41}/.mailmap +0 -0
  103. {modelaudit-0.2.40 → modelaudit-0.2.41}/.modelaudit.toml.example +0 -0
  104. {modelaudit-0.2.40 → modelaudit-0.2.41}/.prettierignore +0 -0
  105. {modelaudit-0.2.40 → modelaudit-0.2.41}/CLAUDE.md +0 -0
  106. {modelaudit-0.2.40 → modelaudit-0.2.41}/CODE_OF_CONDUCT.md +0 -0
  107. {modelaudit-0.2.40 → modelaudit-0.2.41}/CONTRIBUTING.md +0 -0
  108. {modelaudit-0.2.40 → modelaudit-0.2.41}/LICENSE +0 -0
  109. {modelaudit-0.2.40 → modelaudit-0.2.41}/MAINTAINERS.md +0 -0
  110. {modelaudit-0.2.40 → modelaudit-0.2.41}/MANIFEST.in +0 -0
  111. {modelaudit-0.2.40 → modelaudit-0.2.41}/RULES.md +0 -0
  112. {modelaudit-0.2.40 → modelaudit-0.2.41}/SUPPORT.md +0 -0
  113. {modelaudit-0.2.40 → modelaudit-0.2.41}/codecov.yml +0 -0
  114. {modelaudit-0.2.40 → modelaudit-0.2.41}/docker-compose.yml +0 -0
  115. {modelaudit-0.2.40 → modelaudit-0.2.41}/docker-entrypoint.sh +0 -0
  116. {modelaudit-0.2.40 → modelaudit-0.2.41}/docs/agents/architecture.md +0 -0
  117. {modelaudit-0.2.40 → modelaudit-0.2.41}/docs/agents/dependencies.md +0 -0
  118. {modelaudit-0.2.40 → modelaudit-0.2.41}/docs/agents/new-scanner-quickstart.md +0 -0
  119. {modelaudit-0.2.40 → modelaudit-0.2.41}/docs/agents/picklescan-package-split.md +0 -0
  120. {modelaudit-0.2.40 → modelaudit-0.2.41}/docs/maintainers/cve-process.md +0 -0
  121. {modelaudit-0.2.40 → modelaudit-0.2.41}/docs/maintainers/dependency-policy.md +0 -0
  122. {modelaudit-0.2.40 → modelaudit-0.2.41}/docs/maintainers/scanner-cve-coverage.md +0 -0
  123. {modelaudit-0.2.40 → modelaudit-0.2.41}/docs/maintainers/triage-playbook.md +0 -0
  124. {modelaudit-0.2.40 → modelaudit-0.2.41}/docs/security/threat-model.md +0 -0
  125. {modelaudit-0.2.40 → modelaudit-0.2.41}/docs/user/compatibility-matrix.md +0 -0
  126. {modelaudit-0.2.40 → modelaudit-0.2.41}/docs/user/metadata-extraction.md +0 -0
  127. {modelaudit-0.2.40 → modelaudit-0.2.41}/docs/user/offline-air-gapped.md +0 -0
  128. {modelaudit-0.2.40 → modelaudit-0.2.41}/docs/user/scanner-selection.md +0 -0
  129. {modelaudit-0.2.40 → modelaudit-0.2.41}/docs/user/security-model.md +0 -0
  130. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/__init__.py +0 -0
  131. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/__main__.py +0 -0
  132. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/analysis/__init__.py +0 -0
  133. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/analysis/anomaly_detector.py +0 -0
  134. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/analysis/enhanced_pattern_detector.py +0 -0
  135. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/analysis/entropy_analyzer.py +0 -0
  136. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/analysis/framework_patterns.py +0 -0
  137. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/analysis/integrated_analyzer.py +0 -0
  138. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/analysis/ml_context_analyzer.py +0 -0
  139. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/analysis/opcode_sequence_analyzer.py +0 -0
  140. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/analysis/semantic_analyzer.py +0 -0
  141. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/analysis/unified_context.py +0 -0
  142. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/auth/__init__.py +0 -0
  143. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/auth/client.py +0 -0
  144. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/auth/config.py +0 -0
  145. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/cache/__init__.py +0 -0
  146. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/cache/adaptive_cache_keys.py +0 -0
  147. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/cache/batch_operations.py +0 -0
  148. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/cache/cache_manager.py +0 -0
  149. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/cache/cache_policy.py +0 -0
  150. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/cache/optimized_config.py +0 -0
  151. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/cache/scan_results_cache.py +0 -0
  152. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/cache/trusted_config_store.py +0 -0
  153. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/cli.py +0 -0
  154. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/config/__init__.py +0 -0
  155. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/config/constants.py +0 -0
  156. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/config/data/spdx_licenses.json +0 -0
  157. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/config/explanations.py +0 -0
  158. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/config/generated_keras_layers.py +0 -0
  159. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/config/local_config.py +0 -0
  160. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/config/name_blacklist.py +0 -0
  161. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/config/rule_config.py +0 -0
  162. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/core.py +0 -0
  163. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/core_results.py +0 -0
  164. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/detectors/__init__.py +0 -0
  165. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/detectors/cve_patterns.py +0 -0
  166. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/detectors/jit_script.py +0 -0
  167. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/detectors/network_comm.py +0 -0
  168. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/detectors/secrets.py +0 -0
  169. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/detectors/suspicious_symbols.py +0 -0
  170. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/integrations/__init__.py +0 -0
  171. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/integrations/jfrog.py +0 -0
  172. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/integrations/license_checker.py +0 -0
  173. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/integrations/mlflow.py +0 -0
  174. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/integrations/sarif_formatter.py +0 -0
  175. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/integrations/sbom_generator.py +0 -0
  176. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/metadata_extractor.py +0 -0
  177. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/models.py +0 -0
  178. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/progress/__init__.py +0 -0
  179. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/progress/base.py +0 -0
  180. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/progress/console.py +0 -0
  181. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/progress/file.py +0 -0
  182. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/progress/hooks.py +0 -0
  183. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/progress/multi_phase.py +0 -0
  184. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/LICENSE +0 -0
  185. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/NOTICE +0 -0
  186. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/__init__.py +0 -0
  187. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/py.typed +0 -0
  188. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/__init__.py +0 -0
  189. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/__init__.py +0 -0
  190. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/__init__.py +0 -0
  191. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/allocation_description_pb2.py +0 -0
  192. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/dataset_metadata_pb2.py +0 -0
  193. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/device_attributes_pb2.py +0 -0
  194. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/full_type_pb2.py +0 -0
  195. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/graph_debug_info_pb2.py +0 -0
  196. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/model_pb2.py +0 -0
  197. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/reader_base_pb2.py +0 -0
  198. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/tensor_shape_pb2.py +0 -0
  199. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/tensor_slice_pb2.py +0 -0
  200. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/types_pb2.py +0 -0
  201. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/variable_pb2.py +0 -0
  202. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/framework/versions_pb2.py +0 -0
  203. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/__init__.py +0 -0
  204. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/cluster_pb2.py +0 -0
  205. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/control_flow_pb2.py +0 -0
  206. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/core_platform_payloads_pb2.py +0 -0
  207. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/critical_section_pb2.py +0 -0
  208. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/data_service_pb2.py +0 -0
  209. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/debug_pb2.py +0 -0
  210. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/device_filters_pb2.py +0 -0
  211. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/device_properties_pb2.py +0 -0
  212. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/saver_pb2.py +0 -0
  213. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/transport_options_pb2.py +0 -0
  214. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/protos/tensorflow/core/protobuf/verifier_config_pb2.py +0 -0
  215. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/py.typed +0 -0
  216. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/rule_catalog.py +0 -0
  217. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/rules.py +0 -0
  218. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanner_registry_metadata.py +0 -0
  219. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanner_results.py +0 -0
  220. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanner_selection.py +0 -0
  221. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/__init__.py +0 -0
  222. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/_archive_config.py +0 -0
  223. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/_archive_locations.py +0 -0
  224. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/_archive_outcomes.py +0 -0
  225. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/_evidence_redaction.py +0 -0
  226. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/_string_extraction.py +0 -0
  227. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/archive_dispatch.py +0 -0
  228. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/archive_member_security.py +0 -0
  229. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/base.py +0 -0
  230. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/catboost_scanner.py +0 -0
  231. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/cntk_scanner.py +0 -0
  232. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/compressed_scanner.py +0 -0
  233. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/coreml_scanner.py +0 -0
  234. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/executorch_scanner.py +0 -0
  235. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/flax_msgpack_scanner.py +0 -0
  236. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/gguf_scanner.py +0 -0
  237. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/jax_checkpoint_scanner.py +0 -0
  238. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/jinja2_template_scanner.py +0 -0
  239. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/joblib_scanner.py +0 -0
  240. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/keras_h5_scanner.py +0 -0
  241. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/keras_utils.py +0 -0
  242. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/keras_zip_scanner.py +0 -0
  243. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/lightgbm_scanner.py +0 -0
  244. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/llamafile_scanner.py +0 -0
  245. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/manifest_scanner.py +0 -0
  246. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/metadata_scanner.py +0 -0
  247. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/mxnet_scanner.py +0 -0
  248. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/nemo_scanner.py +0 -0
  249. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/numpy_scanner.py +0 -0
  250. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/oci_layer_scanner.py +0 -0
  251. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/onnx_scanner.py +0 -0
  252. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/openvino_scanner.py +0 -0
  253. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/paddle_scanner.py +0 -0
  254. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/pickle_scanner.py +0 -0
  255. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/picklescan_adapter.py +0 -0
  256. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/pmml_scanner.py +0 -0
  257. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/pytorch_binary_scanner.py +0 -0
  258. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/pytorch_zip_scanner.py +0 -0
  259. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/pytorch_zip_support/__init__.py +0 -0
  260. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/pytorch_zip_support/archive_members.py +0 -0
  261. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/r_serialized_scanner.py +0 -0
  262. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/rar_scanner.py +0 -0
  263. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/rknn_scanner.py +0 -0
  264. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/rule_mapper.py +0 -0
  265. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/safetensors_scanner.py +0 -0
  266. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/sevenzip_scanner.py +0 -0
  267. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/skops_scanner.py +0 -0
  268. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/tar_scanner.py +0 -0
  269. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/tensorrt_scanner.py +0 -0
  270. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/text_scanner.py +0 -0
  271. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/tf_metagraph_scanner.py +0 -0
  272. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/tf_savedmodel_scanner.py +0 -0
  273. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/tflite_scanner.py +0 -0
  274. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/torch7_scanner.py +0 -0
  275. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/torchserve_mar_scanner.py +0 -0
  276. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/weight_distribution_scanner.py +0 -0
  277. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/xgboost_scanner.py +0 -0
  278. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/scanners/zip_scanner.py +0 -0
  279. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/__init__.py +0 -0
  280. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/_path_hardening.py +0 -0
  281. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/auto_defaults.py +0 -0
  282. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/file/__init__.py +0 -0
  283. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/file/_compression.py +0 -0
  284. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/file/detection.py +0 -0
  285. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/file/filtering.py +0 -0
  286. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/file/handlers.py +0 -0
  287. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/file/large_file_handler.py +0 -0
  288. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/file/streaming.py +0 -0
  289. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/helpers/__init__.py +0 -0
  290. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/helpers/assets.py +0 -0
  291. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/helpers/auto_defaults.py +0 -0
  292. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/helpers/cache_decorator.py +0 -0
  293. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/helpers/code_validation.py +0 -0
  294. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/helpers/disk_space.py +0 -0
  295. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/helpers/file_hash.py +0 -0
  296. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/helpers/file_iterator.py +0 -0
  297. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/helpers/interrupt_handler.py +0 -0
  298. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/helpers/ml_context.py +0 -0
  299. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/helpers/result_conversion.py +0 -0
  300. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/helpers/retry.py +0 -0
  301. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/helpers/secure_hasher.py +0 -0
  302. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/helpers/types.py +0 -0
  303. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/lfs.py +0 -0
  304. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/model_extensions.py +0 -0
  305. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/sources/__init__.py +0 -0
  306. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/sources/_huggingface_cache.py +0 -0
  307. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/sources/cloud_storage.py +0 -0
  308. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/sources/dvc.py +0 -0
  309. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/sources/huggingface.py +0 -0
  310. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/sources/huggingface_paths.py +0 -0
  311. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/sources/jfrog.py +0 -0
  312. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/sources/pytorch_hub.py +0 -0
  313. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/utils/tensorflow_compat.py +0 -0
  314. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/version.py +0 -0
  315. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/whitelists/__init__.py +0 -0
  316. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/whitelists/huggingface_organizations.py +0 -0
  317. {modelaudit-0.2.40 → modelaudit-0.2.41}/modelaudit/whitelists/huggingface_popular.py +0 -0
  318. {modelaudit-0.2.40 → modelaudit-0.2.41}/package-lock.json +0 -0
  319. {modelaudit-0.2.40 → modelaudit-0.2.41}/package.json +0 -0
  320. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/rust/README.md +0 -0
  321. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/rust/src/expansion.rs +0 -0
  322. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/rust/src/lib.rs +0 -0
  323. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/rust/src/nested.rs +0 -0
  324. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/rust/src/nested_surface.rs +0 -0
  325. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/rust/src/opcode.rs +0 -0
  326. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/rust/src/options.rs +0 -0
  327. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/rust/src/post_budget.rs +0 -0
  328. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/rust/src/pybridge.rs +0 -0
  329. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/rust/src/report.rs +0 -0
  330. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/rust/src/strings_policy.rs +0 -0
  331. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/src/modelaudit_picklescan/__init__.py +0 -0
  332. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/src/modelaudit_picklescan/options.py +0 -0
  333. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/src/modelaudit_picklescan/py.typed +0 -0
  334. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/src/modelaudit_picklescan/report.py +0 -0
  335. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/tests/conftest.py +0 -0
  336. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/tests/parity_corpus.py +0 -0
  337. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/tests/test_import_boundary.py +0 -0
  338. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/tests/test_native_interface.py +0 -0
  339. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/tests/test_options.py +0 -0
  340. {modelaudit-0.2.40 → modelaudit-0.2.41}/packages/modelaudit-picklescan/tests/test_report.py +0 -0
  341. {modelaudit-0.2.40 → modelaudit-0.2.41}/pyproject.toml.example +0 -0
  342. {modelaudit-0.2.40 → modelaudit-0.2.41}/release-please-config.json +0 -0
  343. {modelaudit-0.2.40 → modelaudit-0.2.41}/renovate.json +0 -0
  344. {modelaudit-0.2.40 → modelaudit-0.2.41}/scripts/README.md +0 -0
  345. {modelaudit-0.2.40 → modelaudit-0.2.41}/scripts/benchmark_report.py +0 -0
  346. {modelaudit-0.2.40 → modelaudit-0.2.41}/scripts/check_circular_imports.py +0 -0
  347. {modelaudit-0.2.40 → modelaudit-0.2.41}/scripts/fetch_hf_org_models.py +0 -0
  348. {modelaudit-0.2.40 → modelaudit-0.2.41}/scripts/fetch_hf_top_models.py +0 -0
  349. {modelaudit-0.2.40 → modelaudit-0.2.41}/scripts/generate_keras_layer_inventory.py +0 -0
  350. {modelaudit-0.2.40 → modelaudit-0.2.41}/scripts/jax_flax_scanning_demo.py +0 -0
  351. {modelaudit-0.2.40 → modelaudit-0.2.41}/scripts/large_pickle_corpus_qa.py +0 -0
  352. {modelaudit-0.2.40 → modelaudit-0.2.41}/scripts/minimal_circular_check.py +0 -0
  353. {modelaudit-0.2.40 → modelaudit-0.2.41}/scripts/profile_scan.py +0 -0
  354. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/__init__.py +0 -0
  355. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/analysis/test_analysis_modules.py +0 -0
  356. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/analysis/test_anomaly_detector.py +0 -0
  357. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/analysis/test_enhanced_pattern_detector.py +0 -0
  358. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/analysis/test_entropy_analyzer.py +0 -0
  359. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/analysis/test_framework_patterns.py +0 -0
  360. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/analysis/test_ml_context_analyzer.py +0 -0
  361. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/analysis/test_opcode_sequence_analyzer.py +0 -0
  362. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/analysis/test_unified_context.py +0 -0
  363. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/exploits/exploit1_basic_torch_bypass.pkl +0 -0
  364. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/exploits/exploit2_advanced_torch_bypass.pkl +0 -0
  365. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/exploits/exploit3_sophisticated_hybrid.pkl +0 -0
  366. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/exploits/exploit4_supply_chain_attack.pkl +0 -0
  367. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/exploits/exploit5_ultra_high_confidence.pkl +0 -0
  368. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/exploits/exploit6_ordereddict_bypass.pkl +0 -0
  369. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/exploits/exploit7_nested_collections.pkl +0 -0
  370. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/exploits/exploit9_manual_construction.pkl +0 -0
  371. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/exploits/exploit_ultimate_50pct.pkl +0 -0
  372. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/generators/generate_7z_test_assets.py +0 -0
  373. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/generators/generate_advanced_pickle_tests.py +0 -0
  374. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/generators/generate_evil_pickle.py +0 -0
  375. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/generators/generate_jinja2_test_assets.py +0 -0
  376. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/generators/generate_nested_pickle_assets.py +0 -0
  377. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/generators/generate_os_alias_tests.py +0 -0
  378. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/generators/generate_safe_nested_assets.py +0 -0
  379. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/generators/generate_safetensors_assets.py +0 -0
  380. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/generators/generate_security_assets.py +0 -0
  381. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/pickles/memo_attack.pkl +0 -0
  382. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/pickles/multiple_stream_attack.pkl +0 -0
  383. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/pickles/nt_alias_attack.pkl +0 -0
  384. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/pickles/posix_alias_attack.pkl +0 -0
  385. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/pickles/stack_global_attack.pkl +0 -0
  386. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/archives/path_traversal.zip +0 -0
  387. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/archives/safe_model.zip +0 -0
  388. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/benign/chatml_format.json +0 -0
  389. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/benign/complex_legitimate.json +0 -0
  390. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/benign/conditional_system.json +0 -0
  391. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/benign/huggingface_llama.json +0 -0
  392. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/benign/simple_roles.json +0 -0
  393. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/benign/special_tokens.json +0 -0
  394. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/edge_cases/empty_template.json +0 -0
  395. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/edge_cases/malformed_template.json +0 -0
  396. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/edge_cases/multiple_templates.json +0 -0
  397. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/edge_cases/no_template.json +0 -0
  398. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/edge_cases/oversized_template.json +0 -0
  399. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/malicious/attr_bypass.json +0 -0
  400. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/malicious/combined_attack.json +0 -0
  401. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/malicious/config_exploit.json +0 -0
  402. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/malicious/cve_2024_34359_original.json +0 -0
  403. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/malicious/direct_eval.json +0 -0
  404. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/malicious/env_extraction.json +0 -0
  405. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/malicious/file_access.json +0 -0
  406. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/malicious/hex_bypass.json +0 -0
  407. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/malicious/loop_discovery.json +0 -0
  408. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/malicious/network_exfil.json +0 -0
  409. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/malicious/request_exploit.json +0 -0
  410. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/malicious/subprocess_injection.json +0 -0
  411. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/obfuscated/base64_payload.json +0 -0
  412. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/obfuscated/char_construction.json +0 -0
  413. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/obfuscated/format_bypass.json +0 -0
  414. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/obfuscated/getattr_bypass.json +0 -0
  415. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/standalone/benign_chat.j2 +0 -0
  416. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/standalone/malicious_standalone.jinja +0 -0
  417. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/standalone/malicious_subprocess.template +0 -0
  418. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/standalone/suspicious_benign.template +0 -0
  419. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/yaml/malicious_config.yaml +0 -0
  420. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/jinja2/yaml/model_config.yaml +0 -0
  421. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/keras/custom_layer_attack.h5 +0 -0
  422. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/keras/loss_injection.h5 +0 -0
  423. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/keras/malicious_lambda.h5 +0 -0
  424. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/keras/metric_injection.h5 +0 -0
  425. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/keras/safe_model.h5 +0 -0
  426. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/manifests/safe_config.json +0 -0
  427. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/manifests/suspicious_config.json +0 -0
  428. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/decode_exec_chain.pkl +0 -0
  429. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/dill_func.pkl +0 -0
  430. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/malicious_model_realistic.pkl +0 -0
  431. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/malicious_system_call.pkl +0 -0
  432. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/nested_pickle_base64.pkl +0 -0
  433. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/nested_pickle_hex.pkl +0 -0
  434. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/nested_pickle_multistage.pkl +0 -0
  435. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/nested_pickle_raw.pkl +0 -0
  436. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/safe_data.pkl +0 -0
  437. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/safe_large_model.pkl +0 -0
  438. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/safe_model_with_binary.pkl +0 -0
  439. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/safe_model_with_encoding.pkl +0 -0
  440. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/safe_model_with_tokens.pkl +0 -0
  441. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/safe_nested_structure.pkl +0 -0
  442. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pickles/simple_nested.pkl +0 -0
  443. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pipeline.skops +0 -0
  444. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pytorch/malicious_eval.pt +0 -0
  445. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/pytorch/safe_model.pt +0 -0
  446. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/safetensors/malicious_import.safetensors +0 -0
  447. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/safetensors/safe_model.safetensors +0 -0
  448. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/tensorflow/malicious_pyfunc/saved_model.pb +0 -0
  449. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/samples/tensorflow/safe_savedmodel/saved_model.pb +0 -0
  450. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/license_scenarios/agpl_component/agpl_model.pkl +0 -0
  451. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/license_scenarios/agpl_component/neural_network.py +0 -0
  452. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/license_scenarios/mit_model/config.json +0 -0
  453. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/license_scenarios/mit_model/model.py +0 -0
  454. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/license_scenarios/mit_model/model_weights.pkl +0 -0
  455. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/license_scenarios/mixed_licenses/LICENSE +0 -0
  456. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/license_scenarios/mixed_licenses/apache_component.py +0 -0
  457. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/license_scenarios/mixed_licenses/dataset_cc_nc.json +0 -0
  458. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/license_scenarios/mixed_licenses/gpl_utility.py +0 -0
  459. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/license_scenarios/mixed_licenses/mixed_model.pkl +0 -0
  460. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/license_scenarios/unlicensed_dataset/embeddings.npy +0 -0
  461. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/license_scenarios/unlicensed_dataset/features.csv +0 -0
  462. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/license_scenarios/unlicensed_dataset/training_data.json +0 -0
  463. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/security_scenarios/mixed_malicious_model/config.json +0 -0
  464. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/assets/scenarios/security_scenarios/mixed_malicious_model/model.pkl +0 -0
  465. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/benchmarks/test_picklescan_benchmarks.py +0 -0
  466. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/benchmarks/test_scan_benchmarks.py +0 -0
  467. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/cache/__init__.py +0 -0
  468. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/cache/test_cache_correctness.py +0 -0
  469. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/cache/test_optimized_config.py +0 -0
  470. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/cli_output.py +0 -0
  471. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/config/__init__.py +0 -0
  472. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/config/test_name_blacklist.py +0 -0
  473. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/demo_license_functionality.py +0 -0
  474. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/detectors/test_builtin_detection.py +0 -0
  475. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/detectors/test_compile_eval_variants.py +0 -0
  476. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/detectors/test_cve_detection.py +0 -0
  477. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/detectors/test_jit_script_detector.py +0 -0
  478. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/detectors/test_network_comm_detector.py +0 -0
  479. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/detectors/test_runpy_detection.py +0 -0
  480. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/detectors/test_secrets_detector.py +0 -0
  481. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/detectors/test_suspicious_symbols.py +0 -0
  482. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/helpers/__init__.py +0 -0
  483. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/helpers/file_creators.py +0 -0
  484. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/helpers/frameworks.py +0 -0
  485. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/integrations/test_jfrog.py +0 -0
  486. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/integrations/test_jfrog_integration.py +0 -0
  487. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/integrations/test_license_checker.py +0 -0
  488. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/integrations/test_license_integration.py +0 -0
  489. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/integrations/test_mlflow_integration.py +0 -0
  490. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/integrations/test_sarif_formatter.py +0 -0
  491. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/integrations/test_sbom_license_integration.py +0 -0
  492. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/integrations/test_sbom_url_fixes.py +0 -0
  493. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/progress/__init__.py +0 -0
  494. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/progress/test_base.py +0 -0
  495. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_base_scanner.py +0 -0
  496. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_catboost_scanner.py +0 -0
  497. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_cntk_scanner.py +0 -0
  498. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_compressed_scanner.py +0 -0
  499. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_coreml_scanner.py +0 -0
  500. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_executorch_scanner.py +0 -0
  501. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_flax_msgpack_scanner.py +0 -0
  502. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_gguf_scanner.py +0 -0
  503. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_jax_checkpoint_scanner.py +0 -0
  504. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_jinja2_template_scanner.py +0 -0
  505. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_joblib_scanner.py +0 -0
  506. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_joblib_scanner_codecs.py +0 -0
  507. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_keras_h5_scanner.py +0 -0
  508. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_keras_zip_scanner.py +0 -0
  509. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_lightgbm_scanner.py +0 -0
  510. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_llamafile_scanner.py +0 -0
  511. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_manifest_scanner.py +0 -0
  512. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_metadata_scanner.py +0 -0
  513. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_mxnet_scanner.py +0 -0
  514. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_nemo_scanner.py +0 -0
  515. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_numpy_scanner.py +0 -0
  516. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_oci_layer_scanner.py +0 -0
  517. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_onnx_dependency_handling.py +0 -0
  518. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_onnx_scanner.py +0 -0
  519. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_openvino_scanner.py +0 -0
  520. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_paddle_scanner.py +0 -0
  521. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_pickle_scanner.py +0 -0
  522. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_picklescan_adapter.py +0 -0
  523. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_pmml_scanner.py +0 -0
  524. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_pytorch_binary_scanner.py +0 -0
  525. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_pytorch_zip_scanner.py +0 -0
  526. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_r_serialized_scanner.py +0 -0
  527. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_rknn_scanner.py +0 -0
  528. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_rule_code_registry_consistency.py +0 -0
  529. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_rule_mapper.py +0 -0
  530. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_safetensors_scanner.py +0 -0
  531. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_scanner_registry.py +0 -0
  532. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_sevenzip_scanner.py +0 -0
  533. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_skops_content_analysis.py +0 -0
  534. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_skops_scanner.py +0 -0
  535. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_tensorrt_scanner.py +0 -0
  536. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_tf_metagraph_scanner.py +0 -0
  537. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_tf_savedmodel_scanner.py +0 -0
  538. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_tflite_scanner.py +0 -0
  539. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_torch7_scanner.py +0 -0
  540. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_torchserve_mar_scanner.py +0 -0
  541. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_weight_distribution_scanner.py +0 -0
  542. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scanners/test_xgboost_scanner.py +0 -0
  543. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/scripts/test_large_pickle_corpus_qa.py +0 -0
  544. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_asset_inventory_integration.py +0 -0
  545. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_asset_list.py +0 -0
  546. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_auth_config.py +0 -0
  547. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_basic.py +0 -0
  548. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_benchmark_report.py +0 -0
  549. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_bug1_confidence_exploit.py +0 -0
  550. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_cache_cli.py +0 -0
  551. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_cache_optimizations.py +0 -0
  552. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_checks_recording.py +0 -0
  553. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_cli.py +0 -0
  554. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_cli_cache_dir.py +0 -0
  555. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_cli_default_command.py +0 -0
  556. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_cli_file_filtering.py +0 -0
  557. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_cli_license_integration.py +0 -0
  558. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_cli_logging_handlers.py +0 -0
  559. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_cli_output.py +0 -0
  560. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_cloud_url_detection.py +0 -0
  561. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_committed_fixture_hygiene.py +0 -0
  562. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_core.py +0 -0
  563. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_core_asset_extraction.py +0 -0
  564. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_cve_2025_10155_bin_pickle.py +0 -0
  565. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_debug_command.py +0 -0
  566. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_dill_joblib_enhanced.py +0 -0
  567. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_directory_file_filtering.py +0 -0
  568. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_double_interrupt.py +0 -0
  569. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_exit_codes.py +0 -0
  570. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_false_positive_fixes.py +0 -0
  571. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_file_hash.py +0 -0
  572. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_gguf_sbom_integration.py +0 -0
  573. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_graceful_degradation.py +0 -0
  574. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_header_discrepancy.py +0 -0
  575. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_huggingface_extensions.py +0 -0
  576. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_huggingface_symlinks.py +0 -0
  577. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_importlib_detection.py +0 -0
  578. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_integration.py +0 -0
  579. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_jax_flax_integration.py +0 -0
  580. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_jit_script_integration.py +0 -0
  581. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_lazy_loading.py +0 -0
  582. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_lazy_loading_integration.py +0 -0
  583. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_manifest_name_policy.py +0 -0
  584. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_metadata_extractor.py +0 -0
  585. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_models.py +0 -0
  586. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_nested_pickle_integration.py +0 -0
  587. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_network_comm_integration.py +0 -0
  588. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_os_alias_detection.py +0 -0
  589. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_os_subprocess_detection.py +0 -0
  590. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_path_traversal.py +0 -0
  591. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_performance_benchmarks.py +0 -0
  592. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_pickle_context_filtering.py +0 -0
  593. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_progress.py +0 -0
  594. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_pydantic_models.py +0 -0
  595. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_python_version_warning.py +0 -0
  596. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_real_world_dill_joblib.py +0 -0
  597. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_regression_corpus.py +0 -0
  598. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_regular_scan_hash.py +0 -0
  599. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_rules.py +0 -0
  600. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_safetensors_optimization.py +0 -0
  601. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_scanner_selection.py +0 -0
  602. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_secure_hasher.py +0 -0
  603. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_security_asset_integration.py +0 -0
  604. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_security_enhancements.py +0 -0
  605. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_shebang_context.py +0 -0
  606. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_simple_jinja2.py +0 -0
  607. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_sklearn_joblib_false_positive.py +0 -0
  608. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_streaming_scan.py +0 -0
  609. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_telemetry_decoupling.py +0 -0
  610. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_tensorflow_lambda_detection.py +0 -0
  611. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_timeout_configuration.py +0 -0
  612. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_utils.py +0 -0
  613. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_weak_hash_detection.py +0 -0
  614. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_webbrowser_detection.py +0 -0
  615. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_why_explanations.py +0 -0
  616. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/test_xdist_status.py +0 -0
  617. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/__init__.py +0 -0
  618. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/file/__init__.py +0 -0
  619. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/file/test_advanced_file_handler.py +0 -0
  620. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/file/test_advanced_size_limits.py +0 -0
  621. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/file/test_file_filter.py +0 -0
  622. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/file/test_file_type_validation_integration.py +0 -0
  623. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/file/test_filetype.py +0 -0
  624. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/file/test_integration_file_type_demo.py +0 -0
  625. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/file/test_large_file_handler.py +0 -0
  626. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/file/test_streaming_analysis.py +0 -0
  627. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/file/test_streaming_preview.py +0 -0
  628. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/helpers/test_asset_from_scan_result.py +0 -0
  629. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/helpers/test_auto_defaults.py +0 -0
  630. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/helpers/test_code_validation.py +0 -0
  631. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/helpers/test_disk_space.py +0 -0
  632. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/helpers/test_file_iterator.py +0 -0
  633. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/helpers/test_interrupt_handling.py +0 -0
  634. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/helpers/test_ml_context_false_positives.py +0 -0
  635. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/helpers/test_py_compile_improvements.py +0 -0
  636. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/helpers/test_secure_hasher.py +0 -0
  637. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/sources/test_cloud_storage.py +0 -0
  638. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/sources/test_dvc_integration.py +0 -0
  639. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/sources/test_huggingface.py +0 -0
  640. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/sources/test_pytorch_hub.py +0 -0
  641. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/test_lfs.py +0 -0
  642. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/utils/test_result_conversion.py +0 -0
  643. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/whitelists/__init__.py +0 -0
  644. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/whitelists/test_combined.py +0 -0
  645. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/whitelists/test_huggingface_popular.py +0 -0
  646. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/whitelists/test_organizations.py +0 -0
  647. {modelaudit-0.2.40 → modelaudit-0.2.41}/tests/xdist_status.py +0 -0
@@ -3,6 +3,9 @@
3
3
  {
4
4
  "pattern": "^https://github.com/.*/(pull|issues)/[0-9]+$"
5
5
  },
6
+ {
7
+ "pattern": "^https://github.com/promptfoo/modelaudit/(commit|compare|releases/tag)/"
8
+ },
6
9
  {
7
10
  "pattern": "^https://claude.ai"
8
11
  }
@@ -0,0 +1,4 @@
1
+ {
2
+ ".": "0.2.41",
3
+ "packages/modelaudit-picklescan": "0.1.3"
4
+ }
@@ -9,6 +9,17 @@ This is the single source of truth for all AI coding agents (Claude, Gemini, oth
9
9
  - Keep instructions universal and minimal; lean on deterministic tools (ruff, mypy, pytest, prettier) rather than embedding style rules.
10
10
  - When unsure, ask or fetch targeted context instead of expanding instructions.
11
11
 
12
+ ### Monorepo at a glance
13
+
14
+ This repo publishes **two PyPI packages with independent versions**:
15
+
16
+ | PyPI name | Path | Version file | CHANGELOG |
17
+ | ----------------------- | --------------------------------- | ------------------------------- | --------------------------------------------- |
18
+ | `modelaudit` | `./` (root) | `pyproject.toml` + `uv.lock` | `CHANGELOG.md` |
19
+ | `modelaudit-picklescan` | `packages/modelaudit-picklescan/` | `pyproject.toml` + `Cargo.toml` | `packages/modelaudit-picklescan/CHANGELOG.md` |
20
+
21
+ Root `modelaudit` hard-requires `modelaudit-picklescan>=0.1.0,<0.2.0` — when the sibling crosses `0.2.0`, bump the constraint in the same PR or the next `modelaudit` release is uninstallable. Both packages are driven by a single `release-please` workflow (`.github/workflows/release-please.yml`) with components defined in `release-please-config.json` and current versions in `.release-please-manifest.json`. Full publishing details — trusted publishing, manual `workflow_dispatch` recovery (`root_version` / `picklescan_version`), and yank procedure — are in [`docs/agents/release-process.md`](docs/agents/release-process.md). For work inside the picklescan package, start from [`packages/modelaudit-picklescan/AGENTS.md`](packages/modelaudit-picklescan/AGENTS.md).
22
+
12
23
  ## Mission & Principles
13
24
 
14
25
  - **Security first:** Never weaken detections or bypass safeguards.
@@ -184,7 +195,7 @@ modelaudit/
184
195
  └── CHANGELOG.md # Keep a Changelog format
185
196
  ```
186
197
 
187
- Key docs: `docs/agents/architecture.md`, `docs/agents/dependencies.md`, `docs/agents/release-process.md`, `docs/agents/new-scanner-quickstart.md`.
198
+ Key docs: `docs/agents/architecture.md`, `docs/agents/dependencies.md`, `docs/agents/release-process.md`, `docs/agents/new-scanner-quickstart.md`, `docs/agents/picklescan-package-split.md`, `packages/modelaudit-picklescan/AGENTS.md`.
188
199
 
189
200
  ## README.md Content Guidelines
190
201
 
@@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.2.41](https://github.com/promptfoo/modelaudit/compare/v0.2.40...v0.2.41) (2026-04-27)
9
+
10
+ ### Bug Fixes
11
+
12
+ - **ci:** skip POSIX proof cases on Windows ([#1072](https://github.com/promptfoo/modelaudit/issues/1072)) ([bfa17a3](https://github.com/promptfoo/modelaudit/commit/bfa17a3e152cd178c5d1fdbfec55dd3f124778ef))
13
+ - **docker:** add apt-get clean and pinned pip constraints to Dockerfile.tensorflow ([#1079](https://github.com/promptfoo/modelaudit/issues/1079)) ([8d9f9b7](https://github.com/promptfoo/modelaudit/commit/8d9f9b7c628ae05cdccf5d8eb480eea89f551e8d))
14
+ - harden picklescan call graph RCE detection ([#1061](https://github.com/promptfoo/modelaudit/issues/1061)) ([19c4fc4](https://github.com/promptfoo/modelaudit/commit/19c4fc487b4758462ac2107a3f3e59463e5d888b))
15
+ - harden picklescan stdlib callable detection ([f0f57b4](https://github.com/promptfoo/modelaudit/commit/f0f57b47f3355bea008a48779dbd856e6f550ec7))
16
+ - improve test isolation, reduce duplication, and fix command injection risk in test suite ([#1078](https://github.com/promptfoo/modelaudit/issues/1078)) ([3867c83](https://github.com/promptfoo/modelaudit/commit/3867c83b2dd0d5ab6a83b650c28d64122a675dea))
17
+ - **picklescan:** avoid call-graph false positives for PyTorch storage IDs ([#1069](https://github.com/promptfoo/modelaudit/issues/1069)) ([e75ed24](https://github.com/promptfoo/modelaudit/commit/e75ed249948558864d8f56882a02f1327323205d))
18
+ - silence stale CodeQL generated import alerts ([#1080](https://github.com/promptfoo/modelaudit/issues/1080)) ([9530740](https://github.com/promptfoo/modelaudit/commit/9530740312725d051a41f7f2a405280ee2be4c62))
19
+ - **telemetry:** stabilize modelaudit identity ([#1071](https://github.com/promptfoo/modelaudit/issues/1071)) ([592a656](https://github.com/promptfoo/modelaudit/commit/592a65672ac58e0b89eb50a54614e736b60c6741))
20
+
21
+ ### Documentation
22
+
23
+ - improve PyPI READMEs ([#1057](https://github.com/promptfoo/modelaudit/issues/1057)) ([1cfb27d](https://github.com/promptfoo/modelaudit/commit/1cfb27de814125470d1e1a38eec03a83d79ff3d9))
24
+
8
25
  ## [0.2.40](https://github.com/promptfoo/modelaudit/compare/v0.2.39...v0.2.40) (2026-04-17)
9
26
 
10
27
  ### Bug Fixes
@@ -74,6 +91,169 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
74
91
 
75
92
  ### Added
76
93
 
94
+ - **security:** detect `mailcap.findmatch` pickle call targets that can execute
95
+ attacker-controlled mailcap `test` commands on Python versions that still
96
+ provide `mailcap`
97
+ - **security:** detect `setuptools._distutils.spawn.spawn` pickle call targets
98
+ that can execute attacker-controlled subprocess command lists when
99
+ `setuptools` is installed
100
+ - **security:** detect `pipes.Template` pickle call targets that can execute
101
+ attacker-controlled shell pipelines on Python versions that still provide
102
+ `pipes`
103
+ - **security:** resolve module-level bound-method aliases and same-module
104
+ constructor call paths in pickle call-graph analysis so process-dispatch
105
+ wrappers are blocked
106
+ - **security:** resolve dangerous `six.moves` compatibility aliases, including
107
+ vendored `six` copies, in pickle call-graph analysis so subprocess, pickle
108
+ deserializer, and builtin execution wrappers are blocked
109
+ - **security:** resolve constructor-default sink aliases assigned to instance
110
+ attributes in pickle call-graph analysis so wrappers like Botocore credential
111
+ process providers are blocked
112
+ - **security:** resolve sink defaults forwarded through `super().__init__` in
113
+ pickle call-graph analysis so async credential process wrappers are blocked
114
+ - **security:** resolve parameter-fed function-local class instance aliases in
115
+ pickle call-graph analysis so wrapper functions like `click.edit` are blocked
116
+ - **security:** resolve function-local import aliases in pickle call-graph
117
+ analysis so wrappers that import RCE sinks inside function bodies are blocked
118
+ - **security:** preserve callable invocation aliases when import-reference
119
+ metadata is crowded, while ignoring uninvoked nested function and lambda
120
+ bodies during pickle call-graph analysis
121
+ - **security:** detect `typing._eval_type` pickle call targets that can
122
+ evaluate attacker-controlled `ForwardRef` expressions
123
+ - **security:** detect `dataclasses._create_fn` pickle call targets that can
124
+ execute attacker-controlled generated Python source
125
+ - **security:** detect `typing.get_type_hints` pickle call targets that can
126
+ evaluate attacker-controlled annotation strings
127
+ - **security:** detect public `operator.call` pickle call targets that can
128
+ invoke attacker-controlled callables
129
+ - **security:** detect `builtins.map` pickle call targets that can lazily
130
+ invoke attacker-controlled callables when iterated
131
+ - **security:** detect `itertools.starmap` pickle call targets that can lazily
132
+ invoke attacker-controlled callables when iterated
133
+ - **security:** detect `builtins.filter` pickle call targets that can lazily
134
+ invoke attacker-controlled callables when iterated
135
+ - **security:** detect `types.MethodType` pickle call targets that can
136
+ synthesize attacker-controlled bound methods for later invocation
137
+ - **security:** detect `types.DynamicClassAttribute.__get__` pickle call
138
+ targets that can invoke attacker-controlled descriptor getters
139
+ - **security:** detect `functools.cached_property.__get__` pickle call targets
140
+ that can invoke attacker-controlled cached-property getters
141
+ - **security:** detect `functools.cmp_to_key` pickle call targets that can
142
+ invoke attacker-controlled comparators during rich comparison
143
+ - **security:** detect `logging.Filterer.filter` pickle call targets that can
144
+ invoke attacker-controlled logging filter callbacks
145
+ - **security:** detect `inspect.getmembers` pickle call targets that can
146
+ invoke attacker-controlled descriptors during introspection
147
+ - **security:** detect `builtins.hasattr` pickle call targets that can invoke
148
+ attacker-controlled descriptors during attribute-existence checks
149
+ - **security:** detect `__del__` finalizer string seeds that can execute
150
+ attacker-controlled methods when pickle-built objects are dropped
151
+ - **security:** detect `__eq__` rich-comparison string seeds that can execute
152
+ attacker-controlled methods during equality checks
153
+ - **security:** detect `__lt__`, `__le__`, `__gt__`, `__ge__`, and `__ne__`
154
+ rich-comparison string seeds that can execute attacker-controlled methods
155
+ during ordering checks
156
+ - **security:** detect `__contains__` membership string seeds that can execute
157
+ attacker-controlled methods during containment checks
158
+ - **security:** detect `__setitem__` item-assignment string seeds that can
159
+ execute attacker-controlled methods during item mutation
160
+ - **security:** detect `__getitem__` and `__delitem__` item-protocol string
161
+ seeds that can execute attacker-controlled methods during item access
162
+ - **security:** detect binary arithmetic and bitwise dunder string seeds that
163
+ can execute attacker-controlled methods during operator dispatch
164
+ - **security:** detect reflected and in-place binary operator dunder string
165
+ seeds that can execute attacker-controlled methods during operator dispatch
166
+ - **security:** detect unary operator dunder string seeds that can execute
167
+ attacker-controlled methods during operator dispatch
168
+ - **security:** detect context-manager entry dunder string seeds and
169
+ `contextlib.ExitStack.enter_context` pickle call targets that can invoke
170
+ attacker-controlled `__enter__` methods
171
+ - **security:** detect iteration protocol dunder string seeds that can execute
172
+ attacker-controlled methods during builtin iteration dispatch
173
+ - **security:** detect numeric rounding protocol dunder string seeds that can
174
+ execute attacker-controlled methods during rounding helper dispatch
175
+ - **security:** detect descriptor setup and numeric coercion dunder string
176
+ seeds that can execute attacker-controlled methods during class creation
177
+ - **security:** detect presentation and size protocol dunder string seeds that
178
+ can execute attacker-controlled methods during common builtin dispatch
179
+ - **security:** detect PathLike `__fspath__` dunder string seeds that can
180
+ route attacker-controlled paths into file APIs during pickle loading
181
+ - **security:** detect direct pickle calls to stdlib file-write sinks such as
182
+ `pathlib.Path.write_text`, `io.open`, and `_io.FileIO`
183
+ - **security:** detect pickle calls to logging file handlers and emit/handle
184
+ dispatch methods that can write attacker-controlled startup hooks
185
+ - **security:** detect pickle calls to `argparse.FileType` and high-level
186
+ logging stream dispatch methods that can write attacker-controlled startup
187
+ hooks
188
+ - **security:** detect pickle calls to NumPy text writers that can write
189
+ attacker-controlled startup hooks
190
+ - **security:** detect pickle calls to `python-dotenv` key writers that can
191
+ write attacker-controlled startup hooks
192
+ - **security:** detect pickle globals whose Python call graph reaches known
193
+ RCE-capable source primitives such as `os.execvpe`
194
+ - **security:** detect pickle globals whose Python call graph pairs file-open
195
+ and file-write wrappers that can create executable startup hooks
196
+ - **security:** resolve pickle-imported Python class globals through bounded
197
+ constructor and object-method call graph entrypoints
198
+ - **security:** detect public `io.FileIO` and `io.TextIOWrapper.write` aliases
199
+ for blocked `_io` file-writing primitives
200
+ - **security:** detect builtin namespace dictionary access that can recover
201
+ blocked primitives through mapping lookups
202
+ - **security:** detect dotted pickle global aliases that resolve to blocked
203
+ source primitives such as `os.system`
204
+ - **security:** detect concrete `pathlib` path writer aliases and module
205
+ namespace dictionary recovery for modules with blocked globals
206
+ - **security:** detect module namespace and `__builtins__` access used for
207
+ dynamic builtin recovery
208
+ - **security:** detect `string.Formatter.get_field` pickle call targets that
209
+ can traverse attacker-controlled field expressions into callable objects
210
+ - **security:** detect `unittest.mock._get_target` pickle call targets that
211
+ can manufacture delayed `pkgutil.resolve_name` resolver partials
212
+ - **security:** detect descriptor getter pickle call targets that can bind
213
+ recovered function descriptors and expose builtin namespaces
214
+ - **security:** detect wrapper and method descriptor getter pickle call targets
215
+ that can bind recovered slot wrappers for dynamic attribute access
216
+ - **security:** detect global references to attribute-access and function
217
+ namespace source methods used for dynamic builtin recovery
218
+ - **security:** detect object subclass enumeration globals that can recover
219
+ loaded process capabilities without direct imports
220
+ - **security:** detect garbage collector object-graph globals that can recover
221
+ hidden namespaces and loaded process capabilities
222
+ - **security:** detect frame-introspection globals and frame namespace
223
+ descriptor getters used for dynamic builtin recovery
224
+ - **security:** detect callable `__call__` aliases of blocked pickle globals
225
+ used to invoke hidden RCE source primitives
226
+ - **security:** detect wrapper `__get__` and `__self__` aliases of blocked
227
+ pickle globals used to recover hidden RCE source primitives
228
+ - **security:** detect attribute aliases under blocked pickle global prefixes
229
+ used to recover hidden RCE source primitives
230
+ - **security:** detect pickle calls to PyYAML unsafe loaders that can execute
231
+ attacker-controlled Python constructors
232
+ - **security:** detect pickle calls to `codecs.open` and codec stream writes
233
+ that can write attacker-controlled startup hooks
234
+ - **security:** detect pickle calls to durable tempfile creation and CSV
235
+ `DictWriter` row dispatch that can write attacker-controlled startup hooks
236
+ - **security:** detect pickle calls to mailbox single-file `add` dispatch
237
+ methods that can write attacker-controlled startup hooks
238
+ - **security:** detect pickle calls to `_tkinter` Tcl interpreter dispatch
239
+ methods that can execute local commands
240
+ - **security:** detect high-level `tkinter.Misc` pickle call targets that can
241
+ forward attacker-controlled commands into Tcl interpreter dispatch
242
+ - **security:** detect pickle calls to `_xxsubinterpreters.run_string` that
243
+ can execute attacker-controlled Python source
244
+ - **security:** detect `builtins.staticmethod` pickle call targets that can
245
+ synthesize callable descriptors for later invocation
246
+ - **security:** detect `builtins.property.__get__` pickle call targets that
247
+ can invoke attacker-controlled property getters during descriptor access
248
+ - **security:** detect `builtins.classmethod.__get__` pickle call targets that
249
+ can synthesize attacker-controlled bound methods during descriptor access
250
+ - **security:** detect `_functools.partial` pickle call targets that can
251
+ synthesize private-alias partial callables for later invocation
252
+ - **security:** detect `_functools.reduce` pickle call targets that can invoke
253
+ attacker-controlled reducer callables through the private CPython alias
254
+ - **security:** detect `functools.cache`, `functools.lru_cache`, and
255
+ `functools.singledispatch` pickle call targets that can synthesize callable
256
+ wrappers around attacker-controlled functions for later invocation
77
257
  - **cli:** add scanner selection with `--scanners`, `--exclude-scanner`, and `--list-scanners` wired into core routing, nested dispatch, remote prefilters, and scan metadata; selection-suppressed preferred scanners emit a stderr warning and populate `scanner_selection.suppressed_preferred_scanner_ids`, and unknown scanner names suggest the closest match
78
258
  - **pickle:** replace the standalone pickle scanner's package-engine selector with the Rust-only runtime and explicit native-extension errors
79
259
  - **pickle:** scan PyTorch ZIP checkpoint pickle members directly in the standalone pickle scanner
@@ -86,6 +266,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
86
266
 
87
267
  ### Changed
88
268
 
269
+ - **telemetry:** persist ModelAudit distinct IDs in Promptfoo's global config
270
+ format (creating `~/.promptfoo/promptfoo.yaml` if absent and migrating any
271
+ legacy `~/.modelaudit/user_config.json` ID) and include `isRunningInCi` on
272
+ analytics payloads, with presence-based detection for marker-style providers
273
+ (TeamCity, CodeBuild, Bitbucket, Jenkins)
89
274
  - **docs:** align public README and compatibility guidance with supported Python 3.10-3.13, TensorFlow extra requirements, supported formats, and telemetry sanitization behavior
90
275
  - **security:** credit @mosebit for privately reporting a TensorRT native-code detection gap that helped harden native-code scanner coverage
91
276
  - **security-policy:** clarify when low-impact scanner coverage gaps may be closed without publishing a public advisory while still crediting reporters
@@ -102,6 +287,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
102
287
 
103
288
  ### Fixed
104
289
 
290
+ - **pickle:** detect stdlib filesystem probe and process-state callables such as `pathlib` metadata methods, `decimal.setcontext`, and `gc.disable` during pickle scans, while keeping local container mutations clean and covering public `operator.setitem` registry poisoning plus target-aware `operator.imul` warning-filter mutation.
291
+ - **pickle:** detect public `operator.setitem` pickle calls, keep callable
292
+ invocation aliases ahead of import-reference budget exhaustion, dedupe repeated
293
+ invocation metadata before the reporting cap, preserve literal mapping-key
294
+ shadowing through `ChainMap`, block deeply wrapped `defaultdict` factories,
295
+ and avoid outer-function call-graph false positives from nested function and
296
+ lambda bodies.
105
297
  - **security:** prevent HuggingFace whitelist provenance from downgrading active payload, CVE, traversal, executable, operational-error, or incomplete-coverage findings. Exemptions now cover S1xx code-execution primitives (`S101`–`S115`) and HIGH-severity S3xx network primitives (`S301`/`S304`/`S305`/`S310`), and the keyword fallback uses word-boundary matching so substrings like "executable" inside "ExecuTorch" no longer over-suppress legitimate downgrades.
106
298
  - **security:** scan generic ZIP/TAR/NPZ Python members and ZIP/TAR/NPZ executable members, including wildcard imports and callable rebindings while failing closed on malformed Python source. Findings carry accurate rule codes per risk category (`S101` for `os.system`/`os.popen`, `S103` for `subprocess.*`, `S104` for `eval`/`exec`, `S106` for `__import__`, `S107` for `importlib.import_module`, `S213` for `pickle.load`/`pickle.loads`) instead of a single catch-all, the ZIP path now honors `max_mar_python_analysis_bytes` for non-MAR Python members, and source bytes are parsed directly so PEP 263 encoding declarations are respected.
107
299
  - **security:** bound PyTorch ZIP JIT/network member reads (default 32 MiB per-member cap, configurable via `max_jit_scan_member_bytes`) and mark oversized or unreadable member coverage inconclusive. Oversize and read-failure events are aggregated into a single summary INFO check per kind (with per-member detail in `details["entries"]`) so adversarial archives cannot flood the checks list, duplicate-name entries are de-duplicated by `ZipInfo` identity rather than filename so the second of two same-name members is still analyzed, directory entries are skipped explicitly, and pickle members continue through the bounded JIT/network pass so padded payloads remain covered beyond the pickle scanner raw window.
@@ -1,4 +1,4 @@
1
- ARG PYTHON_IMAGE=python:3.13-slim@sha256:d168b8d9eb761f4d3fe305ebd04aeb7e7f2de0297cec5fb2f8f6403244621664
1
+ ARG PYTHON_IMAGE=python:3.13-slim@sha256:a0779d7c12fc20be6ec6b4ddc901a4fd7657b8a6bc9def9d3fde89ed5efe0a3d
2
2
  # Keep the major/minor version in sync with packages/modelaudit-picklescan/Cargo.toml rust-version.
3
3
  ARG PICKLESCAN_RUST_TOOLCHAIN=1.83.0
4
4
 
@@ -1,4 +1,4 @@
1
- ARG PYTHON_IMAGE=python:3.13-slim@sha256:d168b8d9eb761f4d3fe305ebd04aeb7e7f2de0297cec5fb2f8f6403244621664
1
+ ARG PYTHON_IMAGE=python:3.13-slim@sha256:a0779d7c12fc20be6ec6b4ddc901a4fd7657b8a6bc9def9d3fde89ed5efe0a3d
2
2
  # Keep the major/minor version in sync with packages/modelaudit-picklescan/Cargo.toml rust-version.
3
3
  ARG PICKLESCAN_RUST_TOOLCHAIN=1.83.0
4
4
 
@@ -1,18 +1,20 @@
1
- FROM python:3.13-slim@sha256:d168b8d9eb761f4d3fe305ebd04aeb7e7f2de0297cec5fb2f8f6403244621664
1
+ FROM python:3.12-slim@sha256:46cb7cc2877e60fbd5e21a9ae6115c30ace7a077b9f8772da879e4590c18c2e3
2
2
 
3
3
  WORKDIR /app
4
4
 
5
5
  # Pull in current Debian security fixes from the configured apt sources.
6
6
  RUN apt-get update \
7
7
  && apt-get install --yes --no-install-recommends --only-upgrade libc-bin libc6 \
8
+ && apt-get clean \
8
9
  && rm -rf /var/lib/apt/lists/*
9
10
 
10
11
  # Copy only necessary files for installation
11
12
  COPY pyproject.toml README.md ./
13
+ COPY requirements-tensorflow.txt ./
12
14
  COPY modelaudit ./modelaudit
13
15
 
14
- # Install the application with TensorFlow extras
15
- RUN pip install --no-cache-dir ".[tensorflow]"
16
+ # Install the application with TensorFlow extras using pinned constraints
17
+ RUN pip install --no-cache-dir -c requirements-tensorflow.txt ".[tensorflow]"
16
18
 
17
19
  # Create a non-root user
18
20
  ARG UID=10001
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modelaudit
3
- Version: 0.2.40
3
+ Version: 0.2.41
4
4
  Summary: Static scanning library for detecting malicious code, potential backdoor indicators, and other security risks in ML model files
5
5
  Project-URL: Repository, https://github.com/promptfoo/modelaudit
6
6
  Project-URL: Homepage, https://github.com/promptfoo/modelaudit
@@ -130,11 +130,23 @@ Description-Content-Type: text/markdown
130
130
  [![Python versions](https://img.shields.io/pypi/pyversions/modelaudit.svg)](https://pypi.org/project/modelaudit/)
131
131
  [![Code Style: ruff](https://img.shields.io/badge/code%20style-ruff-005cd7.svg)](https://github.com/astral-sh/ruff)
132
132
  [![License](https://img.shields.io/github/license/promptfoo/modelaudit)](https://github.com/promptfoo/modelaudit/blob/main/LICENSE)
133
+ [![Security policy](https://img.shields.io/badge/security-policy-brightgreen.svg)](https://github.com/promptfoo/modelaudit/security/policy)
133
134
 
134
135
  <img width="989" alt="ModelAudit scan results" src="https://www.promptfoo.dev/img/docs/modelaudit/modelaudit-result.png" />
135
136
 
136
137
  **[Full Documentation](https://www.promptfoo.dev/docs/model-audit/)** | **[Usage Examples](https://www.promptfoo.dev/docs/model-audit/usage/)** | **[Supported Formats](https://www.promptfoo.dev/docs/model-audit/scanners/)**
137
138
 
139
+ ## Why ModelAudit
140
+
141
+ Models download from untrusted registries, pass through CI, and end up running in production. Traditional SAST tools do not look at pickle opcodes, HDF5 group layouts, ONNX proto graphs, or TensorFlow SavedModel signatures — ModelAudit does:
142
+
143
+ - **Scan statically.** No model is ever loaded, unpickled, or executed.
144
+ - **Cover the formats you actually ship.** 40+ scanners spanning pickle, PyTorch, SafeTensors, ONNX, TensorFlow, Keras, GGUF, archives, and configs.
145
+ - **Fit into CI.** Machine-readable output (JSON, SARIF), strict mode, exit codes, and [selectable scanners](https://github.com/promptfoo/modelaudit/blob/main/docs/user/scanner-selection.md).
146
+ - **Fail closed.** Truncated reads, exhausted budgets, and unsupported formats are reported as coverage gaps, not silent passes.
147
+
148
+ Comparable tools: [`picklescan`](https://github.com/mmaitre314/picklescan) (pickle only, Python-based), [`fickling`](https://github.com/trailofbits/fickling) (pickle only, AST-based), [`modelscan`](https://github.com/protectai/modelscan) (pickle + TensorFlow + Keras subset). ModelAudit is broader in coverage and ships a native Rust pickle engine via its companion package [`modelaudit-picklescan`](https://pypi.org/project/modelaudit-picklescan/).
149
+
138
150
  ## Quick Start
139
151
 
140
152
  **Requires Python 3.10-3.13**
@@ -356,7 +368,8 @@ ModelAudit includes telemetry for product reliability and usage analytics.
356
368
  - Collected metadata can include command usage, scan timing, scanner/file-type usage, issue severity/type aggregates, sanitized model names/references, and coarse metadata like file extension/domain.
357
369
  - URL telemetry strips userinfo, query strings, and fragments from model references. Avoid putting credentials in model names, file names, or artifact paths when telemetry is enabled.
358
370
  - Model files are scanned locally and ModelAudit does not upload model binary contents as telemetry events.
359
- - Telemetry is disabled automatically in CI/test environments and in editable development installs by default.
371
+ - Telemetry is disabled automatically when `CI=true` is set or `IS_TESTING=true` is set, and in editable development installs by default. Events that are sent from other CI providers (TeamCity, CodeBuild, Bitbucket Pipelines, Jenkins) are tagged with `isRunningInCi=true` so they can be filtered downstream.
372
+ - The anonymous user identifier is stored in `~/.promptfoo/promptfoo.yaml` for cross-tool correlation with [Promptfoo](https://www.promptfoo.dev/). Existing IDs from `~/.modelaudit/user_config.json` are migrated on first run after upgrade.
360
373
 
361
374
  Opt out explicitly with either environment variable:
362
375
 
@@ -405,6 +418,18 @@ modelaudit model.pkl --format sarif --output results.sarif
405
418
  - **[Offline/air-gapped guide](https://github.com/promptfoo/modelaudit/blob/main/docs/user/offline-air-gapped.md)** — secure operation without internet access
406
419
  - **Troubleshooting** — run `modelaudit doctor --show-failed` to check scanner availability
407
420
 
421
+ ## Related Packages
422
+
423
+ - **[`modelaudit-picklescan`](https://pypi.org/project/modelaudit-picklescan/)** — the standalone Rust-backed pickle scanner used by ModelAudit's pickle, PyTorch, ExecuTorch, and PyTorch-ZIP scanners. Install it directly if you only need pickle analysis (as a library, not a CLI) and do not want the full scanner bundle.
424
+
425
+ ## Reporting Vulnerabilities
426
+
427
+ Do not open public issues for suspected vulnerabilities. See [SECURITY.md](https://github.com/promptfoo/modelaudit/blob/main/SECURITY.md) for coordinated disclosure.
428
+
429
+ ## Contributing
430
+
431
+ Issues, feature requests, and PRs are welcome. See [CONTRIBUTING.md](https://github.com/promptfoo/modelaudit/blob/main/CONTRIBUTING.md).
432
+
408
433
  ## License
409
434
 
410
435
  MIT License — see [LICENSE](https://github.com/promptfoo/modelaudit/blob/main/LICENSE) for details.
@@ -6,11 +6,23 @@
6
6
  [![Python versions](https://img.shields.io/pypi/pyversions/modelaudit.svg)](https://pypi.org/project/modelaudit/)
7
7
  [![Code Style: ruff](https://img.shields.io/badge/code%20style-ruff-005cd7.svg)](https://github.com/astral-sh/ruff)
8
8
  [![License](https://img.shields.io/github/license/promptfoo/modelaudit)](https://github.com/promptfoo/modelaudit/blob/main/LICENSE)
9
+ [![Security policy](https://img.shields.io/badge/security-policy-brightgreen.svg)](https://github.com/promptfoo/modelaudit/security/policy)
9
10
 
10
11
  <img width="989" alt="ModelAudit scan results" src="https://www.promptfoo.dev/img/docs/modelaudit/modelaudit-result.png" />
11
12
 
12
13
  **[Full Documentation](https://www.promptfoo.dev/docs/model-audit/)** | **[Usage Examples](https://www.promptfoo.dev/docs/model-audit/usage/)** | **[Supported Formats](https://www.promptfoo.dev/docs/model-audit/scanners/)**
13
14
 
15
+ ## Why ModelAudit
16
+
17
+ Models download from untrusted registries, pass through CI, and end up running in production. Traditional SAST tools do not look at pickle opcodes, HDF5 group layouts, ONNX proto graphs, or TensorFlow SavedModel signatures — ModelAudit does:
18
+
19
+ - **Scan statically.** No model is ever loaded, unpickled, or executed.
20
+ - **Cover the formats you actually ship.** 40+ scanners spanning pickle, PyTorch, SafeTensors, ONNX, TensorFlow, Keras, GGUF, archives, and configs.
21
+ - **Fit into CI.** Machine-readable output (JSON, SARIF), strict mode, exit codes, and [selectable scanners](https://github.com/promptfoo/modelaudit/blob/main/docs/user/scanner-selection.md).
22
+ - **Fail closed.** Truncated reads, exhausted budgets, and unsupported formats are reported as coverage gaps, not silent passes.
23
+
24
+ Comparable tools: [`picklescan`](https://github.com/mmaitre314/picklescan) (pickle only, Python-based), [`fickling`](https://github.com/trailofbits/fickling) (pickle only, AST-based), [`modelscan`](https://github.com/protectai/modelscan) (pickle + TensorFlow + Keras subset). ModelAudit is broader in coverage and ships a native Rust pickle engine via its companion package [`modelaudit-picklescan`](https://pypi.org/project/modelaudit-picklescan/).
25
+
14
26
  ## Quick Start
15
27
 
16
28
  **Requires Python 3.10-3.13**
@@ -232,7 +244,8 @@ ModelAudit includes telemetry for product reliability and usage analytics.
232
244
  - Collected metadata can include command usage, scan timing, scanner/file-type usage, issue severity/type aggregates, sanitized model names/references, and coarse metadata like file extension/domain.
233
245
  - URL telemetry strips userinfo, query strings, and fragments from model references. Avoid putting credentials in model names, file names, or artifact paths when telemetry is enabled.
234
246
  - Model files are scanned locally and ModelAudit does not upload model binary contents as telemetry events.
235
- - Telemetry is disabled automatically in CI/test environments and in editable development installs by default.
247
+ - Telemetry is disabled automatically when `CI=true` is set or `IS_TESTING=true` is set, and in editable development installs by default. Events that are sent from other CI providers (TeamCity, CodeBuild, Bitbucket Pipelines, Jenkins) are tagged with `isRunningInCi=true` so they can be filtered downstream.
248
+ - The anonymous user identifier is stored in `~/.promptfoo/promptfoo.yaml` for cross-tool correlation with [Promptfoo](https://www.promptfoo.dev/). Existing IDs from `~/.modelaudit/user_config.json` are migrated on first run after upgrade.
236
249
 
237
250
  Opt out explicitly with either environment variable:
238
251
 
@@ -281,6 +294,18 @@ modelaudit model.pkl --format sarif --output results.sarif
281
294
  - **[Offline/air-gapped guide](https://github.com/promptfoo/modelaudit/blob/main/docs/user/offline-air-gapped.md)** — secure operation without internet access
282
295
  - **Troubleshooting** — run `modelaudit doctor --show-failed` to check scanner availability
283
296
 
297
+ ## Related Packages
298
+
299
+ - **[`modelaudit-picklescan`](https://pypi.org/project/modelaudit-picklescan/)** — the standalone Rust-backed pickle scanner used by ModelAudit's pickle, PyTorch, ExecuTorch, and PyTorch-ZIP scanners. Install it directly if you only need pickle analysis (as a library, not a CLI) and do not want the full scanner bundle.
300
+
301
+ ## Reporting Vulnerabilities
302
+
303
+ Do not open public issues for suspected vulnerabilities. See [SECURITY.md](https://github.com/promptfoo/modelaudit/blob/main/SECURITY.md) for coordinated disclosure.
304
+
305
+ ## Contributing
306
+
307
+ Issues, feature requests, and PRs are welcome. See [CONTRIBUTING.md](https://github.com/promptfoo/modelaudit/blob/main/CONTRIBUTING.md).
308
+
284
309
  ## License
285
310
 
286
311
  MIT License — see [LICENSE](https://github.com/promptfoo/modelaudit/blob/main/LICENSE) for details.
@@ -94,7 +94,7 @@ If a fix requires longer than the default window, we will negotiate an extension
94
94
 
95
95
  ## When we issue CVEs
96
96
 
97
- We request CVE IDs through [GitHub's CVE Numbering Authority (CNA)](https://docs.github.com/en/code-security/security-advisories/working-with-repository-security-advisories/about-github-security-advisories-for-repositories) program. Not every security fix warrants a CVE.
97
+ We request CVE IDs through [GitHub's CVE Numbering Authority (CNA)](https://docs.github.com/code-security/security-advisories/repository-security-advisories/about-repository-security-advisories) program. Not every security fix warrants a CVE.
98
98
 
99
99
  **CVE issued:**
100
100
 
@@ -123,6 +123,7 @@ When in doubt, we err toward issuing a CVE.
123
123
  **In scope:**
124
124
 
125
125
  - The `modelaudit` Python package published on [PyPI](https://pypi.org/project/modelaudit/).
126
+ - The `modelaudit-picklescan` Python package published on [PyPI](https://pypi.org/project/modelaudit-picklescan/), including its bundled Rust pickle engine.
126
127
  - The official Docker images.
127
128
  - The GitHub Actions CI/CD workflows in the [modelaudit repository](https://github.com/promptfoo/modelaudit).
128
129
 
@@ -53,7 +53,7 @@ These are installed only when the corresponding extra is requested.
53
53
  | onnx | `onnx` | Apache-2.0 | <https://onnx.ai/> |
54
54
  | py7zr | `sevenzip` | LGPL-2.1+ | <https://github.com/miurahr/py7zr> |
55
55
  | pybcj | `sevenzip` | LGPL-2.1+ | <https://github.com/miurahr/pybcj> |
56
- | py-ubjson | `xgboost` | Apache-2.0 | <https://github.com/Iber/py-ubjson> |
56
+ | py-ubjson | `xgboost` | Apache-2.0 | <https://github.com/Iotic-Labs/py-ubjson> |
57
57
  | pyppmd | `sevenzip` | LGPL-2.1+ | <https://github.com/miurahr/pyppmd> |
58
58
  | safetensors | `safetensors` | Apache-2.0 | <https://github.com/huggingface/safetensors> |
59
59
  | scikit-learn | `joblib` | BSD-3-Clause | <https://scikit-learn.org/> |
@@ -0,0 +1,151 @@
1
+ # Release Process
2
+
3
+ This repo is a monorepo with **two independently versioned PyPI packages**:
4
+
5
+ | PyPI name | Path | Version source | Git tag format |
6
+ | ----------------------- | --------------------------------- | ------------------------------- | -------------------------------- |
7
+ | `modelaudit` | `./` (root) | `pyproject.toml` + `uv.lock` | `v{X.Y.Z}` |
8
+ | `modelaudit-picklescan` | `packages/modelaudit-picklescan/` | `pyproject.toml` + `Cargo.toml` | `modelaudit-picklescan-v{X.Y.Z}` |
9
+
10
+ Both packages are driven by a single [release-please](https://github.com/googleapis/release-please) workflow (`.github/workflows/release-please.yml`) with two components declared in `release-please-config.json` and current versions pinned in `.release-please-manifest.json`.
11
+
12
+ The root `modelaudit` wheel declares a **hard dependency** on `modelaudit-picklescan>=0.1.0,<0.2.0` in `pyproject.toml`. When the sibling version crosses `0.2.0`, the constraint must be bumped in the same PR.
13
+
14
+ ## Normal flow
15
+
16
+ 1. **Write Conventional Commits** — `feat:`, `fix:`, `docs:`, etc. Release-please uses these to compute the next version and the changelog entry.
17
+ 2. **Merge to `main`** — release-please creates or updates a "Release PR" per changed component. Commits that only touch `packages/modelaudit-picklescan/` feed the picklescan component; everything else feeds the root component.
18
+ 3. **Review and merge the Release PR** — release-please tags the release and the workflow runs the matching publish jobs:
19
+ - **For `modelaudit`** — `build` produces sdist+wheel → `publish-pypi` uploads via OIDC → `provenance` attests and uploads SBOM.
20
+ - **For `modelaudit-picklescan`** — `build-picklescan-package` matrix builds 5 native wheels (Linux x86_64, Linux aarch64, macOS arm64, macOS x86_64, Windows x64) + sdist → `publish-picklescan-pypi` uploads → `picklescan-provenance` attests.
21
+
22
+ ## Version scheme (0ver)
23
+
24
+ Both packages follow [0ver](https://0ver.org/) — we stay in `0.x.y` indefinitely:
25
+
26
+ - `fix:` commits bump **patch**
27
+ - `feat:` commits bump **patch**
28
+ - `feat!:` or `BREAKING CHANGE:` bumps **minor**
29
+
30
+ The two components bump independently: a picklescan-only `fix:` bumps only `modelaudit-picklescan`.
31
+
32
+ ## Manual version override
33
+
34
+ To force a specific version on the release PR:
35
+
36
+ ```
37
+ feat: major new feature
38
+
39
+ Release-As: 1.0.0
40
+ ```
41
+
42
+ ## Manual recovery path (workflow_dispatch)
43
+
44
+ The release-please workflow accepts inputs to re-run the publish step for an already-tagged release without cutting a new tag. Use when:
45
+
46
+ - A prior release tagged successfully but the publish job failed (e.g. transient PyPI outage, runner misconfiguration).
47
+ - You need to re-publish an existing version to a package that was registered on PyPI after the fact.
48
+
49
+ ```bash
50
+ # Re-publish modelaudit at an already-tagged version
51
+ gh workflow run release-please.yml -f root_version=<X.Y.Z>
52
+
53
+ # Re-publish modelaudit-picklescan at an already-tagged version
54
+ gh workflow run release-please.yml -f picklescan_version=<X.Y.Z>
55
+ ```
56
+
57
+ The workflow's `Resolve manual release inputs` step flips `manual_release=true`, skips the release-please action, ensures the GitHub release exists (creating it if not), then feeds `release_created=true` / `picklescan_release_created=true` into the publish jobs. `uv build` always reads from `pyproject.toml` at the current `HEAD`, so the tagged commit must already contain the target version; dispatching a version that does not match what's in `HEAD` will fail the PyPI upload.
58
+
59
+ ## PyPI trusted publishing (first-time setup)
60
+
61
+ Both packages publish via PyPI [Trusted Publishing](https://docs.pypi.org/trusted-publishers/). The `publish-pypi` and `publish-picklescan-pypi` jobs both use environment `pypi` and `id-token: write` permissions. PyPI is configured with an **active trusted publisher** on each project, scoped to owner `promptfoo`, repository `modelaudit`, workflow `release-please.yml`, environment `pypi`.
62
+
63
+ ### Adding a new PyPI package
64
+
65
+ When you introduce a new PyPI package in this repo, register a **pending trusted publisher** on PyPI _before_ the first publish attempt, or the workflow will fail with `400 Non-user identities cannot create new projects`.
66
+
67
+ Steps:
68
+
69
+ 1. Log in to PyPI → Your account → Publishing → **Add a new pending publisher**.
70
+ 2. Fields: PyPI Project Name (hyphenated — PyPI normalizes), Owner (`promptfoo`), Repository (`modelaudit`), Workflow filename (`release-please.yml`), Environment (`pypi`).
71
+ 3. The pending publisher is automatically promoted to an active one after the first successful publish.
72
+
73
+ ## Commit conventions
74
+
75
+ - **NEVER commit directly to `main` branch** — always create a feature branch and PR.
76
+ - Use Conventional Commit format for ALL commit messages.
77
+ - Add user-visible entries to `CHANGELOG.md` (root) or `packages/modelaudit-picklescan/CHANGELOG.md` under `## [Unreleased]` during feature work. Release-please promotes unreleased entries to a version-tagged section when the Release PR is merged.
78
+ - PR titles must follow Conventional Commits (validated by CI).
79
+
80
+ Examples:
81
+
82
+ ```
83
+ feat: add scanner for XYZ format
84
+ fix: handle corrupt pickle files gracefully
85
+ fix(modelaudit-picklescan): bound nested pickle expansion
86
+ ```
87
+
88
+ ## Pre-release checklist (maintainers)
89
+
90
+ Before merging a Release PR:
91
+
92
+ 1. Release PR version and changelog content look correct for every component bumped.
93
+ 2. Required checks green: `CI Success`, `Docker CI Success`, docs checks, CodeQL, and — for picklescan bumps — `Standalone Pickle Package (3.10/3.11/3.12/3.13)`.
94
+ 3. Release-build validation green:
95
+ - `twine check dist/*`
96
+ - exactly one wheel + one sdist for `modelaudit`
97
+ - 5 wheels + one sdist for `modelaudit-picklescan`, each matching the release version
98
+ - clean-room install smoke tests from wheel and sdist
99
+ - project URL metadata checks (`Bug Tracker`, `Changelog`)
100
+ - standalone Rust gates: `cargo fmt --check`, `cargo check`, `cargo clippy -D warnings`, `cargo test`, wheel build, clean-room wheel smoke test
101
+ 4. No unreviewed high-severity security findings outstanding.
102
+ 5. After merging, verify GitHub Release exists and PyPI publish completed for each bumped component:
103
+
104
+ ```bash
105
+ # modelaudit
106
+ curl -s https://pypi.org/pypi/modelaudit/json | jq .info.version
107
+
108
+ # modelaudit-picklescan (simple index surfaces yank flags)
109
+ curl -sH "Accept: application/vnd.pypi.simple.v1+json" \
110
+ https://pypi.org/simple/modelaudit-picklescan/ | jq '.files[-1].filename'
111
+ ```
112
+
113
+ ## Rollback / recovery procedures
114
+
115
+ Use the least disruptive path.
116
+
117
+ ### Release PR unmerged
118
+
119
+ - Close or update the Release PR and regenerate with new commits.
120
+
121
+ ### GitHub release exists but PyPI publish failed
122
+
123
+ - Fix workflow / secrets issues, then **re-run the failed publish job** (`gh run rerun <run-id> --failed`) OR dispatch the manual recovery path:
124
+
125
+ ```bash
126
+ gh workflow run release-please.yml -f root_version=<X.Y.Z>
127
+ gh workflow run release-please.yml -f picklescan_version=<X.Y.Z>
128
+ ```
129
+
130
+ ### A published version is broken (e.g. unresolvable deps)
131
+
132
+ - **Yank** the affected version on PyPI. PyPI has no CLI/API for yanks — it must be done in the web UI:
133
+ 1. Open the PyPI releases page for the affected package, such as
134
+ <https://pypi.org/manage/project/modelaudit/releases/> or
135
+ <https://pypi.org/manage/project/modelaudit-picklescan/releases/>.
136
+ 2. Click the version → Options → **Yank**
137
+ 3. Provide a short reason (shown in the PyPI simple index).
138
+ - Yanked versions remain installable if a user pins the exact version, but pip/uv resolvers skip them by default. Prefer yank + follow-up patch over deletion.
139
+ - Ship a follow-up patch release (`X.Y.Z+1`) with a clear changelog note explaining the yank.
140
+
141
+ ### Broken monorepo version coupling
142
+
143
+ If `modelaudit` is published with a dependency on a `modelaudit-picklescan` version that is not on PyPI, **every dependent `modelaudit` release is unusable** — pip will either silently downgrade to an older `modelaudit` or fail resolution. Recovery:
144
+
145
+ 1. Publish the missing `modelaudit-picklescan` version first (via the manual recovery path above).
146
+ 2. Yank the affected `modelaudit` versions.
147
+ 3. Cut a new `modelaudit` patch release pointing at the now-resolvable sibling.
148
+
149
+ ### Release metadata / tagging incorrect
150
+
151
+ - Prefer a corrective follow-up release over rewriting public history. Do not force-push tags.
@@ -24,6 +24,8 @@ _runtime_version.ValidateProtobufRuntimeVersion(
24
24
  from tensorflow.core.framework import attr_value_pb2 as tensorflow_dot_core_dot_framework_dot_attr__value__pb2
25
25
 
26
26
  # Keep generated dependency imports for descriptor registration side effects.
27
+ # Reference aliases so static analysis preserves these side-effect imports.
28
+ id(tensorflow_dot_core_dot_framework_dot_attr__value__pb2)
27
29
  del tensorflow_dot_core_dot_framework_dot_attr__value__pb2
28
30
  DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'tensorflow/core/framework/api_def.proto\x12\ntensorflow\x1a*tensorflow/core/framework/attr_value.proto\"\xe1\x05\n\x06\x41piDef\x12\x15\n\rgraph_op_name\x18\x01 \x01(\t\x12\x1b\n\x13\x64\x65precation_message\x18\x0c \x01(\t\x12\x1b\n\x13\x64\x65precation_version\x18\r \x01(\x05\x12\x31\n\nvisibility\x18\x02 \x01(\x0e\x32\x1d.tensorflow.ApiDef.Visibility\x12-\n\x08\x65ndpoint\x18\x03 \x03(\x0b\x32\x1b.tensorflow.ApiDef.Endpoint\x12&\n\x06in_arg\x18\x04 \x03(\x0b\x32\x16.tensorflow.ApiDef.Arg\x12\'\n\x07out_arg\x18\x05 \x03(\x0b\x32\x16.tensorflow.ApiDef.Arg\x12\x11\n\targ_order\x18\x0b \x03(\t\x12%\n\x04\x61ttr\x18\x06 \x03(\x0b\x32\x17.tensorflow.ApiDef.Attr\x12\x0f\n\x07summary\x18\x07 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x1a\n\x12\x64\x65scription_prefix\x18\t \x01(\t\x12\x1a\n\x12\x64\x65scription_suffix\x18\n \x01(\t\x1aI\n\x08\x45ndpoint\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x03 \x01(\x08\x12\x1b\n\x13\x64\x65precation_version\x18\x04 \x01(\x05\x1a;\n\x03\x41rg\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\trename_to\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x1aj\n\x04\x41ttr\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\trename_to\x18\x02 \x01(\t\x12,\n\rdefault_value\x18\x03 \x01(\x0b\x32\x15.tensorflow.AttrValue\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\"G\n\nVisibility\x12\x16\n\x12\x44\x45\x46\x41ULT_VISIBILITY\x10\x00\x12\x0b\n\x07VISIBLE\x10\x01\x12\x08\n\x04SKIP\x10\x02\x12\n\n\x06HIDDEN\x10\x03\")\n\x07\x41piDefs\x12\x1e\n\x02op\x18\x01 \x03(\x0b\x32\x12.tensorflow.ApiDefB}\n\x18org.tensorflow.frameworkB\x0c\x41piDefProtosP\x01ZNgithub.com/tensorflow/tensorflow/tensorflow/go/core/framework/api_def_go_proto\xf8\x01\x01\x62\x06proto3')
29
31
 
@@ -26,6 +26,10 @@ from tensorflow.core.framework import tensor_shape_pb2 as tensorflow_dot_core_do
26
26
  from tensorflow.core.framework import types_pb2 as tensorflow_dot_core_dot_framework_dot_types__pb2
27
27
 
28
28
  # Keep generated dependency imports for descriptor registration side effects.
29
+ # Reference aliases so static analysis preserves these side-effect imports.
30
+ id(tensorflow_dot_core_dot_framework_dot_tensor__pb2)
31
+ id(tensorflow_dot_core_dot_framework_dot_tensor__shape__pb2)
32
+ id(tensorflow_dot_core_dot_framework_dot_types__pb2)
29
33
  del tensorflow_dot_core_dot_framework_dot_tensor__pb2
30
34
  del tensorflow_dot_core_dot_framework_dot_tensor__shape__pb2
31
35
  del tensorflow_dot_core_dot_framework_dot_types__pb2