diff --git a/.github/workflows/deploy-cloud-run.yml b/.github/workflows/deploy-cloud-run.yml index a5c0a4e..49bfa58 100644 --- a/.github/workflows/deploy-cloud-run.yml +++ b/.github/workflows/deploy-cloud-run.yml @@ -18,6 +18,7 @@ on: - dev/config.cloudrun.toml - src/** - operator-mcp/** + - web/** - .github/workflows/deploy-cloud-run.yml concurrency: diff --git a/web/src/revka/pages/WorkflowRuns.tsx b/web/src/revka/pages/WorkflowRuns.tsx index b51a5e9..378b9dc 100644 --- a/web/src/revka/pages/WorkflowRuns.tsx +++ b/web/src/revka/pages/WorkflowRuns.tsx @@ -295,9 +295,17 @@ export default function WorkflowRuns() { if (!cancelled) setPinnedDefinition(null); }); } - // Keep polling while the run is still in flight. Treat any - // unrecognized status as terminal so we don't loop forever. - if (run.status === 'running' || run.status === 'pending') { + // Keep polling while the run is still in flight. 'paused' is + // in-flight too: a run pauses at a human-approval gate and, once + // approved, advances to the next step — which may be another gate. + // Without polling 'paused', the second approval never surfaces until + // a manual browser refresh. Treat any unrecognized status as terminal + // so we don't loop forever. + if ( + run.status === 'running' || + run.status === 'pending' || + run.status === 'paused' + ) { scheduleNext(POLL_INTERVAL_MS); } else if (!TERMINAL_STATUSES.has(run.status)) { return;