claimcheck

By Rene Turcios. Finds stale issue claims and parked fixes: claims aging with no PR, and finished work on fork branches that never became a PR. CLI and MCP server with tools stale_claims, parked_branches, issue_claim_status.

Documentation

claimcheck

Two quiet ways open-source work dies, tracked before they cost you weeks:

  1. Stale claims. Someone comments "I'll take this" on an issue, then vanishes. The issue still shows "unassigned," so the next volunteer writes code that collides with a ghost.
  2. Parked fixes. Finished work sitting on a fork branch that never became a PR. Real commits, real diffs, zero visibility.

claimcheck scans for both. It is the follow-up to greenlight: greenlight asks "is this issue landable?", claimcheck asks "did everyone who said yes actually show up, and did their work ever ship?"

Install

npm install -g claimcheck
# or
npx claimcheck claims owner/repo

Needs Node 20+. Set GITHUB_TOKEN (or GH_TOKEN) for the 5000 req/hr authenticated rate limit; without it you get 60 req/hr. Responses are cached in ~/.cache/claimcheck.

CLI

Find stale claims in a repo

claimcheck claims modelcontextprotocol/python-sdk

Scans open unassigned issues, detects claim comments (explicit claims, work intentions, assignment requests; bots, maintainers, and the issue author are excluded), checks whether a linked PR ever appeared, and ranks the results with the oldest claims first:

Stale claims in modelcontextprotocol/python-sdk: 2 stale of 5 claimed issues (threshold 45d)

[STALE] modelcontextprotocol/python-sdk#3287
  Fix: handle empty result sets
  https://github.com/modelcontextprotocol/python-sdk/issues/3287
  claimant: helpfuldev, 63d ago (want-to-work)

[IN FLIGHT] modelcontextprotocol/python-sdk#3290
  ...
  claimant: shipitdev, 5d ago (explicit-claim)

Flags: --days 45 changes the stale threshold, --json prints machine output.

Claim age buckets

BucketAgeMeaning
FRESH<14 daysClaimant probably still active
WATCH14 to 44 daysCheck before duplicating work
STALE45 to 89 daysContestable, likely abandoned
DEAD90+ daysAlmost certainly abandoned
WORK_IN_FLIGHTanyA linked PR exists, the work is real

Find parked fixes on a fork

claimcheck parked CloudCorpRecords/pdfcn

Lists branches on a fork (excluding the default branch), compares each against the upstream default branch, and checks for open PRs from that fork. A branch ahead by 1+ commits with no open PR is PARKED:

Parked branches on CloudCorpRecords/pdfcn (upstream shadcn-labs/pdfcn): 1 parked of 4 branches

[PARKED_STALE] fix-typos
  ahead by 5 commit(s), last commit 20d ago
  no open PR on upstream

Parked age buckets (from the branch tip commit date)

VerdictAgeMeaning
PARKED_RECENT<7 daysProbably still being finished
PARKED_STALE7 to 30 daysLikely forgotten, easy to revive
PARKED_DEAD30+ daysMay need rebasing onto upstream

Branches with an open PR show as IN_PR, branches even with upstream as EVEN. Neither is parked.

Claim status of one issue

claimcheck issue https://github.com/modelcontextprotocol/python-sdk/issues/3287

Every claimant found in the comments, their age bucket, and whether a linked PR exists.

MCP server

The same engines as tools, for agents that should check before they comment or code:

{
  "mcpServers": {
    "claimcheck": {
      "command": "npx",
      "args": ["-y", "claimcheck", "mcp"],
      "env": { "GITHUB_TOKEN": "ghp_your_token_here" }
    }
  }
}
ToolInputReturns
stale_claimsrepo (owner/repo), optional stale_daysRanked stale claims, oldest first
parked_branchesfork (owner/repo)Parked branches with compare data, plus all branches
issue_claim_statusurl (issue URL)Claimants, age buckets, linked PRs, summary

Or run the server directly: npx claimcheck mcp (stdio).

How detection works

Claim heuristics (clean reimplementation of the patterns proven in greenlight's dogfooding):

  • Strong claims: "I'd like to take this", "please assign it to me", "I'm working on this", "I've started working on this", "PR incoming", and similar.
  • Soft interest: "happy to help", "interested in this", "looking into this". Recorded, never treated as a claim.
  • Excluded: bot accounts, repo maintainers (their "I'll take this" is triage, not a contestable claim), and the issue author unless they announce a real PR.

A claim with any linked PR is WORK_IN_FLIGHT at any age: the claimant did the work, it just has not landed yet. Only PR-less claims age into STALE and DEAD.

Development

npm install
npm test        # 23 offline tests, node:test via tsx
npm run build   # tsc to dist/

Engines (src/claims.ts, src/parked.ts) are pure functions over fetched data, fully testable offline against fixtures in test/fixtures/. src/github.ts holds the REST client (issues, comments, PR search, branches, compare, fork info) with file caching.

License

MIT, Rene Turcios 2026.