Skip to content

fix(runtime): snapshot tool definitions#90411

Closed
vincentkoc wants to merge 157 commits into
mainfrom
fuzz-tool-schema-next220-20260604
Closed

fix(runtime): snapshot tool definitions#90411
vincentkoc wants to merge 157 commits into
mainfrom
fuzz-tool-schema-next220-20260604

Conversation

@vincentkoc

@vincentkoc vincentkoc commented Jun 4, 2026

Copy link
Copy Markdown
Member

Summary

  • Quarantine active tool schemas before provider normalization so a hostile plugin schema is dropped/logged while serializable, parameter-free, and healthy sibling tools still reach hooks and provider setup.
  • Guard Plugin SDK provider-family tool schema hooks so hostile nested schemas cannot crash Gemini, DeepSeek, or OpenAI schema inspection/normalization before healthy tools dispatch.
  • Guard agent-end Skill Research auto-capture warning formatting so hostile side-effect failures cannot block plugin agent_end completion.
  • Guard harness lifecycle/tool/prompt/compaction hook warning paths so hostile plugin hook failures stay non-fatal.
  • Guard built-in ls/write file tool error normalization so hostile filesystem/backend failures cannot crash tool error reporting or write prechecks.
  • Guard built-in edit/find session tool error normalization so hostile backend failures cannot crash tool error reporting.
  • Guard session auth/settings storage error recorders so hostile backend load/write failures cannot crash startup diagnostics.
  • Harden shared infra error formatting so doctor, plugin SDK, gateway, and runtime diagnostics cannot crash on hostile thrown values.
  • Drop hostile bundle-MCP normalized error causes so contained connection/catalog failures cannot crash later logging or inspection.
  • Guard MCP stdio transport error normalization so hostile subprocess parse/write failures cannot crash error reporting.
  • Guard bundle-MCP connection error normalization so hostile transport rejections cannot crash startup failure handling.
  • Guard bundle-MCP tools/list error classification so hostile MCP rejection values cannot crash optional catalog loading.
  • Guard shared transport stream error formatting so hostile provider transport failures emit sanitized assistant error events instead of crashing finalization.
  • Guard Plugin SDK provider stream error formatting so hostile stream failures emit sanitized assistant error events instead of crashing the wrapper.
  • Guard inline extension factory failure formatting so hostile factory errors are recorded as load errors instead of crashing resource reload.
  • Guard session beforeToolCall metadata failure formatting so hostile tool-call descriptors fail closed without crashing the session boundary.
  • Guard extension load failure formatting so hostile factory/module errors report as per-extension load errors instead of crashing the loader.
  • Guard session-side extension command, skill-expansion, and runtime-helper error formatting so hostile plugin failures cannot crash the session error bus.
  • Guard extension runner handler/provider error formatting so hostile plugin failures report safely, with tool_call failures staying fail-closed.
  • Guard session ToolDefinition and base AgentTool snapshot warning formatting so hostile schema failures cannot crash malformed-tool quarantine.
  • Guard before_tool_call hook, approval, and loop-outcome error formatting so hostile thrown values cannot bypass fail-closed tool blocking or non-fatal warning paths.
  • Guard Code Mode host bridge and worker error formatting so hostile thrown values cannot crash structured code-mode failures.
  • Guard Agent Core harness error normalization so hostile non-Error values with throwing JSON/string conversion cannot crash typed error cause creation.
  • Guard Agent Core tool-snapshot warning formatting so hostile non-Error accessor failures cannot crash quarantine while reporting a skipped tool.
  • Guard Agent Core tool-error stringification so hostile thrown values cannot turn recoverable tool errors into loop-level crashes.
  • Guard package-level Agent failure-message construction so hostile model identity getters cannot crash terminal error state after a run failure.
  • Guard Agent Core failure-message construction so hostile model identity getters cannot crash public agentLoop() or CoreAgentHarness terminal error reporting.
  • Guard built-in lazy provider load-error reporting so hostile api / provider / id getters cannot crash the terminal assistant error message.
  • Guard native OpenAI Codex Responses output identity so hostile provider / id getters cannot throw before the stream error path is installed.
  • Guard Anthropic transport setup/output identity so hostile provider / id / baseUrl getters cannot throw before the stream error path is installed.
  • Guard OpenAI transport output identity so hostile api / provider / id getters cannot throw before Responses, Azure Responses, or Completions stream error paths are installed.
  • Guard Google transport output identity so hostile provider / id getters cannot throw before the stream error path is installed.
  • Guard Bedrock stream setup metadata so hostile provider / id / baseUrl getters cannot throw before the stream error path is installed.
  • Guard Anthropic output identity so hostile api / provider / id getters cannot throw before the stream error path is installed.
  • Guard Mistral output identity so hostile api / provider / id getters cannot throw before the stream error path is installed.
  • Guard OpenAI Completions output identity so hostile api / provider / id getters cannot throw before the stream error path is installed.
  • Guard OpenAI Completions compat metadata so hostile optional compat accessors fall back to detected defaults for non-routing fields, while unreadable OpenRouter/Vercel routing metadata fails closed before payload dispatch.
  • Guard OpenAI strict-tool metadata so hostile model provider / api / baseUrl / id / compat accessors cannot crash strict default resolution or Responses tool conversion.
  • Guard shared model cost calculation so hostile model cost or nested cost-field accessors cannot crash usage accounting.
  • Guard shared model identity comparison so hostile model id / provider accessors cannot crash session/model-selection equality checks.
  • Guard shared thinking-level metadata so hostile model reasoning / thinkingLevelMap accessors and hostile thinking-map entries cannot crash provider reasoning setup before content.
  • Guard OpenAI Responses conversion metadata so hostile model id / provider / api / input / reasoning accessors cannot crash conversion or leak thinking when target identity is unreadable.
  • Guard Google shared conversion metadata so hostile model id / provider / api / input accessors cannot crash message conversion, output initialization, or request model naming.
  • Guard Google shared thinking model-id helpers so hostile model id accessors cannot crash Gemini/Gemma thinking-level or budget selection.
  • Guard Plugin SDK Google thinking wrapper metadata so hostile model api / id accessors cannot crash payload-hook sanitization.
  • Guard OpenAI-compatible reasoning effort metadata so hostile model id / provider / compat or compat supportedReasoningEfforts / supportsReasoningEffort / reasoningEffortMap accessors cannot crash reasoning payload setup.
  • Guard Anthropic-family payload compatibility model metadata so hostile api, compat, or requiresOpenAiAnthropicToolPayload accessors cannot crash tool-payload conversion setup.
  • Guard plugin/model-owned cache and wrapper metadata reads so hostile api / id / provider / baseUrl / contextWindow / compat accessors cannot crash extra-param, provider-policy, OpenAI, OpenRouter, or MiniMax wrapper setup before provider send.
  • Guard prompt-cache retention params so dynamic cacheRetention / cacheControlTtl accessors and inherited cache config cannot crash stream-wrapper setup or masquerade as explicit config.
  • Guard max-token alias resolution so dynamic maxTokens / max_completion_tokens / max_tokens accessors are skipped and conflicting aliases fail closed if cleanup cannot be guaranteed.
  • Guard embedded-agent extra param merge/canonicalization so dynamic config, request override, provider-runtime, extra_body, and chat_template_kwargs fields are skipped without crashing turn setup.
  • Guard OpenAI Chat Completions and Responses response_format payload copying so dynamic accessor fields fail closed and serializable schema fields keep the correct API shape.
  • Guard vLLM Qwen/Nemotron thinking payload patches against hostile accessors, preserve the chat-template serialization boundary, remove mixed-format Qwen fields, and fail closed when required cleanup cannot be guaranteed.
  • Guard Fireworks Kimi thinking-disable payload cleanup against hostile accessors, failing closed when reasoning fields cannot be removed.
  • Guard Venice DeepSeek V4 replay payload cleanup against hostile accessors, preserving nullish reasoning_content backfill while failing closed on unremovable reasoning fields.
  • Guard OpenRouter provider routing and Anthropic prefill payload cleanup against hostile accessors, with fail-closed routing when required metadata cannot be installed.
  • Guard Qwen thinking payload patches so hostile enable_thinking / chat_template_kwargs accessors are replaced safely and unremovable unsupported reasoning fields fail closed.
  • Guard SiliconFlow Pro thinking-off payload rewrites so hostile accessors are replaced with thinking: null when possible and unpatchable payloads fail closed.
  • Guard /btw payload tools cleanup so unreadable configurable tool fields are removed and unremovable fields fail closed instead of breaking the side-question turn.
  • Guard MiniMax Anthropic-compatible thinking payload patching so hostile accessors are overwritten when possible and unpatchable payloads fail closed instead of leaking reasoning.
  • Guard Moonshot thinking payload normalization so unreadable payload fields and hostile tool_choice objects cannot crash provider request shaping.
  • Guard Anthropic-family OpenAI payload compatibility so unreadable payload tool rows and tool_choice fields cannot crash conversion before provider send.
  • Guard XAI payload tool strict-flag normalization so unreadable payload tool rows are dropped while healthy function tools still have unsupported strict removed.
  • Guard Amazon Bedrock forced toolChoice name reads so unreadable forced names fail closed instead of silently dropping the forced constraint.
  • Guard shared Google provider tool declaration conversion so unreadable tool fields and hostile schemas are skipped while healthy declarations survive, and forced toolChoice: "any" fails closed when quarantine leaves no callable declarations.
  • Guard provider forced toolChoice name reads across OpenAI completions, Mistral, Anthropic, and Google so unreadable names fail closed with sanitized provider errors.
  • Guard AgentSession active-tool status readback so unreadable live state tool names are skipped instead of crashing session status APIs.
  • Guard OpenAI stream-wrapper payload tool identity reads so Code Mode filtering and Responses web_search reasoning checks ignore unreadable tool rows while preserving healthy tools.
  • Snapshot plugin command registrations through guarded field reads before validation and storage.
  • Snapshot package-level Agent state tools and prepareNextTurn replacement contexts before provider exposure, sharing the same quarantine helper with the harness path.
  • Snapshot direct agentLoop/agentLoopContinue contexts and prepareNextTurn replacement contexts before provider exposure, covering low-level runtime callers below Agent/CoreAgentHarness.
  • Guard embedded-agent runtime tool-name collection for prompt rendering, session allowlists, bundle reserved names, context metadata, and diagnostics so unreadable tool/client descriptors cannot crash pre-provider setup.
  • Guard runtime-plan/provider-normalized tool metadata copying so cloned normalized tools with unreadable names cannot crash before later quarantine and still keep same-index plugin provenance.
  • Make provider and RuntimePlan tool-schema diagnostic hooks best-effort so a broken schema inspector cannot abort the assistant turn before content.
  • Guard embedded-attempt explicit allowlist filtering so unreadable bundle/plugin tool names or throwing plugin metadata lookups cannot abort tool construction before quarantine.
  • Guard shared tool-policy metadata and name reads so inherited allowlists, plugin-group expansion, policy filtering, and audit logs fail closed without pre-content crashes.
  • Snapshot package-level CoreAgentHarness tool registries before constructor/setter exposure so malformed SDK/runtime harness tools are skipped without killing healthy active tools.
  • Snapshot core session tool definitions before embedded-agent/session registration, so malformed runtime tool descriptors are skipped without killing healthy sibling tools.
  • Snapshot session extension registrations, SDK custom tools, base-tool overrides, and ToolDefinition/AgentTool wrappers before session startup so malformed registered definitions are quarantined per tool.
  • Snapshot Copilot bridged OpenClaw tools before SDK registration, bridge filtering, and duplicate detection so malformed bridged tool metadata is quarantined per tool.
  • Snapshot realtime voice tools before provider exposure in shared Talk merging plus OpenAI and Google realtime session construction, so one malformed custom tool/schema is skipped while built-in and healthy tools survive.
  • Snapshot Mistral, Anthropic provider, native Anthropic transport, OpenAI-compatible completions, OpenAI transport-owned Responses/Chat Completions, native Ollama, Amazon Bedrock, Google prompt-cache, and Google transport request tools before SDK/provider payload construction, skip unreadable/proxy-backed schemas for normal requests, and fail closed when required provider toolChoice semantics cannot be honored after quarantine.
  • Harden the shared plain-text tool-call compatibility wrapper so unreadable tool names do not disable healthy provider stream repair.
  • Snapshot manifest-backed plugin tool schemas during live resolution and cached descriptor execution so volatile or proxy-backed plugin tool metadata cannot poison healthy sibling tools.
  • Guard implicit plugin tool registration names so a poisoned object-tool name getter cannot abort later healthy registrations from the same plugin.
  • Snapshot provider-family tool schema helpers for Gemini/OpenAI/DeepSeek compatibility so unreadable provider plugin tool metadata is quarantined per tool while normalized tools keep enumerable SDK fields.
  • Snapshot MCP plugin tool bridge metadata before before-call wrapping so unreadable plugin tool fields are quarantined per tool, poisoned execute bind accessors cannot abort the bridge, and plugin ownership metadata stays attached.
  • Project Codex dynamic tool schemas through a guarded shared helper so unreadable runtime tool metadata is quarantined before bridge construction while healthy tools still reach Codex.
  • Snapshot Codex dynamic tool names/descriptions/projected schemas before bridge wrapping so volatile descriptors cannot crash map/spec/telemetry construction after projection.
  • Snapshot shared OpenAI Responses tools before strict-mode conversion so unreadable or hostile schemas skip per tool without downgrading healthy strict-compatible tools.
  • Preserve plugin ownership in doctor and effective tool inventory quarantine warnings when pre-normalization diagnostics come from tools with unreadable names.
  • Quarantine malformed client-hosted tool descriptors before conflict checks, tool-search allowlist planning, bundle reserved-name reservation, and session conversion so invalid hosted tools cannot count as callable or crash startup while healthy siblings survive.
  • Guard system prompt report tool metadata reads so unreadable tool descriptors or hostile schema property getters cannot abort turn metadata generation.
  • Guard Codex app-server system prompt report dynamic-tool metadata reads so unreadable specs cannot abort Codex attempt metadata generation.
  • Guard Codex app-server thread lifecycle dynamic-tool metadata reads so malformed specs cannot abort fingerprinting, deferred-tool continuity, or developer instruction rendering.
  • Guard Codex dynamic tool filtering name reads so volatile plugin-owned names cannot abort Codex-owned exclusions, memory-flush filters, sandbox/node shell alias lookup, or explicit allowlists.
  • Guard Codex workspace memory tool detection so unreadable dynamic tool names cannot abort workspace bootstrap routing.
  • Guard Codex vision-input dynamic tool filtering so volatile plugin-owned names cannot abort image-tool removal before provider projection.
  • Guard Codex model-call diagnostic tool-definition capture so unreadable tool metadata cannot abort private telemetry setup before the assistant turn.
  • Guard Codex context-engine available-tool set construction so unreadable dynamic tool names cannot abort context assembly.
  • Guard Codex trajectory context tool-definition capture so optional sidecar recording cannot crash on hostile tool metadata.
  • Guard Copilot SDK session tool catalog construction so malformed bridge output is skipped before createSession/resumeSession.
  • Guard prompt-cache observability tool-name collection so optional diagnostics skip unreadable or non-string tool names before provider setup.
  • Guard CLI system-prompt and bundle-MCP reusable-session tool-name collection so malformed loopback/runtime tools cannot abort CLI run preparation.
  • Guard message-provider tool policy filtering so unreadable runtime tool names are skipped fail-closed while healthy duplicate tools preserve order.
  • Guard gateway HTTP/loopback scoped tool-name filtering so malformed tool descriptors are skipped before deny/exclusion matching.
  • Guard gateway tool catalog plugin metadata projection so malformed plugin descriptors cannot abort Control UI/client catalog assembly.
  • Guard MCP loopback advertised schema-name checks so hostile schema entries cannot abort tools/call availability checks.
  • Guard Tool Search catalog compaction, direct fallback filtering, and client-tool appends so unreadable tool names are skipped while healthy catalog tools remain searchable/callable.
  • Guard trajectory runtime tool-definition capture so unreadable sidecar metadata is skipped without aborting optional runtime recording.
  • Guard plugin descriptor-cache capture so hostile optional metadata is ignored, unreadable required descriptor fields are not cached, and cache warmup cannot change malformed-tool visibility.
  • Guard effective inventory and doctor-style display metadata so unreadable tool names are skipped and hostile label/description/summary getters cannot abort inventory rendering.
  • Guard bundled MCP effective-inventory display metadata so hostile MCP tool names or display getters cannot abort gateway/Control UI inventory rendering.
  • Guard Plugin SDK defineToolPlugin() returned tool definitions so malformed SDK entries are skipped before static metadata and runtime registration while empty descriptions remain valid.
  • Guard bundled capability runtime captured tool names so malformed runtime artifacts are diagnosed per tool while healthy captured tools still register.
  • Guard bundle-MCP tools/list catalog snapshots so malformed MCP tool names or schemas cannot abort healthy sibling materialization.
  • Guard bundle-MCP catalog materialization so hostile loaded catalog rows cannot abort healthy sibling agent-tool creation.
  • Guard code-mode MCP namespace catalog projection so hostile MCP catalog rows cannot abort prompt docs, virtual API files, or namespace runtime creation before healthy siblings remain callable.
  • Guard before-tool-call wrapping so unreadable tool identity/execution metadata fails closed and hostile optional wrapper metadata cannot corrupt policy wrapping.
  • Snapshot agent tool definition execute handlers before session exposure so unreadable or non-callable executors are quarantined before hooks/model-facing definitions.
  • Guard abort-signal wrapping so unreadable executors defer to later quarantine and hostile metadata enumeration cannot abort run-abort setup.
  • Guard deferred follow-up description rewriting so unreadable tool names and hostile metadata enumeration cannot abort prompt guidance adjustment.
  • Guard restrictive tool-name filters so managed web-search suppression, local-model lean filtering, and memory-flush filtering drop unreadable descriptors instead of crashing or failing open.
  • Guard Code Mode catalog filtering so unreadable tool names are dropped before compaction instead of crashing exec/wait setup.
  • Guard OpenAI strict-schema diagnostics and strict-flag resolution so unreadable tool names/parameters downgrade safely instead of crashing setup.
  • Guard OpenAI Responses payload tool-name inspection so debug summaries and Code Mode exec/wait enforcement ignore hostile payload rows instead of throwing.
  • Guard OpenAI native web-search payload patching so hostile tool identity rows are dropped while healthy tools survive and native search is still injected.

