Skip to content

fix(infra): wrap provider auth resolution in timeout for status --usage --json#74185

Open
yelog wants to merge 8 commits into
openclaw:mainfrom
yelog:fix/status-json-usage-auth-timeout-74085
Open

fix(infra): wrap provider auth resolution in timeout for status --usage --json#74185
yelog wants to merge 8 commits into
openclaw:mainfrom
yelog:fix/status-json-usage-auth-timeout-74085

Conversation

@yelog

@yelog yelog commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Wraps resolveProviderAuths() in the existing withTimeout helper so auth resolution (OAuth token refresh, plugin auth hooks, secret exec resolvers) cannot hang indefinitely
  • Returns empty providers on auth timeout instead of blocking forever, allowing the JSON command to complete

Problem

openclaw status --usage --json hangs when called from a non-TTY subprocess (regression from 2026.4.23 to 2026.4.26). The individual provider usage fetches are bounded by withTimeout, but resolveProviderAuths() — which iterates sequentially over 7 providers calling plugin auth hooks, OAuth token refresh, and secret ref resolvers — had no timeout boundary. In a non-TTY subprocess, any of these can block indefinitely.

Changes

src/infra/provider-usage.load.ts

  • Wrapped the resolveProviderAuths() call at line 94 in withTimeout(…, timeoutMs, []) using the same timeout budget as the fetch phase
  • On timeout, returns [] (empty auths) which causes loadProviderUsageSummary to return { providers: [] } instead of hanging

src/infra/provider-usage.load.test.ts

  • Added mock for resolveProviderAuths to support testing the timeout path
  • Added test: "returns empty providers when auth resolution exceeds timeout" — mocks auth resolution as a promise that never settles, verifies the function resolves within the timeout

Real behavior proof

Behavior addressed: non-TTY status --usage --json should complete instead of hanging while provider usage auth is resolved.

Real environment tested: local OpenClaw source checkout on branch fix/status-json-usage-auth-timeout-74085, head 9852b6356b6a8369bc4f9e19b71745466d6103c5.

Exact steps or command run after this patch:

node -e '<script uses child_process.spawnSync("node", ["scripts/run-node.mjs", "status", "--usage", "--json"], { timeout: 45000, encoding: "utf8", non-TTY stdio capture }) and prints only exit status, elapsed time, JSON parse status, top-level keys, and usage summary shape>'

Evidence after fix:

{
  "branch": "fix/status-json-usage-auth-timeout-74085",
  "head": "9852b6356b6a8369bc4f9e19b71745466d6103c5",
  "command": "node scripts/run-node.mjs status --usage --json",
  "nonTty": true,
  "exitStatus": 0,
  "signal": null,
  "timedOut": false,
  "elapsedMs": 6513,
  "stdoutBytes": 2757,
  "stderrBytes": 0,
  "parsedJson": true,
  "topLevelKeys": [
    "agents",
    "channelSummary",
    "gateway",
    "gatewayService",
    "heartbeat",
    "lastHeartbeat",
    "memory",
    "memoryPlugin",
    "nodeService",
    "os",
    "queuedSystemEvents",
    "runtimeVersion",
    "secretDiagnostics",
    "sessions",
    "taskAudit",
    "tasks",
    "update",
    "updateChannel",
    "updateChannelSource",
    "usage"
  ],
  "hasUsage": true,
  "usageKeys": [
    "providers",
    "updatedAt"
  ],
  "usageProviders": 1,
  "stderrPreview": []
}

Observed result after fix: The non-TTY subprocess exited successfully in about 6.5s, did not hit the 45s timeout, emitted parseable JSON on stdout, and included a top-level usage object with provider usage data.

What was not tested: This was a local source checkout proof rather than a packaged install, and it does not print provider names, auth profiles, credentials, or raw usage values.

Fixes #74085

@greptile-apps

greptile-apps Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

