Skip to content

feat(review): CPU-aware default --jobs + --rate-limit-per-minute#89

Open
coletebou wants to merge 1 commit into
openclaw:mainfrom
coletebou:pr/jobs-rpm
Open

feat(review): CPU-aware default --jobs + --rate-limit-per-minute#89
coletebou wants to merge 1 commit into
openclaw:mainfrom
coletebou:pr/jobs-rpm

Conversation

@coletebou
Copy link
Copy Markdown

Summary

Two ergonomics improvements for clawpatch review:

  1. CPU-aware default --jobs: today defaults to a hard 10, which is hot for laptops and saturates Bedrock RPM quotas. New default: min(max(floor(cpus/2), 1), 10). Explicit --jobs <n> is honored unchanged (32-cap preserved).

  2. New --rate-limit-per-minute <n> (env CLAWPATCH_RPM): rolling-60s-window cap on provider invocations across all jobs. Off by default — fully backwards-compatible. The real bottleneck on most hosted LLMs is RPM, not local CPU.

Files

  • src/rpm-limiter.ts (new) — createRpmLimiter (serialized rolling-timestamp queue with injectable clock), rpmFromFlag (flag > env), defaultJobs(cores)
  • src/app.tsreviewJobs(flags, coreCount?) exported, CPU-aware default; worker loop calls await limiter.acquire() before each reviewFeature
  • src/cli.ts — new flag registered in commandFlags.review and valueFlagNames
  • src/rpm-limiter.test.ts (new), src/review-jobs.test.ts (new) — 14 cases including a fake-clock delay path

Validation

  • pnpm format:check — clean
  • pnpm typecheck — clean
  • pnpm lint — clean
  • pnpm build — clean
  • pnpm test — 555 passed, 1 skipped

Notes

Default behavior changes (lower --jobs on small machines), so this is a minor-bump candidate. Operators on 16+ core CI runners are unaffected.

Replaces the hardcoded `--jobs 10` default with `floor(cpuCores / 2)`
clamped to `[1, 10]`, so a 4-core box stops fanning out 10 parallel
Bedrock streams it cannot sustain. Explicit `--jobs <n>` is honored
unchanged (still capped at 32).

Adds `--rate-limit-per-minute <n>` (and `CLAWPATCH_RPM` env var) which
caps provider invocation starts within any rolling 60s window across
all jobs. Default unset preserves prior behavior. Implementation is a
serialized rolling-timestamp queue shared by all workers; the (N+1)th
acquire sleeps until the oldest slot expires.

Tests cover the CPU-aware default, explicit override, RPM no-op when
unset, and the rolling-window delay path under a fake clock.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant