id: T011 name: PlasmaVMC Feature Deepening status: complete goal: Make KvmBackend functional - actual VM lifecycle, not stubs priority: P0 owner: peerA (strategy) + peerB (implementation) created: 2025-12-08 context: | Scaffold complete (5 crates) but KvmBackend methods are stubs returning errors. Spec defines 10 crates, but depth > breadth at this stage. Focus: Make one hypervisor backend (KVM) actually work. acceptance: - KvmBackend.create() spawns QEMU process - KvmBackend.status() returns actual VM state - KvmBackend.start()/stop() work via QMP - At least one integration test with real QEMU - plasmavmc-server can manage a VM lifecycle end-to-end ## Gap Analysis (current vs spec) # Existing: plasmavmc-types, hypervisor, kvm, api, server # Missing: client, core, firecracker, mvisor, agent, storage (defer) # Strategy: Deepen existing before expanding steps: - step: S1 action: Add QMP client library to plasmavmc-kvm priority: P0 status: complete owner: peerB notes: | QMP = QEMU Machine Protocol (JSON over Unix socket) Use qapi-rs or custom implementation Essential for VM control commands deliverables: - QmpClient struct with connect(), command(), query_status() - Unit tests with mock socket - step: S2 action: Implement KvmBackend.create() with QEMU spawning priority: P0 status: complete owner: peerB notes: | Generate QEMU command line from VmSpec Create runtime directory (/var/run/plasmavmc/kvm/{vm_id}/) Spawn QEMU process with QMP socket Return VmHandle with PID and socket path deliverables: - Working create() returning VmHandle - QEMU command line builder - Runtime directory management - step: S3 action: Implement KvmBackend.status() via QMP query priority: P0 status: complete owner: peerB notes: | query-status QMP command Map QEMU states to VmStatus enum deliverables: - Working status() returning VmStatus - State mapping (running, paused, shutdown) - step: S4 action: Implement KvmBackend.start()/stop()/kill() priority: P0 status: complete owner: peerB notes: | start: cont QMP command stop: system_powerdown QMP + timeout + sigkill kill: quit QMP command or SIGKILL deliverables: - Working start/stop/kill lifecycle - Graceful shutdown with timeout - step: S5 action: Integration test with real QEMU priority: P1 status: complete owner: peerB notes: | Requires QEMU installed (test skip if not available) Use cirros or minimal Linux image Full lifecycle: create → start → status → stop → delete deliverables: - Integration test (may be #[ignore] for CI) - Test image management - step: S6 action: Wire gRPC service to functional backend priority: P1 status: complete owner: peerB notes: | plasmavmc-api VmService implementation CreateVm, StartVm, StopVm, GetVm handlers Error mapping to gRPC status codes deliverables: - Working gRPC endpoints - End-to-end test via grpcurl blockers: [] aux_tactical: [] evidence: [] notes: | Foreman recommended PlasmaVMC deepening as T011 focus. Core differentiator: Multi-hypervisor abstraction actually working. S1-S4 are P0 (core functionality), S5-S6 are P1 (integration).