danepps/cite-check

Verifica cada citação e citação textual em um rascunho de artigo contra as fontes reais — jurisprudência via CourtListener + relatórios oficiais, doutrina via biblioteca Zotero do usuário e depois na web aberta — e retorna um relatório graduado, nota por nota, com uma seção "precisa de sua atenção" primeiro, além de uma seção de forma de citação (citações curtas conforme Bluebook R. 10.9/4.2 e itálico/versalete conforme R. 2.1(a)) decidida apenas a partir do rascunho.

O que é cite-check?

Esta skill, denominada **Cite Check**, automatiza a verificação de citações e citações textuais em rascunhos de artigos jurídicos, garantindo que cada autoridade citada exista e que cada citação textual corresponda exatamente à fonte original. Ela é acionada quando o usuário deseja verificar um rascunho (por exemplo, "cite-check este artigo", "verifique as citações neste rascunho") e aceita arquivos .docx com notas de rodapé do Word ou, como alternativa, markdown/plain text. A ferramenta utiliza scripts determinísticos para extração e resolução de referências cruzadas, e agentes de modelo para verificação de citações textuais e pincites, realizando uma **segunda verificação obrigatória** em cada achado de alta gravidade para garantir precisão. Além da verificação de existência, ela também avalia questões formais de formatação (formas curtas, tipo de fonte) que podem ser decididas apenas a partir do rascunho, sem consultar as fontes. Importante: não se trata de um linter completo do Bluebook (ordem de sinais, ordem de citação e composição da citação estão fora do escopo) e nunca avalia se uma citação não textual efetivamente suporta a proposição a que se refere.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/danepps/legal-research-skills/tree/HEAD/claude-code/skills/cite-check

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação


name: cite-check description: Verifica cada citação e citação textual em um rascunho de artigo contra as fontes reais — jurisprudência via CourtListener + relatórios oficiais, doutrina via biblioteca Zotero do usuário e depois na web aberta — e retorna um relatório graduado, nota por nota, com uma seção "precisa de sua atenção" primeiro, além de uma seção de forma de citação (citações curtas conforme Bluebook R. 10.9/4.2 e itálico/versalete conforme R. 2.1(a)) decidida apenas a partir do rascunho. Acionar quando o usuário quiser verificar citações de um rascunho ("verificar citações deste", "cheque as citações/citações textuais neste rascunho", "execute verificação de citações em "). Entrada: um .docx com notas de rodapé reais do Word (fallback para markdown/texto simples). Não é um linter completo do Bluebook — ordem de sinais, ordem de citação e composição da citação permanecem fora do escopo.

Verificação de Citações (Cite Check)

Uma passagem de verificação sobre um rascunho de artigo finalizado ou em andamento. Cada autoridade é verificada quanto à sua existência; cada citação textual é verificada literalmente contra a fonte real; cada URL é confirmado como resolvível; pincites são verificados quanto à sanidade quando a paginação da fonte é recuperável. Scripts determinísticos fazem a extração e a resolução de referências cruzadas com custo de tokens próximo de zero; agentes de modelo fazem a verificação de citações textuais/pincites em um fan-out de fonte única, com uma segunda verificação obrigatória em cada achado de alta gravidade para que um artefato do verificador nunca chegue ao relatório.

Reutiliza a maquinaria da skill legal-research (check_cite.py, fetch_page.py, o token do CourtListener, a escada de degradação de orçamento) e suas regras internas (apenas web aberta, nunca verificar de memória, uma fonte não recuperável é relatada como não verificada — nunca assumida).

O que verifica: que cada citação resolve para a fonte reivindicada, que os nomes/captions/autores/títulos estão escritos corretamente, que o repositório/volume/primeira-página/tribunal/ano estão corretos, que as citações textuais são literais ou marcadas honestamente, que as referências cruzadas supra/id. estão intactas e que os URLs estão ativos.

