14 KiB
| id | ticket | title | status | created | resolved | decision | tags | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| AGD-0032 | studio-scene-pack-runtime-binary-contract | Studio scene pack contract for runtime SCENE binary payload | accepted | 2026-04-24 | 2026-04-27 |
|
Pain
O runtime ja possui um payload binario SCENE versionado e com decoder real, mas o Studio/paker ainda para em TMX/TSX e nao fecha a publicacao desse asset para assets.pa.
Isso deixa um gap claro entre:
- authoring/editorial workflow no dominio
studio; - materializacao e packing no dominio
packer; - contrato efetivamente consumido no dominio
runtime.
Dominio owner desta agenda: studio.
Boundary explicito: studio -> packer -> runtime.
Context
- O runtime define
SCENEv1 com magicSCNE, version1,4layers fixas, metadata vazio no header do asset table e payload binario por layer. - O decoder de
SCENEja valida: version; layer count; tile size; parallax factor;width * height == tile_count;decoded_size; ausencia de trailing bytes. - O runtime tambem ja instala
SceneBankem scene slots, mas a dependencia de glyph por layer agora ehglyph_asset_id, nao maisglyph_bank_id. - O runtime resolve
glyph_asset_id -> glyph slotinternamente durantebind_sceneerender_frame, mantendo a alocacao de slot como concern operacional de runtime. - O Studio hoje trata
Scene Bankcomo asset owner de authoring/validation, comscene-bank.studio.json,TMXpor layer eTSXgerado por glyph bank especializado em tileset. - A decision consolidada em
DSC-0028fechou o modelo wave 1 de authoring emTMX/TSX, mas deixou explicitamente o scene packing runtime como concern posterior. - O packer atual reconhece
SCENE_BANKcomo familia eSCENE/tilemap_v1como output format, mas ainda nao faz walk/materialization de scene e falha deliberadamente no pack execution para familias fora deGLYPH_BANK.
Findings tecnicos relevantes desta agenda:
- O formato binario ja existe no runtime e nao esta “a decidir”.
- O packer atual nao produz payload
SCENE. - O maior buraco contratual hoje nao eh o layout binario em si, mas a traducao editorial de
TMX/TSXpara os campos exigidos pelo runtime. - O campo mais sensivel continua sendo a dependencia de glyph por layer, mas o runtime atual passou a usar
glyph_asset_idnoSCENEe resolverasset_id -> slotinternamente. - Isso remove do Studio/paker a necessidade de conhecer previamente o glyph slot operacional do runtime para serializar a scene.
Open Questions
- Quem deve ser o owner da compilacao
TMX/TSX -> SCENE:prometeu-packerembutido no Studio, uma camada editorial do Studio, ou outro componente? Resposta atual da discussao: oAsset Workspacegera e usaTMX/TSXapenas como support/editorial surfaces; esses formatos nao devem ser empurrados para oprometeu-packer; oprometeu-packerdeve receber um protocolo proprio de requisicao; oScene Bankno Studio deve validar e extrair, no passo deAccept, os dados necessarios dos artefatos editoriais para esse request. - Qual deve ser o contrato canonico da dependencia de glyph por layer?
Resposta validada contra o runtime atual:
o payload
SCENEdeve carregarglyph_asset_id; a resolucaoasset_id -> slotpertence ao runtime; Studio e packer nao precisam serializar slot de glyph no contrato da scene. - O
Scene Bankdeve persistirglyph_asset_idexplicitamente no metadata/request do Studio ou derivar isso sempre a partir do asset referenciado na layer? Resposta atual da discussao:glyph_asset_ideh derivado do tileset/glyph asset selecionado no form da layer, mantendo uma unica fonte da verdade. - Onde devem viver os
parallax_factorpor layer, que o runtime exige mas o metadata atual do Studio nao modela? Resposta atual da discussao:parallax_factordeve ser adicionado ao form da layer no Studio. - De onde vem o
palette_idpor layer/tile no request atual? Resposta atual da discussao:palette_idainda nao existe no workflow atual e deve ser adicionado ao form da layer no Studio, ou em surface editorial equivalente no mesmo nivel. - Como o workflow editorial indica se uma layer entra ou nao na publicacao? Resposta atual da discussao: o checkbox existente no form da layer indica se a layer esta ativa/sera usada.
- Qual eh a regra oficial de traducao de tiles do Tiled para records do payload runtime:
gidbase; flip flags;glyph_id;palette_id? Resposta atual da discussao: cada tile eh mapeado peloTSX, e oTSXaponta para o glyph asset;flipepalette_idpor tile podem vir como properties noTMX, por serem dados do tile especifico;glyph_idja existe como property noTSX. - O wave 1 continua estritamente limitado a um
TSXporTMX/layer tambem no scene pack runtime, ou precisamos abrir espaco para multi-tileset antes de fechar o contrato? Resposta atual da discussao: sim, wave 1 continua com exatamente1 TSXporTMX/layer. - A aceitacao no Studio deve ser gate obrigatorio para publicar
SCENEem pack, ou apenas um estado editorial recomendado? Resposta atual da discussao: o criterio continua sendo o usual do workflow: nenhum diagnostic error bloqueante. - O
SCENE/tilemap_v1no manifest representa o payload binario runtime final, ou ainda esta sendo usado ambiguamente para o estado editorial baseado emTMX? Resposta atual da discussao: vamos manterSCENE/tilemap_v1por enquanto; o runtime nao exige mudanca desse nome neste momento. - Qual deve ser o shape exato do request
studio -> packer? Resposta atual da discussao: o request deve ser construido backwards a partir dos dados do payload binarioSCENE, como um data class o mais proximo possivel do binario final. Shape atual assentado na agenda:
Observacoes do shape assentado:ScenePackRequest - version: int - layers: [ScenePackLayerRequest; 4] ScenePackLayerRequest - active: bool - glyph_asset_id: int - tile_size: int - parallax_factor_x: float - parallax_factor_y: float - width: int - height: int - tiles: List<ScenePackTileRequest> ScenePackTileRequest - active: bool - glyph_id: int - palette_id: int - flip_x: bool - flip_y: boolrequest -> SCENEdeve ser quase isomorfico;tile_countpode ser derivado dewidth * height; campos reservados do binario nao precisam existir no request.
Options
Option A - Studio Accepts Tiled and Emits a Packer-Owned Scene Request
- Approach: manter o Studio como owner de authoring, validation e acceptance de
TMX/TSX, e fazer oScene Bankaceito extrair um request proprio e estavel para oprometeu-packer; o packer compila esse request para o payload binarioSCENEsem conhecerTMX/TSX. - Pro: preserva
TMX/TSXcomo concern editorial do Studio e evita contaminar o packer com detalhes de tooling externo. - Con: exige fechar um boundary formal novo entre Studio e packer, incluindo o schema desse request.
- Maintainability: boa, desde que o contrato editorial/runtime fique explicito e versionado.
Option B - Add a Studio-Owned Intermediate Scene Representation First
- Approach: antes de empacotar, introduzir um modelo normalizado intermediario no Studio ou em shared tooling, e so depois converter esse modelo para o payload binario runtime.
- Pro: pode simplificar validacao e testes sem depender diretamente de parsing de
TMXno packer. - Con: reabre o risco de criar uma segunda surface de scene alem de
TMX, contrariando a direcao recente de evitar schema paralelo cedo demais. - Maintainability: media; melhora isolamento interno, mas adiciona outra camada contratual para manter.
Option C - Make Packer Parse TMX/TSX Directly
- Approach: fazer o
prometeu-packerlerTMX/TSXdiretamente e produzir o payload runtime a partir dessas surfaces editoriais. - Pro: reduz o numero aparente de etapas entre authoring e pack final.
- Con: acopla o packer a uma surface editorial do Studio e ao tooling externo, o que contraria a direcao explicitada nesta discussao.
- Maintainability: fraca; qualquer evolucao do authoring/editorial tende a vazar para o contrato operacional do packer.
Discussion
O estado atual sugere que o layout binario do runtime ja esta suficientemente maduro para servir como contrato de destino. A discussao principal nao deveria voltar para “qual eh o formato binario da scene”, e sim para “como o Studio/paker chegam nele de forma disciplinada”.
Ha uma restricao importante aqui: a decision anterior sobre Scene Bank em Assets e TMX/TSX como surfaces wave 1 continua valida. Portanto esta agenda nao deve reinterpretar DSC-0028 como se o Studio precisasse ganhar um scene workspace, um editor pesado ou um schema proprietario paralelo por conveniencia.
Direcao ja explicitada nesta thread:
TMXeTSXficam confinados ao dominio editorial do Studio;- o
Asset Workspacedeve conseguir validar e extrair do estado aceito os dados relevantes para pack; - o
prometeu-packernao deve conhecer Tiled nem depender deTMX/TSX; - o boundary Studio -> packer deve ser um protocolo proprio, estavel e independente das surfaces editoriais.
Os pontos mais arriscados no boundary sao:
glyph_asset_id: o runtime agora aceita identidade estavel de asset na scene e resolveasset_id -> slotinternamente; a discussao ja convergiu que esse valor eh derivado do tileset/glyph asset selecionado no form da layer.parallax_factor: o runtime exige esse campo por layer; a direcao atual eh adiciona-lo ao form da layer, no mesmo nivel editorial de configuracoes como dimensao do mapa.- traducao de tiles:
a direcao atual ja convergiu que cada tile eh resolvido pelo
TSX, comflipepalette_idpodendo vir doTMX; o request do packer deve preservar esses campos de forma quase isomorfica ao record runtime. palette_id: a direcao atual eh adiciona-lo ao form da layer, com possibilidade de override por tile via properties editoriais noTMX.- gate editorial: o checkbox de layer ativa ja cobre o uso editorial da layer, e o gate atual para publicar continua sendo ausencia de diagnostic error bloqueante.
Settled So Far
Os pontos abaixo ficam cravados nesta agenda como direcao atual da discussao:
TMXeTSXpermanecem surfaces editoriais do Studio e nao entram no protocolo operacional do packer.- O
Asset Workspacedeve extrair, no passo deAccept, um request proprio para oprometeu-packer. - O payload runtime
SCENEcarregaglyph_asset_id, e a resolucaoasset_id -> slotpertence ao runtime. glyph_asset_ideh derivado do tileset/glyph asset selecionado no form da layer.parallax_factordeve existir no form da layer.palette_iddeve existir no form da layer, ou em surface editorial equivalente no mesmo nivel.- O checkbox da layer define se ela esta ativa/sera usada.
- Cada tile eh resolvido via
TSX;glyph_idja existe como property noTSX. flipepalette_idpor tile podem vir como properties noTMX.- Wave 1 continua com exatamente
1 TSXporTMX/layer. - O gate atual para publicar continua sendo ausencia de diagnostic error bloqueante.
- O request
studio -> packerdeve ser derivado backwards do payload binario erequest -> SCENEdeve ser o mais direto possivel. - O shape atual assentado do request e:
ScenePackRequest(version, layers[4]);ScenePackLayerRequest(active, glyph_asset_id, tile_size, parallax_factor_x, parallax_factor_y, width, height, tiles);ScenePackTileRequest(active, glyph_id, palette_id, flip_x, flip_y). - O manifest permanece com
SCENE/tilemap_v1por enquanto.
Recommendation
Seguir com a Option A.
Direcao recomendada:
- manter
TMX/TSXcomo surfaces editoriais wave 1 no dominiostudio; - fechar uma decision nova para o boundary
studio/packer/runtimedoScene Bank; - fazer o
Asset Workspaceaceitar e extrair do estado editorial um request proprio para o packer; - fazer o
prometeu-packerser owner apenas da compilacao desse request para o payload binarioSCENE; - explicitar na decision:
modelagem da dependencia
glyph_asset_id; modelagem deparallax_factor; modelagem depalette_id; semantica da layer ativa no request; gate baseado em diagnostics bloqueantes; formato do requeststudio -> packer, derivado backwards do payload binario; semantica oficial deSCENE/tilemap_v1.
Essa direcao reaproveita o que ja existe, mantem o packer livre das ferramentas editoriais do Studio e concentra a publicacao runtime no subsistema que ja monta assets.pa.
Next Step Suggestion
Converter esta agenda em uma decision focada no contrato de compilacao/publicacao de Scene Bank, cobrindo:
- ownership por dominio;
- formato do request
studio -> packer, backwards a partir do payload binario; - mapping editorial -> request -> runtime, com
request -> SCENEo mais direto possivel; - modelagem e validacao de
glyph_asset_idpor layer; - gating de diagnostics para pack;
- propagation targets em
prometeu-packer,prometeu-studioe specs relevantes.
Resolution
Agenda aceita.
Direcao consolidada:
TMX/TSXpermanecem estritamente editoriais no dominiostudio.- O
Scene Bankaceito deve extrair um request proprio e estavel para oprometeu-packer. - O request
studio -> packerdeve ser derivado backwards do payload binarioSCENEerequest -> SCENEdeve ser o mais direto possivel. - O contrato runtime de dependencia de glyph por layer usa
glyph_asset_id, com resolucaoasset_id -> slotpertencendo ao runtime. - O workflow editorial do Studio deve prover
glyph_asset_idderivado do tileset selecionado,parallax_factor,palette_id, estado ativo da layer e a traducao por tile a partir deTSX/TMX. - Wave 1 permanece com exatamente
1 TSXporTMX/layer. - O gate para publicacao continua sendo ausencia de diagnostic error bloqueante.
- O manifest permanece com
SCENE/tilemap_v1por enquanto.
Proximo passo sugerido: converter esta agenda em uma decision normativa para o boundary studio -> packer -> runtime.