Skip to content

fix(update): make owner refusals and restart recovery actionable - #136995

Merged
steipete merged 8 commits into
mainfrom
steipete/updater-followups-7c92ab
Sep 3, 2026
Merged

fix(update): make owner refusals and restart recovery actionable#136995
steipete merged 8 commits into
mainfrom
steipete/updater-followups-7c92ab

Conversation

@steipete

@steipete steipete commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

Fixes an issue where authorized chat users receive no actionable response to owner-only commands on an ownerless install, a healthy local Gateway can fail updater readiness checks, and Doctor overlooks a LaunchAgent left disabled by an interrupted update helper.

Follow-up to merged #136588. This branch includes the owner-refusal, local restart-verification, disabled-service diagnosis, and human-readable update-notice repairs.

Why This Change Was Made

Owner refusals now share one sender-specific recovery hint across command replies, tool results, and Gateway requester revalidation. Restart verification reuses the existing local control client and its established CLI/shared-secret and loopback backend/auth-none contracts. Doctor reports persistent LaunchAgent disablement through its existing Gateway health contribution without taking activation authority from the operator.

User Impact

Authorized non-owners get an operator-run command that preserves existing configured owners, removes duplicates and wildcard entries, and adds the requesting sender; tools without config ask the operator to add the sender instead of replacing the owner list; unauthorized senders retain their existing behavior. CLI pairing and Control UI ownership guidance now matches the implemented setup paths. Local restart checks retain plugin/channel failures and served version/build information without creating a device identity or changing Gateway authentication rules. Doctor names the selected profile or custom LaunchAgent label and gives its exact start command, with update/triage advice when installation safety is uncertain.

Skipped update outcomes now read ℹ️ OpenClaw update skipped: <recorded reason>.; a missing reason reads unknown reason. Error outcomes retain their failure line and running-version detail. No configuration, environment-variable, SQLite, or protocol surface changes. The general remote diagnostic probe is unchanged.

Evidence

W15c resolves both P1 findings from the 08:17 UTC revision of the ClawSweeper review:

  • Owner recovery uses the current runtime config, including after awaited acknowledgement. Existing owners are preserved and de-duplicated, wildcards are excluded, ownerless config retains a one-entry command, and config-unavailable tools use add wording. For existing slack:owner and new telegram:123, the command is openclaw config set commands.ownerAllowFrom '["slack:owner","telegram:123"]'.
  • Skipped results are distinct from errors in the shared notice formatter and durable delivery. already-current remains the recorded reason: no canonical reason constant exists for translating it to a latest-version phrase.
  • Test alignment repairs main's red gateway-tool/commands-update assertions after fix: let agents organize sessions without shell fallbacks #136952 added the in-process system actor; method, requester, session/delivery routing, timeout, scopes, and resolver assertions remain explicit.
  • Before the fixes, the dispatch reproduction failed in all four selected cases; the new owner regressions failed in three cases and the skipped-notice regressions failed in two cases. The requested seven-file run then passed all 203 tests across five Vitest shards.
  • Command: node scripts/run-vitest.mjs src/agents/tools/gateway-tool.test.ts src/auto-reply/reply/commands-update.test.ts src/commands/doctor-command-owner.test.ts src/auto-reply/reply/commands-session-restart.test.ts src/gateway/server-methods/update-owner.test.ts src/infra/restart-sentinel.test.ts src/gateway/server-restart-sentinel.test.ts.
  • pnpm check:changed: exit 0 on final W15c tree 81d6ed0c0bdacb4c293f342bc8aa792df100fb92, including typechecks, lint, formatting, and selected runtime guards.
  • Fresh Codex branch autoreview against origin/main: exit 0, scoped-clean at the requested helper's default P0 threshold. No accepted/actionable findings.
  • Rank-up compatibility request: no schema, stored representation, migration, or authorization rule changes. Existing multi-owner configuration and current-config revocation after acknowledgement are covered; no migration is needed. Existing typed sentinel round-trip cases passed. This work order uses focused owner/delivery proof; it does not add live Telegram Test Server proof or repeat a package-staging update roundtrip.

