From b6a87f9d1d8527ca093b046c65f57eb6821f230b Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 25 Oct 2026 02:08:00 +0100 Subject: [PATCH 1/2] Test: the stub Blender lives where the runner can execute it, not in the noexec /tmp Idunn's python/node runners mount /tmp noexec; test-daemon copied the stub Blender there, so every export test saw "unavailable" and 20 tests failed in the release build (node --test prints to stdout, which Idunn's error drops). Co-Authored-By: Claude Opus 5.5 --- scripts/test-vili-daemon.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/test-vili-daemon.mjs b/scripts/test-vili-daemon.mjs index 2bf9a0b..b19f9c7 100644 --- a/scripts/test-vili-daemon.mjs +++ b/scripts/test-vili-daemon.mjs @@ -65,7 +65,8 @@ async function startDaemon({ if (threads !== null) settings.threads = threads; // Blender is a copy of the stub in a directory of its own (the stub logs its starts beside itself): "stub" is // ready, "broken" fails its version probe, "missing" is a path with nothing there, null is unconfigured. - const blenderDir = mkdtempSync(path.join(os.tmpdir(), "vili-blender-")); + mkdirSync(execScratch, { recursive: true }); + const blenderDir = mkdtempSync(path.join(execScratch, "blender-")); const blenderPath = blender === null ? null : path.join(blenderDir, { stub: "blender", broken: "blender-broken", missing: "absent" }[blender]); if (blender === "stub" || blender === "broken") { copyFileSync(stubBlenderPath, blenderPath); From af0280840d9f4fa4cc23d90c23c1cb92d3755207 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 25 Oct 2026 02:24:21 +0100 Subject: [PATCH 2/2] Test: declare the exec scratch directory the previous commit used Co-Authored-By: Claude Opus 5.5 --- scripts/test-vili-daemon.mjs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/test-vili-daemon.mjs b/scripts/test-vili-daemon.mjs index b19f9c7..66f9819 100644 --- a/scripts/test-vili-daemon.mjs +++ b/scripts/test-vili-daemon.mjs @@ -19,6 +19,9 @@ const stubBlenderPath = path.join(here, "fixtures", "stub-blender.mjs"); const exportScriptPath = path.join(here, "bvh-to-fbx.py"); const fakeIdunnEntry = path.join(here, "fixtures", "fake-idunn-entry.mjs"); const THREADS = 5; +// The stub Blender is executed, and the recipe's runner mounts /tmp noexec (and the root read-only), so it cannot live +// there. It lives under the checkout's gitignored .vili, which the runner's workspace leaves writable. +const execScratch = path.join(here, "..", ".vili", "test-scratch"); async function until(condition, what, seconds = 15) { const deadline = Date.now() + seconds * 1000;