5.6 KiB
Decision Record - assets.pa Preload Uses asset_id
Status
Accepted
Contexto
A decision 011 fechou o envelope runtime-facing de assets.pa:
assets.pae o contrato primario de assets do runtime;asset_tableepreloadvivem no header interno do artefato;preloade consumido apenas no bootstrap.
Essa decisao, no entanto, nao definiu a semantica de identidade de PreloadEntry.
O estado atual do runtime ainda mistura dois modelos:
AssetEntryja trataasset_idcomo identidade operacional do asset;PreloadEntryainda usaasset_namecomo chave pratica de resolucao no boot.
Isso preserva uma dependencia estrutural de campo mutavel justamente na fase em que o cart deveria ser mais deterministicamente validavel.
Decisao
1. PreloadEntry passa a ser { asset_id, slot }
O shape normativo de preload em assets.pa passa a ser:
PreloadEntry {
asset_id,
slot
}
asset_name deixa de fazer parte do contrato operacional de preload.
2. asset_id tem semantica de java int
asset_id no contrato runtime-facing de assets passa a ser um inteiro de 32 bits com semantica de java int.
Qualquer representacao interna do runtime deve respeitar essa semantica e nao introduzir contrato unsigned por acidente.
3. asset_name permanece apenas como metadata descritiva
asset_name continua permitido em AssetEntry para:
- debug;
- observabilidade;
- tooling editorial;
- UX de inspecao.
Mas asset_name nao participa:
- da identidade normativa do asset;
- da validacao de preload;
- da resolucao operacional de preload.
4. preload deve ser validado contra a asset_table
Quando assets.pa existir, o runtime deve validar preload durante o bootstrap usando a asset_table carregada do mesmo artefato.
Validacoes minimas obrigatorias:
- todo
preload.asset_iddeve existir naasset_table; - nao pode haver clash de slot por tipo.
5. Clash de slot por tipo e proibido
O namespace de slot de preload e derivado de bank_type da asset_table.
Portanto, depois de resolver cada preload.asset_id para sua respectiva AssetEntry, o cart e invalido se houver mais de uma entry de preload para o mesmo par:
(bank_type, slot)
Isso vale mesmo que as entries apontem para o mesmo asset.
6. Nao ha compatibilidade normativa com preload legado por asset_name
O contrato do runtime nao oferece modo de compatibilidade para preload legado baseado em asset_name.
Artefatos que nao seguirem o shape novo devem ser considerados invalidos para o contrato vigente.
7. Falhas de preload invalido sao estruturais de cart
Os seguintes casos sao erros estruturais de formacao do cart:
preload.asset_idausente daasset_table;- clash de slot por tipo dentro de
preload.
Esses casos devem falhar no bootstrap do cart, antes da execucao normal, e nao pertencem ao espaco de status operacional de asset.load.
Rationale
Esta decisao foi adotada porque:
- alinha preload com a identidade estavel do dominio de assets;
- remove dependencia de metadata mutavel no bootstrap;
- preserva
asset_tablecomo fonte de verdade unica para identidade e tipo; - torna a validacao do cart mais deterministica;
- impede que compatibilidade legado vire contrato permanente por inercia.
O uso de java int foi escolhido para manter alinhamento de semantica de ID com a fronteira de linguagem/plataforma desejada, em vez de cristalizar um detalhe unsigned especifico da implementacao atual em Rust.
Invariantes / Contrato
PreloadEntrye normativamente{ asset_id, slot }.asset_idsegue semantica dejava int.asset_namenao tem autoridade operacional sobre preload.preloadso pode referenciar assets existentes naasset_tabledo mesmoassets.pa.preloadnao pode conter mais de uma ocupacao para o mesmo par(bank_type, slot).- falhas de validacao de preload sao erros estruturais de cart e devem abortar o bootstrap.
asset.load(name, kind, slot)permanece fora do escopo desta decisao.
Impactos
Specs
15-asset-management.mddeve explicitar o shape normativo dePreloadEntry, a semantica deasset_ide as validacoes estruturais de preload.13-cartridge.mddeve registrar queassets.painvalido inclui preload com IDs ausentes ou clash de slot por tipo.
Runtime
prometeu-hal/src/asset.rsdeve trocarPreloadEntry.asset_nameporasset_id.- tipos de
asset_idexpostos no contrato runtime-facing devem ser revisados para semantica dejava int. - o loader de
assets.padeve rejeitar preload invalido antes de iniciar preload. - o
AssetManagerdeve resolver preload diretamente porasset_id, sem ponte nome -> id.
Tooling / Packer
- o produtor de
assets.padeve emitir preload apenas comasset_id. - carts com preload legado por
asset_namedeixam de ser validos no contrato atual.
Referencias
../agendas/024-assets-pa-preload-and-asset-table-id-based-contract.md../decisions/011-assets-pa-autocontained-runtime-contract.md../specs/13-cartridge.md../specs/15-asset-management.md../../crates/console/prometeu-hal/src/asset.rs../../crates/console/prometeu-hal/src/cartridge_loader.rs../../crates/console/prometeu-drivers/src/asset.rs
Propagacao Necessaria
- criar PR/plan para atualizar
spec 13espec 15; - criar PR/plan de codigo para:
- trocar o shape de
PreloadEntryparaasset_id; - validar preload durante parse/bootstrap de
assets.pa; - rejeitar
asset_idausente daasset_table; - rejeitar clash de slot por tipo;
- revisar a tipagem de
asset_idpara semantica dejava int; - atualizar testes de loader e
AssetManager;
- trocar o shape de
- remover a
agenda 024da lista de agendas ativas.