Wraps resolveProviderAuths() in the existing withTimeout helper so provider auth resolution (OAuth token refresh, plugin hooks, secret-exec resolvers) cannot block indefinitely when status --usage --json is called from a non-TTY subprocess. A companion test uses a never-settling promise mock to verify the timeout path returns { providers: [] } within the budget. The change is minimal, internally consistent with how individual fetch tasks are already bounded, and well-targeted to the reported regression.

Confidence Score: 4/5

Safe to merge — the change is small, consistent with the existing timeout pattern, and the new test covers the regression path.

No P0 or P1 findings. Two P2 style suggestions (complex type in test, missing log on timeout). Score stays at 4/5.

No files require special attention.

Prompt To Fix All With AI
This is a comment left during a code review.
Path: src/infra/provider-usage.load.test.ts
Line: 176-181

Comment:
**Overly complex config type extraction**

The conditional type chain here resolves to `OpenClawConfig`, which is already exported from `../config/config.js` (the same import used in the source file). Importing it directly is cleaner and easier to understand.

```suggestion
      config: {} as import("../config/config.js").OpenClawConfig,
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: src/infra/provider-usage.load.ts
Line: 94-105

Comment:
**No signal on auth timeout**

`withTimeout` silently returns `[]` when auth resolution exceeds `timeoutMs`. At the call site there's no observable difference between "no providers configured" and "auth timed out", which makes this hard to diagnose in the field. Consider emitting a debug/warning log before returning the fallback so operators can distinguish the two cases.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "fix(infra): wrap provider auth resolutio..." | Re-trigger Greptile

Comment thread src/infra/provider-usage.load.test.ts Outdated
Comment on lines +176 to +181
config: {} as Parameters<typeof loadProviderUsageSummary>[0] extends infer O
? O extends { config?: infer C }
? NonNullable<C>
: never
: never,
env: {},

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Overly complex config type extraction

The conditional type chain here resolves to OpenClawConfig, which is already exported from ../config/config.js (the same import used in the source file). Importing it directly is cleaner and easier to understand.

Suggested change
config: {} as Parameters<typeof loadProviderUsageSummary>[0] extends infer O
? O extends { config?: infer C }
? NonNullable<C>
: never
: never,
env: {},
config: {} as import("../config/config.js").OpenClawConfig,
Prompt To Fix With AI
This is a comment left during a code review.
Path: src/infra/provider-usage.load.test.ts
Line: 176-181

Comment:
**Overly complex config type extraction**

The conditional type chain here resolves to `OpenClawConfig`, which is already exported from `../config/config.js` (the same import used in the source file). Importing it directly is cleaner and easier to understand.

```suggestion
      config: {} as import("../config/config.js").OpenClawConfig,
```

How can I resolve this? If you propose a fix, please make it concise.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Comment thread src/infra/provider-usage.load.ts Outdated
Comment on lines +94 to +105
const auths = await withTimeout(
resolveProviderAuths({
providers: opts.providers ?? usageProviders,
auth: opts.auth,
agentDir: opts.agentDir,
config,
env,
skipPluginAuthWithoutCredentialSource: opts.skipPluginAuthWithoutCredentialSource,
}),
timeoutMs,
[],
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 No signal on auth timeout

withTimeout silently returns [] when auth resolution exceeds timeoutMs. At the call site there's no observable difference between "no providers configured" and "auth timed out", which makes this hard to diagnose in the field. Consider emitting a debug/warning log before returning the fallback so operators can distinguish the two cases.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/infra/provider-usage.load.ts
Line: 94-105

Comment:
**No signal on auth timeout**

`withTimeout` silently returns `[]` when auth resolution exceeds `timeoutMs`. At the call site there's no observable difference between "no providers configured" and "auth timed out", which makes this hard to diagnose in the field. Consider emitting a debug/warning log before returning the fallback so operators can distinguish the two cases.

How can I resolve this? If you propose a fix, please make it concise.

@clawsweeper

clawsweeper Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs changes before merge. Reviewed June 1, 2026, 10:57 PM ET / 02:57 UTC.

Summary
The PR bounds provider usage auth resolution for status usage, preserves scoped agent lookup, and changes status usage auth to skip plugin auth without credential sources and avoid OAuth refreshes.

PR surface: Source +35, Tests +162. Total +197 across 6 files.

Reproducibility: Do we have a high-confidence way to reproduce the issue? Source inspection confirms current main has no timeout around resolveProviderAuths and the PR proof shows a non-TTY status command completing after the patch, but I did not run a live expired-OAuth subprocess reproduction in this checkout.

Review metrics: 1 noteworthy metric.

  • Auth behavior surface: 1 internal option added, 1 status caller changed. The new option is used to suppress OAuth refresh in status usage, so maintainers should review the compatibility impact before merge.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🦞 diamond lobster
Patch quality: 🦐 gold shrimp
Result: needs maintainer review before merge.

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

Rank-up moves:

  • Restore default OAuth refresh behavior for status usage, or get explicit provider/auth maintainer approval for cached-only status usage with expired-token coverage.

Risk before merge

  • [P1] Merging as-is can make status usage omit expired OAuth-backed usage providers instead of refreshing them, especially OpenAI/Codex where provider usage auth calls ctx.resolveOAuthToken().
  • [P1] The supplied real behavior proof shows the non-TTY command completes, but it does not cover an expired OAuth profile, upgrade behavior, or the packaged install path.

Maintainer options:

  1. Keep timeout and restore OAuth refresh (recommended)
    Remove or stop using the status-only allowOAuthRefresh:false path while preserving the auth-resolution timeout and add expired-OAuth coverage for status usage.
  2. Accept cached-only status usage
    Provider/auth maintainers can intentionally accept that status usage may omit expired OAuth providers, but the PR should make that policy explicit and prove the upgrade behavior.
  3. Pause for provider/auth direction
    If maintainers are unsure whether status should refresh OAuth in non-TTY automation, pause the PR until the status usage auth policy is decided.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Keep the resolveProviderAuths timeout behavior in src/infra/provider-usage.load.ts, but remove the status-only OAuth refresh suppression unless maintainers explicitly choose cached-only status usage. Update tests so status usage still refreshes expired OAuth profiles and still returns empty providers on auth-resolution timeout.

Next step before merge

  • [P2] The remaining blocker is a narrow repair: preserve the auth-resolution timeout while removing or revising the status-only OAuth no-refresh behavior.

Security
Cleared: The diff does not add dependencies, workflows, package scripts, secret exposure, or broader permissions; the auth concern is compatibility/behavior rather than a concrete security regression.

Review findings

  • [P1] Keep status usage from suppressing OAuth refreshes — src/commands/status-runtime-shared.ts:72
Review details

Best possible solution:

Land the auth-resolution timeout while preserving existing OAuth refresh behavior by default, or have provider/auth owners explicitly accept and document cached-only status usage with focused expired-token tests.

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

Do we have a high-confidence way to reproduce the issue? Source inspection confirms current main has no timeout around resolveProviderAuths and the PR proof shows a non-TTY status command completing after the patch, but I did not run a live expired-OAuth subprocess reproduction in this checkout.

Is this the best way to solve the issue?

Is this the best way to solve the issue? No: wrapping auth resolution in the existing timeout is the right layer, but suppressing OAuth refresh for status usage is broader than needed and can remove existing OAuth usage visibility.

Full review comments:

  • [P1] Keep status usage from suppressing OAuth refreshes — src/commands/status-runtime-shared.ts:72
    Passing allowOAuthRefresh: false from status means expired OAuth profiles are skipped before resolveApiKeyForProfile can refresh them. Current OpenAI/Codex usage auth is wired through ctx.resolveOAuthToken(), so users with expired-but-refreshable OAuth can lose status usage data even though the timeout wrapper already bounds the hang; keep refresh as the default or make cached-only status usage an explicit maintainer-approved mode.
    Confidence: 0.86

Overall correctness: patch is incorrect
Overall confidence: 0.86

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 9d9a6140a3e4.

Label changes

Label changes:

  • add merge-risk: 🚨 compatibility: Existing users with expired-but-refreshable OAuth profiles may see usage data disappear after upgrade unless the cached-only behavior is explicitly accepted.
  • add proof: sufficient: Contributor real behavior proof is sufficient. The PR body and follow-up comment include after-fix non-TTY command output showing parseable JSON and successful completion without printing provider names, credentials, or raw usage values.
  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • add status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (live_output): The PR body and follow-up comment include after-fix non-TTY command output showing parseable JSON and successful completion without printing provider names, credentials, or raw usage values.
  • remove rating: 🐚 platinum hermit: Current PR rating is rating: 🦐 gold shrimp, so this older rating label is no longer current.
  • remove status: 👀 ready for maintainer look: Current PR status label is status: ⏳ waiting on author.

Label justifications:

  • P2: This is a normal-priority regression fix for a status command automation hang, with limited blast radius but real user impact.
  • merge-risk: 🚨 auth-provider: The diff changes OAuth token refresh behavior for provider usage auth, which can affect OpenAI/Codex OAuth status output.
  • merge-risk: 🚨 compatibility: Existing users with expired-but-refreshable OAuth profiles may see usage data disappear after upgrade unless the cached-only behavior is explicitly accepted.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (live_output): The PR body and follow-up comment include after-fix non-TTY command output showing parseable JSON and successful completion without printing provider names, credentials, or raw usage values.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body and follow-up comment include after-fix non-TTY command output showing parseable JSON and successful completion without printing provider names, credentials, or raw usage values.
Evidence reviewed

PR surface:

Source +35, Tests +162. Total +197 across 6 files.

View PR surface stats
Area Files Added Removed Net
Source 3 38 3 +35
Tests 3 165 3 +162
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 6 203 6 +197

Acceptance criteria:

  • [P1] node scripts/run-vitest.mjs src/infra/provider-usage.load.test.ts src/infra/provider-usage.auth.plugin.test.ts src/commands/status-runtime-shared.test.ts.
  • [P1] pnpm exec oxfmt --check --threads=1 src/commands/status-runtime-shared.ts src/commands/status-runtime-shared.test.ts src/infra/provider-usage.auth.ts src/infra/provider-usage.auth.plugin.test.ts src/infra/provider-usage.load.ts src/infra/provider-usage.load.test.ts.

What I checked:

  • Current main behavior: Current main calls resolveProviderAuths directly before the per-provider withTimeout tasks, so auth resolution itself is not bounded by the status usage timeout. (src/infra/provider-usage.load.ts:94, 9d9a6140a3e4)
  • PR timeout implementation: The PR wraps resolveProviderAuths in withTimeout and returns an empty provider list with a warning on timeout, which addresses the reported hang path. (src/infra/provider-usage.load.ts:99, d764021b49c0)
  • PR auth-provider behavior change: The status caller now passes allowOAuthRefresh: false, making status usage follow the new cached-only OAuth branch. (src/commands/status-runtime-shared.ts:72, d764021b49c0)
  • Expired OAuth is skipped by the PR: When allowOAuthRefresh is false, the PR returns a cached OAuth access token only if it is still unexpired; expired OAuth credentials are skipped before resolveApiKeyForProfile can refresh them. (src/infra/provider-usage.auth.ts:231, d764021b49c0)
  • Existing OpenAI/Codex usage auth depends on OAuth resolution: The OpenAI provider wires usage auth through ctx.resolveOAuthToken and then fetches Codex usage with the resolved token, so suppressing refresh affects the status usage path for OpenAI/Codex OAuth users. (extensions/openai/openai-chatgpt-provider.ts:611, 9d9a6140a3e4)
  • Current OAuth resolver refreshes credentials: Current resolveApiKeyForProfile delegates OAuth credentials to oauthManager.resolveOAuthAccess, which is the existing refresh-capable path that the PR bypasses for status usage. (src/agents/auth-profiles/oauth.ts:413, 9d9a6140a3e4)

Likely related people:

  • steipete: Auth/status/provider usage history points to Peter Steinberger for the provider usage split, provider usage hooks, and status reporting helper consolidation. (role: feature-history owner; confidence: high; commits: 3e0e608110fc, e7555724af15, 72dcf9422138; files: src/infra/provider-usage.auth.ts, src/infra/provider-usage.load.ts, src/plugins/provider-runtime.ts)
  • vincentkoc: Vincent Koc has the most recent current-main touch in the reviewed files, though the commit appears to be test-wrapper preservation rather than the provider usage behavior itself. (role: recent adjacent contributor; confidence: medium; commits: af44fb9b6cdd; files: src/infra/provider-usage.load.ts, src/infra/provider-usage.auth.ts, src/commands/status-runtime-shared.ts)
  • joshavant: Josh Avant recently worked on provider/auth SecretRef hardening in adjacent auth-profile paths that feed resolveApiKeyForProfile. (role: adjacent auth/secret owner; confidence: medium; commits: 36d2ae2a2235, 8e20dd22d890; files: src/agents/auth-profiles/oauth.ts, src/infra/provider-usage.auth.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.

@yelog yelog force-pushed the fix/status-json-usage-auth-timeout-74085 branch 2 times, most recently from d619d4d to 680d2cd Compare May 5, 2026 03:16
@openclaw-barnacle openclaw-barnacle Bot added commands Command implementations size: M triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. and removed size: S labels May 10, 2026
@yelog yelog force-pushed the fix/status-json-usage-auth-timeout-74085 branch from 889bbc8 to 9852b63 Compare May 19, 2026 03:38
@yelog

yelog commented May 19, 2026

Copy link
Copy Markdown
Contributor Author

Rebased onto latest origin/main and resolved the status usage conflicts while preserving the scoped agent auth lookup, auth-resolution timeout, and status --usage no-refresh behavior.

Validation on the rebased branch:

node scripts/run-vitest.mjs src/infra/provider-usage.load.test.ts src/infra/provider-usage.auth.plugin.test.ts src/commands/status-runtime-shared.test.ts
pnpm exec oxfmt --check --threads=1 CHANGELOG.md src/commands/status-runtime-shared.ts src/commands/status-runtime-shared.test.ts src/commands/status.command.ts src/infra/provider-usage.auth.plugin.test.ts src/infra/provider-usage.auth.ts src/infra/provider-usage.load.test.ts src/infra/provider-usage.load.ts

The first formatter attempt was interrupted while pnpm retried optional binary downloads from the configured registry; retrying the same formatter command passed.

Remaining merge gate: I still need to add redacted real behavior proof from a non-TTY openclaw status --usage --json subprocess showing the fixed command completes.

@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. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. labels May 19, 2026
@yelog

yelog commented May 19, 2026

Copy link
Copy Markdown
Contributor Author

After-fix real behavior proof from the PR branch, redacted to command status and JSON shape only.

Behavior addressed: non-TTY status --usage --json should complete instead of hanging while provider usage auth is resolved.
Real environment tested: local OpenClaw source checkout on branch fix/status-json-usage-auth-timeout-74085, head 9852b6356b6a8369bc4f9e19b71745466d6103c5.
Exact steps or command run after this patch:

node -e '<script uses child_process.spawnSync("node", ["scripts/run-node.mjs", "status", "--usage", "--json"], { timeout: 45000, encoding: "utf8", non-TTY stdio capture }) and prints only exit status, elapsed time, JSON parse status, top-level keys, and usage summary shape>'

Evidence after fix:

{
  "branch": "fix/status-json-usage-auth-timeout-74085",
  "head": "9852b6356b6a8369bc4f9e19b71745466d6103c5",
  "command": "node scripts/run-node.mjs status --usage --json",
  "nonTty": true,
  "exitStatus": 0,
  "signal": null,
  "timedOut": false,
  "elapsedMs": 6513,
  "stdoutBytes": 2757,
  "stderrBytes": 0,
  "parsedJson": true,
  "topLevelKeys": [
    "agents",
    "channelSummary",
    "gateway",
    "gatewayService",
    "heartbeat",
    "lastHeartbeat",
    "memory",
    "memoryPlugin",
    "nodeService",
    "os",
    "queuedSystemEvents",
    "runtimeVersion",
    "secretDiagnostics",
    "sessions",
    "taskAudit",
    "tasks",
    "update",
    "updateChannel",
    "updateChannelSource",
    "usage"
  ],
  "hasUsage": true,
  "usageKeys": [
    "providers",
    "updatedAt"
  ],
  "usageProviders": 1,
  "stderrPreview": []
}

Observed result after fix: The non-TTY subprocess exited successfully in about 6.5s, did not hit the 45s timeout, emitted parseable JSON on stdout, and included a top-level usage object with provider usage data.
What was not tested: This was a local source checkout proof rather than a packaged install, and it does not print provider names, auth profiles, credentials, or raw usage values.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented May 19, 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.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. 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 May 19, 2026
@giodl73-repo giodl73-repo removed the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label May 21, 2026
@openclaw-barnacle openclaw-barnacle Bot added the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label May 21, 2026
@clawsweeper

clawsweeper Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg

✨ Hatched: 💎 rare Frosted Proofling

Hatch command

Comment @clawsweeper hatch when this PR is hatchable.

Hatchability rules:

  • Merged PRs are hatchable.
  • Open PRs are hatchable when they are status: 👀 ready for maintainer look, status: 🚀 automerge armed, or labeled clawsweeper:automerge.
  • Closed unmerged PRs are hatchable only when one of those hatchable labels is still present in the durable record.

Rarity: 💎 rare.
Trait: purrs at green checks.
Image traits: location CI tidepool; accessory proof snapshot camera; palette coral, mint, and warm cream; mood focused; pose stepping out of a freshly hatched shell; shell matte ceramic shell; lighting gentle morning glow; background little resolved-comment flags.
Share on X: post this hatch
Copy: My PR egg hatched a 💎 rare Frosted Proofling in ClawSweeper.

What is this egg doing here?
  • Eggs appear after the PR passes real-behavior proof. It is here for vibes, not verdicts: it does not change labels, ratings, merge decisions, or automation.
  • The shell reacts to review momentum: open follow-up work warms it up, re-review makes it wobble, and a clean final review lets it hatch.
  • Hatchability usually comes from sufficient real-behavior proof, no blocking P0/P1/P2 findings, no security attention needed, and clean correctness. A merged PR is already final, so merge makes the egg hatchable independently.
  • The hatch is seeded from this repository and PR number, so the same PR keeps the same creature; the reviewed head SHA can only change safe visual details.
  • Rarity is just collectible sparkle: 🥚 common, 🌱 uncommon, 💎 rare, ✨ glimmer, and 🌈 legendary.

@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 22, 2026
@yelog yelog force-pushed the fix/status-json-usage-auth-timeout-74085 branch from 954a9c3 to 0d90f2c Compare May 22, 2026 07:53
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 22, 2026
@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. proof: sufficient ClawSweeper judged the real behavior proof convincing. labels May 27, 2026
yelog added 7 commits May 27, 2026 17:02
…ge --json

resolveProviderAuths was called without any timeout boundary, so plugin
auth hooks (OAuth token refresh, secret exec resolvers) could hang
indefinitely in non-TTY subprocess contexts. Wrap the call in the
existing withTimeout helper using the same timeoutMs budget so the
status JSON command returns empty providers on auth timeout instead of
hanging.

Fixes openclaw#74085
@yelog yelog force-pushed the fix/status-json-usage-auth-timeout-74085 branch from 0d90f2c to 7a24973 Compare May 27, 2026 09:03
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 27, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 2, 2026
@yelog

yelog commented Jun 2, 2026

Copy link
Copy Markdown
Contributor Author

Removed the release-owned CHANGELOG.md entry while keeping the release-note context in the PR body.

The remaining merge decision is the auth/provider policy point ClawSweeper called out: status usage now avoids refresh-side effects and may omit expired OAuth-backed usage instead of refreshing credentials. If maintainers want a narrower policy, I can adjust the branch to keep only the auth-resolution timeout boundary.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 2, 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.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. 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. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

commands Command implementations 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. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. size: M 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.

Bug: openclaw status --usage --json hangs/fails from non-TTY subprocess in 2026.4.26

2 participants