Pular para conteúdo

0024 — O painel de Novidades corta no meio o item de nota que ocupa mais de uma linha

1. Sintoma

No painel de Novidades (e na página /novidades), item de nota de versão escrito em mais de uma linha aparece cortado no ponto da primeira quebra. O primeiro item da 0.14.0, que está em produção, termina em "Em Parâmetros, os blocos Taxas e Taxas —".

2. Reprodução

  1. Abrir o painel de Novidades em qualquer ambiente com a 0.14.0.
  2. Ler o primeiro item: a frase para em "Taxas —".

O defeito é do parser, não de layout: aparece igual no desktop e em 375px. Como o painel vem no bundle do PWA, quem já tem o app aberto só vê a correção depois do deploy e da atualização do service worker.

Em teste: interpretar("9.9.9", "- primeira parte\n continuação") devolve ["primeira parte"].

3. Esperado × Atual

  • Esperado: o item inteiro, com as linhas de continuação juntadas numa frase.
  • Atual: só a primeira linha do item; o resto some da tela.

4. Causa raiz

  • Onde: apps/web/src/versoes/index.ts:113-138, função interpretar (o laço sobre as linhas).
  • Mecanismo: o contrato da RN4 da spec 0043 diz que linha começando com - vira item e qualquer outra linha é ignorada. As notas são escritas quebrando linha, como o resto do repositório, com a continuação indentada em dois espaços. A continuação não começa com -, cai no "ignorada", e o item fica só com a primeira linha.
  • Alcance: 9 das 24 notas têm item com continuação: 0.4.2, 0.9.1, 0.10.0, 0.11.0, 0.11.1, 0.11.2, 0.12.0, 0.13.0 e 0.14.0, todas publicadas. O site de docs não sofre do mesmo defeito: o hook do Andamento (docs/hooks/andamento.py, ler_notas, spec 0058) já junta a linha indentada ao item anterior.

5. Revisão do diagnóstico

Diagnóstico de uma linha, confirmado pelo teste vermelho: com o parser antigo, o primeiro item da 0.14.0 termina em "Taxas —".

6. Correção

apps/api

Nada.

apps/web

  • interpretar passa a ser exportada (para o teste) e junta ao último item a linha não vazia e indentada que vem logo depois dele. Linha em branco encerra o item; linha solta sem indentação continua ignorada. A RN4 da spec 0043 ganhou uma nota dizendo isso.
  • A docstring do contrato (RN4) passa a dizer isso.
  • O texto do contrato no rascunho de nota do /ship (.claude/skills/ship/scripts/rascunho-nota.sh) diz o mesmo, para quem escreve a nota.

apps/e2e

Nada. O comportamento é de unidade (parser de texto), coberto por index.test.ts.

7. Risco / impacto colateral

Nota que tivesse linha indentada depois de item de propósito, esperando que ela sumisse, passaria a mostrá-la. Nenhuma das 24 notas tem isso: toda linha indentada que segue item é continuação dele.

8. Critérios de aceite

  • CA1 — Item com continuação indentada sai inteiro, numa frase.
  • CA2 — Linha solta sem indentação continua ignorada.
  • CA3 — Linha em branco encerra o item.
  • CA4 — O primeiro item da nota real 0.14.0 sai inteiro.

9. Plano

Teste vermelho → correção no parser → red-green → suíte do web.

10. Decisões em aberto

Nenhuma.

11. Revisão da correção

Red-green com make test-web ARQ=src/versoes/index.test.ts:

  • Com a correção: 4 de 4 verdes.
  • Com a correção desligada (mantida só a exportação): 2 vermelhos, CA1 e CA4.
  • Com a correção restaurada: 4 de 4 verdes.

Suíte do web inteira (make test-web): 64 arquivos e 628 testes, todos verdes. make preflight verde.

Revisão de contexto limpo, rubricas diagnostico.md e correcao.md, 2026-10-15: aprovada, sem Critical nem Important. O revisor conferiu o alcance (as 9 notas) reproduzindo o parser sobre as 24 e, por leitura, que os testes 1 e 4 falham sem a correção (o red-green acima é a prova executada). Quatro Minor, todos corrigidos nesta rodada: a RN4 da spec 0043 ficou divergente (ganhou nota); o comentário interno do rascunho-nota.sh ainda dizia "nada mais"; a causa não citava linha; faltava dizer viewport e efeito do PWA.

12. Registro

  • 2026-10-15 — diagnóstico, teste vermelho, correção e red-green na branch fix/0024-novidades-cortam-item-longo.
  • 2026-10-15 — revisão aprovada; mesclado na main e publicado pelo /ship.