Files
ai-tax-agent/libs/schemas/coverage/core.py
harkon b324ff09ef
Some checks failed
CI/CD Pipeline / Code Quality & Linting (push) Has been cancelled
CI/CD Pipeline / Policy Validation (push) Has been cancelled
CI/CD Pipeline / Test Suite (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-coverage) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-extract) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-firm-connectors) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-forms) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-hmrc) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-ingestion) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-kg) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-normalize-map) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-ocr) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-rag-indexer) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-rag-retriever) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-reason) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-rpa) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (ui-review) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (svc-coverage) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (svc-extract) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (svc-kg) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (svc-rag-retriever) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (ui-review) (push) Has been cancelled
CI/CD Pipeline / Generate SBOM (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / Notifications (push) Has been cancelled
Initial commit
2025-10-11 08:41:36 +01:00

147 lines
3.8 KiB
Python

"""Core coverage policy models."""
from collections.abc import Callable
from datetime import datetime
from typing import Any
from pydantic import BaseModel, Field
from ..enums import Role
class Validity(BaseModel):
"""Validity constraints for evidence"""
within_tax_year: bool = False
available_by: str | None = None
date_tolerance_days: int = 30
class StatusClassifier(BaseModel):
"""Rules for classifying evidence status"""
min_ocr: float = 0.82
min_extract: float = 0.85
date_in_year: bool = True
date_in_year_or_tolerance: bool = True
conflict_rules: list[str] = Field(default_factory=list)
class StatusClassifierConfig(BaseModel):
"""Complete status classifier configuration"""
present_verified: StatusClassifier
present_unverified: StatusClassifier
conflicting: StatusClassifier
missing: StatusClassifier = Field(default_factory=lambda: StatusClassifier())
class EvidenceItem(BaseModel):
"""Evidence requirement definition"""
id: str
role: Role
condition: str | None = None
boxes: list[str] = Field(default_factory=list)
acceptable_alternatives: list[str] = Field(default_factory=list)
validity: Validity = Field(default_factory=Validity)
reasons: dict[str, str] = Field(default_factory=dict)
class CrossCheck(BaseModel):
"""Cross-validation rule"""
name: str
logic: str
class SchedulePolicy(BaseModel):
"""Policy for a specific tax schedule"""
guidance_hint: str | None = None
evidence: list[EvidenceItem] = Field(default_factory=list)
cross_checks: list[CrossCheck] = Field(default_factory=list)
selection_rule: dict[str, str] = Field(default_factory=dict)
notes: dict[str, Any] = Field(default_factory=dict)
class Trigger(BaseModel):
"""Schedule trigger condition"""
any_of: list[str] = Field(default_factory=list)
all_of: list[str] = Field(default_factory=list)
class GuidanceRef(BaseModel):
"""Reference to guidance document"""
doc_id: str
kind: str
class QuestionTemplates(BaseModel):
"""Templates for generating clarifying questions"""
default: dict[str, str] = Field(default_factory=dict)
reasons: dict[str, str] = Field(default_factory=dict)
class ConflictRules(BaseModel):
"""Rules for handling conflicting evidence"""
precedence: list[str] = Field(default_factory=list)
escalation: dict[str, Any] = Field(default_factory=dict)
class TaxYearBoundary(BaseModel):
"""Tax year date boundaries"""
start: str
end: str
class Defaults(BaseModel):
"""Default configuration values"""
confidence_thresholds: dict[str, float] = Field(default_factory=dict)
date_tolerance_days: int = 30
require_lineage_bbox: bool = True
allow_bank_substantiation: bool = True
class Privacy(BaseModel):
"""Privacy and PII handling configuration"""
vector_pii_free: bool = True
redact_patterns: list[str] = Field(default_factory=list)
class CoveragePolicy(BaseModel):
"""Complete coverage policy definition"""
version: str
jurisdiction: str
tax_year: str
tax_year_boundary: TaxYearBoundary
defaults: Defaults
document_kinds: list[str] = Field(default_factory=list)
guidance_refs: dict[str, GuidanceRef] = Field(default_factory=dict)
triggers: dict[str, Trigger] = Field(default_factory=dict)
schedules: dict[str, SchedulePolicy] = Field(default_factory=dict)
status_classifier: StatusClassifierConfig
conflict_resolution: ConflictRules
question_templates: QuestionTemplates
privacy: Privacy
class CompiledCoveragePolicy(BaseModel):
"""Coverage policy with compiled predicates"""
policy: CoveragePolicy
compiled_predicates: dict[str, Callable[[str, str], bool]] = Field(
default_factory=dict
)
compiled_at: datetime
hash: str
source_files: list[str] = Field(default_factory=list)