190 lines
5.7 KiB
Markdown
190 lines
5.7 KiB
Markdown
---
|
|
id: DEC-0026
|
|
ticket: system-os-domain-facades
|
|
title: SystemOS Domain Facades
|
|
status: accepted
|
|
created: 2026-05-15
|
|
ref_agenda: AGD-0034
|
|
tags: [runtime, os, services, api-surface, lifecycle, fs]
|
|
---
|
|
|
|
## Status
|
|
|
|
Accepted. Esta decisão foi aceita em 2026-05-15 e passa a ser referência
|
|
normativa para compartimentalizar a superfície pública do `SystemOS`.
|
|
|
|
## Contexto
|
|
|
|
`DEC-0024` consolidou `SystemOS` como owner de serviços do Prometeu OS.
|
|
`DEC-0025` colocou o lifecycle de `Task` e `Process` sob autoridade do
|
|
`SystemOS`.
|
|
|
|
Essas decisões estão corretas em termos de ownership, mas fizeram a raiz do
|
|
`SystemOS` crescer como superfície pública. Hoje a raiz mistura runtime VM,
|
|
filesystem, memcard, window management, lifecycle, managers internos, handles
|
|
operacionais e helpers de criação de tasks/processos.
|
|
|
|
Esta decisão não muda o ownership: `SystemOS` continua sendo o boundary do OS.
|
|
O que muda é a forma normativa de acesso aos domínios.
|
|
|
|
## Decisao
|
|
|
|
`SystemOS` SHALL expose OS behavior through domain facades.
|
|
|
|
The canonical first-wave access shape SHALL be method-based, borrow-friendly
|
|
views:
|
|
|
|
```rust
|
|
os.lifecycle().suspend_task(task_id)
|
|
os.sessions().create_vm_game_task(app_id, title)
|
|
os.vm().initialize(vm, cartridge)
|
|
os.fs().mount(backend)
|
|
os.window().set_focus(window_id)
|
|
os.log(level, source, tag, msg)
|
|
```
|
|
|
|
Direct field syntax such as `os.lifecycle.suspend_task(...)` is NOT required in
|
|
this wave. Domain clarity is normative; direct field ownership is not.
|
|
|
|
The first-wave `SystemOS` root SHALL keep only minimal root operations:
|
|
|
|
```text
|
|
SystemOS
|
|
new(...)
|
|
log(...)
|
|
lifecycle()
|
|
sessions()
|
|
vm()
|
|
fs()
|
|
window()
|
|
```
|
|
|
|
`log(...)` MAY remain on the root because logging is a cross-cutting operation
|
|
used by multiple firmware and OS domains.
|
|
|
|
The first-wave domain surface SHALL be:
|
|
|
|
```text
|
|
lifecycle()
|
|
set_foreground_task
|
|
suspend_task
|
|
resume_task
|
|
close_task
|
|
crash_task
|
|
|
|
sessions()
|
|
create_vm_game_task
|
|
create_vm_shell_task
|
|
create_native_shell_task
|
|
|
|
vm()
|
|
initialize
|
|
tick
|
|
|
|
fs()
|
|
mount
|
|
open
|
|
read
|
|
write
|
|
close
|
|
|
|
window()
|
|
add_window
|
|
set_focus
|
|
focused_window
|
|
close_window
|
|
```
|
|
|
|
Internal service state SHALL NOT remain public on `SystemOS` once the
|
|
corresponding facade exists. This includes:
|
|
|
|
- `task_manager`
|
|
- `process_manager`
|
|
- `window_manager`
|
|
- `vm_runtime`
|
|
- `fs`
|
|
- `fs_state`
|
|
- `memcard`
|
|
- `open_files`
|
|
- `next_handle`
|
|
|
|
Plans MAY use temporary transitional access only when needed to keep migrations
|
|
small, but the completed first-wave facade migration MUST remove direct public
|
|
access for migrated domains.
|
|
|
|
## Rationale
|
|
|
|
`SystemOS` should remain the owner of OS services, but callers should not see it
|
|
as a bag of unrelated fields and root methods. Domain facades make the API read
|
|
like an OS surface:
|
|
|
|
- lifecycle operations live under lifecycle;
|
|
- session construction lives under sessions;
|
|
- VM execution lives under vm;
|
|
- filesystem operations live under fs;
|
|
- window operations live under window;
|
|
- logging remains root-level because it cuts across domains.
|
|
|
|
Method-based facades are preferred over direct fields in this wave because they
|
|
preserve Rust borrowing flexibility. A facade can be a temporary view over
|
|
multiple internal fields without forcing premature service ownership splits.
|
|
|
|
This also protects `DEC-0025`: lifecycle remains the semantic coordinator for
|
|
`TaskState` and `ProcessState`, but callers reach it through
|
|
`os.lifecycle()`, not through root methods or direct manager access.
|
|
|
|
## Invariantes / Contrato
|
|
|
|
- `SystemOS` MUST remain the OS ownership and coordination boundary.
|
|
- Facades MUST be views or handles over `SystemOS` internals unless a later
|
|
decision explicitly promotes a domain to an independently owned service.
|
|
- Facades MUST NOT duplicate state.
|
|
- Root-level `SystemOS` API MUST stay minimal.
|
|
- Lifecycle operations MUST move from root-level `SystemOS` methods to
|
|
`os.lifecycle()`.
|
|
- Session creation helpers MUST move to `os.sessions()`.
|
|
- VM initialization and ticking MUST move to `os.vm()`.
|
|
- Filesystem operations MUST move to `os.fs()`.
|
|
- Window operations MUST move to `os.window()`.
|
|
- Logging MAY remain as `os.log(...)`.
|
|
- Firmware, Hub and tests SHOULD use facades instead of direct internal fields.
|
|
- Tests for domain behavior SHOULD live at the facade/domain level.
|
|
- `SystemOS` tests SHOULD focus on composition and cross-domain coordination.
|
|
|
|
## Impactos
|
|
|
|
- `crates/console/prometeu-system/src/os/` should gain facade/view types for
|
|
lifecycle, sessions, VM, filesystem and window domains.
|
|
- Existing root methods such as `suspend_task`, `resume_task`, `close_task`,
|
|
`crash_task`, `initialize_vm`, `tick_vm`, `mount_fs`, `create_vm_game_task`,
|
|
`create_vm_shell_task` and `create_native_shell_task` should migrate behind
|
|
domain facades.
|
|
- Direct access to managers and service fields from firmware, Hub and tests
|
|
should be removed or narrowed.
|
|
- Filesystem state may require a dedicated facade because it spans `VirtualFS`,
|
|
`FsState`, file handles, memcard-adjacent state and logging.
|
|
- Window access should move away from `os.window_manager` to `os.window()`.
|
|
- Specs do not need immediate updates unless these facades become part of a
|
|
published external API.
|
|
|
|
## Referencias
|
|
|
|
- Agenda: `AGD-0034`
|
|
- Related decision: `DEC-0024`
|
|
- Related decision: `DEC-0025`
|
|
|
|
## Propagacao Necessaria
|
|
|
|
- Plans: create small plans for lifecycle facade, sessions/vm facade, fs facade,
|
|
window facade and internal field encapsulation.
|
|
- Code: update `prometeu-system`, firmware, Hub and tests to use domain
|
|
facades.
|
|
- Tests: move lifecycle/session/fs/window assertions to domain-level tests where
|
|
possible.
|
|
- Discussion: keep this decision separate from future decisions about true
|
|
service ownership splits.
|
|
|
|
## Revisao
|
|
|
|
- 2026-05-15: Initial accepted decision from `AGD-0034`.
|