diff --git a/docs/plans/escala-dry-pos-b197.md b/docs/plans/escala-dry-pos-b197.md new file mode 100644 index 00000000..cf6270f1 --- /dev/null +++ b/docs/plans/escala-dry-pos-b197.md @@ -0,0 +1,61 @@ +# Escala e DRY pós-B197 (picker de colunas de assessores) + +Status: pendente (capture-review-debts pós-B197, gate humano confirmado) +Atualizado em: 2026-08-11 +Item do roadmap: fill-in **B197+** pós-[#627](https://github.com/fsolla/teqo/issues/627) +Impeccable: A — sem superfície UI nova (DRY/estrutura) +Appetite: ~0,5 dia eng +Responsável: — + +## Contexto + +O B197 entregou o seletor de colunas na lista de assessores — a primeira lista do +mecanismo B17 que **não** usa `CampaignTable`. A tabela (`AdvisorsTable.tsx`) é +client-side com `` escritos à mão, então o menu do picker +(`advisorPickerColumns` em `assessores/page.tsx`) é um array estático que +**espelha** os cabeçalhos da tabela: `Nome/E-mail/Celular/Municípios/Ações`. +O espelho é coberto por comentário, mas nada impede um item futuro de adicionar +uma coluna na tabela e esquecer o menu — a coluna nasceria fora do picker (nem +ocultável, nem listada), silenciosamente. + +**Já resolvido no simplify/critique (não reabrir):** nada — o achado foi +registrado direto do gate pós-entrega (nenhum outro follow-up do B197 ficou). + +**Explicitamente fora:** conversão do `AdvisorsTable` para `CampaignTable` +(rejeitada no impl do B197 — redesenho de superfície fora do pedido; o shell +não modela a linha-draft de criação nem a edição inline por célula). + +## Objetivos + +- O menu do picker de assessores nasce da **mesma fonte** que os `` da + tabela — adicionar coluna num lugar atualiza o outro de graça. +- Sem mudança de comportamento: mesmos ids (`name` mandatory, `email`, `phone`, + `municipalities`, `actions`), mesmos labels, exceção do draft intacta. + +## Decisões travadas + +- **Opção A — fonte única serializável no módulo da tabela (recomendada).** + `AdvisorsTable.tsx` (client) passa a declarar as colunas como dados + (id/label/mandatory) e exporta uma versão serializável (`toCampaignColumnPickerColumns` + já existe no lib B17); o `` renderiza de `label`, e `assessores/page.tsx` + importa a mesma fonte para o picker. Cliente-para-servidor vale para + constantes serializáveis (mesmo padrão de `supporterPickerColumns` em + `SupporterList.tsx`). +- **Opção B — status quo (comentário).** Rejeitada: o comentário já existe e o + achado é exatamente que ele é insuficiente para um time de agentes paralelos. +- **Gatilho de execução:** a qualquer momento como fill-in (~0,5 dia); se C112 + (telefones) tocar o `AdvisorsTable` antes, executar junto (mesma superfície). + +## Fases verificáveis + +1. Extrair a fonte única no `AdvisorsTable` + export serializável; `` por + `label`. +2. `assessores/page.tsx` consome a fonte; remover `advisorPickerColumns`. +3. Gates: `tsc`, `lint`, unit do lib, e2e `campaignColumnPicker` (assessores), + `format:check`. + +## Rabbit holes / Não escopo + +- Não portar para `CampaignTable` (decisão travada do B197). +- Não mexer em labels/ordem/ids das colunas — contrato do cookie `campaign_columns`. +- Não criar coluna nova nenhuma — só o DRY do menu.