diff --git a/.openclaw-sync/source.json b/.openclaw-sync/source.json
index 66105ebc6..aeaf398ab 100644
--- a/.openclaw-sync/source.json
+++ b/.openclaw-sync/source.json
@@ -1,5 +1,5 @@
{
"repository": "openclaw/openclaw",
- "sha": "4f50921e0f6069967405b525001a72af9960cb51",
- "syncedAt": "2026-04-27T11:41:38.660Z"
+ "sha": "9be54044eb3350203c2b72b910517406fa3ad09c",
+ "syncedAt": "2026-04-27T11:41:53.863Z"
}
diff --git a/docs/gateway/doctor.md b/docs/gateway/doctor.md
index 19b4b443a..622812523 100644
--- a/docs/gateway/doctor.md
+++ b/docs/gateway/doctor.md
@@ -379,6 +379,9 @@ That stages grounded durable candidates into the short-term dreaming store while
Doctor checks whether workspace bootstrap files (for example `AGENTS.md`, `CLAUDE.md`, or other injected context files) are near or over the configured character budget. It reports per-file raw vs. injected character counts, truncation percentage, truncation cause (`max/file` or `max/total`), and total injected characters as a fraction of the total budget. When files are truncated or near the limit, doctor prints tips for tuning `agents.defaults.bootstrapMaxChars` and `agents.defaults.bootstrapTotalMaxChars`.
+
+ When `openclaw doctor --fix` removes a missing channel plugin, it also removes the dangling channel-scoped config that referenced that plugin: `channels.` entries, heartbeat targets that named the channel, and `agents.*.models["/*"]` overrides. This prevents Gateway boot loops where the channel runtime is gone but config still asks the gateway to bind to it.
+
Doctor checks whether tab completion is installed for the current shell (zsh, bash, fish, or PowerShell):