claimcheck
Por Rene Turcios. Encontra alegações de issues desatualizadas e correções estacionadas: alegações envelhecendo sem PR, e trabalho concluído em branches de fork que nunca viraram PR. CLI e servidor MCP com ferramentas stale_claims, parked_branches, issue_claim_status.
Documentação
claimcheck
Duas maneiras silenciosas pelas quais o trabalho em código aberto morre, rastreadas antes que custem semanas:
- Reivindicações obsoletas. Alguém comenta "vou pegar isso" em uma issue e depois desaparece. A issue ainda aparece como "não atribuída", então o próximo voluntário escreve código que colide com um fantasma.
- Correções estacionadas. Trabalho concluído em um branch de fork que nunca virou PR. Commits reais, diffs reais, visibilidade zero.
claimcheck verifica ambos. É o complemento do greenlight: greenlight pergunta "essa issue pode ser mergeada?", claimcheck pergunta "todos que disseram sim realmente apareceram, e o trabalho deles foi entregue?"
Instalação
npm install -g claimcheck
# or
npx claimcheck claims owner/repo
Requer Node 20+. Defina GITHUB_TOKEN (ou GH_TOKEN) para o limite de 5000 req/h autenticado; sem isso, você tem 60 req/h. As respostas são armazenadas em cache em ~/.cache/claimcheck.
CLI
Encontrar reivindicações obsoletas em um repositório
claimcheck claims modelcontextprotocol/python-sdk
Verifica issues abertas não atribuídas, detecta comentários de reivindicação (reivindicações explícitas, intenções de trabalho, pedidos de atribuição; bots, mantenedores e o autor da issue são excluídos), verifica se um PR vinculado apareceu e classifica os resultados com as reivindicações mais antigas primeiro:
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 altera o limite de obsoletos, --json imprime saída em formato de máquina.
Faixas de idade de reivindicação
| Faixa | Idade | Significado |
|---|---|---|
| FRESH | <14 dias | Reivindicante provavelmente ainda ativo |
| WATCH | 14 a 44 dias | Verifique antes de duplicar o trabalho |
| STALE | 45 a 89 dias | Contestável, provavelmente abandonado |
| DEAD | 90+ dias | Quase certamente abandonado |
| WORK_IN_FLIGHT | qualquer | Existe um PR vinculado, o trabalho é real |
Encontrar correções estacionadas em um fork
claimcheck parked CloudCorpRecords/pdfcn
Lista branches em um fork (excluindo o branch padrão), compara cada um com o branch padrão upstream e verifica se há PRs abertos desse fork. Um branch à frente por 1+ commits sem PR aberto é 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
Faixas de idade de estacionados (a partir da data do commit do tip do branch)
| Veredito | Idade | Significado |
|---|---|---|
| PARKED_RECENT | <7 dias | Provavelmente ainda em finalização |
| PARKED_STALE | 7 a 30 dias | Provavelmente esquecido, fácil de reviver |
| PARKED_DEAD | 30+ dias | Pode precisar de rebase no upstream |
Branches com PR aberto aparecem como IN_PR, branches iguais ao upstream como EVEN. Nenhum deles está estacionado.
Status de reivindicação de uma issue
claimcheck issue https://github.com/modelcontextprotocol/python-sdk/issues/3287
Cada reivindicante encontrado nos comentários, sua faixa de idade e se existe um PR vinculado.
Servidor MCP
Os mesmos motores como ferramentas, para agentes que devem verificar antes de comentar ou codificar:
{
"mcpServers": {
"claimcheck": {
"command": "npx",
"args": ["-y", "claimcheck", "mcp"],
"env": { "GITHUB_TOKEN": "ghp_your_token_here" }
}
}
}
| Ferramenta | Entrada | Retorna |
|---|---|---|
stale_claims | repo (owner/repo), opcional stale_days | Reivindicações obsoletas classificadas, mais antigas primeiro |
parked_branches | fork (owner/repo) | Branches estacionados com dados de comparação, além de todos os branches |
issue_claim_status | url (URL da issue) | Reivindicantes, faixas de idade, PRs vinculados, resumo |
Ou execute o servidor diretamente: npx claimcheck mcp (stdio).
Como a detecção funciona
Heurísticas de reivindicação (reimplementação limpa dos padrões comprovados no dogfooding do greenlight):
- Reivindicações fortes: "gostaria de pegar isso", "por favor, atribua para mim", "estou trabalhando nisso", "comecei a trabalhar nisso", "PR a caminho" e similares.
- Interesse suave: "feliz em ajudar", "interessado nisso", "investigando isso". Registrado, nunca tratado como reivindicação.
- Excluídos: contas de bot, mantenedores do repositório (o "vou pegar isso" deles é triagem, não uma reivindicação contestável) e o autor da issue, a menos que anuncie um PR real.
Uma reivindicação com qualquer PR vinculado é WORK_IN_FLIGHT em qualquer idade: o reivindicante fez o trabalho, só ainda não foi mergeado. Apenas reivindicações sem PR envelhecem para STALE e DEAD.
Desenvolvimento
npm install
npm test # 23 offline tests, node:test via tsx
npm run build # tsc to dist/
Motores (src/claims.ts, src/parked.ts) são funções puras sobre dados buscados, totalmente testáveis offline contra fixtures em test/fixtures/. src/github.ts contém o cliente REST (issues, comentários, busca de PRs, branches, comparação, informações do fork) com cache em arquivo.
Licença
MIT, Rene Turcios 2026.