prometeu-runtime/docs/runtime/agendas/023-asset-packer-runtime-facing-contract.md
2026-03-24 13:40:53 +00:00

7.2 KiB

Agenda - Asset Packer Runtime-Facing Contract

Contexto

Hoje o runtime ja consome uma superficie de assets relativamente clara:

  • asset_table no manifest.json;
  • assets.pa como blob packed de bytes frios;
  • preload opcional para residency inicial.

Essa superficie esta descrita em 13-cartridge.md e 15-asset-management.md, mas ainda do ponto de vista do consumidor runtime.

Falta fechar a fronteira do produtor de assets.pa.

Para o repositorio, a nomenclatura precisa ficar explicita:

  • shipper monta o cart distribuivel e e responsavel pelo .pmc;
  • packer empacota somente os assets e produz a superficie que alimenta asset_table + assets.pa;
  • compiler e outros workers entram como dependencias do shipper, nao como substitutos do packer.

Sem essa separacao, a discussao de .pmc tende a misturar container de distribuicao com contrato de bytes/metadata dos assets.

Problema

O runtime conhece assets.pa, mas o projeto ainda nao decidiu qual e a facing do packer que produz esse artefato.

Hoje nao esta fechado:

  • qual e a entrada canonica do packer;
  • qual e a saida normativa alem do blob cru;
  • como asset_id, asset_name, offset, size, decoded_size, codec e metadata devem ser gerados e validados;
  • quais invariantes o runtime pode assumir sobre ordenacao, alinhamento, identidade e compatibilidade dos assets;
  • o que pertence ao contrato do packer vs o que pertence ao shipper.

Sem essa decisao:

  • assets.pa corre o risco de virar artefato acidental em vez de contrato;
  • o shipper nao tem base normativa para montar .pmc de forma deterministica;
  • specs de asset continuam descrevendo so consumo, nao producao;
  • tooling pode introduzir heuristica local para ids, offsets, metadata e codecs.

Pontos Criticos

Fatos

  • o runtime atual consome asset_table + assets.pa, nao uma API do packer;
  • AssetEntry hoje exige asset_id, asset_name, bank_type, offset, size, decoded_size, codec e metadata;
  • o loader atual so carrega cart em formato de diretorio; .pmc ainda nao esta implementado;
  • o runtime hoje aceita apenas RAW para TILES e SOUNDS;
  • o decode atual depende de metadata especifica por bank:
    • TILES: tile_size, width, height;
    • SOUNDS: sample_rate opcional, com default.

Riscos

  • deixar asset_id ou ordenacao dependentes de detalhes de filesystem;
  • acoplar o formato interno de assets.pa ao container .pmc;
  • permitir metadata insuficiente ou ambigua e empurrar validacao para o runtime;
  • introduzir codec/versionamento sem registry ou politica de compatibilidade;
  • permitir que packer e shipper dupliquem responsabilidade sobre manifest e tabela de assets.

Tradeoffs

  • packer minimalista e simples agora vs contrato mais rigido e extensivel depois;
  • asset_id derivado automaticamente vs declarado/estavel;
  • blob puro com offsets vs envelope com header interno proprio;
  • metadata livre em JSON vs schema normativo por bank_type e codec;
  • validacao forte no packer vs tolerancia maior no runtime.

Hipoteses

  • o shipper deve tratar asset_table + assets.pa como output fechado do packer, sem reinterpretar layout interno;
  • o packer deve produzir resultado deterministico para a mesma entrada;
  • a compatibilidade futura de codecs fica melhor se a facing do packer declarar registry e schema desde o inicio.

Opcoes

Opcao 1 - Packer como gerador de blob opaco + tabela

O packer recebe fontes de asset, decide ids/layout e entrega:

  • assets.pa;
  • asset_table;
  • eventualmente um relatorio de build nao normativo.

Vantagens:

  • encaixa direto no runtime atual;
  • separa bem packer de shipper;
  • reduz trabalho inicial.

Desvantagens:

  • pode esconder heuristicas importantes dentro do tooling;
  • tende a deixar asset_id e metadata sem contrato claro.

Opcao 2 - Packer com manifest proprio normativo

O packer recebe uma spec de entrada dedicada de assets e produz uma saida formal com:

  • assets.pa;
  • asset_table;
  • manifesto/intermediate proprio do packer.

Vantagens:

  • deixa ownership editorial mais claro;
  • facilita reproducibilidade e testes de golden output;
  • prepara evolucao de codecs e validadores.

Desvantagens:

  • aumenta escopo antes de fechar o minimo necessario;
  • corre risco de criar artefato intermediario normativo demais cedo.

Opcao 3 - Packer como biblioteca interna do shipper

O packer nao ganha fronteira propria; o shipper absorve a logica de assets e so expomos o contrato final do cart.

Vantagens:

  • menos moving parts no curto prazo.

Desvantagens:

  • conflita com a separacao conceitual desejada;
  • embaralha discussao de assets.pa com .pmc;
  • dificulta testes focados na superficie de assets.

Sugestao / Recomendacao

Fechar o packer como produtor normativo de asset_table + assets.pa, com fronteira propria e independente do shipper.

Recomendacao objetiva para avancar:

  1. O contrato do packer deve ser definido em torno da saida observavel consumida pelo runtime, nao em torno do .pmc.
  2. O shipper deve consumir o output do packer como artefato fechado e so cuidar de empacotar o cart final.
  3. O v1 do packer deve assumir:
    • assets.pa como blob sequencial deterministico;
    • asset_table como mapa normativo da segmentacao do blob;
    • registry inicial de codecs/banks suportados pelo runtime atual;
    • schema minimo de metadata por combinacao bank_type + codec.
  4. A decisao precisa fixar explicitamente:
    • estrategia de asset_id;
    • ordenacao canonica dos assets no blob;
    • regras de alinhamento, se existirem;
    • politica para duplicatas de nome;
    • responsabilidades de validacao entre packer e runtime.

Essa direcao reduz ambiguidade sem antecipar o design completo do shipper.

Perguntas em Aberto

  1. Qual e a entrada canonica do packer: arquivos soltos, manifesto de assets, API de biblioteca, ou combinacao?
  2. asset_id precisa ser estavel entre builds identicos e entre reorganizacoes de input?
  3. O packer deve ordenar assets por declaracao, por nome, por bank, ou por politica explicita de layout?
  4. assets.pa continua sendo blob puro sem header proprio ou o packer deve ter envelope/versionamento interno?
  5. Qual e o schema normativo minimo de metadata por tipo de asset no v1?
  6. O v1 deve aceitar so RAW ou ja reservar namespace/registry para codecs futuros?
  7. Quem rejeita inconsistencias de decoded_size, metadata faltante e offset invalido: packer, shipper, runtime, ou todos em camadas diferentes?
  8. Preload pertence ao dominio do packer, do shipper, ou apenas do cart manifest?

Criterio para Encerrar

Esta agenda pode virar decision quando houver definicao escrita de:

  • fronteira formal entre packer e shipper;
  • input e output canonicos do packer;
  • contrato normativo de producao de asset_table e assets.pa;
  • politica de identidade, ordenacao e layout dos assets no blob;
  • schema minimo de metadata e registry inicial de codecs/banks;
  • matriz de validacao e erro entre packer, shipper e runtime;
  • estrategia de teste de compatibilidade entre output do packer e consumo do runtime.

Referencias

  • ../specs/13-cartridge.md
  • ../specs/15-asset-management.md
  • 008-packed-cartridge-loader-pmc.md
  • ../../crates/console/prometeu-hal/src/asset.rs
  • ../../crates/console/prometeu-drivers/src/asset.rs