Back to feed

sledtools/pika branch #144

pika-delete-legacy-runtime-residue

Delete local microvm guest module

Target branch: master

Merge Commit: 4e8edfc0287458ff1d6bc362d29c296162dca4bc

branch: merged tutorial: ready ci: success
Open CI Details

Continuous Integration

CI: success

Compact status on the review page, with full logs on the CI page.

Open CI Details

Latest run #180 success

9 passed

head 37ed49167215ded8d662d90f06627ec42de1c1b2 · queued 2026-03-27 13:41:09 · 9 lane(s)

queued 14s · ran 3m 11s

check-pika-rust · success check-pika-followup · success check-notifications · success check-agent-contracts · success check-rmp · success check-pikachat · success check-apple-host-sanity · success check-pikachat-openclaw-e2e · success check-fixture · success

Summary

This branch removes the legacy local microVM guest module (nix/pikaci/guest-module.nix) and all references to it across the codebase. The 299-line NixOS module — which configured a microvm-based CI guest with virtiofs shares, cargo/rust/android toolchains, and a systemd oneshot job — is deleted outright. The flake no longer exports lib.pikaci.mkGuestModule, the Rust test that validated the module's template rendering is replaced with a test that validates the remote Incus image's runtime paths instead, project planning docs are updated to use substrate-neutral language, and a CLI tool's error message is adjusted to say "local guest" rather than "microVM guest".

Tutorial Steps

Delete the local microVM guest NixOS module

Intent: Remove the 299-line NixOS module that defined the entire local microvm-based CI guest, including its systemd job, virtiofs share declarations, environment variables, and toolchain setup. This module is no longer part of the target runtime architecture.

Affected files: nix/pikaci/guest-module.nix

Evidence
@@ -1,299 +0,0 @@
-{
-  hostPkgs,
-  hostUid,
-  hostGid,
-  workspaceDir,
-  ...
-}
-{
-  lib,
-  pkgs,
-  ...
-}:
-let
-  ...
-in
-{
-  system.stateVersion = "24.11";
-  ...
-  microvm = {
-    inherit hypervisor;
-    ...
-  };
-}

The file nix/pikaci/guest-module.nix is deleted in its entirety. This module was the NixOS configuration for a local microvm CI guest. It handled:

  • User/group creation mirroring host UID/GID.
  • A systemd.services.pikaci-job oneshot that ran the guest command with a full environment (Rust, Android SDK, PostgreSQL, OpenSSL, etc.).
  • microvm block configuration including hypervisor selection, virtiofs shares for /nix/store, the workspace snapshot, artifacts, cargo home/target, and optional staged build directories.
  • Template rendering of the terminal result fragment into /artifacts/result.json.

With the migration to Incus-based remote execution, this entire module is dead code and is removed rather than maintained in parallel.

Remove the flake's `lib.pikaci.mkGuestModule` export

Intent: Stop exporting the deleted guest module through the flake's `lib` output so downstream consumers cannot reference it.

Affected files: flake.nix

Evidence
@@ -981,12 +981,6 @@ EOF
         pikachat-openclaw = import ./nix/openclaw/home-manager.nix { inherit self; };
       };
 
-      lib = {
-        pikaci = {
-          mkGuestModule = import ./nix/pikaci/guest-module.nix;
-        };
-      };
-
       # Phase 2a staged Linux Rust build outputs.

The lib attribute set in flake.nix previously contained a single entry: pikaci.mkGuestModule, which imported the now-deleted nix/pikaci/guest-module.nix. The entire lib block is removed. Any downstream flake that consumed self.lib.pikaci.mkGuestModule will now fail at evaluation time, which is the desired outcome — there should be no silent fallback to a removed backend.

Replace the local guest module test with a remote Incus runtime paths test

Intent: Remove the Rust test that validated the deleted guest module's template rendering and replace it with a test that asserts the remote Incus guest image uses the canonical `/run/pika-cloud/...` runtime paths.

Affected files: crates/jerichoci/src/executor.rs

Evidence
@@ -2498,10 +2498,6 @@ mod tests {
         include_str!("../../../nix/incus/pika-cloud-lifecycle.py.in")
     }
 
-    fn local_linux_guest_module_source() -> &'static str {
-        include_str!("../../../nix/pikaci/guest-module.nix")
-    }
-
     fn local_terminal_result_fragment_source() -> &'static str {
@@ -2779,20 +2775,19 @@ mod tests {
     }
 
     #[test]
