Skip to content

daemon/systemd: distinguish WSL user D-Bus socket missing from missing systemctl#68400

Open
lyfuci wants to merge 2 commits intoopenclaw:mainfrom
lyfuci:fix/wsl-systemd-user-dbus-guidance
Open

daemon/systemd: distinguish WSL user D-Bus socket missing from missing systemctl#68400
lyfuci wants to merge 2 commits intoopenclaw:mainfrom
lyfuci:fix/wsl-systemd-user-dbus-guidance

Conversation

@lyfuci
Copy link
Copy Markdown
Contributor

@lyfuci lyfuci commented Apr 18, 2026

Summary

  • Problem: On WSL2 Ubuntu with [boot] systemd=true, openclaw gateway start fails with the misleading error Gateway start failed: Error: systemctl not available; systemd user services are required on Linux. even when systemctl is installed and working and the gateway itself is already running and reachable. The real failure is that the systemd user D-Bus socket ($XDG_RUNTIME_DIR/bus) is missing, so systemctl --user status returns Failed to connect to bus: No such file or directory.
  • Why it matters: WSL2 users see a literally incorrect error about systemctl being unavailable, follow the surfaced hints (openclaw gateway install, systemctl --user start openclaw-gateway.service), and still cannot control the gateway because the systemctl commands themselves will also hit the same D-Bus failure. This pushes users to workarounds like manually backgrounding openclaw gateway & inside /etc/wsl.conf, which conflicts with the systemd user unit and causes upgrade/restart confusion.
  • What changed: Reordered classifySystemdUnavailableDetail so the user-bus matcher runs before the missing-systemctl matcher (the substring no such file or directory is shared by both failure modes, but only the user-bus matcher is a positive identifier). Updated the internal assertSystemdAvailable helper in src/daemon/systemd.ts to branch on the classification rather than going through the older isSystemctlMissing shortcut, and to emit a WSL2-specific error message (with a pointer to [boot] systemd=true in /etc/wsl.conf plus wsl --shutdown) when the bus is unavailable and isWSLSync() reports WSL.
  • What did NOT change (scope boundary): No changes to gateway start/stop logic, no changes to the start hints renderer, no changes to isSystemdUserServiceAvailable behavior (it still returns false for both kinds of unavailability), no changes to the machine-user-scope fallback in sudo paths, no changes to documented config, and no env/config surface additions. The systemctl not available; systemd user services are required on Linux. message is still emitted for the genuinely missing-binary case.

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor required for the fix
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Skills / tool execution
  • Auth / tokens
  • Memory / storage
  • Integrations
  • API / contracts
  • UI / DX
  • CI/CD / infra

Linked Issue/PR

Root Cause (if applicable)

  • Root cause: classifySystemdUnavailableDetail (src/daemon/systemd-unavailable.ts) checked isSystemctlMissingDetail first, which matches the loose substring no such file or directory. WSL2's user-D-Bus error string is Failed to connect to bus: No such file or directory, so it hit the missing-systemctl branch despite also matching the more specific failed to connect to bus substring in isSystemdUserBusUnavailableDetail.
  • Missing detection / guardrail: The classifier ordering did not prioritize the more specific failure mode when both matchers could claim a given detail string. Additionally assertSystemdAvailable called isSystemctlMissing directly instead of the shared classifier, so the ordering fix alone in the classifier would still have left the error message path branched on the older detector.
  • Contributing context (if known): On WSL2 with [boot] systemd=true, DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus is often set but /run/user/1000/bus is missing during early boot unless the user's D-Bus socket is explicitly started (for example via a ~/.config/systemd/user/default.target.wants/dbus.socket symlink or loginctl enable-linger).

Regression Test Plan (if applicable)

  • Coverage level that should have caught this:
    • Unit test
  • Target test or file:
    • src/daemon/systemd-unavailable.test.ts — asserts the classifier returns user_bus_unavailable for Failed to connect to bus: No such file or directory (previously returned missing_systemctl).
    • src/daemon/systemd.test.ts — asserts that stopSystemdService (the nearest integration-style caller of assertSystemdAvailable in unit coverage) surfaces the bus detail in the thrown error and does not emit the systemctl not available; systemd user services are required string.
  • Scenario the test should lock in: A WSL-pattern Failed to connect to bus: No such file or directory returned from systemctl --user status must classify as bus-unavailable and must not surface a missing-systemctl message downstream.
  • Why this is the smallest reliable guardrail: The bug is a two-line classifier ordering issue plus a message-branch change; a direct unit test on the classifier catches future regressions cheaply, and the stopSystemdService integration test exercises the exact error plumbing the original openclaw gateway start failure used.
  • Existing test that already covers this: systemd-unavailable.test.ts already covers the No medium found bus variant; this PR adds the No such file or directory variant (the WSL-specific bus pattern).

