Sprint 006 — Review¶
Período: 2026-08-12 a 2026-08-18
Feature: 007 — marca de issues
PR: #195, base
007-interface-em-ingles
Resumo¶
| Planejado | Entregue | |
|---|---|---|
| User stories | 2 | 2 |
| Tarefas | 7 | 7 |
| Entregáveis aceitos | 7 | 7 |
Incorporado em 2026-08-12T12:21:51Z, PR #195, depois do #184 — a ordem importava, porque a marca aplica o design system que vive lá.
main em 277d159 com 10 gates verdes por código de saída. A avaliação critério por
critério está em aceitacao.md: 10 dos 11 SC
atendidos, e o restante — SC-009, legibilidade em 360 px — está declarado como não
verificado, porque a estrutura existe e ninguém olhou a tela. Declarar atendido seria declarar
sucesso sem evidência.
O que foi feito¶
| Tarefa | Issue | Entregável | Estado |
|---|---|---|---|
| T001 | #188 | count_collected_by_repository/2 — consulta agrupada de issues vigentes, com 5 testes |
aceito |
| T002 | #189 | por_repositorio/2 faz 1 consulta em vez de 135 |
aceito |
| T003 | #190 | migração issues_collected_at, campo no schema e em list_observed/2; round trip conferido |
aceito |
| T004 | #191 | CMPO.mark_issues_collected/3, gravada no mesmo ponto do checkpoint, com 2 testes de ingestão |
aceito |
| T005 | #192 | a marca com três canais, contagem decidindo primeiro | aceito |
| T006 | #193 | no current work — houve trabalho e não há vigente |
aceito |
| T007 | #194 | os 135 seguem clicáveis, inclusive os 94 sem trabalho | aceito |
O que não foi feito¶
| Item | Motivo | Destino |
|---|---|---|
| iteration própria do sprint no ProjectV2 | configurar iterations recria as existentes — L11, custou reatribuir 96 itens | product backlog, decisão da pessoa mantenedora |
tipos Epic e User Story na organização |
criar tipo altera a configuração da organização | product backlog |
| verificação visual de V1 e V7 (olho na tela, 360 px) | os três estados estão asseridos no HTML renderizado, e ninguém olhou | pendente — SC-009 registrado como não verificado na aceitação |
Duas mudanças de desenho durante a execução, e as duas são declaradas¶
O contrato ganhou uma terceira função¶
repositories_with_absent_issues/2. O contrato declarava duas, e o quarto texto —
no current work — não é derivável delas: a contagem de vigentes não distingue "nunca teve
issue" de "teve e não tem mais". A correção entrou no mesmo commit, e o contrato registra o
porquê.
O texto do terceiro estado mudou, e a razão foi medida¶
Era not collected yet, que afirma que a coleta não ocorreu. Medido no banco depois da
migração: 94 repositórios com data nula, e a coleta visitou 61 deles e não achou nada. Dizer
"não coletado" sobre eles é a tela afirmando o que não observou.
Virou no collection recorded — nomeia a ausência do registro, que é o que existe. É o
mesmo princípio do achado A1, na direção oposta: não afirmar coleta que não houve, e não afirmar
ausência de coleta que houve.
O defeito que o teste desta feature achou em código que já existia¶
O teste de T004 reproduz a corrida real — o repositório sai da observação durante a fase — e
a fase morreu com MatchError em {:ok, _} = CMPO.clear_inaccessible/2, um ponto antes do
código novo. As duas chamadas agora registram em log com o nome do repositório e seguem.
Não é fallback silencioso: o log nomeia, e nada depois lê a data como se ela existisse.
Evidências¶
Os dez gates, por código de saída:
370 testes, 19 novos.
V9 no dado real — a medida que a análise pediu, contra o banco de desenvolvimento depois da migração:
Nenhuma coleta anterior registrou a data. Os 41 aparecem com trabalho porque a contagem decide primeiro; se a data decidisse, os 41 apareceriam como não coletados.
Os dois defeitos, verificados por reprovação — invertendo o código de propósito:
| Defeito introduzido | Testes que reprovaram |
|---|---|
| data decidindo antes da contagem | 5, incluindo o de FR-005a com a mensagem sobre os 41 |
| forma igual nos três estados, distinguindo só por cor | 1, o de WCAG 1.4.1 |
Um teste que não reprova quando o defeito existe não é evidência de nada — é a L18.
Dívida gerada¶
| Dívida | Por quê |
|---|---|
a marca só existe em /work |
FR-013 fechou o escopo; o segundo chamador é o que justifica o componente — R1 |
os 135 seguem sem issues_collected_at até a próxima coleta |
a migração não inventa data que não foi observada; a coleta grava |
| dois sprints sem iteration no ProjectV2 | flow.throughput e flow.wip.count não separam 003 a 006 |
Lições deste sprint¶
L32 — Texto que afirma o que a plataforma não observou é o mesmo defeito, na direção
oposta. A feature nasceu para impedir que ausência fosse desenhada como zero, e a primeira
versão do texto dizia not collected yet sobre 94 repositórios de que a plataforma só sabe não
ter registro. Vigiar uma direção e não a outra é fácil: as duas são a mesma pergunta — o que
esta frase afirma, e a plataforma observou isso?
L33 — A pergunta que a análise faz e o teste de unidade não faz é "o que a tela diz no dia da migração". Cada peça de A1 funcionava. O defeito só aparece quando se pergunta pelo estado do mundo no instante seguinte à mudança de esquema — e nenhum teste de unidade tem esse instante como cenário.
Detalhamento em licoes-aprendidas.md.