ClawSweeper is the conservative OpenClaw maintenance bot for
openclaw/openclaw.
It keeps one markdown report per open issue or PR, publishes one durable Codex automated review comment when useful, and only closes items when the evidence is strong.
ClawSweeper may propose a close only when the item is clearly one of these:
- implemented on current
main - not reproducible on current
main - better suited for ClawHub skill/plugin work than core
- duplicate or superseded by a canonical issue/PR
- concrete but not actionable in this source repo
- incoherent enough that no action can be taken
- stale issue older than 60 days with too little data to verify
Maintainer-authored items are never auto-closed. Everything else stays open.
Issues with an open PR that references them using GitHub closing syntax such as
Fixes #123 stay open until that PR merges or is closed.
Open issue/PR pairs from the same author stay open together unless the paired
item is already resolved or a maintainer explicitly asks to close one side.
Last dashboard update: Apr 27, 2026, 11:22 UTC
Workflow status
Updated: Apr 27, 2026, 11:22 UTC
State: Review comments checked
Checked selected durable Codex review comments and synced missing or stale comments. Synced: 417. Item numbers: 6457,17098,24754,25295,25789,27771,32558,39604,40155,40165,40209,40215,40230,40277,40287,40366,40387,40392,40402,40423,40463,40472,40522,40611,40641,40673,40694,40716,40875,41025,41082,41088,41108,41111,41120,41135,41168,41195,41199,41243,41265,41272,41283,41299,41304,41346,41355,41366,41372,41410,41418,41444,41461,41473,41474,41483,41494,41495,41501,41502,41517,41537,41548,41555,41561,41572,41583,41588,41594,41608,41609,41619,41624,41649,41657,41665,41670,41671,41676,41685,41718,41722,41736,41740,41744,41750,41755,41764,41779,41795,41799,41803,41809,41826,41833,41837,41853,41854,41858,41861,41862,41866,41879,41882,41892,41897,41899,41933,41936,41940,41943,41949,41954,41955,41964,41983,41986,41991,41993,42001,42007,42009,42010,42011,42027,42039,42052,42059,42065,42099,42156,42157,42174,42196,42197,42201,42207,42208,42222,42223,42243,42245,42252,42258,42259,42261,42271,42273,42301,42303,42304,42317,42319,42322,42330,42351,42354,42361,42373,42381,42391,42402,42408,42424,42425,42452,42461,42475,42480,42497,42504,42533,42538,42539,42544,42555,42571,42585,42586,42591,42592,42617,42631,42636,42637,42646,42647,42648,42650,42651,42652,42654,42656,42663,42669,42674,42675,42677,42683,42690,42698,42713,42715,42729,42771,42798,42802,42810,42820,42824,42832,42837,42840,42843,42847,42853,42854,42859,42862,42867,42877,42895,42898,42904,42908,42933,42936,42937,42952,42962,42978,42986,42987,42998,42999,43006,43013,43015,43028,43063,43064,43065,43068,43095,43117,43141,43145,43151,43176,43195,43202,43204,43211,43244,43249,43253,43260,43276,43286,43306,43341,43348,43367,43390,43404,43410,43411,43416,43440,43441,43443,43467,43481,43495,43512,43527,43529,43563,43565,43568,43570,43585,43588,43609,43618,43656,43658,43659,43737,43752,43775,43791,43808,43810,43816,43835,43848,43935,43938,43951,43953,43992,44013,44023,44027,44202,44996,50429,52115,52894,52928,52963,53008,53092,53311,53390,53742,53760,53881,53889,53969,53989,55047,56161,56915,58070,58481,59787,60981,61151,62359,62431,62482,63084,64086,64127,64150,64463,65691,65983,66238,66251,66279,66312,66392,66415,66521,66614,66650,66720,66771,66773,66792,66926,67019,67035,67088,67097,67107,67113,67191,67202,67244,67332,67341,67345,67363,67376,67378,67393,67394,67404,67433,67434,67461,67466,67472,67477,67488,67493,67547,67552,67569,67584,67587,67594,67595,67626,67639,67655,67661,67662,67669,67680,67682,67687,67692,67693,67694,67703,67706,67709,67716,67731,67734,67750,67751,67758,67761,67766,68161,70651,72468,72476,72478,72482,72484,72485,72486,72489,72490. Run: https://github.com/openclaw/clawsweeper/actions/runs/24990938121
| Metric | Count |
|---|---|
| Open issues in openclaw/openclaw | 3546 |
| Open PRs in openclaw/openclaw | 3457 |
| Open items total | 7003 |
| Reviewed files | 6771 |
| Unreviewed open items | 232 |
| Archived closed files | 13060 |
| Metric | Count |
|---|---|
| Fresh reviewed issues in the last 7 days | 3478 |
| Proposed issue closes | 4 (0.1% of reviewed issues) |
| Fresh reviewed PRs in the last 7 days | 3290 |
| Proposed PR closes | 4 (0.1% of reviewed PRs) |
| Fresh verified reviews in the last 7 days | 6768 |
| Proposed closes awaiting apply | 8 (0.1% of fresh reviews) |
| Closed by Codex apply | 10217 |
| Failed or stale reviews | 3 |
| Metric | Coverage |
|---|---|
| Hourly cadence coverage | 28/718 current (690 due, 3.9%) |
| Hourly hot item cadence (<7d) | 28/718 current (690 due, 3.9%) |
| Daily cadence coverage | 1821/4204 current (2383 due, 43.3%) |
| Daily PR cadence | 1157/2882 current (1725 due, 40.1%) |
| Daily new issue cadence (<30d) | 664/1322 current (658 due, 50.2%) |
| Weekly older issue cadence | 1849/1849 current (0 due, 100%) |
| Due now by cadence | 3305 |
Last audit: Apr 27, 2026, 07:11 UTC
Status: Action needed
Targeted review input: 64563,65635,56915,61960,62112,62431,64150,71072
| Metric | Count |
|---|---|
| Scan complete | yes |
| Open items seen | 7132 |
| Missing eligible open records | 2 |
| Missing maintainer-authored open records | 94 |
| Missing protected open records | 1 |
| Missing recently-created open records | 149 |
| Archived records that are open again | 0 |
| Stale item records | 1 |
| Duplicate records | 0 |
| Protected proposed closes | 0 |
| Stale reviews | 6 |
| Item | Category | Title | Detail |
|---|---|---|---|
| #64563 | Missing eligible open | fix(whatsapp): lazy default auth dir for profile state (#64555) | eligible |
| #65635 | Missing eligible open | fix(gateway): keep explicit loopback binds on 127.0.0.1 | eligible |
| #56915 | Stale review | [Bug]: [Bug] Skills scanner ignores subdirectories under ~/.openclaw/skills/ | items/56915.md |
Latest review: Apr 27, 2026, 11:08 UTC. Latest close: Apr 27, 2026, 10:50 UTC. Latest comment sync: Apr 27, 2026, 11:22 UTC.
| Window | Reviews | Close decisions | Keep-open decisions | Failed/stale reviews | Closed | Comments synced | Apply skips |
|---|---|---|---|---|---|---|---|
| Last 15 minutes | 12 | 0 | 12 | 0 | 0 | 417 | 2 |
| Last hour | 890 | 26 | 864 | 0 | 13 | 970 | 4 |
| Last 24 hours | 4119 | 481 | 3638 | 1 | 341 | 1777 | 13 |
| Item | Title | Reason | Closed | Report |
|---|---|---|---|---|
| #72519 | Cost estimate omits cache read tokens (cacheRead cost not applied... | duplicate or superseded | Apr 27, 2026, 10:50 UTC | closed/72519.md |
| #72517 | Add session cost to /status output | not actionable | Apr 27, 2026, 10:50 UTC | closed/72517.md |
| #72505 | Gateway infinite loop during initialization on v2026.4.23+ (CPU 100%+, never reaches HTTP bind) | already implemented on main | Apr 27, 2026, 10:50 UTC | closed/72505.md |
| #72497 | [Bug]: Tool calls invisible in Telegram DM despite verbose: on — user cannot see agent activity | already implemented on main | Apr 27, 2026, 10:50 UTC | closed/72497.md |
| #68878 | [codex] Optimize gateway session listing before full row construction | duplicate or superseded | Apr 27, 2026, 10:50 UTC | closed/68878.md |
| #68866 | fix(auth): invalidate stale runtime auth snapshots when auth files change | already implemented on main | Apr 27, 2026, 10:50 UTC | closed/68866.md |
| #68865 | fix(feishu): add application-level WebSocket reconnection with backoff | duplicate or superseded | Apr 27, 2026, 10:50 UTC | closed/68865.md |
| #68831 | perf: share JITI instances across plugins with identical alias configs | already implemented on main | Apr 27, 2026, 10:49 UTC | closed/68831.md |
| #68611 | [Bug]: WebChat CLI runner — assistant replies invisible + user messages erased after each turn | already implemented on main | Apr 27, 2026, 10:49 UTC | closed/68611.md |
| #66515 | feat: add YandexGPT as native provider via Yandex AI Studio | belongs on ClawHub | Apr 27, 2026, 10:49 UTC | closed/66515.md |
Recently Reviewed (latest 10)
| Item | Title | Outcome | Status | Reviewed |
|---|---|---|---|---|
| #53989 | Slack event dispatch broken after 2026.3.23-1 → 2026.3.23-2 update (regression) | keep_open / kept_open | complete | Apr 27, 2026, 11:08 UTC |
| #67466 | fix(feishu): reduce startup latency by parallelizing probe and capping timeouts | keep_open / kept_open | complete | Apr 27, 2026, 11:08 UTC |
| #65691 | feat(slack): add message search support via search.messages API | keep_open / kept_open | complete | Apr 27, 2026, 11:08 UTC |
| #67244 | Explicit ACP agent runs: embedded backend visibility failure and stale final JSON state after sessions_yield | keep_open / kept_open | complete | Apr 27, 2026, 11:07 UTC |
| #65983 | Background PTY exec runs can survive restart/session loss and become untracked orphan process trees | keep_open / kept_open | complete | Apr 27, 2026, 11:07 UTC |
| #67477 | fix(whatsapp): emit hooks for auto-replies | keep_open / kept_open | complete | Apr 27, 2026, 11:07 UTC |
| #67587 | Discord outbound messages should reliably convert known @AgentName references into real <@userId> mentions | keep_open / kept_open | complete | Apr 27, 2026, 11:07 UTC |
| #72476 | Pass through configured thinking budgets | keep_open / kept_open | complete | Apr 27, 2026, 11:07 UTC |
| #67761 | fix: remove truncated preview from inbound system events | keep_open / kept_open | complete | Apr 27, 2026, 11:07 UTC |
| #67393 | [Bug]: Massive virtual memory bloat (22GB+ VIRT) immediately after Gateway startup, identical to previously reported issue #6413. This issue was closed as "not planned" but the problem persists on the latest stable release. | keep_open / kept_open | complete | Apr 27, 2026, 11:07 UTC |
ClawSweeper is split into a scheduler, a review lane, and an apply lane.
The scheduler decides what to scan and how often. New and active items get more attention; older quiet items fall back to a slower cadence.
- hot/new and recently active items are checked hourly, with a 5-minute intake schedule for the newest queue edge
- pull requests and issues younger than 30 days are checked daily once they leave the hot window
- older inactive issues are checked weekly
- apply wakes every 15 minutes and exits quickly when there are no unchanged high-confidence close proposals
Review is proposal-only. It never closes items.
- A planner scans open issues and PRs, then assigns exact item numbers to shards.
- Manual runs can pass
item_numberor comma-separateditem_numbersto review exact Audit Health findings without scanning for a normal batch. - Each shard checks out
openclaw/openclawatmain. - Codex reviews with
gpt-5.5, high reasoning, fast service tier, and a 10-minute per-item timeout. - Each item becomes
items/<number>.mdwith the decision, evidence, suggested comment, runtime metadata, and GitHub snapshot hash. - High-confidence allowed close decisions become
proposed_close. - After publish, the lane checks the selected items' single marker-backed Codex review comment. Missing comments and missing metadata are synced immediately; existing comments are refreshed only when stale, currently weekly.
Apply reads existing reports and mutates GitHub only when the stored review is still valid.
- Updates the single marker-backed Codex automated review comment in place.
- Closes only unchanged high-confidence proposals.
- Reuses the review comment when closing; no duplicate close comment.
- Moves closed or already-closed reports to
closed/<number>.md. - Moves reopened archived reports back to
items/<number>.mdas stale. - Commits checkpoints and dashboard heartbeats during long runs.
Apply wakes every 15 minutes, no-ops when there are no unchanged high-confidence close proposals, and narrows scheduled runs to the currently eligible proposal list so idle runs do not scan unrelated keep-open records. It defaults to all item kinds, no age floor, a 2-second close delay, and 50 fresh closes per checkpoint. If it reaches the requested limit, it queues another apply run with the same settings.
There is still one deterministic apply path for writes. Review can propose and sync stale public review comments, but closing remains guarded by apply so a fresh GitHub snapshot, labels, maintainer-authorship, and unchanged item state are checked immediately before mutation.
- Maintainer-authored items are excluded from automated closes.
- Protected labels block close proposals.
- Open PRs with GitHub closing references block issue closes until the PR is resolved.
- Open same-author issue/PR pairs block one-sided closes.
- Codex runs without GitHub write tokens.
- CI makes the OpenClaw checkout read-only for reviews.
- Reviews fail if Codex leaves tracked or untracked changes behind.
- Snapshot changes block apply unless the only change is the bot’s own review comment.
npm run audit compares live GitHub state with generated records without moving
files. It reports missing open records, archived open records, stale records,
duplicates, protected-label proposed closes, and stale review-status records.
Protected proposed closes are reported only for active items/ records because
archived closed/ records are historical and cannot be applied.
Missing open records are classified as eligible, maintainer-authored, protected,
or recently created so strict audit mode can flag actionable drift without
treating expected queue lag or excluded items as failures.
Use --update-dashboard to publish the latest audit health into this README
without making every normal dashboard heartbeat scan all open GitHub items.
Audit Health includes a copyable item_numbers input for reviewable findings
such as missing eligible records, reopened archived records, and stale reviews.
The workflow refreshes Audit Health on a separate six-hour schedule, and it can
be run manually with audit_dashboard=true.
Requires Node 24.
source ~/.profile
npm install
npm run build
npm run plan -- --batch-size 5 --shard-count 100 --max-pages 250 --codex-model gpt-5.5 --codex-reasoning-effort high --codex-service-tier fast
npm run review -- --openclaw-dir ../openclaw --batch-size 5 --max-pages 250 --artifact-dir artifacts/reviews --codex-model gpt-5.5 --codex-reasoning-effort high --codex-service-tier fast --codex-timeout-ms 600000
npm run apply-artifacts -- --artifact-dir artifacts/reviews
npm run audit -- --max-pages 250 --sample-limit 25 --update-dashboard
npm run reconcile -- --dry-runApply unchanged proposals later:
source ~/.profile
npm run apply-decisions -- --limit 20 --apply-kind allSync durable review comments without closing:
source ~/.profile
npm run apply-decisions -- --sync-comments-only --comment-sync-min-age-days 7 --processed-limit 1000 --limit 0Manual review runs are proposal-only even if --apply-closures or workflow input apply_closures=true is set. Use apply_existing=true to apply unchanged proposals later. Scheduled apply runs process both issues and pull requests by default; pass apply_kind=issue or apply_kind=pull_request to narrow a manual run.
npm run check
npm run oxformatoxformat is an alias for oxfmt; there is no separate oxformat npm package.
Required secrets:
OPENAI_API_KEY: OpenAI API key used to log Codex in before review shards run.CODEX_API_KEY: optional compatibility alias for the same key during the login check.OPENCLAW_GH_TOKEN: optional fallback GitHub token for read-heavyopenclaw/openclawscans and artifact publish reconciliation when the GitHub App token is unavailable.CLAWSWEEPER_APP_ID: GitHub App ID foropenclaw-ci. Currently3306130.CLAWSWEEPER_APP_PRIVATE_KEY: private key foropenclaw-ci; plan/review jobs use a short-lived GitHub App installation token for read-heavyopenclaw/openclawAPI calls, and apply/comment-sync jobs use the app token for comments and closes.
Token flow:
- Review shards log Codex in with
OPENAI_API_KEY, then run without OpenAI or Codex token environment variables. - ClawSweeper uses the
openclaw-ciGitHub App token for read-heavy target context, falling back toOPENCLAW_GH_TOKENonly if app secrets are absent. - Apply mode uses the app token for review comments and closes, so GitHub
attributes mutations to
clawsweeper[bot]. - The built-in
GITHUB_TOKENcommits generated reports back to this repo.
Required app permissions:
- read access for target scan context
- write access to
openclaw/openclawissues and pull requests - optional Actions write on
openclaw/clawsweeperfor app-token-based run cancellation or dispatch