Icon-batch presentation
Como toda IA apresenta uma LEVA de ícones candidatos pro owner escolher (aprovar/reprovar/excluir). Três invariantes duráveis: (1) a engenharia de ícones é obrigatória ANTES de apresentar — products.kmd + inscribed-glyph + ui-symbols + paleta KDS + `kicon validate/normalize`; (2) a leva vira um BATCH durável em meta/brand/icons/candidates/<id>/ com manifest.toml, IDs estáveis e bank.meaning; (3) a SUPERFÍCIE de revisão é a galeria de triagem padrão — não folhas PNG ad-hoc. A superfície é um ponteiro trocável: hoje a ponte triage-gen.py, amanhã os murais do Imago (imago#032). Resolve o sintoma recorrente: levas inconsistentes, ícones cortados, IDs renumerados, sem checagem claro/escuro.
Quando uma sessão precisa mostrar ao owner um conjunto de ícones candidatos pra ele escolher, faz do mesmo jeito, toda vez: ícones gerados conforme a engenharia de ícones, persistidos como batch durável, e apresentados na galeria de triagem padrão. Nunca uma folha PNG montada à mão, nunca IDs que mudam entre iterações, nunca sem checar legibilidade em claro e escuro.
Esta é uma policy de processo (não de pixels): a aparência de cada ícone é governada pelas specs de specs/icons/; esta policy governa como a leva é produzida, guardada e revisada. As três coisas são invariantes; a ferramenta de superfície é trocável (R5).
O que era o defeito
Sessões apresentavam ícones como imagens PNG montadas ad-hoc. Resultado recorrente (observado 2026-06-13 na eleição do ícone do Karavan): cards cortados extrapolando o canvas, IDs renumerados entre levas (o owner perdeu a referência do candidato que tinha aprovado), nenhuma checagem de contraste claro/escuro, e qualidade abaixo das levas que o Imago já produzia. O meta/brand/icons/candidates/ (source-of-truth) e o Imago (produto-banco) já existiam — faltava a regra que obriga usá-los.
Regras
- R1 — Engenharia antes da apresentação (não-negociável). Todo
candidato é gerado conforme
specs/icons/products.kmd(R1–R7: frameless, silhueta única, gradiente vertical luz-de-cima, glyph branco ≥3:1 ou figura-fundo, mono-hue, normalização) +inscribed-glyph.kmd+ui-symbols.kmd+ paleta KDS (themes/verge.kmd). Antes de mostrar, rodarkicon validateem cada candidato; zero warnings de contraste/silhueta. Apresentar ícone que não passou na validação é violação — o owner não é o validador da engenharia.
- R2 — Toda leva é um batch durável. Antes de apresentar, escrever a
leva em
meta/brand/icons/candidates/<target>-<style>-<YYYY-MM-DD>/commanifest.toml([batch]+ um[[icons]]por candidato) eicons/NN-<slug>.svg, conformecandidates/README.kmd. A leva é durável a partir desse commit — não vive só em~/temp/nem num PNG no chat. Registrar a row emcandidates/README.kmd(Active batches).
- R3 — IDs estáveis entre iterações. O ID de um candidato (
n/slugno manifest, refletido no card) nunca muda depois de apresentado. Iterar uma leva = adicionar novos IDs e marcar os velhos como reprovados, não renumerar. Quando o owner aprova um ID, esse ID é a âncora — recriá-lo com outro número ou outro prefixo perde a escolha dele. (Foi o erro k1→r1 de 2026-06-13.)
- R4 — bank.meaning no vencedor. Quando uma leva elege um vencedor,
o manifest ganha um bloco
[winner]comrepresents/concept/rationale/engineering(imago#026-b). É o que torna o batch legível por humano e ingerível pelo Imago depois.
- R5 — Superfície de revisão padrão (ponteiro trocável). A leva é
apresentada na galeria de triagem padrão, nunca numa folha PNG ad-hoc. A galeria dá: filtros (em-disputaaprovadosreprovados/ lixeira), aprovarreprovarexcluir, IDs estáveis visíveis, fundo claroescuromeio-a-meio, e modal de comparação. Implementação corrente: o gerador
meta/brand/icons/triage/triage-gen.py(ponte temporária, self-contained HTML). Destino: os murais por-módulo do Imago na conta do owner (imago#030 + #032) — quando entrarem, a ponte é removida e este ponteiro passa a apontar pro Imago. A superfície muda; R1–R4 não.
- R6 — Cards de referência. Quando a escolha precisa se diferenciar
de ícones oficiais existentes (ex.: a vertical nova vs. o pino do Koder Maps), incluir esses ícones como cards de referência não-selecionáveis na galeria (
--reference "Label=path"), pra comparação lado-a-lado. O owner pediu isso explicitamente na eleição do Karavan.
- R7 — Artefatos de revisão em ~/temp. O HTML gerado e qualquer
render vivem em
~/temp/<subdir>/(policies/scratch-location.kmd), nunca na raiz da home nem versionado. Só o batch (R2) é committado; a galeria é derivável dele a qualquer momento.
- R8 — Não duplicar a superfície (reuse-first). A ponte de triagem é
a única superfície interina; não criar uma segunda nem entrincheirar triagem num
kicon(que é gerador build-time, não UI) — isso duplicaria o Imago e violariareuse-first.kmd. Evoluções de superfície vão pro Imago (#032), não pra novas ferramentas paralelas.
Fluxo canônico (uma sessão gerando uma leva)
- Gerar N candidatos conforme a engenharia (R1);
kicon validatecada. - Escrever o batch durável em
candidates/<id>/+ manifest (R2R3R4). triage-gen.py --batch-dir candidates/<id> --out ~/temp/<id>.html[
--reference …quando R6 se aplica].- Avisar o owner com o path/URL da galeria; ele tria.
- Eleito o vencedor: bloco
[winner](R4), pipeline oficial de ícone(canônico + variantes + landing + release), conforme os gatilhos de
specs/icons/.
Testes
- T1 — Uma leva apresentada sem batch correspondente em
candidates/→ FAIL R2. - T2 — Dois candidatos da mesma campanha com o mesmo ID lógico
apontando pra SVGs diferentes entre iterações → FAIL R3.
- T3 —
kicon validateem qualquer candidato apresentado retornawarning de contraste/silhueta → FAIL R1.
- T4 — Galeria gerada por
triage-gen.pyabre self-contained(sem rede), renderiza todos os candidatos + cards de referência, e persiste estado por batch id → PASS R5/R6.
- T5 — HTMLPNG de revisão committado no repo (fora de `~temp/`)
→ FAIL R7.
Sunset
Quando imago#030 + #032 entrarem (murais por-módulo + loop de revisão Claude-Code → mural na conta do owner): remover meta/brand/icons/triage/, trocar R5 pra apontar pro Imago, e migrar as levas legadas como murais iniciais (imago#032 já prevê a migração).