303 lines
11 KiB
Markdown
303 lines
11 KiB
Markdown
---
|
|
id: AGD-0032
|
|
ticket: system-os-lifecycle-process-task-contract
|
|
title: Agenda - SystemOS Lifecycle, Process and Task Contract
|
|
status: open
|
|
created: 2026-05-14
|
|
resolved:
|
|
decision:
|
|
tags: [runtime, os, lifecycle, process, task, shell, firmware]
|
|
---
|
|
|
|
# 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:
|
|
|
|
```text
|
|
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:
|
|
|
|
```text
|
|
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:
|
|
|
|
```text
|
|
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:
|
|
|
|
```text
|
|
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`, `Closed` e `Crashed`;
|
|
- como `TaskState` e `ProcessState` devem evoluir juntos;
|
|
- quais transições pertencem ao `SystemOS` e quais continuam nos managers
|
|
internos;
|
|
- como o firmware deve reagir quando uma task deixa de estar executável;
|
|
- quando o `WindowManager` deixa de ser parte do `PrometeuHub` e vira serviço
|
|
real do OS;
|
|
- se o nome público do perfil de sistema deve continuar `System` ou convergir
|
|
para `Shell` no contrato de cartucho/runtime.
|
|
|
|
Sem esse contrato, o risco é o sistema crescer em duas direções ruins:
|
|
|
|
1. o firmware continuar acumulando decisões de lifecycle que pertencem ao OS;
|
|
2. `TaskManager`, `ProcessManager`, `PrometeuHub` e `VirtualMachineRuntime`
|
|
criarem regras paralelas e inconsistentes.
|
|
|
|
## Pontos Criticos
|
|
|
|
- `SystemOS` deve ser a API de coordenação de lifecycle, não apenas um struct
|
|
agregador de managers.
|
|
- `ProcessManager` e `TaskManager` devem continuar guardando estado local, mas
|
|
não devem, sozinhos, definir o contrato semântico completo entre task e
|
|
processo.
|
|
- `Task` representa presença navegável e foco do usuário; `Process` representa
|
|
execução técnica.
|
|
- `Foreground` não é apenas uma flag visual: no modelo atual, ele autoriza o
|
|
`GameRunningStep` a executar frame.
|
|
- `Suspended`, `Closed` e `Crashed` precisam mover `TaskState` e `ProcessState`
|
|
de forma coordenada.
|
|
- `Background` precisa ser distinguido de `Suspended`: background pode existir
|
|
como presença navegável não focada, mas ainda não implica que o processo possa
|
|
executar.
|
|
- `PrometeuHub` deve evoluir para Shell/Home visual, não permanecer como
|
|
sinônimo de OS.
|
|
- `WindowManager` provavelmente deve virar serviço de `SystemOS`, 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 `ProcessState` junto com `TaskState`;
|
|
- 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:
|
|
|
|
```text
|
|
suspend_task
|
|
resume_task
|
|
close_task
|
|
crash_task
|
|
foreground_task
|
|
background_task
|
|
```
|
|
|
|
Essas operações coordenam `TaskManager` e `ProcessManager` juntas.
|
|
|
|
Exemplos de contrato:
|
|
|
|
```text
|
|
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 `SystemOS` como 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 `Background` implica 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 `PrometeuHub` continuar 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 `TaskState` e `ProcessState` nesses métodos;
|
|
- definir comportamento para task inexistente e process inexistente;
|
|
- preservar `GameRunningStep` como consumidor de `TaskId`, validando
|
|
foreground;
|
|
- evitar mover `WindowManager` neste 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::System` como perfil formal e usamos `Shell` como 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
|
|
|
|
- [ ] `SystemOS` deve expor `suspend_task`, `resume_task`, `close_task` e
|
|
`crash_task` já no próximo corte?
|
|
- [ ] `foreground_task` e `background_task` devem ser operações explícitas do
|
|
`SystemOS`, ou apenas detalhe do `TaskManager`?
|
|
- [ ] Qual é a semântica exata de `Background`: processo ainda `Running`,
|
|
processo `Suspended`, ou estado de presença sem garantia de execução?
|
|
- [ ] `resume_task` deve sempre mover a task para `Foreground`, ou pode retomar
|
|
para `Background`?
|
|
- [ ] O que acontece quando a task existe mas o processo associado não existe?
|
|
- [ ] `close_task` remove imediatamente entidades fechadas ou apenas marca
|
|
`Closed`/`Stopped` para coleta posterior?
|
|
- [ ] `crash_task` deve receber/armazenar `CrashReport`, ou isso fica em outro
|
|
serviço de diagnóstico?
|
|
- [ ] `GameRunningStep` deve transicionar para Hub/Home quando sua task deixa de
|
|
estar `Foreground`, ou apenas não executar frame?
|
|
- [ ] O perfil de manifesto continua `AppMode::System`, ou abrimos uma migração
|
|
formal para `AppMode::Shell`?
|
|
- [ ] A decisão de ownership/layout em `AGD-0033` deve 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 `TaskState` e `ProcessState`;
|
|
- qual semântica inicial de `Background` e `Suspended`;
|
|
- como o firmware deve reagir a task não-foreground/não-executável;
|
|
- qual nomenclatura será usada para `System` versus `Shell`;
|
|
- como a dependência com `AGD-0033` será 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.
|