Security Impact (required)

  • New permissions/capabilities? No
  • Secrets/tokens handling changed? No
  • New/changed network calls? No
  • Command/tool execution surface changed? No
  • Data access scope changed? No

Repro + Verification

Environment

  • OS: Windows 11 Home + WSL2 Ubuntu (reproduced from the issue environment)
  • Runtime/container: openclaw-gateway user service via systemctl --user
  • Model/provider: N/A
  • Integration/channel (if any): N/A (CLI start path)
  • Relevant config (redacted): default local gateway, systemd=true in /etc/wsl.conf, DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus set by login, /run/user/1000/bus missing.

Steps

  1. Open WSL2 Ubuntu shell where /run/user/$UID/bus does not exist despite systemctl being installed.
  2. Run openclaw gateway start.
  3. Observe the error message.

Expected

  • A WSL2-specific error pointing at the missing D-Bus socket and [boot] systemd=true in /etc/wsl.conf, not a claim that systemctl is unavailable.

Actual (before)

  • Gateway start failed: Error: systemctl not available; systemd user services are required on Linux. — incorrect; systemctl is installed.

Actual (after)

  • Gateway start failed: Error: systemd user D-Bus unavailable on WSL2: Failed to connect to bus: No such file or directory. Enable systemd by adding \[boot]\nsystemd=true` to /etc/wsl.conf, then run `wsl --shutdown` from PowerShell and reopen your distro; verify with `systemctl --user status`.` (on WSL).
  • Or on non-WSL hosts with a broken user bus: systemctl --user unavailable: Failed to connect to bus: ... — accurate and pointing at the right subsystem.

Evidence

  • Failing test/log before + passing after (new classifier test and new stopSystemdService test in the daemon suite).

Human Verification (required)

  • Verified scenarios:
    • Ran the new classifier test and the existing classifySystemdUnavailableDetail tests — all 5 pass, including the new WSL variant.
    • Ran the full src/daemon/systemd.test.ts suite (48 tests) plus src/daemon/systemd-unavailable.test.ts and src/daemon/systemd-hints.test.ts (10 tests) — all 58 pass.
    • Lint/format (oxlint/oxfmt) clean on all four touched files (classifier, classifier test, systemd, systemd test).
  • Edge cases checked:
    • No medium found bus variant still classifies as user_bus_unavailable (existing test).
    • spawn systemctl ENOENT still classifies as missing_systemctl (existing test).
    • Failed to connect to bus in the stopSystemdService path (existing test) keeps its existing error message because the bus detail also surfaces through the generic systemctl --user unavailable: ... branch when WSL detection is false.
  • What you did not verify: End-to-end verification on a real WSL2 host; the fix is guarded by unit tests of the internal classifier path.

Compatibility / Migration

  • Backward compatible? Yes — isSystemdUserServiceAvailable returns the same boolean for the same inputs, only the failure-branch error message/text changes.
  • Config/env changes? No
  • Migration needed? No

Risks and Mitigations

  • Risk: A detail string that legitimately meant "systemctl missing" and also accidentally contained failed to connect to bus could now classify as user_bus_unavailable.
    • Mitigation: In practice the only way a systemctl-missing error surfaces the bus phrasing is if the user's shell wrapper prints both, and even then the resulting message systemctl --user unavailable: <detail> remains technically correct (the binary is missing and/or the bus is unreachable); no tested case crosses this line.

@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime size: S labels Apr 18, 2026
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 18, 2026

Greptile Summary

This PR fixes a misclassification bug in classifySystemdUnavailableDetail (src/daemon/systemd-unavailable.ts) where WSL2's Failed to connect to bus: No such file or directory was matched by the loose isSystemctlMissingDetail heuristic before the more specific isSystemdUserBusUnavailableDetail check, causing openclaw gateway start to surface an incorrect "systemctl not available" error when systemctl is actually installed. The fix reorders the classifier checks so user-bus failures take priority, updates assertSystemdAvailable to branch on the classifier result (adding a WSL2-specific message pointing at /etc/wsl.conf and wsl --shutdown), and locks in both branches with regression tests.

Confidence Score: 5/5

Safe to merge — targeted two-file logic fix with full regression test coverage for both the classifier ordering and the new WSL2-specific error branch.

The fix is minimal and correct: reordering the classifier checks resolves a substring collision, and assertSystemdAvailable is updated to use the shared classifier instead of the raw heuristic. Both WSL and non-WSL branches are covered by new tests. No API surface changes, no config changes, and isSystemdUserServiceAvailable behavior is unchanged.

No files require special attention.

Reviews (2): Last reviewed commit: "daemon/systemd test: cover WSL2 D-Bus un..." | Re-trigger Greptile

Comment thread src/daemon/systemd.test.ts
@lyfuci lyfuci force-pushed the fix/wsl-systemd-user-dbus-guidance branch from 0328483 to ee60f5f Compare April 18, 2026 05:17
@lyfuci
Copy link
Copy Markdown
Contributor Author

lyfuci commented Apr 18, 2026

Thanks @greptile-apps — addressed both points in ee60f5face:

  • Test coverage gap (WSL2-specific branch): Added a hoisted isWSLSyncMock mock and a new stopSystemdService case that forces isWSLSync() === true, asserts the systemd user D-Bus unavailable on WSL2 prefix, and checks the /etc/wsl.conf + wsl --shutdown hint fragments. The existing non-WSL regression case now explicitly pins isWSLSyncMock.mockReturnValue(false) so both branches stay covered.
  • isSystemctlAvailable pre-existing false-positive: Confirmed pre-existing and intentionally out of scope for this PR — the same classifier reordering pattern should carry to isSystemctlAvailable (currently used by legacy unit discovery/disable paths in findLegacySystemdUnits / uninstallLegacySystemdUnits). Tracked as a follow-up.

lyfuci added a commit to lyfuci/openclaw that referenced this pull request Apr 18, 2026
Address Greptile P2 review on openclaw#68400: the previous test only exercised
the non-WSL branch of assertSystemdAvailable, so the WSL2-specific
hint (the "systemd user D-Bus unavailable on WSL2" message pointing
at /etc/wsl.conf + wsl --shutdown) was not locked in by CI.

Mock isWSLSync() through a hoisted mock so the test can force WSL
detection on any platform, add an additional stopSystemdService case
that asserts the WSL2-specific prefix, and reset the mock in the
existing non-WSL regression case so both branches stay covered.

Refs openclaw#68380
@lyfuci lyfuci force-pushed the fix/wsl-systemd-user-dbus-guidance branch from ee60f5f to 01e74ec Compare April 18, 2026 09:32
@lyfuci lyfuci force-pushed the fix/wsl-systemd-user-dbus-guidance branch from 01e74ec to 54c7aad Compare April 18, 2026 09:46
lyfuci added a commit to lyfuci/openclaw that referenced this pull request Apr 19, 2026
Address Greptile P2 review on openclaw#68400: the previous test only exercised
the non-WSL branch of assertSystemdAvailable, so the WSL2-specific
hint (the "systemd user D-Bus unavailable on WSL2" message pointing
at /etc/wsl.conf + wsl --shutdown) was not locked in by CI.

Mock isWSLSync() through a hoisted mock so the test can force WSL
detection on any platform, add an additional stopSystemdService case
that asserts the WSL2-specific prefix, and reset the mock in the
existing non-WSL regression case so both branches stay covered.

Refs openclaw#68380
@lyfuci lyfuci force-pushed the fix/wsl-systemd-user-dbus-guidance branch from 54c7aad to f4f7e4a Compare April 19, 2026 03:15
@lyfuci lyfuci force-pushed the fix/wsl-systemd-user-dbus-guidance branch 2 times, most recently from ac70be4 to b67db89 Compare April 19, 2026 04:38
lyfuci added a commit to lyfuci/openclaw that referenced this pull request Apr 19, 2026
Address Greptile P2 review on openclaw#68400: the previous test only exercised
the non-WSL branch of assertSystemdAvailable, so the WSL2-specific
hint (the "systemd user D-Bus unavailable on WSL2" message pointing
at /etc/wsl.conf + wsl --shutdown) was not locked in by CI.