Verification

  • 8e1faccc4fa: active tool schema-normalization quarantine passed focused proof:

    • ./node_modules/.bin/oxfmt --check src/agents/agent-tools.ts src/agents/agent-tools.create-openclaw-coding-tools.test.ts src/agents/tool-schema-projection.ts src/agents/tool-schema-projection.test.ts src/agents/tools-effective-inventory.ts src/agents/tools-effective-inventory-build.ts src/agents/tools-effective-inventory.test.ts src/commands/doctor/shared/active-tool-schema-warnings.ts src/commands/doctor/shared/active-tool-schema-warnings.test.ts
    • OPENCLAW_OXLINT_SKIP_PREPARE=1 node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/agent-tools.ts src/agents/agent-tools.create-openclaw-coding-tools.test.ts src/agents/tool-schema-projection.ts src/agents/tool-schema-projection.test.ts src/agents/tools-effective-inventory.ts src/agents/tools-effective-inventory-build.ts src/agents/tools-effective-inventory.test.ts src/commands/doctor/shared/active-tool-schema-warnings.ts src/commands/doctor/shared/active-tool-schema-warnings.test.ts
    • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-tools.create-openclaw-coding-tools.test.ts src/agents/tool-schema-projection.test.ts src/agents/tools-effective-inventory.test.ts src/commands/doctor/shared/active-tool-schema-warnings.test.ts --reporter=dot passed 3 shards, 4 files, 105 tests.
    • .agents/skills/autoreview/scripts/autoreview --mode local passed with overall: patch is correct (0.82).
    • Full oxlint wrapper prepare and broad Crabbox/Testbox proof were not run because local disk remained below the 1.00 GiB sparse-sync floor; focused proof ran after clearing generated/cache artifacts, with final free disk at 321 MiB.
  • latest Plugin SDK provider tool-schema hook slice passed src/plugin-sdk/provider-tools.test.ts with 15 tests; latest focused oxfmt, oxlint, SDK API baseline check, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/plugin-sdk/provider-tools.test.ts --reporter=dot

  • broad OPENCLAW_TESTBOX=1 ... pnpm check:changed proof was not retried after this push because local free disk is 259 MiB, below the Crabbox sparse-sync wrapper's 1.00 GiB safety floor.

  • latest agent-end side-effect error slice passed src/agents/harness/agent-end-side-effects.test.ts with 3 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/harness/agent-end-side-effects.test.ts --reporter=dot

  • broad OPENCLAW_TESTBOX=1 ... pnpm check:changed proof was not retried after this push because local free disk is 343 MiB, below the Crabbox sparse-sync wrapper's 1.00 GiB safety floor.

  • latest harness hook error slice passed src/agents/harness/lifecycle-hook-helpers.test.ts, src/agents/harness/prompt-compaction-hook-helpers.test.ts, and src/agents/harness/hook-helpers.test.ts with 19 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/harness/lifecycle-hook-helpers.test.ts src/agents/harness/prompt-compaction-hook-helpers.test.ts src/agents/harness/hook-helpers.test.ts --reporter=dot

  • broad OPENCLAW_TESTBOX=1 ... pnpm check:changed proof was not retried after this push because local free disk is 415 MiB, below the Crabbox sparse-sync wrapper's 1.00 GiB safety floor.

  • latest built-in file tool error slice passed src/agents/sessions/tools/ls.test.ts, src/agents/sessions/tools/write.test.ts, and src/plugin-sdk/tool-plugin.test.ts with 18 tests after rebasing onto current origin/main; latest focused oxfmt, SDK API baseline check, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/sessions/tools/ls.test.ts src/agents/sessions/tools/write.test.ts src/plugin-sdk/tool-plugin.test.ts --reporter=dot

  • broad OPENCLAW_TESTBOX=1 ... pnpm check:changed proof was not retried after this push because local free disk is 483 MiB, below the Crabbox sparse-sync wrapper's 1.00 GiB safety floor.

  • latest built-in session tool error slice passed src/agents/sessions/tools/edit.test.ts and src/agents/sessions/tools/find.test.ts with 9 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/sessions/tools/edit.test.ts src/agents/sessions/tools/find.test.ts --reporter=dot

  • broad OPENCLAW_TESTBOX=1 ... pnpm check:changed proof was not retried after this push because local free disk is 610 MiB, below the Crabbox sparse-sync wrapper's 1.00 GiB safety floor.

  • latest session storage error-recorder slice passed src/agents/sessions/auth-storage.test.ts and src/agents/sessions/settings-manager.test.ts with 5 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/sessions/auth-storage.test.ts src/agents/sessions/settings-manager.test.ts --reporter=dot

  • broad OPENCLAW_TESTBOX=1 ... pnpm check:changed proof was not retried after this push because local free disk is 638 MiB, below the Crabbox sparse-sync wrapper's 1.00 GiB safety floor.

  • latest shared infra error formatter slice passed src/infra/errors.test.ts with 28 tests; latest focused oxfmt, oxlint, git diff --check, and final autoreview passed after staging safe field copies before assignment.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/infra/errors.test.ts --reporter=dot

  • broad OPENCLAW_TESTBOX=1 ... pnpm check:changed proof was not retried after this push because local free disk is 706 MiB, below the Crabbox sparse-sync wrapper's 1.00 GiB safety floor.

  • latest bundle-MCP normalized error-cause slice passed src/agents/agent-bundle-mcp-runtime.test.ts with 33 tests; latest focused oxfmt, oxlint, git diff --check, and final autoreview passed after covering the actual fallback branch.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-bundle-mcp-runtime.test.ts --reporter=dot

  • broad OPENCLAW_TESTBOX=1 ... pnpm check:changed proof was not retried after this push because local free disk is 795 MiB, below the Crabbox sparse-sync wrapper's 1.00 GiB safety floor.

  • latest MCP stdio transport error slice passed src/agents/mcp-stdio-transport.test.ts with 9 tests; latest focused oxfmt, oxlint, git diff --check, and final autoreview passed after dropping hostile Error.cause.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/mcp-stdio-transport.test.ts --reporter=dot

  • broad OPENCLAW_TESTBOX=1 ... pnpm check:changed proof was not retried after this push because local free disk is 857 MiB, below the Crabbox sparse-sync wrapper's 1.00 GiB safety floor.

  • latest bundle-MCP connection-error slice passed src/agents/agent-bundle-mcp-runtime.test.ts with 33 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-bundle-mcp-runtime.test.ts --reporter=dot

  • broad OPENCLAW_TESTBOX=1 ... pnpm check:changed proof was not retried after this push because local free disk is 941 MiB, below the Crabbox sparse-sync wrapper's 1.00 GiB safety floor.

  • latest bundle-MCP error-classification slice passed src/agents/agent-bundle-mcp-runtime.test.ts with 32 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-bundle-mcp-runtime.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-bundle-mcp-error-classification --shell -- "pnpm check:changed" selected provider=azure but did not reach lease allocation because the local sparse-sync safety check found only 985.3 MiB free and requires at least 1.00 GiB.

  • latest transport stream error-formatting slice passed src/agents/transport-stream-shared.test.ts with 11 tests; latest focused oxfmt, oxlint, git diff --check, and final autoreview passed after addressing the proxy instanceof finding.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/transport-stream-shared.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-transport-error-formatting --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest pushed head 843076730a1 merges current origin/main and resolves the Plugin SDK API baseline/tool-plugin conflict; PR is mergeable again.

  • post-merge focused proof passed: ./node_modules/.bin/oxfmt --check src/plugin-sdk/tool-plugin.ts src/plugin-sdk/provider-stream-shared.ts src/plugin-sdk/provider-stream-shared.test.ts; node --max-old-space-size=8192 --import tsx scripts/generate-plugin-sdk-api-baseline.ts --check; git diff --check && git diff --cached --check; node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugin-sdk/tool-plugin.ts src/plugin-sdk/provider-stream-shared.ts src/plugin-sdk/provider-stream-shared.test.ts; src/plugin-sdk/provider-stream-shared.test.ts passed 58 tests; src/plugin-sdk/tool-plugin.test.ts passed 8 tests.

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-after-main-merge --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest provider stream error-formatting slice passed src/plugin-sdk/provider-stream-shared.test.ts with 58 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/plugin-sdk/provider-stream-shared.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-provider-stream-error-formatting --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest inline extension factory error-formatting slice passed src/agents/sessions/resource-loader.test.ts with 2 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/sessions/resource-loader.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-inline-extension-load-errors --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest session tool-call metadata slice passed src/agents/sessions/sdk.test.ts with 10 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/sessions/sdk.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-session-tool-call-metadata --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest extension loader error-formatting slice passed src/agents/sessions/extensions/loader.test.ts with 3 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/sessions/extensions/loader.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-extension-load-error-formatting --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest session extension error-formatting slice passed src/agents/sessions/sdk.test.ts with 9 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/sessions/sdk.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-session-extension-error-formatting --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest extension runner error-formatting slice passed src/agents/sessions/extensions/runner.test.ts with 1 test; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/sessions/extensions/runner.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-extension-runner-error-formatting --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest session tool snapshot error-formatting slice passed src/agents/sessions/tools/tool-definition-wrapper.test.ts with 4 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/sessions/tools/tool-definition-wrapper.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-session-tool-snapshot-errors --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest before_tool_call error-formatting slice passed src/agents/agent-tools.before-tool-call.e2e.test.ts with 50 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-tools.before-tool-call.e2e.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-before-tool-call-error-formatting --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest Code Mode host error-formatting slice passed src/agents/code-mode.test.ts with 56 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/code-mode.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-code-mode-error-formatting --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest Agent Core harness error-normalization slice passed packages/agent-core/src/harness/types.test.ts with 1 test; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run packages/agent-core/src/harness/types.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-harness-error-normalization --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest Agent Core tool-snapshot warning slice passed packages/agent-core/src/tool-snapshot.test.ts with 1 test; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run packages/agent-core/src/tool-snapshot.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-tool-snapshot-error-formatting --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest Agent Core tool-error stringification slice passed packages/agent-core/src/agent-loop.test.ts with 9 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run packages/agent-core/src/agent-loop.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-agent-core-tool-error-stringification --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest package Agent failure-message identity slice passed packages/agent-core/src/agent.test.ts with 4 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run packages/agent-core/src/agent.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-agent-state-failure-identity --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest Agent Core failure-message identity slice passed packages/agent-core/src/agent-loop.test.ts and packages/agent-core/src/harness/agent-harness.test.ts with 10 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run packages/agent-core/src/agent-loop.test.ts packages/agent-core/src/harness/agent-harness.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-agent-core-failure-identity --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest built-in lazy provider load-error slice passed src/llm/providers/register-builtins.test.ts with 2 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/register-builtins.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-lazy-provider-load-errors --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest OpenAI Codex Responses output identity slice passed src/llm/providers/openai-chatgpt-responses.test.ts with 13 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/openai-chatgpt-responses.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-codex-responses-output-identity --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest Anthropic transport setup identity slice passed src/agents/anthropic-transport-stream.test.ts with 54 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/anthropic-transport-stream.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-anthropic-transport-setup-identity --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest OpenAI transport output identity slice passed src/agents/openai-transport-stream.test.ts with 250 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/openai-transport-stream.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-transport-output-identity --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest Google transport output identity slice passed extensions/google/transport-stream.test.ts with 66 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/google/transport-stream.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-google-output-identity --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest Bedrock setup metadata slice passed extensions/amazon-bedrock/stream.runtime.test.ts with 11 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/amazon-bedrock/stream.runtime.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-bedrock-setup-metadata --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest Anthropic output identity slice passed src/llm/providers/anthropic.test.ts with 10 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/anthropic.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-anthropic-output-identity --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest Mistral output identity slice passed src/llm/providers/mistral.test.ts with 5 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/mistral.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-mistral-output-identity --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest OpenAI Completions output identity slice passed src/llm/providers/openai-completions.test.ts with 28 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/openai-completions.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-completions-output-identity --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest OpenAI Completions compat metadata slice passed src/llm/providers/openai-completions.test.ts with 27 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed after fixing an autoreview-caught OpenRouter routing fail-open risk.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/openai-completions.test.ts --reporter=dot

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-completions-compat --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • latest OpenAI strict-tool metadata slice passed src/agents/openai-strict-tool-setting.test.ts and src/llm/providers/openai-responses-shared.test.ts with 18 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/openai-strict-tool-setting.test.ts src/llm/providers/openai-responses-shared.test.ts --reporter=dot

  • latest shared model cost slice passed src/llm/model-utils.test.ts with 8 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • latest shared model identity slice passed src/llm/model-utils.test.ts with 5 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/model-utils.test.ts --reporter=dot

  • latest shared thinking metadata slice passed src/llm/model-utils.test.ts and src/llm/providers/openai-responses-shared.test.ts with 18 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/model-utils.test.ts src/llm/providers/openai-responses-shared.test.ts --reporter=dot

  • latest OpenAI Responses conversion metadata slice passed src/llm/providers/openai-responses-shared.test.ts and src/llm/providers/google-shared.convert.test.ts with 30 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed after fixing an autoreview-caught private-thinking downgrade leak.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/openai-responses-shared.test.ts src/llm/providers/google-shared.convert.test.ts --reporter=dot

  • latest Google conversion metadata slice passed src/llm/providers/google-shared.convert.test.ts with 18 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/google-shared.convert.test.ts --reporter=dot

  • latest Google shared thinking model-id slice passed src/llm/providers/google-shared.test.ts with 3 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/google-shared.test.ts --reporter=dot

  • latest Plugin SDK Google thinking metadata slice passed src/plugin-sdk/provider-stream.test.ts with 8 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/plugin-sdk/provider-stream.test.ts --reporter=dot

  • latest OpenAI reasoning metadata slice passed src/agents/openai-reasoning-effort.test.ts with 12 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/openai-reasoning-effort.test.ts --reporter=dot

  • latest Anthropic payload-compat metadata slice passed src/llm/providers/stream-wrappers/anthropic-family-tool-payload-compat.test.ts with 5 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/stream-wrappers/anthropic-family-tool-payload-compat.test.ts --reporter=dot

  • latest model metadata slice passed 114 focused tests across extra-params.cache-retention-default.test.ts, provider-attribution.test.ts, openai-responses-payload-policy.test.ts, minimax.test.ts, openai.test.ts, and proxy.test.ts; latest focused oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/embedded-agent-runner/extra-params.cache-retention-default.test.ts src/agents/provider-attribution.test.ts src/agents/openai-responses-payload-policy.test.ts src/llm/providers/stream-wrappers/minimax.test.ts src/llm/providers/stream-wrappers/openai.test.ts src/llm/providers/stream-wrappers/proxy.test.ts --reporter=dot

  • latest src/agents/embedded-agent-runner/prompt-cache-retention.test.ts passed 11 tests; latest focused prompt-cache param oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/embedded-agent-runner/prompt-cache-retention.test.ts --reporter=dot

  • latest src/agents/model-max-tokens-params.test.ts passed 3 tests; latest focused max-token alias oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/model-max-tokens-params.test.ts --reporter=dot

  • latest src/agents/embedded-agent-runner/extra-params.sampling.test.ts passed 16 tests; latest focused extra-param payload oxfmt, oxlint, git diff --check, and autoreview passed after fixing an autoreview-caught explicit-empty prepared params regression.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/embedded-agent-runner/extra-params.sampling.test.ts --reporter=dot

  • latest src/agents/openai-transport-stream.test.ts passed 249 tests; latest focused OpenAI response-format payload oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/openai-transport-stream.test.ts --reporter=dot

  • latest extensions/vllm/stream.test.ts passed 20 tests; latest focused vLLM thinking payload oxfmt, oxlint, git diff --check, and autoreview passed after fixing autoreview-caught serialization-boundary and mixed-format regressions.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/vllm/stream.test.ts --reporter=dot

  • latest extensions/fireworks/stream.test.ts passed 8 tests; latest focused Fireworks Kimi payload oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/fireworks/stream.test.ts --reporter=dot

  • latest extensions/venice/index.test.ts passed 4 tests; latest focused Venice replay payload oxfmt, oxlint, git diff --check, and autoreview passed after correcting an autoreview-caught null backfill regression.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/venice/index.test.ts --reporter=dot

  • latest extensions/openrouter/index.test.ts passed 33 tests; latest focused OpenRouter payload accessor oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/openrouter/index.test.ts --reporter=dot

  • latest extensions/qwen/stream.test.ts passed 11 tests; latest focused Qwen thinking payload oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/qwen/stream.test.ts --reporter=dot

  • latest src/llm/providers/stream-wrappers/moonshot.test.ts plus src/agents/embedded-agent-runner-extraparams.test.ts passed 134 tests; latest focused SiliconFlow thinking payload oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/stream-wrappers/moonshot.test.ts src/agents/embedded-agent-runner-extraparams.test.ts --reporter=dot

  • latest src/agents/btw.test.ts passed 35 tests; latest focused BTW payload tools oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/btw.test.ts --reporter=dot

  • latest src/llm/providers/stream-wrappers/minimax.test.ts passed 9 tests; latest focused MiniMax thinking payload oxfmt, oxlint, git diff --check, and autoreview passed after correcting an autoreview-caught fail-open setter path.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/stream-wrappers/minimax.test.ts --reporter=dot

  • latest src/llm/providers/stream-wrappers/moonshot-thinking.test.ts passed 2 tests; latest focused Moonshot wrapper oxfmt, oxlint, git diff --check, and autoreview passed for payload field quarantine.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/stream-wrappers/moonshot-thinking.test.ts --reporter=dot

  • latest src/llm/providers/stream-wrappers/anthropic-family-tool-payload-compat.test.ts passed 2 tests; latest focused wrapper oxfmt, oxlint, git diff --check, and autoreview passed for Anthropic-family payload tool quarantine.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/stream-wrappers/anthropic-family-tool-payload-compat.test.ts --reporter=dot

  • latest extensions/xai/stream.test.ts passed 14 tests; latest focused XAI stream wrapper oxfmt, oxlint, git diff --check, and autoreview passed for payload tool-row quarantine.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/xai/stream.test.ts --reporter=dot

  • latest extensions/amazon-bedrock/stream.runtime.test.ts passed 10 tests; latest focused Bedrock oxfmt, oxlint, git diff --check, and autoreview passed for forced toolChoice name quarantine.

  • latest src/llm/providers/google-shared.convert.test.ts passed 16 tests; latest focused Google shared converter oxfmt, oxlint, git diff --check, and autoreview passed after fixing shared-schema cycle, __proto__, and filtered forced-tool config findings.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/google-shared.convert.test.ts --reporter=dot

  • latest provider forced-toolChoice slice passed 103 focused tests across OpenAI completions, Mistral, Anthropic, and Google transport; latest focused provider oxfmt, oxlint, git diff --check, and autoreview passed.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/openai-completions.test.ts src/llm/providers/mistral.test.ts src/llm/providers/anthropic.test.ts extensions/google/transport-stream.test.ts --reporter=dot

  • latest src/agents/sessions/sdk.test.ts passed 8 tests; latest focused session oxfmt, oxlint, git diff --check, and autoreview passed for active-tool status quarantine.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/sessions/sdk.test.ts --reporter=dot

  • latest src/llm/providers/stream-wrappers/openai.test.ts passed 24 tests; latest focused stream-wrapper oxfmt, oxlint, git diff --check, and autoreview passed for OpenAI payload tool quarantine.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/stream-wrappers/openai.test.ts --reporter=dot

  • latest extensions/openai/openai-provider.test.ts passed 26 tests; latest focused OpenAI extension oxfmt, oxlint, git diff --check, and autoreview passed for native web-search payload quarantine.

  • latest src/agents/openai-transport-stream.test.ts passed 246 tests; latest focused agent oxfmt, oxlint, git diff --check, and autoreview passed for Responses payload tool-name quarantine. OpenAI stream-wrapper Code Mode payload filtering and Responses web_search reasoning checks now ignore unreadable payload tool identity rows while preserving healthy exec/wait/search tools. AgentSession active-tool status readback now skips unreadable live state tool names while preserving healthy active tool names. Provider forced toolChoice handling now catches unreadable forced names and fails closed with sanitized provider-owned errors instead of surfacing raw getter failures or sending a bad forced choice.

  • latest src/agents/openai-tool-schema.test.ts passed 6 tests; latest focused agent oxfmt, oxlint, git diff --check, and autoreview passed for OpenAI strict-schema diagnostic quarantine.

  • latest src/agents/code-mode.test.ts passed 55 tests; latest focused agent oxfmt, oxlint, git diff --check, and autoreview passed for Code Mode catalog name quarantine.

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/plugins/commands.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run packages/agent-core/src/agent.test.ts packages/agent-core/src/harness/agent-harness.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run packages/agent-core/src/agent-loop.test.ts packages/agent-core/src/agent.test.ts packages/agent-core/src/harness/agent-harness.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/embedded-agent-runner/tool-name-allowlist.test.ts src/agents/embedded-agent-runner/system-prompt.test.ts src/agents/embedded-agent-runner/tool-schema-runtime.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/embedded-agent-runner/run/attempt-tool-construction-plan.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/tool-policy.test.ts src/agents/agent-tools.policy.test.ts src/agents/tool-policy-pipeline.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/runtime-plan/tools.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/embedded-agent-runner/tool-schema-runtime.test.ts src/agents/runtime-plan/tools.diagnostics.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-tool-definition-adapter.test.ts src/agents/agent-tool-definition-adapter.logging.test.ts src/agents/agent-tool-definition-adapter.after-tool-call.test.ts src/agents/agent-tool-definition-adapter.after-tool-call.fires-once.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/sessions/tools/tool-definition-wrapper.test.ts src/agents/sessions/extensions/loader.test.ts src/agents/sessions/sdk.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/talk/agent-consult-tool.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/openai/realtime-voice-provider.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/copilot/src/tool-bridge.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/mistral.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/anthropic.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/openai-completions.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/plugin-sdk/provider-stream-tool-names.test.ts extensions/ollama/src/stream-tool-snapshot.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/amazon-bedrock/stream.runtime.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/anthropic-transport-stream.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/embedded-agent-runner/google-prompt-cache.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/openai-transport-stream.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/google/transport-stream.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/google/realtime-voice-provider.test.ts --reporter=dot

  • ./node_modules/.bin/oxfmt --check --threads=1 src/plugins/command-registration.ts src/plugins/commands.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 packages/agent-core/src/tool-snapshot.ts packages/agent-core/src/agent.ts packages/agent-core/src/agent.test.ts packages/agent-core/src/harness/agent-harness.ts packages/agent-core/src/harness/agent-harness.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 packages/agent-core/src/agent-loop.ts packages/agent-core/src/agent-loop.test.ts packages/agent-core/src/tool-snapshot.ts packages/agent-core/src/agent.ts packages/agent-core/src/agent.test.ts packages/agent-core/src/harness/agent-harness.ts packages/agent-core/src/harness/agent-harness.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/agents/embedded-agent-runner/tool-name-allowlist.ts src/agents/embedded-agent-runner/tool-name-allowlist.test.ts src/agents/embedded-agent-runner/system-prompt.ts src/agents/embedded-agent-runner/system-prompt.test.ts src/agents/embedded-agent-runner/tool-schema-runtime.ts src/agents/embedded-agent-runner/tool-schema-runtime.test.ts src/agents/embedded-agent-runner/run/attempt.ts src/agents/embedded-agent-runner/compact.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/agents/runtime-plan/tools.ts src/agents/runtime-plan/tools.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/agents/embedded-agent-runner/tool-schema-runtime.ts src/agents/embedded-agent-runner/tool-schema-runtime.test.ts src/agents/runtime-plan/tools.ts src/agents/runtime-plan/tools.diagnostics.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/agents/embedded-agent-runner/run/attempt-tool-construction-plan.ts src/agents/embedded-agent-runner/run/attempt-tool-construction-plan.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/agents/tool-policy.ts src/agents/tool-policy.test.ts src/agents/tool-policy-pipeline.ts src/agents/tool-policy-pipeline.test.ts src/agents/agent-tools.policy.ts src/agents/agent-tools.policy.test.ts src/agents/tool-policy-audit.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/agents/agent-tool-definition-adapter.ts src/agents/agent-tool-definition-adapter.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/agents/sessions/tools/tool-definition-wrapper.ts src/agents/sessions/tools/tool-definition-wrapper.test.ts src/agents/sessions/extensions/loader.ts src/agents/sessions/extensions/loader.test.ts src/agents/sessions/sdk.ts src/agents/sessions/sdk.test.ts src/agents/sessions/agent-session.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/talk/agent-consult-tool.ts src/talk/agent-consult-tool.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 extensions/openai/realtime-voice-provider.ts extensions/openai/realtime-voice-provider.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 extensions/copilot/src/tool-bridge.ts extensions/copilot/src/tool-bridge.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/llm/providers/mistral.ts src/llm/providers/mistral.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/llm/providers/anthropic.ts src/llm/providers/anthropic.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/llm/providers/openai-completions.ts src/llm/providers/openai-completions.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/plugin-sdk/provider-stream-shared.ts src/plugin-sdk/provider-stream-tool-names.test.ts extensions/ollama/src/stream.ts extensions/ollama/src/stream-tool-snapshot.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 extensions/amazon-bedrock/stream.runtime.ts extensions/amazon-bedrock/stream.runtime.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/agents/anthropic-transport-stream.ts src/agents/anthropic-transport-stream.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/agents/embedded-agent-runner/google-prompt-cache.ts src/agents/embedded-agent-runner/google-prompt-cache.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 src/agents/openai-transport-stream.ts src/agents/openai-transport-stream.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 extensions/google/transport-stream.ts extensions/google/transport-stream.test.ts

  • ./node_modules/.bin/oxfmt --check --threads=1 extensions/google/realtime-voice-provider.ts extensions/google/realtime-voice-provider.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/command-registration.ts src/plugins/commands.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json packages/agent-core/src/tool-snapshot.ts packages/agent-core/src/agent.ts packages/agent-core/src/agent.test.ts packages/agent-core/src/harness/agent-harness.ts packages/agent-core/src/harness/agent-harness.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json packages/agent-core/src/agent-loop.ts packages/agent-core/src/agent-loop.test.ts packages/agent-core/src/tool-snapshot.ts packages/agent-core/src/agent.ts packages/agent-core/src/agent.test.ts packages/agent-core/src/harness/agent-harness.ts packages/agent-core/src/harness/agent-harness.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/embedded-agent-runner/tool-name-allowlist.ts src/agents/embedded-agent-runner/tool-name-allowlist.test.ts src/agents/embedded-agent-runner/system-prompt.ts src/agents/embedded-agent-runner/system-prompt.test.ts src/agents/embedded-agent-runner/tool-schema-runtime.ts src/agents/embedded-agent-runner/tool-schema-runtime.test.ts src/agents/embedded-agent-runner/run/attempt.ts src/agents/embedded-agent-runner/compact.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/embedded-agent-runner/tool-schema-runtime.ts src/agents/embedded-agent-runner/tool-schema-runtime.test.ts src/agents/runtime-plan/tools.ts src/agents/runtime-plan/tools.diagnostics.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/runtime-plan/tools.ts src/agents/runtime-plan/tools.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/agent-tool-definition-adapter.ts src/agents/agent-tool-definition-adapter.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/sessions/tools/tool-definition-wrapper.ts src/agents/sessions/tools/tool-definition-wrapper.test.ts src/agents/sessions/extensions/loader.ts src/agents/sessions/extensions/loader.test.ts src/agents/sessions/sdk.ts src/agents/sessions/sdk.test.ts src/agents/sessions/agent-session.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/talk/agent-consult-tool.ts src/talk/agent-consult-tool.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/openai/realtime-voice-provider.ts extensions/openai/realtime-voice-provider.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/copilot/src/tool-bridge.ts extensions/copilot/src/tool-bridge.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/llm/providers/mistral.ts src/llm/providers/mistral.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/llm/providers/anthropic.ts src/llm/providers/anthropic.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/llm/providers/openai-completions.ts src/llm/providers/openai-completions.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugin-sdk/provider-stream-shared.ts src/plugin-sdk/provider-stream-tool-names.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/ollama/src/stream.ts extensions/ollama/src/stream-tool-snapshot.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/amazon-bedrock/stream.runtime.ts extensions/amazon-bedrock/stream.runtime.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/anthropic-transport-stream.ts src/agents/anthropic-transport-stream.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/embedded-agent-runner/google-prompt-cache.ts src/agents/embedded-agent-runner/google-prompt-cache.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/openai-transport-stream.ts src/agents/openai-transport-stream.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/google/transport-stream.ts extensions/google/transport-stream.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/google/realtime-voice-provider.ts extensions/google/realtime-voice-provider.test.ts

  • git diff --check

  • ./node_modules/.bin/oxfmt --threads=1 src/plugins/tools.ts src/plugins/tools.optional.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/plugins/tools.optional.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/tools.ts src/plugins/tools.optional.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local

  • node scripts/crabbox-wrapper.mjs run --label check-changed-plugin-tool-schema-snapshot --shell -- "pnpm check:changed" (blocked before lease allocation: Crabbox coordinator HTTP 401 unauthorized)

  • blacksmith testbox list --all (blocked: not authenticated)

  • ./node_modules/.bin/oxfmt --threads=1 src/plugins/registry.ts src/plugins/loader.test.ts and matching --check

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/registry.ts src/plugins/loader.test.ts

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/plugins/loader.test.ts --reporter=dot -t "isolates unreadable implicit plugin tool registration names"

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/plugins/loader.test.ts --reporter=dot -t "supports legacy plugins subscribing to diagnostic events from the root sdk"

  • ./node_modules/.bin/oxfmt --threads=1 src/plugin-sdk/provider-tools.ts src/plugin-sdk/provider-tools.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/plugin-sdk/provider-tools.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugin-sdk/provider-tools.ts src/plugin-sdk/provider-tools.test.ts

  • ./node_modules/.bin/oxfmt --threads=1 src/mcp/plugin-tools-handlers.ts src/mcp/plugin-tools-handlers.test.ts src/plugins/tools.ts src/plugins/tool-metadata.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/mcp/plugin-tools-handlers.test.ts src/mcp/plugin-tools-serve.test.ts src/plugins/tools.optional.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/mcp/plugin-tools-handlers.ts src/mcp/plugin-tools-handlers.test.ts src/mcp/plugin-tools-serve.test.ts src/plugins/tools.ts src/plugins/tool-metadata.ts

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/tool-schema-projection.ts src/agents/tool-schema-projection.test.ts src/plugin-sdk/agent-harness-runtime.ts extensions/codex/src/app-server/dynamic-tools.ts extensions/codex/src/app-server/dynamic-tools.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/tool-schema-projection.test.ts extensions/codex/src/app-server/dynamic-tools.test.ts --reporter=dot

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/plugin-sdk/agent-harness-runtime.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/tool-schema-projection.ts src/agents/tool-schema-projection.test.ts src/plugin-sdk/agent-harness-runtime.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/codex/src/app-server/dynamic-tools.ts extensions/codex/src/app-server/dynamic-tools.test.ts

  • node --max-old-space-size=8192 --import tsx scripts/generate-plugin-sdk-api-baseline.ts --check

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/tool-schema-projection.ts src/agents/tool-schema-projection.test.ts extensions/codex/src/app-server/dynamic-tools.ts extensions/codex/src/app-server/dynamic-tools.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/tool-schema-projection.test.ts extensions/codex/src/app-server/dynamic-tools.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/tool-schema-projection.ts src/agents/tool-schema-projection.test.ts

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/codex/src/app-server/dynamic-tools.ts extensions/codex/src/app-server/dynamic-tools.test.ts

  • node --max-old-space-size=8192 --import tsx scripts/generate-plugin-sdk-api-baseline.ts --check

  • ./node_modules/.bin/oxfmt --threads=1 src/llm/providers/openai-responses-tools.ts src/llm/providers/openai-responses-shared.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/llm/providers/openai-responses-shared.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/llm/providers/openai-responses-tools.ts src/llm/providers/openai-responses-shared.test.ts

  • ./node_modules/.bin/oxfmt --threads=1 src/commands/doctor/shared/active-tool-schema-warnings.ts src/commands/doctor/shared/active-tool-schema-warnings.test.ts src/agents/tools-effective-inventory-build.ts src/agents/tools-effective-inventory.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/commands/doctor/shared/active-tool-schema-warnings.test.ts src/agents/tools-effective-inventory.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/commands/doctor/shared/active-tool-schema-warnings.ts src/commands/doctor/shared/active-tool-schema-warnings.test.ts src/agents/tools-effective-inventory-build.ts src/agents/tools-effective-inventory.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local

  • node scripts/crabbox-wrapper.mjs run --label check-changed-doctor-inventory-quarantine --shell -- "pnpm check:changed" (blocked before lease allocation: Crabbox coordinator HTTP 401 unauthorized)

  • blacksmith testbox list --all (blocked: not authenticated)

  • node scripts/crabbox-wrapper.mjs run --label check-changed-codex-dynamic-metadata --shell -- "pnpm check:changed" (blocked before sync/lease allocation: sparse-sync full-checkout preflight had <1 GiB free)

  • agent-worktree-maintain --force, then the same Crabbox command again (still blocked before sync/lease allocation: 995.1 MiB free against the 1.00 GiB sparse-sync minimum)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/agent-tool-definition-adapter.ts src/agents/agent-tool-definition-adapter.test.ts src/agents/embedded-agent-runner/tool-name-allowlist.ts src/agents/embedded-agent-runner/tool-name-allowlist.test.ts src/agents/embedded-agent-runner/run/attempt.tool-search-run-plan.ts src/agents/embedded-agent-runner/run/attempt.tool-search-run-plan.test.ts src/agents/embedded-agent-runner/run/attempt.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-tool-definition-adapter.test.ts src/agents/embedded-agent-runner/tool-name-allowlist.test.ts src/agents/embedded-agent-runner/run/attempt.tool-search-run-plan.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/agent-tool-definition-adapter.ts src/agents/agent-tool-definition-adapter.test.ts src/agents/embedded-agent-runner/tool-name-allowlist.ts src/agents/embedded-agent-runner/tool-name-allowlist.test.ts src/agents/embedded-agent-runner/run/attempt.tool-search-run-plan.ts src/agents/embedded-agent-runner/run/attempt.tool-search-run-plan.test.ts src/agents/embedded-agent-runner/run/attempt.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (initial review found invalid client tools could still be counted as callable before conversion skipped them; fixed and reran clean)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/system-prompt-report.ts src/agents/system-prompt-report.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/system-prompt-report.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/system-prompt-report.ts src/agents/system-prompt-report.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (system prompt report slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 extensions/codex/src/app-server/attempt-context.ts extensions/codex/src/app-server/attempt-context.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/codex/src/app-server/attempt-context.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/codex/src/app-server/attempt-context.ts extensions/codex/src/app-server/attempt-context.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (Codex prompt report slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 extensions/codex/src/app-server/thread-lifecycle.ts extensions/codex/src/app-server/thread-lifecycle.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/codex/src/app-server/thread-lifecycle.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/codex/src/app-server/thread-lifecycle.ts extensions/codex/src/app-server/thread-lifecycle.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (Codex thread lifecycle slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 extensions/codex/src/app-server/dynamic-tool-profile.ts extensions/codex/src/app-server/dynamic-tool-build.ts extensions/codex/src/app-server/dynamic-tool-build.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/codex/src/app-server/dynamic-tool-build.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/codex/src/app-server/dynamic-tool-profile.ts extensions/codex/src/app-server/dynamic-tool-build.ts extensions/codex/src/app-server/dynamic-tool-build.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (Codex dynamic filter slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 extensions/codex/src/app-server/attempt-context.ts extensions/codex/src/app-server/attempt-context.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/codex/src/app-server/attempt-context.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/codex/src/app-server/attempt-context.ts extensions/codex/src/app-server/attempt-context.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (Codex memory-tool detection slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 extensions/codex/src/app-server/dynamic-tool-profile.ts extensions/codex/src/app-server/vision-tools.ts extensions/codex/src/app-server/run-attempt.vision-tools.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/codex/src/app-server/run-attempt.vision-tools.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/codex/src/app-server/dynamic-tool-profile.ts extensions/codex/src/app-server/vision-tools.ts extensions/codex/src/app-server/run-attempt.vision-tools.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (initial review found a test type issue; fixed and reran clean)

  • ./node_modules/.bin/oxfmt --threads=1 extensions/codex/src/app-server/attempt-diagnostics.ts extensions/codex/src/app-server/attempt-diagnostics.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/codex/src/app-server/attempt-diagnostics.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/codex/src/app-server/attempt-diagnostics.ts extensions/codex/src/app-server/attempt-diagnostics.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (Codex model-call diagnostics slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 extensions/codex/src/app-server/run-attempt.ts extensions/codex/src/app-server/run-attempt.context-engine.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/codex/src/app-server/run-attempt.context-engine.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/codex/src/app-server/run-attempt.ts extensions/codex/src/app-server/run-attempt.context-engine.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (Codex context-engine available-tools slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 extensions/codex/src/app-server/trajectory.ts extensions/codex/src/app-server/trajectory.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/codex/src/app-server/trajectory.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/codex/src/app-server/trajectory.ts extensions/codex/src/app-server/trajectory.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (Codex trajectory tool-definition slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 extensions/copilot/src/attempt.ts extensions/copilot/src/attempt.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run extensions/copilot/src/attempt.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/copilot/src/attempt.ts extensions/copilot/src/attempt.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (Copilot SDK session tool catalog slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/embedded-agent-runner/prompt-cache-observability.ts src/agents/embedded-agent-runner/prompt-cache-observability.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/embedded-agent-runner/prompt-cache-observability.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/embedded-agent-runner/prompt-cache-observability.ts src/agents/embedded-agent-runner/prompt-cache-observability.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (prompt-cache diagnostic tool-name slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/cli-runner.helpers.test.ts src/agents/cli-runner/helpers.ts src/agents/cli-runner/prepare.ts src/agents/cli-runner/prepare.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/cli-runner.helpers.test.ts src/agents/cli-runner/prepare.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/cli-runner.helpers.test.ts src/agents/cli-runner/helpers.ts src/agents/cli-runner/prepare.ts src/agents/cli-runner/prepare.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (CLI prompt tool-name slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/agent-tools.message-provider-policy.ts src/agents/agent-tools.message-provider-policy.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-tools.message-provider-policy.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/agent-tools.message-provider-policy.ts src/agents/agent-tools.message-provider-policy.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (message-provider policy tool-name slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 src/gateway/tool-resolution.ts src/gateway/tool-resolution.exclude.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/gateway/tool-resolution.exclude.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/gateway/tool-resolution.ts src/gateway/tool-resolution.exclude.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (gateway scoped tool-name slice clean after fixing test fixture casts)

  • ./node_modules/.bin/oxfmt --threads=1 src/gateway/server-methods/tools-catalog.ts src/gateway/server-methods/tools-catalog.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/gateway/server-methods/tools-catalog.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/gateway/server-methods/tools-catalog.ts src/gateway/server-methods/tools-catalog.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (gateway tool catalog metadata slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 src/gateway/mcp-http.handlers.ts src/gateway/mcp-http.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/gateway/mcp-http.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/gateway/mcp-http.handlers.ts src/gateway/mcp-http.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (MCP loopback schema-name slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/tool-search.ts src/agents/tool-search.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/tool-search.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/tool-search.ts src/agents/tool-search.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (Tool Search catalog tool-name slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 src/trajectory/runtime.ts src/trajectory/runtime.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/trajectory/runtime.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/trajectory/runtime.ts src/trajectory/runtime.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (trajectory tool-definition capture slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 src/plugins/tool-descriptor-cache.ts src/plugins/tool-descriptor-cache.test.ts src/plugins/tools.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/plugins/tool-descriptor-cache.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/tool-descriptor-cache.ts src/plugins/tool-descriptor-cache.test.ts src/plugins/tools.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (descriptor-cache metadata slice clean after review fix)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/tools-effective-inventory-build.ts src/agents/tools-effective-inventory.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/tools-effective-inventory.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/tools-effective-inventory-build.ts src/agents/tools-effective-inventory.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (effective-inventory metadata slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/tools-effective-mcp-inventory.ts src/agents/tools-effective-inventory.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/tools-effective-inventory.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/tools-effective-mcp-inventory.ts src/agents/tools-effective-inventory.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (MCP effective-inventory metadata slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 src/plugin-sdk/tool-plugin.ts src/plugin-sdk/tool-plugin.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/plugin-sdk/tool-plugin.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugin-sdk/tool-plugin.ts src/plugin-sdk/tool-plugin.test.ts including plugin-sdk boundary DTS preparation

  • .agents/skills/autoreview/scripts/autoreview --mode local (Plugin SDK tool-plugin slice clean after empty-description compatibility fix)

  • ./node_modules/.bin/oxfmt --threads=1 src/plugins/bundled-capability-runtime.ts src/plugins/bundled-capability-runtime.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/plugins/bundled-capability-runtime.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/bundled-capability-runtime.ts src/plugins/bundled-capability-runtime.test.ts including plugin-sdk boundary DTS preparation

  • .agents/skills/autoreview/scripts/autoreview --mode local (bundled capability runtime captured-tool slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/agent-bundle-mcp-runtime.ts src/agents/agent-bundle-mcp-runtime.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-bundle-mcp-runtime.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/agent-bundle-mcp-runtime.ts src/agents/agent-bundle-mcp-runtime.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (bundle-MCP listed-tool catalog slice clean)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/agent-bundle-mcp-materialize.ts src/agents/agent-bundle-mcp-tools.materialize.test.ts and matching --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-bundle-mcp-tools.materialize.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/agent-bundle-mcp-materialize.ts src/agents/agent-bundle-mcp-tools.materialize.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (bundle-MCP materialization slice clean after raw serverName review fix)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/code-mode-namespaces.ts src/agents/code-mode.test.ts and matching --check

  • git diff --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/code-mode.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/code-mode-namespaces.ts src/agents/code-mode.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (code-mode MCP namespace catalog slice clean)

  • node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-code-mode --shell -- "pnpm check:changed" (blocked before lease allocation: Crabbox coordinator HTTP 401 unauthorized)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/agent-tools.before-tool-call.ts src/agents/agent-tools.before-tool-call.integration.e2e.test.ts and matching --check

  • git diff --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-tools.before-tool-call.integration.e2e.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/agent-tools.before-tool-call.ts src/agents/agent-tools.before-tool-call.integration.e2e.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (before-tool-call wrapper slice clean after fail-closed fixes)

  • node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-before-hook --shell -- "pnpm check:changed" (blocked before lease allocation: Crabbox coordinator HTTP 401 unauthorized)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/agent-tool-definition-adapter.ts src/agents/agent-tool-definition-adapter.test.ts and matching --check

  • git diff --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-tool-definition-adapter.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/agent-tool-definition-adapter.ts src/agents/agent-tool-definition-adapter.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (agent tool definition execute slice clean)

  • node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-adapter-execute --shell -- "pnpm check:changed" (blocked before lease allocation: Crabbox coordinator HTTP 401 unauthorized)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/agent-tools.abort.ts src/agents/agent-tools.abort.test.ts and matching --check

  • git diff --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-tools.abort.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/agent-tools.abort.ts src/agents/agent-tools.abort.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (abort wrapper metadata slice clean)

  • node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-abort-wrapper --shell -- "pnpm check:changed" (blocked before lease allocation: Crabbox coordinator HTTP 401 unauthorized)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/agent-tools.deferred-followup.ts src/agents/agent-tools.deferred-followup-guidance.test.ts and matching --check

  • git diff --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-tools.deferred-followup-guidance.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/agent-tools.deferred-followup.ts src/agents/agent-tools.deferred-followup-guidance.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (deferred follow-up tool-name slice clean)

  • node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-deferred-followup --shell -- "pnpm check:changed" (blocked before lease allocation: Crabbox coordinator HTTP 401 unauthorized)

  • ./node_modules/.bin/oxfmt --threads=1 src/agents/agent-tools.ts src/agents/local-model-lean.ts src/agents/agent-tools.model-provider-collision.test.ts and matching --check

  • git diff --check

  • CI=1 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=30000 OPENCLAW_VITEST_NO_OUTPUT_HEARTBEAT_MS=10000 node scripts/run-vitest.mjs run src/agents/agent-tools.model-provider-collision.test.ts --reporter=dot

  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/agent-tools.ts src/agents/local-model-lean.ts src/agents/agent-tools.model-provider-collision.test.ts

  • .agents/skills/autoreview/scripts/autoreview --mode local (restrictive filter name slice clean after fail-closed fixes)

  • node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-filter-names --shell -- "pnpm check:changed" (blocked before lease allocation: Crabbox coordinator HTTP 401 unauthorized)

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-wrapper-payload --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-session-active-tools --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-forced-tool-choice --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-reasoning-metadata --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-google-thinking-metadata --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-google-thinking-model-ids --shell -- "pnpm check:changed" selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-google-conversion-metadata --shell -- "pnpm check:changed" first failed sparse-sync preflight with only 890.5 MiB free, then after clearing disposable npm cache selected provider=azure and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-responses-conversion-metadata --shell -- "pnpm check:changed" selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-thinking-metadata --shell -- "pnpm check:changed" selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-model-identity --shell -- "pnpm check:changed" selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-model-cost --shell -- "pnpm check:changed" selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

  • OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-strict-tool-metadata --shell -- "pnpm check:changed" selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

Real behavior proof

Behavior addressed: plugin command registration now handles unreadable command metadata as a failed registration and keeps later healthy commands registerable; stored optional metadata is copied before plugin-owned objects can mutate. Package-level Agent, direct agentLoop/agentLoopContinue, and CoreAgentHarness tool registries now snapshot state, constructor, setter, prompt-run, continue-run, context-snapshot, and prepareNextTurn replacement tools before turn-context exposure, so unreadable package SDK/runtime tool names or parameter schemas are skipped while healthy active tools remain available and schema payloads are cloned. Embedded-agent runtime name collection now guards session allowlists, bundle MCP/LSP reserved-name sets, bootstrap file-access detection, context-engine available-tool metadata, embedded prompt tool guidance, provider schema diagnostic formatting, prompt-cache observability snapshots, CLI system-prompt tool lists, and bundle-MCP reusable-session prompt-tool hashes, so unreadable tool name getters, non-string tool names, or client tool function getters cannot crash pre-provider setup, CLI preparation, or warning logs. Runtime-plan/provider normalization metadata copying now guards cloned normalized tool names and keeps same-index plugin provenance when a normalized target name becomes unreadable, so provider cleanup cannot crash before later quarantine. Provider and RuntimePlan tool-schema diagnostic hooks now warn and return when schema inspection throws, so best-effort diagnostics cannot abort the assistant turn before content. Embedded-attempt explicit allowlist filtering now captures readable names before policy matching and skips unreadable names, so bad bundle/plugin tools cannot crash allowlist filtering before runtime projection; throwing plugin metadata lookups are treated as missing metadata while exact healthy tool-name matches still work. Shared tool-policy paths now guard runtime tool name reads for inherited allowlist replacement, plugin-group expansion, core/plugin classification, configured filtering, message-provider filtering, gateway scoped filtering, and audit logging; tools whose policy-critical plugin metadata cannot be read are dropped fail-closed before plugin-id/group policy expansion, unreadable message-provider policy names are skipped before provider-specific allow/deny matching, and unreadable gateway scoped names are skipped before HTTP/loopback deny or exclusion matching, and unreadable gateway catalog plugin descriptors are skipped before Control UI/client catalog projection, and unreadable MCP loopback advertised schema names are skipped before tools/call availability checks. Core embedded-agent/session tool definitions now snapshot runtime tool metadata before registration, so unreadable runtime tool names or parameters are quarantined per tool while healthy session definitions remain available. Session extension api.registerTool, SDK custom tools, AgentSession base-tool overrides, and ToolDefinition/AgentTool wrappers now snapshot registered definitions before session startup, preserve TypeBox metadata, keep top-level undefined schemas for no-argument/client tools, and skip malformed registered definitions without dropping healthy tools. Copilot bridge now snapshots bridged OpenClaw tools before SDK registration, allowlist filtering, duplicate detection, and direct conversion, so unreadable names or nested schemas are quarantined per tool while healthy bridged tools remain available. Custom realtime voice tools are snapshotted before provider exposure in shared Talk merging and in OpenAI and Google native/browser realtime sessions, so unreadable custom tool metadata or nested schema getters do not abort the realtime tool list, Live connect config, client-secret request body, or browser token constraints. Mistral, Anthropic provider, native Anthropic transport, OpenAI-compatible completions, OpenAI transport-owned Responses/Chat Completions, native Ollama, Amazon Bedrock, Google prompt-cache, and Google transport request tools are snapshotted before SDK/provider payload construction, so revoked descriptors, proxy schemas, and nested schema getters are skipped for normal requests while healthy tools remain available; explicit required provider toolChoice settings fail closed when they point at quarantined or unavailable tools. The shared plain-text tool-call compatibility wrapper now ignores unreadable tool names while preserving healthy repair names. Manifest-backed plugin tool resolution now snapshots readable tool name/schema/execute metadata once, stabilizes live tool wrappers without violating non-configurable property invariants, preserves class-backed metadata/callback scoping, drops descriptor-trap tools fail-closed, and cached descriptor execution reuses cached schemas instead of rereading volatile runtime schemas. Plugin SDK api.registerTool(objectTool) now treats an unreadable implicit object-tool name as a per-registration diagnostic, so later healthy tool registrations from the same plugin still load; explicit registration names are used without rereading the object tool name. provider-family schema helpers now quarantine unreadable provider plugin tool names/parameters during Gemini, OpenAI, and DeepSeek compatibility passes while preserving normalized tool enumerable fields. MCP plugin tool bridge construction now skips unreadable plugin-owned tool metadata per tool, avoids execute.bind reads, and preserves plugin ownership metadata on the wrapped snapshot. Codex dynamic tool bridge construction now quarantines unreadable runtime tool schemas before reading raw tool metadata, snapshots projected names/descriptions/schemas before bridge wrapping, and keeps healthy dynamic tools available. Shared OpenAI Responses tool conversion now skips unreadable or hostile tool schemas per tool while keeping healthy strict-compatible tools strict. Doctor and effective tool inventory quarantine warnings now keep plugin attribution for pre-normalization diagnostics even when the bad tool name is unreadable. Client-hosted tool descriptors are now filtered through the same runtime-compatible snapshot path before conflict checks, tool-search allowlist planning, bundle reserved-name reservation, and session conversion, so malformed hosted tool names/schemas cannot crash startup or satisfy an explicit allowlist before being quarantined. OpenClaw and Codex system prompt report generation now snapshot readable tool metadata defensively and skip unreadable tool descriptors, so prompt/session/attempt metadata accounting cannot abort a turn after prompt construction. Codex thread lifecycle startup now guards dynamic-tool names, deferred flags, and fingerprintable schema fields, so malformed dynamic specs cannot abort thread reuse checks or developer instruction rendering. Codex dynamic tool filtering now treats unreadable tool names as non-matching before bridge projection, so Codex-owned exclusions, memory-flush filters, sandbox/node shell alias selection, and explicit dynamic allowlists skip bad tools while healthy siblings survive. Codex workspace memory routing now uses the same guarded dynamic-tool name reader so a bad dynamic spec cannot abort bootstrap routing when healthy memory tools are present. Codex vision-input filtering now uses the guarded dynamic-tool name reader, so image-tool removal skips unreadable names without crashing when model vision and inbound images are active. Codex model-call diagnostic tool-definition capture now skips unreadable tool names and treats descriptions/schemas as best-effort, so private telemetry cannot abort a turn before the model call starts. Codex context-engine available-tool assembly now reads names through the guarded dynamic-tool reader, so unreadable specs are skipped before context policy sees them. Codex trajectory context capture now reads tool metadata defensively, so optional sidecar recording cannot abort attempt setup when tool getters throw. Copilot session config now builds SDK tools and availableTools from the same guarded catalog so malformed bridge output cannot crash session creation or leak into the allowlist. Tool Search catalog compaction now snapshots tool names/metadata before visible-control decisions, direct fallback filtering, catalog ids, and client-tool appends, so unreadable catalog tool names are skipped while healthy server/client tools remain usable. Trajectory runtime tool-definition capture now treats tool name, description, and parameters as best-effort sidecar metadata, so unreadable capture-only fields do not abort runtime event recording. Plugin descriptor-cache capture now reads required tool descriptor metadata defensively and skips uncapturable cache entries, while optional label/display summary metadata is best-effort, so hostile plugin cache capture cannot crash or make malformed tools visible only after cache warmup. Effective inventory and doctor-style tool reporting now snapshot readable names and display metadata before row construction, skip unreadable names, and treat label/description/displaySummary/plugin/channel attribution as best-effort so hostile inventory metadata cannot hide healthy tools or crash warnings. Bundle-MCP effective inventory now uses the same guarded display metadata snapshot pattern, so unreadable MCP tool names are skipped and hostile label/description/displaySummary getters cannot abort gateway/Control UI inventory rendering. Plugin SDK defineToolPlugin() now snapshots returned tool definitions before metadata generation and registration, skipping malformed returned entries with unreadable names or missing handlers while preserving valid empty descriptions and healthy sibling tools. Bundled capability runtime registry assembly now reads captured tool names defensively, reports unreadable, blank, or non-string names per tool, and keeps healthy captured tools registered. Bundle-MCP catalog loading now snapshots readable tools/list names and input schemas before filtering or materialization, skips malformed entries with catalog diagnostics, and treats title/description as best-effort display metadata. Bundle-MCP materialization now snapshots already-loaded catalog rows before sorting and agent-tool creation, skips malformed identity/schema rows, preserves raw server ids for runtime calls, and treats display metadata as best-effort. Code-mode MCP namespace projection now snapshots catalog rows before prompt, API-file, and runtime descriptor construction, skips malformed MCP rows, and keeps healthy siblings callable. Before-tool-call wrapping now fails closed when required tool name, execute, or enumerable wrapper metadata cannot be read, while unreadable optional prepare/finalize hooks remain best-effort. Agent tool definition adaptation now requires a readable callable execute during definition snapshotting and invokes the snapshotted handler with the original receiver, so unreadable or non-callable executors are quarantined before hooks or model-facing session definitions can observe them. Abort-signal wrapping now reads executors defensively and avoids enumerating arbitrary tool metadata while preserving run-abort behavior for healthy tools. Deferred follow-up description rewriting now reads names defensively and replaces exec/process descriptions without enumerating arbitrary tool fields. Restrictive name filters now fail closed on unreadable descriptors while suppressing managed web_search, applying local-model lean denies, or narrowing memory-flush runs to read/write. OpenAI Responses conversion and assistant output setup now read model identity, input, and reasoning metadata defensively, preserve readable accessor-backed metadata, and drop private thinking when target model identity is unreadable instead of downgrading it into prompt text. Shared thinking-level utilities and OpenAI Responses common params now read model reasoning metadata defensively, so hostile reasoning, thinkingLevelMap, or thinking-map entry accessors cannot crash provider reasoning setup before content. Shared model identity comparison now reads id and provider defensively, so hostile identity accessors cannot crash session/model-selection equality checks before model setup continues. Shared model cost calculation now reads cost and nested token-price fields defensively, so hostile cost metadata cannot crash usage accounting during provider closeout. OpenAI strict-tool default resolution and Responses tool conversion now read model strict-mode metadata defensively, so hostile provider, api, baseUrl, id, or compat accessors cannot crash tool-schema setup before provider send.
Real environment tested: local linked OpenClaw gwt worktree on macOS; generated Vitest cache cleanup restored local disk enough for focused proof; broad Crabbox/Testbox gates remain blocked by coordinator/Testbox auth.
Exact steps or command run after this patch: ran focused plugin command, agent-core direct loop/Agent/harness, embedded-agent tool-name allowlist/system-prompt/tool-schema-runtime, runtime-plan tool metadata, core session tool-definition adapter, session wrapper/extension-loader/SDK, Copilot bridge, realtime voice consult, OpenAI realtime provider, Google realtime provider, Mistral provider, Anthropic provider, OpenAI-compatible completions provider, SDK provider-stream wrapper, Ollama stream snapshot, Amazon Bedrock stream, native Anthropic transport, Google prompt-cache, OpenAI transport, and Google transport Vitest files; scoped oxfmt checks; scoped oxlint checks; git diff --check; local Codex autoreview; latest provider/runtime-plan diagnostic hook focused tests; embedded-attempt allowlist focused tests; shared tool-policy focused tests; and retried remote pnpm check:changed through Crabbox; latest Codex model-call diagnostics focused test; latest Codex context-engine available-tools focused test; latest Codex trajectory tool-definition focused test; latest Copilot SDK session tool catalog focused test; latest prompt-cache observability tool-name focused test; latest CLI prompt/hash tool-name focused tests; latest message-provider policy tool-name focused test; latest gateway scoped tool-name focused test; latest gateway catalog metadata focused test; latest MCP loopback schema-name focused test. latest Tool Search catalog tool-name focused test. latest trajectory runtime tool-definition focused test. latest plugin descriptor-cache metadata focused test. latest effective-inventory display-metadata focused test. latest MCP effective-inventory display-metadata focused test. latest Plugin SDK tool-plugin returned-definition focused test. latest bundled capability runtime captured-tool focused test. latest bundle-MCP listed-tool catalog focused test. latest bundle-MCP materialization focused test. latest code-mode MCP namespace catalog focused test and Crabbox changed-gate retry. latest before-tool-call wrapper focused test, autoreview reruns, and Crabbox changed-gate retry. latest agent tool definition execute focused test, formatter/lint proof, autoreview, and Crabbox changed-gate retry. latest abort-wrapper metadata focused test, formatter/lint proof, autoreview, and Crabbox changed-gate retry. latest deferred follow-up tool-name focused test, formatter/lint proof, autoreview, and Crabbox changed-gate retry. latest restrictive filter tool-name focused test, formatter/lint proof, autoreview after fail-closed fixes, and Crabbox changed-gate retry. latest OpenAI reasoning metadata focused test, formatter/lint proof, autoreview, and Crabbox changed-gate retry. latest Plugin SDK Google thinking metadata focused test, formatter/lint proof, autoreview, and Crabbox changed-gate retry. latest Google shared thinking model-id focused test, formatter/lint proof, autoreview, and Crabbox changed-gate retry. latest Google conversion metadata focused test, formatter/lint proof, autoreview, npm-cache cleanup for sparse sync, and Crabbox changed-gate retry. latest OpenAI Responses conversion metadata focused tests, formatter/lint proof, autoreview after privacy fix, and Crabbox changed-gate retry. latest shared thinking metadata focused tests, formatter/lint proof, autoreview, and Crabbox changed-gate retry. latest shared model identity focused test, formatter/lint proof, autoreview, and Crabbox changed-gate retry. latest shared model cost focused test, formatter/lint proof, autoreview, and Crabbox changed-gate retry. latest OpenAI strict-tool metadata focused tests, formatter/lint proof, autoreview, and Crabbox changed-gate retry.
Evidence after fix: src/plugins/commands.test.ts passed 51 tests; packages/agent-core/src/agent-loop.test.ts, packages/agent-core/src/agent.test.ts, and packages/agent-core/src/harness/agent-harness.test.ts passed 11 tests; src/agents/embedded-agent-runner/tool-name-allowlist.test.ts, src/agents/embedded-agent-runner/system-prompt.test.ts, and src/agents/embedded-agent-runner/tool-schema-runtime.test.ts passed 24 tests across 2 shards; src/agents/runtime-plan/tools.test.ts passed 11 tests; latest src/agents/embedded-agent-runner/tool-schema-runtime.test.ts and src/agents/runtime-plan/tools.diagnostics.test.ts passed 7 tests; latest src/agents/embedded-agent-runner/run/attempt-tool-construction-plan.test.ts passed 23 tests; latest src/agents/tool-policy.test.ts, src/agents/agent-tools.policy.test.ts, and src/agents/tool-policy-pipeline.test.ts passed 90 tests across 2 shards; the src/agents/agent-tool-definition-adapter*.test.ts cluster passed 37 tests across 2 shards; src/agents/sessions/tools/tool-definition-wrapper.test.ts, src/agents/sessions/extensions/loader.test.ts, and src/agents/sessions/sdk.test.ts passed 13 tests across 2 shards; extensions/copilot/src/tool-bridge.test.ts passed 66 tests; src/talk/agent-consult-tool.test.ts passed 9 tests; extensions/openai/realtime-voice-provider.test.ts passed 51 tests; extensions/google/realtime-voice-provider.test.ts passed 28 tests; src/llm/providers/mistral.test.ts passed 3 tests; src/llm/providers/anthropic.test.ts passed 8 tests; src/llm/providers/openai-completions.test.ts passed 24 tests; src/plugin-sdk/provider-stream-tool-names.test.ts and extensions/ollama/src/stream-tool-snapshot.test.ts passed 2 tests across 2 shards; extensions/amazon-bedrock/stream.runtime.test.ts passed 9 tests; src/agents/anthropic-transport-stream.test.ts passed 53 tests; src/agents/embedded-agent-runner/google-prompt-cache.test.ts passed 7 tests; src/agents/openai-transport-stream.test.ts passed 246 tests; extensions/google/transport-stream.test.ts passed 64 tests; src/commands/doctor/shared/active-tool-schema-warnings.test.ts and src/agents/tools-effective-inventory.test.ts passed 29 tests across 2 shards; latest src/agents/tool-schema-projection.test.ts and extensions/codex/src/app-server/dynamic-tools.test.ts passed 51 tests across 2 shards; oxfmt and oxlint exited clean; autoreview reported no accepted/actionable findings after review-driven fixes. latest src/agents/agent-tool-definition-adapter.test.ts, src/agents/embedded-agent-runner/tool-name-allowlist.test.ts, and src/agents/embedded-agent-runner/run/attempt.tool-search-run-plan.test.ts passed 44 tests in 1 shard; latest client-tool focused oxfmt, oxlint, git diff --check, and final autoreview passed after fixing the client-tool planning mismatch. latest src/agents/system-prompt-report.test.ts passed 13 tests; latest focused oxfmt, oxlint, git diff --check, and autoreview passed for prompt-report metadata quarantine. latest extensions/codex/src/app-server/attempt-context.test.ts passed 5 tests; latest focused extension oxfmt, oxlint, git diff --check, and autoreview passed for Codex prompt-report metadata quarantine. latest extensions/codex/src/app-server/thread-lifecycle.test.ts passed 54 tests; latest focused extension oxfmt, oxlint, git diff --check, and autoreview passed for Codex thread lifecycle dynamic-tool metadata quarantine. latest extensions/codex/src/app-server/dynamic-tool-build.test.ts passed 32 tests; latest focused extension oxfmt, oxlint, git diff --check, and autoreview passed for Codex dynamic filter name quarantine. latest extensions/codex/src/app-server/attempt-context.test.ts passed 6 tests; latest focused extension oxfmt, oxlint, git diff --check, and autoreview passed for Codex workspace memory tool-name quarantine. latest extensions/codex/src/app-server/run-attempt.vision-tools.test.ts passed 3 tests; latest focused extension oxfmt, oxlint, git diff --check, and final autoreview passed after fixing the test type issue. latest extensions/codex/src/app-server/attempt-diagnostics.test.ts passed 2 tests; latest focused extension oxfmt, oxlint, git diff --check, and autoreview passed for Codex model-call diagnostic metadata quarantine. latest extensions/codex/src/app-server/run-attempt.context-engine.test.ts passed 25 tests; latest focused extension oxfmt, oxlint, git diff --check, and autoreview passed for Codex context-engine available-tool quarantine. latest extensions/codex/src/app-server/trajectory.test.ts passed 8 tests; latest focused extension oxfmt, oxlint, git diff --check, and autoreview passed for Codex trajectory tool-definition quarantine. latest extensions/copilot/src/attempt.test.ts passed 90 tests; latest focused extension oxfmt, oxlint, git diff --check, and autoreview passed for Copilot SDK session tool catalog quarantine. latest src/agents/embedded-agent-runner/prompt-cache-observability.test.ts passed 8 tests; latest focused core oxfmt, oxlint, git diff --check, and autoreview passed for prompt-cache diagnostic tool-name quarantine. latest src/agents/cli-runner.helpers.test.ts and src/agents/cli-runner/prepare.test.ts passed 59 tests across 2 files; latest focused core oxfmt, oxlint, git diff --check, and autoreview passed for CLI prompt/hash tool-name quarantine. latest src/agents/agent-tools.message-provider-policy.test.ts passed 8 tests; latest focused core oxfmt, oxlint, git diff --check, and autoreview passed for message-provider policy tool-name quarantine. latest src/gateway/tool-resolution.exclude.test.ts passed 12 tests across 4 gateway shards after generated Vitest cache cleanup; latest focused gateway oxfmt, oxlint, git diff --check, and autoreview passed for gateway scoped tool-name quarantine. latest src/gateway/server-methods/tools-catalog.test.ts passed 14 tests across 2 gateway shards; latest focused gateway oxfmt, oxlint, git diff --check, and autoreview passed for gateway tool catalog metadata quarantine. latest src/gateway/mcp-http.test.ts passed 108 tests across 4 gateway shards; latest focused gateway oxfmt, oxlint, git diff --check, and autoreview passed for MCP loopback advertised schema-name quarantine. latest src/agents/tool-search.test.ts passed 26 tests; latest focused core oxfmt, oxlint, git diff --check, and autoreview passed for Tool Search catalog tool-name quarantine. latest src/trajectory/runtime.test.ts passed 13 tests; latest focused trajectory oxfmt, oxlint, git diff --check, and autoreview passed for sidecar tool metadata quarantine. latest src/plugins/tool-descriptor-cache.test.ts passed 7 tests; latest focused plugin oxfmt, oxlint, git diff --check, and autoreview passed after fixing the review-found required-description cache consistency bug. latest src/agents/tools-effective-inventory.test.ts passed 22 tests; latest focused agent oxfmt, oxlint, git diff --check, and autoreview passed for effective-inventory metadata quarantine. latest src/agents/tools-effective-inventory.test.ts passed 23 tests; latest focused MCP inventory oxfmt, oxlint, git diff --check, and autoreview passed for bundled MCP inventory metadata quarantine. latest src/plugin-sdk/tool-plugin.test.ts passed 8 tests; latest focused SDK oxfmt, oxlint with plugin-sdk boundary DTS preparation, git diff --check, and autoreview passed after fixing the empty-description compatibility bug. latest src/plugins/bundled-capability-runtime.test.ts passed 2 tests; latest focused plugin oxfmt, oxlint with plugin-sdk boundary DTS preparation, git diff --check, and autoreview passed for bundled capability runtime captured-tool quarantine. latest src/agents/agent-bundle-mcp-runtime.test.ts passed 31 tests; latest focused agent oxfmt, oxlint, git diff --check, and autoreview passed for bundle-MCP listed-tool catalog quarantine. latest src/agents/agent-bundle-mcp-tools.materialize.test.ts passed 12 tests; latest focused agent oxfmt, oxlint, git diff --check, and autoreview passed after fixing the raw-serverName compatibility bug. latest src/agents/code-mode.test.ts passed 54 tests; latest focused agent oxfmt, oxlint, git diff --check, and autoreview passed for code-mode MCP namespace catalog quarantine. latest src/agents/agent-tools.before-tool-call.integration.e2e.test.ts passed 23 tests; latest focused agent oxfmt, oxlint, git diff --check, and autoreview passed after two fail-closed review fixes. latest src/agents/agent-tool-definition-adapter.test.ts passed 24 tests; latest focused agent oxfmt, oxlint, git diff --check, and autoreview passed for agent tool definition execute quarantine. latest src/agents/agent-tools.abort.test.ts passed 2 tests; latest focused agent oxfmt, oxlint, git diff --check, and autoreview passed for abort-wrapper metadata quarantine. latest src/agents/agent-tools.deferred-followup-guidance.test.ts passed 4 tests; latest focused agent oxfmt, oxlint, git diff --check, and autoreview passed for deferred follow-up metadata quarantine. latest src/agents/agent-tools.model-provider-collision.test.ts passed 15 tests; latest focused agent oxfmt, oxlint, git diff --check, and final autoreview passed after fixing two fail-open review findings. src/llm/providers/openai-responses-shared.test.ts and src/llm/providers/google-shared.convert.test.ts passed 30 tests; focused oxfmt, oxlint, git diff --check, and autoreview passed for the Responses conversion metadata slice. src/llm/model-utils.test.ts and src/llm/providers/openai-responses-shared.test.ts passed 18 tests; focused oxfmt, oxlint, git diff --check, and autoreview passed for the shared thinking metadata slice. src/llm/model-utils.test.ts passed 5 tests; focused oxfmt, oxlint, git diff --check, and autoreview passed for the shared model identity slice. src/llm/model-utils.test.ts passed 8 tests; focused oxfmt, oxlint, git diff --check, and autoreview passed for the shared model cost slice. src/agents/openai-strict-tool-setting.test.ts and src/llm/providers/openai-responses-shared.test.ts passed 18 tests; focused oxfmt, oxlint, git diff --check, and autoreview passed for the OpenAI strict-tool metadata slice.
Observed result after fix: unreadable command nativeNames returns a stable registration error and a following healthy command registers; unreadable package-level Agent, direct agentLoop/agentLoopContinue, and CoreAgentHarness tool names and parameter schemas are skipped during initial state, direct state assignment, prompt/continue run setup, constructor/setter ingestion, and prepareNextTurn context replacement while healthy active tools remain in the prompt turn context, TypeBox metadata is preserved, schema mutation after registration does not affect exposed tool payloads, and empty descriptions remain valid. Unreadable embedded-agent tool/client names are skipped during allowlist, reserved-name, system-prompt, context-engine, diagnostic-log, and prompt-cache diagnostic collection while healthy names remain visible. Provider-normalized tools with unreadable cloned names no longer crash metadata preservation and keep same-index bundle/plugin metadata for later attribution. Provider inspectToolSchemas failures and RuntimePlan logDiagnostics failures now emit warning logs with guarded tool counts instead of throwing through assistant turn setup. Explicit embedded-attempt runtime allowlists now skip unreadable tool names, preserve healthy exact-name matches when plugin metadata lookup throws, and keep plugin-group expansion fail-closed for tools whose metadata cannot be read. Shared tool policy now skips unreadable names during inherited allowlist replacement, message-provider filtering, gateway scoped HTTP/loopback filtering, and audit logging, filters configured policies using guarded normalized names, preserves duplicate healthy tools after message-provider allow/deny rules, keeps healthy gateway tools such as sessions_spawn after excluding read, skips malformed plugin tool descriptors while preserving healthy matrix_room and voice_call catalog rows, skips unreadable MCP advertised schema names while still executing a healthy advertised message tool, and drops tools with unreadable plugin metadata before plugin/group deny expansion so deny policies do not fail open. Unreadable core session tool definition names or parameter schemas are skipped while healthy session definitions remain registered and exposed schema payloads are cloned; bad custom, extension-registered, and base override tool schemas are skipped while healthy session tools remain active; TypeBox metadata is preserved and no-argument undefined schemas are kept. Unreadable Copilot bridged tool schemas or names are skipped while healthy SDK tools remain registered and Copilot SDK parameter payloads are cloned/stringifiable; unreadable realtime custom tool names or nested schema getters are skipped while built-in/healthy tools remain provider-visible; OpenAI native websocket session.update, browser client-secret bodies, Google Live connect configs, and Google browser token constraints preserve healthy tool schemas without throwing on bad siblings; Mistral, Anthropic provider, native Anthropic transport, OpenAI-compatible completions, OpenAI transport-owned Responses/Chat Completions, native Ollama, Amazon Bedrock, Google prompt-cache, and Google transport skip unreadable/proxy-backed request tools while preserving healthy tool payloads; required provider tool-choice settings fail closed instead of downgrading to unconstrained generation when the required tool is quarantined. Doctor and effective inventory now report the owning plugin for unreadable-name pre-normalization quarantines instead of falling back to a source-less tool[0] warning. Codex dynamic tool specs, lookup, middleware, telemetry, and after-tool hooks use the projected tool name after schema projection, so revoked name/description/parameter descriptors cannot crash bridge wrapping or spec construction. Malformed client-hosted tools with unreadable function descriptors, non-string names, or unreadable parameters are skipped while healthy client tools still register; invalid client tools no longer count as callable for tool-search empty-allowlist checks before session conversion drops them. Codex model-call diagnostic tool-definition capture skips tools whose names cannot be read while still recording healthy sibling tools and parameter fallbacks. Codex context-engine available-tool construction skips unreadable tool names while preserving healthy names such as message for context assembly. Codex trajectory context capture skips unreadable tool names, omits unreadable descriptions or schemas, and keeps healthy sibling tool definitions in the recorded sidecar. Copilot session config skips SDK tools whose name or parameters cannot be read, keeps healthy tool objects, and forwards the same filtered names to availableTools. Prompt-cache observability skips unreadable and non-string tool names while keeping healthy trimmed names for cache-break diagnostics. CLI prompt building and bundle-MCP session reuse hashing skip unreadable and non-string tool names while keeping healthy trimmed names such as memory_search in the system prompt report and hash. Tool Search catalog compaction skips unreadable tool names before control filtering, hidden catalog registration, direct fallback exposure, and client-tool catalog appends while preserving healthy tools such as fake_safe_lookup, fake_direct_lookup, and client_safe_lookup. Trajectory tool-definition capture skips unreadable names, omits unreadable descriptions/parameters, and still records healthy sorted tools such as guarded_tool and z-tool. Descriptor-cache capture ignores throwing optional label/displaySummary metadata, skips unreadable name and description required fields, and only appends successfully captured descriptors. Effective inventory skips an unreadable-name tool, preserves a readable sibling with hostile label/description/displaySummary getters as guarded_lookup, and still emits fallback label/description fields instead of throwing. Bundle-MCP effective inventory skips an unreadable-name MCP tool, preserves a readable mcp_lookup sibling with hostile display getters, and still emits fallback MCP inventory metadata instead of throwing. defineToolPlugin() skips an unreadable-name returned tool and a missing-handler returned tool before metadata/register while still registering healthy_tool, and preserves empty_description_tool with description: "". Bundled capability runtime capture skips unreadable, blank, and non-string captured tool names with diagnostics while still registering the healthy healthy_tool sibling and returning it from the registry factory. Bundle-MCP listed-tool cataloging skips unreadable, blank, and non-string tool names plus unreadable inputSchema entries with diagnostics while preserving the healthy trimmed safe_lookup sibling and ignoring hostile title/description getters. Bundle-MCP materialization skips hostile already-loaded catalog rows, keeps healthy bundleProbe__safe_lookup, preserves raw serverName for execute factories, and uses fallback descriptions when display metadata is unreadable. Code-mode MCP namespace projection skips hostile catalog rows with throwing id/schema getters while prompt docs, API declaration files, runtime descriptors, and namespace invocation preserve only the healthy GitHub MCP sibling. Before-tool-call wrapping blocks unreadable tool names, unreadable execute accessors, and exploding ownKeys before policy hooks can be bypassed, while tools with readable identity still execute when optional prepare/finalize getters throw. Agent tool definition conversion skips unreadable execute getters and non-callable execute values while preserving a healthy sibling definition, and healthy executors still run with their original tool receiver. Abort-signal wrapping skips unreadable or non-callable executors for later quarantine, does not enumerate hostile tool metadata while wrapping a readable executor, and still passes a combined abort signal into the healthy executor. Deferred follow-up rewriting skips unreadable tool names while keeping healthy cron guidance, and replaces an exec description without enumerating hostile metadata. Managed web_search suppression, local-model lean filtering, and memory-flush filtering now skip unreadable names without crashing; the restrictive policies keep healthy read/exec or read/write siblings as appropriate. Code Mode catalog filtering now drops unreadable-name descriptors before compaction while still exposing exec/wait and cataloging healthy shell/plugin tools. OpenAI strict-schema diagnostics now fall back to tool[index] for unreadable names and treat unreadable parameters as strict-incompatible so strict mode downgrades instead of aborting setup. OpenAI Responses payload debug summaries and Code Mode payload enforcement now ignore throwing payload tool-name getters while preserving healthy exec/wait rows. OpenAI native web-search payload patching now drops unreadable payload tool identity rows, removes managed web_search, preserves healthy tools, and still injects native web_search. Google shared provider conversion now skips unreadable names/descriptions and revoked or throwing schemas, preserves shared sub-schemas and own __proto__ data properties, keeps legacy meta stripping, and fails closed for forced any when no valid declarations survive. Bedrock forced toolChoice handling now fails closed when the forced name accessor throws instead of treating the request as unconstrained while healthy tools remain available. XAI payload tool compatibility now drops unreadable tool rows during strict-flag cleanup while preserving healthy function declarations and continuing reasoning/payload normalization. Anthropic-family payload compatibility now skips unreadable tool rows and removes unreadable payload tools/tool_choice fields while preserving healthy converted OpenAI function tool definitions. Moonshot thinking payload normalization now tolerates unreadable thinking, tool_choice, model, and thinking.keep fields, removes unreadable object-shaped tool choices, and still applies configured thinking overrides. MiniMax thinking payload fuzzing now proves configurable hostile accessors are patched to disabled thinking, while unpatchable non-configurable accessors fail closed before the user payload hook. BTW payload fuzzing now proves empty tools arrays are stripped, unreadable configurable tools fields are removed, and unremovable tools fields fail closed before send. SiliconFlow payload fuzzing now proves thinking="off" rewrites to null, unreadable configurable thinking fields are replaced, and unpatchable thinking fields fail closed before send. Qwen payload fuzzing now proves hostile configurable enable_thinking and chat_template_kwargs fields are replaced safely, while unremovable OpenAI reasoning fields fail closed before send. OpenRouter payload fuzzing now proves hostile configurable provider routing fields are replaced safely, unpatchable provider routing fails closed, and Anthropic prefill stripping tolerates unreadable trailing assistant tool_calls. Venice payload fuzzing now proves hostile configurable replay fields are cleaned, null reasoning_content is still backfilled to an empty string, and unremovable reasoning fields fail closed before send. Fireworks payload fuzzing now proves hostile configurable thinking fields are replaced safely and unremovable reasoning fields fail closed before send. vLLM payload fuzzing now proves hostile configurable chat_template_kwargs / enable_thinking fields are replaced safely, non-enumerable kwargs stay non-serialized, mixed Qwen chat-template/top-level thinking fields are removed, and unremovable reasoning fields fail closed before send. OpenAI response-format fuzzing now proves Chat Completions rejects dynamic response_format.json_schema fields before request serialization, Responses copies only serializable json_schema data fields while preserving a literal __proto__ key, and dynamic Responses schema fields fail closed with stable OpenAI-owned errors. Embedded-agent extra-param fuzzing now proves dynamic configured, request override, and provider-runtime response_format/responseFormat accessors are skipped while healthy sibling params survive, and explicit empty prepared params remain a valid no-params result instead of recomputing defaults. Max-token alias fuzzing now proves dynamic alias accessors are skipped in favor of healthy fallback aliases, canonicalization does not invoke hostile getters, and unremovable conflicting aliases fail closed before provider payload construction. Prompt-cache param fuzzing now proves dynamic cacheRetention and cacheControlTtl accessors are ignored without crashing, healthy explicit and legacy cache settings still resolve, and inherited cache params are not treated as explicit config. Model metadata fuzzing now proves hostile setup-time and call-time model/compat accessors are ignored across extra-param cache fingerprinting, prompt-cache retention, provider attribution, OpenAI Responses policy, OpenAI-compatible wrapper predicates, OpenRouter/proxy cache headers, MiniMax thinking/fast-mode, and MiMo/DeepSeek compatibility checks while healthy model metadata still drives the existing wrappers. Anthropic-family payload compatibility metadata fuzzing now proves hostile model api, model compat, and compat flag accessors are ignored before payload conversion while healthy data-property compat flags still enable the OpenAI-shaped Anthropic tool payload conversion. OpenAI reasoning metadata fuzzing now proves hostile model id/compat, hostile compat effort metadata, and hostile compat reasoning-map accessors are ignored while healthy data-property and built-in effort maps still drive fallback selection. Plugin SDK Google thinking metadata fuzzing now proves hostile model api and id accessors are ignored before thinking payload sanitization while healthy own data-property metadata still activates the Google sanitizer. Google shared thinking model-id fuzzing now proves hostile model id accessors are ignored during Gemini 3/Gemma 4 detection, simple-stream budget selection, and disabled-thinking config selection while unreadable ids fall back to generic thinking behavior. Google conversion metadata fuzzing now proves hostile model id, provider, api, and input accessors are ignored during shared transform/image downgrade, Google message conversion, assistant output initialization, and request model naming, with unreadable input falling back to non-vision placeholder behavior. OpenAI Responses conversion metadata fuzzing now proves hostile model id, provider, api, input, and reasoning accessors are ignored during Responses conversion/output setup; unreadable identity drops private thinking while preserving function calls and tool outputs, and readable accessors remain supported. Shared thinking metadata fuzzing now proves unreadable model reasoning/thinkingLevelMap values are treated as non-reasoning, readable accessors remain supported, unreadable thinking-map entries are skipped, and Responses reasoning params fall back safely without dropping healthy tools. Shared model identity fuzzing now proves unreadable model id or provider getters are treated as unequal instead of throwing, while readable accessor-backed identity still compares equal by provider/id. Shared model cost fuzzing now proves hostile top-level cost and nested cost-field getters degrade to zero cost instead of throwing, while readable accessor-backed cost fields still compute normal totals. OpenAI strict-tool metadata fuzzing now proves unreadable model metadata is ignored during strict default resolution and Responses tool conversion while readable accessor-backed native OpenAI metadata still enables strict tools.
OpenAI Completions compat metadata fuzzing now proves hostile top-level compat and nested supportsStrictMode accessors fall back to detected defaults while preserving healthy tool payloads, and unreadable explicit OpenRouter routing metadata fails closed before onPayload without leaking raw getter errors.
OpenAI Completions output identity fuzzing now proves hostile api/provider/id getters cannot bypass the stream error path; the stream result remains reachable with stable fallback identity and no payload dispatch.
Mistral output identity fuzzing now proves hostile api/provider/id getters cannot bypass the stream error path; the stream result remains reachable with stable fallback identity and no Mistral payload dispatch.
Anthropic output identity fuzzing now proves hostile api/provider/id getters cannot bypass the stream error path; the stream result remains reachable with stable fallback identity and no payload dispatch.
Bedrock setup metadata fuzzing now proves hostile provider/id/baseUrl getters cannot bypass the stream error path; the stream result remains reachable with stable fallback identity and no payload dispatch.
Google transport output identity fuzzing now proves hostile provider/id getters cannot bypass the stream error path; the stream result remains reachable with stable fallback identity and no provider payload dispatch.
OpenAI transport output identity fuzzing now proves hostile api/provider/id getters cannot bypass Responses, Azure Responses, or Completions stream error paths; the stream result remains reachable with stable fallback identity and no payload hook dispatch.
Anthropic transport setup identity fuzzing now proves hostile provider/id/baseUrl getters cannot bypass the stream error path; the stream result remains reachable with stable fallback identity and no provider fetch dispatch.
OpenAI Codex Responses output identity fuzzing now proves hostile provider/id getters cannot bypass the native Codex Responses stream error path; the stream result remains reachable with stable fallback identity and no fetch/payload hook dispatch.
What was not tested: Latest retry at ede75b300de used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-codex-responses-output-identity --shell -- "pnpm check:changed"; Crabbox selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 70fac733e57 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-anthropic-transport-setup-identity --shell -- "pnpm check:changed"; Crabbox selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at f42f4f6b0a9 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-transport-output-identity --shell -- "pnpm check:changed"; Crabbox selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at d4962f9b889 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-google-output-identity --shell -- "pnpm check:changed"; Crabbox selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at a79983e6a3e used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-bedrock-setup-metadata --shell -- "pnpm check:changed"; Crabbox selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at c9e46f503cd used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-anthropic-output-identity --shell -- "pnpm check:changed"; Crabbox selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 566f36dc459 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-mistral-output-identity --shell -- "pnpm check:changed"; Crabbox selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 48a7bac63a3 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-completions-output-identity --shell -- "pnpm check:changed"; Crabbox selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 5043fbf6c07 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-completions-compat --shell -- "pnpm check:changed"; Crabbox selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. broad pnpm check:changed has not completed remotely in this environment. Earlier attempts were blocked by low local sparse-sync disk or coordinator auth. After removing the generated 8.9 GiB Vitest cache, node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-gateway --shell -- "pnpm check:changed" selected provider=azure, began sparse clean checkout sync, overlaid local HEAD, then failed before lease allocation because the Crabbox coordinator returned HTTP 401 unauthorized for both run history creation and lease creation. blacksmith testbox list --all also failed earlier with not authenticated, so no Testbox fallback was available from this shell. Full local src/plugins/loader.test.ts was attempted twice for the latest registry slice and repeated an order-dependent failure in supports legacy plugins subscribing to diagnostic events from the root sdk; that same test passed in isolation, and the focused new registry regression passed. Full pnpm check:changed was not run locally because this linked Codex worktree routes broad pnpm gates through Crabbox/Testbox. Latest retry at cf1761a7e89b7d71eba2548cd1bd34f8e2f04a22 used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-tool-search --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at e89cf29ab822b59a7ee7fbd085f1aa33b9177a25 used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-descriptor-cache --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 91e6a678a86 used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-code-mode --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at ea136a7d991 used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-before-hook --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 14aa382841a used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-adapter-execute --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at b4aa83eb613 used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-abort-wrapper --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 0f8579576c3 used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-deferred-followup --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 0b943634a0d used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-filter-names --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 3c725b29935 used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-code-mode-catalog --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at c401e40c432 used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-strict-diagnostics --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 3e9d12e1df6 used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-responses-payload --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 98e31f3a2a0 used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-native-search-payload --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at ac875ddc519 used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-google-shared-tools --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at e45e9a542b9 used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-bedrock-forced-choice --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 70e5a4e3b56 used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-xai-payload-tools --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at ad693c9ea2a used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-anthropic-payload-tools --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 3a81ad5e042 used node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-moonshot-payload-fields --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 35196b3a445 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-minimax-thinking-payload --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 53c7aa2b59e used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-btw-payload-tools --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 28d9526e684 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-siliconflow-thinking-payload --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at eb3797f714b used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-qwen-thinking-payload --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 522a3e1ce36 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openrouter-payload-accessors --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 60bc23a86f6 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-venice-replay-payload --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 9248bf99cab used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-fireworks-kimi-payload --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at a12b77a8722 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-vllm-thinking-payload --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 7991b64dc26 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-response-format --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at f245150ccca used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-extra-params --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 41f6b5f9888 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-max-token-aliases --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 19d7f230d1e used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-prompt-cache-params --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at cf5d2443b42 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-model-cache-metadata --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 6c609b91b6f used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-anthropic-compat-metadata --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 5dba8e154bf used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-reasoning-metadata --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 03fa0bc9a18 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-google-thinking-metadata --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at c5b98a671f5 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-google-thinking-model-ids --shell -- "pnpm check:changed"; Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 51e1f475f00 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-google-conversion-metadata --shell -- "pnpm check:changed"; the first attempt failed sparse-sync preflight with only 890.5 MiB free, then after clearing disposable npm cache Crabbox selected provider=azure, prepared sparse sync, overlaid local HEAD, and failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 114b378aba1 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-responses-conversion-metadata --shell -- "pnpm check:changed"; Crabbox selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 996ff9101a6 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-thinking-metadata --shell -- "pnpm check:changed"; Crabbox selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at 4ee3cbbf380 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-model-identity --shell -- "pnpm check:changed"; Crabbox selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at de7fcb9a2d0 used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-model-cost --shell -- "pnpm check:changed"; Crabbox selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation. Latest retry at da41426cf1c used OPENCLAW_TESTBOX=1 node scripts/crabbox-wrapper.mjs run --label check-changed-tool-schema-fuzz-openai-strict-tool-metadata --shell -- "pnpm check:changed"; Crabbox selected provider=azure, synced from a temporary full checkout, overlaid local HEAD from base 5cf63f295b, then failed before lease allocation with coordinator HTTP 401 unauthorized for run history and lease creation.

@vincentkoc vincentkoc self-assigned this Jun 4, 2026
@openclaw-barnacle openclaw-barnacle Bot added size: M maintainer Maintainer-authored PR labels Jun 4, 2026
@clawsweeper

clawsweeper Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed June 5, 2026, 9:46 AM ET / 13:46 UTC.

Summary
This PR hardens runtime, provider, Codex/Copilot, plugin registration, tool schema, and diagnostic paths by snapshotting or quarantining hostile plugin/provider/tool metadata and adding focused regression tests.

Reproducibility: no. high-confidence current-main repro was executed. Source inspection and the PR's focused tests show the hostile-accessor paths, but this read-only review did not run tests.

Review metrics: 1 noteworthy metric.

  • Public SDK exports: 1 function, 2 types added. These exports become plugin-facing API through agent-harness-runtime and need the public SDK contract decision before merge.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🐚 platinum hermit
Patch quality: 🦐 gold shrimp
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Resolve the three review findings around SDK export, nested provider metadata, and toolChoice compatibility.
  • [P2] Add broad changed-surface Testbox/Crabbox proof for the latest head when runner disk/capacity allows.
  • Complete the direct sibling Codex source check before any Codex-specific approval or proof-sufficient claim.

Risk before merge

  • [P1] Merging changes malformed forced/required toolChoice setups from provider-side behavior to local fail-closed errors, which can break existing bad-but-working provider/tool configurations on upgrade.
  • [P1] The PR adds public Plugin SDK exports from an internal agent schema projection helper without visible matching docs or explicit maintainer approval for that API contract.
  • [P1] Provider-like registrations still shallow-copy nested object metadata, leaving synthesized media/model catalog rows exposed to post-registration mutable or hostile capability objects.
  • [P1] Codex-specific behavior could not be contract-checked because the required sibling ../codex checkout is absent and this review is read-only.
  • [P1] Focused local proof is extensive, but the visible discussion still lacks a broad changed-surface Testbox/Crabbox gate for the latest 271-file head.

Maintainer options:

  1. Fix the remaining blockers before merge (recommended)
    Deep-clone provider-like nested metadata, resolve the public SDK export contract, and add an explicit maintainer-approved forced/required toolChoice behavior matrix before landing.
  2. Accept the compatibility change explicitly
    Maintainers may choose to keep local fail-closed toolChoice behavior, but the PR should state the upgrade impact and why no compatibility default is desired.
  3. Pause for broader proof
    Because this changes many provider/runtime paths, pause merge until a broad Testbox/Crabbox changed-surface gate and direct Codex source check are available.

Next step before merge

  • [P2] Protected maintainer PR with public SDK and provider compatibility decisions needs human maintainer review; the remaining code issue is concrete but should be handled with those decisions in one follow-up.

Security
Cleared: No concrete secret-handling, dependency, workflow, or supply-chain regression was found in the inspected diff; the remaining concerns are compatibility and public API contract issues.

Review findings

  • [P1] Document or keep the SDK projection export internal — src/plugin-sdk/agent-harness-runtime.ts:181-185
  • [P2] Deep-snapshot provider metadata before catalog reuse — src/plugins/registry.ts:1688-1695
  • [P1] Get approval for fail-closed toolChoice changes — extensions/google/transport-stream.ts:325-326
Review details

Best possible solution:

Land this after deep-snapshotting provider-like nested metadata, either documenting/approving or internalizing the new SDK projection export, and recording maintainer-approved toolChoice upgrade semantics with broad changed-surface proof.

Do we have a high-confidence way to reproduce the issue?

No high-confidence current-main repro was executed. Source inspection and the PR's focused tests show the hostile-accessor paths, but this read-only review did not run tests.

Is this the best way to solve the issue?

No. The hardening direction is plausible, but this exact branch is not the best merge shape until nested provider metadata is snapshotted and the public SDK/toolChoice compatibility decisions are resolved.

Full review comments:

  • [P1] Document or keep the SDK projection export internal — src/plugin-sdk/agent-harness-runtime.ts:181-185
    This adds projectRuntimeCompatibleToolInputSchemas and projection types to the public agent-harness-runtime SDK facade, but I could not find matching docs or an explicit contract decision. Because src/plugin-sdk is third-party plugin API, either document/approve this new contract and upgrade expectations or keep the helper internal to the Codex/runtime caller.
    Confidence: 0.86
  • [P2] Deep-snapshot provider metadata before catalog reuse — src/plugins/registry.ts:1688-1695
    snapshotProviderLikeValue still returns object metadata by reference. Synthesized media catalog rows later expose provider.capabilities, so a plugin-owned nested capability object can still mutate or throw after registration even though the top-level provider fields were snapshotted. Clone JSON-like metadata deeply and add a test with a hostile nested capability object.
    Confidence: 0.83
  • [P1] Get approval for fail-closed toolChoice changes — extensions/google/transport-stream.ts:325-326
    For required/any tool choice, this now throws locally when schema filtering leaves no available tools. That may be safer, but current behavior reached the provider layer, so existing malformed forced-tool setups can break on upgrade unless maintainers explicitly approve the fail-closed matrix or the PR preserves compatibility by default.
    Confidence: 0.79

Overall correctness: patch is incorrect
Overall confidence: 0.78

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 520992a1defd.

Label changes

Label justifications:

  • P2: This is a broad but non-emergency runtime hardening PR with concrete compatibility and API-contract blockers before merge.
  • merge-risk: 🚨 compatibility: The PR changes public Plugin SDK surface and fail-closed provider/toolChoice behavior that can affect existing plugin and provider setups on upgrade.
  • merge-risk: 🚨 auth-provider: Provider/model metadata and toolChoice routing changes can alter provider dispatch or fail before provider send, which is not settled by ordinary tests alone.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🐚 platinum hermit and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Not applicable: The contributor proof gate is not applicable to this maintainer-authored PR; the discussion contains extensive focused local test proof, but broad changed-surface proof remains a merge risk.
Evidence reviewed

What I checked:

  • Repository policy applied: Root and scoped AGENTS.md guidance was read; plugin/provider routing, public SDK exports, Codex-touching work, and compatibility-sensitive fail-closed changes are explicitly review-sensitive here. (AGENTS.md:10, 520992a1defd)
  • Plugin SDK public surface rule: The Plugin SDK guide says not to expose implementation convenience from src/agents internals unless intentionally promoting a supported public contract, and requires docs/package/API baseline alignment for public subpath changes. (src/plugin-sdk/AGENTS.md:30, 520992a1defd)
  • New public SDK export: The PR exports projectRuntimeCompatibleToolInputSchemas and two projection types through the public agent-harness-runtime SDK facade, but repository/docs search only found these names in code, not docs. (src/plugin-sdk/agent-harness-runtime.ts:181, 4c78b7babbcc)
  • Provider-like snapshot gap: The new snapshotProviderLikeValue binds functions and shallow-copies arrays, but returns nested object metadata by reference, so capability objects can still escape the registration snapshot. (src/plugins/registry.ts:1688, 4c78b7babbcc)
  • Catalog reuses nested capability metadata: Synthesized media catalog rows copy params.provider.capabilities directly into catalog entries, making the shallow provider-like snapshot observable after registration. (packages/media-generation-core/src/catalog.ts:60, 4c78b7babbcc)
  • ToolChoice compatibility change: Current main always maps Google required/any tool choice to ANY, while the PR throws locally when schema filtering leaves no tools, which is an observable fail-closed upgrade change. (extensions/google/transport-stream.ts:325, 4c78b7babbcc)

Likely related people:

  • Vincent Koc: Authored the latest PR commits that add the provider-like, plugin-registration, and harness snapshot paths under review. (role: current PR implementer; confidence: medium; commits: 8a204f37ef0d, 4c78b7babbcc, 654b06ef4787; files: src/plugins/registry.ts, src/plugin-sdk/agent-harness-runtime.ts, extensions/google/transport-stream.ts)
  • Peter Steinberger: Local blame in the shallow checkout attributes the current main provider registration, media catalog, and Google toolChoice baseline lines to commit 9fd5f9e. (role: current-main history holder; confidence: low; commits: 9fd5f9ee7ca0; files: src/plugins/registry.ts, packages/media-generation-core/src/catalog.ts, extensions/google/transport-stream.ts)
  • byungskers: Raised the same forced/required toolChoice compatibility concern in the PR discussion, making them useful context for maintainer routing. (role: reviewer; confidence: medium; files: extensions/google/transport-stream.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@vincentkoc
vincentkoc force-pushed the fuzz-tool-schema-next220-20260604 branch from 6fb953a to bd33c67 Compare June 4, 2026 16:30
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 4, 2026
@vincentkoc vincentkoc changed the title fix(plugins): snapshot command registrations fix(runtime): snapshot tool definitions Jun 4, 2026
@vincentkoc
vincentkoc force-pushed the fuzz-tool-schema-next220-20260604 branch from 0eb94b6 to ce32835 Compare June 4, 2026 16:47
@vincentkoc
vincentkoc force-pushed the fuzz-tool-schema-next220-20260604 branch from 2df5e8e to 288a864 Compare June 4, 2026 16:58
@clawsweeper clawsweeper Bot added P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Jun 4, 2026
@vincentkoc
vincentkoc force-pushed the fuzz-tool-schema-next220-20260604 branch from 288a864 to 61a4962 Compare June 4, 2026 17:15
@vincentkoc
vincentkoc force-pushed the fuzz-tool-schema-next220-20260604 branch from 61a4962 to b0dde24 Compare June 4, 2026 17:47
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Jun 4, 2026
@vincentkoc
vincentkoc force-pushed the fuzz-tool-schema-next220-20260604 branch 3 times, most recently from 08ab04c to 0adce9a Compare June 4, 2026 18:16
@clawsweeper clawsweeper Bot added status: 🛠️ actively grinding The PR author has acted after the latest ClawSweeper review and work remains. rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Jun 4, 2026
@vincentkoc

Copy link
Copy Markdown
Member Author

Behavior addressed: trusted tool policy registrations now snapshot plugin-owned id, description, and evaluate fields before storing the registry record, so the assistant pre-tool-call policy path no longer re-reads volatile policy accessors after registration.
Real environment tested: local linked OpenClaw worktree on branch fuzz-tool-schema-next220-20260604, commit 4c7e815dc68.
Exact steps or command run after this patch: node scripts/run-vitest.mjs run src/plugins/contracts/trusted-tool-policy-registration.contract.test.ts --reporter=dot; ./node_modules/.bin/oxfmt --check src/plugins/registry.ts src/plugins/contracts/trusted-tool-policy-registration.contract.test.ts; git diff --check && git diff --cached --check; OPENCLAW_OXLINT_SKIP_PREPARE=1 node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/registry.ts src/plugins/contracts/trusted-tool-policy-registration.contract.test.ts; .agents/skills/autoreview/scripts/autoreview --mode local.
Evidence after fix: focused Vitest passed 1 shard, 1 file, 1 test; oxfmt passed; diff whitespace checks passed; targeted oxlint passed; autoreview reported no accepted/actionable findings with overall: patch is correct (0.86).
Observed result after fix: the new contract test registers a trusted tool policy whose id, description, and evaluate getters throw on re-read, then runs the real trusted policy execution path; execution uses the stored evaluator and does not touch the getters again.
What was not tested: broad pnpm check:changed / Crabbox or Testbox proof was not rerun because local free disk remains below the sparse-sync wrapper's 1.00 GiB safety floor.

@vincentkoc

Copy link
Copy Markdown
Member Author

Behavior addressed: plugin tool metadata registrations now snapshot plugin-owned toolName, displayName, description, risk, and tags before storing the registry record, so effective tool inventory projection no longer re-reads volatile metadata accessors after registration.
Real environment tested: local linked OpenClaw worktree on branch fuzz-tool-schema-next220-20260604, commit 5366dbda138.
Exact steps or command run after this patch: node scripts/run-vitest.mjs run src/plugins/contracts/tool-metadata-registration.contract.test.ts --reporter=dot; ./node_modules/.bin/oxfmt --check src/plugins/registry.ts src/plugins/contracts/tool-metadata-registration.contract.test.ts; git diff --check && git diff --cached --check; OPENCLAW_OXLINT_SKIP_PREPARE=1 node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/registry.ts src/plugins/contracts/tool-metadata-registration.contract.test.ts; .agents/skills/autoreview/scripts/autoreview --mode local.
Evidence after fix: focused Vitest passed 1 shard, 1 file, 1 test; oxfmt passed; diff whitespace checks passed; targeted oxlint passed; autoreview reported no accepted/actionable findings with overall: patch is correct (0.84).
Observed result after fix: the new contract test registers tool metadata whose getters throw on re-read, then projects a plugin-owned tool through buildEffectiveToolInventoryEntries; inventory uses the stored metadata snapshot for label, description, risk, and tags without touching the plugin getters again.
What was not tested: broad pnpm check:changed / Crabbox or Testbox proof was not rerun because local free disk remains below the sparse-sync wrapper's 1.00 GiB safety floor.

@vincentkoc

Copy link
Copy Markdown
Member Author

Proof update: node invoke policy snapshots

Behavior addressed: Plugin registerNodeInvokePolicy now snapshots plugin-owned policy fields once during registration, normalizes static command/default-platform fields from that snapshot, and stores only the captured handler callback for runtime use.

Real environment tested: Local linked OpenClaw worktree on branch fuzz-tool-schema-next220-20260604 at fdcb82cd6c034b75aaf3145e3cb162a73aaae512.

Exact steps or command run after this patch:

  • node scripts/run-vitest.mjs run src/plugins/contracts/node-invoke-policy-registration.contract.test.ts --reporter=dot
  • ./node_modules/.bin/oxfmt --check src/plugins/registry.ts src/plugins/contracts/node-invoke-policy-registration.contract.test.ts
  • git diff --check && git diff --cached --check
  • OPENCLAW_OXLINT_SKIP_PREPARE=1 node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/registry.ts src/plugins/contracts/node-invoke-policy-registration.contract.test.ts
  • .agents/skills/autoreview/scripts/autoreview --mode local

Evidence after fix: Added src/plugins/contracts/node-invoke-policy-registration.contract.test.ts, which registers getter-backed volatile node invoke policy fields that throw on re-read, then projects the stored policy through node command allowlist and iOS foreground restriction helpers and executes the captured handler.

Observed result after fix: Focused Vitest passed 1 shard / 1 file / 1 test. Oxfmt check, whitespace diff checks, targeted oxlint, and local autoreview all passed. Autoreview reported overall: patch is correct (0.88) with no accepted/actionable findings.

What was not tested: Broad pnpm check:changed / Crabbox or Testbox proof was not retried because local free disk is still below the Crabbox/Testbox sparse-sync wrapper's 1.00 GiB safety floor.

@vincentkoc

Copy link
Copy Markdown
Member Author

Proof update: node host command snapshots

Behavior addressed: Plugin registerNodeHostCommand now snapshots plugin-owned command fields once during registration, normalizes command / cap from that snapshot, validates the captured handler, and stores an explicit command object instead of spreading plugin-owned accessors.

Real environment tested: Local linked OpenClaw worktree on branch fuzz-tool-schema-next220-20260604 at 1ed8ada6f52dc4a4b0f881b6cb9decb687140186.

Exact steps or command run after this patch:

  • node scripts/run-vitest.mjs run src/plugins/contracts/node-host-command-registration.contract.test.ts --reporter=dot
  • ./node_modules/.bin/oxfmt --check src/plugins/registry.ts src/plugins/contracts/node-host-command-registration.contract.test.ts
  • git diff --check && git diff --cached --check
  • OPENCLAW_OXLINT_SKIP_PREPARE=1 node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/registry.ts src/plugins/contracts/node-host-command-registration.contract.test.ts
  • .agents/skills/autoreview/scripts/autoreview --mode local

Evidence after fix: Added src/plugins/contracts/node-host-command-registration.contract.test.ts, which registers getter-backed volatile node host command fields that throw on re-read, then projects the stored command through listDangerousPluginNodeCommands and executes the captured handler.

Observed result after fix: Focused Vitest passed 1 shard / 1 file / 1 test. Oxfmt check, whitespace diff checks, targeted oxlint, and local autoreview all passed. Autoreview reported overall: patch is correct (0.86) with no accepted/actionable findings.

What was not tested: Broad pnpm check:changed / Crabbox or Testbox proof was not retried because local free disk is still below the Crabbox/Testbox sparse-sync wrapper's 1.00 GiB safety floor.

@vincentkoc

Copy link
Copy Markdown
Member Author

Proof update: service registration snapshots

Behavior addressed: Plugin registerService now snapshots service id, start, and optional stop during registration, stores an explicit service object, preserves lifecycle method receivers by calling captured callbacks with the original service object as this, and keeps same-plugin duplicate registration idempotence before reading unused lifecycle getters.

Real environment tested: Local linked OpenClaw worktree on branch fuzz-tool-schema-next220-20260604 at e886edc5d655370b5f1ebdbc2dfee6b35c3703f4.

Exact steps or command run after this patch:

  • node scripts/run-vitest.mjs run src/plugins/contracts/service-registration.contract.test.ts --reporter=dot
  • ./node_modules/.bin/oxfmt --check src/plugins/registry.ts src/plugins/contracts/service-registration.contract.test.ts
  • git diff --check && git diff --cached --check
  • OPENCLAW_OXLINT_SKIP_PREPARE=1 node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/registry.ts src/plugins/contracts/service-registration.contract.test.ts
  • .agents/skills/autoreview/scripts/autoreview --mode local

Evidence after fix: Added src/plugins/contracts/service-registration.contract.test.ts, which registers volatile service getters that throw on re-read, starts/stops through startPluginServices, verifies callback receiver compatibility, and covers same-plugin duplicate services so duplicate start / stop getters are not read after duplicate id is known.

Observed result after fix: Focused Vitest passed 1 shard / 1 file / 2 tests. Oxfmt check, whitespace diff checks, targeted oxlint, and final local autoreview all passed. Autoreview first caught receiver preservation and duplicate idempotence issues; both were fixed. Final autoreview reported overall: patch is correct (0.84) with no accepted/actionable findings.

What was not tested: Broad pnpm check:changed / Crabbox or Testbox proof was not retried because local free disk is still below the Crabbox/Testbox sparse-sync wrapper's 1.00 GiB safety floor.

@vincentkoc

Copy link
Copy Markdown
Member Author

Proof update: gateway discovery service snapshots

Behavior addressed: Plugin registerGatewayDiscoveryService now snapshots discovery service id and advertise during registration, stores an explicit service object, preserves advertise method receivers by calling the captured callback with the original service object as this, and keeps same-plugin duplicate registration idempotence before reading unused duplicate advertise getters.

Real environment tested: Local linked OpenClaw worktree on branch fuzz-tool-schema-next220-20260604 at 42f61219ed1ac43098a1f8d02ed24f458ad4bc69.

Exact steps or command run after this patch:

  • node scripts/run-vitest.mjs run src/plugins/contracts/gateway-discovery-service-registration.contract.test.ts --reporter=dot
  • ./node_modules/.bin/oxfmt --check src/plugins/registry.ts src/plugins/contracts/gateway-discovery-service-registration.contract.test.ts
  • git diff --check && git diff --cached --check
  • OPENCLAW_OXLINT_SKIP_PREPARE=1 node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/registry.ts src/plugins/contracts/gateway-discovery-service-registration.contract.test.ts
  • .agents/skills/autoreview/scripts/autoreview --mode local

Evidence after fix: Added src/plugins/contracts/gateway-discovery-service-registration.contract.test.ts, which registers volatile discovery service getters that throw on re-read, invokes the stored advertise callback with a real-shaped advertise context, verifies callback receiver compatibility, and covers same-plugin duplicate services so duplicate advertise getters are not read after duplicate id is known.

Observed result after fix: Focused Vitest passed 1 shard / 1 file / 2 tests. Oxfmt check, whitespace diff checks, targeted oxlint, and local autoreview all passed. Autoreview reported overall: patch is correct (0.87) with no accepted/actionable findings.

What was not tested: Broad pnpm check:changed / Crabbox or Testbox proof was not retried because local free disk is still below the Crabbox/Testbox sparse-sync wrapper's 1.00 GiB safety floor.

@vincentkoc

Copy link
Copy Markdown
Member Author

Proof update: command registration snapshots

Behavior addressed: Plugin registerCommand now snapshots command definitions once at registry registration entry, reuses the canonical command-registration snapshot helper, and stores the snapshot in plugin-registry command entries so later command-spec projection does not re-read plugin-owned command accessors.

Real environment tested: Local linked OpenClaw worktree on branch fuzz-tool-schema-next220-20260604 at cc7b1f9c2caaa8b0d2fcd6174baa027f14bd029b.

Exact steps or command run after this patch:

  • node scripts/run-vitest.mjs run src/plugins/contracts/command-registration.contract.test.ts --reporter=dot
  • ./node_modules/.bin/oxfmt --check src/plugins/command-registration.ts src/plugins/registry.ts src/plugins/contracts/command-registration.contract.test.ts
  • git diff --check && git diff --cached --check
  • OPENCLAW_OXLINT_SKIP_PREPARE=1 node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/command-registration.ts src/plugins/registry.ts src/plugins/contracts/command-registration.contract.test.ts
  • .agents/skills/autoreview/scripts/autoreview --mode local

Evidence after fix: Added src/plugins/contracts/command-registration.contract.test.ts, which registers volatile command getters that throw on re-read, then projects stored registry commands through getPluginCommandEntrySpecsFromRegistrations and getPluginCommandSpecsFromRegistrations.

Observed result after fix: Focused Vitest passed 1 shard / 1 file / 1 test. Oxfmt check, whitespace diff checks, targeted oxlint, and local autoreview all passed. Autoreview reported overall: patch is correct (0.84) with no accepted/actionable findings.

What was not tested: Broad pnpm check:changed / Crabbox or Testbox proof was not retried because local free disk is still below the Crabbox/Testbox sparse-sync wrapper's 1.00 GiB safety floor.

@vincentkoc

Copy link
Copy Markdown
Member Author

Proof update: text transform snapshots

Behavior addressed: Plugin registerTextTransforms now snapshots input / output transform arrays and each replacement entry's from / to fields during registration, storing an explicit snapshot so runtime transform resolution and replacement application do not re-read plugin-owned transform accessors.

Real environment tested: Local linked OpenClaw worktree on branch fuzz-tool-schema-next220-20260604 at 1fe17c10cbcbe593a74db3ae9c39561790fbb6df.

Exact steps or command run after this patch:

  • node scripts/run-vitest.mjs run src/plugins/contracts/text-transform-registration.contract.test.ts --reporter=dot
  • ./node_modules/.bin/oxfmt --check src/plugins/registry.ts src/plugins/contracts/text-transform-registration.contract.test.ts
  • git diff --check && git diff --cached --check
  • OPENCLAW_OXLINT_SKIP_PREPARE=1 node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/registry.ts src/plugins/contracts/text-transform-registration.contract.test.ts
  • .agents/skills/autoreview/scripts/autoreview --mode local

Evidence after fix: Added src/plugins/contracts/text-transform-registration.contract.test.ts, which registers volatile transform and replacement getters that throw on re-read, resolves transforms through the active runtime registry, and applies both string and RegExp replacements via applyPluginTextReplacements.

Observed result after fix: Focused Vitest passed 1 shard / 1 file / 1 test. Oxfmt check, whitespace diff checks, targeted oxlint, and local autoreview all passed. Autoreview reported overall: patch is correct (0.86) with no accepted/actionable findings.

What was not tested: Broad pnpm check:changed / Crabbox or Testbox proof was not retried because local free disk is still below the Crabbox/Testbox sparse-sync wrapper's 1.00 GiB safety floor.

@vincentkoc

Copy link
Copy Markdown
Member Author

Behavior addressed: CLI backend registrations now snapshot plugin-owned backend fields before runtime resolution, live-test lookup, text transform merging, or execution callbacks can re-read volatile getters.

Real environment tested: local linked worktree on fuzz-tool-schema-next220-20260604 at da0629d0c20.

Exact steps or command run after this patch:

  • node scripts/run-vitest.mjs run src/plugins/contracts/cli-backend-registration.contract.test.ts --reporter=dot
  • ./node_modules/.bin/oxfmt --check src/plugins/registry.ts src/plugins/contracts/cli-backend-registration.contract.test.ts
  • git diff --check && git diff --cached --check
  • OPENCLAW_OXLINT_SKIP_PREPARE=1 node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/registry.ts src/plugins/contracts/cli-backend-registration.contract.test.ts
  • .agents/skills/autoreview/scripts/autoreview --mode local

Evidence after fix: focused CLI backend contract test passed 1 shard / 1 file / 1 test; oxfmt passed; diff whitespace checks passed; targeted oxlint passed; autoreview reported no accepted/actionable findings and overall: patch is correct (0.82).

Observed result after fix: volatile CLI backend id, config, nested command, modelProvider, liveTest, contextEngineHostCapabilities, text transform, and execution callback getters are read once at registration; runtime resolver paths consume the stored snapshot, and callback wrappers preserve the original backend receiver.

What was not tested: broad Testbox/Crabbox proof was not retried because this machine still has under 1 GiB free disk, below the sparse-sync wrapper safety floor.

@vincentkoc

Copy link
Copy Markdown
Member Author

Behavior addressed: model catalog provider registrations now snapshot plugin-owned provider fields before stored catalog entries or same-plugin overlap merging can re-read volatile getters.

Real environment tested: local linked worktree on fuzz-tool-schema-next220-20260604 at 453ec1e7ec1.

Exact steps or command run after this patch:

  • node scripts/run-vitest.mjs run src/plugins/contracts/model-catalog-registration.contract.test.ts --reporter=dot
  • ./node_modules/.bin/oxfmt --check src/plugins/model-catalog-registration.ts src/plugins/contracts/model-catalog-registration.contract.test.ts
  • git diff --check && git diff --cached --check
  • OPENCLAW_OXLINT_SKIP_PREPARE=1 node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/model-catalog-registration.ts src/plugins/contracts/model-catalog-registration.contract.test.ts
  • .agents/skills/autoreview/scripts/autoreview --mode local

Evidence after fix: focused model catalog contract test passed 1 shard / 1 file / 1 test; oxfmt passed; diff whitespace checks passed; targeted oxlint passed; autoreview reported no accepted/actionable findings and overall: patch is correct (0.83).

Observed result after fix: volatile model catalog provider, kinds, and staticCatalog getters are read once at registration; same-plugin overlapping registrations merge stored hook snapshots, and catalog hook wrappers preserve the original provider receiver.

What was not tested: broad Testbox/Crabbox proof was not retried because this machine still has under 1 GiB free disk, below the sparse-sync wrapper safety floor.

@vincentkoc

Copy link
Copy Markdown
Member Author

Behavior addressed: shared provider-like registrations now snapshot plugin-owned provider fields before runtime capability paths or synthesized media/voice model catalogs can re-read volatile accessors.

Real environment tested: local linked worktree on fuzz-tool-schema-next220-20260604 at 8a204f37ef0.

Exact steps or command run after this patch:

  • node scripts/run-vitest.mjs run src/plugins/contracts/provider-like-registration.contract.test.ts --reporter=dot
  • ./node_modules/.bin/oxfmt --check src/plugins/registry.ts src/plugins/contracts/provider-like-registration.contract.test.ts
  • git diff --check && git diff --cached --check
  • OPENCLAW_OXLINT_SKIP_PREPARE=1 node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/registry.ts src/plugins/contracts/provider-like-registration.contract.test.ts
  • .agents/skills/autoreview/scripts/autoreview --mode local

Evidence after fix: focused provider-like contract test passed 1 shard / 1 file / 3 tests; oxfmt passed; diff whitespace checks passed; targeted oxlint passed; final autoreview reported no accepted/actionable findings and overall: patch is correct (0.78).

Observed result after fix: provider-like registrations read ids once, snapshot explicit public provider fields per family, preserve class/prototype methods, preserve proxy-backed providers that do not enumerate fields, and feed synthesized media/voice catalogs from the stored snapshot. Runtime callbacks keep the original provider receiver.

What was not tested: broad Testbox/Crabbox proof was not retried because this machine still has under 1 GiB free disk, below the sparse-sync wrapper safety floor.

@vincentkoc

Copy link
Copy Markdown
Member Author

Behavior addressed: Embedding and memory embedding provider registrations now snapshot plugin-owned adapter ids and public runtime fields before storing registry/global entries, so later startup or turn-path lookups cannot re-read lazy or throwing adapter accessors. Memory embedding registration preserves the inactive dual-kind memory-slot skip before inspecting adapter fields.

Real environment tested: Local linked OpenClaw worktree fuzz-tool-schema-next220-20260604 on Node/Vitest via repo wrapper; PR branch commit ec1cd7bcec6567c4be04a29e9ad6e80a1dbd147a.

Exact steps or command run after this patch:

node scripts/run-vitest.mjs run src/plugins/contracts/embedding-provider.contract.test.ts src/plugins/contracts/memory-embedding-provider.contract.test.ts --reporter=dot
OPENCLAW_OXLINT_SKIP_PREPARE=1 node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/plugins/registry.ts src/plugins/contracts/embedding-provider.contract.test.ts src/plugins/contracts/memory-embedding-provider.contract.test.ts
./node_modules/.bin/oxfmt --check src/plugins/registry.ts src/plugins/contracts/embedding-provider.contract.test.ts src/plugins/contracts/memory-embedding-provider.contract.test.ts
git diff --check
git diff --cached --check
.agents/skills/autoreview/scripts/autoreview --mode local

Evidence after fix: Focused Vitest passed 2 files / 11 tests, including volatile embedding adapters, volatile memory embedding adapters, and inactive dual-kind memory adapters that must warn without reading id. Targeted oxlint passed. oxfmt check passed. git diff --check and git diff --cached --check passed. Autoreview initially caught the inactive dual-kind id-read regression; after the fix, final autoreview reported no accepted/actionable findings and overall: patch is correct (0.82).

Observed result after fix: Stored embedding adapters retain normalized ids, captured defaults, setup hooks, create callbacks, and memory auto-selection callbacks without repeated getter reads; callable fields still run with the original adapter receiver.

What was not tested: Broad Crabbox/Testbox proof was not retried because local free disk remains below the sparse-sync wrapper's 1.00 GiB safety floor.

@vincentkoc

Copy link
Copy Markdown
Member Author

Behavior addressed: Agent harness registration now snapshots plugin-owned harness ids and runtime fields before storing local/global registry entries. Direct registerAgentHarness and plugin api.registerAgentHarness use the same snapshot path, so later harness selection, lookup, reset/dispose, and run dispatch do not re-read lazy or throwing harness accessors, and callable fields keep the original harness receiver.

Real environment tested: Local linked OpenClaw worktree fuzz-tool-schema-next220-20260604 on Node/Vitest via repo wrapper; PR branch commit 4c78b7babbcc4465a3864535479241fa4ef4d02b.

Exact steps or command run after this patch:

node scripts/run-vitest.mjs run src/plugins/contracts/agent-harness-registration.contract.test.ts src/agents/harness/registry.test.ts --reporter=dot
OPENCLAW_OXLINT_SKIP_PREPARE=1 node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/agents/harness/registry.ts src/agents/harness/registry.test.ts src/plugins/registry.ts src/plugins/contracts/agent-harness-registration.contract.test.ts
./node_modules/.bin/oxfmt --check src/agents/harness/registry.ts src/agents/harness/registry.test.ts src/plugins/registry.ts src/plugins/contracts/agent-harness-registration.contract.test.ts
git diff --check
git diff --cached --check
.agents/skills/autoreview/scripts/autoreview --mode local

Evidence after fix: Focused Vitest passed 2 shards, 2 files, 11 tests, including direct global harness registry coverage and plugin SDK harness registration coverage for volatile getters, owner attribution, runtime lookup, reset/dispose, runAttempt, and receiver preservation. Targeted oxlint passed. oxfmt check passed. git diff --check and git diff --cached --check passed. Autoreview reported no accepted/actionable findings and overall: patch is correct (0.83).

Observed result after fix: Stored harness registrations expose stable id, label, pluginId, metadata, and callbacks after registration; later reads do not touch the original plugin-owned accessors, and callbacks still run with the original harness object as receiver.

What was not tested: Broad Crabbox/Testbox proof was not retried because local free disk remains below the sparse-sync wrapper's 1.00 GiB safety floor.

@vincentkoc

Copy link
Copy Markdown
Member Author

Closing this draft in favor of the smaller reviewed replacement PRs:

Those carry the critical runtime-safety pieces from this stack with focused proof and autoreview. The remaining fuzz-hardening commits can be re-cut later only if they still justify their surface area.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling commands Command implementations docs Improvements or additions to documentation extensions: amazon-bedrock extensions: codex extensions: copilot extensions: google extensions: ollama extensions: openai extensions: openrouter extensions: venice extensions: vllm extensions: xai gateway Gateway runtime maintainer Maintainer-authored PR merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. size: XL status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants