11 KiB
| id | ticket | title | status | created | resolved | decision | tags | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| AGD-0032 | system-os-lifecycle-process-task-contract | Agenda - SystemOS Lifecycle, Process and Task Contract | open | 2026-05-14 |
|
Agenda - SystemOS Lifecycle, Process and Task Contract
Contexto
Prometeu deu o primeiro passo concreto para deixar de ser apenas um firmware que roda cartuchos e passar a ter um modelo de sistema operacional de console.
Antes, o cartucho era representado quase exclusivamente pelo fluxo do firmware:
LoadCartridgeStep
-> initialize_vm
-> GameRunningStep / SystemRunningStep
Esse modelo permitia executar jogos e apps de sistema, mas não dava ao OS uma entidade própria para representar processo, task, foreground, background, suspensão, fechamento ou crash. O firmware sabia que algo estava rodando; o Prometeu OS ainda não possuía um contrato próprio de execução e presença de usuário.
Agora existe um SystemOS em prometeu-system, agregando:
SystemOS
VirtualMachineRuntime
ProcessManager
TaskManager
Isso estabelece uma fronteira importante: a VM continua sendo a VM, e não a dona
do sistema. O SystemOS passa a ser o lugar natural para concentrar serviços de
OS, lifecycle, permissões e coordenação entre execução técnica e experiência de
usuário.
Os conceitos iniciais são:
Process
execução técnica:
VmGame, VmShell, NativeShell
Task
presença navegável do usuário:
Game ou Shell em Foreground, Background, Suspended, Closed ou Crashed
O carregamento de cartucho começou a registrar entidades de sistema:
AppMode::Game
-> cria processo VmGame
-> cria task Game
-> marca task como Foreground
-> entra em GameRunningStep com TaskId
AppMode::System
-> cria processo VmShell
-> cria task Shell
-> marca task como Foreground
-> entra em SystemRunningStep com TaskId
GameRunningStep agora executa uma task específica e valida se ela ainda está em
Foreground antes de avançar o frame. Essa é a primeira ponte real entre o
firmware atual e um OS com lifecycle.
Problema
O código já tem os primeiros tipos e fluxos, mas o contrato arquitetural ainda não está fechado:
- quem é a autoridade para mover uma task entre
Foreground,Background,Suspended,ClosedeCrashed; - como
TaskStateeProcessStatedevem evoluir juntos; - quais transições pertencem ao
SystemOSe quais continuam nos managers internos; - como o firmware deve reagir quando uma task deixa de estar executável;
- quando o
WindowManagerdeixa de ser parte doPrometeuHube vira serviço real do OS; - se o nome público do perfil de sistema deve continuar
Systemou convergir paraShellno contrato de cartucho/runtime.
Sem esse contrato, o risco é o sistema crescer em duas direções ruins:
- o firmware continuar acumulando decisões de lifecycle que pertencem ao OS;
TaskManager,ProcessManager,PrometeuHubeVirtualMachineRuntimecriarem regras paralelas e inconsistentes.
Pontos Criticos
SystemOSdeve ser a API de coordenação de lifecycle, não apenas um struct agregador de managers.ProcessManagereTaskManagerdevem continuar guardando estado local, mas não devem, sozinhos, definir o contrato semântico completo entre task e processo.Taskrepresenta presença navegável e foco do usuário;Processrepresenta execução técnica.Foregroundnão é apenas uma flag visual: no modelo atual, ele autoriza oGameRunningStepa executar frame.Suspended,ClosedeCrashedprecisam moverTaskStateeProcessStatede forma coordenada.Backgroundprecisa ser distinguido deSuspended: background pode existir como presença navegável não focada, mas ainda não implica que o processo possa executar.PrometeuHubdeve evoluir para Shell/Home visual, não permanecer como sinônimo de OS.WindowManagerprovavelmente deve virar serviço deSystemOS, mas talvez isso precise esperar a primeira API de lifecycle estabilizar.- A inspiração de UX é console/Switch; a inspiração interna é mais Android-like: processos, tasks, lifecycle, surfaces/janelas, serviços e permissões.
Dependencia / Agenda Paralela
AGD-0033 trata a limpeza de ownership e layout de serviços do SystemOS antes
ou em paralelo a esta agenda.
Essa separação é intencional: AGD-0032 deve decidir lifecycle de
Task/Process, enquanto AGD-0033 deve decidir se VirtualMachineRuntime,
LogService, WindowManager e outros serviços pertencem ao root, ao Hub ou à
camada services do SystemOS.
Se AGD-0033 concluir que LogService e outros serviços precisam sair da VM
antes do lifecycle, a decisão de AGD-0032 deve tratar essa mudança como
pré-requisito de implementação, não como parte do contrato de lifecycle em si.
Opcoes
Opcao A - Manter lifecycle distribuido nos managers e no firmware
Abordagem:
TaskManager muda tasks, ProcessManager muda processos, e o firmware chama
ambos diretamente quando precisar.
Vantagens:
- menor mudança imediata;
- preserva managers simples;
- fácil de encaixar incrementalmente no código atual.
Custos / Riscos:
- espalha regra de lifecycle por vários chamadores;
- torna mais provável esquecer de mover
ProcessStatejunto comTaskState; - mantém firmware como conhecedor de detalhes internos do OS;
- dificulta introduzir Shell/Home, suspensão e retomada sem duplicação.
Manutenibilidade: Aceitável no curto prazo, fraca como modelo de OS.
Opcao B - Centralizar lifecycle no SystemOS
Abordagem:
SystemOS vira a API semântica para operações como:
suspend_task
resume_task
close_task
crash_task
foreground_task
background_task
Essas operações coordenam TaskManager e ProcessManager juntas.
Exemplos de contrato:
jogo rodando:
TaskState::Foreground
ProcessState::Running
jogo suspenso:
TaskState::Suspended
ProcessState::Suspended
jogo fechado:
TaskState::Closed
ProcessState::Stopped
jogo crashado:
TaskState::Crashed
ProcessState::Crashed
Vantagens:
- estabelece
SystemOScomo autoridade de lifecycle; - mantém firmware mais fino;
- reduz inconsistência entre task e processo;
- cria base natural para Home/Shell, suspend/resume, close/crash e permissões.
Custos / Riscos:
- exige definir transições inválidas e retorno/erro de cada operação;
- pode expor API cedo demais se tentarmos modelar todas as regras finais agora;
- precisa decidir se
Backgroundimplica processo running, suspended ou apenas presença não focada.
Manutenibilidade: Forte. É o caminho mais alinhado com transformar Prometeu em console OS.
Opcao C - Promover WindowManager a servico do OS antes do lifecycle
Abordagem:
Mover primeiro o WindowManager para dentro de SystemOS e depois organizar
tasks/processos em torno de janelas/surfaces.
Vantagens:
- aproxima rapidamente o modelo de Shell/Home e apps gerenciados;
- evita
PrometeuHubcontinuar parecendo o sistema inteiro; - abre caminho para surfaces e composição de apps de sistema.
Custos / Riscos:
- pode misturar lifecycle de execução com lifecycle visual;
- força decisões de janela/surface antes de fechar Process/Task;
- pode congelar um WindowManager ainda experimental.
Manutenibilidade: Boa como passo futuro, mas arriscada como próximo passo se o lifecycle base ainda não estiver normativo.
Sugestao / Recomendacao
A recomendação inicial é seguir a Opção B.
O próximo contrato deve declarar SystemOS como autoridade para lifecycle de
tasks e processos. TaskManager e ProcessManager continuam existindo, mas
devem ser mecanismos internos de armazenamento/transição, não a API semântica
principal do sistema.
O primeiro corte deve ser pequeno:
- adicionar métodos de lifecycle em
SystemOS; - coordenar
TaskStateeProcessStatenesses métodos; - definir comportamento para task inexistente e process inexistente;
- preservar
GameRunningStepcomo consumidor deTaskId, validando foreground; - evitar mover
WindowManagerneste mesmo corte.
O WindowManager deve ser a agenda/decisão seguinte: promovê-lo a serviço real
do sistema quando a base Task/Process/Lifecycle estiver fechada.
Também precisamos resolver a nomenclatura System versus Shell. O código e o
contrato anterior usam AppMode::System; a narrativa nova fala em
AppMode::Shell. A agenda deve decidir se:
- mantemos
AppMode::Systemcomo perfil formal e usamosShellcomo tipo de task/processo/UI; ou - renomeamos o perfil público para
Shell, com migração explícita.
Minha inclinação inicial é manter AppMode::System por compatibilidade de
contrato e usar Shell para a camada de UI/app gerenciado dentro do OS.
Perguntas em Aberto
SystemOSdeve exporsuspend_task,resume_task,close_taskecrash_taskjá no próximo corte?foreground_taskebackground_taskdevem ser operações explícitas doSystemOS, ou apenas detalhe doTaskManager?- Qual é a semântica exata de
Background: processo aindaRunning, processoSuspended, ou estado de presença sem garantia de execução? resume_taskdeve sempre mover a task paraForeground, ou pode retomar paraBackground?- O que acontece quando a task existe mas o processo associado não existe?
close_taskremove imediatamente entidades fechadas ou apenas marcaClosed/Stoppedpara coleta posterior?crash_taskdeve receber/armazenarCrashReport, ou isso fica em outro serviço de diagnóstico?GameRunningStepdeve transicionar para Hub/Home quando sua task deixa de estarForeground, ou apenas não executar frame?- O perfil de manifesto continua
AppMode::System, ou abrimos uma migração formal paraAppMode::Shell? - A decisão de ownership/layout em
AGD-0033deve ser pré-requisito para o primeiro plan de lifecycle, ou pode ser executada em paralelo?
Criterio para Encerrar
Esta agenda pode virar decisão quando houver resposta para:
- qual entidade é autoridade normativa de lifecycle;
- quais métodos mínimos entram no primeiro contrato de
SystemOS; - como cada método move
TaskStateeProcessState; - qual semântica inicial de
BackgroundeSuspended; - como o firmware deve reagir a task não-foreground/não-executável;
- qual nomenclatura será usada para
SystemversusShell; - como a dependência com
AGD-0033será tratada nos plans.
Proximo Passo
Revisar esta agenda e fechar as perguntas principais. Se a direção for aceita,
o próximo estágio deve ser uma decisão normativa para SystemOS como autoridade
de lifecycle de Task/Process, seguida de uma família curta de plans para
implementação.