diff --git a/apps/api/tests/test_ai_agent_automation_backlog_snapshot_api.py b/apps/api/tests/test_ai_agent_automation_backlog_snapshot_api.py
index c7717610..2d77f739 100644
--- a/apps/api/tests/test_ai_agent_automation_backlog_snapshot_api.py
+++ b/apps/api/tests/test_ai_agent_automation_backlog_snapshot_api.py
@@ -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"]
diff --git a/apps/api/tests/test_ai_agent_automation_inventory_snapshot_api.py b/apps/api/tests/test_ai_agent_automation_inventory_snapshot_api.py
index b5f9af5a..02023c58 100644
--- a/apps/api/tests/test_ai_agent_automation_inventory_snapshot_api.py
+++ b/apps/api/tests/test_ai_agent_automation_inventory_snapshot_api.py
@@ -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"])
diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json
index 6f8cb03e..58ab8096 100644
--- a/apps/web/messages/en.json
+++ b/apps/web/messages/en.json
@@ -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 健康",
diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json
index 6f8cb03e..58ab8096 100644
--- a/apps/web/messages/zh-TW.json
+++ b/apps/web/messages/zh-TW.json
@@ -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 健康",
diff --git a/apps/web/src/app/[locale]/governance/tabs/automation-inventory-tab.tsx b/apps/web/src/app/[locale]/governance/tabs/automation-inventory-tab.tsx
index a2761534..5a23a5d0 100644
--- a/apps/web/src/app/[locale]/governance/tabs/automation-inventory-tab.tsx
+++ b/apps/web/src/app/[locale]/governance/tabs/automation-inventory-tab.tsx
@@ -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 (
@@ -1946,6 +1955,60 @@ export function AutomationInventoryTab() {
/>
+
{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,
diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md
index a9a2daa0..d267f52e 100644
--- a/docs/LOGBOOK.md
+++ b/docs/LOGBOOK.md
@@ -1,3 +1,37 @@
+## 2026-06-05|P1-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 snapshot:current `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-05|P1-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。
diff --git a/docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md b/docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md
index 8035b263..4a663561 100644
--- a/docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md
+++ b/docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md
@@ -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 / snapshot;GET /api/v1/agents/service-health-gap-matrix;治理頁服務健康缺口與過期端點區塊;automation backlog 88%;inventory tasks 31。
-目前數字:service health targets 10;需處置 targets 5;stale endpoints 3;health gaps 5;service restart / endpoint change / active probe / notification send / runtime execution allowed counts 全部 0;backlog done 21/24;overall 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 cards;automation backlog 88%;inventory tasks 32。
+目前數字:service health targets 10;證據卡 10;需處置 targets 5;stale endpoints 3;health gaps 5;service restart / endpoint change / active probe / notification send / runtime execution allowed counts 全部 0;backlog done 22/25;overall 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. 目前風險
diff --git a/docs/evaluations/ai_agent_automation_backlog_2026-06-04.json b/docs/evaluations/ai_agent_automation_backlog_2026-06-04.json
index 1a09f11d..bb090681 100644
--- a/docs/evaluations/ai_agent_automation_backlog_2026-06-04.json
+++ b/docs/evaluations/ai_agent_automation_backlog_2026-06-04.json
@@ -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"
},
{
diff --git a/docs/evaluations/ai_agent_automation_inventory_snapshot_2026-06-04_static_seed.json b/docs/evaluations/ai_agent_automation_inventory_snapshot_2026-06-04_static_seed.json
index 243793a9..9727b542 100644
--- a/docs/evaluations/ai_agent_automation_inventory_snapshot_2026-06-04_static_seed.json
+++ b/docs/evaluations/ai_agent_automation_inventory_snapshot_2026-06-04_static_seed.json
@@ -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",
diff --git a/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md b/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md
index 2d1b408b..b5f7edc5 100644
--- a/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md
+++ b/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md
@@ -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 snapshot;current `P1-006`、next `P1-007`、backlog done `22/25`、overall `88%`、P1 `96%`、WS3 `100%`、inventory tasks `32`。
+- P1-006:所有 action boundary 維持 read-only;live 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 已成立。