Latest-review disposition (08:45 UTC, reviewed head 80c3b52): the full-array command exposes configured owner IDs to an authorized non-owner. This is the explicitly requested maintainer design for preserving existing owners; it is retained intentionally. The new redaction/non-disclosure suggestion is not applied because it would replace the specified full-array guidance with a different recovery contract. Owner authority still requires the existing sender check and an operator-run config change. Treat this as an acknowledged visibility tradeoff, not a claim that the reply conceals owner membership. Requester controls are documented as defense in depth within a trusted Gateway domain, not hostile multi-user isolation. The optional Telegram Test Server rank-up remains unperformed under this work order's focused proof scope; the compatibility request is addressed above.

CI follow-up: run 33734359177 exposed 66 updater-owned failures in checks-node-compact-small-20. The production readiness path already used callGateway, but two CLI fixtures still mocked the retired probeGateway call. The repair moves the existing pure hello/health fixture into shared test support and aligns the transport mocks and health-request assertions. Real service ownership, version/build rejection, sentinel consumption, and plugin-error guards remain exercised. A local rerun also found an unmocked port-availability check in the absent-service fixture; that I/O is now fixture-owned. No production changes were needed. The repaired six-file CLI/restart suite passed all 531 tests in 34.94 seconds.

Landing stopped on the next exact-head CI run: checks-node-compact-small-5, job 100600155339 failed src/commands/agent-exec.test.ts / “bounds blocked service-relay construction through the shipped CLI command”. The one-second command deadline elapsed before the fake CLI wrote its PID. This test is absent from the PR head and was added to main by 693c16dbccc / #136507; it remains unchanged on fetched main 5a9168fea34a6b62b5a97673fb5416e7504ced09. It is outside the updater stack, so the requested unrelated-main-failure stop rule applies. The four W15c commits are pushed; native prepare/merge has not run.

Earlier stack proof (retained for context):

  • Focused coverage: 29 test files across owner-command siblings, update tool/RPC refusals, restart waits, generic Gateway call/probe behavior, Doctor flows, and docs. The final per-file runs passed. The dedicated restored regression run passed all 64 tests; the restart suite passed all 87 tests after cleanup.
  • Regression proof used a temporary WIP commit and git revert --no-commit, retaining the new tests while reverting production fixes. All five lanes failed for the intended old behavior: 19 failing assertions, with 45 controls passing. Restoring the fixes made the same behavior cases pass.
  • pnpm check:changed: exit 0, including the inherited parent stack's macOS validation. pnpm prompt:snapshots:check: current, 7 files. pnpm build: exit 0. All OpenClaw commands used temporary state/config paths.
  • Requested Codex branch review against the parent branch: exit 0, autoreview scoped-clean: no accepted/actionable findings in the selected Git scope and priority (P0 threshold).
  • Live macOS proof: a built CLI served an isolated token-auth LaunchAgent on a temporary port. After a real launchd restart, the verifier confirmed a changed PID, the same served version/build, and sustained health; the restart log had zero missing scope: operator.read lines. The temporary LaunchAgent was removed. The socket tests cover token, password, and auth-none, preserve plugin/channel errors, reject remote credential leakage, and verify that no device files are created.

Full PR LOC against main: production +188 / -88 (net +100), tests/support +1036 / -424 (net +612), docs +24 / -1 (net +23). W15c including the CI fixture repair adds only +7 net production lines and +36 net test/support lines: current-config owner preservation and explicit skipped status require the small additional decision surface. The restart-client change is net -4 production lines. The two positive production deltas add the shared executable ownership hint and the selected-service diagnosis; no duplicate probe path or handshake exception was added.

