{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://www.promptfoo.dev/schemas/modelaudit/modelaudit-scan-result.schema.json",
  "$defs": {
    "AssetModel": {
      "description": "Model for scanned assets",
      "properties": {
        "path": {
          "description": "Path to the asset",
          "title": "Path",
          "type": "string"
        },
        "type": {
          "description": "Type of asset (e.g., 'pickle')",
          "title": "Type",
          "type": "string"
        },
        "size": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Size of the asset in bytes",
          "title": "Size"
        },
        "is_streamed": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Whether the asset came from an ephemeral streaming scan",
          "title": "Is Streamed"
        },
        "tensors": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "List of tensor names (for safetensors)",
          "title": "Tensors"
        },
        "keys": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "List of keys (for JSON manifests)",
          "title": "Keys"
        },
        "contents": {
          "anyOf": [
            {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Contents list (for ZIP files)",
          "title": "Contents"
        }
      },
      "required": ["path", "type"],
      "title": "AssetModel",
      "type": "object"
    },
    "Check": {
      "additionalProperties": true,
      "description": "Pydantic model representing a single security check performed during scanning",
      "properties": {
        "name": {
          "description": "Name of the check performed",
          "title": "Name",
          "type": "string"
        },
        "status": {
          "$ref": "#/$defs/CheckStatus",
          "description": "Whether the check passed or failed"
        },
        "message": {
          "description": "Description of what was checked",
          "title": "Message",
          "type": "string"
        },
        "severity": {
          "anyOf": [
            {
              "$ref": "#/$defs/IssueSeverity"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Severity (only for failed checks)"
        },
        "location": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "File position, line number, etc.",
          "title": "Location"
        },
        "details": {
          "additionalProperties": true,
          "description": "Additional check details",
          "title": "Details",
          "type": "object"
        },
        "why": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Explanation (mainly for failed checks)",
          "title": "Why"
        },
        "rule_code": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Rule code associated with this check",
          "title": "Rule Code"
        },
        "timestamp": {
          "description": "Timestamp when check was performed",
          "title": "Timestamp",
          "type": "number"
        }
      },
      "required": ["name", "status", "message"],
      "title": "Check",
      "type": "object"
    },
    "CheckStatus": {
      "description": "Enum for check status",
      "enum": ["passed", "failed", "skipped"],
      "title": "CheckStatus",
      "type": "string"
    },
    "CopyrightNoticeModel": {
      "description": "Model for copyright notice information",
      "properties": {
        "holder": {
          "description": "Copyright holder name",
          "title": "Holder",
          "type": "string"
        },
        "year": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Copyright year(s)",
          "title": "Year"
        },
        "text": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Full copyright notice text",
          "title": "Text"
        },
        "confidence": {
          "default": 0.0,
          "description": "Confidence in copyright detection",
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Confidence",
          "type": "number"
        }
      },
      "required": ["holder"],
      "title": "CopyrightNoticeModel",
      "type": "object"
    },
    "FileHashesModel": {
      "description": "Model for file hash information with validation",
      "properties": {
        "md5": {
          "anyOf": [
            {
              "pattern": "^[a-fA-F0-9]{32}$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "MD5 hash",
          "title": "Md5"
        },
        "sha1": {
          "anyOf": [
            {
              "pattern": "^[a-fA-F0-9]{40}$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "SHA1 hash",
          "title": "Sha1"
        },
        "sha256": {
          "anyOf": [
            {
              "pattern": "^[a-fA-F0-9]{64}$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "SHA256 hash",
          "title": "Sha256"
        },
        "sha256_prefix": {
          "anyOf": [
            {
              "pattern": "^[a-fA-F0-9]{64}$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "SHA256 hash for a bounded prefix only; not a complete file hash",
          "title": "Sha256 Prefix"
        },
        "sha512": {
          "anyOf": [
            {
              "pattern": "^[a-fA-F0-9]{128}$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "SHA512 hash",
          "title": "Sha512"
        }
      },
      "title": "FileHashesModel",
      "type": "object"
    },
    "FileMetadataModel": {
      "additionalProperties": true,
      "description": "Enhanced model for individual file metadata with structured validation",
      "properties": {
        "file_size": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "File size in bytes",
          "title": "File Size"
        },
        "file_hashes": {
          "anyOf": [
            {
              "$ref": "#/$defs/FileHashesModel"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "File hashes with validation"
        },
        "member_file_hashes": {
          "additionalProperties": {
            "$ref": "#/$defs/MemberFileIntegrityModel"
          },
          "description": "Nested member integrity metadata keyed by a collision-free structured member identity",
          "title": "Member File Hashes",
          "type": "object"
        },
        "member_file_hashes_total": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Total nested member hash records observed",
          "title": "Member File Hashes Total"
        },
        "member_file_hashes_truncated": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Whether nested member hash records were omitted after the retention bound",
          "title": "Member File Hashes Truncated"
        },
        "member_file_hashes_omitted": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Number of nested member hash records omitted after the retention bound",
          "title": "Member File Hashes Omitted"
        },
        "max_stack_depth": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Maximum stack depth for pickle files",
          "title": "Max Stack Depth"
        },
        "opcode_count": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Number of opcodes for pickle files",
          "title": "Opcode Count"
        },
        "suspicious_count": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Count of suspicious patterns",
          "title": "Suspicious Count"
        },
        "ml_context": {
          "anyOf": [
            {
              "$ref": "#/$defs/MLContextModel"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "ML context information"
        },
        "license": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Legacy license field for backward compatibility",
          "title": "License"
        },
        "license_info": {
          "description": "Structured license information",
          "items": {
            "$ref": "#/$defs/LicenseInfoModel"
          },
          "title": "License Info",
          "type": "array"
        },
        "copyright_notices": {
          "description": "Structured copyright notices",
          "items": {
            "$ref": "#/$defs/CopyrightNoticeModel"
          },
          "title": "Copyright Notices",
          "type": "array"
        },
        "license_files_nearby": {
          "description": "License files found nearby",
          "items": {
            "type": "string"
          },
          "title": "License Files Nearby",
          "type": "array"
        },
        "is_dataset": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Whether file appears to be a dataset",
          "title": "Is Dataset"
        },
        "is_model": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Whether file appears to be a model",
          "title": "Is Model"
        },
        "risk_score": {
          "default": 0.0,
          "description": "Calculated risk score (0.0 to 1.0)",
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Risk Score",
          "type": "number"
        },
        "scan_timestamp": {
          "description": "When this metadata was collected",
          "title": "Scan Timestamp",
          "type": "number"
        }
      },
      "title": "FileMetadataModel",
      "type": "object"
    },
    "Issue": {
      "additionalProperties": true,
      "description": "Pydantic model representing a single issue found during scanning",
      "properties": {
        "message": {
          "description": "Description of the issue",
          "title": "Message",
          "type": "string"
        },
        "severity": {
          "$ref": "#/$defs/IssueSeverity",
          "default": "warning",
          "description": "Issue severity level"
        },
        "location": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "File position, line number, etc.",
          "title": "Location"
        },
        "details": {
          "additionalProperties": true,
          "description": "Additional details about the issue",
          "title": "Details",
          "type": "object"
        },
        "why": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Explanation of why this is a security concern",
          "title": "Why"
        },
        "timestamp": {
          "description": "Timestamp when issue was detected",
          "title": "Timestamp",
          "type": "number"
        },
        "type": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Type of issue for categorization",
          "title": "Type"
        },
        "rule_code": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Rule code associated with this issue",
          "title": "Rule Code"
        }
      },
      "required": ["message"],
      "title": "Issue",
      "type": "object"
    },
    "IssueSeverity": {
      "description": "Enum for issue severity levels",
      "enum": ["debug", "info", "warning", "critical"],
      "title": "IssueSeverity",
      "type": "string"
    },
    "LicenseInfoModel": {
      "description": "Model for structured license information",
      "properties": {
        "spdx_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "SPDX license identifier",
          "title": "Spdx Id"
        },
        "name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "License name",
          "title": "Name"
        },
        "url": {
          "anyOf": [
            {
              "format": "uri",
              "maxLength": 2083,
              "minLength": 1,
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "License URL",
          "title": "Url"
        },
        "text": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "License text content",
          "title": "Text"
        },
        "confidence": {
          "default": 0.0,
          "description": "Confidence in license detection",
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Confidence",
          "type": "number"
        },
        "source": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Source of license detection (file, header, etc.)",
          "title": "Source"
        },
        "commercial_allowed": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Whether commercial use is allowed",
          "title": "Commercial Allowed"
        }
      },
      "title": "LicenseInfoModel",
      "type": "object"
    },
    "MLContextModel": {
      "additionalProperties": true,
      "description": "Enhanced model for ML context metadata with comprehensive validation",
      "properties": {
        "frameworks": {
          "additionalProperties": {
            "$ref": "#/$defs/MLFrameworkInfo"
          },
          "description": "Detected ML frameworks with details",
          "title": "Frameworks",
          "type": "object"
        },
        "overall_confidence": {
          "default": 0.0,
          "description": "Overall ML content confidence score",
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Overall Confidence",
          "type": "number"
        },
        "is_ml_content": {
          "default": false,
          "description": "Whether content is ML-related",
          "title": "Is Ml Content",
          "type": "boolean"
        },
        "detected_patterns": {
          "description": "Detected ML patterns",
          "items": {
            "type": "string"
          },
          "title": "Detected Patterns",
          "type": "array"
        },
        "weight_analysis": {
          "anyOf": [
            {
              "$ref": "#/$defs/WeightAnalysisModel"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Analysis of potential weight data"
        },
        "model_type": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Detected model type (e.g., 'transformer', 'cnn', 'rnn')",
          "title": "Model Type"
        },
        "layer_count_estimate": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Estimated number of layers",
          "title": "Layer Count Estimate"
        },
        "parameter_count_estimate": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Estimated parameter count",
          "title": "Parameter Count Estimate"
        },
        "training_framework": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Framework likely used for training",
          "title": "Training Framework"
        },
        "precision_type": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Detected precision (fp32, fp16, int8, etc.)",
          "title": "Precision Type"
        },
        "optimization_hints": {
          "description": "Detected optimization techniques",
          "items": {
            "type": "string"
          },
          "title": "Optimization Hints",
          "type": "array"
        }
      },
      "title": "MLContextModel",
      "type": "object"
    },
    "MLFrameworkInfo": {
      "description": "Model for individual ML framework detection info",
      "properties": {
        "name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Framework name (e.g., 'pytorch', 'tensorflow')",
          "title": "Name"
        },
        "version": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Detected version if available",
          "title": "Version"
        },
        "confidence": {
          "default": 0.0,
          "description": "Confidence in detection (0.0 to 1.0)",
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Confidence",
          "type": "number"
        },
        "indicators": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "description": "Patterns that indicated this framework",
          "title": "Indicators"
        },
        "file_patterns": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "description": "File patterns that matched",
          "title": "File Patterns"
        }
      },
      "title": "MLFrameworkInfo",
      "type": "object"
    },
    "MemberFileIntegrityModel": {
      "additionalProperties": true,
      "description": "Integrity metadata for a nested archive/member payload.",
      "properties": {
        "file_hashes": {
          "anyOf": [
            {
              "$ref": "#/$defs/FileHashesModel"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Complete member hashes"
        },
        "file_size": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Member size in bytes",
          "title": "File Size"
        },
        "bytes_hashed": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Bytes covered by the member hash",
          "title": "Bytes Hashed"
        },
        "hash_complete": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Whether the member hash covered the full payload",
          "title": "Hash Complete"
        },
        "hash_status": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Hash coverage status",
          "title": "Hash Status"
        },
        "sha256_prefix": {
          "anyOf": [
            {
              "pattern": "^[a-fA-F0-9]{64}$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "SHA256 hash for a bounded member prefix only",
          "title": "Sha256 Prefix"
        },
        "scanner_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Scanner that produced the member hash",
          "title": "Scanner Name"
        },
        "logical_path": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Original logical path when duplicate keys are disambiguated",
          "title": "Logical Path"
        },
        "path_segments": {
          "description": "Raw nested archive path segments",
          "items": {
            "type": "string"
          },
          "title": "Path Segments",
          "type": "array"
        },
        "occurrence": {
          "anyOf": [
            {
              "minimum": 1,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Occurrence number for duplicate logical member paths",
          "title": "Occurrence"
        }
      },
      "title": "MemberFileIntegrityModel",
      "type": "object"
    },
    "WeightAnalysisModel": {
      "description": "Model for weight pattern analysis results",
      "properties": {
        "appears_to_be_weights": {
          "default": false,
          "description": "Whether data appears to be ML weights",
          "title": "Appears To Be Weights",
          "type": "boolean"
        },
        "weight_confidence": {
          "default": 0.0,
          "description": "Confidence in weight detection",
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Weight Confidence",
          "type": "number"
        },
        "pattern_density": {
          "default": 0.0,
          "description": "Density of detected patterns",
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Pattern Density",
          "type": "number"
        },
        "float_ratio": {
          "default": 0.0,
          "description": "Ratio of floating-point data",
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Float Ratio",
          "type": "number"
        },
        "statistical_expectation": {
          "default": 0.0,
          "description": "Statistical expectation for patterns",
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Statistical Expectation",
          "type": "number"
        },
        "file_size_factor": {
          "default": 0.0,
          "description": "File size influence factor",
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "File Size Factor",
          "type": "number"
        }
      },
      "title": "WeightAnalysisModel",
      "type": "object"
    }
  },
  "additionalProperties": true,
  "description": "Pydantic model matching the exact current ModelAudit JSON output format",
  "properties": {
    "bytes_scanned": {
      "description": "Total bytes scanned",
      "title": "Bytes Scanned",
      "type": "integer"
    },
    "issues": {
      "description": "List of security issues found",
      "items": {
        "$ref": "#/$defs/Issue"
      },
      "title": "Issues",
      "type": "array"
    },
    "checks": {
      "description": "List of all checks performed",
      "items": {
        "$ref": "#/$defs/Check"
      },
      "title": "Checks",
      "type": "array"
    },
    "files_scanned": {
      "description": "Number of files scanned",
      "title": "Files Scanned",
      "type": "integer"
    },
    "assets": {
      "description": "List of scanned assets",
      "items": {
        "$ref": "#/$defs/AssetModel"
      },
      "title": "Assets",
      "type": "array"
    },
    "has_errors": {
      "description": "Whether operational errors occurred during scanning",
      "title": "Has Errors",
      "type": "boolean"
    },
    "scanner_names": {
      "description": "Names of scanners used",
      "items": {
        "type": "string"
      },
      "title": "Scanner Names",
      "type": "array"
    },
    "scanner_selection": {
      "anyOf": [
        {
          "additionalProperties": true,
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Effective scanner selection policy",
      "title": "Scanner Selection"
    },
    "file_metadata": {
      "additionalProperties": {
        "$ref": "#/$defs/FileMetadataModel"
      },
      "description": "Metadata for each file",
      "title": "File Metadata",
      "type": "object"
    },
    "content_hash": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Aggregate SHA-256 hash of all scanned files (for deduplication)",
      "title": "Content Hash"
    },
    "start_time": {
      "description": "Scan start timestamp",
      "title": "Start Time",
      "type": "number"
    },
    "duration": {
      "description": "Scan duration in seconds",
      "title": "Duration",
      "type": "number"
    },
    "total_checks": {
      "description": "Total number of checks performed",
      "title": "Total Checks",
      "type": "integer"
    },
    "passed_checks": {
      "description": "Number of checks that passed",
      "title": "Passed Checks",
      "type": "integer"
    },
    "failed_checks": {
      "description": "Number of checks that failed",
      "title": "Failed Checks",
      "type": "integer"
    },
    "success": {
      "default": true,
      "description": "Whether the scan completed successfully",
      "title": "Success",
      "type": "boolean"
    }
  },
  "required": [
    "bytes_scanned",
    "files_scanned",
    "has_errors",
    "start_time",
    "duration",
    "total_checks",
    "passed_checks",
    "failed_checks"
  ],
  "title": "ModelAuditResultModel",
  "type": "object"
}
