diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index a50decbd..2d41505a 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -3650,6 +3650,38 @@ } } }, + "collaborationProof": { + "title": "AI Agent 協作與學習證據流", + "badge": "互通 / 回放 / RAG / Telegram receipt", + "summary": "目前可見協作證據 {proofs} 件;需審核或阻擋 {review} 件,正式寫入 / Telegram 實送邊界總數 {live}。", + "items": { + "handoffBus": { + "label": "交接事件匯流排", + "detail": "責任 lane {lanes} 條,必填 owner 欄位 {fields} 個,已接受回覆 {accepted}。", + "next": "下一步:{blocked} 個 runtime action 仍由 owner gate 阻擋。" + }, + "ragLearning": { + "label": "RAG / KM 學習候選", + "detail": "RAG memory proposal {rag}、KM draft {km}、PlayBook 候選 {playbooks}。", + "next": "下一步:learning / trust 正式寫入 {writes},未開 gate 不寫。" + }, + "criticReplay": { + "label": "Critic 回放評分", + "detail": "回放 {replays} 次、scorecard {scorecards} 張,shadow 通過 {passed}/{total}。", + "next": "下一步:{approvals} 個升級 checkpoint 等 owner review。" + }, + "telegramReceipt": { + "label": "Telegram 回執閉環", + "detail": "需批准 {approvals}、阻擋 {blocked}、正式回執 {live}。", + "next": "下一步:Telegram 實送 / Bot API 仍為 {sends},只顯示候選摘要。" + }, + "visibleRuntimeProof": { + "label": "可見 runtime 證據", + "detail": "前台 surface {surfaces} 個,contract ready {levels} 層,live session readback {sessions}。", + "next": "下一步:{gates} 個 proof gate 未通過前不宣稱全自動閉環。" + } + } + }, "executionQueue": { "title": "全面授權後推進佇列", "badge": "低中風險自動準備 · 高風險等審核", diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index a50decbd..2d41505a 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -3650,6 +3650,38 @@ } } }, + "collaborationProof": { + "title": "AI Agent 協作與學習證據流", + "badge": "互通 / 回放 / RAG / Telegram receipt", + "summary": "目前可見協作證據 {proofs} 件;需審核或阻擋 {review} 件,正式寫入 / Telegram 實送邊界總數 {live}。", + "items": { + "handoffBus": { + "label": "交接事件匯流排", + "detail": "責任 lane {lanes} 條,必填 owner 欄位 {fields} 個,已接受回覆 {accepted}。", + "next": "下一步:{blocked} 個 runtime action 仍由 owner gate 阻擋。" + }, + "ragLearning": { + "label": "RAG / KM 學習候選", + "detail": "RAG memory proposal {rag}、KM draft {km}、PlayBook 候選 {playbooks}。", + "next": "下一步:learning / trust 正式寫入 {writes},未開 gate 不寫。" + }, + "criticReplay": { + "label": "Critic 回放評分", + "detail": "回放 {replays} 次、scorecard {scorecards} 張,shadow 通過 {passed}/{total}。", + "next": "下一步:{approvals} 個升級 checkpoint 等 owner review。" + }, + "telegramReceipt": { + "label": "Telegram 回執閉環", + "detail": "需批准 {approvals}、阻擋 {blocked}、正式回執 {live}。", + "next": "下一步:Telegram 實送 / Bot API 仍為 {sends},只顯示候選摘要。" + }, + "visibleRuntimeProof": { + "label": "可見 runtime 證據", + "detail": "前台 surface {surfaces} 個,contract ready {levels} 層,live session readback {sessions}。", + "next": "下一步:{gates} 個 proof gate 未通過前不宣稱全自動閉環。" + } + } + }, "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 625d75e6..2e381691 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 @@ -5585,6 +5585,112 @@ export function AutomationInventoryTab() { icon: , }, ] + const agentCollaborationProofTotal = ( + actionOwnerEventBusEvents + + actionOwnerEventBusRag + + actionOwnerEventBusGates + + proofSignalCount + + telegramReceiptGates + + runtimeShadowReplays + + criticReviewerScorecards + ) + const agentCollaborationReviewTotal = ( + actionOwnerEventBusBlocked + + proofBlockedGates + + telegramReceiptApprovals + + runtimeShadowApprovals + + criticReviewerPromotionGates + ) + const agentCollaborationLiveBoundaryTotal = ( + actionOwnerEventBusLiveTotal + + telegramReceiptLiveTotal + + globalControlLiveWriteAllowedTotal + + globalControlTelegramSendTotal + ) + const globalControlCollaborationRows: Array<{ + key: string + label: string + owner: string + value: string + detail: string + next: string + tone: 'ok' | 'warn' | 'danger' | 'neutral' + icon: ReactNode + }> = [ + { + key: 'handoffBus', + label: t('globalControl.collaborationProof.items.handoffBus.label'), + owner: 'OpenClaw / Hermes / Security', + value: String(actionOwnerEventBusEvents), + detail: t('globalControl.collaborationProof.items.handoffBus.detail', { + lanes: actionOwnerEventBusLanes, + fields: actionOwnerEventBusFields, + accepted: actionOwnerEventBusAccepted, + }), + next: t('globalControl.collaborationProof.items.handoffBus.next', { blocked: actionOwnerEventBusBlocked }), + tone: actionOwnerEventBusBlocked > 0 ? 'warn' : 'ok', + icon: , + }, + { + key: 'ragLearning', + label: t('globalControl.collaborationProof.items.ragLearning.label'), + owner: 'Hermes / OpenClaw', + value: String(actionOwnerEventBusRag + matchedPlaybookCandidates + taskResultKmDrafts), + detail: t('globalControl.collaborationProof.items.ragLearning.detail', { + rag: actionOwnerEventBusRag, + km: taskResultKmDrafts, + playbooks: matchedPlaybookCandidates, + }), + next: t('globalControl.collaborationProof.items.ragLearning.next', { + writes: matchedPlaybookLearningWrites + matchedPlaybookTrustWrites + taskResultKmWrites, + }), + tone: matchedPlaybookGates + learningWritebackApprovals > 0 ? 'warn' : 'ok', + icon: , + }, + { + key: 'criticReplay', + label: t('globalControl.collaborationProof.items.criticReplay.label'), + owner: 'Nemotron / Critic', + value: String(runtimeShadowReplays + criticReviewerScorecards), + detail: t('globalControl.collaborationProof.items.criticReplay.detail', { + replays: runtimeShadowReplays, + scorecards: criticReviewerScorecards, + passed: runtimeShadowPassed, + total: runtimeShadowCandidates, + }), + next: t('globalControl.collaborationProof.items.criticReplay.next', { approvals: runtimeShadowApprovals + criticReviewerPromotionGates }), + tone: runtimeShadowApprovals + criticReviewerPromotionGates > 0 ? 'warn' : 'ok', + icon: , + }, + { + key: 'telegramReceipt', + label: t('globalControl.collaborationProof.items.telegramReceipt.label'), + owner: 'Hermes / Telegram Bot', + value: `${telegramReceiptLanes}/${telegramReceiptGates}`, + detail: t('globalControl.collaborationProof.items.telegramReceipt.detail', { + approvals: telegramReceiptApprovals, + blocked: telegramReceiptBlockedActions, + live: telegramReceiptLiveTotal, + }), + next: t('globalControl.collaborationProof.items.telegramReceipt.next', { sends: globalControlTelegramSendTotal }), + tone: telegramReceiptApprovals + telegramReceiptBlockedActions > 0 ? 'warn' : 'ok', + icon: , + }, + { + key: 'visibleRuntimeProof', + label: t('globalControl.collaborationProof.items.visibleRuntimeProof.label'), + owner: 'All Agents', + value: String(proofSignalCount), + detail: t('globalControl.collaborationProof.items.visibleRuntimeProof.detail', { + surfaces: proofVisibleSurfaces, + levels: proofContractReadyLevels, + sessions: proofLiveSessions, + }), + next: t('globalControl.collaborationProof.items.visibleRuntimeProof.next', { gates: proofBlockedGates }), + tone: proofBlockedGates > 0 ? 'warn' : 'ok', + icon: , + }, + ] const globalControlExecutionQueueRows: Array<{ key: string label: string @@ -5987,6 +6093,62 @@ export function AutomationInventoryTab() { +
+
+
+ {t('globalControl.collaborationProof.title')} + + {t('globalControl.collaborationProof.summary', { + proofs: agentCollaborationProofTotal, + review: agentCollaborationReviewTotal, + live: agentCollaborationLiveBoundaryTotal, + })} + +
+ +
+
+ {globalControlCollaborationRows.map(row => { + const color = toneColor(row.tone) + return ( +
+
+
+
+ {row.icon} +
+ + {row.label} + +
+ +
+
+ +
+ + {row.detail} + + + {row.next} + +
+ ) + })} +
+
+
@@ -18762,6 +18924,7 @@ export function AutomationInventoryTab() { .automation-inventory-global-control-pipeline-grid, .automation-inventory-global-control-runway-grid, .automation-inventory-global-control-agent-workload-grid, + .automation-inventory-global-control-collaboration-proof-grid, .automation-inventory-global-control-execution-queue-grid, .automation-inventory-global-control-execution-queue-meta-grid, .automation-inventory-global-control-domain-grid,