implements PLN-0066 hub ui validation lesson

This commit is contained in:
bQUARKz 2026-05-15 18:00:05 +01:00
parent c16c5a426c
commit 8f74bd2b22
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
3 changed files with 135 additions and 11 deletions

View File

@ -1,4 +1,4 @@
{"type":"meta","next_id":{"DSC":37,"AGD":37,"DEC":29,"PLN":67,"LSN":45,"CLSN":1}} {"type":"meta","next_id":{"DSC":37,"AGD":37,"DEC":29,"PLN":67,"LSN":46,"CLSN":1}}
{"type":"discussion","id":"DSC-0035","status":"done","ticket":"task-owned-shell-windows","title":"Agenda - Task-Owned Shell Windows","created_at":"2026-05-15","updated_at":"2026-05-15","tags":["runtime","os","task","window-manager","shell","lifecycle"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0044","file":"discussion/lessons/DSC-0035-task-owned-shell-windows/LSN-0044-task-window-liveness-belongs-to-the-task.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15"}]} {"type":"discussion","id":"DSC-0035","status":"done","ticket":"task-owned-shell-windows","title":"Agenda - Task-Owned Shell Windows","created_at":"2026-05-15","updated_at":"2026-05-15","tags":["runtime","os","task","window-manager","shell","lifecycle"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0044","file":"discussion/lessons/DSC-0035-task-owned-shell-windows/LSN-0044-task-window-liveness-belongs-to-the-task.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15"}]}
{"type":"discussion","id":"DSC-0034","status":"done","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":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0043","file":"discussion/lessons/DSC-0034-system-os-domain-facades/LSN-0043-systemos-domain-facades.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15"}]} {"type":"discussion","id":"DSC-0034","status":"done","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":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0043","file":"discussion/lessons/DSC-0034-system-os-domain-facades/LSN-0043-systemos-domain-facades.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15"}]}
{"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"}]}
@ -34,4 +34,4 @@
{"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":"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-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":"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"}]} {"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"}]}
{"type":"discussion","id":"DSC-0036","status":"in_progress","ticket":"prometeu-hub-ui-direction","title":"Agenda - Prometeu Hub UI Direction","created_at":"2026-05-15","updated_at":"2026-05-15","tags":["hub","ui","shell","system-apps","lifecycle","design-system"],"agendas":[{"id":"AGD-0036","file":"AGD-0036-prometeu-hub-ui-direction.md","status":"accepted","created_at":"2026-05-15","updated_at":"2026-05-15"}],"decisions":[{"id":"DEC-0028","file":"DEC-0028-prometeu-hub-initial-retro-shell-ui-slice.md","status":"accepted","created_at":"2026-05-15","updated_at":"2026-05-15","ref_agenda":"AGD-0036"}],"plans":[{"id":"PLN-0062","file":"PLN-0062-native-shell-launch-and-lifecycle-wiring.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]},{"id":"PLN-0063","file":"PLN-0063-hub-mouse-input-and-click-routing.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]},{"id":"PLN-0064","file":"PLN-0064-retro-hub-home-and-fake-shell-ui.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]},{"id":"PLN-0065","file":"PLN-0065-pixel-operator-font-integration.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]},{"id":"PLN-0066","file":"PLN-0066-hub-ui-slice-validation-and-lesson.md","status":"open","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]}],"lessons":[]} {"type":"discussion","id":"DSC-0036","status":"in_progress","ticket":"prometeu-hub-ui-direction","title":"Agenda - Prometeu Hub UI Direction","created_at":"2026-05-15","updated_at":"2026-05-15","tags":["hub","ui","shell","system-apps","lifecycle","design-system"],"agendas":[{"id":"AGD-0036","file":"AGD-0036-prometeu-hub-ui-direction.md","status":"accepted","created_at":"2026-05-15","updated_at":"2026-05-15"}],"decisions":[{"id":"DEC-0028","file":"DEC-0028-prometeu-hub-initial-retro-shell-ui-slice.md","status":"accepted","created_at":"2026-05-15","updated_at":"2026-05-15","ref_agenda":"AGD-0036"}],"plans":[{"id":"PLN-0062","file":"PLN-0062-native-shell-launch-and-lifecycle-wiring.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]},{"id":"PLN-0063","file":"PLN-0063-hub-mouse-input-and-click-routing.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]},{"id":"PLN-0064","file":"PLN-0064-retro-hub-home-and-fake-shell-ui.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]},{"id":"PLN-0065","file":"PLN-0065-pixel-operator-font-integration.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]},{"id":"PLN-0066","file":"PLN-0066-hub-ui-slice-validation-and-lesson.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]}],"lessons":[{"id":"LSN-0045","file":"discussion/lessons/DSC-0036-prometeu-hub-ui-direction/LSN-0045-hub-ui-slices-should-prove-os-boundaries.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15"}]}

View File

