"""Web UI dashboard model for AIOS change governance. Shows test gates, user acceptance, architecture review, risk gates and release blocking status for human operators and owner review. """ 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 GovernanceMetric: key: str title: str value: Any status: str = "ok" detail: str = "" def to_dict(self) -> dict[str, Any]: return asdict(self) @dataclass(frozen=True) class GovernancePanel: key: str title: str metrics: list[GovernanceMetric] = field(default_factory=list) def to_dict(self) -> dict[str, Any]: return { "key": self.key, "title": self.title, "metrics": [m.to_dict() for m in self.metrics], } class ChangeGovernanceDashboard: def overview(self, changes: list[dict[str, Any]] | None = None) -> dict[str, Any]: changes = changes or [] blocked = [c for c in changes if c.get("status") == "blocked"] waiting_arch = [c for c in changes if c.get("architecture_review") == "required"] waiting_user = [c for c in changes if c.get("user_acceptance") == "required"] missing_tests = [c for c in changes if not c.get("tests")] panels = [ GovernancePanel( "test_gate", "测试 Gate", [ GovernanceMetric("total_changes", "变更总数", len(changes)), GovernanceMetric("missing_tests", "缺少测试的变更", len(missing_tests), "warn" if missing_tests else "ok"), ], ), GovernancePanel( "user_acceptance", "用户验收 Agent", [ GovernanceMetric("waiting_user_acceptance", "等待用户验收", len(waiting_user), "warn" if waiting_user else "ok"), ], ), GovernancePanel( "architecture_review", "架构师 Agent", [ GovernanceMetric("waiting_architecture_review", "等待架构审查", len(waiting_arch), "warn" if waiting_arch else "ok"), ], ), GovernancePanel( "release_gate", "发布 Gate", [ GovernanceMetric("blocked_changes", "阻塞发布的变更", len(blocked), "warn" if blocked else "ok"), ], ), ] return { "module": "change-governance", "route": "/admin/ai-evolution/governance", "title": "AIOS 变更治理中心", "status": "attention_required" if blocked or missing_tests or waiting_arch or waiting_user else "healthy", "generated_at": utc_now(), "panels": [p.to_dict() for p in panels], "changes": changes, } __all__ = ["GovernanceMetric", "GovernancePanel", "ChangeGovernanceDashboard"]