fix(release): bump @codespar/types para 0.10.16 e recusa conteudo que muda sem bump (core#129) - #133
Conversation
… changes without a version bump (core#129) The bump alone would leave the next divergence free to happen the same way, so the guard is the larger half of this change. Measured on 06/09 against origin/main and registry.npmjs.org: @codespar/types declared 0.10.15, the registry's latest was 0.10.15, main's compiled meta-tool-definitions.js was 40660 bytes with 15 definitions, and the published tarball of that same version was 8291 bytes with 3. Missing: codespar_wallet, codespar_kyc and 10 others. scripts/check-publish-drift.mjs compares every publishable package against what is actually on the registry under its declared version and fails when the content differs, because npm versions are immutable and that content is unreachable until the number moves. It runs in CI on every PR and again in publish.yml before the publish loop. The guard found the same defect in two more packages, left at their current numbers because choosing their next version is a release decision: @codespar/sdk (core#131) and @codespar/api-types (core#132). Both are waived by exact fingerprint in publish-drift-baseline.json, so the waiver covers one measured state and expires the moment either side moves. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Estado do CI neste PR
Os 4 vermelhos sao pre-existentes no Mesmos 4 jobs, mesmo erro ( O job Vale registrar um ganho de confianca de graca: os 12 Este PR nao foi mergeado e nada foi publicado. O merge nao dispara publicacao (o |
…6 é imutável) O portão `check-publish-drift` reprovou: a `description` de WALLET_DEFINITION muda o conteúdo empacotado e 0.10.16 já está no registry. Mesmo rito de #133: package.json, package-lock.json e o `version` de DEMO_SCENARIO_MANIFEST (o teste de lockstep exige igualdade). Sem entrada de CHANGELOG, como em #133. Uma tag de release publica todos os pacotes não-private juntos: a próxima tag leva types 0.10.17 (com sdk 0.12.0, cli 0.6.1 e os adapters 0.4.2, que já estavam com bump pendente). Refs codespar/codespar-enterprise#1208 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…a de codespar_wallet, CLI marca overspent) (#141) Metade `codespar-core` de codespar/codespar-enterprise#1208 (lane wallet, PR codespar/codespar-enterprise#1204; drift de prosa é o de codespar/codespar-enterprise#933). ## O que muda - **Snapshot do OpenAPI re-buscado do servido** (`node scripts/openapi-spec.mjs refresh` em `packages/core`, que é o mecanismo do repo: servido → `openapi-snapshot.json` → `src/generated/openapi.ts` + `operations.ts`), commit próprio. As duas ocorrências de "floored at 0" no gerado somem e `overspent: boolean` aparece em `GET /v1/consumers/{id}/wallet`. O diff por caminho: esse, `POST /v1/wallets/{id}/ledger` (`mandate_id`/`attempt_id`/`external_ref` opcionais, ent#1194), `/v1/sessions/{id}/execute|proxy_execute|send` (texto do 403) e dois caminhos NOVOS, `/v1/fees` e `/v1/fees/movimentar`. A tabela de operações vai de 213 a 215, então o pino em `api-client.test.ts` sobe a 215 de propósito, e README/CHANGELOG de 0.12.0 (não publicado; npm serve 0.11.0) dizem 215/175. - **`packages/types/src/meta-tool-definitions.ts`**: a `description` de `WALLET_DEFINITION` passa a ser o texto servido em `api.codespar.dev/meta-tools.json` copiado verbatim, não parafraseado. Só prosa; `WALLET_INPUT` não muda. - **`packages/cli/src/commands/wallet.ts`**: `WalletCurrency` ganha `overspent: boolean` (nome do openapi servido) e a coluna `available` imprime `-2500 (overspent)` quando a API devolve `overspent: true`; a nota de rodapé explica a marca. Mínimo: nenhuma coluna nova, nenhum exit code novo. - **`@codespar/types` 0.10.16 → 0.10.17** (commit próprio). O portão `check-publish-drift` do CI reprovou: a prosa de `WALLET_DEFINITION` muda o conteúdo empacotado e 0.10.16 já está no registry, que é imutável. Mesmo rito de #133 (package.json, package-lock.json, `version` de `DEMO_SCENARIO_MANIFEST`; sem entrada de CHANGELOG).⚠️ Uma tag de release publica TODOS os pacotes não-private juntos: a próxima tag leva types 0.10.17 junto com sdk 0.12.0, cli 0.6.1, mcp 0.5.4 e os adapters 0.4.2, que o portão já listava como "bump pending". O enterprise pina `@codespar/types` 0.10.14 (ent#933) e não é tocado aqui. ## Evidência | Portão | rc | |---|---| | `node scripts/openapi-spec.mjs check` (packages/core, COM rede: servido == snapshot 35fddb5dbab7, 215 operações) | 0 | | `npx vitest run` em `packages/core` (19 arquivos, 190 testes; inclui `openapi-snapshot.test.ts` e o pino de 215 em `api-client.test.ts`) | 0 | | `npx vitest run` em `packages/types` (150 testes; inclui `meta-tool-definitions.test.ts` e a conformance) | 0 | | `npx vitest run` em `packages/cli` (31 testes) | 0 | | `npx turbo run typecheck --filter=@codespar/sdk --filter=@codespar/types --filter=@codespar/cli --filter=@codespar/api-types` (6 tasks) | 0 | | `npx turbo run build` (18 tasks) + `node scripts/check-publish-drift.mjs` (17 pacotes: types 0.10.17 "not on the registry — bump pending"; sdk, cli, mcp e adapters idem; api-types 0.5.0 é o waiver pré-existente de core#132) | 0 | | `node --test scripts/check-publish-drift.test.mjs` | 0 | Não rodei `turbo run build typecheck test` no monorepo inteiro (memória da máquina); CI cobre. `grep -rn 'floored at 0' packages` devolve zero. ## Fica de fora - `packages/api-types` não tem ocorrência de "floored": o gerado que a issue cita (~11689/11722) é `packages/core/src/generated/openapi.ts`, tratado aqui. - Não há tipo de resultado para `codespar_wallet` em `@codespar/types`; o drift de resultado tipado continua sendo ent#933 / ent#1199. - A CLI não muda exit code nem cor para `overspent`; só a marca na célula. - `/v1/fees` entra no cliente gerado sem exemplo ou doc de uso; é o que o servido publica. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Fecha o core#129:
@codespar/typesbumpado para 0.10.16, e um guarda que recusa o estado que produziu o defeito. O guarda e a parte maior. Sem ele a proxima divergencia nasce igual e so aparece quando alguem for usar uma definicao que "existe".O defeito, remedido nesta sessao
Nenhum numero abaixo veio da issue. Todos foram medidos hoje contra
origin/maineregistry.npmjs.org.Versao declarada contra versao publicada:
Contagem de definicoes, dois instrumentos de cada lado. Lado do
main,srccompilado com otsconfigreal do pacote:Lado do npm, tarball publicado daquela mesma versao:
Byte a byte, mesmo arquivo: 8291 publicado contra 40660 no
main. As 12 ausentes incluemcodespar_wallet(cash-in, B.5 do roteiro homologado) ecodespar_kyc(B.1). O controle positivo continua valendo: os dois instrumentos concordam nos dois lados, entao o 3 nao e artefato de formato.Causa, confirmada na historia:
A tag
v0.10.15aponta para03f14d7, que tinha 3 definicoes. A publicacao saiu 3 minutos depois. O3436b7d(#126, 03/09) levou para 15 e deixou"version": "0.10.15"intacta. Dois meses de CI verde com o defeito vivo.O guarda
scripts/check-publish-drift.mjs. Para cada pacote publicavel do workspace: se a versao declarada ja existe no registro, o conteudo empacotado tem que ser identico ao que foi publicado sob aquele numero. Se difere, reprova e exige bump. Versao que ainda nao esta no registro e o estado saudavel: o bump esta pendente e o conteudo vai junto com ele.Por que esta forma e nao as outras duas. As tres foram consideradas contra o caso historico, que e o unico teste que importa:
publish.ymltrata "You cannot publish over the previously published versions" como soft-pass de proposito, para re-rodar uma tag ser idempotente. Transformar isso em falha dura quebra o re-run legitimo e mesmo assim nao teria pego este caso: entre3436b7de hoje nenhuma tagv*foi empurrada. O defeito viveu dois meses sem nunca chegar perto do publish.mainnomeia o defeito exato: o que o consumidor consegue instalar difere do que omainproduziria, sob o mesmo numero imutavel. Roda em PR, para todo pacote, e independe de ha quanto tempo a divergencia entrou. Um guarda amarrado ao diff do PR teria passado em todos os PRs depois do culpado.O guarda tambem entrou como pre-flight no
publish.yml, antes do loop. Ali ele fecha o buraco irmao: uma tag empurrada com versoes nao bumpadas hoje reporta "✓ already at this version", nao publica nada e sai verde.Prova de que pega o caso historico
Rodado no
mainantes do bump, com o registro real:O guarda reproduz sozinho os dois numeros da issue (8291 e 40660) sem que nenhum deles esteja escrito no codigo dele. Depois do bump, o mesmo comando devolve
✓ @codespar/types@0.10.16 — 0.10.16 is not on the registrye sai 0.Os controles
Nao-vacuidade, unitario.
scripts/check-publish-drift.test.mjs, primeiro teste do arquivo: planta o estado exato do core#129 (conteudo mexido, versao intacta, versao presente no registro) e exige reprovacao. Para provar que a suite nao e vaca, quebrei o guarda de proposito (drifted: falsefixo) e rodei:A mutacao mata o teste de nao-vacuidade. Guarda restaurado, 10/10 passam, em Node 25 e em Node 20 (a versao do CI).
Nao-vacuidade, ponta a ponta contra o registro real. Plantei uma divergencia num pacote intocado (
@codespar/vercel), reconstrui e rodei o CLI de verdade:Controle do outro lado, 1: mudanca legitima com bump passa. Mesmissima mudanca de conteudo, agora com
0.4.1->0.4.2:Controle do outro lado, 2: quem nao toca o pacote nao dispara nada. Sonda revertida:
Isso depende de o build ser reproduzivel, o que foi verificado antes de escolher o desenho:
npm packdomainpara um pacote intocado bate hash a hash com o tarball publicado,package.jsonincluso. Na varredura dos 17 pacotes publicaveis, 12 vieramidenticalsem nenhum falso positivo.O que o bump NAO conserta
Isto e fato sobre o mundo, nao pessimismo.
Versao npm e imutavel.
@codespar/types@0.10.15resolve para 3 definicoes no registro e 15 no codigo, para sempre. Nao existe republicacao sobre aquele numero. Quem pinou0.10.15exato nao tem conserto nenhum ali: a unica saida e mover o pin. O 0.10.16 nao alcanca ninguem retroativamente, so quem instalar depois de publicado.E o 0.10.16 ainda nao existe. Este PR muda um numero em
package.json; ele nao publica. Enquanto ninguem empurrar a tag,npm i @codespar/typescontinua entregando 3 definicoes.Consumidores dentro deste repo, medidos (
npm view "@codespar/types@<range>" version):examples/payment-failure-triage0.10.14exatoexamples/boleto-expiry-fiscal-remediation0.10.14exatoexamples/service-invoice-meta-tool^0.10.11examples/installment-negotiation-meta-tool^0.10.11examples/latam-commerce-smoke^0.1.0Ninguem neste repo pina
0.10.15exato. Os dois pins exatos estao em0.10.14, o que significa que esses exemplos tambem nunca viram as 15 definicoes e continuam sem ver depois deste bump ate alguem mexer no pin deles. Consumidores externos ao repo eu nao consigo enxergar: quem tiver0.10.15em lockfile esta sem conserto naquele numero.Nao mede o lado Python.
packages/pythonpublica no PyPI por outro workflow e o guarda so olha npm.Dois outros pacotes no mesmo estado
O guarda encontrou o mesmo defeito em mais dois pacotes. Nao bumpei nenhum dos dois porque escolher o proximo numero deles e decisao de release, nao de quem achou:
@codespar/sdk@0.11.0(core#131). 19 arquivos diferentes, 28 que existem so nomain, entre elesdist/internal/abort.jsedist/internal/fetch.js. Causa:11272ac(feat(sdk): request timeout + cancellation (TS + Python + managed-agents) [behavior change] #49, timeout + cancelamento, marcado[behavior change]no proprio titulo) e08d2cc1(fix(sdk): validate timeout before best-effort swallow in connections() (TS + Python) #120) entraram depois da tagv0.11.0. Timeout e cancelamento nao existem para quem instala o SDK hoje. Aditivo e marcado como mudanca de comportamento puxa para0.12.0em vez de0.11.1.@codespar/api-types@0.5.0(core#132).dist/servers.js2352 -> 2374 bytes. OAuthTypeSchemapublicado temapi_key, cert, header, hmac_signed, jwt_ecdsa, none, oauth, path_secret; o domaintem tambemtwo_header(grep -c two_header: 0 no publicado, 1 nomain). Causa:c586a0c(feat(sdk): session.ledger() + session.issue() wrappers + two_header api-type #72). Aditivo a schema puxa para0.6.0em vez de0.5.1.Os dois estao cobertos por waiver em
scripts/publish-drift-baseline.json, e o waiver e fixado por fingerprint sha256 do par (tarball publicado + arvore local). Ele cobre um estado medido e mais nada: qualquer mudanca nova no pacote deixa de casar e o guarda reprova, e o bump torna o waiver obsoleto e tambem reprova ate ser removido. Ha teste para as duas expiracoes. Nao e botao de mudo.Sem esses dois waivers o guarda nasceria vermelho no
maine seria desligado na primeira semana.O que o merge dispara, exatamente
Para quem for autorizar: o merge deste PR nao publica nada.
A publicacao e disparada por push de tag
v*, nunca por merge nomain. O merge daqui roda oci.yml(build, typecheck, test, self-test do guarda, guarda, audit) e mais nada.@codespar/types@0.10.16so chega ao npm quando alguem empurrar uma tagv*, e ai o workflow roda com OIDC trusted publishing (id-token: write, sem token no repositorio), constroi, testa, passa pelo guarda como pre-flight e entao publica todos os pacotes publicaveis do workspace no mesmo loop. Nesse momento sai@codespar/types@0.10.16;@codespar/sdke@codespar/api-types, ainda nos numeros ja publicados, cairao no soft-pass "already at this version" e nao publicarao nada, o que e o estado descrito no core#131 e no core#132.Verificacao rodada localmente
O bump exigiu mover
DEMO_SCENARIO_MANIFEST.versionjunto, empackages/types/src/testing/scenario-manifest.ts: oscenario-manifest.test.tsja prendia manifesto epackage.jsonem lockstep. O repo ja tinha guarda para "publicou e esqueceu de bumpar o manifesto"; o que faltava era o inverso, que e o core#129. Opackage-lock.jsonfoi regenerado comnpm install --package-lock-onlye mudou exatamente uma linha.Nota de ambiente: o custo do guarda no CI e ~13s para os 17 pacotes, e ele le
registry.npmjs.org. Registro ilegivel sai com codigo 2 e reprova o job de proposito, porque "nao consegui checar" nao pode ser lido como "esta limpo".Fecha o core#129. Abre o core#131 e o core#132.