Install
openclaw skills install @linux2010/github-contributionAutomated GitHub contribution workflow with intelligent issue discovery via positive label detection. Use when: (1) Contributing to open source projects, (2)...
openclaw skills install @linux2010/github-contributionAutomated GitHub contribution workflow with intelligent issue discovery via positive label detection. Handles fork synchronization, branch creation, PR submission while maintaining clean fork state, and provides live-proof guidance for passing automated code review.
Modern repositories use automated labeling systems to identify high-value, maintainer-approved issues. These positive labels signal issues that are:
queueable-fix)source-repro)impact:*)issue-rating:)Golden Rule: Prioritize issues with positive labels over random bugs.
| Category | Label Pattern | Meaning | Priority |
|---|---|---|---|
| Queueable | *:queueable-fix, *:queue_fix_pr | Marked as ready for PR work | ⭐⭐⭐⭐⭐ |
| Reproducible | *:source-repro, confirmed, reproducible | Issue reproduction validated | ⭐⭐⭐⭐⭐ |
| Impact Assessed | impact:*, severity:*, priority:* | Clear impact scope | ⭐⭐⭐⭐ |
| Value Rated | issue-rating: *, value:*, diamond, gold | Official value rating | ⭐⭐⭐⭐⭐ |
| Implementation Clear | *:fix-shape-*, fix-shape-clear | Clear implementation path | ⭐⭐⭐⭐ |
| Contributor Welcome | good first issue, help wanted, contributions welcome | Explicitly inviting contributions | ⭐⭐⭐⭐ |
| Scope Defined | scope:*, area:*, module:* | Clear modification scope | ⭐⭐⭐ |
OpenClaw uses ClawSweeper automation to identify high-value issues:
# ClawSweeper labels (HIGH PRIORITY - maintainer-validated)
gh issue list --repo openclaw/openclaw --label "clawsweeper:fix-shape-clear" --state open
gh issue list --repo openclaw/openclaw --label "clawsweeper:queueable-fix" --state open
gh issue list --repo openclaw/openclaw --label "clawsweeper:source-repro" --state open
# Impact assessment labels
gh issue list --repo openclaw/openclaw --label "impact:auth-provider" --state open
# Value rating labels (🦞 diamond lobster = HIGHEST VALUE)
gh issue list --repo openclaw/openclaw --label "issue-rating: 🦞 diamond lobster" --state open
gh issue list --repo openclaw/openclaw --label "issue-rating: *" --state open
ClawSweeper Label Meanings:
clawsweeper:fix-shape-clear → Clear implementation path identifiedclawsweeper:queueable-fix → Marked as queue-able for PR workclawsweeper:source-repro → High-confidence source-level reproduction foundimpact:auth-provider → Auth/provider/model routing may break (critical)issue-rating: 🦞 diamond lobster → Highest value issue (fix immediately)Step 1: Explore Repository Labels
# Discover all labels in the repository
gh api repos/owner/repo/labels --paginate | jq '.[].name'
# Filter for positive label patterns
gh api repos/owner/repo/labels --paginate | jq '.[].name' | grep -E '(queueable|fix-shape|source-repro|impact|issue-rating|severity|priority|good-first|help-wanted|confirmed|reproducible)'
Step 2: Query Issues with Positive Labels
# Single positive label
gh issue list --repo owner/repo --label "clawsweeper:queueable-fix" --state open --json number,title,labels,createdAt
# Multiple positive labels (OR logic)
gh issue list --repo owner/repo --label "queueable-fix,fix-shape-clear,source-repro" --state open --json number,title,labels,createdAt
# Value-rated issues only
gh issue list --repo owner/repo --label "issue-rating: *" --state open --json number,title,labels,createdAt
Step 3: Prioritize by Label Combination
Priority Tiers:
| Tier | Label Combination | Action |
|---|---|---|
| 🦞 Diamond | queueable-fix + source-repro + impact:* | Fix immediately |
| 💎 Gold | fix-shape-clear + impact:* | High priority |
| 🔥 Platinum | source-repro + severity:critical | Urgent fix |
| � Silver | good first issue + help wanted | Good start |
| ✅ Standard | Single positive label | Normal queue |
| ⚪ Low | No positive labels | Skip unless urgent |
Step 4: Analyze & Select
# Get full issue details
gh issue view <issue-number> --repo owner/repo
# Check issue comments for context
gh issue view <issue-number> --repo owner/repo --comments
# Check if already being worked on
gh pr list --repo owner/repo --search "fixes #<issue-number>"
# Verify no existing PRs
gh pr list --repo owner/repo --state open --search "<issue-keyword>"
# Search across multiple repositories
gh search issues --label "queueable-fix,fix-shape-clear,source-repro" --state open --limit 50 --json repository,title,number,url
# Target specific organizations
gh search issues --owner openclaw --label "impact:*" --state open --sort created --order desc
Proceed if issue has:
Skip if issue has:
# One-liner: Find all queueable-fix issues
gh issue list --repo openclaw/openclaw --label "clawsweeper:queueable-fix" --state open --limit 10
# Find highest value issues (diamond rated)
gh issue list --repo openclaw/openclaw --label "issue-rating: 🦞 diamond lobster" --state open
# Find reproducible issues with clear implementation path
gh issue list --repo openclaw/openclaw --label "clawsweeper:source-repro,clawsweeper:fix-shape-clear" --state open
# Find impact:auth issues (critical system)
gh issue list --repo openclaw/openclaw --label "impact:auth-provider" --state open
# Batch discover: All positive labels
for label in "clawsweeper:queueable-fix" "clawsweeper:fix-shape-clear" "clawsweeper:source-repro"; do
echo "=== $label ==="
gh issue list --repo openclaw/openclaw --label "$label" --state open --json number,title --limit 5
done
After discovering a high-value issue:
Pro Tip: Issues with multiple positive labels (e.g., queueable + source-repro + impact) have 90%+ merge rate because maintainers have pre-validated the fix path.
./github-contribution.sh <username> <owner/repo> <issue-number> <branch-name> [projects-root]
# Fix issue #123 in openclaw/openclaw
./github-contribution.sh Linux2010 openclaw/openclaw 123 fix/issue-description
# Specify custom project root
./github-contribution.sh Linux2010 openclaw/openclaw 456 fix/bug-fix /custom/path
#!/bin/bash
# sync-fork.sh - Safe fork synchronization
git checkout main
git fetch upstream
git reset --hard upstream/main
git clean -fdx # Remove all untracked files
# Verify clean state
if [[ $(git status --porcelain) ]]; then
echo "❌ Warning: Working tree not clean"
exit 1
fi
echo "✅ Fork synchronized successfully"
# Prevent accidental main branch pushes
git config branch.main.pushRemote no_push
# Set safe push default
git config push.default nothing
Before fixing any bug, always write a change plan first. This ensures minimal, safe changes and makes PR review easier.
Answer these 5 questions in plain language before writing any code:
| # | Question | Purpose |
|---|---|---|
| 1 | Observed behavior | What's broken? (What the user sees) |
| 2 | Expected behavior | What should happen? (Correct behavior) |
| 3 | Suspected root cause | Where's the bug? (Specific code location) |
| 4 | Safest seam to modify | Minimal change location? (Narrowest fix) |
| 5 | Risk surface | What else could break? (Impact scope) |
## Change Plan for Issue #<number>
1. **Observed behavior**:
<Describe what's broken - the user-visible symptom>
2. **Expected behavior**:
<Describe what should happen instead>
3. **Suspected root cause**:
<Point to specific file/line/function that causes the bug>
4. **Safest seam to modify**:
<Identify the minimal code change location - smallest safe fix>
5. **Risk surface**:
<List what could be affected by this change>
## Change Plan for Issue #5968
1. **Observed behavior**:
`extract_content_or_reasoning()` crashes when `response.choices` is None, missing, or empty list.
2. **Expected behavior**:
Function should return empty string gracefully when no usable choices exist.
3. **Suspected root cause**:
Line `msg = response.choices[0].message` in `agent/auxiliary_client.py` assumes choices is always non-empty.
4. **Safest seam to modify**:
Add a guard at the top of `extract_content_or_reasoning()` before accessing choices:
`if not getattr(response, "choices", None): return ""`
5. **Risk surface**:
Minimal - only affects edge cases where API response is malformed.
| Scenario | Required? |
|---|---|
| Bug fix | ✅ Always |
| Paper-cut UX improvement | ✅ Always |
| Feature addition | ❌ Use feature spec instead |
| Refactoring | ❌ Use refactor plan instead |
| Documentation fix | ❌ Not needed |
| Benefit | Why It Matters |
|---|---|
| Forces understanding | Can't fix what you don't understand |
| Defines boundaries | Prevents scope creep and "opportunistic" changes |
| Reduces risk | Identifies potential side effects upfront |
| Speeds review | Maintainer can understand intent in 20 seconds |
| Enables rollback | Clear what was changed and why |
Before coding:
If you answered "no" to any question, do more investigation before coding.
详细案例库见
live-proof-cases.md— 记录了真实 PR 中通过 ClawSweeper 评审的 live-proof 实践,开发 PR 时必读。
OpenClaw 的自动评审机器人 ClawSweeper 要求 PR 提供证明修复实际生效的证据。仅有"单元测试通过"不算充分 proof。
目标评级:status: 👀 ready for maintainer look + proof: sufficient + Overall ≥ 🐚 platinum hermit
Overall = Proof 和 Patch quality 中较弱者
即使 patch 质量很高,如果 proof 不足,整体评级仍会被拉低。
| 评级 | 含义 |
|---|---|
| 🦀 challenger crab | 卓越就绪 |
| 🦞 diamond lobster | 很强,少量审查 |
| 🐚 platinum hermit | 良好普通 PR |
| 🦪 silver shellfish | 信号薄弱,需改进 |
| 🧂 unranked krab | 不可合并 |
被合并的 PR 全部使用终端命令输出(不用截图/视频):
| 类型 | 命令 | 适用 |
|---|---|---|
| 直接验证 | node --import tsx -e "..." | 配置验证、纯函数 |
| 聚焦测试 | node scripts/run-vitest.mjs <path> | 运行时修复 |
| 格式检查 | git diff --check | 代码格式 |
BEFORE (current main) - <invalid input> passed validation with ok: true
AFTER - <invalid input> is rejected with clear error message
openclaw doctor --fix 迁移,否则已有配置升级后报错gateway.port = DEFAULT 比 delete gateway.port 更安全(配置行为明确)🦞 diamond lobster👀 ready for maintainer look🧂 unranked krab -> 关闭repo scopeworkflow scope (for full automation)Merge Success Rate =
(PR Description Completeness × 0.2) +
(Review Response Speed × 0.25) +
(Test Coverage × 0.2) +
(Conflict Resolution Status × 0.15) +
(Review Resolution Rate × 0.2)
Target: > 80% success rate
Before pushing PR:
Code Quality:
type(scope): descriptionCI Pre-flight (MUST pass locally):
pnpm protocol:check - Protocol validationpnpm test - All tests passpnpm lint - No lint errorspnpm tsc --noEmit - TypeScript compilationReview Readiness:
7 commits in same day:
1. Main fix implementation
2. Changelog update
3. Merge main (resolve conflicts)
4. Tests: add coverage for review comments
5. Fix: address Greptile suggestions
6. Extra hardening (defensive programming)
7. Merge main (final sync)
Key Learnings:
When Aisle Security reports issues:
1. Quote SECURITY.md to explain why it's out of scope
2. But still fix it (defensive programming)
3. List specific hardening done
4. Provide verification commands
Key Learnings:
| Mistake | Impact | Solution |
|---|---|---|
| ❌ Missing Changelog | -20% | Always update CHANGELOG.md |
| ❌ Slow review response (>24h) | -25% | Respond within 24h, ideally <30min |
| ❌ Incomplete test coverage | -20% | Add tests for edge cases |
| ❌ Merge conflicts | -15% | Daily rebase upstream |
| ❌ Unresolved bot reviews | -20% | 100% resolve all comments |
| ❌ CI failures | Automatic reject | Pre-flight check locally |
| Metric | Target | Current Best Practice |
|---|---|---|
| Greptile Score | ≥ 4/5 | Address all P1/P2 issues |
| Aisle Security | 0 unresolved | Respond or fix all |
| Test Coverage | ≥ 1 new test | Include edge cases |
| CI Pass Rate | 100% | Pre-check locally |
| Behind upstream | 0 commits | Daily rebase |
| Response Time | < 24h | Same day preferred |
Title Format:
✅ fix(hooks): fail closed on unreadable loader paths
✅ feat(context-engine): plumb sessionKey into all methods
✅ docs: codify American English spelling convention
✅ security: include accountId in session keys
Commit Message Structure:
First line: What was done (concise description)
Second paragraph: Why (problem background, impact)
Optional: Regeneration-Prompt / AI assistance notes
Example (#44411):
fix(ci): restore generated protocol swift outputs
Regenerate the Swift protocol models so PushTestResult keeps the
transport field required by the current gateway schema, and update
protocol:check to diff both generated Swift destinations because
the generator writes both files.
Regeneration-Prompt: |
Investigate the protocol CI failure on current origin/main...
Golden Rule: Always rebase on the original PR branch, never create a new branch.
# 1. Confirm current branch
git branch --show-current
# 2. Confirm PR's branch name
gh pr view <PR-number> --json headRefName --jq .headRefName
# 3. Switch to correct branch if needed
git checkout <PR-branch-name>
# 4. Rebase on the SAME branch (do NOT create new branch)
git fetch upstream
git rebase upstream/main
# 5. Push to the SAME branch
git push -f origin <same-branch-name>
| ❌ Wrong | ✅ Correct |
|---|---|
git checkout -b new-branch then rebase | Stay on original branch, rebase there |
| Switch to different branch for rebase | Rebase on PR's own branch |
| Skip branch confirmation | Always run git branch --show-current first |
| Don't verify PR branch name | Use gh pr view to confirm |
Before rebasing:
git branch --show-current to confirm current branchgh pr view <num> --json headRefName to confirm PR branchgit checkout <PR-branch> firstAfter rebasing:
git log --oneline -3 to verify commitspnpm test or relevant testsgit push -f origin <branch> to update PR# Check current branch
$ git branch --show-current
fix/47752-final # ✅ Correct!
# Confirm PR branch
$ gh pr view 48568 --json headRefName --jq .headRefName
fix/47752-final # ✅ Matches!
# Rebase on same branch
git fetch upstream
git rebase upstream/main
# Test
pnpm test src/infra/heartbeat-runner.timeout.test.ts
# Push to same branch
git push -f origin fix/47752-final
Problem: Accidentally created new branch during rebase
Solution:
# Go back to original branch
git checkout <original-branch>
# Rebase there instead
git rebase upstream/main
# Delete the accidental branch
git branch -D <accidental-branch>
# Push to original branch
git push -f origin <original-branch>