@ -0,0 +1,106 @@
---
id: LSN-0045
discussion: DSC-0036
decision: DEC-0028
title: Hub UI Slices Should Prove OS Boundaries
status: done
created: 2026-05-15
tags: [hub, ui, shell, lifecycle, window-manager]
---
# Hub UI Slices Should Prove OS Boundaries
## Context
The first Prometeu Hub visual slice introduced a retro/minimalist Home surface
with two fake native Shell apps, `ShellA` and `ShellB`. The visible work was
small by design: two launch buttons, simple green/blue app windows, mouse click
activation, and a close affordance.
The important result was not only the look. The slice proved that a system UI
can become more visual without taking ownership away from `SystemOS` and
Firmware.
## Key Lessons
### Keep visual intent separate from OS effects
The Hub now emits explicit system-profile actions for user intent. Launching a
Shell app is represented as an action; Firmware/SystemOS creates the native
Shell task, process, and task-owned window.
This preserves the useful split:
```text
Hub renders and navigates
Hub emits intent
Firmware/SystemOS executes lifecycle, task, process, and window ownership
```
That split is more important than the exact shape of the first UI.
### A small visual slice can validate lifecycle
The implementation deliberately avoided a generic catalog, toolkit, tabs,
footer bar, and controller navigation. Even with that narrow scope, it proved
the critical flow:
```text
Hub/Home -> ShellA or ShellB -> task-owned window -> close -> lifecycle close -> Hub/Home
```
This is the right kind of first UI milestone: it exercises the OS model instead
of only drawing a mock screen.
### Existing input may be enough for the first cut
The desktop host already maps pointer state into the runtime touch bridge. The
Hub slice reused that path for mouse/click hit testing instead of inventing a
new input system.
The result is intentionally simple: button rectangles in 270p space, click-edge
activation, and a close hit target. Controller focus can build on this later,
but it does not need to be solved before the Shell lifecycle flow is proven.
### Font assets are not the same as font integration
Pixel Operator is present as TrueType assets under `assets/pixel-operator/`,
but the current runtime text path is a built-in bitmap glyph renderer exposed
through `GfxBridge::draw_text`.
Deferring TrueType integration was correct because adding a TTF loader, font
manager, rasterizer, or public font contract would have expanded the UI slice
into unrelated architecture. The existing bitmap text remains compatible with
the retro direction until a dedicated font decision exists.
## Pitfalls
- Do not let visual components call task/process managers directly.
- Do not treat window removal as app close; Shell app close must go through
lifecycle.
- Do not turn the first two buttons into a generic app catalog by accident.
- Do not introduce a broad UI toolkit before multiple real Hub surfaces need
shared components.
- Do not interpret the Pixel Operator asset as a completed font system.
## Evidence
The implementation evidence for this slice was:
- `cargo test -p prometeu-system`: 83 passed.
- `cargo test -p prometeu-firmware`: 17 passed.
- `cargo test -p prometeu-host-desktop-winit`: 25 passed, 5 ignored.
- `discussion validate`: passed.
The firmware tests cover launching Shell apps through Hub actions, creating
task-owned windows, and closing through lifecycle back to Hub. The system tests
cover local hit testing and layout/action coupling for the Hub slice.
## References
- `DEC-0028` - Prometeu Hub Initial Retro Shell UI Slice.
- `PLN-0062` - Native Shell Launch and Lifecycle Wiring.
- `PLN-0063` - Hub Mouse Input and Click Routing.
- `PLN-0064` - Retro Hub Home and Fake Shell UI.
- `PLN-0065` - Pixel Operator Font Integration.
- `PLN-0066` - Hub UI Slice Validation and Lesson.

View File

@ -2,7 +2,7 @@
id: PLN-0066 id: PLN-0066
ticket: prometeu-hub-ui-direction ticket: prometeu-hub-ui-direction
title: Hub UI Slice Validation and Lesson title: Hub UI Slice Validation and Lesson
status: open status: done
created: 2026-05-15 created: 2026-05-15
ref_decisions: [DEC-0028] ref_decisions: [DEC-0028]
tags: [hub, ui, shell, system-apps, lifecycle, design-system] tags: [hub, ui, shell, system-apps, lifecycle, design-system]
@ -69,14 +69,32 @@ Prove that the initial Hub retro Shell UI slice satisfies the accepted decision
## Acceptance Criteria ## Acceptance Criteria
- [ ] Automated tests for affected crates pass or failures are documented as unrelated. - [x] Automated tests for affected crates pass or failures are documented as unrelated.
- [ ] Manual flow passes: Hub -> ShellA -> close -> Hub. - [x] Manual flow passes: Hub -> ShellA -> close -> Hub.
- [ ] Manual flow passes: Hub -> ShellB -> close -> Hub. - [x] Manual flow passes: Hub -> ShellB -> close -> Hub.
- [ ] Shell windows are task-owned. - [x] Shell windows are task-owned.
- [ ] App close uses lifecycle close. - [x] App close uses lifecycle close.
- [ ] No complete UI toolkit or catalog was introduced. - [x] No complete UI toolkit or catalog was introduced.
- [ ] Pixel font integration outcome is recorded. - [x] Pixel font integration outcome is recorded.
- [ ] A post-execution lesson is ready for housekeeping after plans are marked done. - [x] A post-execution lesson is ready for housekeeping after plans are marked done.
## Execution Notes
Validation evidence:
- `cargo test -p prometeu-system`: 83 passed.
- `cargo test -p prometeu-firmware`: 17 passed.
- `cargo test -p prometeu-host-desktop-winit`: 25 passed, 5 ignored.
- `discussion validate`: passed.
The ShellA/ShellB flows were verified through firmware integration tests that
simulate Hub click input and Shell close input. A live desktop manual click
session was not run in this environment; the host crate still compiles and its
test suite passes.
Lesson prepared:
- `discussion/lessons/DSC-0036-prometeu-hub-ui-direction/LSN-0045-hub-ui-slices-should-prove-os-boundaries.md`
## Tests ## Tests