Sprint 024 — Review¶
Período: 2026-08-28 a 2026-08-29 (dois dias) Features: 047-mensagens-internacionalizadas e 048-botao-sem-chave-desabilitado PRs: #593 (047, squash) e #594 (048, squash) — CI 2/2 verde nos dois; revisão adversarial no #594 sem achado real.
Resumo¶
| Planejado | Entregue | |
|---|---|---|
| User stories | 4 | 4 |
| Tarefas | 16 | 16 |
| Entregáveis aceitos | 4 | 2 (#575, #587) |
O que foi feito¶
| Tarefa | Issue | Entregável | Aceito |
|---|---|---|---|
| 047/T001–T004 | #576–#579 | Catálogo configurado (en runtime via :gettext), verificador por AST nascido pela violação, gate novo — que nasceu vermelho com 137 achados |
ver Aceitação |
| 047/T005–T007 | #580–#582 | 139 mensagens migradas sem mudar um byte (97 errors + 40 sistema + 2 default); suíte 1447 verde SEM editar teste; recusa única da 045 intacta | ver Aceitação |
| 047/T008–T011 | #583–#586 | pendencias.md medido por tela; mensagens.lacunas (en 0, pt 128); 11 recusas em pt com a troca provada por teste; 14 gates verdes |
ver Aceitação |
| 048/T001–T005 | #588–#592 | Guarda :sem_chave em request/3 pela violação; botões disabled reais com frase por quem lê; assimetria ambiente/tenant dita na tela; 27ª consulta nomeada no guardião; 14 gates verdes |
ver Aceitação |
Aceitação (registro completo): product-owner em 2026-08-29, 13
evidências executadas, confirmada pela pessoa mantenedora (leitura estrita; revisão
pós-merge). 2/4 aceitas: #575 (idioma) e #587 (botão da chave), ambas com
ressalvas. #573 e #574 NÃO ACEITAS — contraexemplo real: mensagens em literal
via assign renderizado (access_scopes_live, projects_live, humanizar/1),
classe invisível ao verificador (que vigia put_flash) E ao pendencias.md (que
contava notices). O retrabalho é finito (~9 frases + ampliar a fronteira por AST) e
entra em primeiro lugar no sprint 025 — herança antes de escopo novo.
O que não foi feito / não aceito¶
As 16 tarefas foram executadas e as issues fechadas à mão (PRs no padrão 1.6.0 não fecham sozinhos) — mas as US1 e US2 da 047 voltaram: entregável executado cujo resultado não atendeu ao critério não é entregue (a classe assign ficou fora do catálogo e da enumeração). Destino: primeiras tarefas do sprint 025.
Violações de processo (registro em aceitacao.md): revisão nunca pedida nos dois PRs (decisão: revisão pós-merge, pedida por comentário); PRs fora do board; issues fechadas antes da aceitação.
Defeitos encontrados e consertados no caminho¶
- O grep do plano subcontava: 55 literais viraram 137 quando o verificador por AST mediu — multilinha, concatenação e forma pipe eram invisíveis ao grep. Corrigido no tasks.md com a razão; virou o argumento definitivo do verificador por AST.
- A forma qualificada escapou:
Phoenix.Controller.put_flashtem outra cabeça de AST e o verificador v1 não a via — a recusa do PLUG ficou de fora da primeira varredura. Quem pegou foi o teste de idioma (a frase não trocava). Verificador corrigido com teste próprio da forma qualificada. default_localedo backend é compile-time: o contrato previa a config no backend; o teste de idioma reprovou e a medição mostrou que só a config do app:gettexté lida em runtime. Contrato corrigido no mesmo commit, com a razão.rodada_testclicava no botão que a 048 desabilitou: o teste mudou de veículo (evento injetado por fora do botão) com o invariante intacto — L71 aplicada.
Evidências¶
- Gates locais 14/14 com EXIT no log (L60) nas duas branches; CI verde 2/2 nos dois PRs; revisão adversarial postada no #594 (seis frentes, nenhum achado real).
- Suíte completa 1447 verde após a migração das 139 mensagens sem tocar em teste algum — a prova de que o msgid preservou cada byte.
login_test.exssem diff no sprint inteiro (SC-004 da 047).- Captura da geração mensal com credencial (botões vivos, frase ausente — cenário 3 da 048); os estados desabilitados provados por 5 testes de tela.
Dívida gerada¶
- O verificador v1 não vê HEEx — fronteira declarada no contrato, com o backlog
nomeado em
pendencias.md(15 notices na página da pessoa, 8 no work item, …). - pt tem 128 lacunas enumeradas — visíveis pelo relatório, preenchíveis por PR de tradução sem tocar código.
- A frase da lacuna da 048 usa
@operacao_menucomo aproximação de "quem opera" — se a gestão de marca de admin (#568) mudar a semântica, a frase acompanha.
Lições deste sprint¶
No registro acumulado: L76 (a ferramenta de medir precisa da gramática do alvo — grep 55 vs AST 137), L77 (verificador novo nasce com teste de ponta que NÃO passa por ele — foi o teste de idioma que pegou a forma qualificada), L78 (config prometida como "troca em runtime" se prova com teste em runtime antes de entrar no contrato), L79 (agente com árvore compartilhada não troca de branch — o PO deixou a árvore na main e os arquivos "sumiram"), L80 (a pendência medida com o grep do instrumento herda a cegueira dele — foi por ela que duas US voltaram), e L72 refinada (iteration completada mantém o id mas os valores dos itens se perdem, irrecuperáveis pela API — o registro de pertença é o backlog no repositório).
E o flake pós-sprint que o CI do #596 expôs — put_env de teste sem restauração
simétrica vazava a API_KEY e o veredito dependia do seed — foi consertado na raiz
no PR #607, com três seeds fixos como prova.