Skip to content

fix(http): bound DefaultClient fallbacks with 60s timeout - #1229

Open
SebTardif wants to merge 2 commits into
openclaw:mainfrom
SebTardif:fix/default-http-client-timeout
Open

fix(http): bound DefaultClient fallbacks with 60s timeout#1229
SebTardif wants to merge 2 commits into
openclaw:mainfrom
SebTardif:fix/default-http-client-timeout

Conversation

@SebTardif

@SebTardif SebTardif commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

Many provider/CLI HTTP constructors fell back to http.DefaultClient when rt.HTTP (or equivalent) was nil. That client has no overall timeout, so a stalled cloud API response can hang the CLI forever. Sibling providers (DigitalOcean, OVH, Linode, Vultr, etc.) already use &http.Client{Timeout: 60 * time.Second}.

Evidence

  • Grep before: 30 production http.DefaultClient fallbacks/uses across providers + aws_ssh_cidr / azure / http_redirect.
  • After: zero production http.DefaultClient references; all use a 60s client matching existing DO/OVH defaults.
  • Tests left on http.DefaultClient intentionally (test doubles).

Real behavior proof

Environment: Go 1.26, macOS; branch fix/default-http-client-timeout

Setup: module download

Command:

rg -n 'http\.DefaultClient' -g '*.go' -g '!*_test.go'   # empty
go test ./internal/providers/vast/ ./internal/providers/e2b/ \
  ./internal/providers/morph/ ./internal/providers/runpod/ \
  ./internal/providers/railway/ ./internal/providers/hostinger/ \
  ./internal/providers/cubesandbox/ ./internal/providers/islo/ \
  ./internal/providers/opensandbox/ -count=1 -timeout 90s
go build ./internal/cli/ ./internal/providers/...

Output:

ok  .../vast ... e2b ... morph ... runpod ... railway ... hostinger ...
ok  .../cubesandbox ... islo ... opensandbox
(build exit 0)

Why this proves it: Compile + package tests for changed providers pass; production code no longer installs an unbounded default client.

Limits: Does not live-hit provider APIs; timeout value is the established 60s project convention, not newly measured.

Test plan

  • No production DefaultClient left
  • gofmt + build + targeted provider tests

Review follow-up (Daytona transfer-aware upload)

Claw P1: Daytona archive upload no longer uses a 60s whole-request Client.Timeout.

Nil-runtime fallback is now transferAwareHTTPClient():

  • overall Timeout: 0 (streaming body can exceed 60s)
  • dial 30s, TLS handshake 10s, response headers 60s

Removed the release-owned Unreleased CHANGELOG hunk.

Evidence after fix (terminal):

$ go test ./internal/providers/daytona/ -count=1 -run TransferAware -v
=== RUN   TestTransferAwareHTTPClientHasNoOverallTimeout
--- PASS: TestTransferAwareHTTPClientHasNoOverallTimeout
PASS
ok  github.com/openclaw/crabbox/internal/providers/daytona

Replace production http.DefaultClient nil-fallbacks with
&http.Client{Timeout: 60 * time.Second}, matching existing DO/OVH/Linode
defaults, so stalled API calls cannot hang forever.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P1 Urgent regression or broken agent/channel workflow affecting real users now. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. labels Aug 3, 2026
@clawsweeper

clawsweeper Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed August 9, 2026, 4:25 PM ET / 20:25 UTC.

ClawSweeper review

What this changes

The PR replaces unbounded fallback HTTP clients across CLI and provider adapters with 60-second defaults, with a transfer-aware exception for Daytona archive uploads.

Merge readiness

Blocked until real behavior proof from a real setup is added - 13 items remain

Keep open: the Daytona exception is correct, but six changed fallback clients still serve uploads or streamed execution and would impose a 60-second whole-request cutoff on existing workflows.

Priority: P1
Reviewed head: 7a9c26a5bf158a296eb137f45104ee0eabfe5908

Review scores

