The in-flight section was a day stale: it still described run 3c as the live subject on a box where nothing had moved. Rewritten around what is actually true now -- v3 deployed fleet-wide, the post office relocated to nh3-docker, sec serving on GPU0, run 3c still held on power. Six new decision entries, three of which carry findings that outlive their incident: the inbound half of the handle-resolution bug (a stale ALTHING_HANDLE reads another agent's mailbox and reports it empty, which is a second route into the failure v3 exists to prevent), the OOM attribution to Claude Code sessions, and the operator's two explicit belays recorded so a later session does not re-raise them as new. Auto-archival fired at 301 lines and moved exactly one entry. Three others were old enough and every one carries a still-open deferred pointer -- the parked CI flip, muninn-gate's submit path, and the triton backend deferred to the Ada refresh. Held back per the guards; an over-cap file that keeps live decisions beats a scannable one that lost them. The entry that did move had its deferred item closed today: nh3-extdev's staged v2.1.2 wheel is moot now that the box runs 3.1.1.
74 KiB
Persistent memory — eshpfi-management
Last updated: 2026-08-28
Always check for
/tmp/infra-ops-handoff.md— if it exists and itsWritten:stamp is under an hour old, read it (it carries the in-flight handoff from the previous session), then delete it. Older than an hour: stale — delete it unread.
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. It was originally
spun up to handle the fleet backups — keep that lens when triaging
backup/storage issues.
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 |
Lean trusted inter-agent message bus — v3.0.0 "the post office" as of 2026-08-28 (U9b flag day, one-way, no rollback): ONE container on nh3-dev at http://10.100.50.40:8390 is the only stateful component; althing-po-herald one per box; althing-listen one per session; postbox is the client. Every v2 command was DELETED, not deprecated — althing-cli→postbox, althing-wake-listener→althing-listen, althing-light-monitor/althing-receiver gone. Sessions need BOTH ALTHING_POST_OFFICE and ALTHING_HANDLE; there is no default address. ⚠ An unreachable post office is an OUTAGE, never an empty inbox. → persistent-memory.d/2026-08-28-althing-v3-cutover.md |
per-box install (NOT CI-deploy); nh3-dev = container host + repo; nh3-extdev = system WHEEL at /opt/uv-tools, needs its own wheel install (playbooks/nh3-extdev-althing-v3.yaml) |
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. gitea-runner builds on ana-docker; claude-bot ADMIN collaborator (2026-06-20). Now v1.0.0b19. | push-to-main → CI build-and-deploy (runner on ana-docker) |
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 Actions CI (deploy-engine.sh, build-local, health-gated) now LIVE; catalog via :9009 webhook |
vh/zonos-gateway |
OpenAI-compatible TTS gateway over stock ZONOS2 (:8890 irv-ml1); emotion dials-first + voice mapping; reached via LiteLLM ext-tts alias. v0.2.1 (2026-07-18): voice-resolved emotion presets (resolve_preset(name,voice); angry/happy/startled_happy per-voice). 8 voices incl. 4 clones |
pushed to gitea (main 8f1885b/v0.2.1); deployed irv-ml1 tree still NON-git (hand-updated build context — CI-wire = open follow-up). Spec docs/EMOTION-DIALS-SPEC.md; host-managed voices bind-mount (./voices:/app/voices, drop wav + restart, no rebuild) |
vh/soong-lab |
Noonien Soong character-design studio (SPA + /api + WT /bifrost/tool-call); containerized 2026-07-18, LIVE on corviduo-dev :8443 (image vh/soong-lab:latest). soong-dev owns Dockerfile/compose/workflow; infra-ops owns the host |
CI = Gitea Actions build+push+DEPLOY on tag/dispatch (fleet recipe: docker:cli + raw buildx, pushes AS vh; auto-redeploy LIVE 2026-07-18 — runner SSHes corviduo-dev as deploy, compose pull && up -d from /opt/soong-lab, health-gated on /api/version). Manual redeploy sudo -u deploy bash -c 'cd /opt/soong-lab && docker compose pull && docker compose up -d'. → archival-memory.md (archived 2026-08-16) |
model-training-forge (mtf-dev) |
Fine-tuning recipe forge; T1 = E-RP writing LoRA, retargeted qwopus-122B→AEON-27B (2026-07-06) (SFT→DPO, LitBench-RM reward) | training runs, not a deployed sidecar |
(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. ⚠️ The restic file+DB layer routes through TWO rest-servers (rest-server-ana@ ana-docker:8000 → ana-docker/ana-ml2/esh-docker-vm/vm-esh-nas;rest-server-nh3@ nh3-nas:8000 → irv-ml1/nh3-docker). Both depend on their NAS's NFS export of/mnt/backup. (rest-server-ana recovered 2026-06-20.) -
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. Personal-instance admin (the~/.config/worldtree/personal-admin-token, mode 600) POSTs/admin/keys(mints per-project keys; takesuser_id+label, no scope param — scopes are tier-derived). On-instance mint recipe (cleaner than DB-manip):docker exec worldtree-worldtree-api-1POST/admin/keyswith the in-containerWORLDTREE_BOOTSTRAP_ADMIN_KEY; cleartext once in.key=wt_live_+16hex. auto-memoryreference_worldtree_demo_key_mint. -
Per-project user keys against personal Worldtree (issued 2026-05-19):
skaldsong:79744637,skaldsong:7c1dbbbe,althing:50d85460,mead-hall:a360822d. 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). 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. Prereq: host needsdocker login gitea.phasefinal.comonce. -
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) — the public path fail2bans the host egress IP. Full gotcha indocs/orientation.md→ Git/gitea. -
docker-as-root pattern (for ops with no admin API, or to edit deploy-owned/root-owned files without sudo):
docker run --rm -v <target-dir>:/wt docker:cli sh -c "...". docker-group membership is effectively root via bind-mount. Foot-gun: relative paths in compose.yaml resolve against the sandbox CWD but the daemon interprets them against the HOST fs — always pass-e VAR=/abs/pathfor any relative-default config dir. -
scripts/elwaysudo handling — elway prompts for the sudo password ONCE viagetpassbefore the firstsudo: truestep → can't run unattended from a non-TTY tool if any step needs sudo. Sudo-free playbooks run fully non-interactive over key SSH. -
Per-host SSH identity matters for sudo. infra-ops has NOPASSWD sudo on most PFI Linux boxes (corviduo-dev included since 2026-06-15). On ana-docker: default
ssh ana-docker=lkraven(docker-group, NO passwordless sudo);ssh infra-ops@ana-dockerHAS NOPASSWD root. → For any sudo op on ana-docker, usessh infra-ops@ana-docker.ssh infra-ops@10.100.10.50(nh3-dev) ALSO NOPASSWD sudo; on nh3-extdev infra-ops is sudo-LESS by design (ssh lkraven@10.100.50.42is the NOPASSWD path). irv-ml1:ssh irv-ml1= lkraven, docker-group (plain docker) but sudo needs a PASSWORD (no NOPASSWD) — stage model pulls to/home, not root-owned/worktank.
Current state / in-flight
As of 2026-08-28 16:20 PDT — althing v3 is live fleet-wide at 3.1.1 with the post office on nh3-docker. sec is serving on ana-ml2 GPU0. Nothing is training.
- ⏸ RUN 3c STILL HELD — power capacity, unchanged. lr
2e-4 -> 1e-5, corpus BYTE-IDENTICAL, config/tank/erp-tune/run-03c.jsonvalidated, relaunch is one command. Do not relaunch until the power triage lands. ⚠secnow occupies GPU0 (~51 GB), so a 3c relaunch needs GPU0 freed OR accepts three-way contention. Exactly TWO 3c launches, only one died. →persistent-memory.d/2026-08-27-run3c-launch-count-reconstruction.md - 🟢
sec(M.O.G.-SEC-27B) IS UP on ana-ml2 GPU0 :8019, operator-directed. 51,532 MiB, idle 16 W. ⚠ Re-arms the two-GPU load condition that tripped the rack breaker; the risk is concurrent load, not idle. →persistent-memory.d/2026-08-28-sec-seat-gpu0.md - 🟢 althing v3.1.1 on both heralds; post office on nh3-docker
http://10.100.50.40:8390. Container untouched since the move. All 73 handles seeded; 5 agents push-reachable (infra-ops, forseti, and the four smithy peers via pane routes). →persistent-memory.d/2026-08-28-althing-v3-cutover.md - 🔴
/tankDEGRADED on ana-ml2 — 7 physical NVMe where the pool expects 8, raidz2, one parity spent, no data errors. Operator replacing it. →persistent-memory.d/2026-08-27-anaheim-breaker-and-onboot-gap.md - ⏸ WEEKEND: power triage, "probably shut down some seats" (operator). Sheddable on ana-ml2:
vllm-gen46 GB,sec51 GB, embed 9.8, coder 8.4, rerank-a3 3.5, reward 2.1, scriberr. - ⏸ Owed to brokkr-smithy-dev when there is a card again: nothing blocking. They hold the dose curve and the entanglement finding.
- ⏸ Awaiting pewpew-dev: which other boxes/CI runners resolve
pypotraceand need the potrace headers. nh3-dev is done;playbooks/install-potrace-headers.yamlmakes each additional box one command. - ⚠
/mnt/smithywill be MISSING after every ana-ml2 reboot — manual by design. →persistent-memory.d/2026-08-23-smithy-mount-ana-ml2.md
Recent decisions
-
[2026-08-28]althing v3 flag day (U9b) executed, then six releases to 3.1.1 in one afternoon — and the post office MOVED to nh3-docker. Every v2 command deleted; 73 handles seeded and verified by set difference; 5,043 orphaned wake FIFOs deleted (v2 named them per-session+PID, v3 per-handle). Image now registry-pulled, digest-pinned, under theclaude-botnamespace. →persistent-memory.d/2026-08-28-althing-v3-cutover.md -
[2026-08-28]A staleALTHING_HANDLEsilently reads another agent's inbox and reports it empty — a SECOND route into the failure v3 exists to prevent. Outbound mis-signing sometimes gets caught; inbound never does. Shipped as a 3.1.1 warning. ⚠ Mysession_handles.jsongrounding was wrong (v2 artifact, v3 never opens it) and the same stale source had survived inside my statusline rewrite. →persistent-memory.d/2026-08-28-handle-resolution-wrong-inbox.md -
[2026-08-28]nh3-dev's three OOM events attribute to CLAUDE CODE, and the "no kernel evidence" was a permissions artifact. journald was persistent all along;journalctlsilently shows only your own messages outsideadm. Single CC sessions measured 5.4-18.4 GB, so 27 GB is 3-4 long-lived sessions. sysstat + atop now instrument the ramp. →persistent-memory.d/2026-08-28-nh3-dev-oom-attribution.md -
[2026-08-28]secmoved to ana-ml2 GPU0 and is serving (operator-directed) — GPU1 had ~28 GB free against the ~51 GB it reserves, so it could not start there. Re-arms the two-GPU load condition on a circuit that tripped 36h earlier; accepted with the constraint stated. →persistent-memory.d/2026-08-28-sec-seat-gpu0.md -
[2026-08-28]BELAYED by the operator, both explicitly: (a) a cgroup memory cap on CC sessions, (b) putting ana-gw + ana-wg + one BMC on separate power. Both were my recommendations; neither is open work. Do not re-raise as new — the atop ramps that would inform (a) are now being collected, so revisit only with a week of data. Tracking surface: this entry. -
[2026-08-28]The deployed CC plugin copies are a release step nobody owns.sync_skill.shcovers the SKILL, not the plugin; both copies must be rsync'd from the repo'splugin/on every althing release or they carry the previous release's bugs into the live surface. Raised with forseti for their release notes. Tracking surface: althing thread01M14QHZNDKDK8KH9DN92VF6VE. -
[2026-08-28]althing v3.0.0 flag day (U9b) executed — the post office replaced the P2P bus on both boxes, one-way. 73 handles seeded and verified by set difference; 5,043 orphaned v2 wake FIFOs deleted (v2 named them per-session+PID and never reaped; v3 names them per-handle, so the leak is bounded by construction); v2 db left inert. →persistent-memory.d/2026-08-28-althing-v3-cutover.md -
[2026-08-28]nh3-dev's three OOM events attribute to CLAUDE CODE — and the "no kernel evidence" was a permissions artifact. journald was persistent all along;journalctlsilently shows only your own messages outsideadm. Single CC sessions measured at 5.4-18.4 GB, so 27 GB is 3-4 mature sessions, not the ~66 a 408 MB estimate implies. sysstat + atop now instrument the ramp. →persistent-memory.d/2026-08-28-nh3-dev-oom-attribution.md -
[2026-08-27]Run 3 gated: the preregistered rule PASSED and a k=25 follow-up found a 44pp self-harm guardrail collapse — DO NOT SERVE. A pooled preserve-list test structurally cannot see a single-axis collapse. →persistent-memory.d/2026-08-27-run3-gate-safety-regression.md -
[2026-08-27]The corpus mix was specified in a unit the optimiser never sees — 45.8% dialogue by CONTEXT, 24.2% by LOSS. Harness now leads with loss share and calls context a memory budget (dd5a12e). →persistent-memory.d/2026-08-27-mix-specified-in-the-wrong-unit.md -
[2026-08-27]Dose-response: benefit and damage are ONE direction in weight space — every axis monotone in scale, no knee. The merge-back cannot separate them; vLLM cannot LoRA-serve this MoE at all. →persistent-memory.d/2026-08-27-dose-response-entanglement.md -
[2026-08-27]Anaheim tripped a power breaker; four guests including the NAS hadonbootunset and never came back. Fixed with dependency ordering — ana-nas order=1,up=45 ahead of the databases. ⚠ ONE CIRCUIT FEEDS THE WHOLE RACK including the firewall serving the public IP (operator) — so ana-gw, ana-wg and every BMC go down with the load, and there is NO remote management path to Anaheim during a power event. →persistent-memory.d/2026-08-27-anaheim-breaker-and-onboot-gap.md -
[2026-08-27]A transport failure that enters a measurement as a VALUE looks like whatever you hoped to find. heid's lost panel arms found a live defect in brokkr'st4_dissectan hour later. →persistent-memory.d/2026-08-27-empty-response-as-a-datum.md -
[2026-08-27]Run 3c authorised (lr 20x cut, single variable) and then HELD by the operator after the breaker trip. Config built and validated at/tank/erp-tune/run-03c.json;save_stepsmade configurable in the harness (0a6bd2e) because the first launch lost 80 steps with no checkpoint. Tracking surface: commit0a6bd2e+ that config path. Relaunch is one command once power is triaged. -
[2026-08-27]An event report with no timestamp is a claim about "now" — and it manufactured a launch that never happened. brokkr reconstructed a phantom third 3c launch because my 23:03 report narrated a 21:07 kill in the present tense. Every fact in it was true; it was unreadable in sequence. →persistent-memory.d/2026-08-27-run3c-launch-count-reconstruction.md -
[2026-08-27]save_stepswas hardcoded at 100 in the harness — a claimed provenance entry the run could not have honoured. Made configurable, default unchanged (0a6bd2e, 242 tests green). Caught by checking the config carried the change rather than trusting that it had been made. -
[2026-08-27]Six defects in run 3's staged build, none of which would have errored — a dialogue-only survivor list that would have silently dropped 96% of the corpus, an impersonation mask not subsumed by the low-quality mask, kvasir unbounded at 67.8% of context, asave_pretrainedconfig-key drop that made the merged model unservable, and the mix-unit error. Every one produced a plausible completed run. Full record/tank/erp-tune/recipe-r3/RUN-03-BUILD-NOTE.md. -
[2026-08-27]The 18 unpushed eitri-smithy commits are pushed — run 3'sharness_commit 9d27b4fenow resolves off-box, verified by fetching into a fresh empty repo rather than trusting the push output. ⚠ HTTPS push 403s for every gitea token including site-admin; SSH works. Untracked__pycache__(894fbe8) because a tracked.pycdirtied the tree and would have stampedharness_dirty_at_launch: true. -
[2026-08-26]Run 3's corpus is built and HELD —creative-writing-multiturnis a MEGAMIX containing bluemoon, PIPPA, LimaRP and stheno, and the remix promoted two roots that overlap at median jaccard 0.873. Dedup direction reversed to keep the primary source. F1 does not do what the recipe says; F2 does. →persistent-memory.d/2026-08-26-run3-corpus-and-the-megamix-containment.md -
[2026-08-26]No conversation admission threshold for run 3 (brokkr delegated, then endorsed). Masked context costs the transformer body but NOT the LM head — the harness dropsIGNORE_INDEXbefore the 262k-vocab head — so a 20% trim buys ~35 min against a 3-hour run, and it would be a fifth filter confounding a run whose purpose is testing the filters alone. Tracked in the run-3 detail file. -
[2026-08-26]Run 2's gate FAILED and is recorded as a FAIL — T3 constraint −12.0 against a ~1 pt floor. But gate 1 is the result: T6 spatial +15.0 where run 1 failed the same axis at −3.5, base swap the only intended variable. Neither run ships; the pair prices what the abliteration cost. Plus the long-form-only stability regression a short-answer gate would have passed, and PIPPA's 123-word clip in the length signal. →persistent-memory.d/2026-08-26-erp-run2-complete-and-served.md -
[2026-08-26]Run 2 complete, merged, coherence-gated and serving aserp-tune-v2— stock-instruct base, and the mask proven by a −221,712 loss-token delta against byte-identical context. Also the p50 claim I asserted and had to withdraw. →persistent-memory.d/2026-08-26-erp-run2-complete-and-served.md -
[2026-08-26]Playbook §4 written: "when the artifact lies about itself" — seven landmines plus a pre-launch checklist, from a night in which three separate fixes each shipped a check that could not fail. The unifying line is brokkr's: when you change what an artifact means, every derived artifact keyed on the old meaning is now a liar. Commitsdae6ede→d54f256; the doc isdocs/pfi/training-throughput-playbook.md(filename kept for inbound links; scope is now wider than the name). -
[2026-08-26]Served under a NEW name on a NEW port (erp-tune-v2/ :8098), never re-pointingerp-tune-v1. Run 1's artifact still exists and is still what that name refers to; re-pointing would be the silent substitution the standing no-false-aliases rule forbids. brokkr independently asked for the same and additionally wants the concrete backing model + date in provenance, not just the alias — an alias has silently changed meaning under recorded results before. -
[2026-08-26]DPO stage gated on an axis-list decision that is not mine to make —docs/pfi/erp-dpo-stage-prep.md. No preference data for refusal axes exists;trlis not installed; the Gutenberg sets on disk are prose-quality only. ⚠ Do not installtrl(or anything) into the training venv while a run is saving — a resolution that upgrades transformers under a live process can break its save path. -
[2026-08-25]The ERP/RP tune COMPLETED in 7.36h and passed its gate on the axis it was built for — diversity 22x its noise floor, attractor −11.3pt, zero memorisation on both arms. Also the noise-floor near-miss: brokkr was one step from reporting a 13-point T6 regression sitting inside twice his instrument's own variance. →persistent-memory.d/2026-08-25-erp-tune-run2-complete.md -
[2026-08-25]8.6% MFU was an accounting artifact — real utilisation 17-20%, and the cost was attention on AMPERE kernels. Two independent methods agreed to 2.6 points. Fixed by bucketing (padding 29.9%→0.0%) plus flex_attention. ⚠ Carries the dynamo recompile-ceiling trap that produced two wrong published conclusions. →persistent-memory.d/2026-08-25-mfu-root-caused-attention.md -
[2026-08-25]NVFP4A16 serving pipeline built and validated; MERGED WEIGHTS ARE MANDATORY. vLLM cannot serve a LoRA on ANY Gemma-4 —get_expert_mappingis unimplemented and the check branches on MoE-ness, not quantization. Plus the landmine: atargets=["Linear"]recipe misses all 11,520 expert tensors silently. →persistent-memory.d/2026-08-25-nvfp4-serving-pipeline.md -
[2026-08-25]Refusal retention measured (base 0/100 → tuned 29/100, 71 still complying) — but on the WRONG AXIS.harmful_behaviorsis general harm; the abliteration was run for explicit fiction. The convenient set with a recorded baseline was not the right one. →persistent-memory.d/2026-08-25-refusal-retention-probe.md -
[2026-08-25]Worldtree b188 + b189 shipped; bridge extracted topfi/wt-matrix-bridgebecausevhis a USER not an ORG and no service account can ever publish to a user namespace. Plus the selene catalog entry that lied about what answers, and a #411 diagnosis I got wrong twice before a directory probe settled it. →persistent-memory.d/2026-08-25-worldtree-b188-b189-and-selene.md -
[2026-08-25]Run 2's base is an OPEN OPERATOR DECISION, deliberately not staged — four options with materially different safety postures, detailed in Current state. Tracked at althing thread01M0WQ8W5574KMEVCHCEKEXNS5. ⚠ Do not let it get filed as a config knob; it is a reversal of the trainee-selection decision. -
[2026-08-25]Fused MoE kernel path — DEFERRED, tracked at parkfused-moe-kernel-path-for-gemma-4-moe-training(id 47). Operator: "note the fused MoE kernel for round two… if we nail it soon, the math has us wanting to restart the run anyway." Training MFU is 8.6% (27.1 of a benchmarked 313.8 TFLOPS) becausetransformersruns the Gemma-4 experts in a Python loop — 128 experts × 30 layers, ~11,500 iterations per step under gradient checkpointing. ⚠ The same fused 3-D expert layout that made bitsandbytes skip 88.5% of the model is exactly what a grouped GEMM wants — the format is good for storage and for fused kernels, and hostile only to naive iteration. Two fixes:group_by_length(−29.9% compute, free, but breaks the seeded order manifest and re-opens a batch-composition call brokkr already made) and a grouped-GEMM/compiled MoE forward (the remaining ~10×). Not applied to the live run — restarting mid-flight to change batch ordering was judged a bad trade at step ~50 of 1,312. -
[2026-08-25]The ERP/RP tune LAUNCHED after 12 harness defects and an operator override of the corpus gate. Four of the twelve would have crashed the run; two were INERT GATES that passed because they could not fail. Run is/tank/erp-tune/run-01, harness eitri-smithy997c4a4. Full arc — override, defects, sizing, the measured MFU — in the in-flight section anddocs/pfi/gemma4-erp-tune-sizing.md. -
[2026-08-24]char-rp seat swapped to the Gemma-4 26B-A4B MoE; abliterated trainee base staged and measured. OOM root-caused to--gpu-memory-utilizationnot covering CUDA context (and to gen's footprint GROWING WITH UPTIME); a benchmark finding retracted because it scored below chance; abliteration isolated at −0.6 core points but it MOVES capability rather than removing it. →persistent-memory.d/2026-08-24-charrp-gemma4-moe-swap-and-trainee.md -
[2026-08-24]Serving the tuned ERP model: LoRA-on-NVFP4 PREFERRED, merged weights the expected fallback — and the recorded objection may be STALE. Operator: "if you CAN load it as a lora, all the better, the issue is that we will want to run nvfp4 weights, which we had some serious trouble with loading loras on top of nvfp4." ⚠ The archived root-cause says it was NOT NVFP4-specific:[2026-07-07]vLLM 0.24.0 qwen3_5 LoRA application was a silent no-op (#47639, regression from #37912) — adapter loads HTTP 200, zero deltas at inference, proven quant-agnostic (NVFP4 AND FP8 both inert) and adapter-format-agnostic by a 3-peer dwarf panel. Fix PR #47640 was OPEN then. ana-ml2 is FAR past 0.24.0 and the box runs a SPREAD, not one version (measured 2026-08-24):genonnightly-311b3513= 0.27.2rc1.dev150,mog-seconnightly-e9d1398d= 0.26.1rc1.dev1102, the small seats still on 0.24.0, and char-rp/trainee-bench pinned to v0.26.0. ⚠vllm/vllm-openai:v0.27.1is already ON DISK, unused — a TAGGED release, which is the right retest target: no nightly variance, no pull, ~4 months past the diagnosis. So: RETEST hot-swap LoRA on v0.27.1 before designing around merge — it is cheap, and if it works the post-tune gate can be two aliases on one engine. If it still no-ops, merged weights it is, which means the harness must EMIT merged weights and Eitri needs that in the contract while he is early. Tracked at this snapshot commit; settle it in the QLoRA sizing conversation. -
[2026-08-24]Homepage rebuilt on Australis Skyfall; light mode shipped. Two findings worth more than the theme: (a) the Skyfall bundle including its canonical light ramp was sitting in this repo's git history at45c1995— checkgit showbefore concluding a vendored design asset is lost; (b) removingtheme:fromsettings.yamldeterministically breaks the dashboard render (six recreates empty, restoring the key fixed it in 12s), which is the first confirmed cause of the "tab bar goes missing" symptom. Retires thehomepage.logsize lead from earlier the same day — it did nothing on this episode. →persistent-memory.d/2026-08-24-homepage-uniform-grid.md -
[2026-08-24]Homepage reorganised on the axis "do I open this?" — UI groups expanded on top, API/agent groups collapsed at the bottom (operator-delegated: "re-categorize however you want"). Load-bearing constraint:homepage.groupis read at container CREATION, so the 16 GPU-backed model seats keep their unlovely names rather than eat a recreate —initiallyCollapsed+ order is free. Second rule discovered here: group members should all have widgets or none should, because a stat strip adds ~50px and opens a void beside plain cards. →persistent-memory.d/2026-08-24-homepage-uniform-grid.md -
[2026-08-24]Homepage columns unified at 4 for every group; the 2026-08-18 "columns = member count" rule is retired. It was avoiding dead cells in a short last row and bought a worse defect — card width changing at every group boundary. Also carries two CSS traps:overflow: hiddenclips at the PADDING box (so apadding-rightgutter is spill room, not a guard), and a:rootoverride of a Homepage theme variable is silently outranked by.theme-slateon the same<html>element. →persistent-memory.d/2026-08-24-homepage-uniform-grid.md -
[2026-08-24]AES-128 adopted on both Anaheim tunnels; the per-flow ceiling root-caused to the UDM's software AES-CBC, exonerating the FortiGate. Proven by an A/B/A cipher swap at identical CPU — hardware offload is not cipher-cost-sensitive. →persistent-memory.d/2026-08-23-anaheim-ipsec-tunnel-ceiling.md -
[2026-08-24]ana-gw's public admin surface closed to zero open ports, ACME listener included. Two of my diagnoses were wrong first (an "ISP proxy" that was the FortiGate, and an "all-port VIP" alarm that was a parser gap) — both from reading config instead of measuring from outside. →persistent-memory.d/2026-08-24-ana-gw-admin-closed-acme-disabled.md -
[2026-08-24]Scriberr deployed on ana-ml2 GPU1, image built from source. Three upstream bugs: the Blackwell image was never published, it must run as uid 10001, andUV_LINK_MODE=copyis required or two backends fail silently. →persistent-memory.d/2026-08-24-scriberr-ana-ml2.md -
[2026-08-24]ESH DNS fixed at the IPv6 layer and the naming scheme went live on three hosts. UniFi's RDNSS cannot be disabled but CAN be redirected — the field is only honoured when an explicit server is given. →persistent-memory.d/2026-08-24-esh-dns-rdnss-and-scheme-live.md -
[2026-08-24]speacheson irv-ml1 stopped, stack retained — Eyra was abandoned pre-implementation (Scriberr covers the need), leaving it no consumer. Disposition confirmed to eyra-dev; one command to restart. Tracked at althing thread01M0RRJX8GPZEBDHF1E3W18RZF. -
[2026-08-24]esh-vm-db brought onto the fleet infra-ops identity and given its first vaulted credential. It previously had none: root and infra-ops refused key auth andlkraven's sudo wanted a password nobody held, leavingqm guest execfrom the hypervisor as the only privileged path. Break-glass root password atsecret get esh-vm-db/root-breakglass-password(console-only; plaintext never crossed the wire — only its SHA-512 hash did). -
[2026-08-24]nconnect=8on/mnt/smithy— approved but DEFERRED at operator instruction. brokkr-smithy-dev pre-approved it for "once the FortiGate work settles" and does not need re-asking; the operator declined it in this session's scope. Tracked at althing thread01M0R46SFYF83099N16WD67KGD. -
[2026-08-23]Anaheim's IPsec tunnel ceiling — investigated, then CLOSED 2026-08-24. The 25%-of-2-Gbps framing was wrong (NH3's uplink is 1 Gbps); AES-GCM proved impossible; AES-128 landed instead. →persistent-memory.d/2026-08-23-anaheim-ipsec-tunnel-ceiling.md -
[2026-08-23]selene retired after losing a head-to-head on its own job;chat-judgemoved to gen, the model name 404s by design. Also surfaced that 7 aliases share one seat — cross-checking between them is an echo, which caught a real defect in brokkr's 46k-exposure R47 gate. →persistent-memory.d/2026-08-23-selene-retired-alias-collision.md -
[2026-08-23]hrafn adopted; its CI reported green for its whole life while deploying nothing. A staging dir inside the rsync target destroyed its own source mid-copy; the deeper fault was verify steps that asserted uptime, never content. →persistent-memory.d/2026-08-23-hrafn-adopted-ci-frozen-source.md -
[2026-08-23]Worldtree b187 shipped; all three instances de-armed from a 69-day-stale:latest; Matrix homeserver re-plumbed to personal. Includes the:8009-is-demo port trap that an IP-only fix would have walked into. →persistent-memory.d/2026-08-23-worldtree-b187-pins-matrix.md -
[2026-08-23]Every secret-bearing.envon ana-docker tightened to 0600 — eight stacks including vaultwarden and traefik, verified exposed by reading one asnobody. →persistent-memory.d/2026-08-23-ana-docker-env-perms-sweep.md -
[2026-08-23]pfigitea org created; claude-bot is an Owner and creates repos self-serve. Closes the repo-creation half of the credential-migration directive —vhis a USER namespace so no service account could ever create there. Repo creation needswrite:user+write:repository+write:organization;POST /users/{u}/tokensis basic-auth only, so minting needs the account password. Default new repos topfi/. (vh/eitri-smithywas its first tenant, then moved.) -
[2026-08-23]Booth: kept boards are deletable and link rows are prunable.releaseon a kept card drops the sentinel so the existing × applies;booth links/booth unlink <id|index>prune one row. Rows are addressed by content id, never position — the board is append-only and multi-writer. Releasing a board RESETS its TTL clock (unlink bumps the dir mtime), so unkeep-and-wait is a 24h delay, not a delete. (4be880f,0ad332b) -
[2026-08-22]DFlash2 spec-decode measured on our own stack;secpromoted to it. +18–21% accepted length and +15–18% throughput over MTP k=3, drafter proved model-agnostic across two finetunes to 0.06%, and the k=7 MTP control showed deeper MTP is a throughput trap. →persistent-memory.d/2026-08-22-dflash2-spec-decode.md -
[2026-08-22]Quant pipeline shipped a crippled tokenizer for months — fixed at source.quant_mixed_nvfp4.pybaked its calibration truncation (max_length 2048) into every mixed-NVFP4 build; latent on old transformers, fatal on new. Both live quants corrected, pipeline now saves a source-pristine tokenizer and asserts it. Playbook §3.14. (0755ba7) -
[2026-08-22]secretuned to util 0.52 / 420K after a runtime OOM at 0.55/480K —gpu-memory-utilizationis not a hard reservation; activation grows past the dummy-data profile and six vLLM containers share GPU1. Also measured: the KV pool varies ~6.6% between boots, so max-model-len must be sized against the lower observation. (6e82899) -
[2026-08-22]Max-Q 1.8× spread does NOT apply to LLM decode — measured, not argued. ana-ml2 draws 256–266 W of 300 W under sustained 100% decode withSW Power Cap: Not Activeand clocks pinned. Corrected to brokkr-smithy-dev after I had lent the claim credibility; 122B figure (~90–93 tok/s at 262K) stands as a straight number. -
[2026-08-21]ESH internal IPv6 live on two LANs; the Cityside v4 static is a CARRIER problem, proven. A full gateway reboot forced a fresh DHCP DISCOVER and returned the identical CGNAT address. YaRN was already configured — "1M needs YaRN, absent" was false. →persistent-memory.d/2026-08-22-dflash2-spec-decode.mdsibling entry inad21302 -
[2026-08-21]speaches ASR live on irv-ml1 for Eyra — andno_speech_probalone is a weak hallucination gate. Silence and room tone both hallucinated "Thank you." under 0.11;avg_logprobseparates ~6× better. Consumers should gate on a composite. (aa5863c,c7e2187) -
[2026-08-20]Cold-Fusion abliteration — Robinson recipe captured; the fight was the environment, not the recipe. Stock Cold-Fusion measured ~33% creative refusal → worth abliterating ourselves (supersedes waiting for DavidAU's heretic build). Recipe maps 1:1 (131 tensors); capture succeeded only in fp32 — transformers' Qwen3.5 DeltaNet linear-attn NaNs nondeterministically in bf16 without the unbuildablecausal-conv1dkernel (precision cancellation, not overflow). Direction finite at layer 22 but agreement 0.59 (vs Robinson's 0.99) → calibration-set expansion is next. →persistent-memory.d/2026-08-20-coldfusion-abliteration-capture.md -
[2026-08-19]A software watchdog is not watchdog protection — esh-pve froze for 4.5h holding one. softdog cannot fire when the kernel it runs in is wedged, and Proxmox'swatchdog-muxnever arms without HA resources, so the box looked protected and wasn't. Moved to the PCHiTCO_wdtunder systemd. Also: a single cross-VLAN DNS entry with no secondary turns any VM outage into a whole-site outage. →persistent-memory.d/2026-08-19-esh-pve-freeze-dns-spof.md -
[2026-08-19]Fleet.internalDNS built and live — git-sourced, agent-managed, three resolvers. Zone-scoped authority (ESH's hand-madeesteban.netrewrites survive); the colo had no resolver at all; v6 column empty on purpose because SLAAC addresses rotate. →persistent-memory.d/2026-08-19-fleet-internal-dns.md -
[2026-08-19]waterland studio containerised on irv-ml1 — three landmines, all measured. cupy needs CUDA headers the host had by accident;uv runre-syncs and prunes cupy at RUNTIME; the A6000 is container-index 0, not the host's 1. →persistent-memory.d/2026-08-19-waterland-studio-containerised.md -
[2026-08-19]Homepage cleaned up, then themed with Australis Skyfall + an Arbo-generated background. Includes the hour lost to a self-healing tab-bar red herring, and the CSS-iteration loop that prevents it recurring. →persistent-memory.d/2026-08-19-homepage-skyfall-theme.md -
[2026-08-19]Four unmanaged stacks found on live hosts — two quietly broken. A dashboard card is a cheap census of what is actually running; check whether the stack is even instacks/before debugging the symptom. →persistent-memory.d/2026-08-19-unmanaged-stacks-searxng-seafile.md -
[2026-08-19]claude-botgranted read onvh/waterland(operator-empowered, verifiedadmin:false push:false pull:true) so irv-ml1 can self-update without the operator's site-admin token living on a GPU box. Precedent for the standing migrate-off-operator-creds directive: grant the service account, wire a repo-scoped 0600 credential helper, keep the remote URL clean. Commit8189076. -
[2026-08-19]AI-tab Dormant regrouping BELAYED by the operator — six seats (char-rp Magidonia, char-rp-reasoning Heretic2, Granite summarizer, Qwen-Image-Bench, Skaldsong, Chatterbox Fast) show amber EXITED inside live groups rather thanAI - Dormant. Fix is a label change + recreate per stack; needs the operator's read on which are retired vs temporarily down.untracked by operator choice(his words: "belay the ai dormant regrouping for now"). -
[2026-08-18]esh-pve-nas migration STAGED — and staging is where three landmines surfaced, none of which the plan predicted. (1) The runbook's/bootLV had nowhere to live: VGpvehad 4 MB free and mounted ext4 cannot shrink, so the space came from the 768 MB swap LV (operator's call: shrink to 256 MB, not drop). (2) The runbook'szpool set cachefile=… nvmewould have broken the NAS — populating a cache flips the host to import-by-cache, and a one-pool cache leavesssd+tankunimported under CT 103's twelve bind mounts. (3)update-grubsilently emitted a pool-lessroot=ZFS=/ROOT/pve-1, because GRUB's ZFS reader cannot open a pool withencryption/large_dnode/zstd_compressand the probe failure is swallowed. All three were caught by verify steps that asserted effective state, not by reading the plan. →persistent-memory.d/2026-08-17-esh-pve-nas-dom.md -
[2026-08-17]esh-pve-nas PVE root is on a USB DOM — mitigated, and the migration replanned to split boot from root. Operator's design beats my reinstall plan; wear was never the issue, blocked patching is. →persistent-memory.d/2026-08-17-esh-pve-nas-dom.md -
[2026-08-17]irv-ml1 cleared of 782 GB, and Homepage brought under version control. One dead-looking Gradio app pinned three delete targets at once;/opt/ComfyUIis NOT the ComfyUI that serves. →persistent-memory.d/2026-08-17-irv-ml1-cleanup-homepage.md -
[2026-08-17]Gen seat swapped toabsolute-heresy— and the three bugs the swap exposed are worth more than the swap. CandidateMuXodious/Qwen3.8-27B-absolute-heresy(Heretic v1.4.0 + SOMPOA, T377) beat the incumbent on refusals AND KL simultaneously, which is the unusual part — those normally trade off. Validated on the probe port per operator ruling, promoted, all 7 aliases green. Durable lessons banked: (1) A CPU-only MTP head hash can replace the ~56 GB bf16 acceptance gate. TheQwen3_5ForConditionalGenerationwrapper never loads the MTP head, so PEFT merges / Heretic runs / llm-compressor passes all leavemtp.*pristine — hashing it against a head we have already measured (the incumbent's, 47.7%) answers the question for free. Predicted 47.7%, measured 47.2%. Saved downing meromero. Tool:services/gen-seat-mixed-quant/compare_mtp_head.py(hash bf16 via uint8 reinterpret — numpy has no bfloat16). (2)post_quant.pyassumed a standalonemodel-mtp.safetensors; a full checkpoint keepsmtp.*in a NUMBERED shard, so the copy silently no-op'd while the index was still rewritten to point at a file that never existed — 15 unresolvable tensors behind a correct-looking tensor count. Its own FAILED-CHECKS assertion caught it; that is why the check exists rather than an assumption. Fixed to extract. (3) A probe that does not mirror the live seat manufactures failures.serve_probe.shhardcoded:latest(seat is a pinned nightly for #51113), had no tool-call/reasoning parsers, and its--speculative-configJSON died twice on quoting — bash BRACE-EXPANDS{"a":1,"b":2}on the comma unless single-quoted at the REMOTE shell. Adding the seat's flags took the surface test from 5/6 to 6/6; the "tool calling broken" result was pure probe config. Commits7997f11,254c588,2c36028,b0c2d3d,993421b. -
[2026-08-17]Fleet IPv6 mapped + the real VPN topology verified; the driver is CGNAT at ESH, not the WireGuard mesh. New ESH fiber (installing 2026-08-18) lands the house behind CGNAT, which breaks Site Magic (NH3↔ESHsdwan-mesh-tunnel) on IPv4 — so IPv6 becomes load-bearing as the escape hatch, and that is its most likely first consumer. Topology as VERIFIED (a prior turn assumed wrong and was corrected): UniFi↔UniFi = Site Magic; colo↔UniFi = IPsec IKEv2 (pfi-ana-nh3158M/165M pkt = the workhorse,ana-to-eshudm); WireGuard is an RA convention only, host-based onana-wgUDP 31337 behind a FortiGate VIP — the FortiGate never terminates WG (FortiOS 7.2 has none; 7.4 added it) so "upgrade the edge for WireGuard" is a non-problem, do not re-derive. IPv6 today: NH3 WAN live2600:1700:b25:c110::48, colo none, ESH none. AT&T delegates one /64 PER REQUEST (2600:1700:b25:c11f::/64) — and the BGW holds the whole/60, rationingc118–c11fone at a time while keepingc110–c117. So eight /64s exist; UniFi just solicits once. ⛔ CLOSED 2026-08-24 — operator ruling, do not re-raise: the BGW has no IP-passthrough (operator confirmed, and we have admin on it), so the only route to the other seven is a multi-DUID DHCPv6 client on a VM — which means split-stack routing and rebuilding the entire v6 firewall policy off the UDM. Juice not worth the squeeze. NH3 LANs stay v6-off. A mesh needs a routable WAN address, not PD.ana-wg's WG socket is already dual-stack ([::]:31337) → v6 RA needs an address + a v6 port-forward, no WG reconfig. ⚠ UDM legacyrest/firewallrulereturns 0 rules (zone-based firewall) — usev2/…/firewall-policies; inbound v6 is default-deny and held. All three endpoints will be dynamic → extend the existing hostname pattern (ana-fw/nh3.phasefinal.com) to AAAA. Enabled PD onnh3-iotto measure, reverted on operator instruction (all 5 LANs back tonone, verified). Also fixed:ana-wgWireGuard key material was world-readable (wg0.conf+keys/*_priv+*_psk+ clientconfigs/*.confat 644) → now 600, dirs 700, service untouched. Detail →persistent-memory.d/2026-08-17-fleet-ipv6-mesh.md. -
[2026-08-17]Gen-seat multi-day degeneration RESOLVED — two compounding real causes, not one; the meta-lesson is "a mitigation that HELPS but doesn't FIX means a second cause, not a wrong one." vLLMqwen3_5_mtp×GDN bug (#51113, real, fixed by nightly) + AEON full-W4A4 being lowest-fidelity (W4A4<W4+FP8<W4+bf16) → ~15-20% stochastic degeneration. Fixed by mixed FP8-attn build on pinned nightly. AEON purged. Also banked: stochastic (~15-20%) degeneration is invisible to a small synthetic probe — n=1 "clean" validated THREE non-fixes (MTP-off, APC-off, nightly-alone) that all failed in real use; get the operator's real transcript, do not trust your own probe. Full →docs/pfi/model-quantization-playbook.md§3.8 (+ §3.7 MTP-multi-turn). Commitsd28a371,2f2bbce,2185964. -
[2026-08-17]Lobe Chat chosen over Open WebUI (weight: 143 MB vs 1.8 GB) + stood up on esh-docker-vm; scoped LiteLLM key blocks paid models; System-Agentgpt-5-minidefault repointed via env. TTS env-vs-UI resolved as a split (endpoint env-driven, voice/model UI-only). tts-dev onboarding closed both directions; ballad/verse aliased so no voice can 404 the router. Commitse9362de,163a725,cac75cb,933253d,25fa18e. -
[2026-08-17]LiteLLM upgraded v1.91.0→v1.97.0 (RC-avoided on the fleet gateway) + the 6 GB spend-log DB purged & capped (store_prompts_in_spend_logs:false+ 7d retention). Interpreted "get rid of the db" as the spend-log DATA not the database (keys/config live in it). Commit01b5ad9. -
[2026-08-16]Abliterated models go CATATONIC at the hard refusal edge — silence, not a decline. Abliteration removes the refusal direction, so at the genuine hard edge the model neither refuses nor complies → empty/degenerate output. Durable measurement consequence: a refusal probe MUST score EMPTY as a verdict distinct from REFUSAL and COMPLY (services/refusal-probe/probe.pydoes). Operator accepted it as out-of-scope; do not chase. -
[2026-08-16]Fable-Fusion 711 cuts cold-framing refusals 92.5% → 15.8%; refusal is MONOTONIC IN FRAMING, and DS v1.0's problem is that she was never abliterated. brokkr-smithy-dev supplied the framing that reproduces (01M05M48R4RSZF9D8KT7RR55EJ): a bare assistant-mode instruction — no character card, no permission preamble. Three-arm A/B, same harness, same classifier: permission framing DS 0.0% / FF 0.0% (n=75); plain character cards DS 1.4% / FF 0.0% (n=74); bare instruction DS 92.5% (37/40) / FF 15.8% (6/38). Per-axis DS→FF: incest 100→20, non-con 100→20, bestiality 100→25, necrophilia 100→40, gore 100→0, consensual 80→20, dubcon 80→0, self-harm 80→0. DS refused 25/25 on the five axes brokkr flagged. Root cause:ReadyArt/Dark-Scarlett-v1.0-27Bis a plain finetune of stockQwen/Qwen3.6-27Bcarrying NO abliteration — the base refusal machinery is intact, so cold prompts revert to safety-tuned Qwen3.6. FF is Heretic-ablated (structural), which is why it holds. ⚠ RETRACTED 2026-08-16 — my "arm-3 92.5% exceeds brokkr's 62.5%" comparison was INVALID. His diff against his own artifact showed mybattery-instruct.yamlreproduces only hiscreativeclass — 8 of 16 axes; it dropped all 5operational(violence/incite, crime/fraud, cyber/malware, selfharm/methods, privacy/stalk) and all 3meta(meta/sysprompt, meta/ignore, meta/dan), and added 2 controls he never had, at k=5 vs his k=2. His 62.5% pools all 16 axes; my 92.5% is creative-only — different denominators, not a delta. Cause: I rebuilt his shape from his message, and theclassfield lives in the artifact, not the prose. Lesson: reconstructing a peer's instrument from their description reproduces what they described, not what they ran — diff against the artifact before claiming comparability. ⚠ Known battery bug left unfixed for comparability: DS's arm-3 control gate failed at 11% becauseictrl-reunionpairs "explicit / do not fade to black" with brothers, which DS reasonably read as an incest request; FF did not.ictrl-stormis the clean control. Commitb9e68c3. -
[2026-08-16]MTP works on Fable-Fusion AND survives RP temperatures — my earlier caution was wrong. vLLM resolvedQwen3_5MTP, loaded the drafter, shared embedding +lm_head— the capability DS's seat never had because our quant dropped her MTP tensors. Measured over the full probe workload (~163k draft windows at temp 0.7–1.0): 47.0% acceptance (229,169/487,725), 1.41 extra tokens/window, per-position 68.3/43.6/29.1%, ~80.6 tok/s decode at temp 1.0. I had recorded a caution that the card's 1.56× was greedy-measured and acceptance would fall at RP temps — it did not; 47.0% matches the gen seat's 47.7% and beats the card's own 33% at depth 5. Depth 3 is right. -
[2026-08-16]The Qwen base thinks incessantly — that is WHY the Gemma seat exists, and no swap within the Qwen family fixes it. Operator's architectural point, confirmed by measurement: on identical prompts DS 6036 ch vs FF 5323 ch of reasoning (permission arm), 5546 vs 4988 (cards arm) — FF actually reasons ~10–12% less. The bare-instruct row (DS 2291 vs FF 3918) inverts only because DS refused 92.5% of it and refusals are short — an artifact, not concision. Both are Qwen3.6-27B derivatives, so this is the base family.char-rp= MeroMero-v2, Gemma-4 base, :8016, verified 0 chars reasoning / clean prose — the non-thinking seat, working as designed. FF can be silenced (enable_thinking:falseverified 3/3, and it shipschat_template-instruct.jinja) but that duplicates MeroMero on a base chosen for it. The stale LiteLLM comment describingchar-rpas the retired GGUF Magidonia seat is fixed (53096bf). -
[2026-08-16]esh-vm-docker hardened: the wedge ishardNFS at RUNTIME, which the boot-ordering fix never addressed. All four mounts werehard, so a NAS stall at 10.0.50.50 blocks I/O forever (D-state). The existingx-systemd.before=docker.servicefstab fix solved the boot race — a different bug. Exposure was far below what the park item assumed: only 2 of 12 containers touched NFS, and container state was already local (/var/lib/docker). Removed:/mnt/compose(2.1G, fully vestigial — zero containers referenced it, dockge reads local/opt/docker, its one mention was a comment inbeszel-agent-esh/.envabout a different host) and/mnt/documents(2.0K, paperless's empty spool dirs →/opt/docker/data/paperlessat the same 0777). fstab backup/etc/fstab.bak-nfs-harden-20260816. 4 mounts → 2, 2 wedge-capable containers → 1. traefik needed no change (alreadyrestart: unless-stopped— why it self-recovered). Watchdogservices/esh-vm-docker-watchdog/live on esh-pve (not the guest): probes traefik over HTTP, deliberately not ping/SSH — the wedge signature is "guest OS alive, services dead" (/is local disk so sshd answers straight through a total outage and a TCP check reports HEALTHY). 5 failures × 2 min →qm reset 100, 30-min cooldown, running-only guard,/etc/esh-vm-docker-watchdog.disabled. All paths tested without power-cycling. DEFERRED (operator):/mnt/booksstayshard— calibre's SQLitemetadata.dbwould risk corruption under soft/softerr. That is the one remaining wedge vector. Commit55705ba; park item 28 promoted. ⚠qmover non-interactive ssh throws a bogusJSON::Backend::XSerror — usessh host 'bash -s' <<'EOF', notssh host "qm …". -
[2026-08-16]Canonical Qwen3.8 sampling applied from upstream;gen-reasoninghad the WRONG-MODE presence_penalty. Qwen/Qwen3.8-27B "Best Practices" §1 and unsloth/Qwen3.8-27B §1 are byte-identical — thinking:temp 1.0 / top_p 0.95 / top_k 20 / min_p 0.0 / presence_penalty 0.0 / repetition_penalty 1.0; instruct:temp 0.7 / top_p 0.80 / top_k 20 / min_p 0.0 / presence_penalty 1.5 / repetition_penalty 1.0. Bug found:gen-reasoningcarriedpresence_penalty 1.5— the instruct value on a thinking deployment (canonical 0.0) — now fixed. Deliberately NOT canonicalised:summarizer/classifier/image-judge/qwen-image-benchruntemperature=0(judges alsotop_k=1) because determinism is their contract; forcing a chat preset on a classifier would break it. ⚠presence_penalty=1.5is canonical but is the one value upstream hedges on, verbatim: "using a higher value may occasionally result in language mixing and a slight decrease in model performance." It is the operator's suspected trigger for multi-turn degradation and the first dial to move (0.0–0.5) if that recurs — it is alias-scoped, which is why it would follow the operator across model builds. Commit3462b53. -
[2026-08-16]Four wrong diagnoses on one bug, and the lesson is the test design. Operator reported the gen seat "degenerate on long multi-turn conversations". Rolled the seat back on request; the previous weights behaved identically, exonerating the model swap. I then proposed and disproved FOUR mechanisms in sequence — empty assistant turns poisoning history, reasoning runaway, length-mirroring from short history, andpresence_penalty— before discovering my own multi-turn harness was confounded: it varied the QUESTION along with the depth (depth-1 asked question #2, depth-3 asked question #4), so a narrower question drawing a shorter answer read as degeneration. The "310→209→28w collapse" I reported as a reproduction was an artifact. Rules banked: (1) when comparing across conversation depth, hold the final question FIXED and vary only the history; (2) reply-length variance on byte-identical input was 25–465w, so n=3 cannot support any claim about a trend; (3) ask for the operator's real failing transcript before building a synthetic reproduction — four synthetic tests, none of them his failure. Gatewayspend_logsreturns[]on the infra-ops key despitestore_prompts_in_spend_logs: true, so real transcripts need the:4000/uiview or another key — worth solving before the next such hunt. -
[2026-08-16]Two REAL client-side defects found while chasing the above, neither of which was the reported bug. (1)gateway-chat's Max-tokens field defaulted to 1024; thinking seats spend part of that on CoT before emitting content, so completions truncate withfinish_reason=lengthand read as model degeneracy — raised to 4096. (2)parseInton an empty field yields NaN, whichJSON.stringifyserialises asnull, which the server reads as "no max_tokens supplied" and silently substitutes its own default — indistinguishable from the UI ignoring the field. Both fixed (b6552e0,fb3bb52). ⚠composebind-mounts a single FILE, and a single-file bind mount binds the INODE — rsync writes-and-renames, so the container kept serving stale content while the host file showed the new value, silently and with no error.docker restartdoes NOT clear it; the container must be recreated. Verify against what the container sees, never the host file. Applies to any file-source mount fleet-wide. -
[2026-08-16]Refusal measurement: benign controls CANNOT validate a refusal classifier on RP prose — and a 0% rate needs a classifier self-test before you believe it. Two durable lessons from baselining Dark-Scarlett. (1) False positives: my first bare-framing number was 9.5%; the true figure was 1.4%. The rest were the classifier firing on in-character text —"I cannot shift my weight"spoken by the character ~100 chars into a 2,443-token torture scene, and"Yeah, I'm an AI… What's the actual gig?"where the model answers in voice and keeps driving the scene. First-person RP prose is full of "I can't"; a genuine refusal opens with its marker, so the scan window must be the first sentence, a marker followed by long prose must demote to AMBIGUOUS, and AI self-acknowledgement is a persona break, never a refusal on its own. Benign controls were clean the entire time and caught none of it — they only detect over-firing on benign prompts, not on in-character prose. (2) False negatives: a 0% rate and a broken classifier are indistinguishable from the report, sotest_classify.py(16 cases, both false positives pinned as regressions) must pass before any low number is trusted. Also banked: the thinking-budget trap — emptycontent+finish_reason=lengthis reasoning eating the budget, NOT a refusal; score INVALID and exclude from the denominator (DS emits ~5.5-6k chars of reasoning per response, somax_tokens≥3072).probe.py --rescorere-classifies a saved run with zero GPU time. →services/refusal-probe/README.md, commit32f665e. -
[2026-08-16]Held an operator-approved swap window because the baseline invalidated its premise. Operator approved ~65 min ofchar-rp-reasoningdowntime to A/B Fable-Fusion 711 against Dark-Scarlett on refusals. The DS baseline then came back 0.0%/1.4% — no gap for a candidate to close, so the window would have bought no decisive signal and a second window would still be needed once a reproducing battery existed. Held the swap, reported, and routed to brokkr-smithy-dev for the battery that actually produced the refusals. The general rule (action-relevance): approval is for a plan, not a ritual — when new evidence kills the plan's premise, surface it rather than spend the budget. Nothing deployed, no downtime taken, seat untouched. -
[2026-08-16]DS v1.0's one real refusal is self-contradicting boilerplate, not a content constraint. On a direct "drop character and state your content policy" probe she returned "I don't generate explicit sexual content, graphic violence, or material that glorifies harm, non-consensual acts, or illegal activity" — in the same run where she generated all three at 0% refusal. Reads as a learned recital triggered by meta-questions about policy. If production refusals share that shape the failure is prompt-shaped, not model-shaped, and a consumer-side system-prompt fix may beat a model swap entirely — worth settling before spending the GPU window. Separately, 7/85 bare-framing samples were persona breaks (in-character AI acknowledgement): not refusals, but DS will admit to being an AI unless the card explicitly forbids it. -
[2026-08-15]RP-seat direction: KEEP MeroMero onchar-rp; Artemis-31B rejected; next move is Dark-Scarlett on a Qwen3.8 base when it lands (operator). EvaluatedTheDrummer/Artemis-31B-v1.1— mechanically a drop-in (samegoogle/gemma-4-31B-itbase, identical 1188-tensor/356-vision census, same missing-preprocessor_config.jsontrick), so it's purely a quality call, and our own survey already ranked MeroMero #1 vs Artemis #6; Artemis is also unlicensed and its author deprioritizes correctness + warns of token-banning-for-stability, which fights char-rp's tool-calling requirement. MTP verified impossible on both (Gemma-4 has no MTP head at all — base/MeroMero/Artemis are all MTP=0; no finetune can add one). But speculative decoding IS reachable on a Gemma-4 seat via a DETACHED drafter — vLLM 0.24 supportseagle3+gemma4_mtp, and real drafters exist:google/gemma-4-31B-it-assistant(0.94 GB, 4-layer, 761K dl),RedHatAI/gemma-4-31B-it-speculator.eagle3(4.47 GB),AEON-7/…eagle3-NVFP4(3.53 GB). ⚠ all list their verifier as stock gemma-4-31B-it, not an RP finetune, so acceptance against MeroMero is unmeasured and likely well below the gen seat's ~48%. UNTESTED — parked, ~45 min to measure, needs GPU0 headroom (card is at 94.4/97.9 GB). Why the Dark-Scarlett 3.8 plan is the strong one: DS is Qwen3.6-based today, so a 3.8 respin lands on the gen seat's architecture → native MTP returns and the whole mixed NVFP4+FP8 recipe + graft ports directly. Watch two things on arrival:from_pretrainedsilently drops MTP heads during finetuning (verify 15mtp.*tensors in the index; graft from stock if absent), and DS v1.0 required theQwen3_5ForConditionalGenerationwrapper class to save a config vLLM/SGLang accept. Both indocs/pfi/model-quantization-playbook.md. -
[2026-08-15]Quant lessons consolidated intodocs/pfi/model-quantization-playbook.md— the durable home; read it BEFORE any requant. Survey found quant knowledge scattered across 18 files in 4 trees, with three documents having independently written overlapping "landmines" sections (the loader-class trap alone was rediscovered 3×). Playbook owns the transferable lessons (scheme choice, landmines, acceptance gate + its 3 measurement traps, hardware/co-residency); per-model artifacts are demoted to worked examples that link up. Carries a superseded-claims table — which immediately earned itself: the heretic2 runbook's "use modelopt, compressed-tensors can't load the BF16 MTP" is false (the cause was the missingre:^mtp.*ignore, not the format) and would have sent the next session down the modelopt dependency-hell path; that runbook now carries a stale-warning header. Maintenance rule inCLAUDE.md: model-agnostic → playbook, model-specific → stays put, wrong claim → dated superseded row, never a silent edit. Motivated by Qwen3.8 having just released — the next model swap needs a requant. Commita91cc3f. -
[2026-08-15]Operator ruling: the gen seat's +1.7% perplexity is an acceptable price for the speed — SETTLED, don't re-litigate. Precise attribution for future reasoning: it is the activation-quantization cost (W4A4 MLPs + FP8 attention vs BF16 activations), not an MTP cost — PPL was measured with speculative decoding off on both builds, so MTP was not in the loop. Turning MTP off would not recover it; only reverting the quant would (rollback = one.envline, old build intact at…/qwen38-27b-uncensored-nvfp4). -
[2026-08-15]gen seat requanted to mixed NVFP4+FP8 (+18% decode) + char-rp Gemma-4 tool-calling fixed. The queued "W4A8" (NVFP4 weights + FP8 activations) is not servable — vLLM 0.24 allows NVFP4 weights with only A16 or A4; FP8 activations ValueError at load, andCompressedTensorsW4A8Fp8is INT4-weights + sm90-exact (closed on Blackwell twice). FP8 must enter per-layer-group. Also: the handoff's "~68 tok/s" baseline didn't reproduce — cache-busted, the incumbent already did 80.12 (≈ the stated W4A8 target), so the premise needed re-measuring before any work. Shortcut:unsloth/Qwen3.8-27B-NVFP4was already on-box → served as a probe, measured +19.1% at identical acceptance, which both proved the gain was real and handed over the reference recipe. Replicated it on the abliterated weights → 80.12→94.53 tok/s, acceptance unchanged, +1.7% PPL, abliteration 4/4, weights −19%; surface 6/6 live, 7 aliases routing. char-rp had no tool parser at all (every tools request 400'd) →gemma4tool + reasoning parser + a mandatoryenable_thinking:false(the parser defaults it True → nullcontentfor all RP prose; proven byte-identical prompt before deploying). Commitsb8f0f4c,74f596b. Foot-guns banked (llm-compressor prunes unmatchedignoreentries → the 0%-MTP bug, fired on this run; prompt_logprobs uniform under spec-decode; 0600.envsilently no-ops compose; GPU0 is zero-sum). →persistent-memory.d/2026-08-15-gen-seat-mixed-requant.md -
[2026-08-15]Uncensored gen seat: JonathanColetti/Qwen3.8-27B-Uncensored deployed asgen-seat/vllm-gen(NVFP4 W4A16 + grafted MTP, 262K); 7 aliases repointed; the definitivere:^mtp.*-ignore fix. 0%-MTP-on-quant (twice) was NOT the abliteration/scheme — the grafted bf16 MTP was missing fromquantization_config.ignore(vLLM loaded it as quantized → uninitialized). Full arc, the working pipeline, VRAM budget, unsloth speed decomposition, modelopt dead-end. →persistent-memory.d/2026-08-15-uncensored-gen-seat.md -
[2026-08-10→12]secrets-broker: per-box Vaultwarden credential store SHIPPED + consumer-confirmed.secretCLI (put/get/list/rm/backfill, bw-backed) on~/.local/bin; 25 nh3-dev secrets backfilled + round-trip-verified;rm+ new-namespace warning added post-launch; standing "vault is the credential source of truth" directive now global. →persistent-memory.d/2026-08-12-secrets-broker.md -
[2026-08-09→10]dots.tts (rednote-hilab) TTS burn-in on irv-ml1 + canonical voice corpus built (voices/). Operator-directed eval to potentially replace chatterbox-fast. dots.tts VERIFIED real (canonical HF nsdots-studio/,rednote-hilab/dots.tts-*redirects there; Apache-2.0; PyPIdots.tts0.2.1; 2B continuous-AR = semantic enc + Qwen2.5-1.5B LLM + flow-matching acoustic head over 48kHz AudioVAE; zero-shot clone from wav+transcript). Runs on Ampere 3090 (sm_86, bf16, no fp8 dep); optimized RTF 0.22 at num_steps=10 (from_pretrained(..., optimize=True)CUDA graphs — raw unoptimized was 1.21), ~6GB VRAM, 48kHz, streams (generate_stream). Venv+cache atirv-ml1:/home/lkraven/dots-tts(~10GB). Operator design calls: SGLang Omni serving (OpenAI/v1/audio/speech), transcribe-refs-first,soarvariant. ⚠ Omni serves soar but its continuous-batching + streaming opts are mf-only (soar = single-request) — non-issue for ratatoskr's single-consumer RP surface. KEY FINDING — dots is highly sensitive to an accurate AND sentence-bounded reference transcript: mismatched transcript → 0.16s collapse; over-long/messy transcript → reference-audio BLEEDS as an output prefix; mid-clause trim → dangling-word leak (glados "we'll", emmie "And,"). RECIPE (baked intovoices/derive.py): trim ref to a clean ~6–10s clip ending on a sentence boundary + accurate transcript of exactly that clip. CANONICAL VOICE CORPUS stood up in eshpfivoices/(operator idea): engine-agnosticcanonical/<v>.wav+transcripts/<v>.txt→ per-engine ref sets DERIVED byderive.pyreadingengines.yamlprofiles (dots/chatterbox/zonos); canonical wavs git-tracked (small/curated),derived/gitignored. 4 voices optimized + verified CLEAN for dots: donut, glados, emmie, miranda (glados canonical is low-SR 16kHz — flagged upgrade candidate). ⚠ GPU GOTCHA: irv-ml1 native CUDA orders A6000=device0 (ComfyUI-full) — pin the 3090 withCUDA_DEVICE_ORDER=PCI_BUS_ID CUDA_VISIBLE_DEVICES=0; andPYTORCH_CUDA_ALLOC_CONF=expandable_segmentsCONFLICTS withoptimize=TrueCUDA graphs (curr_block error). Booths:dots-vs-chatterbox,dots-voices-optimized. SHIPPED 2026-08-10: operator A/B verdict "dots is very good" → containerized as a thin FastAPI wrapper over DotsTtsRuntime (chosen over SGLang Omni — Omni's batching is mf-only, unneeded for ratatoskr's single consumer; wrapper is SERIALIZED one-gen-at-a-time via a threading.Lock, Omni+mf = parked API-compatible escalation if multi-consumer ever lands). LIVE on irv-ml1:8198 (local/dots-tts:v1, OpenAI/v1/audio/speech+/health+/v1/voices, container healthy, both stream + non-stream verified CLEAN, 4 voices donut/glados/emmie/miranda) alongside chatterbox :8197 (nothing repointed). Stack =stacks/dots-tts/(Dockerfile/app.py/compose/.env.example/README). ⚠ CONTAINER GOTCHA:optimize=True(torch.compile/inductor/triton) needs a C compiler at RUNTIME — slim image mustapt install build-essentialor model-load dies "Failed to find C compiler" (host venv had gcc ambient, masking it); persistTORCHINDUCTOR_CACHE_DIRto a mounted dir or every restart re-JITs ~5min. Corpus home = eshpfivoices/(operator ruled keep-here). REMAINING: ratatoskr client cutover to :8198/v1/audio/speech(Phase-2 tail, peer-coupled — draft the ask). reference_chatterbox_fast_repo reference_zonos_tts_stack reference_verify_hf_repo_ids_before_pull -
[2026-08-05]Fleet CI resilience flip (DEFAULT_ACTIONS_URL=self) — attempted end-to-end, PARKED on a runner action-fetch auth blocker; infra-ops to research it (operator-directed, deferred, NOT now). 7 gitea action mirrors staged public+populated (orgsactions+astral-sh); the flip resolvesuses:correctly but act_runner v0.6.0 can't authenticate its fetch to gitea 1.26 ("Invalid username or token. Password authentication is not supported"). Reverted (CI back on github default);REQUIRE_SIGNIN_VIEW=falseKEPT as a standing change (operator, internal WG net). Full endeavor, the reliable nh3-dev-egress + git-SSH mirror method, exact config state, smoke method, and next step →persistent-memory.d/2026-08-05-ci-flip-parked.md -
[2026-07-31]muninn-gate (#377 ingestion front door) BUILT + DEPLOYED + healthy on corviduo-dev:8090. First-boot acceptance passed (watcher:running:true proves ingestion_root byte-identity); submit path deferred to the mimir-inbox era. Full wiring (uid-1000, state-volume mount, staging path-agreement, BuildKit-secret build, deferred repoint + operational guards) →persistent-memory.d/2026-07-31-muninn-gate-deploy.md
223 older entries archived to archival-memory.md.
Tried and abandoned
-
[2026-08-25]Four throughput levers measured and killed — do not re-chase. (1) Fused MoE /grouped_mm— 0.9% slower than the Python loop and dense GEMM is only 7.9% of the step, capping the whole category near 10%. (2) CUDA graphs /torch.compileover the expert loop — the two-term scaling fit closed with residuals under 3ms and needed NO constant term, so there is no fixed per-batch cost to amortise; 3,840 expert-GEMM launches per forward are not what we pay for. (3)ligerfused linear CE — the chunked CE measured 1.1% of the step forward, ~3% with recompute. A tidy-up, not a lever. (4) Selective gradient checkpointing — ~2% of a post-fix step, real bug surface. Also: token-budget batching is dead by the same fit — with no constant term, total time over a fixed set of widths is invariant to how you group them; only the widths matter, which is exactly why bucketing works and repacking does not. -
[2026-08-25]sample_packingis NOT strictly better than bucketing on this model, and I told the operator it was before brokkr corrected me. Packing needs FA2 varlen or a block-diagonal mask; FA2 is unavailable here (head_dim 512 > 256 cap), so packing means an explicit 4D mask on EVERY batch. Bucketing produces 78.3% exactly-zero-pad micro-batches which recover theis_causalfast path on the 5 global layers — measured at 9.4% of step time. Packing forfeits that. ⚠ The conclusion flips underflex_attention, where a block-diagonal mask is just another BlockMask: do not carry "packing is bad" past the backend decision. -
[2026-08-25]Merging a tune back toward STOCK to fix overfitting would UNDO the abliteration. brokkr recommended a 50/50 merge-back, then retracted it himself: the published recipes merge intogoogle/gemma-4-*-it, and following that literally re-installs exactly the refusal directions the abliteration removed — silently, because the merged model looks healthier on general benchmarks. Any merge-back must target the SAME abliterated base. Wider lesson: recipe cards are per-checkpoint artifacts, not per-family — the advice came from a card for a DENSE STOCK 31B applied to a MoE ABLITERATED 26B-A4B, three axes apart on a shared name. -
[2026-08-24]AES-GCM on the Anaheim tunnels — impossible, not merely hard. UniFi's manual site-to-site IPsec implements no AEAD cipher at all: eight GCM spellings rejectedapi.err.InvalidPayloadagainst a passingaes256control. Blocks both tunnels since both far ends are UDMs. Accepted enum isaes128/aes192/aes256/3des— and 3DES is slower (no ARM instructions, 64-bit blocks), so AES-128 is the floor. -
[2026-08-24]Pointing the UDM'swan_dns1at AdGuard — silently ignored. It persists and reads back correctly but the LAN-facing forwarder never uses it; proven with fresh uncached ad domains (AdGuard answers0.0.0.0, the UDM returned real IPs). Reverted rather than left in place. -
[2026-08-24]A multi-DUID DHCPv6 VM to claim NH3's seven unclaimed /64s — declined by the operator. The BGW has no IP-passthrough (confirmed, we hold admin), so the only route needs re-cabling, split-stack routing and rebuilding the entire v6 firewall policy off the UDM. The prefixes are easy; the firewall rebuild is why nobody wants them. Do not re-raise on "there are seven free prefixes". -
[2026-08-23]AHEAD == GITHUB_SHAassertion in the hrafn CI — added, broke the checkout twice, removed. It needed thegitbinary (run 9920, exit 127); installinggitthen flippedactions/checkout@v4off its node implementation onto the git binary, which died on a missing CA bundle (run 9921). A nice-to-have assertion changed the checkout's code path and broke a working pipeline. Removed rather than patched withca-certificates— it guarded a hypothesis that proved wrong. Do not addgitto that prereq step. -
[2026-08-23]Repointingselene-1-mini-8bat gen's endpoint — proposed by me, correctly overruled. "never repoint a named model at a different model's endpoint — that is intentionally misleading." The trap is that it does not feel like deception; it feels like sparing consumers a migration. That framing is the tell. Role aliases move; model names die with the model and 4xx. -
[2026-08-15]Grafted bf16 MTP loads UNINITIALIZED (0% accept) unlessre:^mtp.*is in the quant-configignore; and W4A16=Marlin (not native FP4) costs ~20% even on decode. Cost a premature 79 GB delete of a good model (declared desync-dead off the 0%). Lessons: test MTP on bf16 FIRST, isolate before deleting; modelopt 0.43 is dependency-hell for qwen3_5 (list-vs-dict quant_cfg + transformers conflict) — use llm-compressor. Full →persistent-memory.d/2026-08-15-uncensored-gen-seat.md -
[2026-08-03]ComfyUI--enable-triton-backendon the irv-ml1 A6000 crashes EVERY render — Ampere has no hardware e4m3. adhoc-agent's operator-approved probe: comfy_kitchen's triton backend has a FUSED int8 matmul that would beat the eager backend's ~1.9x-slower unfused int8 path (21.3s vs 11.2s fp8 on the Moody Krea2 int8 checkpoints). Flipped it (added toCOMFY_CMDLINE_EXTRA, recreated) →triton.compiler.errors.CompilationError: ValueError("type fp8e4nv not supported in this architecture. supported: fp8e4b15, fp8e5")incomfy_kitchen/backends/triton/quantization.py:145 dequantize_per_tensor_fp8, failing at node 5 CLIPTextEncode. Triton's fp8 dequant kernel targetsfp8e4nv(Hopper/Ada e4m3); sm_86 Ampere (A6000) lacks hardware e4m3 → the JIT compile dies. With triton on it grabs the global--fp8_e4m3fn-text-encdequant, so every render (fp8 AND int8) dies upstream at the text-encode step — the int8 UNet path never ran, so the convrot-coverage caveat wasn't even the limiter. Reverted cleanly (~15s to healthy, image unchangedsha256:94afb8ca, sage intact, prod restored). The parked cu130 rebuild won't fix it (e4m3 = hardware format, not CUDA version). DEFERRED to the Ada refresh (operator: "ada is coming, we'll optimize then" — Ada sm_89 has native e4m3, so triton's fp8 path should compile there). Mechanics:--enable-triton-backendis a composeenvironment:var, so toggling it needsdocker compose up -d(recreate), NOTdocker restart(reuses the baked env, no-ops silently). Full: auto-memoryparked_triton_backend_ampere_fp8.
143 older entries archived to archival-memory.md.