5.2 KiB
5.2 KiB
| id | ticket | title | status | created | accepted | agenda | plans | tags | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DEC-0005 | asset-entry-codec-enum-with-metadata | Asset Entry Codec Enum Contract | accepted | 2026-04-09 | 2026-04-09 | AGD-0019 |
|
|
Status
Accepted on 2026-04-09.
Contexto
A discussao AGD-0019 fechou que o campo codec de AssetEntry faz parte do contrato de dominio do runtime e nao deve permanecer como texto frouxo consumido ad hoc por loaders.
Hoje o empacotamento e produzido no Studio em Java/Jackson e o runtime consome o header JSON de asset.pa em Rust. Portanto, o contrato precisa distinguir claramente:
- o wire format serializado pelo Studio;
- o modelo tipado carregado pelo runtime;
- a relacao entre o discriminante do codec e qualquer metadata especifica de codec.
A decisao tambem precisa consolidar o fim do alias legado RAW e a politica de falha para codecs desconhecidos.
Decisao
AssetEntry.codecno runtime MUST ser representado por um enum tipado, e MUST NOT permanecer comoStringno modelo carregado.- O JSON serializado em
asset.paMUST continuar representandocodeccomo umastring. - O runtime Rust MUST desserializar essa
stringdiretamente para o enum de codec no proprioAssetEntry. - O spelling textual do codec no JSON MUST seguir exatamente o canon definido por este contrato. O canon inicial MUST ser
SCREAMING_SNAKE_CASE, alinhado ao padrao ja usado porBankType. O Studio/paker MUST emitir exatamente esse spelling e MUST NOT introduzir aliases livres. - A variante inicial unica do enum MUST ser
None. - O alias/conceito
RawMUST be removed from the contract and MUST NOT be emitted pelo Studio nem aceito como shape valido futuro. - Se o runtime encontrar um codec desconhecido para aquele binario, a validacao de
AssetEntryMUST falhar antes de qualquer carga efetiva do asset, e o cartucho MUST ser rejeitado. pipelineMUST NOT fazer parte do modelo operacional do runtime para esse contrato e MAY ser descartado completamente no lado do runtime.- Metadados especificos de codec, quando existirem, MUST ser interpretados a partir do codec resolvido e MUST permanecer separados da metadata editorial ou da metadata propria do banco consumidor.
- A estrategia para o primeiro codec com payload adicional is deferred. Esta decisao fecha apenas o contrato atual e o ponto de extensao, sem antecipar um shape normativo para codecs futuros com payload.
Rationale
- O wire format em
stringpreserva simplicidade e compatibilidade com o Studio em Java/Jackson. - O enum no runtime torna o contrato exaustivo, evita parsing textual espalhado e reduz drift entre loader, validacao e consumidores.
- Rejeitar codec desconhecido cedo mantem o sistema fail-fast e evita estados parcialmente carregados.
- Remover
Rawevita manter semantica historica ambigua em paralelo ao contrato novo. - Expulsar
pipelinedo runtime reduz ruido conceitual e impede sobreposicao de responsabilidade comcodec. - Adiar o desenho de codecs com payload evita overdesign antes de existir um caso concreto.
Invariantes / Contrato
- O valor de
codecno JSON deasset.pae um discriminante textual canonico. - O discriminante textual canonico de
codecno JSON usaSCREAMING_SNAKE_CASE. - O valor de
codeccarregado em Rust e um enum fechado para o conjunto de codecs suportados por aquele runtime. - O Studio e o runtime compartilham o mesmo spelling canonico para cada variante.
- O runtime nao oferece modo tolerante para codecs desconhecidos.
- O contrato inicial possui uma unica variante valida:
None. Rawnao pertence mais ao contrato canonico.pipelinenao participa do contrato operacional do runtime.- Quando
metadata.codecexistir para algum codec futuro, sua interpretacao dependera do discriminante ja validado.
Impactos
prometeu-haldeve trocarAssetEntry.codec: Stringpor um enum serializavel/desserializavel com canon textual explicito.prometeu-driversdeve remover a aceitacao deRAWcomo alias legado e passar a operar sobre enum, nao sobre comparacao textual solta.- O loader/validacao do cart deve falhar cedo se a desserializacao ou validacao do codec falhar.
- O Studio/paker deve emitir exatamente o nome canonico definido para o codec.
- O nome canonico inicial de
Noneno JSON deve serNONE. - Nao ha necessidade de definir agora um DTO separado apenas para codec; o proprio
AssetEntrycontinua sendo o contrato serializado e desserializado.
Referencias
- AGD-0019: Asset Entry Codec as Enum with Metadata
- DSC-0017: Asset Entry Metadata Normalization Contract
- LSN-0023: Typed Helpers for Asset Metadata
crates/console/prometeu-hal/src/asset.rscrates/console/prometeu-hal/src/cartridge_loader.rscrates/console/prometeu-drivers/src/asset.rs
Propagacao Necessaria
- Atualizar o modelo Rust de
AssetEntrypara usar enum de codec. - Atualizar a validacao/desserializacao do header de
asset.pa. - Atualizar drivers para abandonar
RAWe comparacoes porString. - Ajustar o Studio/paker para emitir o spelling canonico escolhido pelo contrato.
- Escrever um plano de execucao antes de alterar spec/codigo.
Revision Log
- 2026-04-09: Initial accepted decision from AGD-0019.