Dataviz
4c. Sub-bloco DI — impresso/PDF + integração da stack
seed-dataviz.md v0.22 · §04cseção 8 de 1204c-sub-bloco-di-impresso-pdf-integracao-da-stack.md · MD5 bc9b87f9Título completo no canon: Sub-bloco DI — impresso/PDF + integração da stack (DI1–DI19)
Estado: o sub-bloco DI está COMPLETO —
estávelem 2026-08-11. Foi produzido em duas partes, por decisão de método: DI-a (DI1–DI2, DI4–DI19) fechou pelo "aprovo" do Rafael sobre o consolidado, e DI-b (DI3 — o veredito do gatilho da textura no papel) ficou deliberadamente aberto até haver prova impressa física, porque não se responde por análise. A prova foi executada e o DI-b fechou no mesmo dia (§4c.3): o impresso não entra no gatilho, e a medição produziu um supersede da própria regra do piso de claridade, que passa a ser calibrada por forma e não por meio.Base: 4 rodadas encadeadas (R1 canon interno: §5 e §4.4 deste arquivo, §3c do
seed-tokens.md, §44/GI1–GI5 doseed-componentes.md· R2 mercado/stack: fornecedor gráfico real da SEED, doc oficial do shadcn Chart sobre Recharts v3,print-color-adjustno MDN e no comportamento real dos navegadores · R3 normas: Lei 6.496/77 e Resolução CONFEA 1.137/2023, Resoluções e Orientação Técnica 4 do CONARQ, políticas PAdES da ICP-Brasil sob a IN 34/2025, ISO 12647-2:2013 · R4, disparada porque impresso é domínio novo para este projeto: comportamento de meio-tom e linha mínima em impressora laser).Siglas usadas aqui, explicadas na primeira ocorrência. CTP = computer-to-plate, o processo pelo qual a gráfica grava a chapa de impressão direto do arquivo digital. TVI = tone value increase, o nome normativo do "ganho de ponto" (a mancha de tinta que engorda o ponto impresso em relação ao arquivo). PAdES = PDF Advanced Electronic Signatures, o padrão de assinatura digital embutida em PDF adotado pela ICP-Brasil. ART = Anotação de Responsabilidade Técnica, o documento que vincula legalmente o engenheiro ao serviço.
4c.0 O achado que reabriu o DG13 — remedição de 2026-08-11#
A pendência que este sub-bloco herdou do §5 dizia que o modo claro tinha 7 pontos de espalhamento de claridade, acima do piso de 6, e que a dúvida era apenas se o papel justificaria baixar esse piso. A remedição mostrou que a premissa estava velha: os 7 pontos foram medidos na categórica v1.0, com três séries. A categórica ESTENDIDA v1.5 tem seis, e as seis nunca foram medidas juntas neste instrumento.
Medição com a mesma função do contraste-dg.py (claridade = luminância relativa em
codificação gama, em pontos percentuais), modo claro, que é o modo que vai ao papel:
| Série | Token | Hex light | Claridade |
|---|---|---|---|
| cat-1 | turquesa-500 | #00A192 |
56% |
| cat-2 | dourado-300 | #F9B11C |
75% |
| cat-3 | magenta (exclusivo de dado) | #CD518B |
49% |
| cat-4 | azul-500 | #0099C1 |
55% |
| cat-5 | violeta (exclusivo de dado) | #966AC8 |
50% |
| cat-6 | azul-800 | #004C61 |
27% |
Piores pares, em qualquer adjacência: cat-1 × cat-4 = 1 ponto · cat-3 × cat-5 =
1 ponto · cat-4 × cat-5 = 5 pontos. Com três séries (cat-1/2/3) o pior par é
7, e a medição antiga estava correta na data em que foi feita.
Conclusão que o número obriga: o modo claro não é seguro em escala de cinza. Ele é seguro até três séries. A partir da quarta, o claro colapsa como o escuro sempre colapsou — e isso é um fato de tela, anterior a qualquer discussão sobre papel.
Por que ninguém tinha visto. O contraste-dg.py percorre apenas cat1, cat2 e
cat3 — exatamente o trio que passa. O detector estava recortado no lugar onde o defeito
não mora. Isso reclassifica a pendência P8 do MANIFESTO.md: atualizar aquele script
não é higiene de manutenção, é restaurar a única guarda automatizada capaz de flagrar esta
classe de erro. A correção está no DI18.
4c.1 DI1 — Dois destinos de impressão; só um é escopo do DI#
| Destino | O que sai por ele | Escopo |
|---|---|---|
| (a) Laser colorida de escritório | Laudo, relatório de O&M, proposta impressa, qualquer PDF gerado pelo ERP e mandado para a impressora | DI |
| (b) Offset da gráfica | Colateral físico da marca | Fase 7 |
Fato apurado sobre o fornecedor real (Zap Gráfica, o parceiro da SEED): o fluxo dela é CTP e exige PDF/X-1a, com todos os elementos convertidos em CMYK — arquivos entregues em RGB podem ter a cor alterada ou simplesmente não impressa. A gráfica também declara variação de ±10% na cor, para mais ou para menos, dentro do mesmo lote de produção.
Consequência declarada: essa tolerância é incompatível com qualquer informação codificada por diferença fina de cor — mas é irrelevante para o laudo, que nunca passa pelo CTP da gráfica. É por isso que o DI trata os dois destinos como problemas diferentes em vez de buscar um pipeline único.
Alternativa descartada: adotar CMYK como saída única de todo impresso da empresa. Obrigaria conversão de cor em todo laudo gerado pelo ERP, com perda de gama e sem nenhum ganho, já que o destino real daqueles PDFs é uma impressora de escritório.
4c.2 DI2 — SUPERSEDE do gatilho do DG13: o gatilho é função do número de séries#
Regra antiga (DG13, §4.4): textura por série apenas na interseção escuro ∩ grayscale.
Regra vigente: textura por série quando grayscale ∩ (escuro OU ≥4 séries).
Racional medido: §4c.0. O DG13 nasceu correto sobre a evidência que tinha — três séries,
7 pontos de folga no claro. A categórica v1.5 dobrou o número de posições sem que o gatilho
fosse remedido, e nos pares cat-1 × cat-4 e cat-3 × cat-5 a folga caiu para 1 ponto.
O que muda não é o meio (tela × papel): é a densidade da paleta em uso.
O que permanece intocado: o vocabulário de textura do DG13 (série 1 sólida · 2 pontilhada
· 3 quadriculada · 4 linhas horizontais), a exclusividade da diagonal a 45° para o
chart-no-data, a obrigação de a legenda repetir a textura sob o mesmo gatilho, e a
isenção do gráfico de série única.
Alternativas descartadas:
- Manter o DG13 como está e apenas somar o modo de impressão. Fecharia a pergunta do papel deixando aberto um colapso de tela já medido — a definição de verde enganoso.
- Texturizar sempre, em todo modo. O gate visual de 2026-08-09 já reprovou esse desenho ("ligar textura onde a cor já resolve" é ruído), e a regra de 3 séries continua verdadeira.
- Baixar o piso de 6 para 1 ponto. Trocaria um limiar calibrado por gate humano por um número escolhido para caber na paleta — inverteria a ordem entre instrumento e evidência.
4c.3 DI3 — O impresso NÃO entra no gatilho da textura, porque não precisa (DI-b FECHADO)#
Estado: FECHADO em 2026-08-11, por prova impressa física executada pelo Rafael. Esta seção substitui integralmente a redação anterior, que declarava o veredito ABERTO e previa que o papel exigiria piso próprio de claridade. A previsão estava errada, e o modo pelo qual ela errou é o achado mais valioso do sub-bloco — ver a correção da regra do piso no fim desta seção.
Veredito. O modo de impressão não é acrescentado ao gatilho do DI2. O gatilho permanece
grayscale ∩ (escuro OU ≥4 séries), exatamente como o DI2 o escreveu, e cobre o impresso sem
uma palavra nova.
Como a medição chegou a isso, por eliminação:
| Condição de impressão | O que a prova mostrou | Consequência |
|---|---|---|
| Em cor | As 6 séries se distinguem bem, sem textura | A cor basta. Textura aqui seria ruído — o mesmo argumento que derrubou o DG11 |
| Em escala de cinza (driver mono) | Sem textura, 4 das 6 séries se distinguem; 2 pares colapsam | Impressão mono é grayscale por definição, e o gatilho do DI2 já dispara ali com 6 séries |
| Em escala de cinza, com textura | As 6 texturas se distinguem bem | O vocabulário estendido a 6 posições (§4.4) sobrevive ao papel |
| Régua de traço | As quatro espessuras (2 · 1,5 · 1 · 0,5px) saíram distintas, nenhuma sumiu nem engordou | Não há piso de traço próprio para papel. A hierarquia vale igual no impresso — ver DI6 |
Alternativa descartada: acrescentar "impresso" como terceira condição do gatilho. Seria redundante e pior: criaria duas regras dizendo a mesma coisa, e regra duplicada é precisamente o que deriva quando uma das duas é editada e a outra não — a classe de defeito das erratas E12/E14/E16 desta mesma fase.
O item 1 da folha era um CONTROLE, não um caso de uso. Ele mostra 6 séries sem textura em cinza, situação que a regra vigente já proíbe. Ele falhou como previsto. A prova não pediu regra nova: validou a regra existente no meio em que ela nunca havia sido testada.
Os dois pares que colapsaram são exatamente os dois pares previstos#
| Par identificado a olho, na folha impressa em cinza | Séries | Claridade medida em TELA | Espalhamento |
|---|---|---|---|
| "Fora de ponta" ≈ "Bombeamento" | cat-1 × cat-4 |
56% × 55% | 1 ponto |
| "Reservado" ≈ "Iluminação" | cat-3 × cat-5 |
49% × 50% | 1 ponto |
Nenhum falso positivo, nenhum falso negativo. Os outros 13 pares tinham folga na medição e foram todos distinguidos. O instrumento — espalhamento de claridade em pontos percentuais, calibrado em tela — previu o comportamento do papel com precisão de par a par.
SUPERSEDE da regra do piso: ele é calibrado por FORMA, não por MEIO#
A regra vigente até aqui, nascida da emenda da v0.5 e do DM11, dizia: "o piso de 6 pontos decide apenas no contexto em que foi calibrado — barras altas adjacentes, modo claro, em tela; fora dali quem decide é o gate". Ela foi escrita depois que as bandas do medidor mediram 9, 8 e 17 pontos, todas acima do piso, e ainda assim eram indistinguíveis. A leitura natural foi que meio novo exige calibração nova, e foi por isso que o DI3 nasceu prevendo piso próprio para o papel.
A prova impressa mostra que a variável nunca foi o meio — foi a FORMA. Compare os dois episódios:
| Episódio | Forma | Meio | O instrumento… |
|---|---|---|---|
| DM11 | bandas finas dentro de um medidor, com barra de valor por cima | tela | errou (9/8/17 pontos e ainda assim indistintas) |
| DI3 | barras altas adjacentes — a forma em que o piso foi calibrado | papel | acertou par a par |
Forma diferente, mesmo meio → erra. Mesma forma, meio diferente → acerta.
Regra vigente, mais precisa e mais útil que a anterior: o piso de claridade é calibrado por forma de apresentação e vale para aquela forma em qualquer meio. Mudar de tela para papel não invalida o número; mudar de barra alta adjacente para banda fina de medidor invalida. Ao encontrar uma forma nova — banda, fatia fina, célula de heatmap, faixa de sparkline — o piso tem de ser recalibrado por gate mesmo que o meio seja o de sempre.
Por que isso importa mais que o veredito: a regra anterior mandava recalibrar a cada meio novo, o que é caro e, como se vê, desnecessário. A nova manda recalibrar a cada forma nova, que é onde o risco realmente mora — e explica os dois episódios em vez de um só.
Fronteira: a folha de prova mede sobrevivência, não adequação#
Crítica do Rafael no gate, registrada porque é correta e limita o instrumento: a régua do item 6 mostra as espessuras isoladas, com rótulos que só significam algo para quem já conhece a hierarquia. Uma régua abstrata responde "a impressora consegue depositar esta linha?" — e não responde "esta espessura é adequada aqui?". A segunda pergunta exige as espessuras aplicadas no gráfico (linha de série, linha de meta, eixo, grade). A folha v0.1 responde a primeira, que era o que o DI6 precisava; se a segunda pergunta for feita algum dia, a folha precisa ser refeita.
Achado colateral: o piso de 0,5px não tem consumidor hoje — a grade do preview do DG está toda em 1px. É um valor que existe na lei e não é exercido, e valor não exercido deriva. A verificar quando a Fase 6 montar painéis, onde grade fina em gráfico pequeno é o caso natural para ele.
4c.4 DI4 — Nenhuma informação de gráfico pode viver em background-color de CSS#
Fato apurado, não inferência: a propriedade print-color-adjust: exact é uma dica ao
navegador, e a preferência do usuário no diálogo de impressão ("Gráficos de plano de fundo",
"Background graphics") tem precedência — nenhuma folha de estilo a sobrepõe. Um laudo
impresso por alguém que nunca abriu "Mais configurações" sai com todo background ausente.
Regra dura que sai daí: toda superfície que carrega dado é elemento de conteúdo do
SVG — <rect>, <path>, <circle> com atributo fill —, nunca um <div> pintado por
background-color. Vale para barra, área, fatia, banda de medidor, célula de heatmap e o
chart-no-data. O print-color-adjust: exact continua declarado na folha de impressão,
como reforço, e nunca como garantia.
A inferência foi MEDIDA e virou fato — gate de impressão de 2026-08-11. A v0.1 do preview do DI trazia esta regra como inferência não medida. A v0.2 montou uma matriz de quatro células —
background-color×fillde SVG, cruzados comprint-color-adjust: exact×economy— e o Rafael a imprimiu no Chrome, destino "Salvar como PDF", A4, nas duas posições da opção "Gráficos de segundo plano".
Célula O que é Opção MARCADA Opção DESMARCADA A CSS background·exactsobreviveu sobreviveu B SVG fill·exactsobreviveu sobreviveu C CSS background·economysobreviveu SUMIU D SVG fill·economysobreviveu sobreviveu C sumiu e D sobreviveu sob condição idêntica — mesma cor, mesma área, mesma célula da matriz, única diferença sendo como a superfície é pintada. O DI4 está provado como escrito.
Segundo achado, não previsto: a célula A sobreviveu, isto é, o Chrome honrou
print-color-adjust: exactmesmo contra a preferência desmarcada. Existem portanto duas camadas de proteção, e elas não valem o mesmo: a dica de CSS, que funcionou aqui, e a natureza estrutural do SVG, que não depende de navegador. A regra dura do DS continua sendo a segunda, porque a primeira é documentadamente uma dica.Fronteira da medição, declarada: um navegador (Chrome), um destino ("Salvar como PDF"). Não medido em Firefox nem em driver de impressora física, e o Firefox tem histórico de divergir neste ponto. Vale como fato para o Chrome e forte indício para o resto.
Erro de método registrado, porque é instrutivo: a v0.1 do preview tinha só duas células e não isolava a variável — a folha de impressão declara
exactnum seletor universal, que protegia os dois braços do próprio teste. A primeira rodada devolveu "os dois sobreviveram", resultado verdadeiro que respondia outra pergunta. Só a matriz de quatro, com o controle sobrescrevendo paraeconomypor especificidade de classe, isolou o que interessava.
4c.5 DI5 — O <figure> do gráfico nunca se parte entre páginas#
break-inside: avoid aplicado ao <figure> inteiro, não a partes dele. Motivo: o DG1 define
o gráfico como um conjunto de cinco partes (título em figcaption, descrição curta, fallback
textual, legenda e a área de dado com role="img"). Se a paginação separa a legenda da área
de dado, o leitor perde a chave de leitura na virada da folha — e o fallback textual, que
existe para ser a alternativa acessível, vira um parágrafo órfão sem referente visível.
4c.6 DI6 — Traço no papel: o piso é do papel, não da tela#
A escala já está resolvida: vector-effect: non-scaling-stroke é obrigatório em todo SVG de
gráfico (lei transversal do §4.6), e sem ele o mesmo stroke-width=1 renderizaria entre meio
pixel e doze, porque os viewBox do sistema escalam de 0,66× a 12,4×.
O que não está resolvido é o piso físico. A hierarquia canônica é dado 2px · estrutura 1px · apoio 0,5px · marca de meta 1,5px. O candidato a falhar no papel é o apoio de 0,5px: a referência de ordem de grandeza levantada na R4 é que uma impressora laser não deposita linha abaixo de aproximadamente três a quatro vezes o seu ponto nominal, o que aproxima o apoio do limite mesmo em equipamentos de resolução alta. Número declarado como referência de literatura, não como medição da SEED — a régua de traço da folha do DI3 é que produz o número nosso.
4c.7 DI7 — O Design System não converte para CMYK#
Os hex canônicos permanecem RGB. A conversão para CMYK é responsabilidade do fluxo da gráfica, na Fase 7, com prova de cor contratada.
Racional: criar uma tabela CMYK aqui criaria um segundo lugar onde a cor mora, contra o DF7 ("tokens de dado têm UMA fonte"), e o consumidor real desse valor não existe hoje — o laudo, que é o impresso que a empresa de fato produz, sai por impressora de escritório, que recebe RGB e converte sozinha.
Alternativa descartada: gêmeo CMYK dos tokens. Levaria a unidade seed-tokens.md +
.json + .css a quatro arquivos que precisam mudar juntos, quadruplicando a superfície
que o paridade-tokens.py precisa guardar, para servir um consumidor hipotético.
Duas regras do fornecedor ficam registradas desde já, para a F7 não redescobri-las: o preto de texto deve ser K 100% puro (a gráfica não se responsabiliza por material enviado com preto composto, que causa decalque e variação); e o preto de área grande, quando se quer um preto profundo, é C 50% M 50% Y 40% K 100%.
4c.8 DI8 — PDF/A não é adotado; o laudo sai em PDF comum, assinável em PAdES#
Pesquisa normativa fechada, com o resultado negativo declarado: não existe exigência de formato de arquivo para laudo técnico de engenharia no arcabouço CONFEA/CREA. A Lei 6.496/77 e a Resolução CONFEA 1.137/2023 tratam da ART, do acervo técnico e da validade da assinatura eletrônica — nunca do formato do documento. O PDF/A (ISO 19005) é recomendação do CONARQ para preservação de longo prazo, dirigida aos órgãos e entidades do Sistema Nacional de Arquivos, isto é, ao setor público; a SEED não integra o SINAR.
E há um conflito técnico real, que é o argumento decisivo: a Orientação Técnica 4 da Câmara Técnica de Documentos Eletrônicos do CONARQ registra que o PDF/A-1 admite apenas assinatura digital simples. Isso colide frontalmente com o padrão PAdES da ICP-Brasil — cujas políticas foram republicadas pela Instrução Normativa 34/2025 do ITI, nas variantes AD-RB, AD-RT, AD-RC e AD-RA —, que é justamente o que confere validade jurídica plena a um laudo assinado. Adotar PDF/A-1 seria trocar validade jurídica por conformidade de arquivamento que ninguém exige.
Decisão: PDF comum, com assinatura PAdES quando o laudo exigir responsabilidade técnica formal.
Gatilho de revisão declarado: se um contrato, cliente ou órgão exigir PDF/A por escrito, reavaliar com PDF/A-2 ou PDF/A-3, que admitem assinatura avançada — nunca PDF/A-1.
4c.9 DI9 — Fotocópia e fax: sem regra própria, com gatilho declarado#
Evidência de campo do Rafael: fotocópia de laudo é rara a ponto de ele não lembrar da última
vez. A rede de proteção para esse caso já existe e é herdada, sem custo novo: o fallback
textual obrigatório do DG1, o rótulo textual de estado sempre visível do DM7 e a hachura
diagonal exclusiva do chart-no-data. Nenhuma regra nova é criada.
Gatilho: se a fotocópia passar a ocorrer com regularidade em algum fluxo (concessionária, cartório, cliente), o caso entra com medição própria — e a fotocópia em preto e branco é, por construção, um caso de grayscale, portanto já coberto pelo gatilho do DI2 a partir de quatro séries.
4c.10 DI10 — Fronteira com a Fase 7 (colateral físico)#
O DI entrega o comportamento da dataviz no papel: gatilho de textura, folha de estilo
de impressão, paginação do <figure>, piso de traço e a decisão de formato do arquivo. A
Fase 7 entrega tudo o mais que o papel exige da marca: formato, gramatura, acabamento,
capa, papelaria e a conversão de cor para o fluxo da gráfica (DI7). Linha declarada para não
ser invadida em nenhuma direção.
4c.11 Guia de integração da stack — DI11–DI17#
Consumidor real e imediato: o ERP em Lovable (Vite + React + TypeScript + Tailwind + shadcn/ui + Supabase). O guia é o documento colável lá; este arquivo permanece agnóstico de biblioteca (DF2), e o guia é a ponte, nunca a lei.
DI11 — A cadeia tem quatro saltos, não três. O padrão GI1 do §44 do
seed-componentes.md formalizou a cadeia de três camadas para componentes de UI
(primitivos → semânticos --seed-* → aliases shadcn). Para gráfico existe um salto a
mais, e ele é fácil de errar:
--seed-chart-cat-N (token SEED, dono do valor)
↓
--chart-N (alias que o shadcn Chart espera encontrar no CSS)
↓
chartConfig[chave].color = "var(--chart-N)"
↓
fill="var(--color-chave)" ← o que o componente Recharts realmente consome
Fato da documentação oficial: o fill não referencia --chart-N. Ele referencia
var(--color-CHAVE), uma variável que o ChartContainer gera em tempo de execução a partir
do chartConfig. Pular o terceiro salto produz gráfico sem cor, sem erro no console.
DI12 — Sintaxe do Recharts v3. var(--chart-1), nunca hsl(var(--chart-1)). A forma
com hsl() era o padrão do Recharts v2 e pressupunha tokens gravados como triplas de canal;
os tokens SEED são hex, e o embrulho em hsl() produziria valor inválido — que em CSS
significa cor ausente, e não erro.
DI13 — O tema vem do [data-theme], não do chartConfig. O chartConfig aceita um
objeto theme: { light, dark } como alternativa às variáveis CSS. Descartado: duplicaria
a cor dentro do TypeScript, criando uma segunda fonte de verdade dentro do produto e furando
o DF7 e o GI1. Trocar o data-theme continua resolvendo o tema inteiro de uma vez.
DI14 — accessibilityLayer é obrigatório e insuficiente. A prop existe e entrega acesso
por teclado e suporte a leitor de tela; deve ser ligada em todo gráfico. Ela não entrega
alternativa textual (WCAG 1.1.1) nem relação codificada entre legenda e dado (1.3.1) — que
são exatamente as duas reprovações da auditoria pública do shadcn Charts. O invólucro
<figure> de cinco partes do DG1 permanece obrigatório por cima da prop. Sem ele, o
produto herda a falha da biblioteca, e o guia de integração deixa de ser guia para virar
veículo do defeito.
DI15 — ChartContainer sempre com altura. Ou height, ou min-h-*, ou aspect-*. Sem
uma delas o ResponsiveContainer não consegue medir no primeiro render e o gráfico não
aparece. Item de verificação do guia, não recomendação.
DI16 — Aliases de --chart-1 a --chart-6. O shadcn distribui cinco por padrão; o teto
SEED é seis (DG). Acima disso o gráfico se reestrutura — agregação em "Outros", facetas,
ou o par destaque × contexto do DG17 — e nunca ganha uma sétima cor.
DI17 — Contrato Lovable. O guia entrega: um bloco único colável em globals.css
(Tailwind v4, via @theme) com os seis aliases apontando para os tokens SEED nos dois temas;
um chartConfig de exemplo; e o wrapper <figure> do DG1 como componente em
src/components/seed/, conforme o GI5 do §44.
4c.12 DI18 — Reescrita do contraste-dg.py (fecha a pendência P8 do MANIFESTO)#
O script vigente mede duas coisas mortas — o DG11 (contorno em cinza-900, supersedido
pelo DG14) e a paleta categórica anterior à v1.5 — e, pior, percorre apenas três séries. A
reescrita mede:
- Ausência de contorno e o vão de 2px do DG14.
- As seis séries da categórica v1.5, contra os fundos de referência declarados.
- O gatilho do DI2, por varredura de todos os pares em cada número de séries de 2 a 6, nos dois modos — reprovando quando um par cai abaixo do piso sem que a textura esteja prevista.
O placar vai mudar, e é para mudar. O verde atual é produto do recorte, não da saúde da paleta. Isso reafirma a régua do §7 do MANIFESTO: verde só é bom sinal quando não há errata aberta; havendo, a suíte parou de medir.
4c.13 DI19 — O gráfico do alerta de geração (ET5) entra em /email/v1/#
O DM8 especificou o gráfico do e-mail de alerta de geração e declarou que o slot fecha
quando o PNG em resolução dobrada existir no bucket R2, sob
assets.seed.eng.br/email/v1/. O caminho /email/v1/ é imutável por decisão — arte nova
vai para /v2/.
Decisão: o PNG do ET5 nasce em /email/v1/, com nome novo.
Racional: a imutabilidade do /v1/ existe para impedir que um arquivo seja substituído
no mesmo caminho sem ninguém perceber — a classe de defeito da §1 do MANIFESTO.md, em que
uma propagação afirmada e nunca lida de volta sobrescreveu um artefato. Acrescentar um
arquivo com nome inédito não expõe nenhum consumidor existente a troca silenciosa. Além
disso, o slot do ET5 está declarado desde a Fase 4 e nunca foi preenchido: ele já pertence
ao /v1/ conceitualmente.
Alternativa descartada: abrir /email/v2/ só para este asset. Faria o seed-email.md
passar a citar dois caminhos-base para a mesma geração de arte, dobrando a superfície de
confusão para economizar uma regra que não estava sendo violada.
Consequência: a produção deste PNG fecha, no mesmo movimento, a pendência P4-b do
MANIFESTO.md — os seis PNGs do bucket que seguem sem âncora passam a ser medidos e
ancorados junto com o novo.