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:
-
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.
-
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:
| Before | After |
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.