feat(governance): 顯示服務健康證據卡
All checks were successful
CD Pipeline / tests (push) Successful in 1m36s
Code Review / ai-code-review (push) Successful in 14s
CD Pipeline / build-and-deploy (push) Successful in 3m54s
CD Pipeline / post-deploy-checks (push) Successful in 1m54s

This commit is contained in:
Your Name
2026-06-05 15:00:46 +08:00
parent d53bbdf32c
commit 7d62cad6aa
10 changed files with 306 additions and 57 deletions

View File

@@ -18,16 +18,16 @@ def test_ai_agent_automation_backlog_snapshot_endpoint_returns_committed_snapsho
assert data["schema_version"] == "ai_agent_automation_backlog_v1"
assert data["program_status"]["overall_completion_percent"] == 88
assert data["program_status"]["read_only_mode"] is True
assert data["program_status"]["current_task_id"] == "P1-005"
assert data["program_status"]["next_task_id"] == "P1-006"
assert data["rollups"]["total_items"] == len(data["backlog_items"]) == 24
assert data["rollups"]["by_priority"]["P1"] == 22
assert data["rollups"]["by_status"]["done"] == 21
assert data["rollups"]["by_gate_status"]["read_only_allowed"] == 21
assert data["program_status"]["current_task_id"] == "P1-006"
assert data["program_status"]["next_task_id"] == "P1-007"
assert data["rollups"]["total_items"] == len(data["backlog_items"]) == 25
assert data["rollups"]["by_priority"]["P1"] == 23
assert data["rollups"]["by_status"]["done"] == 22
assert data["rollups"]["by_gate_status"]["read_only_allowed"] == 22
assert data["progress_summary"]["overall_percent"] == 88
assert data["progress_summary"]["done_items"] == 21
assert data["progress_summary"]["total_items"] == 24
assert data["item_approval_boundary_rollup"]["total_items"] == 24
assert data["progress_summary"]["done_items"] == 22
assert data["progress_summary"]["total_items"] == 25
assert data["item_approval_boundary_rollup"]["total_items"] == 25
assert data["item_approval_boundary_rollup"]["items_requiring_explicit_approval"] == [
"AUTO-P1-004",
"AUTO-P2-004",
@@ -67,6 +67,12 @@ def test_ai_agent_automation_backlog_snapshot_endpoint_returns_committed_snapsho
assert p1_005["approval_boundary"]["mode"] == "read_only_allowed"
assert "service_restart" in p1_005["approval_boundary"]["blocked_actions"]
assert "service_health_gap_matrix_2026-06-05.json" in p1_005["evidence_refs"][0]
p1_006 = next(item for item in data["backlog_items"] if item["item_id"] == "AUTO-P1-006")
assert p1_006["status"] == "done"
assert p1_006["next_review"] == "P1-007"
assert p1_006["approval_boundary"]["mode"] == "read_only_allowed"
assert "live_probe" in p1_006["approval_boundary"]["blocked_actions"]
assert "/zh-TW/governance?tab=automation-inventory" in p1_006["evidence_refs"]
p1_306 = next(item for item in data["backlog_items"] if item["item_id"] == "AUTO-P1-306")
assert p1_306["approval_boundary"]["mode"] == "read_only_allowed"
assert "runtime_execution" in p1_306["approval_boundary"]["blocked_actions"]

View File

@@ -18,10 +18,10 @@ def test_ai_agent_automation_inventory_snapshot_endpoint_returns_committed_snaps
assert data["schema_version"] == "ai_agent_automation_inventory_snapshot_v1"
assert data["program_status"]["overall_completion_percent"] == 100
assert data["program_status"]["read_only_mode"] is True
assert data["program_status"]["current_task_id"] == "P1-005"
assert data["program_status"]["next_task_id"] == "P1-006"
assert data["task_approval_boundary_rollup"]["total_tasks"] == len(data["tasks"]) == 31
assert data["task_approval_boundary_rollup"]["by_mode"]["read_only_allowed"] == 28
assert data["program_status"]["current_task_id"] == "P1-006"
assert data["program_status"]["next_task_id"] == "P1-007"
assert data["task_approval_boundary_rollup"]["total_tasks"] == len(data["tasks"]) == 32
assert data["task_approval_boundary_rollup"]["by_mode"]["read_only_allowed"] == 29
assert data["task_approval_boundary_rollup"]["by_mode"]["production_change_blocked"] == 1
assert data["task_approval_boundary_rollup"]["tasks_requiring_explicit_approval"] == [
"P0-001",
@@ -53,6 +53,11 @@ def test_ai_agent_automation_inventory_snapshot_endpoint_returns_committed_snaps
assert p1_005["approval_boundary"]["mode"] == "read_only_allowed"
assert "service_restart" in p1_005["approval_boundary"]["blocked_actions"]
assert "service_health_gap_matrix_2026-06-05.json" in p1_005["output"]
p1_006 = next(task for task in data["tasks"] if task["task_id"] == "P1-006")
assert p1_006["status"] == "done"
assert p1_006["approval_boundary"]["mode"] == "read_only_allowed"
assert "live_probe" in p1_006["approval_boundary"]["blocked_actions"]
assert "service health evidence cards" in p1_006["output"]
assert any(task["task_id"] == "P1-204" for task in data["tasks"])
assert any(task["task_id"] == "P1-205" for task in data["tasks"])
assert any(task["task_id"] == "P1-206" for task in data["tasks"])
@@ -86,3 +91,4 @@ def test_ai_agent_automation_inventory_snapshot_endpoint_returns_committed_snaps
assert any(evidence["evidence_id"] == "observability_contract_matrix_api" for evidence in data["evidence"])
assert any(evidence["evidence_id"] == "ai_provider_route_matrix_api" for evidence in data["evidence"])
assert any(evidence["evidence_id"] == "service_health_gap_matrix_api" for evidence in data["evidence"])
assert any(evidence["evidence_id"] == "service_health_evidence_cards_ui" for evidence in data["evidence"])

View File

@@ -3372,6 +3372,8 @@
"staleTitle": "過期端點 {count}",
"gapsTitle": "健康缺口 {count}",
"contractTitle": "不可誤讀合約",
"evidenceCardsTitle": "服務健康證據卡",
"evidenceCardsDetail": "只顯示 committed evidence ref、狀態與下一步不做 live probe。",
"metrics": {
"targets": "健康目標",
"actions": "需處置",
@@ -3391,7 +3393,10 @@
},
"labels": {
"freshness": "新鮮度",
"risk": "風險"
"risk": "風險",
"primaryEvidence": "主要證據",
"nextAction": "下一步",
"extraEvidence": "另有 {count} 個證據"
},
"values": {
"api_health": "API 健康",

View File

@@ -3372,6 +3372,8 @@
"staleTitle": "過期端點 {count}",
"gapsTitle": "健康缺口 {count}",
"contractTitle": "不可誤讀合約",
"evidenceCardsTitle": "服務健康證據卡",
"evidenceCardsDetail": "只顯示 committed evidence ref、狀態與下一步不做 live probe。",
"metrics": {
"targets": "健康目標",
"actions": "需處置",
@@ -3391,7 +3393,10 @@
},
"labels": {
"freshness": "新鮮度",
"risk": "風險"
"risk": "風險",
"primaryEvidence": "主要證據",
"nextAction": "下一步",
"extraEvidence": "另有 {count} 個證據"
},
"values": {
"api_health": "API 健康",

View File

@@ -16,6 +16,7 @@ import {
BellRing,
Boxes,
Database,
FileText,
GitBranch,
Gauge,
HardDrive,
@@ -523,6 +524,14 @@ export function AutomationInventoryTab() {
})
}, [serviceHealthGapMatrix])
const visibleServiceHealthEvidenceCards = useMemo(() => {
return visibleServiceHealthTargets.map(target => ({
target,
primaryEvidence: target.evidence_refs[0] ?? null,
extraEvidenceCount: Math.max(0, target.evidence_refs.length - 1),
}))
}, [visibleServiceHealthTargets])
if (loading) {
return (
<div style={{ padding: 20, display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: 12 }} className="automation-inventory-kpi-grid">
@@ -1946,6 +1955,60 @@ export function AutomationInventoryTab() {
/>
</div>
<div style={{ display: 'flex', flexDirection: 'column', gap: 10, minWidth: 0 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12, flexWrap: 'wrap' }}>
<div style={{ display: 'flex', alignItems: 'center', gap: 7, minWidth: 0 }}>
<FileText size={14} style={{ color: '#d97757' }} />
<span style={{ fontFamily: 'Syne, sans-serif', fontSize: 13, fontWeight: 700, color: '#141413' }}>
{t('serviceHealth.evidenceCardsTitle')}
</span>
</div>
<span style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color: '#87867f', lineHeight: 1.45 }}>
{t('serviceHealth.evidenceCardsDetail')}
</span>
</div>
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(5, minmax(0, 1fr))', gap: 10 }} className="automation-inventory-service-health-evidence-grid">
{visibleServiceHealthEvidenceCards.map(({ target, primaryEvidence, extraEvidenceCount }) => (
<div key={`${target.target_id}-evidence`} style={{ padding: 11, border: '0.5px solid #e0ddd4', borderRadius: 7, background: '#fff', display: 'flex', flexDirection: 'column', gap: 8, minWidth: 0 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8, minWidth: 0 }}>
<span style={{
fontFamily: 'Syne, sans-serif',
fontSize: 12,
fontWeight: 700,
color: '#141413',
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
}}>
{target.display_name}
</span>
<Chip value={serviceHealthValueLabel(target.status)} muted={target.status === 'verified'} />
</div>
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, minWidth: 0 }}>
<Chip value={serviceHealthValueLabel(target.kind)} muted />
<Chip value={serviceHealthValueLabel(target.freshness_status)} muted={target.status === 'verified'} />
<Chip value={serviceHealthValueLabel(target.risk_level)} />
</div>
<div style={{ display: 'flex', flexDirection: 'column', gap: 4, minWidth: 0 }}>
<SmallLabel>{t('serviceHealth.labels.primaryEvidence')}</SmallLabel>
<div style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color: '#141413', lineHeight: 1.45, overflowWrap: 'anywhere' }}>
{primaryEvidence ?? t('backupEvidence.noEvidence')}
</div>
{extraEvidenceCount > 0 ? (
<Chip value={t('serviceHealth.labels.extraEvidence', { count: extraEvidenceCount })} muted />
) : null}
</div>
<div style={{ display: 'flex', flexDirection: 'column', gap: 4, minWidth: 0 }}>
<SmallLabel>{t('serviceHealth.labels.nextAction')}</SmallLabel>
<div style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color: '#87867f', lineHeight: 1.45, overflowWrap: 'anywhere' }}>
{target.next_action}
</div>
</div>
</div>
))}
</div>
</div>
<div style={{ display: 'grid', gridTemplateColumns: 'minmax(0, 1.35fr) minmax(0, 0.65fr)', gap: 12 }} className="automation-inventory-service-health-grid">
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, minmax(0, 1fr))', gap: 10 }} className="automation-inventory-service-health-target-grid">
{visibleServiceHealthTargets.map(targetItem => (
@@ -2177,6 +2240,7 @@ export function AutomationInventoryTab() {
.automation-inventory-provider-route-grid,
.automation-inventory-service-health-kpi-grid,
.automation-inventory-service-health-map-grid,
.automation-inventory-service-health-evidence-grid,
.automation-inventory-service-health-grid,
.automation-inventory-service-health-target-grid,
.automation-inventory-bottom-grid,

View File

@@ -1,3 +1,37 @@
## 2026-06-05P1-006 服務健康證據卡本地完成
**背景**:接續 P1-005 服務健康缺口與過期端點正式驗證,依工作清單推進 `P1-006`。本段只把 committed service health evidence refs 顯示成更細緻的 UI 證據卡;不做 live probe / external probe、不重啟 service / pod / host、不修改 endpoint / ConfigMap、不讀 Secret / Redis / DB payload、不發 Telegram / AwoooP 通知、不觸發 workflow / deploy / reload / runtime execution。
**本輪完成**
- 治理頁 `/zh-TW/governance?tab=automation-inventory` 在「服務健康缺口與過期端點」區塊新增「服務健康證據卡」。
- 每張證據卡顯示 target 名稱、狀態、健康類型、新鮮度、風險、主要 evidence ref、額外證據數量與下一步。
- 同步 automation backlog / inventory snapshotcurrent `P1-006`、next `P1-007`、backlog overall `88%`、P1 `96%`、done `22/25`、inventory tasks `32`
**目前數字**
- Service health targets / evidence cards`10`
- 需處置 targets`5`
- Stale endpoints`3`
- Health gaps`5`
- Service restart / endpoint change / active probe / notification send / runtime execution allowed counts 全部 `0`
**本地驗證**
- JSON parse 通過automation backlog / inventory snapshots、zh-TW / en messages。
- 目標測試通過service health gap matrix service / API、automation inventory / backlog snapshot service / API 共 `25 passed`
- zh-TW / en i18n key 差異 `0`web typecheck 通過。
- Next production build 通過;`/[locale]/governance` First Load JS `387 kB`
- 本地 browser smoke 未採計:既有 `3121` dev server 回 Next `not-found` 空殼,且本段避免再清 `.next` 或啟動第二組 build/dev 互踩產物;正式可見性以 Gitea deploy marker 後 production desktop / mobile smoke 補驗。
**待補**
- 推送 Gitea 後等待 deploy marker補 production API readback 與 desktop / mobile browser smoke再更新正式驗證紀錄。
**邊界**
- P1-006 UI 可見只代表 committed evidence refs 可讀,不代表任何健康檢查已 live 執行,也不代表 runtime gate、S4.9 owner response gate 或 security acceptance gate 已提高。
- Live probe、external health probe、service / pod / host restart、rollout restart、endpoint / ConfigMap 修改、provider switch、paid API call、Secret payload read、通知發送、workflow / deploy / reload / runtime execution 全部仍未批准。
**下一步**
1. 完成本輪 build、Gitea push、正式 deploy marker 追蹤與 production smoke。
2. P1-007建立 service health 失敗限定 Telegram / AwoooP 對應;成功 smoke 不即時通知,避免洗版。
## 2026-06-05P1-005 服務健康缺口與過期端點正式上線
**背景**:接續 P1-004 AI Provider 路由矩陣正式驗證,依工作清單推進 `P1-005`。本段只建立 committed service health gap matrix、只讀 API 與治理頁顯示;不做 live probe / external probe、不重啟 service / pod / host、不修改 endpoint / ConfigMap、不讀 Secret / Redis / DB payload、不發 Telegram / AwoooP 通知、不觸發 workflow / deploy / reload / runtime execution。

View File

@@ -10,7 +10,7 @@
|---|---:|---|---|
| Agent 市場治理 | 72% | 進行中 | `agent_market_governance_snapshot_v1`、API、UI 分頁、每週觀察流程 |
| Nemotron 實際整合應用 | 30% | 完整回放前仍被關卡擋下 | `blocked_needs_evidence`,下一關是 `refresh_source_evidence_then_5_record_smoke_only` |
| 工具 / 服務 / 套件 AI 自動化 | 88% | P0 已完成P1 套件 / 供應鏈主線已完成;備份 / DR 主線已完成到異地 / escrow 準備度顯示任務批准邊界、進度彙總、P1-001 執行面只讀矩陣、P1-002 Gitea 工作流程 / runner 健康合約、P1-003 監控合約 / 降噪矩陣、P1-004 AI 供應商路由矩陣P1-005 服務健康缺口矩陣已完成,下一主線是 P1-006 在 UI 顯示 service health 證據卡 | 狀態分類、盤點 schema、權限矩陣、靜態盤點種子、只讀 API、UI 骨架、驗證、自動化待辦 schema / 快照 / API / 分組 UI、Backup / DR 目標盤點、準備度矩陣、備份通知政策、Backup / DR 證據 UI、復原演練批准包模板、異地 / escrow 準備度狀態、任務批准邊界、確定性進度彙總、Python 套件 / 供應鏈只讀基線、JS pnpm/npm 只讀基線、Docker build surface 只讀基線、CVE / license / drift 嚴重度政策、定期依賴漂移與外部資料來源檢查設計、依賴升級批准包模板、runtime_surface_inventory_v1 schema / snapshot / API / UI、gitea_workflow_runner_health_v1 schema / snapshot / API / UI、observability_contract_matrix_v1 schema / snapshot / API / UI、ai_provider_route_matrix_v1 schema / snapshot / API / UI、service_health_gap_matrix_v1 schema / snapshot / API / UI 已完成 |
| 工具 / 服務 / 套件 AI 自動化 | 88% | P0 已完成P1 套件 / 供應鏈主線已完成;備份 / DR 主線已完成到異地 / escrow 準備度顯示任務批准邊界、進度彙總、P1-001 執行面只讀矩陣、P1-002 Gitea 工作流程 / runner 健康合約、P1-003 監控合約 / 降噪矩陣、P1-004 AI 供應商路由矩陣P1-005 服務健康缺口矩陣與 P1-006 service health 證據卡已完成,下一主線是 P1-007 失敗限定通知合約 | 狀態分類、盤點 schema、權限矩陣、靜態盤點種子、只讀 API、UI 骨架、驗證、自動化待辦 schema / 快照 / API / 分組 UI、Backup / DR 目標盤點、準備度矩陣、備份通知政策、Backup / DR 證據 UI、復原演練批准包模板、異地 / escrow 準備度狀態、任務批准邊界、確定性進度彙總、Python 套件 / 供應鏈只讀基線、JS pnpm/npm 只讀基線、Docker build surface 只讀基線、CVE / license / drift 嚴重度政策、定期依賴漂移與外部資料來源檢查設計、依賴升級批准包模板、runtime_surface_inventory_v1 schema / snapshot / API / UI、gitea_workflow_runner_health_v1 schema / snapshot / API / UI、observability_contract_matrix_v1 schema / snapshot / API / UI、ai_provider_route_matrix_v1 schema / snapshot / API / UI、service_health_gap_matrix_v1 schema / snapshot / API / UI、service health evidence cards UI 已完成 |
| 本工作清單與分析報告 | 100% | 已完成 | 本 MD 文件 |
AI Agent 自動化工作包目前完成度:**88%**。本工作清單文件本身完成度:**100%**。
@@ -871,7 +871,7 @@ UI
| P1-003 | 完成 | 100 | Hermes | 盤點 Prometheus / Alertmanager / SigNoz / Grafana 監控合約 | `observability_contract_matrix_v1` / `GET /api/v1/agents/observability-contract-matrix` / 監控合約與降噪 UI | 只讀;不修改 alert rules、不改 receiver/route、不建立 silence、不寫 Grafana、不發通知 |
| P1-004 | 完成 | 100 | OpenClaw | 盤點 AI Router / Ollama / Nemotron / Gemini provider 路徑 | `ai_provider_route_matrix_v1` / `GET /api/v1/agents/ai-provider-route-matrix` / AI 供應商路由矩陣 UI | 只讀;不切 provider、不呼叫付費 API、不改 fallback order、不進 shadow/canary |
| P1-005 | 完成 | 100 | OpenClaw | 偵測服務健康缺口與過期端點 | `service_health_gap_matrix_v1` / `GET /api/v1/agents/service-health-gap-matrix` / 服務健康缺口與過期端點 UI | 只讀;不重啟、不改 endpoint、不做 active probe、不發通知 |
| P1-006 | 待辦 | 0 | Hermes | 在 UI 顯示 service health 證據卡 | 狀態卡 | 瀏覽器驗證 |
| P1-006 | 完成 | 100 | Hermes | 在 UI 顯示 service health 證據卡 | 治理頁 service health evidence cards主要 evidence ref、狀態、新鮮度、風險與下一步 | 只讀;不 live probe、不重啟、不改 endpoint、不發通知 |
| P1-007 | 待辦 | 0 | OpenClaw | 建立 service health 失敗限定 Telegram / AwoooP 對應 | 通知合約 | 不發成功洗版 |
### P1 - 備份與 DR 自動化
@@ -1104,21 +1104,20 @@ UI
```text
進度88%。
目前優先級P1。
目前任務P1-005 偵測服務健康缺口與過期端點
目前任務P1-006 在 UI 顯示 service health 證據卡
狀態變更:待辦 -> 完成。
證據service_health_gap_matrix_v1 schema / snapshotGET /api/v1/agents/service-health-gap-matrix治理頁服務健康缺口與過期端點區塊automation backlog 88%inventory tasks 31
目前數字service health targets 10需處置 targets 5stale endpoints 3health gaps 5service restart / endpoint change / active probe / notification send / runtime execution allowed counts 全部 0backlog done 21/24overall 88%P1 95%WS3 監控自動化 100%。
驗證JSON parse 通過service health gap matrix service / API、automation inventory / backlog snapshot service / API、AI provider route matrix service / API 目標測試 `35 passed`Python py_compile 通過;zh-TW / en i18n key 差異 `0`web typecheck 通過Next production build 通過source-control-owner-response guard、security-mirror-progress guard、git diff --check 通過;本地 API readback 回 `service_health_gap_matrix_v1`、current `P1-005`、next `P1-006`、targets `10`、需處置 `5`、stale endpoints `3`、health gaps `5`backlog 回 `88%`、done `21/24`inventory 回 tasks `31`;本地 desktop `1440x1000` 與 mobile `390x844` browser smoke 通過11 個 agents API 皆 `200``服務健康缺口與過期端點`、`P1-005`、`P1-006`、`88%`、`Ollama 三層健康合約`、`legacy 188 Ollama`、`不可誤讀合約`、`允許入口` 可見,`horizontalOverflow=0`、overflowing elements `0`、危險互動入口 `0`;本地 mini API 既有 dashboard SSE / RSC prefetch noise 不作為 P1-005 失敗
正式驗證code commit `1007a1bc` 已推 `gitea main`deploy marker `620b2c3a chore(cd): deploy 1007a1b [skip ci]`Gitea code-review `#2609` 成功、CD `#2608` 成功。Production health `healthy/prod/mock_mode=false`service health gap matrix API 回 `service_health_gap_matrix_v1`、current `P1-005`、next `P1-006`、targets `10`、需處置 `5`、stale endpoints `3`、health gaps `5`、service restart / endpoint change / active probe allowed counts 全部 `0`backlog API 回 overall `88%`、done `21/24`inventory API 回 tasks `31`。Production desktop `1440x1000` 與 mobile `390x844` smoke 通過,`服務健康缺口與過期端點`、`P1-005`、`P1-006`、`88%`、`健康目標`、`過期端點`、`健康缺口`、`不可誤讀合約`、`允許入口` 可見production console error `0`、HTTP failed response `0`、`horizontalOverflow=0`、overflowing elements `0`、內容危險操作入口 `0`、錯誤文字 `0`
證據service_health_gap_matrix_v1 snapshot / API治理頁 service health evidence cardsautomation backlog 88%inventory tasks 32
目前數字service health targets 10證據卡 10需處置 targets 5stale endpoints 3health gaps 5service restart / endpoint change / active probe / notification send / runtime execution allowed counts 全部 0backlog done 22/25overall 88%P1 96%WS3 監控自動化 100%。
驗證JSON parse 通過service health gap matrix service / API、automation inventory / backlog snapshot service / API 目標測試 `25 passed`zh-TW / en i18n key 差異 `0`web typecheck 通過。正式驗證待 code commit / deploy marker 後補 production API readback 與 desktop / mobile smoke
正式驗證:code commit 推送 Gitea、取得 deploy marker 後補
阻擋live probe、external health probe、service / pod / host restart、rollout restart、endpoint / ConfigMap 修改、provider switch、paid API call、Secret payload read、通知發送、workflow/deploy/reload/runtime execution 仍全部禁止。
下一步P1-006 在 UI 顯示 service health 證據卡
下一步P1-007 建立 service health 失敗限定 Telegram / AwoooP 對應
```
## 13. 立即執行順序
1. P1-006在 UI 顯示 service health 證據卡
2. P1-007建立 service health 失敗限定 Telegram / AwoooP 對應
3. P2 / P3 必須等 P1 服務、監控、provider route 與 service health evidence cards 可見且關卡穩定後再做。
1. P1-007建立 service health 失敗限定 Telegram / AwoooP 對應
2. P2 / P3 必須等 P1 服務、監控、provider route 與 service health evidence cards 可見且關卡穩定後再做
## 14. 目前風險

View File

@@ -1,35 +1,35 @@
{
"schema_version": "ai_agent_automation_backlog_v1",
"generated_at": "2026-06-05T14:05:00+08:00",
"generated_at": "2026-06-05T14:55:00+08:00",
"source_inventory_snapshot_ref": "docs/evaluations/ai_agent_automation_inventory_snapshot_2026-06-04_static_seed.json",
"program_status": {
"overall_completion_percent": 88,
"current_priority": "P1",
"current_task_id": "P1-005",
"next_task_id": "P1-006",
"current_task_id": "P1-006",
"next_task_id": "P1-007",
"read_only_mode": true
},
"rollups": {
"total_items": 24,
"total_items": 25,
"by_priority": {
"P1": 22,
"P1": 23,
"P2": 1,
"P3": 1
},
"by_status": {
"done": 21,
"done": 22,
"planned": 3
},
"by_gate_status": {
"read_only_allowed": 21,
"production_change_blocked": 1,
"blocked_by_evidence": 1,
"cost_approval_required": 1,
"blocked_by_evidence": 1
"production_change_blocked": 1,
"read_only_allowed": 22
},
"by_owner_agent": {
"hermes": 12,
"openclaw": 11,
"nemotron": 1
"hermes": 13,
"nemotron": 1,
"openclaw": 11
}
},
"backlog_items": [
@@ -478,6 +478,59 @@
]
}
},
{
"item_id": "AUTO-P1-006",
"priority": "P1",
"status": "done",
"workstream_id": "WS3",
"source_asset_id": "service_health_gap_matrix",
"source_signal_kind": "runtime_evidence_gap",
"title": "在 UI 顯示 service health 證據卡",
"owner_agent": "hermes",
"recommended_action": "已在治理頁顯示每個 service health target 的 committed evidence ref、狀態、新鮮度、風險與下一步不做 live probe。",
"action_class": "visualize",
"gate_status": "read_only_allowed",
"risk_level": "high",
"evidence_refs": [
"docs/evaluations/service_health_gap_matrix_2026-06-05.json",
"GET /api/v1/agents/service-health-gap-matrix",
"/zh-TW/governance?tab=automation-inventory",
"apps/web/src/app/[locale]/governance/tabs/automation-inventory-tab.tsx"
],
"acceptance_criteria": [
"每個 service health target 可看到主要 evidence ref、狀態、新鮮度、風險與下一步",
"不新增 live probe / restart / endpoint change / notification send 操作入口",
"desktop / mobile horizontal overflow 必須為 0",
"P1-006 UI 可見不得解讀成 runtime execution 授權"
],
"next_review": "P1-007",
"approval_boundary": {
"mode": "read_only_allowed",
"display_summary": "只允許顯示 committed service health evidence cards不得 live probe、重啟、改 endpoint、發通知或觸發 runtime execution。",
"allowed_actions": [
"讀取 committed snapshot",
"顯示證據卡",
"整理 operator review 視圖"
],
"blocked_actions": [
"production_write",
"runtime_execution",
"destructive_operation",
"secret_plaintext_collection",
"live_probe",
"service_restart",
"endpoint_change",
"notification_send"
],
"requires_operator_approval_for": [
"live probe",
"服務重啟",
"endpoint / ConfigMap 修改",
"Telegram / AwoooP 通知發送",
"runtime execution"
]
}
},
{
"item_id": "AUTO-P1-007",
"priority": "P1",
@@ -1199,12 +1252,12 @@
"destructive_operation_allowed": false
},
"item_approval_boundary_rollup": {
"total_items": 24,
"total_items": 25,
"by_mode": {
"read_only_allowed": 21,
"production_change_blocked": 1,
"blocked_by_evidence": 1,
"cost_approval_required": 1,
"blocked_by_evidence": 1
"production_change_blocked": 1,
"read_only_allowed": 22
},
"items_requiring_explicit_approval": [
"AUTO-P1-004",
@@ -1217,6 +1270,7 @@
"AUTO-P1-003",
"AUTO-P1-004",
"AUTO-P1-005",
"AUTO-P1-006",
"AUTO-P1-007",
"AUTO-P1-101",
"AUTO-P1-102",
@@ -1240,16 +1294,16 @@
},
"progress_summary": {
"overall_percent": 88,
"done_items": 21,
"done_items": 22,
"planned_items": 3,
"total_items": 24,
"total_items": 25,
"formula": "round(done_items / total_items * 100),只有 status=done 計入完成planned/in_progress/blocked/deferred/rejected 不計入。",
"by_priority": [
{
"priority": "P1",
"completion_percent": 95,
"done_items": 21,
"total_items": 22
"completion_percent": 96,
"done_items": 22,
"total_items": 23
},
{
"priority": "P2",
@@ -1285,8 +1339,8 @@
"workstream_id": "WS3",
"display_name": "監控自動化",
"completion_percent": 100,
"done_items": 5,
"total_items": 5,
"done_items": 6,
"total_items": 6,
"next_task_id": "complete"
},
{

View File

@@ -1,11 +1,11 @@
{
"schema_version": "ai_agent_automation_inventory_snapshot_v1",
"generated_at": "2026-06-05T14:05:00+08:00",
"generated_at": "2026-06-05T14:55:00+08:00",
"program_status": {
"overall_completion_percent": 100,
"current_priority": "P1",
"current_task_id": "P1-005",
"next_task_id": "P1-006",
"current_task_id": "P1-006",
"next_task_id": "P1-007",
"read_only_mode": true
},
"status_taxonomy": {
@@ -466,6 +466,21 @@
"GET /api/v1/agents/service-health-gap-matrix"
],
"next_action": "P1-006 在治理頁顯示 service health 證據卡;不得做 live probe、重啟或改 endpoint。"
},
{
"asset_id": "service_health_evidence_cards_ui",
"name": "Service health evidence cards UI",
"kind": "ui_surface",
"status": "ready_for_review",
"risk_level": "high",
"owner_agent": "hermes",
"source_refs": [
"apps/web/src/app/[locale]/governance/tabs/automation-inventory-tab.tsx",
"apps/web/messages/zh-TW.json"
],
"automation_scope": "read_only_visualization",
"recommended_next_action": "以 production desktop / mobile smoke 驗證證據卡可見與無水平溢出。",
"gate_status": "read_only_allowed"
}
],
"workstreams": [
@@ -1079,6 +1094,42 @@
]
}
},
{
"task_id": "P1-006",
"priority": "P1",
"status": "done",
"owner_agent": "Hermes",
"title": "在 UI 顯示 service health 證據卡",
"output": "治理頁 service health evidence cards主要 evidence ref、狀態、新鮮度、風險與下一步",
"gate_status": "read_only_allowed",
"next_action": "P1-007 建立 service health 失敗限定 Telegram / AwoooP 對應",
"approval_boundary": {
"mode": "read_only_allowed",
"display_summary": "只允許顯示 committed service health evidence cards不得 live probe、重啟、改 endpoint、發通知或 runtime execution。",
"allowed_actions": [
"讀取 committed snapshot",
"顯示證據卡",
"整理 operator review 視圖"
],
"blocked_actions": [
"production_write",
"runtime_execution",
"destructive_operation",
"secret_plaintext_collection",
"live_probe",
"service_restart",
"endpoint_change",
"notification_send"
],
"requires_operator_approval_for": [
"live probe",
"服務重啟",
"endpoint / ConfigMap 修改",
"Telegram / AwoooP 通知發送",
"runtime execution"
]
}
},
{
"task_id": "P1-101",
"priority": "P1",
@@ -1509,7 +1560,7 @@
"title": "偵測服務健康缺口與過期端點",
"output": "docs/evaluations/service_health_gap_matrix_2026-06-05.json + GET /api/v1/agents/service-health-gap-matrix",
"gate_status": "read_only_allowed",
"next_action": "完成 committed service health gap matrix下一步 P1-006 在 UI 顯示 service health 證據卡",
"next_action": "P1-006 在 UI 顯示 service health 證據卡",
"approval_boundary": {
"mode": "read_only_allowed",
"display_summary": "只允許整理 committed service health gap evidence 與需處置清單;不得 live probe、重啟、改 endpoint 或發通知。",
@@ -1883,6 +1934,13 @@
"kind": "read_only_api",
"ref": "GET /api/v1/agents/service-health-gap-matrix",
"result": "只讀 API 回傳 service_health_gap_matrix_v1不做 live probe、不重啟服務、不改 endpoint、不讀 Secret/Redis/DB payload、不發通知。"
},
{
"evidence_id": "service_health_evidence_cards_ui",
"kind": "ui_surface",
"source": "apps/web/src/app/[locale]/governance/tabs/automation-inventory-tab.tsx",
"status": "committed",
"summary": "治理頁顯示 service health evidence cards只讀 committed evidence refs不提供執行入口。"
}
],
"approval_boundaries": {
@@ -1893,12 +1951,12 @@
"destructive_operation_allowed": false
},
"task_approval_boundary_rollup": {
"total_tasks": 31,
"total_tasks": 32,
"by_mode": {
"ready_for_operator_review": 1,
"read_only_allowed": 28,
"approval_required": 1,
"production_change_blocked": 1
"production_change_blocked": 1,
"read_only_allowed": 29,
"ready_for_operator_review": 1
},
"tasks_requiring_explicit_approval": [
"P0-001",
@@ -1919,6 +1977,7 @@
"P1-003",
"P1-004",
"P1-005",
"P1-006",
"P1-101",
"P1-102",
"P1-103",

View File

@@ -3570,3 +3570,20 @@ Phase 6 完成後
2. P1-007建立 service health 失敗限定 Telegram / AwoooP 對應;成功 smoke 不即時通知,避免洗版。
**裁決:** P1-005 只完成 read-only service health gap matrix、API 與治理頁顯示。不得把 `service_health_gap_matrix_v1`、健康目標、過期端點、健康缺口、需處置清單或不可誤讀合約解讀成 live health check 已執行、服務重啟批准、endpoint 修改批准、通知發送批准、runtime gate 提高、S4.9 owner response gate 提高或 security acceptance 已成立。
### 2026-06-05 下午 (台北) — P1-006 服務健康證據卡本地完成
**觸發**:接續 P1-005 正式驗證後推進 P1-006目標是把 service health committed evidence refs 轉成更容易掃描的 UI 證據卡,而不是增加任何 runtime 探測或修復能力。
**已推進:**
- P1-006治理頁 `/zh-TW/governance?tab=automation-inventory` 新增「服務健康證據卡」,每張卡顯示 target 名稱、狀態、健康類型、新鮮度、風險、主要 evidence ref、額外證據數量與下一步。
- P1-006同步 automation backlog / inventory snapshotcurrent `P1-006`、next `P1-007`、backlog done `22/25`、overall `88%`、P1 `96%`、WS3 `100%`、inventory tasks `32`
- P1-006所有 action boundary 維持 read-onlylive probe、service restart、endpoint change、notification send、workflow / deploy / reload / runtime execution allowed counts 仍為 `0`
- 本地驗證JSON parse 通過service health gap matrix service / API、automation inventory / backlog snapshot service / API 目標測試 `25 passed`zh-TW / en i18n key 差異 `0`web typecheck 通過。
**待補:**
1. Next production build。
2. Gitea push 後取得 deploy marker補 production API readback 與 desktop / mobile browser smoke。
3. P1-007建立 service health 失敗限定 Telegram / AwoooP 對應;成功 smoke 不即時通知,避免洗版。
**裁決:** P1-006 只完成 service health committed evidence cards 的 UI 可讀性不得把證據卡、target 狀態、主要 evidence ref、風險標籤或下一步解讀成 live probe、服務重啟、endpoint / ConfigMap 修改、通知發送、runtime gate 提高、S4.9 owner response gate 提高或 security acceptance 已成立。