Skip to content

fix(llm): preserve structured tool result text across providers#97742

Merged
obviyus merged 35 commits into
openclaw:mainfrom
snowzlmbot:fix/96857-tool-result-text-clean
Jul 1, 2026
Merged

fix(llm): preserve structured tool result text across providers#97742
obviyus merged 35 commits into
openclaw:mainfrom
snowzlmbot:fix/96857-tool-result-text-clean

Conversation

@snowzlmbot

@snowzlmbot snowzlmbot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

Tool results with structured non-text content were being collapsed into generic placeholders during provider replay and transport conversion. In practice, structured non-media blocks could become (see attached image), (see attached media), or empty/no-output text, which loses useful tool output and can mislead the model.

This PR preserves explicit text first, serializes structured non-media blocks as redacted JSON text, and keeps media-only fallbacks type-aware.

Current Head

721b4898965b2b01504271face7d52d2d4af277d

Why This Change Was Made

The canonical user-facing problem is tracked in #96857. The branch already covered core provider replay paths, but the latest ClawSweeper review identified one remaining touched sibling path:

  • extensions/google/transport-stream.ts: the bundled Google transport still built functionResponse.response.output from explicit text blocks or a media placeholder only, so structured-only non-media tool results could still become empty output.

This head closes that Google transport gap without importing core src/** helpers into plugin production code. The extension now has boundary-safe structured extraction for Google tool results before media/no-output fallback.

User Impact

  • Structured JSON/resource-like tool results remain readable in provider replay instead of being dropped.
  • Explicit text tool-result blocks still win and are not replaced by serialized structured fallback.
  • Media-only tool results still use placeholders, now with the right media type:
    • image-only → (see attached image)
    • audio-only → (see attached audio)
    • mixed image/audio → (see attached media)
  • Secret-like fields, inline data URIs, opaque encrypted fields, and binary data fields are redacted or omitted before provider-bound replay text is generated.
  • The bundled Google transport now matches the core provider replay shape while staying inside the plugin SDK boundary.

Implementation

  • Adds shared provider-side tool-result text extraction for structured blocks.
  • Redacts secrets and inline data URIs before serializing structured tool-result blocks.
  • Omits opaque/binary fields instead of replaying raw payloads.
  • Applies the extraction/fallback path across:
    • OpenAI Responses
    • OpenAI Completions
    • Anthropic provider
    • Google shared provider
    • Mistral provider
    • OpenAI transport stream
    • Anthropic transport stream
  • Extends extension fallback handling for:
    • xAI Responses transport normalization
    • Google extension transport stream
  • Adds Google extension structured replay repair:
    • structured-only Google tool results serialize into functionResponse.response.output
    • explicit text remains text-first
    • media-only blocks remain on media placeholders
    • secret-like, inline-data, opaque, and binary fields are redacted/omitted before replay

Regression Coverage

Added or updated focused coverage for:

  • src/llm/providers/tool-result-text.test.ts
    • explicit text wins
    • structured non-media blocks serialize as JSON text
    • media-only blocks are omitted from text extraction
    • image/audio/mixed media placeholder selection
    • inline data URI and binary-field redaction
  • src/llm/providers/openai-responses-shared.test.ts
    • structured tool-result output is not converted to image placeholder
    • audio-only output uses audio placeholder rather than image/no-output fallback
  • src/agents/openai-transport-stream.test.ts
    • structured output is preserved rather than collapsed to image placeholder
  • src/agents/anthropic-transport-stream.test.ts
    • structured blocks are serialized
    • structured blocks are preserved alongside images
  • extensions/google/transport-stream.test.ts
    • structured-only Google tool-result output becomes functionResponse.response.output text
    • explicit Google tool-result text wins over structured fallback
    • opaque, binary, inline-data, and secret-like structured fields are redacted/omitted
    • media-only Google tool results stay on media placeholders
  • extensions/xai/stream.test.ts
    • audio-only function output uses audio placeholder

Evidence

Review result addressed

Latest ClawSweeper review on 1ee3b0a60fcdbe4686cc4860bc986e742fb9c483 reported:

  • Finding: [P2] Serialize structured Google tool results before fallback
  • Location: extensions/google/transport-stream.ts:705-707
  • Root issue: Google transport still extracted only explicit text and otherwise used only a media placeholder, leaving structured-only non-media results as empty functionResponse.response.output.

This head addresses that finding with extension-boundary-safe structured extraction and focused Google transport regression coverage.

Current branch author-side validation

  • node scripts/run-vitest.mjs extensions/google/transport-stream.test.ts --maxWorkers=1 --reporter=dot
    • Result: passed, 1 file / 72 tests.
    • Covers the new Google structured-only replay path, explicit-text-first behavior, media-only placeholders, and redaction/omission behavior.
  • pnpm exec oxfmt extensions/google/transport-stream.ts extensions/google/transport-stream.test.ts
    • Result: completed for both changed files.
  • node --check extensions/google/transport-stream.ts
    • Result: passed before the focused test run.
  • node --check extensions/google/transport-stream.test.ts
    • Result: passed before the focused test run.
  • git diff --check
    • Result: passed before commit.

Latest patch-quality update

Current head 721b4898965b2b01504271face7d52d2d4af277d keeps replay helpers out of the public Plugin SDK while preserving the bundled Google transport repair:

  • src/plugin-sdk/provider-transport-runtime.ts does not export extractToolResultText or describeToolResultMediaPlaceholder; those helpers remain outside the public provider transport runtime surface.
  • src/plugin-sdk/provider-transport-replay-runtime.ts remains a private/local-only replay helper subpath and is excluded from packaged public SDK files.
  • src/plugins/sdk-alias.ts now registers provider-transport-replay-runtime as a private Plugin SDK subpath owned by the bundled Google provider plugin / @openclaw/google-plugin, so Google can resolve it without OPENCLAW_ENABLE_PRIVATE_QA_CLI while unrelated bundled or installed plugins cannot.
  • src/plugins/sdk-alias.test.ts covers both the new Google private-owner alias path and normal public QA alias resolution without private QA mode.
  • extensions/tsconfig.package-boundary.paths.json keeps the private replay runtime available to package-boundary compilation without making it a public package export.

Author-side validation for this head:

  • node scripts/run-vitest.mjs src/plugins/sdk-alias.test.ts --maxWorkers=1 --reporter=dot passed, covering 1 file / 77 tests.
  • pnpm plugin-sdk:surface:check passed; public SDK surface remains at 322 public entrypoints / 10401 public exports / 5220 public function exports, with provider-transport-replay-runtime counted only in local-only SDK entrypoints.
  • pnpm lint:plugins:plugin-sdk-subpaths-exported passed.
  • OPENCLAW_EXTENSION_BOUNDARY_CONCURRENCY=4 pnpm test:extensions:package-boundary:compile passed for 116 bundled extension packages, including google and xai.
  • node scripts/run-vitest.mjs src/plugins/contracts/plugin-sdk-subpaths.test.ts test/scripts/plugin-sdk-surface-report.test.ts src/llm/providers/tool-result-text.test.ts src/logging/redact.test.ts extensions/google/transport-stream.test.ts --maxWorkers=1 --reporter=dot passed across 5 focused shards.
  • pnpm exec oxlint src/plugins/sdk-alias.ts src/plugins/sdk-alias.test.ts src/plugin-sdk/provider-transport-runtime.ts src/plugin-sdk/provider-transport-replay-runtime.ts extensions/google/transport-stream.ts extensions/google/transport-stream.test.ts src/llm/providers/tool-result-text.ts src/llm/providers/tool-result-text.test.ts src/logging/redact.ts src/logging/redact.test.ts passed with 0 warnings and 0 errors.
  • git diff --check passed.

Current-head GitHub Actions evidence:

Existing provider replay proof retained from the previous detailed PR body

The previous current-head evidence remains relevant to the core provider replay slice and is repeated here so the PR body stays globally consistent instead of losing proof while the branch advances:

CI failures observed before this update

This body update restores authored Evidence, and the code commit retriggers CI for the Google transport repair.

Latest CI follow-up repair

Current head 721b4898965b2b01504271face7d52d2d4af277d refreshes the latest patch-quality repair after the public SDK surface review:

  • Replay helpers are no longer exposed through plugin-sdk/provider-transport-runtime.
  • provider-transport-replay-runtime is private/local-only and owned by Google provider runtime loading rather than exported as public Plugin SDK API.
  • Focused alias coverage verifies Google ownership and verifies public QA aliases still resolve in normal non-private mode.
  • Focused author-side checks above cover SDK surface, subpath exports, package-boundary compile, alias behavior, provider replay/redaction tests, and relevant oxlint files.

Risk

Low to moderate:

  • Text tool results keep existing explicit text behavior.
  • Structured non-media data is serialized with redaction/truncation before provider conversion.
  • Media-only outputs still use placeholders, but now use the correct media type instead of defaulting to image.
  • Binary payloads and opaque encrypted fields are not replayed as raw text.
  • The Google extension implementation stays within plugin SDK boundaries and does not deep-import core provider helpers.

Rollback

Revert this PR to restore the previous provider/transport placeholder behavior.

@openclaw-barnacle openclaw-barnacle Bot added agents Agent runtime and tooling size: M labels Jun 29, 2026
@clawsweeper

clawsweeper Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed July 1, 2026, 2:21 AM ET / 06:21 UTC.

Summary
The PR changes provider and transport replay paths so structured tool-result content is serialized/redacted as text and media-only outputs get type-aware placeholders.

PR surface: Source +320, Tests +1027, Docs 0, Other 0. Total +1347 across 29 files.

Reproducibility: yes. Current main filters several tool-result replay paths to explicit text blocks before falling back to image/no-output placeholders, and the linked issue includes live Discord/Telegram evidence of text outputs degrading to placeholders.

Review metrics: 1 noteworthy metric.

  • Public SDK helper exports: 2 added. The PR exposes tool-result replay helpers through an existing public Plugin SDK subpath, which makes the helper behavior a plugin-facing contract.

Stored data model
Persistent data-model change detected: serialized state: src/llm/providers/tool-result-text.ts. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #96857
Summary: This PR is the current candidate fix for the canonical tool-result placeholder bug; related PRs cover narrower or predecessor slices.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🐚 platinum hermit
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 merge conflict and rerun focused exact-head provider/replay/redaction and SDK-surface checks.
  • Refresh the PR body so the stated current head and evidence match aa5b08d or its successor.

Risk before merge

  • [P1] The live PR is dirty/conflicting, so maintainers need a resolved merge result before trusting checks or deciding to land.
  • [P1] The PR body evidence is stale relative to the live head, which makes exact-head proof and review harder to audit.
  • [P1] Structured tool-result serialization expands a redaction-sensitive provider boundary; mistakes could leak or over-redact model-visible tool data.
  • [P1] The helper export through plugin-sdk/provider-transport-runtime turns replay behavior into public Plugin SDK surface that maintainers should consciously accept.

Maintainer options:

  1. Resolve conflicts and rerun exact-head gates (recommended)
    Update the branch onto current main, refresh the body to the actual head, and require the focused provider/replay/redaction plus SDK-surface gates on that resolved head.
  2. Accept the public SDK seam deliberately
    Maintainers can keep the provider-transport-runtime exports if they are comfortable making the replay helpers part of the public Plugin SDK contract.
  3. Split SDK surface if contract is not accepted
    If the public helper export is not intended, pause this PR and keep the replay helper internal while preserving the provider bug fix.

Next step before merge

  • [P2] The remaining blocker is maintainer handling of a conflicting live branch plus acceptance of the public SDK/redaction/replay tradeoffs, not a narrow automated code repair.

Security
Cleared: No discrete security or supply-chain defect was found, but structured replay redaction remains a maintainer-visible merge risk.

Review details

Best possible solution:

Keep this PR open as the active fix candidate, resolve the base conflicts, refresh the stale PR body head/evidence, and rerun exact-head provider, SDK surface, redaction, and package-boundary checks before maintainer merge review.

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

Yes. Current main filters several tool-result replay paths to explicit text blocks before falling back to image/no-output placeholders, and the linked issue includes live Discord/Telegram evidence of text outputs degrading to placeholders.

Is this the best way to solve the issue?

Yes, with upgrade-risk handling. A shared extractor used across provider and transport sibling paths is the right layer, but the live branch needs conflict resolution and maintainer acceptance of the public SDK export before merge.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 0c7bac34ae68.

Label changes

Label changes:

  • add merge-risk: 🚨 compatibility: The branch adds public Plugin SDK exports, which maintainers should treat as a contract decision before merge.
  • add rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • remove rating: 🦞 diamond lobster: Current PR rating is rating: 🐚 platinum hermit, so this older rating label is no longer current.
  • remove merge-risk: 🚨 availability: Current PR review merge-risk labels are merge-risk: 🚨 message-delivery, merge-risk: 🚨 security-boundary, merge-risk: 🚨 compatibility.

Label justifications:

  • P1: The PR targets a live agent workflow bug where ordinary tool output can become unreadable provider replay text.
  • merge-risk: 🚨 message-delivery: The diff changes model-visible tool-result replay across provider and transport paths, which can suppress or misrepresent agent-visible tool output if wrong.
  • merge-risk: 🚨 security-boundary: Structured tool payloads are serialized into provider-bound text, so redaction and omission correctness are merge-critical.
  • merge-risk: 🚨 compatibility: The branch adds public Plugin SDK exports, which maintainers should treat as a contract decision before merge.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (linked_artifact): The PR body/comments include redacted provider replay evidence and the live Real behavior proof check passed after the latest push.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body/comments include redacted provider replay evidence and the live Real behavior proof check passed after the latest push.
Evidence reviewed

PR surface:

Source +320, Tests +1027, Docs 0, Other 0. Total +1347 across 29 files.

View PR surface stats
Area Files Added Removed Net
Source 13 431 111 +320
Tests 13 1029 2 +1027
Docs 2 2 2 0
Config 0 0 0 0
Generated 0 0 0 0
Other 1 2 2 0
Total 29 1464 117 +1347

What I checked:

  • Repository policy applied: Read the root AGENTS.md plus scoped guidance for extensions, plugin SDK, agents, plugins, docs, and scripts; plugin-boundary and PR review-risk guidance apply because the diff changes provider replay and public SDK exports. (AGENTS.md:1, 0c7bac34ae68)
  • Live PR state: Live GitHub state shows head aa5b08d, mergeStateStatus DIRTY, mergeable CONFLICTING, and the PR body still names an older current head. (aa5b08de6194)
  • Current main source still reproduces the core issue: OpenAI Responses replay on current main extracts only type:text tool-result blocks before fallback, so structured non-media blocks can still be dropped from model-visible replay text. (src/llm/providers/openai-responses-shared.ts:404, 0c7bac34ae68)
  • Active sibling transport has the same current-main invariant: The managed OpenAI transport path on current main also filters tool results to type:text and falls back to image/no-output placeholders. (src/agents/openai-transport-stream.ts:1277, 0c7bac34ae68)
  • PR head implements shared structured extraction: The live PR head adds extractToolResultBlockText/extractToolResultText that skip media-only blocks, serialize structured blocks, redact via redactSecrets, and cap provider replay text. (src/llm/providers/tool-result-text.ts:149, aa5b08de6194)
  • Public SDK surface changed: The live PR head exports describeToolResultMediaPlaceholder and extractToolResultText from plugin-sdk/provider-transport-runtime, making this an additive public Plugin SDK contract change. (src/plugin-sdk/provider-transport-runtime.ts:8, aa5b08de6194)

Likely related people:

  • Ayaan Zaidi: Committed the live PR head and was the committer on prior provider/transport replay work tied to this area. (role: recent area contributor; confidence: medium; commits: aa5b08de6194, ace22feb3fe2; files: src/llm/providers/tool-result-text.ts, src/logging/redact.ts, src/agents/openai-transport-stream.ts)
  • zengLingbiao: Current-main blame attributes the text-only replay lines in the OpenAI provider and transport files to a recent code-movement commit, so this is a routing signal rather than fault attribution. (role: recent line owner by blame; confidence: low; commits: 490a4c5d9bb0; files: src/llm/providers/openai-responses-shared.ts, src/agents/openai-transport-stream.ts, src/llm/providers/google-shared.ts)
  • Peter Steinberger: Recent OpenAI-provider work touched the same provider replay files, making this a plausible adjacent review route for OpenAI provider behavior. (role: adjacent recent contributor; confidence: low; commits: c52583a02270; files: src/llm/providers/openai-responses-shared.ts, src/agents/openai-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.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 29, 2026
@snowzlmbot
snowzlmbot marked this pull request as ready for review June 29, 2026 10:47
@snowzlmbot snowzlmbot changed the title fix(llm): preserve structured tool results as text fix(llm): preserve structured tool result text across providers Jun 29, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 29, 2026
@clawsweeper

clawsweeper Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@snowzlmbot
snowzlmbot force-pushed the fix/96857-tool-result-text-clean branch 2 times, most recently from 600fb30 to 04b0448 Compare June 29, 2026 13:30
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. label Jun 29, 2026
@openclaw-barnacle openclaw-barnacle Bot added triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. and removed triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. labels Jun 29, 2026
@snowzlmbot

This comment was marked as outdated.

@clawsweeper

clawsweeper Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@snowzlmbot

This comment was marked as outdated.

@clawsweeper

clawsweeper Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@snowzlmbot

This comment was marked as outdated.

@clawsweeper

clawsweeper Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot removed the merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. label Jun 29, 2026
@obviyus

obviyus commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Landed via squash onto main.

  • Scoped tests: OPENCLAW_VITEST_MAX_WORKERS=1 node scripts/run-vitest.mjs src/agents/anthropic-transport-stream.test.ts src/llm/providers/anthropic.test.ts src/logging/redact.test.ts src/agents/embedded-agent-subscribe.tools.test.ts src/llm/providers/tool-result-text.test.ts extensions/google/transport-stream.test.ts src/plugins/sdk-alias.test.ts src/llm/providers/openai-responses-shared.test.ts --maxWorkers=1 --reporter=dot
  • SDK/API checks: node scripts/plugin-sdk-surface-report.mjs --check; node scripts/check-plugin-sdk-subpath-exports.mjs; pnpm plugin-sdk:api:check; git diff --check
  • Autoreview: clean, no accepted/actionable findings
  • Changelog: release-owned; not updated
  • Land head: 56ae3f26c9ddd4728af1476117dd05e683f7a067
  • Squash commit: b63e06f68aa0f5fc3dc809c37615b8b1012b180b

Thanks @snowzlmbot!

@clawsweeper clawsweeper Bot mentioned this pull request Jul 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling docs Improvements or additions to documentation extensions: google extensions: xai merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. P1 High-priority user-facing bug, regression, or broken workflow. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. scripts Repository scripts size: XL status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants