fix(agent-market): move discovery review to controlled queue
Some checks failed
CD Pipeline / tests (push) Successful in 1m43s
Code Review / ai-code-review (push) Successful in 12s
Ansible / Reboot Recovery Contract / validate (push) Failing after 12m47s
CD Pipeline / build-and-deploy (push) Successful in 5m52s
CD Pipeline / post-deploy-checks (push) Successful in 3m7s

This commit is contained in:
Your Name
2026-06-28 08:54:08 +08:00
parent d04cf629f4
commit a1f5935481
19 changed files with 1964 additions and 128 deletions

View File

@@ -1237,6 +1237,8 @@ export function AgentMarketTab() {
.length
const watchHealth = snapshot.market_watch_health
const watchHealthHealthy = watchHealth.status === 'healthy'
const watchHealthReasons = watchHealth.controlled_queue_reasons ?? watchHealth.operator_blockers ?? []
const controlledReviewGate = snapshot.evaluation_cadence.controlled_review_gate ?? snapshot.evaluation_cadence.operator_review_gate
return (
<div style={{ padding: 20, display: 'flex', flexDirection: 'column', gap: 16 }}>
@@ -1867,15 +1869,15 @@ export function AgentMarketTab() {
{formatDateTime(watchHealth.stale_after)}
</DetailRow>
<DetailRow label={t('health.priorityGate')}>
{watchHealth.source_failures_block_priority_upgrade ? t('health.blocked') : t('health.clear')}
{watchHealth.source_failures_require_controlled_reverify ? t('health.controlledReverify') : t('health.clear')}
</DetailRow>
<DetailRow label={t('health.blockedIntegrations')}>
{watchHealth.blocked_from_integration}
</DetailRow>
<DetailRow label={t('health.blockers')}>
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, minWidth: 0 }}>
{watchHealth.operator_blockers.length > 0 ? (
watchHealth.operator_blockers.map(blocker => (
{watchHealthReasons.length > 0 ? (
watchHealthReasons.map(blocker => (
<CandidatePill key={blocker} value={blocker} muted />
))
) : (
@@ -1913,7 +1915,7 @@ export function AgentMarketTab() {
<CandidatePill value={snapshot.evaluation_cadence.primary_source_policy} />
</DetailRow>
<DetailRow label={t('cadence.reviewGate')}>
<CandidatePill value={snapshot.evaluation_cadence.operator_review_gate} muted />
<CandidatePill value={controlledReviewGate} muted />
</DetailRow>
<DetailRow label={t('cadence.triggerModes')}>
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, minWidth: 0 }}>

View File

@@ -1538,18 +1538,21 @@ export interface AgentMarketGovernanceSnapshot {
schedule: string
timezone: 'Asia/Taipei'
next_scheduled_run_at: string
trigger_modes: string[]
primary_source_policy: string
operator_review_gate: string
}
market_watch_health: {
status: 'healthy' | 'blocked'
freshness_sla_hours: 168
stale_grace_hours: 6
stale_after: string
source_failures_block_priority_upgrade: boolean
blocked_from_integration: number
operator_blockers: string[]
trigger_modes: string[]
primary_source_policy: string
controlled_review_gate: string
operator_review_gate?: string
}
market_watch_health: {
status: 'healthy' | 'controlled_queue' | 'blocked'
freshness_sla_hours: 168
stale_grace_hours: 6
stale_after: string
source_failures_require_controlled_reverify: boolean
source_failures_block_priority_upgrade?: boolean
blocked_from_integration: number
controlled_queue_reasons: string[]
operator_blockers?: string[]
}
summary: {
candidate_count: number
@@ -1613,10 +1616,12 @@ export interface AgentMarketGovernanceSnapshot {
display_name: string
priority: number
queue_status:
| 'baseline_protected'
| 'blocked_needs_evidence'
| 'operator_review_required'
| 'operator_priority_review'
| 'baseline_protected'
| 'blocked_needs_evidence'
| 'controlled_review_required'
| 'controlled_priority_review'
| 'operator_review_required'
| 'operator_priority_review'
| 'watch_only_blocked'
| 'watch_only_monitoring'
| 'registered_no_review'