teqo-backup/docs/plans/matar-guarda-tooltip-provider.md
2026-08-02 13:40:58 -03:00

98 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Matar guarda JSX de nesting `TooltipProvider` (B102)
Status: registrado
Atualizado em: 2026-08-02
Issue: #242 (OPS15)
Priority: P2
Model: composer-2.5
Impeccable: A — N/A (sem superfície UI; remover convention spec)
Appetite: ~0,25 dia eng; apagar um `describe` + atualizar GUARDRAILS; sem migration
Responsável: —
## Dados → decisão → apresentação
Dados: N/A — remoção de guardrail frágil; sem métrica de produto.
## Contexto
B102 (#129 / miss #133/#135): o drawer de ações rápidas monta como **irmão** do scrollport dentro de `CampaignAppScrollChrome`. `TooltipProvider` só em volta de `{children}` deixava focus→suggest (hits `priority:alta` → `CampaignHoverTooltip`) sem provider → crash da página.
**Fix real:** elevar o provider para envolver `CampaignAppScrollChrome` no layout `(app)`.
**Guarda adicionada** em `tests/unit/codebaseConventions.unit.spec.ts` (`campaign TooltipProvider wraps quick-actions chrome (B102)`): regex que exige
```tsx
<TooltipProvider>
…<CampaignAppScrollChrome>…</CampaignAppScrollChrome>…
</TooltipProvider>
```
e proíbe o nesting invertido **no source** de `layout.tsx`.
Problema (review 2026-08-02, item 5): o pin congela **forma JSX incidental**. Agentes satisfazem a regex com wrappers estranhos; um refactor legítimo (provider dentro de um shell component que já envolve o chrome) quebra o build sem regressão; a proteção real do crash já está (ou deve estar) nos **pins comportamentais** de focus→suggest / type→search com hits prioritários (`campaignQuickActionsDrawer` unit + e2e da miss).
Pedido: **matar esta guarda** — sem substituto source-shape.
## Objetivos
- Remover o `describe('campaign TooltipProvider wraps quick-actions chrome (B102)', …)` de `codebaseConventions.unit.spec.ts` por completo.
- Confirmar que os pins comportamentais da regressão B102/miss (#133/#135) **permanecem** (unit drawer focus→suggest com hit prioritário; e2e se existir). Se algum tiver sido apagado, **restaurar** nesse PR — a remoção da guarda source só é segura com a rede comportamental viva.
- Atualizar `docs/GUARDRAILS.md` se a guarda estiver listada; senão nota no PR + referência à Issue.
- Guardrails: sem migration; **não** mover o `TooltipProvider` neste item (layout fica como está).
- **Tracer bullet:** delete do describe → `pnpm gate:fast` verde → checklist dos pins comportamentais no body do PR.
## Decisões travadas
- **Delete da guarda source-shape; não “afrouxar” a regex.** Opções: A) delete | B) mover o pin para outro arquivo/componente | C) ESLint react-tree. **Recomendação: A.** O valor está no pin de crash (comportamento), não na árvore textual do layout. **Rejeitado:** B/C (mesmo cheiro / appetite).
- **Não adicionar judgment-only substituto obrigatório** além de uma linha em GUARDRAILS/CHANGELOG se útil — o layout comentado + pins de miss bastam.
- **Kind: `chore` (OPS15).**
- **i18n:** N/A.
## Questões em aberto
- **Onde documentar “provider deve envolver o chrome do drawer”?** **Opções:** A) só comentário no layout | B) GUARDRAILS judgment-only | C) nada. **Recomendação:** **A** (já deve existir contexto B102 no layout); B só se a linha já existir e precise de “removido”. _(assumido)_
## Abordagem proposta
```mermaid
flowchart LR
check["Ver pins unit/e2e B102"] --> del["Apagar describe nesting"]
del --> docs["GUARDRAILS se listado"]
docs --> gate["gate:fast"]
```
Componentes:
- **`tests/unit/codebaseConventions.unit.spec.ts`:** remover o bloco B102 (~L671–688).
- **Verificação:** `rg TooltipProvider|priority:alta|CampaignHoverTooltip tests/unit tests/e2e` — garantir cobertura comportamental; restaurar se faltar.
- **`docs/GUARDRAILS.md`:** remover/ajustar linha se houver.
- **Migration:** nenhuma.
## Dependências
- Nenhuma dura. Independente de OPS13/OPS14.
- Soft: Issues #129 / #133 / #135 (histórico da miss) — só referência.
## Não escopo
- Mudar posição do `TooltipProvider` no layout.
- Reabrir investigação do crash.
- OPS13/OPS14.
## Rabbit holes
- **"Substituir por teste de árvore React renderizada do layout."** Layout é RSC/async — painel de dor; os pins do drawer já exercitam o caminho. **Mitigação:** não.
- **Aproveitar para “limpar” outros describes do conventions.** Fora de escopo.
## Adiado com gatilho
- **Pin e2e dedicado se unit do drawer for flaky.** Revisitar só com evidência de regressão pós-remoção.
## Referências
- GitHub Issue #242 (OPS15)
- Review de guardrails (chat 2026-08-02) — item 5
- `tests/unit/codebaseConventions.unit.spec.ts` — describe B102
- `src/app/(campaign)/campanha/(app)/layout.tsx` — TooltipProvider atual
- Issues #129 (B102), #133, #135 (miss)
- `tests/unit/campaignQuickActionsDrawer.unit.spec.tsx` — pins comportamentais esperados