Skip to content

fix(daemon): write LaunchAgent plist to boot volume when home is on external APFS#90923

Closed
849261680 wants to merge 7 commits into
openclaw:mainfrom
849261680:fix/60398-external-apfs-launchd
Closed

fix(daemon): write LaunchAgent plist to boot volume when home is on external APFS#90923
849261680 wants to merge 7 commits into
openclaw:mainfrom
849261680:fix/60398-external-apfs-launchd

Conversation

@849261680

@849261680 849261680 commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Summary

macOS launchd refuses to bootstrap a LaunchAgent plist that lives on an external APFS volume (Bootstrap failed: 5: Input/output error). When a user's $HOME is on an external drive, openclaw gateway install always fails.

This PR makes the macOS LaunchAgent path resolution boot-volume-aware. A single helper, resolveLaunchAgentHomeDir(env) (in src/daemon/paths.ts), returns $HOME normally but falls back to the boot-volume home /Users/<user> when $HOME is on an external volume (detected by comparing statSync("/").dev vs statSync(home).dev). Every launchd lifecycle path derives from this one source, so install, repair, restart, uninstall, status/audit, and doctor service detection all converge on the same path launchd can actually bootstrap.

Why this shape (vs. an install-only copy)

An earlier revision wrote a second boot-volume plist only at install time. That left repair, restart, and uninstall still bootstrapping from the external path (which fails with the same error 5), and split state across two plists. Making the resolver canonical avoids a second path and keeps every lifecycle command consistent. Correctness details handled:

  • Uninstall trash now targets /Users/<user>/.Trash (same volume as the plist) instead of the external $HOME/.Trash; a cross-volume rename would EXDEV-fail and leak the plist.
  • Doctor service detection (src/daemon/inspect.ts) scans the boot-volume Library/LaunchAgents so an external-home install is actually detected.
  • Detached restart handoff (src/daemon/launchd-restart-handoff.ts) routes through the same resolver, so an in-band reload/kickstart fallback bootstraps the boot-volume plist instead of re-hitting error 5 against the external volume.
  • Supervisor restart fallback (src/infra/restart.ts) and the update restart helper script (src/cli/update-cli/restart-helper.ts) also launchctl bootstrap the plist; both now resolve through the same boot-volume-aware home. Logs and state stay under the user's real $HOME.
  • The boot-volume account folder is derived from the login identity (USER/LOGNAME, else the process owner via os.userInfo()), not from $HOME's structure — the reported $HOME is the external volume root itself (/Volumes/MainDataDrive), whose last path segment is the volume name, not the user. Case is preserved.
  • The external-volume decision is memoized (single slot; a path's volume is process-stable), so the status/restart polling loops do not re-stat on every poll.

Behavior on a normal Mac (HOME on the boot volume): unchanged. / and $HOME report the same st_dev (macOS firmlinks), so the resolver returns $HOME exactly as before — no extra plist, no path change.

Changed files:

  • src/daemon/paths.tsresolveLaunchAgentHomeDir() + memoized external-volume detection.
  • src/daemon/launchd.ts — plist path, plist write, and uninstall trash all derive from the boot-volume-aware home (removed the install-only double-write helpers).
  • src/daemon/inspect.ts — darwin user-scope service scan uses the boot-volume-aware home.
  • src/daemon/launchd-restart-handoff.ts — detached restart plist path uses the boot-volume-aware home.
  • src/infra/restart.ts / src/cli/update-cli/restart-helper.ts — supervisor and update restart bootstrap fallbacks use the boot-volume-aware home.
  • Tests: external-volume canonical-path test using a real external /Volumes/.../Users/test HOME, plus uninstall-trash, restart-handoff, supervisor-restart, and update-restart-script external-HOME regression tests.

Rebased onto current main.

Verification

node scripts/run-vitest.mjs src/daemon/launchd.test.ts   # 82/82 passed
node scripts/run-vitest.mjs src/daemon/inspect.test.ts    # passed
oxfmt --check / oxlint / tsgo (prod types)                # clean

Real behavior proof (live macOS launchd + real APFS volume)

  • Behavior addressed: openclaw gateway install fails with Bootstrap failed: 5: Input/output error when $HOME is on an external APFS volume, because launchd cannot bootstrap a plist from that volume. The fix resolves the plist (and its lifecycle siblings) to the boot volume.
  • Real environment tested: macOS (Darwin 24.6.0), real APFS disk image attached as an external volume (hdiutil), real launchctl in the gui/<uid> domain, and the real resolveLaunchAgentPlistPath from src/daemon/launchd.ts. A harmless plist running /usr/bin/true was used so no real gateway was started; everything was booted out and the image detached afterward.
  • Exact steps or command run after this patch:
    1. Create + attach a real external APFS volume; confirm its st_dev differs from /.
    2. launchctl bootstrap gui/$UID <plist-on-external-volume> → observe error 5.
    3. launchctl bootstrap gui/$UID <plist-on-boot-volume> → observe success + launchctl print.
    4. Run the patched resolveLaunchAgentPlistPath with HOME on the external volume and assert it returns the boot-volume path.
  • Evidence after fix:
=== 1. Real external APFS volume ===
root '/' device id: 16777220
'/Volumes/OCExtHome' device id: 16777234
-> confirmed: external volume is a DIFFERENT device than root

=== 3. BEFORE FIX behavior: bootstrap FROM the external volume ===
$ launchctl bootstrap gui/501 /Volumes/OCExtHome/Users/<user>/Library/LaunchAgents/ai.openclaw.proof.exthome60398.plist
Bootstrap failed: 5: Input/output error
launchctl exit code: 5   (the reported #60398 failure)

=== 4. AFTER FIX behavior: bootstrap FROM the boot volume ===
$ launchctl bootstrap gui/501 /Users/<user>/Library/LaunchAgents/ai.openclaw.proof.exthome60398.plist
launchctl exit code: 0   (success)
$ launchctl print gui/501/ai.openclaw.proof.exthome60398
	path = /Users/<user>/Library/LaunchAgents/ai.openclaw.proof.exthome60398.plist
	state = not running
	program = /usr/bin/true

=== patched resolver against the real external volume (both HOME shapes) ===
external volume device: 16777234, root device: 16777220
nested external HOME: HOME=/Volumes/OCExtHome2/Users/<user>
  -> /Users/<user>/Library/LaunchAgents/ai.openclaw.gateway.plist PASS
volume-root external HOME (#60398 shape): HOME=/Volumes/OCExtHome2
  -> /Users/<user>/Library/LaunchAgents/ai.openclaw.gateway.plist PASS
ALL PASS: both external HOME shapes resolve to the boot-volume plist (derived
from the login user, not the volume name)
  • Observed result after fix: bootstrapping the plist from the external APFS volume reproduces Bootstrap failed: 5: Input/output error; the identical plist on the boot volume bootstraps with exit code 0 and is visible via launchctl print; and the patched resolveLaunchAgentPlistPath redirects an external $HOME to the boot-volume path while leaving a normal boot-volume $HOME unchanged.
  • What was not tested: a full end-to-end openclaw gateway install of the real gateway service on an external home (avoided to not register a real launchd gateway on the test machine); a physically separate USB/Thunderbolt enclosure (an attached APFS disk image was used, which is a real, distinct APFS volume with a distinct st_dev).

Fixes #60398

@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime size: S triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 6, 2026
@clawsweeper

clawsweeper Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed June 25, 2026, 9:36 PM ET / 01:36 UTC.

Summary
The PR adds a boot-volume-aware macOS LaunchAgent home resolver and routes daemon install, repair, restart, uninstall, service inspection, update recovery, restart helpers, macOS app lookup, and regression tests through it for external APFS homes.

PR surface: Source +81, Tests +292, Other +86. Total +459 across 14 files.

Reproducibility: yes. at source level. Current main and v2026.6.10 still derive the LaunchAgent plist from HOME, and the PR body includes macOS terminal proof showing launchctl error 5 from an external APFS plist and success from the boot-volume path.

Review metrics: 2 noteworthy metrics.

  • LaunchAgent Path Surfaces: 7 aligned. Install, repair/restart, uninstall, inspection, detached restart, update recovery, and app lookup must agree or external-home users can re-hit launchd error 5.
  • Darwin Cleanup Hints: 1 HOME-derived hint remains. The remaining tilde-based rm command is user-visible and can disagree with the new boot-volume plist location.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #60398
Summary: This PR is the active candidate fix for the canonical external-APFS-home LaunchAgent bootstrap failure; the older similar PR is closed, while the env-wrapper failure remains adjacent and separately tracked.

Members:

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

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

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

Rank-up moves:

  • Resolve the dirty merge state against current main.
  • Route Darwin cleanup hints through the canonical LaunchAgent path or record maintainer acceptance as follow-up.

Risk before merge

  • [P1] External-home upgrades intentionally move the managed LaunchAgent plist source of truth from the external HOME tree to /Users/, so maintainers should accept how old workaround files are cleaned up or left behind.
  • [P2] A wrong login-user or volume-detection decision would keep affected macOS users unable to bootstrap or restart the managed gateway, although the PR covers USER, LOGNAME fallback, volume-root HOME, recovery paths, and app lookup in tests.
  • [P1] Darwin cleanup hints still render a HOME/tilde-derived rm command, so external-home users can be told to remove the wrong plist even after runtime detection uses the boot-volume path.
  • [P1] Live GitHub reports the PR as dirty, so the branch needs a rebase or conflict refresh before it can be merged into current main.

Maintainer options:

  1. Refresh Branch And Keep Hints Canonical (recommended)
    Resolve the dirty merge state and route Darwin cleanup hints through the same canonical LaunchAgent plist path before landing.
  2. Accept Runtime Fix With Hint Deferral
    Maintainers can accept the external-home runtime fix as-is and track stale cleanup copy or cleanup-hint polish separately.
  3. Pause For Replacement If Rebase Is Messy
    If the branch cannot be refreshed cleanly, keep the canonical issue open and replace this PR with an equivalent narrow boot-volume resolver fix.

Next step before merge

  • [P2] Maintainer handling is needed for the dirty merge state and compatibility acceptance around moving the canonical external-home LaunchAgent plist path.

Security
Cleared: No concrete security or supply-chain concern found; the diff changes local macOS daemon path resolution and tests without dependency, workflow, permission, secret, lockfile, or downloaded-code changes.

Review findings

  • [P3] Keep Cleanup Hints On The Canonical Plist Path — src/daemon/inspect.ts:458-459
Review details

Best possible solution:

Land one canonical boot-volume LaunchAgent path across macOS install, restart, uninstall, repair, inspection, update recovery, app lookup, and cleanup instructions, with the dirty branch state resolved before merge.

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

Yes, at source level. Current main and v2026.6.10 still derive the LaunchAgent plist from HOME, and the PR body includes macOS terminal proof showing launchctl error 5 from an external APFS plist and success from the boot-volume path.

Is this the best way to solve the issue?

Yes, with one polish gap. A single LaunchAgent-home resolver reused by lifecycle and recovery paths is the maintainable fix; the safer finishing touch is to route Darwin cleanup hints through that same path instead of leaving a HOME-derived command.

Full review comments:

  • [P3] Keep Cleanup Hints On The Canonical Plist Path — src/daemon/inspect.ts:458-459
    After this PR changes Darwin extra-service scanning to use resolveLaunchAgentHomeDir(), renderGatewayServiceCleanupHints() still emits rm ~/Library/LaunchAgents/.... On the reported external-home setup, status or doctor can detect the boot-volume plist but tell the user to remove the external HOME plist path, so the hint should use the same resolver or the detected plist path.
    Confidence: 0.78

Overall correctness: patch is correct
Overall confidence: 0.86

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 6830aa39eaa1.

Label changes

Label justifications:

  • P1: The PR targets a broken macOS managed gateway install/restart workflow that prevents affected external-APFS-home users from running the gateway reliably.
  • merge-risk: 🚨 compatibility: The PR intentionally changes the managed LaunchAgent plist location for external-home users from the external HOME tree to /Users/.
  • merge-risk: 🚨 availability: The changed path is on gateway bootstrap and restart paths, so a resolver mistake would leave affected users unable to run the managed gateway.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (terminal): The PR body includes after-fix macOS terminal proof on a distinct APFS volume showing external-plist bootstrap failure, boot-volume bootstrap success, and patched resolver output.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix macOS terminal proof on a distinct APFS volume showing external-plist bootstrap failure, boot-volume bootstrap success, and patched resolver output.
Evidence reviewed

PR surface:

Source +81, Tests +292, Other +86. Total +459 across 14 files.

View PR surface stats
Area Files Added Removed Net
Source 7 97 16 +81
Tests 5 292 0 +292
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 2 87 1 +86
Total 14 476 17 +459

What I checked:

  • Current main LaunchAgent path remains HOME-derived: Current main resolves the LaunchAgent plist by joining resolveHomeDir(env) with Library/LaunchAgents, so an external HOME remains the bootstrap plist base. (src/daemon/launchd.ts:131, 6830aa39eaa1)
  • Latest release still has the same LaunchAgent behavior: The v2026.6.10 tag still uses resolveHomeDir(env) for the LaunchAgent plist path and uninstall trash target, so the fix is not shipped. (src/daemon/launchd.ts:125, aa69b12d0086)
  • PR head adds the canonical boot-volume resolver: At PR head, resolveLaunchAgentHomeDir compares root and HOME device IDs, derives /Users/ for external HOME values, and keeps HOME when the volume is not external or the login user is unknown. (src/daemon/paths.ts:65, 6931c2306267)
  • PR head routes launchd lifecycle through the resolver: The PR head plist resolver uses resolveLaunchAgentHomeDir, and uninstall trashes the plist under the same resolved home to avoid cross-volume rename failures. (src/daemon/launchd.ts:128, 6931c2306267)
  • PR head aligns restart and update recovery paths: Detached restart handoff, supervisor restart fallback, managed-service update recovery, and update restart scripts now build bootstrap plist paths from resolveLaunchAgentHomeDir. (src/daemon/launchd-restart-handoff.ts:92, 6931c2306267)
  • Cleanup hint mismatch remains at PR head: After the PR changes Darwin service scanning to use resolveLaunchAgentHomeDir, cleanup hints still render rm ~/Library/LaunchAgents/.plist, which can point external-home users at the wrong plist. (src/daemon/inspect.ts:51, 6931c2306267)

Likely related people:

  • steipete: Git history shows repeated daemon launchd, path helper, recovery, and onboarding work across the affected LaunchAgent surface. (role: major launchd lifecycle contributor; confidence: high; commits: 49cbcea42991, fd968bfb2d16, 1db03840907d; files: src/daemon/launchd.ts, src/daemon/paths.ts, src/cli/update-cli/restart-helper.ts)
  • vincentkoc: Recent release and gateway-related commits touch the present daemon surface and appear in the current affected-file history. (role: recent area contributor; confidence: medium; commits: aa69b12d0086, be7462af1eca; files: src/daemon/launchd.ts, src/daemon/paths.ts, src/infra/restart.ts)
  • ngutman: Git history shows recent launchd stop, enable, and persistent lifecycle changes in the same managed LaunchAgent surface. (role: recent launchd lifecycle contributor; confidence: medium; commits: eebad7a372e3, affffddf045d, 23d9a100c4aa; files: src/daemon/launchd.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.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. labels Jun 6, 2026
@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 6, 2026
@clawsweeper

clawsweeper Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 6, 2026
@849261680
849261680 force-pushed the fix/60398-external-apfs-launchd branch from 3e08860 to 43d7cac Compare June 6, 2026 15:41
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 6, 2026
@clawsweeper

clawsweeper Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 6, 2026
@openclaw-barnacle openclaw-barnacle Bot added cli CLI command changes size: M and removed size: S labels Jun 6, 2026
@clawsweeper

clawsweeper Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 6, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Jun 6, 2026
@clawsweeper

clawsweeper Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 6, 2026
@clawsweeper clawsweeper Bot removed the rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. label Jun 6, 2026
…me resolver

The detached restart handoff recomputed the LaunchAgent plist path directly
from $HOME, so an external-APFS-home gateway could still bootstrap the external
plist on an in-band reload/kickstart fallback and re-hit `Bootstrap failed: 5`
after the install path was fixed. Resolve it through resolveLaunchAgentHomeDir,
the same boot-volume-aware source the rest of the lifecycle uses, and add an
external-HOME regression test for the handoff path.
…e resolver

The supervisor restart fallback (infra/restart.ts) and the update restart
helper script (cli/update-cli/restart-helper.ts) both recomputed the
LaunchAgent plist path directly from $HOME and then `launchctl bootstrap`-ed
it. For an external-APFS $HOME these re-hit `Bootstrap failed: 5` even after
install was fixed. Route both through resolveLaunchAgentHomeDir so every
launchd bootstrap path uses the same boot-volume plist location; logs and
state stay under the user's real HOME. Adds an external-HOME regression test
for the generated update restart script.
…ename

Issue openclaw#60398's reported $HOME is the external volume root itself
(/Volumes/MainDataDrive), whose last path segment is the volume name, not the
user. Deriving the boot-volume account from path.basename($HOME) produced
/Users/MainDataDrive — the wrong account. Resolve the account from the login
identity instead (USER/LOGNAME, falling back to the process owner via
os.userInfo() when a launchd-sanitized env drops them), case-preserved. Keep
$HOME only when the login user is undeterminable. Adds a volume-root external
HOME regression test.
@849261680
849261680 force-pushed the fix/60398-external-apfs-launchd branch from d0ed6cc to 6931c23 Compare June 19, 2026 18:50
@openclaw-barnacle openclaw-barnacle Bot added the app: macos App: macos label Jun 19, 2026
@clawsweeper

clawsweeper Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot added 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. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 🔁 re-review loop A fresh ClawSweeper review was explicitly requested after the latest review. and removed 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. 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. labels Jun 19, 2026
@849261680

Copy link
Copy Markdown
Contributor Author

Current head 6931c23062 has the two prior ClawSweeper blockers addressed and re-verified:

  • apps/macos/Sources/OpenClaw/GatewayLaunchAgentManager.swift now resolves the LaunchAgent plist through the boot-volume account when the app HOME is external, while leaving the disable marker under the real home.
  • src/infra/update-managed-service-handoff.ts now routes launchd recovery through resolveLaunchAgentHomeDir() before building the plist path.

Fresh verification from this worktree:

OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=.vitest-cache-90923 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=300000 node scripts/run-vitest.mjs src/infra/update-managed-service-handoff.test.ts --reporter=verbose
# passed: 10 tests

OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=.vitest-cache-90923 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=300000 node scripts/run-vitest.mjs src/daemon/launchd.test.ts src/daemon/inspect.test.ts src/daemon/launchd-restart-handoff.test.ts src/infra/restart.test.ts src/cli/update-cli/restart-helper.test.ts --reporter=verbose
# passed: 147 tests, 5 platform skips

swift test --skip-update --filter GatewayLaunchAgentManagerTests
# passed: 5 tests

git diff --check upstream/main...HEAD
# passed

@clawsweeper re-review

@clawsweeper clawsweeper Bot added 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. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 🔁 re-review loop A fresh ClawSweeper review was explicitly requested after the latest review. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels Jun 19, 2026
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. and removed rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. labels Jun 22, 2026
@openclaw-barnacle

Copy link
Copy Markdown

This pull request has been automatically marked as stale due to inactivity.
Please add updates or it will be closed.

@openclaw-barnacle openclaw-barnacle Bot added the stale Marked as stale due to inactivity label Jul 15, 2026
@openclaw-barnacle

Copy link
Copy Markdown

Closing due to inactivity.
If you believe this PR should be revived, post in #clawtributors on Discord to talk to a maintainer.
That channel is the escape hatch for high-quality PRs that get auto-closed.

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

Labels

app: macos App: macos cli CLI command changes gateway Gateway runtime merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P1 High-priority user-facing bug, regression, or broken workflow. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: M stale Marked as stale due to inactivity status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

gateway install fails with error 5 when home directory is on external APFS volume

1 participant