-    fn local_linux_guest_module_uses_shared_terminal_result_fragment() {
-        let source = local_linux_guest_module_source();
+    fn remote_linux_incus_image_uses_shared_runtime_paths() {
+        let source = incus_guest_image_source();
 
         assert_contains_all(
             source,
             &[
-                "localTerminalResultFragment = builtins.readFile ./local-terminal-result-fragment.sh.in;",
-                "renderLocalTerminalResultFragment =",
-                "\"__PIKACI_RESULT_PATH__\"",
+                "state_dir = pathlib.Path(\"/run/pika-cloud\")",
+                "logs_dir = state_dir / \"logs\"",
+                "artifacts_dir = state_dir / \"artifacts\"",
+                "guest_log_path = logs_dir / \"guest.log\"",
+                "status_path = state_dir / \"status.json\"",
+                "events_path = state_dir / \"events.jsonl\"",
+                "result_path = state_dir / \"result.json\"",
             ],
         );
     }

Two changes in crates/jerichoci/src/executor.rs:

  1. Helper removal (executor.rs:2498): The local_linux_guest_module_source() helper that used include_str! to embed the deleted .nix file is removed. The compile would have failed without this since the file no longer exists.

  2. Test replacement (executor.rs:2775): The test local_linux_guest_module_uses_shared_terminal_result_fragment validated that the guest module's Nix source contained the template placeholders (__PIKACI_RESULT_PATH__, __PIKACI_SCHEMA_VERSION__, etc.) and the rendered fragment call. It is replaced by remote_linux_incus_image_uses_shared_runtime_paths, which reads incus_guest_image_source() (the Incus lifecycle Python script) and asserts the canonical /run/pika-cloud/ directory layout: state_dir, logs_dir, artifacts_dir, guest_log_path, status_path, events_path, and result_path.

This directly reflects the architectural shift: the contract surface moves from Nix template substitution to well-known filesystem paths under /run/pika-cloud/.

Update planning docs to use substrate-neutral terminology

Intent: Replace all references to specific legacy names (`pika-agent-control-plane`, `pika-agent-microvm`, `microvm`, `vm-spawner`, `microvm.nix`) with generic, substrate-neutral descriptions so the planning document reflects completed work and does not imply these components still exist.

Affected files: todos/pika-cloud.md

Evidence
@@ -27,10 +27,10 @@
-- Replace `pika-agent-control-plane` with `pika-cloud` in one branch.
+- Replace the old shared control-plane crate with `pika-cloud` in one branch.
@@ -61,7 +61,7 @@
-- deletion of dead microvm-era code that no longer serves the target system
+- deletion of dead legacy runtime code that no longer serves the target system
@@ -260,30 +260,30 @@
-- `pika-agent-control-plane` currently mixes substrate, app contract, spawner request types
+- the old shared control-plane crate mixed substrate, app contract, spawner request types
@@ -297,7 +297,7 @@
-The first migrated path is the existing remote Incus executor. No microvm fallback remains.
+The first migrated path is the existing remote Incus executor. No legacy product/backend fallback remains.

Throughout todos/pika-cloud.md, specific crate and module names that referred to now-deleted components are replaced with descriptive phrases:

BeforeAfter
pika-agent-control-plane"the old shared control-plane crate"
pika-agent-microvm"the legacy dedicated microvm crate"
microvm backend"the old product/backend split"
vm-spawner"the old spawner path"
microvm.nix"a separate legacy local-guest backend abstraction"
microvm parity work"legacy local-guest parity work"

Verb tenses are also shifted from present ("currently mixes") to past ("mixed") where the work is already done. This keeps the planning document honest about what has been completed vs. what remains.

Update the Android CI tool's error message

Intent: Replace the term "microVM" with "local guest" in the user-facing error note from the `android-ui-test-ci` script to match the updated project vocabulary.

Affected files: tools/android-ui-test-ci

Evidence
@@ -16,7 +16,7 @@
-  echo "note: the current pikaci microVM guest is aarch64-linux, and this repo does not currently export the Android SDK toolchain bundle for that system." >&2
+  echo "note: the current pikaci local guest is aarch64-linux, and this repo does not currently export the Android SDK toolchain bundle for that system." >&2

In tools/android-ui-test-ci:19, the error message printed when ANDROID_HOME or JAVA_HOME is unset previously said "the current pikaci microVM guest". This is updated to "the current pikaci local guest" to avoid referencing the deleted microvm infrastructure in user-facing output. The rest of the message — explaining the aarch64-linux limitation and suggesting alternative runner strategies — is unchanged.

Diff