Book upload processed through scan → metadata → book-create → file-move, then failed at embeddings:
Loading embedding model from /app/ai/nomic-embed-text-v2-moe.f16.gguf
[Error] Failed to load embedding model ... Could not find file
3/3 attempts, ErrorType: io → poison-message pattern detected → DLQ
gpu-coordinator granted the lease fine (1536 MB on SERVER) — the worker started, the model file is simply absent from /mnt/fusionio/spikersoft/ai (bound ro as /app/ai).
Same family as #486/#495
The GPU-host provisioning chain (out-of-space event, ai-tree re-own) evidently also lost the model weights. Same class: host state not reproducible.
Expected contents of /mnt/fusionio/spikersoft/ai (from configs)
File
Consumer
nomic-embed-text-v2-moe.f16.gguf
Embeddings worker (AI:EmbeddingModelPath) AND the API's RedisVectorSearchService — this one blocks the book pipeline
Run ls -la /mnt/fusionio/spikersoft/ai/ to see what actually survives.
Fix (ops, SERVER)
sudo mkdir -p /mnt/fusionio/spikersoft/ai
# embeddings (the blocker):
sudo curl -L -o /mnt/fusionio/spikersoft/ai/nomic-embed-text-v2-moe.f16.gguf https://huggingface.co/nomic-ai/nomic-embed-text-v2-moe-GGUF/resolve/main/nomic-embed-text-v2-moe.f16.gguf
# then re-upload the failed book (the original request was DLQ'd as poison)
Quiz-gen models as needed per the appsettings model list.
Durable direction
This is exactly what the ai-models bucket in docs/minio-storage-migration.md is for — models in MinIO, workers pull/verify on boot (or an mc mirror sync), so a host rebuild can't silently lose them. Related: #413, #486, #495, #432.
Verify
Seq: Embedding model loaded instead of the io error; book upload completes end-to-end; GET /healthz Vector Search stays Healthy.
## Symptom (prod, book upload 04:21 UTC)
Book upload processed through scan → metadata → book-create → file-move, then **failed at embeddings**:
Loading embedding model from /app/ai/nomic-embed-text-v2-moe.f16.gguf
[Error] Failed to load embedding model ... Could not find file
3/3 attempts, ErrorType: io → poison-message pattern detected → DLQ
gpu-coordinator granted the lease fine (1536 MB on SERVER) — the worker started, the **model file is simply absent** from `/mnt/fusionio/spikersoft/ai` (bound ro as `/app/ai`).
## Same family as #486/#495
The GPU-host provisioning chain (out-of-space event, ai-tree re-own) evidently also lost the model weights. Same class: host state not reproducible.
## Expected contents of /mnt/fusionio/spikersoft/ai (from configs)
| File | Consumer |
|---|---|
| `nomic-embed-text-v2-moe.f16.gguf` | **Embeddings worker** (AI:EmbeddingModelPath) AND the API's RedisVectorSearchService — this one blocks the book pipeline |
| `gemma-3n-E2B-it-Q8_0.gguf`, `gemma-3-12b-it-Q4_K_M.gguf`, `Phi-4-reasoning-plus-Q4_K_M.gguf` | QuizGeneration model list |
| `Mistral-7B-Instruct-v0.3.Q4_K_M.gguf` | QuizGeneration legacy AI:ModelPath fallback |
| `dolphin-2.2.1-mistral-7B-GGUF-f16.gguf` | BookAnalysisService (likely dormant) |
Run `ls -la /mnt/fusionio/spikersoft/ai/` to see what actually survives.
## Fix (ops, SERVER)
sudo mkdir -p /mnt/fusionio/spikersoft/ai
# embeddings (the blocker):
sudo curl -L -o /mnt/fusionio/spikersoft/ai/nomic-embed-text-v2-moe.f16.gguf https://huggingface.co/nomic-ai/nomic-embed-text-v2-moe-GGUF/resolve/main/nomic-embed-text-v2-moe.f16.gguf
# then re-upload the failed book (the original request was DLQ'd as poison)
Quiz-gen models as needed per the appsettings model list.
## Durable direction
This is exactly what the `ai-models` bucket in docs/minio-storage-migration.md is for — models in MinIO, workers pull/verify on boot (or an `mc mirror` sync), so a host rebuild can't silently lose them. Related: #413, #486, #495, #432.
## Verify
Seq: `Embedding model loaded` instead of the io error; book upload completes end-to-end; `GET /healthz` Vector Search stays Healthy.
Immediate fix applied: Joey downloaded nomic-embed-text-v2-moe.f16.gguf to /mnt/fusionio/spikersoft/ai on SERVER. Awaiting a fresh book upload to confirm embeddings loads it.
Direction confirmed by Joey: model storage moves to MinIO (ai-models bucket) as the durable fix. Sketch of the pattern (future work, laying the path now):
ai-models bucket + scoped keys (rw for an ops/sync identity; ro for embeddings/quiz-gen/book-analysis workers).
Workers get a boot-time pull-and-verify step behind the same Storage:UseS3 seam used by the scanner/extractor: on startup, check the local model path; if missing (or hash-mismatched vs the bucket's ETag/checksum), download from ai-models/<file> into a local cache dir, THEN load. Filesystem bind stays as warm cache — first boot on a fresh host self-heals instead of crash-looping.
Seeding/rotation via mc mirror /mnt/fusionio/spikersoft/ai spiker/ai-models (one-time), new models uploaded to the bucket first.
Payoff beyond resilience: the /app/airo bind stops being a SERVER pin for embeddings/quiz-gen — models fetch over the network, so those workers can follow the GPU (e.g. the 4090) subject only to the gpu-coordinator lease model, not data gravity. This incident (host lost the weights silently) is exactly the failure mode the bucket eliminates.
Keeping this ticket open for (a) the upload verification and (b) tracking the pull-and-verify implementation, unless we'd rather fold (b) into #413.
Immediate fix applied: Joey downloaded `nomic-embed-text-v2-moe.f16.gguf` to `/mnt/fusionio/spikersoft/ai` on SERVER. Awaiting a fresh book upload to confirm embeddings loads it.
**Direction confirmed by Joey: model storage moves to MinIO (`ai-models` bucket) as the durable fix.** Sketch of the pattern (future work, laying the path now):
1. `ai-models` bucket + scoped keys (rw for an ops/sync identity; **ro** for embeddings/quiz-gen/book-analysis workers).
2. Workers get a boot-time **pull-and-verify** step behind the same `Storage:UseS3` seam used by the scanner/extractor: on startup, check the local model path; if missing (or hash-mismatched vs the bucket's ETag/checksum), download from `ai-models/<file>` into a local cache dir, THEN load. Filesystem bind stays as warm cache — first boot on a fresh host self-heals instead of crash-looping.
3. Seeding/rotation via `mc mirror /mnt/fusionio/spikersoft/ai spiker/ai-models` (one-time), new models uploaded to the bucket first.
4. Payoff beyond resilience: the `/app/ai` **ro bind stops being a SERVER pin** for embeddings/quiz-gen — models fetch over the network, so those workers can follow the GPU (e.g. the 4090) subject only to the gpu-coordinator lease model, not data gravity. This incident (host lost the weights silently) is exactly the failure mode the bucket eliminates.
Keeping this ticket open for (a) the upload verification and (b) tracking the pull-and-verify implementation, unless we'd rather fold (b) into #413.
Correction to the model table + second casualty confirmed: after provisioning the nomic GGUF, the pipeline advanced past embeddings and died at quiz-generation — Could not find file '/app/ai/Mistral-7B-Instruct-v0.3.Q4_K_M.gguf' (LLamaWeights.LoadFromFileAsync, QuizGenerationService.InitializeForPresetAsync).
Mistral-7B is not the legacy fallback — it's THE production quiz model. appsettings.Production.json (2026-07-11) deliberately pins ALL presets (Fast/Balanced/Quality) to it because the base gemma/Phi-4 presets need 9000–12000 MB VRAM, ungrantable on SERVER's 8 GB RTX 3070 Ti; Mistral Q4_K_M (~4.2 GB, VramMB 5000) fits. So the required-on-prod set is exactly:
nomic-embed-text-v2-moe.f16.gguf — ✅ re-provisioned by Joey
gemma-3n / gemma-3-12b / Phi-4 — NOT needed on current hardware (only if quiz-gen ever moves to the 24 GB 4090)
dolphin (BookAnalysis) — dormant, skip
This double-discovery (each missing model only surfaces when the pipeline reaches its stage) is more evidence for the boot-time pull-and-verify from the ai-models bucket: a worker should fail fast at startup — or better, self-heal — not one book at a time.
Correction to the model table + second casualty confirmed: after provisioning the nomic GGUF, the pipeline advanced past embeddings and died at **quiz-generation** — `Could not find file '/app/ai/Mistral-7B-Instruct-v0.3.Q4_K_M.gguf'` (LLamaWeights.LoadFromFileAsync, QuizGenerationService.InitializeForPresetAsync).
**Mistral-7B is not the legacy fallback — it's THE production quiz model.** appsettings.Production.json (2026-07-11) deliberately pins ALL presets (Fast/Balanced/Quality) to it because the base gemma/Phi-4 presets need 9000–12000 MB VRAM, ungrantable on SERVER's 8 GB RTX 3070 Ti; Mistral Q4_K_M (~4.2 GB, VramMB 5000) fits. So the required-on-prod set is exactly:
- `nomic-embed-text-v2-moe.f16.gguf` — ✅ re-provisioned by Joey
- `Mistral-7B-Instruct-v0.3.Q4_K_M.gguf` — ⏳ downloading:
`sudo curl -L -o /mnt/fusionio/spikersoft/ai/Mistral-7B-Instruct-v0.3.Q4_K_M.gguf https://huggingface.co/MaziyarPanahi/Mistral-7B-Instruct-v0.3-GGUF/resolve/main/Mistral-7B-Instruct-v0.3.Q4_K_M.gguf`
- gemma-3n / gemma-3-12b / Phi-4 — NOT needed on current hardware (only if quiz-gen ever moves to the 24 GB 4090)
- dolphin (BookAnalysis) — dormant, skip
This double-discovery (each missing model only surfaces when the pipeline reaches its stage) is more evidence for the boot-time pull-and-verify from the `ai-models` bucket: a worker should fail fast at startup — or better, self-heal — not one book at a time.
All models verified loading in production — closing. nomic: 'Embedding model loaded successfully with 999 GPU layers' (17:25:25). Mistral: quiz generation produced real questions ('Total questions: 2', 17:33:53) with no FileNotFoundException. Qwen3-VL: 110 completed captions via the ai-models bucket. Durable half also done: the ENTIRE model set is now bucket-resident (ai-models, 24 GiB — ggufs + qwen snapshot), image-description already boot-syncs from it, and the C# workers' boot-time pull is sketched here for when it's wanted. A fresh host can no longer silently lose the fleet's models.
All models verified loading in production — closing. nomic: 'Embedding model loaded successfully with 999 GPU layers' (17:25:25). Mistral: quiz generation produced real questions ('Total questions: 2', 17:33:53) with no FileNotFoundException. Qwen3-VL: 110 completed captions via the ai-models bucket. Durable half also done: the ENTIRE model set is now bucket-resident (`ai-models`, 24 GiB — ggufs + qwen snapshot), image-description already boot-syncs from it, and the C# workers' boot-time pull is sketched here for when it's wanted. A fresh host can no longer silently lose the fleet's models.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Symptom (prod, book upload 04:21 UTC)
Book upload processed through scan → metadata → book-create → file-move, then failed at embeddings:
gpu-coordinator granted the lease fine (1536 MB on SERVER) — the worker started, the model file is simply absent from
/mnt/fusionio/spikersoft/ai(bound ro as/app/ai).Same family as #486/#495
The GPU-host provisioning chain (out-of-space event, ai-tree re-own) evidently also lost the model weights. Same class: host state not reproducible.
Expected contents of /mnt/fusionio/spikersoft/ai (from configs)
nomic-embed-text-v2-moe.f16.ggufgemma-3n-E2B-it-Q8_0.gguf,gemma-3-12b-it-Q4_K_M.gguf,Phi-4-reasoning-plus-Q4_K_M.ggufMistral-7B-Instruct-v0.3.Q4_K_M.ggufdolphin-2.2.1-mistral-7B-GGUF-f16.ggufRun
ls -la /mnt/fusionio/spikersoft/ai/to see what actually survives.Fix (ops, SERVER)
Quiz-gen models as needed per the appsettings model list.
Durable direction
This is exactly what the
ai-modelsbucket in docs/minio-storage-migration.md is for — models in MinIO, workers pull/verify on boot (or anmc mirrorsync), so a host rebuild can't silently lose them. Related: #413, #486, #495, #432.Verify
Seq:
Embedding model loadedinstead of the io error; book upload completes end-to-end;GET /healthzVector Search stays Healthy.Immediate fix applied: Joey downloaded
nomic-embed-text-v2-moe.f16.ggufto/mnt/fusionio/spikersoft/aion SERVER. Awaiting a fresh book upload to confirm embeddings loads it.Direction confirmed by Joey: model storage moves to MinIO (
ai-modelsbucket) as the durable fix. Sketch of the pattern (future work, laying the path now):ai-modelsbucket + scoped keys (rw for an ops/sync identity; ro for embeddings/quiz-gen/book-analysis workers).Storage:UseS3seam used by the scanner/extractor: on startup, check the local model path; if missing (or hash-mismatched vs the bucket's ETag/checksum), download fromai-models/<file>into a local cache dir, THEN load. Filesystem bind stays as warm cache — first boot on a fresh host self-heals instead of crash-looping.mc mirror /mnt/fusionio/spikersoft/ai spiker/ai-models(one-time), new models uploaded to the bucket first./app/airo bind stops being a SERVER pin for embeddings/quiz-gen — models fetch over the network, so those workers can follow the GPU (e.g. the 4090) subject only to the gpu-coordinator lease model, not data gravity. This incident (host lost the weights silently) is exactly the failure mode the bucket eliminates.Keeping this ticket open for (a) the upload verification and (b) tracking the pull-and-verify implementation, unless we'd rather fold (b) into #413.
Correction to the model table + second casualty confirmed: after provisioning the nomic GGUF, the pipeline advanced past embeddings and died at quiz-generation —
Could not find file '/app/ai/Mistral-7B-Instruct-v0.3.Q4_K_M.gguf'(LLamaWeights.LoadFromFileAsync, QuizGenerationService.InitializeForPresetAsync).Mistral-7B is not the legacy fallback — it's THE production quiz model. appsettings.Production.json (2026-07-11) deliberately pins ALL presets (Fast/Balanced/Quality) to it because the base gemma/Phi-4 presets need 9000–12000 MB VRAM, ungrantable on SERVER's 8 GB RTX 3070 Ti; Mistral Q4_K_M (~4.2 GB, VramMB 5000) fits. So the required-on-prod set is exactly:
nomic-embed-text-v2-moe.f16.gguf— ✅ re-provisioned by JoeyMistral-7B-Instruct-v0.3.Q4_K_M.gguf— ⏳ downloading:sudo curl -L -o /mnt/fusionio/spikersoft/ai/Mistral-7B-Instruct-v0.3.Q4_K_M.gguf https://huggingface.co/MaziyarPanahi/Mistral-7B-Instruct-v0.3-GGUF/resolve/main/Mistral-7B-Instruct-v0.3.Q4_K_M.ggufThis double-discovery (each missing model only surfaces when the pipeline reaches its stage) is more evidence for the boot-time pull-and-verify from the
ai-modelsbucket: a worker should fail fast at startup — or better, self-heal — not one book at a time.All models verified loading in production — closing. nomic: 'Embedding model loaded successfully with 999 GPU layers' (17:25:25). Mistral: quiz generation produced real questions ('Total questions: 2', 17:33:53) with no FileNotFoundException. Qwen3-VL: 110 completed captions via the ai-models bucket. Durable half also done: the ENTIRE model set is now bucket-resident (
ai-models, 24 GiB — ggufs + qwen snapshot), image-description already boot-syncs from it, and the C# workers' boot-time pull is sketched here for when it's wanted. A fresh host can no longer silently lose the fleet's models.