Ir ao conteúdo
SEED engenharia

Componentes

Histórico da §48 — seed-componentes.md

históricoseed-componentes.md v2.00 · §h48seção 98 de 18448-historico.md · MD5 d8cb18ce

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-motion desde 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 algo está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ável precisou ser tocado. Se o azul tivesse entrado no canônico no dia anterior, isto seria errata em marca-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.mjs reprovou 15 textos com razão 1,0–1,26, incluindo branco sobre branco. Causa: o molde passou a consumir turquesa-400/600/700 e a lista PRIMITIVOS do gen-painel.py ainda 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 — todo var(--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.py v2.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. O R4-02 do 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. O R7-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-process do pacote @sparticuz/chromium trava element-screenshot. Os args padrão do pacote (feitos para Lambda) deadlockam o Chrome em element.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 exigem minmax(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.

Esc