Registro de cobertura (adicionado em 2026-09-06) — e o que AINDA NÃO é verificado. As unidades de verificação de citação textual são construídas a partir de citações textuais; por si só, elas deixaram toda fonte secundária não citada textualmente sem verificação. Agora scripts/citation_ledger.py inventaria cada instância de citação em cada nota de rodapé (caso ou secundária, citada textualmente ou não, com cadeias de Id./supra/forma curta resolvidas), uma passagem de existência de fonte secundária cobre os artigos/livros/estatutos/URLs não citados textualmente, e a seção H do relatório dá a cada instância uma disposição — verificada, achado, existência-apenas, não-verificável, não-verificada, xref, xref-não-resolvida — e lista as não verificadas por nota de rodapé. Dois limites permanecem e o relatório deve informá-los: (1) suporte à proposição — se uma citação não textual realmente sustenta a frase à qual está vinculada — nunca é avaliado (é isso que existência-apenas significa); (2) pincites são verificados apenas quando uma citação textual os ancora. Trate existência-apenas como "fonte real, não lida", nunca como "aprovada".

Além disso, os problemas óbvios de FORMA (escopo liberado pelo usuário em 2026-08-10 — "desfaça o bloqueio na medida em que isso impede você de verificar coisas óbvias"). Uma fase Form relata o que é decidível apenas a partir do rascunho, sem consultar nenhuma fonte:

  • Formas curtas — uma citação completa repetida dentro da janela de cinco notas de rodapé da Regra 10.9 do Bluebook onde a forma curta pertence; uma forma curta de caso isolada além dessa janela ou sem citação completa antes dela em qualquer lugar; uma fonte secundária citada por completo duas vezes quando a Regra 4.2 exige Autor, supra nota N.
  • Tipo de fonte (apenas .docx) — sinais / Id. / supra / quoting deixados em romano, o nota N após um supra em itálico erroneamente em itálico, itálico derramando na vírgula antes de uma citação, versalete quebrado no meio da palavra e itálico de nome de caso conforme Regra 2.1(a) do Bluebook (romano em uma citação completa que está em uma cláusula de citação, itálico em uma frase textual ou forma curta — a única chamada que precisa de um agente, pois um padrão não consegue diferenciá-las).

Isso é executado a partir de ${CLAUDE_PLUGIN_ROOT}/skills/legal-research/citeform.py, o mesmo módulo que /proofread usa, portanto as duas skills não podem dar conselhos contraditórios. As regras aplicadas estão escritas em ${CLAUDE_PLUGIN_ROOT}/skills/legal-research/bluebook-typeface-and-short-forms.md. Os achados de forma têm sua própria seção de relatório perto do final e nunca entram em "Precisa de sua atenção" — são arrumação, não substância.

O que AINDA NÃO é: um linter completo do Bluebook (ordem de sinais, ordem de citação e se uma citação está corretamente composta permanecem fora do escopo), um editor substantivo ou um substituto para a verificação de citações do periódico. A divisão com /proofread permanece inalterada para todo o resto: proofread lê a prosa, cite-check verifica as autoridades — agora elas coincidentemente compartilham a camada de forma de citação.

Como executar

1. Analisar a solicitação

  • draftPath — caminho para o rascunho (obrigatório). .docx com notas de rodapé reais do Word é o canônico; .md/.txt com notas de rodapé no estilo pandoc [^n] funciona como fallback.
  • footnotes — passagem parcial opcional, por exemplo, "notas de rodapé 45–80" ou uma lista. Padrão: rascunho inteiro.
  • deep — opcional; verificação mais pesada (agentes de verificação de esforço médio, limite flexível mais alto). Ative para um rascunho quase final ou quando o usuário disser "profundo"/"detalhado".
  • Se o rascunho tiver alterações controladas, avise e pergunte se deve aceitar todas antes de verificar (o analisador lê o texto atual/aceito e pula exclusões controladas, mas um rascunho com muitas marcações vale um aviso).

1b. Perguntar o nível de profundidade (decisão do autor, 2026-08-09 — espelha a etapa 1b do /proofread)

A menos que a solicitação já resolva isso, PERGUNTE de antemão — um AskUserQuestion, cabeçalho Depth, antes do pré-voo. Incorpore o aviso de alterações controladas (etapa 1) na mesma chamada quando aplicável, para que o usuário responda tudo em uma interação em vez de ser interrompido duas vezes.

Pule a pergunta quando a redação já escolher um nível ("profundo", "detalhado", "quase final", "pré-submissão", "rápido", "padrão"), em uma reexecução parcial de um nível já escolhido nesta sessão, ou quando o usuário pediu apenas um intervalo estreito de notas de rodapé.

Duas opções — o cite-check não tem escalada fable, então a escada é mais curta que a do proofread:

OpçãoArgumentosO que dizer
Padrãodeep:falseAgentes de verificação com esforço baixo, limite flexível de 650k. Bom para um rascunho de trabalho.
Profundodeep:trueAgentes de verificação com esforço médio, limite flexível de 900k. Leitura mais cuidadosa de cada citação textual contra sua fonte — para um rascunho quase final.

NÃO reutilize a justificativa do /proofread aqui — os dois deeps são mecanismos diferentes. O deep do proofread adiciona uma segunda passagem de extração de deslocamento (um recurso de recall, apoiado pela descoberta de sobreposição de ~75–80% do mesmo modelo). O deep do cite-check não adiciona uma passagem nem busca nada novamente: ele aumenta o esforço do agente de verificação de low para medium (linha 557 do workflow) e eleva o limite flexível. Ele compra cuidado por citação textual, não mais citações textuais. A cobertura de citações textuais é idêntica de qualquer forma — cada citação textual é verificada em ambos os níveis — portanto, não implique que o Padrão pula algo.

O tempo é menos importante aqui do que no proofread (o deep não muda a extração, então uma reexecução posterior pode reproduzir segmento/existência do cache via resumeFromRunId), mas a verificação é a maior parte da execução — 26 de 33 agentes no rascunho National Muffler — então uma mudança de nível ainda significa reexecutar a etapa cara. Pergunte primeiro.

2. Pré-voo (faça isso ANTES de lançar — um prompt de permissão no meio da execução pode matar um agente)

  1. Leia ~/.claude/settings.json; garanta que permissions.allow contenha "WebFetch" e "WebSearch" (mescle o que estiver faltando — nunca substitua o array). Configuração de rotina; não pergunte.
  2. Confirme que o token do CourtListener funciona. Teste-o, não procure por um arquivo — execute python3 ${CLAUDE_PLUGIN_ROOT}/skills/legal-research/check_cite.py "347 U.S. 483"; saída 0 com "found": true significa que está funcionando e não há nada a relatar. check_cite.py resolve o token de COURTLISTENER_API_TOKEN, depois COURTLISTENER_TOKEN, depois do arquivo ~/.config/courtlistener/token — nessa ordem, e a rota da variável de ambiente (comumente definida no bloco env de ~/.claude/settings.json) é a instalação normal, portanto um diretório ~/.config/courtlistener/ ausente não prova nada. Se a sonda realmente falhar, a execução ainda funciona (a existência do caso cai para a web), mas mencione isso uma vez no momento da entrega. Página do token: https://www.courtlistener.com/profile/api-token/
  3. Resolva a biblioteca Zotero do projeto (projetos diferem — alguns são bibliotecas de grupo coautorais, outros trabalho de biblioteca pessoal solo): a. Procure por uma linha Zotero library: no CLAUDE.md (ou AGENTS.md) da pasta do projeto. Se presente, use o servidor MCP que ela nomeia e pule para (c). b. Se ausente, PERGUNTE ao usuário qual biblioteca Zotero este projeto usa (biblioteca pessoal ou uma biblioteca de grupo nomeada), então registre a resposta como uma linha Zotero library: <nome> → MCP server <servidor> no CLAUDE.md da pasta do projeto para que execuções futuras não perguntem novamente. c. Confirme que esse servidor MCP realmente existe (pessoal = zotero; bibliotecas de grupo têm seu próprio servidor, ex.: zotero-group para "5A general law", ID do grupo em ~/.claude.json). Se a biblioteca do projeto NÃO tiver servidor AINDA, ESTE é o momento de se oferecer para adicionar um: duplique a entrada zotero em ~/.claude.json sob zotero-<slug> com ZOTERO_LIBRARY_TYPE=group e o ZOTERO_LIBRARY_ID do grupo (encontre-o via URL do grupo no zotero.org ou pelos campos de código do rascunho); observe que precisa de uma reinicialização do Claude Code, então os agentes recorrem à web nesta execução. d. Passe o nome do servidor como zoteroServer (e zotero:false se nenhum servidor utilizável nesta execução).

