From 0703e687669ed8bb34ef22ab59600d89b47dff7a Mon Sep 17 00:00:00 2001 From: rcourtman Date: Wed, 25 Mar 2026 12:30:26 +0000 Subject: [PATCH] Align Patrol header recency labels Patrol header metadata now uses the canonical recency label so the top row no longer falls back to a generic last-run prefix when the page distinguishes activity from full verification. --- .../v6/internal/subsystems/patrol-intelligence.md | 3 +++ .../features/patrol/PatrolIntelligenceHeader.tsx | 13 ++++++++++--- .../src/pages/__tests__/AIIntelligence.test.tsx | 3 ++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/release-control/v6/internal/subsystems/patrol-intelligence.md b/docs/release-control/v6/internal/subsystems/patrol-intelligence.md index 332ee06da..84c30b919 100644 --- a/docs/release-control/v6/internal/subsystems/patrol-intelligence.md +++ b/docs/release-control/v6/internal/subsystems/patrol-intelligence.md @@ -146,6 +146,9 @@ The summary recency chip must follow the same governed scope distinction. When the latest completed activity was only a scoped run, the summary should label that timestamp as `Last activity` instead of `Last patrol`; `Last full patrol` belongs only to the most recent completed full Patrol run. +That same recency contract also applies to the header metadata row. The top +header must not revert to a generic `Last:` timestamp when the rest of Patrol +is explicitly distinguishing activity from full verification recency. That summary surface must also avoid reintroducing a second compact assessment or verification layer beneath the primary card. Supporting metric strips belong to counts and outcomes such as active findings, critical findings, diff --git a/frontend-modern/src/features/patrol/PatrolIntelligenceHeader.tsx b/frontend-modern/src/features/patrol/PatrolIntelligenceHeader.tsx index 9dab68374..579539cbc 100644 --- a/frontend-modern/src/features/patrol/PatrolIntelligenceHeader.tsx +++ b/frontend-modern/src/features/patrol/PatrolIntelligenceHeader.tsx @@ -13,6 +13,7 @@ import { groupModelsByProvider } from '@/utils/patrolFormat'; import { getAIQuickstartCreditsPresentation } from '@/utils/aiQuickstartPresentation'; import { buildPatrolScheduleOptions } from '@/utils/aiPatrolSchedulePresentation'; import { getPatrolRuntimePresentation } from '@/utils/patrolRuntimePresentation'; +import { getPatrolRecencyPresentation } from '@/utils/patrolSummaryPresentation'; import type { PatrolIntelligenceState } from './usePatrolIntelligenceState'; export function PatrolIntelligenceHeader(props: { state: PatrolIntelligenceState }) { @@ -27,6 +28,12 @@ export function PatrolIntelligenceHeader(props: { state: PatrolIntelligenceState const runtimePresentation = createMemo(() => getPatrolRuntimePresentation(state.runtimeState(), state.blockedReason()), ); + const recency = createMemo(() => + getPatrolRecencyPresentation({ + runs: state.patrolRunHistory() ?? [], + lastPatrolAt: state.patrolStatus()?.last_patrol_at, + }), + ); const showQuickstartStatus = createMemo(() => { const patrolStatus = state.patrolStatus(); if (!patrolStatus) return false; @@ -61,11 +68,11 @@ export function PatrolIntelligenceHeader(props: { state: PatrolIntelligenceState class="mb-3" actions={
- +