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() { />
+
+
+
+ + + {t('serviceHealth.evidenceCardsTitle')} + +
+ + {t('serviceHealth.evidenceCardsDetail')} + +
+
+ {visibleServiceHealthEvidenceCards.map(({ target, primaryEvidence, extraEvidenceCount }) => ( +
+
+ + {target.display_name} + + +
+
+ + + +
+
+ {t('serviceHealth.labels.primaryEvidence')} +
+ {primaryEvidence ?? t('backupEvidence.noEvidence')} +
+ {extraEvidenceCount > 0 ? ( + + ) : null} +
+
+ {t('serviceHealth.labels.nextAction')} +
+ {target.next_action} +
+
+
+ ))} +
+
+
{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 已成立。