#!/usr/bin/env node
/**
* Reproduce the kernel-venv install race against a real uv install.
*
* A rebuild replaces ~/.prime/agent/kernel-venv while other sessions may be booting a
* kernel from it. This probe runs the real bootstrap (staged temp venv, PRIME_AGENT_KERNEL_VENV
* pointed at it) and a reader that keeps launching the venv's own python to import the
* runtime, so it measures what a concurrently booting kernel would have imported.
*
* Usage: node scripts/kernel-venv-race-probe.mjs [--venv
] [--samples ]
* Exits non-zero when any sample caught the live path holding a partial venv.
*/
import { spawn, spawnSync } from "node:child_process";
import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { dirname, join, resolve } from "node:path";
import { fileURLToPath } from "node:url";
const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
const BOOTSTRAP_CLI = join(repoRoot, "packages", "coding-agent", "src", "core", "kernel", "bootstrap-cli.ts");
function argValue(name, fallback) {
const index = process.argv.indexOf(name);
return index >= 0 ? process.argv[index + 1] : fallback;
}
const venv = resolve(argValue("--venv", mkdtempSync(join(tmpdir(), "prime-agent-venv-race-"))));
const samplesPath = argValue("--samples", `${venv}.samples.json`);
const python = join(venv, "bin", "python");
const manifest = join(venv, ".bootstrap-version");
function bootstrap() {
return new Promise((settle) => {
const child = spawn("npx", ["tsx", BOOTSTRAP_CLI], {
cwd: repoRoot,
stdio: ["ignore", "ignore", "inherit"],
env: { ...process.env, PRIME_AGENT_KERNEL_VENV: venv },
});
child.on("close", (code) => settle(code));
});
}
/** What a kernel booting right now would import, plus the state it would read. */
function inspect() {
// Read the whole fs state first, so every field of one sample describes one instant.
const venvExists = existsSync(venv);
const pythonExists = venvExists && existsSync(python);
const manifestExists = venvExists && existsSync(manifest);
const attempt = pythonExists
? spawnSync(python, ["-c", "import rlm, rlm.mcp, remote"], { encoding: "utf8", timeout: 30_000 })
: undefined;
const importOk = attempt?.status === 0;
return {
venvExists,
pythonExists,
manifestExists,
importOk,
error: importOk ? "" : ((attempt?.stderr ?? (pythonExists ? "" : "no python")).trim().split("\n").at(-1) ?? ""),
};
}
function sample(index) {
let entry = inspect();
// The swap renames the live venv away and back within two renames; re-read once so a
// transition between two complete trees is not mistaken for a partially installed one.
if (entry.venvExists && !entry.importOk) entry = inspect();
// Partial is the bug: the live path is there but cannot serve the runtime.
return { index, ...entry, partial: entry.venvExists && (!entry.importOk || !entry.manifestExists) };
}
async function main() {
// First build: the state every later boot starts from.
if ((await bootstrap()) !== 0) {
throw new Error("the first bootstrap failed; the probe needs a working uv and network");
}
console.log(`warm venv: ${python}`);
const samples = [];
let building = true;
const reader = (async () => {
for (let index = 0; building; index += 1) {
samples.push(sample(index));
await new Promise((settle) => setTimeout(settle, 50));
}
samples.push(sample(samples.length));
})();
// Second build: a rebuild of the same venv, the 2026-09-17 install path.
const rebuildCode = await bootstrap();
building = false;
await reader;
const partial = samples.filter((entry) => entry.partial);
const absent = samples.filter((entry) => !entry.venvExists);
const complete = samples.filter((entry) => entry.venvExists && entry.importOk);
writeFileSync(samplesPath, `${JSON.stringify({ venv, rebuildCode, samples }, null, 2)}\n`);
console.log(`samples: ${samples.length} complete=${complete.length} absent=${absent.length} partial=${partial.length}`);
for (const entry of partial.slice(0, 5)) {
console.log(` partial sample ${entry.index}: manifest=${entry.manifestExists} ${entry.error}`);
}
console.log(`samples file: ${samplesPath}`);
if (rebuildCode !== 0) throw new Error(`the rebuild failed with exit code ${rebuildCode}`);
if (partial.length > 0) throw new Error("a concurrently booting kernel imported the venv mid-install");
const manifestRuntime = JSON.parse(readFileSync(manifest, "utf8")).runtime;
console.log(`promoted runtime: ${manifestRuntime}`);
if (process.env.PRIME_AGENT_RACE_PROBE_KEEP !== "1") {
rmSync(venv, { recursive: true, force: true });
}
}
main().catch((error) => {
console.error(error instanceof Error ? error.message : String(error));
process.exitCode = 1;
});