docs: plan fill-in to drop zone list from campaign home map
After B8 F2 polygons, the textual zone breakdown under the dashboard map is redundant; register the removal in the roadmap and align B8+/B8 plan notes.
This commit is contained in:
parent
75cdea38b4
commit
a5b6341ccb
4 changed files with 128 additions and 8 deletions
|
|
@ -43,7 +43,7 @@ A comparação que fecha o caso: **Salvador é um `Polygon` de 35 pontos na malh
|
|||
- **F1 troca o tripwire de bytes por um de densidade.** `MAX_TOPO_BYTES = 600 * 1024` foi calibrado para pegar uma malha **estadual** sem simplificação; uma malha de 19 features a 3,8 KB/feature passa folgada. O guard que teria pego isso é pontos-por-feature (ou bytes-por-feature), que é a grandeza que a política de F1 controla. **Rejeitado:** apertar o teto de bytes (um número global não distingue "19 features densas" de "435 features magras"); confiar na revisão humana (foi ela que deixou passar).
|
||||
- **F2 pina o contrato com duas asserções no laço que já existe, não com uma abstração.** A regra da chave está escrita em três formas — `mapKeyForMunicipality` (registro do catálogo), `featureMapKey`/`MAP_KEY_PROPERTIES` (saco de propriedades GeoJSON) e o `baseKeys = zones.map(z => z.properties.ibgeCode)` do `BahiaMap` (a identidade entre as duas). As três precisam concordar ou o coroplético pinta cinza **sem erro em lugar nenhum**. Cada ponta já está pinada contra o `municipalityCatalog`, mas nada roda `featureMapKey` sobre um feature **real**: o unit novo alimenta literais escritos à mão, então o artefato pode deixar de casar com o literal e os dois testes continuam verdes. Só o e2e fecha o laço, e ele pede dev server + banco. **Rejeitado:** unificar as três num helper (o server lê Payload/catálogo e o cliente lê GeoJSON — um helper que aceite os dois é um wrapper raso, reprovado pelo depth check); confiar no e2e (a suíte mais lenta e mais flaky do repo como única rede de um modo de falha silencioso).
|
||||
- **F3 degrada, não esconde.** `loadLayerFeatures` exige as duas malhas num `Promise.all`, e `loadMunicipalityZoneGeometryModule` memoiza a **rejeição** (comportamento deliberado, documentado no B14). Somados, um ChunkLoadError nos 19 polígonos de Salvador mata o mapa inteiro pelo resto da sessão — antes do B8 F2 a malha municipal sozinha bastava. Isto é um ponto único de falha **novo**, introduzido pela entrega. **Rejeitado:** remover a memoização da rejeição (é ela que dá ao B14 um estado de falha acionável em vez de um spinner eterno); deixar como está porque chunk raramente falha (a regressão é de disponibilidade e o custo do `.catch` é três linhas).
|
||||
- **A ressalva de aproximação pertence à malha, não à lista.** O parágrafo "é aproximado, não é o limite oficial do TSE" está dentro do gate `bundle.zoneBreakdown.length > 0 && !comparisonActive`, mas o mapa divergente da comparação pinta Salvador zona por zona a partir da **mesma** malha aproximada. A ressalva foi pendurada na condição de render da lista em vez de na presença da malha na tela — e o rabbit hole que o próprio plano do B8 nomeia é "tratar polígono derivado como limite oficial". **Rejeitado:** duplicar a frase nos dois braços (duas cópias da mesma afirmação jurídica divergem na primeira revisão de copy).
|
||||
- **A ressalva de aproximação pertence à malha, não à lista.** O parágrafo "é aproximado, não é o limite oficial do TSE" estava dentro do gate `bundle.zoneBreakdown.length > 0 && !comparisonActive`, mas o mapa divergente da comparação pinta Salvador zona por zona a partir da **mesma** malha aproximada. A ressalva foi pendurada na condição de render da lista em vez de na presença da malha na tela — e o rabbit hole que o próprio plano do B8 nomeia é "tratar polígono derivado como limite oficial". **Rejeitado:** duplicar a frase nos dois braços (duas cópias da mesma afirmação jurídica divergem na primeira revisão de copy). **Atualização 2026-07-26:** o fill-in [remover-lista-zonas-mapa-inicio.md](remover-lista-zonas-mapa-inicio.md) remove a lista `zoneBreakdown` inteira (pedido de produto pós-B8 F2). F3 **não** presupõe o `<ul>`: quem landar primeiro coloca a ressalva atrelada ao escopo com ZE / presença da malha; o outro só ajusta.
|
||||
- **i18n e naming** seguem o AGENTS.md: identificadores em inglês, strings visíveis em pt-BR.
|
||||
|
||||
## Questões em aberto
|
||||
|
|
@ -65,7 +65,7 @@ Componentes:
|
|||
|
||||
- **F1 — escala de chão + guard de densidade.** Novo `scripts/lib/topology.mjs` (ou nome irmão) expondo o alvo de resolução e um `simplifyTopology`/`quantizeToGroundScale` que derivam os dígitos do bbox da topologia recebida; `scripts/build-municipality-zone-geometries.mjs:52-55,139-145` e `scripts/build-bahia-geometries.mjs:53-57,96-101` passam a consumi-lo. Rebuild de `bahia-municipality-zones.topo.json` (o dissolve e o `quantize` final rodam em espaço de topologia com arcos compartilhados, então o snap move os dois lados de uma fronteira igualmente e **não** abre sliver entre zonas vizinhas). `tests/int/bahiaGeometries.int.spec.ts:29` ganha a asserção de pontos-por-feature ao lado de `MAX_TOPO_BYTES`; a janela de 280–360 km² e o centróide-dentro-da-cidade têm folga para o novo corte. Como F1 já reescreve o artefato, remove no mesmo passe a propriedade `zoneNumber` (script `:382`), que ninguém consome e é a terceira cópia de um valor derivável do slug.
|
||||
- **F2 — contrato da map key.** Duas asserções dentro do laço que já existe em `tests/int/bahiaGeometries.int.spec.ts:149`: `featureMapKey(zoneFeature.properties) === entry.slug` e `featureMapKey(municipalFeature.properties) === entry.ibgeCode`. Resolve junto a contradição entre o comentário de `bahiaMapStyle.ts:15` ("as três nunca coexistem num feature") e o unit de precedência em `tests/unit/bahiaMapStyle.unit.spec.ts:51-55`, que pina uma forma `{ municipalitySlug, codarea }` que nenhuma malha produz: se o invariante vale, cai o teste de precedência e o comentário de ordenação; se não vale, o comentário do invariante é que está errado.
|
||||
- **F3 — degradar + ressalva.** `BahiaMap.tsx:81` passa a `.catch()` a metade das zonas e seguir com a malha municipal (Salvador volta a ser um polígono agregado, o que é pior que zonas e muito melhor que mapa nenhum); `MunicipalityMapPanel.tsx:594-601` tira o parágrafo da ressalva de dentro do braço `!comparisonActive`, mantendo-o atrelado à presença da malha de zonas.
|
||||
- **F3 — degradar + ressalva.** `BahiaMap.tsx:81` passa a `.catch()` a metade das zonas e seguir com a malha municipal (Salvador volta a ser um polígono agregado, o que é pior que zonas e muito melhor que mapa nenhum). Ressalva: se o fill-in [remover-lista-zonas-mapa-inicio.md](remover-lista-zonas-mapa-inicio.md) já tiver landado, a frase já mora fora da lista — F3 só confirma que ela permanece no modo comparação e não reintroduz o `<ul>`; se F3 landar primeiro, relocate a frase para fora de `!comparisonActive` (ainda atrelada à malha/escopo com ZE) e o fill-in depois apaga só o `<ul>` + o campo do bundle.
|
||||
- **F4 — deletar e colapsar.** `MunicipalityMapNavigation` (`municipalityMapNavigation.ts:18,64-70`) virou `{kind:'none'} | {kind:'navigate';slug}`, três estados para um `string | undefined`: colapsa em `municipalitiesByMapKey[key]?.slug` nos dois call sites (`MunicipalityMapPanel.tsx:680-683,696-702`), deletando o tipo, o helper, o `useMemo` que só existe porque o helper aloca objeto por chamada, o widening a `| null` em `MapFeatureReadout.tsx:24,108` e três unit tests. `MunicipalityMapSlugEntry.name` não é lido no índice 1:1 (o rótulo do readout vem de `feature.name`), então `MunicipalitiesByMapKey` vira `Record<string, string>` — são 435 strings mortas no payload RSC de toda visita ao Início. Deleta os dois acessores órfãos (ver Questões em aberto) e, com eles, `city`/`zoneNumber` de `MunicipalityZoneNeighborhoodEntry` (verificado: nem o card nem o script os leem — o script só usa `municipalitySlug` e `neighborhoods`), o que também apaga o filtro `entry.city === 'Salvador'` provavelmente-sempre-verdadeiro no int. Exporta `polygonRingsOf` de `municipalityProximity.ts:109` (3º call site: o spec novo e `tests/helpers/featureBounds.ts:16` reescrevem o mesmo branch Polygon/MultiPolygon) e alinha `featureBounds.ts` ao `BahiaGeometryFeature` — hoje é o único ainda tipado em `BahiaMunicipalityFeature`. Troca `BahiaGeometryFeature` (que carrega `GeoJsonProperties`, ou seja `any`) por um `type PolygonalFeature = { geometry: Polygon | MultiPolygon }` que declara o requisito real dos três helpers, e introduz `BahiaFeature<P>` para as 4 grafias de `Feature<Polygon | MultiPolygon, P>` em `bahiaGeometriesTypes.ts`. No script: a chave resolvida por alias é calculada duas vezes com o mesmo fallback (`:329-330` e `:355-360`) e o `die` do guard é construído sobre a **segunda** — uma divergência faria o guard passar sobre um artefato que o primeiro passe montou errado; calcular uma vez num `Map` acima do passe 1. Fecha com `polygonCount` (`:156`, dois branches inalcançáveis depois do `die`), `[await shp(buffer)].flat()` (`:248`, lê como erro), o `url` que `ensureCachedBinary` devolve e ninguém desestrutura, e a referência morta ao branch `none|navigate|zones` em `docs/plans/municipio-mais-proximo.md:141`.
|
||||
- **Migration**: sem migration, sem collection, sem server action. F1 reescreve um artefato commitado (esperado e revisável no diff); F2–F4 não tocam dado.
|
||||
|
||||
|
|
@ -114,7 +114,7 @@ Componentes:
|
|||
- `scripts/build-municipality-zone-geometries.mjs` + `scripts/build-bahia-geometries.mjs` — F1, F4
|
||||
- `tests/int/bahiaGeometries.int.spec.ts` (`:29` budget, `:149` laço de contrato) — F1, F2
|
||||
- `src/lib/bahiaMapStyle.ts` (`:15`, `:95-109`) + `tests/unit/bahiaMapStyle.unit.spec.ts` — F2
|
||||
- `src/components/campaign/map/BahiaMap.tsx` (`:73-90` duas malhas) + `MunicipalityMapPanel.tsx` (`:594-601` ressalva) — F3
|
||||
- `src/components/campaign/map/BahiaMap.tsx` (`:73-90` duas malhas) + `MunicipalityMapPanel.tsx` (ressalva; lista `zoneBreakdown` → fill-in [remover-lista-zonas-mapa-inicio.md](remover-lista-zonas-mapa-inicio.md)) — F3
|
||||
- `src/utilities/municipalityMapNavigation.ts` + `src/lib/municipalityProximity.ts` + `src/lib/bahiaGeometriesTypes.ts` + `tests/helpers/featureBounds.ts` — F4
|
||||
- AGENTS.md — geometrias B2/B8 F2, gate por entrega, `overrideAccess: false` com `user`
|
||||
- `.cursor/rules/engineering-standards.mdc` — "dead code dies immediately" (F4), depth check (F1/F2)
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ Os relatórios dos três revisores chegaram **depois** do merge; o cleanup barat
|
|||
|
||||
## Adiado com gatilho
|
||||
|
||||
- **S6 — CSS compartilhado lista zona** (`MunicipalityMapPanel` zone breakdown ↔ `MunicipalityZoneNeighborhoodsCard`). **Gatilho disparou** na F2 (o painel foi alterado) e foi reavaliado: as duas listas continuam pequenas e com estrutura diferente, então extrair peça compartilhada agora seria abstração por coincidência visual. Segue adiado, agora com gatilho único: **R6** citar a duplicação em ≥2 superfícies de zona.
|
||||
- **S6 — CSS compartilhado lista zona** (`MunicipalityMapPanel` zone breakdown ↔ `MunicipalityZoneNeighborhoodsCard`). **Obsoleto 2026-07-26:** o fill-in [remover-lista-zonas-mapa-inicio.md](remover-lista-zonas-mapa-inicio.md) remove a lista do mapa; sem segundo call site, não há o que extrair. O card de bairros no detalhe permanece.
|
||||
- **F2-D1 — card "Onde estou" (B14 ✓) resolver a ZE exata de Salvador.** Os polígonos passaram a existir nesta entrega, e `featureContainsPoint` já é genérico o suficiente para recebê-los; o card continua levando à lista filtrada por decisão. **Gatilho:** pedido de campo ("estou em Salvador e quero abrir minha zona"). Custo real é uma segunda malha no chunk do card, não matemática nova. Aresta já registrada no grafo do roadmap.
|
||||
- **F2-D2 — rank competitivo por ZE.** Exige dimensão nova no artefato TSE (hoje `federalRankByIbgeCode`), o que mexe no budget de 700 KB. **Gatilho:** E11 pedir o eixo de competição dentro de Salvador, ou o dossiê de um Município-zona exibir posição própria. Hoje as 19 zonas herdam a posição da cidade, com int pinando o fato.
|
||||
- **S2 — fonte única TS ↔ fixture do catálogo de bairros** (gerar `municipalityZoneNeighborhoods.ts` a partir do JSON). **Cortado na F2 prep:** a curadoria que a F2 exigia foi para o **script** de geometrias, não para o catálogo, então o gerador não teria a quem servir; o `deepEqual` fixture↔código já pega drift. **Gatilho:** um terceiro consumidor precisar do catálogo em runtime não-TS.
|
||||
|
|
|
|||
119
docs/plans/remover-lista-zonas-mapa-inicio.md
Normal file
119
docs/plans/remover-lista-zonas-mapa-inicio.md
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
# Remover lista "Municípios por zona eleitoral" do Início
|
||||
|
||||
Status: rascunho
|
||||
Atualizado em: 2026-07-26
|
||||
Item do roadmap: [docs/roadmap.md](../roadmap.md) (Fill-ins)
|
||||
Impeccable: B — encaixe em `MunicipalityMapPanel` no Início (`/campanha`); sem rota nova
|
||||
Appetite: ~0,25–0,5 dia eng; remove bloco UI + payload `zoneBreakdown` do bundle; sem migration
|
||||
Responsável: —
|
||||
|
||||
## Design (Impeccable)
|
||||
|
||||
Âncoras: `PRODUCT.md` (clareza sob pressão; anti dashboard clutter) / `DESIGN.md` (register `product`; Field Desk) · tema `data-theme='campaign'` · shells `MunicipalityMapPanel` + `BahiaMap` + `MapFeatureReadout`.
|
||||
|
||||
Na implementação (`implement-roadmap-item`): craft compacto → critique → polish (só remoção de densidade morta + relocação de uma frase de ressalva; sem redesign do mapa).
|
||||
|
||||
Brief compacto:
|
||||
|
||||
- **Persona / contexto:** CG / Assessor / Candidato no Início; o mapa já pinta cada ZE de Salvador (B8 F2 ✓). A lista de 19 linhas abaixo repete o que o coroplético + clique no polígono já respondem.
|
||||
- **Job principal:** o Início volta a ser mapa + controles + readout — sem rolagem obrigatória por uma lista que o polígono tornou redundante.
|
||||
- **Estratégia de cor:** Restrained — nenhuma superfície nova.
|
||||
- **Edit where you see:** não — só leitura no mapa; sem mutação.
|
||||
- **Anti-goals:** redesign do mapa; segunda navegação textual para ZE; apagar a malha/artefato B8; esconder a ressalva jurídica de aproximação.
|
||||
|
||||
## Dados → decisão → apresentação
|
||||
|
||||
- **Vou apresentar dados?** Não (N/A nesta entrega) — **remove** uma superfície tabular redundante. A decisão “qual pedaço de Salvador?” continua no **mapa** (B8 F2 ✓: polígono por ZE + readout + clique → `/campanha/municipios/salvador-ze-N`).
|
||||
- **Decisões desbloqueadas:** N/A (não introduz métrica). A decisão já desbloqueada pelo mapa permanece.
|
||||
- **Forma escolhida:** mapa (já entregue) — **por quê** a lista era o degrau de pobreza _antes_ dos polígonos; com polígonos, a lista é degrau a mais sem nova decisão. **Rejeitado:** manter lista “por se”; chart/KPI de zonas no Início.
|
||||
- **Anti-goals de dado:** sem % estadual absoluto; sem segunda série tabular no dashboard.
|
||||
|
||||
## Contexto
|
||||
|
||||
Até o **B8 F2 ✓** (2026-07-26), Salvador era **um** polígono no mapa; a única visão por Município-zona era a lista textual `zoneBreakdown` em `MunicipalityMapPanel` — título **"Municípios por zona eleitoral"**, 19 links + votos do ano/cenário selecionado (`src/components/campaign/map/MunicipalityMapPanel.tsx` ~L593–625). O bundle carrega isso em `MunicipalityMapBundle.zoneBreakdown` (`municipalityMapContract.ts` / `municipalityMapData.ts`).
|
||||
|
||||
Com o artefato `bahia-municipality-zones.topo.json` e o re-keying por map key, cada ZE é pintável, hoverável e clicável. Pedido de produto (2026-07-26): **remover a seção** — não precisamos mais dela.
|
||||
|
||||
O fill-in de engenharia **B8+** ([escala-dry-pos-b8f2.md](escala-dry-pos-b8f2.md)) F3 ainda assume a lista viva (só move a ressalva “é aproximado…” para fora do gate `!comparisonActive`). Este item **supersede** essa premissa: a lista sai; a ressalva fica atrelada à **malha** (decisão já travada no B8+), não a um `<ul>` de zonas.
|
||||
|
||||
## Objetivos
|
||||
|
||||
- Em `/campanha` (staff, `MunicipalityMapPanel`): sumir o bloco "Municípios por zona eleitoral" (título, lista, números).
|
||||
- Remover `zoneBreakdown` do contrato do bundle e do loader (e os intermediários `zoneVotesBySlug` / `zoneVotes2026BySlug` se só servirem a ele) — dead code dies.
|
||||
- Manter **uma** ressalva de aproximação (TRE/IBGE, não limite oficial TSE) visível quando a malha de zonas está em jogo — inclusive no modo comparação (alinha B8+ F3).
|
||||
- Atualizar int `municipalityMapData.int.spec.ts` (pins de `zoneBreakdown`) e qualquer copy/comentário que ainda diga que a lista é a navegação N>1.
|
||||
- Guardrails: sem migration, sem collection, sem Consent, sem server action; malha B8 / `BahiaMap` / catálogo `kind === 'zona'` intactos; card de bairros no detalhe (F1) intacto.
|
||||
|
||||
## Decisões travadas
|
||||
|
||||
- **Fill-in com plano próprio (sem ID B novo).** Quick win de densidade no Início pós-B8 F2; ~¼–½ dia; paralelizável; cortável. (2026-07-26, classificação roadmap-item.) **Rejeitado:** B43 de trilha (infla grafo para delete de bloco); absorver _só_ como nota no B8+ sem plano de produto (pedido explícito de produto merece plano próprio + link no Fill-ins); deixar para R6 (atrasa).
|
||||
- **Remover UI + dropar `zoneBreakdown` do bundle — não só esconder.** Payload RSC do Início carrega 19 rows por visita; knip/engineering-standards: o que a mudança orfanou morre no mesmo PR. **Rejeitado:** `display: none` / flag; manter array “por se” sem consumidor.
|
||||
- **Ressalva de aproximação sobrevive, atrelada à malha.** Uma frase muted sob o mapa (ou junto à legenda), gated por presença de ZE no escopo (`salvador-ze-*` em `municipalitiesByMapKey` **ou** boolean derivado no painel) e **visível também em comparação**. Fonte: decisão B8+ F3 + rabbit hole B8 (“tratar polígono derivado como limite oficial”). **Rejeitado:** apagar a ressalva com a lista; duplicar copy em dois braços.
|
||||
- **Lista de bairros no detalhe da ZE (B8 F1) permanece.** Geografia operacional no município ≠ lista redundante no dashboard. **Rejeitado:** cascatear remoção para `MunicipalityZoneNeighborhoodsCard`.
|
||||
- **i18n e naming** (AGENTS.md): identificadores `zoneBreakdown` / `MunicipalityZoneBreakdownRow` saem; strings pt-BR da seção saem; disclaimer permanece em pt-BR.
|
||||
|
||||
## Questões em aberto
|
||||
|
||||
- **Gate da ressalva: “há ZE no escopo do ator” vs “malha de zonas carregou no cliente”?** **Opções:** A) keys `salvador-ze-*` em `municipalitiesByMapKey` (server/escopo) | B) flag do `BahiaMap` após load da malha | C) sempre no painel. **Recomendação:** **A** — assessor sem Salvador na carteira não vê frase sobre ZE; se o chunk falhar, B8+ F3 degrada o mapa e a ressalva some junto com as zonas no escopo visual (aceitável). _(assumido)_
|
||||
- **Quem landa primeiro: este fill-in ou B8+ F3?** **Opções:** A) este fill-in primeiro (B8+ F3 vira “não há lista; só degradar chunk + ressalva já no lugar”) | B) B8+ primeiro (este fill-in remove o `<ul>` e mantém a frase onde F3 a colocou). **Recomendação:** **A** se o pedido de produto for o próximo a implementar; senão B — o plano do B8+ foi atualizado para não depender da lista. _(ordem = quem puxar o PR)_
|
||||
|
||||
## Abordagem proposta
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
panel["MunicipalityMapPanel"] -->|remove| list["ul zoneBreakdown"]
|
||||
panel -->|keep relocated| note["Ressalva aproximação"]
|
||||
contract["municipalityMapContract"] -->|drop| zb["zoneBreakdown"]
|
||||
loader["municipalityMapData"] -->|drop| maps["zoneVotes*BySlug"]
|
||||
tests["municipalityMapData.int"] -->|rewrite| scope["pins de escopo / map key"]
|
||||
```
|
||||
|
||||
Componentes:
|
||||
|
||||
- **`MunicipalityMapPanel.tsx`**: apagar o bloco ~L593–625; comentário “zone breakdown below”; atualizar o comentário de `MunicipalityMapSelection` que menciona “zone list”. Inserir a ressalva (uma `<p className="text-sm text-muted-foreground">`) fora do gate de comparação, condicionada ao escopo com ZE.
|
||||
- **`municipalityMapContract.ts`**: remover `MunicipalityZoneBreakdownRow` e `zoneBreakdown` de `MunicipalityMapBundle`.
|
||||
- **`municipalityMapData.ts`**: parar de montar `zoneBreakdown` / `zoneVotesBySlug` / `zoneVotes2026BySlug` (verificar que nenhum outro campo os lê — hoje só alimentam a lista).
|
||||
- **`tests/int/municipalityMapData.int.spec.ts`**: trocar expects de `zoneBreakdown` por asserts de escopo já existentes (ex.: keys `salvador-ze-*` em `municipalitiesByMapKey` / length de unidades no escopo).
|
||||
- **`docs/TESTING.md`**: dropar a coluna “zone breakdown shape” da linha do loader se ainda apontar para o campo.
|
||||
- **B8+ / B8 planos:** ver Dependências — notas de coordenação, não reescrever histórico F2.
|
||||
- **Migration**: Sem migration, sem collection, sem server action.
|
||||
|
||||
Depth check: delete/estreitamento nos módulos que já são donos do bundle e do painel — sem wrapper novo.
|
||||
|
||||
## Dependências
|
||||
|
||||
- **Dura:** ~~B8 F2~~ ✓ (polígonos — sem eles a lista ainda seria a única visão por ZE).
|
||||
- Soft: **B8+** F3 ([escala-dry-pos-b8f2.md](escala-dry-pos-b8f2.md)) — mesma ressalva / mesmo arquivo; quem entrar 2º só ajusta.
|
||||
- Reusa: `MunicipalityMapPanel`, `BahiaMap`, `municipalitiesByMapKey`, `formatElectionNumber` (só se algum residual precisar — provavelmente some do painel).
|
||||
|
||||
## Não escopo
|
||||
|
||||
- Alterar malha / script / artefato TopoJSON — **B8** / **B8+ F1**.
|
||||
- Degradar chunk das zonas / memoização de rejeição — **B8+ F3**.
|
||||
- Rank competitivo por ZE — débito com gatilho no [plano B8](poligonos-pracas-zona.md).
|
||||
- Desambiguar ZE no card "Onde estou" — mesmo plano B8, gatilho "pedido de campo".
|
||||
- Remover coluna "Tipo" na lista de municípios — fill-in [remover-coluna-tipo-municipios.md](remover-coluna-tipo-municipios.md).
|
||||
- Card "Bairros" no detalhe da ZE — B8 F1.
|
||||
|
||||
## Rabbit holes
|
||||
|
||||
- **"Já que a lista some, refaço o readout / legenda de Salvador."** Explode em redesign do B13. **Mitigação:** só delete + uma frase de ressalva.
|
||||
- **"Já que zoneBreakdown morre, unifico navegação e proximity."** F4 do B8+ já colapsa `MunicipalityMapNavigation`. **Mitigação:** não misturar PRs.
|
||||
- **Extrair CSS compartilhado lista-zona ↔ card de bairros (S6 do B8).** A lista do mapa some — o gatilho morre. **Mitigação:** fechar S6 como obsoleto na nota do plano B8 (abaixo), sem extrair nada.
|
||||
|
||||
## Adiado com gatilho
|
||||
|
||||
- Nenhum neste item. (S6 do B8 fica **obsoleto** com a remoção — ver plano B8.)
|
||||
|
||||
## Referências
|
||||
|
||||
- `docs/roadmap.md` (Fill-ins abertos)
|
||||
- `src/components/campaign/map/MunicipalityMapPanel.tsx` — bloco "Municípios por zona eleitoral"
|
||||
- `src/utilities/municipalityMapContract.ts` — `zoneBreakdown`
|
||||
- `src/utilities/municipalityMapData.ts` — montagem do array
|
||||
- `tests/int/municipalityMapData.int.spec.ts` — pins
|
||||
- [poligonos-pracas-zona.md](poligonos-pracas-zona.md) — B8 F2 ✓ (pai)
|
||||
- [escala-dry-pos-b8f2.md](escala-dry-pos-b8f2.md) — B8+ (coordenação F3)
|
||||
- [remover-coluna-tipo-municipios.md](remover-coluna-tipo-municipios.md) — precedente fill-in Impeccable B de densidade
|
||||
- AGENTS.md — mapa keyed por map key; naming
|
||||
- `PRODUCT.md` / `DESIGN.md` — Field Desk, clareza sob pressão
|
||||
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue