feat(governance): expose AI agent autonomy maturity
This commit is contained in:
@@ -5967,6 +5967,155 @@ export function AutomationInventoryTab() {
|
||||
icon: <ShieldAlert size={15} />,
|
||||
},
|
||||
]
|
||||
const globalControlAutonomyEvidenceTotal = (
|
||||
professionalJudgmentEvidenceTotal
|
||||
+ agentCollaborationProofTotal
|
||||
+ candidateDryRunEvidenceCount
|
||||
+ proofSignalCount
|
||||
)
|
||||
const globalControlAutonomyPreparedTotal = (
|
||||
candidateDryRunPassed
|
||||
+ runtimeShadowPassed
|
||||
+ reportRuntimeReady
|
||||
+ lowMediumWhitelistCandidates
|
||||
+ matchedPlaybookCandidates
|
||||
)
|
||||
const globalControlAutonomyGateTotal = (
|
||||
globalControlApprovalGateTotal
|
||||
+ runtimeWriteBlockedActions
|
||||
+ operationPermissionBlocked
|
||||
+ highRiskOwnerQueueBlocked
|
||||
+ reportRuntimeApprovals
|
||||
+ runtimeShadowApprovals
|
||||
+ learningWritebackApprovals
|
||||
)
|
||||
const globalControlAutonomyMaturityRows: Array<{
|
||||
key: string
|
||||
label: string
|
||||
stage: string
|
||||
owner: string
|
||||
value: string
|
||||
detail: string
|
||||
next: string
|
||||
gate: string
|
||||
tone: 'ok' | 'warn' | 'danger' | 'neutral'
|
||||
icon: ReactNode
|
||||
}> = [
|
||||
{
|
||||
key: 'sensorEvidence',
|
||||
label: t('globalControl.autonomyMaturity.items.sensorEvidence.label'),
|
||||
stage: t('globalControl.autonomyMaturity.stages.sensor'),
|
||||
owner: 'Hermes / OpenClaw',
|
||||
value: `${globalControlDomainRows.length}/8`,
|
||||
detail: t('globalControl.autonomyMaturity.items.sensorEvidence.detail', {
|
||||
assets: snapshot.assets.length,
|
||||
proofs: proofSignalCount,
|
||||
probes: hostStatefulInventory.rollups.readonly_probe_step_count,
|
||||
}),
|
||||
next: t('globalControl.autonomyMaturity.items.sensorEvidence.next', {
|
||||
blocked: proofBlockedGates,
|
||||
}),
|
||||
gate: t('globalControl.autonomyMaturity.gates.readOnly'),
|
||||
tone: proofBlockedGates > 0 ? 'warn' : 'ok',
|
||||
icon: <Fingerprint size={15} />,
|
||||
},
|
||||
{
|
||||
key: 'candidateDryRun',
|
||||
label: t('globalControl.autonomyMaturity.items.candidateDryRun.label'),
|
||||
stage: t('globalControl.autonomyMaturity.stages.candidate'),
|
||||
owner: 'OpenClaw / SRE',
|
||||
value: `${candidateDryRunPassed}/${candidateDryRunCount}`,
|
||||
detail: t('globalControl.autonomyMaturity.items.candidateDryRun.detail', {
|
||||
evidence: candidateDryRunEvidenceCount,
|
||||
auto: lowMediumWhitelistCandidates,
|
||||
verifier: candidateDryRunVerifierPlans,
|
||||
}),
|
||||
next: t('globalControl.autonomyMaturity.items.candidateDryRun.next', {
|
||||
review: candidateDryRunNeedsReview,
|
||||
}),
|
||||
gate: t('globalControl.autonomyMaturity.gates.noWrite'),
|
||||
tone: candidateDryRunNeedsReview > 0 ? 'warn' : 'ok',
|
||||
icon: <ClipboardCheck size={15} />,
|
||||
},
|
||||
{
|
||||
key: 'reportTelegram',
|
||||
label: t('globalControl.autonomyMaturity.items.reportTelegram.label'),
|
||||
stage: t('globalControl.autonomyMaturity.stages.report'),
|
||||
owner: 'Hermes / Reporter',
|
||||
value: `${reportRuntimeReady}/${reportRuntimeLanes}`,
|
||||
detail: t('globalControl.autonomyMaturity.items.reportTelegram.detail', {
|
||||
drafts: reportDryRunQueueDrafts,
|
||||
charts: visibleReportStatusCharts.length + visibleReportCharts.length,
|
||||
receipts: telegramReceiptGates,
|
||||
}),
|
||||
next: t('globalControl.autonomyMaturity.items.reportTelegram.next', {
|
||||
approvals: reportRuntimeApprovals + reportDryRunApprovals + reportFixtureApprovals,
|
||||
}),
|
||||
gate: t('globalControl.autonomyMaturity.gates.noTelegram', {
|
||||
sends: globalControlTelegramSendTotal,
|
||||
}),
|
||||
tone: reportRuntimeApprovals + reportDryRunApprovals + reportFixtureApprovals > 0 ? 'warn' : 'ok',
|
||||
icon: <BellRing size={15} />,
|
||||
},
|
||||
{
|
||||
key: 'marketReplay',
|
||||
label: t('globalControl.autonomyMaturity.items.marketReplay.label'),
|
||||
stage: t('globalControl.autonomyMaturity.stages.replay'),
|
||||
owner: 'NemoTron / Critic',
|
||||
value: `${runtimeShadowPassed}/${runtimeShadowCandidates}`,
|
||||
detail: t('globalControl.autonomyMaturity.items.marketReplay.detail', {
|
||||
market: warRoomMarketCandidates,
|
||||
drift: dependencySupplyChainDriftMonitor.rollups.drift_candidate_count,
|
||||
scorecards: criticReviewerScorecards,
|
||||
}),
|
||||
next: t('globalControl.autonomyMaturity.items.marketReplay.next', {
|
||||
checkpoints: runtimeShadowApprovals + criticReviewerPromotionGates,
|
||||
}),
|
||||
gate: t('globalControl.autonomyMaturity.gates.noProviderSwitch', {
|
||||
writes: runtimeShadowProductionWrites + providerRouteDeniedCount,
|
||||
}),
|
||||
tone: runtimeShadowApprovals + criticReviewerPromotionGates + providerRouteDeniedCount > 0 ? 'warn' : 'ok',
|
||||
icon: <RefreshCw size={15} />,
|
||||
},
|
||||
{
|
||||
key: 'executionGate',
|
||||
label: t('globalControl.autonomyMaturity.items.executionGate.label'),
|
||||
stage: t('globalControl.autonomyMaturity.stages.execution'),
|
||||
owner: 'Security / SRE',
|
||||
value: String(globalControlLiveWriteAllowedTotal),
|
||||
detail: t('globalControl.autonomyMaturity.items.executionGate.detail', {
|
||||
gates: globalControlApprovalGateTotal,
|
||||
blocked: runtimeWriteBlockedActions + operationPermissionBlocked + highRiskOwnerQueueBlocked,
|
||||
telegram: globalControlTelegramSendTotal,
|
||||
}),
|
||||
next: t('globalControl.autonomyMaturity.items.executionGate.next', {
|
||||
reviews: securitySreOwnerReview + openClawOwnerReview,
|
||||
}),
|
||||
gate: t('globalControl.autonomyMaturity.gates.runtimeClosed'),
|
||||
tone: globalControlLiveWriteAllowedTotal === 0 && globalControlTelegramSendTotal === 0 ? 'warn' : 'danger',
|
||||
icon: <Lock size={15} />,
|
||||
},
|
||||
{
|
||||
key: 'verifierLearning',
|
||||
label: t('globalControl.autonomyMaturity.items.verifierLearning.label'),
|
||||
stage: t('globalControl.autonomyMaturity.stages.learning'),
|
||||
owner: 'All Agents',
|
||||
value: `${resultCaptureReleaseReadbacks}/${learningWritebackLiveWrites}`,
|
||||
detail: t('globalControl.autonomyMaturity.items.verifierLearning.detail', {
|
||||
verifier: runtimeVerifierActions,
|
||||
km: taskResultKmDrafts,
|
||||
playbooks: matchedPlaybookCandidates,
|
||||
}),
|
||||
next: t('globalControl.autonomyMaturity.items.verifierLearning.next', {
|
||||
gates: matchedPlaybookGates + learningWritebackApprovals,
|
||||
}),
|
||||
gate: t('globalControl.autonomyMaturity.gates.learningNoWrite', {
|
||||
writes: matchedPlaybookLearningWrites + matchedPlaybookTrustWrites + taskResultKmWrites,
|
||||
}),
|
||||
tone: matchedPlaybookGates + learningWritebackApprovals > 0 ? 'warn' : 'ok',
|
||||
icon: <ShieldCheck size={15} />,
|
||||
},
|
||||
]
|
||||
|
||||
return (
|
||||
<div className="automation-inventory-tab-root" style={{ padding: 20, display: 'flex', flexDirection: 'column', gap: 16, minWidth: 0 }}>
|
||||
@@ -6351,6 +6500,71 @@ export function AutomationInventoryTab() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style={{ padding: 12, border: '0.5px solid #cbd7ea', borderRadius: 7, background: '#f9fbff', 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.autonomyMaturity.title')}</SmallLabel>
|
||||
<span style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color: '#536078', lineHeight: 1.5, overflowWrap: 'anywhere' }}>
|
||||
{t('globalControl.autonomyMaturity.summary', {
|
||||
rows: globalControlAutonomyMaturityRows.length,
|
||||
evidence: globalControlAutonomyEvidenceTotal,
|
||||
prepared: globalControlAutonomyPreparedTotal,
|
||||
gates: globalControlAutonomyGateTotal,
|
||||
live: globalControlLiveWriteAllowedTotal,
|
||||
})}
|
||||
</span>
|
||||
</div>
|
||||
<Chip value={t('globalControl.autonomyMaturity.badge')} muted />
|
||||
</div>
|
||||
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, minmax(0, 1fr))', gap: 10 }} className="automation-inventory-global-control-autonomy-maturity-grid">
|
||||
{globalControlAutonomyMaturityRows.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: 'grid', gridTemplateColumns: '30px minmax(0, 1fr)', gap: 9, alignItems: 'start', minWidth: 0 }}>
|
||||
<div style={{
|
||||
width: 30,
|
||||
height: 30,
|
||||
borderRadius: 7,
|
||||
border: `0.5px solid ${color}55`,
|
||||
background: `${color}12`,
|
||||
color,
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
}}>
|
||||
{row.icon}
|
||||
</div>
|
||||
<div style={{ display: 'flex', flexDirection: 'column', gap: 7, minWidth: 0 }}>
|
||||
<div style={{ display: 'flex', justifyContent: 'space-between', gap: 8, alignItems: 'flex-start', flexWrap: 'wrap', minWidth: 0 }}>
|
||||
<div style={{ display: 'flex', flexDirection: 'column', gap: 3, minWidth: 0 }}>
|
||||
<span style={{ fontFamily: 'Syne, sans-serif', fontSize: 13, fontWeight: 760, color: '#141413', lineHeight: 1.2, overflowWrap: 'anywhere' }}>
|
||||
{row.label}
|
||||
</span>
|
||||
<span style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color: '#64718b', lineHeight: 1.35, overflowWrap: 'anywhere' }}>
|
||||
{row.stage}
|
||||
</span>
|
||||
</div>
|
||||
<Chip value={row.value} muted={row.tone === 'ok'} />
|
||||
</div>
|
||||
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, minWidth: 0 }}>
|
||||
<Chip value={row.owner} />
|
||||
</div>
|
||||
<span style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color: '#536078', lineHeight: 1.45, overflowWrap: 'anywhere' }}>
|
||||
{row.detail}
|
||||
</span>
|
||||
<span style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color, fontWeight: 700, lineHeight: 1.45, overflowWrap: 'anywhere' }}>
|
||||
{row.next}
|
||||
</span>
|
||||
<span style={{ fontFamily: "'DM Mono', monospace", fontSize: 10, color: '#64718b', lineHeight: 1.45, overflowWrap: 'anywhere' }}>
|
||||
{row.gate}
|
||||
</span>
|
||||
</div>
|
||||
</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 }}>
|
||||
@@ -19128,6 +19342,7 @@ export function AutomationInventoryTab() {
|
||||
.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-autonomy-maturity-grid,
|
||||
.automation-inventory-global-control-execution-queue-grid,
|
||||
.automation-inventory-global-control-execution-queue-meta-grid,
|
||||
.automation-inventory-global-control-domain-grid,
|
||||
|
||||
Reference in New Issue
Block a user