[codex] Harden GPT-5.4 runtime paths#70743
Conversation
Greptile SummaryThis PR hardens multiple GPT-5.4 runtime paths: it adds a
Confidence Score: 4/5Safe to merge with minor cleanup; the duplicate classifier logic is a maintainability risk but not an immediate production blocker. All inline findings are P2, but the duplicated classification code in agent-runner-execution.ts uses a case-sensitive substring match for the plan-only signal while the canonical classifier uses a case-insensitive regex — a real behavioral divergence introduced in this PR that is worth resolving before the code drifts further. src/auto-reply/reply/agent-runner-execution.ts — duplicate classifier with inconsistent regex; src/agents/pi-embedded-runner/result-fallback-classifier.ts — the intended canonical home for this logic Prompt To Fix All With AIThis is a comment left during a code review.
Path: src/auto-reply/reply/agent-runner-execution.ts
Line: 122-125
Comment:
**Local `isGpt5ModelId` diverges from the canonical helper**
A local copy of `isGpt5ModelId` is defined with the pattern `^gpt-5(?:[.-]|$)`, while the canonical version imported by `result-fallback-classifier.ts` uses `(?:^|[/:])gpt-5(?:[.-]|$)`. The canonical regex also matches IDs that include a provider prefix (`openai/gpt-5.4`), which the local copy would miss. Since `result-fallback-classifier.ts` was introduced in this same PR as the shared classification helper, consider importing `isGpt5ModelId` from `gpt5-prompt-overlay.ts` here too instead of maintaining a second copy.
How can I resolve this? If you propose a fix, please make it concise.
---
This is a comment left during a code review.
Path: src/auto-reply/reply/agent-runner-execution.ts
Line: 128-194
Comment:
**Duplicate GPT-5 terminal classification logic with subtle behavioral differences**
`classifyEmbeddedTerminalResultForFallback` here reimplements the same classification that `classifyEmbeddedPiRunResultForModelFallback` in `result-fallback-classifier.ts` provides, but with subtle divergences:
- Plan-only detection: this file uses `errorText.includes("Agent stopped after repeated plan-only turns")` (case-sensitive substring), while `result-fallback-classifier.ts` uses `/Agent stopped after repeated plan-only turns/i` (case-insensitive regex).
- Side-effect guards: this file additionally checks `directlySentBlockKeys.size > 0` and inspects `isSilentReplyText`/`isSilentReplyPrefixText`, which are absent from the shared classifier.
The mismatch in string matching means a lowercase variant of the plan-only message would trigger a fallback in `followup-runner` but not in `agent-runner-execution`. Consider unifying these by extending `classifyEmbeddedPiRunResultForModelFallback` to accept an optional `directlySentBlockKeys` context, or extracting the shared core into a common function both can delegate to.
How can I resolve this? If you propose a fix, please make it concise.Reviews (1): Last reviewed commit: "fix: harden gpt-5.4 runtime paths" | Re-trigger Greptile |
There was a problem hiding this comment.
Pull request overview
Hardens several GPT‑5.4/Codex runtime paths across embedded Pi, CLI harnesses, provider transports, session delivery, and status/reporting so terminal “successful” but unusable results can advance through configured fallbacks and runtime surfaces stay consistent.
Changes:
- Add result classification hooks to model fallback (and GPT‑5 terminal-result detection) so empty/reasoning-only/plan-only embedded runs can trigger fallbacks.
- Normalize OpenAI/Codex transport/tool-schema behavior and improve status output (runner label + fast-mode label + thinking-default alignment).
- Improve operational robustness across sessions, plugin install allowlists, channel catalogs, and Azure OpenAI image-generation routing.
Reviewed changes
Copilot reviewed 100 out of 100 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| test/official-channel-catalog.test.ts | Makes catalog tests tolerant to additional official entries. |
| src/status/status-text.ts | Uses explicit thinking default and aligns resolved think fallback order. |
| src/status/status-message.ts | Adds Runner: line and simplifies fast-mode label to Fast. |
| src/status/status-message.test.ts | Adds unit tests for fast-mode label behavior. |
| src/plugins/provider-runtime.ts | Passes provider id into GPT‑5 prompt overlay resolution. |
| src/plugins/provider-runtime.test.ts | Tests OpenAI personality fallback scoping for GPT‑5 providers. |
| src/plugins/provider-install-catalog.ts | Relaxes trusted npmSpec exposure rules for config/bundled origins. |
| src/plugins/provider-install-catalog.test.ts | Adds coverage for unpinned trusted npm specs. |
| src/plugins/contracts/boundary-invariants.test.ts | Adds invariants to keep live provider config lookups on runtime config. |
| src/plugin-sdk/runtime-config-snapshot.ts | Exposes clear/set runtime config snapshot APIs via SDK. |
| src/infra/package-dist-inventory.ts | Centralizes legacy QA channel runtime-api path constant. |
| src/infra/npm-update-compat-sidecars.ts | Exports legacy QA channel runtime-api sidecar path and reuses it. |
| src/gateway/model-pricing-cache.ts | Extends pricing fetch timeout and defers bootstrap refresh via microtask. |
| src/gateway/model-pricing-cache.test.ts | Tests deferred bootstrap refresh and updated timeout logging text. |
| src/gateway/gateway-codex-harness.live.test.ts | Tweaks live probe instructions for shell-tool execution. |
| src/gateway/gateway-codex-harness.live-helpers.ts | Recognizes missing codex PATH fallback text. |
| src/gateway/gateway-codex-harness.live-helpers.test.ts | Adds tests for missing codex PATH fallback acceptance. |
| src/gateway/gateway-cli-backend.live.test.ts | Adds request/agent timeouts and CI-safe Codex probe skip gate. |
| src/gateway/gateway-acp-bind.live.test.ts | Refines retry/timeout handling for ACP bind live assertions. |
| src/config/sessions/store.ts | Preserves active session key during maintenance; route updates preserve activity timestamps. |
| src/config/sessions/store-maintenance.ts | Adds preserveKeys support to prune/cap maintenance operations. |
| src/config/sessions.test.ts | Updates expectations and adds regression test for updateLastRoute not bumping updatedAt. |
| src/config/bundled-channel-config-metadata.generated.ts | Updates generated channel schema metadata (toolProgress + execApprovals + policies). |
| src/commands/onboarding-plugin-install.ts | Allows onboarding npm installs for trusted registry specs without strict pins. |
| src/commands/onboarding-plugin-install.test.ts | Updates onboarding tests for relaxed npm spec requirements. |
| src/cli/plugins-install-persist.ts | Adds installed plugin id to existing plugins.allow list before enabling. |
| src/cli/plugins-install-persist.test.ts | Tests allowlist augmentation behavior during install persistence. |
| src/channels/plugins/message-action-discovery.ts | Filters cross-channel advertised actions when schema visibility is current-channel only. |
| src/channels/plugins/contracts/channel-catalog.contract.test.ts | Adds contract coverage for WeCom channel catalog entry. |
| src/channels/plugins/catalog.ts | Loads built-in official external channel catalog JSON plus file-based official catalog. |
| src/auto-reply/thinking.ts | Raises implicit reasoning defaults to “medium” and remaps to supported level. |
| src/auto-reply/thinking.test.ts | Updates tests for new implicit default + remapping behavior. |
| src/auto-reply/status.test.ts | Extends /status tests for runner label + fast-mode visibility rules. |
| src/auto-reply/reply/model-selection.ts | Hydrates runtime catalog metadata for thinking when allowlist entries omit reasoning. |
| src/auto-reply/reply/model-selection.test.ts | Adds tests for implicit thinking default + runtime hydration behavior. |
| src/auto-reply/reply/followup-runner.ts | Classifies embedded results for fallback and avoids silently dropping followups. |
| src/auto-reply/reply/followup-runner.test.ts | Updates tests for dispatcher fallback behavior when origin routing fails/is incomplete. |
| src/auto-reply/reply/commands-types.ts | Adds resolvedFastMode to command handler params. |
| src/auto-reply/reply/commands-info.ts | Forwards resolved fast mode into /status reply build. |
| src/auto-reply/reply/commands-info.test.ts | Tests forwarding of resolved fast mode into /status. |
| src/auto-reply/reply/agent-runner-execution.ts | Adds GPT‑5 embedded terminal-result fallback classification + auth-profile alias normalization. |
| src/auto-reply/reply/agent-runner-execution.test.ts | Adds tests for plan-only/silent/streamed-block classification behavior. |
| src/auto-reply/reply/agent-runner-auth-profile.ts | Normalizes provider ids for auth-profile scoping across aliases. |
| src/agents/tools/session-status-tool.ts | Aligns status tool thinking-default resolution with configured/runtime catalogs. |
| src/agents/tools/message-tool.ts | Uses cross-channel schema-supported action listing to avoid hidden params. |
| src/agents/tools/message-tool.test.ts | Tests that cross-channel actions with current-channel-only schema are not advertised. |
| src/agents/provider-auth-aliases.ts | Dedupes/centralizes alias selection and treats deprecated auth choice ids as aliases. |
| src/agents/provider-auth-aliases.test.ts | Adds tests for deprecated auth choice ids mapping to provider auth key. |
| src/agents/pi-embedded-runner/run/attempt.ts | Preserves orphaned user payloads and conditionally removes leaf based on preservation. |
| src/agents/pi-embedded-runner/run/attempt.test.ts | Adds coverage for structured orphan preservation and removeLeaf behavior. |
| src/agents/pi-embedded-runner/run/attempt.prompt-helpers.ts | Extracts structured content into prompt text; returns removeLeaf decision. |
| src/agents/pi-embedded-runner/result-fallback-classifier.ts | New classifier for embedded Pi GPT‑5 terminal results. |
| src/agents/pi-embedded-runner/extra-params.ts | Extends parallel_tool_calls injection to openai-codex-responses API. |
| src/agents/pi-embedded-runner-extraparams.test.ts | Adds tests for Codex Responses parallel tool call injection. |
| src/agents/openclaw-tools.session-status.test.ts | Adds session-status tool tests for implicit fallback keys and thinking defaults. |
| src/agents/openai-transport-stream.ts | Normalizes tool parameters even when strict omitted; adds diagnostics when strict downgraded. |
| src/agents/openai-transport-stream.test.ts | Adds tests for responses tool param normalization and strict downgrade behavior. |
| src/agents/openai-tool-schema.ts | Adds strict schema diagnostics helpers and violation discovery. |
| src/agents/model-thinking-default.ts | Switches thinking-default import to runtime thinking.ts. |
| src/agents/model-selection.test.ts | Updates tests to reflect default thinking level changes. |
| src/agents/model-fallback.ts | Adds optional result-classification hook to drive fallback progression on terminal “ok” results. |
| src/agents/model-fallback.test.ts | Adds tests for fallback progression via result classification. |
| src/agents/gpt5-prompt-overlay.ts | Scopes OpenAI plugin personality fallback to OpenAI-family GPT‑5 providers. |
| src/agents/command/attempt-execution.ts | Normalizes provider ids for auth-profile override compatibility across aliases. |
| src/agents/command/attempt-execution.cli.test.ts | Adds Codex CLI alias coverage for auth-profile propagation. |
| src/agents/auth-profiles/session-override.ts | Matches session auth profiles to providers using auth-alias normalization. |
| src/agents/auth-profiles/session-override.test.ts | Tests session override preservation under CLI provider aliasing. |
| scripts/write-official-channel-catalog.mjs | Seeds generated catalog with built-in external entries + additional install metadata. |
| scripts/test-live-cli-backend-docker.sh | Defaults CI-safe Codex config for codex-cli live tests and prints it. |
| scripts/test-built-bundled-channel-entry-smoke.mjs | Improves error reporting when bundled entries fail to import. |
| scripts/lib/official-external-channel-catalog.json | Adds built-in external catalog entry for WeCom plugin. |
| scripts/lib/docker-e2e-logs.sh | Normalizes TMPDIR handling and mktemp template usage. |
| scripts/e2e/plugins-docker.sh | Adjusts mktemp template usage for run logs. |
| scripts/e2e/parallels-macos-smoke.sh | Improves Discord smoke visibility checks and config key naming. |
| scripts/e2e/npm-onboard-channel-agent-docker.sh | Adjusts mktemp template usage for run logs. |
| extensions/voice-call/src/manager/store.ts | Tracks pending append writes and adds test flush helper. |
| extensions/voice-call/src/manager/events.test.ts | Awaits pending persist writes before removing test store directory. |
| extensions/telegram/src/bot/helpers.ts | Adds bounded TTL cache for forum flag lookups. |
| extensions/telegram/src/bot/helpers.test.ts | Adds cache reset and cache behavior tests for forum flag resolution. |
| extensions/telegram/src/bot.create-telegram-bot.test.ts | Resets forum flag cache before bot tests. |
| extensions/telegram/src/bot-native-commands.test.ts | Resets forum flag cache before native command tests. |
| extensions/qa-lab/src/live-transports/telegram/telegram-live.runtime.ts | Records batch observation time for live Telegram probe RTT reporting. |
| extensions/openai/image-generation-provider.ts | Adds Azure OpenAI image endpoint detection + auth/header/url shaping. |
| extensions/openai/image-generation-provider.test.ts | Adds Azure image-generation routing tests (hosts + api-version override). |
| extensions/discord/subagent-hooks-api.ts | Removes re-exports from subagent hooks API surface. |
| extensions/discord/src/monitor/thread-bindings.lifecycle.test.ts | Switches to runtime-config snapshot SDK entrypoint. |
| extensions/discord/src/monitor/message-handler.ts | Updates SDK import for runtime group policy resolution. |
| extensions/discord/src/monitor/message-handler.process.ts | Splits SDK imports across new runtime entrypoints. |
| extensions/discord/src/monitor/message-handler.process.test.ts | Updates mocks to new session-store runtime SDK module. |
| extensions/codex/provider.ts | Uses runtime snapshot plugin config for discovery toggles. |
| extensions/codex/provider.test.ts | Tests live config re-enabling discovery after startup disable. |
| docs/tools/thinking.md | Documents /status fast-mode label behavior. |
| docs/tools/plugin.md | Documents allowlist augmentation on plugin install. |
| docs/tools/image-generation.md | Links to Azure OpenAI endpoint docs for image generation. |
| docs/providers/openai.md | Adds Azure OpenAI image endpoint configuration documentation. |
| docs/plugins/sdk-setup.md | Updates onboarding guidance for registry npm specs and optional integrity pins. |
| docs/plugins/manifest.md | Updates manifest docs for unpinned npm specs + optional integrity. |
| docs/.generated/config-baseline.sha256 | Updates config baseline hashes. |
| CHANGELOG.md | Documents new runner label, thinking/fast-mode/status changes, and Azure image support. |
| .agents/skills/openclaw-release-maintainer/SKILL.md | Updates release guidance around beta tag handling and release notes completeness. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f184258184
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
f184258 to
3d385a3
Compare
Summary
This PR hardens the GPT-5.4 embedded-agent hot path after auditing
v2026.4.22. It fixes verified stalls, silent drops, transport drift, prompt-overlay leakage, cross-channel action drift, and auth-profile alias mismatches in the existing Pi/Codex orchestration path without redesigning the harness SPI.This is the point-fix PR. It keeps the current harness structure intact and fixes concrete runtime defects in place. The follow-up additive extension-seam work is in #70772.
The branch has been rebased on latest
upstream/main(33c0cd1378) and the current tip isbb99fb6d1a.Runtime Routing Map
Selecting GPT-5.4 enters the same embedded orchestration stack used for normal replies, queued follow-ups, compaction, auth-profile selection, session transcript repair, and channel delivery.
openai/*andopenai-codex/*still use the built-in Pi/OpenAI path.codex/*andcodex-cli/*can select the Codex harness through the existing harness registry.Failure Classes Fixed
NO_REPLY, true final failures, and tool side-effect terminal states.src/agents/model-fallback.ts,src/agents/pi-embedded-runner/result-fallback-classifier.ts,src/auto-reply/reply/agent-runner-execution.ts,src/auto-reply/reply/followup-runner.tstoolSummary, so the classifier could not always tell that a generic tool already ran.toolSummaryis built once fromattempt.toolMetasand propagated through timeout, block, reasoning-only, incomplete-turn, and success metadata.src/agents/pi-embedded-runner/run.ts,src/agents/model-fallback.run-embedded.e2e.test.tsparallel_tool_callswas injected for OpenAI Responses/Completions but skippedopenai-codex-responses, including compaction/runtime wrapper paths.parallel_tool_calls; explicit overrides still win.src/agents/provider-api-families.ts,src/agents/pi-embedded-runner/extra-params.tsfalse; explicit config may still opt in. Pooling remains follow-up/gated work.src/agents/pi-embedded-runner/extra-params.ts, extra-param testssrc/agents/openai-tool-schema.ts,src/agents/openai-transport-stream.tsokintoken.src/agents/pi-embedded-runner/run/attempt.prompt-helpers.ts,src/agents/pi-embedded-runner/run/attempt.tssrc/auto-reply/reply/followup-runner.tsactions: []was treated like an omitted allowlist.src/channels/plugins/message-action-discovery.ts,src/channels/plugins/message-actions.test.tssrc/agents/gpt5-prompt-overlay.ts,src/plugins/provider-runtime.tscodex-cli/gpt-5.4,openai-codex/*, session overrides, CLI handoff, and embedded runner lock checks could compare different provider strings for the same auth profile family.openai-codexprofiles remain locked acrosscodex-clihandoff and embedded execution.src/agents/provider-auth-aliases.ts, embedded runner, session override, command handoff, CLI bridgeauth.order.<provider> = []must still mean "use no stored profiles".src/agents/auth-profiles/order.ts, auth order testsGPT-5.4 Fallback Flow
sequenceDiagram participant Runner as AutoReply/FollowUp Runner participant MF as runWithModelFallback participant ER as Embedded Runner participant H as Selected Harness participant C as Shared Classifier participant Next as Fallback Candidate Runner->>MF: provider/model + fallback list MF->>ER: attempt primary model ER->>H: runAttempt H-->>ER: terminal result + attempt metadata ER-->>MF: payloads + meta.toolSummary MF->>C: classify result alt empty/reasoning-only/planning-only and no side effects C-->>MF: FailoverError(format) MF->>Next: advance configured fallback else abort/block/visible reply/NO_REPLY/tool side effect C-->>MF: null MF-->>Runner: preserve normal terminal behavior endChannel, Session, And Auth Delivery Flow
flowchart TD Leaf["Existing session leaf is user"] --> Extract["Extract text, structured parts, and media refs"] Extract --> Empty{"Extracted prompt text?"} Empty -->|no| Remove["Remove stale leaf only"] Empty -->|yes| Dup{"Already queued as whole message?"} Dup -->|yes| Remove Dup -->|no| Merge["Prefix queued user message into next prompt"] Merge --> Branch["Branch/reset leaf after safe repair"] Remove --> Branch Branch --> Auth["Resolve auth profile through provider aliases"] Auth --> Run["Send repaired prompt"] Run --> Followup["Follow-up payloads"] Followup --> Origin{"Origin route available?"} Origin -->|yes| Route["Try originating channel"] Route -->|all fail cross-channel| Notice["One generic local delivery-failure notice"] Route -->|same-provider failure| Dispatcher["Safe local dispatcher fallback"] Route -->|any success| Done["No misleading failure notice"] Origin -->|no| DispatcherSafety Boundaries
This PR does not move Pi out of the built-in fallback role, does not redesign
AgentHarness, does not introduce user-facing config changes, and does not change the public wire format. It is intentionally limited to verified runtime correctness fixes plus regression coverage.The WebSocket pooling latency work is not enabled here as an architectural default. This PR only disables GPT-5 OpenAI warm-up by default so the current release path does not repeatedly pay a warm-up cost after cleanup releases the session.
Related Work And Issue Map
This PR intentionally does not use
Closes:for broad GPT-5.4/Codex tickets unless the exact reported scenario is covered. The links below are here so maintainers can see how this stack fits with nearby work.codex-cli/gpt-5.4follow-up instability. This PR helps by normalizing auth aliases and preventing successful follow-up payload drops.parallel_tool_callspayload consistency for OpenAI/OpenAI-Codex paths.body.reasoningwhen OpenAI/Codex Responses payloads start withreasoning: undefined.Live Search Additions (2026-04-24)
I re-ran live GitHub search across GPT-5.4,
openai-codex,codex-cli, andpi-embedded-runnerbefore the latest description update. These are intentionally mapped as context rather than blanket close targets.parallel_tool_calls, HTTP Responses schema normalization, WS warm-up default, and terminal classification. Does not claim to fix Cloudflare/base-url/network failures.Latest Validation
Post-rebase verification on the final branch:
upstream/main(33c0cd1378) after the maintainer GPT-5.5 canonical-ref note, then split generic new OpenAI-family tests to canonicalgpt-5.5while leavinggpt-5.4/codex-clirefs only as explicit regression or legacy-compat coverage.node scripts/run-vitest.mjs run --config test/vitest/vitest.auto-reply.config.ts src/auto-reply/reply/agent-runner-execution.test.ts src/auto-reply/reply/followup-runner.test.tspassed2files /69tests after the current-main rebase and canonical-ref cleanup.node scripts/run-vitest.mjs run --config test/vitest/vitest.agents.config.ts src/agents/openai-transport-stream.test.ts src/agents/pi-embedded-runner-extraparams.test.ts src/agents/model-fallback.test.ts src/agents/command/attempt-execution.cli.test.ts src/agents/agent-command.live-model-switch.test.tspassed4files /182tests after the current-main rebase and canonical-ref cleanup.node scripts/run-vitest.mjs run --config test/vitest/vitest.plugins.config.ts src/plugins/provider-runtime.test.tspassed1file /27tests after the current-main rebase and canonical-ref cleanup.node scripts/run-vitest.mjs run --config test/vitest/vitest.auto-reply.config.ts src/auto-reply/reply/agent-runner-execution.test.ts src/auto-reply/reply/followup-runner.test.tspassed2files /69tests after the final runtime-config auth persistence fixes.node scripts/run-vitest.mjs run --config test/vitest/vitest.agents.config.ts src/agents/command/attempt-execution.cli.test.ts src/agents/pi-embedded-runner-extraparams.test.ts src/agents/pi-embedded-runner-extraparams-resolve.test.ts src/agents/model-fallback.test.ts src/agents/auth-profiles/order.test.ts src/agents/auth-profiles.resolve-auth-profile-order.uses-stored-profiles-no-config-exists.test.ts src/agents/auth-profiles/session-override.test.ts src/agents/provider-auth-aliases.test.ts src/agents/agent-command.live-model-switch.test.tspassed7files /192tests.node scripts/run-vitest.mjs run --config test/vitest/vitest.auto-reply.config.ts src/auto-reply/reply/followup-runner.test.tspassed1file /23tests.node scripts/run-vitest.mjs run --config test/vitest/vitest.e2e.config.ts src/agents/model-fallback.run-embedded.e2e.test.tspassed1file /17tests.Earlier focused/broad local verification on this PR also covered:
pnpm lintpnpm tsgo:core:testnode scripts/run-vitest.mjs run --config test/vitest/vitest.full-core-support-boundary.config.ts test/scripts/lint-suppressions.test.tsnode scripts/run-vitest.mjs run --config test/vitest/vitest.auto-reply.config.ts src/auto-reply/reply/agent-runner-execution.test.ts src/auto-reply/reply/followup-runner.test.tsnode scripts/run-vitest.mjs run --config test/vitest/vitest.agents.config.ts src/agents/model-fallback.test.ts src/agents/pi-embedded-runner/run/attempt.test.ts src/agents/pi-embedded-runner-extraparams.test.ts src/agents/openai-transport-stream.test.ts src/agents/auth-profiles/session-override.test.ts src/agents/auth-profiles/order.test.ts src/agents/command/attempt-execution.cli.test.ts src/agents/provider-auth-aliases.test.ts src/agents/tools/message-tool.test.ts src/agents/agent-command.live-model-switch.test.ts src/plugins/provider-runtime.test.tsnode scripts/run-vitest.mjs run --config test/vitest/vitest.channels.config.ts src/channels/plugins/message-actions.test.tsOPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=0 node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-messaging.config.tspnpm exec oxfmt --check <changed files>git diff --checkReview State
All previously open bot review threads on #70743 were replied to and resolved. The final review-fix commits after the latest rebase are:
2e956b19dfcloses the remaining short-text orphan duplicate-match and bounded structured fallback serialization gaps.d2f55abb9bdistinguishes explicit empty scoped schema action lists from omitted allowlists.961567766apreserves aliased embedded auth locks.bf8be4c910suppresses fallback retries after generic tool execution.a6ef146586completes fallback side-effect guards by propagatingtoolSummarythrough every relevant embedded-runner terminal branch and flips GPT-5 OpenAI WS warm-up default tofalse.35f7c348e9updates the rebased CLI attempt-execution test mock for upstream's provider auth alias-map export.10b74a4459addresses fresh bot review by keeping strippedNO_REPLYterminal turns out of fallback and preserving explicit empty auth-order overrides, including exact alias keys such ascodex-cli: [].f73022e4f4addresses fresh follow-up routing review by emitting a visible partial-delivery notice when any cross-channel payload fails, even if another payload in the same completion routes successfully.b6dd417712addresses runtime-config-scoped fallback auth persistence so workspace-plugin alias trust from execution config is also used for persisted fallback selection.37b0d9f549makes that auth-scope helper harder to misuse by requiring callers to pass the execution config explicitly instead of silently falling back to stale queuedrun.config.bb99fb6d1aresponds to the maintainer GPT-5.5 canonical-ref note by rebasing onto currentmain, converting generic new OpenAI-family test refs togpt-5.5, and documenting remaininggpt-5.4/codex-clirefs as intentional regression or legacy-compat coverage.Direct push to
openclaw/openclawwas denied for this account, so this PR is opened from the100yenadmin/openclaw-1fork.