The worker picks the pose- and velocity-matched window from the generated
joints; the FBX is that window; the record keeps request.loop, worker.loops
and the constraints as sent. Constraints given more than once are refused.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The earlier fixes in this batch (16e585d, d35b9e2, bdee73c) staged both files with CRLF by a tool slip; this commit
changes no line but the endings, so the batch's net diff on them is its real lines.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
motion_100.bvh sorted before motion_11.bvh, so past 100 samples a clip was exported over another sample's window.
The index is read from the file name and orders the samples and names the clips.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The worker reads one path; with inline constraints and constraints_path both sent, the daemon preferred the path
but the record kept the inline list. Two inputs are now refused before anything is written, in the daemon's
fixed-text 400 shape, echoing nothing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The worker's window path loaded the 8B model at import, so no test reached it and swapped atan2 arguments or
the 30-joint skeleton went unnoticed. loop_windows(output, model) needs only model.output_skeleton and
model.fps. The test uses a committed 240-frame somaskel77 take (fixtures/take.npz, joints from a live Vili BVH
by forward kinematics) and stand-ins that carry the 77- and 30-joint skeletons' names and parents.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Worker: with loop true the answer gains loops (one {first, last, poseCost, velocityCost}
per sample) from loop_window over Kimodo's somaskel77 posed joints and compute_global_heading.
Daemon: loop must be a boolean and needs fbx (400 'Invalid fbx request.'); sample k is
exported with '--frames first+1 last+1'; an answer without a window for a sample fails
'fbx-export-failed (no loop window)'; the record keeps request.loop and, when inline,
the constraints as sent. The daemon never computes a window.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Optional '--frames A B' after the clip name sets the scene's frame range to A..B
(Blender frames, from 1); outside the take, or malformed, it exits 4 or 3 and writes
nothing. Without it the whole take, as before. The test's BVH builder is shared.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Numpy only; the resident worker is its one caller. Hips-relative, heading-normalised
poses; cost is pose RMS plus 0.1 s of velocity RMS; ties go to the longer window,
then the earlier. Tests: a periodic stride between rests, the stated cost against a
frame-by-frame oracle, heading, ties, minimum length.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Imagination pass for motion-pipeline:cut_spec:cut-rps-slot-clips.r1: 19 live
takes; the brisk mope covers the walk-off in 11.4 s, no celebrating take
reaches walking pace without a speed-up, and no countdown take shows three
separate fist-into-palm hits.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Imagination pass for motion-pipeline:cut_spec:cut-soma-humanoid-avatar.r3:
the live rest FBX imports as a valid Humanoid with the finger table shifted
to *2/*3/*4, the bone map converges from code in two passes, clips reimport
through DependsOnArtifact, and exit travel comes from root motion read by the
duel.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Idunn's node-build runner mounts /tmp noexec, so test-daemon failed 20 of 137 and
the 2026-10-25 deploy failed in Sealing. The stub now lives under the gitignored
.vili/test-scratch. The whole recipe passes by hand in the runner's shape.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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 <noreply@anthropic.com>
motion-pipeline:cut_spec:cut-vili-fbx-export.r3. Blender 5.2.2 plus sixteen
sha256-pinned bookworm libraries sealed in the release (operator rulings
blender-libs-bundled-in-release, blender-x-libs-bundled-in-release); export runs in
the daemon under the write gate on a private copy; byte-identical FBX on one
machine; unique job ids; motion_job.v1 provenance with the seed; GET
/motion/artifacts and POST /motion/rest-fbx. Not deployed yet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
readInside opens O_NONBLOCK|O_NOFOLLOW and checks the open descriptor before reading, so a FIFO is refused at once and holds no filesystem thread. work/ is a slot in the recipe; a daemon that holds the state root creates it and removes stale export-XXXXXX directories from it, nothing else, before it serves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The operator approved seven more X packages (motion-pipeline:ruling:
blender-x-libs-bundled-in-release) after Soul s1 found the sealed Blender
loading them from the host.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Seven sha256-pinned bookworm inputs from the recipe's snapshot, unpacked by the one unpack-blender-libs step.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>