Componentes
Histórico da §48 — seed-componentes.md
Título completo no canon: Histórico da seção §48 — Painel — grade, lentes, frescor, edição direta e mapa (não é regra)
Base (3 rodadas encadeadas, 2026-08-12): R1 canon interno — DF6 (esta fronteira) e DM10 (tempo real é produto); a Régua de Espera do Bloco 3 em três regimes compostos (ação · carga inicial · refresh sobre conteúdo, com delay de 1s e permanência mínima); os dois regimes de live region do §1.13 (discreto × contínuo, uma por componente); o §46 inteiro (SH2 landmarks nomeados, SH5 ativo que sobrevive ao grayscale); o DP12 (destino externo × interno); o §40 (densidade compacta medida em 33px); e a §6b do
estudo-viver-de-ia.md— a auditoria que mostrou que a "camada de movimento" não era lacuna de token (existem 4 durações + 4 easings +prefers-reduced-motiondesde os primitivos) e sim de consumo. R2 mercado — comutador de visualização no ClickUp, Notion e Linear: as lentes mostram os mesmos itens com filtro e layout próprios sobre a mesma fonte; trocar de lente não altera os itens; e a adequação da lente depende do dado. R3 normas — WCAG 2.2.2 (nível A): informação que se atualiza sozinha, começa automaticamente e é apresentada em paralelo com outro conteúdo exige mecanismo para pausar, parar, esconder ou controlar a frequência; painel com intervalo escolhível (30s / 5min / manual) satisfaz pelo controle de frequência. Base adicional da rodada 3 (edição direta): WCAG 2.2, SC 2.5.7 Dragging Movements (AA) — toda funcionalidade que usa arrasto tem de ter caminho de ponteiro único alternativo; e a documentação do ClickUp sobre gantt × timeline (ver PN3c). Consolidados aprovados pelo Rafael em 2026-08-12 e 2026-08-13.
(Estado: estável. Gate visual do Rafael APROVADO em 2026-08-13 sobre o preview v0.6 — o quarto e último gate do bloco, depois das quatro camadas automatizadas. Com ele o bloco 6C FECHA e a Fase 6 vai a 3/3 blocos concluídos (6A §46 Shell · 6B §47 Página institucional · 6C §48 Painel). A promoção é dos contratos PN1–PN54; as decisões de marca S3, S4 e S6 seguem proposta — ver a ressalva no cabeçalho do §48 e a pendência PN-P1 em §48.9. Este bloco é o primeiro do projeto validado em cinco camadas, e a quinta (render-contraste.mjs) nasceu de um defeito que as outras quatro não podiam ver.)
Rodada 1 — 2026-08-12, preview v0.1 → v0.2. suite-painel.mjs 67 PASS · 0 FAIL — prova
de que as guardas são reais: contra um preview com 5 defeitos deliberados (lente desabilitada em
vez de oculta, frequência sem opção manual, pílula pintada pelo sinal, aria-valuemin ausente,
base proporcional não declarada) ela reprova em 6; render-painel.mjs 17 PASS · 0 FAIL;
contraste-painel.py 44 PASS · 0 FAIL após as correções que a própria medição exigiu. O
gate visual reprovou o v0.1 e produziu o PN3b — as lentes "linha do tempo" e "calendário"
desenhavam listas. Preview a v0.2, suíte a 75, render a 25; contra a versão em que as
duas lentes voltam a ser lista, a suíte reprova em 6.
Rodada 2 — 2026-08-13, preview v0.3. Oito lentes (S1) e camada visual (PN21).
suite-painel.mjs v2 107 PASS · 0 FAIL; prova: contra um preview com 4 defeitos
plantados — gantt sem dependências, véu a 35%, dois heros, transition com duração solta — ela
reprova exatamente nos 4. render-painel.mjs v2 37 PASS · 0 FAIL, medindo em Chrome real
3 conectores de dependência com extensão em pixels, 5 faixas de responsável com sub-linhas de
sobreposição em tops distintos, marca de capacidade no mesmo x, excedente com largura real,
contorno do mapa com bbox medido e 5 pontos dentro do viewBox. contraste-painel.py v2 70 PASS
· 0 FAIL, incluindo os pares do hero escuro (branco × cinza-900 = 13,86; itálico
turquesa-300 = 7,57; botão-solução = 5,11).
Rodada 3 — 2026-08-13, preview v0.5 → v0.6. Cinco camadas, todas verdes, todas re-executadas contra o artefato final:
| Camada | Ferramenta | Placar | O que ela mede |
|---|---|---|---|
suite-painel.mjs v4 |
Node + jsdom | 133 PASS · 0 FAIL | Estrutura, ARIA, tokens, classes fantasma, referências fantasma, higiene |
render-painel.mjs v3 |
Chrome headless | 37 PASS · 0 FAIL | Colapso da grade em 3 larguras, geometria das oito lentes, frescor vivo |
render-edicao.mjs v1 |
Chrome headless | 142 PASS · 0 FAIL | Os 33 contratos de edição direta, filtro, escala, mapa e criação — gesto por gesto, com pixels |
render-contraste.mjs v1 |
Chrome headless | 6 PASS · 0 FAIL | Contraste de composição renderizada nos dois temas (368 textos medidos), não de par de token |
contraste-painel.py v2 |
Python | 70 PASS · 0 FAIL | Pares declarados, calculados fora do navegador |
Rodada 4 — 2026-08-13 (noite), preview v0.6 → v0.7 → v0.8. A inversão do hero. Cinco
camadas re-executadas contra o v0.8 final: suite-painel.mjs 139 PASS · 0 FAIL (era 133;
entram NV-01, PN21-05c/05d/05e/05f/05g) · render-painel.mjs 37 · 0 ·
render-edicao.mjs 142 · 0 · render-contraste.mjs 6 · 0 · contraste-painel.py
78 · 0 (era 70; entram PC-H5b, PC-H6…PC-H11). Nenhum artefato canônico foi
tocado — cinco arquivos de preview e validação, e nenhum dos 40 HTML do repositório.
Errata E-6C-01 (2026-08-13, achado na conferência de ambiente): título e selo declaravam
versões diferentes. O <title> do preview dizia "preview v0.3" e o selo na tela dizia
"preview v0.5" — duas declarações de versão no mesmo arquivo, discordando. A guarda HIG-03
passava verde porque media apenas presença de versão no título. O defeito importa porque o
título da aba é o primeiro sinal de arquivo fresco — três relatos de "não funciona" nesta
sessão foram cache, e um título que mente cega justamente o instrumento usado para detectar cache.
Correção estrutural, não sintomática: a versão passa a ter fonte única (constante
VERSAO_PREVIEW no gen-painel.py), consumida por dois marcadores do molde
(@@VERSAO_TITULO@@ no título, @@VERSAO@@ no selo, este com data e hora) — divergir deixa de
ser possível por construção. Preview bumpado a v0.6 porque o artefato corrigido tem de ser
distinguível do defeituoso na tela. Guarda de regressão permanente, creditada ao Rafael:
HIG-06 — título e selo declaram a MESMA versão; contra um artefato com a versão do título
plantada de volta em v0.3, a suíte reprova em exatamente 1, e a mensagem nomeia os dois
valores.
Escrito em 2026-08-12. Estes quatro blocos — KPI, ranking, progresso e timeline — são os buracos vermelhos que o censo de lacunas do
estudo-viver-de-ia.md(§6) encontrou e que a auditoria de impacto do marco da Fase 5 (§6b daquele arquivo) classificou como aditivos: nenhum exige supersede em algoestável. O achado estrutural do censo foi que os buracos não eram gráficos — eram componentes de dado que não são gráficos, uma classe intermediária sem dono entre o Bloco 6 (dados) e o DG (gráficos core). É esta seção.
A ressalva se pagou em menos de 24 horas, e o registro disso é útil. A promoção foi escrita em 2026-08-13 excluindo três decisões de marca; na mesma noite o Rafael retirou o azul ("eu tinha aceitado para podermos parar com os testes") e a âncora escura virou turquesa vivo. Duas das três decisões mudaram de valor ou saíram — e nada do
estávelprecisou ser tocado. Se o azul tivesse entrado no canônico no dia anterior, isto seria errata emmarca-seed.md, nos três gêmeos de token, no sistema de e-mail (estável) e nos 40 HTML do repositório.
O QUE ESTE BLOCO ENTREGA, EM TRÊS RODADAS. O 6C foi produzido em três rodadas, e o registro da ordem importa porque cada uma nasceu de um gate do Rafael sobre a anterior. Rodada 1 (2026-08-12): a grade, o comutador de visualização com pré-requisitos de dado, a gramática do frescor, a variante equipe × cliente, o consumo do movimento (PN1–PN12) e os quatro blocos de dado que não são gráfico (PN13–PN20). Rodada 2 (2026-08-13, manhã): o supersede do PN3 para oito lentes e a camada visual PN21. Rodada 3 (2026-08-13, tarde e noite): a edição direta (PN22–PN41), os contratos que o gate produziu (PN46–PN50) e a lente mapa em dois modos (PN51–PN54). Preview e gate visual são únicos, no fim.
DEFEITO REAL DA RODADA, e quem o pegou foi a quinta camada: TOKEN FANTASMA. Na primeira execução após a inversão, o
render-contraste.mjsreprovou 15 textos com razão 1,0–1,26, incluindo branco sobre branco. Causa: o molde passou a consumirturquesa-400/600/700e a listaPRIMITIVOSdogen-painel.pyainda era a da era do azul — e variável CSS indefinida é valor inválido, então o fundo simplesmente não pintou. É a classe NV-01 do §47 (nascida quando a command palette abriu transparente), que tinha detector na suíte de navegação e faltava nesta. Corrigido na causa e detector criado aqui:NV-01— todovar(--seed-*)consumido tem definição no bloco de tokens. Pega na suíte jsdom, antes de qualquer render. Lição de método: guarda genérica criada num bloco não se propaga sozinha para os outros — quando uma classe de defeito ganha detector, o detector precisa ser levado para toda suíte que possa sofrer dela.
Registro de defeitos e lições — rodada 2 (2026-08-13). Todos viraram guarda ou nota de método. (1) RDP em anel fechado come o fecho. A simplificação Ramer–Douglas–Peucker do contorno externo do mapa, aplicada ao anel inteiro, ancorava o primeiro e o último vértice no mesmo ponto e degenerava o fecho. Conserto no
gen-mapa-lente.pyv2.2: dividir o anel em duas metades, simplificar cada uma e recosturar. Classe: algoritmo de polilinha aplicado a polígono sem tratar a topologia. (2) Token fantasma evitado antes do build. O hero usou--seed-tq-300, que não existe — o primitivo é--seed-turquesa-300. Pego por conferência de nome contra o CSS canônico antes da geração (classe NV-01 do §47: nome de token digitado de memória). (3) Instrumento calibrado no dado quebra com o dado. OR4-02do render v1 exigia a menor barra do ranking entre 30% e 50% — faixa que descrevia os dados ilustrativos antigos, não a propriedade. Com dados novos (58/486 = 11,9%) reprovou sem haver defeito. Recalibrado para a propriedade: largura renderizada ≈ razão do próprio dado. Mesma família da lição do 6A (instrumento errado invalida a medição), variante temporal. (4) Dado de exercício precisa conter o caso que a guarda mede. OR7-03(sub-linhas de sobreposição) reprovava porque nenhuma pessoa tinha duas OS sobrepostas — o mecanismo existia e a suíte estrutural passava, mas a geometria não tinha o que mostrar. A OS-2301 foi movida para colidir com a OS-2296 do mesmo responsável. Regra: todo comportamento especificado precisa de pelo menos um exemplar no dado ilustrativo. (5)--single-processdo pacote@sparticuz/chromiumtrava element-screenshot. Os args padrão do pacote (feitos para Lambda) deadlockam o Chrome emelement.screenshot()sequencial. Args enxutos (--no-sandbox) resolvem. Nota de ambiente para qualquer captura futura.
A correção do PN3b expôs um segundo defeito, de raiz diferente. Ao desenhar o calendário de verdade, os eventos caíram um dia antes e a grade saiu com sete larguras diferentes. Causa:
new Date("2026-08-12")interpreta a string como UTC e desloca no fuso do navegador. A primeira tentativa de conserto foi somar um dia — remendo sobre o sintoma, que teria quebrado em qualquer fuso diferente. O conserto real é decompor a data em números e fazer a aritmética em UTC puro; e as colunas exigemminmax(0, 1fr), senão o conteúdo do dia empurra a coluna. Classe de defeito: remendo sobre sintoma em vez de causa — sobrevive ao teste na máquina de quem escreveu e falha na de quem usa.