OpenClaw PR Maintainer
Use this skill for maintainer-facing GitHub workflow, not for ordinary code changes.
Start issue and PR triage with gitcrawl
- Use
$gitcrawl first anytime you inspect OpenClaw issues or PRs.
- Check local
gitcrawl data first for related threads, duplicate attempts, and already-landed fixes.
- Use
gitcrawl for candidate discovery and clustering; use gh, gh api, and the current checkout to verify live state before commenting, labeling, closing, or landing.
- If
gitcrawl is missing, stale, lacks the target thread, or has no embeddings for neighbor/search commands, fall back to the GitHub search workflow below.
- Do not run expensive/update commands such as
gitcrawl sync --include-comments, future enrichment commands, or broad reclustering unless the user asked to update the local store or stale data is blocking the decision.
Common read-only path:
gitcrawl threads openclaw/openclaw --numbers <issue-or-pr-number> --include-closed --json
gitcrawl neighbors openclaw/openclaw --number <issue-or-pr-number> --limit 12 --json
gitcrawl search openclaw/openclaw --query "<scope or title keywords>" --mode hybrid --json
gitcrawl cluster-detail openclaw/openclaw --id <cluster-id> --member-limit 20 --body-chars 280 --json
Surface opener identity
- For every reviewed, triaged, closed, or landed issue/PR, show the opener's human name when available, GitHub login, and account age.
- Get the login from
gh issue view / gh pr view (author.login), then fetch profile metadata once with gh api users/<login> --jq '{login,name,created_at,type}'.
- Report opener identity as one compact line:
By: Jane Doe (@jane, acct 2021-04-03) | OpenClaw: 4 PRs, 2 issues, 11 commits/12mo | GitHub: 9 repos, 86 commits, 9 PRs, 3 issues, 12 reviews
- Always show recent activity in two lanes: OpenClaw-local PRs, issues, and commits in the last 12 months; and general public GitHub activity over the same window. For linked issue-fixing PRs, include both the PR author and issue opener when they differ.
- Prefer the bundled helper for activity lookups:
.agents/skills/openclaw-pr-maintainer/scripts/github-activity.sh <login> [other-login...]
.agents/skills/openclaw-pr-maintainer/scripts/github-activity.sh --global <login>
- The helper reports repo-local activity first and can fetch public GitHub contribution totals for the same window with
--global; run the global form by default for review/triage identity summaries.
- If the global contribution graph reports zero or looks inconsistent with visible public activity, sanity-check with
gh api users/<login>, gh api 'users/<login>/events/public?per_page=100', and recent public repo commits before calling the account inactive.
- The helper is intentionally cache-friendly for gitcrawl-backed
gh: it rounds repo-local windows to the UTC day, rounds global contribution windows to the UTC hour, and counts PRs/issues from one paginated issues response before fetching commits separately. Prefer reusing the helper instead of hand-rolling several gh api loops.
- If the contribution graph is misleading or zero but public events/repos show activity, keep it one line, for example:
By: pickaxe (@ProspectOre, acct 2019-08-24) | OpenClaw: 5 PRs, 0 issues, 5 commits/12mo | GitHub: 5 repos, 29 recent events, 100 public own-repo commits; graph=0
- If
name is empty, use the login only. If profile lookup is rate-limited or unavailable, say account age unknown rather than omitting the opener.
- Use identity and activity as triage signal, not proof by itself: new, low-activity, or bot-like accounts can raise review caution, but code, repro, and CI evidence still decide.
Suppress top-maintainer items in issue triage
When Peter asks for issue triage, hot issues, pressing bugs, Discord-correlated issues, or "what is still open", do not surface issues or PRs authored by top maintainers by default. He wants external/user-reported hot issues and external PRs, not maintainer-owned work queues.
Suppress by default when the opener/author is one of:
@vincentkoc
@Takhoffman
@gumadeiras
@obviyus
@shakkernerd
@mbelinky
@joshavant
@ngutman
@vignesh07
@huntharo
Also suppress lower-priority maintainer-owned noise from the broader keep/top-maintainer group unless it is directly relevant:
@thewilloftheshadow
@onutc / @osolmaz
@jacobtomlinson
@tyler6204
@velvet-shark
@jalehman
@frankekn
@ImLukeF
@mcaxtr
Exceptions:
- Show maintainer-authored items when Peter explicitly asks for maintainer PRs/issues, PR landing candidates, release-blocking maintainer work, or a specific PR/issue number.
- Show a maintainer-authored item when it is the canonical fix for an external hot issue, but frame it as the fix path rather than as a user-facing issue candidate.
- Do not close, label, or deprioritize solely because an item is maintainer-authored; this section only controls what appears in triage shortlists.
Apply close and triage labels correctly
- If an issue or PR matches an auto-close reason, apply the label and let
.github/workflows/auto-response.yml handle the comment/close/lock flow.
- Do not manually close plus manually comment for these reasons.
- If an issue/PR is already fixed on current
main or solved by a new release, comment with proof plus the canonical commit/PR/release, then close it.
r:* labels can be used on both issues and PRs.
- Current reasons:
r: skill
r: support
r: no-ci-pr
r: too-many-prs
r: testflight
r: third-party-extension
r: moltbook
r: spam
invalid
dirty for PRs only
Select small high-confidence triage candidates
When asked for X issues or PRs to triage, X means qualified candidates, not sampled threads.
Triage is read/prove/patch-local by default. Do not commit unless Peter writes
commit in the current instruction for the exact diff being handled. Do not
treat earlier messages, inferred intent, "next", sweep momentum, or bundled
publish language as commit permission. If Peter asks for follow-up work without
saying commit, keep the files dirty after local fixes and proof.
Only list candidates that pass all gates:
- small owner/surface, with a likely narrow fix and focused regression test
- symptom is reproducible or provable with logs, failing test, live command, dependency contract, or current-main behavior
- root cause is traceable to code with file/line and the proposed fix touches that path
- no strong smell that a broader refactor, ownership rethink, migration, or product decision is the better fix
- dependency-backed behavior checked against upstream docs/source/types; live or web proof used when local proof is insufficient
Loop:
- Use
gitcrawl / gh to gather candidate clusters.
- Read issue/PR body, comments, current code, adjacent tests, and dependency contracts.
- Try focused repro or proof.
- Reject unclear, stale, speculative, broad-refactor, or owner-ambiguous items.
- Continue until
X qualified candidates or the bounded search is exhausted.
Output only qualifying candidates, with: ref, surface, proof, cause, fix sketch, why small, expected test/gate. If none qualify, say so; do not pad.
Enforce the bug-fix evidence bar
- Never merge a bug-fix PR based only on issue text, PR text, or AI rationale.
- Before landing, require:
- symptom evidence such as a repro, logs, or a failing test
- a verified root cause in code with file/line
- a fix that touches the implicated code path
- a regression test when feasible, or explicit manual verification plus a reason no test was added
- If the claim is unsubstantiated or likely wrong, request evidence or changes instead of merging.
- If the linked issue appears outdated or incorrect, correct triage first. Do not merge a speculative fix.
Close low-signal manual PRs carefully
- Do not close for red CI alone. Require a clear low-signal category plus stale or failed validation.
- Good manual-close categories:
- blank or mostly untouched PR template with no concrete OpenClaw problem/fix
- random docs-only churn such as root README translations, generic wording tweaks, or community-plugin discoverability docs that should go through ClawHub
- test-only coverage without a linked bug, owner request, or behavior change
- refactor-only cleanup, variable renames, formatting, or generated/baseline churn without maintainer request
- third-party channel/provider/tool/skill/plugin work that belongs on ClawHub instead of core
- risky ops/infra drive-bys such as new external CI services, release workflows, host upgrade scripts, Docker base migrations, or apt retry/fix-missing tweaks without owner request and green validation
- dirty branches where a narrow stated change includes unrelated docs/generated/runtime/extension files
- repeated bot-review spam or copied bot output without author-owned fixes
- Keep or escalate plausible focused bug fixes, green PRs, active maintainer discussions, assigned work, recent author follow-up, and unique reproduction details.
- For third-party capabilities, prefer the
r: third-party-extension auto-response label when it applies; it points contributors to publish on ClawHub.
Handle GitHub text safely
- For issue comments and PR comments, use literal multiline strings or
-F - <<'EOF' for real newlines. Never embed \n.
- Do not use
gh issue/pr comment -b "..." when the body contains backticks or shell characters. Prefer a single-quoted heredoc.
- Do not wrap issue or PR refs like
#24643 in backticks when you want auto-linking.
- PR landing comments should include clickable full commit links for landed and source SHAs when present.
Search broadly before deciding
- Prefer
gitcrawl first. Then use targeted GitHub keyword search to verify gaps, live status, comments, and candidates not present in the local store.
- Use
--repo openclaw/openclaw with --match title,body first when using gh search.
- Add
--match comments when triaging follow-up discussion or closed-as-duplicate chains.
- Do not stop at the first 500 results when the task requires a full search.
Examples:
gh search prs --repo openclaw/openclaw --match title,body --limit 50 -- "auto-update"
gh search issues --repo openclaw/openclaw --match title,body --limit 50 -- "auto-update"
gh search issues --repo openclaw/openclaw --match title,body --limit 50 \
--json number,title,state,url,updatedAt -- "auto update" \
--jq '.[] | "\(.number) | \(.state) | \(.title) | \(.url)"'
Follow PR review and landing hygiene
- If bot review conversations exist on your PR, address them and resolve them yourself once fixed.
- Leave a review conversation unresolved only when reviewer or maintainer judgment is still needed.
- When landing or merging any PR, follow the global
/landpr process.
- Use
scripts/committer "<msg>" <file...> for scoped commits instead of manual git add and git commit.
- Keep commit messages concise and action-oriented.
- Group related changes; avoid bundling unrelated refactors.
- Use
.github/pull_request_template.md for PR submissions and .github/ISSUE_TEMPLATE/ for issues.
- Do not commit PR-only artifacts such as screenshots under
.github/pr-assets; attach them to the PR/comment or use an external artifact store instead.
Extra safety
- If a close or reopen action would affect more than 5 PRs, ask for explicit confirmation with the exact count and target query first.
sync means: if the tree is dirty, commit all changes with a sensible Conventional Commit message, then git pull --rebase, then git push. Stop if rebase conflicts cannot be resolved safely.
1---2name: openclaw-pr-maintainer3description: Use immediately for any pasted OpenClaw GitHub issue or PR URL/number, and for OpenClaw issue/PR review, triage, duplicate search, opener identity/who wrote it, author account age/activity, comments, labels, close, land, or maintainer evidence checks.4---56# OpenClaw PR Maintainer78Use this skill for maintainer-facing GitHub workflow, not for ordinary code changes.910## Start issue and PR triage with gitcrawl1112- Use `$gitcrawl` first anytime you inspect OpenClaw issues or PRs.13- Check local `gitcrawl` data first for related threads, duplicate attempts, and already-landed fixes.14- Use `gitcrawl` for candidate discovery and clustering; use `gh`, `gh api`, and the current checkout to verify live state before commenting, labeling, closing, or landing.15- If `gitcrawl` is missing, stale, lacks the target thread, or has no embeddings for neighbor/search commands, fall back to the GitHub search workflow below.16- Do not run expensive/update commands such as `gitcrawl sync --include-comments`, future enrichment commands, or broad reclustering unless the user asked to update the local store or stale data is blocking the decision.1718Common read-only path:1920```bash21gitcrawl threads openclaw/openclaw --numbers <issue-or-pr-number> --include-closed --json22gitcrawl neighbors openclaw/openclaw --number <issue-or-pr-number> --limit 12 --json23gitcrawl search openclaw/openclaw --query "<scope or title keywords>" --mode hybrid --json24gitcrawl cluster-detail openclaw/openclaw --id <cluster-id> --member-limit 20 --body-chars 280 --json25```2627## Surface opener identity2829- For every reviewed, triaged, closed, or landed issue/PR, show the opener's human name when available, GitHub login, and account age.30- Get the login from `gh issue view` / `gh pr view` (`author.login`), then fetch profile metadata once with `gh api users/<login> --jq '{login,name,created_at,type}'`.31- Report opener identity as one compact line:32 `By: Jane Doe (@jane, acct 2021-04-03) | OpenClaw: 4 PRs, 2 issues, 11 commits/12mo | GitHub: 9 repos, 86 commits, 9 PRs, 3 issues, 12 reviews`33- Always show recent activity in two lanes: OpenClaw-local PRs, issues, and commits in the last 12 months; and general public GitHub activity over the same window. For linked issue-fixing PRs, include both the PR author and issue opener when they differ.34- Prefer the bundled helper for activity lookups:3536```bash37.agents/skills/openclaw-pr-maintainer/scripts/github-activity.sh <login> [other-login...]38.agents/skills/openclaw-pr-maintainer/scripts/github-activity.sh --global <login>39```4041- The helper reports repo-local activity first and can fetch public GitHub contribution totals for the same window with `--global`; run the global form by default for review/triage identity summaries.42- If the global contribution graph reports zero or looks inconsistent with visible public activity, sanity-check with `gh api users/<login>`, `gh api 'users/<login>/events/public?per_page=100'`, and recent public repo commits before calling the account inactive.43- The helper is intentionally cache-friendly for gitcrawl-backed `gh`: it rounds repo-local windows to the UTC day, rounds global contribution windows to the UTC hour, and counts PRs/issues from one paginated issues response before fetching commits separately. Prefer reusing the helper instead of hand-rolling several `gh api` loops.44- If the contribution graph is misleading or zero but public events/repos show activity, keep it one line, for example:45 `By: pickaxe (@ProspectOre, acct 2019-08-24) | OpenClaw: 5 PRs, 0 issues, 5 commits/12mo | GitHub: 5 repos, 29 recent events, 100 public own-repo commits; graph=0`46- If `name` is empty, use the login only. If profile lookup is rate-limited or unavailable, say `account age unknown` rather than omitting the opener.47- Use identity and activity as triage signal, not proof by itself: new, low-activity, or bot-like accounts can raise review caution, but code, repro, and CI evidence still decide.4849## Suppress top-maintainer items in issue triage5051When Peter asks for issue triage, hot issues, pressing bugs, Discord-correlated issues, or "what is still open", do not surface issues or PRs authored by top maintainers by default. He wants external/user-reported hot issues and external PRs, not maintainer-owned work queues.5253Suppress by default when the opener/author is one of:5455- `@vincentkoc`56- `@Takhoffman`57- `@gumadeiras`58- `@obviyus`59- `@shakkernerd`60- `@mbelinky`61- `@joshavant`62- `@ngutman`63- `@vignesh07`64- `@huntharo`6566Also suppress lower-priority maintainer-owned noise from the broader keep/top-maintainer group unless it is directly relevant:6768- `@thewilloftheshadow`69- `@onutc` / `@osolmaz`70- `@jacobtomlinson`71- `@tyler6204`72- `@velvet-shark`73- `@jalehman`74- `@frankekn`75- `@ImLukeF`76- `@mcaxtr`7778Exceptions:7980- Show maintainer-authored items when Peter explicitly asks for maintainer PRs/issues, PR landing candidates, release-blocking maintainer work, or a specific PR/issue number.81- Show a maintainer-authored item when it is the canonical fix for an external hot issue, but frame it as the fix path rather than as a user-facing issue candidate.82- Do not close, label, or deprioritize solely because an item is maintainer-authored; this section only controls what appears in triage shortlists.8384## Apply close and triage labels correctly8586- If an issue or PR matches an auto-close reason, apply the label and let `.github/workflows/auto-response.yml` handle the comment/close/lock flow.87- Do not manually close plus manually comment for these reasons.88- If an issue/PR is already fixed on current `main` or solved by a new release, comment with proof plus the canonical commit/PR/release, then close it.89- `r:*` labels can be used on both issues and PRs.90- Current reasons:91 - `r: skill`92 - `r: support`93 - `r: no-ci-pr`94 - `r: too-many-prs`95 - `r: testflight`96 - `r: third-party-extension`97 - `r: moltbook`98 - `r: spam`99 - `invalid`100 - `dirty` for PRs only101102## Select small high-confidence triage candidates103104When asked for `X` issues or PRs to triage, `X` means qualified candidates, not sampled threads.105106Triage is read/prove/patch-local by default. Do not commit unless Peter writes107`commit` in the current instruction for the exact diff being handled. Do not108treat earlier messages, inferred intent, "next", sweep momentum, or bundled109publish language as commit permission. If Peter asks for follow-up work without110saying `commit`, keep the files dirty after local fixes and proof.111112Only list candidates that pass all gates:113114- small owner/surface, with a likely narrow fix and focused regression test115- symptom is reproducible or provable with logs, failing test, live command, dependency contract, or current-main behavior116- root cause is traceable to code with file/line and the proposed fix touches that path117- no strong smell that a broader refactor, ownership rethink, migration, or product decision is the better fix118- dependency-backed behavior checked against upstream docs/source/types; live or web proof used when local proof is insufficient119120Loop:1211221. Use `gitcrawl` / `gh` to gather candidate clusters.1232. Read issue/PR body, comments, current code, adjacent tests, and dependency contracts.1243. Try focused repro or proof.1254. Reject unclear, stale, speculative, broad-refactor, or owner-ambiguous items.1265. Continue until `X` qualified candidates or the bounded search is exhausted.127128Output only qualifying candidates, with: ref, surface, proof, cause, fix sketch, why small, expected test/gate. If none qualify, say so; do not pad.129130## Enforce the bug-fix evidence bar131132- Never merge a bug-fix PR based only on issue text, PR text, or AI rationale.133- Before landing, require:134 1. symptom evidence such as a repro, logs, or a failing test135 2. a verified root cause in code with file/line136 3. a fix that touches the implicated code path137 4. a regression test when feasible, or explicit manual verification plus a reason no test was added138- If the claim is unsubstantiated or likely wrong, request evidence or changes instead of merging.139- If the linked issue appears outdated or incorrect, correct triage first. Do not merge a speculative fix.140141## Close low-signal manual PRs carefully142143- Do not close for red CI alone. Require a clear low-signal category plus stale or failed validation.144- Good manual-close categories:145 - blank or mostly untouched PR template with no concrete OpenClaw problem/fix146 - random docs-only churn such as root README translations, generic wording tweaks, or community-plugin discoverability docs that should go through ClawHub147 - test-only coverage without a linked bug, owner request, or behavior change148 - refactor-only cleanup, variable renames, formatting, or generated/baseline churn without maintainer request149 - third-party channel/provider/tool/skill/plugin work that belongs on ClawHub instead of core150 - risky ops/infra drive-bys such as new external CI services, release workflows, host upgrade scripts, Docker base migrations, or apt retry/fix-missing tweaks without owner request and green validation151 - dirty branches where a narrow stated change includes unrelated docs/generated/runtime/extension files152 - repeated bot-review spam or copied bot output without author-owned fixes153- Keep or escalate plausible focused bug fixes, green PRs, active maintainer discussions, assigned work, recent author follow-up, and unique reproduction details.154- For third-party capabilities, prefer the `r: third-party-extension` auto-response label when it applies; it points contributors to publish on ClawHub.155156## Handle GitHub text safely157158- For issue comments and PR comments, use literal multiline strings or `-F - <<'EOF'` for real newlines. Never embed `\n`.159- Do not use `gh issue/pr comment -b "..."` when the body contains backticks or shell characters. Prefer a single-quoted heredoc.160- Do not wrap issue or PR refs like `#24643` in backticks when you want auto-linking.161- PR landing comments should include clickable full commit links for landed and source SHAs when present.162163## Search broadly before deciding164165- Prefer `gitcrawl` first. Then use targeted GitHub keyword search to verify gaps, live status, comments, and candidates not present in the local store.166- Use `--repo openclaw/openclaw` with `--match title,body` first when using `gh search`.167- Add `--match comments` when triaging follow-up discussion or closed-as-duplicate chains.168- Do not stop at the first 500 results when the task requires a full search.169170Examples:171172```bash173gh search prs --repo openclaw/openclaw --match title,body --limit 50 -- "auto-update"174gh search issues --repo openclaw/openclaw --match title,body --limit 50 -- "auto-update"175gh search issues --repo openclaw/openclaw --match title,body --limit 50 \176 --json number,title,state,url,updatedAt -- "auto update" \177 --jq '.[] | "\(.number) | \(.state) | \(.title) | \(.url)"'178```179180## Follow PR review and landing hygiene181182- If bot review conversations exist on your PR, address them and resolve them yourself once fixed.183- Leave a review conversation unresolved only when reviewer or maintainer judgment is still needed.184- When landing or merging any PR, follow the global `/landpr` process.185- Use `scripts/committer "<msg>" <file...>` for scoped commits instead of manual `git add` and `git commit`.186- Keep commit messages concise and action-oriented.187- Group related changes; avoid bundling unrelated refactors.188- Use `.github/pull_request_template.md` for PR submissions and `.github/ISSUE_TEMPLATE/` for issues.189- Do not commit PR-only artifacts such as screenshots under `.github/pr-assets`; attach them to the PR/comment or use an external artifact store instead.190191## Extra safety192193- If a close or reopen action would affect more than 5 PRs, ask for explicit confirmation with the exact count and target query first.194- `sync` means: if the tree is dirty, commit all changes with a sensible Conventional Commit message, then `git pull --rebase`, then `git push`. Stop if rebase conflicts cannot be resolved safely.