diff --git a/dashboards/tracker-web/src/app/dashboard/fleet/jobs/[id]/page.tsx b/dashboards/tracker-web/src/app/dashboard/fleet/jobs/[id]/page.tsx index 5ca3a04c..5e4a0e16 100644 --- a/dashboards/tracker-web/src/app/dashboard/fleet/jobs/[id]/page.tsx +++ b/dashboards/tracker-web/src/app/dashboard/fleet/jobs/[id]/page.tsx @@ -45,6 +45,7 @@ export default function FleetJobDetailPage() { const [shipping, setShipping] = useState(false); const [acting, setActing] = useState(null); const [reviewing, setReviewing] = useState(false); + const [eventFilter, setEventFilter] = useState(''); const [streamMode, setStreamMode] = useState<'connecting' | 'live' | 'polling'>('connecting'); const refresh = useCallback(async () => { @@ -263,34 +264,52 @@ export default function FleetJobDetailPage() { {/* Pull request (surfaced from whichever run opened it) */} {(() => { const prRun = runs.find(r => r.prUrl); - if (!prRun?.prUrl) return null; - return ( -
- Pull Request - - {prRun.prUrl} ↗ - - {prRun.prState && ( - Pull Request + - {prRun.prState} + {prRun.prUrl} ↗ + + {prRun.prState && ( + + {prRun.prState} + + )} +
+ ); + } + // Parked in review with no PR — explain why + what to do. + if (job.repo && (job.stage === 'review' || job.stage === 'testing')) { + return ( +
+ No pull request yet.{' '} + + This run didn’t open a PR — it ran without a verify step, or the + factory wasn’t in PR mode. Set a verify command and requeue to produce one, or + Ship to promote as-is. - )} -
- ); + + ); + } + return null; })()} {/* Review gate (multi-reviewer human gate) */} @@ -337,9 +356,41 @@ export default function FleetJobDetailPage() { Polling )} + {events.length > 0 && ( + + )} {events.length === 0 ? (

No events recorded.

+ ) : eventFilter ? ( + ) : (