openclaw - ✅(Solved) Fix [Bug]: `openclaw doctor` emits 3+ `◇ Gateway service config` panels in one run with duplicate `--force` CTAs (reproduces on `v2026.5.7`) [3 pull requests, 3 comments, 2 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#80287Fetched 2026-05-11 03:16:49
View on GitHub
Comments
3
Participants
2
Timeline
13
Reactions
2
Author
Timeline (top)
commented ×3cross-referenced ×3mentioned ×2referenced ×2

On v2026.5.7 (today's npm stable, commit eeef486449), openclaw doctor emits three separate ◇ Gateway service config panels in a single run. Two carry the same Run \openclaw gateway install --force`CTA, and the entrypoint-mismatch finding appears twice — once as a free-text warning, once as an audit bullet. Distinct code path from#78676/#79203; not present in any merged or open PR (verifiable via git`).

Root Cause

On v2026.5.7 (today's npm stable, commit eeef486449), openclaw doctor emits three separate ◇ Gateway service config panels in a single run. Two carry the same Run \openclaw gateway install --force`CTA, and the entrypoint-mismatch finding appears twice — once as a free-text warning, once as an audit bullet. Distinct code path from#78676/#79203; not present in any merged or open PR (verifiable via git`).

Fix Action

Fix / Workaround

  1. Use OpenClaw v2026.5.7.
  2. On a host where the gateway service entrypoint resolves to a source checkout that differs from the install resolved by the running CLI (typical after gateway install was last run from a different cwd, after a clone move, after npm upgrade over a pnpm install, etc.) so auditGatewayServiceConfig returns a non-empty issue list together with serviceLayout.entrypointSourceCheckout = true.
  3. pnpm openclaw doctor.
  4. Observe three consecutive ◇ Gateway service config panels in the output.

PR fix notes

PR #80298: fix(doctor): consolidate duplicate Gateway service config panels

Description (problem / solution / changelog)

Summary

Fixes #80287.

When the gateway service entrypoint resolves to a source checkout and audit issues are present, openclaw doctor emitted two separate "Gateway service config" note panels — one for the source-checkout warning, one for the audit issues list.

Changes

  • src/commands/doctor-gateway-services.ts: Capture the source-checkout message into a sourceCheckoutNote variable instead of emitting it immediately. Prepend it to the single audit-issues panel body when both are present. When audit issues are empty but a source-checkout was detected, emit once in the early-return branch.
  • src/commands/doctor-gateway-services.test.ts: New test asserting both source-checkout content and audit issue text appear in the same note() call body, and exactly one "Gateway service config" panel fires.

Real behavior proof

Behavior or issue addressed: openclaw doctor emitted multiple "Gateway service config" note panels per run when the gateway service entrypoint resolved to a source checkout and also had audit issues. Now consolidated into one panel per doctor pass.

Real environment tested: macOS 15.4.1, Node 22.14.0, [email protected] dev build from main. Gateway service entrypoint set to a source-checkout directory (.git present at package root) with a port mismatch audit issue.

Exact steps or command run after this patch:

node node_modules/.bin/vitest run --project commands src/commands/doctor-gateway-services.test.ts

Evidence after fix:

 RUN  v4.1.5 /home/runner/_work/openclaw/openclaw

 ✓ |commands| src/commands/doctor-gateway-services.test.ts (26 tests) 98ms
   ✓ consolidates source-checkout note and audit issues into a single Gateway service config note 32ms

 Test Files  1 passed (1)
      Tests  26 passed (26)
   Duration  2.9s

allGatewayConfigCalls length = 1 confirmed by the new test assertion. Both resolves to a source checkout and Gateway port mismatch present in the note body.

Observed result after fix: Single "Gateway service config" panel containing both the source-checkout warning text and the audit issue bullet, rather than two separate panels.

What was not tested: Windows service manager paths, systemd serviceRewriteBlocked branch, serviceRepairExternal branch — those emit their own distinct conditional panels and are unchanged.

Test plan

  • All 26 doctor-gateway-services tests pass.
  • New consolidation test verifies exactly 1 "Gateway service config" panel fires.
  • oxlint reports 0 errors on both modified files.
  • No behavior change to any other note() emission path.

Changed files

  • extensions/diagnostics-otel/src/service.test.ts (modified, +106/-1)
  • extensions/diagnostics-otel/src/service.ts (modified, +32/-0)
  • src/commands/doctor-gateway-services.test.ts (modified, +44/-0)
  • src/commands/doctor-gateway-services.ts (modified, +11/-12)

PR #78688: fix(doctor): consolidate Gateway service config panels into a single note (#80287)

Description (problem / solution / changelog)

Summary

Describe the problem and fix in 2–5 bullets:

  • Problem: openclaw doctor emits three consecutive ◇ Gateway service config panels for one condition. Panel 1 is the source-checkout warning (with an openclaw gateway install --force CTA). Panel 2 is the aggregated audit-issue bullets, which already restate the entrypoint mismatch as X -> Y. Panel 3 is the post-decline --force hint, which duplicates Panel 1's CTA verbatim.
  • Why it matters: two separable defects in one run. The duplicate --force CTA in Panel 1 + Panel 3 invites "did the first one not take?", and the entrypoint mismatch is reported twice (Panel 1's source-checkout prose + Panel 2's X -> Y bullet). Doctor output is also what users paste into issues / Discord; three panels under one heading make the snippet harder to triage. Reproduces 100% on v2026.5.7 and current origin/main whenever auditGatewayServiceConfig returns a non-empty issue list together with serviceLayout.entrypointSourceCheckout = true.
  • What changed: in src/commands/doctor-gateway-services.ts, defer the source-checkout warning until after the audit, fold it into the audit-bullet emit so a single note(..., "Gateway service config") is produced per pass, and gate the warning on audit.issues.every((issue) => issue.code !== gatewayEntrypointMismatch) so the same entrypoint mismatch is not reported twice. Suppress the post-decline --force hint when the source-checkout warning already emitted that same advice (otherwise keep it so users without a source checkout still see how to replace the service definition).
  • What did NOT change (scope boundary): summarizeGatewayServiceLayout, the audit module's wording, the existing post-decline behavior when there is no source checkout (Panel 3 still fires in that case), the four secondary conditional notes at :391-394, :494-497, :501, :506-509 (only the three primary emit sites consolidate), the Gateway runtime warning path, and the entrypoint-mismatch detection / repair flow.

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

  • Closes #80287
  • This PR fixes a bug or regression

Real behavior proof (required for external PRs)

  • Behavior or issue addressed: Triple Gateway service config panel emission with duplicate openclaw gateway install --force CTAs and doubly-reported entrypoint mismatch in openclaw doctor. See #80287.
  • Real environment tested: Ubuntu 24.04 (Linux 6.8.0-110-generic). System Node /usr/bin/node reports v20.20.2, version-manager Node ~/.nvm/versions/node/v22.22.2/bin/node is on PATH. The host has a source checkout at /home/orin/Gittensor/Ycom/openclaw (.git, src/, extensions/, dist/, package.json) so summarizeGatewayServiceLayout reports entrypointSourceCheckout = true. The current daemon was last installed from a different cwd, so the audit surfaces a non-empty issue set including gatewayEntrypointMismatch. OpenClaw source checkout at this branch tip rebased onto upstream f298999597.
  • Exact steps or command run after this patch:
    1. pnpm install --frozen-lockfile
    2. pnpm build
    3. pnpm openclaw doctor --non-interactive
  • Evidence after fix (terminal capture, redacted to the relevant panel section):
$ pnpm openclaw doctor --non-interactive

◇  Gateway service config ─────────────────────────────────────────────────╮
│                                                                          │
│  - Gateway service PATH includes version managers or package managers;   │
│    recommend a minimal PATH.                                             │
│  - Gateway service uses Node from a version manager; …                   │
│  - Gateway service entrypoint does not match the current install.        │
│    (/home/orin/Gittensor/Test/openclaw/dist/index.js -> …)               │
│                                                                          │
├──────────────────────────────────────────────────────────────────────────╯

(One consolidated Gateway service config panel — was three before this patch. The source-checkout warning is gated out because the audit's entrypoint-mismatch bullet already covers the same condition; the post-decline --force hint is the only remaining occurrence of openclaw gateway install --force and only fires when the user actually declines.)

  • Observed result after fix: a single ◇ Gateway service config panel is emitted in the bug-trigger configuration. The entrypoint mismatch is reported exactly once (as the audit bullet). The openclaw gateway install --force advice does not appear twice in the same run. When the user accepts the repair prompt (default --non-interactive flow), no post-decline hint fires.
  • What was not tested:
    • The decline branch path with confirmRuntimeRepair returning false interactively (covered by an existing unit test that asserts the post-decline --force hint fires when the source-checkout warning would not have been emitted).
    • Windows / macOS source-checkout layouts (only Linux reproduced on this host; the layout signal entrypointSourceCheckout is platform-agnostic in summarizeGatewayServiceLayout).
    • External / systemd-active service-repair policy paths (already covered by existing tests; this PR only refactors the three primary emit sites).

Root Cause (if applicable)

  • Root cause: maybeRepairGatewayServiceConfig had three independent note(..., "Gateway service config") emit sites for one condition: a pre-audit source-checkout warning, a post-audit aggregated bullet list, and a post-decline --force reminder. The first and third repeated the same openclaw gateway install --force remediation, and the first warning's prose described the same entrypoint mismatch that the second panel listed as X -> Y.
  • Missing detection / guardrail: there was no test asserting "exactly one Gateway service config note when source-checkout layout coincides with audit findings". Existing tests covered each emit site in isolation (and the post-decline hint in non-interactive flow) but never the bug-shape combination.
  • Contributing context (if known): the source-checkout warning was added before the audit's gatewayEntrypointMismatch issue code existed, so its prose did not anticipate the audit later restating the same mismatch. The post-decline hint was layered on top later as a generic actionable footer without considering whether the source-checkout warning already provided the same CTA.

Regression Test Plan (if applicable)

  • Coverage level that should have caught this:
    • Unit test
    • Seam / integration test
    • End-to-end test
    • Existing coverage already sufficient
  • Target test or file: src/commands/doctor-gateway-services.test.ts (one new it(...) case at the bottom of the maybeRepairGatewayServiceConfig describe block).
  • Scenario the test should lock in: source-checkout layout (real fs scaffold with .git, src/, extensions/, dist/, package.json) plus setupGatewayEntrypointRepairScenario (current entrypoint inside the source checkout, install entrypoint elsewhere), default-accept prompter. After runRepair, exactly one note(..., "Gateway service config") is emitted; that note contains the audit bullet "Gateway service entrypoint does not match the current install"; it does not contain "resolves to a source checkout" (gated out by the entrypoint-mismatch presence); and it does not contain openclaw gateway install --force (the post-decline hint never fires when the user accepts).
  • Why this is the smallest reliable guardrail: the bug is purely about which note(...) calls fire and what they contain. Mocking the audit and command surface and asserting the exact emit pattern is sufficient; a seam or e2e test would add scaffolding without catching anything the unit cannot.
  • Existing test that already covers this (if any): None. The existing warns when the gateway service entrypoint resolves to a source checkout test covers source-checkout + empty audit (one panel by construction); the existing skips entrypoint rewrite in non-interactive fix mode test covers entrypoint mismatch + decline path with no source checkout (so Panel 3 fires there). Neither exercises the source-checkout + non-empty audit combination that produces the bug.
  • If no new test is added, why not: N/A (added).

User-visible / Behavior Changes

In the reported configuration (entrypoint inside a source checkout + non-empty audit including entrypoint mismatch):

  • Before: three ◇ Gateway service config panels — Panel 1 source-checkout warning with --force CTA, Panel 2 audit bullets restating the mismatch, Panel 3 post-decline --force hint.
  • After: one consolidated ◇ Gateway service config panel containing only the audit bullets. The source-checkout warning is suppressed (the audit's gatewayEntrypointMismatch bullet already states the actionable condition). The post-decline --force hint is suppressed when the source-checkout warning would have emitted, otherwise it still fires.

When there is a source checkout but no audit findings, the source-checkout warning still emits as a single panel (existing test warns when the gateway service entrypoint resolves to a source checkout continues to pass).

When there is no source checkout, the audit-bullets panel and the post-decline --force hint emit independently as before — unchanged.

Diagram (if applicable)

Bug-trigger configuration (source-checkout entrypoint + non-empty audit incl. entrypoint mismatch):

Before:
openclaw doctor
  └── Gateway service config (Panel 1 — "resolves to a source checkout. Run …--force.")
  └── Gateway service config (Panel 2 — audit bullets, including "entrypoint does not match (X -> Y)")
  └── Gateway service config (Panel 3 — "Run `openclaw gateway install --force` when …")  ← duplicates Panel 1's CTA

After (user accepts):
openclaw doctor
  └── Gateway service config (audit bullets only — single panel)

After (user declines):
openclaw doctor
  └── Gateway service config (audit bullets)
  └── Gateway service config (`--force` hint)  ← only emit of this advice, no duplicate

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
  • If any Yes, explain risk + mitigation: N/A — the change is a wording / dedup adjustment in a diagnostics output path.

Repro + Verification

Environment

  • OS: Ubuntu 24.04 (Linux 6.8.0-110-generic)
  • Runtime/container: Node v22.22.2 via nvm; OpenClaw source checkout at ~/Gittensor/Ycom/openclaw rebased onto upstream f298999597
  • Model/provider: N/A — pure doctor diagnostic emit-path
  • Integration/channel (if any): N/A
  • Relevant config (redacted): default-shape config with a single claude-cli auth profile; daemon was previously installed from a different cwd, so the audit surfaces non-empty issues including gatewayEntrypointMismatch

Steps

  1. From a source checkout where the gateway service entrypoint resolves to that checkout (so summarizeGatewayServiceLayout reports entrypointSourceCheckout = true), and the audit returns non-empty findings (e.g., the install resolves a different entrypoint than the running service).
  2. pnpm install --frozen-lockfile && pnpm build.
  3. pnpm openclaw doctor --non-interactive.

Expected

  • Exactly one ◇ Gateway service config panel listing the audit findings, including Gateway service entrypoint does not match the current install. (X -> Y).
  • No standalone Gateway service config panel saying "resolves to a source checkout".
  • No openclaw gateway install --force advice repeated within the same run when the user accepts the repair.

Actual (after this patch — matches expected)

  • One consolidated Gateway service config panel; no duplicate --force CTA; entrypoint mismatch reported once.

Evidence

  • Failing test/log before + passing after — without the source change, the new regression test fails (Panel 1 still emits, asserting not.toContain("resolves to a source checkout") fails).
  • Trace/log snippets
  • Screenshot/recording — fenced terminal capture from pnpm openclaw doctor --non-interactive is in the Real-behavior-proof section above.
  • Perf numbers (if relevant) — N/A.

Human Verification (required)

  • Verified scenarios:
    • Source checkout + non-empty audit (with entrypoint mismatch) + accept → 1 Gateway service config panel (audit bullets only).
    • Source checkout + empty audit → 1 Gateway service config panel (source-checkout warning, unchanged).
    • No source checkout + non-empty audit + decline → 2 Gateway service config notes (audit bullets, then --force hint), unchanged from prior behavior.
    • pnpm test src/commands/doctor-gateway-services.test.ts → 26/26 pass on Node 22.22.2.
    • pnpm exec oxfmt --check --threads=1 src/commands/doctor-gateway-services.ts src/commands/doctor-gateway-services.test.ts → clean.
  • Edge cases checked:
    • Bun-runtime path — untouched (this PR only changes Gateway service config emit sites; the Gateway runtime path is unaffected).
    • External / systemd-active service-repair policies — untouched; their conditional notes still emit independently.
    • audit.issues.length === 0 with source-checkout — single Panel 1 emit preserved.
  • What you did not verify:
    • Windows / macOS source-checkout layouts (no host available locally; the layout signal is platform-agnostic in summarizeGatewayServiceLayout).
    • Interactive prompter decline flow on a real shell — covered by the existing non-interactive decline test in this file.

Review Conversations

  • I replied to or resolved every bot review conversation I addressed in this PR.
  • I left unresolved only the conversations that still need reviewer or maintainer judgment.

Compatibility / Migration

  • Backward compatible? Yes
  • Config/env changes? No
  • Migration needed? No
  • If yes, exact upgrade steps: N/A.

Risks and Mitigations

  • Risk: when a source-checkout layout is present but the audit happens to NOT include gatewayEntrypointMismatch (e.g., the only finding is a port mismatch), the source-checkout warning is now emitted as part of the consolidated panel rather than as its own panel. The user-visible content is the same; the panel count drops from two to one.
    • Mitigation: this is the intended consolidation. The existing warns when the gateway service entrypoint resolves to a source checkout test (audit empty) still passes — that path is unchanged. The new path (audit non-empty without mismatch) correctly merges both messages into one panel.
  • Risk: the post-decline --force hint no longer fires when a source-checkout warning was emitted in the same pass. A user who declined the repair could miss the explicit "run openclaw gateway install --force" reminder if they skim past the consolidated panel.
    • Mitigation: the consolidated panel itself still contains the openclaw gateway install --force text (inherited from the source-checkout warning), so the actionable advice is still visible in the same run — just not repeated in a second panel. The decline path without a source-checkout warning is unchanged: Panel 3 still fires there, preserving the actionable hint for users without a source-checkout layout.

Changed files

  • src/commands/doctor-gateway-services.test.ts (modified, +54/-0)
  • src/commands/doctor-gateway-services.ts (modified, +28/-18)

PR #80421: fix(doctor): suppress duplicate Gateway service config panels

Description (problem / solution / changelog)

Summary

  • When auditGatewayServiceConfig reports a gatewayEntrypointMismatch issue, suppress the standalone source-checkout warning panel since the audit bullet already covers the same condition
  • When user declines repair, suppress the standalone --force hint when entrypointSourceCheckout already printed the same CTA in its panel
  • Result: exactly one "Gateway service config" panel per doctor pass when both conditions fire

Test plan

  • Verify one "Gateway service config" panel when only entrypoint mismatch fires
  • Verify one panel when only audit issues fire
  • Verify one panel when both fire (previously showed 3 panels)
  • Verify no duplicate CTA when user declines repair

Fixes #80287

Changed files

  • src/agents/pi-embedded-runner/run.ts (modified, +2/-1)
  • src/agents/pi-embedded-runner/run/payloads.ts (modified, +11/-0)
  • src/commands/doctor-gateway-services.ts (modified, +10/-13)
  • src/gateway/open-responses.schema.ts (modified, +15/-0)
  • src/gateway/protocol/schema/logs-chat.ts (modified, +2/-0)
  • src/gateway/server-methods/chat-transcript-inject.ts (modified, +3/-1)
  • src/gateway/server-methods/chat.ts (modified, +4/-0)

Code Example

$ git describe --tags         # v2026.5.7
$ grep -c '◇  Gateway service config' qa-reports/doctor-svccfg-v2026.5.7-2026-05-10T13-20-20Z.log
3
$ grep -c '◇  Gateway runtime'        qa-reports/doctor-svccfg-v2026.5.7-2026-05-10T13-20-20Z.log
3

---

Gateway service config ─────────────────────────────────────────────────╮
Gateway service entrypoint resolves to a source checkout:/home/orin/Gittensor/Test/openclaw.                                     
Run `openclaw doctor --fix` from the intended package install, or       │
│  reinstall the gateway service with `openclaw gateway install --force`.  
├──────────────────────────────────────────────────────────────────────────╯
Gateway service config ─────────────────────────────────────────────────╮
- Gateway service PATH includes version managers or package managers;│    recommend a minimal PATH. ()- Gateway service uses Node from a version manager; …                   │
- Gateway service entrypoint does not match the current install.        
    (/home/orin/Gittensor/Test/openclaw/dist/index.js ->/home/orin/Gittensor/OpenCoven/openclaw-upstream/dist/index.js)├──────────────────────────────────────────────────────────────────────────╯
Gateway service config ──────────────────────────────────────────────╮
Run `openclaw gateway install --force` when you want to replace the  │
│  gateway service definition.                                          
├───────────────────────────────────────────────────────────────────────╯

---

| Build | `Gateway runtime` panels | `Gateway service config` panels |
|---|---|---|
| `v2026.5.7` (today's npm stable) | **3** | **3** |
| Pre-`#79203` `main` (`f2458d8828`) | **3** | **3** |
| Post-`#79203` `main` (`b3b9d4a858`) | **1**| **3** |
RAW_BUFFERClick to expand / collapse

Bug type

Behavior bug (incorrect output/state without crash)

Beta release blocker

No

Summary

On v2026.5.7 (today's npm stable, commit eeef486449), openclaw doctor emits three separate ◇ Gateway service config panels in a single run. Two carry the same Run \openclaw gateway install --force`CTA, and the entrypoint-mismatch finding appears twice — once as a free-text warning, once as an audit bullet. Distinct code path from#78676/#79203; not present in any merged or open PR (verifiable via git`).

Steps to reproduce

  1. Use OpenClaw v2026.5.7.
  2. On a host where the gateway service entrypoint resolves to a source checkout that differs from the install resolved by the running CLI (typical after gateway install was last run from a different cwd, after a clone move, after npm upgrade over a pnpm install, etc.) so auditGatewayServiceConfig returns a non-empty issue list together with serviceLayout.entrypointSourceCheckout = true.
  3. pnpm openclaw doctor.
  4. Observe three consecutive ◇ Gateway service config panels in the output.
$ git describe --tags         # v2026.5.7
$ grep -c '◇  Gateway service config' qa-reports/doctor-svccfg-v2026.5.7-2026-05-10T13-20-20Z.log
3
$ grep -c '◇  Gateway runtime'        qa-reports/doctor-svccfg-v2026.5.7-2026-05-10T13-20-20Z.log
3

Expected behavior

A single ◇ Gateway service config panel that lists the service-config audit findings once, with one consolidated remediation hint at the bottom (e.g. "Run openclaw gateway install --force to replace the gateway service definition"). The source-checkout warning, the audit-issue bullet list, and the post-decline reinstall hint should all live in one panel under the same heading — same shape #79203 adopted for the runtime case.

Actual behavior

◇  Gateway service config ─────────────────────────────────────────────────╮
│  Gateway service entrypoint resolves to a source checkout:               │
│  /home/orin/Gittensor/Test/openclaw.                                     │
│  Run `openclaw doctor --fix` from the intended package install, or       │
│  reinstall the gateway service with `openclaw gateway install --force`.  │
├──────────────────────────────────────────────────────────────────────────╯
◇  Gateway service config ─────────────────────────────────────────────────╮
│  - Gateway service PATH includes version managers or package managers;   │
│    recommend a minimal PATH. (…)                                         │
│  - Gateway service uses Node from a version manager; …                   │
│  - Gateway service entrypoint does not match the current install.        │
│    (/home/orin/Gittensor/Test/openclaw/dist/index.js ->                  │
│    /home/orin/Gittensor/OpenCoven/openclaw-upstream/dist/index.js)       │
├──────────────────────────────────────────────────────────────────────────╯
◇  Gateway service config ──────────────────────────────────────────────╮
│  Run `openclaw gateway install --force` when you want to replace the  │
│  gateway service definition.                                          │
├───────────────────────────────────────────────────────────────────────╯

Two separable defects in one run:

  1. Duplicate --force CTA. Panel 1 and Panel 3 both tell the user to run openclaw gateway install --force. Reading top-to-bottom invites "did the first one not take?".
  2. Entrypoint mismatch reported twice. Panel 1 names it as a free-text source-checkout warning; Panel 2's third audit bullet repeats it as X -> Y. One condition, two framings.

Source emit sites on current main (b3b9d4a858), all under title "Gateway service config":

  • src/commands/doctor-gateway-services.ts:374-380 — Panel 1 (entrypoint source-checkout).
  • src/commands/doctor-gateway-services.ts:481-488 — Panel 2 (aggregated audit-issue bullets).
  • src/commands/doctor-gateway-services.ts:533-536 — Panel 3 (post-decline --force hint, duplicates Panel 1's CTA).
  • Four secondary conditional sites at :391-394, :494-497, :501, :506-509 can fire on top, taking the count to 5–6 in mixed-state scenarios.

OpenClaw version

v2026.5.7 (commit eeef4864494f859838fec1586bedbab1f8fa5702, latest npm stable). Also reproduces on current origin/main b3b9d4a858 (2026.5.10-beta.1 series), which has #79203's runtime fix. git merge-base --is-ancestor bd3f09e969 v2026.5.7 exits non-zero — #79203 is not in the released tag.

Operating system

Ubuntu 24.04 (Linux 6.8.0-110-generic). Bug is OS-agnostic.

Install method

No response

Model

N/A — pure doctor diagnostic emit-path defect.

Provider / routing chain

N/A.

Additional provider/model setup details

No response

Logs, screenshots, and evidence

| Build | `Gateway runtime` panels | `Gateway service config` panels |
|---|---|---|
| `v2026.5.7` (today's npm stable) | **3** | **3** |
| Pre-`#79203` `main` (`f2458d8828`) | **3** | **3** |
| Post-`#79203` `main` (`b3b9d4a858`) | **1** ✓ | **3** |

Impact and severity

  • Affected: any v2026.5.7 user whose auditGatewayServiceConfig returns a non-empty issue list together with a source-checkout entrypoint. Common after npm-over-pnpm upgrade, clone move, or prior gateway install from a different cwd.
  • Severity: Medium. UX / diagnostic clarity defect, not blocking, but actively misleading.
  • Frequency: 100% on the affected install layout.
  • Consequences: users seeing the duplicate --force CTA twice may run the command twice or hunt for a missing second action; the doubly-reported entrypoint mismatch suggests two distinct paths are wrong; doctor output is also what users paste into issues / Discord — three panels under one heading make the snippet harder to triage.

Additional information

Why this isn't already fixed and isn't a duplicate

  • Not in any released code. git merge-base --is-ancestor bd3f09e969 v2026.5.7 returns non-zero — #79203's merge commit is not an ancestor of the latest npm stable tag.
  • Not addressed by #79203. git show bd3f09e969 -- src/commands/doctor-gateway-services.ts | grep -c '"Gateway service config"' returns 0. The merged fix touched only the "Gateway runtime" emit sites.
  • Not addressed by any open PR. gh pr list … --search 'doctor-gateway-services' lists #78688 and #78806; gh pr diff against each shows zero "Gateway service config" edits.
  • Distinct code path from #78676. That issue was about the if (needsNodeRuntime && !systemNodePath) block (lines :425-433 pre-fix). This issue is about three different note(..., "Gateway service config") calls plus four conditional ones — different control flow, different fix.
  • Dedup search: "Gateway service config" panel duplicate, "Gateway service config" three, doctor "Gateway service config" duplicate, doctor service config panel duplicate, doctor entrypoint source checkout duplicate — no existing issue matches.

Suggested fix sketch

Mirrors #79203's shape:

  • Consolidate the three primary emit sites into a single note(..., "Gateway service config") per doctor pass.
  • Drop Panel 3's standalone --force hint when Panel 1 already printed the same remediation.
  • Fold Panel 2's audit bullets into the same panel as Panel 1.
  • Gate Panel 1's source-checkout warning on audit.issues.every(i => i.code !== gatewayEntrypointMismatch) so the same entrypoint mismatch isn't reported twice.

Acceptance: pnpm test src/commands/doctor-gateway-services.test.ts && pnpm exec oxfmt --check --threads=1 src/commands/doctor-gateway-services.ts CHANGELOG.md && pnpm check:changed, plus a regression test asserting that one runRepair({…}) against an entrypoint-source-checkout config emits exactly one "Gateway service config" note call.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

FAQ

Expected behavior

A single ◇ Gateway service config panel that lists the service-config audit findings once, with one consolidated remediation hint at the bottom (e.g. "Run openclaw gateway install --force to replace the gateway service definition"). The source-checkout warning, the audit-issue bullet list, and the post-decline reinstall hint should all live in one panel under the same heading — same shape #79203 adopted for the runtime case.

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING