Skip to content

Vigilância: o contrato da Plataforma foi para v1.1.0 e o detector não olhava onde ele é publicado - #7

Merged
Mozurok merged 4 commits into
mainfrom
fix/vigilancia-contrato-v1-1-0-e-revendor-set2026
Sep 4, 2026
Merged

Vigilância: o contrato da Plataforma foi para v1.1.0 e o detector não olhava onde ele é publicado#7
Mozurok merged 4 commits into
mainfrom
fix/vigilancia-contrato-v1-1-0-e-revendor-set2026

Conversation

@Mozurok

@Mozurok Mozurok commented Sep 4, 2026

Copy link
Copy Markdown
Owner

Auditoria de drift de 04/09/2026, disparada por um mês sem checagem manual (a última foi 03/08). Seis achados, um deles muda a leitura do projeto.

O achado principal

O contrato oficial que gera os dois pacotes publicados foi substituído. Em 24/08/2026 o CGIBS publicou o OpenAPI v1.1.0 da Plataforma Pública, pareado com o Manual de Integração v1.1.0, e moveu o v0.0.10 para "versões anteriores".

v0.0.10 (vendorado desde julho) v1.1.0
rotas 32 35
schemas 57 78 (33 dos 55 comuns alterados)
stream {idPsp}/tributos/... {cnpjRaizPspRecDir}/transacoes/...
MOC não existe 3 rotas novas
X-JWS-Signature ausente required: true nas 43 operações

O manual acrescenta que o Informe de Transação Atualizada perdeu o Pix Automático, numCodBarras ficou fixo em 44 caracteres e dtHrRepasse ganhou prazo-limite.

@splitbr/client e @splitbr/mock continuam gerados do v0.0.10. Este PR não migra os pacotes: é major bump nos dois e merece task própria. O que ele faz é vendorar o v1.1.0, dizer a verdade sobre a situação em todo lugar que hoje mente, e fechar o buraco de vigilância que deixou isso passar.

Por que passou

O drift-check.mjs afirmava, em comentário, que esse contrato não tinha fonte pública e por isso não dava para monitorá-lo. O README repetia. Era falso: https://www.cgibs.gov.br/split-payment serve o zip do OAS sem login e sem mTLS, e o arquivo de lá é byte-idêntico ao que estava vendorado desde julho.

$ curl -sL "https://www.cgibs.gov.br/upload/arquivos/202606/03172158-openapi-v0-0-10.zip" -o old.zip   # 200
$ shasum -a 256 oldoas/openapi-v0_0_10.json vendor/swagger/openapi-v0_0_10.json
c5f60c84...29e2b  oldoas/openapi-v0_0_10.json
c5f60c84...29e2b  vendor/swagger/openapi-v0_0_10.json

Custo medido: 11 dias sem detecção. O quarto alvo do detector fecha isso, comparando o inventário de artefatos da página (o nome de cada upload carrega timestamp, então a URL de um arquivo nunca é alvo estável; a página é).

O que mais estava desatualizado

  • NT 2025.002 v1.51 (04/08), NT 2026.006 v1.00 e IT 2026.001 v1.01 (25/08), PL 010f v1.04 (31/08). Todos vendorados aqui.
  • Calculadora de produção em app 1.3.1 / banco V0043 desde 31/08; o repo registrava 1.2.4 / V0039 em quatro lugares.
  • Contratos da Calculadora: portal e piloto divergentes (36 para 40 rotas), re-vendorados. Fecha a issue Drift detectado nos contratos oficiais #6, aberta desde 31/08 sem tratamento.
  • O Manual de Tempos é minuta publicada desde 15/07/2026, e quatro documentos o davam como inédito.
  • docs/site/novidades.md estava cinco semanas em silêncio apesar do contrato fixo da própria página. Ganhou as quatro entradas que faltavam.

Infraestrutura

  • Não havia CI. Os 162 testes só rodavam na máquina do mantenedor. ci.yml roda build, typecheck e testes em matriz Node 22 e 24 (o 22 é prometido em engines sem nenhuma evidência por trás).
  • Não havia prepublishOnly. Como dist/ é gitignored, um pnpm publish a partir de clone limpo geraria tarball apontando para arquivos inexistentes.
  • pnpm test na raiz não alcançava os 30 testes do detector, que vivem em scripts/.

Release 0.1.1

Patch, sem mudança de comportamento. O conteúdo é o aviso no README dos dois pacotes: quem instala hoje precisa saber que o contrato oficial saiu de baixo do pacote.

Verificação

build            OK
typecheck        OK (client + mock)
testes           162 (27 client + 105 mock + 30 detector)
drift-check      4/4 MATCH
hashes           42 artefatos vendorados conferidos contra vendor/MANIFEST.md

Nota sobre o MANIFEST: nenhuma linha foi sobrescrita, conforme a convenção do arquivo. Os rótulos CURRENT e LATEST que ficaram falsos foram datados ("foi CURRENT até 04/08/2026") em vez de apagados, e as notas de contract diff anteriores foram marcadas como superadas, não editadas.

