* refactor: render chat rows from presentation state * Fix Meshtastic channel sync and add MeshCore CN preset * Add granular chat notification settings * Add SD settings backup and restore * Prepare 0.1.26-alpha release --------- Co-authored-by: vicliu624 <vicliu@outlook.com>
3.3 KiB
Phase 5 Final Readiness Report
Decision
Phase 5 is ready to close.
The project has established a sustainable UI Presentation boundary that Phase 6 can build on.
This decision does not mean the UI is fully clean. It means the remaining legacy areas are bounded, documented, and guarded against uncontrolled expansion.
What Phase 5 Established
Phase 5 established the UI presentation boundary:
App Service
-> Presentation Source/Sink
-> Presentation Model
-> Renderer / Shell
Renderers should consume snapshots and send actions.
Presentation models should own UI-local state and action forwarding, not business runtime state.
Legacy adapters should isolate compatibility reads/writes.
Completed Boundaries
Phase 5 established:
DeviceStatusModelGpsStatusModelMeshStatusModelSettingsModelChatWorkspaceModel- Team
ChatWorkspaceModel MapWorkspaceModelPresentationWorkspace
It also established:
- chat presentation identity and mappers
- Team chat bounded presentation context
- map workspace minimal boundary
- workspace composition/probe boundary
- renderer hardening and migrated path locks
- legacy renderer baseline
Renderer Hardening
Phase 5.9 introduced renderer hardening:
- strict rules for
ui_presentation - strict rules for ASCII/headless probes
- migrated path locks for Chat, Team Chat, and Map
- LVGL dashboard GPS status snapshot rendering
- uConsole presentation bridge locks
- baseline for legacy renderer islands
Remaining Legacy Islands
See:
PHASE5_LEGACY_ISLAND_REGISTER.mdPHASE5_RENDERER_HARDENING_SUMMARY.mdKNOWN_PRODUCT_ARCHITECTURE_VIOLATIONS.md
Major remaining legacy islands:
ChatUiControllerGPSPageStateui/widgets/map/map_viewport- uConsole tile/cache/contour model
- Team location/command picker
- key verification modal
- route/tracker overlays
- structured pending/failure ownership
Phase 5 Exit Criteria
| Criterion | Status |
|---|---|
| Portable presentation models exist | pass |
| Source/Sink boundaries exist | pass |
| Chat/Team/Map have bounded adapters | pass |
| Workspace composition exists | pass |
| ASCII/headless probes exist | pass |
| Renderer hardening exists | pass |
| Legacy islands documented | pass |
| Legacy renderer baseline exists | pass |
| Final checker exists | pass |
Non-goals
Phase 5 did not fully clean:
ChatUiControllerGPSPageStatemap_viewporttile renderer- uConsole tile/cache/contour model
- Team rich payload UI
- structured pending/failure
- route planning
- settings full migration
These are future bounded cleanup phases.
Fitness Functions
Phase 5 readiness is guarded by:
python tools/architecture/check_phase5_ready.py
python tools/architecture/check_phase5_workspace_ready.py
python tools/architecture/check_phase5_renderer_ready.py
python tools/architecture/check_phase5_final_ready.py
Phase 6 Readiness
Phase 6 may start because UI presentation boundaries are now explicit.
Phase 6 must not bypass Phase 5 boundaries. New UI work should use presentation models, source/sink adapters, and renderer snapshot/action paths.
If Phase 6 needs to touch a legacy island, it should either preserve the current bounded legacy contract or migrate that island behind a stricter presentation boundary.