6.3 KiB
| id | ticket | title | status | created | accepted | agenda | plans | tags | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DEC-0027 | studio-frame-composer-syscall-and-sprite-alignment | Studio MUST Adopt `@sdk:composer` for Sprite Composition and Remove `Gfx.set_sprite` | in_progress | 2026-04-18 | 2026-04-18 | AGD-0031 |
|
|
Context
O ../runtime já convergiu a ownership pública de frame orchestration para FrameComposer e já publicou a ABI pública correspondente no domínio composer.*.
Para o recorte desta discussão, o ponto normativo relevante é simples:
- sprite composition não pertence mais ao domínio público
gfx.*; - o caminho público legado
gfx.set_spritejá não representa o owner canônico no runtime; - o Studio ainda expõe esse caminho legado em stdlib, specs, testes, fixtures e exemplos.
Isso cria drift entre:
- a ABI pública real do runtime;
- o contrato que o Studio ensina e emite;
- a superfície que PBS usa como owner visível para composição de sprites.
O usuário fechou explicitamente o escopo desta decisão:
- entra apenas a wave de
@sdk:composerpara sprite composition; - entra
composer.emit_sprite; - entra remoção total de
Gfx.set_sprite; composer.bind_scene,composer.unbind_sceneecomposer.set_cameraficam para trabalho posterior;- scene bank e concerns de authoring/editor ficam fora deste ticket.
Decision
O Studio MUST adotar @sdk:composer como a superfície canônica de stdlib/PBS para sprite composition nesta wave.
Mais especificamente:
- A operação pública de composição de sprites MUST ser exposta por
composer.emit_sprite. - O módulo reservado
@sdk:composerMUST seguir o mesmo shape editorial hoje usado por@sdk:gfx:- um owner host de baixo nível
LowComposer; - uma façade pública
Composer.
- um owner host de baixo nível
- Nesta wave, o contrato de retorno de
composer.emit_spriteMUST permanecer umintcru. Gfx.set_spriteMUST ser removido integralmente da superfície normativa e executável do Studio.- O repositório MUST NOT manter alias, wrapper de compatibilidade, dual path, ou retargeting silencioso que preserve
Gfx.set_spritecomo API pública. @sdk:gfxMUST permanecer restrito às operações primitivas/overlay/backend-adjacent que continuarem pertencendo a esse domínio.composer.bind_scene,composer.unbind_sceneecomposer.set_cameraMUST permanecer fora do escopo de implementação desta decisão e SHALL ser adicionados depois por propagação separada, usando o mesmo padrão editorial.
Rationale
Esta decisão existe para eliminar um dual contract arquitetural que já deixou de ser válido no runtime.
Manter Gfx.set_sprite como superfície pública teria três efeitos ruins:
- preservaria o owner errado no contrato ensinado por PBS/stdlib;
- manteria dois modelos mentais concorrentes para a mesma operação;
- empurraria a remoção real do legado para um momento futuro mais caro e mais difícil.
O recorte sprite-only é deliberado.
Ele permite alinhar imediatamente a parte já necessária para o pipeline atual sem misturar:
- rollout de scene binding;
- rollout de camera control;
- ou trabalho de scene bank/editoria de assets.
Também ficou decidido que esta wave não tentará resolver modelagem de status com tipos editoriais novos.
O retorno cru int é suficiente para convergir o boundary agora, sem introduzir uma segunda mudança de API no mesmo passo.
Technical Specification
1. Stdlib Surface
O repositório MUST introduzir um módulo reservado @sdk:composer.
Esse módulo MUST:
- declarar
LowComposercom metadata canônicaHost(module = "composer", name = "emit_sprite", version = 1); - declarar a capability canônica correspondente;
- expor
Composer.emit_sprite(...)como façade pública; - usar o mesmo padrão estrutural já adotado por
@sdk:gfx.
O repositório MUST remover de @sdk:gfx:
- a declaração host
LowGfx.set_sprite(...); - a façade pública
Gfx.set_sprite(...); - qualquer export relacionado à operação pública antiga.
2. Compiler and PBS Propagation
As specs e implementações de PBS/compiler MUST passar a tratar @sdk:composer como a superfície canônica para sprite composition.
Isso inclui:
- examples normativos;
- exemplos de import;
- resolução de stdlib;
- fixtures e testes que verificam host metadata;
- testes que hoje afirmam
LowGfx/Gfx.set_sprite.
O lowering MUST emitir identidade canônica de host do domínio composer, não do domínio gfx, para sprite emission nesta wave.
3. Removal Rule
Gfx.set_sprite MUST ser tratado como removido, não como deprecated.
Consequências obrigatórias:
- código de teste antigo que use
Gfx.set_spriteMUST ser migrado; - fixtures e sample projects SHOULD ser migrados integralmente nesta wave sempre que estiverem dentro do repositório;
- docs MUST deixar de ensinar
Gfx.set_spritecomo caminho válido; - a implementação MUST NOT deixar fallback oculto para o caminho antigo.
4. Documentation Scope
As specs MUST documentar exatamente o que esta wave implementa:
@sdk:composerpara sprite emission;- remoção de
Gfx.set_sprite; - permanência de
@sdk:gfxpara primitivas/overlay relevantes.
As specs MUST NOT fingir que scene binding ou camera control já fazem parte desta wave no Studio.
Elas MAY mencionar que:
bind_scene,unbind_scene,set_camera
serão adicionados depois seguindo o mesmo padrão, mas sem tratá-los como parte implementada agora.
Constraints
- Esta decisão MUST ser tratada como normativa e locked até revisão explícita do usuário.
- Qualquer
planderivado dela MUST cobrir integralmente a criação de@sdk:composer, a propagação para specs/compiler/tests e a remoção total deGfx.set_sprite. - Nenhum
planouimplementpode reinterpretar esta decisão como “migrar só internamente” mantendo a API pública antiga. - Nenhum
planouimplementpode puxar scene bank, bind/unbind de scene ou camera para dentro deste ticket por conveniência. - Se surgir ambiguidade sobre assinatura exata de
emit_sprite, capability metadata, ou pontos concretos de propagação, o próximo estágio MUST esclarecer isso sem reabrir a remoção total do caminho antigo.
Revision Log
- 2026-04-18: Initial accepted decision from AGD-0031.