Skip to content

feat(kiloclaw): bump openclaw to version 2026.3.22#1390

Closed
kilo-code-bot[bot] wants to merge 2 commits intomainfrom
feat/kiloclaw-bump-openclaw-2026.3.22
Closed

feat(kiloclaw): bump openclaw to version 2026.3.22#1390
kilo-code-bot[bot] wants to merge 2 commits intomainfrom
feat/kiloclaw-bump-openclaw-2026.3.22

Conversation

@kilo-code-bot
Copy link
Copy Markdown
Contributor

@kilo-code-bot kilo-code-bot Bot commented Mar 23, 2026

Summary

  • Bumps openclaw in kiloclaw/Dockerfile from 2026.3.13 to 2026.3.22.

Verification

  • Confirmed current version (2026.3.13) is older than the target (2026.3.22); update is appropriate.
  • Reviewed release notes for v2026.3.22 from the openclaw/openclaw repository.

Visual Changes

N/A

Reviewer Notes

The following breaking changes from the v2026.3.22 release notes warrant attention for our deployment:

High priority — action likely required:

  • jq removed from exec safe-bin allowlistjq is installed in our Dockerfile (apt-get install -y ... jq). Agents that previously ran jq commands without an explicit approval prompt will now be blocked by default. This could break automation or agent workflows that rely on jq silently being allowed. Operators must explicitly opt jq back into the trusted path if needed. The release notes also note that the jq -n env builtin is blocked even when opted back in, to prevent secret leakage.

  • Browser/Chrome MCP: legacy Chrome extension relay removeddriver: "extension", bundled extension assets, and browser.relayBindHost are all gone. We install chromium in the image. If any user config or skills reference these settings, they will break. The fix path is openclaw doctor --fix on affected instances. This is safe for container-fresh setups (new onboards), but existing volumes with old configs may need remediation.

  • Config/env: CLAWDBOT_* and MOLTBOT_* env var names removed — Only OPENCLAW_* names are accepted now. Our controller/bootstrap code should be checked to confirm no legacy env var names are used. Unlikely to affect us since KiloClaw has always used OPENCLAW_* naming, but worth confirming.

  • Config/state: .moltbot state-dir migration fallback removed — Auto-detection of ~/.moltbot is gone. We use /root/.openclaw already (created explicitly in the Dockerfile), so this should have no impact on new or existing volumes.

  • Plugins/SDK: openclaw/extension-api removed — Any custom skills or plugins that import from openclaw/extension-api will fail to load. The replacement is openclaw/plugin-sdk/*. The skills in kiloclaw/skills/ should be audited to confirm they do not use the old import path.

Notable improvements in this release:

  • Gateway cold-start fix — Bundled channel plugins now load from compiled dist/extensions instead of recompiling TypeScript on every gateway startup. WhatsApp-class cold starts are expected to drop from tens of seconds to seconds. Positive for container startup time.
  • Default agent timeout raised from 600s to 48h — Long-running ACP and agent sessions will no longer time out prematurely. Positive for our use case.
  • Multiple security hardening fixes across exec approvals, pairing, SSRF, and webhook auth.

@kilo-code-bot
Copy link
Copy Markdown
Contributor Author

kilo-code-bot Bot commented Mar 23, 2026

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Files Reviewed (5 files)
  • kiloclaw/.dev.vars.example
  • kiloclaw/Dockerfile
  • kiloclaw/controller/src/config-writer.ts
  • kiloclaw/controller/src/pairing-cache.ts
  • kiloclaw/e2e/docker-image-testing.md

Reviewed by gpt-5.4-20260305 · 3,721,270 tokens

@evanjacobson evanjacobson removed their assignment Mar 28, 2026
@evanjacobson evanjacobson force-pushed the feat/kiloclaw-bump-openclaw-2026.3.22 branch from fcbb5ef to e348a1f Compare March 30, 2026 23:46
@evanjacobson
Copy link
Copy Markdown
Contributor

Research & Verification Notes

This comment documents the pre-merge analysis performed for this openclaw version bump.


Changelog Coverage

The full 2026.3.13 → 2026.3.22 changelog was enumerated exhaustively from the npm registry and openclaw release notes. 118 entries were catalogued across four categories:

Category Count
Breaking changes 13
New features / changes 39
Bug fixes 58
Chores / docs 8
Total 118

Every entry was evaluated against all KiloClaw touchpoints. All 118 returned NOT AFFECTED.


Touchpoint Sweep

Each KiloClaw surface that contacts openclaw was checked against the full changelog:

Touchpoint File Changes Reviewed
Version pin Dockerfile All 118
openclaw doctor --fix --non-interactive controller/src/bootstrap.ts:393 2, 9, 94, 104, 114
Gateway CLI args (--bind loopback --token ...) controller/src/bootstrap.ts:623-629 All gateway-related (13 entries)
openclaw --version regex controller/src/openclaw-version.ts All 118
ONBOARD_FLAGS controller/src/config-writer.ts:43-56 1, 3, 4, 14, 15, 17–19, 50, 51, 53
Config keys written controller/src/config-writer.ts 2, 4, 20, 21, 37, 39, 47, 48, 51, 83
Stale provider migration logic controller/src/config-writer.ts:151-165 26, 27
CLI invocations + pairing file paths controller/src/pairing-cache.ts 56, 69, 74, 75, 83, 84, 106
CF Worker env var names src/gateway/env.ts + all src/ All 118

Key confirmed safe points for the 13 breaking changes:


Supplemental Investigations

Six deeper dives were conducted for changes that warranted closer scrutiny:

  1. Agent timeout 600s → 48h (Change feat(o11y): track ingest version in session metrics + type safety and test coverage #57) — Confirmed agents.defaults.timeout is not set anywhere in KiloClaw. Zero codebase references to 600 as an agent timeout. New default applies automatically on upgrade.

  2. WS handshake timeout 3s → 10s + OPENCLAW_HANDSHAKE_TIMEOUT_MS (Change Run sync providers every 10 minutes #67) — Confirmed OPENCLAW_HANDSHAKE_TIMEOUT_MS is not injected by buildEnvVars or set anywhere. Verified the controller's own DEFAULT_WS_HANDSHAKE_TIMEOUT_MS = 5s in proxy.ts is an independent layer (HTTP→WS upgrade at the Fly Proxy/controller boundary), not the openclaw pre-auth client handshake. No conflict.

  3. Serialized channel startup (Change feat: add machine_id column to microdollar_usage_metadata #88) — Confirmed no EADDRINUSE patterns in KiloClaw source. Startup delay (a few extra seconds) is well within HEALTH_PROBE_TIMEOUT_SECONDS=60 and STARTING_TIMEOUT_MS=5min.

  4. Telegram SIGTERM hardening (Change Expose all free OpenRouter models #92) — Confirmed supervisor's SHUTDOWN_TIMEOUT_MS=10_000 window handles clean exit. Fly Machine stop timeouts are much longer; no adjustment needed.

  5. OpenRouter provider migration (Change Allow + in email addresses for @kilocode.ai domain #26) — Audited the "KiloCode-only" claim. Confirmed OPENROUTER_API_KEY is never set in KiloClaw, KILOCODE_MODELS_JSON is asserted undefined in env.test.ts:108, and the /api/openrouter/ string in config-writer.ts:154 is a URL-pattern detector for stale config migration — not a credential. The kilocode provider and the OpenRouter bundled plugin are fully independent.

  6. KiloCode API router request shapes (Changes App Builder - Add preview URL tracking with navigation controls #8, Allow + in email addresses for @kilocode.ai domain #26) — Verified that new reasoning/thinking/enable_thinking fields from per-agent thinking defaults are already declared in OpenRouterChatCompletionRequest. No new field names introduced that would require router-side changes.


Manual Test Plan

A 37-case manual test plan was produced covering:

Suite Cases Focus
BV — Build Verification 3 Docker image build, version string, Node ≥22.16.0
RT — Regression (live Fly lifecycle) 6 Provision/start/stop/restart, proxy routing, auth enforcement
DM — Doctor Migration 1 Existing 2026.3.13 volume upgraded, stale browser keys cleaned
FI — Fresh Install 5 Config key inventory, tools.profile, models allowlist deletion
DC — Doctor/Config Path 2 User customizations preserved, backup creation + pruning
BF — Beneficial Fix Verification 4 Agent timeout, WS handshake, channel startup serialization, Telegram SIGTERM
CH — Channel Regression 7 Telegram/Discord/Slack/StreamChat config + 3 live end-to-end
PF — Pairing Flow 3 CLI syntax + file paths unchanged
JQ — jq System Binary 1 jq available after safe-bin allowlist removal (Change #70)
HE — Health Endpoint 1 Bootstrap phases → ready
EC — Edge Cases 4 KILOCODE_API_BASE_URL, stale provider migration, env key cleanup, SHUTDOWN_TIMEOUT_MS

All 37 tests must pass for the upgrade to be considered complete. A rollback procedure (revert Dockerfile pin → rebuild → per-machine fly machine update) is documented; volume forward/backward compatibility is confirmed clean given zero config keys used by KiloClaw were changed in this release.


Conclusion

The Dockerfile version pin is the only change required. No KiloClaw source files need modification. The upgrade is clean across all 118 changelog entries, 11 touchpoints, and 6 supplemental investigations.

@evanjacobson
Copy link
Copy Markdown
Contributor

Correction: Source Changes Required (and Made)

The prior comment stated "Total files requiring changes: 0" — that assessment was incomplete. The actual diff on this branch includes three source changes beyond the Dockerfile pin. All were required. Here is the corrected analysis.


Change 1 — pairing-cache.ts: Remove CLAWDBOT_STATE_DIR fallback

File: controller/src/pairing-cache.tsresolveOpenClawStateDir()

What changed:

-  return (
-    process.env.OPENCLAW_STATE_DIR?.trim() ||
-    process.env.CLAWDBOT_STATE_DIR?.trim() ||
-    '/root/.openclaw'
-  );
+  return process.env.OPENCLAW_STATE_DIR?.trim() || '/root/.openclaw';

Why required: Breaking change #8 in this release removes CLAWDBOT_* compatibility env names from openclaw's runtime. resolveOpenClawStateDir() in pairing-cache.ts mirrored openclaw's own resolveStateDir() in paths.ts, including the legacy CLAWDBOT_STATE_DIR fallback. With openclaw no longer reading or honoring that var, keeping it in KiloClaw's mirror would cause a silent divergence: KiloClaw would read a state dir that openclaw itself ignores. Removed.

The accompanying comment was also updated: the mention of "legacy CLAWDBOT_STATE_DIR fallback" and the reference to openclaw paths.ts:65 were removed since that code path is now gone upstream.


Change 2 — pairing-cache.ts: Add Stream Chat to detectChannels()

File: controller/src/pairing-cache.tsdetectChannels()

What changed:

+  const sc = isRecord(ch.streamchat) ? ch.streamchat : {};
   ...
+  if (sc.enabled && sc.apiKey) channels.push('streamchat');

Why required: detectChannels() is used by the pairing cache to know which channels are active — it determines which pairing credential files to watch and which channels to include in pairing-related operations. Stream Chat was added as a KiloClaw channel, and config-writer.ts already writes channels.streamchat config, but detectChannels() had never been updated to recognize it. Without this fix, Stream Chat instances would be invisible to the pairing cache's channel detection logic.


Change 3 — config-writer.ts: Update writeMcporterConfig comment (MCP TODO resolved/revised)

File: controller/src/config-writer.tswriteMcporterConfig() JSDoc

What changed: The old comment said:

"TODO: When the Dockerfile pins OpenClaw >= 2026.3.14, migrate MCP server config into generateBaseConfig() using config.mcp.servers in openclaw.json instead."

The new comment says:

"The config.mcp.servers schema exists in openclaw.json (since v2026.3.14), but OpenClaw's embedded Pi MCP runtime only supports StdioClientTransport — it has no HTTP/SSE transport. Since our MCP servers (AgentCard, Linear) are remote HTTP endpoints, mcporter must stay until OpenClaw adds HTTP transport support."

Why required: This PR bumps past the 2026.3.14 threshold the old TODO referenced. Without updating the comment, the TODO would read as an immediately actionable task — implying the mcporter approach should now be removed. The revised comment accurately explains why mcporter must stay: the mcp.servers schema is now present in openclaw, but OpenClaw's Pi MCP bridge only supports StdioClientTransport. KiloClaw's MCP servers (AgentCard, Linear) are remote HTTP endpoints, so the mcporter middleware layer cannot be dropped until OpenClaw adds HTTP/SSE transport support.


Corrected Impact Summary

File Change Required Reason
kiloclaw/Dockerfile Version pin → 2026.3.22 Core version bump
kiloclaw/.dev.vars.example OPENCLAW_VERSION2026.3.22 Dev env reference
kiloclaw/e2e/docker-image-testing.md Version reference Doc accuracy
controller/src/pairing-cache.ts Remove CLAWDBOT_STATE_DIR fallback Breaking change #8
controller/src/pairing-cache.ts Add Stream Chat to detectChannels() Missing channel coverage
controller/src/config-writer.ts Update mcporter TODO comment Breaking change #9 threshold crossed; transport blocker documented

All six changes are present in the diff. No further source modifications needed.

@evanjacobson evanjacobson self-assigned this Mar 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants