Bugs and root causes are logged here per AGENTS.md §4.6 / §9.6. Timestamped records
are historical — reference them, never edit retroactively. Companion to
docs/CHANGELOG_2026-08-06.md and docs/CURRENT_ARCHITECTURE.md.
- Where:
libvitriol/hermetis/db.py—store_episodecalled_ensure_edge(edge INSERT) without a commit, leaving an open write transaction that held the SQLite write lock. - Symptom: the 3rd sequential
/hermetis/storerequest stalled ~5 s (busy_timeout) under threaded Flask; direct single-thread calls masked it. - Fix: commit after the edge link;
get_or_create_edgenow commits under the write lock. Also held_write_lockacross the entire write (was only around the connection fetch).
- Where:
scripts/vitriol—setup_caps(setcap) ran BEFOREfix_rpath(patchelf), which rewrites the ELF and clears file capabilities. - Symptom: after
sudo vitriol setup,getcapon llama-server was empty. - Fix: reordered —
fix_rpathfirst,setcaplast (a583047).
- Where:
llama.cpp/src/llama-kv-cache.cpp— the offload branch calledggml_backend_dev_host_buffer_type(dev)for every layer; CPU-placed layers (il >= ngl) have a device whoseget_host_buffer_typeis NULL (ggml-cpu.cpp:489) → NULL →ggml_backend_buft_is_host(NULL)assert during KV cache init. - Fix: fall back to the normal device buffer type when the host buffer type is NULL
(submodule
85d01eda8).
- Where:
libvitriol/hermetis/db.py—SELECT e.*, ... UNION SELECT n.*, .... - Symptom:
sqlite3.OperationalError: SELECTs to the left and right of UNION do not have the same number of result columns— exposed when P3.1 addedgit_rev/superseded/superseded_bytoknowledge_nodes(column counts diverged). - Fix: explicit matching columns (
_type, id, created_at, content, strength).
- Where:
scripts/build-llama-server.sh— vendoredcpp-httplibstatic lib is linked intolibllama-common.so; a clean configure failed with "relocation R_X86_64_TPOFF32 ... recompile with -fPIC". - Fix:
-DCMAKE_POSITION_INDEPENDENT_CODE=ONadded (cfa0ef9).
- BERT zero embeddings (P2-era binary): "fast"→norm 0.0, "hello world"→1.0, backend- and pooling-independent. NOT a current-source bug: a clean rebuild produces correct embeddings (norm 1.0, all inputs). Root cause: stale P2-era server processes (killed). GGUF-GPU embeddings verified working; backlog closed.
- Decode regression (full-launch test): 8–15 t/s vs ~30 baseline. Root cause: stale incremental build dir. Clean rebuild yields 37–38 t/s (better than baseline).
- Lesson: after heavy testing/edits, do a clean rebuild (
rm -rf build+ the PIC flag) before trusting any measurement.
qwen3.6-35b-a3b-instruct-TQ1_0.ggufproduces garbage in every mode (stream + CPU); the dense BitNet TQ1_0 substrate is fine in the fork. The file is suspect (bad conversion / vision-model tokenizer). Stream/VITRIOL-knob sweep deferred behind a known-good stream-requiring model.
- Praetor intent rule rejects valid Python
#comments (verified with a minimal file) — disabled via.praetor.toml[intent] enabled=false(maintainer decision). - Praetor pre-commit hook flagged the whole repo baseline (38k+ diagnostics) —
scoped to changed files, then made diff-aware (
scripts/praetor_diff.py): only NEW diagnostics relative to the staged version gate commits. - fish shell (
sudo prlimit --pid $$ ...) —$$invalid in fish; use$fish_pidand; and.
- Where:
scripts/launch_vitriol_full.sh/launch_copula.sh. - Symptom:
vitriol stopexited 1 without killing the gen server; launches reported "exited immediately" while the model was actually still loading; a stale gen server held :8279 invisibly (ss -p/lsof/fuser showed owner "-", inode unclaimed in /proc). - Root causes:
port_pidrelied onss -p, which cannot attribute pids for our ownsetsidservers; the pipeline returning non-zero on a miss aborted the script underset -euo pipefail.- Launch hardening polled for the port binding, but the port binds only after the ~50 s model load → a healthy loading server was misread as dead.
log_errmatched the benign "failed to fit params" warning as a fatal error.
- Fixes:
port_pidnow falls back ss -> lsof -> pgrep (cmdline--port) -> fuser and always returns 0; hardening polls process liveness (kill -0), not binding;log_erruses fatal-marker patterns only; launch treats a healthy port as already-running;stopkills by pid (or socket as last resort).