feat(governance): expose AI agent professional judgment
Some checks failed
Code Review / ai-code-review (push) Successful in 21s
CD Pipeline / tests (push) Successful in 1m51s
CD Pipeline / post-deploy-checks (push) Has been cancelled
CD Pipeline / build-and-deploy (push) Has been cancelled

This commit is contained in:
Your Name
2026-06-26 08:14:47 +08:00
parent 96c6f52c61
commit c172c6ffe5
3 changed files with 278 additions and 0 deletions

View File

@@ -3682,6 +3682,45 @@
}
}
},
"professionalJudgment": {
"title": "AI Agent 專業判斷矩陣",
"badge": "判斷依據 / 信心 / 建議 / Gate",
"summary": "目前顯示 {agents} 位 Agent 的專業判斷;採用證據 {evidence} 件,需 gate / owner review {gates} 件,正式寫入與 Telegram 實送邊界 {live}。",
"items": {
"openclaw": {
"role": "仲裁與風險分級先看乾跑證據、owner packet 與高風險接受度。",
"judgment": "判斷:乾跑需審 {dryRuns},高風險 {high},已接受 owner response {accepted};未接受前只做候選與審核包。",
"evidence": "證據 {evidence} / packet {packets}",
"confidence": "低/中 {low}/{medium}",
"recommendation": "建議blocked {blocked} 先維持人工 gate不升級 runtime。",
"gate": "GateOpenClaw owner review {reviews}。"
},
"hermes": {
"role": "報告與記憶:把工作量、回執、圖表與 RAG / KM 摘要整理成可讀證據。",
"judgment": "判斷queue 草稿 {drafts}、報告資產 {reports}、圖表來源 {charts};先 no-send preview。",
"evidence": "KM {km} / receipt {receipt}",
"confidence": "ready {ready}/{cadences}",
"recommendation": "建議:{approvals} 個報告/發送/學習決策先進 gate。",
"gate": "GateTelegram live / Bot API 實送 {sends}。"
},
"nemotron": {
"role": "市場與回放:用 no-write replay、scorecard 與版本漂移比較挑戰既有模型配置。",
"judgment": "判斷:回放 {replays}、scorecard {scorecards}、版本漂移候選 {drift};只產比較,不切 provider。",
"evidence": "市場 {market} / stale {stale}",
"confidence": "shadow {passed}/{total}",
"recommendation": "建議:{checkpoints} 個 checkpoint 未批准前不升級模型路由。",
"gate": "Gateprovider / production write 阻擋 {writes}。"
},
"securitySre": {
"role": "安全與 SRE負責權限模型、runtime 寫入邊界、Verifier 與高風險回滾條件。",
"judgment": "判斷gate {gates}、權限類別 {categories}、blocked {blocked};先保障不誤執行。",
"evidence": "Verifier {verifiers} / health {health}",
"confidence": "write {write} / TG {telegram}",
"recommendation": "建議:高風險 {high} 先整理 owner packet 與 rollback owner。",
"gate": "Gateruntime / write blocked {blocked}。"
}
}
},
"executionQueue": {
"title": "全面授權後推進佇列",
"badge": "低中風險自動準備 · 高風險等審核",

View File

@@ -3682,6 +3682,45 @@
}
}
},
"professionalJudgment": {
"title": "AI Agent 專業判斷矩陣",
"badge": "判斷依據 / 信心 / 建議 / Gate",
"summary": "目前顯示 {agents} 位 Agent 的專業判斷;採用證據 {evidence} 件,需 gate / owner review {gates} 件,正式寫入與 Telegram 實送邊界 {live}。",
"items": {
"openclaw": {
"role": "仲裁與風險分級先看乾跑證據、owner packet 與高風險接受度。",
"judgment": "判斷:乾跑需審 {dryRuns},高風險 {high},已接受 owner response {accepted};未接受前只做候選與審核包。",
"evidence": "證據 {evidence} / packet {packets}",
"confidence": "低/中 {low}/{medium}",
"recommendation": "建議blocked {blocked} 先維持人工 gate不升級 runtime。",
"gate": "GateOpenClaw owner review {reviews}。"
},
"hermes": {
"role": "報告與記憶:把工作量、回執、圖表與 RAG / KM 摘要整理成可讀證據。",
"judgment": "判斷queue 草稿 {drafts}、報告資產 {reports}、圖表來源 {charts};先 no-send preview。",
"evidence": "KM {km} / receipt {receipt}",
"confidence": "ready {ready}/{cadences}",
"recommendation": "建議:{approvals} 個報告/發送/學習決策先進 gate。",
"gate": "GateTelegram live / Bot API 實送 {sends}。"
},
"nemotron": {
"role": "市場與回放:用 no-write replay、scorecard 與版本漂移比較挑戰既有模型配置。",
"judgment": "判斷:回放 {replays}、scorecard {scorecards}、版本漂移候選 {drift};只產比較,不切 provider。",
"evidence": "市場 {market} / stale {stale}",
"confidence": "shadow {passed}/{total}",
"recommendation": "建議:{checkpoints} 個 checkpoint 未批准前不升級模型路由。",
"gate": "Gateprovider / production write 阻擋 {writes}。"
},
"securitySre": {
"role": "安全與 SRE負責權限模型、runtime 寫入邊界、Verifier 與高風險回滾條件。",
"judgment": "判斷gate {gates}、權限類別 {categories}、blocked {blocked};先保障不誤執行。",
"evidence": "Verifier {verifiers} / health {health}",
"confidence": "write {write} / TG {telegram}",
"recommendation": "建議:高風險 {high} 先整理 owner packet 與 rollback owner。",
"gate": "Gateruntime / write blocked {blocked}。"
}
}
},
"executionQueue": {
"title": "全面授權後推進佇列",
"badge": "低中風險自動準備 · 高風險等審核",

View File

@@ -5831,6 +5831,142 @@ export function AutomationInventoryTab() {
icon: <BookOpenCheck size={15} />,
},
]
const professionalJudgmentEvidenceTotal = (
candidateDryRunEvidenceCount
+ highRiskOwnerQueuePackets
+ reportDryRunArtifacts
+ reportDryRunQueueDrafts
+ visibleReportStatusCharts.length
+ visibleReportCharts.length
+ runtimeShadowReplays
+ criticReviewerScorecards
+ operationPermissionCategories
+ runtimeVerifierActions
)
const professionalJudgmentGateTotal = (
openClawOwnerReview
+ hermesOwnerReview
+ nemotronOwnerReview
+ securitySreOwnerReview
+ proofBlockedGates
)
const globalControlProfessionalJudgmentRows: Array<{
key: string
agent: string
role: string
judgment: string
evidence: string
confidence: string
recommendation: string
gate: string
tone: 'ok' | 'warn' | 'danger' | 'neutral'
icon: ReactNode
}> = [
{
key: 'openclaw',
agent: 'OpenClaw',
role: t('globalControl.professionalJudgment.items.openclaw.role'),
judgment: t('globalControl.professionalJudgment.items.openclaw.judgment', {
dryRuns: candidateDryRunNeedsReview,
high: highRiskOwnerQueueItems,
accepted: highRiskOwnerQueueAccepted,
}),
evidence: t('globalControl.professionalJudgment.items.openclaw.evidence', {
evidence: candidateDryRunEvidenceCount,
packets: highRiskOwnerQueuePackets,
}),
confidence: t('globalControl.professionalJudgment.items.openclaw.confidence', {
low: lowMediumWhitelistLow,
medium: lowMediumWhitelistMedium,
}),
recommendation: t('globalControl.professionalJudgment.items.openclaw.recommendation', {
blocked: highRiskOwnerQueueBlocked + operationPermissionBlocked,
}),
gate: t('globalControl.professionalJudgment.items.openclaw.gate', {
reviews: openClawOwnerReview,
}),
tone: openClawOwnerReview + highRiskOwnerQueueBlocked > 0 ? 'warn' : 'ok',
icon: <Target size={15} />,
},
{
key: 'hermes',
agent: 'Hermes',
role: t('globalControl.professionalJudgment.items.hermes.role'),
judgment: t('globalControl.professionalJudgment.items.hermes.judgment', {
drafts: reportDryRunQueueDrafts,
reports: reportDryRunArtifacts,
charts: visibleReportStatusCharts.length + visibleReportCharts.length,
}),
evidence: t('globalControl.professionalJudgment.items.hermes.evidence', {
km: taskResultKmDrafts,
receipt: telegramReceiptGates,
}),
confidence: t('globalControl.professionalJudgment.items.hermes.confidence', {
ready: reportRuntimeReady,
cadences: reportCadenceCount,
}),
recommendation: t('globalControl.professionalJudgment.items.hermes.recommendation', {
approvals: hermesOwnerReview,
}),
gate: t('globalControl.professionalJudgment.items.hermes.gate', {
sends: globalControlTelegramSendTotal,
}),
tone: hermesOwnerReview + reportRuntimeBlocked > 0 ? 'warn' : 'ok',
icon: <MessageSquareText size={15} />,
},
{
key: 'nemotron',
agent: 'NemoTron',
role: t('globalControl.professionalJudgment.items.nemotron.role'),
judgment: t('globalControl.professionalJudgment.items.nemotron.judgment', {
replays: runtimeShadowReplays,
scorecards: criticReviewerScorecards,
drift: dependencySupplyChainDriftMonitor.rollups.drift_candidate_count,
}),
evidence: t('globalControl.professionalJudgment.items.nemotron.evidence', {
market: warRoomMarketCandidates,
stale: dependencySupplyChainDriftMonitor.rollups.stale_source_snapshot_count,
}),
confidence: t('globalControl.professionalJudgment.items.nemotron.confidence', {
passed: runtimeShadowPassed,
total: runtimeShadowCandidates,
}),
recommendation: t('globalControl.professionalJudgment.items.nemotron.recommendation', {
checkpoints: runtimeShadowApprovals + criticReviewerPromotionGates,
}),
gate: t('globalControl.professionalJudgment.items.nemotron.gate', {
writes: runtimeShadowProductionWrites + providerRouteDeniedCount,
}),
tone: runtimeShadowBlocked + nemotronOwnerReview > 0 ? 'warn' : 'ok',
icon: <RefreshCw size={15} />,
},
{
key: 'securitySre',
agent: 'Security / SRE',
role: t('globalControl.professionalJudgment.items.securitySre.role'),
judgment: t('globalControl.professionalJudgment.items.securitySre.judgment', {
gates: operationPermissionGates,
categories: operationPermissionCategories,
blocked: operationPermissionBlocked,
}),
evidence: t('globalControl.professionalJudgment.items.securitySre.evidence', {
verifiers: runtimeVerifierActions,
health: serviceHealthOperatorReviews,
}),
confidence: t('globalControl.professionalJudgment.items.securitySre.confidence', {
write: globalControlLiveWriteAllowedTotal,
telegram: globalControlTelegramSendTotal,
}),
recommendation: t('globalControl.professionalJudgment.items.securitySre.recommendation', {
high: highRiskOwnerQueueItems,
}),
gate: t('globalControl.professionalJudgment.items.securitySre.gate', {
blocked: runtimeWriteBlockedActions + operationPermissionBlocked,
}),
tone: runtimeWriteBlockedActions + operationPermissionBlocked + highRiskOwnerQueueItems > 0 ? 'danger' : 'ok',
icon: <ShieldAlert size={15} />,
},
]
return (
<div className="automation-inventory-tab-root" style={{ padding: 20, display: 'flex', flexDirection: 'column', gap: 16, minWidth: 0 }}>
@@ -6149,6 +6285,69 @@ export function AutomationInventoryTab() {
</div>
</div>
<div style={{ padding: 12, border: '0.5px solid #d6e0d4', borderRadius: 7, background: '#fbfff8', display: 'flex', flexDirection: 'column', gap: 11, minWidth: 0 }}>
<div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 10, flexWrap: 'wrap' }}>
<div style={{ display: 'flex', flexDirection: 'column', gap: 4, minWidth: 0 }}>
<SmallLabel>{t('globalControl.professionalJudgment.title')}</SmallLabel>
<span style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color: '#5b6f58', lineHeight: 1.5, overflowWrap: 'anywhere' }}>
{t('globalControl.professionalJudgment.summary', {
agents: globalControlProfessionalJudgmentRows.length,
evidence: professionalJudgmentEvidenceTotal,
gates: professionalJudgmentGateTotal,
live: agentCollaborationLiveBoundaryTotal,
})}
</span>
</div>
<Chip value={t('globalControl.professionalJudgment.badge')} muted />
</div>
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: 10 }} className="automation-inventory-global-control-professional-judgment-grid">
{globalControlProfessionalJudgmentRows.map(row => {
const color = toneColor(row.tone)
return (
<div key={row.key} style={{ padding: 11, border: `0.5px solid ${color}44`, borderRadius: 7, background: '#fff', display: 'flex', flexDirection: 'column', gap: 8, minWidth: 0 }}>
<div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 8, minWidth: 0 }}>
<div style={{ display: 'flex', alignItems: 'center', gap: 7, minWidth: 0 }}>
<div style={{
width: 28,
height: 28,
borderRadius: 7,
border: `0.5px solid ${color}55`,
background: `${color}12`,
color,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
flexShrink: 0,
}}>
{row.icon}
</div>
<span style={{ fontFamily: 'Syne, sans-serif', fontSize: 13, fontWeight: 760, color: '#141413', lineHeight: 1.2, overflowWrap: 'anywhere' }}>
{row.agent}
</span>
</div>
<Chip value={row.confidence} muted={row.tone === 'ok'} />
</div>
<span style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color: '#5b6f58', lineHeight: 1.45, overflowWrap: 'anywhere' }}>
{row.role}
</span>
<span style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color: '#3f4f3d', lineHeight: 1.45, overflowWrap: 'anywhere' }}>
{row.judgment}
</span>
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, minWidth: 0 }}>
<Chip value={row.evidence} muted />
</div>
<span style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color, fontWeight: 700, lineHeight: 1.45, overflowWrap: 'anywhere' }}>
{row.recommendation}
</span>
<span style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color: '#5b6f58', lineHeight: 1.45, overflowWrap: 'anywhere' }}>
{row.gate}
</span>
</div>
)
})}
</div>
</div>
<div style={{ padding: 12, border: '0.5px solid #eee1c8', borderRadius: 7, background: '#fffdf7', display: 'flex', flexDirection: 'column', gap: 11, minWidth: 0 }}>
<div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 10, flexWrap: 'wrap' }}>
<div style={{ display: 'flex', flexDirection: 'column', gap: 4, minWidth: 0 }}>
@@ -18925,6 +19124,7 @@ export function AutomationInventoryTab() {
.automation-inventory-global-control-runway-grid,
.automation-inventory-global-control-agent-workload-grid,
.automation-inventory-global-control-collaboration-proof-grid,
.automation-inventory-global-control-professional-judgment-grid,
.automation-inventory-global-control-execution-queue-grid,
.automation-inventory-global-control-execution-queue-meta-grid,
.automation-inventory-global-control-domain-grid,