MG-5 (parcial): apuração e classificação materializada em Functions
110 casos verdes em 9 arquivos. A regra de pontuação e a de classificação foram
PORTADAS do NestJS, não reescritas — as duas já eram funções puras, com 33 casos
cobrindo faixa de saldo, critério exibido e posição compartilhada, e vieram com os
mesmos IDs (PR-1-*, PR-5-*).
Reescrever "melhor" durante a migração seria trocar regra verificada por regra
nova sem ninguém pedir, e a forma de descobrir o erro seria o primeiro bolão real.
Com o porte, caso que muda de resultado é defeito de migração.
Preservadas com o comentário que explica por quê: empate sem faixa de saldo (1x1
num 4x4 vale 3), critério de desempate olhado para os dois lados (quem está na
frente também precisa da explicação) e campeão precisa ter pontuado.
Um defeito no produto e um no teste, na mesma falha
- Produto: o gatilho dispara em toda escrita do jogo, inclusive o sourceUpdatedAt
que a sincronização grava sem mudança — e reapurava o bolão inteiro a cada uma.
Não errava o resultado; jogava leitura e escrita fora, no serviço em que custo é
por operação e o free tier é requisito. Agora compara resultado antes/depois e
sai fora se nada mudou, o que também é a proteção de at-least-once.
- Teste: minha condição de espera ("existem 4 linhas de classificação") já era
satisfeita pela passada anterior à apuração, então o teste lia zero e acusava o
produto. Segunda vez nesta migração que espera mal escolhida faz teste de
integração parecer defeito de regra.
Decisão registrada: classificação recalculada do zero, não por delta. Mais
escrita, e mantém o agregado derivável — delta acumulado erra em silêncio até
alguém comparar com o extrato.
BE-4 (extrato), BE-5 (correção manual) e BE-6 (aviso consolidado) seguem abertas:
dependem de rota chamável pelo app, assunto de MG-7.
Co-Authored-By:
Claude Opus 5 (1M context) <noreply@anthropic.com>
parent
db275af7
Please register or sign in to comment