fix(awooop): route alert handoff through controlled review
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 18s
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-29 19:06:18 +08:00
parent 04f5d20682
commit 09538932df
4 changed files with 34 additions and 32 deletions

View File

@@ -245,25 +245,27 @@ function FocusIncidentEvidencePanel({
const latestOutboundLabel = latestOutbound?.sent_at
? formatTimestamp(latestOutbound.sent_at, locale, emptyLabel)
: emptyLabel
const needsHumanLabel = chain?.needs_human ? t('operatorFlow.needsHumanYes') : t('operatorFlow.needsHumanNo')
const handoffTone = !chain ? 'gray' : chain.needs_human ? 'red' : 'green'
const controlledReviewLabel = chain?.needs_human
? t('operatorFlow.controlledReviewYes')
: t('operatorFlow.controlledReviewNo')
const handoffTone = !chain ? 'gray' : chain.needs_human ? 'amber' : 'green'
const handoffTitle = chain?.needs_human
? t('operatorFlow.handoff.titleManual')
? t('operatorFlow.handoff.titleControlledReview')
: chain
? t('operatorFlow.handoff.titleAutomated')
: t('operatorFlow.handoff.titleUnknown')
const handoffAction = !chain
? t('operatorFlow.handoff.actionUnknown')
: chain.needs_human
? t('operatorFlow.handoff.actionManualVerifyOrRepair')
? t('operatorFlow.handoff.actionControlledVerifyOrRepair')
: t('operatorFlow.handoff.actionNoManual')
const handoffOwner = chain?.needs_human
? t('operatorFlow.handoff.ownerSre')
? t('operatorFlow.handoff.ownerControlledReview')
: chain
? t('operatorFlow.handoff.ownerAutomation')
: emptyLabel
const handoffEntry = chain?.needs_human
? t('operatorFlow.handoff.entryManual')
? t('operatorFlow.handoff.entryControlledReview')
: chain
? t('operatorFlow.handoff.entryReadOnly')
: emptyLabel
@@ -328,9 +330,9 @@ function FocusIncidentEvidencePanel({
detail: t('operatorFlow.aiDetail', {
state: outcomeStateLabel,
nextStep: nextActionLabel,
needsHuman: needsHumanLabel,
controlledReview: controlledReviewLabel,
}),
tone: chain?.needs_human ? 'red' : chain ? 'green' : 'gray',
tone: chain?.needs_human ? 'amber' : chain ? 'green' : 'gray',
testId: 'alerts-ai-state',
},
{
@@ -467,7 +469,7 @@ function FocusIncidentEvidencePanel({
className={cn(
'mb-3 border px-3 py-3',
handoffTone === 'green' && 'border-[#9bc7a4] bg-[#f0faf2]',
handoffTone === 'red' && 'border-[#e2a29b] bg-[#fff0ef]',
handoffTone === 'amber' && 'border-[#d9b36f] bg-[#fff7e8]',
handoffTone === 'gray' && 'border-[#d8d3c7] bg-[#faf9f3]',
)}
>

View File

@@ -247,7 +247,7 @@ function IncidentObservabilityFocus({
const ansibleTone: EvidenceTone = ansible?.applied || (ansible?.apply_total ?? 0) > 0
? 'success'
: (ansible?.considered || (ansible?.record_total ?? 0) > 0 ? 'warning' : 'neutral')
const handoffTone: EvidenceTone = chain?.needs_human ? 'blocked' : (chain ? 'success' : 'neutral')
const handoffTone: EvidenceTone = chain?.needs_human ? 'warning' : (chain ? 'success' : 'neutral')
const navItems = [
{