prometeu-runtime/discussion/workflow/decisions/DEC-0040-hub-suspended-game-kill-affordance.md

74 lines
3.8 KiB
Markdown

---
id: DEC-0040
ticket: hub-suspended-game-kill-affordance
title: Hub Suspended Game Kill Affordance
status: accepted
created: 2026-07-05
ref_agenda: AGD-0047
tags: [hub, lifecycle, game, ui]
---
## Context
O Hub pode ficar ativo enquanto existe um jogo `Game` residente/suspenso apos Home/ESC. Esse estado e intencional para retomada, mas hoje nao fica visivel o suficiente e nao ha uma acao direta no Hub para matar o jogo sem iniciar outro cartridge.
A troca de cartridges ja encerra a VM anterior antes de carregar o proximo jogo. Esta decision define o affordance manual equivalente no Hub.
## Decision
O Hub MUST exibir um indicador de jogo suspenso quando houver exatamente um jogo `Game` residente/suspenso associado ao lifecycle do SystemOS.
O indicador MUST:
- aparecer somente para jogos do perfil `Game`;
- mostrar somente o nome/titulo do jogo suspenso;
- ficar no canto inferior direito do Hub;
- ser apresentado como uma caixa vermelha;
- funcionar como controle destrutivo: um clique MUST matar imediatamente o jogo suspenso;
- desaparecer no mesmo fluxo em que o jogo deixa de ser residente.
O clique no indicador MUST reutilizar o mesmo caminho de encerramento de jogo residente usado pelo cartridge switching. A implementacao MUST NOT criar um segundo caminho parcial de cleanup.
Ao matar o jogo pelo Hub, o runtime MUST limpar o estado pertencente ao jogo residente:
- task/process lifecycle;
- VM session;
- resident game state;
- render ownership retornando ao Shell/Hub;
- game audio pause/lifecycle state;
- Game2D composer binding/cache state;
- cartridge asset manager state and physical memory banks associated with the resident game.
O Hub MUST permanecer no Hub apos a acao. O jogo morto MUST NOT ser retomavel depois do kill. A acao MUST emitir um log `INFO` explicito, com source `HUB` ou `POS`, equivalente a `Resident game killed from Hub: <title>`.
Nao havera confirmacao ou segundo clique nesta versao. A cor vermelha e a posicao dedicada sao o affordance de acao destrutiva.
## Rationale
O fluxo aprovado privilegia simplicidade operacional. A intencao do controle e fechar uma VM suspensa rapidamente, sem iniciar outro jogo apenas para forcar o encerramento do anterior.
Limitar a UI a jogos `Game` evita misturar semantics de shell/system apps com cartridge runtime. Reusar o caminho de termination existente reduz risco de divergencia entre "kill por troca de cartridge" e "kill manual pelo Hub", especialmente apos os bugs recentes envolvendo scene/glyph/assets residuais.
O kill imediato e aceitavel porque o controle e vermelho, posicionado como acao especifica, e opera sobre um jogo que ja esta fora do primeiro plano. Se futuramente houver save-state persistente ou risco maior de perda de progresso, uma nova decision pode revisar este contrato para confirmacao em dois passos.
## Implications
- O Hub precisa consultar estado de jogo residente/suspenso de forma explicita.
- A camada de lifecycle precisa expor uma operacao clara de matar jogo residente sem carregar outro cartridge.
- O cleanup manual precisa ter a mesma abrangencia do cleanup usado por switch.
- O render/presentation state nao pode continuar apontando para ownership/frame do jogo morto.
- Testes devem provar que o indicador aparece, que o clique mata, e que o jogo nao pode ser retomado depois.
## Propagation Targets
- specs: atualizar contrato de Hub/lifecycle se houver spec canonica aplicavel.
- plans: criar plano de execucao para UI do Hub, facade/lifecycle kill e testes.
- code: `prometeu_hub`, firmware/lifecycle facade, runtime cleanup, render/audio/assets cleanup conforme necessario.
- tests: Hub rendering/click hitbox, lifecycle termination, switch-vs-manual cleanup equivalence, no-resume-after-kill.
- docs: registrar lesson apenas apos execucao publicada.
## References
- Agenda: AGD-0047
- Related: DSC-0043 / DEC-0039 cartridge switch orchestrator