Measure Result What it means
Overall readiness 🧂 unranked krab (1/6) The Daytona repair is a useful correction, but six remaining P1 data-plane regressions and missing real transport proof leave the patch not ready to merge.
Proof confidence 🦪 silver shellfish (2/6) Needs real behavior proof before merge: The PR body provides static search, build output, and targeted unit tests, including Daytona’s helper test, but no after-fix transport trace showing a bounded control request and a successful long-lived data-plane request. Please add redacted runtime evidence; updating the PR body should trigger a fresh review, or a maintainer can comment @clawsweeper re-review. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Patch quality 🧂 unranked krab (1/6) 6 actionable review findings remain.

Verification

Check Result Evidence
Real behavior Needs proof Needs real behavior proof before merge: The PR body provides static search, build output, and targeted unit tests, including Daytona’s helper test, but no after-fix transport trace showing a bounded control request and a successful long-lived data-plane request. Please add redacted runtime evidence; updating the PR body should trigger a fresh review, or a maintainer can comment @clawsweeper re-review. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed 4 items E2B data-plane path: The PR changes the nil fallback at line 102, while the resulting client is used by both multipart file upload and Connect process-stream requests; a 60-second Client.Timeout would abort either operation despite its request-specific execution timeout.
Streaming and upload consumers: Azure Dynamic Sessions, Cloudflare Sandbox, Cloud Run Sandbox, and Crownest each route uploads or execution/event streams through the same fallback client the PR changes; Blaxel routes multipart parts through its shared client.
Branch scope: The submitted branch changes 28 files (+84/-31), including only one transfer-aware fallback and one associated unit test; the other six long-lived providers receive whole-request 60-second clients.
Findings 6 actionable findings [P1] Keep E2B transfers and process streams deadline-free
[P1] Preserve Azure Dynamic Sessions upload and stream lifetimes
[P1] Keep Blaxel multipart uploads outside the client deadline
Security None None.

How this fits together

Crabbox provider adapters construct HTTP clients for control-plane API calls, file transfers, and streamed execution. A runtime-supplied client is preserved when present; otherwise the adapter selects its fallback before sending requests to the provider.

flowchart LR
A[CLI provider operation] --> B[Provider adapter]
B --> C{Runtime client supplied?}
C -->|Yes| D[Use supplied client]
C -->|No| E[Select fallback client]
E --> F[Control API, upload, or stream]
D --> F
F --> G[Provider result]
Loading

Before merge

  • Add real behavior proof - Needs real behavior proof before merge: The PR body provides static search, build output, and targeted unit tests, including Daytona’s helper test, but no after-fix transport trace showing a bounded control request and a successful long-lived data-plane request. Please add redacted runtime evidence; updating the PR body should trigger a fresh review, or a maintainer can comment @clawsweeper re-review. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
  • Keep E2B transfers and process streams deadline-free (P1) - The new fallback becomes e2bClient.httpClient, which is used by multipart uploads and the Connect process response stream. Giving it a 60-second Client.Timeout cancels valid transfers or commands even when their request timeout permits longer execution.
  • Preserve Azure Dynamic Sessions upload and stream lifetimes (P1) - This client’s fallback serves both UploadFile and ExecStream; a whole-request 60-second deadline will truncate archives and NDJSON execution streams. Use a transfer-aware fallback for those paths or separate the control-plane client.
  • Keep Blaxel multipart uploads outside the client deadline (P1) - The shared client is used by multipart upload-part requests as well as control calls. The replacement would abort a valid archive upload at 60 seconds, so the data-plane request needs a no-overall-deadline client.
  • Preserve Cloudflare Sandbox upload and SSE lifetimes (P1) - UploadFile and Exec both call the changed shared client; the latter can consume text/event-stream. A 60-second Client.Timeout makes either path fail during otherwise valid long work.
  • Keep Cloud Run Sandbox execution duration authoritative (P1) - The remote transport uses this fallback for its NDJSON execution response, while the request already has an execution-specific context timeout. The added client deadline can preempt that contract after 60 seconds.
  • Keep Crownest archive and event paths transfer-aware (P1) - The single fallback client is used directly for archive upload and by the event-stream request, which intentionally bypasses the normal request context deadline. A 60-second client timeout defeats both behaviors.
  • Resolve merge risk (P1) - Existing users without an injected runtime client can have valid E2B, Azure Dynamic Sessions, Blaxel, Cloudflare Sandbox, Cloud Run Sandbox, or Crownest transfers/streams terminated after 60 seconds.
  • Resolve merge risk (P1) - The submitted proof establishes static absence of DefaultClient and unit/build success, but not a real bounded control request plus a long-lived data-plane request.
  • Complete next step (P2) - Six concrete P1 fallback sites have a mechanical provider-local repair path before this PR can merge.
  • Improve patch quality - Make all six long-lived fallback paths transfer-aware.
  • Improve patch quality - Add focused regression tests for uploads and streams that would exceed 60 seconds.
  • Improve patch quality - Attach redacted real transport output showing a bounded control call and a successful long-running transfer or stream.

