housekeeping
All checks were successful
Intrepid/Prometeu/Runtime/pipeline/head This commit looks good
All checks were successful
Intrepid/Prometeu/Runtime/pipeline/head This commit looks good
This commit is contained in:
parent
a0601fe816
commit
15615f3b54
@ -1,4 +1,4 @@
|
|||||||
{"type":"meta","next_id":{"DSC":35,"AGD":35,"DEC":27,"PLN":59,"LSN":41,"CLSN":1}}
|
{"type":"meta","next_id":{"DSC":35,"AGD":35,"DEC":27,"PLN":59,"LSN":43,"CLSN":1}}
|
||||||
{"type":"discussion","id":"DSC-0034","status":"in_progress","ticket":"system-os-domain-facades","title":"Agenda - SystemOS Domain Facades","created_at":"2026-05-15","updated_at":"2026-05-15","tags":["runtime","os","services","api-surface","lifecycle","fs"],"agendas":[{"id":"AGD-0034","file":"AGD-0034-agenda-systemos-domain-facades.md","status":"accepted","created_at":"2026-05-15","updated_at":"2026-05-15"}],"decisions":[{"id":"DEC-0026","file":"DEC-0026-systemos-domain-facades.md","status":"accepted","created_at":"2026-05-15","updated_at":"2026-05-15","ref_agenda":"AGD-0034"}],"plans":[{"id":"PLN-0058","file":"PLN-0058-systemos-domain-facades-first-wave.md","status":"open","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0026"]}],"lessons":[]}
|
{"type":"discussion","id":"DSC-0034","status":"in_progress","ticket":"system-os-domain-facades","title":"Agenda - SystemOS Domain Facades","created_at":"2026-05-15","updated_at":"2026-05-15","tags":["runtime","os","services","api-surface","lifecycle","fs"],"agendas":[{"id":"AGD-0034","file":"AGD-0034-agenda-systemos-domain-facades.md","status":"accepted","created_at":"2026-05-15","updated_at":"2026-05-15"}],"decisions":[{"id":"DEC-0026","file":"DEC-0026-systemos-domain-facades.md","status":"accepted","created_at":"2026-05-15","updated_at":"2026-05-15","ref_agenda":"AGD-0034"}],"plans":[{"id":"PLN-0058","file":"PLN-0058-systemos-domain-facades-first-wave.md","status":"open","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0026"]}],"lessons":[]}
|
||||||
{"type":"discussion","id":"DSC-0023","status":"done","ticket":"perf-full-migration-to-atomic-telemetry","title":"Agenda - [PERF] Full Migration to Atomic Telemetry","created_at":"2026-04-10","updated_at":"2026-04-10","tags":["perf","runtime","telemetry"],"agendas":[{"id":"AGD-0021","file":"AGD-0021-full-migration-to-atomic-telemetry.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}],"decisions":[{"id":"DEC-0008","file":"DEC-0008-full-migration-to-atomic-telemetry.md","status":"accepted","created_at":"2026-04-10","updated_at":"2026-04-10"}],"plans":[{"id":"PLN-0007","file":"PLN-0007-full-migration-to-atomic-telemetry.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}],"lessons":[{"id":"LSN-0028","file":"discussion/lessons/DSC-0023-perf-full-migration-to-atomic-telemetry/LSN-0028-converging-to-single-atomic-telemetry-source.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}]}
|
{"type":"discussion","id":"DSC-0023","status":"done","ticket":"perf-full-migration-to-atomic-telemetry","title":"Agenda - [PERF] Full Migration to Atomic Telemetry","created_at":"2026-04-10","updated_at":"2026-04-10","tags":["perf","runtime","telemetry"],"agendas":[{"id":"AGD-0021","file":"AGD-0021-full-migration-to-atomic-telemetry.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}],"decisions":[{"id":"DEC-0008","file":"DEC-0008-full-migration-to-atomic-telemetry.md","status":"accepted","created_at":"2026-04-10","updated_at":"2026-04-10"}],"plans":[{"id":"PLN-0007","file":"PLN-0007-full-migration-to-atomic-telemetry.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}],"lessons":[{"id":"LSN-0028","file":"discussion/lessons/DSC-0023-perf-full-migration-to-atomic-telemetry/LSN-0028-converging-to-single-atomic-telemetry-source.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}]}
|
||||||
{"type":"discussion","id":"DSC-0020","status":"done","ticket":"jenkins-gitea-integration","title":"Jenkins Gitea Integration and Relocation","created_at":"2026-04-07","updated_at":"2026-04-07","tags":["ci","jenkins","gitea"],"agendas":[{"id":"AGD-0018","file":"AGD-0018-jenkins-gitea-integration-and-relocation.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}],"decisions":[{"id":"DEC-0003","file":"DEC-0003-jenkins-gitea-strategy.md","status":"accepted","created_at":"2026-04-07","updated_at":"2026-04-07"}],"plans":[{"id":"PLN-0003","file":"PLN-0003-jenkins-gitea-execution.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}],"lessons":[{"id":"LSN-0021","file":"discussion/lessons/DSC-0020-jenkins-gitea-integration/LSN-0021-jenkins-gitea-integration.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}]}
|
{"type":"discussion","id":"DSC-0020","status":"done","ticket":"jenkins-gitea-integration","title":"Jenkins Gitea Integration and Relocation","created_at":"2026-04-07","updated_at":"2026-04-07","tags":["ci","jenkins","gitea"],"agendas":[{"id":"AGD-0018","file":"AGD-0018-jenkins-gitea-integration-and-relocation.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}],"decisions":[{"id":"DEC-0003","file":"DEC-0003-jenkins-gitea-strategy.md","status":"accepted","created_at":"2026-04-07","updated_at":"2026-04-07"}],"plans":[{"id":"PLN-0003","file":"PLN-0003-jenkins-gitea-execution.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}],"lessons":[{"id":"LSN-0021","file":"discussion/lessons/DSC-0020-jenkins-gitea-integration/LSN-0021-jenkins-gitea-integration.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}]}
|
||||||
@ -31,5 +31,5 @@
|
|||||||
{"type":"discussion","id":"DSC-0019","status":"done","ticket":"jenkinsfile-correction","title":"Jenkinsfile Correction and Relocation","created_at":"2026-04-07","updated_at":"2026-04-07","tags":["ci","jenkins"],"agendas":[{"id":"AGD-0017","file":"AGD-0017-jenkinsfile-correction.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}],"decisions":[{"id":"DEC-0002","file":"DEC-0002-jenkinsfile-strategy.md","status":"accepted","created_at":"2026-04-07","updated_at":"2026-04-07"}],"plans":[{"id":"PLN-0002","file":"PLN-0002-jenkinsfile-execution.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}],"lessons":[{"id":"LSN-0020","file":"discussion/lessons/DSC-0019-jenkins-ci-standardization/LSN-0020-jenkins-standard-relocation.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}]}
|
{"type":"discussion","id":"DSC-0019","status":"done","ticket":"jenkinsfile-correction","title":"Jenkinsfile Correction and Relocation","created_at":"2026-04-07","updated_at":"2026-04-07","tags":["ci","jenkins"],"agendas":[{"id":"AGD-0017","file":"AGD-0017-jenkinsfile-correction.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}],"decisions":[{"id":"DEC-0002","file":"DEC-0002-jenkinsfile-strategy.md","status":"accepted","created_at":"2026-04-07","updated_at":"2026-04-07"}],"plans":[{"id":"PLN-0002","file":"PLN-0002-jenkinsfile-execution.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}],"lessons":[{"id":"LSN-0020","file":"discussion/lessons/DSC-0019-jenkins-ci-standardization/LSN-0020-jenkins-standard-relocation.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}]}
|
||||||
{"type":"discussion","id":"DSC-0030","status":"done","ticket":"internal-viewport-270p","title":"Agenda - Internal Viewport 270p (480x270)","created_at":"2026-04-27","updated_at":"2026-04-28","tags":["gfx","runtime","viewport","resolution","frame-composer","host"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0039","file":"discussion/lessons/DSC-0030-internal-viewport-270p/LSN-0039-resolution-baseline-changes-are-runtime-wide-contracts.md","status":"done","created_at":"2026-04-28","updated_at":"2026-04-28"}]}
|
{"type":"discussion","id":"DSC-0030","status":"done","ticket":"internal-viewport-270p","title":"Agenda - Internal Viewport 270p (480x270)","created_at":"2026-04-27","updated_at":"2026-04-28","tags":["gfx","runtime","viewport","resolution","frame-composer","host"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0039","file":"discussion/lessons/DSC-0030-internal-viewport-270p/LSN-0039-resolution-baseline-changes-are-runtime-wide-contracts.md","status":"done","created_at":"2026-04-28","updated_at":"2026-04-28"}]}
|
||||||
{"type":"discussion","id":"DSC-0031","status":"done","ticket":"runtime-mode-separation-game-system","title":"Agenda - Runtime Mode Separation: Game and System","created_at":"2026-05-11","updated_at":"2026-05-14","tags":["runtime","firmware","hub","system-apps","game-mode","scheduler"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0040","file":"discussion/lessons/DSC-0031-runtime-mode-separation-game-system/LSN-0040-system-pipeline-separation.md","status":"done","created_at":"2026-05-14","updated_at":"2026-05-14"}]}
|
{"type":"discussion","id":"DSC-0031","status":"done","ticket":"runtime-mode-separation-game-system","title":"Agenda - Runtime Mode Separation: Game and System","created_at":"2026-05-11","updated_at":"2026-05-14","tags":["runtime","firmware","hub","system-apps","game-mode","scheduler"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0040","file":"discussion/lessons/DSC-0031-runtime-mode-separation-game-system/LSN-0040-system-pipeline-separation.md","status":"done","created_at":"2026-05-14","updated_at":"2026-05-14"}]}
|
||||||
{"type":"discussion","id":"DSC-0032","status":"in_progress","ticket":"system-os-lifecycle-process-task-contract","title":"Agenda - SystemOS Lifecycle, Process and Task Contract","created_at":"2026-05-14","updated_at":"2026-05-15","tags":["runtime","os","lifecycle","process","task","shell","firmware"],"agendas":[{"id":"AGD-0032","file":"AGD-0032-system-os-lifecycle-process-task-contract.md","status":"accepted","created_at":"2026-05-14","updated_at":"2026-05-15"}],"decisions":[{"id":"DEC-0025","file":"DEC-0025-systemos-lifecycle-authority-for-tasks-and-processes.md","status":"accepted","created_at":"2026-05-15","updated_at":"2026-05-15","ref_agenda":"AGD-0032"}],"plans":[{"id":"PLN-0055","file":"PLN-0055-systemos-lifecycle-core-api.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0025"]},{"id":"PLN-0056","file":"PLN-0056-firmware-lifecycle-delegation.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0025"]},{"id":"PLN-0057","file":"PLN-0057-lifecycle-tests-and-invariants.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0025"]}],"lessons":[]}
|
{"type":"discussion","id":"DSC-0032","status":"done","ticket":"system-os-lifecycle-process-task-contract","title":"Agenda - SystemOS Lifecycle, Process and Task Contract","created_at":"2026-05-14","updated_at":"2026-05-15","tags":["runtime","os","lifecycle","process","task","shell","firmware"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0041","file":"discussion/lessons/DSC-0032-system-os-lifecycle-process-task-contract/LSN-0041-systemos-lifecycle-authority.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15"}]}
|
||||||
{"type":"discussion","id":"DSC-0033","status":"in_progress","ticket":"system-os-service-ownership-and-module-layout","title":"Agenda - SystemOS Service Ownership and Module Layout","created_at":"2026-05-14","updated_at":"2026-05-14","tags":["runtime","os","services","module-layout","vm","window-manager","logging"],"agendas":[{"id":"AGD-0033","file":"AGD-0033-system-os-service-ownership-and-module-layout.md","status":"accepted","created_at":"2026-05-14","updated_at":"2026-05-14"}],"decisions":[{"id":"DEC-0024","file":"DEC-0024-systemos-service-ownership-and-module-layout.md","status":"accepted","created_at":"2026-05-14","updated_at":"2026-05-14","ref_agenda":"AGD-0033"}],"plans":[{"id":"PLN-0051","file":"PLN-0051-move-vm-runtime-into-services.md","status":"done","created_at":"2026-05-14","updated_at":"2026-05-14","ref_decisions":["DEC-0024"]},{"id":"PLN-0052","file":"PLN-0052-promote-window-manager-to-systemos-service.md","status":"done","created_at":"2026-05-14","updated_at":"2026-05-14","ref_decisions":["DEC-0024"]},{"id":"PLN-0053","file":"PLN-0053-move-logging-ownership-to-systemos.md","status":"done","created_at":"2026-05-14","updated_at":"2026-05-14","ref_decisions":["DEC-0024"]},{"id":"PLN-0054","file":"PLN-0054-move-fs-and-memcard-ownership-to-systemos.md","status":"done","created_at":"2026-05-14","updated_at":"2026-05-14","ref_decisions":["DEC-0024"]}],"lessons":[]}
|
{"type":"discussion","id":"DSC-0033","status":"done","ticket":"system-os-service-ownership-and-module-layout","title":"Agenda - SystemOS Service Ownership and Module Layout","created_at":"2026-05-14","updated_at":"2026-05-15","tags":["runtime","os","services","module-layout","vm","window-manager","logging"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0042","file":"discussion/lessons/DSC-0033-system-os-service-ownership-and-module-layout/LSN-0042-systemos-service-ownership-boundary.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15"}]}
|
||||||
|
|||||||
@ -0,0 +1,95 @@
|
|||||||
|
---
|
||||||
|
id: LSN-0041
|
||||||
|
ticket: system-os-lifecycle-process-task-contract
|
||||||
|
title: SystemOS Lifecycle Authority
|
||||||
|
created: 2026-05-15
|
||||||
|
tags: [runtime, os, lifecycle, process, task, firmware]
|
||||||
|
---
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
Prometeu moved from firmware-driven cartridge execution toward a console OS
|
||||||
|
model with explicit tasks and processes. That created two related but distinct
|
||||||
|
state dimensions:
|
||||||
|
|
||||||
|
- `TaskState`: user-visible presence and navigation.
|
||||||
|
- `ProcessState`: technical execution.
|
||||||
|
|
||||||
|
Letting firmware, `TaskManager`, and `ProcessManager` each mutate those states
|
||||||
|
independently would make suspend, resume, close and crash behavior drift over
|
||||||
|
time.
|
||||||
|
|
||||||
|
## Key Decisions
|
||||||
|
|
||||||
|
### SystemOS owns lifecycle semantics
|
||||||
|
|
||||||
|
**What:** `SystemOS` became the semantic lifecycle authority for task/process
|
||||||
|
coordination. `TaskManager` and `ProcessManager` remain storage and simple
|
||||||
|
transition mechanisms, not the public lifecycle policy boundary.
|
||||||
|
|
||||||
|
**Why:** Lifecycle operations must update user-visible and technical execution
|
||||||
|
state together. A firmware call sequence like "mark task suspended, then mark
|
||||||
|
process suspended" is too easy to duplicate, forget or partially apply.
|
||||||
|
|
||||||
|
**Trade-offs:** This adds an OS-level API layer, but it keeps lifecycle policy
|
||||||
|
in one place and makes future suspend/resume behavior easier to reason about.
|
||||||
|
|
||||||
|
### The first lifecycle wave is intentionally small
|
||||||
|
|
||||||
|
**What:** The first wave covers only foreground, suspend, resume, close and
|
||||||
|
crash:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Foreground -> Running
|
||||||
|
Suspended -> Suspended
|
||||||
|
Closed -> Stopped
|
||||||
|
Crashed -> Crashed
|
||||||
|
```
|
||||||
|
|
||||||
|
`Background` remains reserved and non-normative.
|
||||||
|
|
||||||
|
**Why:** Background execution has unresolved implications around docked apps,
|
||||||
|
services, app switching and capabilities. Keeping it out of the first contract
|
||||||
|
prevents premature semantics from leaking into firmware and tests.
|
||||||
|
|
||||||
|
**Trade-offs:** The model cannot yet express every desired app lifecycle state,
|
||||||
|
but it gives the runtime a stable base without freezing background behavior too
|
||||||
|
early.
|
||||||
|
|
||||||
|
## Patterns and Algorithms
|
||||||
|
|
||||||
|
Use `SystemOS` operations for semantic lifecycle changes:
|
||||||
|
|
||||||
|
```text
|
||||||
|
set_foreground_task
|
||||||
|
suspend_task
|
||||||
|
resume_task
|
||||||
|
close_task
|
||||||
|
crash_task
|
||||||
|
```
|
||||||
|
|
||||||
|
Each operation should resolve the task, validate its associated process, and
|
||||||
|
return a typed lifecycle error for missing or invalid state instead of a bare
|
||||||
|
boolean.
|
||||||
|
|
||||||
|
`resume_task` in this wave means "return to active foreground execution", not
|
||||||
|
"wake in any possible state". If a future service needs to wake without
|
||||||
|
foregrounding, it should be modeled separately.
|
||||||
|
|
||||||
|
## Pitfalls
|
||||||
|
|
||||||
|
- Do not let firmware coordinate task and process state manually.
|
||||||
|
- Do not treat `Background` as semantically defined just because the enum value
|
||||||
|
exists.
|
||||||
|
- Do not remove closed/stopped entities as part of `close_task`; marking and
|
||||||
|
collection are different responsibilities.
|
||||||
|
- Do not hide lifecycle policy inside manager-level tests. Domain behavior
|
||||||
|
belongs at the OS lifecycle boundary.
|
||||||
|
|
||||||
|
## Takeaways
|
||||||
|
|
||||||
|
- `TaskState` and `ProcessState` are separate concepts, but lifecycle operations
|
||||||
|
must coordinate them atomically at the OS boundary.
|
||||||
|
- A small lifecycle contract is better than a broad but ambiguous one.
|
||||||
|
- Reserved states are useful only if callers are prevented from treating them as
|
||||||
|
normative before their semantics are decided.
|
||||||
@ -0,0 +1,89 @@
|
|||||||
|
---
|
||||||
|
id: LSN-0042
|
||||||
|
ticket: system-os-service-ownership-and-module-layout
|
||||||
|
title: SystemOS Service Ownership Boundary
|
||||||
|
created: 2026-05-15
|
||||||
|
tags: [runtime, os, services, module-layout, vm, window-manager, logging]
|
||||||
|
---
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
Prometeu's runtime started with VM execution as the center of gravity. As the
|
||||||
|
system evolved toward a console OS, services such as logging, filesystem,
|
||||||
|
memcard and window management needed a clearer owner.
|
||||||
|
|
||||||
|
The important shift was to stop treating `VirtualMachineRuntime` and
|
||||||
|
`PrometeuHub` as implicit owners of OS services.
|
||||||
|
|
||||||
|
## Key Decisions
|
||||||
|
|
||||||
|
### SystemOS owns shared OS services
|
||||||
|
|
||||||
|
**What:** `SystemOS` became the owner or mediator for shared OS services:
|
||||||
|
logging, filesystem, memcard, VM runtime and window management.
|
||||||
|
|
||||||
|
**Why:** VM execution is a service of the OS, not the OS itself. If filesystem,
|
||||||
|
memcard, logging and windows remain owned by the VM runtime or Hub, the
|
||||||
|
architecture keeps pulling policy back into the wrong layer.
|
||||||
|
|
||||||
|
**Trade-offs:** Moving ownership into `SystemOS` increases the breadth of the OS
|
||||||
|
object, but it makes service boundaries explicit and prepares the system for
|
||||||
|
facades, permissions and lifecycle coordination.
|
||||||
|
|
||||||
|
### PrometeuHub is Shell/Home, not the OS
|
||||||
|
|
||||||
|
**What:** `PrometeuHub` should consume OS services through `SystemOS` rather
|
||||||
|
than owning services such as window management.
|
||||||
|
|
||||||
|
**Why:** The Hub is a visual Shell/Home program. Treating it as the service
|
||||||
|
owner makes UI structure and OS infrastructure hard to separate.
|
||||||
|
|
||||||
|
**Trade-offs:** Hub callsites may become slightly more explicit, but service
|
||||||
|
ownership becomes visible and testable.
|
||||||
|
|
||||||
|
### VM runtime is execution, not a service container
|
||||||
|
|
||||||
|
**What:** `VirtualMachineRuntime` moved into the service layout and stopped
|
||||||
|
owning shared services such as logging, filesystem and memcard.
|
||||||
|
|
||||||
|
**Why:** The VM runtime should execute VM code and use OS services through
|
||||||
|
explicit boundaries. It should not silently become the container for every
|
||||||
|
runtime facility.
|
||||||
|
|
||||||
|
**Trade-offs:** VM execution now receives more explicit service references, but
|
||||||
|
the ownership model is cleaner.
|
||||||
|
|
||||||
|
## Patterns and Algorithms
|
||||||
|
|
||||||
|
When a capability is shared by game, shell, firmware or diagnostics, default to
|
||||||
|
OS ownership or OS mediation. The VM may use the capability, but use is not
|
||||||
|
ownership.
|
||||||
|
|
||||||
|
Keep module layout aligned with meaning:
|
||||||
|
|
||||||
|
```text
|
||||||
|
services/vm_runtime
|
||||||
|
services/window_manager
|
||||||
|
services/fs
|
||||||
|
services/memcard
|
||||||
|
```
|
||||||
|
|
||||||
|
Avoid compatibility reexports for old internal paths when the boundary is still
|
||||||
|
private to the workspace. Updating callsites directly keeps architectural
|
||||||
|
direction visible.
|
||||||
|
|
||||||
|
## Pitfalls
|
||||||
|
|
||||||
|
- Do not move files into `services/` while leaving semantic ownership unchanged.
|
||||||
|
- Do not let UI programs such as Hub own OS infrastructure just because they are
|
||||||
|
the first consumer.
|
||||||
|
- Do not let `VirtualMachineRuntime` become a general-purpose service bag.
|
||||||
|
- Do not confuse "VM needs access" with "VM owns the service".
|
||||||
|
|
||||||
|
## Takeaways
|
||||||
|
|
||||||
|
- OS service ownership should follow policy authority, not first caller.
|
||||||
|
- VM runtime is a service under the OS boundary.
|
||||||
|
- Shell/Home programs consume OS services; they are not the OS.
|
||||||
|
- A cleaner ownership boundary can make the root object wider temporarily, so a
|
||||||
|
later domain-facade pass is expected rather than optional.
|
||||||
@ -1,347 +0,0 @@
|
|||||||
---
|
|
||||||
id: AGD-0032
|
|
||||||
ticket: system-os-lifecycle-process-task-contract
|
|
||||||
title: Agenda - SystemOS Lifecycle, Process and Task Contract
|
|
||||||
status: accepted
|
|
||||||
created: 2026-05-14
|
|
||||||
resolved: 2026-05-15
|
|
||||||
decision: DEC-0025
|
|
||||||
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::Shell
|
|
||||||
-> 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.
|
|
||||||
|
|
||||||
`AppMode::System` já foi renomeado para `AppMode::Shell`. A nomenclatura pública
|
|
||||||
fica alinhada com o modelo atual: `AppMode::Game` executa cartuchos como
|
|
||||||
jogo/session fullscreen, enquanto `AppMode::Shell` executa cartuchos como apps
|
|
||||||
gerenciados pela Shell do Prometeu OS.
|
|
||||||
|
|
||||||
## Perguntas em Aberto
|
|
||||||
|
|
||||||
- [x] `SystemOS` deve expor `suspend_task`, `resume_task`, `close_task` e
|
|
||||||
`crash_task` já no próximo corte? Sim. Eles são a próxima API semântica de
|
|
||||||
lifecycle e evitam que firmware ou outros chamadores manipulem
|
|
||||||
`TaskManager` e `ProcessManager` separadamente.
|
|
||||||
- [x] `foreground_task` e `background_task` devem ser operações explícitas do
|
|
||||||
`SystemOS`, ou apenas detalhe do `TaskManager`? `set_foreground_task(task_id)`
|
|
||||||
deve ser operação explícita do `SystemOS`. `background_task` fica fora da
|
|
||||||
primeira wave.
|
|
||||||
- [x] Qual é a semântica exata de `Background`: processo ainda `Running`,
|
|
||||||
processo `Suspended`, ou estado de presença sem garantia de execução?
|
|
||||||
Fora de escopo nesta wave. `Background` permanece estado reservado sem
|
|
||||||
semântica normativa no primeiro contrato.
|
|
||||||
- [x] `resume_task` deve sempre mover a task para `Foreground`, ou pode retomar
|
|
||||||
para `Background`? Nesta wave, `resume_task` sempre move para
|
|
||||||
`Foreground` e move o processo associado para `Running`.
|
|
||||||
- [x] O que acontece quando a task existe mas o processo associado não existe?
|
|
||||||
Isso é erro de lifecycle e deve retornar erro tipado, não `bool`.
|
|
||||||
- [x] `close_task` remove imediatamente entidades fechadas ou apenas marca
|
|
||||||
`Closed`/`Stopped` para coleta posterior? Apenas marca `TaskState::Closed` e
|
|
||||||
`ProcessState::Stopped`; coleta é operação futura separada.
|
|
||||||
- [x] `crash_task` deve receber/armazenar `CrashReport`, ou isso fica em outro
|
|
||||||
serviço de diagnóstico? A operação deve aceitar ou preparar o contrato para
|
|
||||||
`CrashReport`, mas a primeira wave pode apenas coordenar estados e deixar o
|
|
||||||
armazenamento para diagnóstico/logging futuro.
|
|
||||||
- [x] `GameRunningStep` deve transicionar para Hub/Home quando sua task deixa de
|
|
||||||
estar `Foreground`, ou apenas não executar frame? Nesta wave, mantém a
|
|
||||||
invariant forte: `GameRunningStep` só suporta game task em `Foreground`; outro
|
|
||||||
estado é inválido e deve gerar diagnóstico/crash claro.
|
|
||||||
- [x] O perfil de manifesto continua `AppMode::System`, ou abrimos uma migração
|
|
||||||
formal para `AppMode::Shell`? Resolvido: `AppMode::System` já virou
|
|
||||||
`AppMode::Shell`.
|
|
||||||
- [x] 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? Pode executar
|
|
||||||
em paralelo e não bloqueia esta wave. O plan de lifecycle deve evitar mover
|
|
||||||
`WindowManager`, `VirtualMachineRuntime`, Hub ou background services.
|
|
||||||
|
|
||||||
## Resolucao
|
|
||||||
|
|
||||||
A agenda fecha pela **Opcao B**: centralizar lifecycle no `SystemOS`.
|
|
||||||
|
|
||||||
`SystemOS` deixa de ser apenas um agregador de serviços e passa a ser a
|
|
||||||
autoridade normativa para coordenar `TaskState` e `ProcessState`. `TaskManager`
|
|
||||||
e `ProcessManager` continuam existindo, mas como mecanismos internos de
|
|
||||||
armazenamento e transição simples. O firmware não deve decidir diretamente como
|
|
||||||
task e processo mudam juntos.
|
|
||||||
|
|
||||||
A primeira wave deve cobrir apenas:
|
|
||||||
|
|
||||||
- `set_foreground_task(task_id)`
|
|
||||||
- `suspend_task(task_id)`
|
|
||||||
- `resume_task(task_id)`
|
|
||||||
- `close_task(task_id)`
|
|
||||||
- `crash_task(task_id, report?)`
|
|
||||||
|
|
||||||
O mapeamento inicial é:
|
|
||||||
|
|
||||||
```text
|
|
||||||
TaskState::Foreground -> ProcessState::Running
|
|
||||||
TaskState::Suspended -> ProcessState::Suspended
|
|
||||||
TaskState::Closed -> ProcessState::Stopped
|
|
||||||
TaskState::Crashed -> ProcessState::Crashed
|
|
||||||
```
|
|
||||||
|
|
||||||
`Background` permanece reservado e explicitamente fora da primeira wave.
|
|
||||||
|
|
||||||
O primeiro plan recomendado é `PLAN-0032-A: SystemOS Lifecycle API`, com escopo
|
|
||||||
limitado a erro tipado, métodos de lifecycle em `SystemOS`, coordenação de
|
|
||||||
`TaskState`/`ProcessState`, testes unitários no nível `SystemOS` e nenhuma
|
|
||||||
mudança em `WindowManager`, `PrometeuHub`, background services ou UX completa de
|
|
||||||
suspensão/retomada.
|
|
||||||
|
|
||||||
## 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.
|
|
||||||
@ -1,199 +0,0 @@
|
|||||||
---
|
|
||||||
id: AGD-0033
|
|
||||||
ticket: system-os-service-ownership-and-module-layout
|
|
||||||
title: Agenda - SystemOS Service Ownership and Module Layout
|
|
||||||
status: accepted
|
|
||||||
created: 2026-05-14
|
|
||||||
resolved:
|
|
||||||
decision:
|
|
||||||
tags: [runtime, os, services, module-layout, vm, window-manager, logging]
|
|
||||||
---
|
|
||||||
|
|
||||||
# Agenda - SystemOS Service Ownership and Module Layout
|
|
||||||
|
|
||||||
## Contexto
|
|
||||||
|
|
||||||
Antes de avançar o contrato de lifecycle do `SystemOS`, há uma limpeza de
|
|
||||||
fronteira que precisa ser discutida separadamente.
|
|
||||||
|
|
||||||
O `SystemOS` começou como agregador de:
|
|
||||||
|
|
||||||
```text
|
|
||||||
SystemOS
|
|
||||||
VirtualMachineRuntime
|
|
||||||
ProcessManager
|
|
||||||
TaskManager
|
|
||||||
```
|
|
||||||
|
|
||||||
Mas o código ainda carrega sinais do modelo anterior, em que a VM concentrava
|
|
||||||
coisas que hoje parecem serviços de sistema. O exemplo mais claro é
|
|
||||||
`LogService` dentro de `VirtualMachineRuntime`. A mesma dúvida aparece em torno
|
|
||||||
de outros serviços e estados associados a filesystem, memcard, diagnóstico,
|
|
||||||
telemetria e identidade do cartucho.
|
|
||||||
|
|
||||||
Há também uma questão de layout:
|
|
||||||
|
|
||||||
- `VirtualMachineRuntime` está no root de `prometeu-system`, embora conceitualmente
|
|
||||||
agora seja um serviço do OS;
|
|
||||||
- `WindowManager` está dentro de `programs/prometeu_hub`, embora a direção de
|
|
||||||
arquitetura seja transformar o Hub em Shell/Home visual, não no sistema;
|
|
||||||
- `ProcessManager` e `TaskManager` já vivem em `services`, o que torna a posição
|
|
||||||
da VM e do WindowManager inconsistente com o desenho novo.
|
|
||||||
|
|
||||||
## Problema
|
|
||||||
|
|
||||||
Misturar ownership de serviços com execução da VM dificulta a evolução do OS.
|
|
||||||
Se `VirtualMachineRuntime` continuar parecendo dona de logging, filesystem,
|
|
||||||
memcard, diagnóstico e janela, o `SystemOS` vira apenas um wrapper, e não a
|
|
||||||
autoridade natural para coordenar serviços do console.
|
|
||||||
|
|
||||||
Ao mesmo tempo, nem tudo aqui é puramente mecânico:
|
|
||||||
|
|
||||||
- mover arquivos para `services` pode ser uma alteração sem mudança funcional;
|
|
||||||
- mover `LogService` para `SystemOS` altera ownership e pode exigir uma API de
|
|
||||||
serviço ou passagem explícita de dependência para a VM;
|
|
||||||
- promover `WindowManager` a serviço do OS antecipa uma fronteira arquitetural,
|
|
||||||
mesmo que a implementação continue mínima.
|
|
||||||
|
|
||||||
Por isso, este assunto não deve ser escondido dentro da agenda de lifecycle
|
|
||||||
(`AGD-0032`). Ele é uma agenda de pré-requisito ou paralela: primeiro precisamos
|
|
||||||
limpar a fronteira entre "VM como executor" e "OS como dono de serviços".
|
|
||||||
|
|
||||||
## Pontos Criticos
|
|
||||||
|
|
||||||
- `VirtualMachineRuntime` deve representar execução VM, não ser o container
|
|
||||||
geral de serviços do sistema.
|
|
||||||
- `SystemOS` deve ser o lugar natural para serviços compartilhados por jogos,
|
|
||||||
Shell/Home, firmware e processos nativos futuros.
|
|
||||||
- `LogService` provavelmente pertence ao `SystemOS`, mas a forma de acesso pela
|
|
||||||
VM precisa respeitar as restrições de borrow e o desenho de `NativeInterface`.
|
|
||||||
- `VirtualFS` e `MemcardService` também parecem serviços de OS, mas movê-los no
|
|
||||||
mesmo corte pode aumentar demais o risco.
|
|
||||||
- `WindowManager` deve sair de `PrometeuHub` porque o Hub deve virar consumidor
|
|
||||||
visual do OS, não proprietário de serviço de janela.
|
|
||||||
- A mudança de layout de módulo deve preservar comportamento, mas não precisa
|
|
||||||
preservar caminhos antigos de import; callsites devem ser atualizados
|
|
||||||
diretamente.
|
|
||||||
- A decisão precisa separar explicitamente "relocação de módulo" de "mudança de
|
|
||||||
ownership".
|
|
||||||
|
|
||||||
## Opcoes
|
|
||||||
|
|
||||||
### Opcao A - Agregar tudo na agenda de lifecycle
|
|
||||||
|
|
||||||
**Abordagem:**
|
|
||||||
Usar `AGD-0032` para decidir lifecycle, ownership de serviços, layout de módulos
|
|
||||||
e promoção do `WindowManager`.
|
|
||||||
|
|
||||||
**Vantagens:**
|
|
||||||
- uma única discussão cobre toda a direção do `SystemOS`;
|
|
||||||
- menos artefatos de workflow.
|
|
||||||
|
|
||||||
**Custos / Riscos:**
|
|
||||||
- mistura semântica de lifecycle com limpeza estrutural;
|
|
||||||
- aumenta a chance de uma decisão grande demais;
|
|
||||||
- dificulta transformar a discussão em plans pequenos e verificáveis;
|
|
||||||
- pode bloquear lifecycle por causa de detalhes de módulo e borrow.
|
|
||||||
|
|
||||||
### Opcao B - Separar uma agenda de service ownership e layout
|
|
||||||
|
|
||||||
**Abordagem:**
|
|
||||||
Manter `AGD-0032` focada em lifecycle de `Task`/`Process` e usar esta agenda
|
|
||||||
para decidir onde vivem os serviços do OS, quais módulos devem ir para
|
|
||||||
`services`, e quais extrações são mecânicas ou semânticas.
|
|
||||||
|
|
||||||
**Vantagens:**
|
|
||||||
- mantém a agenda principal limpa;
|
|
||||||
- permite um primeiro plan mecânico de relocação sem reabrir lifecycle;
|
|
||||||
- torna explícito que `LogService` sair da VM é mudança de ownership;
|
|
||||||
- cria base melhor para promover `WindowManager` sem confundir Hub e OS.
|
|
||||||
|
|
||||||
**Custos / Riscos:**
|
|
||||||
- cria uma dependência a mais antes da implementação do lifecycle;
|
|
||||||
- pode revelar que alguns serviços exigem desenho de API antes do refactor;
|
|
||||||
- exige cuidado para atualizar callsites diretamente sem deixar caminhos antigos
|
|
||||||
exportados.
|
|
||||||
|
|
||||||
### Opcao C - Fazer apenas os moves mecanicos direto no codigo
|
|
||||||
|
|
||||||
**Abordagem:**
|
|
||||||
Mover `VirtualMachineRuntime` e `WindowManager` para `services` sem decisão
|
|
||||||
formal, deixando `LogService` para depois.
|
|
||||||
|
|
||||||
**Vantagens:**
|
|
||||||
- rápido;
|
|
||||||
- baixo risco se for realmente só path/reexport;
|
|
||||||
- reduz ruído visual do layout atual.
|
|
||||||
|
|
||||||
**Custos / Riscos:**
|
|
||||||
- não resolve a dúvida central de ownership;
|
|
||||||
- pode mascarar uma decisão arquitetural como refactor mecânico;
|
|
||||||
- viola a política do repositório se a mudança alterar fronteiras sem agenda e
|
|
||||||
decisão.
|
|
||||||
|
|
||||||
## Sugestao / Recomendacao
|
|
||||||
|
|
||||||
A recomendação é seguir a **Opção B**.
|
|
||||||
|
|
||||||
Esta agenda deve ser separada da `AGD-0032`, mas tratada como pré-requisito ou
|
|
||||||
agenda paralela para ela. O primeiro contrato deve dividir o trabalho em dois
|
|
||||||
tipos:
|
|
||||||
|
|
||||||
1. **Relocação mecânica sem mudança funcional**
|
|
||||||
- mover `VirtualMachineRuntime` para `services`;
|
|
||||||
- mover `WindowManager` para `services`;
|
|
||||||
- não manter reexports ou aliases de compatibilidade para os caminhos antigos;
|
|
||||||
- atualizar callsites diretamente para os caminhos novos;
|
|
||||||
- provar que o comportamento não mudou.
|
|
||||||
|
|
||||||
2. **Correção de ownership de serviços**
|
|
||||||
- mover `LogService` para `SystemOS` se aceitarmos que logging é serviço do
|
|
||||||
OS;
|
|
||||||
- decidir se `VirtualFS`, `MemcardService`, diagnóstico, telemetria e
|
|
||||||
certificação ficam na VM, no OS, ou em serviços próprios;
|
|
||||||
- definir como a VM acessa serviços de OS sem voltar a ser dona deles.
|
|
||||||
|
|
||||||
Para o primeiro corte, a inclinação é:
|
|
||||||
|
|
||||||
- `VirtualMachineRuntime` deve ficar em `services`, como serviço de execução VM;
|
|
||||||
- `WindowManager` deve ficar em `services`, mesmo que ainda seja mínimo;
|
|
||||||
- `LogService` deve ser tratado como serviço de `SystemOS`, não detalhe interno
|
|
||||||
da VM;
|
|
||||||
- `VirtualFS` e `MemcardService` devem ser avaliados em seguida, sem mover tudo
|
|
||||||
junto automaticamente.
|
|
||||||
|
|
||||||
## Perguntas em Aberto
|
|
||||||
|
|
||||||
- [x] O path deve ser `services/vm_runtime` ou
|
|
||||||
`services/virtual_machine_runtime`? vm_runtime
|
|
||||||
- [x] `VirtualMachineRuntime` continua sendo o nome correto depois de virar
|
|
||||||
serviço, ou devemos introduzir um nome menor apenas no módulo? Podemos manter o mesmo nome
|
|
||||||
- [x] `LogService` deve sair da VM no mesmo plan do move mecânico, ou em um
|
|
||||||
plan separado de ownership? pode ser em um plan separado
|
|
||||||
- [x] A VM deve receber referência explícita ao logging do `SystemOS`, ou deve
|
|
||||||
chamar uma API de serviço mais estreita? A VM pode ter uma referência explícita ao logging do `SystemOS` para seu uso
|
|
||||||
- [x] `VirtualFS` e `MemcardService` pertencem ao `SystemOS` já, ou continuam na
|
|
||||||
VM até existir uma camada de permissões e mount por processo? podemos move-los para systemos jah
|
|
||||||
- [x] `WindowManager` deve virar campo do `SystemOS` imediatamente, ou primeiro
|
|
||||||
apenas sair de `PrometeuHub` em termos de módulo? eu diria que ele jah deve nascer em system os a partir de jah, mesmo que sem implementar nada
|
|
||||||
- [x] O `PrometeuHub` deve continuar expondo `window_manager` enquanto a Shell
|
|
||||||
visual ainda depende dele, ou isso deve ser mediado pelo `SystemOS` desde já? o prometeu hub eh um shell especial, ou seja, o window manager deve mediado pelo system os desde jah
|
|
||||||
|
|
||||||
## Criterio para Encerrar
|
|
||||||
|
|
||||||
Esta agenda pode virar decisão quando houver resposta para:
|
|
||||||
|
|
||||||
- quais serviços pertencem ao `SystemOS` no primeiro corte;
|
|
||||||
- qual layout canônico de módulo será usado em `services`;
|
|
||||||
- quais mudanças são relocação mecânica e quais são ownership semântico;
|
|
||||||
- como `VirtualMachineRuntime` acessa `LogService` depois da extração;
|
|
||||||
- se `WindowManager` será apenas movido de módulo ou também promovido a campo do
|
|
||||||
`SystemOS`;
|
|
||||||
- como os callsites serão atualizados sem reexports temporários.
|
|
||||||
|
|
||||||
## Proximo Passo
|
|
||||||
|
|
||||||
Revisar esta agenda antes de fechar `AGD-0032`. Se a direção for aceita, o
|
|
||||||
próximo estágio deve ser uma decisão curta para fronteira de serviços do
|
|
||||||
`SystemOS`, seguida de plans pequenos: primeiro relocação mecânica, depois
|
|
||||||
extração de ownership onde houver contrato suficiente.
|
|
||||||
@ -1,133 +0,0 @@
|
|||||||
---
|
|
||||||
id: DEC-0024
|
|
||||||
ticket: system-os-service-ownership-and-module-layout
|
|
||||||
title: SystemOS Service Ownership and Module Layout
|
|
||||||
status: accepted
|
|
||||||
created: 2026-05-14
|
|
||||||
ref_agenda: AGD-0033
|
|
||||||
tags: [runtime, os, services, module-layout, vm, window-manager, logging]
|
|
||||||
---
|
|
||||||
|
|
||||||
## Status
|
|
||||||
|
|
||||||
Accepted. Esta decisão foi aceita em 2026-05-14 e passa a ser referência
|
|
||||||
normativa para os plans de ownership e layout de serviços do `SystemOS`.
|
|
||||||
|
|
||||||
## Contexto
|
|
||||||
|
|
||||||
`SystemOS` está se tornando o dono dos serviços de console em
|
|
||||||
`prometeu-system`. O formato atual ainda deixa responsabilidades de OS dentro ou
|
|
||||||
perto de `VirtualMachineRuntime` e `PrometeuHub`:
|
|
||||||
|
|
||||||
- `VirtualMachineRuntime` vive no root do crate, embora agora seja um serviço de
|
|
||||||
execução VM do OS;
|
|
||||||
- `LogService` é owned por `VirtualMachineRuntime`, embora logging seja serviço
|
|
||||||
de observabilidade do OS;
|
|
||||||
- `VirtualFS` e `MemcardService` também ficam dentro de
|
|
||||||
`VirtualMachineRuntime`, embora representem serviços do sistema;
|
|
||||||
- `WindowManager` vive em `programs/prometeu_hub`, embora `PrometeuHub` deva ser
|
|
||||||
Shell/Home visual, não dono de serviços do OS.
|
|
||||||
|
|
||||||
Esta decisão é separada da `AGD-0032`, que trata lifecycle de `Task`/`Process`.
|
|
||||||
Aqui o contrato é ownership de serviços e layout de módulos.
|
|
||||||
|
|
||||||
## Decisao
|
|
||||||
|
|
||||||
`SystemOS` SHALL ser o owner dos serviços do Prometeu OS.
|
|
||||||
|
|
||||||
`VirtualMachineRuntime` SHALL representar somente execução VM. Ele MUST NOT ser
|
|
||||||
usado como container geral de serviços do sistema.
|
|
||||||
|
|
||||||
O layout canônico da VM runtime SHALL ser:
|
|
||||||
|
|
||||||
```text
|
|
||||||
crates/console/prometeu-system/src/services/vm_runtime/
|
|
||||||
```
|
|
||||||
|
|
||||||
O nome público do tipo SHALL continuar `VirtualMachineRuntime`.
|
|
||||||
|
|
||||||
`WindowManager` SHALL sair de `programs/prometeu_hub` e ir para a árvore
|
|
||||||
`services`. Ele SHALL ser owned ou mediado por `SystemOS` desde este estágio,
|
|
||||||
mesmo que a implementação continue mínima.
|
|
||||||
|
|
||||||
`PrometeuHub` SHALL ser tratado como uma Shell/Home especial. Ele MUST NOT ser
|
|
||||||
owner do window manager como serviço de OS. O acesso do Hub a window management
|
|
||||||
MUST passar por `SystemOS` ou por uma superfície mediada pelo OS.
|
|
||||||
|
|
||||||
`LogService` SHALL sair de `VirtualMachineRuntime` e virar serviço owned por
|
|
||||||
`SystemOS`. `VirtualMachineRuntime` MAY receber referência ou handle explícito
|
|
||||||
para o logging do OS quando precisar registrar eventos de execução VM, mas esse
|
|
||||||
acesso MUST NOT transformar a VM em owner de logging.
|
|
||||||
|
|
||||||
`VirtualFS` e `MemcardService` SHALL mover para `SystemOS` neste cleanup de
|
|
||||||
ownership. A VM pode continuar usando capacidades de filesystem e memcard, mas
|
|
||||||
o ownership pertence ao boundary do OS.
|
|
||||||
|
|
||||||
Esta decisão MUST NOT introduzir reexports ou aliases de compatibilidade para
|
|
||||||
os paths antigos. Os plans de implementação MUST atualizar callsites
|
|
||||||
diretamente. Novos imports MUST usar os paths canônicos de `services` e o
|
|
||||||
boundary de ownership do `SystemOS`.
|
|
||||||
|
|
||||||
## Rationale
|
|
||||||
|
|
||||||
O runtime está saindo de um runner de firmware para um console OS. Nesse modelo,
|
|
||||||
execução VM é um serviço do sistema, não o centro proprietário do sistema. Se
|
|
||||||
logging, filesystem, memcard, window management e futuramente lifecycle
|
|
||||||
continuarem dentro ou ao redor de `VirtualMachineRuntime`, a VM permanece como
|
|
||||||
owner de fato do OS.
|
|
||||||
|
|
||||||
Mover `VirtualMachineRuntime` para `services/vm_runtime` alinha layout com
|
|
||||||
arquitetura: execução VM é serviço, não root.
|
|
||||||
|
|
||||||
Mover `WindowManager` para `services` evita que `PrometeuHub` continue parecendo
|
|
||||||
o sistema inteiro. O Hub é Shell/Home e deve consumir serviços do OS.
|
|
||||||
|
|
||||||
Mover `LogService`, `VirtualFS` e `MemcardService` para `SystemOS` cria uma base
|
|
||||||
mais limpa para permissões, processo/task ownership, mount policy, diagnóstico e
|
|
||||||
mediação da Shell.
|
|
||||||
|
|
||||||
Não manter compatibilidade por reexport é aceitável agora porque esses paths são
|
|
||||||
internos e não há necessidade de janela longa de migração. Atualizar callsites
|
|
||||||
diretamente mantém o boundary claro.
|
|
||||||
|
|
||||||
## Invariantes / Contrato
|
|
||||||
|
|
||||||
- `SystemOS` MUST ser o ponto de ownership para serviços compartilhados do OS.
|
|
||||||
- `VirtualMachineRuntime` MUST NOT own `LogService`, `VirtualFS`,
|
|
||||||
`MemcardService` ou `WindowManager` depois dos plans correspondentes.
|
|
||||||
- `VirtualMachineRuntime` MAY usar serviços do OS por referência, handle ou API
|
|
||||||
estreita, mas MUST permanecer semanticamente executor VM.
|
|
||||||
- `PrometeuHub` MUST ser consumidor de OS services, não owner desses serviços.
|
|
||||||
- Paths antigos MUST NOT permanecer disponíveis por reexport ou alias.
|
|
||||||
- Mudanças de path MUST preservar comportamento observável.
|
|
||||||
- Esta decisão MUST NOT definir lifecycle de `Task`/`Process`; isso pertence à
|
|
||||||
`AGD-0032` e à decisão futura correspondente.
|
|
||||||
|
|
||||||
## Impactos
|
|
||||||
|
|
||||||
- `prometeu-system` deve ganhar layout de serviço mais coerente em `services`.
|
|
||||||
- `SystemOS` deve concentrar ownership de `LogService`, `VirtualFS`,
|
|
||||||
`MemcardService` e `WindowManager`.
|
|
||||||
- `VirtualMachineRuntime` deve reduzir escopo para execução VM.
|
|
||||||
- `PrometeuHub` deve começar a depender de mediação do OS para window
|
|
||||||
management.
|
|
||||||
- Firmware e testes podem precisar atualizar imports e construtores.
|
|
||||||
- Não há mudança exigida de ABI pública de cartucho.
|
|
||||||
|
|
||||||
## Referencias
|
|
||||||
|
|
||||||
- Agenda: `AGD-0033`
|
|
||||||
- Agenda relacionada: `AGD-0032`
|
|
||||||
|
|
||||||
## Propagacao Necessaria
|
|
||||||
|
|
||||||
- Plans: criar plans pequenos para relocação da VM runtime, promoção do
|
|
||||||
WindowManager e extração de ownership de serviços.
|
|
||||||
- Code: atualizar `prometeu-system`, `SystemOS`, `VirtualMachineRuntime`,
|
|
||||||
`PrometeuHub`, callsites de firmware e testes afetados.
|
|
||||||
- Tests: rodar a suíte Rust afetada e adicionar cobertura se ownership mudar
|
|
||||||
construtores ou caminhos de acesso.
|
|
||||||
- Specs: sem update obrigatório neste momento, salvo se plans futuros expuserem
|
|
||||||
o boundary em contrato público.
|
|
||||||
- Discussion: manter `AGD-0032` dependente desta decisão antes de planejar
|
|
||||||
lifecycle.
|
|
||||||
@ -1,203 +0,0 @@
|
|||||||
---
|
|
||||||
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`.
|
|
||||||
@ -1,103 +0,0 @@
|
|||||||
---
|
|
||||||
id: PLN-0051
|
|
||||||
ticket: system-os-service-ownership-and-module-layout
|
|
||||||
title: Move VM Runtime Into Services
|
|
||||||
status: done
|
|
||||||
created: 2026-05-14
|
|
||||||
ref_decisions: [DEC-0024]
|
|
||||||
tags: [runtime, os, services, module-layout, vm, window-manager, logging]
|
|
||||||
---
|
|
||||||
|
|
||||||
## Briefing
|
|
||||||
|
|
||||||
Implement the mechanical module relocation required by `DEC-0024`: move
|
|
||||||
`VirtualMachineRuntime` from the `prometeu-system` crate root into the services
|
|
||||||
tree at `services/vm_runtime`.
|
|
||||||
|
|
||||||
This plan is intentionally behavior-preserving. It prepares the service layout
|
|
||||||
for later ownership plans without moving logging, filesystem, or memcard state.
|
|
||||||
|
|
||||||
## Source Decisions
|
|
||||||
|
|
||||||
- `DEC-0024`: `VirtualMachineRuntime` SHALL move to
|
|
||||||
`services/vm_runtime`; old root paths MUST NOT remain available through
|
|
||||||
compatibility reexports.
|
|
||||||
|
|
||||||
## Target
|
|
||||||
|
|
||||||
Make `VirtualMachineRuntime` a service module while keeping the public type name
|
|
||||||
unchanged and preserving current VM behavior.
|
|
||||||
|
|
||||||
The canonical implementation path after this plan is:
|
|
||||||
|
|
||||||
```text
|
|
||||||
crates/console/prometeu-system/src/services/vm_runtime/
|
|
||||||
```
|
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
|
|
||||||
- Source decision: `DEC-0024`.
|
|
||||||
- No prior plan is required.
|
|
||||||
- This plan should run before `PLN-0052`, `PLN-0053`, and `PLN-0054`.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
- Move `crates/console/prometeu-system/src/virtual_machine_runtime.rs` to
|
|
||||||
`crates/console/prometeu-system/src/services/vm_runtime.rs` or equivalent
|
|
||||||
module root under `services/vm_runtime`.
|
|
||||||
- Move the existing `virtual_machine_runtime/` child modules under
|
|
||||||
`services/vm_runtime/`.
|
|
||||||
- Update `crates/console/prometeu-system/src/services/mod.rs` to expose
|
|
||||||
`vm_runtime`.
|
|
||||||
- Update `crates/console/prometeu-system/src/lib.rs` to export
|
|
||||||
`VirtualMachineRuntime` from `services::vm_runtime`.
|
|
||||||
- Update internal module paths and tests directly.
|
|
||||||
|
|
||||||
## Out of Scope
|
|
||||||
|
|
||||||
- Do not move `LogService` ownership.
|
|
||||||
- Do not move `VirtualFS` or `MemcardService` ownership.
|
|
||||||
- Do not move `WindowManager`.
|
|
||||||
- Do not introduce reexports or aliases for the old root module path.
|
|
||||||
- Do not change VM runtime behavior, syscalls, telemetry, logging semantics, or
|
|
||||||
cartridge execution behavior.
|
|
||||||
|
|
||||||
## Execution Plan
|
|
||||||
|
|
||||||
1. Move the VM runtime module files into `src/services/vm_runtime/`.
|
|
||||||
2. Register `pub mod vm_runtime;` from `src/services/mod.rs`.
|
|
||||||
3. Remove the root `mod virtual_machine_runtime;` declaration from `src/lib.rs`.
|
|
||||||
4. Export `VirtualMachineRuntime` through the services path.
|
|
||||||
5. Update `SystemOS`, tests, and any internal imports to use the new module
|
|
||||||
location.
|
|
||||||
6. Run formatting and the affected Rust tests.
|
|
||||||
|
|
||||||
## Acceptance Criteria
|
|
||||||
|
|
||||||
- `VirtualMachineRuntime` implementation lives under `services/vm_runtime`.
|
|
||||||
- No root `virtual_machine_runtime` module remains in `prometeu-system`.
|
|
||||||
- No compatibility reexport preserves the old root module path.
|
|
||||||
- Public type name `VirtualMachineRuntime` remains available where the crate API
|
|
||||||
intentionally exposes it.
|
|
||||||
- Runtime behavior remains unchanged.
|
|
||||||
|
|
||||||
## Tests / Validation
|
|
||||||
|
|
||||||
- Run `cargo test -p prometeu-system`.
|
|
||||||
- If workspace constraints make that too broad, run the narrowest available
|
|
||||||
`prometeu-system` test target and record the exact command in implementation
|
|
||||||
evidence.
|
|
||||||
|
|
||||||
## Risks
|
|
||||||
|
|
||||||
- Module move churn can hide accidental import compatibility. Review must check
|
|
||||||
that no old root module remains.
|
|
||||||
- Test modules may need path updates because they currently live under the VM
|
|
||||||
runtime module tree.
|
|
||||||
|
|
||||||
## Affected Artifacts
|
|
||||||
|
|
||||||
- `crates/console/prometeu-system/src/lib.rs`
|
|
||||||
- `crates/console/prometeu-system/src/services/mod.rs`
|
|
||||||
- `crates/console/prometeu-system/src/services/vm_runtime/**`
|
|
||||||
- Existing VM runtime tests moved with the module
|
|
||||||
@ -1,85 +0,0 @@
|
|||||||
---
|
|
||||||
id: PLN-0052
|
|
||||||
ticket: system-os-service-ownership-and-module-layout
|
|
||||||
title: Promote Window Manager To SystemOS Service
|
|
||||||
status: done
|
|
||||||
created: 2026-05-14
|
|
||||||
ref_decisions: [DEC-0024]
|
|
||||||
tags: [runtime, os, services, module-layout, vm, window-manager, logging]
|
|
||||||
---
|
|
||||||
|
|
||||||
## Briefing
|
|
||||||
|
|
||||||
Promote `WindowManager` from a `PrometeuHub` private module into an OS service
|
|
||||||
owned or mediated by `SystemOS`, as required by `DEC-0024`.
|
|
||||||
|
|
||||||
## Source Decisions
|
|
||||||
|
|
||||||
- `DEC-0024`: `WindowManager` SHALL move to the services tree and SHALL be
|
|
||||||
owned or mediated by `SystemOS`; `PrometeuHub` MUST NOT own it as an OS
|
|
||||||
service.
|
|
||||||
|
|
||||||
## Target
|
|
||||||
|
|
||||||
Make `WindowManager` part of the `services` tree and stop treating
|
|
||||||
`PrometeuHub` as the owner of window management.
|
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
|
|
||||||
- Source decision: `DEC-0024`.
|
|
||||||
- Depends on `PLN-0051` only for the general service layout convention.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
- Move `crates/console/prometeu-system/src/programs/prometeu_hub/window_manager.rs`
|
|
||||||
into the `services` tree.
|
|
||||||
- Expose the service from `crates/console/prometeu-system/src/services/mod.rs`.
|
|
||||||
- Add a `WindowManager` field or OS-mediated access path on `SystemOS`.
|
|
||||||
- Remove `window_manager` ownership from `PrometeuHub`.
|
|
||||||
- Update `PrometeuHub` to access window management through `SystemOS`.
|
|
||||||
- Update tests and imports directly.
|
|
||||||
|
|
||||||
## Out of Scope
|
|
||||||
|
|
||||||
- Do not implement new windowing behavior.
|
|
||||||
- Do not define surface/window lifecycle beyond the existing minimal behavior.
|
|
||||||
- Do not introduce old-path compatibility reexports.
|
|
||||||
- Do not change task/process lifecycle semantics.
|
|
||||||
|
|
||||||
## Execution Plan
|
|
||||||
|
|
||||||
1. Move the `WindowManager` module into `src/services/`.
|
|
||||||
2. Register the new service module in `services/mod.rs`.
|
|
||||||
3. Add `WindowManager` initialization to `SystemOS::new`.
|
|
||||||
4. Remove `WindowManager` storage from `PrometeuHub`.
|
|
||||||
5. Update Hub methods so their window manager access is mediated by `SystemOS`.
|
|
||||||
6. Update tests for the new module path and ownership location.
|
|
||||||
7. Run formatting and the affected tests.
|
|
||||||
|
|
||||||
## Acceptance Criteria
|
|
||||||
|
|
||||||
- `WindowManager` no longer lives under `programs/prometeu_hub`.
|
|
||||||
- `PrometeuHub` does not own a `WindowManager` field.
|
|
||||||
- `SystemOS` owns or mediates access to `WindowManager`.
|
|
||||||
- No old `programs::prometeu_hub::window_manager` path remains available.
|
|
||||||
- Existing Hub behavior remains unchanged.
|
|
||||||
|
|
||||||
## Tests / Validation
|
|
||||||
|
|
||||||
- Run `cargo test -p prometeu-system`.
|
|
||||||
- Include any focused tests for `WindowManager` after the move.
|
|
||||||
|
|
||||||
## Risks
|
|
||||||
|
|
||||||
- `PrometeuHub` currently owns its `WindowManager`; moving ownership may require
|
|
||||||
method signatures to pass through `SystemOS` cleanly.
|
|
||||||
- The implementation must not accidentally introduce new window/surface
|
|
||||||
semantics while moving ownership.
|
|
||||||
|
|
||||||
## Affected Artifacts
|
|
||||||
|
|
||||||
- `crates/console/prometeu-system/src/programs/prometeu_hub/mod.rs`
|
|
||||||
- `crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs`
|
|
||||||
- `crates/console/prometeu-system/src/services/mod.rs`
|
|
||||||
- `crates/console/prometeu-system/src/services/window_manager.rs` or equivalent
|
|
||||||
- `crates/console/prometeu-system/src/os/system_os.rs`
|
|
||||||
@ -1,88 +0,0 @@
|
|||||||
---
|
|
||||||
id: PLN-0053
|
|
||||||
ticket: system-os-service-ownership-and-module-layout
|
|
||||||
title: Move Logging Ownership To SystemOS
|
|
||||||
status: done
|
|
||||||
created: 2026-05-14
|
|
||||||
ref_decisions: [DEC-0024]
|
|
||||||
tags: [runtime, os, services, module-layout, vm, window-manager, logging]
|
|
||||||
---
|
|
||||||
|
|
||||||
## Briefing
|
|
||||||
|
|
||||||
Move `LogService` ownership from `VirtualMachineRuntime` to `SystemOS`, while
|
|
||||||
allowing VM execution code to use OS logging through an explicit reference or
|
|
||||||
handle.
|
|
||||||
|
|
||||||
## Source Decisions
|
|
||||||
|
|
||||||
- `DEC-0024`: `LogService` SHALL move from `VirtualMachineRuntime` to
|
|
||||||
`SystemOS`; VM execution MAY use an explicit OS logging reference or handle
|
|
||||||
but MUST NOT own logging.
|
|
||||||
|
|
||||||
## Target
|
|
||||||
|
|
||||||
Make logging an OS-owned service and reduce `VirtualMachineRuntime` to a user of
|
|
||||||
logging rather than its owner.
|
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
|
|
||||||
- Source decision: `DEC-0024`.
|
|
||||||
- Depends on `PLN-0051`.
|
|
||||||
- May run after or alongside `PLN-0052`, but code integration is simpler after
|
|
||||||
`SystemOS` service ownership is established.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
- Add `LogService` ownership to `SystemOS`.
|
|
||||||
- Remove `log_service: LogService` from `VirtualMachineRuntime`.
|
|
||||||
- Update VM runtime methods that read/write logs to receive logging access from
|
|
||||||
`SystemOS` or a narrow explicit handle.
|
|
||||||
- Update construction paths so `LogService::new(4096)` is owned by `SystemOS`.
|
|
||||||
- Update tests that currently inspect runtime-owned logs.
|
|
||||||
|
|
||||||
## Out of Scope
|
|
||||||
|
|
||||||
- Do not change log capacity or log record semantics.
|
|
||||||
- Do not change VM syscall behavior except for the ownership path.
|
|
||||||
- Do not introduce compatibility accessors that imply VM ownership.
|
|
||||||
- Do not move filesystem or memcard ownership in this plan.
|
|
||||||
|
|
||||||
## Execution Plan
|
|
||||||
|
|
||||||
1. Add a `LogService` field to `SystemOS` and initialize it in `SystemOS::new`.
|
|
||||||
2. Remove `LogService` initialization and storage from
|
|
||||||
`VirtualMachineRuntime::new`.
|
|
||||||
3. Update VM logging call paths in `dispatch`, `tick`, lifecycle, and tests to
|
|
||||||
use OS-owned logging.
|
|
||||||
4. If borrow constraints require it, introduce a narrow logging handle/reference
|
|
||||||
parameter at the call boundary instead of giving the VM ownership.
|
|
||||||
5. Update all tests that assert logging behavior.
|
|
||||||
6. Run formatting and tests.
|
|
||||||
|
|
||||||
## Acceptance Criteria
|
|
||||||
|
|
||||||
- `VirtualMachineRuntime` no longer stores `LogService`.
|
|
||||||
- `SystemOS` owns `LogService`.
|
|
||||||
- VM execution can still emit and expose logs through the existing behavior.
|
|
||||||
- No compatibility API suggests that logging remains VM-owned.
|
|
||||||
- Existing logging tests pass or are updated to assert OS ownership.
|
|
||||||
|
|
||||||
## Tests / Validation
|
|
||||||
|
|
||||||
- Run `cargo test -p prometeu-system`.
|
|
||||||
- Include focused tests covering VM log writes and reads after ownership moves
|
|
||||||
to `SystemOS`.
|
|
||||||
|
|
||||||
## Risks
|
|
||||||
|
|
||||||
- Borrowing constraints around `NativeInterface` may require a narrow access
|
|
||||||
pattern rather than simply borrowing all of `SystemOS`.
|
|
||||||
- Tests that currently construct only `VirtualMachineRuntime` may need to move
|
|
||||||
to `SystemOS` construction to reflect the new owner.
|
|
||||||
|
|
||||||
## Affected Artifacts
|
|
||||||
|
|
||||||
- `crates/console/prometeu-system/src/os/system_os.rs`
|
|
||||||
- `crates/console/prometeu-system/src/services/vm_runtime/**`
|
|
||||||
- Tests under the VM runtime module
|
|
||||||
@ -1,95 +0,0 @@
|
|||||||
---
|
|
||||||
id: PLN-0054
|
|
||||||
ticket: system-os-service-ownership-and-module-layout
|
|
||||||
title: Move FS And Memcard Ownership To SystemOS
|
|
||||||
status: done
|
|
||||||
created: 2026-05-14
|
|
||||||
ref_decisions: [DEC-0024]
|
|
||||||
tags: [runtime, os, services, module-layout, vm, window-manager, logging]
|
|
||||||
---
|
|
||||||
|
|
||||||
## Briefing
|
|
||||||
|
|
||||||
Move `VirtualFS` and `MemcardService` ownership from `VirtualMachineRuntime` to
|
|
||||||
`SystemOS`, preserving current VM filesystem and memcard behavior.
|
|
||||||
|
|
||||||
## Source Decisions
|
|
||||||
|
|
||||||
- `DEC-0024`: `VirtualFS` and `MemcardService` SHALL move from
|
|
||||||
`VirtualMachineRuntime` to `SystemOS`; VM execution may use them, but OS owns
|
|
||||||
the service state.
|
|
||||||
|
|
||||||
## Target
|
|
||||||
|
|
||||||
Make filesystem and memcard OS-owned services while keeping VM syscalls and
|
|
||||||
tests behaviorally equivalent.
|
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
|
|
||||||
- Source decision: `DEC-0024`.
|
|
||||||
- Depends on `PLN-0051`.
|
|
||||||
- Should run after `PLN-0053` so the pattern for VM access to OS-owned services
|
|
||||||
is already established.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
- Add `VirtualFS`, `FsState`, `MemcardService`, open file handle state, and
|
|
||||||
related handle allocation state to `SystemOS` if they are currently VM-owned
|
|
||||||
service state.
|
|
||||||
- Remove direct ownership of `VirtualFS` and `MemcardService` from
|
|
||||||
`VirtualMachineRuntime`.
|
|
||||||
- Update FS and memcard syscall paths so VM execution uses OS-owned services.
|
|
||||||
- Update tests that currently create a bare `VirtualMachineRuntime` when they
|
|
||||||
need filesystem or memcard services.
|
|
||||||
- Keep service modules under `services/fs` and `services/memcard`.
|
|
||||||
|
|
||||||
## Out of Scope
|
|
||||||
|
|
||||||
- Do not redesign filesystem semantics, path normalization, memcard slot
|
|
||||||
semantics, or persistence policy.
|
|
||||||
- Do not introduce process permissions or mount namespaces.
|
|
||||||
- Do not change cartridge ABI.
|
|
||||||
- Do not move unrelated telemetry, certification, asset, or debug state unless
|
|
||||||
required by compilation and explicitly documented in implementation evidence.
|
|
||||||
|
|
||||||
## Execution Plan
|
|
||||||
|
|
||||||
1. Identify the complete set of FS/memcard-owned fields currently stored in
|
|
||||||
`VirtualMachineRuntime`.
|
|
||||||
2. Add the OS-owned fields to `SystemOS` and initialize them in `SystemOS::new`.
|
|
||||||
3. Remove those service fields from `VirtualMachineRuntime`.
|
|
||||||
4. Update VM dispatch/syscall code to operate on OS-owned FS and memcard state
|
|
||||||
through explicit references or narrow access methods.
|
|
||||||
5. Update tests to construct `SystemOS` when testing FS/memcard behavior through
|
|
||||||
VM execution.
|
|
||||||
6. Run formatting and the affected Rust tests.
|
|
||||||
|
|
||||||
## Acceptance Criteria
|
|
||||||
|
|
||||||
- `VirtualMachineRuntime` no longer owns `VirtualFS` or `MemcardService`.
|
|
||||||
- `SystemOS` owns filesystem and memcard service state needed by VM execution.
|
|
||||||
- Existing FS and memcard behavior is preserved.
|
|
||||||
- No compatibility path implies VM ownership of FS or memcard services.
|
|
||||||
- Any remaining VM-owned fields are execution-specific and justified by the
|
|
||||||
implementation evidence.
|
|
||||||
|
|
||||||
## Tests / Validation
|
|
||||||
|
|
||||||
- Run `cargo test -p prometeu-system`.
|
|
||||||
- Include focused FS and memcard tests after updating constructors/access paths.
|
|
||||||
|
|
||||||
## Risks
|
|
||||||
|
|
||||||
- FS and memcard syscalls are stateful and may be coupled to open handle fields
|
|
||||||
in `VirtualMachineRuntime`; the implementation must move the whole service
|
|
||||||
state coherently.
|
|
||||||
- Bare VM tests may need broader OS fixtures, which can reveal unrelated setup
|
|
||||||
assumptions.
|
|
||||||
|
|
||||||
## Affected Artifacts
|
|
||||||
|
|
||||||
- `crates/console/prometeu-system/src/os/system_os.rs`
|
|
||||||
- `crates/console/prometeu-system/src/services/fs/**`
|
|
||||||
- `crates/console/prometeu-system/src/services/memcard.rs`
|
|
||||||
- `crates/console/prometeu-system/src/services/vm_runtime/**`
|
|
||||||
- FS/memcard runtime tests
|
|
||||||
@ -1,121 +0,0 @@
|
|||||||
---
|
|
||||||
id: PLN-0055
|
|
||||||
ticket: system-os-lifecycle-process-task-contract
|
|
||||||
title: SystemOS Lifecycle Core API
|
|
||||||
status: done
|
|
||||||
created: 2026-05-15
|
|
||||||
ref_decisions: [DEC-0025]
|
|
||||||
tags: [runtime, os, lifecycle, process, task, shell, firmware]
|
|
||||||
---
|
|
||||||
|
|
||||||
## Briefing
|
|
||||||
|
|
||||||
Implement the first-wave `SystemOS` lifecycle API required by `DEC-0025`.
|
|
||||||
`SystemOS` becomes the semantic coordinator for `TaskState` and `ProcessState`;
|
|
||||||
`TaskManager` and `ProcessManager` remain storage and simple transition
|
|
||||||
mechanisms.
|
|
||||||
|
|
||||||
## Source Decisions
|
|
||||||
|
|
||||||
- `DEC-0025`: `SystemOS` is the lifecycle authority for tasks and processes.
|
|
||||||
|
|
||||||
## Target
|
|
||||||
|
|
||||||
Add typed lifecycle operations to `prometeu-system` without changing firmware
|
|
||||||
behavior, WindowManager ownership, Hub UI, background services, docking, app
|
|
||||||
switching, or VM ownership.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
- Add `LifecycleError` and `LifecycleOperation` in `prometeu-system`.
|
|
||||||
- Add lifecycle methods on `SystemOS`:
|
|
||||||
- `set_foreground_task(task_id)`
|
|
||||||
- `suspend_task(task_id)`
|
|
||||||
- `resume_task(task_id)`
|
|
||||||
- `close_task(task_id)`
|
|
||||||
- `crash_task(task_id, report?)`
|
|
||||||
- Coordinate task and process state changes inside `SystemOS`.
|
|
||||||
- Preserve `TaskManager` and `ProcessManager` as internal state managers.
|
|
||||||
- Keep `Background` reserved and out of public lifecycle semantics.
|
|
||||||
|
|
||||||
## Out of Scope
|
|
||||||
|
|
||||||
- Background semantics.
|
|
||||||
- Docking.
|
|
||||||
- Background services.
|
|
||||||
- App switcher.
|
|
||||||
- WindowManager migration.
|
|
||||||
- PrometeuHub redesign.
|
|
||||||
- Game suspend/resume UX.
|
|
||||||
- ProcessManager owning VM execution.
|
|
||||||
- Collection/removal of closed or stopped entities.
|
|
||||||
|
|
||||||
## Execution Plan
|
|
||||||
|
|
||||||
1. Add lifecycle types.
|
|
||||||
- Create a lifecycle module or colocate the types under
|
|
||||||
`crates/console/prometeu-system/src/os/`.
|
|
||||||
- Define `LifecycleOperation` with `SetForeground`, `Suspend`, `Resume`,
|
|
||||||
`Close`, and `Crash`.
|
|
||||||
- Define `LifecycleError` with `TaskNotFound(TaskId)`,
|
|
||||||
`ProcessNotFound(ProcessId)`, and `InvalidTransition { task_id, from,
|
|
||||||
operation }`.
|
|
||||||
- Re-export the types through `prometeu-system` only if the existing public
|
|
||||||
module style requires it.
|
|
||||||
|
|
||||||
2. Add the `SystemOS` coordination helpers.
|
|
||||||
- Target file: `crates/console/prometeu-system/src/os/system_os.rs`.
|
|
||||||
- Resolve the task first through `task_manager`.
|
|
||||||
- Extract the task's associated `ProcessId`.
|
|
||||||
- Validate that the process exists before mutating state.
|
|
||||||
- Return typed errors instead of `bool`.
|
|
||||||
|
|
||||||
3. Implement first-wave operations.
|
|
||||||
- `set_foreground_task`: call `task_manager.set_foreground(task_id)` and
|
|
||||||
`process_manager.mark_running(process_id)`.
|
|
||||||
- `suspend_task`: set `TaskState::Suspended` and
|
|
||||||
`ProcessState::Suspended`.
|
|
||||||
- `resume_task`: require a suspended task, then set
|
|
||||||
`TaskState::Foreground` and `ProcessState::Running`.
|
|
||||||
- `close_task`: set `TaskState::Closed` and `ProcessState::Stopped`.
|
|
||||||
- `crash_task`: set `TaskState::Crashed` and `ProcessState::Crashed`.
|
|
||||||
|
|
||||||
4. Keep manager APIs mechanical.
|
|
||||||
- Target files:
|
|
||||||
`crates/console/prometeu-system/src/services/task/task_manager.rs` and
|
|
||||||
`crates/console/prometeu-system/src/services/process/process_manager.rs`.
|
|
||||||
- Do not remove existing manager methods in this plan.
|
|
||||||
- Add only narrow helpers if needed to support the `SystemOS` API cleanly.
|
|
||||||
|
|
||||||
5. Update task creation to use the lifecycle API internally.
|
|
||||||
- In `SystemOS::create_vm_game_task`, `create_vm_shell_task`, and
|
|
||||||
`create_native_shell_task`, replace direct foreground manager calls with
|
|
||||||
`set_foreground_task`.
|
|
||||||
- Keep the constructors returning `TaskId`; handle impossible internal
|
|
||||||
errors with explicit debug/assert behavior or an internal helper that
|
|
||||||
cannot fail after creation.
|
|
||||||
|
|
||||||
## Acceptance Criteria
|
|
||||||
|
|
||||||
- `SystemOS` exposes all five first-wave lifecycle methods from `DEC-0025`.
|
|
||||||
- All five methods coordinate both task and process state.
|
|
||||||
- Missing task returns `LifecycleError::TaskNotFound`.
|
|
||||||
- Missing associated process returns `LifecycleError::ProcessNotFound`.
|
|
||||||
- Invalid resume from a non-suspended task returns `InvalidTransition`.
|
|
||||||
- `Background` is not exposed through a new lifecycle API.
|
|
||||||
- Closed and stopped entities are not removed by `close_task`.
|
|
||||||
|
|
||||||
## Tests / Validation
|
|
||||||
|
|
||||||
- Add or update unit tests in `prometeu-system` for each lifecycle mapping.
|
|
||||||
- Add tests for missing task, missing process, and invalid resume transition.
|
|
||||||
- Run the affected Rust test suite for `prometeu-system`.
|
|
||||||
|
|
||||||
## Risks
|
|
||||||
|
|
||||||
- Existing direct manager access is public enough that callsites may keep using
|
|
||||||
it. This plan does not remove those methods; enforcement continues in
|
|
||||||
`PLN-0056`.
|
|
||||||
- `TaskManager::set_foreground` currently moves the previous foreground task to
|
|
||||||
`Background`. Since `Background` is out of first-wave semantics, tests must
|
|
||||||
avoid treating that transition as normative lifecycle policy.
|
|
||||||
@ -1,119 +0,0 @@
|
|||||||
---
|
|
||||||
id: PLN-0056
|
|
||||||
ticket: system-os-lifecycle-process-task-contract
|
|
||||||
title: Firmware Lifecycle Delegation
|
|
||||||
status: done
|
|
||||||
created: 2026-05-15
|
|
||||||
ref_decisions: [DEC-0025]
|
|
||||||
tags: [runtime, os, lifecycle, process, task, shell, firmware]
|
|
||||||
---
|
|
||||||
|
|
||||||
## Briefing
|
|
||||||
|
|
||||||
Move firmware lifecycle callsites to the `SystemOS` semantic API introduced by
|
|
||||||
`PLN-0055`. Firmware remains a boot and execution state machine; it must not
|
|
||||||
coordinate task/process lifecycle by calling `TaskManager` and `ProcessManager`
|
|
||||||
separately.
|
|
||||||
|
|
||||||
## Source Decisions
|
|
||||||
|
|
||||||
- `DEC-0025`: firmware must delegate semantic lifecycle transitions to
|
|
||||||
`SystemOS`.
|
|
||||||
|
|
||||||
## Target
|
|
||||||
|
|
||||||
Replace direct lifecycle manipulation in firmware with `SystemOS` lifecycle
|
|
||||||
methods while preserving current observable behavior.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
- Update cartridge launch paths to use `SystemOS` lifecycle authority when
|
|
||||||
placing newly created tasks in foreground.
|
|
||||||
- Update crash paths where a task crash is detected so task/process state moves
|
|
||||||
through `SystemOS::crash_task`.
|
|
||||||
- Preserve the strong `GameRunningStep` invariant: a running game step only
|
|
||||||
supports a game task in `TaskState::Foreground`.
|
|
||||||
- Keep `SystemRunningStep`, Hub, and WindowManager behavior unchanged except for
|
|
||||||
lifecycle delegation required by `DEC-0025`.
|
|
||||||
|
|
||||||
## Out of Scope
|
|
||||||
|
|
||||||
- Full game suspend/resume UX.
|
|
||||||
- Returning to Hub/Home on suspend or close.
|
|
||||||
- Shell UI redesign.
|
|
||||||
- App switcher.
|
|
||||||
- Background task API.
|
|
||||||
- WindowManager migration.
|
|
||||||
- Diagnostics service or crash report persistence.
|
|
||||||
|
|
||||||
## Execution Plan
|
|
||||||
|
|
||||||
1. Audit direct lifecycle manager usage.
|
|
||||||
- Target files:
|
|
||||||
`crates/console/prometeu-firmware/src/firmware/*.rs`,
|
|
||||||
`crates/console/prometeu-system/src/os/system_os.rs`.
|
|
||||||
- Search for direct calls to `task_manager.set_foreground`,
|
|
||||||
`task_manager.mark_suspended`, `task_manager.close_task`,
|
|
||||||
`task_manager.mark_crashed`, `process_manager.mark_suspended`,
|
|
||||||
`process_manager.mark_stopped`, and `process_manager.mark_crashed`.
|
|
||||||
|
|
||||||
2. Keep launch construction inside `SystemOS`.
|
|
||||||
- Target file:
|
|
||||||
`crates/console/prometeu-system/src/os/system_os.rs`.
|
|
||||||
- Ensure `create_vm_game_task`, `create_vm_shell_task`, and
|
|
||||||
`create_native_shell_task` coordinate foreground/running state through the
|
|
||||||
lifecycle core API from `PLN-0055`.
|
|
||||||
|
|
||||||
3. Update game crash handling.
|
|
||||||
- Target file:
|
|
||||||
`crates/console/prometeu-firmware/src/firmware/firmware_step_game_running.rs`.
|
|
||||||
- When the task is missing, preserve current crash-screen behavior. If the
|
|
||||||
task does not exist, `SystemOS::crash_task` cannot attach state and the
|
|
||||||
firmware should continue producing a clear crash report.
|
|
||||||
- When a foreground invariant fails for an existing task, call
|
|
||||||
`ctx.os.crash_task(task_id, report?)` before transitioning to
|
|
||||||
`AppCrashesStep`.
|
|
||||||
- When `tick_vm` returns a crash report for the active task, call
|
|
||||||
`ctx.os.crash_task(task_id, report?)` before transitioning to
|
|
||||||
`AppCrashesStep`.
|
|
||||||
|
|
||||||
4. Keep shell launch behavior unchanged.
|
|
||||||
- Target file:
|
|
||||||
`crates/console/prometeu-firmware/src/firmware/firmware_step_load_cartridge.rs`.
|
|
||||||
- Do not move `WindowManager` logic.
|
|
||||||
- Do not change shell window creation or focus behavior.
|
|
||||||
- Rely on `SystemOS::create_vm_shell_task` to coordinate task/process
|
|
||||||
foreground state.
|
|
||||||
|
|
||||||
5. Avoid introducing background lifecycle.
|
|
||||||
- Do not add `background_task`.
|
|
||||||
- Do not treat `TaskState::Background` as a public lifecycle result in
|
|
||||||
firmware.
|
|
||||||
|
|
||||||
## Acceptance Criteria
|
|
||||||
|
|
||||||
- Firmware does not coordinate task/process lifecycle by manually changing both
|
|
||||||
managers.
|
|
||||||
- Game VM crash results in `SystemOS::crash_task` for the active task when the
|
|
||||||
task still exists.
|
|
||||||
- Foreground invariant violation in `GameRunningStep` crashes the task through
|
|
||||||
`SystemOS`.
|
|
||||||
- Launch behavior for `AppMode::Game` and `AppMode::Shell` remains unchanged.
|
|
||||||
- WindowManager and Hub behavior are not redesigned or moved.
|
|
||||||
|
|
||||||
## Tests / Validation
|
|
||||||
|
|
||||||
- Run firmware tests that cover cartridge launch for `AppMode::Game` and
|
|
||||||
`AppMode::Shell`.
|
|
||||||
- Add or update tests for `GameRunningStep` crash delegation if the existing
|
|
||||||
test harness supports firmware step testing.
|
|
||||||
- Run the affected Rust test suite for `prometeu-firmware`.
|
|
||||||
|
|
||||||
## Risks
|
|
||||||
|
|
||||||
- Crash report ownership is not final. This plan should pass the report through
|
|
||||||
the lifecycle API only to the extent supported by `PLN-0055`; persistence
|
|
||||||
remains out of scope.
|
|
||||||
- `GameRunningStep` currently reads task state directly. This is acceptable for
|
|
||||||
enforcing the foreground invariant, but it must not become a place that
|
|
||||||
coordinates lifecycle state across managers.
|
|
||||||
@ -1,110 +0,0 @@
|
|||||||
---
|
|
||||||
id: PLN-0057
|
|
||||||
ticket: system-os-lifecycle-process-task-contract
|
|
||||||
title: Lifecycle Tests and Invariants
|
|
||||||
status: done
|
|
||||||
created: 2026-05-15
|
|
||||||
ref_decisions: [DEC-0025]
|
|
||||||
tags: [runtime, os, lifecycle, process, task, shell, firmware]
|
|
||||||
---
|
|
||||||
|
|
||||||
## Briefing
|
|
||||||
|
|
||||||
Add focused test coverage and invariant checks for the lifecycle contract
|
|
||||||
introduced by `PLN-0055` and consumed by `PLN-0056`.
|
|
||||||
|
|
||||||
## Source Decisions
|
|
||||||
|
|
||||||
- `DEC-0025`: first-wave lifecycle maps task states to process states through
|
|
||||||
`SystemOS` and keeps `Background` outside the public lifecycle contract.
|
|
||||||
|
|
||||||
## Target
|
|
||||||
|
|
||||||
Make the lifecycle contract executable through unit tests and regression tests,
|
|
||||||
without expanding scope into background execution, UI behavior, or service
|
|
||||||
ownership.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
- Add `SystemOS` unit tests for all first-wave lifecycle operations.
|
|
||||||
- Add negative tests for missing task, missing process, and invalid transition.
|
|
||||||
- Add firmware-level regression coverage for lifecycle delegation where the
|
|
||||||
existing test harness can observe it.
|
|
||||||
- Keep manager tests focused on local storage and simple transitions.
|
|
||||||
|
|
||||||
## Out of Scope
|
|
||||||
|
|
||||||
- End-to-end UX tests for suspend/resume.
|
|
||||||
- Hub/Home navigation after lifecycle changes.
|
|
||||||
- Background services.
|
|
||||||
- Docking.
|
|
||||||
- App switching.
|
|
||||||
- Diagnostics persistence.
|
|
||||||
- WindowManager behavior changes.
|
|
||||||
|
|
||||||
## Execution Plan
|
|
||||||
|
|
||||||
1. Add core lifecycle mapping tests.
|
|
||||||
- Target file: `crates/console/prometeu-system/src/os/system_os.rs` or a
|
|
||||||
dedicated `os` test module following existing crate style.
|
|
||||||
- Verify:
|
|
||||||
- `set_foreground_task`: task becomes `Foreground`, process becomes
|
|
||||||
`Running`.
|
|
||||||
- `suspend_task`: task becomes `Suspended`, process becomes `Suspended`.
|
|
||||||
- `resume_task`: suspended task becomes `Foreground`, process becomes
|
|
||||||
`Running`.
|
|
||||||
- `close_task`: task becomes `Closed`, process becomes `Stopped`.
|
|
||||||
- `crash_task`: task becomes `Crashed`, process becomes `Crashed`.
|
|
||||||
|
|
||||||
2. Add error tests.
|
|
||||||
- Verify missing task returns `LifecycleError::TaskNotFound`.
|
|
||||||
- Verify a task whose process no longer exists returns
|
|
||||||
`LifecycleError::ProcessNotFound`.
|
|
||||||
- Verify invalid resume from non-suspended task returns
|
|
||||||
`LifecycleError::InvalidTransition` with operation `Resume`.
|
|
||||||
|
|
||||||
3. Add non-removal tests.
|
|
||||||
- Verify `close_task` leaves the closed task available through
|
|
||||||
`TaskManager::get`.
|
|
||||||
- Verify `close_task` leaves the stopped process available through
|
|
||||||
`ProcessManager::get`.
|
|
||||||
- Do not call `remove_closed` or `remove_stopped` as part of lifecycle API
|
|
||||||
tests.
|
|
||||||
|
|
||||||
4. Add background exclusion tests.
|
|
||||||
- Assert there is no `SystemOS::background_task` API added by this wave.
|
|
||||||
- Keep any existing `TaskState::Background` behavior in manager-level tests
|
|
||||||
documented as manager behavior, not first-wave lifecycle semantics.
|
|
||||||
|
|
||||||
5. Add firmware regression tests after `PLN-0056`.
|
|
||||||
- Target file: `crates/console/prometeu-firmware/src/firmware/firmware.rs`
|
|
||||||
or the relevant step test module.
|
|
||||||
- Verify game launch still enters `GameRunningStep`.
|
|
||||||
- Verify shell launch still enters `SystemRunningStep`.
|
|
||||||
- Verify a game crash path marks the active task as crashed when the test
|
|
||||||
harness can observe `ctx.os.task_manager`.
|
|
||||||
|
|
||||||
## Acceptance Criteria
|
|
||||||
|
|
||||||
- Every lifecycle method from `DEC-0025` has a positive `SystemOS` test.
|
|
||||||
- Missing task and missing process return typed lifecycle errors.
|
|
||||||
- Invalid resume transition is covered by a test.
|
|
||||||
- `close_task` is tested as mark-only, not removal.
|
|
||||||
- No test encodes `Background` as a normative first-wave lifecycle operation.
|
|
||||||
- Firmware regression tests still pass for game and shell launch.
|
|
||||||
|
|
||||||
## Tests / Validation
|
|
||||||
|
|
||||||
- Run `cargo test -p prometeu-system`.
|
|
||||||
- Run `cargo test -p prometeu-firmware`.
|
|
||||||
- If workspace-level tests are practical after these changes, run the relevant
|
|
||||||
workspace command used by this repository.
|
|
||||||
|
|
||||||
## Risks
|
|
||||||
|
|
||||||
- Some negative tests may require test-only helpers to create an inconsistent
|
|
||||||
task/process relationship. Prefer narrow test fixtures over making corruption
|
|
||||||
APIs public.
|
|
||||||
- Compile-time absence of `background_task` may not be directly testable
|
|
||||||
without compile-fail infrastructure. In that case, validate it by code review
|
|
||||||
and keep runtime tests focused on the exposed first-wave methods.
|
|
||||||
Loading…
x
Reference in New Issue
Block a user