46 KiB
Persistent memory — eshpfi-management
Last updated: 2026-06-19
Repo purpose
Reference workspace for PFI infrastructure: server inventory, canonical
Docker Compose stacks, ops playbooks, and conventions. Authoritative
copies of compose files live on the servers under
/opt/docker/compose/<stack>/; this repo mirrors them for version
control, editing, planning, and CI-driven deploys.
Tools and conventions
Sister repos (separate gitea repos, deployed by playbooks here):
| Repo | Role | CI status |
|---|---|---|
vh/task-board |
MCP + web dashboard for assistant task state (port 7878) | push-to-main → CI deploys (2026-04-29) |
vh/vor |
Inquisitor UI sidecar (port 7879) | push-to-main → CI deploys (2026-04-29) |
vh/nevermore |
Twice-daily LLM-curated briefing (port 8181, replaces news-digest) | push-to-main → CI deploys (2026-04-30) |
vh/asset-engine |
Internal control plane over inference services (port 8200, LAN-direct) | push-to-main → CI deploys (2026-05-12) |
vh/althing |
Inter-agent message bus (chamber UI port 7881, forseti + agent-runner daemons, valkey IPC) | push-to-main → CI deploys (2026-05-14) |
vh/mead-hall |
Bifrost tool-provider sidecar (port 5173 on dev VM 10.100.10.50) | push-to-main → CI deploys (2026-05-16) |
vh/skaldsong |
Wizard + reader surface (port 8300, ana-docker, registry-pull pattern) | push-to-main → CI deploys (2026-05-19) |
vh/worldtree |
Conversation API (corviduo-dev demo :8080 / personal :8081 / pinned :8082) — Heimdall auth, Bifrost integration | push-to-main → CI deploys |
vh/yt-voice-clipper |
YouTube → diarized voice-clip dataset builder + audition console (irv-ml1 :8000) | push-to-main → gitea-webhook auto-deploy to irv-ml1 (2026-06-03) — see docs/runbooks/ytvc-autodeploy.md |
vh/arbo |
Catalog-driven ComfyUI engine (irv-ml1 :8201, comfy-dev owns engine/catalog/image) | push-to-main → gitea-webhook auto-deploy to irv-ml1 (catalog-only restart; infra side = stacks/arbo/) |
(vh/volva + Heid were re-architected from systemd daemons to Claude Code
session orchestrators 2026-06-08; their nh3-dev .service units were removed —
no longer deployed sidecars here. See Recent decisions.)
-
Two-layer backups — Backrest orchestrates restic for file+DB (5 fleet repos, daily 01:00 PDT); PBS-ANA primary + PBS-NH3 DR mirror for VM images. ana-nas is the SPOF for postgres + PBS-ANA datastore + cross-site restic targets — see
docs/runbooks/disaster-recovery.mdfor the blast-radius matrix. -
pull-hf-repo.yamlis the canonical "get a HuggingFace model/dataset onto ana-ml2's shared cache at/tank/aimodels/huggingface/" playbook. Supports--var repo_type=model|dataset|space. Replaces ad-hochuggingface_hub.snapshot_downloadpatterns. -
Worldtree admin auth — per-instance. Each Worldtree deployment (demo :8080, personal :8081, pinned :8082) has its own Heimdall registry and its own bootstrap admin key. Infra-ops's stored long-lived admin key (
key_id 61419c92) atana-docker:/opt/docker/conf/.secrets/worldtree-infra-ops-adminauths against demo only. For personal-instance admin ops, fetch the bootstrap admin per-op viadocker exec worldtree-personal-worldtree-api-1 printenv WORLDTREE_BOOTSTRAP_ADMIN_KEYon corviduo-dev. Used forPOST /admin/keys, admin diagnostics (/admin/sessions/<id>/{bifrost,tools}, etc.). -
Per-project user keys against personal Worldtree (issued 2026-05-19):
skaldsong:79744637(nh3-dev iteration),skaldsong:7c1dbbbe(ana-docker prod),althing:50d85460,mead-hall:a360822d. Sameuser_id=skaldsongacross both skaldsong keys → shared Heimdall agent slot; differentkey_id→ independently rotatable. Pattern: mint via/admin/keys, drop value to/tmp/wt-personal-<name>.keymode 600, dev collects + shreds (DO NOT cat to chat transcript). -
Skaldsong CD pattern (registry-pull). Differs from althing / asset-engine which build-on-host. vh/skaldsong's CI builds and pushes
gitea.phasefinal.com/vh/skaldsong:<sha>+:latest;playbooks/deploy-skaldsong.yamlon ana-docker pulls + recreates. SHA-pin only (no:latesthealth-gated advance yet). Prereq: host needsdocker login gitea.phasefinal.comonce (read:package PAT) — not currently in the workflow. -
gitea internal route for fleet hosts. gitea is a container on ana-docker — git-SSH
10.250.50.70:222, HTTP:3000. Fleet/colo hosts must use this internal route, NOT publicgitea.phasefinal.com(38.120.12.44, ana-srv1) — the public path fail2bans the host egress IP and wedges webhook deploys.:22on10.250.50.70is ana-docker's HOST sshd, not gitea. Full gotcha indocs/orientation.md→ Git/gitea. -
docker-as-root pattern (for ops that have no admin API, e.g.
SqliteUserStore.set_bifrost_credentials): on hosts where the SSH user is in thedockergroup but lacks passwordless sudo, rundocker run --rm -v <target-dir>:/wt -v /var/run/docker.sock:/var/run/docker.sock docker:cli sh -c "..."to edit deploy-owned files without sudo. Documented with security warning inservers/corviduo-dev/README.md. docker-group membership is effectively root via bind-mount; treat as a sudo-equivalent grant. Foot-gun: when runningdocker composeinside this sandbox, any relative path in compose.yaml (e.g.${WORLDTREE_CONFIG_DIR:-./config}) resolves against the sandbox CWD, but Docker daemon interprets the resulting path against the HOST filesystem. Always pass-e VAR=/abs/pathto the docker run invocation for any relative-default config dir. -
scripts/elwaysudo handling — elway prompts for the sudo password ONCE viagetpassbefore the firstsudo: truestep. That prompt is interactive → elway can't run unattended from a non-TTY tool if any step needs sudo. For sudo-free playbooks (nosudo: truesteps) it runs fully non-interactive over key SSH. To create root-owned dirs WITHOUT host sudo, use the docker-daemon-root trick:docker run --rm -v /worktank:/mnt alpine sh -c 'mkdir -p /mnt/<x> && chown -R 1000:1000 /mnt/<x>'.
Current state / in-flight
As of 2026-06-19:
-
Mistral Small 4 heretic is DISPLACED from GPU 0 (staged-down) — GPU 0 is now the
genmodel (Qwopus). The heretic abliterated NVFP4 (stacks/mistral-small-4-heretic/, built in-house, "heretic stays", build toolingtools/mistral-small4-nvfp4/, byte-equiv to official) was downed 2026-06-19 to give GPU 0 to the gen swap. CONSEQUENCE (operator-acknowledged, per the litellm ⚠️ note): the Worldtree demo+personalcharacterbackend — bound tomistral-small-4— is DARK until repointed. To restore: down Qwopus +upthe heretic stack (or serve it elsewhere). Prior doc-drift (official-stack README/comments saying "official NVFP4") now moot for GPU 0. (dd3a5c9,f566f61) -
irv-ml1 VRAM consolidated — ComfyUI owns the full 48 GB A6000. Pinned comfyui
NVIDIA_VISIBLE_DEVICES=1; the audio/TTS zoo (chatterbox, parakeet live; vibevoice, yt-voice-clipper config-pinned; kokoro already there) moved to the 3090; downed dia2-2b (17-day stale), ace-step, csm-expressiva. comfy-dev torch-pin applied (DISABLE_UPGRADES=true@ torch 2.12.1, SageAttention rebuilt + matched). WATCH: the 3090 has ~18.7 GB free for the audio zoo — heavy concurrent on-demand audio could pressure it; vibevoice deploys from/worktank/vibevoice/build(pre-existing repo-vs-deploy drift). (a8550ad; auto-memoryreference_irv_ml1_comfyui_mmartial) -
ComfyUI acceleration set (9 nodes) installed for comfy-dev on irv-ml1 — TeaCache, WaveSpeed(+FBCache), SageAttention2, Detail-Daemon(+bleh), PAG, dynamic-thresholding, Skimmed_CFG, TensorRT(cu12), SUPIR; comfy-dev wires + benchmarks. The full-A6000 re-tiered Flux-TRT + SUPIR from Ada-dormant to wire-today.
-
nh3-extdev (10.100.50.42) = sudo-less infra-ops manager box (successor to nh3-ansible) +
/opt/externs/{gbcnc,surefire,svsconstruction}client workspaces for pi-on-GLM-5.2 client agents. GLM 5.2 wired into litellm (glm-5.2+-reasoningvia z.ai). [2026-06-18] pi NOW INSTALLED + all 3 workspaces wired to GLM 5.2 + verified —pi0.79.7 (earendil-works) on user-level Node v22.23.0 LTS (no root); per-client isolatedPI_CODING_AGENT_DIR+models.json/settings.json+run-pi.shlauncher (sources scopedsecrets.envkey → litellm gateway, cross-site-reachable; live gbcnc→GLM 5.2 round-trip OK). Idempotentplaybooks/install-pi-nh3-extdev.yaml(add-client/upgrade). Corrected the scaffold's wrong.pi/config.example(it guessedOPENAI_BASE_URL/PI_MODELenv; real pi readsmodels.json). (527a844) STILL PENDING (client-coordination-gated, NOT pi-setup): deploy pubkeys onto each client's hosts, populaterepo/servers/inventory, give workspacerepo/s a backup git remote; verify the 3 GLM keys are rpm/tpm/budget-capped (functional confirmed, caps not). -
LitBench-RM stood up → now ON-DEMAND / DOWN.
SAA-Lab/Llama8B-CreativeWritingVerifier(R19 creative-quality reward judge for brokkr/Dvalin) served on irv-ml1 A6000 via vLLM--runner pooling(http://10.100.79.3:8202/classify, raw passage text → scalar). brokkr-validated (does NOT penalize explicit content). Taken DOWN to on-demand (operator) — resident it held ~19.6 GB crowding comfyui's A6000 slot; weights staged on irv-ml1, ~90s respin (command in auto-memory). (auto-memoryreference_litbench_rm_irv_ml1) -
litellm gateway healthy;
strip_empty_toolshook +gateway-chat.htmlshipped (see Recent decisions). arbo + brokkr litellm keys are alreadyall-proxy-models— verified, so "grant arbo/brokkr full access" was already done. claude-bot now has admin on vh/arbo; arbo CI/CD Phase 1 is firing (runner live; comfy-dev ownsdeploy.yml, fixed the change-detection in9eb743a— run #4 then failed-fast on their side, reading UI logs). -
ratatoskr Tier-3 MEMORY plane wired + live-smoke driven — persist+dispatch GREEN, recall-injection OPEN (handed off, OUT of loop per operator). The missing server-side step was the per-PORT url-guard allowlist: added
10.100.10.50:8391to personal'sBIFROST_CLIENT_ALLOWED_HOSTS(affect:8390was already in; viaplaybooks/wire-personal-worldtree-memory-allowlist.yaml,c99aa49). Consumer key REUSED (plane-agnostic, no mint). Drove define→bind→persist(asyncupsert_many200)→recall(search200); ratatoskr'smemory.dbdurable + 1024-dim indexed. Promotion gate = a consumer agent defined WITH amemoryblock (ctx.memory_config≠None), NOTagent_self_enabled. Cross-session recall-INJECTION root-caused to a SCORE-SHAPE seam: Worldtree's injector readsscore_breakdown.{similarity,salience}, but ratatoskr'ssearch()returns top-levelscore+chunk.salience(0.9, ≥0.85) → both gate-reads collapse to 0 → filtered AFTER a clean 200. Handed to worldtree-dev (#295 recall leg OPEN; their ADR-0009 wire-spec call — bifrost returnsscore_breakdown, or Worldtree reads existing fields). (auto-memoryreference_bifrost_plane_wiring) — [2026-06-16] FLIPPED → worldtree-dev's re-triage + my:8391-log pull DISPROVED the score_breakdown-shape theory: the wire shape is FINE (Worldtree synthesizesscore_breakdownfrom thescore+chunk.salienceratatoskr emits). Real cause = the COLD cross-session recall sendsscope_filterwith an extraagent_selfaxis → ratatoskr's conjunctive INV-005_scope_matchesdrops the{end_user}-only chunks → 0 hits. Now Worldtree-side, tracked Worldtree #297. (auto-memoryproject_worldtree_295_recall_rootcause) -
Worldtree demo + personal
charactermodel = mistral-small-4 (flipped from qwen3.6-35-a3b, 2026-06-16) — reorderedmodel_roles.yamlcharacter.bindsmistral-first (first bind = default), qwen kept in the switch-allowlist; applied via pin-safe recreate, fresh-agent resolution verified. Backupsmodel_roles.yaml.bak-pre-mistral-character. -
ana-ml2 GPU layout (2026-06-19) — both 96GB Blackwells full, ONE model per card. GPU 0 = Qwopus3.5-122B-A10B (the
gen/gen-reasoningmodel; OpenYourMind Kimi-distilled abliterated NVFP4, VISION-INTACT MoE;stacks/qwopus3.5-122b/, :8013, served-nameqwen3.5-122-a10b). Full 256K (262144) @ fp8 KV + CUDA graphs, util 0.95 +expandable_segments, 92.7 tok/s warm, 3.32x concurrency @256K, text+image+video, tool-callingqwen3_coder. GPU 1 = qwen-image-bench (T2I quality JUDGE, NVFP4; replaced qwen3.6-35b-a3b; aliasimage-judge, :8014) + granite-4.1-8b + selene-1-mini-8b + embed + rerank + reward — packed ~90.5/96 GB. Interconnect = PCIe only (PIX, NO NVLink) → one-model-per-card is the DELIBERATE optimal layout (zero cross-card traffic); TP=2 rejected this session (see Recent decisions). mistral-small-4 (heretic) + qwen3.6-35b-a3b both displaced. (20e796c, bfae924; auto-memoryreference_nvfp4_moe_loads_on_vllm_023) -
arbo engine builds handed to comfy-dev; Gitea Actions runner LIVE on irv-ml1. Operator approved comfy-dev owning arbo engine deploys (
deploy-engine.sh, build-local). Runner =irv-ml1-arbo(act_runner v0.2.13, host-executor as lkraven, repo-scoped to vh/arbo, labelsself-hosted+irv-ml1, systemd unitact_runner.service, polls the INTERNAL gitea route). comfy-dev to commit.gitea/workflows/deploy.yml— Phase 1 = engine-only auto-deploy (catalog stays on the :9009 webhook), Phase 2 catalog cutover later. infra-ops = box-level escalation only (runner, thepackage:writePAT once corviduo-org exists, webhook, the arbo-deploy.sh HEAD-baseline restart-detection bug still open). -
claude-bot Gitea service account STOOD UP (credential-migration foundation) — user id=3, non-admin/scoped, token
arbo-ci=write:package+read:repository, creds at~/.config/claude-bot/{gitea-password,gitea-token}(mode 600). Registry-push DEFERRED: vh is a USER not an org, so Gitea won't grant a scoped service account package-write tovh/*. (auto-memoryproject_migrate_infra_access_to_claude_credentials) -
Worldtree demo + personal MIGRATED to v0.35.10 capability-named profiles — persona substrate moved qwen→Mistral (profiles
dialogue/classification→ mistral-small-4,deep-reasoning→mistral-small-4-reasoning), Domari→selene; qwen heretic/heavy retired. Both green. The win: future model swaps (the abliterated Mistral) are now bind-mount-onlyproviders.yamledits — no image/agent/coupling. -
R18 clip+caption auto-assist models STAGED on ana-ml2 (brokkr/Eitri) — WhisperX + PANNs CNN14_DecisionLevelAtt + Qwen3-Omni-30B-A3B-Captioner at Eitri's
/srv/r18-clip-captionpath contract (symlink → /tank; dedicatedr18clipuser,workspaces/0700). Stub-level offline smoke PASSED (lo-only netns); Eitri closed the scaffold deliverable. AWAITING: Eitri/brokkr's concrete model runners (replace the deterministic stubs) → re-smoke the real path; AND the hard real-voice gate — no real victim voice through the shared-box captioner until ephemeral-(b) controls (in-VRAM-only, no shared-disk persistence, access-logged + auditd stood up) are built AND explicitly confirmed to brokkr. (auto-memoryproject-r18-clip-caption-staging) -
MastMed prototype LIVE + public — gated static-SPA container on ana-docker:8089 (caddy
basic_auth, usermastmed) fronted by a cloudflared quick tunnel (ephemeral*.trycloudflare.com— dies on tunnel-container restart → new URL). Swap to a named tunnel (operator's scoped CF token + hostname) for a stable URL anytime; container + auth unchanged. -
comfyui (irv-ml1) VAE-decode SEGFAULT — RESOLVED 2026-06-15. Root cause was
comfy_aimdo's cudaMalloc hooks conflicting with ComfyUI's load-bearing--disable-cuda-malloc: with the optimized backend disabled (cu129<cu130) but the hooks still installed, VAE-decode allocation hit the dead path → native segfault. NOT cu130 (that would re-enable the allocator we deliberately disable). comfy-dev self-fixed: patchedcomfy_aimdo/control.pyinit()→ return False (aimdo was non-functional anyway), folded into reprovision-venv.sh (their commit d5a2233). Verified clean across zimage/flux/SDXL. -
Arbo prod: engine at v0.11.38 (three engine-only fixes 2026-06-16 for granite IR-shape "AI unavailable" degradations: intent_summary default, bare-string→list coercion); now comfy-dev-owned (see the runner entry above). Registry still holds NO arbo image (local-build-only) — that gap closes when the corviduo-org +
package:writetoken land (deferred). Auth OFF (WireGuard boundary). -
R16 splice-pivot yield probe RAN 2026-06-14 (was "awaiting go"). Inline-gen arc stays CLOSED (v1 @ default decode); the splice pivot's cheap de-risk is now executed: 45 standalone NVV ([moan_soft]/[moan_intense]/[groan] × seeds 1-15) from Eleanor.wav on the v4 adapter + objective metrics (Resemblyzer spk-cosine, MFCC-dist, F0, parselmouth HNR) →
/mnt/smithy/scratch/r16_audition_yield, served on brokkr-audition :8137. 45/45, 0 degenerate; spk-cosine 0.48-0.81. Brokkr notified. NEXT: operator ear-bin (usable/impure) → brokkr's yield% / survivorship / identity analysis.gen_yield_probe.pyinirv-ml1:~/r16-vmoan-harness. -
R17 v2 corpus characterization still on the local irv-ml1 branch, push HELD (
r17-v2-characterization). No-push rule AND ASR-content-exposure call on the intimate-audio batch. Awaiting brokkr-collect or explicit push approval. (LOCAL-ONLY soundgasm-derived corpus — distribution barred, never echo transcripts to the bus.) -
Mac Pro migration is still the big open project —
migration-plan.md(repo root): WORKSTATION-ONLY move of nh3-dev's Hat-1 dev env to an M2 Ultra Mac Pro on the 10.100 subnet. Hat-2 fleet sidecars STAY on the Linux VM. Phase 0 (push pushables + confirm the ~6 local-only repos) is the only time-sensitive step. Cutover =rsyncworking trees, NOT re-clone. Everything else waits on hardware. -
sglang-vs-vLLM bench stack staged but parked (
5f049cb) — the originating SGLang-RadixAttention question resolved (vLLM v1 defaults prefix-caching ON, now pinned explicit on granite+qwen). NVFP4 chase abandoned. MAX_JOBS-on-shared-prod foot-gun caps any from-source build on ana-ml2. -
pi + GLM 5.1 harness live on nh3-dev —
glmlauncher runs pi againstglm-5.1(thinking-off) via the LiteLLM gateway;glm-5.1-reasoningfor opt-in thinking. -
Worldtree config-propagation lane is mature + humming — pre-merge delta-ping → sync-on-merge to demo+personal bind-mounts; pinned stays pre-cutover.
-
Disclosed-keys hygiene queue (rotate at convenience): HF token, the wt-personal keys, Gitea runner reg token, MINIFLUX_PASSWORD, ZAI_API_KEY. (The shared all-agents LiteLLM key is intentional, not hygiene-debt.)
-
Still open from prior: clean legacy
news-digeston ana-docker; thedocker push 60s ceilingmystery uninstrumented.
Recent decisions
-
[2026-06-19]genmodel → Qwopus3.5-122B-A10B (vision-intact NVFP4), full 256K @ fp8. OpenYourMind/Qwopus3.5-122B-A10B-Kimi-K2.6-destilled-abliterated-NVFP4 on ana-ml2 GPU 0, served-nameqwen3.5-122-a10b(gen/gen-reasoning/qwen-large route unchanged). Replaced the bjk110 text-only qwen3.5-122b (which had replaced mistral-small-4 earlier same-day). KEY FINDING: the STABLE vLLM image + fp8 KV reaches the full 262144 — nightly+turboquant-4bit-KV was UNNECESSARY (the hybrid SSM+attn KV pool is small; 11GB fp8 = 870k tokens = 3.32x concurrency @256K). graphs ON → 92.7 tok/s warm; util 0.95 +expandable_segments(0.96 OOMs the FusedMoE workspace); text+image+video + tool-calling qwen3_coder all verified. (20e796c,5b06514) -
[2026-06-19]TP=2 across the two ana-ml2 Blackwells REJECTED (operator asked; recommended against).nvidia-smi topo -m=PIX(PCIe single-bridge, NO NVLink — datacenter-only). TP all-reduces ~twice/layer over PCIe (~64GB/s vs NVLink ~900GB/s) → all-reduce-bound → SLOWER for models that already fit + would evict the 6 GPU-1 services. One-model-per-card is the optimal layout for non-NVLinked cards (zero cross-card traffic). If a single >96GB model is ever wanted, the path is PIPELINE parallelism (PP=2, 1 hop/token) + GPU-1 relocation — NOT TP. (untracked by operator choice; "keep it there") -
[2026-06-19]qwen-image-bench (T2I quality judge, NVFP4) replaced qwen3.6-35b-a3b on GPU 1 (operator), aliasedimage-judge; comfy-dev/arbo repointed off the killedqwen3.6-35b-a3bname. (bfae924,5dfce04) -
[2026-06-18]heretic abliterated Mistral Small 4 NVFP4 built + LIVE asmistral-small-4(executes the 06-16 "abliteration planned").darkc0de/Mistral-Small-4-119B-2603-heretic→ in-house NVFP4 (vision bf16,device_map=cpu) → native format (HF Mistral4 is unserveable on vLLM) → drop-in stackstacks/mistral-small-4-heretic/under the same--served-model-name mistral-small-4(zero litellm change). A/B'd vs official (refusal+ability); operator: "heretic stays." Empirically byte-equivalent to the official NVFP4 (70.80 GB tensors, identical quant scope). (dd3a5c9,f566f61,tools/mistral-small4-nvfp4/) -
[2026-06-18]irv-ml1 VRAM consolidation + comfy-dev torch-pin (operator) — ComfyUI pinned to the A6000 exclusively (48 GB), audio zoo → 3090, downed dia2-2b/ace-step/csm-expressiva. comfy-dev's torch-pin:DISABLE_UPGRADES=true@ torch 2.12.1, SageAttention rebuilt against it. (a8550ad) -
[2026-06-18]ComfyUI acceleration set (9 nodes) installed for comfy-dev on irv-ml1'scomfyui(arbo's box) — work order delivered; comfy-dev wires + benchmarks (TeaCache→Wan first). -
[2026-06-17]ana-ml2vm.overcommit_memory=1made durable (sysctl drop-in,playbooks/ana-ml2-overcommit-memory.yaml) — overcommit=0 + zero swap caps CommitLimit at ~RAM/2; the resident vLLM services ate the headroom so a large model-file mmap ENOMEM'd despite ~393 GB free. (fc88eff) -
[2026-06-17]GLM 5.2 wired into litellm (glm-5.2+glm-5.2-reasoning, z.ai passthrough,extra_body.thinking.typetoggle — mirrors the GLM-5.1 split). (fe77a35) -
[2026-06-17]nh3-extdev stood up as a sudo-LESS infra-ops manager box (operator) — key-only, password-locked, no NOPASSWD/docker (deliberately tighter than the fleet infra-ops identity); successor to nh3-ansible. Hosts/opt/externsclient workspaces for pi-on-GLM-5.2 client agents. (a841eab; auto-memoryreference_infra_ops_sudo_identity) -
[2026-06-16]litellmstrip_empty_toolspre-call hook shipped (d1bea13) — an emptytools:[]500s vLLM ("tools must not be an empty array"); a globallitellm_settings.callbacksCustomLogger pops it (+ orphanedtool_choice) before forwarding, so it covers EVERY vLLM model, not one.drop_paramsonly drops unsupported PARAMS, not empty VALUES. Mounts beside config.yaml (litellm resolves callbacks relative to the config dir). Verified live across granite/mistral/stream. (stacks/litellm/conf/strip_empty_tools.py) -
[2026-06-16]single-filegateway-chat.htmlplayground shipped (984ca3d,tools/) — zero-dep browser chat straight to the gateway (:4000, CORS open), system-prompt box, streaming SSE, rendersreasoning_content, NEVER sendstools. Built because the LiteLLM admin-UI playground can't test vLLM-backed models (see Tried-and-abandoned). Serve on-request viapython3 -m http.server -d tools. -
[2026-06-16]claude-bot granted ADMIN on vh/arbo (operator) — arbo CI/CD gitea ops now route through the service account, not the operator's personalvh(the credential-migration directive). Operator added claude-bot as Administrator collaborator; claude-bot self-serves via itsgitea-password(basic-auth = FULL perms; its stored token is package-write-only, can't change repo settings). (auto-memoryreference_claude_bot_gitea_creds) -
[2026-06-16]ratatoskr Tier-3 MEMORY plane wired + live-smoke driven. The missing server-side step was the per-PORTBIFROST_CLIENT_ALLOWED_HOSTSallowlist (:8391; consumer key reused, plane-agnostic — my earlier "reachability is the whole wiring" was incomplete). Persist + dispatch proven end-to-end against personal v0.35.3; cross-session recall-INJECTION root-caused to thescore_breakdownshape seam and handed to worldtree-dev (#295 recall leg open). Driving a real memory-call needs a consumer agent defined WITH amemoryblock (ctx.memory_config≠None), notagent_self_enabled. (tracking:c99aa49+ auto-memoryreference_bifrost_plane_wiring) — [2026-06-16] FLIPPED: thescore_breakdown-shape root-cause was disproven; real cause = cold-recallscope_filteradds anagent_selfaxis → ratatoskr's conjunctive INV-005 match drops the{end_user}-only chunks → 0 hits. Now Worldtree #297. (auto-memoryproject_worldtree_295_recall_rootcause) -
[2026-06-16]infra-ops = the DURABLE admin path on corviduo-dev (operator granted standing admin; extends the 2026-06-15 bootstrap) — added aHost corviduo-dev → User infra-ops~/.ssh/configalias + repointedservers/corviduo-dev/ssh-targettoinfra-ops@;ssh corviduo-dev/elway corviduo-devnow land as infra-ops w/ NOPASSWD (vh = explicit-only human path). elway resolves via ssh-config, NOT the ssh-target file. (tracking:c99aa49+ auto-memoryreference_corviduo_dev_emergency_ops) -
[2026-06-16]demo + personalcharactermodel flipped qwen3.6-35-a3b → mistral-small-4 (operator) — inmodel_roles.yamlthe FIRSTcatalog_idin a role'sbinds:is the default; reordered mistral-first (qwen retained in the switch-allowlist, non-destructive), applied via the PIN-SAFE api recreate (deriveWORLDTREE_IMAGEfrom the matrix sibling — never a barecompose up, which falls to the crash-blocking stale:latest), verified a fresh character agent resolves model=mistral-small-4. (auto-memoryreference_corviduo_dev_emergency_ops) -
[2026-06-16]NVFP4 ModelOpt MoE now LOADS on vLLM 0.23.0 — SUPERSEDES the 2026-06-14 "blocked" finding (#44081 fixed). Confirmed the cachednvidia/Qwen3.6-35B-A3B-NVFP4loads clean + generates on 0.23.0; swapped prod qwen36 FP8→NVFP4 (~13 GB reclaimed on GPU 1, fp16 KV). Validated by brokkr (speed: faster single-stream, ≥parity batched) + comfy-dev (vision anatomy-judge A/B: PASS). One W4A4 tell: minor multi-step chained-reasoning slip — doesn't bite the vision judge. Mistral's NVFP4 is a SEPARATE compressed-tensors path (day-0), distinct from the ModelOpt one. (auto-memoryreference_nvfp4_moe_loads_on_vllm_023) -
[2026-06-16]Mistral Small 4 = the GPU-0 tenant (operator) — fills the slot the deferred creative-writing pick held, and supersedes llama-swap (now down). NVFP4 119B MoE, pinned vLLM v0.22.0 for working vision (0.23.0 breaks it), 256K context. Operator's creative-writing model; abliteration planned → then it becomes the uncensored-creative model the persona substrate needs. Reasoning viareasoning_effort(BINARY none|high — no medium). (tracking:c77a9aa/9a49963) -
[2026-06-16]Selene judge restored on vLLM FP8, NOT NVFP4 — W4A4 is too aggressive for a precision judge validated at Q6_K; FP8 ≥ Q6_K fidelity, and Selene is text-only Llama-3.1 so dynamic--quantization fp8has no vision tower to noise.selene-1-mini-8bon GPU 1 :8011. Worldtree's Domari role repointed to it. (c985ede) -
[2026-06-16]GPU-1 buffer put to work: selene 0.13→0.17 + qwen36 0.32→0.34 — the two KV-bound generative models that gained Worldtree consumers; granite + the pooling models under-use their util, so growing THEM is wasted. (e124a2f) -
[2026-06-16]claude-bot Gitea service account stood up; corviduo-ORG conversion TABLED (operator). claude-bot is the credential-migration foundation. The proper fix for scoped agent package-write is converting vh (a USER) → acorviduoORG — blast radius assessed (org creation = free; arbo-first migration = cheap, no registry images; full fleet = incremental, ~8 active vh images / 50 repos) — but tabled for later. Registry-push deferred until then. (auto-memoryproject_migrate_infra_access_to_claude_credentials) -
[2026-06-16]arbo engine builds → comfy-dev OWNERSHIP (operator approved) + Gitea Actions runner stood up on irv-ml1 (host-executor as lkraven). infra-ops keeps box-level escalation (runner, package:write PAT pending corviduo-org, webhook). See the runner entry in Current state. (tracking: this snapshot + arbo thread01KV70AB2B4B…) -
[2026-06-16]Worldtree persona substrate migrated qwen→Mistral via capability- named profiles (v0.35.8→v0.35.10; demo + personal). PRE-SYNC-FIRST is now the standing pattern for any providers.yaml/profile change: sync config to the bind-mount BEFORE the deploy image-swap restart, so new agents + new config land together (the v0.35.9 merge-first attempt race'd → 14 crash-loops). (tracking: worldtree thread01KV6X0M…) -
[2026-06-15]qwen36 thinking-split at the gateway (operator) — baseqwen3.6-35b-a3b= thinking-OFF default (the vision judge needs it),…-a3b-thinking= opt-in reasoning. One hybrid checkpoint +--reasoning-parser qwen3; mirrors the glm-5.1 split. The judge's enable_thinking=false is what makes the NVFP4 swap transparent. (6de0844) -
[2026-06-15]arbo engine rebuilt v0.11.6 → v0.11.22 from main; catalog re-applied (v0.11.23) — curated/workflowsfooter live. src/ schema changes (Model/Lora.summary, Workflow.blurb/keywords + the /workflows endpoint) need a MANUAL image rebuild (the webhook warns-only onsrc//Dockerfile). Built from/worktank/arbo/repo, bumpedARBO_IMAGEin the host .env, recreated + verified healthy (auto-rollback armed, unneeded). comfy-dev's v0.11.20 catalog push had first crash-looped prod (old baked schemaextra=forbidvs new git-mounted catalog fields → ValidationError); they reverted the catalog, so rebuild-from-main loaded clean, then they re-applied (v0.11.23). comfyui is a SEPARATE compose project — the rebuild didn't touch it. -
[2026-06-15]althing-core refreshed to v0.14.1 box-wide on nh3-dev (forseti + heid both routed it; central-sequenced per DevOps-delegation sinceuv tool install --forceswaps the shared binary all handles use). Fixes the monitor non-truncating-lock bug sostop-monitor/--stopreliably recovers orphans. The editable install (uv tool install --force --editable .) covers every nh3-dev handle;--versiontrued up 0.14.0→0.14.1; verified--stopworks against a real orphan. -
[2026-06-15]ratatoskr Tier-3 affect live smoke GREEN (consumer-confirmed). Brokered/minted consumer_id="ratatoskr" Heimdall HS256 key on personal Worldtree (the key IS BOTH the create-session Bearer AND ratatoskr's JWT verifier secret — plain utf-8 string, NOT base64/raw); injected ENV-ONLY to~/.config/ratatoskr/provider.env(mode 600) on nh3-dev; added10.100.10.50:8390to personal'sBIFROST_CLIENT_ALLOWED_HOSTS; drove define→session (handshake 200)→turn→affect.emit (200, snapshot persisted). Worldtree signs Bifrost with the caller's raw Bearer verbatim. Drive commands + claims contract in althing thread01KV4ZYSE3…. -
[2026-06-15]Dense Qwen3-VL-32B-NVFP4 A/B'd as arbo's anatomy hero-judge vs the qwen3.6-35b-a3b MoE → dense LOST, pilot torn down, GPU 0 reclaimed. Dense NVFP4 loads clean on vLLM where the MoE NVFP4 doesn't (no expert-scale keys); ~44 tok/s on Blackwell GPU 0; vision tower stays high-precision. But comfy-dev's ground-truth A/B: MoE wins (faster + dual-use as general LLM + slight fine-detail edge), and the subtle-proportion tier is below ALL VLs. Don't re-propose a dense-VL judge swap. (auto-memoryproject-qwen3vl-dense-pilot) -
[2026-06-15]MastMed prototype containerized + exposed publicly via cloudflared. Self-contained static SPA (bun→caddy multi-stage build), basic-auth gated (operator's gating call), ana-docker:8089, cloudflared quick tunnel. See in-flight for the ephemeral-URL caveat + named-tunnel upgrade path. -
[2026-06-15]infra-ops bootstrapped onto corviduo-dev (operator-directed) — infra-ops now has SSH + NOPASSWD sudo there, OVERRIDING the fleet bootstrap script's deliberate partner-box exclusion (explicit host arg). corviduo config edits no longer needvh+ a sudo password. (auto-memoryreference_corviduo_dev_emergency_ops) -
[2026-06-15]R18 clip+caption placement = ana-ml2 (operator: "ana-docker… ana-ml2 unless irv-ml1 has room"; irv-ml1 lacked free VRAM for the 30B-A3B captioner). Models staged + stub deployed; see in-flight + the hard real-voice gate. -
[2026-06-14]LiteLLM infra-ops admin key provisioned (operator) — resolves the LiteLLM half of the credential-migration directive; use it for ALL gateway ops (NOTsk-corvid). Value at~/.config/litellm/infra-ops-key(mode 600); gateway reachable directly from nh3-dev at 10.250.50.70:4000. (auto-memoryreference_litellm_infra_ops_key) -
[2026-06-14]STANDING DIRECTIVE: migrate ALL infra access to Claude-specific credentials. Agents currently reuse the operator's PERSONAL creds for infra ops — vh Gitea admin viatea(used this session to mint aread:packagetoken for ratatoskr, id 13, under vh),sk-corvidlitellm master for vkey admin. Stand up service accounts (aclaude-botGitea user + scoped tokens, a distinct litellm admin key); re-mint consumer creds under them; flag personal-cred fallbacks until done. (auto-memoryproject_migrate_infra_access_to_claude_credentials)
79 older entries archived to archival-memory.md.
Tried and abandoned
-
[2026-06-19]A MoE card can't be filled to 0 bytes free — the FusedMoE transient workspace is the floor. vLLM's FusedMoE kernel allocates a ~3.09 GB transient workspace OUTSIDE itsgpu-memory-utilizationbudget, into free VRAM, during graph capture + inference. util 0.96 OOM'd by 0.1 GB on it (tried to allocate 3.09 GiB, 2.99 free), worsened by 4.2 GB of PyTorch reserved-but-unallocated fragmentation. FIX:PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True(reclaims the fragmentation) + leave ~3.2 GB free (util ≤ ~0.95 on a tight-fit MoE). The workspace size is fixed; "fill to 0" is physically impossible for MoE. -
[2026-06-19]vLLM decode tok/s: ALWAYS discard the first generation (cold warmup). Cold single read = 24.8 tok/s; warm steady-state = 92.7 (3 runs identical). A cold read undersells decode ~3–4× — the first gen pays graph-replay/JIT warmup. Measure run 2+ over a ≥256-token output. -
[2026-06-19]For full native 256K on one 96GB card, nightly+turboquant-4bit-KV was unnecessary for the Qwopus MoE. Stable fp8 KV already fits 262144 — the hybrid SSM+attention model caches KV only on its attention layers, so the pool is small (11 GB fp8 = 870k tokens). 4-bit turboquant KV (nightly-only) only buys MORE concurrency, at a long-context-recall risk + FA2 fallback (incompatible with FA3). Reach for fp8 first; 4-bit only if you need heavy concurrency at long context. -
[2026-06-18]mmartialcomfyui-nvidia-dockerimage: root pip installs CRASH-LOOP the container.docker exec -u 0 pip install(the documented node-install pattern) leaves root-owned files in the uid-1000 venv; the image's boot script re-manages that venv AS uid 1000 (its torch-upgrade step) →Permission deniedonsetuptools/__pycache__→Torch installation failed→ crash loop (looks like a torch bug, is ownership). FIX:chown -R 1000:1000 /comfy/mnt/venvafter any root install (host:/worktank/comfyui/run/venv; if crash-looping too fast to exec,docker stop→ chown host path →start). The image ALSO auto-upgrades torch every boot (USE_PIPUPGRADE) → compiled exts drift; pin withDISABLE_UPGRADES=true. (auto-memoryreference_irv_ml1_comfyui_mmartial) -
[2026-06-17]Mistral HF→NVFP4 quant: the model-placement knob is the whole game.device_map="auto"fills GPU0 → OOM during MoE un-fusing; constraining withmax_memoryoffloads experts to the meta device →Cannot copy out of meta tensor. The working config isdevice_map="cpu"(CPU-resident model, sequential pipeline onloads each layer to GPU0). Plus: read shards with plainread()+safetensors.torch.load(bytes), NOTsafe_open(mmaps the whole shard → ENOMEM on/tankZFS for the 50 GB shard, regardless of free RAM/overcommit). And llm-compressor's NVFP4 output KEEPS themodel.prefix (not prefix-shifted). -
[2026-06-17]HF-format Mistral Small 4 is UNSERVEABLE on vLLM — there is no HFMistral4backbone in any vLLM version; it serves ONLY via the native loader (--config-format/--load-format/--tokenizer-mode mistralagainst params.json + consolidated*.safetensors + tekken.json). So a HF-format quant MUST be converted to native before it can serve. -
[2026-06-18]ComfyUI custom nodes break on version-assumption drift — the box runs 0.24.1 (not the 0.19.3 a work order assumed); 0.24.1 refactoredprecompute_freqs_cisinto class methods, and TeaCache imports it at MODULE level → kills the WHOLE node (guard the LTX-only import). Alsopip install tensorrtdefaults to cu13 libs against a cu12.9 stack → usetensorrt-cu12. -
[2026-06-16]litellm 500Router.acompletion()/aembedding() missing 'messages'/'input'= a request missingContent-Type: application/json, NOT a gateway outage. curl-ddefaults to form-encoding → litellm can't parse the JSON body →datareaches the router withoutmessages/input→ 500 (should be a 400; litellm #16993). My own diagnostic calls dropped the header → I misread it as a gateway outage and needlessly bounced the gateway ~4× chasing a phantom (image/version/config were fine throughout; a malformed UI-added "Mistral Story Eval" model in the DB was a red herring I deleted). ALWAYS send-H "Content-Type: application/json"testing litellm; reproduce with a header'd call before declaring a litellm incident. -
[2026-06-16]LiteLLM admin-UI playground can't test vLLM-backed models — it auto-sends emptytools:[], vLLM 400s (litellm #6228); the gatewaystrip_empty_toolshook is a PROXY hook and structurally can't reach the UI's in-processlitellm.completion()call. Off-ramp =tools/gateway-chat.html. (Langfuse playground also out: its SSRF guard blocks internal-IP LLM connections, wontfix Langfuse #13097.) (auto-memoryreference_litellm_ui_playground_vllm_deadend) -
[2026-06-16]A gitea Actions run that "looks like it never fired" (no image, untouched build dir) usually DID fire then skipped or failed-fast. Bit arbo TWICE: run #3 looked-never-fired but SKIPPED (change-detectionengine=0); run #4 looked-never-fired but FAILED in ~7s (early-step). Check the run LIST + status via claude-bot (GET /repos/{o}/{r}/actions/tasks) BEFORE a runner-connection/dispatch theory. CORRECTION (2026-06-16, proven): action logs ARE readable via API at the per-JOB endpoint —GET /api/v1/repos/{o}/{r}/actions/runs/{run}/jobs→ take a job.id→GET /api/v1/repos/{o}/{r}/actions/jobs/{job_id}/logsreturns the full plain-text log (claude-bot basic-auth, internal route10.250.50.70:3000). Only the RUN-level/runs/{id}/logs404s; the per-job one works, so no UI needed. Gotcha when reading: gitea marks every stepconclusion:failureonce any step fails — the per-step conclusions mislead; trust the log body + step timestamps (the step with real duration is the culprit) not the conclusions. (Used 2026-06-16 to diagnose arbo run #5/task 1175 = test-gateuv run pytest→Failed to spawn: pytest= pytest absent from the fresh-checkout venv sync, NOT the SSH-clone comfy-dev suspected.) -
[2026-06-16]vLLM 0.23.0 breaks Mistral MULTIMODAL at startup (MistralCommonImageProcessor has no attribute fetch_images, #44911 regression ~0.22.1+; same class hit Mistral-3.1/ Devstral). The dummy-image profiling crashes. Workarounds:--limit-mm-per-prompt '{"image":0,"video":0}'loads text-only; for VISION, pin v0.22.0 (last pre-regression). Tradeoff: v0.22.0 buffers reasoning (doesn't stream reasoning_content cleanly); a newer build streams it but breaks vision — vision won (Mistral is the abliteration-baseline). -
[2026-06-16]Mistral-reasoningTTFT variance = Triton kernel JIT-compile-during- inference, NOT reasoning time.jit_monitorlogs the spike (_compute_slot_mapping_kernel,apply_token_bitmask_inplace_kernel← the tool-call/structured-output path). vLLM's startup warmup covers only SOME shapes; a first-hit uncovered shape JITs a kernel (seconds), then CACHES it — warm until container recreate (the Triton cache is IN-container, no volume, so recreate = cold again). Secondary: GPU idle-down to P8/180 MHz between requests. Also: Mistralreasoning_effortis BINARY (none|high only — medium/low → HTTP 400). -
[2026-06-16]Worldtree old-baseline instances need the FULL config set synced, not the changeset delta. Personal (a PRE-mistral baseline) crash-looped (41 restarts) onDanglingBindingError: role 'echo' binds missing catalog entry 'qwen3.6-35-a3b-heretic'— itsmodel_roles.yaml(2026-06-10, never migrated) still bound the retired heretic that the synced v0.35.10 providers removed. The "model_roles unchanged — skip" was correct only for demo (already at the v0.35.9 baseline). Old-baseline → sync providers + model_roles + defaults. -
[2026-06-16]vh is a Gitea USER, not an org → no scoped package-write for a service account. Gitea user-namespace packages are owner/admin-only, so claude-bot can't push tovh/arbowithout being admin. The fix is converting vh → acorviduoORG (tabled). Also: vh'steatoken lackswrite:admin— create gitea users via the server-sidegitea admin user createCLI (docker exec -u git gitea …), not the admin API. -
[2026-06-16]docker compose up -don a multi-service vLLM stack recreates ALL its services (shared.env→ all configs re-hash) → concurrent memory-profiling race ("No available memory for the cache blocks"). Target one:docker compose up -d <service>. (auto-memoryfeedback_compose_up_recreates_whole_stack) -
[2026-06-15]A comfyui restart-loop withexit 0+OOMKilled=falseis NOT OOM — suspect a native SEGFAULT.docker inspectshows only the LAST exit code; a GPU OOM is a catchableRuntimeError: CUDA out of memory, NEVERFatal Python error: Segmentation fault. Diagnostic:RestartCount>0= same container restarted in-place → the docker json-log ACCUMULATES across all cycles, so grep the fulldocker logsfor the crash signature + the lines right before each restart banner. comfyui's was at VAE decode (sampling completes, then segfault loadingAutoencodingEngine) — gen-triggered but native, not VRAM. Suspects logged: torch/cu130 mismatch, an injectedaimdocuda-funchooks lib, the VAE. -
[2026-06-15]NEVER blanket-killalthing-light-monitorby PID — they're per-handle and MANY agents run their own on the shared nh3-dev box (heid / ratatoskr-dev / worldtree-dev / bifrost-dev each have one). Akill $(pgrep -f light-monitor)downs four peers' monitors (near-miss caught by checking/proc/<pid>/environALTHING_HANDLE+ cwd first). Recover your OWN viaalthing-cli stop-monitor(v0.14.1+); a raw&-backgrounded monitor is untracked (no harness fire-notification) — always arm viarun_in_background. (extends the pkill-self-match lesson below) -
[2026-06-15]Manualdocker compose upon corviduo Worldtree DOWNGRADES to a stale local:latest→ crash-loop (config/image mismatch). Composeimage:is…/worldtree:latest, but local:latestlagged ~2wk (21c90d5eeb2d); CI/CD deploys NEWER SHA images, and a real pull 401s (daemon has no gitea-registry creds — that's CI/CD's).--pull neverthen used the stale latest → personal crash-looped onConfigurationError: echo.default_model missing→ ~2-3 min personal outage. RECOVER: retag:latestto the image a HEALTHY SIBLING runs (docker inspect worldtree-worldtree-api-1 --format '{{.Image}}'→docker tag …), thenup -d --pull never; verifyApplication startup complete. Don't manually recreate Worldtree on corviduo without pinning the correct image — image+config are CI/CD-coupled. (auto-memoryreference_corviduo_dev_emergency_ops) -
[2026-06-15].claude.json(Claude Code config) truncates on ENOSPC → invalid JSON → CC resets to defaults on next start. nh3-dev hit 100% disk (a peer's R19 dataset pull staged ~147G to local /home instead of the 7TB NAS); the in-flight.claude.jsonwrite was cut mid-key. Repair = strip the dangling token + close the open braces, validatejson.load. CC keeps its OWN rolling backups at~/.claude/backups/+ writes a.claude.json.corrupted.*snapshot when it self-detects. After ANY ENOSPC on a box running CC/agents: integrity-check.claude.json(json.load) AND the althing bus DB (PRAGMA integrity_check). -
[2026-06-15]pkill -f althing-light-monitorSELF-MATCHES the killing shell (the pattern is in the command's own argv) → kills itself mid-run (exit 144/truncated output). Stop the light-monitor viaalthing-cli stop-monitoror a captured PID — neverpkill -f <string-present-in-this-command>. The singleton lock can also RACE to 2 live monitors during re-arm churn; keep exactly one tracked (run_in_background) monitor, and a raw&monitor is untracked (no harness fire-notification — don't use it). -
[2026-06-14]Fleet/colo hosts must reach gitea over the INTERNAL route, NOT the public IP.gitea.phasefinal.com= public38.120.12.44(ana-srv1); gitea is a container on ana-docker, git-SSH10.250.50.70:222+ HTTP:3000. A fleet host egressing to public:22gets fail2ban-banned after any retrying git loop → silently wedges webhook auto-deploys (git fetchtimes out underset -euo pipefail, aborts before reset). Bit irv-ml1's arbo deploy.:22on10.250.50.70is ana-docker's HOST sshd (deploy key → Permission denied), NOT gitea. Documenteddocs/orientation.md(6e58e57).
70 older entries archived to archival-memory.md.