Finishes the purge. These two surfaces were left out of the earlier commit
because the memory store is auto-generated, but both are read back into every
future session, so the name was still reaching the agent.
58 sites across 16 files: hostname, both LAN addresses, the SSID. Special-cased
the compound names a blind token swap breaks ('dank@the workstation/dankclaw',
'on the workstation/Dankclaw/Dankserver') and reworded the four that came out
ungrammatical. Facts kept: the hardware inventory of the box, the noctalia
architecture history, and today's own purge lessons all survive intact — only
the identifiers are gone.
Non-memory: the tracked .pre-pull-backup snapshot of a managed skill, whose
live counterpart was already clean.
49 KiB
Raw Memories
01a07351-8e05-75bc-9deb-bd9447e1256d
updated_at: 1788678884 ROOT CAUSE: Alias drift (pre-rename IDs persisted) + Config-home drift (HERMES_HOME pointed to /opt/data, an auto-created anonymous volume). Container recreation wipes /opt/data, reverting to image-default template config. DECISION: Pinned Environment=HERMES_HOME=/data in quadlet unit to unify config and state root under /data. In-place renamed live config IDs to frank-large/frank-small/dankclaw-npu. WORKFLOWS AND PITFALLS: Podman VOLUME paths get fresh anonymous volumes on recreation; edits lost unless pinned. provider: auto without explicit api: routes to OpenRouter; fails if API key missing. FLM/NPU routes by exact registry tag; HTTP 200 does not guarantee valid model (watch for error: Failed to load tag model!). Named providers in providers: dict resolve via api:/url:/base_url keys; custom: requires custom_providers[] entry. VERIFICATION: Use resolve_model_provider() and resolve_user_provider() for routing truth; probe endpoints with exact served IDs; /api/providers lists models with key_source: config_yaml. ARTIFACTS: /data/config.yaml, api/config.py, providers.py, runtime_provider.py, quadlet units, deploy.sh.
01a06ef4-c78b-71df-98e0-e1b930f260a5
updated_at: 1788579402 Category shift: Sonarr moved to 'admin' in shared/homepage/services.json. Exposure constraint: Sonarr kept local-only; removed 'sonarr.franksdank.cloud' vhost from dankclaw/Caddyfile to prevent external routing. Resolved pitfall: Prior directive conflated Seerr and Sonarr external reachability; corrected by auditing Caddyfile @sonarr handle block and services.json category mapping. Paths: shared/homepage/services.json, dankclaw/Caddyfile, frankbook-pro/sonarr/quadlet/sonarr.container. Workflow: Category update + Caddyfile vhost strip -> commit (b6f5b2b) -> push -> verify.
01a06e56-5e70-73f5-83b3-a28b1736f34b
updated_at: 1788561197
- Pi-hole admin password reset to pihole.2026.
- Public DNS for pihole.franksdank.cloud removed from Porkbun (NXDOMAIN externally); LAN resolution persists via addn-hosts (192.168.0.143).
- Caddy vhost retains basicauth edge and TLS termination, reverse proxying to Pi-hole quadlet published on 192.168.0.143:8083.
- Architectural note: Pi-hole serves as LAN DNS authority (dnsmasq/FTL) but sits behind Caddy for edge traffic handling, avoiding direct public exposure while maintaining internal name resolution.
01a06b4c-fcea-70e2-a342-a41c5f99d927
updated_at: 1788553425 Consolidated *arr stack to FrankBook-Pro (192.168.0.112), removing old Dankserver (235) instances. Six containers (QBit + 5 arrs) share a single gluetun network namespace; zero internal PublishPort on arrs, gluetun publishes full port set (8080, 6881, 9696, 8989, 7878, 8686, 8787). All egress forced through ProtonVPN (AllowedIPs=0.0.0.0/0); verified via podman exec IP echo (51.179.177.14 vs residential 71.227.227.172). Local DNS: Pi-hole quadlet on dankclaw serves addn-hosts, resolving *arr service names to Caddy (192.168.0.143). Caddy topology: TLS vhosts -> Anubis :8923 (AI scrapers deny/challenge) -> Caddy internal :8017 -> app containers. arr→qB client config updated to 127.0.0.1:8080 (resolved 10.88.0.1 gateway routing into tunnel). Tests: frankbook_quadlet.bats enforces shared netns/zero ports; unit & Playwright E2E suites pass. Parked defects: 1) Prowlarr Applications table empty (sync dead until rebuilt with loopback baseUrls); 2) readarr qB proxy upstream auth defect (post-move retest); 3) EZTV/1337x CloudFlare-block likely lifted for VPN egress. Old configs archived in ~/.AGENTTRASH/20260904-dankserver-arr-teardown/. Commits: 4c7465d, df4339a.
01a06aa2-9087-753a-8019-50af77fbaddf
updated_at: 1788501666 File: shared/homepage/services.json. Action: Reformatted from compact to multi-line JSON (2-space indent). Committed 7 description updates (SearXNG, OpenWebUI, Gitea, Copyparty, Plex, Jellyfin, Seerr). Workflow: git add/commit, ./scripts/deploy.sh dankclaw --service homepage. Result: Deployment 1967584 successful.
01a06894-8947-74fa-ba09-0f104cd6677f
updated_at: 1788495432 DEPLOYMENT & HOSTING:
- frank-npu service deployed to dankclaw via deploy.sh (commit df0c663, atop b563053).
- Unit: serve-frank-npu.service running on port 7771.
- FLM registry path: /home/dank/.config/flm/model_list.json.
MODEL BEHAVIOR & ROUTING:
- Resident model: nuextract3:4b. First probe confirms residency (2.6s latency, correct extraction output).
- Context Length: FLM_CTX_LEN=-1 (no global override). Packs load trained context (nuextract3: 32768, gemma4: 131072).
- Routing: FIFO single-lane NPU. Heretic requests (qwen3.8-distilled-heretic:9b) pay ~6-11s swap cost on tag alternation. Single-tag consumers pay once per switch direction.
NAMING CONVENTIONS & RENAME WORKFLOW:
- Renaming: frank-default-sightsound → frank-npu; frank-default-small → frank-small; frank-default-large → frank-large.
- Scope: Scripts, systemd units, env files, docs.
- Critical Order: Update models.json (~/.pi/agent/models.json) with new aliases BEFORE deploying renames to prevent agent connection loss during LLM runtime restarts.
PLAYWRIGHT TEST SPECIFICATIONS:
- Unauthenticated users must be blocked from direct navigation to Authentik-protected apps (except exempt services like Plex).
- Admin users must retain guaranteed access to admin space and admin apps.
HOST & REPO CONTEXT:
- Repo: /home/dank/Projects/serverAppConfigs (the workstation).
- Live hosts: dankclaw (NPU/LLM), dankserver.
- SSH accessible; deploy.sh handles push and dispatch.
01a063a7-4c37-7765-8f58-21f7c860aed7
updated_at: 1788403307 Context/workflow:
- The workstation is the operation host; repo path is /home/dank/Projects/serverAppConfigs.
- Main deployment hosts identified/reconfirmed: Dankserver at 192.168.0.235 and Dankclaw at 192.168.0.143. Both were reachable via passwordless SSH from the workstation.
- Services are primarily defined by per-host Quadlet .container files in the repo and installed as user-systemd units (
systemctl --user ...) generating<name>.service. Some model/LLM services may be system units rather than user units. - Useful status enumeration commands:
cd /home/dank/Projects/serverAppConfigs && find . -path ./.git -prune -o -name '*.container' -print | sort- For a host:
ssh <host> 'systemctl --user list-units --type=service; podman ps -a --format "{{.Names}} {{.Status}} nets=[{{.Networks}}]"'
Hermes/Dankclaw diagnostic result:
- Command used:
ssh -o ConnectTimeout=10 dankclaw 'echo "== units:"; for u in hermes hermes-webui hermes-dashboard signal-cli-daemon; do printf "%-20s %s\n" "$u" "$(systemctl --user is-active $u.service 2>/dev/null) $(systemctl --user is-enabled $u.service 2>/dev/null)"; done; echo "== containers:"; podman ps -a --format "{{.Names}} {{.Status}} nets=[{{.Networks}}]" | grep -Ei "hermes|signal|chrome"; echo "== listeners:"; ss -lntp 2>/dev/null | grep -wE "8080|8787|9119|9222" | tr -s " "; echo "== webui env (names only):"; podman exec hermes-webui sh -c "env | cut -d= -f1 | grep -Ei \"hermes|signal|base_url\" | sort" 2>&1 | head -20' - Output showed:
hermes: active, generatedhermes-webui: active, generatedhermes-dashboard: active, generatedsignal-cli-daemon: inactive, disabled- Containers:
chrome-devtools-protocolup ~2 days, no listed networksystemd-hermesup ~38h, no listed networkhermes-dashboardup ~38h, networkdankclaw_defaulthermes-webuiup ~38h, healthy, no listed network
- Listeners:
0.0.0.0:8787listening (Hermes WebUI)127.0.0.1:9222listening byheadless-shell(Chrome DevTools Protocol)*:9119listening viarootlessport- No listener on
8080in this diagnostic, consistent withsignal-cli-daemonbeing down.
hermes-webuienv names includeSIGNAL_ACCOUNT,SIGNAL_ALLOWED_USERS,HERMES_WEBUI_*, etc.
- Durable diagnosis: if Hermes WebUI says it cannot reach Hermes/Signal, first check
signal-cli-daemon.service. In this captured state, Hermes-related services/containers were active/healthy, butsignal-cli-daemonwas inactive/disabled and there was no port 8080 listener, so the Signal HTTP transport was likely unavailable even though the WebUI itself responded on 8787. - Suggested next operational checks/fix path:
ssh dankclaw 'systemctl --user status signal-cli-daemon.service --no-pager; journalctl --user -u signal-cli-daemon.service -n 80 --no-pager'- If appropriate, start/enable it:
ssh dankclaw 'systemctl --user enable --now signal-cli-daemon.service' - Verify:
ssh dankclaw 'systemctl --user is-active signal-cli-daemon.service; ss -lntp | grep -w 8080'
01a06085-8146-72b0-9e52-b486c767a2f6
updated_at: 1788331026 GOAL: Migrate Plex (native plexmediaserver.service) and Tautulli (snap) to podman quadlets on dankserver. Zero-bytes-moved design.
IMAGES:
- Plex: lscr.io/linuxserver/plex:1.43.3.10896-cb3ebc72d-ls322 (superseded initial ls9 pin)
- Tautulli: lscr.io/linuxserver/tautulli:v2.18.1-ls242 (verified ≡ latest digest)
USER & UID MODEL:
- UserNS=host for both. Rootless podman cannot map real uid 997 natively.
- Plex: PUID=0/PGID=0 (container root=dank), data root /var/lib/plexmediaserver chowned to 1000:1000. Rollback chowns back to 997:984.
- Tautulli: PUID=1000/PGID=1000.
VOLUMES:
- Plex: /var/lib/plexmediaserver:/config (RW, in-place), /mnt/entropy:/mnt/entropy:ro
- Tautulli: /home/dank/Containers/tautulli:/config
NETWORK & PORTS:
- App: dankserver_appnet. Plex alias=plex, Tautulli alias=tautulli.
- Plex: 32400:32400. Tautulli: 8181:8181.
- Tautulli config.seed: PMS_Web_Host=plex, PMS_Web_Port=32400, PMS_Secure=0.
CUTOVER & HEALTH:
- Native units stopped & masked (Plex), snap disabled (Tautulli). Instant rollback via unmask/snap enable + chown.
- Plex health gate widened to 600s (32GB DB migrations reset on bounce). No HealthCmd to avoid cold-load flapping.
- Tautulli uses python3 urllib health probe.
PITFALLS & FIXES:
- UsernsMode= (compose syntax) hard-failed v1 generator → corrected to UserNS= or omitted.
- Edit churn ate ContainerName, Network, PublishPort keys → caught by seam test + C5 probe.
- PMS deploy-state record showed pending (cosmetic) → self-heals on next deploy.
- Decommission: apt purge plexmediaserver + snap remove tautulli only on explicit sign-off.
01a06035-a0d8-73ad-8a49-279f51c68bf2
updated_at: 1788329168 PLEX_HOMEPAGE: Updated url to http://plex.franksdank.cloud/web/index.html in shared/homepage/dankserver.services.json & services.json. JELLYFIN_MNT: /mnt/entropy:/data:ro (read-only whole volume), health 200, libraries verified working. COPIPARTY_MNT: /mnt/entropy:/w:ro, health 200. JELLYFIN_DB: /home/dank/Containers/jellyfin/config/data/jellyfin.db; table is BaseItems (not TypedBaseItems). DEPLOY: Commit 8895a02, 233/233 tests green. USER_DIRECTIVE: Stop touching Jellyfin/Copyparty after verification.
01a05bed-d759-7157-af15-2e178337182a
updated_at: 1788325757 Decisions (Locked):
- D1: Quadlet .container units for all long-running services; compose retired to reference.
- D2: Data root /home/dank/Containers/ on Linux hosts; entropy is mounted volume.
- D3: *arr-stack migrates to FrankBook-Pro; decommissioned on dankserver.
- D4: Keep /Volumes/COMPLETE & /Volumes/COMPLETE/"Finished Torrents" verbatim; rename deferred.
- D5: VPN egress via gluetun container; qbittorrent shares netns (Network=gluetun.container).
- D6: Private LAN-only, direct IP:port, Pi-hole addn-hosts DNS; no Caddy vhost on Mac.
- D7: Scope includes Mac bring-up + cutover.
- D8: Seerr on dankclaw (SQLite, Authentik OIDC SSO), provider created before route flip.
Execution Phases:
- Phase 0: Prereqs (Mac SSH access, WireGuard creds/machine-local env, egress gate check via podman machine ssh).
- Phase 1 (dankserver): Per service (romm, mariadb, redis, jellyfin, calibre-web, copyparty): stop -> mv /opt -> /home/dank/Containers -> chown (uid 1000) -> deploy quadlet. RomM landmine: move DB from anonymous volume to /home/dank/Containers/romm/db.
- Phase 2 (dankclaw): Migrate data roots for gitea, authentik, etc.
- Phase 3/4: Mac stack bring-up & *arr cutover.
Technical Constraints & Patterns:
- Quadlet template: [Container] (Image, ContainerName, EnvironmentFile, Volume=bind-mounts-only), [Service] Restart=always, [Install] WantedBy=default.target.
- Entropy write: Only copyparty -v /mnt/entropy:/w with -a dank: -v /w::r:ra,dank.
- Deployer: ./scripts/deploy.sh computes changes, pushes, target pulls, dispatches. Handles run_privileged and service health checks.
- Secret hygiene: No secrets in tracked repo files (machine-local envs).
- Gotcha: Verify --userns=host in systemctl --user cat .service after daemon-reload. Data root mkdir -p handled in deployer.
01a05bd4-8dbe-759b-8885-8b86990051ed
updated_at: 1788314412 frank-default-large model/runtime configuration:
- Service alias: frank-default-large, served by scripts/serve-frank-large.sh with tunables in scripts/frank-default-large.env.
- Model: kingjones777/Qwen3.8-Flash-Next-ROCmFP4-STRIX-GGUF, file Qwen3.8-Flash-Next-Q4_0-ROCmFP4-STRIX.gguf under /home/dank/models/kingjones-Qwen3.8-Flash-Next-ROCmFP4-STRIX.
- Architecture: Qwen3.8-Flash-Next base / qwen4exp MoE, 512 experts / 10 used, 48 layers = 12 attention + 36 SSM, QSA indexer, hyper-connections, PLE at layer 1.
- Quant/file details: Q4_0_ROCMFP4_STRIX, file_type 105, ~113.47 GiB single GGUF. STRIX top quality tier; PLE table ~50.66 GiB Q8_0, token embeddings + lm head Q6_K.
- Runtime: kingjones30/ROCmFPX fork with qwen4exp-on-rocmfpx patch, built at /home/dank/GitPackages/kingjones-ROCmFPX/build/bin/llama-server using HIP for gfx1151, ROCm 7.2.4. Stock llama.cpp and charlie12345/ROCmFPX alone cannot load this GGUF because ROCmFP4 tensor types and qwen4exp architecture support must be in the same tree.
- Hardware target: Dankclaw / Strix Halo gfx1151 unified memory. Env sets HSA_OVERRIDE_GFX_VERSION=11.5.1, HIP_VISIBLE_DEVICES=0, --device ROCm0.
- Important pitfall: PLE n-gram table must stay out of GPU memory and stream via mmap from OS page cache. Do not add --no-mmap or tensor override/offload (-ot) for the PLE table.
- Important pitfall: --fit must remain off; auto-fit segfaults on qwen4exp hyper-connection config.
- Important pitfall: if graph build aborts on QSA F16 mask with flash attention, port scripts/patches/qwen4exp-qsa-f32-mask.patch into the kingjones ROCmFPX tree and rebuild.
- Speculative decoding currently disabled (SPEC_TYPE=none). Flash-Next MTP heads do not load on this loader and the model card ships no spec flags; draft model defaults exist but should not be enabled casually.
- mmproj: STRIX repo ships no mmproj; serve script conditionally passes /home/dank/models/agentionai-Qwen3.8-Flash-Next-ROCmFP4-FAST/mmproj/mmproj-Qwen3.8-Flash-Next-f16.gguf if readable.
- Serving defaults: host 0.0.0.0 port 7770, ctx 401408, parallel 2 slots, batch 4096, ubatch 512, threads 16, threads-batch 16, f16 KV cache, flash-attn on, split-mode none, gpu-layers 999, ctx-checkpoints 16, cache-ram 8192 MiB, prompt cache and idle-slot cache enabled, metrics enabled.
- Sampling defaults: temp 0.7, top_p 0.8, top_k 20, min_p 0.0, presence_penalty 1.5, reasoning on, reasoning-format deepseek, reasoning-budget -1. Env comments describe this as card sampling table mixed with validated serving profile, non-thinking instruct despite reasoning plumbing being enabled.
- Replaced prior agentionai ROCmFP4-FAST imatrix deployment/charlie build-qwen38 runtime around 2026-08-30.
ASUS TUF GAMING B650-E WIFI BIOS update/backup durable workflow:
- Target latest memory-compat BIOS identified: 3886 beta (2026-07), AGESA 1.2.0.3a Patch A. Current referenced BIOS was 2613.
- Board-name caution: use exact ASUS TUF GAMING B650-E WIFI support page; avoid wrong CAPs for similar boards like B650M-E or B650-PLUS.
- Backup current BIOS before flashing. Safe Linux read-only approach: sudo pacman -S flashrom sudo flashrom --programmer internal -r bios-2613-backup-1.bin sudo flashrom --programmer internal -r bios-2613-backup-2.bin sha256sum bios-2613-backup-*.bin; hashes must match or re-read.
- Expected AM5 SPI dump size is about 32 MB. Copy backups to USB and another machine. Never use flashrom -w from Linux for writing; power loss or mismatch can brick board. If flashrom reports multiple chips or refuses, use chip-specific selection only if certain or fall back to UEFI/EZ Flash backup.
- Alternative backup: ASUS EZ Flash 3 often offers save/current-BIOS-to-USB from UEFI. Also download archived 2613 CAP from ASUS as a restore/downgrade image.
- Normal flash path: FAT32 USB with CAP in root, reboot, Del into UEFI, Tool → ASUS EZ Flash 3, select CAP, allow verification, save old BIOS if offered, flash without resets/power cuts.
- Rescue path: USB BIOS FlashBack only if board will not POST. System off but PSU standby on, USB in rear FlashBack-marked port, rename CAP exactly per support page/manual (do not guess), hold FlashBack button ~3s, wait until LED stops blinking.
- Operational note: Dankserver hosts media stack + frank-default-small; BIOS flash is ~15–20 min downtime. First boot after AGESA update can spend 1–5 min on black screen due to DDR5 retraining; wait.
- Post-flash: settings reset to defaults. Re-apply memory profile/manual settings and re-run memtest; new AGESA/training invalidates prior memory stability conclusions. Verify version in BIOS main screen or with sudo dmidecode -s bios-version.
01a05a7d-cc94-7589-8926-c24cb5a10490
updated_at: 1788248708 Hermes Agent Persistence: Data survives restarts via host bind mount /home/dank/hermes-data:/data. Requires entrypoint override to hermes gateway run --force -v to prevent default TUI crash-loop on exit. Environment HERMES_DATA_DIR and HERMES_HOME must point to /data. Signal HTTP adapter connects to 127.0.0.1:8080 via network_mode: host. Dashboard runs separately on port 9119. General Container Patterns: ComfyUI uses keep-groups for rootless podman render group resolution; models/data persist under /home/dank/comfyui-data. SearXNG, Gluetun, and Valkey are boot-persistent Quadlet units sharing network namespaces. qBittorrent reuses SearXNG's netns without its own port. Migration & Deployment Constraints: *arr stack (Sonarr, Radarr, Lidarr, Readarr, Prowlarr) migrating to FrankBook-Pro Mac. Config dirs archived to /home/dank/archive/-arr-configs.tar.gz before removal; virgin installs skip archive. Podman machine init on Mac requires -v /Volumes/COMPLETE -v /Volumes/INCOMPLETE; later addition requires re-init. VPN egress gate must pass before *arr port publishing. Caddy uses Quadlet units. Verify with systemctl --user is-enabled, podman machine ssh, and health probes. Deploy scripts: deploy.sh, deploy-remote.sh, deploy-plan.py manage service order and target dispatch.
01a05a29-d9fd-71ca-86c8-b92c602492c7
updated_at: 1788229381 VOLUME SECURITY: POSIX permissions for read/write user via SFTP/SSH. Create dedicated writer user and readers group. Set volume ownership to writer:readers with chmod 2775 (setgid ensures new files inherit group). Deployment: Host volume or Podman container. Restrict SSH/SFTP access via Match block in sshd_config or ForceCommand internal-sftp.
FREETOKEN BUILD (DANKCLAW): Build-only, no deploy/run. Supports Vulkan or ROCm. Pre-installed: ROCm 6.3 (/opt/rocm), NVIDIA driver 575.57.02, CMake, Python, git. Requirements met for compilation.
GGUF LOADING CONSTRAINTS: Restricted to Gemma4GGUFForCausalLM model class. Supported GGML quantization types: F32(0), F16(1), BF16(30) use native torch views; Q4_0(2) and Q6_K(14) use dequant_q4_0/dequant_q6_k. Q8_0(8) is mapped but lacks dequant function (raises NotImplementedError). Loading pipeline: is_gguf_path -> iter_gguf_tensors -> dequantize -> load into graph.
01a04a3f-6596-75d0-8749-8ece9a2b11fd
updated_at: 1788224586 REPO_ROOT: /home/dank/Projects/serverAppConfigs HOSTS: Dankclaw (192.168.0.143, Caddy host), Dankserver (192.168.0.235) CADDY_SETUP: Single container on dankclaw fronts all services. DNS via dankclaw Pi-hole quadlet; LAN routed via SURFboard G36 router. TLS via Porkbun DNS-01 (no inbound 80/443 required). Admin interface ON (127.0.0.1:2019) enabling config file watcher hot-reload; turning off caused stale basicauth hash. Basicauth hash rendered from host .env into container Caddyfile. AUTH: Authentik SSO via Caddy forward_auth. Protects homepage, SearXNG, Hermes, Prometheus, RomM, Copyparty. Apps with native auth (Grafana, Gitea, OpenWebUI, Jellyfin, *arr, Pi-hole) bypass forward_auth. HERMES_BOT: WebUI network flipped to Network=host. Browser automation via chrome-devtools-protocol quadlet; CDP bound to loopback 127.0.0.1:9222. Deployer patched to start service only if inactive (preserves in-flight browser sessions). Trio + daemon managed via systemctl --user. CONFIG_QUIRKS: /data/config.yaml mounted but owned by unmapped UID (dank user cannot read directly; requires sudo python for edits). NPM npx cache lives in container layer: first tool call in fresh container pays npm download cost; container restarts do not reset cache, but recreation does. DEPLOY_WORKFLOW: deploy.sh handles quadlet install, daemon start-if-not-running, config wiring, trio restart. Uses stash-deploy-pop dance. State tracked via STATE[hermes] commit hash. FF-only pull on target.
01a059f4-cead-704b-b857-fad89ebde42b
updated_at: 1788224497
Context: Dankserver hosts copyparty for files.franksdank.cloud and LAN direct access. Traffic chain is Browser -> Caddy edge -> Anubis :8923 -> Authentik outpost -> post-auth :8017 as UNAUTHENTICATED -> copyparty :3923. LAN direct also reaches copyparty :3923.
Resolved change: in dankserver/compose.yaml, copyparty volume argument was changed from -v /w::A to -v /w::r:ra,dank. This makes /w browsable/downloadable but not writable/deletable. The copyparty version observed was v1.20.21. There is no separate dedicated reject-uploads flag; read-only behavior is achieved by omitting w, m, and d permissions. Anonymous must keep r because the guarded Authentik chain passes authenticated users to copyparty as unauthenticated.
Deployment workflow: deploy.sh correctly refuses to directly modify the compose stack on Dankserver but can pull/record rev. To apply the compose change, run on Dankserver: podman-compose up -d --force-recreate copyparty.
Verification results after deploy: anonymous GET /Movies/ returned 200; anonymous PUT returned 401; authenticated dank PUT/DELETE returned 403; recent-uploads DB showed "ups": []; files.franksdank.cloud returned 200 and the chain remained intact.
Critical pitfall discovered: prior runbook claim that anonymous got nothing was wrong. In copyparty, bare A means everyone, so -v /w::A had made the entire ~91T array anonymously readable, writable, and deletable on LAN/WebDAV. During probing, one 1-byte test file /mnt/entropy/w/.readability-probe-delete-me was created; it was verified by exact path and size and removed, then root listing was rechecked to match original state.
Admin credentials at time of rollout: username dank, password m9FuwPKWotsPz7jUUn. Stored as COPAY_PASS= in dankserver/.env on Dankserver (gitignored). Compose interpolates this into container argv, so anyone able to podman inspect copyparty on the host can see it. Rotate by editing .env and recreating the service. After read-only change, dank has read plus admin panel but no writes by design.
Outstanding operational gap: copyparty/dankserver stack was still running as a bare compose container with no Quadlet unit; boot-persistence rule is not satisfied for the whole dankserver stack. This was flagged but not changed.
01a05a42-6580-7043-96eb-a73344efd9e6
updated_at: 1788221481 Hermes FLM/Gemma rollout on Dankclaw:
- User request: add Gemma FLM model to Hermes agent.
- Context: Hermes live data is bind-mounted at /home/dank/hermes-data and appears in-container as /data. Repo contains sanitized backup at dankclaw/hermes/config.yaml.example; do not commit live-only secrets such as dashboard password hashes, phone numbers, OAuth credentials, API keys, sessions, memories, or generated state.
- Existing Hermes config shape:
- model.provider/default selects main model.
- providers entries use keys like dankclaw-large and dankserver-small with api URL, discover_models: false, and explicit models/context_length.
- auxiliary entries use compact custom endpoint shape: {provider: custom, model: ..., base_url: ...}.
- Added FLM/NPU provider for Dankclaw to Hermes live config and sanitized repo example:
- provider name: dankclaw-npu
- FLM OpenAI-compatible base/API URL: http://192.168.0.143:7771/v1
- model: gemma4-it:e4b
- discover_models: false
- use api_key: not-needed where required by config conventions.
- Routed Hermes auxiliary vision to the Gemma FLM model:
- auxiliary.vision: {provider: custom, model: gemma4-it:e4b, base_url: http://192.168.0.143:7771/v1}
- Main Hermes model remained frank-default-large via dankclaw-large at http://192.168.0.143:7770/v1.
- Adjusted ~/.omp/agent/models.yml so frank-default-large context length is 200000 (reduced from oversized setting to suit actual Hermes/agent behavior).
- Cleaned stray ~/.pi by moving it to ~/.AGENTTRASH/20260831-pi.
- Restarted Hermes container after live config edit; Hermes became healthy.
- Validation: full repo test suite passed, 204 tests total.
- Durable caution: config.yaml.example is only a sanitized baseline backup of /home/dank/hermes-data/config.yaml, not a full replacement for live state. Preserve live secrets and generated state when editing/syncing.
01a059ae-72f3-76d4-8e09-735f8f2e0a5d
updated_at: 1788216058 Hosts and identities:
- FrankBook-Pro is reachable as dank@FrankBook-Pro.local / dank@192.168.0.112. It is macOS on x86_64, not iOS.
- dankclaw is 192.168.0.143.
- dankserver is 192.168.0.235.
- This rollout was run from the workstation/dankclaw context with an existing ed25519 SSH key.
SSH configuration completed and verified:
- Passwordless host-to-host SSH works:
- dankclaw -> FrankBook-Pro returns user dank.
- dankclaw -> dankserver returns user dank.
- dankserver -> dankclaw returns user dank.
- FrankBook-Pro -> dankclaw returns user dank.
- FrankBook-Pro host keys were already present in known_hosts during setup.
Hermes container SSH completed and verified:
- Containers checked: systemd-hermes, hermes-webui, hermes-dashboard.
- Each container can passwordlessly SSH using /root/.ssh/id_ed25519 with IdentitiesOnly=yes to:
- root@192.168.0.143 (dankclaw) -> returns root.
- dank@192.168.0.235 (dankserver) -> returns dank.
- dank@192.168.0.112 (FrankBook-Pro) -> returns dank.
FrankBook-Pro Podman stack installed and verified:
- podman installed at /usr/local/bin/podman, version 5.4.2, Mach-O x86_64.
- gvproxy installed/built at /usr/local/bin/gvproxy, Mach-O x86_64.
- vfkit installed via Homebrew at /usr/local/bin/vfkit, version v0.6.4, Mach-O x86_64.
- Podman machine uses applehv provider and is running:
- podman-machine-default* applehv, 4 CPUs, 2GiB RAM, 100GiB disk.
- podman run was verified with an Alpine test and confirmed working.
Operational notes:
- For future verification from dankclaw, use SSH checks to 192.168.0.112/235 and podman exec into Hermes containers to test /root/.ssh/id_ed25519 against the three targets.
- Do not assume FrankBook-Pro is iOS; treat it as macOS with Homebrew and AppleHV/vfkit support.
01a0598c-244a-766a-8485-b02f8ab630b5
updated_at: 1788209135 DNS architecture / split-horizon behavior:
- Domain: franksdank.cloud.
- Public DNS provider: Porkbun.
- LAN DNS: Pi-hole on the homelab, fed by addn-hosts / local records.
- Public/WAN Porkbun A records point subdomains to WAN IP 71.227.227.172.
- LAN Pi-hole resolves the same subdomains to Dankclaw LAN IP 192.168.0.143.
- G36 router/DHCP gives LAN clients Pi-hole as DNS, so LAN clients hit Pi-hole local records first. WAN clients resolve via Porkbun/public DNS.
Operational consequence:
- It is safe to remove a regular subdomain A record from Porkbun while keeping the Pi-hole record if the name should be LAN-only.
- LAN clients will continue resolving the name to 192.168.0.143 via Pi-hole.
- WAN clients will get NXDOMAIN/unknown subdomain once the Porkbun record is removed, unless cached elsewhere.
- Removing Porkbun DNS only affects name visibility/resolution; it does not itself close router port forwards or prevent direct access by IP if forwarding remains open.
Caddy/TLS implications:
- Single Caddy on Dankclaw fronts services and routes by Host header; Caddy does not care whether the hostname was resolved by Porkbun or Pi-hole.
- HTTPS certificates are wildcard DNS-01 certs for franksdank.cloud issued/renewed using a custom franksdank/caddy-porkbun image with caddy-dns/porkbun.
- DNS-01 renewal uses Porkbun API credentials to create TXT records under _acme-challenge; deleting ordinary A records does not break existing wildcard cert validity or renewal.
- Porkbun credentials live in dankclaw/.env as PORKBUN_API_KEY and PORKBUN_API_SECRET_KEY and are deployed to /home/dank/Containers/caddy/env for the Caddy quadlet; never commit secrets.
Cautions:
- Do not casually remove public DNS for auth.franksdank.cloud: prior sign-in/debugging showed auth needed a public A record for external login flows.
- Be cautious with gitea.franksdank.cloud because git smart-HTTP/external use may depend on public DNS.
- Keep Porkbun records for any service that must be reachable by external users through the public hostname; remove only for LAN-only/internal services.
Known public/LAN service hostnames previously tracked under franksdank.cloud include: auth, books, romm, files, jellyfin, radarr, sonarr, lidarr, readarr, prowlarr, qbittorrent, search, comfyui, chat, hermes, grafana, prometheus, gitea, pihole, and plex (plex.franksdank.cloud is canonical HTTPS).
01a051e2-6ff9-72cc-b980-b6837011e99f
updated_at: 1788126110 Service: frank-default-large on Dankclaw (gfx1151 unified memory). Model: kingjones777/Qwen3.8-Flash-Next-ROCmFP4-STRIX-GGUF -> file Qwen3.8-Flash-Next-Q4_0-ROCmFP4-STRIX.gguf (~113.5 GiB). Runtime: charlie12345/ROCmFPX llama.cpp (/home/dank/GitPackages/ROCmFPX/build-qwen38). ROCm 7.2.4. Quant/Format: ROCmFP4 (hand-ported from ciru-ai; upstream llama.cpp incompatible). Attention: Flash-ATTN ON via QSA indexer. Requires qwen4exp-qsa-f32-mask.patch to fix ggml_fill assert (applied in binary). MTP/Speculative: Draft head does not load (requires blk.0.hc_attn_norm.weight). Uses ngram-mod speculative decoding. Context: CTX_SIZE ~400k, Parallel 2. Config: scripts/frank-default-large.env and scripts/serve-frank-large.sh. Pitfalls: Avoid bare env vars TEMP, HOST, GPU_MAX_HEAP_SIZE (HIP runtime reads them). llama.cpp respects CLI flags.
01a051bf-4728-7028-82be-247e7b5da2bd
updated_at: 1788080182 SERVER: frank-default-large | HOST: Dankclaw (Strix Halo gfx1151, unified memory) | RUNTIME: charlie12345/ROCmFPX llama.cpp (/home/dank/GitPackages/ROCmFPX/build-qwen38/bin/llama-server, ROCm 7.2.4, HIP) | MODEL: agentionai/Qwen3.8-Flash-Next-ROCmFP4-FAST-imatrix-v2.gguf (87.06 GiB, Q4_0_ROCMFP4_FAST, qwen4exp MoE: 512 experts/10 used, 48 layers: 12 attn + 36 SSM, QSA indexer, hyper-connections, PLE layer 1, n-gram PLE fully VRAM-resident) | ENV: HIP_VISIBLE_DEVICES=0, HSA_OVERRIDE_GFX_VERSION=11.5.1, LD_LIBRARY_PATH includes ROCm paths | SERVING PROFILE: --parallel 2, --ctx-size 401408, --batch-size 4096, --ubatch-size 4096, --threads 16, --threads-batch 16, --cache-type-k f16, --cache-type-v f16, --ctx-checkpoints 16, --cache-ram 8192, --gpu-layers 999, --split-mode none, --cache-prompt, --cache-idle-slots, --metrics | SAMPLING: --temp 0.7, --top-p 0.8, --top-k 20, --min-p 0.0, --presence-penalty 1.5 | REASONING: --reasoning on, --reasoning-format deepseek, --reasoning-budget -1 | VISION: --mmproj active (f16 mmproj) | SPECULATIVE DECODING: SPEC_TYPE=ngram-mod (MTP head does not load on build-qwen38 due to missing blk.0.hc_attn_norm.weight) | CONSTRAINTS/PITFALLS: --fit off (auto-fit segfaults on qwen4exp hyper-connection config); flash-attn on (known to abort graph build on QSA indexer path); ROCmFP4 quant hand-ported from ciru-ai/ROCmFPX (upstream llama.cpp cannot load this GGUF format). | CONFIG PATHS: /home/dank/Projects/serverAppConfigs/scripts/serve-frank-large.sh, /home/dank/Projects/serverAppConfigs/scripts/frank-default-large.env, /home/dank/Projects/serverAppConfigs/scripts/service-frank-large.service, chat-template.jinja.
01a051d8-db9b-76ab-b05f-ac95f79c9e55
updated_at: 1788079840 Tool Constraints: bash tool strictly validates cwd parameter; explicit cwd pointing to non-existent directory causes failure ('Working directory does not exist'). Actual cwd resolved to /home/dank/Projects/serverAppConfigs via read tool. read tool handles relative paths well and returns resultLimit signals. File State: Active file contains git merge conflict markers at lines 25-18 and 64-79.
01a05172-a606-7196-bde3-454344369e22
updated_at: 1788076443 Platform: Strix Halo unified memory (~116.7 GiB pool, no separate VRAM). Configuration: frank-default-large updated to n_ctx=200704, n_slots=2 in env/serve scripts. models.json contextWindow set to 200000 for budget calculations. Memory dynamics: Base 32kx1 used ~13 GiB context buffer. 200kx2 scales theoretical buffer ~12.3x, but Qwen3.8-Flash-Next's SSM architecture (12 attention layers out of 48) limits KV cache growth, keeping total load within ~114 GiB HIP heap without OOM. Files: ~/.pi/agent/models.json, /home/dank/serverAppConfigs/scripts/frank-default-large.env, serve-frank-large.sh.
01a050b6-e0fb-73a0-889c-e663fedd8c96
updated_at: 1788072313
- Model Configuration: Replaced frank-default-large main model with https://huggingface.co/agentionai/Qwen3.8-Flash-Next-ROCmFP4-FAST-imatrix-GGUF. Configured MTP draft as https://huggingface.co/agentionai/Qwen3.8-Flash-Next-MTP-ROCmFP4-FAST-GGUF.
- MTP Architecture Pitfall: Previous MTP draft heads failed on STRIX_LEAN due to missing tensor 'blk.0.hc_attn_norm.weight' caused by main/draft mismatch. Using agentionai FAST main with agentionai FAST draft resolves this as a matching pair with compatible general.architecture.
- Git Workflow Decision: "Go straight to main" interpreted as skipping branch/worktree ceremony while keeping git as single source of truth. Direct commit and push to main.
- Deployment Resolution: Deployment blocked by git state showing deleted file (D) for dankclaw/Caddyfile and presence of .CADDYWIP-backup. Resolved by removing backup and running git checkout HEAD --.
- Files Modified: scripts/frank-default-large.env, scripts/serve-frank-large.sh, scripts/patches/qwen4exp-qsa-f32-mask.patch, dankclaw/LLM/agentionai-fast-imatrix.md.
- Env Tunables: Updated based on model card settings mixed with existing configuration.
01a04fa5-181d-75a9-ac57-3fdf464a36d3
updated_at: 1788060388 RUNTIME: ciru-ai/Qwen3.8-Flash-CIRU-STRIX-IU4 (llamacpp fork, tag v1.1). Binary: /home/dank/GitPackages/ROCmFPX/build-qwen38/bin/llama-server. Build flags: -DGGML_HIP=ON -DGGML_HIP_ROCMI4_W4A4=ON -DCMAKE_HIP_ARCHITECTURES=gfx1151. MODEL: jcbtc/Qwen3.8-Flash-CIRU-STRIX-IU4 (HuggingFace). Replaces kingjones777/Qwen3.8-Flash-Next-ROCmFP4-STRIX. 177B params, Q4_0 quant, PLE table streamed from page cache. ARCH: Strix Halo (gfx1151), unified memory, SVM-backed layers (--fit off, --gpu-layers 999). SPEC DECODING: MTP draft head first. Legacy STRIX_LEAN drafts failed (missing blk.0.hc_attn_norm.weight); new runtime/model fixes this. Stack ngram-mod later. CONTEXT: Start at 128k (CTX_SIZE=131072), promote to 524k+ post-stability. SLOTS: parallel=1 default. Long prompts can block the single slot, causing timeouts. Monitor n_prompt_[REDACTED] vs n_prompt_tokens. May need parallel adjustment. TEMPLATE: scripts/chat-template.jinja (DeepSeek reasoning format). PATHS: frank-default-large.env, frank-default-large.sh. Health check on 192.168.0.143:7770.
01a04f40-c5c0-77a4-89c1-f729e282a9e8
updated_at: 1788042611 Plan: Swap frank-default-large model to agentionai/Qwen3.8-Flash-Next-ROCmFP4-FAST-imatrix-GGUF, use sidecar MTP (not grafted), and stack ngram-mod later. Ignore gitflow, deploy straight to main.
Model & MTP Details: Sidecar MTP confirmed (main GGUF has 0 MTP tensors, block_count=48; head is 2.44GB on Dankclaw). Using FAST main + FAST family head resolves Aug-28 hc_attn_norm mismatch. Draft path relies on qwen4exp-aware binary.
Fork Build: Targeting kingjones30/ROCmFPX fork (previously charlie12345/ROCmFPX) on Dankclaw (/home/dank/GitPackages/ROCmFPX/build-qwen38). Fork tip is 36e9acd40; current live binary built at a19d14e4e (indexer-cache fix).
Decision: Clone fork fresh, pin build to tip main. GATE build on: git merge-base --is-ancestor a19d14e4e . If false, stop to avoid silently dropping the indexer fix that prevents crash-loops.
Env Constraints: ROCmFPX llama-server (PR #27742). Do not name bare env vars TEMP, HOST, or GPU_MAX_HEAP_SIZE (HIP runtime reads bare vars). --fit off to avoid segfaults on qwen4exp hyper-connection/indexer config.
01a046ba-1301-72c1-8d9f-347ba1c28cf7
updated_at: 1787952056
Homelab Auth Chain: Caddy → Anubis → Authentik Outpost → Apps
Architecture (dankclaw/dankserver, franksdank.cloud)
- Caddy runs as container on dankclaw (192.168.0.143), fronts all services on both hosts.
- Chain per protected vhost: TLS (ACME dns-01 via Porkbun) → Anubis bot challenge (:8923) → internal :8016 routing → Caddy forward_auth → Authentik outpost (:9000) → app.
- Apps with own auth (Grafana, Gitea, OpenWebUI, Jellyfin, *arr, Pi-hole) are NOT wrapped in forward_auth.
- DNS: flat franksdank.cloud scheme via Pi-hole quadlet on dankclaw; all names resolve to 192.168.0.143.
- TLS: real LE certs via dns-01 (Porkbun module, franksdank/caddy-porkbun image). No inbound ports needed.
Authentik Outpost Provider Config (verified live from DB)
- mode=proxy, external=https://franksdank.cloud, internal=http://authentik-server:9000
- Authorization flow: implicit-consent
- Outpost resolves provider by exact Host header match — this is why naive curl probes 404 (wrong/missing Host) while Caddy works (forwards real Host).
Critical Pitfall: CLI Verification of Auth Chain
- Unknown-UA clients (curl, bots) get Anubis JS challenge FIRST → respond 200 with HTML challenge page.
- This means
curl -A 'goauthentik.io/outpost/...'to a protected vhost returns 200 (challenge page), NOT outpost pass-through. - Caddy's forward_auth subrequest is an internal hop (Caddy→authentik :9000) — NOT affected by Anubis.
- Conclusion: You cannot verify end-to-end auth from CLI. Must test in a real browser (solves JS challenge once, gets clearance cookie, then SSO carries across apps).
Caddy Admin Toggle Pitfall
admin offin Caddyfile disables the config file watcher → rendered Caddyfile changes do NOT hot-reload.- Symptom: stale basicauth hash sitting on disk unapplied for hours (observed 2026-08-22).
- Fix: keep admin ON (binds to 127.0.0.1:2019 inside container, port not published, safe).
Unresolved at Thread End: External Login 'Not Found'
- Symptom: externally (phone off wifi), after passing Anubis challenge, user gets Authentik's unstyled 'Not Found' page with dead 'Go home' link + 'Powered by authentik' subtitle.
- Diagnosis direction: outpost 404 = provider host-match failure for external request pattern. External clients may present a Host header that doesn't match the outpost's configured provider hostname (e.g., mobile carrier NAT, different SNI, or outpost endpoint path mismatch for non-LAN IPs).
- Next steps would be: check outpost logs for 404s, verify external DNS resolves to Caddy (not bypassed), confirm outpost endpoint URL matches what Caddy forwards externally.
Grilling Skill
- Path: /home/dank/.agents/skills/grilling/SKILL.md
- Purpose: stress-test plans before building; one question at a time; look up facts in codebase, put decisions to user.
01a04717-a7fd-73ab-b7eb-319c4c1271c1
updated_at: 1787905384 Context: User asked whether HuggingFace EasiiX/Qwen3.8-Flash-Next-MTP-Strix-Halo-GGUF should be compatible with their personal llama.cpp runtime fork for frank-default-large's Qwen3.8-Flash-Next model.
Current frank-default-large setup at time of rollout:
- Served by /home/dank/Projects/serverAppConfigs/scripts/serve-frank-large.sh using env /home/dank/Projects/serverAppConfigs/scripts/frank-default-large.env.
- Runtime binary: /home/dank/GitPackages/ROCmFPX/build-qwen38/bin/llama-server from charlie12345/ROCmFPX llama.cpp fork with qwen4exp architecture support / PR #27742 merged, built with HIP/ROCmFP4 for Strix Halo gfx1151.
- Model repo/path: kingjones777/Qwen3.8-Flash-Next-ROCmFP4-STRIX / local /home/dank/models/kingjones-Qwen3.8-Flash-Next-ROCmFP4-STRIX, file Qwen3.8-Flash-Next-Q4_0-ROCmFP4-STRIX.gguf.
- Model details in serve script: 177B params = 56B MoE + 51.2B PLE n-gram table, 512 experts / 10 used, 48 layers (12 attention + 36 SSM/Mamba), full_attention_interval=4, 2 KV heads x 256 dim, QSA indexer, hyper-connections count=4 low_rank=320, PLE at layer 1. Q4_0_ROCMFP4_STRIX quant, 113.47 GiB single file. PLE table streamed from page cache; GPU resident approx 63-69 GiB; mmap default into Strix Halo unified memory. --fit off because auto-fit segfaults on hyper-connection/indexer config; -ngl 999 puts layers on GPU/SVM.
- Sharp chat template enabled via scripts/chat-template.jinja with --jinja and CHAT_TEMPLATE_KWARGS preserving thinking/reasoning; reasoning format deepseek.
MTP investigation outcome:
- Tested EasiiX/Qwen3.8-Flash-Next-MTP-Strix-Halo-GGUF Q8_0 draft head and agentionai ROCmFP4-FAST MTP draft head against the STRIX_LEAN/Uncensored main model and qwen4exp binary.
- Both MTP draft GGUFs failed at load/runtime with missing tensor: blk.0.hc_attn_norm.weight.
- Interpretation: qwen4exp runtime expects hyper-connection attention norm tensors in draft models for this architecture/config, but these published draft GGUFs do not carry them. Therefore they are not compatible with the current frank-default-large runtime/model as-is.
- Durable next step: Need either (a) an MTP draft head GGUF that includes hc_attn_norm tensors matching this qwen4exp/hyper-connection model, or (b) a patched/binary/runtime path that does not require those hyper-connection tensors for draft models.
Operational state after rollout:
- Reverted/left frank-default-large using ngram-mod only, not MTP.
- Health check returned {"status":"ok"} after restart; service healthy on ngram-mod.
- Tests passed: ./tests/run.sh and focused bats tests for LLM units, secrets, script syntax; shellcheck skipped locally because not installed.
- Committed/pushed/pulled serverAppConfigs changes: commit 6d4a96a, message "frank-default-large: ngram-mod only — both MTP draft heads incompatible". Changed scripts/frank-default-large.env and scripts/serve-frank-large.sh. Dankclaw checkout fast-forwarded to commit 6d4a96a.
Pitfall to remember: Do not assume Qwen3.8-Flash-Next MTP heads are compatible merely by model name/quant/Strix Halo labeling. Check tensor inventory for hyper-connection tensors, especially blk.0.hc_attn_norm.weight, before scheduling downtime for swap-in.
01a04330-1551-72f6-b57b-8a8f43ffe7e2
updated_at: 1787862517 Context: frank-default-large serves kingjones777/Qwen3.8-Flash-Next-ROCmFP4-STRIX-GGUF on Dankclaw (Strix Halo gfx1151 unified memory) using charlie12345/ROCmFPX llama.cpp build-qwen38 with qwen4exp support. Model is Q4_0_ROCMFP4_STRIX, ~113.47 GiB GGUF, 56B MoE plus 51.2B PLE n-gram table; PLE table is streamed from page cache and not resident in GPU VRAM. Runtime uses mmap into SVM-backed unified memory, -ngl 999/all layers on GPU, f16 KV, and --fit off because auto-fit segfaults on this model’s qwen4exp hyper-connection/indexer config.
Current/benchmark-relevant env file path: /home/dank/Projects/serverAppConfigs/scripts/frank-default-large.env. Serve script: /home/dank/Projects/serverAppConfigs/scripts/serve-frank-large.sh. Key documented tunables include CTX_SIZE=524288, PARALLEL=2, BATCH_SIZE=4096, UBATCH_SIZE=4096, NUM_THREADS=16, CACHE_TYPE_K=f16, CACHE_TYPE_V=f16, CTX_CHECKPOINTS=16, CACHE_RAM=8192, FIT=off. The prefill tuning rollout settled/documented BATCH_SIZE=4096 and UBATCH_SIZE=4096.
Decode tuning: a thread-batch sweep was run with an 8K prompt and 256 generated tokens. THREAD_BATCH=16 was confirmed as the best decode setting in that sweep. A prior todo requested 512 generated tokens, but that was intentionally not rerun: decode throughput in generated tok/s is independent of generation length for this comparison, so 512 tokens would only double wall-clock time while preserving the same tok/s signal. Use 256 gen tokens for future decode sweeps unless specifically measuring long-run thermal throttling or stability.
Benchmark methodology notes: separate prefill/TTFT benchmarking from decode tok/s benchmarking. For prefill, sweep batch and ubatch while holding other variables fixed and measure prompt processing throughput/TTFT. For decode, use a fixed prompt length (8K was used) and fixed generation length (256 tokens sufficient) while sweeping THREAD_BATCH; evaluate generated tok/s and TTFT. Keep prompts deterministic and repeat enough to avoid cache/page-cache warmup artifacts. Restore production env/service after benchmark and run the repo/service test suite.
Operational pitfalls/constraints: do not define bare env vars TEMP, HOST, or GPU_MAX_HEAP_SIZE in service env files; ROCm/HIP runtime reads those names and prior TEMP incident caused failures. llama.cpp host/port/temp should be passed as CLI flags, not bare env vars. Do not enable --fit for this model unless the qwen4exp auto-fit segfault has been fixed. Avoid interpreting longer generation-length decode runs as better signal unless testing thermal/stability; tok/s is the reusable metric.
01a042cc-e1c5-7482-87a2-14deadb82202
updated_at: 1787833610
frank-default-large: Qwen3.8-Flash-Next tuning on Dankclaw (Strix Halo gfx1151)
Model & Architecture
- kingjones777/Qwen3.8-Flash-Next-ROCmFP4-STRIX-GGUF, 177B params (51.2B PLE n-gram + 125.8B MoE/attention)
- 56B MoE: 512 experts (10 used), 48 layers (12 attn + 36 SSM, full_attention_interval=4), 2 KV heads x 256 dim
- QSA indexer: 4 heads, top_k=2048; hyper-connections: count=4, low_rank=320
- PLE layer 1: ngram_size=3, heads_per_ngram=8
- Quant: Q4_0_ROCMFP4_STRIX (file_type=105), 113.47 GiB single GGUF
- PLE table: 50.66 GiB Q8_0, streamed from page cache (NEVER in GPU VRAM)
- GPU resident: ~63-69 GiB on Strix Halo unified memory pool (116 GiB SVM-backed)
Runtime
- ROCmFPX llama.cpp fork at /home/dank/GitPackages/ROCmFPX/build-qwen38/bin/llama-server
- PR #27742 (qwen4exp architecture) merged
- Build: -DGGML_HIP=ON -DGGML_HIP_ROCMI4_W4A4=ON -DCMAKE_HIP_ARCHITECTURES=gfx1151 -DGGML_CUDA_FA_ALL_QUANTS=ON -DLLAMA_BUILD_WEBUI=OFF -DCMAKE_EXE_LINKER_FLAGS=-no-pie
Critical Constraints (DO NOT CHANGE)
- FIT=off: auto-fit segfaults on this model's hyper-connection/indexer config
- -ngl 999 places all layers on SVM-backed GPU pool
- NEVER name env vars TEMP, HOST, or GPU_MAX_HEAP_SIZE — ROCm HIP runtime reads bare env vars (2026-08-13 TEMP incident)
- llama.cpp reads --host/--port/--temp as CLI flags only, never env vars
- Text-only: no mmproj, no MTP draft head
Current Tunings (env file: frank-default-large.env)
- BATCH_SIZE=4096, UBATCH_SIZE=4096
- NUM_THREADS=16, THREAD_BATCH=32
- CTX_SIZE=524288, PARALLEL=2
- CACHE_TYPE_K=f16, CACHE_TYPE_V=f16
- CTX_CHECKPOINTS=16, CACHE_RAM=8192
- HSA_OVERRIDE_GFX_VERSION=11.5.1
- Port 7770 (LISTEN_PORT)
Benchmark Status (interrupted)
- Goal: tune batch/ubatch for optimal token prefill
- Next planned step: threads-batch sweep
- Benchmark servers targeted ports 7772 and 7773
- Session interrupted during health-check polling loop; servers returned no output via curl on those ports (likely still loading 113 GiB model or not yet started)
- The repeated poll pattern (5+ identical checks, ~5s apart) suggests the assistant was waiting for model load completion before starting benchmarks
Workflow Pattern
- SSH into dankclaw from controller; check health via
curl -s http://127.0.0.1:PORT/health - Model load on unified memory is extremely slow (113 GiB mmap); benchmark scripts must account for long startup
- Use frank-default-small (the serving model for this agent) to orchestrate benchmarks against frank-default-large
01a042a4-7e85-7728-802d-c8442896f6e6
updated_at: 1787827055
frank-default-large model swap (2026-09-02)
Host: Dankclaw — AMD Radeon 8060S (Strix Halo), gfx1151 iGPU, 64 GiB unified memory. Runtime: charlie12345/ROCmFPX llama.cpp build-kairic v81. Port 7770.
Swap: STRIX_LEAN-GGUF (56B MoE / 35.76B PLE, 3 shards, 98.5 GiB) → Qwen3.8-Flash-Next-ROCmFP4-STRIX-GGUF (177B total / 51.2B PLE, single file, 113.47 GiB on disk).
File path: /home/dank/models/kingjones-Qwen3.8-Flash-Next-ROCmFP4-STRIX/Qwen3.8-Flash-Next-Q4_0-ROCmFP4-STRIX.gguf
Key architectural fact: PLE (Projection Layer Embedding) table streams from page cache — never enters GPU VRAM regardless of tier. This is why a 114 GiB file fits in 64 GiB unified memory: only ~63-69 GiB is GPU-resident (same as LEAN variant). The PLE table occupies host RAM/page-cache.
Performance: Load time ~55 seconds. Generation speed and prompt throughput within noise of STRIX_LEAN at every context depth. 200/200 tests pass.
Config files modified:
scripts/frank-default-large.env— MODEL_DIR, MODEL_FILE, header commentsscripts/serve-frank-large.sh— header comments, default valuesdocs/LLM/kingjones-strix-rocmfp4.md— new 195-line runbookdocs/LLM/index.md— active model reference updateddocs/index.md— top-level index links new doc
Git: Branch frank-large-strix-model pushed to origin (Gitea on Dankclaw).
Prior history on this slot (for context): CIRU PromptForge v3 → Kairic Edge IU4 (reverted) → kingjones Qwen3.8-27B ROCmFP4 STRIX MTP (Q6 AGENT, standalone MTP draft, Turbo4 V cache, 262K ctx/1 slot) → Q8_0 AGENT experiment (failed, set_rows bug) → STRIX MTP restored → now Flash-Next full 177B.