From cfb5b1ac89d2dc2661aa71eb6e7e0421fd371930 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Mon, 15 Jun 2026 16:20:46 +0100 Subject: [PATCH] implements PLN-0117 --- .../vm_runtime/async_render_contract_tests.rs | 6 +- .../src/services/vm_runtime/lifecycle.rs | 37 ++++++++++++ .../src/services/vm_runtime/mod.rs | 2 + .../src/services/vm_runtime/render_manager.rs | 14 ++++- .../src/services/vm_runtime/render_worker.rs | 59 ++++++++++++++++++- .../src/services/vm_runtime/tick.rs | 19 ++++-- discussion/index.ndjson | 2 +- ...ntegrate-runtime-submission-with-worker.md | 2 +- 8 files changed, 126 insertions(+), 15 deletions(-) diff --git a/crates/console/prometeu-system/src/services/vm_runtime/async_render_contract_tests.rs b/crates/console/prometeu-system/src/services/vm_runtime/async_render_contract_tests.rs index bc145990..613e694c 100644 --- a/crates/console/prometeu-system/src/services/vm_runtime/async_render_contract_tests.rs +++ b/crates/console/prometeu-system/src/services/vm_runtime/async_render_contract_tests.rs @@ -112,7 +112,7 @@ fn matrix_packet_policy_and_pacing_are_mode_specific() { assert_eq!(game_policy.execution, RenderExecutionPolicy::WorkerCapableWithLocalFallback); assert_eq!( game_policy.resolve_consumer_path(RenderRuntimeCapabilities { game_render_worker: true }), - RenderConsumerPath::LocalWorkerPrototype + RenderConsumerPath::RealWorker ); let shell_policy = RenderPolicy::for_app_mode(AppMode::Shell); @@ -163,7 +163,7 @@ fn matrix_sync_and_worker_paths_share_latest_wins_handoff_contract() { let outcome = match path { RenderConsumerPath::LocalSynchronous => manager.consume_latest(&mut surface), - RenderConsumerPath::LocalWorkerPrototype => { + RenderConsumerPath::RealWorker => { let mut worker = LocalRenderWorker; worker.consume_latest(&mut manager, &mut surface) } @@ -172,7 +172,7 @@ fn matrix_sync_and_worker_paths_share_latest_wins_handoff_contract() { (outcome, surface.seen, manager.render_telemetry().replaced_before_consume) } - for path in [RenderConsumerPath::LocalSynchronous, RenderConsumerPath::LocalWorkerPrototype] { + for path in [RenderConsumerPath::LocalSynchronous, RenderConsumerPath::RealWorker] { let (outcome, seen, replaced) = consume_with(path); assert_eq!(outcome, RenderConsumeOutcome::Presented { frame_id: FrameId::new(1) }); assert_eq!(seen, vec![FrameId::new(1)]); diff --git a/crates/console/prometeu-system/src/services/vm_runtime/lifecycle.rs b/crates/console/prometeu-system/src/services/vm_runtime/lifecycle.rs index 71d26ba5..09478c82 100644 --- a/crates/console/prometeu-system/src/services/vm_runtime/lifecycle.rs +++ b/crates/console/prometeu-system/src/services/vm_runtime/lifecycle.rs @@ -3,6 +3,7 @@ use crate::CrashReport; use crate::fs::{FsBackend, FsState, VirtualFS}; use prometeu_hal::cartridge::Cartridge; use prometeu_hal::log::{LogLevel, LogSource}; +use prometeu_hal::{RenderWorkerBackend, RenderWorkerError, RenderWorkerFrameSink}; use std::collections::HashMap; impl VirtualMachineRuntime { @@ -25,6 +26,8 @@ impl VirtualMachineRuntime { frame_scheduler: FrameScheduler::default(), render_capabilities: RenderRuntimeCapabilities::default(), render_manager: RenderManager::new(AppMode::Game), + render_worker_handoff: Arc::new(RenderWorkerHandoff::default()), + render_worker_controller: None, gfx2d_commands: Vec::new(), gfxui_commands: Vec::new(), logs_written_this_frame: HashMap::new(), @@ -124,6 +127,8 @@ impl VirtualMachineRuntime { self.frame_scheduler = FrameScheduler::default(); self.render_capabilities = RenderRuntimeCapabilities::default(); self.render_manager = RenderManager::new(AppMode::Game); + let _ = self.stop_render_worker(); + self.render_worker_handoff = Arc::new(RenderWorkerHandoff::default()); self.gfx2d_commands.clear(); self.gfxui_commands.clear(); self.logs_written_this_frame.clear(); @@ -147,6 +152,38 @@ impl VirtualMachineRuntime { self.render_capabilities = capabilities; } + pub fn start_render_worker(&mut self, config: RenderWorkerConfig, backend: B, sink: S) + where + B: RenderWorkerBackend, + S: RenderWorkerFrameSink, + { + let _ = self.stop_render_worker(); + self.render_worker_handoff = Arc::new(RenderWorkerHandoff::default()); + self.render_worker_controller = Some(RenderWorkerController::start( + config, + Arc::clone(&self.render_worker_handoff), + backend, + sink, + )); + self.render_capabilities.game_render_worker = true; + } + + pub fn stop_render_worker(&mut self) -> Result<(), RenderWorkerError> { + if let Some(mut controller) = self.render_worker_controller.take() { + controller.stop() + } else { + Ok(()) + } + } + + pub(crate) fn publish_pending_render_to_worker(&mut self) -> bool { + let Some(submission) = self.render_manager.take_pending_for_worker() else { + return false; + }; + self.render_worker_handoff.publish(submission); + true + } + pub fn initialize_vm( &mut self, log_service: &mut LogService, diff --git a/crates/console/prometeu-system/src/services/vm_runtime/mod.rs b/crates/console/prometeu-system/src/services/vm_runtime/mod.rs index d3319452..d0f69ebe 100644 --- a/crates/console/prometeu-system/src/services/vm_runtime/mod.rs +++ b/crates/console/prometeu-system/src/services/vm_runtime/mod.rs @@ -41,6 +41,8 @@ pub struct VirtualMachineRuntime { pub frame_scheduler: FrameScheduler, pub render_capabilities: RenderRuntimeCapabilities, pub render_manager: RenderManager, + pub render_worker_handoff: Arc, + pub render_worker_controller: Option, pub gfx2d_commands: Vec, pub gfxui_commands: Vec, pub logs_written_this_frame: HashMap, diff --git a/crates/console/prometeu-system/src/services/vm_runtime/render_manager.rs b/crates/console/prometeu-system/src/services/vm_runtime/render_manager.rs index 613acc41..17666af2 100644 --- a/crates/console/prometeu-system/src/services/vm_runtime/render_manager.rs +++ b/crates/console/prometeu-system/src/services/vm_runtime/render_manager.rs @@ -59,7 +59,7 @@ pub struct RenderRuntimeCapabilities { #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum RenderConsumerPath { LocalSynchronous, - LocalWorkerPrototype, + RealWorker, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -95,7 +95,7 @@ impl RenderPolicy { ) -> RenderConsumerPath { match (self.execution, capabilities.game_render_worker) { (RenderExecutionPolicy::WorkerCapableWithLocalFallback, true) => { - RenderConsumerPath::LocalWorkerPrototype + RenderConsumerPath::RealWorker } _ => RenderConsumerPath::LocalSynchronous, } @@ -107,8 +107,10 @@ pub trait RenderSurface { } #[derive(Debug, Default)] +#[cfg(test)] pub struct LocalRenderWorker; +#[cfg(test)] impl LocalRenderWorker { pub fn consume_latest( &mut self, @@ -329,6 +331,12 @@ impl RenderManager { discarded } + pub fn take_pending_for_worker(&mut self) -> Option { + let submission = self.handoff.take_latest()?; + self.telemetry.record_consumed(submission.frame_id); + Some(submission) + } + pub fn request_shutdown(&mut self) -> Option { self.consumer_state = RenderConsumerState::Stopped; self.discard_pending_submission() @@ -624,7 +632,7 @@ mod tests { ); assert_eq!( policy.resolve_consumer_path(RenderRuntimeCapabilities { game_render_worker: true }), - RenderConsumerPath::LocalWorkerPrototype + RenderConsumerPath::RealWorker ); } diff --git a/crates/console/prometeu-system/src/services/vm_runtime/render_worker.rs b/crates/console/prometeu-system/src/services/vm_runtime/render_worker.rs index 1792e790..1464f477 100644 --- a/crates/console/prometeu-system/src/services/vm_runtime/render_worker.rs +++ b/crates/console/prometeu-system/src/services/vm_runtime/render_worker.rs @@ -107,6 +107,14 @@ impl RenderWorkerController { } } +impl Drop for RenderWorkerController { + fn drop(&mut self) { + if self.handle.is_some() { + let _ = self.stop(); + } + } +} + fn run_worker_loop( handoff: Arc, state: Arc>, @@ -159,10 +167,11 @@ fn record_error( #[cfg(test)] mod tests { use super::*; + use crate::services::vm_runtime::VirtualMachineRuntime; use crate::services::vm_runtime::render_worker_test_harness::{ FakeRenderBackend, RenderGate, game_submission, }; - use prometeu_hal::{FrameId, OwnedRgba8888Frame, RenderSubmission}; + use prometeu_hal::{FrameId, Game2DFramePacket, OwnedRgba8888Frame, RenderSubmission}; #[derive(Clone, Debug)] struct SharedFakeBackend(Arc); @@ -280,4 +289,52 @@ mod tests { assert_eq!(controller.telemetry().worker_panics, 1); assert_eq!(controller.telemetry().last_error_frame_id, 13); } + + #[test] + fn runtime_publishes_game_submissions_to_worker_without_waiting_for_render() { + let gate = RenderGate::default(); + let backend = Arc::new(FakeRenderBackend::with_gate(gate.clone())); + let mut runtime = VirtualMachineRuntime::new(None); + runtime.start_render_worker( + RenderWorkerConfig::default(), + SharedFakeBackend(Arc::clone(&backend)), + SharedFakeBackend(Arc::clone(&backend)), + ); + + runtime + .render_manager + .close_frame_with_packet(prometeu_hal::RenderSubmissionPacket::Game2D( + Game2DFramePacket::default(), + )) + .expect("game packet should close"); + assert!(runtime.publish_pending_render_to_worker()); + gate.wait_for_entries(1); + + runtime + .render_manager + .close_frame_with_packet(prometeu_hal::RenderSubmissionPacket::Game2D( + Game2DFramePacket::default(), + )) + .expect("second game packet should close"); + assert!(runtime.publish_pending_render_to_worker()); + runtime + .render_manager + .close_frame_with_packet(prometeu_hal::RenderSubmissionPacket::Game2D( + Game2DFramePacket::default(), + )) + .expect("third game packet should close"); + assert!(runtime.publish_pending_render_to_worker()); + + assert_eq!(runtime.render_worker_handoff.telemetry().replaced_before_consume, 1); + + gate.release_one(); + gate.wait_for_entries(2); + gate.release_one(); + + assert_eq!(runtime.stop_render_worker(), Ok(())); + let frames = backend.published_frames(); + assert_eq!(frames.len(), 2); + assert_eq!(frames[0].frame_id, FrameId::ZERO); + assert_eq!(frames[1].frame_id, FrameId::new(2)); + } } diff --git a/crates/console/prometeu-system/src/services/vm_runtime/tick.rs b/crates/console/prometeu-system/src/services/vm_runtime/tick.rs index ec12b75a..a2dad5e0 100644 --- a/crates/console/prometeu-system/src/services/vm_runtime/tick.rs +++ b/crates/console/prometeu-system/src/services/vm_runtime/tick.rs @@ -1,7 +1,5 @@ use super::dispatch::VmRuntimeHost; -use super::render_manager::{ - LocalRenderWorker, RenderConsumeOutcome, RenderConsumerPath, RenderSurface, -}; +use super::render_manager::{RenderConsumeOutcome, RenderConsumerPath, RenderSurface}; use super::*; use crate::CrashReport; use crate::fs::{FsState, VirtualFS}; @@ -273,9 +271,18 @@ impl VirtualMachineRuntime { RenderConsumerPath::LocalSynchronous => { self.render_manager.consume_latest(&mut surface) } - RenderConsumerPath::LocalWorkerPrototype => { - let mut worker = LocalRenderWorker; - worker.consume_latest(&mut self.render_manager, &mut surface) + RenderConsumerPath::RealWorker + if self.render_worker_controller.is_some() + && self.current_cartridge_app_mode == AppMode::Game => + { + if self.publish_pending_render_to_worker() { + RenderConsumeOutcome::NoSubmission + } else { + RenderConsumeOutcome::NoSubmission + } + } + RenderConsumerPath::RealWorker => { + self.render_manager.consume_latest(&mut surface) } } })); diff --git a/discussion/index.ndjson b/discussion/index.ndjson index 138b7cf0..8b340908 100644 --- a/discussion/index.ndjson +++ b/discussion/index.ndjson @@ -2,7 +2,7 @@ {"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":"open","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-06-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":"open","created_at":"2026-06-05","updated_at":"2026-06-05"}],"decisions":[],"plans":[],"lessons":[]} -{"type":"discussion","id":"DSC-0042","status":"in_progress","ticket":"real-render-worker-establishment","title":"Real Render Worker Establishment","created_at":"2026-06-06","updated_at":"2026-06-15","tags":["runtime","renderer","worker","concurrency","host","hal","architecture"],"agendas":[{"id":"AGD-0042","file":"AGD-0042-host-hardware-render-boundary-preparation.md","status":"accepted","created_at":"2026-06-06","updated_at":"2026-06-06"},{"id":"AGD-0043","file":"AGD-0043-real-render-worker-establishment.md","status":"accepted","created_at":"2026-06-06","updated_at":"2026-06-15"}],"decisions":[{"id":"DEC-0032","file":"DEC-0032-platform-layer-and-hardwarebridge-elimination.md","status":"accepted","created_at":"2026-06-06","updated_at":"2026-06-06","ref_agenda":"AGD-0042"},{"id":"DEC-0033","file":"DEC-0033-real-render-worker-contract.md","status":"accepted","created_at":"2026-06-15","updated_at":"2026-06-15","ref_agenda":"AGD-0043"}],"plans":[{"id":"PLN-0098","file":"PLN-0098-define-platform-facade-contracts.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0099","file":"PLN-0099-introduce-owned-render-submission-sink.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0100","file":"PLN-0100-migrate-local-render-publication-to-sink.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0101","file":"PLN-0101-remove-immediate-gfx-syscall-rendering.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0102","file":"PLN-0102-introduce-game2d-frame-composer-service.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0103","file":"PLN-0103-introduce-runtime-platform-and-testplatform.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0104","file":"PLN-0104-migrate-vm-runtime-hostcontext-to-platform.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0105","file":"PLN-0105-migrate-firmware-and-hub-to-platform-services.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0106","file":"PLN-0106-migrate-desktop-host-to-platform-services.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0107","file":"PLN-0107-migrate-remaining-platform-domains.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0108","file":"PLN-0108-migrate-tests-to-testplatform.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0109","file":"PLN-0109-remove-hardwarebridge-and-update-specs.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0110","file":"PLN-0110-define-owned-rgba8888-frame-contract.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0111","file":"PLN-0111-define-read-only-render-resource-access.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0112","file":"PLN-0112-define-render-worker-errors-and-telemetry.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0113","file":"PLN-0113-implement-thread-safe-latest-wins-handoff.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0114","file":"PLN-0114-add-deterministic-render-worker-test-harness.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0115","file":"PLN-0115-implement-render-worker-controller-lifecycle.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0116","file":"PLN-0116-implement-fake-local-render-backend.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0117","file":"PLN-0117-integrate-runtime-submission-with-worker.md","status":"open","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0118","file":"PLN-0118-add-stale-epoch-and-repeat-frame-behavior.md","status":"open","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0119","file":"PLN-0119-integrate-desktop-host-worker-presentation.md","status":"open","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0120","file":"PLN-0120-update-real-render-worker-specs.md","status":"open","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0121","file":"PLN-0121-final-worker-path-validation-and-hardening.md","status":"open","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]}],"lessons":[]} +{"type":"discussion","id":"DSC-0042","status":"in_progress","ticket":"real-render-worker-establishment","title":"Real Render Worker Establishment","created_at":"2026-06-06","updated_at":"2026-06-15","tags":["runtime","renderer","worker","concurrency","host","hal","architecture"],"agendas":[{"id":"AGD-0042","file":"AGD-0042-host-hardware-render-boundary-preparation.md","status":"accepted","created_at":"2026-06-06","updated_at":"2026-06-06"},{"id":"AGD-0043","file":"AGD-0043-real-render-worker-establishment.md","status":"accepted","created_at":"2026-06-06","updated_at":"2026-06-15"}],"decisions":[{"id":"DEC-0032","file":"DEC-0032-platform-layer-and-hardwarebridge-elimination.md","status":"accepted","created_at":"2026-06-06","updated_at":"2026-06-06","ref_agenda":"AGD-0042"},{"id":"DEC-0033","file":"DEC-0033-real-render-worker-contract.md","status":"accepted","created_at":"2026-06-15","updated_at":"2026-06-15","ref_agenda":"AGD-0043"}],"plans":[{"id":"PLN-0098","file":"PLN-0098-define-platform-facade-contracts.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0099","file":"PLN-0099-introduce-owned-render-submission-sink.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0100","file":"PLN-0100-migrate-local-render-publication-to-sink.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0101","file":"PLN-0101-remove-immediate-gfx-syscall-rendering.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0102","file":"PLN-0102-introduce-game2d-frame-composer-service.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0103","file":"PLN-0103-introduce-runtime-platform-and-testplatform.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0104","file":"PLN-0104-migrate-vm-runtime-hostcontext-to-platform.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0105","file":"PLN-0105-migrate-firmware-and-hub-to-platform-services.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0106","file":"PLN-0106-migrate-desktop-host-to-platform-services.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0107","file":"PLN-0107-migrate-remaining-platform-domains.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0108","file":"PLN-0108-migrate-tests-to-testplatform.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0109","file":"PLN-0109-remove-hardwarebridge-and-update-specs.md","status":"done","created_at":"2026-06-06","updated_at":"2026-06-15","ref_decisions":["DEC-0032"]},{"id":"PLN-0110","file":"PLN-0110-define-owned-rgba8888-frame-contract.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0111","file":"PLN-0111-define-read-only-render-resource-access.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0112","file":"PLN-0112-define-render-worker-errors-and-telemetry.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0113","file":"PLN-0113-implement-thread-safe-latest-wins-handoff.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0114","file":"PLN-0114-add-deterministic-render-worker-test-harness.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0115","file":"PLN-0115-implement-render-worker-controller-lifecycle.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0116","file":"PLN-0116-implement-fake-local-render-backend.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0117","file":"PLN-0117-integrate-runtime-submission-with-worker.md","status":"done","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0118","file":"PLN-0118-add-stale-epoch-and-repeat-frame-behavior.md","status":"open","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0119","file":"PLN-0119-integrate-desktop-host-worker-presentation.md","status":"open","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0120","file":"PLN-0120-update-real-render-worker-specs.md","status":"open","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]},{"id":"PLN-0121","file":"PLN-0121-final-worker-path-validation-and-hardening.md","status":"open","created_at":"2026-06-15","updated_at":"2026-06-15","ref_decisions":["DEC-0033"]}],"lessons":[]} {"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"}]} {"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"}]} diff --git a/discussion/workflow/plans/PLN-0117-integrate-runtime-submission-with-worker.md b/discussion/workflow/plans/PLN-0117-integrate-runtime-submission-with-worker.md index 9fa5f8ea..15509c7a 100644 --- a/discussion/workflow/plans/PLN-0117-integrate-runtime-submission-with-worker.md +++ b/discussion/workflow/plans/PLN-0117-integrate-runtime-submission-with-worker.md @@ -2,7 +2,7 @@ id: PLN-0117 ticket: real-render-worker-establishment title: Integrate Runtime Submission With Worker -status: open +status: done created: 2026-06-15 completed: ref_decisions: [DEC-0033]