implements PR-016 asset codec NONE in runtime

This commit is contained in:
bQUARKz 2026-03-20 08:07:40 +00:00
parent a024e199fb
commit ecc1a864bb
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
6 changed files with 31 additions and 75 deletions

View File

@ -180,6 +180,10 @@ impl AssetBridge for AssetManager {
} }
impl AssetManager { impl AssetManager {
fn codec_is_none_or_legacy_raw(codec: &str) -> bool {
matches!(codec, "NONE" | "RAW")
}
fn decode_tile_bank_layout( fn decode_tile_bank_layout(
entry: &AssetEntry, entry: &AssetEntry,
) -> Result<(TileSize, usize, usize, usize), String> { ) -> Result<(TileSize, usize, usize, usize), String> {
@ -246,9 +250,13 @@ impl AssetManager {
} }
fn op_mode_for(entry: &AssetEntry) -> Result<AssetOpMode, String> { fn op_mode_for(entry: &AssetEntry) -> Result<AssetOpMode, String> {
match (entry.bank_type, entry.codec.as_str()) { match entry.bank_type {
(BankType::TILES, "RAW") => Ok(AssetOpMode::StageInMemory), BankType::TILES if Self::codec_is_none_or_legacy_raw(entry.codec.as_str()) => {
(BankType::SOUNDS, "RAW") => Ok(AssetOpMode::DirectFromSlice), Ok(AssetOpMode::StageInMemory)
}
BankType::SOUNDS if Self::codec_is_none_or_legacy_raw(entry.codec.as_str()) => {
Ok(AssetOpMode::DirectFromSlice)
}
_ => Err(format!("Unsupported codec: {}", entry.codec)), _ => Err(format!("Unsupported codec: {}", entry.codec)),
} }
} }
@ -914,7 +922,7 @@ mod tests {
offset: 0, offset: 0,
size: expected_tile_payload_size(width, height) as u64, size: expected_tile_payload_size(width, height) as u64,
decoded_size: expected_tile_decoded_size(width, height) as u64, decoded_size: expected_tile_decoded_size(width, height) as u64,
codec: "RAW".to_string(), codec: "NONE".to_string(),
metadata: serde_json::json!({ metadata: serde_json::json!({
"tile_size": 16, "tile_size": 16,
"width": width, "width": width,
@ -966,14 +974,22 @@ mod tests {
} }
#[test] #[test]
fn test_op_mode_for_tiles_raw_stages_in_memory() { fn test_op_mode_for_tiles_none_stages_in_memory() {
let entry = test_tile_asset_entry("tiles", 16, 16); let entry = test_tile_asset_entry("tiles", 16, 16);
assert_eq!(AssetManager::op_mode_for(&entry), Ok(AssetOpMode::StageInMemory)); assert_eq!(AssetManager::op_mode_for(&entry), Ok(AssetOpMode::StageInMemory));
} }
#[test] #[test]
fn test_op_mode_for_sounds_raw_reads_direct_from_slice() { fn test_op_mode_for_tiles_raw_is_legacy_alias() {
let mut entry = test_tile_asset_entry("tiles", 16, 16);
entry.codec = "RAW".to_string();
assert_eq!(AssetManager::op_mode_for(&entry), Ok(AssetOpMode::StageInMemory));
}
#[test]
fn test_op_mode_for_sounds_none_reads_direct_from_slice() {
let entry = AssetEntry { let entry = AssetEntry {
asset_id: 1, asset_id: 1,
asset_name: "sound".to_string(), asset_name: "sound".to_string(),
@ -981,7 +997,7 @@ mod tests {
offset: 0, offset: 0,
size: 8, size: 8,
decoded_size: 8, decoded_size: 8,
codec: "RAW".to_string(), codec: "NONE".to_string(),
metadata: serde_json::json!({ metadata: serde_json::json!({
"sample_rate": 44100 "sample_rate": 44100
}), }),
@ -1077,7 +1093,7 @@ mod tests {
offset: 0, offset: 0,
size: data.len() as u64, size: data.len() as u64,
decoded_size: data.len() as u64, decoded_size: data.len() as u64,
codec: "RAW".to_string(), codec: "NONE".to_string(),
metadata: serde_json::json!({ metadata: serde_json::json!({
"sample_rate": 44100 "sample_rate": 44100
}), }),
@ -1122,7 +1138,7 @@ mod tests {
offset: 0, offset: 0,
size: data.len() as u64, size: data.len() as u64,
decoded_size: data.len() as u64, decoded_size: data.len() as u64,
codec: "RAW".to_string(), codec: "NONE".to_string(),
metadata: serde_json::json!({ metadata: serde_json::json!({
"sample_rate": 44100 "sample_rate": 44100
}), }),

View File

@ -20,7 +20,7 @@ pub struct AssetEntry {
pub offset: u64, pub offset: u64,
pub size: u64, pub size: u64,
pub decoded_size: u64, pub decoded_size: u64,
pub codec: String, // e.g., "RAW" pub codec: String, // e.g., "NONE" (legacy alias: "RAW")
pub metadata: serde_json::Value, pub metadata: serde_json::Value,
} }

View File

@ -369,7 +369,7 @@ mod tests {
offset, offset,
size, size,
decoded_size: 16 * 16 + (TILE_BANK_PALETTE_COUNT_V1 as u64 * 16 * 2), decoded_size: 16 * 16 + (TILE_BANK_PALETTE_COUNT_V1 as u64 * 16 * 2),
codec: "RAW".to_string(), codec: "NONE".to_string(),
metadata: json!({ metadata: json!({
"tile_size": 16, "tile_size": 16,
"width": 16, "width": 16,
@ -451,7 +451,7 @@ mod tests {
offset: 4, offset: 4,
size: 4, size: 4,
decoded_size: 16 * 16 + (TILE_BANK_PALETTE_COUNT_V1 as u64 * 16 * 2), decoded_size: 16 * 16 + (TILE_BANK_PALETTE_COUNT_V1 as u64 * 16 * 2),
codec: "RAW".to_string(), codec: "NONE".to_string(),
metadata: json!({ metadata: json!({
"tile_size": 16, "tile_size": 16,
"width": 16, "width": 16,

View File

@ -109,7 +109,7 @@ fn test_tile_asset_entry(asset_name: &str, data_len: usize) -> AssetEntry {
offset: 0, offset: 0,
size: data_len as u64, size: data_len as u64,
decoded_size: test_tile_decoded_size(16, 16) as u64, decoded_size: test_tile_decoded_size(16, 16) as u64,
codec: "RAW".to_string(), codec: "NONE".to_string(),
metadata: serde_json::json!({ metadata: serde_json::json!({
"tile_size": 16, "tile_size": 16,
"width": 16, "width": 16,

View File

@ -1,61 +0,0 @@
# 016 Asset Codec `NONE` Runtime and Tests
## Briefing
Com a decision `013`, o runtime deve migrar o valor canonico de `codec` para `NONE` sem quebrar a transicao curta a partir de `RAW`.
Esta PR executa a propagacao em codigo, fixtures e testes do runtime.
## Decisions de Origem
- `docs/runtime/decisions/013-asset-codec-none-vs-raw.md`
## Alvo
Atualizar o runtime para que:
1. `NONE` seja aceito como valor principal de `codec`;
2. `RAW` seja aceito apenas como alias legado durante a janela curta de transicao;
3. fixtures e testes passem a publicar `NONE` como valor canonico;
4. `TILES` e `SOUNDS` fiquem coerentes com a decision.
## Escopo
- atualizar `crates/console/prometeu-drivers/src/asset.rs`
- atualizar fixtures/testes em `prometeu-drivers`, `prometeu-hal` e `prometeu-system`
- ajustar comentarios inline onde `RAW` ainda apareca como valor canonico
## Fora de Escopo
- remover imediatamente a compatibilidade com `RAW`
- alterar packer
- introduzir novos codecs
- mudar contratos de layout de `TILES` ou `SOUNDS`
- publicar banks genericos novos como `BLOB`
## Plano de Execucao
1. Atualizar o path de resolucao de `codec` para aceitar `NONE` como valor canonico.
2. Preservar `RAW` como alias legado durante a transicao curta.
3. Migrar fixtures e testes para emitir `NONE`.
4. Revisar comentarios e exemplos inline para remover `RAW` como default canonico.
5. Validar que `TILES` e `SOUNDS` continuam operando sem regressao comportamental.
## Criterios de Aceite
- runtime aceita `NONE` em `TILES` e `SOUNDS`
- runtime continua aceitando `RAW` apenas como alias legado
- fixtures e testes passam a usar `NONE` como valor canonico
- nenhum comentario ou helper novo reforca `RAW` como valor principal
## Tests / Validacao
- testes unitarios do asset loader
- testes do runtime/VM que passam por asset loading
- revisao de fixtures de cartridge/asset metadata
## Riscos
- deixar paths diferentes tratando `NONE` e `RAW` de forma inconsistente
- migrar fixtures parcialmente e mascarar regressao real
- prolongar compatibilidade legacy sem rastro claro para remocao futura

View File

@ -36,7 +36,7 @@ Uma PR deste diretório deve:
## Roadmap Atual ## Roadmap Atual
- `016-asset-codec-none-runtime-and-tests.md` Nenhuma PR em aberto no momento.
## PRs Finalizadas ## PRs Finalizadas
@ -44,3 +44,4 @@ Uma PR deste diretório deve:
- `013-tile-bank-runtime-contract-alignment.md`: concluída. Contrato normativo de `tile bank` v1 alinhado entre `specs/04` e `specs/15`. - `013-tile-bank-runtime-contract-alignment.md`: concluída. Contrato normativo de `tile bank` v1 alinhado entre `specs/04` e `specs/15`.
- `014-tile-bank-loader-packed-nibbles-and-palette-boundary.md`: concluída. Loader/runtime atualizado para consumir payload serializado `4bpp` packed com `64` paletas por bank. - `014-tile-bank-loader-packed-nibbles-and-palette-boundary.md`: concluída. Loader/runtime atualizado para consumir payload serializado `4bpp` packed com `64` paletas por bank.
- `015-asset-codec-none-canonicalization-in-specs.md`: concluída. `NONE` publicado como valor canonico de ausencia de codec adicional nas specs. - `015-asset-codec-none-canonicalization-in-specs.md`: concluída. `NONE` publicado como valor canonico de ausencia de codec adicional nas specs.
- `016-asset-codec-none-runtime-and-tests.md`: concluída. Runtime e fixtures migrados para `NONE`, preservando `RAW` apenas como alias legado temporário.