worker_error_body is the worker's one error wire shape; GpuBusy.code
reaches the daemon as a field. GpuBusy is documented as placement only.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refuse a new job with 503 + retry-after 60 while the GPU is in use (source
admission); a placement refusal from the encoder child also answers 503
(source placement). Publish the gate as operator_state.gpu. A running job
is never touched.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One owner for "may heavy GPU work start": numbers-only samples (full-screen
state, sustained 3D use, host free VRAM) in, { inUse, since, checkedAt,
probeOk } out; fail closed at start and when the probe goes stale.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
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>
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>
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>
REC-120:
- Removed the unused `readFile` import (`readFile(` had zero call
sites in the file).
- Removed the never-read `backend-status.json` initializer block; the
`backendStatus` in-memory object it snapshotted is still very much
alive (read at lines 287, 378, 489, 504, 509, 515, 768) and untouched
here.
- Also removed the `existsSync` import, which the initializer block
was its only caller for; left in place it would have become a second
dead import introduced by this same cut.
Kill attempts that failed: none.
- `rg -n "readFile\(" scripts/vili-daemon.mjs` -> no matches (repeated
the census command against current HEAD).
- `rg -n -F --glob '!scripts/vili-daemon.mjs' 'backend-status.json' .`
-> no matches in this repo; cross-repo `rg -n 'backend-status\.json'`
over F:/Projects only turns up Odin's
docs/transport-shortcut-inventory.md, which documents the shortcut
rather than reading the file.
Checks run: `node --check scripts/vili-daemon.mjs` -> syntax OK. No
package.json/test suite exists in this repo to run beyond that.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>