Sprint 010 — Review¶
Período: 2026-08-12 · Feature: 011 — de quem cada issue é parte Aceitação: aceitacao.md — 12 de 13 critérios
Resumo¶
| Planejado | Entregue | |
|---|---|---|
| User stories | 3 | 3 |
| Tarefas | 9 | 9 |
| Entregáveis aceitos | 9 | 9 |
| Critérios de sucesso | 13 | 12 |
O que foi feito¶
| Tarefa | Issue | Entregável | Aceito |
|---|---|---|---|
| T001 | #252 | Axioms.relacao/2 — cinco respostas, chamando rule07/2 |
sim |
| T002 | #253 | WorkItems.list_parents/2 — uma consulta, todos os pais, ordem determinística |
sim |
| T003 | #254 | a coluna part of, com o conceito do pai e a ausência nomeada |
sim |
| T004 | #255 | os cinco textos em ConceptLabel.relacao/1 |
sim |
| T005 | #256 | o nome do repositório do pai, só quando difere | sim |
| T006 | #257 | mais de um pai dito, contando só o vigente | sim |
| T007 | #258 | vínculo ausente tracejado, com a data | sim |
| T008 | #259 | pai sem conceito dito, sem inventar | sim |
| T009 | #260 | o custo medido: 10 antes, 12 depois, e constante | sim |
O que não foi feito¶
| Item | Motivo | Destino |
|---|---|---|
| a tela olhada em 360 px | precisa de navegador e de olho humano | pessoa mantenedora, e é o quinto sprint com este item |
| a coluna vista no dado real | a plataforma sobe com a chave mestra, que eu não peço nem recebo | pessoa mantenedora |
Nenhuma tarefa ficou de fora. As duas linhas acima são verificação, não implementação.
Evidências¶
A invariante no dado real:
O custo, medido contra main em 2026-08-12: a página fazia 10 consultas por render e passa a
fazer 12 — duas, uma por fronteira. Página de 2 issues e página de 50: igual.
Dívida gerada¶
| Dívida | O que é |
|---|---|
list_parents/2 e fetch_parent/2 coexistem |
duas funções para a mesma relação, vista de baixo. A nova devolve todos os pais; a antiga escolhe um sem ordem, e é a #261 |
| a coluna não diz a linhagem | mostra o pai, não o avô. É decisão do princípio X, e vira dívida se alguém pedir a cadeia |
Os três defeitos achados fora da feature¶
| # | O que é | Registro |
|---|---|---|
| 1 | fetch_parent/2 com limit: 1 sem order_by — pai arbitrário nas 36, e esconde que há outro |
#261 |
| 2 | filha promovida a defeito fora das três listas do detalhe do pai — 33 vínculos invisíveis | #262 |
| 3 | vínculo de decomposição nunca marcado como ausente — a coluna sabe exibir, o dado nunca chega | #263 |
Os três nasceram de medir para escrever a spec, não de rodar teste. Nenhum deles produz erro: todos produzem tela que parece completa.
O que a fase de análise achou, e vale contar de novo¶
Quinta feature seguida em que a análise achou defeito antes do código. Desta vez foram quatro, e duas eram requisitos sem tarefa nenhuma:
| # | Achado |
|---|---|
| A1 | FR-003 e SC-004 sem cobertura: attends e composes não nomeiam o conceito do pai, e sem ele os 12 vínculos com pai defeito ficariam sem nome — a redução que o pedido original fazia |
| A2 | FR-016 e SC-011 sem asserção de tenant |
| A3 | o teste citava Ecto.Adapters.SQL.query_count/1, que não existe |
| A4 | T009 mediria quatro e reprovaria sem defeito: live/2 faz dois renders |
E o plano, antes disso, achou três — todas por medida: vínculo confundido com issue, a relação decidida pela dupla em vez do conceito da filha, e a segunda fronteira do nome do repositório.
Lições deste sprint¶
Quatro, e as quatro são acionáveis. Rascunho consolidado em licoes-aprendidas.md como L40 a L43.
- Duas grandezas com nomes parecidos, e o complemento derivado de uma delas. Contei 1 666 vínculos, chamei de issues e derivei "2 863 sem pai" por subtração. As issues eram 1 630 e a diferença — 36 — era o próprio caso de borda da feature. → L40
- O teste que compara uma coisa com ela mesma passa sempre. A constância do custo comparava a mesma página duas vezes: igualdade garantida, medida nenhuma. → L41
- Mensagem atrasada de telemetria entra na contagem seguinte. Um 22 apareceu onde a página faz 20, e eu quase escrevi uma explicação para o 22. → L42
- Quando o axioma responde a pergunta errada, o erro não é no axioma.
rule07/2trata "tarefa sem pai" como violação, e chamá-lo com pai nulo encheria 2 091 células de aviso. A correção foi a precondição, não um filtro sobre a resposta dele. → L43