Mock isWSLSync() through a hoisted mock so the test can force WSL
detection on any platform, add an additional stopSystemdService case
that asserts the WSL2-specific prefix, and reset the mock in the
existing non-WSL regression case so both branches stay covered.

Refs openclaw#68380
@lyfuci lyfuci force-pushed the fix/wsl-systemd-user-dbus-guidance branch from b67db89 to 04b7351 Compare April 19, 2026 15:48
@lyfuci lyfuci force-pushed the fix/wsl-systemd-user-dbus-guidance branch from 04b7351 to 056bc63 Compare April 19, 2026 16:32
@lyfuci lyfuci force-pushed the fix/wsl-systemd-user-dbus-guidance branch from 056bc63 to 91d0519 Compare April 19, 2026 16:55
@lyfuci lyfuci force-pushed the fix/wsl-systemd-user-dbus-guidance branch from 91d0519 to ced6294 Compare April 19, 2026 17:50
lyfuci added 2 commits April 20, 2026 02:15
…g systemctl

When the systemd user D-Bus socket is missing (for example on WSL2
without systemd boot, or on headless hosts that never ran loginctl
enable-linger), systemctl reports `Failed to connect to bus: No such
file or directory`. The shared detail classifier used to match the
generic "no such file or directory" substring before the user-bus
matcher, so that failure got classified as missing-systemctl and
`openclaw gateway start` surfaced the misleading message
`systemctl not available; systemd user services are required on
Linux.` on hosts where systemctl is actually installed and reachable.

Reorder `classifySystemdUnavailableDetail` so the user-bus check wins
over the missing-systemctl heuristic, update `assertSystemdAvailable`
to branch on the classification (emitting a WSL2-specific hint that
points at `[boot] systemd=true` in `/etc/wsl.conf` plus
`wsl --shutdown` when running under WSL), and add regression tests so
the WSL-style bus error no longer collapses into the missing-systemctl
branch.

Refs openclaw#68380
Address Greptile P2 review on openclaw#68400: the previous test only exercised
the non-WSL branch of assertSystemdAvailable, so the WSL2-specific
hint (the "systemd user D-Bus unavailable on WSL2" message pointing
at /etc/wsl.conf + wsl --shutdown) was not locked in by CI.

Mock isWSLSync() through a hoisted mock so the test can force WSL
detection on any platform, add an additional stopSystemdService case
that asserts the WSL2-specific prefix, and reset the mock in the
existing non-WSL regression case so both branches stay covered.

Refs openclaw#68380
@clawsweeper
Copy link
Copy Markdown
Contributor

clawsweeper Bot commented Apr 29, 2026

Codex review: needs changes before merge.

Summary
The branch reorders systemd-unavailable classification, routes systemd availability failures through the shared classifier with WSL2 D-Bus guidance, adds daemon regression tests, and adds a changelog entry.

Reproducibility: yes. A source-level reproduction is high-confidence: on current main, classifySystemdUnavailableDetail("Failed to connect to bus: No such file or directory") reaches the broad missing-systemctl branch first, and the gateway start path reaches assertSystemdAvailable through systemd restart.

Next step before merge
A worker can safely add the missing Thanks @lyfuci changelog credit without changing the daemon logic.

Security
Cleared: The diff introduces no concrete security or supply-chain concern because it only changes daemon classification/error text, tests, and changelog text.

Review findings

  • [P2] Add the required changelog attribution — CHANGELOG.md:24
Review details

Best possible solution:

The maintainable end state is classifier precedence for user-bus failures, classifier-based systemd availability messaging, regression coverage for both WSL and non-WSL branches, and a credited changelog entry.

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

Yes. A source-level reproduction is high-confidence: on current main, classifySystemdUnavailableDetail("Failed to connect to bus: No such file or directory") reaches the broad missing-systemctl branch first, and the gateway start path reaches assertSystemdAvailable through systemd restart.

Is this the best way to solve the issue?

No, not as-is. The daemon code approach is the narrow fix, but the PR should add the missing changelog credit, rebase if needed, and rerun the targeted daemon checks before landing.

Full review comments:

  • [P2] Add the required changelog attribution — CHANGELOG.md:24
    OpenClaw changelog policy requires user-facing contributor fix entries to include a Thanks @author attribution. This added daemon/systemd bullet has no Thanks @lyfuci, so the PR should add the credit before landing.
    Confidence: 0.96

Overall correctness: patch is incorrect
Overall confidence: 0.88

Acceptance criteria:

  • pnpm test src/daemon/systemd-unavailable.test.ts src/daemon/systemd.test.ts src/daemon/systemd-hints.test.ts
  • pnpm exec oxfmt --check --threads=1 CHANGELOG.md src/daemon/systemd-unavailable.ts src/daemon/systemd-unavailable.test.ts src/daemon/systemd.ts src/daemon/systemd.test.ts
  • git diff --check

What I checked:

  • current_main_classifier_order: Current main checks the broad missing-systemctl matcher before the user-bus matcher, so a detail containing both Failed to connect to bus and No such file or directory is still classified as missing_systemctl. (src/daemon/systemd-unavailable.ts:40, 0c6c1cac7691)
  • current_main_assertion_old_message: assertSystemdAvailable still branches through isSystemctlMissing(detail) and throws systemctl not available; systemd user services are required on Linux. before any WSL/user-bus-specific handling. (src/daemon/systemd.ts:493, 0c6c1cac7691)
  • reported_start_path_reaches_assertion: openclaw gateway start calls startGatewayService, which restarts the service; the systemd restart path runs through assertSystemdAvailable, so the reported CLI path can surface the old message. (src/daemon/service.ts:127, 0c6c1cac7691)
  • pr_diff_targets_right_surface: The PR patch moves the user-bus classifier before missing-systemctl, makes assertSystemdAvailable branch on the classifier, and adds non-WSL plus WSL-specific regression tests; the Greptile coverage concern was addressed by the second commit that mocks WSL detection. (src/daemon/systemd.ts:418, 7dae35b80213)
  • pr_changelog_missing_attribution: The PR adds a user-facing daemon/systemd changelog bullet but does not include the required Thanks @lyfuci attribution. (CHANGELOG.md:24, 7dae35b80213)
  • security_scope_review: The PR diff is limited to changelog text, daemon classification/error handling, and daemon tests; it does not touch workflows, dependency sources, lockfiles, install/build/release scripts, package publishing metadata, downloaded artifacts, or secrets handling. (7dae35b80213)

Likely related people:

  • steipete: GitHub commit history shows steipete centralized systemd-unavailable classification and made recent daemon/systemd maintenance changes adjacent to the assertion path. (role: classifier refactor owner and recent maintainer; confidence: high; commits: 94425764a83b, dd0f5937d2b5, 67f1266fe8a2; files: src/daemon/systemd-unavailable.ts, src/daemon/systemd.ts, src/daemon/systemd.test.ts)
  • vincentkoc: History shows vincentkoc handled WSL2 systemctl checks, missing user-bus fallback, degraded systemd status checks, and recent user-bus hinting in the same daemon surface. (role: recent adjacent WSL/systemd user-bus maintainer; confidence: high; commits: 53b2479eed4a, a56841b98c8d, 556a74d25914; files: src/daemon/systemd.ts, src/daemon/systemd-unavailable.ts)

Remaining risk / open question:

  • The branch is based on an older main and may need a clean rebase around the active changelog section.
  • No live WSL2 end-to-end verification was performed in this review; confidence comes from source tracing and the proposed regression tests.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 0c6c1cac7691.

@clawsweeper
Copy link
Copy Markdown
Contributor

clawsweeper Bot commented Apr 29, 2026

Codex review: found issues before merge.

What this changes:

The branch reorders systemd unavailable classification, routes systemd availability failures through the shared classifier with WSL2-specific D-Bus guidance, adds daemon regression tests, and adds a changelog entry.

Maintainer follow-up before merge:

This is an open contributor implementation PR that appears to address a real current-main bug; the next action is maintainer review, rebase, validation, and changelog credit cleanup rather than an automated replacement PR.

Review findings:

  • [P2] Add the required changelog attribution — CHANGELOG.md:24
Review details

Best possible solution:

Land a narrow daemon/systemd fix that makes the user-bus classifier win over the broad missing-systemctl heuristic, makes assertSystemdAvailable use that shared classification, preserves the true missing-systemctl branch, includes the WSL2 missing-D-Bus socket regression tests, and updates the changelog with proper credit.

