fix(web): 補齊 P2-403H 治理頁翻譯
All checks were successful
CD Pipeline / tests (push) Successful in 1m25s
Code Review / ai-code-review (push) Successful in 13s
CD Pipeline / build-and-deploy (push) Successful in 4m22s
CD Pipeline / post-deploy-checks (push) Successful in 1m55s

This commit is contained in:
Your Name
2026-06-12 01:29:58 +08:00
parent a794714daf
commit 4a9f8d947d
5 changed files with 108 additions and 9 deletions

View File

@@ -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": "需費用與資料邊界批准"
}
},

View File

@@ -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": "需費用與資料邊界批准"
}
},

View File

@@ -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}
</span>
<span style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color: '#87867f', lineHeight: 1.45, overflowWrap: 'anywhere' }}>
{target.operator_instruction}
{target.verifier_check}
</span>
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 6 }}>
<Chip value={redisDryRunValueLabel('agents', target.owner_agent)} muted />
<Chip value={target.blocked_runtime_action} muted />
<Chip value={target.failure_escalation} muted />
</div>
</div>
))}
@@ -1891,7 +1894,7 @@ export function AutomationInventoryTab() {
<Chip value={redisDryRunValueLabel('statuses', item.status)} muted={item.status !== 'approval_required'} />
</div>
<span style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color: '#87867f', lineHeight: 1.45, overflowWrap: 'anywhere' }}>
{'required_evidence' in item ? item.required_evidence : item.operator_instruction}
{'trigger' in item ? item.trigger : item.operator_instruction}
</span>
<Chip value={item.blocked_runtime_action} muted />
</div>

View File

@@ -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
}>

View File

@@ -1,3 +1,30 @@
## 2026-06-12P2-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-12P2-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 結論。