Findings

  • [P1] Keep E2B transfers and process streams deadline-free — internal/providers/e2b/client.go:102
  • [P1] Preserve Azure Dynamic Sessions upload and stream lifetimes — internal/providers/azuredynamicsessions/client.go:108
  • [P1] Keep Blaxel multipart uploads outside the client deadline — internal/providers/blaxel/client.go:135
Agent review details

Security

None.

Review metrics

Metric Value Why it matters
Change surface 28 files affected; production +60/-31, tests +24 A common fallback policy reaches multiple provider control and data-plane paths, so safety needs coverage beyond the Daytona exception.

Merge-risk options

Maintainer options:

  1. Preserve long-lived data-plane paths (recommended)
    Replace the six affected whole-request fallbacks with provider-appropriate transfer-aware clients and add regressions that keep an upload or stream alive beyond 60 seconds.
  2. Accept the 60-second cutoff
    Merge the current patch only if maintainers intentionally want all of these existing data-plane operations to fail after 60 seconds when no runtime client is injected.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Replace the six affected nil-client fallbacks with transfer-aware handling for upload and streaming paths while retaining bounded control-plane calls; add focused regression tests for each provider category.

Technical review

Best possible solution:

Keep 60-second defaults for control-plane-only fallback requests, but make each affected provider’s upload and stream path transfer-aware with bounded connection setup and no whole-request deadline.

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

Yes, from source: construct any affected provider without Runtime.HTTP and run its upload or streaming path for longer than 60 seconds; the proposed fallback client will cancel the request.

Is this the best way to solve the issue?

No: a universal whole-request timeout is not safe for adapters whose existing client also handles uploads or response streams; preserve bounded setup timeouts without imposing an overall deadline on those paths.

Full review comments:

  • [P1] Keep E2B transfers and process streams deadline-free — internal/providers/e2b/client.go:102
    The new fallback becomes e2bClient.httpClient, which is used by multipart uploads and the Connect process response stream. Giving it a 60-second Client.Timeout cancels valid transfers or commands even when their request timeout permits longer execution.
    Confidence: 0.99
  • [P1] Preserve Azure Dynamic Sessions upload and stream lifetimes — internal/providers/azuredynamicsessions/client.go:108
    This client’s fallback serves both UploadFile and ExecStream; a whole-request 60-second deadline will truncate archives and NDJSON execution streams. Use a transfer-aware fallback for those paths or separate the control-plane client.
    Confidence: 0.99
  • [P1] Keep Blaxel multipart uploads outside the client deadline — internal/providers/blaxel/client.go:135
    The shared client is used by multipart upload-part requests as well as control calls. The replacement would abort a valid archive upload at 60 seconds, so the data-plane request needs a no-overall-deadline client.
    Confidence: 0.98
  • [P1] Preserve Cloudflare Sandbox upload and SSE lifetimes — internal/providers/cloudflaresandbox/client.go:109
    UploadFile and Exec both call the changed shared client; the latter can consume text/event-stream. A 60-second Client.Timeout makes either path fail during otherwise valid long work.
    Confidence: 0.99
  • [P1] Keep Cloud Run Sandbox execution duration authoritative — internal/providers/cloudrunsandbox/client.go:73
    The remote transport uses this fallback for its NDJSON execution response, while the request already has an execution-specific context timeout. The added client deadline can preempt that contract after 60 seconds.
    Confidence: 0.99
  • [P1] Keep Crownest archive and event paths transfer-aware — internal/providers/crownest/client.go:112
    The single fallback client is used directly for archive upload and by the event-stream request, which intentionally bypasses the normal request context deadline. A 60-second client timeout defeats both behaviors.
    Confidence: 0.99

