67 lines
2.2 KiB
Python
67 lines
2.2 KiB
Python
"""AI-first compatibility contracts for PChome mapping receipts."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from services.ai_exception_contract import (
|
|
AI_EXCEPTION_MODE_KEY,
|
|
AI_EXCEPTION_MODE_MACHINE_VERIFIABLE,
|
|
AI_EXCEPTION_REQUIRED_COUNT_KEY,
|
|
AI_EXCEPTION_REQUIRED_KEY,
|
|
LEGACY_HUMAN_REVIEW_REQUIRED_COUNT_KEY,
|
|
LEGACY_HUMAN_REVIEW_REQUIRED_KEY,
|
|
LEGACY_HUMAN_REVIEW_REQUIRED_LEGACY_KEY,
|
|
LEGACY_PRIMARY_FLOW_COUNT_KEY,
|
|
LEGACY_REVIEW_MODE_EXCEPTION_ONLY,
|
|
LEGACY_REVIEW_MODE_KEY,
|
|
LEGACY_REVIEW_REQUIRED_COUNT_KEY,
|
|
LEGACY_REVIEW_REQUIRED_KEY,
|
|
PRIMARY_HUMAN_GATE_COUNT_KEY,
|
|
)
|
|
|
|
|
|
def _ai_exception_compatibility_fields(ai_exception_required: bool) -> dict[str, Any]:
|
|
"""Return the AI-first exception contract with legacy readback aliases."""
|
|
return {
|
|
LEGACY_HUMAN_REVIEW_REQUIRED_KEY: False,
|
|
LEGACY_HUMAN_REVIEW_REQUIRED_LEGACY_KEY: bool(ai_exception_required),
|
|
AI_EXCEPTION_REQUIRED_KEY: bool(ai_exception_required),
|
|
PRIMARY_HUMAN_GATE_COUNT_KEY: 0,
|
|
AI_EXCEPTION_MODE_KEY: AI_EXCEPTION_MODE_MACHINE_VERIFIABLE,
|
|
}
|
|
|
|
|
|
def _legacy_review_compatibility_fields(ai_exception_required: bool = False) -> dict[str, Any]:
|
|
"""Keep old review-mode keys false while exposing the AI exception state."""
|
|
return {
|
|
LEGACY_REVIEW_REQUIRED_KEY: False,
|
|
LEGACY_REVIEW_MODE_KEY: LEGACY_REVIEW_MODE_EXCEPTION_ONLY,
|
|
AI_EXCEPTION_REQUIRED_KEY: bool(ai_exception_required),
|
|
AI_EXCEPTION_MODE_KEY: AI_EXCEPTION_MODE_MACHINE_VERIFIABLE,
|
|
}
|
|
|
|
|
|
def _evidence_requires_ai_exception(evidence: dict[str, Any]) -> bool:
|
|
return bool(
|
|
evidence.get(AI_EXCEPTION_REQUIRED_KEY)
|
|
or evidence.get(LEGACY_HUMAN_REVIEW_REQUIRED_LEGACY_KEY)
|
|
or evidence.get(LEGACY_HUMAN_REVIEW_REQUIRED_KEY)
|
|
)
|
|
|
|
|
|
def _summary_exception_count(summary: dict[str, Any]) -> int:
|
|
return int(
|
|
summary.get(AI_EXCEPTION_REQUIRED_COUNT_KEY)
|
|
or summary.get(LEGACY_REVIEW_REQUIRED_COUNT_KEY)
|
|
or 0
|
|
)
|
|
|
|
|
|
__all__ = (
|
|
"_ai_exception_compatibility_fields",
|
|
"_evidence_requires_ai_exception",
|
|
"_legacy_review_compatibility_fields",
|
|
"_summary_exception_count",
|
|
)
|