From 1050897aea879d725b5f55c4b2f4e947c65270fc Mon Sep 17 00:00:00 2001 From: Neo Date: Thu, 11 Jun 2026 18:19:03 +0900 Subject: [PATCH 1/2] fix(dashboard): keep polling 'paused' runs so the 2nd approval gate surfaces A workflow run pauses at each human-approval gate. The run-detail poller only rescheduled for 'running'/'pending', so it stopped the moment the run paused at gate 1. After approving gate 1 the run advances and pauses again at gate 2, but with polling already halted the second gate never appeared until a manual browser refresh. Include 'paused' in the keep-polling condition (it's an in-flight state). Unrecognized statuses are still treated as terminal so we don't loop forever. Co-Authored-By: Claude Opus 4.8 --- web/src/revka/pages/WorkflowRuns.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) 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; From 91df8ae833a4ce5edacc728b2469d93fceb6d16c Mon Sep 17 00:00:00 2001 From: Neo Date: Thu, 11 Jun 2026 18:20:49 +0900 Subject: [PATCH 2/2] ci(deploy): trigger Cloud Run deploy on web/** changes The orchestrator image embeds the web dashboard (web/dist), but the deploy workflow didn't watch web/**, so dashboard-only fixes never auto-deployed. Add web/** to the push paths. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/deploy-cloud-run.yml | 1 + 1 file changed, 1 insertion(+) 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: