204 lines
7.7 KiB
Markdown
204 lines
7.7 KiB
Markdown
---
|
|
id: DEC-0025
|
|
ticket: system-os-lifecycle-process-task-contract
|
|
title: SystemOS Lifecycle Authority for Tasks and Processes
|
|
status: accepted
|
|
created: 2026-05-15
|
|
ref_agenda: AGD-0032
|
|
tags: [runtime, os, lifecycle, process, task, shell, firmware]
|
|
---
|
|
|
|
## Status
|
|
|
|
Accepted. Esta decisão foi aceita em 2026-05-15 e passa a ser referência
|
|
normativa para a primeira wave de lifecycle de `Task` e `Process` no
|
|
`SystemOS`.
|
|
|
|
## Contexto
|
|
|
|
`SystemOS` já agrega serviços centrais do Prometeu OS, incluindo runtime VM,
|
|
processos e tasks. A arquitetura anterior ainda permitia que firmware,
|
|
`TaskManager` e `ProcessManager` decidissem transições de lifecycle de forma
|
|
distribuída.
|
|
|
|
Esse arranjo é insuficiente para um console OS: `Task` representa presença
|
|
navegável e experiência do usuário, enquanto `Process` representa execução
|
|
técnica. Essas duas dimensões precisam mudar juntas por uma autoridade
|
|
semântica única.
|
|
|
|
`DEC-0024` já separou ownership/layout de serviços do `SystemOS`. Esta decisão
|
|
é focada apenas em lifecycle de `Task`/`Process` e não reabre a migração de
|
|
serviços, `WindowManager`, Hub ou ownership da VM.
|
|
|
|
`AppMode::System` já foi renomeado para `AppMode::Shell`. O contrato público
|
|
fica:
|
|
|
|
- `AppMode::Game`: cartucho executado como jogo/session fullscreen.
|
|
- `AppMode::Shell`: cartucho executado como app gerenciado pela Shell do
|
|
Prometeu OS.
|
|
|
|
## Decisao
|
|
|
|
`SystemOS` SHALL ser a autoridade normativa de lifecycle para `Task` e
|
|
`Process`.
|
|
|
|
`TaskManager` e `ProcessManager` SHALL continuar existindo como mecanismos
|
|
internos de armazenamento e transição local, mas MUST NOT ser a API semântica
|
|
principal para lifecycle coordenado. Firmware e outros chamadores MUST delegate
|
|
transições semânticas de lifecycle para `SystemOS`.
|
|
|
|
A primeira wave de lifecycle SHALL expor o contrato mínimo:
|
|
|
|
```text
|
|
set_foreground_task(task_id)
|
|
suspend_task(task_id)
|
|
resume_task(task_id)
|
|
close_task(task_id)
|
|
crash_task(task_id, report?)
|
|
```
|
|
|
|
Essas operações SHALL coordenar `TaskState` e `ProcessState` juntos.
|
|
|
|
O mapeamento normativo inicial SHALL ser:
|
|
|
|
```text
|
|
TaskState::Foreground -> ProcessState::Running
|
|
TaskState::Suspended -> ProcessState::Suspended
|
|
TaskState::Closed -> ProcessState::Stopped
|
|
TaskState::Crashed -> ProcessState::Crashed
|
|
```
|
|
|
|
`Background` SHALL remain reserved and MUST NOT guide any public lifecycle API
|
|
in the first wave.
|
|
|
|
`resume_task` SHALL mean resuming active user-perceived execution. In this first
|
|
wave, it MUST move a suspended task to `TaskState::Foreground` and its associated
|
|
process to `ProcessState::Running`.
|
|
|
|
`close_task` SHALL mark task/process state only. It MUST NOT remove task or
|
|
process entities immediately. Collection of closed/stopped entities is a future
|
|
separate operation.
|
|
|
|
`crash_task` SHALL be the semantic crash operation for a task. The first wave MAY
|
|
only coordinate `TaskState::Crashed` and `ProcessState::Crashed`, but the
|
|
signature SHOULD either accept or remain compatible with a future `CrashReport`
|
|
handoff to diagnostics/logging.
|
|
|
|
`GameRunningStep` SHALL keep the strong invariant that an active game execution
|
|
step only supports a game task in `TaskState::Foreground`. In this wave, any
|
|
non-foreground game task observed by `GameRunningStep` is invalid and should
|
|
produce clear diagnostic/crash behavior rather than silently running frames.
|
|
|
|
## Rationale
|
|
|
|
Centralizing lifecycle in `SystemOS` prevents firmware from becoming the de
|
|
facto OS policy layer. Firmware should remain a boot/execution state machine; it
|
|
should not know how to update `TaskState` and `ProcessState` in lockstep.
|
|
|
|
Keeping `TaskManager` and `ProcessManager` as internal mechanisms preserves
|
|
simple storage and local transition responsibilities while giving the OS a
|
|
single semantic boundary for suspend, resume, close, crash and foreground
|
|
selection.
|
|
|
|
Leaving `Background` out of the first wave avoids freezing an incomplete model
|
|
for docked apps, background services, non-focused shell apps or capability-gated
|
|
execution. The reserved enum state can remain, but no normative public lifecycle
|
|
API should depend on it yet.
|
|
|
|
Making `resume_task` return to `Foreground` keeps the first contract simple and
|
|
matches the user-perceived meaning of resume. Future background wake/service
|
|
semantics should be introduced as separate concepts rather than overloading
|
|
`resume_task`.
|
|
|
|
Marking closed/stopped entities instead of removing them immediately preserves
|
|
room for diagnostics, crash handling, system UI history and later collection
|
|
policy.
|
|
|
|
## Invariantes / Contrato
|
|
|
|
- `SystemOS` MUST coordinate lifecycle operations that affect both task and
|
|
process state.
|
|
- Firmware MUST NOT call separate task/process manager transitions to implement
|
|
semantic lifecycle operations such as suspend, resume, close or crash.
|
|
- `set_foreground_task(task_id)` MUST set the task to `TaskState::Foreground`
|
|
and its associated process to `ProcessState::Running`.
|
|
- `suspend_task(task_id)` MUST set the task to `TaskState::Suspended` and its
|
|
associated process to `ProcessState::Suspended`.
|
|
- `resume_task(task_id)` MUST move from suspended user-visible execution back to
|
|
foreground execution: `TaskState::Foreground` and `ProcessState::Running`.
|
|
- `close_task(task_id)` MUST set `TaskState::Closed` and
|
|
`ProcessState::Stopped`.
|
|
- `crash_task(task_id, report?)` MUST set `TaskState::Crashed` and
|
|
`ProcessState::Crashed`.
|
|
- A missing task MUST return a typed lifecycle error such as
|
|
`LifecycleError::TaskNotFound(TaskId)`.
|
|
- A task whose associated process is missing MUST return a typed lifecycle error
|
|
such as `LifecycleError::ProcessNotFound(ProcessId)`.
|
|
- Invalid lifecycle transitions SHOULD return a typed error carrying the task,
|
|
source state and requested operation.
|
|
- `Background` MUST NOT have normative first-wave semantics.
|
|
- This decision MUST NOT move `WindowManager`, redesign `PrometeuHub`, introduce
|
|
background services, implement docking, implement app switching, or make
|
|
`ProcessManager` own the VM.
|
|
|
|
The expected first-wave error shape is:
|
|
|
|
```rust
|
|
pub enum LifecycleError {
|
|
TaskNotFound(TaskId),
|
|
ProcessNotFound(ProcessId),
|
|
InvalidTransition {
|
|
task_id: TaskId,
|
|
from: TaskState,
|
|
operation: LifecycleOperation,
|
|
},
|
|
}
|
|
```
|
|
|
|
`LifecycleOperation` SHOULD identify at least:
|
|
|
|
```text
|
|
SetForeground
|
|
Suspend
|
|
Resume
|
|
Close
|
|
Crash
|
|
```
|
|
|
|
## Impactos
|
|
|
|
- `prometeu-system` must expose lifecycle methods on `SystemOS`.
|
|
- `TaskManager` and `ProcessManager` may need smaller internal transition
|
|
helpers, but not public semantic ownership of lifecycle.
|
|
- Firmware code should call `system_os.suspend_task(...)`,
|
|
`system_os.resume_task(...)`, `system_os.close_task(...)`,
|
|
`system_os.crash_task(...)` and `system_os.set_foreground_task(...)` instead
|
|
of coordinating task/process managers directly.
|
|
- Tests should move lifecycle assertions to the `SystemOS` level.
|
|
- Specs do not need to change before the first code plan unless the lifecycle
|
|
API is promoted to a public external contract.
|
|
- `DEC-0024` remains valid and complementary; ownership/layout work can execute
|
|
in parallel and does not block this first lifecycle wave.
|
|
|
|
## Referencias
|
|
|
|
- Agenda: `AGD-0032`
|
|
- Related decision: `DEC-0024`
|
|
|
|
## Propagacao Necessaria
|
|
|
|
- Plan: create `PLAN-0032-A: SystemOS Lifecycle API`.
|
|
- Code: update `prometeu-system` `SystemOS`, task/process lifecycle helpers,
|
|
firmware callsites if they currently coordinate managers directly, and unit
|
|
tests.
|
|
- Tests: add unit coverage for successful lifecycle mappings, missing task,
|
|
missing process and invalid transition handling.
|
|
- Discussion: keep `Background` reserved for a future agenda covering dock,
|
|
services, non-focused shell apps and capability-gated execution.
|
|
- Learn: after implementation is complete, write or update lessons only from the
|
|
published state.
|
|
|
|
## Revisao
|
|
|
|
- 2026-05-15: Initial accepted decision from `AGD-0032`.
|