Commit graph

67 commits

Author SHA1 Message Date
Meta Vens
f69e24eeff Test: the spawn is gated at the spawn, not by the request's earlier checks
The fake Idunn signer can lose the lease once a job's meta.json exists, which
pins the guards in startWorker (no logs or embeddings directory, no worker).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 03:06:18 +02:00
Meta Vens
d35f8e408b README front door: the Idunn endpoint is planned, not live, and no runbook is named
The lock is no longer a file; the contract says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 03:04:31 +02:00
Meta Vens
a1579efbbc One owner by one bind, one gate at every write: the abstract-socket lock and guard()
The hand-run lock is a bind in the abstract socket namespace named by the state
root: atomic, exclusive, gone with its owner, so the probe, the unlink and the
takeover race are deleted. Every write to the state root and every spawn calls
guard(), which asks held() at that moment; Idunn's held() reads the lease each
time and reports a loss through the handler the daemon registered, so a request
admitted before the loss stops at its next write and a respawn cannot outlive it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 03:04:31 +02:00
Meta Vens
17e84c65da Tests first: crashed-lock race, in-flight fence, SIGTERM stop, foreign reclaim, port range
Red at 4fd3f60 for stale-lock-takeover-race, fence-admits-in-flight-request and
bind-port-65536-accepted; green guards for reclaim-root-unpinned and the SIGTERM
property. The daemon's stop() no longer leaves a daemon holding the run open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 03:01:17 +02:00
Meta Vens
4fd3f60c88 Test: a second daemon that fails to refuse is killed, not left holding the test run open
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:33:22 +02:00
Meta Vens
6a80b3b4b8 Test: the child refuses a vector of the wrong width
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:46:41 +02:00
Meta Vens
235321ed86 Entry: derive the daemon's environment in one exported function, and test its argument contract
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:45:01 +02:00
Meta Vens
33614b87b1 Recipe comment: say what the seal refuses without naming the forbidden tool
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:44:27 +02:00
Meta Vens
3b9c6c7525 Recipe: steps name python3.12, a program name; Idunn refuses a program with a path
The binding's python-build PATH puts the release tree's bin first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:40:33 +02:00
Meta Vens
39dd5a9977 Recipe: drop pip check; --no-deps leaves kimodo's UI and SOMA-X's CUDA dependencies uninstalled by design
The import smoke is the proof the environment serves the worker.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:33:43 +02:00
Meta Vens
a089d3ff5f README front door and contract: Vili is the Idunn target on Yggdrasil
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:28:29 +02:00
Meta Vens
fd03693bc7 Idunn recipe, release assembler and the hash locks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:26:19 +02:00
Meta Vens
f410338329 Lock inputs: build tools and the CPU worker's pinned runtime
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:25:07 +02:00
Meta Vens
956fdf8ff8 Daemon serves through a runtime port: Idunn write lease or hand-run socket lock
serve(runtime) listens first, writes the state root only once the runtime
holds it, answers Idunn's route challenge ahead of the cross-site refusal,
and fences on lease loss. --health is deleted; the pid file and /proc
reclaim move behind the hand-run runtime. Adds scripts/idunn-entry.mjs,
the kimodo and SOMA-X gitlinks, encode_texts for the child, and tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:23:07 +02:00
Meta Vens
f2b35e3837 Merge cut/vili-cpu-body: Vili as one Linux CPU process tree, encoder header-on (Soul s1-s2)
WSL, Docker, GPU and Raven launchers leave main. Not deployed: admission on Yggdrasil is the next cut. s2 residue in motion-pipeline:follow_up:vili-cpu-body-s2-residue.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 18:31:49 +02:00
Meta Vens
70f60b9b8a Daemon tests: the pid file's life, strays that ignore SIGTERM, a worker with no encoder child, a live worker left alone
Closes the survivors StrykerJS reported over the new supervisor code (61 mutants, 41 killed, 20 survived): the pid
file is removed when its worker exits and not when it spawned nothing, the restart kill is SIGKILL (a stubborn stray
and a SIGTERM-proof encoder child), the group match is the pid file's, not any marked process. killGroup loses its
unused return value.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:54:01 +02:00
Meta Vens
43d05465c3 Research: correct the "MNTP missing" diagnosis; the difference is the chat header
Appends a dated correction to both probe notes, citing motion-pipeline:finding:cut-vili-cpu-body.s1.ab-premise-inverted.
The measurements stand as measured.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:40:09 +02:00
Meta Vens
f8931270e2 README and contract: true of the CPU process tree, no retired runtime named
The front door drops its claim about the Raven instance and describes the encoder's explicit chat header and the
daemon's ownership of the worker's process group. docs/verse-service-contract.md, which the front door names as an
entry point, is rewritten for the CPU tree: witnesses, command boundary and worker boundary, with the request fields
left to the README.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:40:08 +02:00
Meta Vens
6651662b2c Encoder: pool after LLM2Vec's query marker, live_identity reads its own versions, tests reach every field
The header-on vector now matches Kimodo's encoder loaded from the repo ids (cosine 1.0; the bare header gave
0.9974) because the wrapped text carries LLM2Vec's instruction/query separator, which keeps the header out of
the pooling. live_identity reads the installed versions itself, so the worker passes no version it could fake,
and the tests pin installed_versions against substituted modules, the prompt form and device in the identity,
and a text that differs past any prefix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:40:08 +02:00
Meta Vens
2bf4a1dba7 Daemon: own the worker's whole tree, across worker exits and daemon crashes
The worker's process group is killed when the worker exits for any reason, so no encoder child survives it.
A pid file in the state root names the group; the next daemon start kills a group left by a crashed
predecessor if one of its members carries this state root's embeddings directory, before serving. The
retired operator route's 404 test returns (built from parts, so the grep stays empty) and the test script
gets a per-test timeout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:20:01 +02:00
Meta Vens
4fe1fc963c Encoder: apply the Llama-3 chat header explicitly, and pin the identity at the worker's call site
The child wraps every text with text_encoding.chat_header and tokenizes it itself, so the prompt form no
longer rides on the model's _name_or_path. The identity names the assembly truthfully (header form
included, as a hash of the template) and re-keys the cache. The worker builds its identity through
live_identity and installed_versions, which the tests reach; the identity test now uses live-length
revisions, so a truncated identity or key fails. An env-gated test compares a fresh child vector with
Kimodo's own encoder loaded from the repo ids.