The live proof exercises a real managed restart and readiness verification; it does not repeat the full package-staging update roundtrip or send live channel messages. No configuration, baseline, changelog, workflow, protocol, or SQLite changes are included. The changed-check temp-directory warning names an earlier Doctor test with explicit afterEach removal; it is advisory, not an unclean test or gate failure. Landing is authorized after exact-head CI and native prepare/merge gates pass.

@clawsweeper

clawsweeper Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

@steipete
steipete marked this pull request as ready for review September 3, 2026 04:38
@steipete
steipete requested a review from a team as a code owner September 3, 2026 04:38
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation app: web-ui App: web-ui gateway Gateway runtime cli CLI command changes security Security documentation commands Command implementations agents Agent runtime and tooling size: XL maintainer Maintainer-authored PR labels Sep 3, 2026
@clawsweeper clawsweeper Bot added P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. proof: telegram-e2e This PR needs Telegram Test Server proof with the repository E2E skill. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Sep 3, 2026
@clawsweeper

clawsweeper Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Codex review: blocked before merge. Reviewed September 3, 2026, 8:30 AM ET / 12:30 UTC.

ClawSweeper review

What this changes

This PR adds update/restart diagnostics, owner-aware recovery guidance, health checks, and related tests for Gateway update and restart flows.

Merge readiness

Blocked before merge - 7 items remain

Keep open: the branch improves update and restart diagnostics, but its introduced recovery guidance still makes terminal commands the only resolution for disabled LaunchAgent and update-failure states, contrary to the stated in-product recovery direction.

Priority: P1
Reviewed head: cd4c3c08147b64be17146f84605eff43a90d9137
Owner decision: Required. See Decision needed.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) The diagnostics and owner-bound authorization work are substantive, but the required in-product recovery flow remains incomplete.
Proof confidence 🐚 platinum hermit (4/6) Not applicable: This member-authored branch supplies local owner and socket-test evidence; the merge blocker is the missing recovery capability, not an unproven claimed implementation path.
Patch quality 🦐 gold shrimp (3/6) 1 actionable review finding remain.

Verification

Check Result Evidence
Real behavior Not applicable Not applicable: This member-authored branch supplies local owner and socket-test evidence; the merge blocker is the missing recovery capability, not an unproven claimed implementation path.
Evidence reviewed 7 items Introduced terminal-only recovery guidance: The introduced macOS diagnosis tells an operator to run gateway start, update, doctor, and triage commands; it does not provide an in-product recovery action.
Existing UI triage is navigation only: The Control UI failure alert exposes only an action to navigate to Updates; no typed retry, restore, or report/recovery operation is available.
Owner setup guidance is intentionally operator-facing: The command-owner helper preserves configured owners and emits an operator command, while the reply gate supplies it to authorized non-owners; this makes the missing product recovery surface material rather than a reason to weaken authorization.
Findings 1 actionable finding [P1] Keep recovery inside the product
Security None None.

How this fits together

Gateway update and restart owners report failures through notices, Doctor diagnostics, and the Control UI. These outputs guide an operator from a failed update or disabled service toward recovery actions.

flowchart LR
  A[Update or restart failure] --> B[Gateway update and restart owners]
  B --> C[Failure notices and diagnostics]
  C --> D[Doctor recovery guidance]
  C --> E[Control UI triage]
  D --> F[Operator recovery]
  E --> F
Loading

Decision needed

Question Recommendation
Should this PR require typed in-product recovery controls for update, restart, and disabled LaunchAgent failures before merge, rather than accepting terminal-only resolution? Require in-product recovery: Add capability-checked retry, restore, or issue-report actions with truthful Gateway results before merging.

Why: The required recovery action changes product and authorization UX: controls must expose only safe, currently authorized operations and report their real outcome.