2b. Instantâneo do rascunho (sempre)

Um arquivo OneDrive/Word coautorado ao vivo pode mudar entre a extração e a entrega, o que faria o relatório descrever bytes que nunca foram verificados. Copie o rascunho uma vez, proteja a cópia contra gravação, faça o hash dela e execute tudo a jusante a partir do instantâneo. O caminho original é usado aqui e em nenhum outro lugar — nunca em argumentos do Workflow ou em um prompt de agente.

cp "<draftPath>" "<scratch>/snapshot.docx" && chmod a-w "<scratch>/snapshot.docx"
shasum -a 256 "<scratch>/snapshot.docx"     # registre isso; vai no rodapé do relatório

3. Extrair e preparar (scripts determinísticos — execute estes você mesmo, tokens quase zero)

Coloque o JSON intermediário em algum lugar onde os agentes do workflow possam lê-lo (o scratchpad da sessão é suficiente). Use os caminhos de script instalados para que isso funcione de qualquer pasta (draftName permanece o nome do arquivo original, não "snapshot"):

python3 ${CLAUDE_PLUGIN_ROOT}/skills/cite-check/scripts/extract_cites.py "<scratch>/snapshot.docx" "<scratch>/extract.json"
python3 ${CLAUDE_PLUGIN_ROOT}/skills/cite-check/scripts/prepare_units.py "<scratch>/extract.json" "<scratch>/units.json"
python3 ${CLAUDE_PLUGIN_ROOT}/skills/cite-check/scripts/citation_ledger.py "<scratch>/extract.json" "<scratch>/ledger.json"
python3 ${CLAUDE_PLUGIN_ROOT}/skills/cite-check/scripts/citation_ledger.py "<scratch>/extract.json" --compact > "<scratch>/ledger_args.json"

citation_ledger.py imprime instance_count / by_kind / unique_secondary_cites / unresolved_xrefs. Dê uma olhada em by_kind: uma contagem grande de other ou text significa que as notas de rodapé usam uma forma de citação que o divisor não reconhece — essas instâncias ainda são enviadas no ledger (como unchecked / not-a-citation), então o relatório permanece honesto, mas informe no momento da entrega. O arquivo --compact contém os dois arrays que o workflow recebe (instances, secondary).

extract_cites.py imprime um resumo (footnote_count, contagens de citações textuais no corpo/nota de rodapé, unique_case_cite_count, supra_problem_candidates, mais form_findings / form_short_form / form_typeface / formatting_available / case_name_candidates da camada de forma). prepare_units.py imprime unit_count / case_cites / supra_problems. Leia extract.json para extrair os arrays que o workflow precisa: unique_case_cites, supra_problem_candidates e todo o bloco form_checks.

formatting_available: false significa um rascunho em markdown/texto simples — formas curtas ainda são executadas, tipo de fonte não; informe no momento da entrega. Se formatting_unaligned_footnotes aparecer, esse número de notas de rodapé não recebeu análise de tipo de fonte (seu texto formatado não correspondia ao texto do analisador validado, então a camada recusou em vez de arriscar deslocamentos desalinhados) — mencione apenas se a contagem for não trivial. Para uma passagem parcial, resolva o intervalo de notas de rodapé para IDs de unidade:

python3 ${CLAUDE_PLUGIN_ROOT}/skills/cite-check/scripts/prepare_units.py "<scratch>/extract.json" --footnotes 45-80

(imprime unit_ids — passe-os como unitIds).

4. Lançar o workflow

Workflow({
  scriptPath: "${CLAUDE_PLUGIN_ROOT}/skills/cite-check/cite-check.workflow.js",
  args: {
    skillsDir: "${CLAUDE_PLUGIN_ROOT}/skills",      // onde os scripts auxiliares agrupados residem
    extractPath: "<scratch>/extract.json",      // agentes leem unidades + contexto completo daqui
    draftName:   "<nome do arquivo de rascunho sem extensão>",
    footnoteCount: <extract.footnote_count>,
    unitCount:     <prepare.unit_count>,
    caseCites:     <extract.unique_case_cites>,        // array
    supraProblems: <extract.supra_problem_candidates>, // array
    formChecks:    <extract.form_checks>,              // tipo de fonte + formas curtas (bloco inteiro)
    ledger:        <ledger_args.instances>,            // cada instância de citação (forma compacta)
    secondaryCites:<ledger_args.secondary>,            // fontes secundárias únicas não citadas textualmente
    unitIds:       <null | [ids dos --footnotes]>,    // apenas passagem parcial
    deep:          false,
    zotero:        true,                               // false se nenhum servidor Zotero utilizável nesta execução
    zoteroServer:  "<do pré-voo 2.3>"                 // ex.: "zotero-group" (5A) ou "zotero" (pessoal)
  }
})

Pipeline (todos os estágios de modelo Sonnet, exceto o relatório, que herda o modelo da sessão):

  1. Segmentar/resolver — em blocos; cada citação textual é pareada com a fonte ESPECÍFICA à qual está vinculada, percorrendo cadeias de Id. até seu antecedente real (que pode ser um caso duas notas acima) e seguindo redirecionamentos de supra note N, usando

…

[truncado para tradução]

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

danepps/legal-research-skills

Build or extend a Zotero collection of verified sources for a project — find the sources (web, catalogs, HeinOnline via an institutional library proxy), add them with full metadata via the Zotero Web API, then run a deterministic anti-hallucination check that every added item must pass. Trigger when the user wants sources gathered into Zotero ("build a library for X", "add the books/articles on X to my Zotero", "populate <collection> with …").

danepps/legal-research-skills

Gather the full document set for a SCOTUS case being prepped for a podcast episode, class, or article — cert-stage filings, merits briefs, lower-court opinion, questions presented, and oral-argument transcript — and load them onto the user's reMarkable in a per-case folder. Manual trigger — use when the user says "prep <case>", "grab the briefs for <case>", "load up <case>", or similar.

danepps/legal-research-skills

Quick, verified citation-finding for a specific proposition — a footnote-filler, not a research memo. Returns a few Supreme Court cites and/or a few scholarly cites (top scholars in flagship journals preferred; student notes only as a last resort), each verified with a pincite and a parenthetical or quote. Trigger when the user asks "find me a cite for X", "what should I cite for this footnote", "I need authority for the proposition that…", or pastes a sentence with an empty footnote.

danepps/legal-research-skills

Deep legal research that fans out multiple agents across free legal sources, verifies every authority, and returns a polished, well-cited memo. Use for case-law research, legal-scholarship / literature reviews, or both. Modes — caselaw | scholarship | both. Trigger when the user wants a thorough doctrinal memo, a survey of the academic debate, an answer grounded in cases/statutes, or a research deep-dive on a legal question.

Habilidades Relacionadas