Supersedes encoder-assembly-b (motion-pipeline:ruling:encoder-chat-header-on).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:20:01 +02:00
Meta Vens
e673ec1d4a Test: the retired provider-advertisement route answers 404
Keeps the Eve path out of scripts/ so the negative grep over scripts/ is empty.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 15:28:55 +02:00
Meta Vens
b3ef8f3090 Test: drop the lastError check that no mutant could fail
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 15:22:45 +02:00
Meta Vens
c3b048a2ab Daemon: drop the unread worker.model; tests for grace, host default, relative models root, early death
Mutation triage (StrykerJS, 81 survivors on the first full run) showed worker.model was
written and never read. The new tests pin the survivors that were behaviour: the loopback
default, --host, stray flags, the models-root resolution, the SIGTERM grace, a worker that
dies while the daemon waits for its health, the POST route, and lastError after a
requested stop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 15:07:15 +02:00
Meta Vens
3843a772f8 Tests: worker failure paths, env twins, group kill, job record, store refresh
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 13:16:50 +02:00
Meta Vens
94e08d1fdc Test: write the snapshot revision file with a real newline escape
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 12:32:53 +02:00
Meta Vens
6487c7a063 Test: the worker applies the thread cap before it loads the model
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 12:32:04 +02:00
Meta Vens
ffa2c7bf58 Encoder B loads from snapshot directories, as the reference vector did
Measured on Yggdrasil: loading by repo id leaves the model's _name_or_path
equal to the Llama repo id, so prepare_for_tokenization wraps the text in
the chat header and the vector matches assembly A (cosine 1.0, 0.909 to the
reference B). Loading from the snapshot paths reproduces the reference.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 12:22:25 +02:00
Meta Vens
6535cda025 README: the CPU process tree, its flags and the encoder identity
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 12:14:10 +02:00
Meta Vens
ef0edc4073 Daemon: supervise the worker child, drop WSL, Docker, Eve and CORS
vili-daemon.mjs spawns the Python worker itself (no shell, port 0 from the
ready line, nice 10, one child at a time, respawn after exit, group kill on
SIGTERM) with a closed environment. WSL/Docker, the Eve surfaces and deck
WebSocket, the provider advertisement, /smoke, CORS, JSON sidecars and the
pid file are deleted. POSTs with an Origin or a non-JSON body are refused
403 cross-site. cultcache-ts comes from the vendor/CultLib submodule at
b549d731; ws is dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 12:14:10 +02:00
Meta Vens
c3684b733b Encoder: assembly B on CPU with a complete identity and a thread cap
The encoder child is CPU only (GPU placement, GpuBusy and plan_placement
are deleted) and assembles LLM2Vec B: Llama base, MNTP merged, then the
supervised adapter. The cache identity names assembly, device, dtype,
torch/transformers/peft/accelerate versions, Kimodo commit and the child's
own sha256 beside the three revisions. VILI_THREADS (1..16) caps torch in
the worker and the child. The worker binds port 0 and reports it in its
ready line; errors name a class and place, never the request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 12:14:09 +02:00
Meta Vens
0348b3a283 Delete the Raven launchers and the /smoke client
Raven scheduled-task installer, launchers, restart shims and the smoke client
(GET /smoke on 10.77.0.4) leave main under the Loud Rebuild Contract
(motion-pipeline:ruling:vili-moves-to-yggdrasil-now).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 12:06:38 +02:00
Meta Vens
618c98dd9e Map: Vili moves to Yggdrasil (CPU body, deletion line on Raven, cut sequence)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 12:04:27 +02:00
Meta Vens
3faa541ce9 Research: Vili on Yggdrasil CPU (Kimodo torch timings, A/B and Q8 clips vs assembly B, move map) parked/vili-eve-surface
Measured on Yggdrasil CPU under other agents' load; Raven untouched.
A/B eye-check BVHs and a Blender side-by-side viewer under docs/research/assets/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 03:18:57 +02:00
Meta Vens
4a4c8ea5dd Research: kimodo.cpp probe (Q8 GGML encoder, MNTP adapter missing from Vili's vectors)
Measured on Yggdrasil CPU; Raven GPU timing deferred (household using the GPU).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 02:20:44 +02:00
Meta Vens
6a9d12c81f Map: community tooling re-map (SOMA names, Blender kept, bone table as code)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 02:06:08 +02:00
Meta Vens
329de4ea84 Research: community tooling around Kimodo, SOMA and ARDY (facts only)
Serves the fbx-export and soma-humanoid-avatar cuts and the authoring UX target.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 01:29:45 +02:00
Meta Vens
331d7107af Map: motion-pipeline prose map (Raven GPU tenancy probes)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 22:29:25 +02:00
Meta Vens
8a575b20e9 Merge cut/vili-encoder-placement: cached prompt embeddings, transient bf16 GPU encoder child (Soul s1)
gpu-busy-blind (High) is deferred to the GPU tenancy gate cut, which owns 'is the GPU free'; fist-clip bound recorded as bf16 numerics. Raven runs 02ca1cd.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 22:18:33 +02:00
Meta Vens
02ca1cd6d8 Vili README and tests: describe the embedding cache and the transient encoder
Replaces the 2026-06-12 timing paragraph with the cache, the child, and the numbers
measured on Raven on 2026-10-22. Adds the tests hand mutation showed missing: the
exact 2 GiB boundary, a child answer with too few vectors, and the 4096 dimension.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 21:40:42 +02:00
Meta Vens
f6acfc1c85 Vili worker: Kimodo's text encoder is the cache, not a resident 8B model
The worker builds CachedTextEncoder and passes it to load_model, so Kimodo's own
encoder selection (and the CPU encoder behind TEXT_ENCODER_DEVICE) is never built.
generate() returns the per-request encoder record (identity, hits, misses, seconds,
vector hashes) and the worker identity; /health adds the identity and stored count.
startKimodoWorker drops TEXT_ENCODER_DEVICE and mounts the scripts directory, the
cultcache-py source and .vili/embeddings, with the Kimodo commit and image id read
once per worker start. The encode clock is perf_counter: time.time went backwards
under WSL during a probe.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 21:18:17 +02:00
Meta Vens
76ab8308eb Vili: text-embedding cache and one-shot GPU encoder child
text_encoding.py holds the CultCache embedding store (gamecult.vili.text_embedding.v0
through cultcache-py), the encoder identity and key, plan_placement with its typed
gpu-busy refusal, and CachedTextEncoder, which sends a request's misses to one child
call. kimodo-text-encode.py is that child: it assembles Kimodo's LLM2Vec encoder in
bf16 with its own loader (operator ruling encoder-own-loader; peft's offload path
raises TypeError in Kimodo's loader), encodes each text alone, writes a MessagePack
answer and exits. GPU reserve 3 GiB: four cold runs on Raven's 16 GB card produced
identical vectors with no CUDA error. The worker and daemon are not wired yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 21:10:01 +02:00
Meta Vens
96ddec1204 Research: NVIDIA motion generation since Kimodo 6bb5848 (facts only)
Serves motion-pipeline fork: which motion model and text encoder Vili runs
(follow_up kimodo-v1-2).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:27:57 +02:00
Meta Vens
8760863ce4 README: front door no longer claims Idunn health; Vili is a Raven scheduled task
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:14:55 +02:00
Meta Vens
8a4e589c0b Merge readme-front-door: README opens with value, problem, entry points, live versus planned 2026-10-22 20:14:36 +02:00
Meta Vens
c5eec61753 README: front door with value, problem, entry points, live versus planned; repo-relative paths
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:14:27 +02:00
Meta Vens
e2afdbbae9 package-lock: regenerate with npm against the sibling CultLib
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 18:55:55 +02:00
Meta Vens
cf973e285f README: Vili is started at boot by its task, not kept alive
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 18:55:55 +02:00
Meta Vens
3778830df4 Vili: delete the unsigned Idunn RUDP health publisher
It published idunn.daemon_health to 10.77.0.2:17870 (the retired Windows Idunn)
every 15 s and failed each time; Idunn on Yggdrasil binds no RUDP health ingress.
Deletes idunn-rudp.cjs, the publisher and its status, the --idunn-* args in the
daemon and the three launcher scripts, operator_state slot 4, and the
cultnet-ts and direct @msgpack/msgpack dependencies. transportProfile now states
local-cultcache-only. All commits build (node --check passes); not yet run on Raven.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 05:12:00 +02:00
Meta Vens
dd25a627af docs: motion-pipeline target (generated motion to Unity clips)
Campaign motion-pipeline, opened 2026-10-20 at the operator's word; first
consumer is the StreamPixels RPS duel.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 14:13:43 +02:00