Full review comments:

  • [P2] Add the required changelog attribution — CHANGELOG.md:24
    OpenClaw changelog policy requires every added user-facing entry to include a Thanks @author attribution. This new bullet has no Thanks @lyfuci, so the branch should add the credit before landing.
    Confidence: 0.96

Overall correctness: patch is incorrect
Overall confidence: 0.87

Acceptance criteria:

  • pnpm test src/daemon/systemd-unavailable.test.ts src/daemon/systemd.test.ts src/daemon/systemd-hints.test.ts
  • pnpm exec oxfmt --check --threads=1 src/daemon/systemd-unavailable.ts src/daemon/systemd-unavailable.test.ts src/daemon/systemd.ts src/daemon/systemd.test.ts CHANGELOG.md

What I checked:

  • current_main_classifier_still_misorders_wsl_bus_error: Current main checks isSystemctlMissingDetail before isSystemdUserBusUnavailableDetail, so Failed to connect to bus: No such file or directory still matches the broad no such file or directory missing-systemctl heuristic first. (src/daemon/systemd-unavailable.ts:40, 3215ab6de5db)
  • current_main_assertion_still_throws_old_message: assertSystemdAvailable still calls isSystemctlMissing(detail) directly and throws systemctl not available; systemd user services are required on Linux. before any classifier-based WSL/user-bus branch exists. (src/daemon/systemd.ts:493, 3215ab6de5db)
  • current_tests_do_not_cover_wsl_missing_socket_classifier_case: Current classifier tests cover No medium found and Permission denied bus failures, but not the WSL2 Failed to connect to bus: No such file or directory collision that this PR adds. (src/daemon/systemd-unavailable.test.ts:14, 3215ab6de5db)
  • start_path_reaches_systemd_restart_preflight: openclaw gateway start can call startGatewayService, which calls the service restart path; restartSystemdService calls runSystemdServiceAction, which calls assertSystemdAvailable, so the old message is on the reported start path. (src/daemon/service.ts:127, 3215ab6de5db)
  • pr_diff_changelog_missing_required_attribution: The PR adds a user-facing changelog bullet without the required Thanks @lyfuci attribution. (CHANGELOG.md:24, 7dae35b80213)
  • pr_security_scope_review: The PR diff only touches CHANGELOG.md, src/daemon/systemd-unavailable.ts, src/daemon/systemd-unavailable.test.ts, src/daemon/systemd.ts, and src/daemon/systemd.test.ts; it does not touch workflows, dependency sources, lockfiles, install/build/release scripts, package publishing metadata, downloaded artifacts, or secret handling. (7dae35b80213)

Likely related people:

  • steipete: Path history shows steipete centralized systemd unavailable classification and made several recent daemon/systemd changes; current shallow blame also routes the central lines through recent main snapshots by Peter Steinberger. (role: recent maintainer and classifier refactor owner; confidence: medium; commits: 94425764a83b, dd0f5937d2b5, 67f1266fe8a2; files: src/daemon/systemd-unavailable.ts, src/daemon/systemd.ts, src/daemon/systemd.test.ts)
  • vincentkoc: Recent history shows vincentkoc authored the user-bus hint work and sudo/user-systemd hardening adjacent to the classifier and service-control paths this PR changes. (role: recent adjacent systemd user-bus maintainer; confidence: high; commits: b246c06fa5e5, 56ca4e2269df, a56841b98c8d; files: src/daemon/systemd-unavailable.ts, src/daemon/systemd.ts, src/daemon/systemd.test.ts)

Remaining risk / open question:

  • The branch is based on an older main and the active changelog section has moved, so a rebase and changelog placement check are still needed.
  • This review did not include end-to-end WSL2 execution; the available proof is source inspection, PR diff review, and the proposed unit-level regression coverage.
  • The author noted a related isSystemctlAvailable false-positive remains out of scope; that should remain a separate follow-up rather than blocking this narrow fix.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 3215ab6de5db.

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

Labels

gateway Gateway runtime size: S

Projects

None yet

Development

Successfully merging this pull request may close these issues.

WSL2: gateway service runs but openclaw gateway start fails when user D-Bus socket is missing

1 participant