74 lines
3.0 KiB
Python
74 lines
3.0 KiB
Python
"""Architect governance integration for Search Gateway.
|
|
|
|
Search Gateway is a shared platform capability. The Architect Agent periodically
|
|
reviews provider health, external search/browser capabilities, cost, security and
|
|
privacy impact, then emits C/R/V recommendations.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import asdict, dataclass, field
|
|
from datetime import datetime, timezone
|
|
from typing import Any
|
|
|
|
|
|
def utc_now() -> str:
|
|
return datetime.now(timezone.utc).isoformat()
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class SearchArchitectureFinding:
|
|
finding_id: str
|
|
title: str
|
|
impact: str
|
|
recommendation: str
|
|
evidence: list[str] = field(default_factory=list)
|
|
created_at: str = field(default_factory=utc_now)
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class SearchArchitectureDecision:
|
|
status: str
|
|
version_bump: str
|
|
reason: str
|
|
findings: list[SearchArchitectureFinding]
|
|
owner_gate_required: bool
|
|
created_at: str = field(default_factory=utc_now)
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return {
|
|
"status": self.status,
|
|
"version_bump": self.version_bump,
|
|
"reason": self.reason,
|
|
"findings": [f.to_dict() for f in self.findings],
|
|
"owner_gate_required": self.owner_gate_required,
|
|
"created_at": self.created_at,
|
|
}
|
|
|
|
|
|
class SearchArchitectIntegration:
|
|
def review(self, signals: dict[str, Any]) -> SearchArchitectureDecision:
|
|
findings: list[SearchArchitectureFinding] = []
|
|
if signals.get("provider_breaking_change"):
|
|
findings.append(SearchArchitectureFinding("search-provider-breaking", "Provider breaking change", "breaking", "owner_review"))
|
|
if signals.get("new_search_capability"):
|
|
findings.append(SearchArchitectureFinding("search-new-capability", "New search capability available", "architecture", "evaluate_adoption"))
|
|
if signals.get("cost_increase"):
|
|
findings.append(SearchArchitectureFinding("search-cost", "Search provider cost increase", "minor", "optimize_provider_order"))
|
|
if signals.get("security_advisory"):
|
|
findings.append(SearchArchitectureFinding("search-security", "Search security advisory", "breaking", "owner_review"))
|
|
|
|
if any(f.impact == "breaking" for f in findings):
|
|
return SearchArchitectureDecision("action_required", "V", "breaking search ecosystem/security change", findings, True)
|
|
if any(f.impact == "architecture" for f in findings):
|
|
return SearchArchitectureDecision("optimization_recommended", "R", "new search capability may improve architecture", findings, True)
|
|
if findings:
|
|
return SearchArchitectureDecision("minor_change_recommended", "C", "compatible provider optimization", findings, False)
|
|
return SearchArchitectureDecision("no_action", "none", "no relevant search architecture change", findings, False)
|
|
|
|
|
|
__all__ = ["SearchArchitectureFinding", "SearchArchitectureDecision", "SearchArchitectIntegration"]
|