OpenClaw

OpenClaw strands Claude behind an unmigrated model policy

An OpenClaw report says legacy claude-cli model references survive migration, leaving no selectable Claude model. Nearby work restores plugin tools in restricted profiles and makes legacy-config copy failures visible to doctor instead of silently carrying bad state forward.

← Back to homeOriginal source ↗

openclaw/openclaw issue #124952 is the inspected primary source: “[Bug]: modelPolicy.allow is never migrated off legacy claude-cli/* refs, leaving no selectable Claude model.” The related records below were inspected as supporting context rather than independent confirmation.

The facts

- openclaw/openclaw issue #124952 was created 2026-08-17T01:07:38Z and was open at inspection; its title is “[Bug]: modelPolicy.allow is never migrated off legacy claude-cli/* refs, leaving no selectable Claude model.” - openclaw/openclaw PR #124947 was created 2026-08-17T00:52:15Z and was open at inspection; its title is “fix: plugin tools disappear from Codex and restricted profiles.” - openclaw/openclaw PR #124948 was created 2026-08-17T00:54:31Z and was open at inspection; its title is “fix(doctor): surface legacy-config copy failures.” - The repository reported 386471 stars, 5603 open issues, default branch main, and last push 2026-08-17T01:05:04Z. - The latest tagged-release baseline checked was pr-124528-profiles published 2026-08-16T10:15:43Z.

What changed

openclaw/openclaw issue #124952 reports: Bug type Behavior bug (incorrect output/state without crash) Beta release blocker No Summary agents.defaults.modelPolicy.allow is never rewritten by the legacy runtime model-provider migration, so a config whose allowlist holds only claude-cli/* refs reaches a state where no Claude model can be selected as an override at all: the canonical anthropic/* refs are rejected by the allowlist, and the legacy claude-cli/* refs are rejected by the harness guard in src/agents/harness/runtime-plugin.ts. Steps to reproduce 1. Use a config where the Claude CLI runtime is configured through the legacy provider namespace, i.e. agents.defaults.models and agents.defaults.modelPolicy.allow both hold claude-cli/ refs with agentRuntime: { id: "claude-cli" }, while agents.defaults.model.primary is already canonical (anthropic/claude-sonnet-5). 2. Run openclaw doctor --fix. 3. Request any Claude model as an override — e.g. openclaw agent --agent main --model claude-cli/claude-opus-5 --message "OK", or sessions_spawn with model: "claude-cli/claude-sonnet-5". 4. Repeat with the canonical form: --model anthropic/claude-opus-5. Expected behavior Either the allowlist entries migrate alongside the model map so canonical refs are selectable, or the legacy refs keep working end to end. Both forms failing at once leaves no working way to select a Claude model as an override. Prior observed behavior on this host: [gateway] agent model: claude-cli/claude-sonnet-5 ran normally through 2026-08-15 12:42 KST. The openclaw package was upgraded to 2026.8.1-beta.2 at

openclaw/openclaw PR #124947 reports: What Problem This Solves Fixes a general issue where Codex dropped the prepared plugin snapshot before dynamic-tool construction. preparedModelRuntime was never threaded into the dynamic-tool build at extensions/codex/src/app-server/dynamic-tool-build.ts:292, so every owner-gated plugin tool factory returned null under the default Codex harness. The absence was only debug-logged and never reached the model as a diagnostic. intent made the broader failure visible. In the live pre-fix reproduction, Codex never materialized the tool, emitted no diagnostic, then confabulated “Standing intent saved” while the standing_intents table still contained zero rows. Two additional gates stacked on top of that runtime omission: 1. Built-in profile allowlists contained core tools only, so any profile below full silently removed plugin-contributed tools. 2. Standing-intent creation failed closed for senderless authenticated owners with “channel identity is unavailable.” Creator provenance is intentional, so the trusted senderIsOwner authorization gate remains fail-closed; senderless authenticated owners now record the owner principal while sender and channel matching remain separate. Why This Change Was Made The fix restores the prepared runtime snapshot to Codex dynamic-tool construction and adds a generic, manifest-owned toolMetadata..profiles contract. The manifest field is validated by src/plugins/manifest-capability-normalizers.ts and merged into the existing profile policy by src/agents/conversation-capability-profile.ts. No plugin id or tool name is hardcoded in core. This does not widen Codex authority.

openclaw/openclaw PR #124948 reports: What Problem This Solves Doctor's legacy-config migration (~/.clawdbot/clawdbot.json → the canonical config path) swallowed every copyFile failure with a bare catch whose comment claimed "if it already exists, skip silently." The catch also ate EACCES, ENOSPC, and cross-device failures. Result: the operator's legacy config exists, the migration was attempted and failed, and doctor proceeded as a clean fresh install — no config, no change note, no warning. The run ends looking healthy while the operator's channels/auth silently vanished. Why This Change Was Made Root cause: failure collapsed into the skip-silently success shape at the one place that owns the copy. The catch now inspects the error code: EEXIST (a config already lives at the target — genuinely nothing to migrate) keeps its skip semantics; anything else rethrows with the source and target paths in the message, surfacing through doctor's existing error path. User Impact A permissions or disk-space problem during first-run migration now fails loudly with the exact paths instead of silently discarding the operator's legacy configuration. Evidence New doctor-config-preflight.legacy-copy.test.ts: a read-only target dir makes the preflight reject with Failed to migrate legacy config … — **fails pre-fix** (resolved as a clean run); companion test proves the successful copy still migrates and reports. Sibling suite doctor-config-preflight.state-migration.test.ts 30/30. tsgo core +

Why it matters

Configuration migration is an authority boundary: a successful-looking upgrade that leaves policy pointing at retired identifiers can disable the operator’s intended model without an explicit refusal. The operator test is whether the system remains bounded and its receipts still describe the action after failure, retry or restart.

Current

The primary record was open when captured on 2026-08-17. The tagged-release baseline was pr-124528-profiles published 2026-08-16T10:15:43Z. Repository metadata, full source bodies, current pull requests and issues, releases, Google News, Hacker News, Lobsters, Metamesh and the rendered ClawCharts row were inspected. ClawCharts selected the subject; it did not prove the claim.

Evidence

The primary URL is https://github.com/openclaw/openclaw/issues/124952. Supporting records are https://github.com/openclaw/openclaw/pull/124947 and https://github.com/openclaw/openclaw/pull/124948. Source bodies, timestamps and states are preserved in the daily evidence bundle. Test counts and reproductions remain attributed to their authors unless identified as independently rerun.

Source boundary

Open work is described as open, closed work as closed, and operator reports as reports. A pull request is evidence of proposed or reviewed direction, not proof of a shipped release. Search residue, package mirrors and historically published source spines were excluded.

Operator take

Test migrations against real legacy policy values, report every unconverted reference, and make doctor distinguish a copied configuration from one that is semantically usable. Preserve a before-state receipt, make the smallest reversible change, and verify the original failure independently.

Caveat

Public project records are mutable. Status, scope and evidence can change after publication. This brief records the inspected state and does not authorize changes to a reader’s deployment.

Source inspected; source state, environment and release boundary remain explicit.