Before merge

  • Keep recovery inside the product (P1) - These introduced messages make terminal commands the required recovery path for an installed-but-disabled Gateway. The existing Control UI triage action only opens Updates, so it cannot retry, restore, or report a recovery outcome. Add capability-checked, idempotent in-product controls backed by truthful Gateway results; retain CLI guidance only as supplemental developer-facing information.
  • Resolve merge risk (P1) - Merging leaves disabled LaunchAgent and update-failure recovery dependent on terminal commands despite the available Control UI triage surface and the member-stated in-product recovery requirement.
  • Resolve merge risk (P1) - The branch changes Telegram-visible recovery replies without Test Server event proof.
  • Resolve merge risk (P1) - The branch has a classified production net increase of 112 lines; the recovery work required to meet the product direction must stay owner-bound rather than add a parallel guidance path.
  • Complete next step (P2) - Add capability-checked, idempotent in-product recovery actions backed by truthful Gateway outcomes, then provide matching boundary and UI proof.
  • Resolve maintainer decision - Resolve the maintainer decision shown above before merge.
  • Add data-model compatibility proof - Confirm migration or upgrade compatibility proof before merge.

Findings

  • [P1] Keep recovery inside the product — src/commands/doctor-platform-notes.ts:76-77
Agent review details

Security

None.

PR surface

Source +100, Tests +610, Docs +23. Total +733 across 43 files.

View PR surface stats
Area Files Added Removed Net
Source 13 188 88 +100
Tests 26 1034 424 +610
Docs 4 24 1 +23
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 43 1246 513 +733

Review metrics

Metric Value Why it matters
Production versus test LOC production +212/-100 (net +112); tests/support +1010/-412 (net +598); docs +24/-1 The diagnostics and authorization work add production code, while the unresolved recovery surface determines whether that growth reaches a complete operator flow.

Stored data model

Persistent data-model change detected: migration/backfill/repair: src/agents/tools/gateway-tool.ts, migration/backfill/repair: src/auto-reply/reply/command-gates.ts, migration/backfill/repair: src/commands/doctor-command-owner.ts, migration/backfill/repair: src/commands/doctor-platform-notes.ts, migration/backfill/repair: src/flows/doctor-health-contribution-runners.gateway.ts, migration/backfill/repair: src/gateway/server-methods/update.ts, and 3 more. Confirm migration or upgrade compatibility proof before merge.

Merge-risk options

Maintainer options:

  1. Add typed recovery controls (recommended)
    Implement and prove the capability-checked in-product actions so terminal instructions are not the only resolution.
  2. Accept CLI-only recovery explicitly
    Merge only if maintainers intentionally accept the existing support and usability tradeoff for failed recovery paths.

Technical review

Best possible solution:

Hold the PR until failures expose capability-checked, idempotent Control UI recovery actions backed by truthful Gateway outcomes, with CLI guidance retained only as developer-facing fallback information.

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

No high-confidence runtime reproduction was executed; source inspection directly shows the introduced terminal-only guidance and the existing UI's navigation-only action.

Is this the best way to solve the issue?

No: diagnostics alone do not meet the stated recovery contract because the product lacks typed, authorized in-app actions for the reported failure states.

Full review comments:

  • [P1] Keep recovery inside the product — src/commands/doctor-platform-notes.ts:76-77
    These introduced messages make terminal commands the required recovery path for an installed-but-disabled Gateway. The existing Control UI triage action only opens Updates, so it cannot retry, restore, or report a recovery outcome. Add capability-checked, idempotent in-product controls backed by truthful Gateway results; retain CLI guidance only as supplemental developer-facing information.
    Confidence: 0.94

Overall correctness: patch is incorrect
Overall confidence: 0.91

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 6b1d8119e189.

Labels

