diff --git a/crates/console/prometeu-firmware/src/firmware/firmware.rs b/crates/console/prometeu-firmware/src/firmware/firmware.rs index 2218e969..153fb92f 100644 --- a/crates/console/prometeu-firmware/src/firmware/firmware.rs +++ b/crates/console/prometeu-firmware/src/firmware/firmware.rs @@ -9,7 +9,6 @@ use prometeu_hal::log::LogSource; use prometeu_hal::telemetry::CertificationConfig; use prometeu_hal::{InputSignals, RuntimePlatform}; use prometeu_system::{PrometeuHub, ResidentGameState, SystemOS}; -use prometeu_vm::VirtualMachine; /// PROMETEU Firmware. /// @@ -27,8 +26,6 @@ use prometeu_vm::VirtualMachine; /// 2. Delegates the logic update to the current active state. /// 3. Handles state transitions (e.g., from Loading to Playing). pub struct Firmware { - /// The execution engine (PVM) for user applications. - pub vm: VirtualMachine, /// The underlying OS services (Syscalls, Filesystem, Telemetry). pub os: SystemOS, /// The internal state of the system launcher (Hub). @@ -46,7 +43,6 @@ impl Firmware { /// Initializes the firmware in the `Reset` state. pub fn new(cap_config: Option) -> Self { Self { - vm: VirtualMachine::default(), os: SystemOS::new(cap_config), hub: PrometeuHub::new(), state: FirmwareState::Reset(ResetStep), @@ -122,7 +118,6 @@ impl Firmware { /// Dispatches the `on_enter` event to the current state implementation. fn on_enter(&mut self, signals: &InputSignals, platform: &mut dyn RuntimePlatform) { let mut req = PrometeuContext { - vm: &mut self.vm, os: &mut self.os, hub: &mut self.hub, boot_target: &self.boot_target, @@ -150,7 +145,6 @@ impl Firmware { platform: &mut dyn RuntimePlatform, ) -> Option { let mut req = PrometeuContext { - vm: &mut self.vm, os: &mut self.os, hub: &mut self.hub, boot_target: &self.boot_target, @@ -173,7 +167,6 @@ impl Firmware { /// Dispatches the `on_exit` event to the current state implementation. fn on_exit(&mut self, signals: &InputSignals, platform: &mut dyn RuntimePlatform) { let mut req = PrometeuContext { - vm: &mut self.vm, os: &mut self.os, hub: &mut self.hub, boot_target: &self.boot_target, @@ -532,6 +525,24 @@ mod tests { assert!(matches!(firmware.state, FirmwareState::LaunchHub(_))); } + #[test] + fn reset_clears_vm_sessions_and_runtime_identity() { + let mut firmware = Firmware::new(None); + let mut platform = TestPlatform::new(); + let signals = InputSignals::default(); + + firmware.load_cartridge(valid_cartridge(AppMode::Game)); + firmware.tick(&signals, &mut platform); + + assert_eq!(firmware.os.sessions().vm_session_count(), 1); + assert_eq!(firmware.os.vm().current_cartridge_title(), "Valid Cart"); + + firmware.change_state(FirmwareState::Reset(ResetStep), &signals, &mut platform); + + assert_eq!(firmware.os.sessions().vm_session_count(), 0); + assert_eq!(firmware.os.vm().current_cartridge_title(), ""); + } + #[test] fn load_cartridge_routes_system_apps_to_system_running() { let mut firmware = Firmware::new(None); diff --git a/crates/console/prometeu-firmware/src/firmware/firmware_step_hub_home.rs b/crates/console/prometeu-firmware/src/firmware/firmware_step_hub_home.rs index fb27d40a..cc5479f7 100644 --- a/crates/console/prometeu-firmware/src/firmware/firmware_step_hub_home.rs +++ b/crates/console/prometeu-firmware/src/firmware/firmware_step_hub_home.rs @@ -20,7 +20,7 @@ impl HubHomeStep { } pub fn on_update(&mut self, ctx: &mut PrometeuContext) -> Option { - let outcome = ctx.hub.update_shell_profile(ctx.os, ctx.vm, ctx.signals, ctx.platform); + let outcome = ctx.hub.update_shell_profile(ctx.os, ctx.platform); if let Some(report) = outcome.crash { return Some(FirmwareState::AppCrashes(AppCrashesStep { report })); } diff --git a/crates/console/prometeu-firmware/src/firmware/firmware_step_load_cartridge.rs b/crates/console/prometeu-firmware/src/firmware/firmware_step_load_cartridge.rs index 9fedebad..397f9886 100644 --- a/crates/console/prometeu-firmware/src/firmware/firmware_step_load_cartridge.rs +++ b/crates/console/prometeu-firmware/src/firmware/firmware_step_load_cartridge.rs @@ -38,7 +38,7 @@ impl LoadCartridgeStep { self.cartridge.assets.clone(), ); - match ctx.os.sessions().load_vm_cartridge(ctx.vm, &self.cartridge) { + match ctx.os.sessions().load_vm_cartridge(&self.cartridge) { Ok(loaded) => { self.loaded_task_id = Some(loaded.task_id); self.loaded_app_mode = Some(loaded.app_mode); diff --git a/crates/console/prometeu-firmware/src/firmware/firmware_step_reset.rs b/crates/console/prometeu-firmware/src/firmware/firmware_step_reset.rs index 586e3026..6159e2b5 100644 --- a/crates/console/prometeu-firmware/src/firmware/firmware_step_reset.rs +++ b/crates/console/prometeu-firmware/src/firmware/firmware_step_reset.rs @@ -9,7 +9,8 @@ pub struct ResetStep; impl ResetStep { pub fn on_enter(&mut self, ctx: &mut PrometeuContext) { ctx.os.log(LogLevel::Info, LogSource::Pos, 0, "Firmware Reset".to_string()); - ctx.os.vm().reset(ctx.vm); + ctx.os.sessions().clear_vm_sessions(); + ctx.os.vm().reset_global_runtime_state(); } pub fn on_update(&mut self, ctx: &mut PrometeuContext) -> Option { diff --git a/crates/console/prometeu-firmware/src/firmware/prometeu_context.rs b/crates/console/prometeu-firmware/src/firmware/prometeu_context.rs index 9c37beed..9f7dc628 100644 --- a/crates/console/prometeu-firmware/src/firmware/prometeu_context.rs +++ b/crates/console/prometeu-firmware/src/firmware/prometeu_context.rs @@ -1,10 +1,8 @@ use crate::firmware::boot_target::BootTarget; use prometeu_hal::{InputSignals, RuntimePlatform}; use prometeu_system::{PrometeuHub, SystemOS}; -use prometeu_vm::VirtualMachine; pub struct PrometeuContext<'a> { - pub vm: &'a mut VirtualMachine, pub os: &'a mut SystemOS, pub hub: &'a mut PrometeuHub, pub boot_target: &'a BootTarget, diff --git a/crates/console/prometeu-system/src/os/facades/sessions.rs b/crates/console/prometeu-system/src/os/facades/sessions.rs index 3d41c2e4..0db29dc1 100644 --- a/crates/console/prometeu-system/src/os/facades/sessions.rs +++ b/crates/console/prometeu-system/src/os/facades/sessions.rs @@ -5,7 +5,6 @@ use crate::task::TaskId; use crate::vm_session::{VmSession, VmSessionError}; use prometeu_hal::app_mode::AppMode; use prometeu_hal::cartridge::Cartridge; -use prometeu_vm::VirtualMachine; use std::sync::Arc; #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -72,7 +71,6 @@ impl<'a> SessionsFacade<'a> { pub fn load_vm_cartridge( &mut self, - legacy_vm: &mut VirtualMachine, cartridge: &Cartridge, ) -> Result { let existing_game_task = if cartridge.app_mode == AppMode::Game { @@ -100,7 +98,6 @@ impl<'a> SessionsFacade<'a> { if !reused_existing_session { self.initialize_session_cartridge(task_id, cartridge)?; - self.initialize_legacy_active_vm(legacy_vm, cartridge)?; } Ok(LoadedVmCartridge { task_id, app_mode: cartridge.app_mode, reused_existing_session }) @@ -122,6 +119,10 @@ impl<'a> SessionsFacade<'a> { self.os.vm_sessions.len() } + pub fn clear_vm_sessions(&mut self) { + self.os.vm_sessions.clear(); + } + fn create_vm_session_for_task(&mut self, task_id: TaskId) -> Result<(), VmSessionError> { let task = self.os.task_manager.get(task_id).expect("session task should exist").clone(); let process = self @@ -157,13 +158,4 @@ impl<'a> SessionsFacade<'a> { session.clear_cartridge_service_state(); session.runtime.initialize_vm(&mut self.os.log_service, &mut session.vm, cartridge) } - - fn initialize_legacy_active_vm( - &mut self, - legacy_vm: &mut VirtualMachine, - cartridge: &Cartridge, - ) -> Result<(), CrashReport> { - self.os.clear_cartridge_service_state(); - self.os.vm_runtime.initialize_vm(&mut self.os.log_service, legacy_vm, cartridge) - } } diff --git a/crates/console/prometeu-system/src/os/facades/vm.rs b/crates/console/prometeu-system/src/os/facades/vm.rs index 87ba5cb8..367ac0f5 100644 --- a/crates/console/prometeu-system/src/os/facades/vm.rs +++ b/crates/console/prometeu-system/src/os/facades/vm.rs @@ -5,13 +5,11 @@ use crate::vm_session::VmSession; use crate::{RenderWorkerConfig, RenderWorkerController}; use prometeu_bytecode::Value; use prometeu_hal::app_mode::AppMode; -use prometeu_hal::cartridge::Cartridge; use prometeu_hal::telemetry::{CertificationConfig, TelemetryFrame}; use prometeu_hal::{ FrameId, InputSignals, RenderOwnership, RenderWorkerBackend, RenderWorkerError, RenderWorkerFrameSink, RuntimePlatform, }; -use prometeu_vm::VirtualMachine; use std::sync::atomic::Ordering; pub struct VmFacade<'a> { @@ -19,36 +17,6 @@ pub struct VmFacade<'a> { } impl<'a> VmFacade<'a> { - pub fn initialize( - &mut self, - vm: &mut VirtualMachine, - cartridge: &Cartridge, - ) -> Result<(), CrashReport> { - self.os.clear_cartridge_service_state(); - self.os.vm_runtime.initialize_vm(&mut self.os.log_service, vm, cartridge) - } - - pub fn tick( - &mut self, - vm: &mut VirtualMachine, - signals: &InputSignals, - platform: &mut dyn RuntimePlatform, - ) -> Option { - self.deliver_pending_game_lifecycle_events(); - - self.os.vm_runtime.tick( - &mut self.os.log_service, - &mut self.os.fs, - &mut self.os.fs_state, - &mut self.os.memcard, - &mut self.os.open_files, - &mut self.os.next_handle, - vm, - signals, - platform, - ) - } - pub fn tick_session( &mut self, task_id: TaskId, @@ -77,25 +45,6 @@ impl<'a> VmFacade<'a> { ) } - pub fn deliver_pending_game_lifecycle_events(&mut self) { - if self.os.vm_runtime.current_cartridge_app_mode == AppMode::Game { - let resident_game_task = self.os.foreground_stack.resident_game_task(); - let mut retained = Vec::new(); - let mut delivered = Vec::new(); - - for event in self.os.game_lifecycle_events.drain(..) { - if Some(event.task_id) == resident_game_task { - delivered.push(event); - } else { - retained.push(event); - } - } - - self.os.game_lifecycle_events = retained; - self.os.vm_runtime.deliver_game_lifecycle_events(delivered); - } - } - fn deliver_pending_game_lifecycle_events_to_session(&mut self, task_id: TaskId) { let Some(session) = self.os.vm_sessions.for_task(task_id) else { return; @@ -122,16 +71,9 @@ impl<'a> VmFacade<'a> { } } - pub fn reset(&mut self, vm: &mut VirtualMachine) { - self.os.vm_runtime.reset(vm); - } - - pub fn debug_step_instruction( - &mut self, - vm: &mut VirtualMachine, - platform: &mut dyn RuntimePlatform, - ) -> Option { - self.os.vm_runtime.debug_step_instruction(&mut self.os.log_service, vm, platform) + pub fn reset_global_runtime_state(&mut self) { + self.os.clear_cartridge_service_state(); + self.os.vm_runtime.clear_cartridge_state(); } pub fn debug_step_active_session( diff --git a/crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs b/crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs index d55546b1..28038739 100644 --- a/crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs +++ b/crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs @@ -6,7 +6,6 @@ use prometeu_hal::{ FrameId, GfxUiCommand, InputPlatform, InputSignals, RenderSubmission, RuntimePlatform, ShellUiFramePacket, }; -use prometeu_vm::VirtualMachine; use std::path::PathBuf; const SHELL_A_BUTTON: Rect = Rect { x: 112, y: 172, w: 112, h: 32 }; @@ -175,24 +174,17 @@ impl PrometeuHub { pub fn update_shell_profile( &mut self, os: &mut SystemOS, - vm: &mut VirtualMachine, - signals: &InputSignals, platform: &mut dyn RuntimePlatform, ) -> SystemProfileUpdate { - let mut crash = None; let mut action = self.gui_update(os, platform); - if os.windows().focused_window().is_some() { - if platform.input().pad().start().down { - action = Some(SystemProfileAction::CloseShell); - } else if action != Some(SystemProfileAction::CloseShell) { - crash = os.vm().tick(vm, signals, platform); - } + if os.windows().focused_window().is_some() && platform.input().pad().start().down { + action = Some(SystemProfileAction::CloseShell); } self.render(os, platform); - SystemProfileUpdate { crash, action } + SystemProfileUpdate { crash: None, action } } pub fn update_vm_shell_profile( diff --git a/crates/console/prometeu-system/src/services/vm_session.rs b/crates/console/prometeu-system/src/services/vm_session.rs index 88a005ef..caa023f3 100644 --- a/crates/console/prometeu-system/src/services/vm_session.rs +++ b/crates/console/prometeu-system/src/services/vm_session.rs @@ -138,6 +138,10 @@ impl VmSessionRegistry { pub fn is_empty(&self) -> bool { self.sessions.is_empty() } + + pub fn clear(&mut self) { + self.sessions.clear(); + } } fn app_mode_for_task_and_process( diff --git a/crates/host/prometeu-host-desktop-winit/src/debugger.rs b/crates/host/prometeu-host-desktop-winit/src/debugger.rs index c14df166..dc75992a 100644 --- a/crates/host/prometeu-host-desktop-winit/src/debugger.rs +++ b/crates/host/prometeu-host-desktop-winit/src/debugger.rs @@ -432,12 +432,11 @@ mod tests { } #[test] - fn breakpoint_commands_mutate_active_vm_session_not_legacy_vm() { + fn breakpoint_commands_mutate_active_vm_session() { let mut debugger = HostDebugger::new(); let mut firmware = Firmware::new(None); let mut platform = TestPlatform::new(); let task_id = firmware.os.sessions().create_vm_game_task(42, "Sector Crawl"); - firmware.vm.insert_breakpoint(9); debugger.handle_command( DebugCommand::SetBreakpoint { pc: 123 }, @@ -445,7 +444,6 @@ mod tests { &mut platform, ); - assert_eq!(firmware.vm.breakpoints_list(), vec![9]); assert_eq!( firmware .os @@ -463,7 +461,6 @@ mod tests { &mut platform, ); - assert_eq!(firmware.vm.breakpoints_list(), vec![9]); assert!( firmware .os diff --git a/discussion/index.ndjson b/discussion/index.ndjson index d1685785..1cc34561 100644 --- a/discussion/index.ndjson +++ b/discussion/index.ndjson @@ -2,7 +2,7 @@ {"type":"discussion","id":"DSC-0043","status":"open","ticket":"system-os-cartridge-switch-orchestrator","title":"SystemOS Cartridge Switch Orchestrator","created_at":"2026-07-03","updated_at":"2026-07-03","tags":["runtime","os","lifecycle","game","cartridge","architecture"],"agendas":[{"id":"AGD-0044","file":"AGD-0044-systemos-cartridge-switch-orchestrator.md","status":"open","created_at":"2026-07-03","updated_at":"2026-07-03"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0039","status":"abandoned","ticket":"render-pipeline-family-and-future-3d","title":"Render Pipeline Family and Future 3D","created_at":"2026-06-04","updated_at":"2026-06-04","tags":["gfx","renderer","runtime","architecture","pipeline"],"agendas":[{"id":"AGD-0039","file":"AGD-0039-render-pipeline-family-and-future-3d.md","status":"abandoned","created_at":"2026-06-04","updated_at":"2026-06-04","_override_reason":"User explicitly chose to close this agenda without a new decision because DSC-0038 already established enough architecture for future extension, and 3D is intentionally deferred."}],"decisions":[],"plans":[],"lessons":[],"_override_reason":"User explicitly chose to close this agenda without a new decision because DSC-0038 already established enough architecture for future extension, and 3D is intentionally deferred."} {"type":"discussion","id":"DSC-0040","status":"done","ticket":"vm-render-parallel-execution-boundary","title":"VM and Render Parallel Execution Boundary","created_at":"2026-06-04","updated_at":"2026-06-06","tags":["runtime","renderer","vm","concurrency","architecture","perf"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0048","file":"discussion/lessons/DSC-0040-vm-render-parallel-execution-boundary/LSN-0048-render-workers-need-a-closed-packet-contract.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-06"}]} -{"type":"discussion","id":"DSC-0041","status":"in_progress","ticket":"foreground-stack-game-pause-shell-vm-backed","title":"Foreground Stack, Game Pause, and VM-Backed Shell Coexistence","created_at":"2026-06-05","updated_at":"2026-07-05","tags":["runtime","os","lifecycle","shell","game","vm","foreground","architecture"],"agendas":[{"id":"AGD-0041","file":"AGD-0041-foreground-stack-game-pause-shell-vm-backed.md","status":"accepted","created_at":"2026-06-05","updated_at":"2026-07-03"},{"id":"AGD-0046","file":"AGD-0046-vm-context-ownership-for-resident-game-and-vm-backed-shell.md","status":"accepted","created_at":"2026-07-04","updated_at":"2026-07-04"}],"decisions":[{"id":"DEC-0037","file":"DEC-0037-foreground-stack-and-game-pause-contract.md","status":"accepted","created_at":"2026-07-03","updated_at":"2026-07-03","ref_agenda":"AGD-0041"},{"id":"DEC-0038","file":"DEC-0038-vm-session-ownership-for-vm-backed-processes.md","status":"accepted","created_at":"2026-07-04","updated_at":"2026-07-04","ref_agenda":"AGD-0046"}],"plans":[{"id":"PLN-0136","file":"PLN-0136-route-desktop-home-key-outside-guest-input.md","status":"done","created_at":"2026-07-03","updated_at":"2026-07-03","ref_decisions":["DEC-0037"]},{"id":"PLN-0137","file":"PLN-0137-implement-systemos-foreground-stack-state.md","status":"done","created_at":"2026-07-03","updated_at":"2026-07-03","ref_decisions":["DEC-0037"]},{"id":"PLN-0138","file":"PLN-0138-specify-foreground-pause-and-home-contract.md","status":"done","created_at":"2026-07-03","updated_at":"2026-07-03","ref_decisions":["DEC-0037"]},{"id":"PLN-0139","file":"PLN-0139-validate-game-home-shell-game-end-to-end.md","status":"done","created_at":"2026-07-03","updated_at":"2026-07-03","ref_decisions":["DEC-0037"]},{"id":"PLN-0140","file":"PLN-0140-deliver-game-pause-resume-and-suspension.md","status":"done","created_at":"2026-07-03","updated_at":"2026-07-03","ref_decisions":["DEC-0037"]},{"id":"PLN-0141","file":"PLN-0141-integrate-render-audio-and-input-pause-boundaries.md","status":"done","created_at":"2026-07-03","updated_at":"2026-07-03","ref_decisions":["DEC-0037"]},{"id":"PLN-0142","file":"PLN-0142-deliver-game-lifecycle-events-to-vm-runtime.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0037"]},{"id":"PLN-0143","file":"PLN-0143-guarantee-cooperative-pause-budget-tick-before-suspension.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0037"]},{"id":"PLN-0144","file":"PLN-0144-suspend-resident-game-when-shell-takes-foreground.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0037"]},{"id":"PLN-0145","file":"PLN-0145-centralize-resident-game-resume-transition.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0037"]},{"id":"PLN-0146","file":"PLN-0146-consolidate-lifecycle-process-lookup-helpers.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0037"]},{"id":"PLN-0147","file":"PLN-0147-move-native-shell-profile-update-into-hub.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0037"]},{"id":"PLN-0148","file":"PLN-0148-introduce-vm-session-registry-and-identity.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0038"]},{"id":"PLN-0149","file":"PLN-0149-move-vm-runtime-state-into-vm-sessions.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0038"]},{"id":"PLN-0150","file":"PLN-0150-route-cartridge-loading-through-vm-sessions.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0038"]},{"id":"PLN-0151","file":"PLN-0151-schedule-foreground-vm-session-ticks.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0038"]},{"id":"PLN-0152","file":"PLN-0152-validate-game-and-vm-shell-session-coexistence.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0038"]},{"id":"PLN-0153","file":"PLN-0153-specify-vm-session-ownership-and-background-ready-scheduling.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0038"]},{"id":"PLN-0154","file":"PLN-0154-route-debugger-operations-through-vm-sessions.md","status":"done","created_at":"2026-07-05","updated_at":"2026-07-05","ref_decisions":["DEC-0038"]},{"id":"PLN-0155","file":"PLN-0155-retire-legacy-firmware-vm-runtime-bridge.md","status":"open","created_at":"2026-07-05","updated_at":"2026-07-05","ref_decisions":["DEC-0038"]},{"id":"PLN-0156","file":"PLN-0156-harden-vm-session-lifecycle-error-boundaries.md","status":"open","created_at":"2026-07-05","updated_at":"2026-07-05","ref_decisions":["DEC-0038"]}],"lessons":[]} +{"type":"discussion","id":"DSC-0041","status":"in_progress","ticket":"foreground-stack-game-pause-shell-vm-backed","title":"Foreground Stack, Game Pause, and VM-Backed Shell Coexistence","created_at":"2026-06-05","updated_at":"2026-07-05","tags":["runtime","os","lifecycle","shell","game","vm","foreground","architecture"],"agendas":[{"id":"AGD-0041","file":"AGD-0041-foreground-stack-game-pause-shell-vm-backed.md","status":"accepted","created_at":"2026-06-05","updated_at":"2026-07-03"},{"id":"AGD-0046","file":"AGD-0046-vm-context-ownership-for-resident-game-and-vm-backed-shell.md","status":"accepted","created_at":"2026-07-04","updated_at":"2026-07-04"}],"decisions":[{"id":"DEC-0037","file":"DEC-0037-foreground-stack-and-game-pause-contract.md","status":"accepted","created_at":"2026-07-03","updated_at":"2026-07-03","ref_agenda":"AGD-0041"},{"id":"DEC-0038","file":"DEC-0038-vm-session-ownership-for-vm-backed-processes.md","status":"accepted","created_at":"2026-07-04","updated_at":"2026-07-04","ref_agenda":"AGD-0046"}],"plans":[{"id":"PLN-0136","file":"PLN-0136-route-desktop-home-key-outside-guest-input.md","status":"done","created_at":"2026-07-03","updated_at":"2026-07-03","ref_decisions":["DEC-0037"]},{"id":"PLN-0137","file":"PLN-0137-implement-systemos-foreground-stack-state.md","status":"done","created_at":"2026-07-03","updated_at":"2026-07-03","ref_decisions":["DEC-0037"]},{"id":"PLN-0138","file":"PLN-0138-specify-foreground-pause-and-home-contract.md","status":"done","created_at":"2026-07-03","updated_at":"2026-07-03","ref_decisions":["DEC-0037"]},{"id":"PLN-0139","file":"PLN-0139-validate-game-home-shell-game-end-to-end.md","status":"done","created_at":"2026-07-03","updated_at":"2026-07-03","ref_decisions":["DEC-0037"]},{"id":"PLN-0140","file":"PLN-0140-deliver-game-pause-resume-and-suspension.md","status":"done","created_at":"2026-07-03","updated_at":"2026-07-03","ref_decisions":["DEC-0037"]},{"id":"PLN-0141","file":"PLN-0141-integrate-render-audio-and-input-pause-boundaries.md","status":"done","created_at":"2026-07-03","updated_at":"2026-07-03","ref_decisions":["DEC-0037"]},{"id":"PLN-0142","file":"PLN-0142-deliver-game-lifecycle-events-to-vm-runtime.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0037"]},{"id":"PLN-0143","file":"PLN-0143-guarantee-cooperative-pause-budget-tick-before-suspension.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0037"]},{"id":"PLN-0144","file":"PLN-0144-suspend-resident-game-when-shell-takes-foreground.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0037"]},{"id":"PLN-0145","file":"PLN-0145-centralize-resident-game-resume-transition.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0037"]},{"id":"PLN-0146","file":"PLN-0146-consolidate-lifecycle-process-lookup-helpers.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0037"]},{"id":"PLN-0147","file":"PLN-0147-move-native-shell-profile-update-into-hub.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0037"]},{"id":"PLN-0148","file":"PLN-0148-introduce-vm-session-registry-and-identity.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0038"]},{"id":"PLN-0149","file":"PLN-0149-move-vm-runtime-state-into-vm-sessions.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0038"]},{"id":"PLN-0150","file":"PLN-0150-route-cartridge-loading-through-vm-sessions.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0038"]},{"id":"PLN-0151","file":"PLN-0151-schedule-foreground-vm-session-ticks.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0038"]},{"id":"PLN-0152","file":"PLN-0152-validate-game-and-vm-shell-session-coexistence.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0038"]},{"id":"PLN-0153","file":"PLN-0153-specify-vm-session-ownership-and-background-ready-scheduling.md","status":"done","created_at":"2026-07-04","updated_at":"2026-07-04","ref_decisions":["DEC-0038"]},{"id":"PLN-0154","file":"PLN-0154-route-debugger-operations-through-vm-sessions.md","status":"done","created_at":"2026-07-05","updated_at":"2026-07-05","ref_decisions":["DEC-0038"]},{"id":"PLN-0155","file":"PLN-0155-retire-legacy-firmware-vm-runtime-bridge.md","status":"done","created_at":"2026-07-05","updated_at":"2026-07-05","ref_decisions":["DEC-0038"]},{"id":"PLN-0156","file":"PLN-0156-harden-vm-session-lifecycle-error-boundaries.md","status":"open","created_at":"2026-07-05","updated_at":"2026-07-05","ref_decisions":["DEC-0038"]}],"lessons":[]} {"type":"discussion","id":"DSC-0042","status":"done","ticket":"real-render-worker-establishment","title":"Real Render Worker Establishment","created_at":"2026-06-06","updated_at":"2026-06-20","tags":["runtime","renderer","worker","concurrency","host","hal","architecture"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0049","file":"discussion/lessons/DSC-0042-real-render-worker-establishment/LSN-0049-render-worker-publication-boundary.md","status":"done","created_at":"2026-06-20","updated_at":"2026-06-20"}]} {"type":"discussion","id":"DSC-0038","status":"done","ticket":"render-frame-packet-boundary","title":"Logical Render Pipelines and Command Packets","created_at":"2026-05-25","updated_at":"2026-06-04","tags":["gfx","renderer","runtime","frame-composer","architecture","ui","pipeline"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0047","file":"discussion/lessons/DSC-0038-render-frame-packet-boundary/LSN-0047-typed-render-submissions-preserve-domain-boundaries.md","status":"done","created_at":"2026-06-04","updated_at":"2026-06-04"}]} {"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"}]} diff --git a/discussion/workflow/plans/PLN-0155-retire-legacy-firmware-vm-runtime-bridge.md b/discussion/workflow/plans/PLN-0155-retire-legacy-firmware-vm-runtime-bridge.md index 28757dc1..df572e05 100644 --- a/discussion/workflow/plans/PLN-0155-retire-legacy-firmware-vm-runtime-bridge.md +++ b/discussion/workflow/plans/PLN-0155-retire-legacy-firmware-vm-runtime-bridge.md @@ -2,7 +2,7 @@ id: PLN-0155 ticket: foreground-stack-game-pause-shell-vm-backed title: Retire Legacy Firmware VM Runtime Bridge -status: open +status: done created: 2026-07-05 ref_decisions: [DEC-0038] tags: [runtime, os, lifecycle, shell, game, vm, foreground, architecture]