Overall correctness: patch is incorrect
Overall confidence: 0.99

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 6409db970a7f.

Labels

Label justifications:

  • P1: The patch can interrupt normal provider uploads and streamed execution for users who rely on default runtime HTTP behavior.
  • merge-risk: 🚨 compatibility: The new fallback timeout changes the behavior of existing configurations that leave Runtime.HTTP unset.
  • merge-risk: 🚨 availability: A whole-request deadline can end valid long-running transfers and execution streams.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🦪 silver shellfish and patch quality is 🧂 unranked krab.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR body provides static search, build output, and targeted unit tests, including Daytona’s helper test, but no after-fix transport trace showing a bounded control request and a successful long-lived data-plane request. Please add redacted runtime evidence; updating the PR body should trigger a fresh review, or a maintainer can comment @clawsweeper re-review. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Evidence

Acceptance criteria:

  • [P1] go test ./internal/providers/e2b/ ./internal/providers/azuredynamicsessions/ ./internal/providers/blaxel/ ./internal/providers/cloudflaresandbox/ ./internal/providers/cloudrunsandbox/ ./internal/providers/crownest/ ./internal/providers/daytona/.
  • [P1] go vet ./...

What I checked:

  • E2B data-plane path: The PR changes the nil fallback at line 102, while the resulting client is used by both multipart file upload and Connect process-stream requests; a 60-second Client.Timeout would abort either operation despite its request-specific execution timeout. (internal/providers/e2b/client.go:102, 7a9c26a5bf15)
  • Streaming and upload consumers: Azure Dynamic Sessions, Cloudflare Sandbox, Cloud Run Sandbox, and Crownest each route uploads or execution/event streams through the same fallback client the PR changes; Blaxel routes multipart parts through its shared client. (internal/providers/azuredynamicsessions/client.go:108, 6409db970a7f)
  • Branch scope: The submitted branch changes 28 files (+84/-31), including only one transfer-aware fallback and one associated unit test; the other six long-lived providers receive whole-request 60-second clients. (internal/providers/daytona/upload.go:18, 7a9c26a5bf15)
  • Feature provenance: History identifies Yossi Eliaz as the Cloud Run Sandbox introducer and Tristan Manchester as the Crownest provider introducer, making them the strongest current routing candidates for the affected streaming behavior. (internal/providers/cloudrunsandbox/client.go:73, 9cc2fe8818b8)

Likely related people:

  • Yossi Eliaz: The feature-history search attributes the Cloud Run Sandbox provider introduction to this commit; its remote execution is one of the affected long-lived request paths. (role: introduced Cloud Run Sandbox provider; confidence: high; commits: 9cc2fe8818b8; files: internal/providers/cloudrunsandbox/client.go)
  • Tristan Manchester: The provider-history search attributes the Crownest client introduction to this commit; its archive upload and event stream share the changed fallback client. (role: introduced Crownest provider; confidence: high; commits: 30f09edab84e; files: internal/providers/crownest/client.go)

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
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.

Workflow

  • 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.

History