O contrato da Plataforma saiu do v0.0.10 para o v1.1.0 em 24/08/2026, junto
com o Manual de Integracao v1.1.0, e o CGIBS moveu o v0.0.10 para "versoes
anteriores". Os dois entram aqui como arquivos NOVOS, com linha propria no
MANIFEST: a convencao do arquivo e nunca sobrescrever, e o v0.0.10 continua
sendo o contrato que gera os pacotes publicados.

A quebra e larga: as 12 rotas de stream trocaram {idPsp}/tributos por
{cnpjRaizPspRecDir}/transacoes, entraram 3 rotas do Mecanismo de Ocorrencias,
X-JWS-Signature virou required nas 43 operacoes e os schemas foram de 57 para
78, com 33 dos 55 comuns alterados. Migrar os pacotes e major bump e fica para
task propria; por isso o v1.1.0 ainda nao alimenta o codegen.

Tambem pinados: NT 2025.002 v1.51 (04/08), NT 2026.006 v1.00 e IT 2026.001
v1.01 (25/08), PL 010f v1.04 (31/08) e a minuta do Manual de Tempos, publicada
em 15/07/2026 e que quatro documentos deste repo davam como inedita.

Portal e piloto da Calculadora re-vendorados apos o drift da issue #6: 36 para
40 rotas. Os rotulos CURRENT e LATEST que ficaram falsos foram datados em vez
de apagados, para a linha seguir legivel como historico.
O detector afirmava, em comentario, que o OAS que gera os pacotes nao tinha
fonte publica e que por isso nao dava para monitora-lo. Era falso. O CGIBS
publica o OAS em https://www.cgibs.gov.br/split-payment, sem login e sem mTLS,
e o zip de la e byte-identico ao que estava vendorado desde julho. O custo do
engano deu para medir: o v1.1.0 saiu em 24/08 e passou 11 dias sem deteccao.

O quarto alvo compara o INVENTARIO de artefatos da pagina, nao o conteudo de
um arquivo: o nome de cada upload carrega timestamp (202608/24154448-...),
entao a URL de um arquivo nunca e alvo estavel, e a pagina e. Um artefato novo
publicado ali vira chave a mais no diff e reprova o run.

Detalhes que o caso ensinou:
- inventario vazio e tratado como corpo quebrado, nao como "apagaram tudo": o
  desafio anti-bot do gov.br responde 200 com HTML, e aceitar isso apagaria o
  inventario pinado no proximo re-pin;
- user-agent de navegador em todos os alvos, porque o default do Node basta
  para tomar 403 ou challenge. Foi o que destravou a captura do piloto;
- accept por tipo de alvo, para nao pedir html num alvo que deve dar json.

6 testes novos, 30 no total.
O README afirmava, nas duas metades, que nao existia fonte publica para o
contrato que gera os pacotes. A correcao fica registrada no texto em vez de
sumir em silencio: uma limitacao declarada com confianca e nunca verificada foi
o que custou 11 dias de deteccao, e apagar a frase esconderia a licao.

O quadro de estado-regulacao estava carimbado "ultima verificacao: 20/07/2026"
e prometia que qualquer diferenca viraria Novidades. Eram 46 dias e cinco
diferencas nao registradas. Agora: NT 2025.002 em v1.51, PL 010f, Calculadora
de producao em 1.3.1/V0043, OAS da Plataforma em v1.1.0, Manual de Integracao
em v1.1.0, mais linhas novas para NT 2026.006, IT 2026.001 e o Manual de
Tempos. O Manual de Tempos sai da lista de inexistentes, onde estava errado
desde 20/07: quatro documentos o davam como inedito e ele e minuta publicada.

Novidades ganha as quatro entradas que faltavam (24/08, 25/08, 31/08 e 04/08),
no contrato fixo da pagina. A rotina de vigilancia registra o que a auditoria
apurou, incluindo o que ja funcionava: o detector automatico pegou o drift da
Calculadora e abriu a issue #6 em 31/08. Ela ficou 4 dias sem tratamento, o
que e falha de resposta, nao de deteccao.
Os pacotes nao mudam de comportamento. O que muda e o que eles dizem sobre si:
o README dos dois passa a avisar que o contrato oficial esta na v1.1.0 e que o
pacote instalado implementa a v0.0.10. Quem der npm install hoje precisa saber
disso, e o README e o unico canal que chega ate essa pessoa.

Tres correcoes de infraestrutura que o levantamento expos:

- prepublishOnly nos dois pacotes. dist/ e gitignored e nada rodava build antes
  de publicar: num clone limpo, um pnpm publish geraria um tarball com main,
  types e exports apontando para arquivos inexistentes.
- ci.yml com build, typecheck e testes em matriz Node 22 e 24. Nao havia
  nenhum portao: os 162 testes so rodavam na maquina do mantenedor, e o 22 e
  prometido em engines sem nenhuma evidencia por tras.
- pnpm test na raiz passa a incluir test:scripts. Os 30 testes do detector de
  drift vivem em scripts/, fora de qualquer pacote, entao pnpm -r test nunca
  os alcancava.
@Mozurok
Mozurok merged commit b35c528 into main Sep 4, 2026
2 checks passed
@Mozurok
Mozurok deleted the fix/vigilancia-contrato-v1-1-0-e-revendor-set2026 branch September 4, 2026 17:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant