Roadmap
s11. F10 — Material: vidro e metal
seed-ds-roadmap.md v2.64 · §s11seção 12 de 16s11-f10-material-vidro-e-metal-fechada-em-2026-09.md · MD5 b446ca83Título completo no canon: F10 — Material: vidro e metal ✅ FECHADA em 2026-09-13 — F10.1 a F10.6 (aberta em 2026-09-12 pelo veredito dele V-1 = B, MANIFESTO §204; fechada no §213). O marcador desta linha ficou "⚪ ABERTA" até 2026-09-14 com as seis fases ✅ — corrigido no §217.1; é a mesma classe que a v2.42 e a linha da F9 registram.
Por que existe. Pedido dele em 2026-09-12, verbatim: "Estou achando as telas criadas com o DS muito basicas, botoes, barras, menus etc. ta faltando alguma coisa. Faça uma pesquisa profunda sobre aplicação de liquid Glass metalizado em DS de grandes empresas, ou algo parecido. e gere 2 exemplos, um com o DS atual e outro com a aplicação das melhorias para eu comparar." A pesquisa e o par de telas estão em
09-pesquisa/material-vidro-metal-2026-09-12/(pesquisa.md · material.css · compositor.py); o diagnóstico medido: um material só para navegação e conteúdo, fundo sem luz, luz só no hero, estados chapados, quase nenhum movimento. Ele decidiu B — adotar a proposta inteira (mesma marca; muda material, profundidade e movimento), com o alcance marcado em V-3: fundo com luz · barra superior em vidro · rail em metal · cartões em vidro · botões primários em metal · números KPI com brilho · barras e pílulas com luz · micro-movimento. A sidebar NÃO foi marcada e fica como é hoje (peça opaca) — aplicado como marcado, exposto a veto (MA-P4).
O que a pesquisa manda cuidar (fontes datadas no pesquisa.md): vidro é da camada de navegação, nunca do conteúdo denso (Apple, Fluent); opacidade ≥ 0,7 sobre fundo que não se controla (convenção de mercado); todo estado de sistema respeitado (sem
backdrop-filter, reduzir transparência, mais contraste, reduzir movimento → sólido/parado); a Apple recuou três vezes em um ano por legibilidade; Microsoft desliga acrílico em economia de bateria. E o que a folha não mediu: contraste efetivo sobre vidro (orender-contraste.mjsaborta em fundo composto) e custo de GPU no ERP real.
| brick | entrega | governa | custo declarado | estado |
|---|---|---|---|---|
| F10.1 | Tokens de material: --seed-mat-* no seed-tokens.json (DTCG) + gêmeo CSS + seed-tokens.md (v1.24): opacidade do vidro por tema, desfoque, saturação, especular, borda de vidro, sombras de vidro em camadas, luz do fundo, curvas do metal; e os fallbacks como regra escrita |
V-2 dele (80 % · 72 % · 18 px); piso ≥ 0,7 | 0,5 sessão | ✅ 2026-09-12 — 18 tokens no grupo semantic.mat (+2 derivados só do gêmeo: --seed-mat-glass, --seed-mat-glass-filter); seed-tokens.md v1.24 §3d; fallbacks executáveis no gêmeo (sem backdrop-filter, reduced-transparency, contrast: more, reduced-motion); adição pura — paridade-tokens.py 110 PASS · 0 FAIL, gêmeo 330 → 350 variáveis; o fundo com luz é derivado da rampa turquesa (os hex do estudo não existem na paleta e não entraram); o 20 % de metal do gate não virou valor (MA-P5). MANIFESTO §205 |
| F10.2 | Canon: seção "Material" no seed-componentes.md (a numerar depois da última viva) — onde vai vidro (barra superior, cartões, pílulas), onde vai metal (rail, ação primária, avatar), o que fica opaco (sidebar, tabela, lista densa, conteúdo), o fundo com luz, movimento com função e desligável, os fallbacks; regra de contraste do metal: gradiente só do token para o lado escuro |
pesquisa §1; CP20 (a tinta passa nos dois extremos) | 0,5 sessão | ✅ 2026-09-12 — seed-componentes.md v1.48 §93 "MATERIAL — vidro e metal", decisões MA1–MA12 (onde vai vidro · onde vai metal · o que fica opaco, sidebar inclusive · fundo com luz só na casca, mantendo surface-subtle declarado · micro-movimento desligável · fallbacks no token · régua RC obrigatória · emissão pelo módulo único · tinta de marca no vidro = -strong · nenhuma textura de período fixo · calibração por peça · alcance declarado), receitas por peça, medições da primeira aplicação e calibrações registradas; estado emitido · em gate (F10.4). Na mesma edição: errata E-CF-06 no §46 e a pendência SH-P9. MANIFESTO §206 |
| F10.3 | Régua: contraste rasterizado sobre vidro — renderiza a tela, apaga o texto (cor transparente), amostra os pixels atrás de cada caixa de texto e mede o pior pixel contra a tinta declarada; entra no rito (fechar.sh) para toda tela com data-material |
"quem cria um fundo novo cria a obrigação de medir o contraste sobre ele" (HV1) | 1 sessão | ✅ 2026-09-12 — 06-validacao/contraste/contraste-raster.mjs (contrato RC: duas capturas, com e sem texto; máscara de glifo por diferença, cobertura ≥ 0,5; pior pixel contra a tinta) + guardas/guarda-material.py no fechar.sh (9ª guarda) + cobaia provas/contraste-raster/ com placar escrito antes (reprova 1,22 e 3,38 exatos). Provada no canon: tela-painel 298/299 textos passam, pior pixel 4,60 = o mesmo par do contraste-composicao.mjs; tela-shell acusou o que nenhuma régua via — o rótulo do item ativo do rail vaza 1 px da pílula sobre o gradiente (2,08 → MA-P6). A MA-P1 foi medida (ver a tabela de pendências). Bloqueio da promoção a canon levantado; a F10.4 roda a régua em toda tela que ganhar data-material |
| F10.4 | Aplicação, lote 1: shell §46 + painel §48 pelos GERADORES (gen-shell.py, gen-painel.py), a camada de material emitida do token (nunca CSS copiado); régua F10.3 verde; gate visual nos dois temas |
V-3 | 0,5 sessão | ✅ 2026-09-13 — gate dele (MANIFESTO §207, verbatim): "V-M1 shell: aprovo · V-M2 painel: aprovo · V-M3 metal do rail: 1 · V-M4 sidebar: vidro · veto: nenhum"; a §93 vira estável (v1.49), a sidebar entra no vidro (gen-shell v0.9, régua RC 71/71 nos dois temas), o rail fica no token. Do gate nasce a SH-P10 (a barra do item ativo do rail). Entregue em 2026-09-12: nasce 06-validacao/ferramentas/material_bloco.py (módulo único: tokens --seed-mat-* medidos no gêmeo, fallbacks extraídos verbatim, receita por peça); gen-shell.py v0.9 e gen-painel.py v0.16 emitem a camada e declaram data-material="vidro-metal" — as duas telas entram na régua RC do rito: 0 texto abaixo do piso nos dois temas (shell 71/71 · painel 298/298 claro e 299/299 escuro). O caminho até o zero mudou quatro coisas: MA-P6 consertado no gerador; a tinta de marca no vidro remapeada para text-brand-strong (9 textos em 4,42–4,49 → passam); tokens v1.25 (a luz do canvas escuro cai de 40/26 para 26/18 % — o micro-rótulo do KPI media 4,41); e a calibração por escopo, que não fazia nada (o var() resolve onde é declarado), passou a reemitir os tokens no escopo. Suítes próprias verdes (suite-shell 72·0, render-shell 34·0, suite-painel 146·0, render-painel 37·0, render-edicao 142·0, render-contraste 6·0, colisão 4·0, valor-gêmeo 2·0, forced-colors 4·0, TP1 2·0). Gate visual dele: folha com as duas telas nos dois temas, a calibração do rail (1 · 0,7 · 0,4 medidos: 4,73 · 5,38 · 5,86) e a sidebar (MA-P4) — endereço no MANIFESTO §206 e na memória da sessão. Vira ✅ com o veredito. MANIFESTO §206 |
| F10.5 | Aplicação, lote 2: as outras telas com gerador — contadas em 2026-09-13, são oito (chat, detalhe, gantt, lista, quadro, referência, tabela e o site; esta linha dizia "7"); lote 3: as seis telas SEM gerador (atividade, autenticação, busca, configurações, documento, onboarding — a linha dizia "7") só depois do gerador delas (VT-P1/P3, MA-P3) |
regra §14.4 (edita-se o gerador) | 1 sessão + o brick VT | ✅ 2026-09-13 — gate dele no mesmo dia (MANIFESTO §212, verbatim): "V-M5 chat: aprovo · V-M5 detalhe: aprovo · V-M5 gantt: aprovo · V-M5 lista: aprovo · V-M5 quadro: aprovo · V-M5 referencia: aprovo · V-M5 tabela: aprovo · V-M6 luz do topo do rail: 8 · V-M7 site: a · veto: nenhum" — as sete telas aprovadas como geradas, a luz do rail fica em 8 % e o site fica sem a camada até a MA-P2 (a linha desta fase o incluía no lote; a decisão dele o tira até a medição de GPU). Entregue em 2026-09-13: as sete telas de aplicação emitem a camada pelo material_bloco.py (gen-tela-chat v0.2, detalhe v0.3, gantt v0.2, lista v0.4, quadro v0.2, referência v0.3, tabela v0.3; regeneração byte-idêntica), com data-material no <html> — nove telas na régua RC do rito, 18/18 medições sem texto abaixo do piso. A régua achou o ponto cego da F10.4: a luz do topo do metal do rail (30 %) derrubava o primeiro rótulo branco a 3,25–4,27 em seis telas (o shell passara porque o item ativo ocupa a primeira posição); tokens v1.26 (8 % no topo; pior 4,69; MA2 aplicada), com a alternativa sem luz renderizada na folha. Três instrumentos aprenderam a camada com o sinal certo (RAIL-02, SH1-c, rota 1 do contraste-composicao) e o material_bloco.completar() deriva a lista de tokens. O site (§47) foi renderizado como variante e vai ao gate como pergunta (V-M7); o gerador não o emite até o veredito. Folha do gate F10.5: sete telas nos dois temas (V-M5), a luz do topo do rail 8 % × 0 % (V-M6), o site (V-M7) e o veto. Vira ✅ com o veredito. MANIFESTO §211 |
| F10.6 | Vitrine e registry: página /material/ gerada (regra + render vivo + controles), o registry ganha a camada (esta linha dizia @seed/theme; a forma certa, medida na implementação, é um item PRÓPRIO @seed/material — o tema do shadcn só carrega apelidos de cor), skill seed-ds herda por geração; a bancada de desempenho para a lista longa (MA-P2) nasce na própria página |
MK23 (qualquer IA acha, lê, cita, usa) | 0,5 sessão | ✅ 2026-09-13 — registry: 4.º item @seed/material (seed-material.css, classes .seed-mat-* emitidas pelo material_bloco.py, sob data-material; guarda RG-8) · vitrine: /material/ (regra byte a byte, amostra viva montada só com o registry, controles ao vivo, telas com a camada medidas no disco, bancada da MA-P2 com window.seedMatMedir) e a página de cada tela diz se carrega a camada · skill: passo do material no modo código (versão 2026.09.13+5202b3cc). Guardas: RG 7·0, VT 14·0, SK 10·0; regeneração byte-idêntica dos três. A bancada mediu nesta máquina de desenvolvimento (8 núcleos, 16 GB, Chrome 153): 8,3–8,9 ms por quadro com e sem a camada até 240 cartões — custo indistinguível aqui; a máquina de campo é o que fecha a MA-P2. MANIFESTO §213 |
Pendências da fase (nascem aqui, com código):
| código | origem | o que é | dono | estado |
|---|---|---|---|---|
| MA-P1 | folha do gate, §4 "não medi" | contraste efetivo sobre vidro não foi medido por instrumento; a proposta NÃO vira canon sem a régua F10.3. MEDIDA em 2026-09-12 pela régua da F10.3 nos dois quadros do estudo (1180 × 800, 42 textos por tema, pior pixel atrás de cada glifo): sobre vidro e luz nenhum texto cai abaixo do piso em nenhum tema. O custo do material está nos rótulos brancos do rail sob o reflexo do metal — Projetos 7,47 → 4,79 · Obras 6,59 → 4,79 · Compras 7,26 → 5,17 · Finanças 7,06 → 5,42 (piso 4,5: margem de 0,29) — e no KPI com tinta em gradiente (13,72 → 7,53, piso 3,0). 27 de 42 textos perdem contraste no claro e 26 no escuro, todos acima do piso. O único FAIL (Comercial 2,08 → 2,67) é pré-existente do canon (MA-P6). Registro com as tabelas: 09-pesquisa/material-vidro-metal-2026-09-12/regua-raster-2026-09-12.md |
sessão | ✅ medida · o reflexo do rail (metal-sheen a 30 % no topo) é a primeira calibração da F10.4 |
| MA-P2 | pesquisa (Microsoft: acrílico é GPU-intensivo) | custo de backdrop-filter no ERP real (dezenas de cartões numa lista longa); vidro fora do chrome espera a medição em máquina de CAMPO. Instrumento pronto desde 2026-09-13 (F10.6): a bancada em https://ds.seed.eng.br/material/#sec-custo (N cartões de vidro, rolagem de 3 s, quadros com e sem a camada; window.seedMatMedir(n, ms) para agentes). Primeira medição, máquina de desenvolvimento (8 núcleos, 16 GB, Chrome 153, 1440 px): 60/120/240 cartões → 8,3/8,9/8,4 ms por quadro com a camada, 8,4/8,3/8,3 sem; p95 8,5–8,6; um quadro de 133 ms na montagem de 120. Segunda medição, 2026-09-14, máquina dele (8 núcleos, 16 GB, DPR 1,25, janela 1536 px, Chrome 153; 120 cartões): 8,5 ms por quadro com a camada, 8,4 sem; p95 8,6 nos dois; pior quadro 41,7 × 16,8 (um quadro, [inferência] o da montagem); 0 de 353 e 0 de 359 acima de 50 ms — indistinguível também aqui, mas é máquina de porte de desenvolvimento. Ele vai medir hoje em outras máquinas e mandar todos os resultados (MANIFESTO §216.1); fecha quando a mais fraca delas estiver medida |
sessão · medições dele | ⚪ aberta — instrumento pronto, medições das outras máquinas dele pendentes |
| MA-P3 | F10.5 | 6 das 16 telas de referência não têm gerador (atividade, autenticação, busca, configurações, documento, onboarding — VT-P1/P3; esta linha dizia 7 até 2026-09-13): a camada de material não pode entrar nelas sem antes nascer o gerador. Estado em 2026-09-13: 9 telas com material (shell, painel e as sete da F10.5), o site SEM a camada por veredito dele (V-M7 = a, até a MA-P2), 6 esperando gerador 🟡 EM GATE desde 2026-09-14 (MANIFESTO §217): as seis telas ganharam gerador (porte byte-idêntico salvo o selo do bloco de tokens; gen-tela-atividade/autenticacao/busca/configuracoes/documento/onboarding.py + moldes), e CINCO receberam a camada pelo material_bloco.py (documento fica sem, por C25 + MA3). Régua RC 0 FAIL em 14 de 14 telas nos dois temas; a linha de base no HEAD achou 10 textos de dívida pré-existente (tinta de marca sobre brand-subtle, 4,28 — corrigidos com text-brand-strong, §5-g; o acervo inteiro virou CT-P9). Folha do gate: V-P3.1–V-P3.5 + veto |
sessão · veredito dele | 🟡 em gate |
| MA-P4 | V-3 dele | a sidebar não foi marcada em "onde aplicar"; fica opaca como hoje. Se foi esquecimento, uma palavra dele a inclui | ele | ✅ fechada em 2026-09-13 — "V-M4 sidebar: vidro"; aplicada no gen-shell.py (receita vidro, a mesma da barra superior) e medida: shell 71/71 nos dois temas, pior pixel 4,52/4,60 (pares pré-existentes) |
| MA-P5 | V-2 dele | o "escovado" do rail (traço de 1 px repetido) virava moiré ao escalar — ele baixou o metal a 20 % por isso. Consertado em 2026-09-12 (o traço saiu; textura por grão + reflexo); a calibração final do metal por peça é da F10.4, com o render na mesa | sessão | ✅ consertada no estudo · calibração na F10.4 |
| MA-P6 | régua F10.3 aplicada ao canon (tela-shell.html, 2026-09-12) |
o rótulo do item ativo do rail ("Comercial", 11 px/800, caixa alta) vaza 1 px da pílula arredondada sobre o gradiente do rail: um pixel de glifo com cobertura total mede 2,08 (turquesa-900 sobre #006A60) — 0,4 % dos pixels do rótulo, nos dois temas. Invisível para o contraste-composicao.mjs (a pílula pinta cor opaca e a rota "cor declarada" não olha pixel). Evidência: 09-pesquisa/material-vidro-metal-2026-09-12/evidencia-raster/rail-comercial-1px-6x.png. Conserto em gen-shell.py (pílula mais larga, ou rótulo menor) no lote 1 da F10.4, que já toca o shell — nunca no HTML |
sessão | ✅ fechada em 2026-09-12 (F10.4): medido antes de mexer — "COMERCIAL" a 800 media 71,5 px num item de 72 px (o papel micro passou a 11 px na v1.14 e a conta do SH3 era de 9 px); conserto no gen-shell.py v0.9 (o rótulo consome o tracking do papel, −0,2 px → 67,7 px; max-width: 72px como rede), errata E-CF-06 no §46; régua RC: shell sem texto abaixo do piso nos dois temas; render-shell 34·0 |
| SH-P9 | F10.4 (medição do MA-P6) | o shell e o painel pedem font-weight: 800 (rótulo ativo do rail, KPI, botão da solução, sujeito do hero) e os moldes só carregam Montserrat 400/500/600/700 — não há ExtraBold em 03-assets/fontes/montserrat/: o navegador sintetiza o 800 a partir do 700 (medido: 700 e 800 têm o mesmo avanço, 69,52 px). A guarda TP1 não vê (mede se as faces declaradas carregam, não se os pesos pedidos têm face). Saídas com custo no §46 do seed-componentes.md v1.48: (a) trazer o ExtraBold e re-medir o rail; (b) baixar os 800 para 700 |
sessão · veredito dele | ⚪ aberta |
| CT-P9 | MA-P3 (MANIFESTO §217.5 e §217.7, 2026-09-14) | tinta de marca sobre a superfície suave reprova no pixel — no acervo inteiro. A linha de base das cinco telas portadas achou 10 textos com text-link (#098475) sobre surface-brand-subtle (4,28) ou surface-subtle (4,23), todos anteriores ao material e invisíveis às réguas por cor declarada (o par É o declarado). O canon já tem a resposta desde a v1.19 (tokens §5-g, text-brand-strong: 5,82 sobre surface-subtle); corrigido só nas cinco telas. Falta: (1) censo do par no acervo com a régua RC (chips do §22, avatar com inicial, item ativo de navegação, bancadas e peças — hoje NÃO MEDIDO, a RC só roda em tela com data-material); (2) a regra no canon (§22, §46, §48 prescrevem -strong sobre as superfícies suaves, ou o gêmeo escurece text-link) — decisão com custo medido |
sessão · censo sem gate; regra em gate | ⚪ aberta |
| SH-P10 | gate F10.4 (achado dele, 2026-09-13) | a barra vertical branca ao lado do item ativo do rail — ele escreveu "essa barra nao deveria estar ali, acho que ela vem de outra estrutura". Medido: é a marca de ativo do SH5 (§46), ::before de 3 px em left: -4px, presente nos 8 moldes com rail e sondada em pixel pela suite-composicao; com o material ela lê como resíduo porque a pílula clara já sobrevive ao cinza sozinha. Decisão registrada → supersede é dele: (a) manter · (b) tirar do rail (a da sidebar fica), custo meia sessão (8 moldes, SH5-04, PX-01/02, re-gate). Folha SH-P10 com os quatro recortes (cor e cinza) |
ele · sessão | ✅ fechada em 2026-09-13 — veredito "b-tirar-do-rail" (MANIFESTO §209): a barra saiu dos 8 moldes com rail, telas regeradas byte-idênticas, SH5 reescrito por região (componentes v1.50), suite-shell SH5-04 e suite-composicao PX-01/02 provam a ausência |