Label changes:

  • add merge-risk: 🚨 compatibility: Existing macOS Gateway installations may receive new recovery guidance that requires terminal intervention instead of a supported product control.
  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🐚 platinum hermit and patch quality is 🦐 gold shrimp.
  • add status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Not applicable: This member-authored branch supplies local owner and socket-test evidence; the merge blocker is the missing recovery capability, not an unproven claimed implementation path.
  • remove rating: 🐚 platinum hermit: Current PR rating is rating: 🦐 gold shrimp, so this older rating label is no longer current.
  • remove merge-risk: 🚨 security-boundary: Current PR review merge-risk labels are merge-risk: 🚨 compatibility.
  • remove status: 👀 ready for maintainer look: Current PR status label is status: ⏳ waiting on author.

Label justifications:

  • P1: A failed update or disabled Gateway can leave real operators without an in-product recovery path.
  • merge-risk: 🚨 compatibility: Existing macOS Gateway installations may receive new recovery guidance that requires terminal intervention instead of a supported product control.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🐚 platinum hermit and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Not applicable: This member-authored branch supplies local owner and socket-test evidence; the merge blocker is the missing recovery capability, not an unproven claimed implementation path.
  • proof: telegram-e2e: This PR needs Telegram Test Server proof with the repository E2E skill. The PR changes Telegram-visible recovery replies, but the supplied evidence does not include a Telegram Test Server event proof.

Evidence

Acceptance criteria:

  • [P1] Add Gateway boundary coverage for each exposed recovery action, including unavailable and revoked-capability states.
  • [P1] Add Control UI coverage proving no failure path requires terminal-only resolution.
  • [P1] Use Telegram Test Server proof for the changed Telegram recovery reply path when feasible.

What I checked:

  • Introduced terminal-only recovery guidance: The introduced macOS diagnosis tells an operator to run gateway start, update, doctor, and triage commands; it does not provide an in-product recovery action. (src/commands/doctor-platform-notes.ts:76, 11a7378106bd)
  • Existing UI triage is navigation only: The Control UI failure alert exposes only an action to navigate to Updates; no typed retry, restore, or report/recovery operation is available. (ui/src/app/update-triage.runtime.ts:74, cd4c3c08147b)
  • Owner setup guidance is intentionally operator-facing: The command-owner helper preserves configured owners and emits an operator command, while the reply gate supplies it to authorized non-owners; this makes the missing product recovery surface material rather than a reason to weaken authorization. (src/commands/doctor-command-owner.ts:44, 1427a3fe1f63)
  • Effect-site ownership remains guarded: Update handling rechecks external requester ownership from current runtime configuration, including after awaited acknowledgement and before managed or unsupervised effects. (src/gateway/server-methods/update.ts:241, cd4c3c08147b)
  • Maintainer product direction: A member review comment on this PR requires capability-checked, idempotent in-product Retry, Restore previous version, or Report issue actions with truthful outcomes; it says CLI guidance cannot be the required resolution.
  • Codex boundary checked directly: The directly inspected sibling Codex CLI source implements its own stdio/UDS relay and interactive CLI configuration flow. This PR changes OpenClaw Gateway and CLI behavior and has no affirmative Codex runtime or protocol dependency signal. (codex-rs/cli/src/main.rs:220, 41e22fee981a63b3698df7ed36bad393cda24715)

Likely related people:

  • fuller-stack-dev: Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low)
  • steipete: Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low)

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Add the typed capability-checked recovery controls and boundary/UI proof.
  • Capture Telegram Test Server evidence for the changed recovery reply path when feasible.

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
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.

Workflow

  • 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.

History

Review history (6 earlier review cycles)
  • reviewed 2026-09-03T04:47:33.727Z sha ff22c0c :: blocked before merge. :: none
  • reviewed 2026-09-03T07:57:08.795Z sha 7b95302 :: blocked before merge. :: [P1] Preserve existing command owners in the setup hint | [P1] Render skipped updates as a non-failure outcome
  • reviewed 2026-09-03T08:17:21.305Z sha 57720ed :: blocked before merge. :: [P1] Preserve existing owners in recovery guidance | [P1] Distinguish skipped updates from failures
  • reviewed 2026-09-03T08:45:07.917Z sha 80c3b52 :: blocked before merge. :: [P1] Do not disclose configured owners in recovery replies
  • reviewed 2026-09-03T09:29:13.737Z sha 80c3b52 :: blocked before merge. :: none
  • reviewed 2026-09-03T09:58:52.678Z sha 81d6ed0 :: blocked before merge. :: none

@steipete
steipete force-pushed the steipete/updater-followups-7c92ab branch from ff22c0c to 7b95302 Compare September 3, 2026 07:46
@openclaw-barnacle openclaw-barnacle Bot removed app: web-ui App: web-ui security Security documentation labels Sep 3, 2026
@clawsweeper clawsweeper Bot added merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Sep 3, 2026
@steipete
steipete force-pushed the steipete/updater-followups-7c92ab branch from 7b95302 to 57720ed Compare September 3, 2026 08:07
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Sep 3, 2026
Give authorized non-owners a sender-specific operator command across text/native commands, update tool refusals, and Gateway revalidation. Preserve unauthorized-sender behavior and correct pairing ownership guidance. Follow-up to #136588.
Use the existing local CLI shared-auth and loopback backend auth-none contracts for readiness. Preserve health diagnostics and served identity without device writes or Gateway auth changes. Follow-up to #136588.
Report an installed but disabled and unloaded selected LaunchAgent with its profile-exact recovery command. Preserve stopped-service behavior in doctor --fix and explain interrupted-update triage. Follow-up to #136588.
@steipete
steipete force-pushed the steipete/updater-followups-7c92ab branch from 81d6ed0 to cd4c3c0 Compare September 3, 2026 12:18
@fuller-stack-dev

Copy link
Copy Markdown
Member

Still blocked at cd4c3c08147b64be17146f84605eff43a90d9137.

The new head improves restart verification, skipped-versus-failed status, and user-facing notices, but it does not satisfy the in-app recovery contract:

  • There is no typed Gateway/Control UI action for Retry recovery, Restore previous version, or Report issue.
  • Failure notices still append doctorHint, including openclaw triage and other Doctor shell guidance.
  • The disabled-LaunchAgent path still makes CLI commands the user's remedy.

Revision mismatch, disconnect, timeout, unconfirmed completion, and unknown outcome must keep the user inside the product: automatically converge when safe, or offer capability-checked, idempotent Retry/Restore/Report controls backed by truthful typed outcomes. CLI triage can remain available for developers, but it cannot be the required resolution shown to users. Please make every terminal-instruction occurrence a regression assertion, not accepted UI copy.

This PR also remains downstream of repaired #137071 and the residual lifecycle/custody PR; it must not land ahead of them. It contains the f26eac72324 first-hop registry fixture repair. Current canonical f4647c4d1af59b3bb798a0a9a0f27f87cb7075dd adds only later test/memory movement, so an ancestry refresh and structural rerun are required, while the behavior proof remains valid unless newer owner-overlapping changes land.

@clawsweeper clawsweeper Bot added merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Sep 3, 2026
@steipete

steipete commented Sep 3, 2026

Copy link
Copy Markdown
Contributor Author

Rebased the existing updater follow-ups onto main without conflicts. Main contains 51fe03b6172, which removes the timing-sensitive agent-exec construction test. All production patches are preserved; Git dropped only two duplicate operatorRoleActor test assertions already present on main.

Exact head: cd4c3c08147b64be17146f84605eff43a90d9137. CI run 33754461663, attempt 1, completed successfully. The exact-head watcher exited 0 / GREEN. Local proof also passed:

node scripts/run-vitest.mjs src/gateway/server-restart-sentinel.test.ts src/infra/restart-sentinel.test.ts src/cli/daemon-cli/restart-health-client.test.ts src/commands/doctor-command-owner.test.ts src/agents/tools/gateway-tool.test.ts src/auto-reply/reply/commands-update.test.ts
pnpm check:changed
git diff --check

The six-file run passed all 189 tests. The changed gate exited 0; the existing Doctor temp-helper advisory remains warning-only. Fresh autoreview was explicitly waived for this conflict-free rebase.

Disposition of the latest review and recovery-controls request: this maintainer-directed landing retains the existing operator-run CLI diagnosis. Typed, capability-checked Retry/Restore/Report controls and their UI proof remain a named follow-up; this PR does not claim to provide them. The cited Control UI navigation surface is unchanged. The owner-ID visibility tradeoff remains as already documented in the body; update authority remains owner-revalidated.

The cloud-lifecycle repair in #137071 remains open. Its overlapping update.ts change owns status refresh; this PR changes owner-refusal handling and introduces no call to that unmerged API. The requested bounded landing proceeds independently and does not claim that cloud lifecycle/custody work or its stress proof is complete. Current main has no newer edits to this PR's 13 production files, and GitHub reports this head MERGEABLE.

Rank-up proof gaps remain explicit: no fresh Telegram Test Server run or full package-staging update roundtrip here; the previously recorded isolated live restart and notice evidence is retained. No schema, stored representation, migration, configuration, environment-variable, or protocol change is introduced. Existing owner normalization/current-config revalidation and sentinel round-trip tests cover the retained contracts. Production is +188/-88 (net +100), tests/support +1034/-424 (net +610), and docs +24/-1; the rebase adds no production code. Native artifacts include all 15 validator-classified runtime files, including both test helpers.

@steipete
steipete merged commit a5f3623 into main Sep 3, 2026
193 checks passed
@steipete
steipete deleted the steipete/updater-followups-7c92ab branch September 3, 2026 12:46
@steipete

steipete commented Sep 3, 2026

Copy link
Copy Markdown
Contributor Author

Merged via squash.

steipete added a commit that referenced this pull request Sep 3, 2026
Join update discovery and native-auth preparation before shared Gateway
teardown. Capture scoped positive and negative auth facts before handing work
to catalog workers, while retaining the synchronous plugin hook contract.

Use generation-owned workspace allocations for remote skill inputs, derive
one location for writes and mounts, and keep the private marker until payload
cleanup succeeds. Surface bootstrap network and cleanup failures explicitly.

Retain ownership through cancelled Git worktree creation and independent
managed-update handoff. No configuration, database, or protocol changes.

Refs: #137071, #136084, #136995.
steipete added a commit that referenced this pull request Sep 3, 2026
* fix(gateway): own cloud startup and teardown resources

Join update discovery and native-auth preparation before shared Gateway
teardown. Capture scoped positive and negative auth facts before handing work
to catalog workers, while retaining the synchronous plugin hook contract.

Use generation-owned workspace allocations for remote skill inputs, derive
one location for writes and mounts, and keep the private marker until payload
cleanup succeeds. Surface bootstrap network and cleanup failures explicitly.

Retain ownership through cancelled Git worktree creation and independent
managed-update handoff. No configuration, database, or protocol changes.

Refs: #137071, #136084, #136995.

* test(auth): align OAuth fixture with async synthetic lookup

Preserve the no-refresh assertions while following the async absence contract. Reproduced two missing-export failures before the one-line fixture repair; all 209 owning and sibling tests plus the changed-file gate pass.

Refs: #137071.
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Sep 4, 2026
…nclaw#136995)

* fix(commands): explain owner setup in authorized refusals

Give authorized non-owners a sender-specific operator command across text/native commands, update tool refusals, and Gateway revalidation. Preserve unauthorized-sender behavior and correct pairing ownership guidance. Follow-up to openclaw#136588.

* fix(update): verify restarts through local control clients

Use the existing local CLI shared-auth and loopback backend auth-none contracts for readiness. Preserve health diagnostics and served identity without device writes or Gateway auth changes. Follow-up to openclaw#136588.

* fix(doctor): diagnose disabled Gateway LaunchAgents