Review history (39 earlier review cycles; latest 8 shown)
  • reviewed 2026-08-08T06:23:46.490Z sha 7a9c26a :: needs real behavior proof before merge. :: [P1] Preserve E2B transfer and process lifetimes | [P1] Preserve Azure transfer and stream lifetimes | [P1] Keep Blaxel multipart uploads deadline-free | [P1] Preserve Cloudflare Sandbox upload and SSE lifetimes | [P1] Keep Cloud Run Sandbox execution streams deadline-free | [P1] Keep Crownest archives and event streams outside the deadline
  • reviewed 2026-08-08T08:11:04.468Z sha 7a9c26a :: needs real behavior proof before merge. :: [P1] Preserve E2B transfer and process lifetimes | [P1] Preserve Azure Dynamic Sessions transfers and streams | [P1] Keep Blaxel data-plane uploads deadline-free | [P1] Keep Cloudflare Sandbox uploads and SSE deadline-free | [P1] Keep Cloud Run Sandbox execution duration authoritative | [P1] Keep Crownest archive and event requests outside the client deadline
  • reviewed 2026-08-08T20:46:44.060Z sha 7a9c26a :: needs real behavior proof before merge. :: [P1] Preserve E2B transfer and process lifetimes | [P1] Preserve Azure Dynamic Sessions uploads and streams | [P1] Keep Blaxel multipart uploads deadline-free | [P1] Preserve Cloudflare Sandbox upload and SSE lifetimes | [P1] Keep Cloud Run Sandbox execution duration authoritative | [P1] Keep Crownest archives and event streams transfer-aware
  • reviewed 2026-08-08T22:44:04.962Z sha 7a9c26a :: needs real behavior proof before merge. :: [P1] Keep E2B data-plane requests outside the client deadline | [P1] Preserve Azure Dynamic Sessions upload and stream lifetimes | [P1] Keep Blaxel multipart uploads deadline-free | [P1] Preserve Cloudflare Sandbox upload and SSE lifetimes | [P1] Keep Cloud Run Sandbox execution duration authoritative | [P1] Keep Crownest archives and event streams transfer-aware
  • reviewed 2026-08-08T23:53:02.900Z sha 7a9c26a :: needs real behavior proof before merge. :: [P1] Keep E2B transfers outside the 60-second client deadline | [P1] Preserve Azure Dynamic Sessions upload and stream lifetimes | [P1] Keep Blaxel multipart uploads outside the client deadline | [P1] Preserve Cloudflare Sandbox upload and SSE lifetimes | [P1] Keep Cloud Run Sandbox execution duration authoritative | [P1] Keep Crownest archives and event streams transfer-aware
  • reviewed 2026-08-09T12:25:06.619Z sha 7a9c26a :: needs real behavior proof before merge. :: [P1] Keep E2B uploads and process streams deadline-free | [P1] Preserve Azure Dynamic Sessions upload and stream lifetimes | [P1] Keep Blaxel multipart uploads outside the client deadline | [P1] Preserve Cloudflare Sandbox uploads and SSE lifetimes | [P1] Keep Cloud Run Sandbox execution duration authoritative | [P1] Keep Crownest archive and event paths transfer-aware
  • reviewed 2026-08-09T15:06:07.882Z sha 7a9c26a :: needs real behavior proof before merge. :: [P1] Keep E2B uploads and process streams deadline-free | [P1] Preserve Azure Dynamic Sessions upload and stream lifetimes | [P1] Keep Blaxel multipart uploads outside the client deadline | [P1] Preserve Cloudflare Sandbox uploads and SSE lifetimes | [P1] Keep Cloud Run Sandbox execution duration authoritative | [P1] Keep Crownest archives and event streams transfer-aware
  • reviewed 2026-08-09T18:31:17.075Z sha 7a9c26a :: needs real behavior proof before merge. :: [P1] Keep E2B transfer and process clients deadline-free | [P1] Preserve Azure Dynamic Sessions upload and stream lifetimes | [P1] Keep Blaxel multipart uploads outside the client deadline | [P1] Preserve Cloudflare Sandbox upload and SSE lifetimes | [P1] Keep Cloud Run Sandbox execution duration authoritative | [P1] Keep Crownest archive and event paths transfer-aware

Use a no-overall-Timeout client with dial/TLS/header bounds for streaming
archive uploads so multi-minute syncs are not aborted at 60s. Drop the
release-owned Unreleased changelog hunk.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>
@SebTardif

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Addressed P1: Daytona archive uploads use transferAwareHTTPClient (Timeout 0 + header/dial bounds). Dropped release-owned changelog entry. Terminal proof in body.

@clawsweeper

clawsweeper Bot commented Aug 3, 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: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

Re-review progress:

@clawsweeper clawsweeper Bot added merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Aug 4, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Aug 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. P1 Urgent regression or broken agent/channel workflow affecting real users now. 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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant