Skip to content

fix(ui): show coalesced update restarts#93082

Merged
steipete merged 1 commit into
openclaw:mainfrom
goutamadwant:fix/78481-update-coalesced-banner
Jul 6, 2026
Merged

fix(ui): show coalesced update restarts#93082
steipete merged 1 commit into
openclaw:mainfrom
goutamadwant:fix/78481-update-coalesced-banner

Conversation

@goutamadwant

Copy link
Copy Markdown
Contributor

Summary

This PR fixes a Control UI update feedback gap where update.run can return ok: true with restart.coalesced, but the UI treated that as a normal silent success.

This matters now because the gateway already exposes the in-progress restart signal, and hiding it makes the Update button appear idle even though an update restart is already pending.

The intended outcome is that users see an info banner telling them the update is waiting on an already in-progress gateway restart, while the existing reconnect verification still tracks the expected post-update version.

Out of scope: changing gateway restart scheduling, update handoff behavior, package update logic, or recovery policy.

Success looks like the Control UI preserving reconnect verification and surfacing the coalesced restart state instead of leaving the user with no visible feedback.

Reviewers should focus on the runUpdate success path and whether the banner state interacts correctly with existing post-update reconnect verification.

Linked context

Closes #78481

Related: none beyond the linked issue.

Was this requested by a maintainer or owner?

No direct maintainer request. The issue is labeled queueable/source-repro/fix-shape-clear and has ClawSweeper guidance pointing to this UI/controller path.

Real behavior proof (required for external PRs)

  • Behavior or issue addressed: update.run responses with ok: true and restart.coalesced no longer get treated as a silent success in the Control UI.
  • Real environment tested: local OpenClaw source checkout on macOS with Node 22.22.3.
  • Exact steps or command run after this patch: node scripts/run-vitest.mjs ui/src/ui/controllers/config.test.ts ui/src/ui/app-gateway.node.test.ts
  • Evidence after fix: focused Vitest run passed 2 test files and 110 tests.
  • Observed result after fix: the controller keeps pendingUpdateExpectedVersion, keeps managed-service handoff false, and sets an info banner when restart: { coalesced: true } is returned.
  • What was not tested: I did not run a live browser update click against a real gateway with a stuck in-flight restart.
  • Proof limitations or environment constraints: proof is source-level/controller-level through the real Control UI controller path, not a live gateway/browser reproduction.
  • Before evidence: current main returned early on the ok update path before surfacing restart.coalesced, leaving the UI with no visible feedback for an already in-progress restart.

Tests and validation

Which commands did you run?

  • node scripts/run-vitest.mjs ui/src/ui/controllers/config.test.ts ui/src/ui/app-gateway.node.test.ts
  • pnpm exec oxfmt --check --threads=1 ui/src/ui/controllers/config.ts ui/src/ui/controllers/config.test.ts
  • git diff --check

What regression coverage was added or updated?

Added a focused runUpdate regression test covering restart: { coalesced: true }.

What failed before this fix, if known?

The new regression would fail before this change because runUpdate returned from the successful update path without setting updateStatusBanner.

If no test was added, why not?

A regression test was added.

Risk checklist

Did user-visible behavior change? (Yes/No)

Yes.

Did config, environment, or migration behavior change? (Yes/No)

No.

Did security, auth, secrets, network, or tool execution behavior change? (Yes/No)

No.

What is the highest-risk area?

The update success path in the Control UI.

How is that risk mitigated?

The change only reads existing gateway metadata and leaves restart scheduling unchanged. The regression test verifies that reconnect verification state is preserved while the banner is shown.

Current review state

What is the next action?

Maintainer review.

What is still waiting on author, maintainer, CI, or external proof?

Waiting on maintainer review and CI. Live browser proof was not run.

Which bot or reviewer comments were addressed?

No PR bot/reviewer comments yet. This implements the ClawSweeper issue guidance on #78481.

@openclaw-barnacle openclaw-barnacle Bot added app: web-ui App: web-ui size: XS triage: mock-only-proof Candidate: PR proof only shows tests, mocks, snapshots, lint, typecheck, or CI. labels Jun 14, 2026
@clawsweeper

clawsweeper Bot commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed July 6, 2026, 12:18 AM ET / 04:18 UTC.

Summary
The branch adds Control UI overlay handling for successful update.run responses with restart.coalesced, plus a focused overlay test and Chromium E2E coverage.

PR surface: Source +10, Tests +103. Total +113 across 3 files.

Reproducibility: yes. Source inspection shows current main's gateway returns restart metadata from update.run while the Control UI success path returns without rendering restart.coalesced; the PR adds focused overlay and browser coverage for that path.

Review metrics: none identified.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #78481
Summary: This PR is the current fix candidate for the canonical Control UI coalesced-update feedback issue; nearby restart and update-recovery reports overlap but do not replace this narrow UI patch.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🦞 diamond lobster
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🦞 diamond lobster
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Next step before merge

  • No ClawSweeper repair job is needed because the branch already contains the targeted fix, focused proof, and no blocking review finding remains; the remaining action is ordinary maintainer/CI merge gating.

Security
Cleared: The diff only changes Control UI overlay rendering and tests for an existing gateway response field; it does not add dependencies, permissions, credentials, scripts, or execution paths.

Review details

Best possible solution:

Land the focused overlay change after normal maintainer and CI gates; keep backend restart scheduling and broader update recovery behavior out of this PR.

Do we have a high-confidence way to reproduce the issue?

Yes. Source inspection shows current main's gateway returns restart metadata from update.run while the Control UI success path returns without rendering restart.coalesced; the PR adds focused overlay and browser coverage for that path.

Is this the best way to solve the issue?

Yes. Consuming the existing gateway metadata in the Control UI overlay layer is the narrowest maintainable fix for the visible feedback gap; backend restart scheduling and stale-token repair remain adjacent work.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 37f96bde4d90.

Label changes

Label changes:

  • add proof: 🎥 video: Contributor real behavior proof includes video or recording evidence. Maintainer refresh supplied Blacksmith Testbox Chromium click-through proof with screenshot/video artifacts, and the current head's touched files are unchanged from that reviewed proof head.
  • add rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • remove rating: 🐚 platinum hermit: Current PR rating is rating: 🦞 diamond lobster, so this older rating label is no longer current.

Label justifications:

  • P2: The PR fixes a real Control UI updater feedback bug with limited blast radius and existing CLI/manual recovery paths.
  • rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (recording): Maintainer refresh supplied Blacksmith Testbox Chromium click-through proof with screenshot/video artifacts, and the current head's touched files are unchanged from that reviewed proof head.
  • proof: sufficient: Contributor real behavior proof is sufficient. Maintainer refresh supplied Blacksmith Testbox Chromium click-through proof with screenshot/video artifacts, and the current head's touched files are unchanged from that reviewed proof head.
  • proof: 🎥 video: Contributor real behavior proof includes video or recording evidence. Maintainer refresh supplied Blacksmith Testbox Chromium click-through proof with screenshot/video artifacts, and the current head's touched files are unchanged from that reviewed proof head.
Evidence reviewed

PR surface:

Source +10, Tests +103. Total +113 across 3 files.

View PR surface stats
Area Files Added Removed Net
Source 1 10 0 +10
Tests 2 103 0 +103
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 3 113 0 +113

What I checked:

  • Current main UI gap: On current main, runUpdate records the expected post-update version for ok update responses and immediately returns without reading restart.coalesced or setting updateStatusBanner, which matches the linked issue's silent-success report. (ui/src/app/overlays.ts:521, 37f96bde4d90)
  • Gateway response contract: The gateway update.run handler schedules a restart and includes the restart object in the successful response payload, so the UI can surface restart.coalesced without changing backend restart policy. (src/gateway/server-methods/update.ts:365, 37f96bde4d90)
  • Patch behavior: The PR extends the typed response shape with restart.coalesced and sets an info update banner while preserving pendingUpdateExpectedVersion and the existing reconnect verification path. (ui/src/app/overlays.ts:522, d58ecf3e5918)
  • Regression coverage: The branch adds both a unit-level overlay regression and a Chromium click-through E2E test that emits update.available, clicks Update now, verifies the visible coalesced-restart banner, and checks one update.run request. (ui/src/e2e/update-coalesced.e2e.test.ts:34, d58ecf3e5918)
  • Current head and merge result: The merge-result diff from current main is the same three-file UI/test patch, and the touched PR files are unchanged from the previously reviewed head despite the later rebase. (d58ecf3e5918)
  • Related issue is still canonical: The linked issue remains open and describes exactly the Control UI no-feedback behavior when logs show update.run restart coalesced; its prior ClawSweeper review points to this PR as the open fix candidate.

Likely related people:

  • steipete: Blame on current main for the extracted createApplicationOverlays update path points to the Control UI architecture move, and older history shows the original gateway config/update restart flow that produces the response consumed here. (role: recent area contributor; confidence: high; commits: 286c020748ea, 71c31266a1db; files: ui/src/app/overlays.ts, ui/src/app/overlays.test.ts, src/gateway/server-methods/update.ts)
  • orlyjamie: History shows the update warning banner and Update button wiring came from the merged Control UI update banner work that this PR now reuses for the coalesced restart state. (role: Control UI update surface introducer; confidence: medium; commits: 2ddc13cdb7cc; files: ui/src/components/update-banner.ts, ui/src/ui/app-render.ts, ui/src/ui/app-gateway.ts)
  • joshavant: History for the predecessor Control UI config/update controller includes the config/tab/skills consolidation that carried the update path before the current overlay split. (role: adjacent UI refactor contributor; confidence: medium; commits: 786823fd7054; files: ui/src/ui/controllers/config.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.
Review history (3 earlier review cycles)
  • reviewed 2026-06-21T20:24:12.969Z sha ee827f3 :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-06T02:30:46.851Z sha 4f06077 :: needs maintainer review before merge. :: none
  • reviewed 2026-07-06T03:26:52.983Z sha 6e46d54 :: needs maintainer review before merge. :: none

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. labels Jun 14, 2026
@steipete steipete self-assigned this Jul 6, 2026
@steipete
steipete force-pushed the fix/78481-update-coalesced-banner branch from ee827f3 to 4f06077 Compare July 6, 2026 02:11
@steipete

steipete commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Maintainer refresh complete at 4f06077bc00.

What changed:

  • rebuilt the fix on current main after the Control UI architecture move;
  • kept reconnect/version verification intact while surfacing the existing restart.coalesced signal;
  • added focused overlay coverage and a real Chromium click-through test that verifies the visible banner, one update.run request, and the released Update button;
  • preserved contributor credit in the replacement commit.

Verification:

  • pnpm test ui/src/app/overlays.test.ts
  • pnpm check:changed
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.ui-e2e.config.ts --configLoader runner ui/src/e2e/update-coalesced.e2e.test.ts
  • fresh branch autoreview: no accepted/actionable findings

Remote proof: Blacksmith Testbox through Crabbox, tbx_01kwtjqytfrs7cc0r2y2j0bskd (amber-hermit). The Chromium run passed and captured both screenshot and video artifacts; no browser page errors occurred.

Thanks @goutamadwant for the original diagnosis and fix direction.

Exact-head land-ready update: d58ecf3 is the clean current-main-plus-reviewed-patch head. Hosted CI run https://github.com/openclaw/openclaw/actions/runs/28767168091 passed at that exact SHA. The rebase changed ancestry only; the tested diff and Testbox/browser/PTY proof above are unchanged. Known proof gaps: none.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jul 6, 2026
@steipete
steipete requested a review from a team as a code owner July 6, 2026 03:03
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation channel: discord Channel integration: discord channel: imessage Channel integration: imessage channel: line Channel integration: line channel: signal Channel integration: signal channel: slack Channel integration: slack channel: telegram Channel integration: telegram channel: tlon Channel integration: tlon channel: whatsapp-web Channel integration: whatsapp-web app: android App: android labels Jul 6, 2026
@openclaw-barnacle openclaw-barnacle Bot added size: S and removed channel: telegram Channel integration: telegram channel: tlon Channel integration: tlon channel: whatsapp-web Channel integration: whatsapp-web app: android App: android app: ios App: ios app: macos App: macos gateway Gateway runtime cli CLI command changes scripts Repository scripts agents Agent runtime and tooling extensions: qa-lab extensions: codex extensions: ollama extensions: copilot channel: sms Channel integration: sms size: XL labels Jul 6, 2026
@steipete
steipete force-pushed the fix/78481-update-coalesced-banner branch from 6e46d54 to 1232b7b Compare July 6, 2026 03:46
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation gateway Gateway runtime scripts Repository scripts agents Agent runtime and tooling extensions: anthropic extensions: openai labels Jul 6, 2026
@steipete

steipete commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Merged via squash.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: web-ui App: web-ui P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 🎥 video Contributor real behavior proof includes video or recording evidence. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. size: S status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. triage: mock-only-proof Candidate: PR proof only shows tests, mocks, snapshots, lint, typecheck, or CI.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update button silently no-ops when update.run is coalesced

2 participants