diff --git a/packages/agent-compliance/schemas/__init__.py b/packages/agent-compliance/schemas/__init__.py new file mode 100644 index 00000000..648154f2 --- /dev/null +++ b/packages/agent-compliance/schemas/__init__.py @@ -0,0 +1,4 @@ +"""Governance policy schemas for validation.""" +from agent_compliance.schemas.policy_schema import PolicySchema, validate_policy + +__all__ = ["PolicySchema", "validate_policy"] diff --git a/packages/agent-compliance/schemas/policy_schema.py b/packages/agent-compliance/schemas/policy_schema.py index 0104b1e3..cbeedec6 100644 --- a/packages/agent-compliance/schemas/policy_schema.py +++ b/packages/agent-compliance/schemas/policy_schema.py @@ -1,16 +1,39 @@ from pydantic import BaseModel, Field from typing import List, Optional, Dict, Any + class PolicySchema(BaseModel): """ JSON Schema for governance policies. Addresses request for better validation (#305). """ + id: str = Field(..., description="Unique policy identifier") name: str = Field(..., description="Human-readable policy name") version: str = Field("1.0.0") rules: List[Dict[str, Any]] = Field(default_factory=list) metadata: Optional[Dict[str, Any]] = None -def validate_policy(data: Dict[str, Any]): - return PolicySchema(**data) + +class PolicyValidationError(Exception): + """Raised when a governance policy fails schema validation.""" + + pass + + +def validate_policy(data: Dict[str, Any]) -> PolicySchema: + """Validate a governance policy dict against the schema. + + Args: + data: Policy data dictionary. + + Returns: + Validated PolicySchema instance. + + Raises: + PolicyValidationError: If validation fails with field-level details. + """ + try: + return PolicySchema(**data) + except Exception as e: + raise PolicyValidationError(f"Policy validation failed: {e}") from e