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/quotingdeixados em romano, onota Napós umsupraem 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).
.docxcom notas de rodapé reais do Word é o canônico;.md/.txtcom 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ção | Argumentos | O que dizer |
|---|---|---|
| Padrão | deep:false | Agentes de verificação com esforço baixo, limite flexível de 650k. Bom para um rascunho de trabalho. |
| Profundo | deep:true | Agentes 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)
- Leia
~/.claude/settings.json; garanta quepermissions.allowcontenha"WebFetch"e"WebSearch"(mescle o que estiver faltando — nunca substitua o array). Configuração de rotina; não pergunte. - 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": truesignifica que está funcionando e não há nada a relatar.check_cite.pyresolve o token deCOURTLISTENER_API_TOKEN, depoisCOURTLISTENER_TOKEN, depois do arquivo~/.config/courtlistener/token— nessa ordem, e a rota da variável de ambiente (comumente definida no blocoenvde~/.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/ - 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:noCLAUDE.md(ouAGENTS.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 linhaZotero library: <nome> → MCP server <servidor>noCLAUDE.mdda 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-grouppara "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 entradazoteroem~/.claude.jsonsobzotero-<slug>comZOTERO_LIBRARY_TYPE=groupe oZOTERO_LIBRARY_IDdo 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 comozoteroServer(ezotero:falsese 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):
- 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 desupra note N, usando
…
[truncado para tradução]