9.4 KiB
| id | ticket | title | status | created | resolved | decision | tags | ||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| AGD-0019 | asset-entry-codec-enum-with-metadata | Agenda - Asset Entry Codec as Enum with Metadata | accepted | 2026-04-09 | 2026-04-09 | DEC-0005 |
|
Agenda - Asset Entry Codec as Enum with Metadata
Contexto
A DSC-0017 consolidou a normalizacao de AssetEntry.metadata, separando campos criticos na raiz e empurrando detalhes tecnicos para subarvores como codec e pipeline.
Isso resolveu a organizacao do contrato, mas nao fechou a representacao tipada de codec dentro do runtime. Hoje o dado ainda e percebido mais como JSON dinamico do que como parte explicita do modelo de dominio.
O tema desta agenda e decidir se codec em AssetEntry deve deixar de ser apenas um blob/subarvore e passar a ser um enum tipado, capaz de carregar os metadados pertinentes a cada codec.
Problema
Quando codec e tratado como JSON generico ou como informacao frouxa em metadados, o runtime perde:
- clareza sobre quais codecs existem de fato;
- validacao estrutural forte por variante;
- ergonomia para loaders e drivers;
- separacao nitida entre metadata do banco e metadata do codec.
Ao mesmo tempo, tipar codec cedo demais ou de forma larga demais pode misturar responsabilidades e transformar o enum em um deposito generico de qualquer detalhe tecnico do asset.
Pontos Criticos
-
Limite de responsabilidade.
codecdeve carregar apenas dados necessarios para decodificacao, nao toda a metadata do asset. -
Compatibilidade com a normalizacao anterior. A agenda nao deve reabrir a decisao de segmentar metadata; ela deve apenas fechar como o segmento
codecvira modelo tipado no runtime. -
Evolucao de formato. O modelo precisa permitir codecs sem payload adicional e codecs com configuracao especifica, sem cair em campos opcionais demais.
-
Unknown/forward compatibility. Precisamos decidir se codecs desconhecidos falham no parse, se ficam preservados como raw JSON, ou se existe modo hibrido.
-
Impacto nos callers. A mudanca afeta serializacao/deserializacao, helpers, validacao de cart e ergonomia dos loaders.
Opcoes
Opcao A - Manter codec como JSON dinamico
- Abordagem: manter
codeccomo subarvore emmetadataou comoserde_json::Value, usando helpers tipados apenas nos pontos de consumo. - Pro: menor migracao imediata e maior flexibilidade para formatos experimentais.
- Con: o contrato real continua implicito, com checagens espalhadas e mais risco de drift entre parser e consumidores.
- Tradeoff: adia a decisao de dominio e preserva a ambiguidade exatamente no ponto onde o runtime precisa de semantica forte.
Opcao B - Tornar codec um enum tipado com payload por variante
- Abordagem: introduzir algo como
AssetCodec, com variantes explicitas (None,Png { ... },Jpeg { ... }, etc.) carregando apenas os metadados do proprio codec. - Pro: o runtime ganha exaustividade, parse centralizado e um modelo de dominio mais honesto.
- Con: exige decidir fronteiras claras entre metadata do codec e metadata do banco/asset; tambem aumenta custo de evolucao quando novos codecs surgem.
- Tradeoff: troca flexibilidade irrestrita por contrato forte e melhor ergonomia operacional.
Opcao C - Separar codec_kind de um payload opcional tipado
- Abordagem: usar um enum leve para o tipo de codec e um campo separado para configuracao adicional.
- Pro: reduz acoplamento do discriminante com o payload e pode simplificar alguns formatos.
- Con: reintroduz estados invalidos (
kinde payload divergentes), exigindo validacao cruzada manual. - Tradeoff: parece mais flexivel, mas perde a principal vantagem de um tagged enum: coerencia estrutural por construcao.
Sugestao / Recomendacao
Seguir com a Opcao B.
codec em AssetEntry deveria ser um enum tipado e capaz de carregar os metadados estritamente relativos a ele. Isso fecha melhor o modelo de dominio: o runtime deixa de tratar codec como detalhe textual solto e passa a reconhece-lo como parte semantica do contrato do asset.
A recomendacao, no entanto, vem com uma fronteira explicita:
- metadata especifica de decodificacao fica dentro do enum do codec;
- metadata do banco/formato de consumo continua fora dele;
- metadata editorial ou operacional do asset tambem continua fora dele.
Em outras palavras, a discussao nao e "colocar toda metadata dentro de codec", e sim "dar ao segmento codec uma representacao tipada, exaustiva e com payload por variante quando necessario".
Com as respostas atuais, a recomendacao fica mais concreta:
- o JSON serializado pelo Studio dentro de
asset.papode mantercodeccomo string opaca; - o runtime Rust deve desserializar essa string diretamente para um enum em
AssetEntry; - o nome canonico de cada codec no JSON deve seguir o contrato definido pelo runtime, e o Studio/paker deve se conformar exatamente a ele;
- a variante inicial canonica e apenas
None; Rawdeve ser considerada removida do modelo;- codec desconhecido no runtime e erro fatal de carregamento e deve impedir a execucao do cartucho;
pipelinenao deve sobreviver no runtime e pode ser descartado completamente desse lado.
Perguntas em Aberto
- Como o modelo evolui quando surgir o primeiro codec real com payload adicional sem perder a separacao entre o discriminante string no JSON e a interpretacao tipada no runtime?
Discussao
Direcao fechada ate aqui
-
Serializacao no Studio O JSON serializado pelo Studio dentro de
asset.padeve exporcodeccomo string opaca. -
Desserializacao no runtime O runtime Rust deve carregar essa string diretamente em um enum no proprio
AssetEntry. O wire format continua string, mas o modelo carregado no runtime passa a ser tipado. -
Canon do nome O nome textual do codec no JSON nao e arbitrario por produtor. Ele deve seguir exatamente o canon definido pelo contrato. O canon fechado para este tema e
SCREAMING_SNAKE_CASE, alinhado aBankType, e o packer deve seguir esse formato sem aliases livres. -
Variante inicial O unico codec canonico agora e
None. -
Fim de
RawRawnao deve mais existir como conceito no modelo. -
Codecs desconhecidos Nao devem ser empacotados. Se mesmo assim chegarem ao runtime, isso e erro de validacao do
AssetEntrye o cartucho deve ser fechado antes de seguir. -
Escopo atual de codecs Como ainda nao existe codec real implementado, a primeira versao do enum pode ser minima e conter apenas
None. -
Destino de
pipelinepipelinenao tem valor operacional no runtime atual e pode ser descartado completamente desse lado.
Leitura arquitetural dessas respostas
As respostas empurram a agenda para um contrato bem mais estrito do que o texto inicial sugeria:
codecexiste como conceito de dominio mesmo antes de haver codecs concretos alem deNone;- o JSON de
asset.papode manter um discriminante simples e opaco, enquanto o runtime desserializa isso diretamente para enum e usa esse valor para escolher a interpretacao tipada demetadata.codec; - a autoridade sobre o spelling do codec pertence ao contrato compartilhado, nao ao Studio isoladamente;
- o runtime nao deve carregar extensibilidade aberta para codecs desconhecidos;
- a compatibilidade futura deve ser dirigida pelo Studio e pelo empacotamento, nao por tolerancia dinamica no runtime;
pipelinedeixa de disputar espaco conceitual comcodecno runtime.
Isso favorece um modelo de enum fechado, validado cedo e com semantica fail-fast.
Criterio para Encerrar
Esta agenda pode ser encerrada quando houver consenso escrito sobre:
- o papel exato de
codecno modelo de dominio doAssetEntry; - a fronteira entre payload do codec e restante da metadata;
- a estrategia para codecs sem metadata adicional e para codecs desconhecidos;
- o shape string de
codecno JSON e sua relacao com o enum carregado no runtime e commetadata.codec; - o proximo passo normativo para transformar isso em decisao sem reabrir
DSC-0017.
Resolucao Provisoria
Ha consenso provisoriamente estabelecido sobre os seguintes pontos:
codecdeve existir como enum tipado no modelo do runtime;- a variante inicial unica e
None; Rawsai do contrato;- codecs desconhecidos sao invalidos e devem falhar de forma fatal no carregamento do cartucho;
pipelinepode ser descartado do runtime;- o JSON de
asset.padeve serializarcodeccomo string opaca; - o runtime Rust deve desserializar essa string diretamente para enum no
AssetEntry; - o nome textual do codec no JSON deve seguir
SCREAMING_SNAKE_CASE, e o Studio deve se conformar exatamente a ele; - codec desconhecido deve falhar na validacao do
AssetEntry, antes de qualquer carga efetiva.
O unico ponto em aberto passa a ser a politica de evolucao para o primeiro codec real com payload, preservando a distincao entre:
- discriminante string no JSON do asset; e
- shape tipado de
metadata.codecno runtime.
Resolucao
A agenda fica encerrada com a seguinte orientacao:
codecpermanecestringno JSON deasset.pa;- o runtime Rust deve desserializar essa string diretamente para enum no
AssetEntry; - o nome textual do codec segue
SCREAMING_SNAKE_CASE, alinhado aBankType; Nonee a unica variante inicial;Rawsai do contrato;- codec desconhecido falha na validacao do
AssetEntrye fecha o cartucho; pipelinee descartado do runtime.
A evolucao para codecs com payload adicional fica explicitamente adiada para uma decisao futura motivada por um codec real.