diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json
index 8c248c66..a50decbd 100644
--- a/apps/web/messages/en.json
+++ b/apps/web/messages/en.json
@@ -3611,6 +3611,45 @@
"next": "下一步:{gates} 個 learning / trust gate 未打開。"
}
},
+ "agentWorkload": {
+ "title": "AI Agent 工作量與專業分工",
+ "badge": "OpenClaw / Hermes / Nemotron / Security-SRE",
+ "summary": "目前可見工作量 {workload} 件;其中負責人審核 {review} 件、阻擋 {blocked} 件,正式寫入 / Telegram / 機密讀取 / 破壞性操作邊界總數 {live}。",
+ "labels": {
+ "review": "審核 {count}",
+ "blocked": "阻擋 {count}"
+ },
+ "agents": {
+ "openclaw": {
+ "label": "OpenClaw",
+ "mission": "仲裁、風險分級、乾跑候選與負責人審核包主責;不靠身份保護,仍接受市場與回放數據挑戰。",
+ "telegram": "Telegram:{reviews} 件需審核時只產摘要/批准包,不直接發正式處置。",
+ "learning": "學習:承接 {candidates} 個 PlayBook / KM 候選,等待 gate 後寫回。",
+ "next": "下一步:整理 {dryRuns} 個乾跑候選與 {high} 個高風險審核包。"
+ },
+ "hermes": {
+ "label": "Hermes",
+ "mission": "報告、圖表、回執、RAG / KM 摘要與 Telegram 無發送預覽主責。",
+ "telegram": "Telegram:{drafts} 個佇列草稿先做無發送預覽,正式發送仍需 gate。",
+ "learning": "學習:KM draft {km} 筆,learning gate {gates} 個未開。",
+ "next": "下一步:產 {reports} 份報告資產與 {charts} 個圖表來源。"
+ },
+ "nemotron": {
+ "label": "Nemotron",
+ "mission": "市場版本雷達、回放、shadow scorecard 與模型候選比較主責;未通過 gate 不切 provider。",
+ "telegram": "Telegram:{replays} 次回放只進摘要候選,不做正式發送。",
+ "learning": "學習:市場候選 {market}、版本漂移 {drift} 形成比較證據。",
+ "next": "下一步:shadow 通過 {passed}/{total},未批准前不升級路由。"
+ },
+ "securitySre": {
+ "label": "Security / SRE",
+ "mission": "權限模型、主機/服務 gate、執行期寫入邊界、Verifier 與回滾檢查主責。",
+ "telegram": "Telegram:{gates} 條 gate 只產風險/批准摘要,禁止直接 Bot API 操作。",
+ "learning": "學習:Verifier / 服務健康證據 {verifiers} 筆進入審計與回寫候選。",
+ "next": "下一步:{blocked} 個被阻擋的執行期 / 寫入類別維持預設關閉。"
+ }
+ }
+ },
"executionQueue": {
"title": "全面授權後推進佇列",
"badge": "低中風險自動準備 · 高風險等審核",
diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json
index 8c248c66..a50decbd 100644
--- a/apps/web/messages/zh-TW.json
+++ b/apps/web/messages/zh-TW.json
@@ -3611,6 +3611,45 @@
"next": "下一步:{gates} 個 learning / trust gate 未打開。"
}
},
+ "agentWorkload": {
+ "title": "AI Agent 工作量與專業分工",
+ "badge": "OpenClaw / Hermes / Nemotron / Security-SRE",
+ "summary": "目前可見工作量 {workload} 件;其中負責人審核 {review} 件、阻擋 {blocked} 件,正式寫入 / Telegram / 機密讀取 / 破壞性操作邊界總數 {live}。",
+ "labels": {
+ "review": "審核 {count}",
+ "blocked": "阻擋 {count}"
+ },
+ "agents": {
+ "openclaw": {
+ "label": "OpenClaw",
+ "mission": "仲裁、風險分級、乾跑候選與負責人審核包主責;不靠身份保護,仍接受市場與回放數據挑戰。",
+ "telegram": "Telegram:{reviews} 件需審核時只產摘要/批准包,不直接發正式處置。",
+ "learning": "學習:承接 {candidates} 個 PlayBook / KM 候選,等待 gate 後寫回。",
+ "next": "下一步:整理 {dryRuns} 個乾跑候選與 {high} 個高風險審核包。"
+ },
+ "hermes": {
+ "label": "Hermes",
+ "mission": "報告、圖表、回執、RAG / KM 摘要與 Telegram 無發送預覽主責。",
+ "telegram": "Telegram:{drafts} 個佇列草稿先做無發送預覽,正式發送仍需 gate。",
+ "learning": "學習:KM draft {km} 筆,learning gate {gates} 個未開。",
+ "next": "下一步:產 {reports} 份報告資產與 {charts} 個圖表來源。"
+ },
+ "nemotron": {
+ "label": "Nemotron",
+ "mission": "市場版本雷達、回放、shadow scorecard 與模型候選比較主責;未通過 gate 不切 provider。",
+ "telegram": "Telegram:{replays} 次回放只進摘要候選,不做正式發送。",
+ "learning": "學習:市場候選 {market}、版本漂移 {drift} 形成比較證據。",
+ "next": "下一步:shadow 通過 {passed}/{total},未批准前不升級路由。"
+ },
+ "securitySre": {
+ "label": "Security / SRE",
+ "mission": "權限模型、主機/服務 gate、執行期寫入邊界、Verifier 與回滾檢查主責。",
+ "telegram": "Telegram:{gates} 條 gate 只產風險/批准摘要,禁止直接 Bot API 操作。",
+ "learning": "學習:Verifier / 服務健康證據 {verifiers} 筆進入審計與回寫候選。",
+ "next": "下一步:{blocked} 個被阻擋的執行期 / 寫入類別維持預設關閉。"
+ }
+ }
+ },
"executionQueue": {
"title": "全面授權後推進佇列",
"badge": "低中風險自動準備 · 高風險等審核",
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 341ffe93..625d75e6 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
@@ -5465,6 +5465,126 @@ export function AutomationInventoryTab() {
)
const globalControlQueueOwnerReview = highRiskOwnerQueueItems + reportRuntimeApprovals + runtimeShadowApprovals + learningWritebackApprovals
const globalControlQueueBlocked = highRiskOwnerQueueBlocked + operationPermissionBlocked + runtimeShadowBlocked + reportRuntimeBlocked
+ const openClawWorkload = (
+ serviceHealthActions
+ + candidateDryRunNeedsReview
+ + lowMediumWhitelistCandidates
+ + highRiskOwnerQueueItems
+ + operationPermissionHumanApproval
+ + explicitApprovalTaskCount
+ )
+ const openClawOwnerReview = (
+ candidateDryRunNeedsReview
+ + highRiskOwnerQueueItems
+ + operationPermissionHumanApproval
+ )
+ const hermesWorkload = (
+ reportRuntimeReady
+ + reportDryRunArtifacts
+ + reportDryRunQueueDrafts
+ + matchedPlaybookCandidates
+ + taskResultKmDrafts
+ + hostStatefulInventory.rollups.readonly_probe_step_count
+ )
+ const hermesOwnerReview = reportRuntimeApprovals + reportDryRunApprovals + reportFixtureApprovals + learningWritebackApprovals
+ const nemotronWorkload = (
+ runtimeShadowCandidates
+ + runtimeShadowReplays
+ + dependencySupplyChainDriftMonitor.rollups.drift_candidate_count
+ + warRoomMarketCandidates
+ + providerRouteGateApprovals
+ )
+ const nemotronOwnerReview = runtimeShadowApprovals + providerRouteGateApprovals + dependencySupplyChainDriftMonitor.rollups.blocked_operation_count
+ const securitySreWorkload = (
+ operationPermissionCategories
+ + highRiskOwnerQueueItems
+ + serviceHealthOperatorReviews
+ + giteaRunnerActions
+ + runtimeWriteApprovals
+ )
+ const securitySreOwnerReview = operationPermissionHumanApproval + highRiskOwnerQueueItems + runtimeWriteApprovals
+ const agentWorkloadTotal = openClawWorkload + hermesWorkload + nemotronWorkload + securitySreWorkload
+ const agentWorkloadOwnerReviewTotal = openClawOwnerReview + hermesOwnerReview + nemotronOwnerReview + securitySreOwnerReview
+ const agentWorkloadBlockedTotal = (
+ highRiskOwnerQueueBlocked
+ + operationPermissionBlocked
+ + runtimeShadowBlocked
+ + reportRuntimeBlocked
+ + lowMediumWhitelistBlocked
+ + dependencySupplyChainDriftMonitor.rollups.blocked_operation_count
+ )
+ const agentWorkloadLiveBoundaryTotal = (
+ globalControlLiveWriteAllowedTotal
+ + globalControlTelegramSendTotal
+ + operationPermissionSecretReads
+ + operationPermissionDestructive
+ )
+ const globalControlAgentWorkloadRows: Array<{
+ key: string
+ label: string
+ mission: string
+ workload: number
+ ownerReview: number
+ blocked: number
+ telegram: string
+ learning: string
+ next: string
+ tone: 'ok' | 'warn' | 'danger' | 'neutral'
+ icon: ReactNode
+ }> = [
+ {
+ key: 'openclaw',
+ label: t('globalControl.agentWorkload.agents.openclaw.label'),
+ mission: t('globalControl.agentWorkload.agents.openclaw.mission'),
+ workload: openClawWorkload,
+ ownerReview: openClawOwnerReview,
+ blocked: highRiskOwnerQueueBlocked + operationPermissionBlocked + lowMediumWhitelistBlocked,
+ telegram: t('globalControl.agentWorkload.agents.openclaw.telegram', { reviews: openClawOwnerReview }),
+ learning: t('globalControl.agentWorkload.agents.openclaw.learning', { candidates: matchedPlaybookCandidates + taskResultKmDrafts }),
+ next: t('globalControl.agentWorkload.agents.openclaw.next', { dryRuns: candidateDryRunNeedsReview, high: highRiskOwnerQueueItems }),
+ tone: openClawOwnerReview + highRiskOwnerQueueBlocked + operationPermissionBlocked > 0 ? 'warn' : 'ok',
+ icon: