diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index 03187d78..2830f787 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -3149,7 +3149,8 @@ "labels": { "requiredFields": "必填欄位 {count}", "forbiddenFields": "禁止欄位 {count}", - "idempotency": "idempotency key: {value}" + "idempotency": "idempotency key: {value}", + "unassigned": "未指定" }, "agents": { "openclaw": "OpenClaw", @@ -3230,13 +3231,47 @@ "L3_draft_change_after_gate": "L3 批准後草案" }, "approvalGates": { + "alert_rule_write_approval_required": "需 alert rule 寫入批准", + "cluster_write_blocked": "叢集寫入封鎖", + "code_change_required_for_fix": "修復需程式變更", + "cost_data_and_route_approval_required": "需費用資料與路由批准", + "cost_data_and_sanitized_fixture_approval_required": "需費用資料與脫敏 fixture 批准", + "cost_or_runtime_change_approval_required": "需費用或 runtime 變更批准", "read_only_allowed": "只讀允許", "km_write_owner_review_required": "KM 寫入需 owner 審查", "secret_value_handling_forbidden": "機密值處理禁止", "owner_review_required": "需 owner 審查", + "owner_response_required": "需 owner 回覆", + "human_approval_required": "需人工批准", "runtime_worker_gate_required": "需 runtime worker 關卡", "db_migration_required": "需 DB migration 關卡", + "db_migration_approval_required": "需 DB migration 批准", + "dependency_approval_required": "需依賴更新批准", + "external_scan_and_dependency_approval_required": "需外部掃描與依賴批准", + "external_source_approval_required": "需外部來源批准", + "host_update_approval_required": "需主機更新批准", + "image_pull_build_push_approval_required": "需映像 pull / build / push 批准", + "k8s_upgrade_maintenance_window_required": "需 K8s 升級 maintenance window", + "legal_owner_review_required": "需法務 owner 審查", + "maintenance_window_required": "需 maintenance window", + "market_scorecard_and_replay_gate_required": "需市場 scorecard 與 replay 關卡", + "market_scorecard_replay_and_cost_data_approval_required": "需市場 scorecard / replay / 費用資料批准", + "monitoring_route_receiver_write_blocked": "監控 route / receiver 寫入封鎖", + "new_tool_or_secret_approval_required": "需新工具或 secret 批准", + "operator_release_window_required": "需 operator release window", "replay_shadow_canary_gate_required": "需 replay / shadow / canary 關卡", + "restart_or_endpoint_change_requires_approval": "restart 或 endpoint 變更需批准", + "restore_execution_blocked": "restore 執行封鎖", + "restore_or_prune_approval_required": "restore 或 prune 需批准", + "route_receiver_write_blocked": "route / receiver 寫入封鎖", + "ssh_or_host_probe_approval_required": "需 SSH 或主機 probe 批准", + "stateful_upgrade_approval_required": "需 stateful 升級批准", + "telegram_direct_send_blocked": "Telegram 直接發送封鎖", + "telegram_send_or_route_change_requires_approval": "Telegram 發送或路由變更需批准", + "tool_install_or_ci_change_approval_required": "工具安裝或 CI 變更需批准", + "workflow_and_bot_approval_required": "workflow 與 bot 需批准", + "workflow_modification_approval_required": "workflow 修改需批准", + "write_requires_human_gate": "寫入需人工關卡", "cost_data_approval_required": "需費用與資料邊界批准" } }, diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index 03187d78..2830f787 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -3149,7 +3149,8 @@ "labels": { "requiredFields": "必填欄位 {count}", "forbiddenFields": "禁止欄位 {count}", - "idempotency": "idempotency key: {value}" + "idempotency": "idempotency key: {value}", + "unassigned": "未指定" }, "agents": { "openclaw": "OpenClaw", @@ -3230,13 +3231,47 @@ "L3_draft_change_after_gate": "L3 批准後草案" }, "approvalGates": { + "alert_rule_write_approval_required": "需 alert rule 寫入批准", + "cluster_write_blocked": "叢集寫入封鎖", + "code_change_required_for_fix": "修復需程式變更", + "cost_data_and_route_approval_required": "需費用資料與路由批准", + "cost_data_and_sanitized_fixture_approval_required": "需費用資料與脫敏 fixture 批准", + "cost_or_runtime_change_approval_required": "需費用或 runtime 變更批准", "read_only_allowed": "只讀允許", "km_write_owner_review_required": "KM 寫入需 owner 審查", "secret_value_handling_forbidden": "機密值處理禁止", "owner_review_required": "需 owner 審查", + "owner_response_required": "需 owner 回覆", + "human_approval_required": "需人工批准", "runtime_worker_gate_required": "需 runtime worker 關卡", "db_migration_required": "需 DB migration 關卡", + "db_migration_approval_required": "需 DB migration 批准", + "dependency_approval_required": "需依賴更新批准", + "external_scan_and_dependency_approval_required": "需外部掃描與依賴批准", + "external_source_approval_required": "需外部來源批准", + "host_update_approval_required": "需主機更新批准", + "image_pull_build_push_approval_required": "需映像 pull / build / push 批准", + "k8s_upgrade_maintenance_window_required": "需 K8s 升級 maintenance window", + "legal_owner_review_required": "需法務 owner 審查", + "maintenance_window_required": "需 maintenance window", + "market_scorecard_and_replay_gate_required": "需市場 scorecard 與 replay 關卡", + "market_scorecard_replay_and_cost_data_approval_required": "需市場 scorecard / replay / 費用資料批准", + "monitoring_route_receiver_write_blocked": "監控 route / receiver 寫入封鎖", + "new_tool_or_secret_approval_required": "需新工具或 secret 批准", + "operator_release_window_required": "需 operator release window", "replay_shadow_canary_gate_required": "需 replay / shadow / canary 關卡", + "restart_or_endpoint_change_requires_approval": "restart 或 endpoint 變更需批准", + "restore_execution_blocked": "restore 執行封鎖", + "restore_or_prune_approval_required": "restore 或 prune 需批准", + "route_receiver_write_blocked": "route / receiver 寫入封鎖", + "ssh_or_host_probe_approval_required": "需 SSH 或主機 probe 批准", + "stateful_upgrade_approval_required": "需 stateful 升級批准", + "telegram_direct_send_blocked": "Telegram 直接發送封鎖", + "telegram_send_or_route_change_requires_approval": "Telegram 發送或路由變更需批准", + "tool_install_or_ci_change_approval_required": "工具安裝或 CI 變更需批准", + "workflow_and_bot_approval_required": "workflow 與 bot 需批准", + "workflow_modification_approval_required": "workflow 修改需批准", + "write_requires_human_gate": "寫入需人工關卡", "cost_data_approval_required": "需費用與資料邊界批准" } }, 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 f63a6e4b..83563335 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 @@ -1322,7 +1322,9 @@ export function AutomationInventoryTab() { } } - const redisDryRunValueLabel = (group: string, value: string) => { + const redisDryRunValueLabel = (group: string, value?: string) => { + if (!value) return t('redisDryRunGate.labels.unassigned') + try { return t(`redisDryRunGate.${group}.${value}` as never) } catch { @@ -1870,11 +1872,12 @@ export function AutomationInventoryTab() { {target.display_name} - {target.operator_instruction} + {target.verifier_check}
+
))} @@ -1891,7 +1894,7 @@ export function AutomationInventoryTab() { - {'required_evidence' in item ? item.required_evidence : item.operator_instruction} + {'trigger' in item ? item.trigger : item.operator_instruction} diff --git a/apps/web/src/lib/api-client.ts b/apps/web/src/lib/api-client.ts index ad7db07e..c359b261 100644 --- a/apps/web/src/lib/api-client.ts +++ b/apps/web/src/lib/api-client.ts @@ -1712,18 +1712,17 @@ export interface AiAgentPostWriteVerifierPackageSnapshot { verification_targets: Array<{ target_id: string display_name: string - target_surface: string status: string owner_agent: 'openclaw' | 'hermes' | 'nemotron' - required_readback: string + verifier_check: string + failure_escalation: string blocked_runtime_action: string - operator_instruction: string }> failure_lanes: Array<{ lane_id: string display_name: string status: string - required_evidence: string + trigger: string blocked_runtime_action: string operator_instruction: string }> diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index 68911096..e67df485 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,30 @@ +## 2026-06-12|P2-403H Governance UI / i18n 顯示修補 + +**背景**:P2-403H Post-write Verifier Package API 已在正式站回傳新快照後,治理頁正式 DOM / console 驗證發現兩個顯示層缺口:`postWriteVerifierPackage.verifier_package.owner_agent` 不存在但前端仍嘗試渲染,造成 `redisDryRunGate.agents.undefined`;P2-402 proactive approval gate 新增多個 gate id,但訊息檔尚未補齊,造成 `MISSING_MESSAGE`。 + +**完成**: + +- `AiAgentPostWriteVerifierPackageSnapshot` 已對齊正式 API:`verifier_package` 不再宣告不存在的 `owner_agent` / `package_id` / `display_name` / `status`;`verification_targets` 改用 `verifier_check` 與 `failure_escalation`;`failure_lanes` 改用 `trigger`。 +- Governance automation inventory 的 P2-403H 區塊不再讀不存在的 owner 欄位,verification target 改顯示 verifier check 與 failure escalation。 +- `redisDryRunValueLabel` 對空值回傳 `未指定`,避免再組出 `agents.undefined`。 +- `zh-TW.json` / `en.json` 補齊目前 P2-402 主動營運契約實際出現的 approval gate label,避免正式頁 console 出現 `proactiveOperations.approvalGates.*` missing message。 + +**本地驗證**: + +- `python3 -m json.tool apps/web/messages/zh-TW.json` / `apps/web/messages/en.json`:通過。 +- zh-TW / en message mirror:`True`。 +- P2-402 committed approval gate 覆蓋:`APPROVAL_GATE_MISSING=[]`。 +- 靜態 grep:`verifier_package.owner_agent`、`target.operator_instruction`、`agents.undefined` 命中 `0`。 +- `git diff --check`、`security-mirror-progress-guard.py`、`source-control-owner-response-guard.py`、`doc-secrets-sanity-check.py docs .gitea`:通過。 +- `pnpm --filter @awoooi/web typecheck`:通過。 +- `NEXT_PUBLIC_API_URL=https://awoooi.wooo.work NEXT_PRIVATE_BUILD_WORKER_COUNT=1 SENTRY_SUPPRESS_GLOBAL_ERROR_HANDLER_FILE_WARNING=1 pnpm --filter @awoooi/web build`:通過;`92/92` static pages,`/zh-TW/governance` First Load JS `397 kB`。 + +**正式站驗證**:待 code commit 觸發 Gitea CD 後補。 + +**完成度同步**:P2-403H API / contract 仍為 `97%`;本段只修前端顯示與 i18n,不提高 runtime 自動化完成度。 + +**邊界**:本段未讀 canonical target、未寫 rollback work item、未發 Telegram、未寫 KM、未更新 PlayBook trust、未寫 timeline learning、未寫 replay score、未啟動 runtime worker、未讀 secret value、未新增任何前端執行按鈕。 + ## 2026-06-12|P2-403H Post-write Verifier Package **背景**:統帥指出 Telegram / AwoooP 批准後仍沒有真正自動化,也沒有清楚的人工作業選項。P2-403G 已把 runtime write 前的雙重批准、dry-run hash 與 post-write verifier gate 固定下來;本段把批准後應該執行的 verifier package、rollback lane、failure lane 與人工操作選項補成可審查契約,避免 approval resolved 後仍只得到 no-action 結論。