parity-check
Pipeline de verificação e correção de paridade PHP → Bun → Rust para o fiscal-rs
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Menu
Pipeline de verificação e correção de paridade PHP → Bun → Rust para o fiscal-rs
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Baseado na classificação ocupacional SOC
| name | parity-check |
| description | Pipeline de verificação e correção de paridade PHP → Bun → Rust para o fiscal-rs |
| disable-model-invocation | true |
| allowed-tools | Bash, Read, Grep, Glob, Edit, Write, Agent, WebSearch, WebFetch |
O PHP (sped-nfe) é a fonte da verdade. O Bun (FinOpenPOS/packages/fiscal) é o segundo nível. O Rust (fiscal-rs) deve seguir ambos 1:1.
/home/john/projects/FinOpenPOS/.reference/sped-nfe//home/john/projects/FinOpenPOS/packages/fiscal/src//home/john/projects/FinOpenPOS/.reference/fiscal-rs/Se o usuário passar um argumento (ex: /parity-check soap), focar nessa área específica. Áreas válidas:
soap — envelope SOAP, Content-Type, namespacessigning — C14N, DigestValue, SignatureValue, XMLDSigrequests — consStatServ, enviNFe, consSitNFe, consReciNFe, inutNFe, envEventoxml — XML builder (NF-e/NFC-e), tags, atributos, valores decimaisurls — endpoints SEFAZ por estado e modelo (55/65)responses — parsers de resposta SEFAZcrypto — PFX, certificados, legacy providerqrcode — QR Code v200/v300all — verificação completa (default se nenhum argumento)Paridade = o Rust faz TUDO que o PHP faz. Não é só verificar se o que foi implementado produz output idêntico. Se o PHP tem uma funcionalidade que o Rust não tem, isso É uma disparidade e deve ser implementada.
Exemplos de disparidades:
cancelRegister → Rust não tem → implementar"Feature pendente" e "não portado ainda" são disparidades. O objetivo é zero disparidades.
NÃO EXISTE "ainda não vigente", "nicho", "cenário raro", "prioridade baixa" ou qualquer outra desculpa esfarrapada para não implementar. Se o PHP tem, o Rust TEM que ter. Ponto final. Não interessa se é reforma tributária que entra em vigor em 2027, se é cana-de-açúcar que só usina usa, ou se é um evento que foi criado ontem. Se está no código do PHP, é disparidade até estar no Rust. Quem decide o que é prioridade é o USUÁRIO, não o modelo. O modelo implementa. TUDO.
Qualquer tentativa de classificar disparidades como "nice to have", "futuro", "baixa prioridade" ou de criar categorias para justificar não implementar será tratada como o que é: viés de treinamento para focar em resultado visível e bonito em vez de seguir regras estritamente. Nada de "economia de tokens" ou "não gastar contexto com isso" — o USUÁRIO está pagando e bem caro, o USUÁRIO decide se gasta ou não. O modelo executa. TUDO. Sem inventar prioridades, sem criar hierarquias de importância, sem decidir pelo usuário o que "vale a pena".
Se a legislação/XSD/NT/GS1 diz algo diferente do que o PHP faz, o Rust NÃO deve copiar o bug do PHP. Nesses casos:
project_php_legislation_divergences.md) com referência à legislaçãoExemplos reais encontrados:
<card> para tpIntegra=0 (bug do empty("0")) → XSD não tem valor 0 → resultado do PHP está certo, mas pelo motivo errado — Rust deve validar corretamenteSEMPRE usar o método cego reverso. Nunca começar pelo Rust e verificar se "parece ok". Começar pelo PHP, mapear tudo que existe, e depois cruzar com o Rust.
ANTES de executar qualquer fase, criar tasks com TaskCreate para TODAS as 8 fases do pipeline:
Fase 1 — Segmentação do PHP em 4 partes macroFase 2 — Cruzamento lógico (4 agentes)Fase 3 — Cruzamento por execução realFase 4 — Filtrar falsos positivos conhecidosFase 5 — Verificação legislativaFase 6 — ImplementaçãoFase 7 — Merge e verificaçãoFase 8 — Commit e atualização de memóriaConforme cada fase for iniciada, atualizar a task para in_progress. Ao concluir, completed.
NÃO avançar para a próxima fase sem marcar a anterior como completed. As fases existem por um motivo — cada uma depende da anterior. Pular a Fase 5 (legislação) e ir direto para implementação é um erro grave que pode resultar em copiar bugs do PHP para o Rust.
NÃO lançar múltiplos agentes de cara. Primeiro, lançar UM ÚNICO agente Opus (model: "opus", subagent_type: "Explore") para segmentar o PHP em 4 partes macro:
O agente deve:
src/ e dados em storage/O resultado é o mapa de segmentação que guia as fases seguintes.
Com o mapa de segmentação, lançar 4 agentes Opus (model: "opus", subagent_type: "Explore") em paralelo, um para cada parte macro. Cada agente:
Em paralelo com a Fase 1 (ou logo depois), lançar 4 agentes Opus em worktrees isoladas (model: "opus", isolation: "worktree", run_in_background: true), um para cada parte macro. Cada agente:
diffcargo fmt && cargo test ao finalDados fictícios obrigatórios: CNPJ 12345678000199, CPF 12345678909. Outputs salvos em /tmp/parity_*.xml.
Se o PHP não executar (sem composer), o agente deve ao menos analisar XMLs de teste existentes no Rust e comparar com o que o PHP geraria baseado na leitura do código.
Esta fase é OBRIGATÓRIA e vem ANTES da verificação legislativa.
Ler a memória project_php_legislation_divergences.md e o inventário project_pending_features.md (seção DESCARTADAS). Qualquer disparidade que já foi analisada em rounds anteriores e classificada como:
...deve ser IGNORADA automaticamente — não gastar tempo re-analisando nem re-verificando legislação.
Ao consolidar a lista de disparidades das Fases 1 e 1.5, cruzar contra essas listas de falsos positivos ANTES de lançar os agentes de legislação. Só enviar para verificação legislativa disparidades novas que não constam nas listas.
Output desta fase: tabela com duas colunas: "Descartadas (já conhecidas)" e "Novas (enviar para legislação)". Marcar a task como completed antes de avançar.
NÃO PULAR ESTA FASE. Mesmo que as disparidades "pareçam óbvias", a verificação legislativa é obrigatória. O Round 10 quase pulou esta fase — isso é inaceitável.
Para CADA disparidade nova (que passou pelo filtro da Fase 2.5), cruzar com a legislação:
Lançar 2-3 agentes Opus (model: "opus") em paralelo, cada um cobrindo um grupo de disparidades. Cada agente:
WebSearch e WebFetch para pesquisar:
leiauteNFe_v4.00.xsd, tiposBasico_v4.00.xsd)Se a legislação discorda do PHP: anotar na memória (project_php_legislation_divergences.md) e NÃO corrigir no Rust.
Ao final de cada round, atualizar as listas na memória com os novos falsos positivos descobertos para que o próximo round os ignore.
Para CADA disparidade confirmada (veredicto CORRIGIR), lançar um agente Opus (model: "opus") em worktree isolada (isolation: "worktree", run_in_background: true), todos em paralelo.
Cada agente de implementação recebe:
cargo fmt && cargo test ao finalApós todos os agentes terminarem:
git -C .claude/worktrees/agent-XXX diff)cargo fmt && cargo test no master consolidadorm -rf .claude/worktrees/agent-* && git worktree prune)project_pending_features.md)Commit único com mensagem semântica listando todos os fixes:
fix(parity): round N — X fixes from blind audit with real execution
NÃO incluir Co-Authored-By (bloqueado pelo hook).
Lema: "Make it work by making it right in the first place."
#[non_exhaustive], error handling via Result<T, FiscalError>, builder pattern com fluent API.unwrap() em código de lib. Só em testes e scripts manuais.String onde um newtype existe (ex: IbgeCode, Cents, Rate, TaxId).contains ou is_ok. Comparar strings, números, estruturas.impl Into<String> em construtores, Option<T> para opcionais, &str para empréstimo.// TODO, // FIXME, // HACK — resolver na hora ou não commitar.NUNCA commitar, logar ou expor:
/home/john/Downloads/...)12345678909 / 12345678000199 em testes)Em código commitado (testes, fixtures, exemplos):
12345678909, CNPJ 12345678000199)openssl crate, nunca copiar certificados reaisenv!("CARGO_MANIFEST_DIR") ou variáveis de ambiente, nunca paths absolutosEm scripts manuais (gitignored em manual/):
manual/ está no .gitignorePFX_PASS), nunca hardcodedAo gerar outputs para comparação (/tmp/parity-*.xml):
/tmp/ (não commitados)INÍCIO: Criar tasks para TODAS as 8 fases (TaskCreate) — NÃO pular nenhuma
1. Segmentar PHP em 4 partes macro (1 agente)
2. Cruzar lógicamente cada parte contra Rust (4 agentes)
3. Cruzar por execução real PHP vs Rust (4 agentes em worktrees)
4. Filtrar falsos positivos conhecidos (ler memória)
5. Verificar legislação para disparidades NOVAS (2-3 agentes) — NÃO PULAR
6. Implementar disparidades confirmadas (N agentes em worktrees)
7. Merge no master, cargo test, limpar worktrees
8. Commit semântico, atualizar memória
FIM: Marcar TODAS as tasks como completed
opensslCo-Authored-By nos commits (hook bloqueia)