Troubleshooting¶
Symptom → fix, condensed from §16 — Troubleshooting. The Engine degrades quietly more often than it crashes loudly — when behavior is wrong but nothing is red, trust the /api/health/detailed body and the bracketed journal tags ([VRAM], [MODEL-ROUTING]) over the absence of an exception.
Gather signal first¶
GET /api/health(API + Postgres) andGET /api/health/detailed— read the body.journalctl -u aetherium.service -n 200 --no-pager | grep -iE "error|exception"docker ps— Postgres + ChromaDB up?
Escalating? Include the deployed SHA (cat /opt/aetherium/deployed-commit.txt), the /api/health/detailed body, and the journal lines around the failure. For request forensics: AETHERIUM_HTTP_VERBOSE=1 in the service env, restart (loud — turn back off).
Build-time¶
| Symptom | Cause | Fix | See |
|---|---|---|---|
| Publish "works" but client 404s | Published the .slnx, not the server .csproj — no wwwroot/ |
Publish the server .csproj |
§14 |
NETSDK1045: …does not support targeting .NET 10.0 |
No .NET 10 SDK on host | Install the .NET 10 SDK | §14 |
deploy.sh: working tree has staged/modified changes |
Refuses a dirty tree | Commit/stash, or --force |
§14 |
deploy.sh: bun not found (exit 7) |
The client build needs bun |
Install bun, or --no-spa |
§14 |
Deploy-time (Linux · systemd)¶
| Symptom | Cause | Fix | See |
|---|---|---|---|
Service restarts forever; 203/EXEC or libhostfxr.so could not be found |
DOTNET_ROOT/ExecStart wrong |
Point both at the real .NET install; daemon-reload; restart |
§14 |
Loads none of your config; REPLACE_ME… in logs; storage falls back |
WorkingDirectory ≠ install dir |
WorkingDirectory=/opt/aetherium in the unit |
§14 |
appsettings.Linux.json silently ignored |
ASPNETCORE_ENVIRONMENT ≠ Linux (loads by name, not OS) |
Environment=ASPNETCORE_ENVIRONMENT=Linux in the unit |
§09 |
Database migration failed, later calls 500 |
Postgres not ready at startup; exception swallowed | Start Docker, confirm Postgres, restart | §14 |
deploy did not become healthy within 60s |
Service up but not answering /api/health |
Run the printed journalctl cmd; work the rows above |
§15 |
First-start & configuration¶
| Symptom | Cause | Fix | See |
|---|---|---|---|
Won't start: [ToolCatalogValidator] Tool catalog drift detected |
Router catalog ≠ prompt docs; drift fatal by default | Give each tool a router mapping and a ToolDoc; bisect with Aetherium:ToolCatalog:FailOnDrift=false |
§12 |
| An env var is silently ignored | appsettings.Local.json outranks env vars |
Set it in Local.json, or remove it there |
§09 |
| A model is never used; a different one runs | Its ID has a cloud prefix (gpt-, claude-, …) — skipped |
Use a real local ID, or leave blank/default |
§09 |
| A changed setting has no effect | Inert (pool keys) or shadowed (Aetherium:Cleanup timers) |
Change cleanup timers as SystemSettings rows; pool keys do nothing |
§09 |
Exits: Kestrel address already in use (:5257) |
Prior instance / port held | Stop the other process, restart | §02 |
Runtime¶
| Symptom | Cause | Fix | See |
|---|---|---|---|
ChromaDB 500: unable to open database file (SQLite 14) |
Volume on NTFS (ignores POSIX locks) or FD exhaustion | Keep volume on ext4/btrfs/xfs + nofile: 65536 ulimit |
§14 |
Error: Unknown tool '<name>' |
No dispatch arm in McpToolRouter.ExecuteToolAsync |
Add the switch arm |
§12 |
| New tool runs with no approval, truncated audit | Absent from ToolSecurityLevels → Standard |
Add it at Elevated/Restricted | §07 |
Disk fills; ToolSecurityAuditEntries unbounded |
No retention exists | Schedule a periodic DELETE by Timestamp |
§15 |
/api/health 200 while inference/disk broken |
Basic check is Postgres-only | Parse /api/health/detailed body |
§15 |
Agents hang then LM Studio API Error; empty model picker |
LM Studio unreachable / no model loaded (10-min timeout) | Start LM Studio, load a model, verify …:1234/v1 and /v1/models |
§13 |
Container initialization error… Docker may not be running |
Docker unreachable / user not in docker group |
Start Docker; on Linux add the service user to docker |
§14 |
Error: Domain '<host>' is not in the allowed domains list |
Team allowed_domains set, host not on it |
Add the domain to the template | §07 |
Outbound data blocked — potential credential leak… |
DLP matched a secret in a tool arg | Remove the value; pattern lives in EgressPolicyService |
§07 |
VRAM orchestration failed… / [VRAM] ABORT |
The run's models will not fit beside what must stay resident (another lease's models or a foreign model; the standard set is evicted, not protected); the message carries the numbers and the holder | Smaller model/quant, move that model's KV cache to system RAM via the sidecar's load_config, record a measured ModelCosts entry, or wait for / release the holding lease (GET /api/inference/queue) |
§09 |
Agent stops mid-run; Circuit breaker: <reason> |
A safety ceiling tripped (not a crash) | Usually correct; widen the team's circuit-breaker limits if too tight | §06 |
search_knowledge empty though KB populated; ChromaDB… marking unavailable |
ChromaDB down → retrieval degrades to empty | Bring ChromaDB back (docker ps); auto-recovers |
§15 |
No model available on any instance, failing <N> tasks |
No instance (target or alternate slot) reachable with the model | Confirm ≥1 healthy instance with a loadable model | §13 |
Integration¶
| Symptom | Cause | Fix | See |
|---|---|---|---|
| Long build → 502/504 from your proxy, Engine fine | run endpoints synchronous; proxy read timeout severs it |
Raise proxy read timeout to longest build | §13 |
| Webhook retries never arrive after a restart | Dead-letter queue is in-memory, cleared on restart | Reconcile must-not-miss events against the runs API | §13 |
| Secondary LM Studio always unhealthy | Secondary points at a LAN address dead on a single box | Disable Secondary, or repoint to localhost | §13 |
| Model loads move but chat hits the old endpoint | Two config homes: chat reads AI_BaseUrl, mgmt reads appsettings |
Set the chat endpoint in the Settings page | §09 |