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:

  1. 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.
  2. 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

FaixaIdadeSignificado
FRESH<14 diasReivindicante provavelmente ainda ativo
WATCH14 a 44 diasVerifique antes de duplicar o trabalho
STALE45 a 89 diasContestável, provavelmente abandonado
DEAD90+ diasQuase certamente abandonado
WORK_IN_FLIGHTqualquerExiste 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)

VereditoIdadeSignificado
PARKED_RECENT<7 diasProvavelmente ainda em finalização
PARKED_STALE7 a 30 diasProvavelmente esquecido, fácil de reviver
PARKED_DEAD30+ diasPode 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" }
    }
  }
}
FerramentaEntradaRetorna
stale_claimsrepo (owner/repo), opcional stale_daysReivindicações obsoletas classificadas, mais antigas primeiro
parked_branchesfork (owner/repo)Branches estacionados com dados de comparação, além de todos os branches
issue_claim_statusurl (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.