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.
525 lines
49 KiB
Markdown
525 lines
49 KiB
Markdown
# 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:<slug> 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, generated
|
||
- `hermes-webui`: active, generated
|
||
- `hermes-dashboard`: active, generated
|
||
- `signal-cli-daemon`: inactive, disabled
|
||
- Containers:
|
||
- `chrome-devtools-protocol` up ~2 days, no listed network
|
||
- `systemd-hermes` up ~38h, no listed network
|
||
- `hermes-dashboard` up ~38h, network `dankclaw_default`
|
||
- `hermes-webui` up ~38h, healthy, no listed network
|
||
- Listeners:
|
||
- `0.0.0.0:8787` listening (Hermes WebUI)
|
||
- `127.0.0.1:9222` listening by `headless-shell` (Chrome DevTools Protocol)
|
||
- `*:9119` listening via `rootlessport`
|
||
- No listener on `8080` in this diagnostic, consistent with `signal-cli-daemon` being down.
|
||
- `hermes-webui` env names include `SIGNAL_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, but `signal-cli-daemon` was 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/<svc> 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:<secret> -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 <svc>.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/<date>-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 <pinned-sha>. 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 off` in 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 comments
|
||
- `scripts/serve-frank-large.sh` — header comments, default values
|
||
- `docs/LLM/kingjones-strix-rocmfp4.md` — new 195-line runbook
|
||
- `docs/LLM/index.md` — active model reference updated
|
||
- `docs/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.
|