Report an installed but disabled and unloaded selected LaunchAgent with its profile-exact recovery command. Preserve stopped-service behavior in doctor --fix and explain interrupted-update triage. Follow-up to openclaw#136588.

* fix(gateway): send human-readable update outcome notices

* test(update): accept the operator role actor stamped on in-process update dispatch

* fix(commands): keep existing owners in the owner setup hint

* fix(gateway): report skipped updates as skipped, not failed

* test(update): align readiness fixtures with the local control client
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Sep 4, 2026
* fix(gateway): own cloud startup and teardown resources

Join update discovery and native-auth preparation before shared Gateway
teardown. Capture scoped positive and negative auth facts before handing work
to catalog workers, while retaining the synchronous plugin hook contract.

Use generation-owned workspace allocations for remote skill inputs, derive
one location for writes and mounts, and keep the private marker until payload
cleanup succeeds. Surface bootstrap network and cleanup failures explicitly.

Retain ownership through cancelled Git worktree creation and independent
managed-update handoff. No configuration, database, or protocol changes.

Refs: openclaw#137071, openclaw#136084, openclaw#136995.

* test(auth): align OAuth fixture with async synthetic lookup

Preserve the no-refresh assertions while following the async absence contract. Reproduced two missing-export failures before the one-line fixture repair; all 209 owning and sibling tests plus the changed-file gate pass.

Refs: openclaw#137071.
180Sai pushed a commit to 180Sai/openclaw that referenced this pull request Sep 5, 2026
…nclaw#136995)

* fix(commands): explain owner setup in authorized refusals

Give authorized non-owners a sender-specific operator command across text/native commands, update tool refusals, and Gateway revalidation. Preserve unauthorized-sender behavior and correct pairing ownership guidance. Follow-up to openclaw#136588.

* fix(update): verify restarts through local control clients

Use the existing local CLI shared-auth and loopback backend auth-none contracts for readiness. Preserve health diagnostics and served identity without device writes or Gateway auth changes. Follow-up to openclaw#136588.

* fix(doctor): diagnose disabled Gateway LaunchAgents

Report an installed but disabled and unloaded selected LaunchAgent with its profile-exact recovery command. Preserve stopped-service behavior in doctor --fix and explain interrupted-update triage. Follow-up to openclaw#136588.

* fix(gateway): send human-readable update outcome notices

* test(update): accept the operator role actor stamped on in-process update dispatch

* fix(commands): keep existing owners in the owner setup hint

* fix(gateway): report skipped updates as skipped, not failed

* test(update): align readiness fixtures with the local control client
180Sai pushed a commit to 180Sai/openclaw that referenced this pull request Sep 5, 2026
* fix(gateway): own cloud startup and teardown resources

Join update discovery and native-auth preparation before shared Gateway
teardown. Capture scoped positive and negative auth facts before handing work
to catalog workers, while retaining the synchronous plugin hook contract.

Use generation-owned workspace allocations for remote skill inputs, derive
one location for writes and mounts, and keep the private marker until payload
cleanup succeeds. Surface bootstrap network and cleanup failures explicitly.

Retain ownership through cancelled Git worktree creation and independent
managed-update handoff. No configuration, database, or protocol changes.

Refs: openclaw#137071, openclaw#136084, openclaw#136995.

* test(auth): align OAuth fixture with async synthetic lookup

Preserve the no-refresh assertions while following the async absence contract. Reproduced two missing-export failures before the one-line fixture repair; all 209 owning and sibling tests plus the changed-file gate pass.

Refs: openclaw#137071.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling cli CLI command changes commands Command implementations docs Improvements or additions to documentation gateway Gateway runtime maintainer Maintainer-authored PR merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P1 High-priority user-facing bug, regression, or broken workflow. proof: telegram-e2e This PR needs Telegram Test Server proof with the repository E2E skill. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. size: XL status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants