A reusable skill + tooling for running an LLM-driven open-source contribution drive: burning otherwise-idle model-subscription quota on genuine, mergeable GitHub work.
It was extracted from a live run of ~40+ merged PRs across ~30 small repos, with
0 quality rejections — every rule in SKILL.md is scar tissue from that run, with
the specific war-story inlined where it's load-bearing. It's written for an agent
harness (e.g. Claude Code) where a lead session dispatches implementer and
verifier subagents, plus the gh CLI authenticated as your contribution account.
| File | Purpose |
|---|---|
SKILL.md |
The doctrine, in three sections — A (base idea and prose), B (allowed), C (disallowed): roles, picking rules, briefing/verification discipline, CI-watching, PR mechanics, monitoring, references, session succession. |
pr-report-contract.md |
The fixed section order and semantics every PR body must follow — read in full before writing any PR. |
issue-filing-contract.md |
The fixed section order and semantics every filed issue must follow — read in full before filing any issue. |
agents/adversary.md |
The adversarial-verifier persona: judges ONE claim and tries to refute it, returning refuted / survives / uncertain with evidence. Register it as an agent definition, or feed it to a second CLI agent via its persona/agent-file flag. |
scripts/scout.py |
Find freshly-active ~0–20⭐ repos with specific good-first-issues and no stale-external-PR rot. Read-only. |
scripts/impact-picks.py |
Build the ranked warm-repo list from your merge record (share-of-contribution across merged PRs and closed issues). Feeds the picker. |
scripts/pick-next.py |
The gate-walking repo picker: re-ranks, then walks the list gate by gate (manual block, archived, empty queue, dormant, PR cap) with evidence for every skip, stopping at the first candidate. --skip N walks past candidates you are already working. Never bypassed (§B1). |
pick-gates.example.json |
Template for the picker's gates file — the manual block list, the dormancy threshold, and the proven_by overrides that correct GitHub's undercount of landed work. |
templates/ |
Skeletons for the per-repo and per-human reference notes and the per-repo review-feedback log (§B9). |
scripts/notif-watch.py |
The sole standing watcher: polls GitHub notifications with its own per-thread cursor, emits one line per updated thread. |
scripts/usage_query.py |
On-demand quota utilization for Claude and/or Kimi, with a constant-burn "pace ceiling" so you know the moving target — and, when you're over it, the coast-back-to-pace time (on pace in T). |
LICENSE |
MIT. |
SKILL.md uses placeholders — wire them to your own setup:
<GH_USER>— your GitHub username (the contribution account).<FORK_ORG>— the GitHub org/user where your forks live (can equal<GH_USER>).<GIT_EMAIL>— the git author email your commits carry (your machine default).<DRIVE_REPO>— the working repo/dir that holds your watchlist and references.<WORK_DIR>— scratch/clone workspace.<model>— the model that did a given layer of work (for disclosure footers).
-
Drop the skill in. Copy
SKILL.md,pr-report-contract.md, andissue-filing-contract.mdinto.claude/skills/burn-usage/(or your harness's skill location) together, in the same directory —SKILL.mdreferences the two contracts by relative filename, so they need to stay alongside it. Replace the placeholders above with your own GitHub user, fork org, and git email. -
Wire the scripts. Put
scripts/somewhere your sessions can invoke them and update thescripts/...references inSKILL.mdto the absolute paths you chose. All five are stdlib-only Python 3. Four of them —scout.py,notif-watch.py,impact-picks.py, andpick-next.py— need theghCLI onPATH, and it must be authenticated as your contribution account, not merely installed: rungh auth login(check withgh auth status) or every call fails with auth errors that read like repo problems. Onlyusage_query.pyworks withoutgh. -
Seed the scout exclusion list.
mkdir -p ~/.burn-usage, then create~/.burn-usage/scout-exclude.txt(one owner login per line, lowercase) listing your own account/orgs plus anything you've already probed, frozen, or dropped — keeping it current is what stops the scout re-surfacing repos you've dispatched. Override the path withSCOUT_EXCLUDE_FILE. -
Seed the pick gates.
cp pick-gates.example.json ~/.burn-usage/pick-gates.jsonand replace the example entries as real blocks accrue (override the path withPICK_GATES_FILE). Aproven_byentry must carry anevidenceURL showing the work landed — the picker refuses the file otherwise, because that field exists to correct GitHub's accounting, not to talk you past a cap. The picker re-ranks via the siblingimpact-picks.pyby default; if you keep your own ranked list elsewhere, pointPICK_NEXT_RERANK_CMDat whatever regenerates it.Cold start: the picker needs at least one merged PR of yours. The ranked list is built from your track record, so with zero merged PRs
impact-picks.pyexits with "no warm repos found" and the picker has nothing to walk — that is every new adopter's starting point, not a malfunction. Until your first PRs merge, pick manually: runscout.py, choose a repo from its results, and work that. The picker takes over once a track record exists.The default re-rank is not free: every pick costs one
gh searchcall plus twogh ... listcalls per warm repo, so repeated picking in a session burns API rate-limit budget — expect it, and don't treat the picker as a free retry button. -
Run the watcher. Start
notif-watch.pyunder your harness's persistent background mechanism at session start; it seeds silently on cold start and then emitsNOTIF ...lines you fetch and act on. State lives under~/.burn-usage/(override withBURN_USAGE_STATE_DIR). -
Check pace.
usage_query.pyprints amax*column — the utilization you'd be at under a constant linear burn. Treat it as a target to reach or exceed, not a ceiling to stay under: below it you are under-spending, and the response is to dispatch more in parallel and fan out across repos. An OVER PACE flag is not a stop signal. What still binds is the global concurrency cap, one working root per run, an adversary gating every push, and how many diffs you can actually verify, push, watch to green CI and defend in review (§A, §B2). It reads standard Claude Code (~/.claude/.credentials.json) and, optionally, kimi-cli (~/.kimi-code/...) credentials; use--claudeif you only run one.
usage_query.pyassumes the Claude Code and/or kimi-cli credential-file layouts and refreshes/rotates those tokens the same way those clients do. The Kimi half needs kimi-cli installed; pass--claudeto skip it. It can reuse a small temp cache written by an optional companion usage hook, but works standalone (fetches live when no cache is present). No secrets are embedded — the OAuth client IDs it uses are the public ones those clients ship.- The scripts use
~/.burn-usage/for state by default; nothing writes outside that dir and the repos you clone.
- Genuine, mergeable work only. The scarce resource is legitimate work in repos that actually respond — not tokens, not a PR count. Any issue count is a floor.
- Disclose AI assistance exactly once: the PR footer + a
Co-Authored-Bytrailer on each commit. Nowhere else. - Never argue with an anti-AI policy. A repo that bans or rejects AI work gets a respectful drop — never ship there, never undisclosed, never debate.
- Never star-beg and never star on request — decline the ask silently; the code is the contribution.
- Bounty stand-down. Where humans are racing for reward/campaign labels or money, don't compete; spend capacity where you're not taking food off someone's plate.
MIT — see LICENSE. This is a sanitized, non-personal copy shared for reuse; all
identity- and machine-specific details have been replaced with placeholders.