94 lines
3.1 KiB
Python
94 lines
3.1 KiB
Python
"""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"]
|