--- id: LSN-0022 ticket: studio-play-stop-cartridge-flow title: Studio Play/Stop and Debugger Workspace Integration status: done created: 2026-04-07 tags: [studio, play-stop, debugger, runtime, shipper] --- ## Summary This lesson covers the implementation of the first wave of the `Play/Stop` flow in Studio and its integration with a native `DebugWorkspace`. The feature enables developers to: - Press `Play` to build, pack, and run the current project in the configured runtime. - Automatically navigate to a `DebugWorkspace` that shows merged preparation and runtime logs. - Press `Stop` to kill the active runtime process. ## Key Decisions Based on `DEC-0020`, `DEC-0021`, and `DEC-0022`: 1. **Preparation Pipeline**: The `Play` flow orchestrates existing domain operations: `build` -> `validate pack` -> `pack` -> `manifest generation`. All artifacts are kept in `build/`, avoiding a redundant `cartridge/` directory for this wave. 2. **Runtime Command**: The runtime is executed externally as `"" run build` with the project root as its working directory. 3. **Process Ownership**: Studio owns exactly one active runtime process handle per project shell. 4. **Merged Logs**: Preparation logs (build, pack validation, pack) and runtime logs (stdout/stderr) are merged into a single execution-session stream. 5. **Native Debugger Workspace**: A native `DebugWorkspace` hosts the execution session and acts as the primary log sink. It is not an external launcher but a real Studio workspace. 6. **Shared Session State**: The execution state (`idle`, `preparing`, `connecting`, `running`, etc.) lives outside the visual workspace lifecycle in a shared `StudioExecutionSessionService`. ## Implementation Details ### `StudioPlayStopCoordinator` The main orchestrator for the `Play` and `Stop` actions. It: - Manages the `preparing` -> `connecting` -> `running` state machine. - Invokes the `StudioShipperService` for preparation. - Spawns the external runtime process using `StudioExternalRuntimeProcessLauncher`. - Merges log streams from both preparation and runtime into the `StudioExecutionSessionService`. ### `DebugWorkspace` A Studio `Workspace` implementation that reflects the `StudioExecutionSnapshot`. It uses `DebugWorkspaceProjection` to transform the session logs into a display-ready format. ### `StudioShipperService` Aggregates the domain-specific tasks (compiler build, packer pack) and generates the mandatory `manifest.json` in the `build/` directory. ## Common Pitfalls & Anti-Patterns - **Redundant Checks**: Do not add manual `manifest.json` existence checks before spawning. The success of the preparation pipeline already guarantees its presence according to the contract. - **State Duplication**: Avoid tracking execution state in both the shell and the workspace. The shared `StudioExecutionSessionService` is the single source of truth. - **Technical Linkage**: Do not hard-link the Studio codebase with the legacy `../debugger` repository. Selective migration of protocol/session logic is preferred. ## References - `DEC-0020`: Build and pack preparation. - `DEC-0021`: External runtime execution. - `DEC-0022`: Native `DebugWorkspace` integration. - `PLN-0045`: End-to-end execution flow.