diff --git a/.AGENTTRASH/frank-large.env.llama.cpp b/.AGENTTRASH/frank-dragoon.env.llama.cpp similarity index 98% rename from .AGENTTRASH/frank-large.env.llama.cpp rename to .AGENTTRASH/frank-dragoon.env.llama.cpp index 74b9597..ff82436 100644 --- a/.AGENTTRASH/frank-large.env.llama.cpp +++ b/.AGENTTRASH/frank-dragoon.env.llama.cpp @@ -1,4 +1,4 @@ -# Tunables for frank-large (kingjones777/Qwen3.8-Flash-Next-ROCmFP4- +# Tunables for frank-dragoon (kingjones777/Qwen3.8-Flash-Next-ROCmFP4- # STRIX-GGUF on the kingjones30/ROCmFPX llama.cpp runtime, Dankclaw, # Strix Halo gfx1151, unified memory). # @@ -56,7 +56,7 @@ CHAT_TEMPLATE_FILE=/home/dank/serverAppConfigs/scripts/chat-template.jinja CHAT_TEMPLATE_KWARGS='{"enable_thinking":true,"preserve_thinking":true,"preserve_reasoning":true}' # Alias + network. -ALIAS=frank-large +ALIAS=frank-dragoon BIND_ADDR=0.0.0.0 LISTEN_PORT=7770 diff --git a/.AGENTTRASH/frank-large.service.llama.cpp b/.AGENTTRASH/frank-dragoon.service.llama.cpp similarity index 53% rename from .AGENTTRASH/frank-large.service.llama.cpp rename to .AGENTTRASH/frank-dragoon.service.llama.cpp index c0e98f2..6e166e1 100644 --- a/.AGENTTRASH/frank-large.service.llama.cpp +++ b/.AGENTTRASH/frank-dragoon.service.llama.cpp @@ -1,5 +1,5 @@ [Unit] -Description=ROCmFPX (kingjones30 fork) llama.cpp Qwen3.8-Flash-Next ROCmFP4 STRIX 177B MoE (dankclaw, frank-large) +Description=ROCmFPX (kingjones30 fork) llama.cpp Qwen3.8-Flash-Next ROCmFP4 STRIX 177B MoE (dankclaw, frank-dragoon) After=network-online.target Wants=network-online.target @@ -7,8 +7,8 @@ Wants=network-online.target Type=simple User=dank Group=dank -Environment="FRANK_LARGE_ENV_FILE=/home/dank/serverAppConfigs/scripts/frank-large.env" -ExecStart=/home/dank/serverAppConfigs/scripts/serve-frank-large.sh +Environment="FRANK_DRAGOON_ENV_FILE=/home/dank/serverAppConfigs/scripts/frank-dragoon.env" +ExecStart=/home/dank/serverAppConfigs/scripts/serve-frank-dragoon.sh Restart=on-failure RestartSec=10 diff --git a/.AGENTTRASH/frank-npu.env.flm-npu b/.AGENTTRASH/frank-npu.env.flm-npu index 8f531b5..adb9c08 100644 --- a/.AGENTTRASH/frank-npu.env.flm-npu +++ b/.AGENTTRASH/frank-npu.env.flm-npu @@ -6,7 +6,7 @@ # is reachable on this port regardless of the boot tag. The NPU is a # single-lane device: generations serialize FIFO, and the first request after a # model swap pays the ~6-11 s load cost. The NPU draws from the unified RAM -# pool shared with frank-large (iGPU). +# pool shared with frank-dragoon (iGPU). FLM_MODEL=nuextract3:4b FLM_HOST=0.0.0.0 FLM_PORT=7771 diff --git a/.AGENTTRASH/serve-frank-large.sh.llama.cpp b/.AGENTTRASH/serve-frank-dragoon.sh.llama.cpp similarity index 97% rename from .AGENTTRASH/serve-frank-large.sh.llama.cpp rename to .AGENTTRASH/serve-frank-dragoon.sh.llama.cpp index 1cc3302..0fcaa24 100755 --- a/.AGENTTRASH/serve-frank-large.sh.llama.cpp +++ b/.AGENTTRASH/serve-frank-dragoon.sh.llama.cpp @@ -1,6 +1,6 @@ #!/usr/bin/env bash # Serve kingjones777/Qwen3.8-Flash-Next-ROCmFP4-STRIX-GGUF as -# frank-large via the kingjones30/ROCmFPX llama.cpp runtime on +# frank-dragoon via the kingjones30/ROCmFPX llama.cpp runtime on # Dankclaw (Strix Halo gfx1151, unified memory). # # Runtime: kingjones30/ROCmFPX (fork of charlie12345/ROCmFPX with the @@ -29,7 +29,7 @@ set -euo pipefail SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" -ENV_FILE="${FRANK_LARGE_ENV_FILE:-$SCRIPT_DIR/frank-large.env}" +ENV_FILE="${FRANK_DRAGOON_ENV_FILE:-$SCRIPT_DIR/frank-dragoon.env}" if [[ -f "$ENV_FILE" ]]; then set -a # shellcheck disable=SC1090 @@ -44,7 +44,7 @@ fi : "${MMPROJ_PATH:=/home/dank/models/agentionai-Qwen3.8-Flash-Next-ROCmFP4-FAST/mmproj/mmproj-Qwen3.8-Flash-Next-f16.gguf}" : "${CHAT_TEMPLATE_FILE:=$SCRIPT_DIR/chat-template.jinja}" : "${CHAT_TEMPLATE_KWARGS:={}}" -: "${ALIAS:=frank-large}" +: "${ALIAS:=frank-dragoon}" : "${BIND_ADDR:=0.0.0.0}" : "${LISTEN_PORT:=7770}" : "${CTX_SIZE:=401408}" diff --git a/.AGENTTRASH/serve-frank-npu.sh.flm-npu b/.AGENTTRASH/serve-frank-npu.sh.flm-npu index 4f88f29..61a60d1 100755 --- a/.AGENTTRASH/serve-frank-npu.sh.flm-npu +++ b/.AGENTTRASH/serve-frank-npu.sh.flm-npu @@ -4,7 +4,7 @@ # Runs `flm serve ` on the XDNA2 NPU (50 TOPS, Dankclaw). The NPU is a # single-lane device: generations serialize in FIFO order, so this is a # background/triage endpoint, not an interactive multi-user chat. The NPU -# draws from the unified RAM pool shared with frank-large (the iGPU +# draws from the unified RAM pool shared with frank-dragoon (the iGPU # llama.cpp service); see serverAppConfigs-docs/LLM/frank-npu.md # for the memory budget and the model-selection tradeoff. # diff --git a/AGENTS.md b/AGENTS.md index 441553c..20b1a97 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,11 +9,11 @@ services run from `/home/dank/serverAppConfigs` on each host (the 2026-08-22 merge absorbed the former `vllmScripts` repo, history preserved). - **Dankserver** (192.168.0.235) — media/library stack (RomM, Copyparty, - Calibre-Web, Jellyfin, Plex) plus the `frank-primary` LLM service. + Calibre-Web, Jellyfin, Plex) plus the `frank-archon` LLM service. - **Dankclaw** (192.168.0.143) — AI/search/dev/observability stack (SearXNG via Gluetun, ComfyUI, OpenWebUI, Hermes, Gitea, Grafana, Prometheus, Loki, - Alloy, Pi-hole) plus TWO LLM services: `frank-large` (flash-server - container on the gfx1151 iGPU) and `frank-secondary` (llama.cpp CUDA on the + Alloy, Pi-hole) plus TWO LLM services: `frank-dragoon` (flash-server + container on the gfx1151 iGPU) and `frank-zealot` (llama.cpp CUDA on the RTX 3090). Caddy on Dankclaw reverse-proxies both hosts. - **FrankBook-Pro** (192.168.0.112) — macOS mini running the *arr stack @@ -25,9 +25,9 @@ merge absorbed the former `vllmScripts` repo, history preserved). | Target | Service | Runtime | Model | Port | |--------|---------|---------|-------|------| -| Dankserver | `frank-primary` | **radiance** (StillDeadcode, **pin 1.0.13** digest-pinned `stilldeadcode/radiance@sha256:4c3f484564…`, plain `podman run`, root systemd unit) | ukisai/Swift1.5-Qwen3.8-Flash-Next BF16 (335.3 GiB, 397/397 sha256-verified) converted by `scripts/convert-swift15-w4dn8.sh` to `qwen4exp-swift15-w4dn8-i8-hc8m.rad` (**116,416 MiB**): **all 49,152 experts GPTQ w4** (10M-token calibration on engine 1.2.0) + **24 whole bf16-protected experts/layer** (energy-share law), int8 trunk/lm_head, fp8 HC, PLE n-gram fp8 fixed-scale, on **BOTH R9700s TP=2** (`--tp-wire wht6`), experts in a **40 GiB/rank pinned host pool** + VRAM cache (`--placement expert_tiered`, explicit `--vram-weights-mib 26071 --vram-kv-mib 3543`), **47.7 GiB n-gram copy pinned to host RAM** (`--ngram-placement ram`; root unit + `LimitMEMLOCK=infinity`), **fp8 KV** (inherited; pool 3.46 GiB), **MTP spec decode depth 2**, `--max-num-seqs 3`, `--max-model-len 200000`, MNBT 2048, Froggeric v22.5 template. KLD-gated (mean KL 0.0131, top-1 97.92 % vs BF16); decode ~190 t/s live (gate bar 30.8). Cutover 2026-10-08 from fp8-native (payload on disk = rollback). | 7770 | -| Dankclaw | `frank-large` | **halogen-flash-server 0.16.2** (`ghcr.io/peonist-ai/halogen-flash-server@sha256:0c61bf84…`, digest-pinned, plain `podman run` via `scripts/serve-frank-large.sh`, root systemd unit) | Quat3rnion/halogen-swift1.5-qwen3.8-flash-next-v2-abliterated **`qwen38-flash-next-v2-swift15-abliterated.hgn`** (66,687,678,464 B = compacted r2 of the card's 89,775,868,032 B original, ~62 GiB resident; the v2 `.hgn` format loads in NO other engine), **+ REQUIRED `qwen38-flash-next-ngram.hgn`** (51,200,246,144 B, peonist @5cc17cea — read beside the checkpoint) **+ vision tower** (897,916,416 B, @e053f488 — **vision ON**, `image_url` parts only, ≥256 px probes), **MTP spec decode ALWAYS-ON (`HALOGEN_SPEC_ADAPT=0` — the adaptive default disables the drafter per request and HALVES decode)**, MTP head INSIDE the checkpoint (`HALOGEN_MTP_HEAD` unset; no sidecar fetched), **2 slots × 262,144 ctx** (KV pool 524,288 positions ≈ 14.0 GiB at ~28 KiB/position; the 27B slots>1-disables-drafting law does NOT carry over — batching and speculation coexist, the card's quickstart ships 2 with the head), harness window 217,088 = ceiling − 45k estimate headroom, **server-side sampler 1.0/0.95/20** (card recipe; models.yml extraBody matches), coupled cap/timeout 65536/7200, prompt cache ON by default (warm 100k turn ≈ 2 s vs ≈ 88 s cold)|7770| -| Dankclaw | `frank-secondary` | llama.cpp master (0.5.0-dev, commit `5fc4f3c`), CUDA sm_86 build (root systemd unit, relinked) | HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive **Q6_K** (7,359,259,008 B; dense `qwen35` hybrid: 32 layers, 8 full-attention + 24 Gated DeltaNet, 4 KV heads × 256 dim, vocab 248,320, native 262,144, **no MTP tensors in the file**) + the publisher's own **BF16 mmproj** (921,704,448 B) for **vision**, on the RTX 3090, **TWO 200,704-token slots** (`--ctx-size 401408 --parallel 2`), **exact f16 K + f16 V** under flash attention (32 KiB/token over the 8 full layers = 12.25 GiB pool), batch 4096 / **ubatch 2048** (measured CUDA optimum), `--log-verbosity 4`, **MTP OFF** (forced: no `nextn` tensors exist). Priced from the MiMo Q6_K boots (same geometry, same card, same shape): 21,276/2,849 at ubatch 1024, 21,846/2,279 at 2048. Cutover 2026-10-07 (late) from Gemma4-26B-A4B Q4_K_M 1×200,704. All three endpoints route harness **compaction** here. | 7771 | +| Dankserver | `frank-archon` | **radiance** (StillDeadcode, **pin 1.0.13** digest-pinned `stilldeadcode/radiance@sha256:4c3f484564…`, plain `podman run`, root systemd unit) | ukisai/Swift1.5-Qwen3.8-Flash-Next BF16 (335.3 GiB, 397/397 sha256-verified) converted by `scripts/convert-swift15-w4dn8.sh` to `qwen4exp-swift15-w4dn8-i8-hc8m.rad` (**116,416 MiB**): **all 49,152 experts GPTQ w4** (10M-token calibration on engine 1.2.0) + **24 whole bf16-protected experts/layer** (energy-share law), int8 trunk/lm_head, fp8 HC, PLE n-gram fp8 fixed-scale, on **BOTH R9700s TP=2** (`--tp-wire wht6`), experts in a **40 GiB/rank pinned host pool** + VRAM cache (`--placement expert_tiered`, explicit `--vram-weights-mib 26071 --vram-kv-mib 3543`), **47.7 GiB n-gram copy pinned to host RAM** (`--ngram-placement ram`; root unit + `LimitMEMLOCK=infinity`), **fp8 KV** (inherited; pool 3.46 GiB), **MTP spec decode depth 2**, `--max-num-seqs 3`, `--max-model-len 200000`, MNBT 2048, Froggeric v22.5 template. KLD-gated (mean KL 0.0131, top-1 97.92 % vs BF16); decode ~190 t/s live (gate bar 30.8). Cutover 2026-10-08 from fp8-native (payload on disk = rollback). | 7770 | +| Dankclaw | `frank-dragoon` | **halogen-flash-server 0.16.2** (`ghcr.io/peonist-ai/halogen-flash-server@sha256:0c61bf84…`, digest-pinned, plain `podman run` via `scripts/serve-frank-dragoon.sh`, root systemd unit) | Quat3rnion/halogen-swift1.5-qwen3.8-flash-next-v2-abliterated **`qwen38-flash-next-v2-swift15-abliterated.hgn`** (66,687,678,464 B = compacted r2 of the card's 89,775,868,032 B original, ~62 GiB resident; the v2 `.hgn` format loads in NO other engine), **+ REQUIRED `qwen38-flash-next-ngram.hgn`** (51,200,246,144 B, peonist @5cc17cea — read beside the checkpoint) **+ vision tower** (897,916,416 B, @e053f488 — **vision ON**, `image_url` parts only, ≥256 px probes), **MTP spec decode ALWAYS-ON (`HALOGEN_SPEC_ADAPT=0` — the adaptive default disables the drafter per request and HALVES decode)**, MTP head INSIDE the checkpoint (`HALOGEN_MTP_HEAD` unset; no sidecar fetched), **2 slots × 262,144 ctx** (KV pool 524,288 positions ≈ 14.0 GiB at ~28 KiB/position; the 27B slots>1-disables-drafting law does NOT carry over — batching and speculation coexist, the card's quickstart ships 2 with the head), harness window 217,088 = ceiling − 45k estimate headroom, **server-side sampler 1.0/0.95/20** (card recipe; models.yml extraBody matches), coupled cap/timeout 65536/7200, prompt cache ON by default (warm 100k turn ≈ 2 s vs ≈ 88 s cold)|7770| +| Dankclaw | `frank-zealot` | llama.cpp master (0.5.0-dev, commit `5fc4f3c`), CUDA sm_86 build (root systemd unit, relinked) | HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive **Q6_K** (7,359,259,008 B; dense `qwen35` hybrid: 32 layers, 8 full-attention + 24 Gated DeltaNet, 4 KV heads × 256 dim, vocab 248,320, native 262,144, **no MTP tensors in the file**) + the publisher's own **BF16 mmproj** (921,704,448 B) for **vision**, on the RTX 3090, **TWO 200,704-token slots** (`--ctx-size 401408 --parallel 2`), **exact f16 K + f16 V** under flash attention (32 KiB/token over the 8 full layers = 12.25 GiB pool), batch 4096 / **ubatch 2048** (measured CUDA optimum), `--log-verbosity 4`, **MTP OFF** (forced: no `nextn` tensors exist). Priced from the MiMo Q6_K boots (same geometry, same card, same shape): 21,276/2,849 at ubatch 1024, 21,846/2,279 at 2048. Cutover 2026-10-07 (late) from Gemma4-26B-A4B Q4_K_M 1×200,704. All three endpoints route harness **compaction** here. | 7771 | Retired endpoints (`frank-npu`, and every prior runtime) are in the [runbook index](#runbook-index). The full swap history lives in @@ -66,14 +66,14 @@ All edits flow through git. Never edit files on a remote machine directly. ./scripts/deploy.sh dankclaw ./scripts/deploy.sh dankserver ./scripts/deploy.sh dankclaw --service searxng -./scripts/deploy.sh dankserver --service frank-primary +./scripts/deploy.sh dankserver --service frank-archon ./scripts/deploy.sh dankclaw --dry-run ``` The planner maps changed paths to services; the remote runner restarts only the selected service and records its revision outside the checkout. Documentation-only changes are a no-op. LLM services are selected only by -their own files — every endpoint (`frank-large`/`frank-secondary`/`frank-primary`) +their own files — every endpoint (`frank-dragoon`/`frank-zealot`/`frank-archon`) by its unit/env/serve trio in `scripts/` — so unrelated container changes cannot interrupt inference. Set `FRANK_SUDO_PW` for headless @@ -85,7 +85,7 @@ restarts each service whose marker is behind HEAD *and* whose paths changed since that marker — so a backlog accumulated by service-scoped deploys fires all at once, and one failing health gate aborts the run with every later service left pending. Name the service unless a drain is what you want -(`./scripts/deploy.sh dankserver --service frank-primary`). +(`./scripts/deploy.sh dankserver --service frank-archon`). ### Deployment completeness (MANDATORY) @@ -229,17 +229,17 @@ archive. **STOP the production service BEFORE benchmarking** — these servers serve real users, and a bench beside a live service starves the GPU and corrupts results. Use the runtime's own harness: `llama-bench` for the llama.cpp -endpoints; a live llama.cpp server also reports honest per-request numbers in the `/completion` `timings` object (prefill/decode rates, `draft_n`, `draft_n_accepted`), which is how frank-large and frank-secondary were measured. Rolling your own bench +endpoints; a live llama.cpp server also reports honest per-request numbers in the `/completion` `timings` object (prefill/decode rates, `draft_n`, `draft_n_accepted`), which is how frank-dragoon and frank-zealot were measured. Rolling your own bench requires asking first. Scratch ports are not used on LLM hosts — a test process cannot share the single GPU anyway; validate against the service itself. -(A gufo-era law; frank-large ran ROCmFPX llama.cpp 2026-10-02 → 10-05, the +(A gufo-era law; frank-dragoon ran ROCmFPX llama.cpp 2026-10-02 → 10-05, the halogen 27B container 2026-10-05 → 10-06, and is flash-server since, but the rollback tags keep it live.) **`gufo bench` cannot rank speculative-decode settings, and will invert the ranking.** -Measured 2026-09-28 on frank-large at depth 32768: its corpus +Measured 2026-09-28 on frank-dragoon at depth 32768: its corpus reports `acceptance=0.933 ± 0.000` with an **identical trace sha256** across draft widths, i.e. the same highly-predictable text every run, and 93 % of every proposal accepted. It reported 29–37 t/s decode where real traffic @@ -264,12 +264,12 @@ one: `ip neigh show ` from a peer — FAILED means off/NIC dead, while a merely wedged kernel usually still answers ARP. 1. Stop and mask (self-healing would restart it): - - Dankclaw `frank-large` (root unit, halogen podman on the iGPU): - `sudo systemctl stop frank-large && sudo systemctl mask frank-large` - - Dankclaw `frank-secondary` (root unit, llama.cpp on the 3090): - `sudo systemctl stop frank-secondary && sudo systemctl mask frank-secondary` - - Dankserver `frank-primary` (root unit, radiance on both R9700s, TP=2): - `sudo systemctl stop frank-primary && sudo systemctl mask frank-primary` + - Dankclaw `frank-dragoon` (root unit, halogen podman on the iGPU): + `sudo systemctl stop frank-dragoon && sudo systemctl mask frank-dragoon` + - Dankclaw `frank-zealot` (root unit, llama.cpp on the 3090): + `sudo systemctl stop frank-zealot && sudo systemctl mask frank-zealot` + - Dankserver `frank-archon` (root unit, radiance on both R9700s, TP=2): + `sudo systemctl stop frank-archon && sudo systemctl mask frank-archon` 2. Bench. NOTE: `systemctl mask` FAILS on a relinked unit (the unit file in `/etc/systemd/system/` is itself a symlink into the checkout — mask @@ -287,14 +287,15 @@ The harness reaches the fleet through `.omp/agent/models.yml` in the operator's home — `/home/blank/.omp/agent/models.yml` on the dev box, which is where the harness runs; there is no copy on the servers. Each provider is one HOST:PORT; each model `id` is the served alias. **Official model ids are -the StarCraft unit names (2026-10-08) and since 2026-10-09 they are also the -ids on the wire:** `frank-archon` → `192.168.0.235:7770` -(`FRANK_PRIMARY_SERVED_NAME`), `frank-dragoon` → `192.168.0.143:7770` -(`HALOGEN_MODEL_ID`), `frank-zealot` → `192.168.0.143:7771` (`ALIAS`). The -SERVICES, units, scripts, env files and runbooks keep the old names -(`frank-primary`, `frank-large`, `frank-secondary`); only the served alias, -the `models.yml`/`config.yml` ids, the homepage cards, the OpenWebUI grants -and the Hermes routing were renamed. Verify a rename on `/v1/models`, never +the StarCraft unit names (2026-10-08), on the wire since 2026-10-09, and +since 2026-10-10 they are also the SERVICE names:** `frank-archon` → +`192.168.0.235:7770` (`FRANK_ARCHON_SERVED_NAME`), `frank-dragoon` → +`192.168.0.143:7770` (`HALOGEN_MODEL_ID`), `frank-zealot` → +`192.168.0.143:7771` (`ALIAS`). The 2026-10-10 cutover renamed the units, +scripts, env files, containers, deploy services and runbooks to match — +the three former service names are fully retired and exist nowhere in +the repo; historical text in runbooks uses the current names. Verify a +rename on `/v1/models`, never on a chat response: radiance echoes the **requested** model name, so a 200 proves nothing about the served id (llama.cpp and halogen ignore it). @@ -309,16 +310,16 @@ provider block, model `id`, `contextWindow`, `maxTokens`, `input` in `models.yml`, then fix every `modelRoles` entry that named the old endpoint — a role pointing at a provider the file does not define fails at call time. As of 2026-10-06 **all three endpoints accept images** (`input: [text, -image]`) — `frank-large` returned to vision with the flash-server v2 swap +image]`) — `frank-dragoon` returned to vision with the flash-server v2 swap (the v2 vision tower loads beside the checkpoint; the text-only halogen 27B window closed 2026-10-06) — while -`frank-primary` takes them natively (radiance runs the checkpoint's +`frank-archon` takes them natively (radiance runs the checkpoint's 27-layer Qwen-VL tower — patching, pad-token expansion and 3-part rotary are the engine core; `--mm-max-patches` available), -and `frank-secondary` through +and `frank-zealot` through the publisher's own BF16 mmproj passed as `--mmproj` — the model is natively multimodal but the Q6_K GGUF carries no vision tensors (same arrangement the -Gemma4 era used). `frank-secondary`'s `contextWindow` is +Gemma4 era used). `frank-zealot`'s `contextWindow` is **200704** — the PER-SLOT window (`--ctx-size 401408 --parallel 2` since the 2026-10-07 Qwen3.5-9B swap), not the pool and not the model's native 262144: the harness must compact before llama.cpp answers a longer prompt with a 400. @@ -333,20 +334,20 @@ endpoint on 2026-09-11, returned 2026-09-17 with the Gemma4 projector's audio encoder, and left again with the Gemma4 retirement on 2026-10-01 (neither the MiMo nor the Qwen3.5 tower carries audio). -### frank-large — halogen-flash-server 0.16.2, Qwen3.8-Flash-Next v2 Swift1.5 ABLITERATED (Dankclaw, ACTIVE) +### frank-dragoon — halogen-flash-server 0.16.2, Qwen3.8-Flash-Next v2 Swift1.5 ABLITERATED (Dankclaw, ACTIVE) The **flash-server engine** (`ghcr.io/peonist-ai/halogen-flash-server@sha256:0c61bf84…`, digest-pinned, published tag 0.16.2, 3.6 GB image) as a podman container -driven by `scripts/serve-frank-large.sh` under a **root systemd unit** -(`scripts/frank-large.service`, `User=dank`, `Restart=always`, -`ExecStop=podman stop -t 60 frank-large-halogen`, the script runs `podman +driven by `scripts/serve-frank-dragoon.sh` under a **root systemd unit** +(`scripts/frank-dragoon.service`, `User=dank`, `Restart=always`, +`ExecStop=podman stop -t 60 frank-dragoon-halogen`, the script runs `podman run` FOREGROUND — the container's exit code is the service's exit so `Restart=always` stays real, and the engine ledger lands on disk) on port 7770 from the Strix Halo iGPU. Engine stdout goes to -`/home/dank/logs/frank_large.log` — **the boot ledger (weights resident, KV +`/home/dank/logs/frank_dragoon.log` — **the boot ledger (weights resident, KV pool, MTP head, prompt cache, any clamp) lives there, not in the journal**. Cutover 2026-10-06 from the halogen 27B-dense era -([[frank-large-halogen27b-dflash2]], retired the same window). +([[frank-dragoon-halogen27b-dflash2]], retired the same window). Serving `Quat3rnion/halogen-swift1.5-qwen3.8-flash-next-v2-abliterated`: `qwen38-flash-next-v2-swift15-abliterated.hgn` (66,687,678,464 B ≈ 62.1 @@ -368,10 +369,10 @@ sidecar is deliberately not fetched). **Product facts vs the 27B era, both regressions FIXED:** the base is **abliterated** (the 27B was a censored-base finetune; refusals were an accepted trade there) and **vision is ON** (the 27B engine silently -ignored its encoder — frank-secondary owned images for exactly one day at this +ignored its encoder — frank-zealot owned images for exactly one day at this endpoint). -**Engine laws that shape the config** (all in `scripts/frank-large.env` +**Engine laws that shape the config** (all in `scripts/frank-dragoon.env` with evidence): `HALOGEN_SPEC_ADAPT=0` is MANDATORY — the default adaptive policy disables the MTP head for whole requests after low acceptance and HALVES decode; the head stays on and temp-1.0 traffic pays some acceptance @@ -413,7 +414,7 @@ page cache beside the checkpoint — the card's quickstart arithmetic does not bill it as resident, but READ the boot ledger and re-size if the engine prints a clamp. -Fetch: `scripts/download-frank-large-flashnext.sh` into +Fetch: `scripts/download-frank-dragoon-flashnext.sh` into `/home/dank/models/halogen-flashnext-v2/` (`-f` + exact byte counts + LFS sha256 + `--verify-only`, no token on the command line; resume goes against the RESOLVED CDN URL because curl drops `Range` across HF's 302). @@ -422,18 +423,18 @@ n-gram + vision tower, flat tokenizer with all six files as regular files) — the 2026-10-01 crash-loop lesson. Runbook: -`serverAppConfigs-docs/LLM/frank-large-flash-server-v2-swift15.md`. +`serverAppConfigs-docs/LLM/frank-dragoon-flash-server-v2-swift15.md`. Rollback: revert the swap commit and redeploy — the 27B payload (`/home/dank/models/halogen-qwen3.8-27b/`), its fetch script and the halogen 0.1.4 image digest all remain on disk; the ROCmFPX door behind that (`scripts/build-rocmfpx.sh`, pin `36e9acd`) is untouched. -### frank-secondary — llama.cpp on the RTX 3090 (Dankclaw, ACTIVE) +### frank-zealot — llama.cpp on the RTX 3090 (Dankclaw, ACTIVE) **llama.cpp master** (0.5.0-dev, commit `5fc4f3c`; CUDA sm_86 build `/home/dank/GitPackages/llama-master/build-cuda/bin/llama-server`, `GGML_CUDA_FA_ALL_QUANTS=ON`) as a **root systemd unit** -(`scripts/frank-secondary.service`, `relink_unit`ed into +(`scripts/frank-zealot.service`, `relink_unit`ed into `/etc/systemd/system/`), serving `HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive` at **Q6_K** (7,359,259,008 B, sha256 `c0ba7beb…` computed locally — the Hub carries no @@ -489,7 +490,7 @@ tokens). With `--parallel 2` a compaction request no longer serializes behind a live generation (the Gemma4 era's `--parallel 1` law). Runbook: -`serverAppConfigs-docs/LLM/frank-secondary-llama-qwen35-9b-q6k-2x200704.md`. +`serverAppConfigs-docs/LLM/frank-zealot-llama-qwen35-9b-q6k-2x200704.md`. Rollback: revert the swap commit — the Gemma4 payload (`/home/dank/models/Gemma4-26B-A4B/`), the MiMo Q6_K payload (`/home/dank/models/MiMo-Q6K/`), the Swift payload @@ -497,7 +498,7 @@ Rollback: revert the swap commit — the Gemma4 payload (`/home/dank/models/Ornith-Q8/`) all remain on disk. -### frank-primary — Radiance (StillDeadcode), Swift1.5-Qwen3.8-Flash-Next GPTQ w4, TP=2 (Dankserver, ACTIVE) +### frank-archon — Radiance (StillDeadcode), Swift1.5-Qwen3.8-Flash-Next GPTQ w4, TP=2 (Dankserver, ACTIVE) The **radiance engine** (StillDeadcode, Apache-2.0; image `stilldeadcode/radiance@sha256:4c3f484564…` digest-pinned, **pin 1.0.13** @@ -556,7 +557,7 @@ pools + the 47.7 GiB n-gram copy (`--ngram-placement ram` is pinned RAM the card reads) + 4 GiB prefix host ≈ **132 GiB** charged against `RLIMIT_MEMLOCK` — the TTM floor is set just above it. `ttm.pages_limit`/`pages_max` cap GPU-mappable pinned pages; the serve -script's TTM preflight (`FRANK_PRIMARY_TTM_MIN_MIB=140000`) refuses to +script's TTM preflight (`FRANK_ARCHON_TTM_MIN_MIB=140000`) refuses to start until both knobs are raised in the stop window (sysfs write first, kernel cmdline + reboot only if read-only). @@ -570,11 +571,11 @@ chat format — no parser flags; vision native (the 27-layer Qwen-VL tower, `--mm-max-patches`); `/metrics` carries vLLM-compatible names + `radiance:*` families — the Dankclaw Prometheus scrape is re-added. -Runbook: `serverAppConfigs-docs/LLM/frank-primary-radiance-swift15-w4dn8.md`. -Retired fp8-native era: `serverAppConfigs-docs/LLM/frank-primary-radiance-qwen38-native-fp8.md`. -Retired FreeToken era: `serverAppConfigs-docs/LLM/frank-primary-freetoken-pr587.md`. +Runbook: `serverAppConfigs-docs/LLM/frank-archon-radiance-swift15-w4dn8.md`. +Retired fp8-native era: `serverAppConfigs-docs/LLM/frank-archon-radiance-qwen38-native-fp8.md`. +Retired FreeToken era: `serverAppConfigs-docs/LLM/frank-archon-freetoken-pr587.md`. Retired vLLM era: `serverAppConfigs-docs/LLM/dankserver-qwen38-fp8-expert-offload-tuning.md`. -Retired GLM experiment: `serverAppConfigs-docs/LLM/frank-primary-glm53-flash-w4a16.md`. +Retired GLM experiment: `serverAppConfigs-docs/LLM/frank-archon-glm53-flash-w4a16.md`. ## Key Lessons Learned Durable operational lessons from the fleet's history. Full detail in the @@ -736,11 +737,11 @@ linked runbooks. - Swap resize ordering: create and `swapon` the replacement BEFORE `swapoff` of the old one, or live pages must land in RAM that `MemAvailable` overstates. Dankclaw swap (64 GiB at `/swap.img`, fstab-driven) protects - the co-tenants, not frank-large — pinned weights don't swap, and paging + the co-tenants, not frank-dragoon — pinned weights don't swap, and paging the KV pool is worse than the OOM it prevents. - Host swap state is invisible to `deploy.sh` (no repo file) — check `swapon --show` before reasoning about headroom. -- **Silent RAM corruption outranks every software theory.** frank-primary's +- **Silent RAM corruption outranks every software theory.** frank-archon's ~40k-token output corruption (2026-10-04/05, repetition/garbage in long agent conversations) was marginal DDR5 at 4800 MT/s on four DIMMs, fixed by 4600. Consumer non-ECC memory raises **no MCE** for a silent flip, and @@ -763,7 +764,7 @@ linked runbooks. `LimitMEMLOCK=infinity` (systemd is privileged; the value flows through podman to runc without any raise). Upstream halogen's own run lines pass NO `--ulimit` at all — copy vendor run lines before adding flags - (measured 2026-10-05 on the frank-large cutover). + (measured 2026-10-05 on the frank-dragoon cutover). - **Kairic Edge** (if ever re-deployed): the pinned CK commit needs `third_party/composable_kernel/include/ck/config.h` generated manually (untracked; `git clean` removes it), and its greedy-argmax fastpath rejects @@ -789,7 +790,7 @@ linked runbooks. 121 GiB box, pushed `available` to 3 GiB, and every later rate was suspect. Record the child pid and kill it in a `finally`, then prove `free` came back before believing a number. Kill by pid — never `pkill -f llama-server`, - which also hits frank-secondary. + which also hits frank-zealot. **llama.cpp serving** @@ -813,7 +814,7 @@ linked runbooks. builds its context against whatever model the draft context holds. Two context-backed types cannot share one process, and MTP's head only loads when MTP **is** the draft model. **A LEGAL chain can still lose on a - recurrent model:** `draft-mtp,ngram-mod` on frank-large's qwen35 hybrid + recurrent model:** `draft-mtp,ngram-mod` on frank-dragoon's qwen35 hybrid measured −15 % prose / −7 % block-copy (2026-10-03) — adding the ngram layer logs `recurrent state rollback is not compatible with 'ngram-mod' - disabling rollback support`, and MTP verification depends on that rollback, @@ -855,7 +856,7 @@ linked runbooks. free. That was a CONTIGUITY failure, not a total-bytes one, and no totals model — the sweep's or the seam's — can see it.) - **On the CUDA 3090 the same knob has NO interior optimum up to 2048, so - frank-secondary ships 4096/2048.** Measured 2026-10-05 by boot-pair A/B on the + frank-zealot ships 4096/2048.** Measured 2026-10-05 by boot-pair A/B on the live service: at 8,928 prompt tokens ubatch 1024 gives 3,972 / 4,077 t/s and ubatch 2048 gives 4,207 / 4,212 — **+4.6 %** — for **616 MiB** (free 2,849 → 2,279). Decode did not move (91.9–93.0 vs 93.8–94.3, i.e. noise), and a @@ -864,9 +865,9 @@ linked runbooks. than the ubatch cannot see it. The logical `--batch-size` was again free. And the predecessor's "ubatch 2048 failed the scratch boot" was a shape observation, not a law: the same file boots 2048 clean at 2 × 200,704. Bench - it by restarting the SERVICE through a transient `FRANK_SECONDARY_ENV_FILE` + it by restarting the SERVICE through a transient `FRANK_ZEALOT_ENV_FILE` drop-in, never a scratch port — one card holds one server. See - [[frank-secondary-llama-mimo-q6k-2x200704]]. + [[frank-zealot-llama-mimo-q6k-2x200704]]. - **One `-ts` step is one LAYER, and a hybrid stack's layers are not the same size.** qwen35 is 16 x (3 Gated DeltaNet + 1 Gated Attention), so a step is worth ~0.43 GiB on a DeltaNet boundary and ~1.43 GiB on a full-attention one @@ -888,7 +889,7 @@ linked runbooks. CTX_SIZE / PARALLEL`, and llama.cpp refuses a prompt longer than the SLOT (`400 exceed_context_size_error: request (184001 tokens) exceeds the available context size (180224 tokens)`) even when the pool has room. So - frank-secondary's 2 → 3 reslice moved each conversation from the model's native + frank-zealot's 2 → 3 reslice moved each conversation from the model's native 262,144 down to 180,224, and `models.yml` `contextWindow` had to follow or the harness would discover the ceiling as a 400 on a long conversation. Side effect worth knowing: the shorter slot made decode ~5 % FASTER (106.8 vs @@ -899,9 +900,9 @@ linked runbooks. day the freed space also bought the Q6_K rung (now 94.4 tok/s — the rung itself is a further measured −10 %, weight-bandwidth, not slot geometry). All moves measured; both slot directions cost or buy window, never pool. - See [[frank-secondary-llama-mimo-q6k-2x200704]]. + See [[frank-zealot-llama-mimo-q6k-2x200704]]. - **Price a VRAM budget from two boots, never from a formula — and an mmproj - costs ~1.5x its file size.** The frank-secondary 3090 fit was solved from two + costs ~1.5x its file size.** The frank-zealot 3090 fit was solved from two measurements: 2 × 262,144 with no projector = 20,190 MiB used (KV 12,800 ⇒ **non-KV 7,390**), 3 × 196,608 with the f16 projector = 22,972 used (KV 14,113 ⇒ **non-KV 8,859**). The difference is the vision tower: a 918 MB file @@ -909,24 +910,24 @@ linked runbooks. ride with it. Subtracting the two rows is exact; extrapolating weights+KV+ "a bit for buffers" is what leaves 1.1 GiB free when you meant 2.7. Then solve `KV ≤ card − non-KV − headroom` and round to a multiple of - `PARALLEL × 4096`. Recorded in `scripts/frank-secondary.env` so the next resize + `PARALLEL × 4096`. Recorded in `scripts/frank-zealot.env` so the next resize starts from measurement. - **`images` and `image_url` are NOT interchangeable: only the content part reaches the model.** `--mmproj` loads, `usage.prompt_tokens` rises, and the model still invents an answer if the client used the legacy top-level - `images` field on `/v1/chat/completions` — frank-secondary answered "Brown." for + `images` field on `/v1/chat/completions` — frank-zealot answered "Brown." for a solid-red PNG that way and "Red." through the OpenAI `image_url` part. The failure is silent because a hallucinated color is a plausible answer. Probe vision with a solid color and expect an exact word. - **`--jinja` is what `tools` needs.** On 2026-09-16 a subagent died with `500 tools param requires --jinja flag`, from the ik_llama.cpp runtime that - then served frank-large: every tool-using agent on that endpoint was broken + then served frank-dragoon: every tool-using agent on that endpoint was broken and the failure read like a model fault. Mainline llama.cpp 0.4.1 defaults `--jinja` on and the serve script pins it; halogen also accepts `tools` and returns `tool_calls`. Check tool support before routing a role at an endpoint. - **Quantized KV on CUDA needs `GGML_CUDA_FA_ALL_QUANTS=ON`** — the same option and the same ~12x prefill collapse described in the ROCm note above. - f16 KV needs nothing; frank-secondary ran f16 for that reason until + f16 KV needs nothing; frank-zealot ran f16 for that reason until 2026-09-17, when `build-cuda` was rebuilt with the option ON so the endpoint could take q8_0 KV. - **llama-bench separates a LIST with `/` and SWEEP values with `,`.** Both @@ -944,7 +945,7 @@ linked runbooks. raises on anything else — HTTP 500, not a clamp — so the harness's levels must be folded onto that set in `models.yml` (`compat.reasoningEffortMap`). A role whose level is unmapped fails on its FIRST request, and the failure - names Jinja, not the model: every subagent on `frank-secondary` died with + names Jinja, not the model: every subagent on `frank-zealot` died with `Unexpected reasoning effort high` until `high: xhigh` was added on 2026-09-16. Halogen accepts the wider set, so the two entries legitimately differ. @@ -964,7 +965,7 @@ linked runbooks. times (`RuntimeError: No HIP GPUs are available`). - SearXNG outbound traffic must stay on the Gluetun tunnel; do not move its ports off the gluetun service. -- `amd_iommu=off` on Dankclaw (bought 13–16 % prefill for frank-large, +- `amd_iommu=off` on Dankclaw (bought 13–16 % prefill for frank-dragoon, 2026-09-11) permanently retired the XDNA2 NPU: the driver's SVA/PASID bind needs an enabled IOMMU (`/dev/accel/accel0` fails `err=-19`). Revert path in `serverAppConfigs-docs/LLM/dankclaw-iommu-translation-off.md`. @@ -1018,9 +1019,9 @@ Active: | Service | Runbook | |---------|---------| -| frank-large (flash-server 0.16.2, abliterated Swift1.5 v2 .hgn + MTP always-on, 2×262,144, vision ON, Dankclaw) | `serverAppConfigs-docs/LLM/frank-large-flash-server-v2-swift15.md` | -| frank-secondary (llama.cpp CUDA, Qwen3.5-9B-Uncensored Q6_K, 2×200,704 exact f16 KV MTP-off, vision ON, Dankclaw) | `serverAppConfigs-docs/LLM/frank-secondary-llama-qwen35-9b-q6k-2x200704.md` | -| frank-primary (radiance StillDeadcode, Qwen3.8-Flash-Next-FP8 native, 2×R9700 TP=2, Dankserver) | `serverAppConfigs-docs/LLM/frank-primary-radiance-qwen38-native-fp8.md` | +| frank-dragoon (flash-server 0.16.2, abliterated Swift1.5 v2 .hgn + MTP always-on, 2×262,144, vision ON, Dankclaw) | `serverAppConfigs-docs/LLM/frank-dragoon-flash-server-v2-swift15.md` | +| frank-zealot (llama.cpp CUDA, Qwen3.5-9B-Uncensored Q6_K, 2×200,704 exact f16 KV MTP-off, vision ON, Dankclaw) | `serverAppConfigs-docs/LLM/frank-zealot-llama-qwen35-9b-q6k-2x200704.md` | +| frank-archon (radiance StillDeadcode, Qwen3.8-Flash-Next-FP8 native, 2×R9700 TP=2, Dankserver) | `serverAppConfigs-docs/LLM/frank-archon-radiance-qwen38-native-fp8.md` | | Dankclaw kernel posture (`amd_iommu=off`) | `serverAppConfigs-docs/LLM/dankclaw-iommu-translation-off.md` | | Deployment flow + incidents | `serverAppConfigs-docs/LLM/deployment.md` | @@ -1028,41 +1029,41 @@ Retired (rollback targets and history): | Runtime | Host | Window | Runbook | |---------|------|--------|---------| -| llama.cpp CUDA Gemma4-26B-A4B QAT Q4_K_M, 1×200,704 f16-K/q8_0-V MTP-off (`frank-secondary`) | Dankclaw | 2026-10-07 → 10-07 (same-day swap; rollback target — payload on disk; owns the `attention_k_eq_v` pair-billing KV law and the gemma4-assistant drafter-cost boots) | `frank-secondary-llama-gemma4-q4km-200704.md` | -| ROCmFPX llama.cpp fork Qwen3.8-27B Uncensored Q6_0_ROCMFPX_AGENT + MTP (`frank-large`) | Dankclaw | 2026-10-03 → 10-05 (rollback target, payload + fork build on disk) | `frank-large-rocmfpx-q6agent-uncensored-mtp.md` | -| tcclaviger vLLM fork Qwen3.8-Flash-Next-Uncensored FP8, TP=2, shape G (`frank-primary`) | Dankserver | 2026-09-29 → 10-05 (rollback target — tag `frank-primary-vllm-shapeG-20261003`; trio + env lore in the tag, image in rootless storage) | `dankserver-qwen38-fp8-expert-offload-tuning.md` | -| FreeToken PR #587 ROCm, Qwen3.8-Flash-Next-Uncensored-FP8, ONE R9700 (`frank-primary`) | Dankserver | 2026-10-05 → 10-05 (rollback target — tag `frank-primary-freetoken-pr587-20261005`; trio + Dockerfile in the tag, image `localhost/frank-primary-freetoken:pr587-77a7201` and orcarouter payload on disk) | `frank-primary-freetoken-pr587.md` | -| llama.cpp master MiMo-V2.6-Distill-Qwen-9B Q6_K 2×200,704 f16 KV (`frank-secondary`) | Dankclaw | 2026-10-03 → 10-05 (rollback target — payload on disk; owns the ubatch-2048 A/B; the Ornith swap of 10-05 was committed but never deployed, so this was the LIVE payload Swift replaced) | `frank-secondary-llama-mimo-q6k-2x200704.md` | -| llama.cpp Ornith-1.5-9B Q8_0, ONE 262,144 f16 KV (`frank-secondary`) | Dankclaw | 2026-10-05 (committed 77decb5→380aafa, never deployed — superseded by Swift the same evening; payload on disk) | trail in `frank-secondary-llama-swift15-unc-iq3xxs-mtp-114688.md` | -| llama.cpp CUDA Swift-1.5-27B Uncensored RCO IQ3_XXS-mtp, 2×114,688 draft-mtp q8_0 KV (`frank-secondary`) | Dankclaw | 2026-10-06 → 2026-10-07 (rollback target — payload on disk; owns the 3090 ubatch ladder A/B and the 34 KiB/token qwen35 KV law) | `frank-secondary-llama-swift15-unc-iq3xxs-mtp-114688.md` | -| ROCmFPX llama.cpp fork Qwen3.8-27B Q8_0_ROCMFPX_AGENT + MTP (`frank-large`) | Dankclaw | 2026-10-02 → 10-03 (rollback target, payload on disk) | `frank-large-rocmfpx-q8agent-mtp.md` | -| gufo v0.1.1 Qwen3.8-27B UD-Q8_K_XL/UD-Q4_K_XL + DFlash2 (`frank-large`) | Dankclaw | 2026-09-28 → 10-01, again 10-01 → 10-02 (payloads removed from disk 2026-10-03; rollback = re-download) | `frank-large-gufo-qwen38-27b.md` | -| vLLM TheRock MiMo-V2.6-Distill-Qwen-9B BF16 + cross-model MTP (`frank-large`) | Dankclaw | 2026-10-01 (same-day rollback to gufo) | `frank-large-vllm-mimo-v26-bf16.md` | -| llama.cpp master MiMo-V2.6-Distill-Qwen-9B Q6_K (`frank-secondary`) | Dankclaw | 2026-10-01 → 10-02 (the rung returned ACTIVE 2026-10-03 at the 2×200,704 shape — `frank-secondary-llama-mimo-q6k-2x200704.md`) | `frank-secondary-llama-mimo-q6k.md` | -| llama.cpp master MiMo-V2.6-Distill-Qwen-9B Q5_K_M 2×200,704 f16 KV (`frank-secondary`) | Dankclaw | 2026-10-02 → 10-03 (rollback target — one `MODEL_FILE` line, buys back 875 MiB + the −10 % rung tax; owns the boot-pair table) | `frank-secondary-llama-mimo-q5km.md` | -| SGLang MiMo-V2.6 INT8-W8A16-AutoRound (`frank-secondary`) | Dankclaw | 2026-10-01 (same-day swap to the GGUF path) | `frank-secondary-sglang-mimo-v26.md` | -|tcclaviger vLLM GLM-5.3-Flash W4A16 int4, +/- DFlash2 drafter (`frank-primary`)|Dankserver|2026-09-30 → 10-01|`frank-primary-glm53-flash-w4a16.md`| -| llama.cpp b11030 Qwen3.8-27B UD-Q8_K_XL + DFlash2 (`frank-large`) | Dankclaw | 2026-09-21 → 09-28 | `frank-large-unsloth-qwen38-27b-q8xl.md` | -| R9V radiance-vLLM Qwen3.8-Flash-Next-Uncensored IQ4_XS (`frank-primary`) | Dankserver | 2026-09-27 (same-day swap to Q8_0) | `frank-primary-r9v-radiance-qwen38-uncensored.md` | -| llama.cpp b11030 Qwen3.8-Flash-Next Q8_0 + shared MTP (`frank-primary`) | Dankserver | 2026-09-26 → 09-27 | `frank-primary-llamacpp-qwen38-flash-next-q8.md` | -| ik_llama.cpp Qwen3.8-Flash-Next-Uncensored i1-Q4_K_M (`frank-large`) | Dankclaw | 2026-09-15 → 09-16 | `frank-large-ik-uncensored.md` | +| llama.cpp CUDA Gemma4-26B-A4B QAT Q4_K_M, 1×200,704 f16-K/q8_0-V MTP-off (`frank-zealot`) | Dankclaw | 2026-10-07 → 10-07 (same-day swap; rollback target — payload on disk; owns the `attention_k_eq_v` pair-billing KV law and the gemma4-assistant drafter-cost boots) | `frank-zealot-llama-gemma4-q4km-200704.md` | +| ROCmFPX llama.cpp fork Qwen3.8-27B Uncensored Q6_0_ROCMFPX_AGENT + MTP (`frank-dragoon`) | Dankclaw | 2026-10-03 → 10-05 (rollback target, payload + fork build on disk) | `frank-dragoon-rocmfpx-q6agent-uncensored-mtp.md` | +| tcclaviger vLLM fork Qwen3.8-Flash-Next-Uncensored FP8, TP=2, shape G (`frank-archon`) | Dankserver | 2026-09-29 → 10-05 (rollback target — tag `frank-archon-vllm-shapeG-20261003`; trio + env lore in the tag, image in rootless storage) | `dankserver-qwen38-fp8-expert-offload-tuning.md` | +| FreeToken PR #587 ROCm, Qwen3.8-Flash-Next-Uncensored-FP8, ONE R9700 (`frank-archon`) | Dankserver | 2026-10-05 → 10-05 (rollback target — tag `frank-archon-freetoken-pr587-20261005`; trio + Dockerfile in the tag, image `localhost/frank-archon-freetoken:pr587-77a7201` and orcarouter payload on disk) | `frank-archon-freetoken-pr587.md` | +| llama.cpp master MiMo-V2.6-Distill-Qwen-9B Q6_K 2×200,704 f16 KV (`frank-zealot`) | Dankclaw | 2026-10-03 → 10-05 (rollback target — payload on disk; owns the ubatch-2048 A/B; the Ornith swap of 10-05 was committed but never deployed, so this was the LIVE payload Swift replaced) | `frank-zealot-llama-mimo-q6k-2x200704.md` | +| llama.cpp Ornith-1.5-9B Q8_0, ONE 262,144 f16 KV (`frank-zealot`) | Dankclaw | 2026-10-05 (committed 77decb5→380aafa, never deployed — superseded by Swift the same evening; payload on disk) | trail in `frank-zealot-llama-swift15-unc-iq3xxs-mtp-114688.md` | +| llama.cpp CUDA Swift-1.5-27B Uncensored RCO IQ3_XXS-mtp, 2×114,688 draft-mtp q8_0 KV (`frank-zealot`) | Dankclaw | 2026-10-06 → 2026-10-07 (rollback target — payload on disk; owns the 3090 ubatch ladder A/B and the 34 KiB/token qwen35 KV law) | `frank-zealot-llama-swift15-unc-iq3xxs-mtp-114688.md` | +| ROCmFPX llama.cpp fork Qwen3.8-27B Q8_0_ROCMFPX_AGENT + MTP (`frank-dragoon`) | Dankclaw | 2026-10-02 → 10-03 (rollback target, payload on disk) | `frank-dragoon-rocmfpx-q8agent-mtp.md` | +| gufo v0.1.1 Qwen3.8-27B UD-Q8_K_XL/UD-Q4_K_XL + DFlash2 (`frank-dragoon`) | Dankclaw | 2026-09-28 → 10-01, again 10-01 → 10-02 (payloads removed from disk 2026-10-03; rollback = re-download) | `frank-dragoon-gufo-qwen38-27b.md` | +| vLLM TheRock MiMo-V2.6-Distill-Qwen-9B BF16 + cross-model MTP (`frank-dragoon`) | Dankclaw | 2026-10-01 (same-day rollback to gufo) | `frank-dragoon-vllm-mimo-v26-bf16.md` | +| llama.cpp master MiMo-V2.6-Distill-Qwen-9B Q6_K (`frank-zealot`) | Dankclaw | 2026-10-01 → 10-02 (the rung returned ACTIVE 2026-10-03 at the 2×200,704 shape — `frank-zealot-llama-mimo-q6k-2x200704.md`) | `frank-zealot-llama-mimo-q6k.md` | +| llama.cpp master MiMo-V2.6-Distill-Qwen-9B Q5_K_M 2×200,704 f16 KV (`frank-zealot`) | Dankclaw | 2026-10-02 → 10-03 (rollback target — one `MODEL_FILE` line, buys back 875 MiB + the −10 % rung tax; owns the boot-pair table) | `frank-zealot-llama-mimo-q5km.md` | +| SGLang MiMo-V2.6 INT8-W8A16-AutoRound (`frank-zealot`) | Dankclaw | 2026-10-01 (same-day swap to the GGUF path) | `frank-zealot-sglang-mimo-v26.md` | +|tcclaviger vLLM GLM-5.3-Flash W4A16 int4, +/- DFlash2 drafter (`frank-archon`)|Dankserver|2026-09-30 → 10-01|`frank-archon-glm53-flash-w4a16.md`| +| llama.cpp b11030 Qwen3.8-27B UD-Q8_K_XL + DFlash2 (`frank-dragoon`) | Dankclaw | 2026-09-21 → 09-28 | `frank-dragoon-unsloth-qwen38-27b-q8xl.md` | +| R9V radiance-vLLM Qwen3.8-Flash-Next-Uncensored IQ4_XS (`frank-archon`) | Dankserver | 2026-09-27 (same-day swap to Q8_0) | `frank-archon-r9v-radiance-qwen38-uncensored.md` | +| llama.cpp b11030 Qwen3.8-Flash-Next Q8_0 + shared MTP (`frank-archon`) | Dankserver | 2026-09-26 → 09-27 | `frank-archon-llamacpp-qwen38-flash-next-q8.md` | +| ik_llama.cpp Qwen3.8-Flash-Next-Uncensored i1-Q4_K_M (`frank-dragoon`) | Dankclaw | 2026-09-15 → 09-16 | `frank-dragoon-ik-uncensored.md` | | vllm-radiance TP=2 MXFP4 + DFlash2 (`frank-medium`) | Dankserver | 2026-09-20 → 09-26 | `frank-medium-radiance-mxfp4.md` | -| Lucebox DS4.1 DeepSeek-V4.1-Flash ROCmFP23 (`frank-primary`) | Dankserver | 2026-09-26 (same-day swap) | `frank-primary-lucebox-ds4.md` | +| Lucebox DS4.1 DeepSeek-V4.1-Flash ROCmFP23 (`frank-archon`) | Dankserver | 2026-09-26 (same-day swap) | `frank-archon-lucebox-ds4.md` | | kingjones STRIX Qwen3.8-Flash-Next ROCmFP4 | Dankclaw | 2026-08-30 → 09-11 | `kingjones-strix-rocmfp4.md` | -| halogen-flash-server Qwen3.8-Flash-Next w4b (`frank-large`) | Dankclaw | 2026-09-16 → 09-19 | `halogen-flash-server.md` | -| CIRU v4.4.1 Orca Qwen3.8-Flash (`frank-large`) | Dankclaw | 2026-09-19 → 09-21 | `frank-large-ciru-orca.md` | -| unsloth llama.cpp b11030 Qwen3.8-Flash-Next UD-IQ4_XS (`frank-large`) | Dankclaw | 2026-09-21 (same-day swap) | `frank-large-unsloth-qwen38-flash-next.md` | -| Kairic Edge Qwen3.8-27B IU4 W4A4 (`frank-large`) | Dankclaw | 2026-09-21 (same-day swap) | `frank-large-kairic-edge-qwen38-27b.md` | -| ISTA-DASLab Qwen3.8-27B-GSQ-RCO IQ3_S (`frank-secondary`) | Dankclaw | 2026-09-16 → 09-17 | `frank-secondary-qwen38-gsq-rco.md` | -| vLLM Gemma4-12B w4a16 (`frank-secondary`) | Dankclaw | 2026-09-19 (same-day revert) | `frank-secondary-vllm-gemma4.md` | -| llama.cpp Gemma4-12B QAT Q4_K_M (`frank-secondary`) | Dankclaw | 2026-09-17 → 10-01 | `frank-secondary-gemma4-12b.md` | +| halogen-flash-server Qwen3.8-Flash-Next w4b (`frank-dragoon`) | Dankclaw | 2026-09-16 → 09-19 | `halogen-flash-server.md` | +| CIRU v4.4.1 Orca Qwen3.8-Flash (`frank-dragoon`) | Dankclaw | 2026-09-19 → 09-21 | `frank-dragoon-ciru-orca.md` | +| unsloth llama.cpp b11030 Qwen3.8-Flash-Next UD-IQ4_XS (`frank-dragoon`) | Dankclaw | 2026-09-21 (same-day swap) | `frank-dragoon-unsloth-qwen38-flash-next.md` | +| Kairic Edge Qwen3.8-27B IU4 W4A4 (`frank-dragoon`) | Dankclaw | 2026-09-21 (same-day swap) | `frank-dragoon-kairic-edge-qwen38-27b.md` | +| ISTA-DASLab Qwen3.8-27B-GSQ-RCO IQ3_S (`frank-zealot`) | Dankclaw | 2026-09-16 → 09-17 | `frank-zealot-qwen38-gsq-rco.md` | +| vLLM Gemma4-12B w4a16 (`frank-zealot`) | Dankclaw | 2026-09-19 (same-day revert) | `frank-zealot-vllm-gemma4.md` | +| llama.cpp Gemma4-12B QAT Q4_K_M (`frank-zealot`) | Dankclaw | 2026-09-17 → 10-01 | `frank-zealot-gemma4-12b.md` | | agentionai ROCmFP4-FAST imatrix | Dankclaw | 2026-08-29 → 08-30 | `agentionai-fast-imatrix.md` | | eemin Qwen3.8-27B ROCmI4 W4A4 MTP | Dankclaw | 2026-08-18 → 08-25 | `eemin-rocmi4-mtp.md` | | Kairic Edge IU4 | Dankclaw | 2026-08-22 (same-day revert) | `kairic-edge.md` | | CIRU ActiveFPX v3 / PromptForge | Dankclaw | through 2026-08-22 | `ciru-activefpx-promptforge.md` | | DFlash2 Vulkan | Dankclaw | 2026-08-21 (same-day revert) | `dflash2-large-vulkan.md` | | FastFlowLM NPU (`frank-npu`) | Dankclaw | twice, retired 2026-09-11 | `frank-npu.md`, `FastFlowLM NPU Inference.md` | -| FreeToken (official + Huihui FP8, `frank-secondary`) | Dankserver | 2026-09-02 → 09-15 | `freetoken-frank-small.md` | +| FreeToken (official + Huihui FP8, `frank-zealot`) | Dankserver | 2026-09-02 → 09-15 | `freetoken-frank-small.md` | | FastMTP patched llama.cpp | Dankserver | retired 2026-08-18 | `qwen3.8-spec-matrix.md` | | ik_llama.cpp Ornith CRACK | Dankserver | retired 2026-09-02 | `ikllama-ornith-dankserver.md` | | llama.cpp layer split + DFlash2 (`frank-medium`) | Dankserver | 2026-09-16 → 09-20 | `frank-medium-llamacpp-dflash2.md` | diff --git a/README.md b/README.md index f8a4c87..52c357e 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ one deploy script. | Host | User | IP | Podman stack | LLM service | LLM port | |------|------|----|--------------|-------------|----------| | dankserver | dank | 192.168.0.235 | media and library | frank-medium (ROCmFPX llama.cpp, Qwen3.8-27B AGENT) | 7770 | -| dankclaw | dank | 192.168.0.143 | AI, search, development, observability | frank-large (gufo, Qwen3.8-27B UD-Q8_K_XL) | 7770 | +| dankclaw | dank | 192.168.0.143 | AI, search, development, observability | frank-dragoon (gufo, Qwen3.8-27B UD-Q8_K_XL) | 7770 | ## Active Services @@ -30,7 +30,7 @@ one deploy script. | Gitea | dankclaw | gitea.dankclaw.local | 3001 | | Grafana | dankclaw | grafana.dankclaw.local | 3002 | | Prometheus | dankclaw | prometheus.dankclaw.local | 9090 | -| frank-large | dankclaw | — (bare endpoint) | 7770 | +| frank-dragoon | dankclaw | — (bare endpoint) | 7770 | ## Structure diff --git a/autoresearch.sh b/autoresearch.sh index e4fe165..cb3bcf2 100755 --- a/autoresearch.sh +++ b/autoresearch.sh @@ -1,26 +1,26 @@ #!/usr/bin/env bash -# autoresearch.sh — canonical frank-primary benchmark entry point (dev box). +# autoresearch.sh — canonical frank-archon benchmark entry point (dev box). # # The service runs on dankserver (192.168.0.235:7770), the two R9700s live # there, and the benchmark must own those cards, so the whole stop -> boot # scratch -> bench -> restore sequence runs ON dankserver (see -# scripts/autoresearch-frank-primary.sh). This wrapper: -# 1. copies the candidate config (the repo's scripts/frank-primary.env, the +# scripts/autoresearch-frank-archon.sh). This wrapper: +# 1. copies the candidate config (the repo's scripts/frank-archon.env, the # file the autoresearch loop edits) and the bench script to dankserver, # 2. runs the bench over ssh, relaying its stdout (the METRIC lines) and # exit code back here verbatim. # It deliberately does NOT push to origin: the scp dirties dankserver's # working tree, and the loop's uncommitted candidate config must not be -# pushed. Only this file and scripts/autoresearch-frank-primary.sh are +# pushed. Only this file and scripts/autoresearch-frank-archon.sh are # committed; the candidate env rides over ssh each run. set -uo pipefail DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REMOTE=dankserver REMOTE_REPO=/home/dank/serverAppConfigs -scp -q "$DIR/scripts/frank-primary.env" \ - "$REMOTE:$REMOTE_REPO/scripts/frank-primary.env" || { echo "scp env failed" >&2; exit 1; } -scp -q "$DIR/scripts/autoresearch-frank-primary.sh" \ - "$REMOTE:$REMOTE_REPO/scripts/autoresearch-frank-primary.sh" || { echo "scp script failed" >&2; exit 1; } +scp -q "$DIR/scripts/frank-archon.env" \ + "$REMOTE:$REMOTE_REPO/scripts/frank-archon.env" || { echo "scp env failed" >&2; exit 1; } +scp -q "$DIR/scripts/autoresearch-frank-archon.sh" \ + "$REMOTE:$REMOTE_REPO/scripts/autoresearch-frank-archon.sh" || { echo "scp script failed" >&2; exit 1; } -ssh "$REMOTE" "bash $REMOTE_REPO/scripts/autoresearch-frank-primary.sh $REMOTE_REPO/scripts/frank-primary.env" +ssh "$REMOTE" "bash $REMOTE_REPO/scripts/autoresearch-frank-archon.sh $REMOTE_REPO/scripts/frank-archon.env" diff --git a/echo_request.json b/echo_request.json index 4b708bb..14258b1 100644 --- a/echo_request.json +++ b/echo_request.json @@ -1 +1 @@ -{"model": "frank-large", "prompt": "Below is a telemetry API schema, labeled SCHEMA A. Later in this message the same schema is repeated word for word, labeled SCHEMA B.\nTask: output SCHEMA B verbatim, with no commentary and no reformatting, starting immediately with the opening brace.\n\nSCHEMA A:\n{\"version\":\"2.3.1\",\"endpoints\":[{\"id\":\"ep-000\",\"path\":\"/v2/telemetry/gw5978x49\",\"method\":\"GET\",\"latency_ms\":219,\"owner\":\"team-0\",\"limit\":{\"burst\":221,\"sustained\":149}},{\"id\":\"ep-001\",\"path\":\"/v2/telemetry/gw6279x77\",\"method\":\"POST\",\"latency_ms\":456,\"owner\":\"team-1\",\"limit\":{\"burst\":227,\"sustained\":173}},{\"id\":\"ep-002\",\"path\":\"/v2/telemetry/gw4501x82\",\"method\":\"PUT\",\"latency_ms\":488,\"owner\":\"team-2\",\"limit\":{\"burst\":407,\"sustained\":189}},{\"id\":\"ep-003\",\"path\":\"/v2/telemetry/gw3780xA8\",\"method\":\"DELETE\",\"latency_ms\":90,\"owner\":\"team-3\",\"limit\":{\"burst\":146,\"sustained\":132}},{\"id\":\"ep-004\",\"path\":\"/v2/telemetry/gw6491x17\",\"method\":\"GET\",\"latency_ms\":842,\"owner\":\"team-4\",\"limit\":{\"burst\":488,\"sustained\":193}},{\"id\":\"ep-005\",\"path\":\"/v2/telemetry/gw4848xAC\",\"method\":\"POST\",\"latency_ms\":321,\"owner\":\"team-5\",\"limit\":{\"burst\":116,\"sustained\":51}},{\"id\":\"ep-006\",\"path\":\"/v2/telemetry/gw3414x06\",\"method\":\"PUT\",\"latency_ms\":51,\"owner\":\"team-6\",\"limit\":{\"burst\":126,\"sustained\":122}},{\"id\":\"ep-007\",\"path\":\"/v2/telemetry/gw2193x74\",\"method\":\"DELETE\",\"latency_ms\":428,\"owner\":\"team-0\",\"limit\":{\"burst\":454,\"sustained\":162}},{\"id\":\"ep-008\",\"path\":\"/v2/telemetry/gw4185xB7\",\"method\":\"GET\",\"latency_ms\":717,\"owner\":\"team-1\",\"limit\":{\"burst\":197,\"sustained\":127}},{\"id\":\"ep-009\",\"path\":\"/v2/telemetry/gw7547x3E\",\"method\":\"POST\",\"latency_ms\":155,\"owner\":\"team-2\",\"limit\":{\"burst\":336,\"sustained\":177}},{\"id\":\"ep-010\",\"path\":\"/v2/telemetry/gw1090xE4\",\"method\":\"PUT\",\"latency_ms\":772,\"owner\":\"team-3\",\"limit\":{\"burst\":441,\"sustained\":198}},{\"id\":\"ep-011\",\"path\":\"/v2/telemetry/gw2746xC7\",\"method\":\"DELETE\",\"latency_ms\":439,\"owner\":\"team-4\",\"limit\":{\"burst\":113,\"sustained\":46}},{\"id\":\"ep-012\",\"path\":\"/v2/telemetry/gw9486x76\",\"method\":\"GET\",\"latency_ms\":55,\"owner\":\"team-5\",\"limit\":{\"burst\":286,\"sustained\":64}},{\"id\":\"ep-013\",\"path\":\"/v2/telemetry/gw2988x74\",\"method\":\"POST\",\"latency_ms\":140,\"owner\":\"team-6\",\"limit\":{\"burst\":411,\"sustained\":119}},{\"id\":\"ep-014\",\"path\":\"/v2/telemetry/gw9702xFC\",\"method\":\"PUT\",\"latency_ms\":576,\"owner\":\"team-0\",\"limit\":{\"burst\":305,\"sustained\":82}},{\"id\":\"ep-015\",\"path\":\"/v2/telemetry/gw8251x9C\",\"method\":\"DELETE\",\"latency_ms\":838,\"owner\":\"team-1\",\"limit\":{\"burst\":369,\"sustained\":130}},{\"id\":\"ep-016\",\"path\":\"/v2/telemetry/gw7991xD4\",\"method\":\"GET\",\"latency_ms\":565,\"owner\":\"team-2\",\"limit\":{\"burst\":229,\"sustained\":41}},{\"id\":\"ep-017\",\"path\":\"/v2/telemetry/gw8777x73\",\"method\":\"POST\",\"latency_ms\":269,\"owner\":\"team-3\",\"limit\":{\"burst\":385,\"sustained\":64}},{\"id\":\"ep-018\",\"path\":\"/v2/telemetry/gw5543xC4\",\"method\":\"PUT\",\"latency_ms\":800,\"owner\":\"team-4\",\"limit\":{\"burst\":267,\"sustained\":125}},{\"id\":\"ep-019\",\"path\":\"/v2/telemetry/gw4919x46\",\"method\":\"DELETE\",\"latency_ms\":454,\"owner\":\"team-5\",\"limit\":{\"burst\":40,\"sustained\":183}},{\"id\":\"ep-020\",\"path\":\"/v2/telemetry/gw5681x3C\",\"method\":\"GET\",\"latency_ms\":282,\"owner\":\"team-6\",\"limit\":{\"burst\":172,\"sustained\":82}},{\"id\":\"ep-021\",\"path\":\"/v2/telemetry/gw9849x14\",\"method\":\"POST\",\"latency_ms\":145,\"owner\":\"team-0\",\"limit\":{\"burst\":78,\"sustained\":60}},{\"id\":\"ep-022\",\"path\":\"/v2/telemetry/gw7275xB1\",\"method\":\"PUT\",\"latency_ms\":160,\"owner\":\"team-1\",\"limit\":{\"burst\":362,\"sustained\":55}},{\"id\":\"ep-023\",\"path\":\"/v2/telemetry/gw2052x6A\",\"method\":\"DELETE\",\"latency_ms\":421,\"owner\":\"team-2\",\"limit\":{\"burst\":170,\"sustained\":139}},{\"id\":\"ep-024\",\"path\":\"/v2/telemetry/gw8633x6A\",\"method\":\"GET\",\"latency_ms\":67,\"owner\":\"team-3\",\"limit\":{\"burst\":106,\"sustained\":108}},{\"id\":\"ep-025\",\"path\":\"/v2/telemetry/gw7381xE7\",\"method\":\"POST\",\"latency_ms\":792,\"owner\":\"team-4\",\"limit\":{\"burst\":300,\"sustained\":179}},{\"id\":\"ep-026\",\"path\":\"/v2/telemetry/gw1320xDB\",\"method\":\"PUT\",\"latency_ms\":787,\"owner\":\"team-5\",\"limit\":{\"burst\":295,\"sustained\":98}},{\"id\":\"ep-027\",\"path\":\"/v2/telemetry/gw8814x01\",\"method\":\"DELETE\",\"latency_ms\":364,\"owner\":\"team-6\",\"limit\":{\"burst\":153,\"sustained\":193}},{\"id\":\"ep-028\",\"path\":\"/v2/telemetry/gw7389xDA\",\"method\":\"GET\",\"latency_ms\":859,\"owner\":\"team-0\",\"limit\":{\"burst\":215,\"sustained\":138}},{\"id\":\"ep-029\",\"path\":\"/v2/telemetry/gw9947xCC\",\"method\":\"POST\",\"latency_ms\":621,\"owner\":\"team-1\",\"limit\":{\"burst\":460,\"sustained\":57}},{\"id\":\"ep-030\",\"path\":\"/v2/telemetry/gw8999x38\",\"method\":\"PUT\",\"latency_ms\":283,\"owner\":\"team-2\",\"limit\":{\"burst\":224,\"sustained\":125}},{\"id\":\"ep-031\",\"path\":\"/v2/telemetry/gw1475x63\",\"method\":\"DELETE\",\"latency_ms\":348,\"owner\":\"team-3\",\"limit\":{\"burst\":343,\"sustained\":174}},{\"id\":\"ep-032\",\"path\":\"/v2/telemetry/gw7624xB9\",\"method\":\"GET\",\"latency_ms\":173,\"owner\":\"team-4\",\"limit\":{\"burst\":431,\"sustained\":120}},{\"id\":\"ep-033\",\"path\":\"/v2/telemetry/gw3091xFB\",\"method\":\"POST\",\"latency_ms\":641,\"owner\":\"team-5\",\"limit\":{\"burst\":274,\"sustained\":7}},{\"id\":\"ep-034\",\"path\":\"/v2/telemetry/gw7455x97\",\"method\":\"PUT\",\"latency_ms\":581,\"owner\":\"team-6\",\"limit\":{\"burst\":340,\"sustained\":7}},{\"id\":\"ep-035\",\"path\":\"/v2/telemetry/gw2375xA4\",\"method\":\"DELETE\",\"latency_ms\":442,\"owner\":\"team-0\",\"limit\":{\"burst\":70,\"sustained\":119}},{\"id\":\"ep-036\",\"path\":\"/v2/telemetry/gw3977x0C\",\"method\":\"GET\",\"latency_ms\":270,\"owner\":\"team-1\",\"limit\":{\"burst\":195,\"sustained\":84}},{\"id\":\"ep-037\",\"path\":\"/v2/telemetry/gw4467x74\",\"method\":\"POST\",\"latency_ms\":338,\"owner\":\"team-2\",\"limit\":{\"burst\":173,\"sustained\":195}},{\"id\":\"ep-038\",\"path\":\"/v2/telemetry/gw7211x47\",\"method\":\"PUT\",\"latency_ms\":774,\"owner\":\"team-3\",\"limit\":{\"burst\":488,\"sustained\":108}},{\"id\":\"ep-039\",\"path\":\"/v2/telemetry/gw5133xD5\",\"method\":\"DELETE\",\"latency_ms\":87,\"owner\":\"team-4\",\"limit\":{\"burst\":241,\"sustained\":5}}]}\n\nSCHEMA B (restated, identical to A):\n{\"version\":\"2.3.1\",\"endpoints\":[{\"id\":\"ep-000\",\"path\":\"/v2/telemetry/gw5978x49\",\"method\":\"GET\",\"latency_ms\":219,\"owner\":\"team-0\",\"limit\":{\"burst\":221,\"sustained\":149}},{\"id\":\"ep-001\",\"path\":\"/v2/telemetry/gw6279x77\",\"method\":\"POST\",\"latency_ms\":456,\"owner\":\"team-1\",\"limit\":{\"burst\":227,\"sustained\":173}},{\"id\":\"ep-002\",\"path\":\"/v2/telemetry/gw4501x82\",\"method\":\"PUT\",\"latency_ms\":488,\"owner\":\"team-2\",\"limit\":{\"burst\":407,\"sustained\":189}},{\"id\":\"ep-003\",\"path\":\"/v2/telemetry/gw3780xA8\",\"method\":\"DELETE\",\"latency_ms\":90,\"owner\":\"team-3\",\"limit\":{\"burst\":146,\"sustained\":132}},{\"id\":\"ep-004\",\"path\":\"/v2/telemetry/gw6491x17\",\"method\":\"GET\",\"latency_ms\":842,\"owner\":\"team-4\",\"limit\":{\"burst\":488,\"sustained\":193}},{\"id\":\"ep-005\",\"path\":\"/v2/telemetry/gw4848xAC\",\"method\":\"POST\",\"latency_ms\":321,\"owner\":\"team-5\",\"limit\":{\"burst\":116,\"sustained\":51}},{\"id\":\"ep-006\",\"path\":\"/v2/telemetry/gw3414x06\",\"method\":\"PUT\",\"latency_ms\":51,\"owner\":\"team-6\",\"limit\":{\"burst\":126,\"sustained\":122}},{\"id\":\"ep-007\",\"path\":\"/v2/telemetry/gw2193x74\",\"method\":\"DELETE\",\"latency_ms\":428,\"owner\":\"team-0\",\"limit\":{\"burst\":454,\"sustained\":162}},{\"id\":\"ep-008\",\"path\":\"/v2/telemetry/gw4185xB7\",\"method\":\"GET\",\"latency_ms\":717,\"owner\":\"team-1\",\"limit\":{\"burst\":197,\"sustained\":127}},{\"id\":\"ep-009\",\"path\":\"/v2/telemetry/gw7547x3E\",\"method\":\"POST\",\"latency_ms\":155,\"owner\":\"team-2\",\"limit\":{\"burst\":336,\"sustained\":177}},{\"id\":\"ep-010\",\"path\":\"/v2/telemetry/gw1090xE4\",\"method\":\"PUT\",\"latency_ms\":772,\"owner\":\"team-3\",\"limit\":{\"burst\":441,\"sustained\":198}},{\"id\":\"ep-011\",\"path\":\"/v2/telemetry/gw2746xC7\",\"method\":\"DELETE\",\"latency_ms\":439,\"owner\":\"team-4\",\"limit\":{\"burst\":113,\"sustained\":46}},{\"id\":\"ep-012\",\"path\":\"/v2/telemetry/gw9486x76\",\"method\":\"GET\",\"latency_ms\":55,\"owner\":\"team-5\",\"limit\":{\"burst\":286,\"sustained\":64}},{\"id\":\"ep-013\",\"path\":\"/v2/telemetry/gw2988x74\",\"method\":\"POST\",\"latency_ms\":140,\"owner\":\"team-6\",\"limit\":{\"burst\":411,\"sustained\":119}},{\"id\":\"ep-014\",\"path\":\"/v2/telemetry/gw9702xFC\",\"method\":\"PUT\",\"latency_ms\":576,\"owner\":\"team-0\",\"limit\":{\"burst\":305,\"sustained\":82}},{\"id\":\"ep-015\",\"path\":\"/v2/telemetry/gw8251x9C\",\"method\":\"DELETE\",\"latency_ms\":838,\"owner\":\"team-1\",\"limit\":{\"burst\":369,\"sustained\":130}},{\"id\":\"ep-016\",\"path\":\"/v2/telemetry/gw7991xD4\",\"method\":\"GET\",\"latency_ms\":565,\"owner\":\"team-2\",\"limit\":{\"burst\":229,\"sustained\":41}},{\"id\":\"ep-017\",\"path\":\"/v2/telemetry/gw8777x73\",\"method\":\"POST\",\"latency_ms\":269,\"owner\":\"team-3\",\"limit\":{\"burst\":385,\"sustained\":64}},{\"id\":\"ep-018\",\"path\":\"/v2/telemetry/gw5543xC4\",\"method\":\"PUT\",\"latency_ms\":800,\"owner\":\"team-4\",\"limit\":{\"burst\":267,\"sustained\":125}},{\"id\":\"ep-019\",\"path\":\"/v2/telemetry/gw4919x46\",\"method\":\"DELETE\",\"latency_ms\":454,\"owner\":\"team-5\",\"limit\":{\"burst\":40,\"sustained\":183}},{\"id\":\"ep-020\",\"path\":\"/v2/telemetry/gw5681x3C\",\"method\":\"GET\",\"latency_ms\":282,\"owner\":\"team-6\",\"limit\":{\"burst\":172,\"sustained\":82}},{\"id\":\"ep-021\",\"path\":\"/v2/telemetry/gw9849x14\",\"method\":\"POST\",\"latency_ms\":145,\"owner\":\"team-0\",\"limit\":{\"burst\":78,\"sustained\":60}},{\"id\":\"ep-022\",\"path\":\"/v2/telemetry/gw7275xB1\",\"method\":\"PUT\",\"latency_ms\":160,\"owner\":\"team-1\",\"limit\":{\"burst\":362,\"sustained\":55}},{\"id\":\"ep-023\",\"path\":\"/v2/telemetry/gw2052x6A\",\"method\":\"DELETE\",\"latency_ms\":421,\"owner\":\"team-2\",\"limit\":{\"burst\":170,\"sustained\":139}},{\"id\":\"ep-024\",\"path\":\"/v2/telemetry/gw8633x6A\",\"method\":\"GET\",\"latency_ms\":67,\"owner\":\"team-3\",\"limit\":{\"burst\":106,\"sustained\":108}},{\"id\":\"ep-025\",\"path\":\"/v2/telemetry/gw7381xE7\",\"method\":\"POST\",\"latency_ms\":792,\"owner\":\"team-4\",\"limit\":{\"burst\":300,\"sustained\":179}},{\"id\":\"ep-026\",\"path\":\"/v2/telemetry/gw1320xDB\",\"method\":\"PUT\",\"latency_ms\":787,\"owner\":\"team-5\",\"limit\":{\"burst\":295,\"sustained\":98}},{\"id\":\"ep-027\",\"path\":\"/v2/telemetry/gw8814x01\",\"method\":\"DELETE\",\"latency_ms\":364,\"owner\":\"team-6\",\"limit\":{\"burst\":153,\"sustained\":193}},{\"id\":\"ep-028\",\"path\":\"/v2/telemetry/gw7389xDA\",\"method\":\"GET\",\"latency_ms\":859,\"owner\":\"team-0\",\"limit\":{\"burst\":215,\"sustained\":138}},{\"id\":\"ep-029\",\"path\":\"/v2/telemetry/gw9947xCC\",\"method\":\"POST\",\"latency_ms\":621,\"owner\":\"team-1\",\"limit\":{\"burst\":460,\"sustained\":57}},{\"id\":\"ep-030\",\"path\":\"/v2/telemetry/gw8999x38\",\"method\":\"PUT\",\"latency_ms\":283,\"owner\":\"team-2\",\"limit\":{\"burst\":224,\"sustained\":125}},{\"id\":\"ep-031\",\"path\":\"/v2/telemetry/gw1475x63\",\"method\":\"DELETE\",\"latency_ms\":348,\"owner\":\"team-3\",\"limit\":{\"burst\":343,\"sustained\":174}},{\"id\":\"ep-032\",\"path\":\"/v2/telemetry/gw7624xB9\",\"method\":\"GET\",\"latency_ms\":173,\"owner\":\"team-4\",\"limit\":{\"burst\":431,\"sustained\":120}},{\"id\":\"ep-033\",\"path\":\"/v2/telemetry/gw3091xFB\",\"method\":\"POST\",\"latency_ms\":641,\"owner\":\"team-5\",\"limit\":{\"burst\":274,\"sustained\":7}},{\"id\":\"ep-034\",\"path\":\"/v2/telemetry/gw7455x97\",\"method\":\"PUT\",\"latency_ms\":581,\"owner\":\"team-6\",\"limit\":{\"burst\":340,\"sustained\":7}},{\"id\":\"ep-035\",\"path\":\"/v2/telemetry/gw2375xA4\",\"method\":\"DELETE\",\"latency_ms\":442,\"owner\":\"team-0\",\"limit\":{\"burst\":70,\"sustained\":119}},{\"id\":\"ep-036\",\"path\":\"/v2/telemetry/gw3977x0C\",\"method\":\"GET\",\"latency_ms\":270,\"owner\":\"team-1\",\"limit\":{\"burst\":195,\"sustained\":84}},{\"id\":\"ep-037\",\"path\":\"/v2/telemetry/gw4467x74\",\"method\":\"POST\",\"latency_ms\":338,\"owner\":\"team-2\",\"limit\":{\"burst\":173,\"sustained\":195}},{\"id\":\"ep-038\",\"path\":\"/v2/telemetry/gw7211x47\",\"method\":\"PUT\",\"latency_ms\":774,\"owner\":\"team-3\",\"limit\":{\"burst\":488,\"sustained\":108}},{\"id\":\"ep-039\",\"path\":\"/v2/telemetry/gw5133xD5\",\"method\":\"DELETE\",\"latency_ms\":87,\"owner\":\"team-4\",\"limit\":{\"burst\":241,\"sustained\":5}}]}\n\nOutput SCHEMA B verbatim now:", "max_tokens": 400, "temperature": 0, "cache_prompt": false, "stream": false} \ No newline at end of file +{"model": "frank-dragoon", "prompt": "Below is a telemetry API schema, labeled SCHEMA A. Later in this message the same schema is repeated word for word, labeled SCHEMA B.\nTask: output SCHEMA B verbatim, with no commentary and no reformatting, starting immediately with the opening brace.\n\nSCHEMA A:\n{\"version\":\"2.3.1\",\"endpoints\":[{\"id\":\"ep-000\",\"path\":\"/v2/telemetry/gw5978x49\",\"method\":\"GET\",\"latency_ms\":219,\"owner\":\"team-0\",\"limit\":{\"burst\":221,\"sustained\":149}},{\"id\":\"ep-001\",\"path\":\"/v2/telemetry/gw6279x77\",\"method\":\"POST\",\"latency_ms\":456,\"owner\":\"team-1\",\"limit\":{\"burst\":227,\"sustained\":173}},{\"id\":\"ep-002\",\"path\":\"/v2/telemetry/gw4501x82\",\"method\":\"PUT\",\"latency_ms\":488,\"owner\":\"team-2\",\"limit\":{\"burst\":407,\"sustained\":189}},{\"id\":\"ep-003\",\"path\":\"/v2/telemetry/gw3780xA8\",\"method\":\"DELETE\",\"latency_ms\":90,\"owner\":\"team-3\",\"limit\":{\"burst\":146,\"sustained\":132}},{\"id\":\"ep-004\",\"path\":\"/v2/telemetry/gw6491x17\",\"method\":\"GET\",\"latency_ms\":842,\"owner\":\"team-4\",\"limit\":{\"burst\":488,\"sustained\":193}},{\"id\":\"ep-005\",\"path\":\"/v2/telemetry/gw4848xAC\",\"method\":\"POST\",\"latency_ms\":321,\"owner\":\"team-5\",\"limit\":{\"burst\":116,\"sustained\":51}},{\"id\":\"ep-006\",\"path\":\"/v2/telemetry/gw3414x06\",\"method\":\"PUT\",\"latency_ms\":51,\"owner\":\"team-6\",\"limit\":{\"burst\":126,\"sustained\":122}},{\"id\":\"ep-007\",\"path\":\"/v2/telemetry/gw2193x74\",\"method\":\"DELETE\",\"latency_ms\":428,\"owner\":\"team-0\",\"limit\":{\"burst\":454,\"sustained\":162}},{\"id\":\"ep-008\",\"path\":\"/v2/telemetry/gw4185xB7\",\"method\":\"GET\",\"latency_ms\":717,\"owner\":\"team-1\",\"limit\":{\"burst\":197,\"sustained\":127}},{\"id\":\"ep-009\",\"path\":\"/v2/telemetry/gw7547x3E\",\"method\":\"POST\",\"latency_ms\":155,\"owner\":\"team-2\",\"limit\":{\"burst\":336,\"sustained\":177}},{\"id\":\"ep-010\",\"path\":\"/v2/telemetry/gw1090xE4\",\"method\":\"PUT\",\"latency_ms\":772,\"owner\":\"team-3\",\"limit\":{\"burst\":441,\"sustained\":198}},{\"id\":\"ep-011\",\"path\":\"/v2/telemetry/gw2746xC7\",\"method\":\"DELETE\",\"latency_ms\":439,\"owner\":\"team-4\",\"limit\":{\"burst\":113,\"sustained\":46}},{\"id\":\"ep-012\",\"path\":\"/v2/telemetry/gw9486x76\",\"method\":\"GET\",\"latency_ms\":55,\"owner\":\"team-5\",\"limit\":{\"burst\":286,\"sustained\":64}},{\"id\":\"ep-013\",\"path\":\"/v2/telemetry/gw2988x74\",\"method\":\"POST\",\"latency_ms\":140,\"owner\":\"team-6\",\"limit\":{\"burst\":411,\"sustained\":119}},{\"id\":\"ep-014\",\"path\":\"/v2/telemetry/gw9702xFC\",\"method\":\"PUT\",\"latency_ms\":576,\"owner\":\"team-0\",\"limit\":{\"burst\":305,\"sustained\":82}},{\"id\":\"ep-015\",\"path\":\"/v2/telemetry/gw8251x9C\",\"method\":\"DELETE\",\"latency_ms\":838,\"owner\":\"team-1\",\"limit\":{\"burst\":369,\"sustained\":130}},{\"id\":\"ep-016\",\"path\":\"/v2/telemetry/gw7991xD4\",\"method\":\"GET\",\"latency_ms\":565,\"owner\":\"team-2\",\"limit\":{\"burst\":229,\"sustained\":41}},{\"id\":\"ep-017\",\"path\":\"/v2/telemetry/gw8777x73\",\"method\":\"POST\",\"latency_ms\":269,\"owner\":\"team-3\",\"limit\":{\"burst\":385,\"sustained\":64}},{\"id\":\"ep-018\",\"path\":\"/v2/telemetry/gw5543xC4\",\"method\":\"PUT\",\"latency_ms\":800,\"owner\":\"team-4\",\"limit\":{\"burst\":267,\"sustained\":125}},{\"id\":\"ep-019\",\"path\":\"/v2/telemetry/gw4919x46\",\"method\":\"DELETE\",\"latency_ms\":454,\"owner\":\"team-5\",\"limit\":{\"burst\":40,\"sustained\":183}},{\"id\":\"ep-020\",\"path\":\"/v2/telemetry/gw5681x3C\",\"method\":\"GET\",\"latency_ms\":282,\"owner\":\"team-6\",\"limit\":{\"burst\":172,\"sustained\":82}},{\"id\":\"ep-021\",\"path\":\"/v2/telemetry/gw9849x14\",\"method\":\"POST\",\"latency_ms\":145,\"owner\":\"team-0\",\"limit\":{\"burst\":78,\"sustained\":60}},{\"id\":\"ep-022\",\"path\":\"/v2/telemetry/gw7275xB1\",\"method\":\"PUT\",\"latency_ms\":160,\"owner\":\"team-1\",\"limit\":{\"burst\":362,\"sustained\":55}},{\"id\":\"ep-023\",\"path\":\"/v2/telemetry/gw2052x6A\",\"method\":\"DELETE\",\"latency_ms\":421,\"owner\":\"team-2\",\"limit\":{\"burst\":170,\"sustained\":139}},{\"id\":\"ep-024\",\"path\":\"/v2/telemetry/gw8633x6A\",\"method\":\"GET\",\"latency_ms\":67,\"owner\":\"team-3\",\"limit\":{\"burst\":106,\"sustained\":108}},{\"id\":\"ep-025\",\"path\":\"/v2/telemetry/gw7381xE7\",\"method\":\"POST\",\"latency_ms\":792,\"owner\":\"team-4\",\"limit\":{\"burst\":300,\"sustained\":179}},{\"id\":\"ep-026\",\"path\":\"/v2/telemetry/gw1320xDB\",\"method\":\"PUT\",\"latency_ms\":787,\"owner\":\"team-5\",\"limit\":{\"burst\":295,\"sustained\":98}},{\"id\":\"ep-027\",\"path\":\"/v2/telemetry/gw8814x01\",\"method\":\"DELETE\",\"latency_ms\":364,\"owner\":\"team-6\",\"limit\":{\"burst\":153,\"sustained\":193}},{\"id\":\"ep-028\",\"path\":\"/v2/telemetry/gw7389xDA\",\"method\":\"GET\",\"latency_ms\":859,\"owner\":\"team-0\",\"limit\":{\"burst\":215,\"sustained\":138}},{\"id\":\"ep-029\",\"path\":\"/v2/telemetry/gw9947xCC\",\"method\":\"POST\",\"latency_ms\":621,\"owner\":\"team-1\",\"limit\":{\"burst\":460,\"sustained\":57}},{\"id\":\"ep-030\",\"path\":\"/v2/telemetry/gw8999x38\",\"method\":\"PUT\",\"latency_ms\":283,\"owner\":\"team-2\",\"limit\":{\"burst\":224,\"sustained\":125}},{\"id\":\"ep-031\",\"path\":\"/v2/telemetry/gw1475x63\",\"method\":\"DELETE\",\"latency_ms\":348,\"owner\":\"team-3\",\"limit\":{\"burst\":343,\"sustained\":174}},{\"id\":\"ep-032\",\"path\":\"/v2/telemetry/gw7624xB9\",\"method\":\"GET\",\"latency_ms\":173,\"owner\":\"team-4\",\"limit\":{\"burst\":431,\"sustained\":120}},{\"id\":\"ep-033\",\"path\":\"/v2/telemetry/gw3091xFB\",\"method\":\"POST\",\"latency_ms\":641,\"owner\":\"team-5\",\"limit\":{\"burst\":274,\"sustained\":7}},{\"id\":\"ep-034\",\"path\":\"/v2/telemetry/gw7455x97\",\"method\":\"PUT\",\"latency_ms\":581,\"owner\":\"team-6\",\"limit\":{\"burst\":340,\"sustained\":7}},{\"id\":\"ep-035\",\"path\":\"/v2/telemetry/gw2375xA4\",\"method\":\"DELETE\",\"latency_ms\":442,\"owner\":\"team-0\",\"limit\":{\"burst\":70,\"sustained\":119}},{\"id\":\"ep-036\",\"path\":\"/v2/telemetry/gw3977x0C\",\"method\":\"GET\",\"latency_ms\":270,\"owner\":\"team-1\",\"limit\":{\"burst\":195,\"sustained\":84}},{\"id\":\"ep-037\",\"path\":\"/v2/telemetry/gw4467x74\",\"method\":\"POST\",\"latency_ms\":338,\"owner\":\"team-2\",\"limit\":{\"burst\":173,\"sustained\":195}},{\"id\":\"ep-038\",\"path\":\"/v2/telemetry/gw7211x47\",\"method\":\"PUT\",\"latency_ms\":774,\"owner\":\"team-3\",\"limit\":{\"burst\":488,\"sustained\":108}},{\"id\":\"ep-039\",\"path\":\"/v2/telemetry/gw5133xD5\",\"method\":\"DELETE\",\"latency_ms\":87,\"owner\":\"team-4\",\"limit\":{\"burst\":241,\"sustained\":5}}]}\n\nSCHEMA B (restated, identical to A):\n{\"version\":\"2.3.1\",\"endpoints\":[{\"id\":\"ep-000\",\"path\":\"/v2/telemetry/gw5978x49\",\"method\":\"GET\",\"latency_ms\":219,\"owner\":\"team-0\",\"limit\":{\"burst\":221,\"sustained\":149}},{\"id\":\"ep-001\",\"path\":\"/v2/telemetry/gw6279x77\",\"method\":\"POST\",\"latency_ms\":456,\"owner\":\"team-1\",\"limit\":{\"burst\":227,\"sustained\":173}},{\"id\":\"ep-002\",\"path\":\"/v2/telemetry/gw4501x82\",\"method\":\"PUT\",\"latency_ms\":488,\"owner\":\"team-2\",\"limit\":{\"burst\":407,\"sustained\":189}},{\"id\":\"ep-003\",\"path\":\"/v2/telemetry/gw3780xA8\",\"method\":\"DELETE\",\"latency_ms\":90,\"owner\":\"team-3\",\"limit\":{\"burst\":146,\"sustained\":132}},{\"id\":\"ep-004\",\"path\":\"/v2/telemetry/gw6491x17\",\"method\":\"GET\",\"latency_ms\":842,\"owner\":\"team-4\",\"limit\":{\"burst\":488,\"sustained\":193}},{\"id\":\"ep-005\",\"path\":\"/v2/telemetry/gw4848xAC\",\"method\":\"POST\",\"latency_ms\":321,\"owner\":\"team-5\",\"limit\":{\"burst\":116,\"sustained\":51}},{\"id\":\"ep-006\",\"path\":\"/v2/telemetry/gw3414x06\",\"method\":\"PUT\",\"latency_ms\":51,\"owner\":\"team-6\",\"limit\":{\"burst\":126,\"sustained\":122}},{\"id\":\"ep-007\",\"path\":\"/v2/telemetry/gw2193x74\",\"method\":\"DELETE\",\"latency_ms\":428,\"owner\":\"team-0\",\"limit\":{\"burst\":454,\"sustained\":162}},{\"id\":\"ep-008\",\"path\":\"/v2/telemetry/gw4185xB7\",\"method\":\"GET\",\"latency_ms\":717,\"owner\":\"team-1\",\"limit\":{\"burst\":197,\"sustained\":127}},{\"id\":\"ep-009\",\"path\":\"/v2/telemetry/gw7547x3E\",\"method\":\"POST\",\"latency_ms\":155,\"owner\":\"team-2\",\"limit\":{\"burst\":336,\"sustained\":177}},{\"id\":\"ep-010\",\"path\":\"/v2/telemetry/gw1090xE4\",\"method\":\"PUT\",\"latency_ms\":772,\"owner\":\"team-3\",\"limit\":{\"burst\":441,\"sustained\":198}},{\"id\":\"ep-011\",\"path\":\"/v2/telemetry/gw2746xC7\",\"method\":\"DELETE\",\"latency_ms\":439,\"owner\":\"team-4\",\"limit\":{\"burst\":113,\"sustained\":46}},{\"id\":\"ep-012\",\"path\":\"/v2/telemetry/gw9486x76\",\"method\":\"GET\",\"latency_ms\":55,\"owner\":\"team-5\",\"limit\":{\"burst\":286,\"sustained\":64}},{\"id\":\"ep-013\",\"path\":\"/v2/telemetry/gw2988x74\",\"method\":\"POST\",\"latency_ms\":140,\"owner\":\"team-6\",\"limit\":{\"burst\":411,\"sustained\":119}},{\"id\":\"ep-014\",\"path\":\"/v2/telemetry/gw9702xFC\",\"method\":\"PUT\",\"latency_ms\":576,\"owner\":\"team-0\",\"limit\":{\"burst\":305,\"sustained\":82}},{\"id\":\"ep-015\",\"path\":\"/v2/telemetry/gw8251x9C\",\"method\":\"DELETE\",\"latency_ms\":838,\"owner\":\"team-1\",\"limit\":{\"burst\":369,\"sustained\":130}},{\"id\":\"ep-016\",\"path\":\"/v2/telemetry/gw7991xD4\",\"method\":\"GET\",\"latency_ms\":565,\"owner\":\"team-2\",\"limit\":{\"burst\":229,\"sustained\":41}},{\"id\":\"ep-017\",\"path\":\"/v2/telemetry/gw8777x73\",\"method\":\"POST\",\"latency_ms\":269,\"owner\":\"team-3\",\"limit\":{\"burst\":385,\"sustained\":64}},{\"id\":\"ep-018\",\"path\":\"/v2/telemetry/gw5543xC4\",\"method\":\"PUT\",\"latency_ms\":800,\"owner\":\"team-4\",\"limit\":{\"burst\":267,\"sustained\":125}},{\"id\":\"ep-019\",\"path\":\"/v2/telemetry/gw4919x46\",\"method\":\"DELETE\",\"latency_ms\":454,\"owner\":\"team-5\",\"limit\":{\"burst\":40,\"sustained\":183}},{\"id\":\"ep-020\",\"path\":\"/v2/telemetry/gw5681x3C\",\"method\":\"GET\",\"latency_ms\":282,\"owner\":\"team-6\",\"limit\":{\"burst\":172,\"sustained\":82}},{\"id\":\"ep-021\",\"path\":\"/v2/telemetry/gw9849x14\",\"method\":\"POST\",\"latency_ms\":145,\"owner\":\"team-0\",\"limit\":{\"burst\":78,\"sustained\":60}},{\"id\":\"ep-022\",\"path\":\"/v2/telemetry/gw7275xB1\",\"method\":\"PUT\",\"latency_ms\":160,\"owner\":\"team-1\",\"limit\":{\"burst\":362,\"sustained\":55}},{\"id\":\"ep-023\",\"path\":\"/v2/telemetry/gw2052x6A\",\"method\":\"DELETE\",\"latency_ms\":421,\"owner\":\"team-2\",\"limit\":{\"burst\":170,\"sustained\":139}},{\"id\":\"ep-024\",\"path\":\"/v2/telemetry/gw8633x6A\",\"method\":\"GET\",\"latency_ms\":67,\"owner\":\"team-3\",\"limit\":{\"burst\":106,\"sustained\":108}},{\"id\":\"ep-025\",\"path\":\"/v2/telemetry/gw7381xE7\",\"method\":\"POST\",\"latency_ms\":792,\"owner\":\"team-4\",\"limit\":{\"burst\":300,\"sustained\":179}},{\"id\":\"ep-026\",\"path\":\"/v2/telemetry/gw1320xDB\",\"method\":\"PUT\",\"latency_ms\":787,\"owner\":\"team-5\",\"limit\":{\"burst\":295,\"sustained\":98}},{\"id\":\"ep-027\",\"path\":\"/v2/telemetry/gw8814x01\",\"method\":\"DELETE\",\"latency_ms\":364,\"owner\":\"team-6\",\"limit\":{\"burst\":153,\"sustained\":193}},{\"id\":\"ep-028\",\"path\":\"/v2/telemetry/gw7389xDA\",\"method\":\"GET\",\"latency_ms\":859,\"owner\":\"team-0\",\"limit\":{\"burst\":215,\"sustained\":138}},{\"id\":\"ep-029\",\"path\":\"/v2/telemetry/gw9947xCC\",\"method\":\"POST\",\"latency_ms\":621,\"owner\":\"team-1\",\"limit\":{\"burst\":460,\"sustained\":57}},{\"id\":\"ep-030\",\"path\":\"/v2/telemetry/gw8999x38\",\"method\":\"PUT\",\"latency_ms\":283,\"owner\":\"team-2\",\"limit\":{\"burst\":224,\"sustained\":125}},{\"id\":\"ep-031\",\"path\":\"/v2/telemetry/gw1475x63\",\"method\":\"DELETE\",\"latency_ms\":348,\"owner\":\"team-3\",\"limit\":{\"burst\":343,\"sustained\":174}},{\"id\":\"ep-032\",\"path\":\"/v2/telemetry/gw7624xB9\",\"method\":\"GET\",\"latency_ms\":173,\"owner\":\"team-4\",\"limit\":{\"burst\":431,\"sustained\":120}},{\"id\":\"ep-033\",\"path\":\"/v2/telemetry/gw3091xFB\",\"method\":\"POST\",\"latency_ms\":641,\"owner\":\"team-5\",\"limit\":{\"burst\":274,\"sustained\":7}},{\"id\":\"ep-034\",\"path\":\"/v2/telemetry/gw7455x97\",\"method\":\"PUT\",\"latency_ms\":581,\"owner\":\"team-6\",\"limit\":{\"burst\":340,\"sustained\":7}},{\"id\":\"ep-035\",\"path\":\"/v2/telemetry/gw2375xA4\",\"method\":\"DELETE\",\"latency_ms\":442,\"owner\":\"team-0\",\"limit\":{\"burst\":70,\"sustained\":119}},{\"id\":\"ep-036\",\"path\":\"/v2/telemetry/gw3977x0C\",\"method\":\"GET\",\"latency_ms\":270,\"owner\":\"team-1\",\"limit\":{\"burst\":195,\"sustained\":84}},{\"id\":\"ep-037\",\"path\":\"/v2/telemetry/gw4467x74\",\"method\":\"POST\",\"latency_ms\":338,\"owner\":\"team-2\",\"limit\":{\"burst\":173,\"sustained\":195}},{\"id\":\"ep-038\",\"path\":\"/v2/telemetry/gw7211x47\",\"method\":\"PUT\",\"latency_ms\":774,\"owner\":\"team-3\",\"limit\":{\"burst\":488,\"sustained\":108}},{\"id\":\"ep-039\",\"path\":\"/v2/telemetry/gw5133xD5\",\"method\":\"DELETE\",\"latency_ms\":87,\"owner\":\"team-4\",\"limit\":{\"burst\":241,\"sustained\":5}}]}\n\nOutput SCHEMA B verbatim now:", "max_tokens": 400, "temperature": 0, "cache_prompt": false, "stream": false} \ No newline at end of file diff --git a/old/download-frank-primary-fp8.sh b/old/download-frank-archon-fp8.sh similarity index 80% rename from old/download-frank-primary-fp8.sh rename to old/download-frank-archon-fp8.sh index 6a1b200..a262099 100755 --- a/old/download-frank-primary-fp8.sh +++ b/old/download-frank-archon-fp8.sh @@ -1,9 +1,9 @@ #!/usr/bin/env bash -# download-frank-primary-fp8.sh — fetch/verify the Qwen3.8-Flash-Next-FP8 +# download-frank-archon-fp8.sh — fetch/verify the Qwen3.8-Flash-Next-FP8 # payload (131 safetensors shards, 172.78 GiB total, plus aux files) for the -# vLLM frank-primary deployment on dankserver. +# vLLM frank-archon deployment on dankserver. # -# bash scripts/download-frank-primary-fp8.sh [dest_dir] +# bash scripts/download-frank-archon-fp8.sh [dest_dir] # # The manifest (scripts/manifests/qwen3.8-flash-next-fp8.manifest) carries # per-file sizes + LFS sha256s from the Hub; hf-fetch.sh is idempotent — an diff --git a/old/download-frank-large-dflash.sh b/old/download-frank-dragoon-dflash.sh similarity index 93% rename from old/download-frank-large-dflash.sh rename to old/download-frank-dragoon-dflash.sh index 881facc..4bc9ce5 100755 --- a/old/download-frank-large-dflash.sh +++ b/old/download-frank-dragoon-dflash.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Download the z-lab Qwen3.5-9B-DFlash drafter for frank-large's DFlash +# Download the z-lab Qwen3.5-9B-DFlash drafter for frank-dragoon's DFlash # speculative-decode arm (vLLM --speculative-config method=dflash). Public # repo — no auth header on the command line. # @@ -10,7 +10,7 @@ # the draft for that target. # # Usage: -# scripts/download-frank-large-dflash.sh [DEST_DIR] [--verify-only] +# scripts/download-frank-dragoon-dflash.sh [DEST_DIR] [--verify-only] set -euo pipefail REPO="z-lab/Qwen3.5-9B-DFlash" diff --git a/old/download-frank-large-mimo.sh b/old/download-frank-dragoon-mimo.sh similarity index 94% rename from old/download-frank-large-mimo.sh rename to old/download-frank-dragoon-mimo.sh index 57c73b9..bde83bd 100755 --- a/old/download-frank-large-mimo.sh +++ b/old/download-frank-dragoon-mimo.sh @@ -1,14 +1,14 @@ #!/usr/bin/env bash -# Download the BF16 MiMo-V2.6-Distill-Qwen-9B payload for frank-large +# Download the BF16 MiMo-V2.6-Distill-Qwen-9B payload for frank-dragoon # (vLLM/kyuz0 gfx1151, Strix Halo iGPU). Public repo — no auth header on the # command line (a Bearer token in argv is world-readable via /proc). # # Per-file FRESH downloads, no resume: the house rule (see -# download-frank-secondary.sh); -f/--fail-with-body plus size+sha256 against the +# download-frank-zealot.sh); -f/--fail-with-body plus size+sha256 against the # Hub LFS oid is what makes an access error fail instead of "succeeding". # # Usage: -# scripts/download-frank-large-mimo.sh [DEST_DIR] [--verify-only] +# scripts/download-frank-dragoon-mimo.sh [DEST_DIR] [--verify-only] # # The verified set below is exactly what the 2026-10-01 bench window served: # 17.53 GiB of BF16 weights (4 shards, 18,819,720,848 B total with the rest). diff --git a/old/download-frank-large-qwen35.sh b/old/download-frank-dragoon-qwen35.sh similarity index 92% rename from old/download-frank-large-qwen35.sh rename to old/download-frank-dragoon-qwen35.sh index 53c452c..f4de624 100755 --- a/old/download-frank-large-qwen35.sh +++ b/old/download-frank-dragoon-qwen35.sh @@ -1,14 +1,14 @@ #!/usr/bin/env bash # Download the source Qwen3.5-9B checkpoint — the ONLY place this model -# family's MTP head (15 mtp.* tensors) exists. frank-large runs it as the +# family's MTP head (15 mtp.* tensors) exists. frank-dragoon runs it as the # vLLM cross-model MTP draft (MiMo-V2.6-Distill-Qwen-9B itself ships zero -# mtp tensors; that is why SGLang's NEXTN on frank-secondary draws 0.00 +# mtp tensors; that is why SGLang's NEXTN on frank-zealot draws 0.00 # acceptance). Public repo — no auth header on the command line. # # NOTE the odd upstream shard names (model.safetensors-0000N-of-00004...). # # Usage: -# scripts/download-frank-large-qwen35.sh [DEST_DIR] [--verify-only] +# scripts/download-frank-dragoon-qwen35.sh [DEST_DIR] [--verify-only] set -euo pipefail REPO="Qwen/Qwen3.5-9B" diff --git a/old/download-frank-secondary-sglang-int8.sh b/old/download-frank-zealot-sglang-int8.sh similarity index 97% rename from old/download-frank-secondary-sglang-int8.sh rename to old/download-frank-zealot-sglang-int8.sh index ceb6433..d0501d6 100755 --- a/old/download-frank-secondary-sglang-int8.sh +++ b/old/download-frank-zealot-sglang-int8.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Download MiMo-V2.6-Distill-Qwen-9B-INT8-W8A16-AutoRound for frank-secondary +# Download MiMo-V2.6-Distill-Qwen-9B-INT8-W8A16-AutoRound for frank-zealot # (SGLang, RTX 3090). Public repo — no auth header on the command line. # # Per-file FRESH downloads, no resume: `curl -C -` once produced a 213 MB @@ -7,7 +7,7 @@ # the house rule. # # Usage: -# scripts/download-frank-secondary.sh [DEST_DIR] [--verify-only] +# scripts/download-frank-zealot.sh [DEST_DIR] [--verify-only] # # LFS shards are verified against the Hub LFS sha256; non-LFS text files # against their declared byte size. Idempotent: complete files are skipped. diff --git a/old/scripts/bench-frank-large.sh b/old/scripts/bench-frank-dragoon.sh similarity index 92% rename from old/scripts/bench-frank-large.sh rename to old/scripts/bench-frank-dragoon.sh index 9d4f11b..432251b 100755 --- a/old/scripts/bench-frank-large.sh +++ b/old/scripts/bench-frank-dragoon.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# bench-frank-large.sh — 64k-context benchmark for the frank-default-large stack. +# bench-frank-dragoon.sh — 64k-context benchmark for the frank-default-large stack. # # Measures generation throughput of Qwen3.6-27B Q8_K_P + DFlash + ngram-mod on # a single backend at 64k context. It starts llama-server on a scratch port, @@ -7,15 +7,15 @@ # prompt, and prints tokens/sec. # # Usage: -# ./scripts/bench-frank-large.sh [--generations N] +# ./scripts/bench-frank-dragoon.sh [--generations N] # # Example: -# ./scripts/bench-frank-large.sh ROCm0 -# ./scripts/bench-frank-large.sh Vulkan0 --generations 3 +# ./scripts/bench-frank-dragoon.sh ROCm0 +# ./scripts/bench-frank-dragoon.sh Vulkan0 --generations 3 set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -DEVICE="${1:?usage: bench-frank-large.sh [--generations N]}" +DEVICE="${1:?usage: bench-frank-dragoon.sh [--generations N]}" GENERATIONS=1 if [ "${2:-}" = "--generations" ]; then GENERATIONS="${3:?--generations needs a count}" diff --git a/old/scripts/deploy.sh b/old/scripts/deploy.sh index f5b4e6b..3ae1f65 100755 --- a/old/scripts/deploy.sh +++ b/old/scripts/deploy.sh @@ -41,7 +41,7 @@ SERVICE_HEALTH[dankclaw]="http://127.0.0.1:7770/health" # Drop page caches before restart: with the model's pages fully cached, the # KV/graph allocation stalls at load (VRAM stuck at 28 GiB). See AGENTS.md. DROP_CACHES[dankclaw]=1 -# Passwordless restart helper (root-owned, installed via /etc/sudoers.d/frank-large). +# Passwordless restart helper (root-owned, installed via /etc/sudoers.d/frank-dragoon). # When present, deploy.sh uses it instead of inline sudo commands. HELPER[dankclaw]="/usr/local/sbin/frank-restart-large.sh" # Health wait in iterations of 2s. Cold loads after the cache drop measured diff --git a/old/scripts/frank-default-large.ling.env b/old/scripts/frank-default-large.ling.env index 667f835..aab6bd9 100644 --- a/old/scripts/frank-default-large.ling.env +++ b/old/scripts/frank-default-large.ling.env @@ -1,6 +1,6 @@ -# Tunables for the Ling-3.0-flash TRAIL on dankclaw (frank-large-ling). +# Tunables for the Ling-3.0-flash TRAIL on dankclaw (frank-dragoon-ling). # This REPLACES frank-default-large (Qwen3.6-27B) temporarily. To switch -# back: systemctl stop frank-large-ling && systemctl start frank-default-large. +# back: systemctl stop frank-dragoon-ling && systemctl start frank-default-large. # Runtime: llama.cpp FORK bailingmoe3-support; Vulkan + AMD GTT. # # Memory model (amdgpu Strix Halo gfx1151, 8x16GB LPDDR5 = 128 GiB physical): diff --git a/old/scripts/frank-large-ling.service b/old/scripts/frank-dragoon-ling.service similarity index 81% rename from old/scripts/frank-large-ling.service rename to old/scripts/frank-dragoon-ling.service index 97b7439..fc34379 100644 --- a/old/scripts/frank-large-ling.service +++ b/old/scripts/frank-dragoon-ling.service @@ -1,5 +1,5 @@ [Unit] -Description=llama.cpp Ling-3.0-flash Q6_K Vulkan+MTP (frank-large-ling TRIAL) +Description=llama.cpp Ling-3.0-flash Q6_K Vulkan+MTP (frank-dragoon-ling TRIAL) After=network.target [Service] diff --git a/old/scripts/serve-ling-flash.sh b/old/scripts/serve-ling-flash.sh index 3ecaf6d..e3455d0 100755 --- a/old/scripts/serve-ling-flash.sh +++ b/old/scripts/serve-ling-flash.sh @@ -8,7 +8,7 @@ # Vulkan exposes as an ~111 GiB heap). MTP drafter is bundled in the same # GGUF (block 42) - no separate --spec-draft-model needed. # -# Tie-back: to restore the Qwen3.6-27B service, stop frank-large-ling and +# Tie-back: to restore the Qwen3.6-27B service, stop frank-dragoon-ling and # start frank-default-large (its env/unit are committed and unchanged). # # Tunables come from frank-default-large.ling.env in this directory unless diff --git a/old/scripts/serve-llama-frank-large.sh b/old/scripts/serve-llama-frank-dragoon.sh similarity index 96% rename from old/scripts/serve-llama-frank-large.sh rename to old/scripts/serve-llama-frank-dragoon.sh index cf004f4..9f69f31 100755 --- a/old/scripts/serve-llama-frank-large.sh +++ b/old/scripts/serve-llama-frank-dragoon.sh @@ -4,11 +4,11 @@ # Runtime: llama.cpp llama-server (>= b10411). # # Tunables come from frank-default-large.env in this directory unless the -# FRANK_LARGE_ENV_FILE environment variable overrides that path. +# FRANK_DRAGOON_ENV_FILE environment variable overrides that path. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -ENV_FILE="${FRANK_LARGE_ENV_FILE:-$SCRIPT_DIR/frank-default-large.env}" +ENV_FILE="${FRANK_DRAGOON_ENV_FILE:-$SCRIPT_DIR/frank-default-large.env}" if [[ -f "$ENV_FILE" ]]; then set -a # shellcheck disable=SC1090 diff --git a/prose_request.json b/prose_request.json index 0fcfc3f..0a78c71 100644 --- a/prose_request.json +++ b/prose_request.json @@ -1 +1 @@ -{"model": "frank-large", "prompt": "# Subsurface Aquifer Monitoring Network - System Design Document (Revision 7)\n\nThis document describes the deployment of a subsurface aquifer monitoring network for the Cascadia sedimentary basin. It is written for the operations crew and the regional water authority. Every sensor node, relay, aggregation service, calibration procedure, and failure mode below carries a stable alphanumeric identifier that appears in every table and in the field notes.\n\n## Sensor nodes\nNode SN-000-08B9 sits in a discharge lens at 359.0 m below datum and reports a salinity of 2.38 ppt with the fractured interval reading 5.40 degC at dawn and the wellhead porous 1.72 m3/d while the electrode pair returns 3157 uS/cm.\nNode SN-001-0A65 sits in a percolate lens at 25.9 m below datum and steps down to a salinity of 2.13 ppt with the diapir interval reading 8.55 degC at dawn and the wellhead silty 0.67 m3/d while the electrode pair returns 979 uS/cm.\nNode SN-002-0571 sits in a diapir lens at 287.8 m below datum and peaks at a salinity of 7.63 ppt with the karst interval reading 4.26 degC at dawn and the wellhead spooned 11.50 m3/d while the electrode pair returns 2987 uS/cm.\nNode SN-003-0CE9 sits in a confining lens at 169.5 m below datum and logs a salinity of 0.96 ppt with the alluvial interval reading 5.03 degC at dawn and the wellhead salinized 12.08 m3/d while the electrode pair returns 2607 uS/cm.\nNode SN-004-0E2A sits in a freshened lens at 70.4 m below datum and settles near a salinity of 8.68 ppt with the spooned interval reading 4.88 degC at dawn and the wellhead siphon 4.38 m3/d while the electrode pair returns 2707 uS/cm.\nNode SN-005-0DDD sits in a percolate lens at 44.6 m below datum and reports a salinity of 6.25 ppt with the alluvial interval reading 10.85 degC at dawn and the wellhead brackish 13.99 m3/d while the electrode pair returns 3618 uS/cm.\nNode SN-006-0EFC sits in a till lens at 309.5 m below datum and reports a salinity of 3.49 ppt with the lacustrine interval reading 7.38 degC at dawn and the wellhead spooned 3.21 m3/d while the electrode pair returns 1253 uS/cm.\nNode SN-007-0B02 sits in a recharge lens at 262.0 m below datum and steps down to a salinity of 2.38 ppt with the discharge interval reading 8.18 degC at dawn and the wellhead perched 4.05 m3/d while the electrode pair returns 3900 uS/cm.\nNode SN-008-0448 sits in a karst lens at 406.5 m below datum and reports a salinity of 7.32 ppt with the upconing interval reading 6.17 degC at dawn and the wellhead fluvial 0.75 m3/d while the electrode pair returns 1448 uS/cm.\nNode SN-009-043C sits in a alluvial lens at 159.3 m below datum and flags a salinity of 6.20 ppt with the percolate interval reading 7.60 degC at dawn and the wellhead brackish 13.01 m3/d while the electrode pair returns 2025 uS/cm.\nNode SN-010-0FF5 sits in a karst lens at 264.2 m below datum and flags a salinity of 7.05 ppt with the freshened interval reading 7.88 degC at dawn and the wellhead siphon 8.41 m3/d while the electrode pair returns 1635 uS/cm.\nNode SN-011-098A sits in a drain lens at 365.7 m below datum and reports a salinity of 8.11 ppt with the wedge interval reading 5.51 degC at dawn and the wellhead glacial 2.52 m3/d while the electrode pair returns 2916 uS/cm.\nNode SN-012-0AE8 sits in a till lens at 259.6 m below datum and steps down to a salinity of 9.13 ppt with the recharge interval reading 11.60 degC at dawn and the wellhead spooned 0.46 m3/d while the electrode pair returns 3077 uS/cm.\nNode SN-013-0B83 sits in a salinized lens at 171.2 m below datum and peaks at a salinity of 2.83 ppt with the lacustrine interval reading 5.56 degC at dawn and the wellhead discharge 0.35 m3/d while the electrode pair returns 3083 uS/cm.\nNode SN-014-032E sits in a drain lens at 249.6 m below datum and flags a salinity of 1.09 ppt with the salinized interval reading 9.58 degC at dawn and the wellhead perched 12.00 m3/d while the electrode pair returns 2221 uS/cm.\nNode SN-015-004F sits in a aeolian lens at 264.4 m below datum and reports a salinity of 7.34 ppt with the salinized interval reading 8.76 degC at dawn and the wellhead perched 0.31 m3/d while the electrode pair returns 1483 uS/cm.\nNode SN-016-07C6 sits in a aeolian lens at 155.9 m below datum and reports a salinity of 0.64 ppt with the mineralized interval reading 11.75 degC at dawn and the wellhead diluted 13.46 m3/d while the electrode pair returns 524 uS/cm.\nNode SN-017-06C5 sits in a salinized lens at 72.1 m below datum and averages a salinity of 4.52 ppt with the siphon interval reading 8.93 degC at dawn and the wellhead confining 3.98 m3/d while the electrode pair returns 3687 uS/cm.\nNode SN-018-0E64 sits in a siphon lens at 334.9 m below datum and steps down to a salinity of 6.73 ppt with the salinized interval reading 7.63 degC at dawn and the wellhead freshened 9.64 m3/d while the electrode pair returns 1681 uS/cm.\nNode SN-019-0122 sits in a spooned lens at 117.2 m below datum and logs a salinity of 3.24 ppt with the fractured interval reading 9.26 degC at dawn and the wellhead karst 3.50 m3/d while the electrode pair returns 1065 uS/cm.\nNode SN-020-021D sits in a karst lens at 414.3 m below datum and recovers to a salinity of 0.76 ppt with the glacial interval reading 6.25 degC at dawn and the wellhead silty 9.60 m3/d while the electrode pair returns 1041 uS/cm.\nNode SN-021-06C6 sits in a percolate lens at 379.2 m below datum and drifts to a salinity of 7.61 ppt with the wedge interval reading 5.84 degC at dawn and the wellhead karst 1.65 m3/d while the electrode pair returns 1913 uS/cm.\nNode SN-022-0DC9 sits in a spooned lens at 327.1 m below datum and reports a salinity of 9.25 ppt with the freshened interval reading 5.05 degC at dawn and the wellhead silty 5.90 m3/d while the electrode pair returns 1544 uS/cm.\nNode SN-023-0717 sits in a karst lens at 222.0 m below datum and steps down to a salinity of 4.02 ppt with the alluvial interval reading 6.60 degC at dawn and the wellhead siphon 3.77 m3/d while the electrode pair returns 3892 uS/cm.\nNode SN-024-02A9 sits in a fractured lens at 479.7 m below datum and drifts to a salinity of 7.88 ppt with the silty interval reading 12.53 degC at dawn and the wellhead discharge 13.18 m3/d while the electrode pair returns 3592 uS/cm.\nNode SN-025-0C8F sits in a wedge lens at 434.3 m below datum and holds a salinity of 1.63 ppt with the alluvial interval reading 4.22 degC at dawn and the wellhead till 5.73 m3/d while the electrode pair returns 3905 uS/cm.\nNode SN-026-04BF sits in a colluvial lens at 460.0 m below datum and averages a salinity of 9.36 ppt with the diapir interval reading 8.98 degC at dawn and the wellhead brackish 10.29 m3/d while the electrode pair returns 802 uS/cm.\nNode SN-027-0DA4 sits in a silty lens at 265.7 m below datum and steps down to a salinity of 7.06 ppt with the percolate interval reading 4.69 degC at dawn and the wellhead freshened 8.42 m3/d while the electrode pair returns 2201 uS/cm.\nNode SN-028-01EB sits in a perched lens at 49.5 m below datum and recovers to a salinity of 1.83 ppt with the silty interval reading 9.32 degC at dawn and the wellhead drain 9.69 m3/d while the electrode pair returns 1126 uS/cm.\nNode SN-029-042C sits in a karst lens at 30.6 m below datum and averages a salinity of 0.86 ppt with the percolate interval reading 9.85 degC at dawn and the wellhead recharge 8.16 m3/d while the electrode pair returns 1452 uS/cm.\n\n## Relays\nRelay RL-00-02181 reburses the upconing trunk from the brackish margin and peaks at a round-trip time of 131.8 ms with a frame loss of 1.04 percent across the night window.\nRelay RL-01-00262 reburses the spooned trunk from the fluvial margin and holds a round-trip time of 372.2 ms with a frame loss of 3.65 percent across the night window.\nRelay RL-02-03691 reburses the recharge trunk from the percolate margin and steps down to a round-trip time of 398.5 ms with a frame loss of 0.29 percent across the night window.\nRelay RL-03-0E117 reburses the lacustrine trunk from the confining margin and averages a round-trip time of 373.9 ms with a frame loss of 3.44 percent across the night window.\nRelay RL-04-0B41B reburses the aeolian trunk from the colluvial margin and peaks at a round-trip time of 70.7 ms with a frame loss of 3.25 percent across the night window.\nRelay RL-05-0D12D reburses the recharge trunk from the diluted margin and steps down to a round-trip time of 264.7 ms with a frame loss of 0.03 percent across the night window.\nRelay RL-06-043B4 reburses the colluvial trunk from the upconing margin and reports a round-trip time of 49.5 ms with a frame loss of 3.42 percent across the night window.\nRelay RL-07-09AD6 reburses the fractured trunk from the freshened margin and averages a round-trip time of 225.3 ms with a frame loss of 1.06 percent across the night window.\nRelay RL-08-04394 reburses the brackish trunk from the fluvial margin and steps down to a round-trip time of 88.6 ms with a frame loss of 2.47 percent across the night window.\nRelay RL-09-017A0 reburses the wedge trunk from the lacustrine margin and drifts to a round-trip time of 363.0 ms with a frame loss of 3.30 percent across the night window.\nRelay RL-10-0217D reburses the mineralized trunk from the lacustrine margin and peaks at a round-trip time of 26.2 ms with a frame loss of 1.30 percent across the night window.\nRelay RL-11-08F97 reburses the perched trunk from the freshened margin and logs a round-trip time of 181.8 ms with a frame loss of 2.75 percent across the night window.\nRelay RL-12-02628 reburses the fractured trunk from the glacial margin and steps down to a round-trip time of 378.5 ms with a frame loss of 2.69 percent across the night window.\nRelay RL-13-06E06 reburses the silty trunk from the mineralized margin and flags a round-trip time of 153.4 ms with a frame loss of 2.15 percent across the night window.\n\n## Aggregation services\nAggregator AG-00-3BB logs a queue depth of 5.2 messages and a histogram bucket of 6.82 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-01-0FF reports a queue depth of 86.4 messages and a histogram bucket of 4.10 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-02-37F drifts to a queue depth of 34.7 messages and a histogram bucket of 10.25 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-03-3B3 averages a queue depth of 93.5 messages and a histogram bucket of 13.59 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-04-33E flags a queue depth of 83.2 messages and a histogram bucket of 17.58 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-05-2F2 settles near a queue depth of 84.8 messages and a histogram bucket of 0.84 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-06-2AD averages a queue depth of 75.4 messages and a histogram bucket of 7.65 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-07-06E drifts to a queue depth of 26.5 messages and a histogram bucket of 14.26 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-08-0E3 averages a queue depth of 83.9 messages and a histogram bucket of 15.51 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-09-138 averages a queue depth of 78.6 messages and a histogram bucket of 8.50 seconds before the dedupe pass settles the stream for the next rotation.\n\n## Calibration procedures\nProcedure CP-00-047 steps the probe through a two-point rinse, then applies a trim of 0.2084 at the 66 milli-bar mark and records a residual of 0.02052 before the next field seal is crimped.\nProcedure CP-01-0A4 steps the probe through a two-point rinse, then applies a trim of 0.7793 at the 96 milli-bar mark and records a residual of 0.01468 before the next field seal is crimped.\nProcedure CP-02-054 steps the probe through a two-point rinse, then applies a trim of 0.4634 at the 68 milli-bar mark and records a residual of 0.04234 before the next field seal is crimped.\nProcedure CP-03-02D steps the probe through a two-point rinse, then applies a trim of 0.8459 at the 12 milli-bar mark and records a residual of 0.04855 before the next field seal is crimped.\nProcedure CP-04-098 steps the probe through a two-point rinse, then applies a trim of 0.5267 at the 97 milli-bar mark and records a residual of 0.00287 before the next field seal is crimped.\nProcedure CP-05-09B steps the probe through a two-point rinse, then applies a trim of 0.3968 at the 72 milli-bar mark and records a residual of 0.01637 before the next field seal is crimped.\nProcedure CP-06-030 steps the probe through a two-point rinse, then applies a trim of 0.8860 at the 12 milli-bar mark and records a residual of 0.04508 before the next field seal is crimped.\nProcedure CP-07-0EC steps the probe through a two-point rinse, then applies a trim of 0.2367 at the 70 milli-bar mark and records a residual of 0.00108 before the next field seal is crimped.\nProcedure CP-08-0BC steps the probe through a two-point rinse, then applies a trim of 0.7278 at the 68 milli-bar mark and records a residual of 0.04707 before the next field seal is crimped.\nProcedure CP-09-0AA steps the probe through a two-point rinse, then applies a trim of 0.6069 at the 37 milli-bar mark and records a residual of 0.00443 before the next field seal is crimped.\n\n## Failure modes\nMode FM-00-27 declares a fluvial excursion when two independent probes disagree beyond the band for three rotations; the fleet reports a mean time between failures of 36902 hours for this class of excursion.\nMode FM-01-13 declares a drain excursion when two independent probes disagree beyond the band for three rotations; the fleet peaks at a mean time between failures of 29042 hours for this class of excursion.\nMode FM-02-14 declares a till excursion when two independent probes disagree beyond the band for three rotations; the fleet peaks at a mean time between failures of 26976 hours for this class of excursion.\nMode FM-03-0C declares a diapir excursion when two independent probes disagree beyond the band for three rotations; the fleet drifts to a mean time between failures of 22578 hours for this class of excursion.\nMode FM-04-39 declares a perched excursion when two independent probes disagree beyond the band for three rotations; the fleet recovers to a mean time between failures of 27383 hours for this class of excursion.\nMode FM-05-19 declares a siphon excursion when two independent probes disagree beyond the band for three rotations; the fleet logs a mean time between failures of 23152 hours for this class of excursion.\n\n## End of document\nSummarize the network's dominant risk in one paragraph, then list the three node identifiers whose readings most limit the model this month.", "max_tokens": 512, "temperature": 0, "cache_prompt": false, "stream": false} \ No newline at end of file +{"model": "frank-dragoon", "prompt": "# Subsurface Aquifer Monitoring Network - System Design Document (Revision 7)\n\nThis document describes the deployment of a subsurface aquifer monitoring network for the Cascadia sedimentary basin. It is written for the operations crew and the regional water authority. Every sensor node, relay, aggregation service, calibration procedure, and failure mode below carries a stable alphanumeric identifier that appears in every table and in the field notes.\n\n## Sensor nodes\nNode SN-000-08B9 sits in a discharge lens at 359.0 m below datum and reports a salinity of 2.38 ppt with the fractured interval reading 5.40 degC at dawn and the wellhead porous 1.72 m3/d while the electrode pair returns 3157 uS/cm.\nNode SN-001-0A65 sits in a percolate lens at 25.9 m below datum and steps down to a salinity of 2.13 ppt with the diapir interval reading 8.55 degC at dawn and the wellhead silty 0.67 m3/d while the electrode pair returns 979 uS/cm.\nNode SN-002-0571 sits in a diapir lens at 287.8 m below datum and peaks at a salinity of 7.63 ppt with the karst interval reading 4.26 degC at dawn and the wellhead spooned 11.50 m3/d while the electrode pair returns 2987 uS/cm.\nNode SN-003-0CE9 sits in a confining lens at 169.5 m below datum and logs a salinity of 0.96 ppt with the alluvial interval reading 5.03 degC at dawn and the wellhead salinized 12.08 m3/d while the electrode pair returns 2607 uS/cm.\nNode SN-004-0E2A sits in a freshened lens at 70.4 m below datum and settles near a salinity of 8.68 ppt with the spooned interval reading 4.88 degC at dawn and the wellhead siphon 4.38 m3/d while the electrode pair returns 2707 uS/cm.\nNode SN-005-0DDD sits in a percolate lens at 44.6 m below datum and reports a salinity of 6.25 ppt with the alluvial interval reading 10.85 degC at dawn and the wellhead brackish 13.99 m3/d while the electrode pair returns 3618 uS/cm.\nNode SN-006-0EFC sits in a till lens at 309.5 m below datum and reports a salinity of 3.49 ppt with the lacustrine interval reading 7.38 degC at dawn and the wellhead spooned 3.21 m3/d while the electrode pair returns 1253 uS/cm.\nNode SN-007-0B02 sits in a recharge lens at 262.0 m below datum and steps down to a salinity of 2.38 ppt with the discharge interval reading 8.18 degC at dawn and the wellhead perched 4.05 m3/d while the electrode pair returns 3900 uS/cm.\nNode SN-008-0448 sits in a karst lens at 406.5 m below datum and reports a salinity of 7.32 ppt with the upconing interval reading 6.17 degC at dawn and the wellhead fluvial 0.75 m3/d while the electrode pair returns 1448 uS/cm.\nNode SN-009-043C sits in a alluvial lens at 159.3 m below datum and flags a salinity of 6.20 ppt with the percolate interval reading 7.60 degC at dawn and the wellhead brackish 13.01 m3/d while the electrode pair returns 2025 uS/cm.\nNode SN-010-0FF5 sits in a karst lens at 264.2 m below datum and flags a salinity of 7.05 ppt with the freshened interval reading 7.88 degC at dawn and the wellhead siphon 8.41 m3/d while the electrode pair returns 1635 uS/cm.\nNode SN-011-098A sits in a drain lens at 365.7 m below datum and reports a salinity of 8.11 ppt with the wedge interval reading 5.51 degC at dawn and the wellhead glacial 2.52 m3/d while the electrode pair returns 2916 uS/cm.\nNode SN-012-0AE8 sits in a till lens at 259.6 m below datum and steps down to a salinity of 9.13 ppt with the recharge interval reading 11.60 degC at dawn and the wellhead spooned 0.46 m3/d while the electrode pair returns 3077 uS/cm.\nNode SN-013-0B83 sits in a salinized lens at 171.2 m below datum and peaks at a salinity of 2.83 ppt with the lacustrine interval reading 5.56 degC at dawn and the wellhead discharge 0.35 m3/d while the electrode pair returns 3083 uS/cm.\nNode SN-014-032E sits in a drain lens at 249.6 m below datum and flags a salinity of 1.09 ppt with the salinized interval reading 9.58 degC at dawn and the wellhead perched 12.00 m3/d while the electrode pair returns 2221 uS/cm.\nNode SN-015-004F sits in a aeolian lens at 264.4 m below datum and reports a salinity of 7.34 ppt with the salinized interval reading 8.76 degC at dawn and the wellhead perched 0.31 m3/d while the electrode pair returns 1483 uS/cm.\nNode SN-016-07C6 sits in a aeolian lens at 155.9 m below datum and reports a salinity of 0.64 ppt with the mineralized interval reading 11.75 degC at dawn and the wellhead diluted 13.46 m3/d while the electrode pair returns 524 uS/cm.\nNode SN-017-06C5 sits in a salinized lens at 72.1 m below datum and averages a salinity of 4.52 ppt with the siphon interval reading 8.93 degC at dawn and the wellhead confining 3.98 m3/d while the electrode pair returns 3687 uS/cm.\nNode SN-018-0E64 sits in a siphon lens at 334.9 m below datum and steps down to a salinity of 6.73 ppt with the salinized interval reading 7.63 degC at dawn and the wellhead freshened 9.64 m3/d while the electrode pair returns 1681 uS/cm.\nNode SN-019-0122 sits in a spooned lens at 117.2 m below datum and logs a salinity of 3.24 ppt with the fractured interval reading 9.26 degC at dawn and the wellhead karst 3.50 m3/d while the electrode pair returns 1065 uS/cm.\nNode SN-020-021D sits in a karst lens at 414.3 m below datum and recovers to a salinity of 0.76 ppt with the glacial interval reading 6.25 degC at dawn and the wellhead silty 9.60 m3/d while the electrode pair returns 1041 uS/cm.\nNode SN-021-06C6 sits in a percolate lens at 379.2 m below datum and drifts to a salinity of 7.61 ppt with the wedge interval reading 5.84 degC at dawn and the wellhead karst 1.65 m3/d while the electrode pair returns 1913 uS/cm.\nNode SN-022-0DC9 sits in a spooned lens at 327.1 m below datum and reports a salinity of 9.25 ppt with the freshened interval reading 5.05 degC at dawn and the wellhead silty 5.90 m3/d while the electrode pair returns 1544 uS/cm.\nNode SN-023-0717 sits in a karst lens at 222.0 m below datum and steps down to a salinity of 4.02 ppt with the alluvial interval reading 6.60 degC at dawn and the wellhead siphon 3.77 m3/d while the electrode pair returns 3892 uS/cm.\nNode SN-024-02A9 sits in a fractured lens at 479.7 m below datum and drifts to a salinity of 7.88 ppt with the silty interval reading 12.53 degC at dawn and the wellhead discharge 13.18 m3/d while the electrode pair returns 3592 uS/cm.\nNode SN-025-0C8F sits in a wedge lens at 434.3 m below datum and holds a salinity of 1.63 ppt with the alluvial interval reading 4.22 degC at dawn and the wellhead till 5.73 m3/d while the electrode pair returns 3905 uS/cm.\nNode SN-026-04BF sits in a colluvial lens at 460.0 m below datum and averages a salinity of 9.36 ppt with the diapir interval reading 8.98 degC at dawn and the wellhead brackish 10.29 m3/d while the electrode pair returns 802 uS/cm.\nNode SN-027-0DA4 sits in a silty lens at 265.7 m below datum and steps down to a salinity of 7.06 ppt with the percolate interval reading 4.69 degC at dawn and the wellhead freshened 8.42 m3/d while the electrode pair returns 2201 uS/cm.\nNode SN-028-01EB sits in a perched lens at 49.5 m below datum and recovers to a salinity of 1.83 ppt with the silty interval reading 9.32 degC at dawn and the wellhead drain 9.69 m3/d while the electrode pair returns 1126 uS/cm.\nNode SN-029-042C sits in a karst lens at 30.6 m below datum and averages a salinity of 0.86 ppt with the percolate interval reading 9.85 degC at dawn and the wellhead recharge 8.16 m3/d while the electrode pair returns 1452 uS/cm.\n\n## Relays\nRelay RL-00-02181 reburses the upconing trunk from the brackish margin and peaks at a round-trip time of 131.8 ms with a frame loss of 1.04 percent across the night window.\nRelay RL-01-00262 reburses the spooned trunk from the fluvial margin and holds a round-trip time of 372.2 ms with a frame loss of 3.65 percent across the night window.\nRelay RL-02-03691 reburses the recharge trunk from the percolate margin and steps down to a round-trip time of 398.5 ms with a frame loss of 0.29 percent across the night window.\nRelay RL-03-0E117 reburses the lacustrine trunk from the confining margin and averages a round-trip time of 373.9 ms with a frame loss of 3.44 percent across the night window.\nRelay RL-04-0B41B reburses the aeolian trunk from the colluvial margin and peaks at a round-trip time of 70.7 ms with a frame loss of 3.25 percent across the night window.\nRelay RL-05-0D12D reburses the recharge trunk from the diluted margin and steps down to a round-trip time of 264.7 ms with a frame loss of 0.03 percent across the night window.\nRelay RL-06-043B4 reburses the colluvial trunk from the upconing margin and reports a round-trip time of 49.5 ms with a frame loss of 3.42 percent across the night window.\nRelay RL-07-09AD6 reburses the fractured trunk from the freshened margin and averages a round-trip time of 225.3 ms with a frame loss of 1.06 percent across the night window.\nRelay RL-08-04394 reburses the brackish trunk from the fluvial margin and steps down to a round-trip time of 88.6 ms with a frame loss of 2.47 percent across the night window.\nRelay RL-09-017A0 reburses the wedge trunk from the lacustrine margin and drifts to a round-trip time of 363.0 ms with a frame loss of 3.30 percent across the night window.\nRelay RL-10-0217D reburses the mineralized trunk from the lacustrine margin and peaks at a round-trip time of 26.2 ms with a frame loss of 1.30 percent across the night window.\nRelay RL-11-08F97 reburses the perched trunk from the freshened margin and logs a round-trip time of 181.8 ms with a frame loss of 2.75 percent across the night window.\nRelay RL-12-02628 reburses the fractured trunk from the glacial margin and steps down to a round-trip time of 378.5 ms with a frame loss of 2.69 percent across the night window.\nRelay RL-13-06E06 reburses the silty trunk from the mineralized margin and flags a round-trip time of 153.4 ms with a frame loss of 2.15 percent across the night window.\n\n## Aggregation services\nAggregator AG-00-3BB logs a queue depth of 5.2 messages and a histogram bucket of 6.82 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-01-0FF reports a queue depth of 86.4 messages and a histogram bucket of 4.10 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-02-37F drifts to a queue depth of 34.7 messages and a histogram bucket of 10.25 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-03-3B3 averages a queue depth of 93.5 messages and a histogram bucket of 13.59 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-04-33E flags a queue depth of 83.2 messages and a histogram bucket of 17.58 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-05-2F2 settles near a queue depth of 84.8 messages and a histogram bucket of 0.84 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-06-2AD averages a queue depth of 75.4 messages and a histogram bucket of 7.65 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-07-06E drifts to a queue depth of 26.5 messages and a histogram bucket of 14.26 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-08-0E3 averages a queue depth of 83.9 messages and a histogram bucket of 15.51 seconds before the dedupe pass settles the stream for the next rotation.\nAggregator AG-09-138 averages a queue depth of 78.6 messages and a histogram bucket of 8.50 seconds before the dedupe pass settles the stream for the next rotation.\n\n## Calibration procedures\nProcedure CP-00-047 steps the probe through a two-point rinse, then applies a trim of 0.2084 at the 66 milli-bar mark and records a residual of 0.02052 before the next field seal is crimped.\nProcedure CP-01-0A4 steps the probe through a two-point rinse, then applies a trim of 0.7793 at the 96 milli-bar mark and records a residual of 0.01468 before the next field seal is crimped.\nProcedure CP-02-054 steps the probe through a two-point rinse, then applies a trim of 0.4634 at the 68 milli-bar mark and records a residual of 0.04234 before the next field seal is crimped.\nProcedure CP-03-02D steps the probe through a two-point rinse, then applies a trim of 0.8459 at the 12 milli-bar mark and records a residual of 0.04855 before the next field seal is crimped.\nProcedure CP-04-098 steps the probe through a two-point rinse, then applies a trim of 0.5267 at the 97 milli-bar mark and records a residual of 0.00287 before the next field seal is crimped.\nProcedure CP-05-09B steps the probe through a two-point rinse, then applies a trim of 0.3968 at the 72 milli-bar mark and records a residual of 0.01637 before the next field seal is crimped.\nProcedure CP-06-030 steps the probe through a two-point rinse, then applies a trim of 0.8860 at the 12 milli-bar mark and records a residual of 0.04508 before the next field seal is crimped.\nProcedure CP-07-0EC steps the probe through a two-point rinse, then applies a trim of 0.2367 at the 70 milli-bar mark and records a residual of 0.00108 before the next field seal is crimped.\nProcedure CP-08-0BC steps the probe through a two-point rinse, then applies a trim of 0.7278 at the 68 milli-bar mark and records a residual of 0.04707 before the next field seal is crimped.\nProcedure CP-09-0AA steps the probe through a two-point rinse, then applies a trim of 0.6069 at the 37 milli-bar mark and records a residual of 0.00443 before the next field seal is crimped.\n\n## Failure modes\nMode FM-00-27 declares a fluvial excursion when two independent probes disagree beyond the band for three rotations; the fleet reports a mean time between failures of 36902 hours for this class of excursion.\nMode FM-01-13 declares a drain excursion when two independent probes disagree beyond the band for three rotations; the fleet peaks at a mean time between failures of 29042 hours for this class of excursion.\nMode FM-02-14 declares a till excursion when two independent probes disagree beyond the band for three rotations; the fleet peaks at a mean time between failures of 26976 hours for this class of excursion.\nMode FM-03-0C declares a diapir excursion when two independent probes disagree beyond the band for three rotations; the fleet drifts to a mean time between failures of 22578 hours for this class of excursion.\nMode FM-04-39 declares a perched excursion when two independent probes disagree beyond the band for three rotations; the fleet recovers to a mean time between failures of 27383 hours for this class of excursion.\nMode FM-05-19 declares a siphon excursion when two independent probes disagree beyond the band for three rotations; the fleet logs a mean time between failures of 23152 hours for this class of excursion.\n\n## End of document\nSummarize the network's dominant risk in one paragraph, then list the three node identifiers whose readings most limit the model this month.", "max_tokens": 512, "temperature": 0, "cache_prompt": false, "stream": false} \ No newline at end of file diff --git a/scripts/.AGENTTRASH/bench-decode-threads-batch.py.strix-rocmfp4 b/scripts/.AGENTTRASH/bench-decode-threads-batch.py.strix-rocmfp4 index bc9fefc..0087886 100755 --- a/scripts/.AGENTTRASH/bench-decode-threads-batch.py.strix-rocmfp4 +++ b/scripts/.AGENTTRASH/bench-decode-threads-batch.py.strix-rocmfp4 @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -Decode throughput benchmark for frank-large. +Decode throughput benchmark for frank-dragoon. Starts the server with a given --threads-batch value, sends an 8K+ token prompt, generates 256 tokens, measures generation tok/s. @@ -13,12 +13,12 @@ SERVE = "/home/dank/GitPackages/ROCmFPX/build-qwen38/bin/llama-server" PORT = 7770 N_GEN = 256 PROMPT_FILE = "/tmp/bench-prompts/prompt_code.txt" -ENV_FILE = os.path.join(os.path.dirname(__file__), "frank-large.env") +ENV_FILE = os.path.join(os.path.dirname(__file__), "frank-dragoon.env") SERVER_DIR = os.path.dirname(SERVE) ROCM_PATH = "/opt/rocm" def make_env(): - """Build the same env as serve-frank-large.sh.""" + """Build the same env as serve-frank-dragoon.sh.""" env = {**os.environ, "HSA_OVERRIDE_GFX_VERSION": "11.5.1", "HIP_VISIBLE_DEVICES": "0"} # Source env file for tunables @@ -59,7 +59,7 @@ def wait_ready(): def send_request(prompt, max_tokens=N_GEN): """Send chat completion, measure generation throughput.""" body = json.dumps({ - "model": "frank-large", + "model": "frank-dragoon", "messages": [{"role": "user", "content": prompt}], "max_tokens": max_tokens, "stream": False, diff --git a/scripts/.AGENTTRASH/bench-ngram-mod.py.ik-llama.cpp b/scripts/.AGENTTRASH/bench-ngram-mod.py.ik-llama.cpp index 2f4d9d1..d60f1e5 100755 --- a/scripts/.AGENTTRASH/bench-ngram-mod.py.ik-llama.cpp +++ b/scripts/.AGENTTRASH/bench-ngram-mod.py.ik-llama.cpp @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -Benchmark n-gram speculative decoding vs no-spec for frank-large. +Benchmark n-gram speculative decoding vs no-spec for frank-dragoon. Tests prompt-processing throughput with 16K token prompts (manageable request size). Code-heavy prompt (high n-gram redundancy) vs prose prompt (low redundancy). @@ -103,7 +103,7 @@ def start_server(port, spec_type): def run_test(prompt_text, spec_type, port): """Send a request and extract prompt processing metrics.""" data = json.dumps({ - "model": "frank-large", + "model": "frank-dragoon", "messages": [{"role": "user", "content": prompt_text}], "max_tokens": TEST_TOKENS, "stream": False, @@ -189,7 +189,7 @@ def main(): print(f" Prose: {prose_prompt_file.stat().st_size:,} bytes") print("=" * 60) - print(" N-gram Mod Benchmark — frank-large") + print(" N-gram Mod Benchmark — frank-dragoon") print(f" STRIX ROCmFP4 · 64K context · 16K prompts") print("=" * 60) diff --git a/scripts/.AGENTTRASH/bench-ngram-mod.sh.ik-llama.cpp b/scripts/.AGENTTRASH/bench-ngram-mod.sh.ik-llama.cpp index ea43a2e..dc5a512 100755 --- a/scripts/.AGENTTRASH/bench-ngram-mod.sh.ik-llama.cpp +++ b/scripts/.AGENTTRASH/bench-ngram-mod.sh.ik-llama.cpp @@ -1,19 +1,19 @@ #!/usr/bin/env bash -# Benchmark n-gram speculative decoding vs no-spec for frank-large. +# Benchmark n-gram speculative decoding vs no-spec for frank-dragoon. # # This tests prompt-processing throughput at 64k context with two distinct # prompts: one code-heavy and one prose-heavy. Uses llama-server on scratch # ports with the OpenAI-compatible API to measure prompt_eval_duration_ms. # # Run on Dankclaw after stopping the production service: -# sudo systemctl stop frank-large +# sudo systemctl stop frank-dragoon # ./scripts/bench-ngram-mod.sh -# sudo systemctl start frank-large +# sudo systemctl start frank-dragoon set -euo pipefail SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" -ENV_FILE="${FRANK_LARGE_ENV_FILE:-$SCRIPT_DIR/frank-large.env}" +ENV_FILE="${FRANK_DRAGOON_ENV_FILE:-$SCRIPT_DIR/frank-dragoon.env}" if [[ -f "$ENV_FILE" ]]; then set -a; source "$ENV_FILE"; set +a fi @@ -184,7 +184,7 @@ run_single_test() { response=$(curl -s -X POST "http://127.0.0.1:$port/v1/completions" \ -H "Content-Type: application/json" \ -d "{ - \"model\": \"frank-large\", + \"model\": \"frank-dragoon\", \"prompt\": \"$prompt_text\", \"max_tokens\": 128, \"temperature\": 0, @@ -220,7 +220,7 @@ run_single_test() { } echo "╔══════════════════════════════════════════════════════════╗" -echo "║ N-gram Mod Benchmark — frank-large ║" +echo "║ N-gram Mod Benchmark — frank-dragoon ║" echo "║ STRIX ROCmFP4 · 64k context · two prompts ║" echo "╚══════════════════════════════════════════════════════════╝" echo "" diff --git a/scripts/.AGENTTRASH/bench-spec-decode.py.ik-llama.cpp b/scripts/.AGENTTRASH/bench-spec-decode.py.ik-llama.cpp index 773681c..68f3313 100755 --- a/scripts/.AGENTTRASH/bench-spec-decode.py.ik-llama.cpp +++ b/scripts/.AGENTTRASH/bench-spec-decode.py.ik-llama.cpp @@ -15,9 +15,9 @@ import time import urllib.request import urllib.error -SERVICE = "frank-large" -ENV_FILE = "/home/dank/serverAppConfigs/scripts/frank-large.env" -ALIAS = "frank-large" +SERVICE = "frank-dragoon" +ENV_FILE = "/home/dank/serverAppConfigs/scripts/frank-dragoon.env" +ALIAS = "frank-dragoon" DEFAULT_HOST = "localhost" DEFAULT_PORT = 7770 DEFAULT_MAX_TOKENS = 16384 diff --git a/scripts/.AGENTTRASH/frank-large.env.ik-llama.cpp b/scripts/.AGENTTRASH/frank-dragoon.env.ik-llama.cpp similarity index 98% rename from scripts/.AGENTTRASH/frank-large.env.ik-llama.cpp rename to scripts/.AGENTTRASH/frank-dragoon.env.ik-llama.cpp index 467606c..8a67d46 100644 --- a/scripts/.AGENTTRASH/frank-large.env.ik-llama.cpp +++ b/scripts/.AGENTTRASH/frank-dragoon.env.ik-llama.cpp @@ -1,4 +1,4 @@ -# Tunables for frank-large (mradermacher i1-Q4_K_M of +# Tunables for frank-dragoon (mradermacher i1-Q4_K_M of # orcarouter/Qwen3.8-Flash-Next-Uncensored on ik_llama.cpp, Dankclaw, # RTX 3090 CUDA + Strix Halo CPU path, since 2026-09-15). # @@ -65,7 +65,7 @@ MMPROJ_PATH=/home/dank/models/mradermacher-Qwen3.8-Flash-Next-Uncensored-i1-Q4_K CHAT_TEMPLATE_FILE=/home/dank/serverAppConfigs/scripts/chat-template.jinja # Alias + network. -ALIAS=frank-large +ALIAS=frank-dragoon BIND_ADDR=0.0.0.0 LISTEN_PORT=7770 diff --git a/scripts/.AGENTTRASH/frank-large.service.ik-llama.cpp b/scripts/.AGENTTRASH/frank-dragoon.service.ik-llama.cpp similarity index 71% rename from scripts/.AGENTTRASH/frank-large.service.ik-llama.cpp rename to scripts/.AGENTTRASH/frank-dragoon.service.ik-llama.cpp index 2badb4f..eae0d10 100644 --- a/scripts/.AGENTTRASH/frank-large.service.ik-llama.cpp +++ b/scripts/.AGENTTRASH/frank-dragoon.service.ik-llama.cpp @@ -1,5 +1,5 @@ [Unit] -Description=ik_llama.cpp Qwen3.8-Flash-Next-Uncensored i1-Q4_K_M 177B MoE (dankclaw, frank-large) +Description=ik_llama.cpp Qwen3.8-Flash-Next-Uncensored i1-Q4_K_M 177B MoE (dankclaw, frank-dragoon) After=network-online.target Wants=network-online.target @@ -12,8 +12,8 @@ Group=dank # budget still needs room. Parity with the halogen quadlet's # Ulimit=memlock=-1:-1. LimitMEMLOCK=infinity -Environment="FRANK_LARGE_ENV_FILE=/home/dank/serverAppConfigs/scripts/frank-large.env" -ExecStart=/home/dank/serverAppConfigs/scripts/serve-frank-large.sh +Environment="FRANK_DRAGOON_ENV_FILE=/home/dank/serverAppConfigs/scripts/frank-dragoon.env" +ExecStart=/home/dank/serverAppConfigs/scripts/serve-frank-dragoon.sh Restart=on-failure RestartSec=10 diff --git a/scripts/.AGENTTRASH/serve-frank-large.sh.ik-llama.cpp b/scripts/.AGENTTRASH/serve-frank-dragoon.sh.ik-llama.cpp similarity index 96% rename from scripts/.AGENTTRASH/serve-frank-large.sh.ik-llama.cpp rename to scripts/.AGENTTRASH/serve-frank-dragoon.sh.ik-llama.cpp index 9625b3d..e6e09c7 100755 --- a/scripts/.AGENTTRASH/serve-frank-large.sh.ik-llama.cpp +++ b/scripts/.AGENTTRASH/serve-frank-dragoon.sh.ik-llama.cpp @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Serve mradermacher/Qwen3.8-Flash-Next-Uncensored i1-Q4_K_M as frank-large +# Serve mradermacher/Qwen3.8-Flash-Next-Uncensored i1-Q4_K_M as frank-dragoon # via ik_llama.cpp on Dankclaw. # # Topology (ikawrakow's hybrid recipe; upstream issue #2402 for the PLE): @@ -26,7 +26,7 @@ set -euo pipefail SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" -ENV_FILE="${FRANK_LARGE_ENV_FILE:-$SCRIPT_DIR/frank-large.env}" +ENV_FILE="${FRANK_DRAGOON_ENV_FILE:-$SCRIPT_DIR/frank-dragoon.env}" if [[ -f "$ENV_FILE" ]]; then set -a # shellcheck disable=SC1090 @@ -66,7 +66,7 @@ fi # CPU-overridden weights mmapped (src/llama-load-tensors.cpp); the env file # sets it. Refuse to run without it. if [[ "${GGML_CUDA_NO_PINNED_WEIGHTS:-}" != "1" ]]; then - echo "frank-large: refusing to start — GGML_CUDA_NO_PINNED_WEIGHTS=1 is mandatory on this host" >&2 + echo "frank-dragoon: refusing to start — GGML_CUDA_NO_PINNED_WEIGHTS=1 is mandatory on this host" >&2 exit 1 fi diff --git a/scripts/.AGENTTRASH/serve-frank-medium.sh.rocmfpx b/scripts/.AGENTTRASH/serve-frank-medium.sh.rocmfpx index 6e26fba..8b64445 100755 --- a/scripts/.AGENTTRASH/serve-frank-medium.sh.rocmfpx +++ b/scripts/.AGENTTRASH/serve-frank-medium.sh.rocmfpx @@ -112,7 +112,7 @@ fi : "${SPEC_DRAFT_POLL_BATCH:=1}" # Text only: the server must not try to autoload the vision tower. Vision -# stays on frank-large (Dankclaw), which is where the fleet routes images. +# stays on frank-dragoon (Dankclaw), which is where the fleet routes images. NO_MMPROJ="${NO_MMPROJ:-1}" export HIP_VISIBLE_DEVICES diff --git a/scripts/autoresearch-bench.py b/scripts/autoresearch-bench.py index 8fd102a..e83a276 100755 --- a/scripts/autoresearch-bench.py +++ b/scripts/autoresearch-bench.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""autoresearch-bench.py — deterministic greedy battery for frank-large. +"""autoresearch-bench.py — deterministic greedy battery for frank-dragoon. Runs ON Dankclaw (no LAN jitter) against the candidate container on :7770. Fixed embedded corpus, temperature 0, streaming so decode speed is measured diff --git a/scripts/autoresearch-frank-primary.sh b/scripts/autoresearch-frank-archon.sh similarity index 75% rename from scripts/autoresearch-frank-primary.sh rename to scripts/autoresearch-frank-archon.sh index 5407bdb..ecb5193 100755 --- a/scripts/autoresearch-frank-primary.sh +++ b/scripts/autoresearch-frank-archon.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash -# autoresearch-frank-primary.sh — RUNS ON DANKSERVER, driven over ssh by the -# dev-box autoresearch.sh. It is the canonical frank-primary benchmark entry +# autoresearch-frank-archon.sh — RUNS ON DANKSERVER, driven over ssh by the +# dev-box autoresearch.sh. It is the canonical frank-archon benchmark entry # point for the autoresearch loop. # # Method (mandated by the Benchmarking Policy): the production service serves # real users and shares the two R9700s, so a bench beside it starves the GPUs # and corrupts results. This script therefore: -# 1. stops the production frank-primary unit (root, relink symlink: stop, +# 1. stops the production frank-archon unit (root, relink symlink: stop, # NOT mask — mask refuses to replace a symlinked unit file), # 2. boots a scratch radiance container named `arbench` on the SAME two # cards with the candidate engine argv (the env file the loop edits), @@ -18,7 +18,7 @@ # prefill and decode rates for that single request. # 5. prints METRIC lines and tears the scratch down, # 6. restores production (systemctl start), via a trap so a failed bench -# never leaves frank-primary down (the stale-probe-tail lesson). +# never leaves frank-archon down (the stale-probe-tail lesson). # # Determinism: the prompt is built from a fixed, sorted corpus of repo files # with a fixed random seed, so prompt_n is stable across runs. Sampling is @@ -32,10 +32,10 @@ # /dev/dri, the .rad ro, the state dir rw, the tune cache mount. The ONLY # differences: the container name (arbench, so prod's identity is untouched) # and a FRESH prefix-cache disk tier (arbench/, wiped per run) so the cold -# prefill is cold — the prod tier at kvcache/frank-primary is left intact. +# prefill is cold — the prod tier at kvcache/frank-archon is left intact. set -uo pipefail -ENV_FILE="${1:-/home/dank/serverAppConfigs/scripts/frank-primary.env}" +ENV_FILE="${1:-/home/dank/serverAppConfigs/scripts/frank-archon.env}" SCRATCH=arbench PORT=7770 HEALTH="http://127.0.0.1:$PORT/health" @@ -45,7 +45,7 @@ LOG=/home/dank/logs/arbench.log restore() { podman rm -f "$SCRATCH" >/dev/null 2>&1 || true - sudo systemctl start frank-primary >/dev/null 2>&1 || true + sudo systemctl start frank-archon >/dev/null 2>&1 || true } trap restore EXIT @@ -57,13 +57,13 @@ fi set -a; . "$ENV_FILE"; set +a # --- stop production; the scratch needs both cards to itself ---------------- -sudo systemctl stop frank-primary >/dev/null 2>&1 || true +sudo systemctl stop frank-archon >/dev/null 2>&1 || true podman rm -f "$SCRATCH" >/dev/null 2>&1 || true # --- fresh prefix-cache tier for a cold prefill (prod's tier untouched) ------ -FRESH_KV="$FRANK_PRIMARY_STATE_DIR/kvcache/$SCRATCH" +FRESH_KV="$FRANK_ARCHON_STATE_DIR/kvcache/$SCRATCH" rm -rf "$FRESH_KV"; mkdir -p "$FRESH_KV" -mkdir -p "$FRANK_PRIMARY_STATE_DIR/tune" +mkdir -p "$FRANK_ARCHON_STATE_DIR/tune" # --- boot the scratch: the production run line, scratch name + fresh KV ------ podman run -d --name "$SCRATCH" \ @@ -72,31 +72,31 @@ podman run -d --name "$SCRATCH" \ --security-opt seccomp=unconfined \ --ulimit memlock=-1:-1 \ --device /dev/kfd --device /dev/dri \ - -v "$FRANK_PRIMARY_MODEL_DIR":/models:ro \ - -v "$FRANK_PRIMARY_STATE_DIR":/data \ - -v "$FRANK_PRIMARY_STATE_DIR/tune":/opt/radiance/share/radiance/tune \ - -v "$FRANK_PRIMARY_TEMPLATE":/templates/template.jinja:ro \ - "$FRANK_PRIMARY_IMAGE" \ - --model "/models/$FRANK_PRIMARY_MODEL_FILE" \ + -v "$FRANK_ARCHON_MODEL_DIR":/models:ro \ + -v "$FRANK_ARCHON_STATE_DIR":/data \ + -v "$FRANK_ARCHON_STATE_DIR/tune":/opt/radiance/share/radiance/tune \ + -v "$FRANK_ARCHON_TEMPLATE":/templates/template.jinja:ro \ + "$FRANK_ARCHON_IMAGE" \ + --model "/models/$FRANK_ARCHON_MODEL_FILE" \ --host :: --port "$PORT" \ - --served-model-name "$FRANK_PRIMARY_SERVED_NAME" \ + --served-model-name "$FRANK_ARCHON_SERVED_NAME" \ --override-chat-template /templates/template.jinja \ - --tp "$FRANK_PRIMARY_TP" --tp-wire "$FRANK_PRIMARY_TP_WIRE" \ - --max-num-seqs "$FRANK_PRIMARY_MAX_SEQS" \ - --max-model-len "$FRANK_PRIMARY_MAX_MODEL_LEN" \ - --placement "$FRANK_PRIMARY_PLACEMENT" \ - --host-pool-mib "$FRANK_PRIMARY_HOST_POOL_MIB" \ - --gpu-headroom-mib "$FRANK_PRIMARY_GPU_HEADROOM_MIB" \ - --vram-weights-mib "$FRANK_PRIMARY_VRAM_WEIGHTS_MIB" \ - --vram-kv-mib "$FRANK_PRIMARY_VRAM_KV_MIB" \ - --kv-cache-dtype "$FRANK_PRIMARY_KV_DTYPE" \ - --prefix-cache-host-mib "$FRANK_PRIMARY_PREFIX_HOST_MIB" \ + --tp "$FRANK_ARCHON_TP" --tp-wire "$FRANK_ARCHON_TP_WIRE" \ + --max-num-seqs "$FRANK_ARCHON_MAX_SEQS" \ + --max-model-len "$FRANK_ARCHON_MAX_MODEL_LEN" \ + --placement "$FRANK_ARCHON_PLACEMENT" \ + --host-pool-mib "$FRANK_ARCHON_HOST_POOL_MIB" \ + --gpu-headroom-mib "$FRANK_ARCHON_GPU_HEADROOM_MIB" \ + --vram-weights-mib "$FRANK_ARCHON_VRAM_WEIGHTS_MIB" \ + --vram-kv-mib "$FRANK_ARCHON_VRAM_KV_MIB" \ + --kv-cache-dtype "$FRANK_ARCHON_KV_DTYPE" \ + --prefix-cache-host-mib "$FRANK_ARCHON_PREFIX_HOST_MIB" \ --prefix-cache-dir "/data/kvcache/$SCRATCH" \ - --prefix-cache-disk-mib "$FRANK_PRIMARY_PREFIX_DISK_MIB" \ - --ngram-placement "$FRANK_PRIMARY_NGRAM_PLACEMENT" \ - --num-speculative-tokens "$FRANK_PRIMARY_SPEC_TOKENS" \ - --max-num-batched-tokens "$FRANK_PRIMARY_MAX_BATCHED_TOKENS" \ - ${FRANK_PRIMARY_EXTRA_ARGS:+$FRANK_PRIMARY_EXTRA_ARGS} \ + --prefix-cache-disk-mib "$FRANK_ARCHON_PREFIX_DISK_MIB" \ + --ngram-placement "$FRANK_ARCHON_NGRAM_PLACEMENT" \ + --num-speculative-tokens "$FRANK_ARCHON_SPEC_TOKENS" \ + --max-num-batched-tokens "$FRANK_ARCHON_MAX_BATCHED_TOKENS" \ + ${FRANK_ARCHON_EXTRA_ARGS:+$FRANK_ARCHON_EXTRA_ARGS} \ > "$LOG" 2>&1 if [ $? -ne 0 ]; then echo "scratch boot failed; see $LOG" >&2; exit 1; fi diff --git a/scripts/autoresearch/frank-primary-arms.sh b/scripts/autoresearch/frank-archon-arms.sh similarity index 81% rename from scripts/autoresearch/frank-primary-arms.sh rename to scripts/autoresearch/frank-archon-arms.sh index 5093bea..847c889 100755 --- a/scripts/autoresearch/frank-primary-arms.sh +++ b/scripts/autoresearch/frank-archon-arms.sh @@ -1,19 +1,19 @@ #!/usr/bin/env bash -# frank-primary-arms.sh — run a SEQUENCE of frank-primary bench arms and keep +# frank-archon-arms.sh — run a SEQUENCE of frank-archon bench arms and keep # every arm's evidence. Runs on the operator box; each arm is one full window # of ./autoresearch.sh (stop+mask -> boot the arm as the service -> measure -> # restore production and verify), so the fleet is only ever down for one arm at # a time and the production unit is back up between arms. # -# An arm is the repo's own frank-primary.env plus an OVERLAY of engine knobs +# An arm is the repo's own frank-archon.env plus an OVERLAY of engine knobs # appended after it (later assignment wins when the serve script sources it), -# staged through FRANK_PRIMARY_AR_ENV_FILE so the checkout is never mutated and +# staged through FRANK_ARCHON_AR_ENV_FILE so the checkout is never mutated and # each arm gets its own fingerprint (the memo can never answer one arm with # another arm's numbers). # -# Usage: scripts/autoresearch/frank-primary-arms.sh [arm ...] -# scripts/autoresearch/frank-primary-arms.sh --list -# Output, under /tmp/frank-primary-arms-/ (override with ARMS_DIR): +# Usage: scripts/autoresearch/frank-archon-arms.sh [arm ...] +# scripts/autoresearch/frank-archon-arms.sh --list +# Output, under /tmp/frank-archon-arms-/ (override with ARMS_DIR): # # .out full autoresearch output (metrics + engine evidence) # .env the exact staged env @@ -26,8 +26,8 @@ set -uo pipefail SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" REPO="$(cd -- "$SCRIPT_DIR/../.." && pwd)" -BASE_ENV="$REPO/scripts/frank-primary.env" -ARMS_DIR="${ARMS_DIR:-/tmp/frank-primary-arms-$(date -u +%Y%m%dT%H%M%SZ)}" +BASE_ENV="$REPO/scripts/frank-archon.env" +ARMS_DIR="${ARMS_DIR:-/tmp/frank-archon-arms-$(date -u +%Y%m%dT%H%M%SZ)}" # --- arms ------------------------------------------------------------------ # baseline: the shipped shape E, measured with THIS harness so the comparison is @@ -45,18 +45,18 @@ LADDER3='{"cudagraph_capture_sizes":[4,8,12],"max_cudagraph_capture_size":12,"in # the engine as {temperature:0.7}. GEN07='{"temperature":0.7}' OVER_B=( - "FRANK_PRIMARY_SPEC='$SPEC3'" - "FRANK_PRIMARY_COMPCONFIG='$LADDER3'" - 'FRANK_PRIMARY_GEN_CONFIG='"'$GEN07'" + "FRANK_ARCHON_SPEC='$SPEC3'" + "FRANK_ARCHON_COMPCONFIG='$LADDER3'" + 'FRANK_ARCHON_GEN_CONFIG='"'$GEN07'" ) # B2: identical to B with the default (7.60 GiB) overhead, i.e. precise memory # OFF. It is the fallback if B dies at graph capture, and it prices the arena # that precise memory buys (7,522 slots -> ~6,496). OVER_B2=( - "FRANK_PRIMARY_SPEC='$SPEC3'" - "FRANK_PRIMARY_COMPCONFIG='$LADDER3'" - 'FRANK_PRIMARY_GEN_CONFIG='"'$GEN07'" - 'FRANK_PRIMARY_PRECISE_MEMORY=' + "FRANK_ARCHON_SPEC='$SPEC3'" + "FRANK_ARCHON_COMPCONFIG='$LADDER3'" + 'FRANK_ARCHON_GEN_CONFIG='"'$GEN07'" + 'FRANK_ARCHON_PRECISE_MEMORY=' ) # C: the vendor's concurrency shape — SEQS 16 with the [4..32] ladder and util # 0.95. This is also the direct test of the theory that pinning the capture @@ -64,12 +64,12 @@ OVER_B2=( # the constant 3, which is NOT in the default ladder; 4 is). LADDER16='{"cudagraph_capture_sizes":[4,8,12,16,20,24,28,32],"max_cudagraph_capture_size":32,"inductor_compile_config":{"combo_kernels":false,"benchmark_combo_kernel":false}}' OVER_C=( - "FRANK_PRIMARY_SPEC='$SPEC3'" - "FRANK_PRIMARY_COMPCONFIG='$LADDER16'" - 'FRANK_PRIMARY_GEN_CONFIG='"'$GEN07'" - 'FRANK_PRIMARY_SEQS=16' - 'FRANK_PRIMARY_MNBT=4096' - 'FRANK_PRIMARY_UTIL=0.95' + "FRANK_ARCHON_SPEC='$SPEC3'" + "FRANK_ARCHON_COMPCONFIG='$LADDER16'" + 'FRANK_ARCHON_GEN_CONFIG='"'$GEN07'" + 'FRANK_ARCHON_SEQS=16' + 'FRANK_ARCHON_MNBT=4096' + 'FRANK_ARCHON_UTIL=0.95' ) # D/E: the CONTEXT arms. Measured 2026-10-02 (arms run 20261002T233855Z): the @@ -83,11 +83,11 @@ OVER_C=( # D is arm B with EXACTLY ONE variable changed (the KV bytes), so its result # says whether the 4k-depth collapse (B 23.09 vs baseline 33.99) was KV or the # batch shape. -KV401K='FRANK_PRIMARY_KV_BYTES=4050000000' +KV401K='FRANK_ARCHON_KV_BYTES=4050000000' OVER_D=( - "FRANK_PRIMARY_SPEC='$SPEC3'" - "FRANK_PRIMARY_COMPCONFIG='$LADDER3'" - 'FRANK_PRIMARY_GEN_CONFIG='"'$GEN07'" + "FRANK_ARCHON_SPEC='$SPEC3'" + "FRANK_ARCHON_COMPCONFIG='$LADDER3'" + 'FRANK_ARCHON_GEN_CONFIG='"'$GEN07'" "$KV401K" ) # E: D with C's max_num_batched_tokens (4096 — C is the only arm that did NOT @@ -97,12 +97,12 @@ OVER_D=( # only 0.32 GiB above the allowance while the CUDA-graph cost is an ANALYTIC # estimate (C's was 1.47 GiB over 24 graphs), so it is measured, not assumed. OVER_E=( - "FRANK_PRIMARY_SPEC='$SPEC3'" - "FRANK_PRIMARY_COMPCONFIG='$LADDER3'" - 'FRANK_PRIMARY_GEN_CONFIG='"'$GEN07'" + "FRANK_ARCHON_SPEC='$SPEC3'" + "FRANK_ARCHON_COMPCONFIG='$LADDER3'" + 'FRANK_ARCHON_GEN_CONFIG='"'$GEN07'" "$KV401K" - 'FRANK_PRIMARY_MNBT=4096' - 'FRANK_PRIMARY_UTIL=0.99' + 'FRANK_ARCHON_MNBT=4096' + 'FRANK_ARCHON_UTIL=0.99' ) arm_overlay() { @@ -142,7 +142,7 @@ for arm in "${ARMS[@]}"; do # holds JSON must still be one valid JSON object after the file is SOURCED # (that is the step that silently eats unquoted braces). if ! bash -c 'set -a; . "$1" >/dev/null; set +a - for k in FRANK_PRIMARY_SPEC FRANK_PRIMARY_COMPCONFIG FRANK_PRIMARY_GEN_CONFIG; do + for k in FRANK_ARCHON_SPEC FRANK_ARCHON_COMPCONFIG FRANK_ARCHON_GEN_CONFIG; do v="${!k:-}" [ -n "$v" ] || continue case "$v" in @@ -158,7 +158,7 @@ for arm in "${ARMS[@]}"; do fi echo "[arms] === $arm: opening window $(date -u +%H:%M:%S)Z ===" >&2 - FRANK_PRIMARY_AR_ENV_FILE="$ARMS_DIR/$arm.env" \ + FRANK_ARCHON_AR_ENV_FILE="$ARMS_DIR/$arm.env" \ "$REPO/autoresearch.sh" >"$ARMS_DIR/$arm.out" 2>&1 rc=$? echo "$rc" >"$ARMS_DIR/$arm.rc" diff --git a/scripts/autoresearch/frank-primary-measure.py b/scripts/autoresearch/frank-archon-measure.py similarity index 98% rename from scripts/autoresearch/frank-primary-measure.py rename to scripts/autoresearch/frank-archon-measure.py index 6974118..3036992 100755 --- a/scripts/autoresearch/frank-primary-measure.py +++ b/scripts/autoresearch/frank-archon-measure.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""frank-primary decode measurement — runs INSIDE the engine container. +"""frank-archon decode measurement — runs INSIDE the engine container. The method is the fleet's established one (the 2026-09-29 / 2026-10-01 tuning campaigns, /home/dank/mtp_measure.py): SSE chunk counting is invalid @@ -28,7 +28,7 @@ Workload (fixed, deterministic, offline): Env: AR_BASE endpoint (default http://127.0.0.1:7770) - AR_MODEL served name (default frank-primary) + AR_MODEL served name (default frank-archon) AR_PROMPT_CEILING hard prompt ceiling in tokens (default 100000) AR_TEMPS comma-separated sampling temperatures (default "0,0.7") diff --git a/scripts/autoresearch/frank-primary-window.sh b/scripts/autoresearch/frank-archon-window.sh similarity index 91% rename from scripts/autoresearch/frank-primary-window.sh rename to scripts/autoresearch/frank-archon-window.sh index 4d9137e..ac22637 100755 --- a/scripts/autoresearch/frank-primary-window.sh +++ b/scripts/autoresearch/frank-archon-window.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# frank-primary-window.sh — one full bench window for frank-primary, run ON +# frank-archon-window.sh — one full bench window for frank-archon, run ON # DANKSERVER as the deploy user (invoked over ssh by ./autoresearch.sh). # # Discipline (AGENTS.md Benchmarking Policy): the production unit is @@ -12,9 +12,9 @@ # # Staging layout (created by the orchestrator, ephemeral — never a config # source; the repo checkout is): -# /home/dank/.autoresearch-frank-primary/ +# /home/dank/.autoresearch-frank-archon/ # serve.sh staged candidate serve script -# frank-primary.env staged candidate env (the candidate knobs) +# frank-archon.env staged candidate env (the candidate knobs) # measure.py the in-container measure client # hash candidate fingerprint # run.json result (metrics + boot + kv + fingerprint) @@ -27,16 +27,16 @@ # outcome; a failed restore forces exit 1). set -uo pipefail -STAGE="${FRANK_PRIMARY_AR_STAGE:-/home/dank/.autoresearch-frank-primary}" -UNIT="${FRANK_PRIMARY_AR_UNIT:-frank-primary}" -CTR="${FRANK_PRIMARY_AR_CTR:-frank-primary-qwen}" +STAGE="${FRANK_ARCHON_AR_STAGE:-/home/dank/.autoresearch-frank-archon}" +UNIT="${FRANK_ARCHON_AR_UNIT:-frank-archon}" +CTR="${FRANK_ARCHON_AR_CTR:-frank-archon-qwen}" HEALTH_URL="http://127.0.0.1:7770/health" MODELS_URL="http://127.0.0.1:7770/v1/models" -BOOT_TIMEOUT="${FRANK_PRIMARY_AR_BOOT_TIMEOUT:-1200}" -RESTORE_TIMEOUT="${FRANK_PRIMARY_AR_RESTORE_TIMEOUT:-1200}" -MEASURE_TIMEOUT="${FRANK_PRIMARY_AR_MEASURE_TIMEOUT:-1800}" -SERVED="$(sed -n 's/^FRANK_PRIMARY_SERVED_NAME=//p' "$STAGE/frank-primary.env" 2>/dev/null | head -1)" -SERVED="${SERVED:-frank-primary}" +BOOT_TIMEOUT="${FRANK_ARCHON_AR_BOOT_TIMEOUT:-1200}" +RESTORE_TIMEOUT="${FRANK_ARCHON_AR_RESTORE_TIMEOUT:-1200}" +MEASURE_TIMEOUT="${FRANK_ARCHON_AR_MEASURE_TIMEOUT:-1800}" +SERVED="$(sed -n 's/^FRANK_ARCHON_SERVED_NAME=//p' "$STAGE/frank-archon.env" 2>/dev/null | head -1)" +SERVED="${SERVED:-frank-archon}" RESTORED=0 @@ -72,7 +72,7 @@ capture_bench_failure() { echo "=== staged serve.out (tail 60) ===" tail -60 "$STAGE/serve.out" 2>/dev/null || true echo "=== engine log (tail 60) ===" - tail -60 /home/dank/logs/frank_primary.log 2>/dev/null || true + tail -60 /home/dank/logs/frank_archon.log 2>/dev/null || true } >"$STAGE/fail.log" 2>&1 || true grep -E 'OutOfMemory|Tried to allocate|Engine core initialization failed|Error|error' \ "$STAGE/fail.log" 2>/dev/null | tail -25 >&2 || true @@ -114,7 +114,7 @@ trap 'restore; rc=$?; [ "$rc" -ne 0 ] && exit 1' EXIT main() { local f - for f in serve.sh frank-primary.env measure.py hash; do + for f in serve.sh frank-archon.env measure.py hash; do [ -f "$STAGE/$f" ] || { log "staged file missing: $STAGE/$f"; exit 1; } done mkdir -p "$STAGE/last" @@ -133,7 +133,7 @@ main() { t0="$(date +%s)" log "starting bench instance from staged config (fingerprint $(tr -d '[:space:]' <"$STAGE/hash"))" - FRANK_PRIMARY_ENV_FILE="$STAGE/frank-primary.env" \ + FRANK_ARCHON_ENV_FILE="$STAGE/frank-archon.env" \ setsid nohup bash "$STAGE/serve.sh" >"$STAGE/serve.out" 2>&1 "$STAGE/serve.pid" diff --git a/scripts/bench-decode.sh b/scripts/bench-decode.sh index 9431ca0..a9f6d7b 100755 --- a/scripts/bench-decode.sh +++ b/scripts/bench-decode.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Decode throughput benchmark for frank-large. +# Decode throughput benchmark for frank-dragoon. # Measures generation tok/s with 8K+ token prompts and 256 generated tokens. set -euo pipefail @@ -75,7 +75,7 @@ print(json.dumps(' '.join(words))) t0=$(date +%s%N) resp=$(curl -s -m 600 http://127.0.0.1:$PORT/v1/chat/completions \ -H "Content-Type: application/json" \ - -d "{\"model\":\"frank-large\",\"messages\":[{\"role\":\"user\",\"content\":$prompt}],\"max_tokens\":$N_GEN,\"stream\":false}" 2>&1) + -d "{\"model\":\"frank-dragoon\",\"messages\":[{\"role\":\"user\",\"content\":$prompt}],\"max_tokens\":$N_GEN,\"stream\":false}" 2>&1) t1=$(date +%s%N) if ! echo "$resp" | python3 -c "import sys,json; json.load(sys.stdin)" 2>/dev/null; then diff --git a/scripts/bench-threads-batch-http.py b/scripts/bench-threads-batch-http.py index d6fe095..bb26cb3 100755 --- a/scripts/bench-threads-batch-http.py +++ b/scripts/bench-threads-batch-http.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -HTTP-based prefill-throughput sweep for frank-large. +HTTP-based prefill-throughput sweep for frank-dragoon. Starts the server with a given --threads-batch value, sends a 64K-prompt via the chat API (max_tokens=0), measures prompt_tokens/wall_time. diff --git a/scripts/bench-threads-batch.sh b/scripts/bench-threads-batch.sh index 39b5a65..71ba448 100755 --- a/scripts/bench-threads-batch.sh +++ b/scripts/bench-threads-batch.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Threads-batch sweep for frank-large on dankclaw +# Threads-batch sweep for frank-dragoon on dankclaw # Benches prefill throughput at 65536 prompt tokens across threads-batch values. set -uo pipefail @@ -10,7 +10,7 @@ TB_LIST=(16 32 48 64 80 96 128) ENV_FILE="/home/dank/GitPackages/ROCmFPX/build-qwen38/bin" echo "========================================" -echo "THREADS-BATCH SWEEP — frank-large" +echo "THREADS-BATCH SWEEP — frank-dragoon" echo "Model: $(basename "$MODEL") ($(du -h "$MODEL" | cut -f1))" echo "Threads-batch values: ${TB_LIST[*]}" echo "Prompt: 65536 tokens, n-gen: 0 (prefill-only)" diff --git a/scripts/bench-ubatch.sh b/scripts/bench-ubatch.sh index 87041f9..91317fe 100755 --- a/scripts/bench-ubatch.sh +++ b/scripts/bench-ubatch.sh @@ -1,14 +1,14 @@ #!/usr/bin/env bash -# Benchmark ubatch with llama-bench for frank-large. +# Benchmark ubatch with llama-bench for frank-dragoon. # # This is intentionally a ubatch-only benchmark. It uses one llama-bench # process, an 8K prompt workload, and equal batch/ubatch values. No server # process, HTTP requests, or log scraping are used. # -# Run on Dankclaw after stopping frank-large: -# sudo systemctl stop frank-large +# Run on Dankclaw after stopping frank-dragoon: +# sudo systemctl stop frank-dragoon # ./scripts/bench-ubatch.sh -# sudo systemctl start frank-large +# sudo systemctl start frank-dragoon set -euo pipefail : "${LLAMA_BENCH:=/home/dank/GitPackages/ROCmFPX/build-strix-rocmfp4/bin/llama-bench}" diff --git a/scripts/build-frank-primary-rad.sh b/scripts/build-frank-archon-rad.sh similarity index 90% rename from scripts/build-frank-primary-rad.sh rename to scripts/build-frank-archon-rad.sh index 3fb08ee..7fdde48 100755 --- a/scripts/build-frank-primary-rad.sh +++ b/scripts/build-frank-archon-rad.sh @@ -1,11 +1,11 @@ #!/usr/bin/env bash -# build-frank-primary-rad.sh — build frank-primary's .rad container from the +# build-frank-archon-rad.sh — build frank-archon's .rad container from the # OFFICIAL Qwen/Qwen3.8-Flash-Next-FP8 checkpoint, at NATIVE precision. # -# bash scripts/build-frank-primary-rad.sh # convert -# bash scripts/build-frank-primary-rad.sh --plan-only # declare, no I/O -# bash scripts/build-frank-primary-rad.sh --restage # redo staging -# bash scripts/build-frank-primary-rad.sh --force # rebuild existing +# bash scripts/build-frank-archon-rad.sh # convert +# bash scripts/build-frank-archon-rad.sh --plan-only # declare, no I/O +# bash scripts/build-frank-archon-rad.sh --restage # redo staging +# bash scripts/build-frank-archon-rad.sh --force # rebuild existing # # WHY A STAGING DIR (the one non-obvious step): rad-convert selects its # architecture plugin by the checkpoint's quantisation DESCRIPTOR — @@ -55,8 +55,8 @@ OUT="$OUT_DIR/qwen4exp-fp8-native.rad" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck disable=SC1091 -source "$SCRIPT_DIR/frank-primary.env" -IMAGE="$FRANK_PRIMARY_IMAGE" +source "$SCRIPT_DIR/frank-archon.env" +IMAGE="$FRANK_ARCHON_IMAGE" plan_only=0 restage=0 force=0 for a in "$@"; do @@ -69,11 +69,11 @@ for a in "$@"; do done if [ ! -f "$SRC/config.json" ]; then - echo "ERROR: raw checkpoint missing: $SRC (run scripts/download-frank-primary.sh --fetch)" >&2 + echo "ERROR: raw checkpoint missing: $SRC (run scripts/download-frank-archon.sh --fetch)" >&2 exit 1 fi echo "verifying raw checkpoint first..." -bash "$SCRIPT_DIR/download-frank-primary.sh" +bash "$SCRIPT_DIR/download-frank-archon.sh" if [ -f "$OUT" ] && [ "$plan_only" -eq 0 ] && [ "$force" -eq 0 ]; then echo "container already exists: $OUT" @@ -83,7 +83,7 @@ fi # ---- staging ---------------------------------------------------------------- if [ "$restage" -eq 1 ] && [ -e "$STAGE" ]; then - TRASH="$HOME/.AGENTTRASH/$(date +%Y%m%d)-frank-primary-stage" + TRASH="$HOME/.AGENTTRASH/$(date +%Y%m%d)-frank-archon-stage" mkdir -p "$TRASH" mv "$STAGE" "$TRASH/stage-$(date +%H%M%S)" echo "old staging dir moved to $TRASH" @@ -138,7 +138,7 @@ CONVERT_ARGS=(/models/stage-qwen4exp-fp8 -o /models/rad/qwen4exp-fp8-native.rad # exactly and the plugin's one-element scale plane is produced. CONVERT_ARGS+=(--quant "blk.*.ple_ngram.weight=rtn:codes=fp8_e4m3,block=*x*,scale=bf16,rule=fixed,scale_value=$PLE_SCALE") [ "$force" -eq 1 ] && [ -f "$OUT" ] && { - TRASH="$HOME/.AGENTTRASH/$(date +%Y%m%d)-frank-primary-rad" + TRASH="$HOME/.AGENTTRASH/$(date +%Y%m%d)-frank-archon-rad" mkdir -p "$TRASH" mv "$OUT" "$TRASH/qwen4exp-fp8-native.rad.$(date +%H%M%S)" echo "previous container moved to $TRASH" @@ -158,8 +158,8 @@ echo "rad-info summary:" podman run --rm --entrypoint rad-info -v /home/dank/models:/models:ro \ "$IMAGE" "/models/rad/qwen4exp-fp8-native.rad" | head -20 MIB=$(( $(stat -c %s "$OUT") / 1048576 )) -echo "container: $OUT (${MIB} MiB; env floor $FRANK_PRIMARY_RAD_MIN_MIB MiB)" -if [ "$MIB" -lt "$FRANK_PRIMARY_RAD_MIN_MIB" ]; then +echo "container: $OUT (${MIB} MiB; env floor $FRANK_ARCHON_RAD_MIN_MIB MiB)" +if [ "$MIB" -lt "$FRANK_ARCHON_RAD_MIN_MIB" ]; then echo "ERROR: container below the env floor — the convert was truncated" >&2 exit 1 fi diff --git a/scripts/build-gufo.sh b/scripts/build-gufo.sh index 9771562..f6f90ca 100755 --- a/scripts/build-gufo.sh +++ b/scripts/build-gufo.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Build the gufo runtime that serves frank-large on Dankclaw. +# Build the gufo runtime that serves frank-dragoon on Dankclaw. # # bash scripts/build-gufo.sh # build + install the pinned tag # bash scripts/build-gufo.sh --verify # only check the installed tree @@ -93,4 +93,4 @@ cmake --install build/release echo "== verify ==" "$PREFIX/bin/gufo" diagnose -echo "frank-large runtime ready: $PREFIX/bin/gufo ($GUFO_TAG @ $commit)" +echo "frank-dragoon runtime ready: $PREFIX/bin/gufo ($GUFO_TAG @ $commit)" diff --git a/scripts/build-rocmfpx.sh b/scripts/build-rocmfpx.sh index 0644304..e39061b 100755 --- a/scripts/build-rocmfpx.sh +++ b/scripts/build-rocmfpx.sh @@ -1,11 +1,11 @@ #!/usr/bin/env bash -# Build the ROCmFPX runtime that serves frank-large on Dankclaw. +# Build the ROCmFPX runtime that serves frank-dragoon on Dankclaw. # # bash scripts/build-rocmfpx.sh # clone/fetch + build the pin # bash scripts/build-rocmfpx.sh --verify # only check the installed tree # # Runtime: kingjones30/ROCmFPX — charlie12345/ROCmFPX plus the model-card -# patches, i.e. the fork that owns the ROCmFPx tensor formats. frank-large's +# patches, i.e. the fork that owns the ROCmFPx tensor formats. frank-dragoon's # payload is ftype 115 (`Q8_0_ROCMFPX_AGENT`): 311 tensors of # GGML_TYPE_Q8_0_ROCMFPX (103), a type that exists ONLY in this fork, so # stock llama.cpp, gufo and every other loader on the host reject the file. @@ -30,7 +30,7 @@ set -euo pipefail ROCMFPX_REPO="${ROCMFPX_REPO:-https://github.com/kingjones30/ROCmFPX.git}" -# The commit frank-large was qualified with (measured 2026-10-02). +# The commit frank-dragoon was qualified with (measured 2026-10-02). ROCMFPX_COMMIT="${ROCMFPX_COMMIT:-36e9acd40e10a87cd3c3ef8ec734668757dc8520}" SRC_DIR="${ROCMFPX_SRC_DIR:-/home/dank/GitPackages/kingjones-ROCmFPX}" BUILD_DIR="${ROCMFPX_BUILD_DIR:-$SRC_DIR/build}" @@ -86,4 +86,4 @@ cmake --build "$BUILD_DIR" --target llama-server llama-quantize -j "$JOBS" echo "== verify ==" "$BUILD_DIR/bin/llama-server" --version | head -1 -echo "frank-large runtime ready: $BUILD_DIR/bin/llama-server ($ROCMFPX_COMMIT)" +echo "frank-dragoon runtime ready: $BUILD_DIR/bin/llama-server ($ROCMFPX_COMMIT)" diff --git a/scripts/dankstatus.sh b/scripts/dankstatus.sh index ca113b5..3c252b4 100755 --- a/scripts/dankstatus.sh +++ b/scripts/dankstatus.sh @@ -57,9 +57,9 @@ else echo " none" fi -section "frank-primary unit" -printf ' active: %s\n' "$(systemctl is-active frank-primary 2>/dev/null | head -1)" -printf ' enabled: %s\n' "$(systemctl is-enabled frank-primary 2>/dev/null | head -1)" +section "frank-archon unit" +printf ' active: %s\n' "$(systemctl is-active frank-archon 2>/dev/null | head -1)" +printf ' enabled: %s\n' "$(systemctl is-enabled frank-archon 2>/dev/null | head -1)" section "glm serve tail" if podman ps -a --format '{{.Names}}' 2>/dev/null | grep -qx "$GLM_CTR"; then diff --git a/scripts/deploy-plan.py b/scripts/deploy-plan.py index e65e7c1..8decde7 100755 --- a/scripts/deploy-plan.py +++ b/scripts/deploy-plan.py @@ -61,9 +61,9 @@ SERVICE_ORDER = ( "sonarr", "lidarr", "readarr", - "frank-large", - "frank-secondary", - "frank-primary", + "frank-dragoon", + "frank-zealot", + "frank-archon", ) DANKCLAW_SERVICES = { @@ -93,8 +93,8 @@ DANKCLAW_SERVICES = { "authentik-outpost-ldap", "caddy", "homepage", - "frank-large", - "frank-secondary", + "frank-dragoon", + "frank-zealot", } DANKSERVER_SERVICES = { @@ -113,7 +113,7 @@ DANKSERVER_SERVICES = { "sonarr", "lidarr", "readarr", - "frank-primary", + "frank-archon", "node-exporter", } @@ -316,7 +316,7 @@ def services_for_path(path: str, target: str) -> set[str]: if len(parts) >= 2 and parts[1] == "open-webui": _add(services, "open-webui") return services - # frank-large left the quadlet shape on 2026-09-19 (CIRU v4.4.1 host + # frank-dragoon left the quadlet shape on 2026-09-19 (CIRU v4.4.1 host # build, root unit): its files live in scripts/ and map there. if len(parts) >= 2 and parts[1] == "observability": # The five observability containers became Quadlet units on @@ -371,10 +371,10 @@ def services_for_path(path: str, target: str) -> set[str]: if name == "node-exporter": _add(services, "node-exporter") return services - # frank-primary's quadlet-era directory left the tree on 2026-09-26 + # frank-archon's quadlet-era directory left the tree on 2026-09-26 # (the Lucebox DS4.1 unit was retired for the llama.cpp root unit — # the trio in scripts/ now maps it). Nothing lives under - # dankserver/frank-primary/ except dated trash, and trash plans + # dankserver/frank-archon/ except dated trash, and trash plans # nothing (the retire rule above the service blocks). return services @@ -400,32 +400,32 @@ def services_for_path(path: str, target: str) -> set[str]: # change to it redeploying alertmanager is the only path that # reaches it on the host. _add(services, "alertmanager") - if name in {"frank-secondary.env", "frank-secondary.service", "serve-frank-secondary.sh"}: - # llama.cpp frank-secondary (2026-09-16) keeps its unit, env and serve - # files here; each one selects frank-secondary only. The ik_llama.cpp + if name in {"frank-zealot.env", "frank-zealot.service", "serve-frank-zealot.sh"}: + # llama.cpp frank-zealot (2026-09-16) keeps its unit, env and serve + # files here; each one selects frank-zealot only. The ik_llama.cpp # trio that lived here for two days is in scripts/.AGENTTRASH/, # which is archive material and plans nothing. - _add(services, "frank-secondary") - if name in {"frank-large.env", "frank-large.service", "serve-frank-large.sh"}: - # CIRU v4.4.1 frank-large (2026-09-19) keeps its unit, env and + _add(services, "frank-zealot") + if name in {"frank-dragoon.env", "frank-dragoon.service", "serve-frank-dragoon.sh"}: + # CIRU v4.4.1 frank-dragoon (2026-09-19) keeps its unit, env and # serve files here the same way: a root unit on a host-built # runtime. The download script fetches the payload, which is # host-side state, so it selects nothing. - _add(services, "frank-large") + _add(services, "frank-dragoon") if name == "qwen-sharp-v22.4.0.jinja": - # The Qwen-Sharp chat template frank-large loads via + # The Qwen-Sharp chat template frank-dragoon loads via # --chat-template-file. It lived under dankserver/frank-medium/ until # the 2026-09-26 cutover retired that directory; editing it changes - # what the live frank-large endpoint renders, so it plans - # frank-large. - _add(services, "frank-large") - if name in {"frank-primary.env", "frank-primary.service", "serve-frank-primary.sh"}: - # llama.cpp frank-primary (2026-09-26, replacing the Lucebox + # what the live frank-dragoon endpoint renders, so it plans + # frank-dragoon. + _add(services, "frank-dragoon") + if name in {"frank-archon.env", "frank-archon.service", "serve-frank-archon.sh"}: + # llama.cpp frank-archon (2026-09-26, replacing the Lucebox # DS4.1 quadlet) keeps its unit, env and serve files here the # same way: a root unit on the unsloth b11030-mix prebuilt # serving Qwen3.8-Flash-Next Q8_0. The download script fetches # the payload, which is host-side state, so it selects nothing. - _add(services, "frank-primary") + _add(services, "frank-archon") # Deployment/test/benchmark scripts and other repo tooling do not # restart a runtime service. return services diff --git a/scripts/deploy-remote.sh b/scripts/deploy-remote.sh index cbeae99..4444b51 100755 --- a/scripts/deploy-remote.sh +++ b/scripts/deploy-remote.sh @@ -90,12 +90,12 @@ service_is_allowed() { dankclaw:authentik-postgres|dankclaw:authentik-server|\ dankclaw:authentik-worker|dankclaw:authentik-outpost|dankclaw:authentik-outpost-ldap|dankclaw:anubis|\ dankclaw:caddy|dankclaw:homepage|dankclaw:seerr|dankclaw:marreta|\ - dankclaw:frank-large|dankclaw:frank-secondary|\ + dankclaw:frank-dragoon|dankclaw:frank-zealot|\ dankserver:romm-mariadb|dankserver:romm-redis|dankserver:romm|\ dankserver:copyparty|dankserver:jellyfin|dankserver:calibre-web|dankserver:calibre-server|dankserver:plex|dankserver:tautulli|\ dankserver:prowlarr|dankserver:qbittorrent|dankserver:radarr|\ dankserver:sonarr|dankserver:lidarr|dankserver:readarr|\ - dankserver:frank-primary|dankserver:node-exporter|\ + dankserver:frank-archon|dankserver:node-exporter|\ frankbook-pro:gluetun|frankbook-pro:qbittorrent|frankbook-pro:prowlarr|\ frankbook-pro:radarr|frankbook-pro:sonarr|frankbook-pro:lidarr|\ frankbook-pro:readarr) @@ -192,7 +192,7 @@ add_pending_services() { continue fi [[ -n "$recorded" && "$recorded" != "$REVISION" ]] || continue - if [[ "$TARGET" == dankserver && "$service" == frank-large ]]; then continue; fi + if [[ "$TARGET" == dankserver && "$service" == frank-dragoon ]]; then continue; fi if ! changed="$(python3 scripts/deploy-plan.py --target "$TARGET" \ --repo "$REMOTE_DIR" --base "$recorded" --head "$REVISION")"; then echo "WARN: unable to compare state for $service; retaining it as pending" >&2 @@ -1092,21 +1092,21 @@ deploy_anubis() { wait_container_healthy anubis 60 || return 1 } -# frank-large is the halogen-flash-server CONTAINER (0.16.2, digest-pinned -# through scripts/frank-large.env) serving the Quat3rnion ABLITERATED +# frank-dragoon is the halogen-flash-server CONTAINER (0.16.2, digest-pinned +# through scripts/frank-dragoon.env) serving the Quat3rnion ABLITERATED # Swift1.5 finetune of peonist's Qwen3.8-Flash-Next v2 checkpoint — # qwen38-flash-next-v2-swift15-abliterated.hgn (66,687,678,464 B, ~62 GiB # resident) + the REQUIRED n-gram lookup table + the vision tower — # MTP spec decode (HALOGEN_SPEC_ADAPT=0), 2 slots x 200192, image input — # on the Strix Halo iGPU. It stays a ROOT unit because the serve script -# drives `podman run` directly (the frank-primary pattern): relink_unit -# points /etc/systemd/system/frank-large.service at the repo file, boot +# drives `podman run` directly (the frank-archon pattern): relink_unit +# points /etc/systemd/system/frank-dragoon.service at the repo file, boot # persistence is that unit's [Install], and LimitMEMLOCK=infinity is # fleet parity. 2026-10-06 cutover from the halogen 27B-dense shape — # rollback = revert the swap commit's trio; the 27B payload stays on # disk (~/models/halogen-qwen3.8-27b). # -# The gates mirror serve-frank-large.sh's predicates EXACTLY (the +# The gates mirror serve-frank-dragoon.sh's predicates EXACTLY (the # 2026-10-01 crash-loop lesson): image digest in dank's podman storage, # each .hgn payload (checkpoint, n-gram table, vision tower) at the exact # byte count, the tokenizer directory holding every named file as a @@ -1114,23 +1114,23 @@ deploy_anubis() { # artifact would leave a restart-looping unit and a dark endpoint. The # port gate is the same as every cutover since 2026-09-16: nothing # starts until 7770 is released. -LLM_LARGE_IMAGE="${LLM_LARGE_IMAGE:-ghcr.io/peonist-ai/halogen-flash-server@sha256:0c61bf84ac22308a53f5d1ca6b86806702d7039e5ebc51cae4c66621b92fe04a}" -LLM_LARGE_CKPT="${LLM_LARGE_CKPT:-/home/dank/models/halogen-flashnext-v2/qwen38-flash-next-v2-swift15-abliterated.hgn}" -LLM_LARGE_CKPT_BYTES="${LLM_LARGE_CKPT_BYTES:-66687678464}" -LLM_LARGE_NGRAM="${LLM_LARGE_NGRAM:-/home/dank/models/halogen-flashnext-v2/qwen38-flash-next-ngram.hgn}" -LLM_LARGE_NGRAM_BYTES="${LLM_LARGE_NGRAM_BYTES:-51200246144}" -LLM_LARGE_VISION="${LLM_LARGE_VISION:-/home/dank/models/halogen-flashnext-v2/qwen38-flash-next-vision.hgn}" -LLM_LARGE_VISION_BYTES="${LLM_LARGE_VISION_BYTES:-897916416}" -LLM_LARGE_TOK_DIR="${LLM_LARGE_TOK_DIR:-/home/dank/models/halogen-flashnext-v2/tokenizer}" -LLM_LARGE_TOK_FILES="${LLM_LARGE_TOK_FILES:-tokenizer.json chat_template.jinja tokenizer_config.json merges.txt vocab.json generation_config.json}" +LLM_DRAGOON_IMAGE="${LLM_DRAGOON_IMAGE:-ghcr.io/peonist-ai/halogen-flash-server@sha256:0c61bf84ac22308a53f5d1ca6b86806702d7039e5ebc51cae4c66621b92fe04a}" +LLM_DRAGOON_CKPT="${LLM_DRAGOON_CKPT:-/home/dank/models/halogen-flashnext-v2/qwen38-flash-next-v2-swift15-abliterated.hgn}" +LLM_DRAGOON_CKPT_BYTES="${LLM_DRAGOON_CKPT_BYTES:-66687678464}" +LLM_DRAGOON_NGRAM="${LLM_DRAGOON_NGRAM:-/home/dank/models/halogen-flashnext-v2/qwen38-flash-next-ngram.hgn}" +LLM_DRAGOON_NGRAM_BYTES="${LLM_DRAGOON_NGRAM_BYTES:-51200246144}" +LLM_DRAGOON_VISION="${LLM_DRAGOON_VISION:-/home/dank/models/halogen-flashnext-v2/qwen38-flash-next-vision.hgn}" +LLM_DRAGOON_VISION_BYTES="${LLM_DRAGOON_VISION_BYTES:-897916416}" +LLM_DRAGOON_TOK_DIR="${LLM_DRAGOON_TOK_DIR:-/home/dank/models/halogen-flashnext-v2/tokenizer}" +LLM_DRAGOON_TOK_FILES="${LLM_DRAGOON_TOK_FILES:-tokenizer.json chat_template.jinja tokenizer_config.json merges.txt vocab.json generation_config.json}" -retire_halogen_large_quadlet() { +retire_halogen_dragoon_quadlet() { local trash="$HOME/.AGENTTRASH/20260919-orca-cutover/quadlet" - systemctl --user stop frank-large.service 2>/dev/null || true - if [[ -e "$quadlet_unit_dir/frank-large.container" ]]; then + systemctl --user stop frank-dragoon.service 2>/dev/null || true + if [[ -e "$quadlet_unit_dir/frank-dragoon.container" ]]; then mkdir -p "$trash" - mv -- "$quadlet_unit_dir/frank-large.container" "$trash/frank-large.container" - echo "retired quadlet frank-large.container -> $trash" + mv -- "$quadlet_unit_dir/frank-dragoon.container" "$trash/frank-dragoon.container" + echo "retired quadlet frank-dragoon.container -> $trash" fi systemctl --user daemon-reload } @@ -1154,165 +1154,165 @@ wait_port_free() { return 1 } -deploy_llm_large() { +deploy_llm_dragoon() { # Refuse rather than restart-loop; every gate below has a twin in - # serve-frank-large.sh and they must agree (2026-10-01 lesson). + # serve-frank-dragoon.sh and they must agree (2026-10-01 lesson). # Capture podman output before grepping: `podman images | grep -q` # races under pipefail (SIGPIPE 141 becomes "no match", 2026-09-30). - if ! grep -qF "${LLM_LARGE_IMAGE#*@}" <<<"$(podman images --format '{{.RepoDigests}}' 2>/dev/null)"; then - echo "ERROR: halogen image absent: $LLM_LARGE_IMAGE" >&2 - echo "frank-large: pull it: podman pull ${LLM_LARGE_IMAGE%@*}" >&2 + if ! grep -qF "${LLM_DRAGOON_IMAGE#*@}" <<<"$(podman images --format '{{.RepoDigests}}' 2>/dev/null)"; then + echo "ERROR: halogen image absent: $LLM_DRAGOON_IMAGE" >&2 + echo "frank-dragoon: pull it: podman pull ${LLM_DRAGOON_IMAGE%@*}" >&2 return 1 fi - if [[ ! -f "$LLM_LARGE_CKPT" ]]; then - echo "ERROR: halogen checkpoint absent at $LLM_LARGE_CKPT" >&2 - echo "frank-large: fetch it: bash scripts/download-frank-large-flashnext.sh" >&2 + if [[ ! -f "$LLM_DRAGOON_CKPT" ]]; then + echo "ERROR: halogen checkpoint absent at $LLM_DRAGOON_CKPT" >&2 + echo "frank-dragoon: fetch it: bash scripts/download-frank-dragoon-flashnext.sh" >&2 return 1 fi - if [[ "$(stat -c %s "$LLM_LARGE_CKPT")" != "$LLM_LARGE_CKPT_BYTES" ]]; then - echo "ERROR: halogen checkpoint is not $LLM_LARGE_CKPT_BYTES bytes (partial download?)" >&2 - echo "frank-large: re-check: bash scripts/download-frank-large-flashnext.sh --verify-only" >&2 + if [[ "$(stat -c %s "$LLM_DRAGOON_CKPT")" != "$LLM_DRAGOON_CKPT_BYTES" ]]; then + echo "ERROR: halogen checkpoint is not $LLM_DRAGOON_CKPT_BYTES bytes (partial download?)" >&2 + echo "frank-dragoon: re-check: bash scripts/download-frank-dragoon-flashnext.sh --verify-only" >&2 return 1 fi - for gate in "$LLM_LARGE_NGRAM:$LLM_LARGE_NGRAM_BYTES:n-gram table" \ - "$LLM_LARGE_VISION:$LLM_LARGE_VISION_BYTES:vision tower"; do + for gate in "$LLM_DRAGOON_NGRAM:$LLM_DRAGOON_NGRAM_BYTES:n-gram table" \ + "$LLM_DRAGOON_VISION:$LLM_DRAGOON_VISION_BYTES:vision tower"; do IFS=: read -r gpath gbytes gname <<<"$gate" if [[ ! -f "$gpath" ]]; then echo "ERROR: halogen $gname absent at $gpath" >&2 - echo "frank-large: fetch it: bash scripts/download-frank-large-flashnext.sh" >&2 + echo "frank-dragoon: fetch it: bash scripts/download-frank-dragoon-flashnext.sh" >&2 return 1 fi if [[ "$(stat -c %s "$gpath")" != "$gbytes" ]]; then echo "ERROR: halogen $gname is not $gbytes bytes (partial download?)" >&2 - echo "frank-large: re-check: bash scripts/download-frank-large-flashnext.sh --verify-only" >&2 + echo "frank-dragoon: re-check: bash scripts/download-frank-dragoon-flashnext.sh --verify-only" >&2 return 1 fi done - if [[ -L "$LLM_LARGE_TOK_DIR" || ! -d "$LLM_LARGE_TOK_DIR" ]]; then - echo "ERROR: tokenizer dir missing or a symlink at $LLM_LARGE_TOK_DIR" >&2 - echo "frank-large: fetch it: bash scripts/download-frank-large-flashnext.sh" >&2 + if [[ -L "$LLM_DRAGOON_TOK_DIR" || ! -d "$LLM_DRAGOON_TOK_DIR" ]]; then + echo "ERROR: tokenizer dir missing or a symlink at $LLM_DRAGOON_TOK_DIR" >&2 + echo "frank-dragoon: fetch it: bash scripts/download-frank-dragoon-flashnext.sh" >&2 return 1 fi - for tf in $LLM_LARGE_TOK_FILES; do - if [[ ! -f "$LLM_LARGE_TOK_DIR/$tf" || -L "$LLM_LARGE_TOK_DIR/$tf" ]]; then - echo "ERROR: tokenizer file missing or a symlink: $LLM_LARGE_TOK_DIR/$tf" >&2 - echo "frank-large: fetch it: bash scripts/download-frank-large-flashnext.sh" >&2 + for tf in $LLM_DRAGOON_TOK_FILES; do + if [[ ! -f "$LLM_DRAGOON_TOK_DIR/$tf" || -L "$LLM_DRAGOON_TOK_DIR/$tf" ]]; then + echo "ERROR: tokenizer file missing or a symlink: $LLM_DRAGOON_TOK_DIR/$tf" >&2 + echo "frank-dragoon: fetch it: bash scripts/download-frank-dragoon-flashnext.sh" >&2 return 1 fi done - retire_halogen_large_quadlet + retire_halogen_dragoon_quadlet # The predecessor on a re-deploy is THIS unit: stop it (ExecStop stops # the container) before waiting on the port. The stray sweep is keyed # on the FULL container name, which appears in the argv of a manual - # `podman run --name frank-large-halogen` / `podman wait` but NOT in + # `podman run --name frank-dragoon-halogen` / `podman wait` but NOT in # this deployer's own command line (`bash deploy-remote.sh - # frank-large`) — so it cannot shoot itself in the foot (the fleet - # pkill law), and it can never match frank-secondary's llama-server. - run_privileged systemctl stop frank-large.service 2>/dev/null || true - pkill -f 'frank-large-halogen' 2>/dev/null || true - podman rm -f frank-large frank-large-halogen >/dev/null 2>&1 || true + # frank-dragoon`) — so it cannot shoot itself in the foot (the fleet + # pkill law), and it can never match frank-zealot's llama-server. + run_privileged systemctl stop frank-dragoon.service 2>/dev/null || true + pkill -f 'frank-dragoon-halogen' 2>/dev/null || true + podman rm -f frank-dragoon frank-dragoon-halogen >/dev/null 2>&1 || true # Nothing may start until the predecessor has released the port # (2026-09-16: "Deactivated successfully" was not "port free"). wait_port_free 7770 || return 1 - relink_unit frank-large + relink_unit frank-dragoon run_privileged systemctl daemon-reload - run_privileged systemctl enable frank-large.service - run_privileged systemctl restart frank-large.service - wait_for_health frank-large http://127.0.0.1:7770/health 1200 + run_privileged systemctl enable frank-dragoon.service + run_privileged systemctl restart frank-dragoon.service + wait_for_health frank-dragoon http://127.0.0.1:7770/health 1200 } -# deploy_llm_secondary — frank-secondary is llama.cpp (master build, CUDA sm_86) on +# deploy_llm_zealot — frank-zealot is llama.cpp (master build, CUDA sm_86) on # the RTX 3090 as a ROOT unit: the runtime is a native binary tree under # ~/GitPackages/llama-master/build-cuda, so there is no container image and # no generated unit to avoid. relink_unit points -# /etc/systemd/system/frank-secondary.service at the repo file and boot +# /etc/systemd/system/frank-zealot.service at the repo file and boot # persistence is that unit's [Install] section. # -# It is a SEPARATE endpoint on port 7771; frank-large keeps 7770. The 3090 is -# not shared: frank-large's engine runs on the gfx1151 iGPU. -LLM_SECONDARY_MODEL_FILE="${LLM_SECONDARY_MODEL_FILE:-/home/dank/models/Qwen35-9B-HauhauCS-Q6K/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q6_K.gguf}" -LLM_SECONDARY_RUNTIME="${LLM_SECONDARY_RUNTIME:-/home/dank/GitPackages/llama-master/build-cuda/bin/llama-server}" +# It is a SEPARATE endpoint on port 7771; frank-dragoon keeps 7770. The 3090 is +# not shared: frank-dragoon's engine runs on the gfx1151 iGPU. +LLM_ZEALOT_MODEL_FILE="${LLM_ZEALOT_MODEL_FILE:-/home/dank/models/Qwen35-9B-HauhauCS-Q6K/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q6_K.gguf}" +LLM_ZEALOT_RUNTIME="${LLM_ZEALOT_RUNTIME:-/home/dank/GitPackages/llama-master/build-cuda/bin/llama-server}" # The projector IS the vision capability here: the model is natively # multimodal and the Q6_K file carries no vision tensors — the publisher ships # its own BF16 projector in the same repo, so a deploy that starts without # this file silently ships a text-only endpoint. Checked unconditionally, like -# frank-large's. -LLM_SECONDARY_MMPROJ="${LLM_SECONDARY_MMPROJ:-/home/dank/models/Qwen35-9B-HauhauCS-Q6K/mmproj-Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-BF16.gguf}" +# frank-dragoon's. +LLM_ZEALOT_MMPROJ="${LLM_ZEALOT_MMPROJ:-/home/dank/models/Qwen35-9B-HauhauCS-Q6K/mmproj-Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-BF16.gguf}" -deploy_llm_secondary() { +deploy_llm_zealot() { # Refuse rather than restart-loop: a unit whose runtime or payload is # missing never becomes healthy, and a green deploy would leave the # endpoint dark with nothing in the log to say why. - if [[ ! -x "$LLM_SECONDARY_RUNTIME" ]]; then - echo "ERROR: llama.cpp runtime absent at $LLM_SECONDARY_RUNTIME" >&2 - echo "frank-secondary: build it (cmake -B build-cuda -DGGML_CUDA=ON" >&2 - echo "frank-secondary: -DCMAKE_CUDA_ARCHITECTURES=86 -DCMAKE_CUDA_HOST_COMPILER=/usr/bin/gcc-13" >&2 - echo "frank-secondary: && cmake --build build-cuda --target llama-server) first." >&2 + if [[ ! -x "$LLM_ZEALOT_RUNTIME" ]]; then + echo "ERROR: llama.cpp runtime absent at $LLM_ZEALOT_RUNTIME" >&2 + echo "frank-zealot: build it (cmake -B build-cuda -DGGML_CUDA=ON" >&2 + echo "frank-zealot: -DCMAKE_CUDA_ARCHITECTURES=86 -DCMAKE_CUDA_HOST_COMPILER=/usr/bin/gcc-13" >&2 + echo "frank-zealot: && cmake --build build-cuda --target llama-server) first." >&2 return 1 fi - for f in "$LLM_SECONDARY_MODEL_FILE" "$LLM_SECONDARY_MMPROJ"; do + for f in "$LLM_ZEALOT_MODEL_FILE" "$LLM_ZEALOT_MMPROJ"; do if [[ ! -f "$f" ]]; then - echo "ERROR: frank-secondary payload file absent at $f" >&2 - echo "frank-secondary: run scripts/download-frank-secondary.sh first;" >&2 - echo "frank-secondary: refusing to start a unit that cannot load." >&2 + echo "ERROR: frank-zealot payload file absent at $f" >&2 + echo "frank-zealot: run scripts/download-frank-zealot.sh first;" >&2 + echo "frank-zealot: refusing to start a unit that cannot load." >&2 return 1 fi done - relink_unit frank-secondary + relink_unit frank-zealot run_privileged systemctl daemon-reload - run_privileged systemctl enable frank-secondary.service - run_privileged systemctl restart frank-secondary.service - wait_for_health frank-secondary http://127.0.0.1:7771/health 900 || return 1 - # False-green hardening (frank-large's lesson): the port answering + run_privileged systemctl enable frank-zealot.service + run_privileged systemctl restart frank-zealot.service + wait_for_health frank-zealot http://127.0.0.1:7771/health 900 || return 1 + # False-green hardening (frank-dragoon's lesson): the port answering # proves nothing about WHO answers — the unit must be active with a # live MainPID, or a stray SGLang holdover is masquerading as deployed. local main_pid - main_pid="$(run_privileged systemctl show -p MainPID --value frank-secondary.service)" + main_pid="$(run_privileged systemctl show -p MainPID --value frank-zealot.service)" if [[ -z "$main_pid" || "$main_pid" == "0" ]]; then - echo "FAIL: :7771 answered but frank-secondary.service has no MainPID — a stray process holds the port" >&2 + echo "FAIL: :7771 answered but frank-zealot.service has no MainPID — a stray process holds the port" >&2 return 1 fi - echo "frank-secondary: health answered by unit MainPID $main_pid" + echo "frank-zealot: health answered by unit MainPID $main_pid" } -# deploy_llm_primary — frank-primary is the radiance engine (StillDeadcode, +# deploy_llm_archon — frank-archon is the radiance engine (StillDeadcode, # digest-pinned stilldeadcode/radiance image) serving the OFFICIAL # Qwen/Qwen3.8-Flash-Next-FP8 at native block-FP8 precision from the # rad-convert container qwen4exp-fp8-native.rad, on BOTH R9700s (TP=2) as a # ROOT unit whose serve script drives `podman run` directly (the engine is # the image entrypoint; the image lives in dank's rootless podman storage). # 2026-10-05 cutover from FreeToken (pre-cutover tag -# frank-primary-freetoken-pr587-20261005); before that, the tcclaviger vLLM -# fork (tag frank-primary-vllm-shapeG-20261003). Same port and alias; the +# frank-archon-freetoken-pr587-20261005); before that, the tcclaviger vLLM +# fork (tag frank-archon-vllm-shapeG-20261003). Same port and alias; the # harness models.yml id is unchanged. # # Gates: the image must exist under its digest ref in dank's rootless -# storage (FRANK_PRIMARY_IMAGE), the .rad container file must exist at the -# env's size floor (FRANK_PRIMARY_MODEL_FILE >= FRANK_PRIMARY_RAD_MIN_MIB — +# storage (FRANK_ARCHON_IMAGE), the .rad container file must exist at the +# env's size floor (FRANK_ARCHON_MODEL_FILE >= FRANK_ARCHON_RAD_MIN_MIB — # a truncated convert is a guaranteed long-timeout boot), and the unit env # must be complete. Per-file sha256 verification is the fetch script's job # at download time and rad-convert/rad-info's job at build time, never # re-hashed here. -LLM_PRIMARY_CONTAINER=frank-primary -LLM_PRIMARY_LEGACY_CONTAINERS="frank-primary-qwen frank-primary-r9v qwen-fp8 glm-probe" +LLM_ARCHON_CONTAINER=frank-archon +LLM_ARCHON_LEGACY_CONTAINERS="frank-archon-qwen frank-archon-r9v qwen-fp8 glm-probe" -deploy_llm_primary() { +deploy_llm_archon() { # Refuse rather than restart-loop: a unit whose image or payload is # missing never becomes healthy, and a green deploy would leave the # endpoint dark with nothing in the log to say why. - local env_file="/home/dank/serverAppConfigs/scripts/frank-primary.env" + local env_file="/home/dank/serverAppConfigs/scripts/frank-archon.env" local image model_dir model_file rad_min mib if [[ ! -f "$env_file" ]]; then - echo "ERROR: frank-primary env file absent: $env_file" >&2 + echo "ERROR: frank-archon env file absent: $env_file" >&2 return 1 fi - image="$(sed -n 's/^FRANK_PRIMARY_IMAGE=//p' "$env_file" | tail -1)" - model_dir="$(sed -n 's/^FRANK_PRIMARY_MODEL_DIR=//p' "$env_file" | tail -1)" - model_file="$(sed -n 's/^FRANK_PRIMARY_MODEL_FILE=//p' "$env_file" | tail -1)" - rad_min="$(sed -n 's/^FRANK_PRIMARY_RAD_MIN_MIB=//p' "$env_file" | tail -1)" + image="$(sed -n 's/^FRANK_ARCHON_IMAGE=//p' "$env_file" | tail -1)" + model_dir="$(sed -n 's/^FRANK_ARCHON_MODEL_DIR=//p' "$env_file" | tail -1)" + model_file="$(sed -n 's/^FRANK_ARCHON_MODEL_FILE=//p' "$env_file" | tail -1)" + rad_min="$(sed -n 's/^FRANK_ARCHON_RAD_MIN_MIB=//p' "$env_file" | tail -1)" if [[ -z "$image" || -z "$model_dir" || -z "$model_file" || -z "$rad_min" ]]; then - echo "ERROR: frank-primary.env missing FRANK_PRIMARY_IMAGE/MODEL_DIR/MODEL_FILE/RAD_MIN_MIB" >&2 + echo "ERROR: frank-archon.env missing FRANK_ARCHON_IMAGE/MODEL_DIR/MODEL_FILE/RAD_MIN_MIB" >&2 return 1 fi # The image gate is the digest ref itself: a name@sha256 ref exists in @@ -1320,18 +1320,18 @@ deploy_llm_primary() { # pipefail/grep race (the 2026-09-30 lesson). if ! podman image exists "$image"; then echo "ERROR: runtime image absent from storage: $image" >&2 - echo "frank-primary: podman pull docker://stilldeadcode/radiance:latest" >&2 + echo "frank-archon: podman pull docker://stilldeadcode/radiance:latest" >&2 return 1 fi if [[ ! -f "$model_dir/$model_file" ]]; then echo "ERROR: .rad container missing: $model_dir/$model_file" >&2 - echo "frank-primary: run scripts/build-frank-primary-rad.sh" >&2 + echo "frank-archon: run scripts/build-frank-archon-rad.sh" >&2 return 1 fi mib=$(( $(stat -c %s "$model_dir/$model_file") / 1048576 )) if [[ "$mib" -lt "$rad_min" ]]; then echo "ERROR: .rad container too small: $model_dir/$model_file is ${mib} MiB, want >= $rad_min" >&2 - echo "frank-primary: rebuild it (scripts/build-frank-primary-rad.sh --force)" >&2 + echo "frank-archon: rebuild it (scripts/build-frank-archon-rad.sh --force)" >&2 return 1 fi @@ -1343,19 +1343,19 @@ deploy_llm_primary() { # The legacy identities (the retired R9V container, the ad hoc # experiment container qwen-fp8, the retired glm-probe) hold the same # GPUs and die here too. - run_privileged systemctl stop frank-primary.service 2>/dev/null || true + run_privileged systemctl stop frank-archon.service 2>/dev/null || true local ctr - for ctr in $LLM_PRIMARY_LEGACY_CONTAINERS "$LLM_PRIMARY_CONTAINER"; do + for ctr in $LLM_ARCHON_LEGACY_CONTAINERS "$LLM_ARCHON_CONTAINER"; do podman rm -f "$ctr" >/dev/null 2>&1 || true done # Nothing starts until the port is released: the lucebox cutover - # (2026-09-26) and the frank-large cutover (2026-09-16) both failed + # (2026-09-26) and the frank-dragoon cutover (2026-09-16) both failed # exactly here when the next engine bound 7770 a second too early. wait_port_free 7770 || return 1 - relink_unit frank-primary + relink_unit frank-archon run_privileged systemctl daemon-reload - run_privileged systemctl enable frank-primary.service - run_privileged systemctl restart frank-primary.service + run_privileged systemctl enable frank-archon.service + run_privileged systemctl restart frank-archon.service # Cold start: .rad load + PLE pin + expert host-pool upload (the # publisher's compose healthcheck allows a 15-minute start_period). # Parity with every predecessor on this port. The HTTP listener binds @@ -1366,14 +1366,14 @@ deploy_llm_primary() { local i ok=0 for ((i=1; i<=900; i++)); do if curl -fsS http://127.0.0.1:7770/health 2>/dev/null >/dev/null; then - echo "frank-primary engine healthy after approximately $((i * 2))s" + echo "frank-archon engine healthy after approximately $((i * 2))s" ok=1 break fi sleep 2 done if [[ "$ok" != 1 ]]; then - echo "FAIL: frank-primary /health never answered 200 in 1800s" >&2 + echo "FAIL: frank-archon /health never answered 200 in 1800s" >&2 return 1 fi # False-green hardening (the 2026-09-26 lesson): a bare curl against the @@ -1381,12 +1381,12 @@ deploy_llm_primary() { # it while the unit is stopped. The deploy is only green if the unit # itself is active with a live MainPID behind the health answer. local main_pid - main_pid="$(run_privileged systemctl show -p MainPID --value frank-primary.service)" + main_pid="$(run_privileged systemctl show -p MainPID --value frank-archon.service)" if [[ -z "$main_pid" || "$main_pid" == "0" ]]; then - echo "FAIL: :7770 answered but frank-primary.service has no MainPID — a stray process holds the port" >&2 + echo "FAIL: :7770 answered but frank-archon.service has no MainPID — a stray process holds the port" >&2 return 1 fi - echo "frank-primary: health answered by unit MainPID $main_pid" + echo "frank-archon: health answered by unit MainPID $main_pid" } wait_for_health() { @@ -1573,9 +1573,9 @@ deploy_service() { anubis) deploy_anubis ;; seerr) deploy_seerr ;; marreta) deploy_marreta ;; - frank-large) deploy_llm_large ;; - frank-secondary) deploy_llm_secondary ;; - frank-primary) deploy_llm_primary ;; + frank-dragoon) deploy_llm_dragoon ;; + frank-zealot) deploy_llm_zealot ;; + frank-archon) deploy_llm_archon ;; hermes|hermes-dashboard|hermes-webui) deploy_hermes ;; romm|romm-mariadb|romm-redis|mariadb|redis) deploy_romm_stack "$service" ;; jellyfin) deploy_jellyfin ;; diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 3eb6700..99a1353 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -35,7 +35,7 @@ Options: Examples: ./scripts/deploy.sh dankclaw ./scripts/deploy.sh dankclaw --service searxng - ./scripts/deploy.sh dankserver --service frank-primary + ./scripts/deploy.sh dankserver --service frank-archon ./scripts/deploy.sh dankclaw --dry-run EOF } @@ -141,12 +141,12 @@ valid_service() { dankclaw:alertmanager|\ dankclaw:node-exporter|dankclaw:authentik-postgres|dankclaw:authentik-server|\ dankclaw:authentik-worker|dankclaw:authentik-outpost|dankclaw:authentik-outpost-ldap|dankclaw:anubis|dankclaw:seerr|\ - dankclaw:frank-large|dankclaw:frank-secondary|\ + dankclaw:frank-dragoon|dankclaw:frank-zealot|\ dankserver:romm-mariadb|dankserver:romm-redis|dankserver:romm|\ dankserver:copyparty|dankserver:jellyfin|dankserver:calibre-web|dankserver:calibre-server|dankserver:plex|dankserver:tautulli|\ dankserver:qbittorrent|dankserver:radarr|dankserver:sonarr|\ dankserver:lidarr|dankserver:readarr|dankserver:node-exporter|\ - dankserver:frank-primary|\ + dankserver:frank-archon|\ frankbook-pro:gluetun|frankbook-pro:qbittorrent|frankbook-pro:prowlarr|\ frankbook-pro:radarr|frankbook-pro:sonarr|frankbook-pro:lidarr|\ frankbook-pro:readarr) diff --git a/scripts/download-frank-primary-swift15.sh b/scripts/download-frank-archon-swift15.sh similarity index 92% rename from scripts/download-frank-primary-swift15.sh rename to scripts/download-frank-archon-swift15.sh index acb5c14..273d4d2 100755 --- a/scripts/download-frank-primary-swift15.sh +++ b/scripts/download-frank-archon-swift15.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# download-frank-primary-swift15.sh — payload fetch/verify for the planned -# frank-primary swap to the Swift 1.5 finetune: ukisai/Swift1.5-Qwen3.8-Flash-Next +# download-frank-archon-swift15.sh — payload fetch/verify for the planned +# frank-archon swap to the Swift 1.5 finetune: ukisai/Swift1.5-Qwen3.8-Flash-Next # (BF16 source, 149 files, 360,037,355,038 bytes = 335.3 GiB: 131 safetensors # shards + weight-map index + tokenizer + vision preprocessing configs + chat # template + licenses). Key set verified identical to the official @@ -8,8 +8,8 @@ # apply verbatim; the checkpoint ships BF16 with NO quantization_config. # Repo is UNGATED — no token needed (never put one on the command line). # -# bash scripts/download-frank-primary-swift15.sh --fetch resume/complete -# bash scripts/download-frank-primary-swift15.sh verify only +# bash scripts/download-frank-archon-swift15.sh --fetch resume/complete +# bash scripts/download-frank-archon-swift15.sh verify only # # Fetch uses the vendored scripts/hfget.sh (StillDeadcode's Apache-2.0 # listing/resume downloader, curl+jq only): per-file size checks against diff --git a/scripts/download-frank-primary.sh b/scripts/download-frank-archon.sh similarity index 94% rename from scripts/download-frank-primary.sh rename to scripts/download-frank-archon.sh index 083b918..0f5ff83 100755 --- a/scripts/download-frank-primary.sh +++ b/scripts/download-frank-archon.sh @@ -1,13 +1,13 @@ #!/usr/bin/env bash -# download-frank-primary.sh — payload fetch/verify for frank-primary: +# download-frank-archon.sh — payload fetch/verify for frank-archon: # the OFFICIAL Qwen/Qwen3.8-Flash-Next-FP8 checkpoint (131 safetensors # shards + weight-map index + tokenizer + vision preprocessing configs, # ~172.8 GB). 2026-10-05: replaces the orcarouter uncensored payload of the # FreeToken era (that script lived here; its repo was gated and needed # HF_TOKEN — this one is UNGATED and needs no token at all). # -# bash scripts/download-frank-primary.sh --fetch resume/complete -# bash scripts/download-frank-primary.sh verify only +# bash scripts/download-frank-archon.sh --fetch resume/complete +# bash scripts/download-frank-archon.sh verify only # # Fetch uses the vendored scripts/hfget.sh (StillDeadcode's Apache-2.0 # listing/resume downloader, curl+jq only): per-file size checks against diff --git a/scripts/download-frank-large-flashnext.sh b/scripts/download-frank-dragoon-flashnext.sh similarity index 97% rename from scripts/download-frank-large-flashnext.sh rename to scripts/download-frank-dragoon-flashnext.sh index 35e13dc..5c096cf 100755 --- a/scripts/download-frank-large-flashnext.sh +++ b/scripts/download-frank-dragoon-flashnext.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# download-frank-large-flashnext.sh — fetch frank-large's flash-server v2 +# download-frank-dragoon-flashnext.sh — fetch frank-dragoon's flash-server v2 # payload: the Quat3rnion abliterated Swift1.5 checkpoint of peonist's v2 # .hgn, the REQUIRED lookup table and the optional vision tower from # peonist-ai/halogen-qwen3.8-flash-next (both at the revisions the model @@ -29,7 +29,7 @@ # fetched fresh rather than symlinked, per the no-symlink law. set -euo pipefail -DEST="${FRANK_LARGE_MODEL_DIR:-$HOME/models/halogen-flashnext-v2}" +DEST="${FRANK_DRAGOON_MODEL_DIR:-$HOME/models/halogen-flashnext-v2}" ABLIT="https://huggingface.co/Quat3rnion/halogen-swift1.5-qwen3.8-flash-next-v2-abliterated/resolve/main" PEONIST="https://huggingface.co/peonist-ai/halogen-qwen3.8-flash-next/resolve" NGRAM_REV="5cc17cea1a10b502b4a5db41d8d2b1a0f22dba26" diff --git a/scripts/download-frank-large-halogen.sh b/scripts/download-frank-dragoon-halogen.sh similarity index 95% rename from scripts/download-frank-large-halogen.sh rename to scripts/download-frank-dragoon-halogen.sh index 21cd074..ad36204 100755 --- a/scripts/download-frank-large-halogen.sh +++ b/scripts/download-frank-dragoon-halogen.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# download-frank-large-halogen.sh — fetch frank-large's halogen payload: +# download-frank-dragoon-halogen.sh — fetch frank-dragoon's halogen payload: # the qwen3.8-27b .hgn checkpoint and the export tokenizer, from the # PUBLIC peonist-ai/halogen-qwen3.8-27b repo (no token — and per the fleet # secret law, none would ever touch argv). @@ -10,7 +10,7 @@ # existing payload without downloading. set -euo pipefail -DEST="${FRANK_LARGE_MODEL_DIR:-$HOME/models/halogen-qwen3.8-27b}" +DEST="${FRANK_DRAGOON_MODEL_DIR:-$HOME/models/halogen-qwen3.8-27b}" BASE="https://huggingface.co/peonist-ai/halogen-qwen3.8-27b/resolve/main" FILES=(qwen3.8-27b-p1w4d-d2.hgn diff --git a/scripts/download-frank-large-kingjones-uncensored.sh b/scripts/download-frank-dragoon-kingjones-uncensored.sh similarity index 95% rename from scripts/download-frank-large-kingjones-uncensored.sh rename to scripts/download-frank-dragoon-kingjones-uncensored.sh index 060a161..7025f3c 100755 --- a/scripts/download-frank-large-kingjones-uncensored.sh +++ b/scripts/download-frank-dragoon-kingjones-uncensored.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # Download kingjones777/Qwen3.8-27B-Uncensored-ROCmFP4-STRIX-MTP-GGUF for -# frank-large (Dankclaw iGPU). Public repo — no auth header, and never a token +# frank-dragoon (Dankclaw iGPU). Public repo — no auth header, and never a token # on the command line (it is world-readable in /proc//cmdline). # # The payload is the repo's Q6 AGENT rung: @@ -10,7 +10,7 @@ # names for MTP serving ("Take Q6 AGENT (114) if you want protected # heads"). Like every ROCmFPX file it loads on nothing but the fork. # -# The other two files frank-large needs are NOT re-downloaded: +# The other two files frank-dragoon needs are NOT re-downloaded: # * mtp-Qwen3.8-27B-Q4_0.gguf — the uncensored repo redistributes the # ALIGNED repo's draft head byte for byte (identical Hub LFS oid # 051a1764…), so it is hardlinked out of the aligned payload dir when that @@ -25,7 +25,7 @@ # byte count and the Hub LFS sha256. Idempotent: complete files are skipped. # # Usage: -# scripts/download-frank-large-kingjones-uncensored.sh [DEST_DIR] [--verify-only] +# scripts/download-frank-dragoon-kingjones-uncensored.sh [DEST_DIR] [--verify-only] set -euo pipefail REPO="kingjones777/Qwen3.8-27B-Uncensored-ROCmFP4-STRIX-MTP-GGUF" diff --git a/scripts/download-frank-large-kingjones.sh b/scripts/download-frank-dragoon-kingjones.sh similarity index 97% rename from scripts/download-frank-large-kingjones.sh rename to scripts/download-frank-dragoon-kingjones.sh index 8d1e7b6..2d52f82 100755 --- a/scripts/download-frank-large-kingjones.sh +++ b/scripts/download-frank-dragoon-kingjones.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Download kingjones777/Qwen3.8-27B-ROCmFP4-STRIX-MTP-GGUF for frank-large +# Download kingjones777/Qwen3.8-27B-ROCmFP4-STRIX-MTP-GGUF for frank-dragoon # (Dankclaw iGPU). Public repo — no auth header, and never a token on the # command line (it is world-readable in /proc//cmdline). # @@ -24,7 +24,7 @@ # come from the Hub LFS oids (api/models//tree/main). # # Usage: -# scripts/download-frank-large-kingjones.sh [DEST_DIR] [--verify-only] +# scripts/download-frank-dragoon-kingjones.sh [DEST_DIR] [--verify-only] set -euo pipefail REPO="kingjones777/Qwen3.8-27B-ROCmFP4-STRIX-MTP-GGUF" diff --git a/scripts/download-frank-large-orca.sh b/scripts/download-frank-dragoon-orca.sh similarity index 95% rename from scripts/download-frank-large-orca.sh rename to scripts/download-frank-dragoon-orca.sh index 480f53e..afafbe0 100755 --- a/scripts/download-frank-large-orca.sh +++ b/scripts/download-frank-dragoon-orca.sh @@ -1,9 +1,9 @@ #!/usr/bin/env bash -# Download and assemble jcbtc/Qwen3.8-Flash-CIRU-STRIX-Orca (the frank-large +# Download and assemble jcbtc/Qwen3.8-Flash-CIRU-STRIX-Orca (the frank-dragoon # model) on Dankclaw. # -# bash scripts/download-frank-large-orca.sh -# bash scripts/download-frank-large-orca.sh --verify-only +# bash scripts/download-frank-dragoon-orca.sh +# bash scripts/download-frank-dragoon-orca.sh --verify-only # # The package is 136 GB of Hub-sized transport parts (HF caps new uploads at # 50 GB, so the 79 GB main GGUF, the 52 GB PLE payload and the 4 GB MTP head @@ -105,4 +105,4 @@ fi echo "verifying assembled files against SHA256SUMS" (cd "$MODEL_DIR" && sha256sum -c SHA256SUMS) (cd "$MODEL_DIR/vision" && sha256sum -c SHA256SUMS) -echo "frank-large payload complete: $MODEL_DIR" +echo "frank-dragoon payload complete: $MODEL_DIR" diff --git a/scripts/download-frank-large-q4.sh b/scripts/download-frank-dragoon-q4.sh similarity index 87% rename from scripts/download-frank-large-q4.sh rename to scripts/download-frank-dragoon-q4.sh index 00649e7..e7a1764 100755 --- a/scripts/download-frank-large-q4.sh +++ b/scripts/download-frank-dragoon-q4.sh @@ -1,9 +1,9 @@ #!/usr/bin/env bash -# Download the Q4_K_XL frank-large payload on Dankclaw: +# Download the Q4_K_XL frank-dragoon payload on Dankclaw: # unsloth/Qwen3.8-27B-GGUF -> Qwen3.8-27B-UD-Q4_K_XL.gguf # -# bash scripts/download-frank-large-q4.sh -# bash scripts/download-frank-large-q4.sh --verify-only +# bash scripts/download-frank-dragoon-q4.sh +# bash scripts/download-frank-dragoon-q4.sh --verify-only # # Integrity: the file is checked against its declared byte count and sha256 # (the LFS oid from the Hub tree API, 2026-10-01). NO AUTH HEADER IS USED: @@ -21,12 +21,12 @@ # x 2 (K,V) x 2 B), so 4 sessions x 163840 ctx = 640,000 tokens = 39.06 GiB. # # The speculative drafter is UNCHANGED and still fetched by its own script -# (scripts/download-frank-large.sh, z-lab's Hub repo). That name must not -# appear here at all — the frank-large seam greps THIS file for it to prove +# (scripts/download-frank-dragoon.sh, z-lab's Hub repo). That name must not +# appear here at all — the frank-dragoon seam greps THIS file for it to prove # the drafter was not folded into the payload fetch. # # NOTE ON MTP: this payload has no baked-in MTP head (the Hub repo ships one -# separately as MTP/mtp-Qwen3.8-27B-Q4_0.gguf). frank-large does not need it — +# separately as MTP/mtp-Qwen3.8-27B-Q4_0.gguf). frank-dragoon does not need it — # spec decode here is the block-diffusion drafter, not MTP. set -euo pipefail diff --git a/scripts/download-frank-large-swift.sh b/scripts/download-frank-dragoon-swift.sh similarity index 85% rename from scripts/download-frank-large-swift.sh rename to scripts/download-frank-dragoon-swift.sh index 4b39394..f782763 100755 --- a/scripts/download-frank-large-swift.sh +++ b/scripts/download-frank-dragoon-swift.sh @@ -1,10 +1,10 @@ #!/usr/bin/env bash -# Download the Swift-1.5 frank-large candidate on Dankclaw: +# Download the Swift-1.5 frank-dragoon candidate on Dankclaw: # ajgazin/Swift-1.5-Qwen3.8-27B-Uncensored-Dynamic-MTP-GGUF # Swift-1.5-Qwen3.8-27B-Uncensored-Dynamic-MTP-UD-Q8_K_XL.gguf # -# bash scripts/download-frank-large-swift.sh -# bash scripts/download-frank-large-swift.sh --verify-only +# bash scripts/download-frank-dragoon-swift.sh +# bash scripts/download-frank-dragoon-swift.sh --verify-only # # Integrity: the file is checked against its declared byte count and sha256 # (the LFS oid from the Hub, 2026-09-28). NO AUTH HEADER IS USED: the repo is @@ -15,9 +15,9 @@ # Layout after a successful run (MODEL_DIR): # Swift-1.5-Qwen3.8-27B-Uncensored-Dynamic-MTP-UD-Q8_K_XL.gguf 31457990272 # -# This is the CANDIDATE payload, not the deployed one. frank-large still -# serves scripts/download-frank-large.sh's output; do not repoint -# frank-large.env at MODEL_DIR until the gufo load test passes. +# This is the CANDIDATE payload, not the deployed one. frank-dragoon still +# serves scripts/download-frank-dragoon.sh's output; do not repoint +# frank-dragoon.env at MODEL_DIR until the gufo load test passes. set -euo pipefail MODEL_DIR="/home/dank/models/Swift-1.5-Qwen3.8-27B-Uncensored-MTP-UD-Q8_K_XL" diff --git a/scripts/download-frank-large-unsloth.sh b/scripts/download-frank-dragoon-unsloth.sh similarity index 95% rename from scripts/download-frank-large-unsloth.sh rename to scripts/download-frank-dragoon-unsloth.sh index 3011ea5..b5f3ba1 100755 --- a/scripts/download-frank-large-unsloth.sh +++ b/scripts/download-frank-dragoon-unsloth.sh @@ -1,9 +1,9 @@ #!/usr/bin/env bash # Download unsloth/Qwen3.8-Flash-Next-GGUF:UD-IQ4_XS (the -# frank-large model) on Dankclaw. +# frank-dragoon model) on Dankclaw. # -# bash scripts/download-frank-large-unsloth.sh -# bash scripts/download-frank-large-unsloth.sh --verify-only +# bash scripts/download-frank-dragoon-unsloth.sh +# bash scripts/download-frank-dragoon-unsloth.sh --verify-only # # The UD-IQ4_XS GGUF ships as three llama.cpp split parts (HF caps uploads at # 50 GB). The parts ARE the canonical payload: the serve script points -m at @@ -112,4 +112,4 @@ if [[ "$mode" == "download" ]]; then [[ -e "$MODEL_DIR/vision/mmproj-F16.gguf" ]] || mv "$MODEL_DIR/mmproj-F16.gguf" "$MODEL_DIR/vision/" fi -echo "frank-large payload complete: $MODEL_DIR" +echo "frank-dragoon payload complete: $MODEL_DIR" diff --git a/scripts/download-frank-large.sh b/scripts/download-frank-dragoon.sh similarity index 93% rename from scripts/download-frank-large.sh rename to scripts/download-frank-dragoon.sh index 56bb35e..82b062e 100755 --- a/scripts/download-frank-large.sh +++ b/scripts/download-frank-dragoon.sh @@ -1,10 +1,10 @@ #!/usr/bin/env bash -# Download the frank-large payload on Dankclaw: +# Download the frank-dragoon payload on Dankclaw: # - unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL (the 27B dense main GGUF) # - z-lab/Qwen3.8-27B-DFlash2-GGUF:Q4_K_M (the DFlash2 drafter) # -# bash scripts/download-frank-large.sh -# bash scripts/download-frank-large.sh --verify-only +# bash scripts/download-frank-dragoon.sh +# bash scripts/download-frank-dragoon.sh --verify-only # # Integrity: every file is checked against its declared byte count and sha256 # (the values below are the LFS oids from the Hub, 2026-09-21). An HF token @@ -86,4 +86,4 @@ if [[ "$mode" == "download" ]]; then done fi -echo "frank-large payload complete: $MODEL_DIR" +echo "frank-dragoon payload complete: $MODEL_DIR" diff --git a/scripts/download-frank-secondary.sh b/scripts/download-frank-zealot.sh similarity index 95% rename from scripts/download-frank-secondary.sh rename to scripts/download-frank-zealot.sh index 0d326e1..931cce5 100755 --- a/scripts/download-frank-secondary.sh +++ b/scripts/download-frank-zealot.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Download the frank-secondary payload for llama.cpp on the RTX 3090: +# Download the frank-zealot payload for llama.cpp on the RTX 3090: # HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive at **Q6_K** plus the # PUBLISHER's OWN vision projector (the BF16 mmproj — the model is natively # multimodal, so this file is the endpoint's eyes). Public repo — no auth @@ -21,7 +21,7 @@ # replaced), Swift15-UncIQ3XXS/, MiMo-Q6K/, MiMo-Q5KM/, Ornith-Q8/. # # Usage: -# scripts/download-frank-secondary.sh [DEST_DIR] [--verify-only] +# scripts/download-frank-zealot.sh [DEST_DIR] [--verify-only] set -euo pipefail DEST="" diff --git a/scripts/frank-primary-expert-activity.py b/scripts/frank-archon-expert-activity.py similarity index 99% rename from scripts/frank-primary-expert-activity.py rename to scripts/frank-archon-expert-activity.py index 0c8c873..d9b7b9d 100644 --- a/scripts/frank-primary-expert-activity.py +++ b/scripts/frank-archon-expert-activity.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Measure per-block / per-expert expert-routing activity on live frank-primary. +"""Measure per-block / per-expert expert-routing activity on live frank-archon. Method: AMD IBS op sampling (data addresses, `perf record -e ibs_op// --data`) on the llama-server process while concurrent generations of mixed content run. diff --git a/scripts/frank-primary.env b/scripts/frank-archon.env similarity index 85% rename from scripts/frank-primary.env rename to scripts/frank-archon.env index f59ea7a..9d5eec5 100644 --- a/scripts/frank-primary.env +++ b/scripts/frank-archon.env @@ -1,13 +1,13 @@ -# frank-primary.env — radiance (StillDeadcode, Apache-2.0) serving the +# frank-archon.env — radiance (StillDeadcode, Apache-2.0) serving the # OFFICIAL Qwen/Qwen3.8-Flash-Next-FP8 checkpoint at NATIVE precision # (modelopt block-FP8 throughout, no requantisation) on BOTH R9700s (TP=2), # dankserver :7770. # # 2026-10-05 cutover from FreeToken (PR #587 ROCm, one card, experts in -# pinned host RAM; git tag frank-primary-freetoken-pr587-20261005 is the +# pinned host RAM; git tag frank-archon-freetoken-pr587-20261005 is the # pre-cutover state — its unit/env/serve trio and Dockerfile are all in the # tag and rebuildable). Before that: tcclaviger vLLM fork (tag -# frank-primary-vllm-shapeG-20261003). +# frank-archon-vllm-shapeG-20261003). # # WHY RADIANCE: the engine is C++/HIP with libr4d kernels built for # gfx1201, drives `podman run` directly from the digest-pinned @@ -29,7 +29,7 @@ # qwen4exp plugin claims (qwen4exp, "") which is what recipe-built # containers carry. Per-weight encodings are data, not the descriptor — # removing the key changes nothing about what the weights hold. Built by -# scripts/build-frank-primary-rad.sh (staging + convert + rad-info). +# scripts/build-frank-archon-rad.sh (staging + convert + rad-info). # # SERVING FACTS (docs/GUIDE.md, docs/DOCKER.md, compose/flashnext.yaml): # - The HTTP listener binds AFTER the full load (main.cpp: engine.start() @@ -67,14 +67,14 @@ # is untangled; 1.2.0 also REMOVED --expert-vs-cache-ratio in favour of # the --vram-weights-mib / --vram-kv-mib pair (core/config.cpp) — this # file already uses the pair, which BOTH pins accept (rollback symmetry). -FRANK_PRIMARY_IMAGE=stilldeadcode/radiance@sha256:4c3f484564bb2872784e46b0a59cbd71becc9c1e746e301a3596ffae253c322e +FRANK_ARCHON_IMAGE=stilldeadcode/radiance@sha256:4c3f484564bb2872784e46b0a59cbd71becc9c1e746e301a3596ffae253c322e # The .rad container FILE (mounted under /models) and the state dir for the # prefix-cache disk tier (mounted rw at /data). The model dir holds ONLY # .rad files; the raw HF download and its staging dir live beside it and # are never mounted. -FRANK_PRIMARY_MODEL_DIR=/home/dank/models/rad -FRANK_PRIMARY_MODEL_FILE=qwen4exp-swift15-w4dn8-i8-hc8m.rad -FRANK_PRIMARY_STATE_DIR=/home/dank/radiance-state +FRANK_ARCHON_MODEL_DIR=/home/dank/models/rad +FRANK_ARCHON_MODEL_FILE=qwen4exp-swift15-w4dn8-i8-hc8m.rad +FRANK_ARCHON_STATE_DIR=/home/dank/radiance-state # The state dir's tune/ subdirectory holds rad-tune's kernel-selection # cache (the engine's selector reads $RADIANCE_HOME/tune/.tune # at boot; $RADIANCE_HOME defaults to /opt/radiance, in the image, so the @@ -84,48 +84,48 @@ FRANK_PRIMARY_STATE_DIR=/home/dank/radiance-state # name across systemctl and podman ps. The runtime changes; the name does # not. The legacy list retires every predecessor identity that could hold # the GPUs or the port. -FRANK_PRIMARY_CONTAINER=frank-primary -FRANK_PRIMARY_LEGACY_CONTAINERS="frank-primary-qwen frank-primary-r9v qwen-fp8 glm-probe" +FRANK_ARCHON_CONTAINER=frank-archon +FRANK_ARCHON_LEGACY_CONTAINERS="frank-archon-qwen frank-archon-r9v qwen-fp8 glm-probe" # Served model id — Protoss name (wire rename 2026-10-09). The container, -# unit, scripts and this file keep the frank-primary name above; only the +# unit, scripts and this file keep the frank-archon name above; only the # alias on the wire moved. Radiance validates the requested model name, so # every client (harness, bench scripts, probes) MUST send this value. -FRANK_PRIMARY_SERVED_NAME=frank-archon -FRANK_PRIMARY_PORT=7770 +FRANK_ARCHON_SERVED_NAME=frank-archon +FRANK_ARCHON_PORT=7770 # Frank's chat-template call: froggeric's fixed Qwen3.8 template (the # repo's root chat_template.jinja, vendored here; the checkpoint's own # template is baked into the .rad by rad-convert and this overrides it). # Radiance derives the reasoning/tool-call reply format from it. -FRANK_PRIMARY_TEMPLATE=/home/dank/serverAppConfigs/scripts/qwen38-froggeric-v22.5.jinja +FRANK_ARCHON_TEMPLATE=/home/dank/serverAppConfigs/scripts/qwen38-froggeric-v22.5.jinja # --- engine shape (first-boot conservative; the boot ledger arbitrates) -- # Tensor parallel: BOTH R9700s. The board swap (2026-09-20, ProArt B850 # x8/x8 on root ports) made collectives legal on this host; radiance's TP # wire is libr4d's own, not RCCL. -FRANK_PRIMARY_TP=2 +FRANK_ARCHON_TP=2 # Lossy WHT 6-bit wire for large all-reduces (publisher's production choice: # +5.6-6.3% prefill, ~-1.3% 8-stream decode at TP2). min-kb stays the # engine default. -FRANK_PRIMARY_TP_WIRE=wht6 +FRANK_ARCHON_TP_WIRE=wht6 # Decode slots. 2 is Frank's first-boot value ("use parallelism = 2 to # start"); raise only after a real-traffic look at slot occupancy and the # KV pool's headroom line. The recurrent-state cost scales with it (54 # MiB/copy/card, 2 copies with speculation). -FRANK_PRIMARY_MAX_SEQS=3 +FRANK_ARCHON_MAX_SEQS=3 # Served window. Native is 262,144; 200,000 is the publisher's production # value (compose) and what models.yml's contextWindow must quote — a longer # prompt is refused by the engine, never truncated. -FRANK_PRIMARY_MAX_MODEL_LEN=200000 -FRANK_PRIMARY_PLACEMENT=expert_tiered +FRANK_ARCHON_MAX_MODEL_LEN=200000 +FRANK_ARCHON_PLACEMENT=expert_tiered # Pinned host pool for the expert rows that do not fit VRAM. Native FP8 # experts are 112.8 GiB total (56.4 GiB per rank slice) vs the 4-bit # publisher shape's ~29 GiB — this pool is the cost of native precision. # The boot ledger prints the pool's coverage ("the pool backs N% of the # worst case ... M full-length sessions"); resize from that line, not from # arithmetic. -FRANK_PRIMARY_HOST_POOL_MIB=40960 +FRANK_ARCHON_HOST_POOL_MIB=40960 # VRAM left unclaimed per card (publisher default 96 MiB). -FRANK_PRIMARY_GPU_HEADROOM_MIB=96 +FRANK_ARCHON_GPU_HEADROOM_MIB=96 # VRAM split of claimed memory per card, MiB (0 = derive from the card). # Engine 1.2.0 REMOVED --expert-vs-cache-ratio; these two knobs replace # it. The values transcribe the live 1.0.13 boot ledger at ratio 0.82: @@ -133,36 +133,36 @@ FRANK_PRIMARY_GPU_HEADROOM_MIB=96 # Bracket arms scale the KV term linearly in (1-r) from the 0.82 anchor # with weights fixed: ratio 0.90 -> KV 1968, ratio 0.95 -> KV 984. The # boot ledger arbitrates; re-derive after any payload change. -FRANK_PRIMARY_VRAM_WEIGHTS_MIB=26071 -FRANK_PRIMARY_VRAM_KV_MIB=3543 +FRANK_ARCHON_VRAM_WEIGHTS_MIB=26071 +FRANK_ARCHON_VRAM_KV_MIB=3543 # KV cache in FP8 (7.32 KiB/token at this model's 12 full-attention layers, # 2 KV heads, 256 head_dim, K+V). -FRANK_PRIMARY_KV_DTYPE=fp8 +FRANK_ARCHON_KV_DTYPE=fp8 # Spec decode: the checkpoint's own MTP head at the publisher's depth-3 # operating point (probe() returns 3 when mtp_num_hidden_layers > 0; the # flag states it so the ledger records the intent). -FRANK_PRIMARY_SPEC_TOKENS=2 -FRANK_PRIMARY_MAX_BATCHED_TOKENS=2048 +FRANK_ARCHON_SPEC_TOKENS=2 +FRANK_ARCHON_MAX_BATCHED_TOKENS=2048 # Prefix cache tiers (publisher pattern; disk tier sized for 2 slots). -FRANK_PRIMARY_PREFIX_HOST_MIB=4096 -FRANK_PRIMARY_PREFIX_DISK_MIB=65536 +FRANK_ARCHON_PREFIX_HOST_MIB=4096 +FRANK_ARCHON_PREFIX_DISK_MIB=65536 # Frank's pin law: the PLE n-gram table (47.7 GiB) serves from pinned host # RAM the cards read. `ram` REFUSES the start if the memlock limit is too # small — the unit's LimitMEMLOCK=infinity is the other half of this law. -FRANK_PRIMARY_NGRAM_PLACEMENT=ram +FRANK_ARCHON_NGRAM_PLACEMENT=ram # TTM preflight: the pinned ledger (2 x 40 GiB pools + 47.7 GiB PLE + 4 GiB # prefix host) is ~132 GiB. ttm's pages_limit/pages_max cap the GPU-mappable # pinned pages; the current cap (32,252,917 pages = ~123 GiB) is BELOW the # plan, so the serve script refuses to start until both are raised. This is # the floor it enforces (in MiB), with ~8 GiB of margin. -FRANK_PRIMARY_TTM_MIN_MIB=140000 +FRANK_ARCHON_TTM_MIN_MIB=140000 # Escape hatch for boot-ladder experiments. Unset -> no extra argv. Keep # multi-flag values as one string; the serve script expands it unquoted on # purpose. -FRANK_PRIMARY_EXTRA_ARGS= +FRANK_ARCHON_EXTRA_ARGS= # The .rad's minimum size in MiB (deployer gate; a truncated convert is a # guaranteed long-timeout boot instead of a fast failure). The converted # container measured 177,109 MiB (1,857,127,997,440 B = 173.0 GiB; the # plan-only estimate 172.76 GiB covers the data planes but not the metadata # tail) - floor sits just under the payload. -FRANK_PRIMARY_RAD_MIN_MIB=110000 +FRANK_ARCHON_RAD_MIN_MIB=110000 diff --git a/scripts/frank-primary.service b/scripts/frank-archon.service similarity index 87% rename from scripts/frank-primary.service rename to scripts/frank-archon.service index 6940d1e..5a5553c 100644 --- a/scripts/frank-primary.service +++ b/scripts/frank-archon.service @@ -1,8 +1,8 @@ -# frank-primary.service — radiance (StillDeadcode, Apache-2.0) endpoint +# frank-archon.service — radiance (StillDeadcode, Apache-2.0) endpoint # (OFFICIAL Qwen/Qwen3.8-Flash-Next-FP8 at NATIVE block-FP8 precision, the # rad-convert container qwen4exp-fp8-native.rad) on BOTH R9700s (TP=2, # wht6 wire), dankserver :7770. 2026-10-05 cutover from FreeToken (git tag -# frank-primary-freetoken-pr587-20261005 is the pre-cutover state; the +# frank-archon-freetoken-pr587-20261005 is the pre-cutover state; the # retired unit/env/serve trio and Dockerfile are in that tag). # # Same port, same served alias, same container identity as the unit name; @@ -19,7 +19,7 @@ # unit grants LimitMEMLOCK=infinity to the dank process via PID1; the # engine still runs out of dank's rootless podman storage. [Unit] -Description=frank-primary — radiance Qwen3.8-Flash-Next-FP8 (native) on 2x R9700 TP=2 +Description=frank-archon — radiance Qwen3.8-Flash-Next-FP8 (native) on 2x R9700 TP=2 After=network-online.target Wants=network-online.target # Never let the start-rate limiter give up after a crash loop (a failed LLM @@ -33,14 +33,14 @@ Group=dank # RLIMIT_MEMLOCK smaller than the pinned set fails the load mid-start. # PID1 grants infinity here — parity with the fleet's other LLM units. LimitMEMLOCK=infinity -Environment="FRANK_PRIMARY_ENV_FILE=/home/dank/serverAppConfigs/scripts/frank-primary.env" -ExecStart=/home/dank/serverAppConfigs/scripts/serve-frank-primary.sh +Environment="FRANK_ARCHON_ENV_FILE=/home/dank/serverAppConfigs/scripts/frank-archon.env" +ExecStart=/home/dank/serverAppConfigs/scripts/serve-frank-archon.sh # systemd stop: wait alone cannot stop the container child; stop it # explicitly. No graceful drain contract is claimed (the OpenAI front end # holds no queue to drain — in-flight decodes are lost, which a stop # during a bench window accepts; radiance takes SIGTERM on the engine # process and podman reaps the container). -ExecStop=/usr/bin/podman stop -t 120 frank-primary +ExecStop=/usr/bin/podman stop -t 120 frank-archon # Boot cost: .rad load (weights + PLE upload) + expert host-pool pin. The # publisher's compose healthcheck allows a 15-minute start_period; the # vLLM-era budget (1800 s) carried forward. diff --git a/scripts/frank-large.env b/scripts/frank-dragoon.env similarity index 85% rename from scripts/frank-large.env rename to scripts/frank-dragoon.env index 1008c56..c5103f7 100644 --- a/scripts/frank-large.env +++ b/scripts/frank-dragoon.env @@ -1,11 +1,11 @@ -# frank-large.env — tunables for the frank-large endpoint on Dankclaw's +# frank-dragoon.env — tunables for the frank-dragoon endpoint on Dankclaw's # Strix Halo iGPU (gfx1151), host port 7770. # # RUNTIME (2026-10-06, Frank): halogen-flash-server 0.16.2 — the # closed-source C++/HIP engine (image ghcr.io/peonist-ai/halogen-flash-server, # digest-pinned below) serving the Quat3rnion ABLITERATED Swift1.5 finetune # of peonist's Qwen3.8-Flash-Next v2 checkpoint, as a podman container under -# a root unit, driven by scripts/serve-frank-large.sh. This CUTS OVER the +# a root unit, driven by scripts/serve-frank-dragoon.sh. This CUTS OVER the # 2026-10-05 halogen 27B-dense shape (censored base, DFlash2, 31.7 t/s): # rollback = revert the swap commit's trio; the 27B payload stays on disk at # /home/dank/models/halogen-qwen3.8-27b/. @@ -36,7 +36,7 @@ # target). Worst-case request: prompt + budget <= 217088 − 4096 + 3 % # est-error ≈ 219k <= 262144 — the 45k gap between harness window and # engine ceiling absorbs the estimate error with ~7x margin (robust to a -# 10 % under-count). Compaction rides on frank-secondary: input ≈ +# 10 % under-count). Compaction rides on frank-zealot: input ≈ # threshold − keepRecent(20k) ≈ 170k measured, inside its 200,704 slot. # HALOGEN_KV_POOL_POSITIONS=524288 = KV_SLOTS(2) x CTX — the explicit # form of the engine's default, so the seam test can pin the product. @@ -52,7 +52,7 @@ # weights ~62 GiB resident + KV 14.0 + arena (HALOGEN_MAX_TOK=8192 => # ~8 GiB per FLAGS.md arena formula 3.8+8.4*(MT/16384)) + vision ~2 # = ~86 GiB engine-side; HALOGEN_HOST_RESERVE_GIB=20 keeps the host -# honest; baseline co-tenancy (frank-secondary, ComfyUI, Caddy/observ) +# honest; baseline co-tenancy (frank-zealot, ComfyUI, Caddy/observ) # ~10-15. ~15 GiB margin. The boot ledger is the referee — read it # after deploy and re-size if the engine prints a clamp. # HALOGEN_SPEC_ADAPT=0 is MANDATORY (card): the default adaptive policy @@ -91,47 +91,47 @@ # Image: digest-pinned (fetch law: tag pulls silently re-point; the digest # is what was qualified). 0.16.2 = the version the model card names as its # quickstart pin; RepoDigest captured at pull on 2026-10-06. -FRANK_LARGE_IMAGE=ghcr.io/peonist-ai/halogen-flash-server@sha256:0c61bf84ac22308a53f5d1ca6b86806702d7039e5ebc51cae4c66621b92fe04a +FRANK_DRAGOON_IMAGE=ghcr.io/peonist-ai/halogen-flash-server@sha256:0c61bf84ac22308a53f5d1ca6b86806702d7039e5ebc51cae4c66621b92fe04a # Container identity: kept from the 27B era (unit ExecStop names it). -FRANK_LARGE_CONTAINER=frank-large-halogen +FRANK_DRAGOON_CONTAINER=frank-dragoon-halogen # Old quadlet-era container identity; the serve script clears stale names. -FRANK_LARGE_LEGACY_CONTAINERS=frank-large +FRANK_DRAGOON_LEGACY_CONTAINERS=frank-dragoon # host:container — the frontend listens on 8731 inside (HALOGEN_API_PORT # default); the engine port (8730) is never published. -FRANK_LARGE_PUBLISH=7770:8731 +FRANK_DRAGOON_PUBLISH=7770:8731 -FRANK_LARGE_MODEL_DIR=/home/dank/models/halogen-flashnext-v2 +FRANK_DRAGOON_MODEL_DIR=/home/dank/models/halogen-flashnext-v2 # The checkpoint: Quat3rnion/halogen-swift1.5-qwen3.8-flash-next-v2-abliterated # qwen38-flash-next-v2-swift15-abliterated.hgn — compacted r2 of the card's # append-only original (byte-identical live tensors, padding dropped: # 66,687,678,464 B vs 89,775,868,032 B). LFS sha256 verified at fetch. -FRANK_LARGE_CHECKPOINT=qwen38-flash-next-v2-swift15-abliterated.hgn -FRANK_LARGE_CHECKPOINT_BYTES=66687678464 -FRANK_LARGE_CHECKPOINT_SHA256=9c880b8ba48deabfa06172eff1e7572e4fe465e09e97faec6e50c3f6fdcac037 +FRANK_DRAGOON_CHECKPOINT=qwen38-flash-next-v2-swift15-abliterated.hgn +FRANK_DRAGOON_CHECKPOINT_BYTES=66687678464 +FRANK_DRAGOON_CHECKPOINT_SHA256=9c880b8ba48deabfa06172eff1e7572e4fe465e09e97faec6e50c3f6fdcac037 # The n-gram lookup table: REQUIRED (the engine reads it beside the # checkpoint; the card's quickstart names it explicitly). From # peonist-ai/halogen-qwen3.8-flash-next @ 5cc17cea. -FRANK_LARGE_NGRAM_TABLE=qwen38-flash-next-ngram.hgn -FRANK_LARGE_NGRAM_BYTES=51200246144 -FRANK_LARGE_NGRAM_SHA256=3450acada94e19aabad88bd49b45eb70304820949c2240fc178067b20ae5dffe +FRANK_DRAGOON_NGRAM_TABLE=qwen38-flash-next-ngram.hgn +FRANK_DRAGOON_NGRAM_BYTES=51200246144 +FRANK_DRAGOON_NGRAM_SHA256=3450acada94e19aabad88bd49b45eb70304820949c2240fc178067b20ae5dffe # The vision tower: OPTIONAL on the engine, ENABLED here (image input). # From peonist-ai/halogen-qwen3.8-flash-next @ e053f488. -FRANK_LARGE_VISION_TOWER=qwen38-flash-next-vision.hgn -FRANK_LARGE_VISION_BYTES=897916416 -FRANK_LARGE_VISION_SHA256=d62e0ae553fe88afd3833733d4a4c669f34d20fd8dfce4b9610525bed2134b10 -# The tokenizer is a FLAT DIRECTORY, $FRANK_LARGE_MODEL_DIR/tokenizer, +FRANK_DRAGOON_VISION_TOWER=qwen38-flash-next-vision.hgn +FRANK_DRAGOON_VISION_BYTES=897916416 +FRANK_DRAGOON_VISION_SHA256=d62e0ae553fe88afd3833733d4a4c669f34d20fd8dfce4b9610525bed2134b10 +# The tokenizer is a FLAT DIRECTORY, $FRANK_DRAGOON_MODEL_DIR/tokenizer, # mounted whole at /tokenizer. The two repos ship the same one; fetched # fresh from peonist @ e053f488 (tokenizer.json is LFS, byte-identical to # the 27B-era copy; the rest are plain git blobs — size-checked only). The # serve gate and the deployer refuse a missing file or ANY symlink: an HF # cache snapshot symlinks each file into blobs/, and those links dangle # inside the container mount. -FRANK_LARGE_TOKENIZER_FILES="tokenizer.json chat_template.jinja tokenizer_config.json merges.txt vocab.json generation_config.json" +FRANK_DRAGOON_TOKENIZER_FILES="tokenizer.json chat_template.jinja tokenizer_config.json merges.txt vocab.json generation_config.json" # --- engine flags (docs/FLAGS.md of the flash-server repo; anything unset # stays at the image default, which is what was qualified) ------------------ # Served model id — Protoss name (wire rename 2026-10-09); the service, unit, -# scripts and this file keep the frank-large name. OpenWebUI api_configs +# scripts and this file keep the frank-dragoon name. OpenWebUI api_configs # model_ids for the :7770 backend MUST name this value. HALOGEN_MODEL_ID=frank-dragoon HALOGEN_CTX=262144 diff --git a/scripts/frank-large.service b/scripts/frank-dragoon.service similarity index 67% rename from scripts/frank-large.service rename to scripts/frank-dragoon.service index 7c83350..977a553 100644 --- a/scripts/frank-large.service +++ b/scripts/frank-dragoon.service @@ -1,5 +1,5 @@ [Unit] -Description=halogen-flash-server container (Quat3rnion abliterated Swift1.5 of Qwen3.8-Flash-Next v2, MTP spec decode, 2 slots x 200192, vision ON), root systemd unit (dankclaw, frank-large, Strix Halo iGPU) +Description=halogen-flash-server container (Quat3rnion abliterated Swift1.5 of Qwen3.8-Flash-Next v2, MTP spec decode, 2 slots x 200192, vision ON), root systemd unit (dankclaw, frank-dragoon, Strix Halo iGPU) After=network-online.target Wants=network-online.target @@ -11,11 +11,11 @@ Group=dank # RLIMIT smaller than the pinned set cannot fail the load. Parity with the # other LLM units on this fleet. LimitMEMLOCK=infinity -Environment="FRANK_LARGE_ENV_FILE=/home/dank/serverAppConfigs/scripts/frank-large.env" -ExecStart=/home/dank/serverAppConfigs/scripts/serve-frank-large.sh +Environment="FRANK_DRAGOON_ENV_FILE=/home/dank/serverAppConfigs/scripts/frank-dragoon.env" +ExecStart=/home/dank/serverAppConfigs/scripts/serve-frank-dragoon.sh # systemd stop alone cannot stop the container child; stop it explicitly -# (frank-primary pattern). The engine drains on SIGTERM. -ExecStop=/usr/bin/podman stop -t 60 frank-large-halogen +# (frank-archon pattern). The engine drains on SIGTERM. +ExecStop=/usr/bin/podman stop -t 60 frank-dragoon-halogen TimeoutStartSec=1200 TimeoutStopSec=120 # always, not on-failure: an engine that exits 0 after an internal fault @@ -23,7 +23,7 @@ TimeoutStopSec=120 Restart=always RestartSec=10 # The engine pins ~62 GiB of v2 weights and keeps a multi-GiB working set -# on a box that also hosts frank-secondary, ComfyUI and the Caddy/observability +# on a box that also hosts frank-zealot, ComfyUI and the Caddy/observability # stack; make it a late OOM candidate, not the first. OOMScoreAdjust=-500 diff --git a/scripts/frank-secondary.env b/scripts/frank-zealot.env similarity index 95% rename from scripts/frank-secondary.env rename to scripts/frank-zealot.env index 9f63aa8..32e22db 100644 --- a/scripts/frank-secondary.env +++ b/scripts/frank-zealot.env @@ -1,4 +1,4 @@ -# frank-secondary — llama.cpp (master, CUDA sm_86) serving +# frank-zealot — llama.cpp (master, CUDA sm_86) serving # HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive at Q6_K on the RTX 3090, # :7771. # @@ -38,7 +38,7 @@ MMPROJ_FILE=/home/dank/models/Qwen35-9B-HauhauCS-Q6K/mmproj-Qwen3.5-9B-Uncensore # Served model id — the harness/family name (Protoss rename completed to the # wire 2026-10-09: harness ids + homepage cards 2026-10-08, /v1/models aliases # this day). The SERVICE, unit, scripts and this env file keep the -# frank-secondary name; only the alias on the wire changed. Consumers that +# frank-zealot name; only the alias on the wire changed. Consumers that # key on the served id: OpenWebUI (model row, access_grant, api_configs # model_ids) and the harness models.yml. ALIAS=frank-zealot diff --git a/scripts/frank-secondary.service b/scripts/frank-zealot.service similarity index 67% rename from scripts/frank-secondary.service rename to scripts/frank-zealot.service index 0f08f06..b74d7df 100644 --- a/scripts/frank-secondary.service +++ b/scripts/frank-zealot.service @@ -1,5 +1,5 @@ [Unit] -Description=llama.cpp Qwen3.5-9B-Uncensored-HauhauCS-Aggressive Q6_K GGUF (qwen35 hybrid, 2x200704 slots, f16 K+V, MTP off, mmproj vision) on the RTX 3090 (dankclaw, frank-secondary) +Description=llama.cpp Qwen3.5-9B-Uncensored-HauhauCS-Aggressive Q6_K GGUF (qwen35 hybrid, 2x200704 slots, f16 K+V, MTP off, mmproj vision) on the RTX 3090 (dankclaw, frank-zealot) After=network-online.target Wants=network-online.target @@ -10,8 +10,8 @@ Group=dank # CUDA pins its staging buffers, so the process needs the memlock budget even # though the weights themselves are copied into VRAM. LimitMEMLOCK=infinity -Environment="FRANK_SECONDARY_ENV_FILE=/home/dank/serverAppConfigs/scripts/frank-secondary.env" -ExecStart=/home/dank/serverAppConfigs/scripts/serve-frank-secondary.sh +Environment="FRANK_ZEALOT_ENV_FILE=/home/dank/serverAppConfigs/scripts/frank-zealot.env" +ExecStart=/home/dank/serverAppConfigs/scripts/serve-frank-zealot.sh Restart=on-failure RestartSec=10 diff --git a/scripts/kld-gate-swift15.sh b/scripts/kld-gate-swift15.sh index 5e9b0fd..b3fb86c 100755 --- a/scripts/kld-gate-swift15.sh +++ b/scripts/kld-gate-swift15.sh @@ -24,7 +24,7 @@ KLD_OUT=/home/dank/radiance-state/kld-gate.json : > "$KLD_OUT" cp -f /home/dank/serverAppConfigs/scripts/qwen38-froggeric-v22.5.jinja \ /home/dank/models/tpl.jinja 2>/dev/null || true -sudo systemctl stop frank-primary >/dev/null 2>&1 || true +sudo systemctl stop frank-archon >/dev/null 2>&1 || true podman rm -f "$C" >/dev/null 2>&1 || true podman run --rm --name "$C" \ diff --git a/scripts/make-calib-corpus.py b/scripts/make-calib-corpus.py index e6cf6eb..ddad598 100755 --- a/scripts/make-calib-corpus.py +++ b/scripts/make-calib-corpus.py @@ -44,17 +44,17 @@ JSONL_EXTS = (".jsonl", ".json") DOC_DIR = "serverAppConfigs-docs" FLEET_CMDS = [ - "systemctl status frank-primary --no-pager", - "journalctl -u frank-primary -n 100 --no-pager", + "systemctl status frank-archon --no-pager", + "journalctl -u frank-archon -n 100 --no-pager", "podman ps --format '{{.Names}} {{.Status}}'", - "podman logs --tail 50 frank-primary", + "podman logs --tail 50 frank-archon", "curl -s http://192.168.0.235:7770/health", "curl -s http://192.168.0.235:7770/metrics | grep radiance_", "df -h /home/dank | tail -1", "free -g", - "sudo systemctl restart frank-primary", + "sudo systemctl restart frank-archon", "cd /home/dank/serverAppConfigs && git pull --ff-only", - "./scripts/deploy.sh dankserver --service frank-primary", + "./scripts/deploy.sh dankserver --service frank-archon", "./tests/run.sh 2>&1 | tail -5", "jq . /home/dank/models/rad/index.json | head -40", "python3 -c \"import json; print(json.load(open('config.json'))['num_hidden_layers'])\"", diff --git a/scripts/patches/glm53-compile-01-model-decorator.patch b/scripts/patches/glm53-compile-01-model-decorator.patch index 2e44cf1..4007ae7 100644 --- a/scripts/patches/glm53-compile-01-model-decorator.patch +++ b/scripts/patches/glm53-compile-01-model-decorator.patch @@ -2,7 +2,7 @@ # # STATUS: WIP — first of three patches in the "compile the GLM trunk" changelist. The # set does NOT yet boot the engine (see 03 for the next blocker), so it is NOT part of -# the deployed frank-primary shape. Nothing in scripts/ mounts these files. +# the deployed frank-archon shape. Nothing in scripts/ mounts these files. # # WHY THIS IS THE RIGHT LEVER (measured 2026-09-30, not inferred): # diff --git a/scripts/patches/gpu_worker-kv-cap.patch b/scripts/patches/gpu_worker-kv-cap.patch index 96a7e43..2c1b373 100644 --- a/scripts/patches/gpu_worker-kv-cap.patch +++ b/scripts/patches/gpu_worker-kv-cap.patch @@ -1,6 +1,6 @@ # gpu_worker-kv-cap.patch — fork-local fix for the expert-offload KV cap. # -# STATUS: NOT part of the deployed frank-primary shape. It exists because the +# STATUS: NOT part of the deployed frank-archon shape. It exists because the # fork's plan under-models this model's KV, and it is the enabler for a future # MTP attempt (the production GLM shape runs without MTP and boots fine on the # plan's own reserve). diff --git a/scripts/recipes/qwen4exp-swift15-w4dn8-i8-hc8m.recipe b/scripts/recipes/qwen4exp-swift15-w4dn8-i8-hc8m.recipe index b368f44..d3d6a2a 100644 --- a/scripts/recipes/qwen4exp-swift15-w4dn8-i8-hc8m.recipe +++ b/scripts/recipes/qwen4exp-swift15-w4dn8-i8-hc8m.recipe @@ -1,6 +1,6 @@ # qwen4exp-swift15-w4dn8-i8-hc8m.recipe -- the Swift 1.5 finetune of Qwen3.8-Flash-Next # (ukisai/Swift1.5-Qwen3.8-Flash-Next, BF16 source, 335.3 GiB, key set identical to the official -# base) as a radiance container for frank-primary: EVERY routed expert -- gate_up AND down -- +# base) as a radiance container for frank-archon: EVERY routed expert -- gate_up AND down -- # through GPTQ into the w4nl64a8h table. The plugin's one-table-one-encoding law # ("one table of experts takes one encoding, and only a whole expert kept plain bf16 is served # beside it", qwen4exp_fp8 rad_arch_declare) forbids the original split tier (down block-fp8 + diff --git a/scripts/run-swift15-bf16.sh b/scripts/run-swift15-bf16.sh index 6aa3aed..21e9ec8 100755 --- a/scripts/run-swift15-bf16.sh +++ b/scripts/run-swift15-bf16.sh @@ -30,9 +30,9 @@ KLD_REF_DIR=/home/dank/corpora/kld-ref CALIB_DIR=/home/dank/corpora/calib KLD_CORPUS=/home/dank/corpora/out/kld.jsonl -restore() { sudo systemctl start frank-primary >/dev/null 2>&1 || true; } +restore() { sudo systemctl start frank-archon >/dev/null 2>&1 || true; } trap restore EXIT -sudo systemctl stop frank-primary >/dev/null 2>&1 || true +sudo systemctl stop frank-archon >/dev/null 2>&1 || true podman rm -f "$C" >/dev/null 2>&1 || true ARGS=(--model /models/rad/qwen4exp-swift15-bf16.rad diff --git a/scripts/serve-frank-primary.sh b/scripts/serve-frank-archon.sh similarity index 52% rename from scripts/serve-frank-primary.sh rename to scripts/serve-frank-archon.sh index d30a1b2..c617f9e 100755 --- a/scripts/serve-frank-primary.sh +++ b/scripts/serve-frank-archon.sh @@ -1,10 +1,10 @@ #!/usr/bin/env bash -# serve-frank-primary.sh — frank-primary endpoint: radiance (StillDeadcode, +# serve-frank-archon.sh — frank-archon endpoint: radiance (StillDeadcode, # Apache-2.0) serving the OFFICIAL Qwen/Qwen3.8-Flash-Next-FP8 checkpoint at # NATIVE block-FP8 precision from a rad-convert container # (/home/dank/models/rad/qwen4exp-fp8-native.rad), on BOTH R9700s (TP=2, # wht6 wire), dankserver :7770. 2026-10-05 cutover from FreeToken (PR #587, -# one card; git tag frank-primary-freetoken-pr587-20261005 is the +# one card; git tag frank-archon-freetoken-pr587-20261005 is the # pre-cutover state). # # The run line below IS the engine argv: the image's entrypoint is the @@ -16,18 +16,18 @@ # 2 decode slots (Frank's call), 40 GiB/rank pinned expert pool, fp8 KV, # MTP depth 3, prefix cache host 4 GiB + disk 64 GiB, PLE pinned in RAM. # -# The root unit (scripts/frank-primary.service, User=dank, +# The root unit (scripts/frank-archon.service, User=dank, # LimitMEMLOCK=infinity) grants the pin budget: 2 x 40 GiB expert pools + # the 47.7 GiB PLE table + 4 GiB prefix host tier — ~132 GiB of pinned # pages, which is ALSO why this script refuses to start when ttm's -# pages_limit/pages_max cap is under FRANK_PRIMARY_TTM_MIN_MIB (see below). +# pages_limit/pages_max cap is under FRANK_ARCHON_TTM_MIN_MIB (see below). set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -ENV_FILE="${FRANK_PRIMARY_ENV_FILE:-$SCRIPT_DIR/frank-primary.env}" +ENV_FILE="${FRANK_ARCHON_ENV_FILE:-$SCRIPT_DIR/frank-archon.env}" if [ ! -f "$ENV_FILE" ]; then - echo "ERROR: frank-primary env file absent: $ENV_FILE" >&2 + echo "ERROR: frank-archon env file absent: $ENV_FILE" >&2 exit 1 fi set -a @@ -35,74 +35,74 @@ set -a source "$ENV_FILE" set +a -: "${FRANK_PRIMARY_IMAGE:?FRANK_PRIMARY_IMAGE must name the radiance image}" -: "${FRANK_PRIMARY_MODEL_DIR:?FRANK_PRIMARY_MODEL_DIR must name the .rad dir}" -: "${FRANK_PRIMARY_MODEL_FILE:?FRANK_PRIMARY_MODEL_FILE must name the .rad file}" -: "${FRANK_PRIMARY_STATE_DIR:?FRANK_PRIMARY_STATE_DIR must name the /data state dir}" -: "${FRANK_PRIMARY_CONTAINER:?FRANK_PRIMARY_CONTAINER must name the container}" -: "${FRANK_PRIMARY_SERVED_NAME:?FRANK_PRIMARY_SERVED_NAME must name the alias}" -: "${FRANK_PRIMARY_PORT:?FRANK_PRIMARY_PORT must be the port}" -: "${FRANK_PRIMARY_TEMPLATE:?FRANK_PRIMARY_TEMPLATE must name the chat template}" -: "${FRANK_PRIMARY_TP:?FRANK_PRIMARY_TP must be set}" -: "${FRANK_PRIMARY_TP_WIRE:?FRANK_PRIMARY_TP_WIRE must be set}" -: "${FRANK_PRIMARY_MAX_SEQS:?FRANK_PRIMARY_MAX_SEQS must be set}" -: "${FRANK_PRIMARY_MAX_MODEL_LEN:?FRANK_PRIMARY_MAX_MODEL_LEN must be set}" -: "${FRANK_PRIMARY_PLACEMENT:?FRANK_PRIMARY_PLACEMENT must be set}" -: "${FRANK_PRIMARY_HOST_POOL_MIB:?FRANK_PRIMARY_HOST_POOL_MIB must be set}" -: "${FRANK_PRIMARY_GPU_HEADROOM_MIB:?FRANK_PRIMARY_GPU_HEADROOM_MIB must be set}" -: "${FRANK_PRIMARY_VRAM_WEIGHTS_MIB:?FRANK_PRIMARY_VRAM_WEIGHTS_MIB must be set}" -: "${FRANK_PRIMARY_VRAM_KV_MIB:?FRANK_PRIMARY_VRAM_KV_MIB must be set}" -: "${FRANK_PRIMARY_KV_DTYPE:?FRANK_PRIMARY_KV_DTYPE must be set}" -: "${FRANK_PRIMARY_SPEC_TOKENS:?FRANK_PRIMARY_SPEC_TOKENS must be set}" -: "${FRANK_PRIMARY_MAX_BATCHED_TOKENS:?FRANK_PRIMARY_MAX_BATCHED_TOKENS must be set}" -: "${FRANK_PRIMARY_PREFIX_HOST_MIB:?FRANK_PRIMARY_PREFIX_HOST_MIB must be set}" -: "${FRANK_PRIMARY_PREFIX_DISK_MIB:?FRANK_PRIMARY_PREFIX_DISK_MIB must be set}" -: "${FRANK_PRIMARY_NGRAM_PLACEMENT:?FRANK_PRIMARY_NGRAM_PLACEMENT must be set}" -: "${FRANK_PRIMARY_TTM_MIN_MIB:?FRANK_PRIMARY_TTM_MIN_MIB must be set}" -: "${FRANK_PRIMARY_RAD_MIN_MIB:?FRANK_PRIMARY_RAD_MIN_MIB must be set}" +: "${FRANK_ARCHON_IMAGE:?FRANK_ARCHON_IMAGE must name the radiance image}" +: "${FRANK_ARCHON_MODEL_DIR:?FRANK_ARCHON_MODEL_DIR must name the .rad dir}" +: "${FRANK_ARCHON_MODEL_FILE:?FRANK_ARCHON_MODEL_FILE must name the .rad file}" +: "${FRANK_ARCHON_STATE_DIR:?FRANK_ARCHON_STATE_DIR must name the /data state dir}" +: "${FRANK_ARCHON_CONTAINER:?FRANK_ARCHON_CONTAINER must name the container}" +: "${FRANK_ARCHON_SERVED_NAME:?FRANK_ARCHON_SERVED_NAME must name the alias}" +: "${FRANK_ARCHON_PORT:?FRANK_ARCHON_PORT must be the port}" +: "${FRANK_ARCHON_TEMPLATE:?FRANK_ARCHON_TEMPLATE must name the chat template}" +: "${FRANK_ARCHON_TP:?FRANK_ARCHON_TP must be set}" +: "${FRANK_ARCHON_TP_WIRE:?FRANK_ARCHON_TP_WIRE must be set}" +: "${FRANK_ARCHON_MAX_SEQS:?FRANK_ARCHON_MAX_SEQS must be set}" +: "${FRANK_ARCHON_MAX_MODEL_LEN:?FRANK_ARCHON_MAX_MODEL_LEN must be set}" +: "${FRANK_ARCHON_PLACEMENT:?FRANK_ARCHON_PLACEMENT must be set}" +: "${FRANK_ARCHON_HOST_POOL_MIB:?FRANK_ARCHON_HOST_POOL_MIB must be set}" +: "${FRANK_ARCHON_GPU_HEADROOM_MIB:?FRANK_ARCHON_GPU_HEADROOM_MIB must be set}" +: "${FRANK_ARCHON_VRAM_WEIGHTS_MIB:?FRANK_ARCHON_VRAM_WEIGHTS_MIB must be set}" +: "${FRANK_ARCHON_VRAM_KV_MIB:?FRANK_ARCHON_VRAM_KV_MIB must be set}" +: "${FRANK_ARCHON_KV_DTYPE:?FRANK_ARCHON_KV_DTYPE must be set}" +: "${FRANK_ARCHON_SPEC_TOKENS:?FRANK_ARCHON_SPEC_TOKENS must be set}" +: "${FRANK_ARCHON_MAX_BATCHED_TOKENS:?FRANK_ARCHON_MAX_BATCHED_TOKENS must be set}" +: "${FRANK_ARCHON_PREFIX_HOST_MIB:?FRANK_ARCHON_PREFIX_HOST_MIB must be set}" +: "${FRANK_ARCHON_PREFIX_DISK_MIB:?FRANK_ARCHON_PREFIX_DISK_MIB must be set}" +: "${FRANK_ARCHON_NGRAM_PLACEMENT:?FRANK_ARCHON_NGRAM_PLACEMENT must be set}" +: "${FRANK_ARCHON_TTM_MIN_MIB:?FRANK_ARCHON_TTM_MIN_MIB must be set}" +: "${FRANK_ARCHON_RAD_MIN_MIB:?FRANK_ARCHON_RAD_MIN_MIB must be set}" # The image gate is the digest-pinned ref itself: a name@sha256 ref exists # in storage only if THAT manifest was pulled — a retagged look-alike or a # newer latest does not satisfy it. `podman image exists` takes a # name@digest ref in one command — no pipefail/grep race (the 2026-09-30 # lesson). Runs as dank: the unit's process uses dank's ROOTLESS podman -# storage (root unit, User=dank — the fleet's frank-primary shape). -if ! podman image exists "$FRANK_PRIMARY_IMAGE"; then - echo "ERROR: radiance image absent: $FRANK_PRIMARY_IMAGE" >&2 - echo "frank-primary: podman pull docker://stilldeadcode/radiance:latest (as dank)" >&2 +# storage (root unit, User=dank — the fleet's frank-archon shape). +if ! podman image exists "$FRANK_ARCHON_IMAGE"; then + echo "ERROR: radiance image absent: $FRANK_ARCHON_IMAGE" >&2 + echo "frank-archon: podman pull docker://stilldeadcode/radiance:latest (as dank)" >&2 exit 1 fi # The payload gate: the .rad container file, sized. A truncated convert # would otherwise buy a guaranteed long-timeout boot instead of this fast # failure. The staging dir / raw checkpoint are NOT this script's concern -# (scripts/build-frank-primary-rad.sh built the file; its rad-info output +# (scripts/build-frank-archon-rad.sh built the file; its rad-info output # is the record). -RAD="$FRANK_PRIMARY_MODEL_DIR/$FRANK_PRIMARY_MODEL_FILE" +RAD="$FRANK_ARCHON_MODEL_DIR/$FRANK_ARCHON_MODEL_FILE" if [ ! -f "$RAD" ]; then echo "ERROR: .rad container missing: $RAD" >&2 - echo "frank-primary: run scripts/build-frank-primary-rad.sh" >&2 + echo "frank-archon: run scripts/build-frank-archon-rad.sh" >&2 exit 1 fi RAD_MIB=$(( $(stat -c %s "$RAD") / 1048576 )) -if [ "$RAD_MIB" -lt "$FRANK_PRIMARY_RAD_MIN_MIB" ]; then - echo "ERROR: .rad container too small: $RAD is ${RAD_MIB} MiB, want >= $FRANK_PRIMARY_RAD_MIN_MIB" >&2 - echo "frank-primary: the convert was truncated — rebuild it" >&2 +if [ "$RAD_MIB" -lt "$FRANK_ARCHON_RAD_MIN_MIB" ]; then + echo "ERROR: .rad container too small: $RAD is ${RAD_MIB} MiB, want >= $FRANK_ARCHON_RAD_MIN_MIB" >&2 + echo "frank-archon: the convert was truncated — rebuild it" >&2 exit 1 fi -if [ ! -f "$FRANK_PRIMARY_TEMPLATE" ]; then - echo "ERROR: chat template missing: $FRANK_PRIMARY_TEMPLATE" >&2 +if [ ! -f "$FRANK_ARCHON_TEMPLATE" ]; then + echo "ERROR: chat template missing: $FRANK_ARCHON_TEMPLATE" >&2 exit 1 fi -mkdir -p "$FRANK_PRIMARY_STATE_DIR/kvcache/frank-primary" +mkdir -p "$FRANK_ARCHON_STATE_DIR/kvcache/frank-archon" # The engine's create is NOT recursive: with only the state dir mounted, its -# "cannot create /data/kvcache/frank-primary: No such file or directory" +# "cannot create /data/kvcache/frank-archon: No such file or directory" # left the SSD prefix tier off (measured 2026-10-06 boot ledger). Pre-create # the full path on the host so the tier opens on first boot. -mkdir -p "$FRANK_PRIMARY_STATE_DIR/tune" +mkdir -p "$FRANK_ARCHON_STATE_DIR/tune" # rad-tune's kernel-selection cache (see the runbook's "Tuning levers"): # the engine's selector reads $RADIANCE_HOME/tune/.tune at boot; # $RADIANCE_HOME defaults to /opt/radiance, which lives in the image, so @@ -118,7 +118,7 @@ fi # TTM preflight: the pinned ledger (~2 x 40 GiB pools + 47.7 GiB PLE + 4 GiB # prefix host = ~132 GiB) rides TTM's shared pages, capped by ttm's # pages_limit (the current kernel exposes NO pages_max; the cap function -# takes the min over the knobs that exist). Below FRANK_PRIMARY_TTM_MIN_MIB +# takes the min over the knobs that exist). Below FRANK_ARCHON_TTM_MIN_MIB # the load dies mid-pin with an allocator error instead of this named # refusal — raise the knob first (runtime sysfs write; kernel cmdline # fallback + one reboot only if the file is read-only), see the runbook. @@ -138,22 +138,22 @@ ttm_cap_mib() { echo "${cur:-0}" } TTM_CAP="$(ttm_cap_mib)" -if [ "$TTM_CAP" -lt "$FRANK_PRIMARY_TTM_MIN_MIB" ]; then - echo "ERROR: ttm pages cap is ${TTM_CAP} MiB, the pinned ledger needs >= $FRANK_PRIMARY_TTM_MIN_MIB" >&2 - echo "frank-primary: raise /sys/module/ttm/parameters/pages_limit (and pages_max if the kernel exposes one) to >= $FRANK_PRIMARY_TTM_MIN_MIB in 4 KiB pages" >&2 +if [ "$TTM_CAP" -lt "$FRANK_ARCHON_TTM_MIN_MIB" ]; then + echo "ERROR: ttm pages cap is ${TTM_CAP} MiB, the pinned ledger needs >= $FRANK_ARCHON_TTM_MIN_MIB" >&2 + echo "frank-archon: raise /sys/module/ttm/parameters/pages_limit (and pages_max if the kernel exposes one) to >= $FRANK_ARCHON_TTM_MIN_MIB in 4 KiB pages" >&2 exit 1 fi # A crashed/killed unit can leave the container name registered (systemd # SIGKILLs conmon before cleanup runs). Clear OUR name plus the legacy -# identities (the FreeToken-era frank-primary-qwen, the retired R9V +# identities (the FreeToken-era frank-archon-qwen, the retired R9V # container and the ad hoc experiment containers all hold this GPU); all # idempotent. -for CTR in $FRANK_PRIMARY_LEGACY_CONTAINERS "$FRANK_PRIMARY_CONTAINER"; do +for CTR in $FRANK_ARCHON_LEGACY_CONTAINERS "$FRANK_ARCHON_CONTAINER"; do podman rm -f "$CTR" >/dev/null 2>&1 || true done -LOG=/home/dank/logs/frank_primary.log +LOG=/home/dank/logs/frank_archon.log mkdir -p "$(dirname "$LOG")" # Publisher-vetted container contract (docs/DOCKER.md, compose/common.yaml): @@ -166,41 +166,41 @@ mkdir -p "$(dirname "$LOG")" # /dev/kfd + /dev/dri (render/video groups are moot for a root container). # The template rides a single-file mount; the .rad dir is ro; /data holds # the prefix-cache disk tier. -podman run -d --name "$FRANK_PRIMARY_CONTAINER" \ +podman run -d --name "$FRANK_ARCHON_CONTAINER" \ --network host \ --init \ --security-opt seccomp=unconfined \ --ulimit memlock=-1:-1 \ --device /dev/kfd --device /dev/dri \ - -v "$FRANK_PRIMARY_MODEL_DIR":/models:ro \ - -v "$FRANK_PRIMARY_STATE_DIR":/data \ - -v "$FRANK_PRIMARY_STATE_DIR/tune":/opt/radiance/share/radiance/tune \ - -v "$FRANK_PRIMARY_TEMPLATE":/templates/template.jinja:ro \ - "$FRANK_PRIMARY_IMAGE" \ - --model "/models/$FRANK_PRIMARY_MODEL_FILE" \ - --host :: --port "$FRANK_PRIMARY_PORT" \ - --served-model-name "$FRANK_PRIMARY_SERVED_NAME" \ + -v "$FRANK_ARCHON_MODEL_DIR":/models:ro \ + -v "$FRANK_ARCHON_STATE_DIR":/data \ + -v "$FRANK_ARCHON_STATE_DIR/tune":/opt/radiance/share/radiance/tune \ + -v "$FRANK_ARCHON_TEMPLATE":/templates/template.jinja:ro \ + "$FRANK_ARCHON_IMAGE" \ + --model "/models/$FRANK_ARCHON_MODEL_FILE" \ + --host :: --port "$FRANK_ARCHON_PORT" \ + --served-model-name "$FRANK_ARCHON_SERVED_NAME" \ --override-chat-template /templates/template.jinja \ - --tp "$FRANK_PRIMARY_TP" --tp-wire "$FRANK_PRIMARY_TP_WIRE" \ - --max-num-seqs "$FRANK_PRIMARY_MAX_SEQS" \ - --max-model-len "$FRANK_PRIMARY_MAX_MODEL_LEN" \ - --placement "$FRANK_PRIMARY_PLACEMENT" \ - --host-pool-mib "$FRANK_PRIMARY_HOST_POOL_MIB" \ - --gpu-headroom-mib "$FRANK_PRIMARY_GPU_HEADROOM_MIB" \ - --vram-weights-mib "$FRANK_PRIMARY_VRAM_WEIGHTS_MIB" \ - --vram-kv-mib "$FRANK_PRIMARY_VRAM_KV_MIB" \ - --kv-cache-dtype "$FRANK_PRIMARY_KV_DTYPE" \ - --prefix-cache-host-mib "$FRANK_PRIMARY_PREFIX_HOST_MIB" \ - --prefix-cache-dir /data/kvcache/frank-primary \ - --prefix-cache-disk-mib "$FRANK_PRIMARY_PREFIX_DISK_MIB" \ - --ngram-placement "$FRANK_PRIMARY_NGRAM_PLACEMENT" \ - --num-speculative-tokens "$FRANK_PRIMARY_SPEC_TOKENS" \ - --max-num-batched-tokens "$FRANK_PRIMARY_MAX_BATCHED_TOKENS" \ - ${FRANK_PRIMARY_EXTRA_ARGS:+$FRANK_PRIMARY_EXTRA_ARGS} \ + --tp "$FRANK_ARCHON_TP" --tp-wire "$FRANK_ARCHON_TP_WIRE" \ + --max-num-seqs "$FRANK_ARCHON_MAX_SEQS" \ + --max-model-len "$FRANK_ARCHON_MAX_MODEL_LEN" \ + --placement "$FRANK_ARCHON_PLACEMENT" \ + --host-pool-mib "$FRANK_ARCHON_HOST_POOL_MIB" \ + --gpu-headroom-mib "$FRANK_ARCHON_GPU_HEADROOM_MIB" \ + --vram-weights-mib "$FRANK_ARCHON_VRAM_WEIGHTS_MIB" \ + --vram-kv-mib "$FRANK_ARCHON_VRAM_KV_MIB" \ + --kv-cache-dtype "$FRANK_ARCHON_KV_DTYPE" \ + --prefix-cache-host-mib "$FRANK_ARCHON_PREFIX_HOST_MIB" \ + --prefix-cache-dir /data/kvcache/frank-archon \ + --prefix-cache-disk-mib "$FRANK_ARCHON_PREFIX_DISK_MIB" \ + --ngram-placement "$FRANK_ARCHON_NGRAM_PLACEMENT" \ + --num-speculative-tokens "$FRANK_ARCHON_SPEC_TOKENS" \ + --max-num-batched-tokens "$FRANK_ARCHON_MAX_BATCHED_TOKENS" \ + ${FRANK_ARCHON_EXTRA_ARGS:+$FRANK_ARCHON_EXTRA_ARGS} \ > "$LOG" 2>&1 # From here on, this script's lifetime IS the container's: wait returns the # container's exit code, so a crash is a nonzero ExecStart and the unit's # Restart=always is real. (systemd stop goes through ExecStop in the unit — # podman wait alone cannot stop the container child.) -exec podman wait "$FRANK_PRIMARY_CONTAINER" +exec podman wait "$FRANK_ARCHON_CONTAINER" diff --git a/scripts/serve-frank-large.sh b/scripts/serve-frank-dragoon.sh similarity index 64% rename from scripts/serve-frank-large.sh rename to scripts/serve-frank-dragoon.sh index c67cd94..135fe38 100755 --- a/scripts/serve-frank-large.sh +++ b/scripts/serve-frank-dragoon.sh @@ -1,13 +1,13 @@ #!/usr/bin/env bash -# serve-frank-large.sh — frank-large endpoint: halogen-flash-server 0.16.2 +# serve-frank-dragoon.sh — frank-dragoon endpoint: halogen-flash-server 0.16.2 # (closed-source engine, image ghcr.io/peonist-ai/halogen-flash-server, -# digest-pinned in frank-large.env) serving the Quat3rnion abliterated +# digest-pinned in frank-dragoon.env) serving the Quat3rnion abliterated # Swift1.5 finetune of peonist's Qwen3.8-Flash-Next v2 checkpoint on # Dankclaw's Strix Halo iGPU, host :7770. 2026-10-06 cutover from the # halogen 27B-dense shape — revert the swap commit's trio to roll back # (the 27B payload stays on disk). # -# The engine is driven by `podman run` DIRECTLY (the fleet's frank-primary +# The engine is driven by `podman run` DIRECTLY (the fleet's frank-archon # pattern): the image starts engine + OpenAI frontend in one container. # The frontend listens on 8731 inside (HALOGEN_API_PORT default) and is # published as host 7770; the engine's own token port (8730, no auth) @@ -26,13 +26,13 @@ # Why containers instead of a bare binary: the payload is .hgn and only # the flash-server line reads it; it ships as a container; the root unit # keeps LimitMEMLOCK=infinity for parity and to outlive the login session, -# exactly like frank-primary's. +# exactly like frank-archon's. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -ENV_FILE="${FRANK_LARGE_ENV_FILE:-$SCRIPT_DIR/frank-large.env}" +ENV_FILE="${FRANK_DRAGOON_ENV_FILE:-$SCRIPT_DIR/frank-dragoon.env}" if [ ! -f "$ENV_FILE" ]; then - echo "frank-large: env file not found: $ENV_FILE" >&2 + echo "frank-dragoon: env file not found: $ENV_FILE" >&2 exit 1 fi set -a @@ -40,17 +40,17 @@ set -a source "$ENV_FILE" set +a -: "${FRANK_LARGE_IMAGE:?FRANK_LARGE_IMAGE must name the digest-pinned image}" -: "${FRANK_LARGE_CONTAINER:?FRANK_LARGE_CONTAINER must name the container}" -: "${FRANK_LARGE_PUBLISH:?FRANK_LARGE_PUBLISH must be host:container}" -: "${FRANK_LARGE_MODEL_DIR:?FRANK_LARGE_MODEL_DIR must name the payload dir}" -: "${FRANK_LARGE_CHECKPOINT:?FRANK_LARGE_CHECKPOINT must name the .hgn inside it}" -: "${FRANK_LARGE_CHECKPOINT_BYTES:?FRANK_LARGE_CHECKPOINT_BYTES must pin the size}" -: "${FRANK_LARGE_NGRAM_TABLE:?FRANK_LARGE_NGRAM_TABLE must name the lookup table}" -: "${FRANK_LARGE_NGRAM_BYTES:?FRANK_LARGE_NGRAM_BYTES must pin the table size}" -: "${FRANK_LARGE_VISION_TOWER:?FRANK_LARGE_VISION_TOWER must name the tower}" -: "${FRANK_LARGE_VISION_BYTES:?FRANK_LARGE_VISION_BYTES must pin the tower size}" -: "${FRANK_LARGE_TOKENIZER_FILES:?FRANK_LARGE_TOKENIZER_FILES must list the tokenizer dir contents}" +: "${FRANK_DRAGOON_IMAGE:?FRANK_DRAGOON_IMAGE must name the digest-pinned image}" +: "${FRANK_DRAGOON_CONTAINER:?FRANK_DRAGOON_CONTAINER must name the container}" +: "${FRANK_DRAGOON_PUBLISH:?FRANK_DRAGOON_PUBLISH must be host:container}" +: "${FRANK_DRAGOON_MODEL_DIR:?FRANK_DRAGOON_MODEL_DIR must name the payload dir}" +: "${FRANK_DRAGOON_CHECKPOINT:?FRANK_DRAGOON_CHECKPOINT must name the .hgn inside it}" +: "${FRANK_DRAGOON_CHECKPOINT_BYTES:?FRANK_DRAGOON_CHECKPOINT_BYTES must pin the size}" +: "${FRANK_DRAGOON_NGRAM_TABLE:?FRANK_DRAGOON_NGRAM_TABLE must name the lookup table}" +: "${FRANK_DRAGOON_NGRAM_BYTES:?FRANK_DRAGOON_NGRAM_BYTES must pin the table size}" +: "${FRANK_DRAGOON_VISION_TOWER:?FRANK_DRAGOON_VISION_TOWER must name the tower}" +: "${FRANK_DRAGOON_VISION_BYTES:?FRANK_DRAGOON_VISION_BYTES must pin the tower size}" +: "${FRANK_DRAGOON_TOKENIZER_FILES:?FRANK_DRAGOON_TOKENIZER_FILES must list the tokenizer dir contents}" : "${HALOGEN_MODEL_ID:?HALOGEN_MODEL_ID must be the served alias (frank-dragoon)}" : "${HALOGEN_CTX:?HALOGEN_CTX must be set (per-slot window)}" : "${HALOGEN_KV_POOL_POSITIONS:?HALOGEN_KV_POOL_POSITIONS must be set}" @@ -62,9 +62,9 @@ set +a # podman dies SIGPIPE 141, pipefail turns the 141 into "no match" — the # 2026-09-30 deploy refusal). DIGESTS="$(podman images --format '{{.RepoDigests}}')" -if ! grep -qF "${FRANK_LARGE_IMAGE#*@}" <<<"$DIGESTS"; then - echo "frank-large: image $FRANK_LARGE_IMAGE not in podman storage;" >&2 - echo " pull it: podman pull ${FRANK_LARGE_IMAGE%@*}" >&2 +if ! grep -qF "${FRANK_DRAGOON_IMAGE#*@}" <<<"$DIGESTS"; then + echo "frank-dragoon: image $FRANK_DRAGOON_IMAGE not in podman storage;" >&2 + echo " pull it: podman pull ${FRANK_DRAGOON_IMAGE%@*}" >&2 exit 1 fi @@ -74,45 +74,45 @@ fi ck() { # ck if [ ! -f "$2" ]; then - echo "frank-large: $1 $2 missing;" >&2 - echo " fetch it: bash scripts/download-frank-large-flashnext.sh" >&2 + echo "frank-dragoon: $1 $2 missing;" >&2 + echo " fetch it: bash scripts/download-frank-dragoon-flashnext.sh" >&2 exit 1 fi local sz sz="$(stat -c %s "$2")" if [ "$sz" != "$3" ]; then - echo "frank-large: $1 is $sz bytes, expected $3 (partial download?)" >&2 + echo "frank-dragoon: $1 is $sz bytes, expected $3 (partial download?)" >&2 exit 1 fi } -ck checkpoint "$FRANK_LARGE_MODEL_DIR/$FRANK_LARGE_CHECKPOINT" "$FRANK_LARGE_CHECKPOINT_BYTES" -ck n-gram-table "$FRANK_LARGE_MODEL_DIR/$FRANK_LARGE_NGRAM_TABLE" "$FRANK_LARGE_NGRAM_BYTES" -ck vision-tower "$FRANK_LARGE_MODEL_DIR/$FRANK_LARGE_VISION_TOWER" "$FRANK_LARGE_VISION_BYTES" +ck checkpoint "$FRANK_DRAGOON_MODEL_DIR/$FRANK_DRAGOON_CHECKPOINT" "$FRANK_DRAGOON_CHECKPOINT_BYTES" +ck n-gram-table "$FRANK_DRAGOON_MODEL_DIR/$FRANK_DRAGOON_NGRAM_TABLE" "$FRANK_DRAGOON_NGRAM_BYTES" +ck vision-tower "$FRANK_DRAGOON_MODEL_DIR/$FRANK_DRAGOON_VISION_TOWER" "$FRANK_DRAGOON_VISION_BYTES" # The payload ships the tokenizer as a FLAT DIRECTORY. A HuggingFace cache # snapshot symlinks each file into a sibling blobs/, and those symlinks # dangle inside the container mount — so the directory must be real and # every named file must be a regular file, not a link. -TOK_DIR="$FRANK_LARGE_MODEL_DIR/tokenizer" +TOK_DIR="$FRANK_DRAGOON_MODEL_DIR/tokenizer" if [ -L "$TOK_DIR" ] || [ ! -d "$TOK_DIR" ]; then - echo "frank-large: tokenizer dir $TOK_DIR missing or a symlink (HF cache snapshot?);" >&2 - echo " fetch it: bash scripts/download-frank-large-flashnext.sh" >&2 + echo "frank-dragoon: tokenizer dir $TOK_DIR missing or a symlink (HF cache snapshot?);" >&2 + echo " fetch it: bash scripts/download-frank-dragoon-flashnext.sh" >&2 exit 1 fi -for TF in $FRANK_LARGE_TOKENIZER_FILES; do +for TF in $FRANK_DRAGOON_TOKENIZER_FILES; do if [ ! -f "$TOK_DIR/$TF" ] || [ -L "$TOK_DIR/$TF" ]; then - echo "frank-large: tokenizer file $TOK_DIR/$TF missing or a symlink;" >&2 - echo " fetch it: bash scripts/download-frank-large-flashnext.sh" >&2 + echo "frank-dragoon: tokenizer file $TOK_DIR/$TF missing or a symlink;" >&2 + echo " fetch it: bash scripts/download-frank-dragoon-flashnext.sh" >&2 exit 1 fi done # GPU access is mandatory but the node paths are variables so the seam can # drive the gate on a box without an AMD GPU. -DEV_KFD="${FRANK_LARGE_DEV_KFD:-/dev/kfd}" -DEV_DRI="${FRANK_LARGE_DEV_DRI:-/dev/dri}" +DEV_KFD="${FRANK_DRAGOON_DEV_KFD:-/dev/kfd}" +DEV_DRI="${FRANK_DRAGOON_DEV_DRI:-/dev/dri}" if [ ! -e "$DEV_KFD" ] || [ ! -d "$DEV_DRI" ]; then - echo "frank-large: $DEV_KFD or $DEV_DRI missing — no gfx1151 to serve on" >&2 + echo "frank-dragoon: $DEV_KFD or $DEV_DRI missing — no gfx1151 to serve on" >&2 exit 1 fi # Host-RAM preflight — the engine's pin gate, checked BEFORE podman run. @@ -125,15 +125,15 @@ fi # self-resolved in ~2 min when the dying 27B engine freed RAM. Check here and # WAIT for the RAM to clear, so a transient dip boots once instead of # crash-looping; if it never clears, refuse loudly. -MEMINFO="${FRANK_LARGE_MEMINFO:-/proc/meminfo}" -PIN_KB=$(( FRANK_LARGE_CHECKPOINT_BYTES / 1024 )) +MEMINFO="${FRANK_DRAGOON_MEMINFO:-/proc/meminfo}" +PIN_KB=$(( FRANK_DRAGOON_CHECKPOINT_BYTES / 1024 )) NEED_KB=$(( PIN_KB + 16 * 1048576 )) ram_avail_kb() { awk '/^MemAvailable:/{print $2; exit}' "$MEMINFO"; } MEMAVAIL_KB="$(ram_avail_kb)" || MEMAVAIL_KB="" if [ -n "$MEMAVAIL_KB" ] && [ "$MEMAVAIL_KB" -lt "$NEED_KB" ]; then - WAIT_S="${FRANK_LARGE_RAM_WAIT:-600}" + WAIT_S="${FRANK_DRAGOON_RAM_WAIT:-600}" GIB() { awk -v kb="$1" 'BEGIN{printf "%.2f", kb/1048576}'; } - echo "frank-large: host RAM below the pin gate — MemAvailable $(GIB "$MEMAVAIL_KB") GiB < needed $(GIB "$NEED_KB") GiB ($(GIB "$PIN_KB") GiB checkpoint + 16.00 GiB floor); waiting up to ${WAIT_S}s for host RAM to clear" >&2 + echo "frank-dragoon: host RAM below the pin gate — MemAvailable $(GIB "$MEMAVAIL_KB") GiB < needed $(GIB "$NEED_KB") GiB ($(GIB "$PIN_KB") GiB checkpoint + 16.00 GiB floor); waiting up to ${WAIT_S}s for host RAM to clear" >&2 deadline=$(( $(date +%s) + WAIT_S )) while [ "$(date +%s)" -lt "$deadline" ]; do sleep 5 @@ -143,16 +143,16 @@ if [ -n "$MEMAVAIL_KB" ] && [ "$MEMAVAIL_KB" -lt "$NEED_KB" ]; then fi done if [ -z "$MEMAVAIL_KB" ] || [ "$MEMAVAIL_KB" -lt "$NEED_KB" ]; then - echo "frank-large: MemAvailable $(GIB "${MEMAVAIL_KB:-0}") GiB after ${WAIT_S}s; refusing to start (the engine would refuse the pin)" >&2 + echo "frank-dragoon: MemAvailable $(GIB "${MEMAVAIL_KB:-0}") GiB after ${WAIT_S}s; refusing to start (the engine would refuse the pin)" >&2 exit 1 fi - echo "frank-large: MemAvailable cleared to $(GIB "$MEMAVAIL_KB") GiB; starting" >&2 + echo "frank-dragoon: MemAvailable cleared to $(GIB "$MEMAVAIL_KB") GiB; starting" >&2 fi -for CTR in ${FRANK_LARGE_LEGACY_CONTAINERS:-} "$FRANK_LARGE_CONTAINER"; do +for CTR in ${FRANK_DRAGOON_LEGACY_CONTAINERS:-} "$FRANK_DRAGOON_CONTAINER"; do podman rm -f "$CTR" >/dev/null 2>&1 || true done -LOG="${FRANK_LARGE_LOG:-/home/dank/logs/frank_large.log}" +LOG="${FRANK_DRAGOON_LOG:-/home/dank/logs/frank_dragoon.log}" mkdir -p "$(dirname "$LOG")" # --ipc=host for the udev-granted supplementary group, seccomp unconfined # for the ROCm ioctl surface, and unbounded memlock (the unit's @@ -163,17 +163,17 @@ mkdir -p "$(dirname "$LOG")" # and both sibling serve scripts pass no nofile either. No comment lines # inside the backslash chain — a mid-chain # terminates the continuation # (the 2026-10-05 exit-127 crash loop on the sibling serve script). -podman run --name "$FRANK_LARGE_CONTAINER" \ - --publish "$FRANK_LARGE_PUBLISH" \ +podman run --name "$FRANK_DRAGOON_CONTAINER" \ + --publish "$FRANK_DRAGOON_PUBLISH" \ --ipc=host \ --ulimit memlock=-1:-1 \ --device "$DEV_KFD" --device "$DEV_DRI" \ --group-add keep-groups \ --security-opt seccomp=unconfined \ -e HALOGEN_MODEL_ID="$HALOGEN_MODEL_ID" \ - -e HALOGEN_CHECKPOINT="/models/$FRANK_LARGE_CHECKPOINT" \ - -e HALOGEN_NGRAM_TABLE="/models/$FRANK_LARGE_NGRAM_TABLE" \ - -e HALOGEN_VISION_TOWER="/models/$FRANK_LARGE_VISION_TOWER" \ + -e HALOGEN_CHECKPOINT="/models/$FRANK_DRAGOON_CHECKPOINT" \ + -e HALOGEN_NGRAM_TABLE="/models/$FRANK_DRAGOON_NGRAM_TABLE" \ + -e HALOGEN_VISION_TOWER="/models/$FRANK_DRAGOON_VISION_TOWER" \ -e HALOGEN_TOKENIZER=/tokenizer \ -e HALOGEN_CTX="$HALOGEN_CTX" \ -e HALOGEN_KV_POOL_POSITIONS="$HALOGEN_KV_POOL_POSITIONS" \ @@ -187,9 +187,9 @@ podman run --name "$FRANK_LARGE_CONTAINER" \ -e HALOGEN_TOP_P="${HALOGEN_TOP_P:-0.95}" \ -e HALOGEN_TOP_K="${HALOGEN_TOP_K:-20}" \ ${HALOGEN_WEIGHTS_LOCK:+-e HALOGEN_WEIGHTS_LOCK="$HALOGEN_WEIGHTS_LOCK"} \ - -v "$FRANK_LARGE_MODEL_DIR:/models:ro" \ - -v "$FRANK_LARGE_MODEL_DIR/tokenizer:/tokenizer:ro" \ - "$FRANK_LARGE_IMAGE" \ + -v "$FRANK_DRAGOON_MODEL_DIR:/models:ro" \ + -v "$FRANK_DRAGOON_MODEL_DIR/tokenizer:/tokenizer:ro" \ + "$FRANK_DRAGOON_IMAGE" \ > "$LOG" 2>&1 # FOREGROUND `podman run`: the engine's stdout/stderr are this script's diff --git a/scripts/serve-frank-secondary.sh b/scripts/serve-frank-zealot.sh similarity index 90% rename from scripts/serve-frank-secondary.sh rename to scripts/serve-frank-zealot.sh index ba95d8a..f186f4d 100755 --- a/scripts/serve-frank-secondary.sh +++ b/scripts/serve-frank-zealot.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # Serve HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive (Q6_K) as -# frank-secondary on Dankclaw's RTX 3090 via llama.cpp (master build, CUDA sm_86). +# frank-zealot on Dankclaw's RTX 3090 via llama.cpp (master build, CUDA sm_86). # # 2026-10-07 (Frank): Qwen3.5-9B swap at TWO 200,704-token conversations # (--ctx-size 401408 --parallel 2) with EXACT f16 KV — the 9B rung frees the @@ -24,11 +24,11 @@ # Sampling: llama.cpp takes it per request (the fleet harness sends the # publisher recipe from models.yml: thinking temp 0.6 / top_p 0.95 / top_k 20). # -# Tunables come from frank-secondary.env unless FRANK_SECONDARY_ENV_FILE overrides. +# Tunables come from frank-zealot.env unless FRANK_ZEALOT_ENV_FILE overrides. set -euo pipefail SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" -ENV_FILE="${FRANK_SECONDARY_ENV_FILE:-$SCRIPT_DIR/frank-secondary.env}" +ENV_FILE="${FRANK_ZEALOT_ENV_FILE:-$SCRIPT_DIR/frank-zealot.env}" if [[ -f "$ENV_FILE" ]]; then set -a # shellcheck disable=SC1090 @@ -83,11 +83,11 @@ fi # has not finished, and Restart=always would turn it into a crash loop that # reads like a runtime fault. for path in "$LLAMA_BIN" "$MODEL_FILE"; do - [[ -e "$path" ]] || { echo "frank-secondary: missing $path" >&2; exit 1; } + [[ -e "$path" ]] || { echo "frank-zealot: missing $path" >&2; exit 1; } done EXTRA_ARGS=() if [[ -n "$MMPROJ_FILE" ]]; then - [[ -e "$MMPROJ_FILE" ]] || { echo "frank-secondary: missing $MMPROJ_FILE" >&2; exit 1; } + [[ -e "$MMPROJ_FILE" ]] || { echo "frank-zealot: missing $MMPROJ_FILE" >&2; exit 1; } EXTRA_ARGS+=(--mmproj "$MMPROJ_FILE") fi @@ -97,7 +97,7 @@ fi if [[ -n "$SPEC_TYPE" && "$SPEC_TYPE" != "none" ]]; then EXTRA_ARGS+=(--spec-type "$SPEC_TYPE" --spec-draft-n-max "$SPEC_DRAFT_N_MAX") if [[ -n "$SPEC_DRAFT_FILE" ]]; then - [[ -e "$SPEC_DRAFT_FILE" ]] || { echo "frank-secondary: missing $SPEC_DRAFT_FILE" >&2; exit 1; } + [[ -e "$SPEC_DRAFT_FILE" ]] || { echo "frank-zealot: missing $SPEC_DRAFT_FILE" >&2; exit 1; } EXTRA_ARGS+=(--spec-draft-model "$SPEC_DRAFT_FILE") fi fi @@ -108,7 +108,7 @@ nvidia-modprobe -u -c=0 2>/dev/null || true # Flash attention stays pinned on: it is REQUIRED for quantized V (q8_0), # and the build carries GGML_CUDA_FA_ALL_QUANTS=ON (since 2026-09-17), so -# the q8_0 KV contract in frank-secondary.env is a real path — without this +# the q8_0 KV contract in frank-zealot.env is a real path — without this # flag or that build option the engine silently falls back and the # contract becomes a lie. ARGS=( diff --git a/scripts/test-changed.sh b/scripts/test-changed.sh index 043fef6..770b9ee 100755 --- a/scripts/test-changed.sh +++ b/scripts/test-changed.sh @@ -145,12 +145,12 @@ for path in "${CHANGED[@]}"; do add_test tests/homepage_caddy.bats add_test tests/deployment_scoping.bats ;; - # frank-large is a rootless quadlet again since 2026-09-16 (the + # frank-dragoon is a rootless quadlet again since 2026-09-16 (the # halogen-flash-server restore). Its unit carries the fleet's GPU and # podman posture, so it gets its own seam rather than the generic # fallback below. - dankclaw/frank-large/*) - add_test tests/frank_large_unit.bats + dankclaw/frank-dragoon/*) + add_test tests/frank_dragoon_unit.bats add_test tests/deployment_scoping.bats add_test tests/docs_completeness.bats ;; @@ -187,29 +187,29 @@ for path in "${CHANGED[@]}"; do # as additions, with "no focused-test mapping". .AGENTTRASH/*|*/.AGENTTRASH/*) ;; - # frank-primary is llama.cpp (the unsloth b11030-mix prebuilt) on the + # frank-archon is llama.cpp (the unsloth b11030-mix prebuilt) on the # two R9700s as a ROOT unit — the 2026-09-26 swap that replaced the # Lucebox DS4.1 quadlet on :7770. Its env, unit and serve script all # live in scripts/, which is why this case has to precede the generic # scripts/*.service and scripts/* fallbacks below. - scripts/frank-primary.*|scripts/serve-frank-primary.sh) - add_test tests/frank_primary_unit.bats + scripts/frank-archon.*|scripts/serve-frank-archon.sh) + add_test tests/frank_archon_unit.bats add_test tests/llm_units.bats add_test tests/deployment_scoping.bats add_test tests/scripts_syntax.bats ;; - # frank-large's chat template lives in scripts/ (moved there on + # frank-dragoon's chat template lives in scripts/ (moved there on # 2026-09-26 when its old home was retired): a template edit changes # what the live endpoint renders, so it selects the large unit seam. scripts/qwen-sharp-v22.4.0.jinja) - add_test tests/frank_large_unit.bats + add_test tests/frank_dragoon_unit.bats ;; - # frank-secondary is llama.cpp on the 3090 as a ROOT unit: a native CUDA + # frank-zealot is llama.cpp on the 3090 as a ROOT unit: a native CUDA # binary, so no generated quadlet is involved. Its env, unit and serve # script all live in scripts/, which is why this case has to precede # the generic scripts/*.service and scripts/* fallbacks below. - scripts/frank-secondary.*|scripts/serve-frank-secondary.sh) - add_test tests/frank_secondary_unit.bats + scripts/frank-zealot.*|scripts/serve-frank-zealot.sh) + add_test tests/frank_zealot_unit.bats add_test tests/llm_units.bats add_test tests/deployment_scoping.bats add_test tests/scripts_syntax.bats diff --git a/serverAppConfigs-docs/Agent/OMP Harness.md b/serverAppConfigs-docs/Agent/OMP Harness.md index a6fface..5c5e5d8 100644 --- a/serverAppConfigs-docs/Agent/OMP Harness.md +++ b/serverAppConfigs-docs/Agent/OMP Harness.md @@ -16,13 +16,13 @@ this file is repo-managed; edits are harness-side only. **Model ids are the StarCraft unit names (official 2026-10-08, on the wire since 2026-10-09):** `frank-archon` (dankserver :7770, radiance), `frank-dragoon` (dankclaw :7770, flash-server), `frank-zealot` (dankclaw -:7771, the 3090 compaction hub) — formerly `frank-primary`, `frank-large`, -`frank-secondary`. The SERVICES keep the old names (units, scripts, env +:7771, the 3090 compaction hub) — formerly `frank-archon`, `frank-dragoon`, +`frank-zealot`. The SERVICES keep the old names (units, scripts, env files, runbook pages); pages written in the old era name the service, the harness names the model. The wire now matches: each endpoint's `/v1/models` answers with the Protoss name, so `models.yml`, the OpenWebUI picker/grants, the homepage docs and the raw API all use one id per model -(see [[OpenWebUI]] for the grant re-key and the [[frank-primary-radiance-swift15-w4dn8]] +(see [[OpenWebUI]] for the grant re-key and the [[frank-archon-radiance-swift15-w4dn8]] note on radiance echoing the requested name). ## Compaction chain arithmetic (verify before ANY window change) @@ -45,14 +45,14 @@ The arithmetic (the coupled contract every endpoint's maxTokens comment encodes): 1. **Source trigger** = `thresholdPercent × source contextWindow` - (0.70 × 200,704 = 140,492 for frank-primary on the current shape) + (0.70 × 200,704 = 140,492 for frank-archon on the current shape) 2. **Output budget** = capped at the target model's `maxTokens` - (32,768 for frank-secondary; 36,864 frank-primary; 57,344 frank-large — the + (32,768 for frank-zealot; 36,864 frank-archon; 57,344 frank-dragoon — the largest, because halogen's `HALOGEN_MAX_TOKENS_CAP` must stay ≥ it) 3. **REQUIREMENT**: prompt (≤ trigger) + budget ≤ the target's per-slot window. Worked pairs from the live registry: 140,492 + 36,864 = 177,356 ≤ - 200,704 (frank-primary); 140,490 + 57,344 = 197,834 ≤ 200,700 - (frank-large); 140,492 + 32,768 = 173,260 ≤ 200,704 (frank-secondary). + 200,704 (frank-archon); 140,490 + 57,344 = 197,834 ≤ 200,700 + (frank-dragoon); 140,492 + 32,768 = 173,260 ≤ 200,704 (frank-zealot). Procedure (recompute from the LIVE files every time — windows rotate with every swap; the numbers above are the 2026-10-05 state): @@ -112,19 +112,19 @@ Use **wire names**, not OMP camelCase. Two traps: `qwenPreserveThinking` is auto-derived in `buildOpenAICompat` from the *auto-detected* `thinkingFormat` + local baseUrl, **before** `applyCompatOverrides`. Setting `compat.thinkingFormat: qwen` in - models.yml does **not** enable it. Custom-named models (`frank-large`) + models.yml does **not** enable it. Custom-named models (`frank-dragoon`) match no Qwen id pattern → use `extraBody: {preserve_thinking: true}`. 2. **Never put `chat_template_kwargs` in `extraBody`** where a compat policy also sets it — `Object.assign` is shallow and replaces the whole object, silently dropping the `reasoning_effort` kwarg the compat policy set. - Top-level `preserve_thinking` is honoured by halogen. (frank-primary's + Top-level `preserve_thinking` is honoured by halogen. (frank-archon's FreeToken entry currently carries a `chat_template_kwargs` extraBody with a comment asking to verify-and-prune — the exact trap to check at that endpoint's next swap.) **Gotcha: silent greedy decode.** halogen has **no server-side sampler defaults** — `temperature` absent or `0` = greedy. If OMP sends nothing, the -endpoint decodes greedy while looking configured. This is why frank-large's +endpoint decodes greedy while looking configured. This is why frank-dragoon's entry carries the recipe on the wire and a comment saying "do not drop it". **Reasoning-effort folding.** Qwen3.8's template accepts only diff --git a/serverAppConfigs-docs/Architecture/Deploy State Triage.md b/serverAppConfigs-docs/Architecture/Deploy State Triage.md index 46a479c..56402ad 100644 --- a/serverAppConfigs-docs/Architecture/Deploy State Triage.md +++ b/serverAppConfigs-docs/Architecture/Deploy State Triage.md @@ -23,7 +23,7 @@ marker. So `marker != HEAD` means "not dispatched via deploy.sh", NOT **Why it matters:** a plain `deploy.sh` run re-selects and restarts a service whose marker lags. On llama.cpp/R9V endpoints that is a ~16–19 min reload of -a 100+ GiB payload — and frank-primary (dankserver:7770) is also the +a 100+ GiB payload — and frank-archon (dankserver:7770) is also the harness's own model backend, so a blind deploy is a self-inflicted outage for possibly zero behavioral change. diff --git a/serverAppConfigs-docs/Architecture/Deployment Flow.md b/serverAppConfigs-docs/Architecture/Deployment Flow.md index f527aa1..38e7370 100644 --- a/serverAppConfigs-docs/Architecture/Deployment Flow.md +++ b/serverAppConfigs-docs/Architecture/Deployment Flow.md @@ -62,8 +62,8 @@ service on the other host. |---|---|---| | Dankclaw compose services | `podman-compose -f dankclaw/compose.yaml up -d --no-deps NAME` | Recreates only `NAME`; Caddy is handled separately because it fronts both hosts. | | SearXNG, Gluetun, Valkey, OpenWebUI, Pi-hole, Gitea database/server | user Quadlet + `systemctl --user` | Installs the selected unit and restarts only the required dependency-coupled units. Gitea's web proxy is the canonical Caddy compose service. | -| `frank-large` | systemd + `systemctl` (root unit) | Relinks and restarts only the large inference service; waits up to 20 minutes for `/health`. | -| `frank-secondary` | systemd + `systemctl` (root unit) | Relinks and restarts only the small inference service; waits up to 20 minutes for `/health`. | +| `frank-dragoon` | systemd + `systemctl` (root unit) | Relinks and restarts only the large inference service; waits up to 20 minutes for `/health`. | +| `frank-zealot` | systemd + `systemctl` (root unit) | Relinks and restarts only the small inference service; waits up to 20 minutes for `/health`. | | `frank-medium` | rootless Quadlet + `systemctl --user` | Installs `dankserver/frank-medium/quadlet/frank-medium.container`; on first deploy retires the llama.cpp root unit and the vLLM replica quadlets into the home trash, then restarts the generated unit. Waits up to 20 minutes for `/health`. | | Dankserver media stack (RomM trio, Jellyfin, Calibre-Web, Copyparty) | user Quadlet + `systemctl --user` | Installs `dankserver//quadlet/*.container`, restarts the generated unit. The first cutover per service is idempotent: it retires the compose-era bare container, rescues any anonymous volume into the data root, and merge-moves `/opt/` to `/home/dank/Containers/` (mapped-uid roots move without chown). Steady state is restart-only. | diff --git a/serverAppConfigs-docs/Dankclaw/ComfyUI Qwen-Image Workflows.md b/serverAppConfigs-docs/Dankclaw/ComfyUI Qwen-Image Workflows.md index 557c892..d17856e 100644 --- a/serverAppConfigs-docs/Dankclaw/ComfyUI Qwen-Image Workflows.md +++ b/serverAppConfigs-docs/Dankclaw/ComfyUI Qwen-Image Workflows.md @@ -95,7 +95,7 @@ host-side `workflows/` dir and the repo copy. ## Recommended additions Quantized preferred, sized for the 8060S iGPU (GTT-backed; the RTX 3090 is -frank-secondary's). All repos verified 2026-10-05. None are on disk yet. +frank-zealot's). All repos verified 2026-10-05. None are on disk yet. | # | What | Repo | Grab | Size | Why | |---|---|---|---|---|---| diff --git a/serverAppConfigs-docs/Dankclaw/Dankclaw Stack.md b/serverAppConfigs-docs/Dankclaw/Dankclaw Stack.md index fe1a967..b9bd8f4 100644 --- a/serverAppConfigs-docs/Dankclaw/Dankclaw Stack.md +++ b/serverAppConfigs-docs/Dankclaw/Dankclaw Stack.md @@ -13,7 +13,7 @@ timestamp: 2026-08-26 # Dankclaw Stack Dankclaw (192.168.0.143) runs the AI, search, development, and observability -stack. Its LLM inference endpoint `frank-large` (`:7770`) is a ROCmFPX +stack. Its LLM inference endpoint `frank-dragoon` (`:7770`) is a ROCmFPX llama.cpp fork serving the kingjones Qwen3.8-Flash-Next-ROCmFP4-STRIX GGUF on the card's pinned runtime; an NPU endpoint (`frank-npu`, `:7771`, FLM v1.0.1) serves sight+sound models. The completion endpoint @@ -30,7 +30,7 @@ graph LR S --> V[Gluetun VPN] O --> L[llama.cpp dankserver :7770] O --> H[Hermes] - O --> E[frank-large :7770] + O --> E[frank-dragoon :7770] ``` ## Services @@ -48,14 +48,14 @@ graph LR | Seerr | `seerr.franksdank.cloud` (guarded) | Caddy routes post-auth to `seerr:5055` | [[Seerr]] | | Homepage | `franksdank.cloud` + `www.` (root site; guarded for admin actions) | served by Caddy itself from `/srv/homepage` | — | | Pi-hole | `pihole.franksdank.cloud` (basicauth edge, not the guard chain) | admin UI `8083`; DNS on `:53` LAN-wide | [[Pi-hole]] | -| frank-large (host service) | — | `7770` | [[deployment]] | +| frank-dragoon (host service) | — | `7770` | [[deployment]] | | frank-npu (host service) | — | `7771` (`/v1/version` health) | [[frank-npu]] | | frank-medium (host service, Dankserver) | — | `7770` | [[frank-medium-rocmfpx]] | The LLM rows are bare-metal systemd services, not containers. This repo owns their scripts, units, and knowledge base (see [LLM fleet knowledge base](../LLM/index.md)). Current mapping (2026-09-03): -`frank-large` runs the kingjones Qwen3.8-Flash-Next-ROCmFP4-STRIX GGUF +`frank-dragoon` runs the kingjones Qwen3.8-Flash-Next-ROCmFP4-STRIX GGUF on the card's pinned `kingjones30/ROCmFPX` llama.cpp build; `frank-npu` runs FLM v1.0.1 on the XDNA2 NPU; `frank-medium` runs charlie12345/ROCmFPX llama.cpp serving diff --git a/serverAppConfigs-docs/Dankclaw/Hermes.md b/serverAppConfigs-docs/Dankclaw/Hermes.md index e9d941a..ea5ae34 100644 --- a/serverAppConfigs-docs/Dankclaw/Hermes.md +++ b/serverAppConfigs-docs/Dankclaw/Hermes.md @@ -47,7 +47,7 @@ is not durable. The tracked, sanitized configuration baseline is `0.0.0.0:8080`, so the Signal HTTP API is reachable from the whole LAN. - The data volume persists skills, memory, and session history. - Hermes has two named local providers: `dankclaw-large` reaches - `http://192.168.0.143:7770/v1` and exposes `frank-large`; + `http://192.168.0.143:7770/v1` and exposes `frank-dragoon`; `dankserver-small` reaches `http://192.168.0.235:7770/v1` and exposes `frank-medium` (renamed from `frank-small` on 2026-09-15). - The live `config.yaml` contains secrets and user state and is not committed; @@ -64,7 +64,7 @@ is not durable. The tracked, sanitized configuration baseline is ## Gotchas - Hermes is under active development; pin the image tag for reproducibility. -- Model choice drives quality; the local `frank-large` (Dankclaw, 7770) is the intended backend. +- Model choice drives quality; the local `frank-dragoon` (Dankclaw, 7770) is the intended backend. - Do not expose the gateway without auth — put it behind [[Caddy]] with basic auth. ## Browser automation (Chrome DevTools Protocol daemon) @@ -189,7 +189,7 @@ What actually breaks, and the fix: auxiliary: title_generation: provider: dankserver-small # names track the live config; diff first - model: frank-secondary + model: frank-zealot api_mode: codex_responses # real per-task key extra_body: reasoning: diff --git a/serverAppConfigs-docs/Dankclaw/OpenWebUI.md b/serverAppConfigs-docs/Dankclaw/OpenWebUI.md index 6563e7c..004e384 100644 --- a/serverAppConfigs-docs/Dankclaw/OpenWebUI.md +++ b/serverAppConfigs-docs/Dankclaw/OpenWebUI.md @@ -24,7 +24,7 @@ https://github.com/open-webui/open-webui | Upstream latest | 0.11.4 (2026-09-21) — security/access-control advisory; `:main` is the rolling image, not a stable pin. Imagegen endpoint is `POST /api/v1/images/generations` (the `comfyui` engine is still upstream). | | Port | 3005 (host) → 8080 (container). Port 3000 is Gitea's HTTP, so it is not usable. | | Data volume | `/home/dank/Containers/open-webui/data` → `/app/backend/data` | -| Backends | Picker exposes exactly one model — `frank-secondary` (host.containers.internal:7771). The `frank-large` and `frank-primary` connections remain configured in the DB, disabled (2026-10-07) — see [The LLM backends](#the-llm-backends) | +| Backends | Picker exposes exactly one model — `frank-zealot` (host.containers.internal:7771). The `frank-dragoon` and `frank-archon` connections remain configured in the DB, disabled (2026-10-07) — see [The LLM backends](#the-llm-backends) | | Network | Pinned bridge `systemd-open-webui` (`10.89.3.0/24`, gateway `10.89.3.1`) — see [History](#history) | | Persistence | Quadlet unit `open-webui.service`; `[Install] WantedBy=default.target` | | Deploy | `scripts/deploy-open-webui-quadlet.sh dankclaw` | @@ -34,15 +34,15 @@ https://github.com/open-webui/open-webui The picker is built from the `model` table in `webui.db` (one row per model) plus the `model_ids` of each **enabled** OpenAI connection, NOT from live connection discovery — so the picker shows exactly what is seeded there. -As of 2026-10-07 the picker exposes **exactly one model: `frank-secondary`**. +As of 2026-10-07 the picker exposes **exactly one model: `frank-zealot`**. | Connection (`openai.api_configs` idx) | URL | Enabled | `model_ids` | Runtime | Host | |---|---|---|---|---|---| -| 0 | `http://host.containers.internal:7770/v1` | no (2026-10-07) | `frank-large` | halogen flash-server (Strix Halo iGPU) | Dankclaw | -| 1 | `http://192.168.0.235:7770/v1` | no (2026-10-07) | `frank-primary` | radiance TP=2 (2× R9700) | Dankserver | -| 2 | `http://host.containers.internal:7771/v1` | yes | `frank-secondary` | llama.cpp CUDA (RTX 3090, 2×200,704) | Dankclaw | +| 0 | `http://host.containers.internal:7770/v1` | no (2026-10-07) | `frank-dragoon` | halogen flash-server (Strix Halo iGPU) | Dankclaw | +| 1 | `http://192.168.0.235:7770/v1` | no (2026-10-07) | `frank-archon` | radiance TP=2 (2× R9700) | Dankserver | +| 2 | `http://host.containers.internal:7771/v1` | yes | `frank-zealot` | llama.cpp CUDA (RTX 3090, 2×200,704) | Dankclaw | -The `model` table carries exactly one decoration row, `frank-secondary` +The `model` table carries exactly one decoration row, `frank-zealot` (context length 200,704 = the per-slot window; description: Qwen3.5-9B Q6_K + BF16 vision mmproj). @@ -62,7 +62,7 @@ Two gotchas make the wiring non-obvious: - **llama.cpp `/v1/models` is Ollama-shaped.** llama.cpp returns `{"models":[{"name":...}]}`; OpenWebUI's `extract_data()` only reads the OpenAI `{"data":[{"id":...}]}` shape, so connection discovery silently misses - the llama.cpp endpoints (frank-large, frank-secondary). The fix is to set + the llama.cpp endpoints (frank-dragoon, frank-zealot). The fix is to set `model_ids` in each connection's `api_config` — when non-empty, OpenWebUI builds the model list directly and never fetches `/v1/models`. frank-medium (vLLM) serves the OpenAI shape and would discover fine, but uses `model_ids` @@ -116,7 +116,7 @@ The Ollama connection is disabled (`ollama.enable=false`). models. Response key is `items`, not `data`. 2. `POST /api/chat/completions` per model with a trivial prompt ("Reply with exactly one word: pong") → each returns content `pong`. Reasoning - models need a generous budget: frank-secondary (Qwen3.5 template) returns + models need a generous budget: frank-zealot (Qwen3.5 template) returns empty content + `finish_reason: "length"` at `max_tokens 200` (the thinking block eats it) and answers `pong` at 1500. 3. A 500 "Server Connection Error" → `podman logs open-webui` for @@ -191,8 +191,8 @@ browser-driven and only touches the two exempt vhosts (`ai.` and `auth.`). run with host `python3` over ssh against `/home/dank/Containers/open-webui/data/webui.db` (no `sqlite3` CLI on Dankclaw; table is `user`, singular; no `active` column). No per-user model - grant is needed: the picker model `frank-secondary` carries the global - `access_grant` row `(model, frank-secondary, user, *, read)`, so any + grant is needed: the picker model `frank-zealot` carries the global + `access_grant` row `(model, frank-zealot, user, *, read)`, so any `role='user'` account sees it. Flip on FIRST-LOGIN SIGHTING — the row does not exist until the account signs in (2026-10-09: five provisioned accounts had no row). @@ -271,18 +271,18 @@ on large sizes ⇒ check ComfyUI resources; 401 ⇒ the token is bad. - **2026-08-22 — slirp4netns → pinned bridge.** The unit ran on `Network=slirp4netns`. The slirp4netns helper process died (no OOM, no kill entry, no crash log found), and the container kept running with only `lo` in its netns: published port 3005 accepted TCP and reset every request, so chat served empty responses for ~2 days. Nothing logged an error. Moving to a kernel bridge removes the per-container helper entirely, and the healthcheck's interface check makes the zombie state visible if it ever returns. -- **2026-09-21 — model picker rebuilt for the 3-model fleet.** The picker carried 39 stale rows (37 dead Ollama models + 2 `frank-default-*`) and was missing `frank-medium`. Rebuilt the `model` table to exactly `frank-large`/`frank-medium`/`frank-secondary` and set `model_ids` on each connection (llama.cpp's Ollama-shaped `/v1/models` is invisible to OpenWebUI's discovery). Pointed the two on-host endpoints at `host.containers.internal` — the bridge refuses the host LAN IP for non-published ports. All three verified end-to-end via `/openai/chat/completions`. +- **2026-09-21 — model picker rebuilt for the 3-model fleet.** The picker carried 39 stale rows (37 dead Ollama models + 2 `frank-default-*`) and was missing `frank-medium`. Rebuilt the `model` table to exactly `frank-dragoon`/`frank-medium`/`frank-zealot` and set `model_ids` on each connection (llama.cpp's Ollama-shaped `/v1/models` is invisible to OpenWebUI's discovery). Pointed the two on-host endpoints at `host.containers.internal` — the bridge refuses the host LAN IP for non-published ports. All three verified end-to-end via `/openai/chat/completions`. - **2026-09-24 — SSO via authentik.** OIDC authorization-code flow wired per the [SSO (authentik)](#sso-authentik) section: application/provider/entitlements created in authentik, client secret in the host env file, roles from the `roles` scope claim. E2E coverage in `tests/e2e/specs/18-openwebui-sso.spec.ts`. - **2026-09-24 — flipped to SSO-only.** The OIDC round-trip verified in a real browser (login view renders no password form, only "Continue with authentik", and the flow lands on a signed-in session), so the local username/password path was retired: `ENABLE_LOGIN_FORM=false` + `ENABLE_PASSWORD_AUTH=false` in the quadlet and `ui.enable_login_form` set to `false` in the config DB (the DB wins over env, so both were changed together). `qa-e2e-admin` was demoted out of the `authentik Admins` group (it keeps `openwebui_users` / `homepage-admins` for app access). -- **2026-10-07 — picker narrowed to `frank-secondary` only.** Per Frank: the only model accessible in OpenWebUI is `frank-secondary`. Rebuilt the `model` table to a single `frank-secondary` row (the old rows `frank-large`/`frank-primary`/`frank-small` are deleted), set `openai.api_configs` indices 0 (frank-large) and 1 (frank-primary) to `enable: false`, and retargeted index 2's `model_ids` from the stale `frank-small` label to `frank-secondary` — llama.cpp serves by alias, so the old label addressed a model name the server does not know. Pre-change snapshot: `/home/dank/Containers/open-webui/data/webui.db.bak-20261007` (+ `-wal`/`-shm`). Verified: `/api/v1/models/list` returns exactly `["frank-secondary"]`, chat completion answers `pong` (needs `max_tokens≥1500` — the Qwen3.5 thinking block consumes a 200-token budget), and anonymous API probes are all 401 (see [API access](#api-access-auth-gated)). +- **2026-10-07 — picker narrowed to `frank-zealot` only.** Per Frank: the only model accessible in OpenWebUI is `frank-zealot`. Rebuilt the `model` table to a single `frank-zealot` row (the old rows `frank-dragoon`/`frank-archon`/`frank-small` are deleted), set `openai.api_configs` indices 0 (frank-dragoon) and 1 (frank-archon) to `enable: false`, and retargeted index 2's `model_ids` from the stale `frank-small` label to `frank-zealot` — llama.cpp serves by alias, so the old label addressed a model name the server does not know. Pre-change snapshot: `/home/dank/Containers/open-webui/data/webui.db.bak-20261007` (+ `-wal`/`-shm`). Verified: `/api/v1/models/list` returns exactly `["frank-zealot"]`, chat completion answers `pong` (needs `max_tokens≥1500` — the Qwen3.5 thinking block consumes a 200-token budget), and anonymous API probes are all 401 (see [API access](#api-access-auth-gated)). - **2026-10-09 — re-keyed to the Protoss ids (wire rename).** The endpoints began serving `frank-zealot` / `frank-dragoon` / `frank-archon`, so three id-keyed objects had to move in the same window as the alias flip: - `model.id`+`name` (`frank-secondary` → `frank-zealot`, `params` + `model.id`+`name` (`frank-zealot` → `frank-zealot`, `params` `{"context":{"length":200704}}` and the `meta.description` kept), `access_grant` (`resource_type='model'`, `resource_id`, principal `user`/`*`, permission `read`), and `openai.api_configs` per-backend diff --git a/serverAppConfigs-docs/Dankclaw/Swap Configuration.md b/serverAppConfigs-docs/Dankclaw/Swap Configuration.md index c542859..e593e57 100644 --- a/serverAppConfigs-docs/Dankclaw/Swap Configuration.md +++ b/serverAppConfigs-docs/Dankclaw/Swap Configuration.md @@ -33,10 +33,10 @@ it is not invisible. ## Why 64 GiB -Dankclaw is shared. `frank-large` alone holds **103.5 GiB of the 121.2 GiB** +Dankclaw is shared. `frank-dragoon` alone holds **103.5 GiB of the 121.2 GiB** host (`68.0 weights + 14.4 KV pool + 21.1 working`), leaving roughly **7.1 GiB** for 28 co-tenant containers whose working set is ~4.3 GiB. The -engine itself warns that when that runs out, frank-large and its neighbours +engine itself warns that when that runs out, frank-dragoon and its neighbours "can stall for minutes at a time at full CPU with no disk activity and no output". Swap is the valve that turns an OOM kill into slow paging. @@ -96,20 +96,20 @@ Then confirm the inference service is unaffected — a completion, not just ```bash curl -s http://127.0.0.1:7770/v1/chat/completions \ -H 'Content-Type: application/json' \ - -d '{"model":"frank-large","messages":[{"role":"user","content":"Reply with exactly: SWAP64-OK"}],"max_tokens":48,"reasoning_effort":"low"}' + -d '{"model":"frank-dragoon","messages":[{"role":"user","content":"Reply with exactly: SWAP64-OK"}],"max_tokens":48,"reasoning_effort":"low"}' ``` As run 2026-09-12: `finish_reason: stop`, `SWAP64-OK`, 28 containers up, -frank-large `health=200` throughout. +frank-dragoon `health=200` throughout. ## Caveats -- **Swap cannot help the pinned weights.** frank-large's ~68 GiB of weights are +- **Swap cannot help the pinned weights.** frank-dragoon's ~68 GiB of weights are held deliberately; paging them is a stall, not a relief. More swap does not make the doubled KV pool affordable — see the reserve/pool ceiling in [[halogen-flash-server]]. - **`vm.swappiness=60` is untested against this workload.** Under real - pressure the kernel will happily page anonymous memory, and frank-large's KV + pressure the kernel will happily page anonymous memory, and frank-dragoon's KV pool and working set *are* anonymous. Swapping the KV pool would be far worse than the OOM kill it prevents. If the box ever starts thrashing, lowering swappiness (or capping the engine's cgroup) is the knob, not more swap. diff --git a/serverAppConfigs-docs/Infrastructure/Homepage.md b/serverAppConfigs-docs/Infrastructure/Homepage.md index 6756f2f..e12aea2 100644 --- a/serverAppConfigs-docs/Infrastructure/Homepage.md +++ b/serverAppConfigs-docs/Infrastructure/Homepage.md @@ -22,8 +22,8 @@ The homepage is live on Dankclaw. `./scripts/deploy.sh dankclaw` copies the stat **Docs page shipped (2026-09-17):** `/docs` serves a static user documentation page (`shared/homepage/docs.html`) — access walkthrough, the running-model guide, media how-tos, and troubleshooting. Per-service `/docs//` pages -remain a separate thread. The three LLM cards (`frank-large`, `frank-medium`, -`frank-secondary`) moved from admin-only to the **user** page with live model +remain a separate thread. The three LLM cards (`frank-dragoon`, `frank-medium`, +`frank-zealot`) moved from admin-only to the **user** page with live model descriptions and a `docs` link to `/docs#models`. **Sections + WIP split (2026-09-21):** both pages now group their panels @@ -48,23 +48,23 @@ exact bug bit the screenshots on 2026-10-08). The docs page gained a full (`/docs#api-access`): per-user OpenWebUI API keys (User menu → Settings → Account → API keys), the base URL `https://ai.franksdank.cloud/api/v1`, and copy-paste configs for **Opencode** (`~/.config/opencode/opencode.json`) and -**Pi** (`~/.pi/agent/models.json`) pointing at `frank-secondary`. Shipped +**Pi** (`~/.pi/agent/models.json`) pointing at `frank-zealot`. Shipped together with the OpenWebUI side: `features.api_keys=true` for regular users -and the restored `frank-secondary` model row + public `read` access grant +and the restored `frank-zealot` model row + public `read` access grant without which the picker showed "No results found" for every family account (see [[OpenWebUI]]). **Capability equivalence notes (2026-10-08):** each fleet card (and the -`/docs#models` section) carries a `details.equiv` line — frank-large +`/docs#models` section) carries a `details.equiv` line — frank-dragoon "equivalent to Claude Sonnet 5 / OpenAI-Luna (Summer 2026 frontier -intelligence)", frank-primary "equivalent to Claude Opus 4.8 / OpenAI-Terra -(same era)", frank-secondary "equivalent to last year's frontier level +intelligence)", frank-archon "equivalent to Claude Opus 4.8 / OpenAI-Terra +(same era)", frank-zealot "equivalent to last year's frontier level (2025)". Rendered by `descHTML()` as `.desc-equiv` (head color, italic); pinned in `homepage_config.bats`. **Protoss rename + Model Information component (2026-10-08):** the model -cards became the StarCraft trio — `frank-large` → **frank-dragoon** -(iGPU), `frank-primary` → **frank-archon** (Dankserver), `frank-secondary` +cards became the StarCraft trio — `frank-dragoon` → **frank-dragoon** +(iGPU), `frank-archon` → **frank-archon** (Dankserver), `frank-zealot` → **frank-zealot** (3090). The endpoint/API ids did NOT change in this wave; only the family-facing names. The three cards fused into one **Model Information** component (`app.js` `renderModelInfo()`, `.model-info`/`.mi-*` styles): @@ -201,8 +201,8 @@ the pixels. **Model ids official (2026-10-08):** the card ids `frank-zealot`, `frank-dragoon`, `frank-archon` are now the harness's official model ids in `models.yml`/`config.yml` (see [[OMP Harness]]); the -systemd services keep the `frank-primary`/`frank-large`/ -`frank-secondary` names. Homepage, docs page and harness now agree on +systemd services keep the `frank-archon`/`frank-dragoon`/ +`frank-zealot` names. Homepage, docs page and harness now agree on one name per model. **Api ids renamed on the wire (2026-10-09):** the promise in @@ -316,7 +316,7 @@ flowchart TD ## Service classification **User services** (root page), in section order: -- **AI** — OpenWebUI, and the three LLM fleet cards (frank-large, frank-primary, frank-secondary — status + docs link, no Open link). +- **AI** — OpenWebUI, and the three LLM fleet cards (frank-dragoon, frank-archon, frank-zealot — status + docs link, no Open link). - **Web Apps** — SearXNG, Gitea, Copyparty, Marreta. - **Media Library Apps** — Calibre-Web, RomM, Plex, Jellyfin, Seerr. diff --git a/serverAppConfigs-docs/Infrastructure/Prometheus.md b/serverAppConfigs-docs/Infrastructure/Prometheus.md index 5644cf9..b8e73b7 100644 --- a/serverAppConfigs-docs/Infrastructure/Prometheus.md +++ b/serverAppConfigs-docs/Infrastructure/Prometheus.md @@ -38,7 +38,7 @@ Authentik; post-auth the Caddy vhost routes straight to `prometheus:9090`) — | `node-dankserver` | `192.168.0.235:9100` | host metrics from [[Node-Exporter]] — a different machine, so the LAN address works | | `grafana`, `loki` | `grafana:3000`, `loki:3100` | container names on the `dankclaw_default` network; both serve real `/metrics` | | `frank-medium` | `192.168.0.235:7770` | the LLM fleet — `vllm:` series; a different machine, so the LAN address works | -| `frank-large`, `frank-secondary` | `host.containers.internal:7770`, `:7771` | the LLM fleet — `llamacpp:` series; same-host net=host binds, so via the gateway | +| `frank-dragoon`, `frank-zealot` | `host.containers.internal:7770`, `:7771` | the LLM fleet — `llamacpp:` series; same-host net=host binds, so via the gateway | **Three jobs read down, and they are not outages** (audited 2026-09-16): diff --git a/serverAppConfigs-docs/LLM/DFlash DSpark Speculative Decoding.md b/serverAppConfigs-docs/LLM/DFlash DSpark Speculative Decoding.md index 35e9460..0363c59 100644 --- a/serverAppConfigs-docs/LLM/DFlash DSpark Speculative Decoding.md +++ b/serverAppConfigs-docs/LLM/DFlash DSpark Speculative Decoding.md @@ -115,7 +115,7 @@ unconditionally, while **context-backed** types (`draft-mtp`, `draft-dflash`, - Internal order is fixed (ngram types first, then drafters); CLI order is irrelevant. - **A legal chain can still lose on a recurrent model.** `draft-mtp,ngram-mod` - on the qwen35 hybrid (frank-large era) measured −15 % prose / −7 % + on the qwen35 hybrid (frank-dragoon era) measured −15 % prose / −7 % block-copy (2026-10-03): adding the ngram layer logs `recurrent state rollback is not compatible with 'ngram-mod' - disabling rollback support`, and MTP verification depends on that rollback, so acceptance drops on ALL @@ -215,9 +215,9 @@ The DFlash draft is not a standalone model. It must pair with its target model. ## Deployment on Dankserver (NVIDIA RTX 3090) -The Dankserver llama.cpp deployment (`frank-secondary`, Qwen3.6-35B-A3B) is **active** on Dankserver (port 7770) as of the 2026-08-17 redo (the earlier 2026-08-16/17 retirement of this service was reversed when the PP split was retired). The vLLM material below documents the archived AWQ/DFlash path on the same hardware. +The Dankserver llama.cpp deployment (`frank-zealot`, Qwen3.6-35B-A3B) is **active** on Dankserver (port 7770) as of the 2026-08-17 redo (the earlier 2026-08-16/17 retirement of this service was reversed when the PP split was retired). The vLLM material below documents the archived AWQ/DFlash path on the same hardware. -> **DFlash retired from active service.** `DFlash` (draft-dflash) was tested initially but did not deliver the desired speed gains under the `frank-secondary` workload (see ngram-mod benchmarks below). The `Alittlehammmer/Qwen3.6-35B-A3B-DFlash` draft GGUF remains in `/home/dank/models/` as reference material only. +> **DFlash retired from active service.** `DFlash` (draft-dflash) was tested initially but did not deliver the desired speed gains under the `frank-zealot` workload (see ngram-mod benchmarks below). The `Alittlehammmer/Qwen3.6-35B-A3B-DFlash` draft GGUF remains in `/home/dank/models/` as reference material only. The vLLM material below documents the archived AWQ/DFlash path on the same hardware. The RTX 3090 is Ampere (compute capability 8.6). Use these conditions: @@ -250,7 +250,7 @@ docker run --rm --name vllm-qwen36-dflash \ ## Deployment on Dankclaw (AMD Strix Halo gfx1151) -`frank-large` on Dankclaw ran the llama.cpp pipeline-parallel head (Qwen3.8-27B-Uncensored Q6_K) on port 7770, RPC-split with the Dankserver worker. Spec was the standalone MTP draft over the ngram-mod fallback, 1 slot at 262144 ctx, q8_0/f16 KV, head GPU side ROCm0. This page is a historical record of that era (mid-August 2026); for the current deployment see [[kingjones-strix-rocmfp4]]. +`frank-dragoon` on Dankclaw ran the llama.cpp pipeline-parallel head (Qwen3.8-27B-Uncensored Q6_K) on port 7770, RPC-split with the Dankserver worker. Spec was the standalone MTP draft over the ngram-mod fallback, 1 slot at 262144 ctx, q8_0/f16 KV, head GPU side ROCm0. This page is a historical record of that era (mid-August 2026); for the current deployment see [[kingjones-strix-rocmfp4]]. History: before `--spec-default`, the box ran DSpark (`draft-dspark`, retired 2026-08-15 after a ROCm illegal-memory-access crash under two concurrent 16k prompts) and before that bundled MTP (`draft-mtp`, retired same day). DFlash was retired on 2026-08-14 (premature-EOS under parallel load). The old DFlash draft GGUF (`Qwen3.6-27B-DFlash-Q8_0.gguf`), the MTP-only drafter (`Qwen3.6-27B-MTP-ONLY-Q8_0.gguf`), and the DSpark draft (`Qwen3.8-27B-DSpark-Q8_0.gguf`) remain in `/home/dank/models/` as reference only. @@ -315,7 +315,7 @@ not switch without re-measuring". The A/B vehicle for ANY single-GPU llama.cpp knob (batch/ubatch, KV type, slot split, quant rung — not just spec flags) is the transient systemd -drop-in procedure in [[frank-large-benchmark]] and [[frank-secondary-benchmark]]. +drop-in procedure in [[frank-dragoon-benchmark]] and [[frank-zealot-benchmark]]. ## Is it worth it? (arithmetic before deployment) @@ -419,4 +419,4 @@ measurement that would settle it. - [[GGUF Compatibility]] — header parsing and custom tensor-type lock-in - [[Llama Cpp Serving Sizing]] — slot-pool and drafter KV sizing arithmetic - [[Llama Cpp Multi-Device Splits]] — where the drafter's KV actually lands -- [[frank-large-benchmark]] and [[frank-secondary-benchmark]] — the single-GPU env drop-in A/B vehicle \ No newline at end of file +- [[frank-dragoon-benchmark]] and [[frank-zealot-benchmark]] — the single-GPU env drop-in A/B vehicle \ No newline at end of file diff --git a/serverAppConfigs-docs/LLM/Dankclaw Improvements.md b/serverAppConfigs-docs/LLM/Dankclaw Improvements.md index dcc74f6..3fe1b34 100644 --- a/serverAppConfigs-docs/LLM/Dankclaw Improvements.md +++ b/serverAppConfigs-docs/LLM/Dankclaw Improvements.md @@ -22,7 +22,7 @@ marked "verify first". Re-verified 2026-08-15/16; corrections marked below. (b10433): Vulkan 25.13 t/s vs ROCm 24.33 t/s decode at 16k; at 262k ctx Vulkan decodes 48% faster (5.68 vs 3.83 t/s). ROCm wins prefill (410 vs 302 t/s @64k). The "HIP out-performs Vulkan for decode" claim did not - hold on the 8060S. See [[frank-large-benchmark]]. + hold on the 8060S. See [[frank-dragoon-benchmark]]. - **Power profile**: the `/sys/class/drm/card0/device/power_profile` file does not exist on this machine (checked 2026-08-15). GPU DPM is already `performance`, forced level `auto`. This item is N/A. @@ -48,7 +48,7 @@ lifted to 114 GiB. ROCm/SMI still reports a 96 GiB VRAM carve-out (VGM) — a different, driver-reported figure that has always been larger than the kernel cap. This split is the Strix Halo GTT/VGM design. It drives the batch/ubatch memory -limits documented in [[frank-large-benchmark]]. +limits documented in [[frank-dragoon-benchmark]]. ## 1. Self-Hosted Agentic Tools @@ -106,7 +106,7 @@ All require root and a reboot for the modprobe change. ## Sources -- [[frank-large-benchmark]] — measured backend/spec numbers +- [[frank-dragoon-benchmark]] — measured backend/spec numbers - [[deployment]] — deploy and update process - AMD ROCm RDNA3.5 system optimization guide (gfx1151 memory/BIOS) - llama.cpp source: `ggml/CMakeLists.txt`, `ggml/src/ggml-hip/CMakeLists.txt`, @@ -115,7 +115,7 @@ All require root and a reboot for the modprobe change. ## See Also -- [[frank-large-benchmark]] +- [[frank-dragoon-benchmark]] - [[DFlash DSpark Speculative Decoding]] - [[deployment]] - [[index]] diff --git a/serverAppConfigs-docs/LLM/Dankclaw System Specs.md b/serverAppConfigs-docs/LLM/Dankclaw System Specs.md index f86013a..9fc075a 100644 --- a/serverAppConfigs-docs/LLM/Dankclaw System Specs.md +++ b/serverAppConfigs-docs/LLM/Dankclaw System Specs.md @@ -46,7 +46,7 @@ Dankclaw is an AMD APU server for CIRU ROCmFPX llama.cpp inference. The host run | Runtime | FastFlowLM 0.9.45 + XRT (installed 2026-08-16; **retired 2026-09-11** with the `amd_iommu=off` decision) | | Status | Not in service. Research only. See [[FastFlowLM NPU Inference]] | -The NPU is retired (2026-09-11). The `frank-secondary` name now serves Gemma4-12B QAT on the RTX 3090 via llama.cpp (see [[frank-secondary-gemma4-12b]]). +The NPU is retired (2026-09-11). The `frank-zealot` name now serves Gemma4-12B QAT on the RTX 3090 via llama.cpp (see [[frank-zealot-gemma4-12b]]). ### ROCm @@ -101,7 +101,7 @@ cable between claw and server is required for 10G. - Unified memory eliminates separate VRAM limits. The GPU uses system RAM. - The GPU budget is the GTT aperture: ~114 GiB (`gtt_total` in `/sys/class/drm/card1/device/`; `llama-server --list-devices` reports 116,732 MiB). rocm-smi's smaller SVM/dedicated carve-out is **not** the budget — the 2026-08 "64 GiB rocm-smi" lesson is stale. Do not use `free` or `dmidecode` for the GPU budget. -- The active service is `frank-large` on port 7770: **gufo** (gufo-org/gufo) v0.1.1, the Strix Halo inference engine, built from source at `/home/dank/GitPackages/gufo-v0.1.1/`, serving unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL (27B dense, DFlash2 drafter). See [[frank-large-gufo-qwen38-27b]]. +- The active service is `frank-dragoon` on port 7770: **gufo** (gufo-org/gufo) v0.1.1, the Strix Halo inference engine, built from source at `/home/dank/GitPackages/gufo-v0.1.1/`, serving unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL (27B dense, DFlash2 drafter). See [[frank-dragoon-gufo-qwen38-27b]]. - The active runtime **links against the host ROCm** (`/opt/rocm` → `/etc/alternatives/rocm` → 7.2.4) through its RPATH, so it needs the host HIP stack rather than a bundled one — the opposite of the retired llama.cpp prebuilt, which carried its own. Building it needs the ROCm dev packages that are installed, and two workarounds recorded in the runbook (drop `librocwmma-dev`; pin `--gcc-install-dir` to GCC 15). The retired CIRU venv's TheRock 7.15 SDK (`LD_LIBRARY_PATH`) is not in the serving path. - The retired vLLM venvs (`/home/dank/vllm-venv`, `/home/dank/vllm-vk-venv`) were moved to `/home/dank/.AGENTTRASH/` on 2026-08-18. - 1.1 TB free disk space is ample for model storage. diff --git a/serverAppConfigs-docs/LLM/Dankserver System Specs.md b/serverAppConfigs-docs/LLM/Dankserver System Specs.md index a342371..35fe70a 100644 --- a/serverAppConfigs-docs/LLM/Dankserver System Specs.md +++ b/serverAppConfigs-docs/LLM/Dankserver System Specs.md @@ -17,7 +17,7 @@ timestamp: 2026-09-20 Dankserver is a media/library server and the `frank-medium` LLM host. The host runs Ubuntu 26.04 (Resolute Raccoon). The RTX 3090 that served the -FreeToken/CUDA `frank-secondary` era was removed on 2026-09-15 and replaced with +FreeToken/CUDA `frank-zealot` era was removed on 2026-09-15 and replaced with two AMD Radeon AI PRO R9700 cards. ## Hardware Specifications @@ -107,8 +107,8 @@ hijack `libhsa-runtime64` were purged on 2026-09-15 — see The active inference service is `frank-medium.service`: mainline llama-server on port 7770, layer-split 32:33 across both R9700s with the DFlash2 drafter pinned to ROCm1. See [[frank-medium-llamacpp-dflash2]]. The former -`frank-secondary.service` (FreeToken/CUDA) was retired with the 2026-09-15 GPU swap; -its unit is archived in `~/.AGENTTRASH/20260915-frank-secondary-retire/host-units/`, +`frank-zealot.service` (FreeToken/CUDA) was retired with the 2026-09-15 GPU swap; +its unit is archived in `~/.AGENTTRASH/20260915-frank-zealot-retire/host-units/`, and the vllm-radiance replica trio in `~/.AGENTTRASH/20260916-vllm-radiance-retire/`. See [[deployment]]. diff --git a/serverAppConfigs-docs/LLM/FastFlowLM NPU Inference.md b/serverAppConfigs-docs/LLM/FastFlowLM NPU Inference.md index 28a3ed2..e504e75 100644 --- a/serverAppConfigs-docs/LLM/FastFlowLM NPU Inference.md +++ b/serverAppConfigs-docs/LLM/FastFlowLM NPU Inference.md @@ -13,12 +13,12 @@ timestamp: 2026-09-03 > **SUPERSEDED 2026-08-17.** The Frank redo retired this topology. > See [[frank-redo-2026-08-17]] and [[deployment]] for the active configuration. -> The `frank-secondary` name and port 52625 then belonged to the vLLM +> The `frank-zealot` name and port 52625 then belonged to the vLLM > service on Dankclaw (nameistoken Quark W8A8); this page is archive. # FastFlowLM NPU Inference -FastFlowLM (FLM) runs LLMs entirely on the AMD Ryzen AI NPU. It targets XDNA2 chips: Strix, Strix Halo, Kraken, and Gorgon Point. The project describes itself as "Ollama, but deeply optimized for NPUs." As of 2026-08-16, FLM is installed on Dankclaw, the NPU validates, and `frank-secondary` (port 52625) serves in production. See Promotion. +FastFlowLM (FLM) runs LLMs entirely on the AMD Ryzen AI NPU. It targets XDNA2 chips: Strix, Strix Halo, Kraken, and Gorgon Point. The project describes itself as "Ollama, but deeply optimized for NPUs." As of 2026-08-16, FLM is installed on Dankclaw, the NPU validates, and `frank-zealot` (port 52625) serves in production. See Promotion. ## Verdict (2026-08-16) @@ -167,7 +167,7 @@ Proposed role: a small, always-on, low-power endpoint for triage, summarization, - `gpt-oss:20b` pulled (4/4 files verified, 13.8 GB `model.q4nx` + tokenizer) into `~/.config/flm/models/GPT-OSS-20B-NPU2/`. - `qwythos:9b` (Huihui-Qwythos-9B-Claude-Mythos-5-1M-abliterated-NPU2) installed 2026-08-17 via `flm-add.py` (downloaded from the HF repo; stdlib-only, no pip needed). Tag registered in the user registry `~/.config/flm/model_list.json` (a copy of the v1.0.1 system registry + the custom entry); kernels symlinked `~/.config/flm/xclbins/Huihui-...-NPU2 -> /opt/fastflowlm/share/flm/xclbins/Qwen3.5-9B-NPU2`. The service env exports `FLM_CONFIG_PATH` and `FLM_XCLBIN_PATH` so the tag resolves (without them flm hits the unknown-tag fallback, see the incident below). - `flm serve gpt-oss:20b --host 0.0.0.0 -p 52625 --pmode performance` runs as a nohup process. It is not a systemd unit. It does not survive a reboot. -- The `llama-server` (frank-large, the PP head) holds an fd on `/dev/accel/accel0` from its own startup (device enumeration, not compute). FLM opened the same device concurrently without conflict. Verified live 2026-08-16. +- The `llama-server` (frank-dragoon, the PP head) holds an fd on `/dev/accel/accel0` from its own startup (device enumeration, not compute). FLM opened the same device concurrently without conflict. Verified live 2026-08-16. ## Measured Results (2026-08-16, gpt-oss-20b on the Dankclaw NPU) @@ -185,7 +185,7 @@ Long-context prefill is not yet measured (runs 1-3 used under 200 prompt tokens) ## Model Bakeoff (measured 2026-08-16, 4 models) -All runs on the Dankclaw NPU (50 TOPS Strix Halo), single stream, `--pmode performance`, PP head (frank-large) serving concurrently on 7770. Decode t/s is the FLM-reported rate. Vision accuracy = ground-truth elements out of 4 (text SPECTRUM, red circle left, blue square right, three green triangles bottom). +All runs on the Dankclaw NPU (50 TOPS Strix Halo), single stream, `--pmode performance`, PP head (frank-dragoon) serving concurrently on 7770. Decode t/s is the FLM-reported rate. Vision accuracy = ground-truth elements out of 4 (text SPECTRUM, red circle left, blue square right, three green triangles bottom). | Model | Tag | Weights | Decode t/s (short) | 8k prefill t/s | 8k decode t/s | Vision decode t/s | Vision accuracy | Max ctx (registry) | |-------|-----|---------|-------------------:|---------------:|--------------:|------------------:|----------------|--------------------| @@ -203,21 +203,21 @@ Notes: ## Promotion (2026-08-16) -`frank-secondary` now runs the NPU endpoint on Dankclaw (was the Dankserver llama.cpp service). Unit: `scripts/frank-secondary.service` (symlinked into `/etc/systemd/system`), wrapper `scripts/serve-flm-small.sh`, tunables `scripts/frank-secondary.env`. `LimitMEMLOCK=infinity` is set in the unit. Default model: `gemma4-it:e4b`. Swap `FLM_MODEL` in the env to switch. +`frank-zealot` now runs the NPU endpoint on Dankclaw (was the Dankserver llama.cpp service). Unit: `scripts/frank-zealot.service` (symlinked into `/etc/systemd/system`), wrapper `scripts/serve-flm-small.sh`, tunables `scripts/frank-zealot.env`. `LimitMEMLOCK=infinity` is set in the unit. Default model: `gemma4-it:e4b`. Swap `FLM_MODEL` in the env to switch. ### Boot policy (2026-08-17) -The `frank-secondary` unit is disabled for boot. Only the PP pair (`frank-large` + `frank-pp-worker`) starts at boot. The unit file was removed from `/etc/systemd/system`; the running FLM service keeps serving until stopped or rebooted. To restore the endpoint, run these commands on Dankclaw: +The `frank-zealot` unit is disabled for boot. Only the PP pair (`frank-dragoon` + `frank-pp-worker`) starts at boot. The unit file was removed from `/etc/systemd/system`; the running FLM service keeps serving until stopped or rebooted. To restore the endpoint, run these commands on Dankclaw: ``` -sudo ln -sf /home/dank/vllmScripts/scripts/frank-secondary.service /etc/systemd/system/frank-secondary.service +sudo ln -sf /home/dank/vllmScripts/scripts/frank-zealot.service /etc/systemd/system/frank-zealot.service sudo systemctl daemon-reload -sudo systemctl enable frank-secondary +sudo systemctl enable frank-zealot ``` Live config (2026-08-16): `FLM_PMODE=turbo`, `FLM_ASR=1` (loads Whisper-V3-Turbo-NPU2; exposes `/v1/audio/transcriptions`), `FLM_CTX_LEN=131072` (verified max — Gemma4 natively supports 128K and the NPU budget fits it; KV occupancy measured at 0.11% for a 123-token exchange, decode 12.0 t/s, 13 GiB headroom). -The PP split was renamed `frank-pp-head` → `frank-large` (2026-08-16, commit `48142f5`). +The PP split was renamed `frank-pp-head` → `frank-dragoon` (2026-08-16, commit `48142f5`). Model swap (2026-08-16, commit `50c55ee`): `FLM_MODEL=qwen3.6-moe:35b-a3b`, `FLM_CTX_LEN=262144` (native max), `FLM_PMODE=turbo`, `FLM_ASR=1` kept. Decode measured 12.5-13.1 t/s. The Gemma4 live config above (131072 ctx) applied to `gemma4-it:e4b`. Swap `FLM_MODEL` and `FLM_CTX_LEN` back to restore it. @@ -353,7 +353,7 @@ installed) against `/opt/fastflowlm/share/flm/xclbins/` (available). Symptom: a client on dankware could not reach `qwen3.6-moe:35b-a3b` on port 52625. The journal shows three separate causes in the 14:19-15:03 window. 1. **EXEC 203 crash loop (14:19-14:20).** The exec bit was lost on `serve-flm-small.sh` on the target. The unit failed `status=203/EXEC: Permission denied` four times, then started after the bit was restored. The git mode is `100755` (commit `3f42210`), and a `git pull` restores the bit. Verify with `git ls-files -s scripts/serve-flm-small.sh`. -2. **Wrong model ID (14:29-14:52).** The client config still used the model ID `frank-secondary` (a service alias). FLM rejects that tag with `[ERROR] Model tag 'frank-secondary' is not supported.` Each such request also triggered the unknown-tag fallback below. +2. **Wrong model ID (14:29-14:52).** The client config still used the model ID `frank-zealot` (a service alias). FLM rejects that tag with `[ERROR] Model tag 'frank-zealot' is not supported.` Each such request also triggered the unknown-tag fallback below. 3. **Swap churn (14:48-15:03).** The swap `gemma4-it:e4b` → `qwen3.6-moe:35b-a3b` restarted the service several times. Each load of the 23 GB model takes about 1.5-2.5 minutes at 262144 ctx. The endpoint does not serve during a load. Fix: the client model ID must be the FLM registry tag `qwen3.6-moe:35b-a3b`. The working pi agent entry in `~/.pi/agent/models.json` is `baseUrl http://192.168.0.143:52625/v1`, `id qwen3.6-moe:35b-a3b`, `contextWindow 262144`, `reasoning true`, `input [text, image]`. Verified end-to-end from dankware (192.168.0.226) at 15:32 on 2026-08-16. @@ -390,7 +390,7 @@ pi sessions failed against this endpoint with `Stream ended without finish_reaso - **The FLM serve process is not under systemd.** A reboot of Dankclaw kills it. The PP head service is enabled and returns. The FLM process must be restarted by hand. A unit file is a natural next step. - **gpt-oss reasoning budget.** The model can spend its full token budget on `reasoning_content` and return empty content. Clients must handle or cap this. - **No llama.cpp GGUF path.** FLM uses its own pre-compiled kernels. Our UD-Q8_K_XL and HauhauCS builds are not importable. NPU work means FLM-specific model tags. -- **NPU production role (2026-08-16).** `frank-secondary` serves `qwen3.6-moe:35b-a3b` on port 52625 (swap churn and the unknown-tag incident are recorded above). The remaining NPU content (benchmarks, runbook steps) is still research until a step lands and is recorded. +- **NPU production role (2026-08-16).** `frank-zealot` serves `qwen3.6-moe:35b-a3b` on port 52625 (swap churn and the unknown-tag incident are recorded above). The remaining NPU content (benchmarks, runbook steps) is still research until a step lands and is recorded. ## Citations diff --git a/serverAppConfigs-docs/LLM/FreeToken Builds.md b/serverAppConfigs-docs/LLM/FreeToken Builds.md index 39f0df5..3120581 100644 --- a/serverAppConfigs-docs/LLM/FreeToken Builds.md +++ b/serverAppConfigs-docs/LLM/FreeToken Builds.md @@ -23,7 +23,7 @@ read the returned content: ```python import json, urllib.request req = urllib.request.Request("http://:/v1/chat/completions", - json.dumps({"model": "frank-secondary", "messages": [{"role": "user", + json.dumps({"model": "frank-zealot", "messages": [{"role": "user", "content": "Hi"}]}).encode(), {"Content-Type": "application/json"}) print(json.load(urllib.request.urlopen(req, timeout=600))) ``` diff --git a/serverAppConfigs-docs/LLM/GGUF Compatibility.md b/serverAppConfigs-docs/LLM/GGUF Compatibility.md index bda69a9..db1e360 100644 --- a/serverAppConfigs-docs/LLM/GGUF Compatibility.md +++ b/serverAppConfigs-docs/LLM/GGUF Compatibility.md @@ -119,5 +119,5 @@ re-download. - [[Llama Cpp Runtimes]] — which fork ships which custom types - [[Llama Cpp Code Diff]] — the enum tables and code-level differences -- [[frank-large-rocmfpx-q8agent-mtp]] — the ftype-115 lock-in in production +- [[frank-dragoon-rocmfpx-q8agent-mtp]] — the ftype-115 lock-in in production - [[Llama Cpp Serving Sizing]] — pricing what a payload costs once it loads diff --git a/serverAppConfigs-docs/LLM/LLM Bench Windows and Measurement.md b/serverAppConfigs-docs/LLM/LLM Bench Windows and Measurement.md index 0e7b768..87385cd 100644 --- a/serverAppConfigs-docs/LLM/LLM Bench Windows and Measurement.md +++ b/serverAppConfigs-docs/LLM/LLM Bench Windows and Measurement.md @@ -13,7 +13,7 @@ Fleet law first: **STOP the production service before any GPU experiment** GPU and corrupts results; an unisolated GPU experiment has precedent for wedging a host until power cycle. Reference harnesses: `scripts/bench-batch-ubatch.sh`, `scripts/autoresearch.sh`, -`scripts/autoresearch/frank-primary-arms.sh`. +`scripts/autoresearch/frank-archon-arms.sh`. ## 1. The window structure (one config per arm, a driver owns the window) @@ -27,7 +27,7 @@ wedging a host until power cycle. Reference harnesses: with `container state improper`. 2. **Boot the arm as the service, not a scratch port** (no scratch ports on LLM hosts — one card, one server). The serve script takes its config via - env-file override (`FRANK_SECONDARY_ENV_FILE`, `FRANK_PRIMARY_AR_ENV_FILE`) + env-file override (`FRANK_ZEALOT_ENV_FILE`, `FRANK_ARCHON_AR_ENV_FILE`) pointing at a staged copy; the checkout is never mutated. 3. **Fast-fail the health wait**: poll `podman ps | grep -qx ` inside the loop — a refused boot dies in one poll instead of 20 min. Capture the @@ -245,17 +245,17 @@ nearly shipped the wrong setting. the comment); verify multi-line command construction with `bash -n` AND a render test. -## 8. Results location and recovery (frank-primary arms) +## 8. Results location and recovery (frank-archon arms) | copy | path | |---|---| | per-arm evidence | `$ARMS_DIR` = `~/.jobs//` (`.rc`, `.done` beside it) | | summary | `$ARMS_DIR/summary.tsv` = `arm rc decode_tps decode_tps_t0.7 kv_tokens boot_s` + `.out/.env/.overlay/.rc/.metrics` | -| server-side last window | `/home/dank/.autoresearch-frank-primary/run.json` | +| server-side last window | `/home/dank/.autoresearch-frank-archon/run.json` | | durable memo | `.../last/run.json` + `last/hash` (promoted only after bench AND verified restore) | | fallback | `~/.omp/agent/sessions///.{shake,bash}.log` (permanent) | -`/tmp/frank-primary-arms-*` and `/tmp/armstub/` are stub self-tests — +`/tmp/frank-archon-arms-*` and `/tmp/armstub/` are stub self-tests — constants 99.9/88.8 identical across arms by construction; **identical numbers across arms == stub or bug, never a measurement.** After compaction, re-harvest with `grep -rhoE 'decode_tps[a-z0-9_.]*=[0-9.]+'` over the session diff --git a/serverAppConfigs-docs/LLM/LLM Performance Diagnosis.md b/serverAppConfigs-docs/LLM/LLM Performance Diagnosis.md index 777c3fe..10aaef4 100644 --- a/serverAppConfigs-docs/LLM/LLM Performance Diagnosis.md +++ b/serverAppConfigs-docs/LLM/LLM Performance Diagnosis.md @@ -161,8 +161,8 @@ of the same RAM, not extra memory. ## 7. IBS model-access attribution (AMD CPUs) Real CPU access patterns for mmap'd weights, live, no stop (established on -frank-primary, 2026-09-26, ~2.7M attributed samples in 75 s). Reference: -`scripts/frank-primary-expert-activity.py` (self-contained dump + sample + +frank-archon, 2026-09-26, ~2.7M attributed samples in 75 s). Reference: +`scripts/frank-archon-expert-activity.py` (self-contained dump + sample + analyze; `--analyze-only`). 1. GGUF header-only scan (ms for a 50 GiB part) → tensor extents. **Extents diff --git a/serverAppConfigs-docs/LLM/Llama Cpp Serving Sizing.md b/serverAppConfigs-docs/LLM/Llama Cpp Serving Sizing.md index 4e41767..8d90433 100644 --- a/serverAppConfigs-docs/LLM/Llama Cpp Serving Sizing.md +++ b/serverAppConfigs-docs/LLM/Llama Cpp Serving Sizing.md @@ -80,7 +80,7 @@ co-tenants. - **Traps:** mmap'd PLE is reclaimable page cache; `-ot` makes it pinned — "move layers to the card" converts reclaimable cache into device memory and frees nothing for co-tenants. A served model's footprint ≠ weight size - (frank-secondary: 22.6 of 24.1 GiB for an 11.29 GiB model). Do the capacity + (frank-zealot: 22.6 of 24.1 GiB for an 11.29 GiB model). Do the capacity subtraction before designing: 12 attn layers × 1.62 GiB + 200k f16 KV = 28.6 GiB > 24.1 GiB usable → KV-in-VRAM on that pair only reaches ~64k. - **Context lengths: derive, never remember.** `llama-bench` computes @@ -157,7 +157,7 @@ in the timings. Context cap for full-model residency on that shape stayed ## Related - [[GGUF Compatibility]] — what a payload is before it is priced -- [[frank-secondary-llama-mimo-q6k-2x200704]] — the current two-boot priced shape +- [[frank-zealot-llama-mimo-q6k-2x200704]] — the current two-boot priced shape - [[frank-medium-llamacpp-dflash2]] — where the 68 KiB/token datum was measured - [[DFlash DSpark Speculative Decoding]] — the spec A/B protocol on llama.cpp - [[Dual-R9700-Cooperation]] / [[x4-pair-experiment]] — the multi-device side diff --git a/serverAppConfigs-docs/LLM/Model Swap and Rollback.md b/serverAppConfigs-docs/LLM/Model Swap and Rollback.md index bc4551a..9f8b6ca 100644 --- a/serverAppConfigs-docs/LLM/Model Swap and Rollback.md +++ b/serverAppConfigs-docs/LLM/Model Swap and Rollback.md @@ -8,8 +8,8 @@ timestamp: 2026-10-05T00:00:00-07:00 # Model Swap and Rollback -Applies to every endpoint swap on the fleet (frank-secondary / frank-large / -frank-primary). Repo law: all config flows through git; the live models are +Applies to every endpoint swap on the fleet (frank-zealot / frank-dragoon / +frank-archon). Repo law: all config flows through git; the live models are host state under `/home/dank/models//`. ## 1. Fit preflight — never deploy a swap without confirming it FITS diff --git a/serverAppConfigs-docs/LLM/Pipeline Parallelism/Ethernet Bandwidth Math.md b/serverAppConfigs-docs/LLM/Pipeline Parallelism/Ethernet Bandwidth Math.md index 10b54d9..9044dd1 100644 --- a/serverAppConfigs-docs/LLM/Pipeline Parallelism/Ethernet Bandwidth Math.md +++ b/serverAppConfigs-docs/LLM/Pipeline Parallelism/Ethernet Bandwidth Math.md @@ -26,7 +26,7 @@ conclusions. | Blocks | 65 (45 on worker, 20 on head) | `--tensor-split 0.68,0.32` | | FA layers | 16 total, interval 4 (11 worker / 5 head) | GGUF `full_attention_interval` | | KV per FA layer per token | 3136 B (K q8_0 1088 + V f16 2048) | env file comment, confirmed | -| ubatch | 256 | `UBATCH_SIZE` in `frank-large.env` | +| ubatch | 256 | `UBATCH_SIZE` in `frank-dragoon.env` | | MTP verify step positions | 5 (1 + n_max 4) | `SPEC_DRAFT_N_MAX=4` | | Link (old path) | 1 GbE via USB-C adapter on claw | `enx00e04cc2e1e5`, negotiated 1000 Mb/s | | Link (current path) | 2.5 GbE eno1 to eno1 | negotiated 2500 Mb/s both ends | diff --git a/serverAppConfigs-docs/LLM/Pipeline Parallelism/Qwen3.8 PP Deployment.md b/serverAppConfigs-docs/LLM/Pipeline Parallelism/Qwen3.8 PP Deployment.md index 9b5c508..60c5c74 100644 --- a/serverAppConfigs-docs/LLM/Pipeline Parallelism/Qwen3.8 PP Deployment.md +++ b/serverAppConfigs-docs/LLM/Pipeline Parallelism/Qwen3.8 PP Deployment.md @@ -20,7 +20,7 @@ morning-of runbook. Research background: ## Production state (2026-08-17: Q6_K, q8_0/f16 KV, split 0.68) -This split is the production `frank-large` service. Current +This split is the production `frank-dragoon` service. Current state, verified against the live journal and output smoke tests (2026-08-17, load 02:06): @@ -41,17 +41,17 @@ state, verified against the live journal and output smoke tests Vulkan). - Worker steady state: 23854/24576 MiB used, ~273 MiB free (tight but stable; all allocations are upfront). -- Unit `frank-large.service`, launched through - `serve-pp-head.sh` + `frank-large.env`. +- Unit `frank-dragoon.service`, launched through + `serve-pp-head.sh` + `frank-dragoon.env`. ## Service enablement (2026-08-17) The PP pair is the only inference service enabled for boot. Both units -(`frank-large` on Dankclaw, `frank-pp-worker` on Dankserver) are -enabled. The NPU unit (`frank-secondary` on Dankclaw) and all retired +(`frank-dragoon` on Dankclaw, `frank-pp-worker` on Dankserver) are +enabled. The NPU unit (`frank-zealot` on Dankclaw) and all retired units are disabled. Restart order: worker first, then head. The Dankserver helper `frank-restart-small.sh` is obsolete (it restarts the removed -`frank-secondary` unit); restart the worker with +`frank-zealot` unit); restart the worker with `sudo systemctl restart frank-pp-worker`. The Dankclaw helper `frank-restart-large.sh` (sync + cache drop + restart) is correct for the head. `deploy.sh dankserver` is broken until retargeted. See @@ -173,9 +173,9 @@ llama-server b10433 ggml-rpc-server b10433 |------|---------|---------| | `scripts/frank-pp-worker.env` | server | worker tunables (bind, port, device, cache) | | `scripts/serve-pp-worker.sh` | server | runs `ggml-rpc-server` from the b10433 worktree build | -| `scripts/frank-large.env` | claw | head tunables (split, ctx, spec, KV, I/O); was `frank-pp-head.env` before the 2026-08-16 rename | +| `scripts/frank-dragoon.env` | claw | head tunables (split, ctx, spec, KV, I/O); was `frank-pp-head.env` before the 2026-08-16 rename | | `scripts/serve-pp-head.sh` | claw | runs `llama-server --rpc ...` (see "Gotchas") | -| `scripts/frank-large.service` / `frank-pp-worker.service` | both | optional systemd units (manual install); the head unit was renamed from `frank-pp-head.service` on 2026-08-16 and is symlinked from the repo into `/etc/systemd/system` | +| `scripts/frank-dragoon.service` / `frank-pp-worker.service` | both | optional systemd units (manual install); the head unit was renamed from `frank-pp-head.service` on 2026-08-16 and is symlinked from the repo into `/etc/systemd/system` | | `scripts/pp-test.sh` | any box with ssh to both | test orchestrator (preflight/start/verify/bench/stop-pp/restore) | | `scripts/pp-bench.py` | claw | API driver; reports server-side `print_timing` | @@ -229,7 +229,7 @@ FRANK_SUDO_PW= ./scripts/pp-test.sh stop-pp FRANK_SUDO_PW= ./scripts/pp-test.sh restore ``` -Config variants: edit `scripts/frank-large.env` on the claw (git commit + +Config variants: edit `scripts/frank-dragoon.env` on the claw (git commit + pull if the bench runs from the repo), then re-run `start` + `bench`: - No spec baseline: `SPEC_NONE=1` diff --git a/serverAppConfigs-docs/LLM/Pipeline Parallelism/index.md b/serverAppConfigs-docs/LLM/Pipeline Parallelism/index.md index 68933fb..72b9991 100644 --- a/serverAppConfigs-docs/LLM/Pipeline Parallelism/index.md +++ b/serverAppConfigs-docs/LLM/Pipeline Parallelism/index.md @@ -65,6 +65,6 @@ graph LR ## See Also - [[DFlash DSpark Speculative Decoding]] -- [[frank-secondary-benchmark]] +- [[frank-zealot-benchmark]] - [[Dankserver System Specs]] - [[Dankclaw System Specs]] diff --git a/serverAppConfigs-docs/LLM/Quantization Production.md b/serverAppConfigs-docs/LLM/Quantization Production.md index d119b38..8bf0b9b 100644 --- a/serverAppConfigs-docs/LLM/Quantization Production.md +++ b/serverAppConfigs-docs/LLM/Quantization Production.md @@ -78,12 +78,12 @@ Laws that steer everything here: variants **[verified (tool existence: heretic; rest survey)]**. - Hardware-agnostic fp-editing. On a MoE the edit touches attention/norm weights, so it composes with any expert quantization. -- Fleet status: frank-large runs an abliterated base **by Frank's choice** +- Fleet status: frank-dragoon runs an abliterated base **by Frank's choice** (AGENTS: censored-base refusals were the accepted trade of the 27B era); frank-archon's ukisai Swift1.5 is an abliterated finetune of Qwen3.8. ### HauhauCS QX_K_P "Perfect" quants -- Our frank-secondary publisher. Method, from the publisher's own cards +- Our frank-zealot publisher. Method, from the publisher's own cards **[verified]**: (1) abliterate + finetune ("Aggressive"/"Balanced"), (2) quantize with **imatrix calibration on the ABLITERATED weights**, (3) K_P = a **per-model, per-tensor mixed-precision profile** — @@ -106,7 +106,7 @@ Laws that steer everything here: ## Per-card playbooks -### RTX 3090 — the unlocked card (frank-secondary runs llama.cpp BY CHOICE) +### RTX 3090 — the unlocked card (frank-zealot runs llama.cpp BY CHOICE) The 3090 is the only fleet device with no format lock: radiance needs `.rad`, halogen needs `.hgn`, and the v2 checkpoint loads in NO other engine. sm_86 + CUDA is the industry's default target, so the runtime @@ -179,7 +179,7 @@ Q8_K_P 40.6 GiB + mmproj 0.84) — Q4_K_P IS the protected-tensor blend. The self-made delta: calibration on OUR corpora, our hot-expert law, and a KLD gate scored at the serving shape. -### R9700 — frank-primary (radiance) +### R9700 — frank-archon (radiance) The full self-quant pipeline already exists end to end: fetch BF16 → record KLD reference (1.0.13) → capture calibration grams (1.2.0 tap, `RADIANCE_CALIB_DIR/TOKENS`) → derive protected experts (energy-share) → @@ -219,7 +219,7 @@ top-8**, moe_intermediate 512, hidden 2048, MTP ×1, 262k ctx, vocab until proven), and does its MTP cast to the fp8/u2 encodings like qwen4exp. The MNBT-2048 disk-tier law is MOOT for a resident model. -### Strix Halo — frank-large (halogen) and friends +### Strix Halo — frank-dragoon (halogen) and friends - `.hgn`: **closed production door.** No public quantizer exists (verified absence across peonist-ai repos); the format's lock is the engine's lock. We consume vendor artifacts; the repo-side tooling is @@ -255,6 +255,6 @@ top-8**, moe_intermediate 512, hidden 2048, MTP ×1, 262k ctx, vocab `scripts/kld-gate-swift15.sh`, `scripts/build-llama-rdna4.sh`, `scripts/build-kairic-edge-gfx1151.sh`, [[agentionai-fast-imatrix]], [[kingjones-strix-rocmfp4]], [[qwen3.8-strix-optimizations]], - [[frank-primary-radiance-swift15-w4dn8]], - [[frank-secondary-llama-qwen35-9b-q6k-2x200704]], - [[frank-large-flash-server-v2-swift15]], [[GGUF Compatibility]]. + [[frank-archon-radiance-swift15-w4dn8]], + [[frank-zealot-llama-qwen35-9b-q6k-2x200704]], + [[frank-dragoon-flash-server-v2-swift15]], [[GGUF Compatibility]]. diff --git a/serverAppConfigs-docs/LLM/RDNA4 Container Serving.md b/serverAppConfigs-docs/LLM/RDNA4 Container Serving.md index 4c06f72..c0f5c93 100644 --- a/serverAppConfigs-docs/LLM/RDNA4 Container Serving.md +++ b/serverAppConfigs-docs/LLM/RDNA4 Container Serving.md @@ -247,4 +247,4 @@ see [[dankserver-qwen38-fp8-expert-offload-tuning]] for why it was rejected); measured campaigns - [[PCIe Link and Atomics]] — why decode is gather-bound and what cannot fix it - [[RDNA4 MoE Expert Offload VRAM Budget]] — arena/plan arithmetic deep-dive -- [[frank-large-benchmark]] and [[frank-secondary-benchmark]] — window discipline on live hosts +- [[frank-dragoon-benchmark]] and [[frank-zealot-benchmark]] — window discipline on live hosts diff --git a/serverAppConfigs-docs/LLM/RDNA4 MoE Expert Offload VRAM Budget.md b/serverAppConfigs-docs/LLM/RDNA4 MoE Expert Offload VRAM Budget.md index 916622c..f52c3b4 100644 --- a/serverAppConfigs-docs/LLM/RDNA4 MoE Expert Offload VRAM Budget.md +++ b/serverAppConfigs-docs/LLM/RDNA4 MoE Expert Offload VRAM Budget.md @@ -8,7 +8,7 @@ timestamp: 2026-10-05T00:00:00-07:00 # RDNA4 MoE Expert Offload VRAM Budget -For VRAM-bound vLLM on the tcclaviger RDNA4 fork (frank-primary: Qwen3.8- +For VRAM-bound vLLM on the tcclaviger RDNA4 fork (frank-archon: Qwen3.8- Flash-Next FP8, TP=2, 2x R9700 at 31.86 GiB each, expert offload to host RAM). Tuning history and the deployed shape live in [[dankserver-qwen38-fp8-expert-offload-tuning]]; boot-failure capture lives in @@ -198,7 +198,7 @@ at graph capture; 6 seqs fp8 → 10.70 GiB ask with 9.18 GiB free (fails) — `17.`): ``` - ssh dankserver 'sudo journalctl CONTAINER_NAME=frank-primary-qwen -b -o cat --no-pager \ + ssh dankserver 'sudo journalctl CONTAINER_NAME=frank-archon-qwen -b -o cat --no-pager \ | grep -aoE "(budget \(total x util\) +[0-9.]+|expert cache space +[0-9.]+ GiB +[0-9,]+ slots|Estimated CUDA graph memory.{0,80}|Graph capturing finished.{0,40}|GPU KV cache size.{0,90})"' ``` @@ -206,7 +206,7 @@ at graph capture; 6 seqs fp8 → 10.70 GiB ask with 9.18 GiB free (fails) — 3. Verify after deploy: plan lines show new budget/graphs/arena; `GPU KV cache size` matches the ask; graph-estimate vs post-capture; `rocm-smi` high-water per card = the real margin; - `systemctl show frank-primary -p NRestarts --value` = 0; a real chat + `systemctl show frank-archon -p NRestarts --value` = 0; a real chat completion from a PEER (health-probe via `192.168.0.235:7770/health`, not `localhost` inside an ssh session on the host — the latter returns `000` and looks like an outage). diff --git a/serverAppConfigs-docs/LLM/Running Qwen3.6 27B FP8 on Dankclaw.md b/serverAppConfigs-docs/LLM/Running Qwen3.6 27B FP8 on Dankclaw.md index f0a4ea6..69baf21 100644 --- a/serverAppConfigs-docs/LLM/Running Qwen3.6 27B FP8 on Dankclaw.md +++ b/serverAppConfigs-docs/LLM/Running Qwen3.6 27B FP8 on Dankclaw.md @@ -55,7 +55,7 @@ The FP8 variant requires approximately 16-17 GB. ThinkingCap-FP8 requires ~29 GB ## Prerequisites -> **Production note:** Dankclaw's primary service now runs vLLM-ROCm with the Ling-3.0-flash CIRU INT4 model (see `scripts/frank-large.service`). This page documents the alternative vLLM FP8 deployment of Qwen3.6-27B. +> **Production note:** Dankclaw's primary service now runs vLLM-ROCm with the Ling-3.0-flash CIRU INT4 model (see `scripts/frank-dragoon.service`). This page documents the alternative vLLM FP8 deployment of Qwen3.6-27B. Install vLLM for ROCm. Version 0.24.0+ is required for Qwen3.6 with speculative decoding: diff --git a/serverAppConfigs-docs/LLM/Running Qwen3.6 35B A3B FP8 on Dankserver.md b/serverAppConfigs-docs/LLM/Running Qwen3.6 35B A3B FP8 on Dankserver.md index 1b3f041..d393e97 100644 --- a/serverAppConfigs-docs/LLM/Running Qwen3.6 35B A3B FP8 on Dankserver.md +++ b/serverAppConfigs-docs/LLM/Running Qwen3.6 35B A3B FP8 on Dankserver.md @@ -122,7 +122,7 @@ export HF_HOME=/mnt/entropy/huggingface ### Active Service Conflict -The retired `frank-secondary` service (llama.cpp) used about 22 GB of the 24 GB VRAM. The current PP worker holds ~23.8 GiB. The `vllm-awq-qwen36` (Podman) and `vllm-qwen36` units are disabled. Before starting any research service, verify that the GPU is free: +The retired `frank-zealot` service (llama.cpp) used about 22 GB of the 24 GB VRAM. The current PP worker holds ~23.8 GiB. The `vllm-awq-qwen36` (Podman) and `vllm-qwen36` units are disabled. Before starting any research service, verify that the GPU is free: ``` nvidia-smi # verify GPU is free diff --git a/serverAppConfigs-docs/LLM/Tcclaviger Fork Ops.md b/serverAppConfigs-docs/LLM/Tcclaviger Fork Ops.md index 47fc48c..1c90045 100644 --- a/serverAppConfigs-docs/LLM/Tcclaviger Fork Ops.md +++ b/serverAppConfigs-docs/LLM/Tcclaviger Fork Ops.md @@ -10,9 +10,9 @@ timestamp: 2026-10-05T00:00:00-07:00 The tcclaviger RDNA4 vLLM fork (`docker.io/tcclaviger/vllm@sha256:da4029666…`, vLLM 0.29.0.dev, GLM-5.3/Qwen-specialised with native MoE quant kernels and a -first-class expert-offload planner) served `frank-primary` at shape G until +first-class expert-offload planner) served `frank-archon` at shape G until the 2026-10-05 FreeToken cutover; it remains the rollback target -(`git tag frank-primary-vllm-shapeG-20261003`). Full plan law and VRAM +(`git tag frank-archon-vllm-shapeG-20261003`). Full plan law and VRAM arithmetic: [[RDNA4 MoE Expert Offload VRAM Budget]]; boot forensics: [[vLLM Boot Forensics and Config Interrogation]]; window discipline: [[LLM Bench Windows and Measurement]]. @@ -213,7 +213,7 @@ through two image tags to bring an overlay up was entirely wasted work. ## Compile-cache persistence (survives `podman rm -f`) Serve scripts that recreate the container discard the writable layer, so -every boot re-pays compile/JIT (frank-primary: `torch.compile took 181.20 s` +every boot re-pays compile/JIT (frank-archon: `torch.compile took 181.20 s` cold, of which 173 s was one graph). 1. **Prove it and locate it:** fresh container vs live @@ -241,7 +241,7 @@ cold, of which 173 s was one graph). ## Plan-line verification checklist (after any fork deploy) ``` -ssh dankserver 'sudo journalctl CONTAINER_NAME=frank-primary-qwen -b -o cat --no-pager \ +ssh dankserver 'sudo journalctl CONTAINER_NAME=frank-archon-qwen -b -o cat --no-pager \ | grep -aoE "(budget \(total x util\) +[0-9.]+|expert cache space +[0-9.]+ GiB +[0-9,]+ slots|Estimated CUDA graph memory.{0,80}|Graph capturing finished.{0,40}|GPU KV cache size.{0,90})"' ``` @@ -250,7 +250,7 @@ these columns to `17.`. Verify: new budget/graphs/arena in the plan; `GPU KV cache size` matches the requested token count; `Estimated CUDA graph memory` vs the capture line (raise `_PER_GRAPH_MB` toward 52 if capture exceeds the charge); `rocm-smi --showmeminfo vram` high-water per card = the -real margin; `systemctl show frank-primary -p NRestarts --value` = 0; +real margin; `systemctl show frank-archon -p NRestarts --value` = 0; `VLLM_CUDAGRAPH_*` present in `podman exec … env`; then a real chat completion from a PEER — `curl localhost:7770/health` inside an ssh session on the host can return `000` and looks like an outage that isn't. diff --git a/serverAppConfigs-docs/LLM/VLLM Overview.md b/serverAppConfigs-docs/LLM/VLLM Overview.md index ae0e27c..ae0ae2a 100644 --- a/serverAppConfigs-docs/LLM/VLLM Overview.md +++ b/serverAppConfigs-docs/LLM/VLLM Overview.md @@ -244,7 +244,7 @@ vLLM supports multiple parallelism strategies: already uses them.** The tcclaviger fork is a vLLM fork, so the standard scheduler flags are present in the shipped image (verified by reading the `vllm.engine.arg_utils` and `vllm.config.scheduler` source in the live -container `frank-primary-qwen`, not from a stub): +container `frank-archon-qwen`, not from a stub): | Flag | Default | What it controls | |---|---|---| @@ -268,14 +268,14 @@ ad hoc qwen-fp8 container (the same fork, same payload, same TP=2): **There is no `--ubatch-size` equivalent in vLLM.** `--ubatch-size` is a llama.cpp compute-buffer concept (`--batch-size`/`--ubatch-size`); the tcclaviger -fork has no ubatch knob at all. The llama.cpp compute-buffer pair that frank-secondary +fork has no ubatch knob at all. The llama.cpp compute-buffer pair that frank-zealot was doubled on (2026-10-05, +4.6 % prefill at 8,928 tokens for 616 MiB) has no counterpart here, and the two backends should not be reasoned about by analogy. **MNBT is not a lever on this shape either.** The deployed 2048 is the fork's default, so a change is a deliberate departure from the shipped value, not a tune. The one thing MNBT does cost: every change re-enters the compile RANGE -path, so `FRANK_PRIMARY_CACHE_DIR` pays one recompilation. +path, so `FRANK_ARCHON_CACHE_DIR` pays one recompilation. ## See Also diff --git a/serverAppConfigs-docs/LLM/agentionai-fast-imatrix.md b/serverAppConfigs-docs/LLM/agentionai-fast-imatrix.md index 95f5434..1f1dbc5 100644 --- a/serverAppConfigs-docs/LLM/agentionai-fast-imatrix.md +++ b/serverAppConfigs-docs/LLM/agentionai-fast-imatrix.md @@ -1,7 +1,7 @@ --- type: reference title: agentionai Qwen3.8-Flash-Next ROCmFP4-FAST imatrix on Dankclaw -description: agentionai/Qwen3.8-Flash-Next-ROCmFP4-FAST-imatrix-GGUF served by the charlie12345/ROCmFPX llama.cpp runtime (build-qwen38). 87.06 GiB Q4_0_ROCMFP4_FAST imatrix (v2 joined PLE layout), own MTP draft head (ROCmFP4-FAST, 2.28 GiB). frank-large. +description: agentionai/Qwen3.8-Flash-Next-ROCmFP4-FAST-imatrix-GGUF served by the charlie12345/ROCmFPX llama.cpp runtime (build-qwen38). 87.06 GiB Q4_0_ROCMFP4_FAST imatrix (v2 joined PLE layout), own MTP draft head (ROCmFP4-FAST, 2.28 GiB). frank-dragoon. tags: - llama.cpp - rocm @@ -26,7 +26,7 @@ timestamp: 2026-08-29 > `--flash-attn on` work on the charlie build-qwen38 tree — all still > true for that binary + model pair, which remains the rollback target. -`frank-large` (port 7770) served +`frank-dragoon` (port 7770) served `agentionai/Qwen3.8-Flash-Next-ROCmFP4-FAST-imatrix-GGUF` (main, `Qwen3.8-Flash-Next-ROCmFP4-FAST-imatrix-v2.gguf`, the `v2/` joined layout) with the author's own MTP draft head @@ -166,8 +166,8 @@ best: 32.4 t/s, 0.612 acceptance; adaptive p-split measured worse). ## Config files -- Env: `scripts/frank-large.env` -- Serve: `scripts/serve-frank-large.sh` +- Env: `scripts/frank-dragoon.env` +- Serve: `scripts/serve-frank-dragoon.sh` - Chat template: `scripts/chat-template.jinja` (unchanged, Qwen-Sharp) - Fork patch: `scripts/patches/qwen4exp-qsa-f32-mask.patch` (re-apply after any clean fork rebuild — see Serving profile) @@ -175,10 +175,10 @@ best: 32.4 t/s, 0.612 acceptance; adaptive p-split measured worse). ## Swap procedure ```bash -sudo systemctl stop frank-large -# edit scripts/frank-large.env + scripts/serve-frank-large.sh, commit, push -# on Dankclaw: git pull --ff-only && scripts/deploy.sh dankclaw --service frank-large -sudo systemctl start frank-large # or via deploy.sh +sudo systemctl stop frank-dragoon +# edit scripts/frank-dragoon.env + scripts/serve-frank-dragoon.sh, commit, push +# on Dankclaw: git pull --ff-only && scripts/deploy.sh dankclaw --service frank-dragoon +sudo systemctl start frank-dragoon # or via deploy.sh curl http://192.168.0.143:7770/health ``` diff --git a/serverAppConfigs-docs/LLM/ciru-activefpx-promptforge.md b/serverAppConfigs-docs/LLM/ciru-activefpx-promptforge.md index 9e0b165..4b96d4c 100644 --- a/serverAppConfigs-docs/LLM/ciru-activefpx-promptforge.md +++ b/serverAppConfigs-docs/LLM/ciru-activefpx-promptforge.md @@ -1,7 +1,7 @@ --- type: reference title: CIRU ActiveFPX PromptForge on Dankclaw -description: jcbtc/Qwen3.8-27B-CIRU-ActiveFPX-PromptForge (v3) served by the CIRU ROCmFPX llama.cpp runtime on the Strix Halo iGPU. Install runbook, ROCm 7.15 toolchain, and the frank-large service. +description: jcbtc/Qwen3.8-27B-CIRU-ActiveFPX-PromptForge (v3) served by the CIRU ROCmFPX llama.cpp runtime on the Strix Halo iGPU. Install runbook, ROCm 7.15 toolchain, and the frank-dragoon service. tags: - llama.cpp - rocm @@ -14,13 +14,13 @@ timestamp: 2026-08-22 # CIRU ActiveFPX PromptForge on Dankclaw -> **RETIRED 2026-08-24.** `frank-large` served this v3 model from +> **RETIRED 2026-08-24.** `frank-dragoon` served this v3 model from > 2026-08-22 (restored after a same-day Kairic Edge IU4 experiment was > reverted — operator decision, commit `c60156f`; see [[kairic-edge]]) > until [[eemin-rocmi4-mtp]] took over on 2026-08-24. Kept as the > historical record of the v3 deployment. -`frank-large` (port 7770, moved from 52625 on 2026-08-22) serves +`frank-dragoon` (port 7770, moved from 52625 on 2026-08-22) serves `jcbtc/Qwen3.8-27B-CIRU-ActiveFPX-PromptForge` **v3** through the CIRU ROCmFPX llama.cpp runtime. This replaced the retired vLLM service that previously occupied the slot. The v2 deployment moved to v3 on 2026-08-21. @@ -136,7 +136,7 @@ graph TD C --> D[Build llama-server] D --> E[Verify --list-devices shows gfx1151] E --> F[Download v3 GGUF + FFN/GDN/Output-K8 + mmproj] - F --> G[Deploy frank-large] + F --> G[Deploy frank-dragoon] G --> H[Health check + chat completion] ``` @@ -151,8 +151,8 @@ against the model card before the service restart. ## Service -- Unit: `frank-large.service`, port 7770 -- Script: `scripts/serve-frank-large.sh`, env `scripts/frank-large.env` +- Unit: `frank-dragoon.service`, port 7770 +- Script: `scripts/serve-frank-dragoon.sh`, env `scripts/frank-dragoon.env` - The script exports the ROCm 7.15 SDK libraries in `LD_LIBRARY_PATH` before the system ROCm. `ROCM_PATH` points at the devel SDK. diff --git a/serverAppConfigs-docs/LLM/dankclaw-iommu-translation-off.md b/serverAppConfigs-docs/LLM/dankclaw-iommu-translation-off.md index 4955502..2af7580 100644 --- a/serverAppConfigs-docs/LLM/dankclaw-iommu-translation-off.md +++ b/serverAppConfigs-docs/LLM/dankclaw-iommu-translation-off.md @@ -1,14 +1,14 @@ --- type: research title: Dankclaw IOMMU translation off (amd_iommu=off) — decision record -description: Why Dankclaw boots with amd_iommu=off since 2026-09-11, what it buys (13-16% prefill for frank-large), what it costs (the XDNA2 NPU endpoint, machine-wide DMA translation), what was deliberately not copied from the reference machine, and how to revert. +description: Why Dankclaw boots with amd_iommu=off since 2026-09-11, what it buys (13-16% prefill for frank-dragoon), what it costs (the XDNA2 NPU endpoint, machine-wide DMA translation), what was deliberately not copied from the reference machine, and how to revert. tags: - dankclaw - iommu - kernel - grub - prefill - - frank-large + - frank-dragoon - halogen - frank-npu timestamp: 2026-09-11 @@ -54,7 +54,7 @@ takes the NPU with it. 1. **The NPU endpoint dies.** With IOMMU off there is no PASID/SVA state and `/dev/accel/accel0` cannot be opened — `err=-19`, the exact failure documented in [[frank-npu]]. Audio input left the fleet with it; image input - survives on `frank-large` through halogen's vision tower. + survives on `frank-dragoon` through halogen's vision tower. 2. **Posture change machine-wide.** Dankclaw also serves Caddy (the TLS edge and the Anubis/Authentik guard chain), Authentik, Pi-hole, Gitea, and the observability stack. DMA translation is now off for all of them. This was @@ -80,7 +80,7 @@ so only that one was taken: cat /proc/cmdline # expect amd_iommu=off, no iommu=pt ls /sys/kernel/iommu_groups/ | wc -l # expect 0 groups (was 30) systemctl is-active frank-npu # expect inactive (masked) -curl -s http://127.0.0.1:7770/health # frank-large must still answer 200 +curl -s http://127.0.0.1:7770/health # frank-dragoon must still answer 200 ``` **To revert:** put `iommu=pt` back in `GRUB_CMDLINE_LINUX_DEFAULT` in place of diff --git a/serverAppConfigs-docs/LLM/dankserver-frontier-moe-feasibility.md b/serverAppConfigs-docs/LLM/dankserver-frontier-moe-feasibility.md index 12fe489..1e50098 100644 --- a/serverAppConfigs-docs/LLM/dankserver-frontier-moe-feasibility.md +++ b/serverAppConfigs-docs/LLM/dankserver-frontier-moe-feasibility.md @@ -168,7 +168,7 @@ Not advisable. | **Affinity** | yes, built here | **V4-Flash only** — "the geometry is compiled in; there is no architecture abstraction" | 110 tok/s for 284B. Best engine for this box by an order of magnitude, wrong model | | **tcclaviger vLLM fork** | **yes — proven 2026-09-29** | qwen4exp measured 37.4-40.6 tok/s decode (see [[dankserver-qwen38-fp8-expert-offload-tuning]]); **`glm5next` registered** (`Glm5NextForCausalLM`/`MTP`, backend-split `amd/`/`common/`/`nvidia/`, `sparse_indexer.py` for DSA); r4d.so has **native mxfp4 + dsfp4 MoE entries** (`has_dsfp4() == True`); W4A16 MoE class (`R4dW4a16MoEExperts`) wired into the same tiered offload; TunableOp silently skipped under offload (needs `CLAV_TUNABLEOP_WITH_OFFLOAD=1`, and then corrupts numerics — do not use) | the ad hoc qwen-fp8 container's runtime; **the old "MXFP4 = emulation/missing kernels" verdict predates this fork and is dead** — the GLM-5.3-Flash gate is now the payload format + a boot probe, not kernels | | **Lucebox** | yes, image on host | Qwen 3.8, DS4; **V4.1 on the unmerged `feat/ds41-engine` branch** | The only V4.1 path. **Refuses layer split and layer-major prefill for V4.1** | -| **radiance-vLLM** (drwolfen) | yes — served frank-primary 2026-09-27 → 09-30 | welded to `qwen4_exp`; PLE / QSA / packed-HC live inside that model class | 12–20 person-days per architecture | +| **radiance-vLLM** (drwolfen) | yes — served frank-archon 2026-09-27 → 09-30 | welded to `qwen4_exp`; PLE / QSA / packed-HC live inside that model class | 12–20 person-days per architecture | | **FreeToken-ROCm** | partial | block-FP8 safetensors only (modelopt); known `CpuMoeExecutor` issue under ROCm | cannot load a GGUF | | **llama.cpp** | yes | GLM-5.3 confirmed by a community R9700 guide; DS-V4.1 CED unverified | no expert LRU; **8 CPU cores** make CPU expert placement the wrong trade | | **TokenSpeed** | claimed | GLM-5.x incl. a 5.3-Flash recipe | NVIDIA-first, unverified on gfx1201 | @@ -203,7 +203,7 @@ reproducible **from a bf16 source**, not from our file. Uncensored-family bf16 source candidates: `windowsxp811203/Qwen3.8-Flash-Next-Abliterated-GGUF` (ships the bf16 GGUF) and `mradermacher/Qwen3.8-Flash-Next-Uncensored-GGUF` (i1 quants only). 622 G free fits source + container. A trial is: -download → `rad-convert` (CPU-side) → stop+mask frank-primary window to +download → `rad-convert` (CPU-side) → stop+mask frank-archon window to serve. Caveats on record: `--tp-wire wht6` is a lossy int8 all-reduce wire; the recurrent GDN state is f32 by default (144 MiB/sequence) with an opt-in f16 that changes generated text; every pool is budgeted @@ -221,7 +221,7 @@ gfx1201+gfx1201. hip:0 takes dense weights and the hot expert stack; ## See Also -- [[frank-primary-lucebox-ds4]] — the retired Lucebox frank-primary runbook +- [[frank-archon-lucebox-ds4]] — the retired Lucebox frank-archon runbook - [[Dual-R9700-Cooperation]] — the PCIe/atomics facts behind the board swap - [[Dankserver System Specs]] — the host (RAM corrected 2026-09-28) -- [[frank-primary-r9v-radiance-qwen38-q8]] — the ACTIVE frank-primary +- [[frank-archon-r9v-radiance-qwen38-q8]] — the ACTIVE frank-archon diff --git a/serverAppConfigs-docs/LLM/dankserver-qwen38-fp8-expert-offload-tuning.md b/serverAppConfigs-docs/LLM/dankserver-qwen38-fp8-expert-offload-tuning.md index 5177c89..f6a794e 100644 --- a/serverAppConfigs-docs/LLM/dankserver-qwen38-fp8-expert-offload-tuning.md +++ b/serverAppConfigs-docs/LLM/dankserver-qwen38-fp8-expert-offload-tuning.md @@ -30,7 +30,7 @@ timestamp: 2026-09-29 This is the ad hoc `qwen-fp8` container on Dankserver (rootless podman, image `docker.io/tcclaviger/vllm:latest`, engine -`v0.29.0.dev0+g2bdbbc8080`), NOT the `frank-primary` systemd service — +`v0.29.0.dev0+g2bdbbc8080`), NOT the `frank-archon` systemd service — the R9V production unit is untouched, so no stop-and-mask was required for any of this. All numbers are decode tok/s measured from the server's own `usage.completion_tokens / (wall - ttft)` — SSE chunk counting is invalid @@ -58,7 +58,7 @@ Published to the host LAN via the serve script's `PORTMAP` hook (`PORTMAP=7773:7770`): health and completions answer on `http://192.168.0.235:7773` (verified host-side 2026-09-29; 256k config, decode 36.49/34.55/35.98 through the published path). Host port 7773 was -chosen over 7770 because `frank-primary` (7770) is stopped but ENABLED — +chosen over 7770 because `frank-archon` (7770) is stopped but ENABLED — any future start would collide with a published 7770. Device notes carried from the bring-up: `--device /dev/dri` must be the @@ -249,8 +249,8 @@ re-copies them; a recreate wipes container-local files). Two same-day cutovers moved this page's findings into production: 1. **Qwen FP8 + MTP4 replaced the failed GLM/DFlash2 experiment** (the GLM - window is documented in [[frank-primary-glm53-flash-w4a16]]; git tag - `frank-primary-fp8-mtp-20261001` is the last commit of that shape). The + window is documented in [[frank-archon-glm53-flash-w4a16]]; git tag + `frank-archon-fp8-mtp-20261001` is the last commit of that shape). The production trio took MAXLEN 200000 x 3, fp8 KV, MTP4, prefetch off — measured 37.4-40.6 tok/s at ~54% acceptance. 2. **The overnight redo campaign re-measured EVERY lever at matched @@ -278,20 +278,20 @@ is only sampled at 3 depths; a 64k-192k-depth probe is the flagged gap. ### The deployed shape (2026-10-03 shape G: 3 slots x 200704, fp8, precise memory, MNBT 2048, arena at the flag ceiling) ``` -FRANK_PRIMARY_MAXLEN=200704 200704-token window -FRANK_PRIMARY_SEQS=3 --max-num-seqs 3 (SEQS=2 CANNOT boot - below) -FRANK_PRIMARY_KV_BYTES=3166500000 PER RANK (fp8, 7,892 B/token -> 400,700 tokens) -FRANK_PRIMARY_KV_DTYPE=fp8 --kv-cache-dtype fp8 (quantized) -FRANK_PRIMARY_MNBT=2048 --max-num-batched-tokens 2048 (arena-free, see shape F) -FRANK_PRIMARY_UTIL=0.982 budget = total x util, the law (1.0 unbootable, see below) -FRANK_PRIMARY_CUDAGRAPH_BASE_MB=0 / _PER_GRAPH_MB=12 -e VLLM_CUDAGRAPH_MEM_* -FRANK_PRIMARY_PRECISE_MEMORY=1 --expert-precise-memory (overhead 7.60 -> 5.25 GiB) -FRANK_PRIMARY_EXPERT_OFFLOAD_MEM=120 --expert-offload-mem (host-region cap, explicit) -FRANK_PRIMARY_GPU_MAX_HW_QUEUES=2 -e GPU_MAX_HW_QUEUES=2 (HSA queues/GPU) -FRANK_PRIMARY_CACHE_DIR=/home/dank/.cache/frank-primary mounted at /root/.cache +FRANK_ARCHON_MAXLEN=200704 200704-token window +FRANK_ARCHON_SEQS=3 --max-num-seqs 3 (SEQS=2 CANNOT boot - below) +FRANK_ARCHON_KV_BYTES=3166500000 PER RANK (fp8, 7,892 B/token -> 400,700 tokens) +FRANK_ARCHON_KV_DTYPE=fp8 --kv-cache-dtype fp8 (quantized) +FRANK_ARCHON_MNBT=2048 --max-num-batched-tokens 2048 (arena-free, see shape F) +FRANK_ARCHON_UTIL=0.982 budget = total x util, the law (1.0 unbootable, see below) +FRANK_ARCHON_CUDAGRAPH_BASE_MB=0 / _PER_GRAPH_MB=12 -e VLLM_CUDAGRAPH_MEM_* +FRANK_ARCHON_PRECISE_MEMORY=1 --expert-precise-memory (overhead 7.60 -> 5.25 GiB) +FRANK_ARCHON_EXPERT_OFFLOAD_MEM=120 --expert-offload-mem (host-region cap, explicit) +FRANK_ARCHON_GPU_MAX_HW_QUEUES=2 -e GPU_MAX_HW_QUEUES=2 (HSA queues/GPU) +FRANK_ARCHON_CACHE_DIR=/home/dank/.cache/frank-archon mounted at /root/.cache R4D_LRU_GATHER_CHUNKS=32 / R4D_LRU_GATHER_LANES=64 (container env) NO --speculative-config, NO --expert-prefetch -FRANK_PRIMARY_NO_PREFIX_CACHING=1 --no-enable-prefix-caching (2026-10-05, the QFN align-mode GDN state fault — below) +FRANK_ARCHON_NO_PREFIX_CACHING=1 --no-enable-prefix-caching (2026-10-05, the QFN align-mode GDN state fault — below) ``` ### 2026-10-05 — prefix caching OFF: the fork's QFN align-mode GDN state fault @@ -299,7 +299,7 @@ FRANK_PRIMARY_NO_PREFIX_CACHING=1 --no-enable-prefix-caching (2026-10-05, the Q **Symptom (Frank, 2026-10-04):** output turned repetitive/corrupted at ~40k tokens into a long conversation; short sessions stayed clean. -**Evidence (live `podman logs frank-primary-qwen`, the 2026-10-04 18:19 +**Evidence (live `podman logs frank-archon-qwen`, the 2026-10-04 18:19 boot):** one 0.6 s burst at 18:46:07 PDT — 5.6 h into service, one running request, and the engine's own 18:46:08 log line reading "Prefix cache hit rate: 48.1%". 48 `gdn_hip` faults, then the @@ -343,7 +343,7 @@ load; 4800 MT/s is the JEDEC DDR5 floor on 5600 MT/s-rated DIMMs (not an overclock); and a two-head, single-slot NaN state is a state-path fault, not scattered finite bit corruption. -**Fix.** `FRANK_PRIMARY_NO_PREFIX_CACHING=1` → `--no-enable-prefix-caching` +**Fix.** `FRANK_ARCHON_NO_PREFIX_CACHING=1` → `--no-enable-prefix-caching` (the fork-named mitigation; the flag renders in both directions from the knob so a fork default change cannot silently flip the contract). Cost: no prefix reuse — every turn re-prefills the whole history instead of at @@ -388,7 +388,7 @@ conversation cannot distinguish fixed from unfixed; (2) a second long-context mechanism with no guard coverage — fp8 KV degradation at depth is the next suspect (a bf16-KV boot costs ~2× the pool per token and would settle it). Prefix caching is **back ON** -(`FRANK_PRIMARY_NO_PREFIX_CACHING` commented out — the cost bought no +(`FRANK_ARCHON_NO_PREFIX_CACHING` commented out — the cost bought no fix). The knob and the serve branch stay for a future fork build with a fixed GDN path. Next diagnostic: reproduce on a FRESH conversation; if it still breaks at ~40k with zero faults, A/B the KV dtype. @@ -472,7 +472,7 @@ running** — the bound tracks whatever the co-tenants hold at that moment. The demand is 105.48 GiB (52.74 GiB/rank x 2, 23,040 swap-target experts), and a boot where the bound drops near it silently converts next-hottest experts to VRAM-only (the `pinned_extra` warning is the only trace). -`FRANK_PRIMARY_EXPERT_OFFLOAD_MEM=120` pins it: measured demand + 14% headroom, +`FRANK_ARCHON_EXPERT_OFFLOAD_MEM=120` pins it: measured demand + 14% headroom, on a host with 246.1 GiB total. Semantics verified in the shipped image (`offloader/expert_plan.py`): the cap binds as the bound, an exceedance only warns, and the plan rewrites the field to the cap it met (+1 MiB/rank). @@ -484,7 +484,7 @@ was itself fitted at nbt 4096, which means 2048 is covered by an activation figure measured at a **larger** batch. SEQS 3 boots at both 1024 and 2048 (measured 2026-10-02 — the `query_start_loc` `ConstraintViolationError` is a SEQS property). The costs are a one-time recompile (the compile **range** is -part of the cache key, so `FRANK_PRIMARY_CACHE_DIR` pays once) and a wider +part of the cache key, so `FRANK_ARCHON_CACHE_DIR` pays once) and a wider prefill chunk, which the 09-29 sweep found decode-interchangeable across 1024-4096 while 512 doubled TTFT at 4064 ctx (2.46 s vs 1.36 s). @@ -656,7 +656,7 @@ read them via `journalctl -o json`, not `-o cat` (and `podman logs`, which is only available while the container lives). Rollback to the 2026-09-29 fp8+MTP4 shape: git tag -`frank-primary-fp8-mtp-20261001` (env trio + seam re-pinned there). +`frank-archon-fp8-mtp-20261001` (env trio + seam re-pinned there). ## Parallelism options on this box (2026-10-01 survey) @@ -696,9 +696,9 @@ more cards. run in the engine's namespace and the files must be copied in first: ``` -podman cp /home/dank/mtp_measure.py frank-primary-qwen:/ -podman cp /home/dank/bench_iter.py frank-primary-qwen:/ -podman exec frank-primary-qwen python3 /mtp_measure.py +podman cp /home/dank/mtp_measure.py frank-archon-qwen:/ +podman cp /home/dank/bench_iter.py frank-archon-qwen:/ +podman exec frank-archon-qwen python3 /mtp_measure.py ``` Without the copy the exec dies with `can't open file '/mtp_measure.py': [Errno 2] @@ -717,7 +717,7 @@ reproducible across boots. - [[dankserver-frontier-moe-feasibility]] — the sibling feasibility page (which frontier MoE fits this box; the same PCIe-expert-stream wall at V4.1 scale) -- [[frank-primary-r9v-radiance-qwen38-q8]] — RETIRED 2026-09-30 (the R9V +- [[frank-archon-r9v-radiance-qwen38-q8]] — RETIRED 2026-09-30 (the R9V fork era; production has been the tcclaviger fork since) - [[x4-pair-experiment]] — the same residency law measured on a narrower link: streaming over PCIe loses, computing in RAM does not care diff --git a/serverAppConfigs-docs/LLM/dankserver-vram-growth.md b/serverAppConfigs-docs/LLM/dankserver-vram-growth.md index c306e44..4143b29 100644 --- a/serverAppConfigs-docs/LLM/dankserver-vram-growth.md +++ b/serverAppConfigs-docs/LLM/dankserver-vram-growth.md @@ -1,7 +1,7 @@ --- type: reference title: Dankserver VRAM and RAM Growth Under Load -description: Investigation of the recurring cuBLAS crash on frank-secondary. What grows, what does not, and what to do next. +description: Investigation of the recurring cuBLAS crash on frank-zealot. What grows, what does not, and what to do next. tags: - dankserver - llamacpp @@ -18,7 +18,7 @@ timestamp: 2026-09-03 # Dankserver VRAM and RAM Growth Under Load This page records the investigation of the recurring cuBLAS crash on -`frank-secondary` (llama.cpp, RTX 3090 24 GiB). The service aborts +`frank-zealot` (llama.cpp, RTX 3090 24 GiB). The service aborts with `CUDA error: an unsupported value or parameter was passed to the function` in `cublasSgemm_v2` at `ggml-cuda.cu:1541` during `update_slots` -> `decode` -> `process_ubatch`. It crashed on 2026-08-13 @@ -116,7 +116,7 @@ Verified 2026-08-14 after deploy: flash attention enabled, warmup clean, decode ## Mitigation Options -The documentation for the benchmark ([[frank-secondary-benchmark]]) +The documentation for the benchmark ([[frank-zealot-benchmark]]) prescribes the first option for this crash class. None of these change the model. @@ -135,6 +135,6 @@ PR #25649 (slot checkpoints freed on prompt clear, merged), issue #26119 ## See Also -- [[frank-secondary-benchmark]] +- [[frank-zealot-benchmark]] - [[Dankserver System Specs]] - [[deployment]] \ No newline at end of file diff --git a/serverAppConfigs-docs/LLM/dealign-ornith-crack.md b/serverAppConfigs-docs/LLM/dealign-ornith-crack.md index 6ee66f2..b3e618a 100644 --- a/serverAppConfigs-docs/LLM/dealign-ornith-crack.md +++ b/serverAppConfigs-docs/LLM/dealign-ornith-crack.md @@ -1,7 +1,7 @@ --- type: reference title: dealign Ornith-1.5-35B-A3B CRACK on Dankserver -description: dealignai/Ornith-1.5-35B-A3B-UNCENSORED (CRACK Q6_K) served by upstream llama.cpp on the RTX 3090. MoE model with ngram-mod speculative decoding; selected expert weights offloaded to CPU with an explicit --override-tensor. frank-secondary. +description: dealignai/Ornith-1.5-35B-A3B-UNCENSORED (CRACK Q6_K) served by upstream llama.cpp on the RTX 3090. MoE model with ngram-mod speculative decoding; selected expert weights offloaded to CPU with an explicit --override-tensor. frank-zealot. tags: - llamacpp - cuda @@ -14,12 +14,12 @@ timestamp: 2026-08-24 # dealign Ornith-1.5-35B-A3B CRACK on Dankserver -> **Active 2026-08-25.** `frank-secondary` serves this model. It +> **Active 2026-08-25.** `frank-zealot` serves this model. It > replaced the CRACK Q8_0 file on the same upstream llama.cpp binary (b10121). > The Q6_K file was downloaded from the model repository and validated with > `llama-gguf` before installation. -`frank-secondary` (port 7770) serves +`frank-zealot` (port 7770) serves `Ornith-1.5-35B-A3B-CRACK-Q6_K.gguf` from `dealignai` on Hugging Face. It is a **MoE** model (256 experts, 8 active) with a hybrid GatedDeltaNet (SSM) + attention architecture, abliterated (uncensored). The GGUF also contains a diff --git a/serverAppConfigs-docs/LLM/deployment.md b/serverAppConfigs-docs/LLM/deployment.md index 853ffd9..53c41e8 100644 --- a/serverAppConfigs-docs/LLM/deployment.md +++ b/serverAppConfigs-docs/LLM/deployment.md @@ -20,8 +20,8 @@ SearXNG, Caddy, or another container service does **not** restart inference. | Target | Host | Service | Port | |---|---|---|---:| | Dankserver | `dank@dankserver` | `frank-medium` | 7770 | -| Dankclaw | `dank@dankclaw` | `frank-large` | 7770 | -| Dankclaw | `dank@dankclaw` | `frank-secondary` | 7771 | +| Dankclaw | `dank@dankclaw` | `frank-dragoon` | 7770 | +| Dankclaw | `dank@dankclaw` | `frank-zealot` | 7771 | ## Scoped workflow @@ -40,7 +40,7 @@ Run the unified deployer from the repository root: ```bash ./scripts/deploy.sh dankserver --service frank-medium -./scripts/deploy.sh dankclaw --service frank-large +./scripts/deploy.sh dankclaw --service frank-dragoon ./scripts/deploy.sh dankclaw --dry-run ``` @@ -51,23 +51,23 @@ on the selected host. The following files select the corresponding service: entrypoint and its healthcheck) selects `frank-medium` on Dankserver — the container mounts the entrypoint and healthcheck straight out of the checkout, so any file there changes deployed state. -- `scripts/frank-large.env`, `frank-large.service`, and - `serve-frank-large.sh` select `frank-large` on Dankclaw. -- `scripts/frank-secondary.env`, `frank-secondary.service`, and - `serve-frank-secondary.sh` select `frank-secondary` on Dankclaw. +- `scripts/frank-dragoon.env`, `frank-dragoon.service`, and + `serve-frank-dragoon.sh` select `frank-dragoon` on Dankclaw. +- `scripts/frank-zealot.env`, `frank-zealot.service`, and + `serve-frank-zealot.sh` select `frank-zealot` on Dankclaw. - Documentation, tests, deployment tooling, and unrelated container changes do not select any inference service. The target-side `scripts/deploy-remote.sh` installs the selected service. -`frank-large` and `frank-secondary` are **root units**: the handler relinks the +`frank-dragoon` and `frank-zealot` are **root units**: the handler relinks the repo file into `/etc/systemd/system/` (`relink_unit`), reloads systemd, enables it and restarts it. `frank-medium` is a **rootless Quadlet**: the handler retires its predecessors (the replica Quadlets and the retired llama root unit), stops the service's own unit, waits for the published port to clear, installs the `.container` and restarts the generated unit. Each handler then waits on that service's health endpoint — -`http://127.0.0.1:7770/health` for frank-large and frank-medium, -`http://127.0.0.1:7771/health` for frank-secondary. The wait budget is 20 minutes +`http://127.0.0.1:7770/health` for frank-dragoon and frank-medium, +`http://127.0.0.1:7771/health` for frank-zealot. The wait budget is 20 minutes because cold model loads are slow. A failed handler does not advance its per-service state. @@ -75,8 +75,8 @@ per-service state. The root units point into the stable target checkout: ```text -/home/dank/serverAppConfigs/scripts/frank-large.service -/home/dank/serverAppConfigs/scripts/frank-secondary.service +/home/dank/serverAppConfigs/scripts/frank-dragoon.service +/home/dank/serverAppConfigs/scripts/frank-zealot.service ``` `frank-medium` is a Quadlet under `dankserver/frank-medium/quadlet/` (`frank-medium.container`) rather than a unit in `scripts/`. @@ -110,7 +110,7 @@ change in that service's inputs. If the LLM handler fails after the target pull: -1. Inspect `journalctl -u frank-large -n 200` or `journalctl -u frank-secondary +1. Inspect `journalctl -u frank-dragoon -n 200` or `journalctl -u frank-zealot -n 200` (root units), or `journalctl --user -u frank-medium -n 200` (rootless Quadlet). 2. Confirm the model files, the runtime binary and (for frank-medium) the @@ -119,14 +119,14 @@ If the LLM handler fails after the target pull: ```bash ./scripts/deploy.sh dankserver --service frank-medium - ./scripts/deploy.sh dankclaw --service frank-large - ./scripts/deploy.sh dankclaw --service frank-secondary + ./scripts/deploy.sh dankclaw --service frank-dragoon + ./scripts/deploy.sh dankclaw --service frank-zealot ``` 4. Verify the matching health endpoint before declaring recovery. Do not stop the other host's inference service during recovery. The two Dankclaw endpoints are independent processes on different devices: restarting -frank-large does not disturb frank-secondary, and the reverse holds too — with one +frank-dragoon does not disturb frank-zealot, and the reverse holds too — with one exception worth knowing, that the deployer waits for port 7770 to be released before it starts the replacement container. For benchmark work, follow the separate stop/benchmark/restart procedure in [[Testing Policy]] and the diff --git a/serverAppConfigs-docs/LLM/dflash2-large-vulkan.md b/serverAppConfigs-docs/LLM/dflash2-large-vulkan.md index 9402baf..3f4cee1 100644 --- a/serverAppConfigs-docs/LLM/dflash2-large-vulkan.md +++ b/serverAppConfigs-docs/LLM/dflash2-large-vulkan.md @@ -1,6 +1,6 @@ --- type: reference -title: DFlash2 on Dankclaw (frank-large) +title: DFlash2 on Dankclaw (frank-dragoon) description: ARCHIVED - unsloth Qwen3.8-27B-UD-Q8_K_XL served by upstream llama.cpp PR #27342 with a z-lab DFlash2 drafter on the Vulkan backend. Retired 2026-08-21 for speed; kept as a runbook. tags: - llama.cpp @@ -13,14 +13,14 @@ tags: timestamp: 2026-08-21 --- -# DFlash2 on Dankclaw (frank-large) — ARCHIVED +# DFlash2 on Dankclaw (frank-dragoon) — ARCHIVED > **Archived 2026-08-21.** This DFlash2 Vulkan deployment was retired the > same day it shipped because it was slower than the CIRU runtime it -> replaced. `frank-large` is back on CIRU. This page stays as the +> replaced. `frank-dragoon` is back on CIRU. This page stays as the > runbook and provenance for the DFlash2 attempt. -`frank-large` (port 52625) briefly served +`frank-dragoon` (port 52625) briefly served `unsloth/Qwen3.8-27B-UD-Q8_K_XL` with a DFlash2 drafter from z-lab. The runtime was upstream llama.cpp PR #27342 built with `GGML_VULKAN=ON`. @@ -114,14 +114,14 @@ graph TD C --> D[Build llama-server] D --> E[Verify Vulkan0 device] E --> F[Add DFlash2 drafter] - F --> G[Swap frank-large] + F --> G[Swap frank-dragoon] G --> H[Health check + completion] ``` ## Service -- Unit: `frank-large.service`, port 52625 -- Script: `scripts/serve-frank-large.sh`, env `scripts/frank-large.env` +- Unit: `frank-dragoon.service`, port 52625 +- Script: `scripts/serve-frank-dragoon.sh`, env `scripts/frank-dragoon.env` - Binary: `/home/dank/llama.cpp-dflash2/build-dflash2/bin/llama-server` ### Launch profile diff --git a/serverAppConfigs-docs/LLM/eemin-rocmi4-mtp.md b/serverAppConfigs-docs/LLM/eemin-rocmi4-mtp.md index 7ac1326..eb61b77 100644 --- a/serverAppConfigs-docs/LLM/eemin-rocmi4-mtp.md +++ b/serverAppConfigs-docs/LLM/eemin-rocmi4-mtp.md @@ -1,7 +1,7 @@ --- type: reference title: caf-eemin Qwen3.8-27B ROCmI4 embedded MTP on Dankclaw -description: caf-eemin/Qwen3.8-27B-ROCmI4-MTP-GGUF (Q4_0_ROCMI4, embedded NextN/MTP head) served by the charlie12345/ROCmFPX llama.cpp runtime (ROCmI4 W4A4) on the Strix Halo iGPU. frank-large. +description: caf-eemin/Qwen3.8-27B-ROCmI4-MTP-GGUF (Q4_0_ROCMI4, embedded NextN/MTP head) served by the charlie12345/ROCmFPX llama.cpp runtime (ROCmI4 W4A4) on the Strix Halo iGPU. frank-dragoon. tags: - llama.cpp - rocm @@ -15,14 +15,14 @@ timestamp: 2026-08-25 # caf-eemin Qwen3.8-27B ROCmI4 embedded MTP on Dankclaw -> **RETIRED 2026-08-25.** `frank-large` served this model from 2026-08-18 +> **RETIRED 2026-08-25.** `frank-dragoon` served this model from 2026-08-18 > until 2026-08-25. It replaced the kingjones777 ROCmFP4 STRIX MTP payload > on the same port and the same Strix Halo iGPU, running the new > charlie12345/ROCmFPX ROCmI4 W4A4 build (see [[kingjones-strix-mtp]] for > the page it replaced), and was itself replaced by > [[kingjones-strix-rocmfp4]]. -`frank-large` (port 7770) serves +`frank-dragoon` (port 7770) serves `cafonz/Qwen3.8-27B-ROCmI4-MTP-GGUF` (published under the public `eemin` namespace) from the **charlie12345/ROCmFPX** llama.cpp fork built with the opt-in `ROCmI4 W4A4` path. The model is `Q4_0_ROCMI4`: signed four-bit @@ -98,7 +98,7 @@ graph TD D --> E[Sharp chat template
reasoning deepseek] ``` -Key flags (see `scripts/serve-frank-large.sh`): +Key flags (see `scripts/serve-frank-dragoon.sh`): ``` --spec-type draft-mtp --spec-mtp-strict-qwen @@ -129,8 +129,8 @@ path's greedy decisions; it does not remove the W4A4 activation approximation. ### Service -- Unit: `frank-large.service`, port 7770 -- Script: `scripts/serve-frank-large.sh`, env `scripts/frank-large.env` +- Unit: `frank-dragoon.service`, port 7770 +- Script: `scripts/serve-frank-dragoon.sh`, env `scripts/frank-dragoon.env` ## Tuning MTP @@ -144,14 +144,14 @@ Decode throughput depends on the ubatch (per-eval token batch). Run the sweep on 8k contexts, 512 → 4096 in steps of 512, with a fixed batch: ``` -sudo systemctl stop frank-large +sudo systemctl stop frank-dragoon ./scripts/bench-ubatch.sh -sudo systemctl start frank-large +sudo systemctl start frank-dragoon ``` -The script stops `frank-large` for a clean GPU, boots one server +The script stops `frank-dragoon` for a clean GPU, boots one server instance per ubatch on a scratch port, reads authoritative `print_timing` tok/s, -and restarts the service. See [[frank-large-benchmark]]. +and restarts the service. See [[frank-dragoon-benchmark]]. ## Known Issues @@ -185,4 +185,4 @@ The ubatch sweep above gives the production ubatch choice. - [[kingjones-strix-mtp]] — the retired ROCmFP4 predecessor on this slot - [[ciru-activefpx-promptforge]] — the retired v3 CIRU PromptForge page - [[Dankclaw System Specs]] — the box -- [[frank-large-benchmark]] — backend/spec benchmark history +- [[frank-dragoon-benchmark]] — backend/spec benchmark history diff --git a/serverAppConfigs-docs/LLM/frank-primary-freetoken-pr587.md b/serverAppConfigs-docs/LLM/frank-archon-freetoken-pr587.md similarity index 90% rename from serverAppConfigs-docs/LLM/frank-primary-freetoken-pr587.md rename to serverAppConfigs-docs/LLM/frank-archon-freetoken-pr587.md index 28c34c5..216f841 100644 --- a/serverAppConfigs-docs/LLM/frank-primary-freetoken-pr587.md +++ b/serverAppConfigs-docs/LLM/frank-archon-freetoken-pr587.md @@ -1,7 +1,7 @@ -# frank-primary — FreeToken PR #587 ROCm (Qwen3.8-Flash-Next-Uncensored-FP8, 1× R9700) +# frank-archon — FreeToken PR #587 ROCm (Qwen3.8-Flash-Next-Uncensored-FP8, 1× R9700) **Status: RETIRED 2026-10-05 → (superseded the same day by the radiance -cutover — see [[frank-primary-radiance-qwen38-native-fp8]]; kept as the +cutover — see [[frank-archon-radiance-qwen38-native-fp8]]; kept as the rollback runbook: the image + orcarouter payload stay on disk until the window closes)** · **Host:** Dankserver (192.168.0.235) · **Port:** 7770 · **GPU:** 1× Radeon AI PRO R9700 (gfx1201) — the second R9700 sits idle @@ -9,11 +9,11 @@ window closes)** · **Host:** Dankserver (192.168.0.235) · **Port:** 7770 · The tcclaviger RDNA4 vLLM fork was replaced by **FreeToken at PR #587 head `77a7201f98f00d93f618c6cf8b81ffe8360e0899`** (branch `rocm714_torch214`), built on the host into the local image -`localhost/frank-primary-freetoken:pr587-77a7201` by -`scripts/docker/frank-primary-freetoken.Dockerfile`. Same port, same served -alias (`frank-primary`), same 131-shard payload +`localhost/frank-archon-freetoken:pr587-77a7201` by +`scripts/docker/frank-archon-freetoken.Dockerfile`. Same port, same served +alias (`frank-archon`), same 131-shard payload (`/home/dank/models/Qwen3.8-Flash-Next-Uncensored-FP8`). Rollback: -git tag `frank-primary-vllm-shapeG-20261003` (the vLLM trio + its env lore), +git tag `frank-archon-vllm-shapeG-20261003` (the vLLM trio + its env lore), runbook [[dankserver-qwen38-fp8-expert-offload-tuning]]. ## Why FreeToken @@ -31,8 +31,8 @@ deterministic pass — no per-boot estimator to fight. ```bash cd /home/dank/serverAppConfigs -podman build -t frank-primary-freetoken:pr587-77a7201 \ - -f scripts/docker/frank-primary-freetoken.Dockerfile scripts/docker/ +podman build -t frank-archon-freetoken:pr587-77a7201 \ + -f scripts/docker/frank-archon-freetoken.Dockerfile scripts/docker/ ``` Laws baked into the Dockerfile (each one cost a failure): @@ -129,7 +129,7 @@ native 262,144-token conversation + full budget. `models.yml` PLE ngram table in host RAM → the unit carries `LimitMEMLOCK=infinity` (root unit; dank's login session caps at 8 MiB and a user quadlet cannot raise it). Weights+PLE+overhead ≈ 190 GiB — the vLLM -container's ~170 GiB MUST be down first; `systemctl stop frank-primary` +container's ~170 GiB MUST be down first; `systemctl stop frank-archon` frees it (measured: 207 GB free right after the stop). ## Resize live @@ -156,11 +156,11 @@ ft ctl stats # pool occupancy, VRAM, throughput ## Rollback ```bash -git checkout frank-primary-vllm-shapeG-20261003 -- \ - scripts/frank-primary.env scripts/serve-frank-primary.sh \ - scripts/frank-primary.service -./tests/run.sh && git commit -m "frank-primary: rollback to vLLM shape G" \ - && git push && ./scripts/deploy.sh dankserver --service frank-primary +git checkout frank-archon-vllm-shapeG-20261003 -- \ + scripts/frank-archon.env scripts/serve-frank-archon.sh \ + scripts/frank-archon.service +./tests/run.sh && git commit -m "frank-archon: rollback to vLLM shape G" \ + && git push && ./scripts/deploy.sh dankserver --service frank-archon ``` The tcclaviger image and the FreeToken image coexist in dank's rootless diff --git a/serverAppConfigs-docs/LLM/frank-primary-glm53-flash-w4a16.md b/serverAppConfigs-docs/LLM/frank-archon-glm53-flash-w4a16.md similarity index 96% rename from serverAppConfigs-docs/LLM/frank-primary-glm53-flash-w4a16.md rename to serverAppConfigs-docs/LLM/frank-archon-glm53-flash-w4a16.md index a28c0a1..2eb5ce3 100644 --- a/serverAppConfigs-docs/LLM/frank-primary-glm53-flash-w4a16.md +++ b/serverAppConfigs-docs/LLM/frank-archon-glm53-flash-w4a16.md @@ -1,7 +1,7 @@ --- type: runbook -title: frank-primary — GLM-5.3-Flash W4A16 int4 (tcclaviger, 2x R9700) -description: VERIFIED 2026-09-30 by boot probe, bench, live expert-cache telemetry AND a torch-profiler kernel-time window. frank-primary cut over from Qwen3.8-Flash-Next-Uncensored-FP8 + MTP4 to Intel/GLM-5.3-Flash-W4A16-AutoRound, the first payload this fleet serves through the fork's W4A16 expert-offload path (INC scheme -> R4dW4a16MoEMethod, libr4d grouped W4A16 GEMM). Measured decode 9.9-10.0 tok/s and prefill 918 tok/s at 131,072 ctx. THE 35 tok/s TARGET IS NOT MET, and the profiler window FALSIFIED the first explanation: the expert gather is 1.05 % of device time, not the bound. 44 % of the 93 ms/token budget is pointwise glue (1,428 elementwise launches per token) because the fork's GLM trunk is NOT torch.compiled while its own Qwen trunk is; the second-largest lever, the fused router, is binary-blocked at 288 experts. The compile changelist is staged but incomplete (three patches, one blocker left). +title: frank-archon — GLM-5.3-Flash W4A16 int4 (tcclaviger, 2x R9700) +description: VERIFIED 2026-09-30 by boot probe, bench, live expert-cache telemetry AND a torch-profiler kernel-time window. frank-archon cut over from Qwen3.8-Flash-Next-Uncensored-FP8 + MTP4 to Intel/GLM-5.3-Flash-W4A16-AutoRound, the first payload this fleet serves through the fork's W4A16 expert-offload path (INC scheme -> R4dW4a16MoEMethod, libr4d grouped W4A16 GEMM). Measured decode 9.9-10.0 tok/s and prefill 918 tok/s at 131,072 ctx. THE 35 tok/s TARGET IS NOT MET, and the profiler window FALSIFIED the first explanation: the expert gather is 1.05 % of device time, not the bound. 44 % of the 93 ms/token budget is pointwise glue (1,428 elementwise launches per token) because the fork's GLM trunk is NOT torch.compiled while its own Qwen trunk is; the second-largest lever, the fused router, is binary-blocked at 288 experts. The compile changelist is staged but incomplete (three patches, one blocker left). tags: - dankserver - r9700 @@ -16,7 +16,7 @@ tags: timestamp: 2026-09-30 --- -# frank-primary — GLM-5.3-Flash W4A16 int4 (tcclaviger, 2x R9700) +# frank-archon — GLM-5.3-Flash W4A16 int4 (tcclaviger, 2x R9700) > **RETIRED 2026-10-01.** Cutover reversed to Qwen3.8-Flash-Next-Uncensored-FP8 > + MTP4 (commit `2339fae` trio). The DFlash2 drafter experiment is a @@ -118,7 +118,7 @@ register the spec classes in `KVCacheSpecRegistry` with a dummy manager, add spec sets through the patched grouping/layout/builder functions. A 7-minute boot per hypothesis is the alternative. -**Window discipline:** stop + mask `frank-primary` FIRST and gate on +**Window discipline:** stop + mask `frank-archon` FIRST and gate on MemAvailable ≥ 230 GiB before booting the probe (the expert-offload planner reads MemAvailable; beside-prod boots die at plan time with `ExpertPlanError: host holds 5113 of 12096 swappable experts`). Save `podman logs glm-probe` @@ -152,7 +152,7 @@ by this page's kernel-time measurement), | engine | TP=2, `--enable-expert-offload --expert-precise-memory`, max-model-len 131,072 x 2 seqs, bf16 KV, util 0.98, NBATCH 2048, prefix caching | | MoE kernel | `R4dW4a16MoEMethod` → libr4d grouped W4A16 GEMM, 6.234 MiB per expert-rank slot | | expert cache | 14.51 GiB = **2,383 slots** per rank; 12,096 host-backed experts, **73.64 GiB pinned per rank** | -| unit | `scripts/frank-primary.service` (root unit, `LimitMEMLOCK=infinity` for the pin) | +| unit | `scripts/frank-archon.service` (root unit, `LimitMEMLOCK=infinity` for the pin) | | measured | **decode 9.9-10.0 tok/s**, **prefill 918 tok/s** (warm, 2.6k-token prompt), KV cache 138,561 tokens | ```mermaid @@ -698,14 +698,14 @@ newest GLM dialect the fork ships (`glm45`/`glm47` exist for both). # rollback to the pre-cutover qwen FP8 + MTP4 shape (payload and R9V state # dirs are untouched on disk): git show 2339fae -- scripts/ | git apply # or: git checkout 2339fae -- scripts/ -./scripts/deploy.sh dankserver --service frank-primary +./scripts/deploy.sh dankserver --service frank-archon # payload inventory (34 shards + 2 extras, weight-map index): -bash scripts/download-frank-primary.sh --verify-only +bash scripts/download-frank-archon.sh --verify-only # live telemetry (needs the profiler window; with_stack=false is mandatory — # with stack the stop path hangs and the trace buffer grows to tens of GB): -podman logs frank-primary-glm 2>&1 | grep "expert_lru.py" +podman logs frank-archon-glm 2>&1 | grep "expert_lru.py" ``` **Experiment-window discipline (learned the hard way, 2026-09-30).** This engine @@ -719,11 +719,11 @@ mask symlink **and** the container is owned by the unit and not `Stopping`. The repair recipe, all four steps needed: ```bash -sudo mv /run/systemd/system/frank-primary.service /tmp/stale-mask-N.service # runtime mask SURVIVES stop and blocks start +sudo mv /run/systemd/system/frank-archon.service /tmp/stale-mask-N.service # runtime mask SURVIVES stop and blocks start sudo systemctl daemon-reload -sudo systemctl reset-failed frank-primary.service # a failed unit refuses to start -podman rm -f frank-primary-glm # SIGKILL; `podman stop` hangs on the same SIGTERM -sudo systemctl start frank-primary.service # then ~7 min to health 200 +sudo systemctl reset-failed frank-archon.service # a failed unit refuses to start +podman rm -f frank-archon-glm # SIGKILL; `podman stop` hangs on the same SIGTERM +sudo systemctl start frank-archon.service # then ~7 min to health 200 ``` Also: **never let two experiment jobs overlap.** A later job's `podman rm -f @@ -795,4 +795,4 @@ toggling on the mini itself). | state | where | | --- | --- | | qwen FP8 + MTP4 (2026-09-29 → 09-30) | commit `2339fae`, payload `/home/dank/models/Qwen3.8-Flash-Next-Uncensored-FP8` | -| R9V radiance Qwen3.8-Flash-Next Q8_0 | [[frank-primary-r9v-radiance-qwen38-q8]], state dirs `/home/dank/r9v-state/{q8xl,uncensored}` | +| R9V radiance Qwen3.8-Flash-Next Q8_0 | [[frank-archon-r9v-radiance-qwen38-q8]], state dirs `/home/dank/r9v-state/{q8xl,uncensored}` | diff --git a/serverAppConfigs-docs/LLM/frank-primary-llamacpp-qwen38-flash-next-q8.md b/serverAppConfigs-docs/LLM/frank-archon-llamacpp-qwen38-flash-next-q8.md similarity index 86% rename from serverAppConfigs-docs/LLM/frank-primary-llamacpp-qwen38-flash-next-q8.md rename to serverAppConfigs-docs/LLM/frank-archon-llamacpp-qwen38-flash-next-q8.md index 4e92d92..38097be 100644 --- a/serverAppConfigs-docs/LLM/frank-primary-llamacpp-qwen38-flash-next-q8.md +++ b/serverAppConfigs-docs/LLM/frank-archon-llamacpp-qwen38-flash-next-q8.md @@ -1,9 +1,9 @@ --- type: configuration -title: frank-primary llama.cpp Qwen3.8-Flash-Next Q8_0 Runbook -description: ACTIVE frank-primary runbook — unsloth llama.cpp (the b11030-mix prebuilt, ROCm gfx120X, bundled runtime, root systemd unit) serving unsloth/Qwen3.8-Flash-Next-GGUF at Q8_0 (175.3 GiB across six split parts) on Dankserver's two Radeon AI PRO R9700s (gfx1201), with the shared Q8_0 MTP drafter (depth 2) chained behind ngram-mod, BF16 vision, and the routed experts + 51B-param n-gram embedding table computed in host RAM. Port 7770, one stream, full 262,144 ctx. Cutover 2026-09-26, replacing the same-day Lucebox DS4.1 deployment. +title: frank-archon llama.cpp Qwen3.8-Flash-Next Q8_0 Runbook +description: ACTIVE frank-archon runbook — unsloth llama.cpp (the b11030-mix prebuilt, ROCm gfx120X, bundled runtime, root systemd unit) serving unsloth/Qwen3.8-Flash-Next-GGUF at Q8_0 (175.3 GiB across six split parts) on Dankserver's two Radeon AI PRO R9700s (gfx1201), with the shared Q8_0 MTP drafter (depth 2) chained behind ngram-mod, BF16 vision, and the routed experts + 51B-param n-gram embedding table computed in host RAM. Port 7770, one stream, full 262,144 ctx. Cutover 2026-09-26, replacing the same-day Lucebox DS4.1 deployment. tags: - - frank-primary + - frank-archon - dankserver - llamacpp - unsloth @@ -19,15 +19,15 @@ tags: timestamp: 2026-09-26 --- -# frank-primary llama.cpp Qwen3.8-Flash-Next Q8_0 Runbook +# frank-archon llama.cpp Qwen3.8-Flash-Next Q8_0 Runbook -The ACTIVE dankserver LLM endpoint (:7770, alias **frank-primary**): +The ACTIVE dankserver LLM endpoint (:7770, alias **frank-archon**): unsloth llama.cpp serving `unsloth/Qwen3.8-Flash-Next-GGUF` at **Q_8** (the 6-part `Q8_0/` main, 175.30 GiB) on **both** Radeon AI PRO R9700s, with the **shared Q_8 MTP drafter** (`draft-mtp`, depth 2) layered with **`ngram-mod`**, and **vision** through `mmproj-BF16.gguf`. It replaces the Lucebox DS4.1 quadlet that held the port for hours earlier the same day -([[frank-primary-lucebox-ds4]]), which itself replaced +([[frank-archon-lucebox-ds4]]), which itself replaced [[frank-medium-radiance-mxfp4]]. ## Why this shape @@ -89,20 +89,20 @@ Lucebox DS4.1 quadlet that held the port for hours earlier the same day |Piece|Value| |---|---| -|Unit|`scripts/frank-primary.service` — root systemd unit, `User=dank`, `Restart=on-failure`, `LimitMEMLOCK=infinity`, relinked to `/etc/systemd/system/`| -|Serve script|`scripts/serve-frank-primary.sh` — validates binary + all 6 parts + drafter + mmproj before exec| -|Env tunables|`scripts/frank-primary.env` — paths and numbers only; bind is `BIND_HOST` (never a bare `HOST`: HIP reads it)| +|Unit|`scripts/frank-archon.service` — root systemd unit, `User=dank`, `Restart=on-failure`, `LimitMEMLOCK=infinity`, relinked to `/etc/systemd/system/`| +|Serve script|`scripts/serve-frank-archon.sh` — validates binary + all 6 parts + drafter + mmproj before exec| +|Env tunables|`scripts/frank-archon.env` — paths and numbers only; bind is `BIND_HOST` (never a bare `HOST`: HIP reads it)| |Runtime|`/home/dank/GitPackages/unsloth-llama-b11030/llama-server` — unsloth b11030-mix prebuilt (commit 6ba30d05b), ROCm gfx120X, bundled runtime via `LD_LIBRARY_PATH`| -|Payload|`/home/dank/models/Qwen3.8-Flash-Next-GGUF/` — `Q8_0/` (6 parts), `MTP/mtp-...-shared-Q8_0.gguf`, `mmproj-BF16.gguf`; fetched by `scripts/download-frank-primary.sh` (sha256 + byte-count verified)| -|Port / alias|7770 / `frank-primary` — unchanged from the lucebox and radiance eras; no client moves| +|Payload|`/home/dank/models/Qwen3.8-Flash-Next-GGUF/` — `Q8_0/` (6 parts), `MTP/mtp-...-shared-Q8_0.gguf`, `mmproj-BF16.gguf`; fetched by `scripts/download-frank-archon.sh` (sha256 + byte-count verified)| +|Port / alias|7770 / `frank-archon` — unchanged from the lucebox and radiance eras; no client moves| |Context|262,144 × 1 slot (`PARALLEL_SLOTS=1`, one stream, the model's full native window)| |Sampling|Greedy server default (deterministic e2e); Qwen-recommended sampling rides `models.yml` `compat.extraBody` per request| |Template|The GGUF's embedded template via `--jinja`; reasoning → `reasoning_content` (`--reasoning-format deepseek`)| -|Observability|`frank-primary` Prometheus job at `192.168.0.235:7770` — cross-host LAN scrape (the netavark published-port quirk that forces `host.containers.internal` is same-host only); exports `llamacpp:*`| +|Observability|`frank-archon` Prometheus job at `192.168.0.235:7770` — cross-host LAN scrape (the netavark published-port quirk that forces `host.containers.internal` is same-host only); exports `llamacpp:*`| ### Cutover mechanics -The deployer (`deploy_llm_primary` in `scripts/deploy-remote.sh`) gates on +The deployer (`deploy_llm_archon` in `scripts/deploy-remote.sh`) gates on every artifact at its declared byte count (`stat -c %s`, never `wc -c` — which read the whole 377 GiB lucebox file for minutes on 2026-09-26), retires the lucebox user quadlet to dated home trash @@ -138,7 +138,7 @@ between slots — it does not multiply. ## Verification (2026-09-26 deploy) -- `/v1/models` reports `frank-primary`. +- `/v1/models` reports `frank-archon`. - Chat completion returns `content` + `reasoning_content`. - Tool call returns well-formed `tool_calls` (`--jinja`). - Real image request answered from the projector (not a health check — @@ -218,7 +218,7 @@ vision and the target on the same battery class. **Which blocks, measured (same day):** asked whether the `-ot` regex could target the *most active* blocks, I instrumented the live server -instead of guessing — `scripts/frank-primary-expert-activity.py` +instead of guessing — `scripts/frank-archon-expert-activity.py` samples llama-server with AMD IBS (`perf record -e ibs_op// --data`) while 4 mixed concurrent generations run, maps each sampled load address through `/proc//maps` back to its backing tensor (extents @@ -235,7 +235,7 @@ per-EXPERT (top 10% of the 48×512 (block,expert) cells carry 40.5% of samples; hottest cell 0.1%), below the reach of a tensor-level override. Not a benchmark: it instruments production serving in place at negligible IBS overhead; re-measure any future checkpoint or -traffic mix with `frank-primary-expert-activity.py ` (or +traffic mix with `frank-archon-expert-activity.py ` (or `--analyze-only` against the saved sample file in `/tmp`). ## Rollback @@ -243,8 +243,8 @@ traffic mix with `frank-primary-expert-activity.py ` (or The lucebox DS4.1 material is fully retained on the host: image `localhost/lucebox-rocm:gfx1201`, the 378 GiB payload, and the quadlet-era repo files in `dankserver/.AGENTTRASH/20260926-llamacpp-cutover/` (see -[[frank-primary-lucebox-ds4]]). Restore = move the `.container` back, -uninstall the root unit (`systemctl disable --now frank-primary` — the +[[frank-archon-lucebox-ds4]]). Restore = move the `.container` back, +uninstall the root unit (`systemctl disable --now frank-archon` — the link, not the file; never `systemctl disable` a unit whose file must survive), `daemon-reload`, start the user quadlet. The Qwen payload (~179 GiB) stays fetched, so a forward re-swap is a redeploy, not a @@ -252,9 +252,9 @@ refetch. ## Fleet context -- [[frank-large-unsloth-qwen38-27b-q8xl]] — Dankclaw :7770, the same +- [[frank-dragoon-unsloth-qwen38-27b-q8xl]] — Dankclaw :7770, the same b11030-mix binary family on gfx1151. -- [[frank-secondary-gemma4-12b]] — Dankclaw :7771, mainline llama.cpp on the +- [[frank-zealot-gemma4-12b]] — Dankclaw :7771, mainline llama.cpp on the 3090; the only audio-capable endpoint. - The harness contract lives in `/home/blank/.omp/agent/models.yml` (`llamacpp (dankserver)` provider, `contextWindow 262144`, diff --git a/serverAppConfigs-docs/LLM/frank-primary-lucebox-ds4.md b/serverAppConfigs-docs/LLM/frank-archon-lucebox-ds4.md similarity index 87% rename from serverAppConfigs-docs/LLM/frank-primary-lucebox-ds4.md rename to serverAppConfigs-docs/LLM/frank-archon-lucebox-ds4.md index 97c56b0..caa9571 100644 --- a/serverAppConfigs-docs/LLM/frank-primary-lucebox-ds4.md +++ b/serverAppConfigs-docs/LLM/frank-archon-lucebox-ds4.md @@ -1,9 +1,9 @@ --- type: configuration -title: frank-primary Lucebox DeepSeek V4 Runbook -description: RETIRED 2026-09-26 frank-primary runbook (active for hours on 2026-09-26) — the Lucebox runtime (github.com/Luce-Org/lucebox, local image localhost/lucebox-rocm:gfx1201) serving DeepSeek-V4.1-Flash-ROCMFP23 (377.2 GiB GGUF, 43-layer MoE, 256 routed experts, top-6) on Dankserver's R9700 with the routed experts computed on CPU from the mmapped page cache. Replaced the same day by [[frank-primary-llamacpp-qwen38-flash-next-q8]] (llama.cpp Qwen3.8-Flash-Next Q8_0); payload and image retained on the host as the rollback target. +title: frank-archon Lucebox DeepSeek V4 Runbook +description: RETIRED 2026-09-26 frank-archon runbook (active for hours on 2026-09-26) — the Lucebox runtime (github.com/Luce-Org/lucebox, local image localhost/lucebox-rocm:gfx1201) serving DeepSeek-V4.1-Flash-ROCMFP23 (377.2 GiB GGUF, 43-layer MoE, 256 routed experts, top-6) on Dankserver's R9700 with the routed experts computed on CPU from the mmapped page cache. Replaced the same day by [[frank-archon-llamacpp-qwen38-flash-next-q8]] (llama.cpp Qwen3.8-Flash-Next Q8_0); payload and image retained on the host as the rollback target. tags: - - frank-primary + - frank-archon - dankserver - lucebox - deepseek-v4 @@ -16,16 +16,16 @@ tags: timestamp: 2026-09-26 --- -# frank-primary Lucebox DeepSeek V4 Runbook +# frank-archon Lucebox DeepSeek V4 Runbook > [!warning] RETIRED 2026-09-26 (same day it went live) -> Replaced by [[frank-primary-llamacpp-qwen38-flash-next-q8]] — unsloth +> Replaced by [[frank-archon-llamacpp-qwen38-flash-next-q8]] — unsloth > llama.cpp serving Qwen3.8-Flash-Next Q8_0 on both R9700s. This runtime > served for hours; the rollback material (image `localhost/lucebox-rocm: > gfx1201` and the 378 GiB payload) is retained on the host, and the > quadlet-era files live in `dankserver/.AGENTTRASH/20260926-llamacpp-cutover/`. -The dankserver LLM endpoint (:7770, alias **frank-primary**) as it stood on +The dankserver LLM endpoint (:7770, alias **frank-archon**) as it stood on 2026-09-26: the [Lucebox](https://github.com/Luce-Org/lucebox) runtime serving `Lucebox/DeepSeek-V4.1-Flash-ROCMFP23-GGUF` (377.2 GiB, 405,349,859,328 @@ -62,7 +62,7 @@ mode here, not an error. git clone --recurse-submodules https://github.com/Luce-Org/lucebox.git cd lucebox # Three local modifications (repo-tracked at -# dankserver/frank-primary/lucebox-gfx1201.patch): +# dankserver/frank-archon/lucebox-gfx1201.patch): # 1. Dockerfile.rocm drops the ROCm *-dev apt packages (the 7.14.1-full # base already ships them in /opt/rocm; the apt repo does not serve # them) and the three runtime math libs. @@ -94,11 +94,11 @@ podman build --build-arg LUCE_HIP_ARCHES=gfx1201 \ fetched with `huggingface_hub` (the xet-native path — plain `curl` full GETs 400 against HF's xethub CDN for this repo; see the fetch note in `scripts/hf-fetch.sh`). Byte count and sha256 are deploy-gated in -`deploy_llm_primary`. +`deploy_llm_archon`. ## Deployed flags (2026-09-26) -From `dankserver/frank-primary/frank-primary-entrypoint.sh` (the unit +From `dankserver/frank-archon/frank-archon-entrypoint.sh` (the unit bypasses the image's entrypoint, which only forwards a fixed Qwen/DFlash flag set and cannot express the DS4 flags): @@ -113,7 +113,7 @@ flag set and cannot express the DS4 flags): | Prefill | `--ds4-prefill sparse` (the batched prefill; `exact` runs at token-wise decode cost) | | Routing | `--ds4-expert-top-k 6` (the model default; do NOT reduce on adaptive qtype-105/106 artifacts — measured degenerate output at top-4, DS4.md 2026-08-05) | | Draft | none — no DSpark draft is published for V4.1-Flash; plain autoregressive decode | -| Identity | `--model-name frank-primary`, `--host 0.0.0.0 --port 7770` | +| Identity | `--model-name frank-archon`, `--host 0.0.0.0 --port 7770` | ## API surface @@ -123,11 +123,11 @@ metadata — the fleet contract is unchanged from frank-medium. ## Cutover procedure -1. Image built and model fetched (gates in `deploy_llm_primary`). -2. `deploy.sh` → `deploy_llm_primary`: stops and **masks** the radiance +1. Image built and model fetched (gates in `deploy_llm_archon`). +2. `deploy.sh` → `deploy_llm_archon`: stops and **masks** the radiance unit (`frank-medium`), waits for :7770 to free, installs - `dankserver/frank-primary/quadlet/frank-primary.container`, starts - `frank-primary.service`, waits for health (1800 s start period — first + `dankserver/frank-archon/quadlet/frank-archon.container`, starts + `frank-archon.service`, waits for health (1800 s start period — first start page-ins the dense weights and builds the graphs). 3. Verify: `/health` 200 is not enough — a real chat completion, a tool call, and an Open WebUI completion. @@ -137,7 +137,7 @@ metadata — the fleet contract is unchanged from frank-medium. ## Rollback Unmask and start the radiance unit (`systemctl --user unmask frank-medium && -systemctl --user start frank-medium`) and stop/mask frank-primary. The +systemctl --user start frank-medium`) and stop/mask frank-archon. The `localhost/radiance-vllm:0.13.0-e060895` image and the `/models/Qwen3.8-27B-PARO-MXFP6` checkpoint remain on disk. diff --git a/serverAppConfigs-docs/LLM/frank-primary-r9v-radiance-qwen38-q8.md b/serverAppConfigs-docs/LLM/frank-archon-r9v-radiance-qwen38-q8.md similarity index 90% rename from serverAppConfigs-docs/LLM/frank-primary-r9v-radiance-qwen38-q8.md rename to serverAppConfigs-docs/LLM/frank-archon-r9v-radiance-qwen38-q8.md index 0a83acd..775aa10 100644 --- a/serverAppConfigs-docs/LLM/frank-primary-r9v-radiance-qwen38-q8.md +++ b/serverAppConfigs-docs/LLM/frank-archon-r9v-radiance-qwen38-q8.md @@ -1,25 +1,25 @@ --- -title: frank-primary — R9V radiance-vLLM Qwen3.8-Flash-Next Q8_0 -service: frank-primary +title: frank-archon — R9V radiance-vLLM Qwen3.8-Flash-Next Q8_0 +service: frank-archon host: dankserver port: 7770 status: active deployed: 2026-09-27 -supersedes: "[[frank-primary-r9v-radiance-qwen38-uncensored]]" -tags: [llm, frank-primary, r9v, vllm, radiance, gfx1201, q8] +supersedes: "[[frank-archon-r9v-radiance-qwen38-uncensored]]" +tags: [llm, frank-archon, r9v, vllm, radiance, gfx1201, q8] --- -# frank-primary — R9V radiance-vLLM Q8_0 (dankserver, ACTIVE) +# frank-archon — R9V radiance-vLLM Q8_0 (dankserver, ACTIVE) The Dankserver LLM endpoint is the **R9V radiance-vLLM fork** (`drwolfen/radiance-vllm-qwen4exp`, docker-pinned prebuilt image bundle `2dac17a2`) serving the **unsloth Qwen3.8-Flash-Next-GGUF Q8_0** payload (175.30 GiB, 6 GGUF shards, sha256-verified per part) with the blockfp8 MTP4 head and the mmproj, on **both R9700s** (gfx1201, BDFs `0000:03:00.0` -/ `0000:07:00.0`) as `frank-primary` on **:7770**. +/ `0000:07:00.0`) as `frank-archon` on **:7770**. Cut over from the uncensored IQ4_XS payload on 2026-09-27 at Frank's -direction. Rollback target: [[frank-primary-r9v-radiance-qwen38-uncensored]] +direction. Rollback target: [[frank-archon-r9v-radiance-qwen38-uncensored]] — the uncensored state dir (`/home/dank/r9v-state/uncensored/`, `ready: true`), its frozen config (`restore-config-20260927.env`) and payload stay on disk; a rollback is an env-file `R9V_STATE_FILE` flip plus a redeploy. @@ -39,10 +39,10 @@ The repo carries a **thin** wiring; the engine shape lives on-host: | Piece | File | Law | |---|---|---| -| Unit | `scripts/frank-primary.service` | Root unit, `User=dank`, `LimitMEMLOCK=infinity`, `ExecStop=podman stop -t 120 frank-primary-r9v`, `Restart=on-failure` | -| Env | `scripts/frank-primary.env` | Production overrides ONLY: bind 0.0.0.0, :7770, alias `frank-primary`, container `frank-primary-r9v`, GPU BDFs, dev-overlay adapter, `R9V_FULL_MUTABLE_CACHE=0`, `R9V_PLE_READY_TIMEOUT=1800`, prefix caching ON, sharp chat template | -| Serve | `scripts/serve-frank-primary.sh` | Layers setup state under repo env → execs the fork's own `scripts/launch.sh` via the docker→podman shim → `docker wait` | -| Deployer | `scripts/deploy-remote.sh` `deploy_llm_primary` | Gates on setup state ready, image digest, PLE bytes, all six shard files + mmproj; MainPID false-green check | +| Unit | `scripts/frank-archon.service` | Root unit, `User=dank`, `LimitMEMLOCK=infinity`, `ExecStop=podman stop -t 120 frank-archon-r9v`, `Restart=on-failure` | +| Env | `scripts/frank-archon.env` | Production overrides ONLY: bind 0.0.0.0, :7770, alias `frank-archon`, container `frank-archon-r9v`, GPU BDFs, dev-overlay adapter, `R9V_FULL_MUTABLE_CACHE=0`, `R9V_PLE_READY_TIMEOUT=1800`, prefix caching ON, sharp chat template | +| Serve | `scripts/serve-frank-archon.sh` | Layers setup state under repo env → execs the fork's own `scripts/launch.sh` via the docker→podman shim → `docker wait` | +| Deployer | `scripts/deploy-remote.sh` `deploy_llm_archon` | Gates on setup state ready, image digest, PLE bytes, all six shard files + mmproj; MainPID false-green check | **Why the tuned shape lives on-host:** the q8 profile's setup run qualified the `R9V_*` config (tiered-expert placement, per-rank offload @@ -55,7 +55,7 @@ would drift from the qualification — don't. ## Spec decode: MTP4 only — the ngram-mod ask is NOT expressible llama.cpp chains drafter types (`--spec-type draft-mtp,ngram-mod` on -frank-secondary/large). The fork's `speculative_config` is a **single dict** +frank-zealot/large). The fork's `speculative_config` is a **single dict** (one method per engine): `mtp`, `ngram`, `ngram_gpu`, `dflash`, … are mutually exclusive — no chaining seam exists in the fork. What IS active: @@ -67,7 +67,7 @@ mutually exclusive — no chaining seam exists in the fork. What IS active: - `ngram_gpu` exists as an ALTERNATIVE single method (fork's GPU n-gram proposer) — swapping MTP4 for it is an either/or, not a chain. -## Sharp chat template (fleet parity with frank-large) +## Sharp chat template (fleet parity with frank-dragoon) `scripts/qwen-sharp-v22.4.0.jinja` is served via the launcher's opt-in `R9V_CHAT_TEMPLATE_FILE` passthrough (fork commit `30d4a32`): the file is @@ -176,7 +176,7 @@ Laws from the matrix: after a bench teardown; a production boot failed on it the same morning (unit "Deactivated successfully", no error in journal — the serve script exits 0 on the wait). Fixed with `R9V_PLE_READY_TIMEOUT=1800` in - `frank-primary.env` (forwarded by launch.sh `2de0357`). + `frank-archon.env` (forwarded by launch.sh `2de0357`). Prefix caching (E8/E9, `R9V_ENABLE_PREFIX_CACHING=1`, same port): **zero VRAM cost** (hits reuse freed KV blocks; load VRAM identical to E0), @@ -256,7 +256,7 @@ quoting through ssh+zsh layers. ## Ops -- **Restart**: `sudo systemctl restart frank-primary` (root unit; the serve +- **Restart**: `sudo systemctl restart frank-archon` (root unit; the serve script re-gates everything, relaunch through the shim, waits). - **First start after boot** re-warms ~175 GiB of page cache; expect minutes to /health; `TimeoutStartSec=1800`. @@ -266,11 +266,11 @@ quoting through ssh+zsh layers. produces a false-green deploy (the 2026-09-26 lesson, guarded by the MainPID check). - **Rollback to uncensored**: point - `scripts/frank-primary.env` `R9V_STATE_FILE` back at + `scripts/frank-archon.env` `R9V_STATE_FILE` back at `/home/dank/r9v-state/uncensored/setup.json`, drop the two q8-only keys (adapter, FULL_MUTABLE_CACHE) and the template keys, redeploy — the uncensored state dir and payload are intact on disk. -- **Models on the wire**: served alias `frank-primary`; thinking channel +- **Models on the wire**: served alias `frank-archon`; thinking channel is `reasoning` (vLLM); tool parser `qwen3_coder`. ## Known costs (accepted at cutover) diff --git a/serverAppConfigs-docs/LLM/frank-primary-r9v-radiance-qwen38-uncensored.md b/serverAppConfigs-docs/LLM/frank-archon-r9v-radiance-qwen38-uncensored.md similarity index 80% rename from serverAppConfigs-docs/LLM/frank-primary-r9v-radiance-qwen38-uncensored.md rename to serverAppConfigs-docs/LLM/frank-archon-r9v-radiance-qwen38-uncensored.md index dc81d68..e66ebf7 100644 --- a/serverAppConfigs-docs/LLM/frank-primary-r9v-radiance-qwen38-uncensored.md +++ b/serverAppConfigs-docs/LLM/frank-archon-r9v-radiance-qwen38-uncensored.md @@ -1,19 +1,19 @@ --- -title: frank-primary — R9V radiance-vLLM Qwen3.8-Flash-Next-Uncensored IQ4_XS -service: frank-primary +title: frank-archon — R9V radiance-vLLM Qwen3.8-Flash-Next-Uncensored IQ4_XS +service: frank-archon host: dankserver port: 7770 status: retired retired: 2026-09-27 -superseded_by: "[[frank-primary-r9v-radiance-qwen38-q8]]" -supersedes: "[[frank-primary-llamacpp-qwen38-flash-next-q8]]" -tags: [llm, frank-primary, r9v, vllm, radiance, gfx1201, retired] +superseded_by: "[[frank-archon-r9v-radiance-qwen38-q8]]" +supersedes: "[[frank-archon-llamacpp-qwen38-flash-next-q8]]" +tags: [llm, frank-archon, r9v, vllm, radiance, gfx1201, retired] --- -# frank-primary — R9V radiance-vLLM (dankserver, RETIRED) +# frank-archon — R9V radiance-vLLM (dankserver, RETIRED) > **RETIRED 2026-09-27** — superseded the same day by the Q8_0 cutover, -> [[frank-primary-r9v-radiance-qwen38-q8]]. Kept as the rollback runbook: +> [[frank-archon-r9v-radiance-qwen38-q8]]. Kept as the rollback runbook: > the uncensored state dir, frozen config and payload are intact on disk; > the rollback procedure lives in that page's Ops section. @@ -22,11 +22,11 @@ The Dankserver LLM endpoint is the **R9V radiance-vLLM fork** `Dyluhn/Qwen3.8-Flash-Next-Uncensored-R9V-IQ4_XS` — the abliterated Qwen3.8-Flash-Next at IQ4_XS (92.39 GiB, 3 GGUF shards) with the blockfp8 MTP4 head and the F16 mmproj — on **both R9700s** (gfx1201, BDFs -`0000:03:00.0` / `0000:07:00.0`) as `frank-primary` on **:7770**. +`0000:03:00.0` / `0000:07:00.0`) as `frank-archon` on **:7770**. Replaced llama.cpp b11030 (Qwen3.8-Flash-Next Q_8) on 2026-09-27 at Frank's direction; downtime window ~1 h 20 min (killed 02:47, healthy 04:11 PDT). -Rollback target: [[frank-primary-llamacpp-qwen38-flash-next-q8]] — the +Rollback target: [[frank-archon-llamacpp-qwen38-flash-next-q8]] — the llama.cpp trio (unit/env/serve) is at commit `4992e5a`+ (the repo-side wiring; host unit was the relinked one) and the GGUF payload stays on disk, so a rollback is a redeploy. @@ -37,10 +37,10 @@ The repo carries a **thin** wiring; the engine shape lives on-host: | Piece | File | Law | |---|---|---| -| Unit | `scripts/frank-primary.service` | Root unit, `User=dank`, `LimitMEMLOCK=infinity`, `ExecStop=podman stop -t 120 frank-primary-r9v`, `Restart=on-failure` | -| Env | `scripts/frank-primary.env` | Production overrides ONLY: bind 0.0.0.0, :7770, alias `frank-primary`, container `frank-primary-r9v`, GPU BDFs | -| Serve | `scripts/serve-frank-primary.sh` | Layers setup state under repo env → execs the fork's own `scripts/launch.sh` via the docker→podman shim → `docker wait` | -| Deployer | `scripts/deploy-remote.sh` `deploy_llm_primary` | Gates on setup state ready, image digest, PLE bytes, shard files; MainPID false-green check | +| Unit | `scripts/frank-archon.service` | Root unit, `User=dank`, `LimitMEMLOCK=infinity`, `ExecStop=podman stop -t 120 frank-archon-r9v`, `Restart=on-failure` | +| Env | `scripts/frank-archon.env` | Production overrides ONLY: bind 0.0.0.0, :7770, alias `frank-archon`, container `frank-archon-r9v`, GPU BDFs | +| Serve | `scripts/serve-frank-archon.sh` | Layers setup state under repo env → execs the fork's own `scripts/launch.sh` via the docker→podman shim → `docker wait` | +| Deployer | `scripts/deploy-remote.sh` `deploy_llm_archon` | Gates on setup state ready, image digest, PLE bytes, shard files; MainPID false-green check | **Why the tuned shape lives on-host:** the profile's setup run qualified a 104-key `R9V_*` config (tiered-expert placement, per-rank offload budgets @@ -83,7 +83,7 @@ unit. `docker wait` cannot stop the container child, hence `ExecStop`. - First-start doctor battery: **PASS=34 WARN=8 FAIL=0**, including `runtime-worker-transport`: **pinned UVA reads, H2D copies, TP all-reduce verified inside serving workers** on both BDFs. -- Wire: `/v1/models` → `frank-primary`; `/health` + `/metrics` 200 +- Wire: `/v1/models` → `frank-archon`; `/health` + `/metrics` 200 (Prometheus scraping); "Say PONG" (non-thinking) → `'PONG'`, stop; thinking requests populate `reasoning` (vLLM channel). - Memlock: the full tiered-expert load ran to healthy **under a plain dank @@ -107,7 +107,7 @@ unit. `docker wait` cannot stop the container child, hence `ExecStop`. ## Ops -- **Restart**: `sudo systemctl restart frank-primary` (root unit; the serve +- **Restart**: `sudo systemctl restart frank-archon` (root unit; the serve script re-gates everything, relaunch through the shim, waits). - **First start after boot** re-warms ~93 GiB of page cache; expect several minutes to /health; `TimeoutStartSec=1800`. @@ -119,7 +119,7 @@ unit. `docker wait` cannot stop the container child, hence `ExecStop`. - **Qualification artifacts** (kept on-host): `/home/dank/r9v-state/uncensored/qualification-*`, failure bundles `failure-*` (review before sharing — raw logs). -- **Models on the wire**: served alias `frank-primary`; thinking channel is +- **Models on the wire**: served alias `frank-archon`; thinking channel is `reasoning` (vLLM), tool parser `qwen3_coder` (not qwen3_xml like the vllm030 wiring had planned). diff --git a/serverAppConfigs-docs/LLM/frank-primary-radiance-qwen38-native-fp8.md b/serverAppConfigs-docs/LLM/frank-archon-radiance-qwen38-native-fp8.md similarity index 85% rename from serverAppConfigs-docs/LLM/frank-primary-radiance-qwen38-native-fp8.md rename to serverAppConfigs-docs/LLM/frank-archon-radiance-qwen38-native-fp8.md index b1d4040..dfcd375 100644 --- a/serverAppConfigs-docs/LLM/frank-primary-radiance-qwen38-native-fp8.md +++ b/serverAppConfigs-docs/LLM/frank-archon-radiance-qwen38-native-fp8.md @@ -1,4 +1,4 @@ -# frank-primary — Radiance (StillDeadcode), Qwen3.8-Flash-Next-FP8 NATIVE, 2× R9700 TP=2 +# frank-archon — Radiance (StillDeadcode), Qwen3.8-Flash-Next-FP8 NATIVE, 2× R9700 TP=2 **Status: ACTIVE 2026-10-05 →** · **Host:** Dankserver (192.168.0.235) · **Port:** 7770 · **GPU:** 2× Radeon AI PRO R9700 (gfx1201), TP=2 @@ -6,12 +6,12 @@ The FreeToken PR #587 endpoint was replaced by the **radiance engine** (C++/HIP, libr4d kernels for gfx1201, no Python in the serving path) driving the digest-pinned image `stilldeadcode/radiance@sha256:4c3f484564bb2872784e4…` (v1.0.7 line, 287 MiB, `libr4d@0.5.0`) as a plain `podman run` through -`scripts/serve-frank-primary.sh` under the **root systemd unit** -(`frank-primary.service`, `User=dank`, `LimitMEMLOCK=infinity`). Same port, -same served alias (`frank-primary`), same container identity -(`frank-primary` = the unit name). Rollback: git tag -`frank-primary-freetoken-pr587-20261005` (FreeToken trio + Dockerfile), image -`localhost/frank-primary-freetoken:pr587-77a7201`, payload +`scripts/serve-frank-archon.sh` under the **root systemd unit** +(`frank-archon.service`, `User=dank`, `LimitMEMLOCK=infinity`). Same port, +same served alias (`frank-archon`), same container identity +(`frank-archon` = the unit name). Rollback: git tag +`frank-archon-freetoken-pr587-20261005` (FreeToken trio + Dockerfile), image +`localhost/frank-archon-freetoken:pr587-77a7201`, payload `/home/dank/models/Qwen3.8-Flash-Next-Uncensored-FP8`. ## Why radiance @@ -33,14 +33,14 @@ same served alias (`frank-primary`), same container identity - **Raw checkpoint**: `/home/dank/models/Qwen/Qwen3.8-Flash-Next-FP8` (ungated repo, 172.8 GB, 131 shards + index + tokenizer + vision - configs). Fetched by `scripts/download-frank-primary.sh` (vendored + configs). Fetched by `scripts/download-frank-archon.sh` (vendored `hfget.sh`, curl+jq, no HF token needed) and **verified byte-for-byte**: all 131 shards sha256-match the Hub LFS oids (2026-10-05, log `/home/dank/logs/verify-qwen38-official-fp8.log`). - **The container**: `/home/dank/models/rad/qwen4exp-fp8-native.rad` (177,109 MiB measured = 173.0 GiB; floor - `FRANK_PRIMARY_RAD_MIN_MIB=177000` in the env gates a - truncated convert). Built by `scripts/build-frank-primary-rad.sh`: + `FRANK_ARCHON_RAD_MIN_MIB=177000` in the env gates a + truncated convert). Built by `scripts/build-frank-archon-rad.sh`: 1. stage `/home/dank/models/stage-qwen4exp-fp8` — `config.json` with **`quantization_config` dropped** + relative symlinks into the raw checkout; @@ -99,12 +99,12 @@ same served alias (`frank-primary`), same container identity (declare = CPU-side layout queries); add `--device` only if a plugin load ever demands it. -## The shape (`scripts/frank-primary.env`, every value commented there) +## The shape (`scripts/frank-archon.env`, every value commented there) | Knob | Value | Why | |---|---|---| | Image | `stilldeadcode/radiance@sha256:4c3f4845…` | digest-pinned INDEX digest (RepoDigests also carry the per-arch manifest `1c582005…`; the image ID `69d05724…` is the config digest, NOT a manifest digest — pinning it sends `podman run` to the network); entrypoint = engine, tools (`rad-convert`/`rad-info`/`rad-tune`/`rad-kbench`) on PATH | -| Container | `frank-primary` | identity = service name across runtimes; legacy list retires `frank-primary-qwen frank-primary-r9v qwen-fp8 glm-probe` | +| Container | `frank-archon` | identity = service name across runtimes; legacy list retires `frank-archon-qwen frank-archon-r9v qwen-fp8 glm-probe` | | `--tp 2 --tp-wire wht6` | both R9700s | fused WHT-6 lossy wire: +5.6–6.3 % prefill, ~−1.3 % 8-stream decode at TP2; `--tp-wire-min-kb` stays engine default (128 KiB) | | `--max-num-seqs 2` | first boot | Frank: "parallelism = 2 to start". Raise only after a real-traffic look at slot occupancy + the ledger's KV headroom line. The fused all-reduce row count is `seqs × (1 + spec) = 8` | | `--max-model-len 200000` | served window | native 262,144; the publisher's production value and what `models.yml` quotes. Longer prompt = refused, never truncated | @@ -113,7 +113,7 @@ same served alias (`frank-primary`), same container identity | `--kv-cache-dtype fp8` | **7.32 KiB/token** | 12 QSA full-attention layers, 2 KV heads × 256 dim, K+V; a 200K-token sequence is 1.43 GiB. KV is sized from the VRAM the ratio leaves | | `--num-speculative-tokens 3` | MTP head | the checkpoint carries `mtp.*` (3,101 tensors, `mtp_num_hidden_layers: 1`); the plugin's probe returns draft depth 3 — the publisher's operating point | | `--max-num-batched-tokens 2048` | prefill chunk | A/B-verified optimum (1024/2048/4096 ladder, see "Tuning levers") | -| `--prefix-cache-host-mib 4096 --prefix-cache-dir /data/kvcache/frank-primary --prefix-cache-disk-mib 65536` | 3 tiers | host tier pinned (see the ledger), disk tier in `/home/dank/radiance-state` (mounted rw at `/data`; `/` is ext4, mapped-tier-eligible); a session snapshot moves with its blocks | +| `--prefix-cache-host-mib 4096 --prefix-cache-dir /data/kvcache/frank-archon --prefix-cache-disk-mib 65536` | 3 tiers | host tier pinned (see the ledger), disk tier in `/home/dank/radiance-state` (mounted rw at `/data`; `/` is ext4, mapped-tier-eligible); a session snapshot moves with its blocks | | `--ngram-placement ram` | **PLE pinned to host RAM** | Frank's pin law. The PLE n-gram table is 51.2 GB (320,001,536 rows × 160 dims = 29 % of all parameters) served via io_uring reads; `ram` **refuses the boot** if memlock is too small | | `--override-chat-template /templates/template.jinja` | froggeric v22.5 | vendored `scripts/qwen38-froggeric-v22.5.jinja` (28,234 B, `qwen3.8-froggeric-v22.5`); rad-convert bakes the checkpoint's own template, this overrides it, and the engine derives the reasoning/tool-call reply format from it | @@ -122,7 +122,7 @@ same served alias (`frank-primary`), same container identity spare ≈ **134 GiB**. `ttm.pages_limit` (this kernel has NO `pages_max` — the two-knob story was stale) caps GPU-mappable pinned pages (default = half of RAM): the pre-cutover cap was **123 GiB** — BELOW the ledger — so the -serve script's TTM preflight (`FRANK_PRIMARY_TTM_MIN_MIB=140000`) refuses to +serve script's TTM preflight (`FRANK_ARCHON_TTM_MIN_MIB=140000`) refuses to start until it is raised. DONE 2026-10-05 pre-cutover: sysfs write of **52,428,800 pages = 200 GiB** (`/sys/module/ttm/parameters/pages_limit`; verified read-back; raising at runtime is harmless and allocates nothing). @@ -175,16 +175,16 @@ KV from the `0.82`-side remainder of claimed VRAM at 96 MiB headroom. ```bash # one-time (already done 2026-10-05): payload fetch + sha256 verify + convert -ssh dankserver 'bash /home/dank/frank-primary-build/build-frank-primary-rad.sh --plan-only' # declare + plan, no bytes -ssh dankserver 'bash /home/dank/frank-primary-build/build-frank-primary-rad.sh' # full convert + rad-info -./scripts/deploy.sh dankserver --service frank-primary +ssh dankserver 'bash /home/dank/frank-archon-build/build-frank-archon-rad.sh --plan-only' # declare + plan, no bytes +ssh dankserver 'bash /home/dank/frank-archon-build/build-frank-archon-rad.sh' # full convert + rad-info +./scripts/deploy.sh dankserver --service frank-archon ``` Post-cutover checklist (each is observable, not assumed): 1. Unit: `is-active` active, `is-enabled` enabled, container answers `/health` with 200 JSON. -2. Boot ledger (engine stdout → `/home/dank/logs/frank_primary.log`): +2. Boot ledger (engine stdout → `/home/dank/logs/frank_archon.log`): P2P probe per rank pair, TP=2 shard placement, expert pool coverage line ("backs N % of the worst case … M full-length sessions"), KV pool bytes, PLE pinned-RAM line, drafter depth 3, prefix tiers. @@ -194,7 +194,7 @@ Post-cutover checklist (each is observable, not assumed): (tool-call + thinking turn both exercise it). 5. Vision: a ≥256 px solid-color PNG answers the exact color through an `image_url` content part. -6. Prometheus target `frank-primary` green (not never-green). +6. Prometheus target `frank-archon` green (not never-green). ## Cutover measured (2026-10-06, all values observed live) @@ -225,25 +225,25 @@ Post-cutover checklist (each is observable, not assumed): converter's scale-name law, the PLE file-shadow and the symlink-through-raw-index bug are in the payload section above. - Prometheus: `/metrics` answers 200 with vLLM-compatible families - (verified from Dankclaw); the `frank-primary` job needs a + (verified from Dankclaw); the `frank-archon` job needs a prometheus-service deploy to go green (config pushed, reload deferred behind a live parallel writer's dirty tree). ## Tuning levers (in order of likely use) -- **`FRANK_PRIMARY_MAX_SEQS`**: raise 2 → 3/4 only when the ledger's KV +- **`FRANK_ARCHON_MAX_SEQS`**: raise 2 → 3/4 only when the ledger's KV headroom line and real slot occupancy agree; each slot buys a recurrent-state copy (54 MiB/card) and shrinks the per-request KV share. -- **`FRANK_PRIMARY_HOST_POOL_MIB`**: the ledger's coverage line is the +- **`FRANK_ARCHON_HOST_POOL_MIB`**: the ledger's coverage line is the oracle — it prints what the pool backs at the worst case and how many full-length sessions fit. RAM budget: pools + PLE + prefix ≤ ~140 GiB of the host's 246. -- **`FRANK_PRIMARY_EXPERT_VS_CACHE`**: 0.82 is the measured 99 %-hit +- **`FRANK_ARCHON_EXPERT_VS_CACHE`**: 0.82 is the measured 99 %-hit point; 0.87 zeroes it. Move only with a measured hit-rate reason. -- **`FRANK_PRIMARY_TP_WIRE`**: `wht6` vs `exact` — `exact` trades the +- **`FRANK_ARCHON_TP_WIRE`**: `wht6` vs `exact` — `exact` trades the +5.6 % prefill for bit-exact reductions; the fused one-shot forms are declared over the seqs × (1+spec) row bound. -- **`FRANK_PRIMARY_EXTRA_ARGS`**: the boot-ladder escape hatch, expanded +- **`FRANK_ARCHON_EXTRA_ARGS`**: the boot-ladder escape hatch, expanded unquoted. - **`rad-tune -m --tp 2 --num-speculative-tokens 3`**: benchmarks the tunable space at this model's shapes on this machine, writes @@ -252,14 +252,14 @@ Post-cutover checklist (each is observable, not assumed): --num-speculative-tokens 3`), or you measure a program the serve never runs. `$RADIANCE_HOME` is `/opt/radiance/share/radiance` — in the IMAGE — so a `--rm` scratch container's cache dies with it: the serve script - bind-mounts `$FRANK_PRIMARY_STATE_DIR/tune` (`/home/dank/radiance-state/tune`) + bind-mounts `$FRANK_ARCHON_STATE_DIR/tune` (`/home/dank/radiance-state/tune`) at `/opt/radiance/share/radiance/tune`, so the cache (36 GEMM rows, `gfx1201-x3-AMD_Radeon_Graphics.tune`, generated 2026-10-06 in a stopped-service window) survives and is read at every production boot. The two attention requests have no shape recipe (`attn_paged`, `attn_paged_gate_quant` — "see tools/opshapes.h") and are not tuned. `RADIANCE_TUNE` pins a kernel for an A/B — an instrument, not a setting. -- **`FRANK_PRIMARY_MAX_BATCHED_TOKENS` (MNBT)**: A/B'd 2026-10-06 in a +- **`FRANK_ARCHON_MAX_BATCHED_TOKENS` (MNBT)**: A/B'd 2026-10-06 in a stopped-service window (real-text probes: 20,417-token cold prefill, 1,985-token warm prefill, 256-token decode). The prefill ladder is NON-MONOTONIC with an interior optimum at 2048: 1024 → 2048 → 4096 = @@ -274,14 +274,14 @@ Post-cutover checklist (each is observable, not assumed): publisher's `scripts/` harnesses (`fnpf`, `fnconc`, `cstep2`, `ident`, `mctools`) — note `mcserve/fnstop`-family scripts `pkill` the engine binary by name; on this host the service is a systemd unit, so use - `sudo systemctl stop frank-primary` instead. + `sudo systemctl stop frank-archon` instead. ## Rollback | Layer | Path | |---|---| -| FreeToken (one card, native FP8 safetensors) | `git checkout frank-primary-freetoken-pr587-20261005 -- scripts/frank-primary.env scripts/frank-primary.service scripts/serve-frank-primary.sh scripts/docker/ tests/frank_primary_unit.bats` + redeploy; image `localhost/frank-primary-freetoken:pr587-77a7201` and payload `/home/dank/models/Qwen3.8-Flash-Next-Uncensored-FP8` stay on disk until the window closes | -| tcclaviger vLLM fork (TP=2, shape G) | git tag `frank-primary-vllm-shapeG-20261003` (trio + env lore; image still in dank's rootless storage) | +| FreeToken (one card, native FP8 safetensors) | `git checkout frank-archon-freetoken-pr587-20261005 -- scripts/frank-archon.env scripts/frank-archon.service scripts/serve-frank-archon.sh scripts/docker/ tests/frank_archon_unit.bats` + redeploy; image `localhost/frank-archon-freetoken:pr587-77a7201` and payload `/home/dank/models/Qwen3.8-Flash-Next-Uncensored-FP8` stay on disk until the window closes | +| tcclaviger vLLM fork (TP=2, shape G) | git tag `frank-archon-vllm-shapeG-20261003` (trio + env lore; image still in dank's rootless storage) | | 4-bit StillDeadcode publisher shape | `qwen3.8-next-flash-fp8-iq4r-moe.rad` + `--host-pool-mib 12288` — the documented fallback if the native container ever proves unbootable | Retire the FreeToken-era orcarouter payload to `~/.AGENTTRASH/` only after @@ -290,7 +290,7 @@ the rollback window closes (trash policy, never `rm`). ## Links - [[LLM/index]] — fleet index -- [[frank-primary-freetoken-pr587]] — the retired FreeToken era +- [[frank-archon-freetoken-pr587]] — the retired FreeToken era - [[dankserver-qwen38-fp8-expert-offload-tuning]] — the retired tcclaviger vLLM era - [[Dual-R9700-Cooperation]] — the board swap that made TP=2 legal here - [[RDNA4 Container Serving]] — rootless-podman GPU laws on these hosts diff --git a/serverAppConfigs-docs/LLM/frank-primary-radiance-swift15-w4dn8.md b/serverAppConfigs-docs/LLM/frank-archon-radiance-swift15-w4dn8.md similarity index 88% rename from serverAppConfigs-docs/LLM/frank-primary-radiance-swift15-w4dn8.md rename to serverAppConfigs-docs/LLM/frank-archon-radiance-swift15-w4dn8.md index 7041edc..2a32eb9 100644 --- a/serverAppConfigs-docs/LLM/frank-primary-radiance-swift15-w4dn8.md +++ b/serverAppConfigs-docs/LLM/frank-archon-radiance-swift15-w4dn8.md @@ -1,4 +1,4 @@ -# frank-primary — Radiance (StillDeadcode), Swift1.5 Qwen3.8-Flash-Next W4Dn8, 2× R9700 TP=2 +# frank-archon — Radiance (StillDeadcode), Swift1.5 Qwen3.8-Flash-Next W4Dn8, 2× R9700 TP=2 **Status: LIVE — deployed 2026-10-08 (main `3ca64e1`, e2e 33/33).** · **Host:** Dankserver (192.168.0.235) · **Port:** 7770 · **GPU:** 2× Radeon AI PRO R9700 (gfx1201), TP=2 @@ -10,7 +10,7 @@ finetune) converted with the recipe **1.0.13** (`stilldeadcode/radiance@sha256:4c3f484564…` — same digest as the FP8-native era; 1.2.0 was used ONLY for the calibration serve). Same port, alias, container name, systemd unit. Rollback: revert the -`MODEL_FILE` line in `scripts/frank-primary.env` + redeploy — +`MODEL_FILE` line in `scripts/frank-archon.env` + redeploy — `/home/dank/models/rad/qwen4exp-fp8-native.rad` stays on disk (trash policy; 173 GiB, purge when the window closes). @@ -22,7 +22,7 @@ policy; 173 GiB, purge when the window closes). host and VRAM budget for KV and slots at equal-or-better measured decode (gate: ≥ 30.8 t/s vs the 30.08 t/s control). - **Swift 1.5 base**: abliterated finetune of Flash-Next (Frank's - fleet-personality call; frank-large serves the same family). + fleet-personality call; frank-dragoon serves the same family). - **GPTQ closes the precision gap**: RTN alone on BF16 weights lands measurably worse; GPTQ with Hessians from a 10M-token corpus of this model's own distribution recovers most of it, verified end-to-end by a @@ -30,7 +30,7 @@ policy; 173 GiB, purge when the window closes). ## The payload chain -1. **Fetch**: `scripts/download-frank-primary-swift15.sh` → +1. **Fetch**: `scripts/download-frank-archon-swift15.sh` → `/home/dank/models/Swift1.5-Qwen3.8-Flash-Next` (131 shards, 335.3 GiB, per-shard LFS sha256 verified, no token on the command line). 48 layers, 512 experts (top-10 routed), moe_inter 640, hidden 2560, @@ -95,7 +95,7 @@ policy; 173 GiB, purge when the window closes). | PLE n-gram table | fp8 at the checkpoint's fixed scale 1.9931793212890625e-04 | the fixed-scale law; absmax audit passed the 2⁻¹³..2⁻¹⁰ plateau | | embeddings, vision tower, QSA indexer | **bf16 passthrough** | untouched | -## The shape (`scripts/frank-primary.env`) +## The shape (`scripts/frank-archon.env`) Unchanged from the FP8-native era: TP=2 + `wht6`, `--max-num-seqs 3`, `--max-model-len 200000`, MNBT 2048 (the MTP resonance law — 2560 @@ -103,7 +103,7 @@ collapses decode to 2.6–7.7 t/s), fp8 KV, `expert_tiered` host pool 40960 (the load-bearing floor), `--ngram-placement ram`, froggeric v22.5 template override. `MODEL_FILE` points at `/home/dank/models/rad/qwen4exp-swift15-w4dn8-i8-hc8m.rad` (**116,416 -MiB measured**); the serve size floor `FRANK_PRIMARY_RAD_MIN_MIB` moves +MiB measured**); the serve size floor `FRANK_ARCHON_RAD_MIN_MIB` moves 177000 → **110000**. ## Gates (measured at cutover) @@ -149,8 +149,8 @@ MiB measured**); the serve size floor `FRANK_PRIMARY_RAD_MIN_MIB` moves budget and `content` comes back empty (the answer lands in the reasoning channel). - **Deployed verification (2026-10-08)**: `deploy.sh dankserver - --service frank-primary` green incl. Playwright e2e 33/33; unit - `active`, `/health` 200, `/v1/models` id `frank-primary` (the harness + --service frank-archon` green incl. Playwright e2e 33/33; unit + `active`, `/health` 200, `/v1/models` id `frank-archon` (the harness alias is the served-model-name, independent of the file — models.yml untouched). Deployed shape: fp8 KV (KLD-gate shape), spec depth 2, seqs 3, vram pair 26071/3543. Boot ledger: KV pool 3.46 GiB, expert @@ -159,23 +159,23 @@ MiB measured**); the serve size floor `FRANK_PRIMARY_RAD_MIN_MIB` moves ### Wire rename + the bench drop-in trap (2026-10-09) -`FRANK_PRIMARY_SERVED_NAME` moved `frank-primary` → **frank-archon**; the +`FRANK_ARCHON_SERVED_NAME` moved `frank-archon` → **frank-archon**; the service, unit, scripts and env file keep the old name. Radiance is the only fleet engine whose `/v1/models` listing reflects the flag, and it echoes the **requested** model name in chat responses — so a chat probe that returns 200 proves nothing about the served id. Always read `/v1/models`. The first deploy after the edit came up green and `/v1/models` still said -`frank-primary`. Cause: a campaign leftover drop-in -`/etc/systemd/system/frank-primary.service.d/bench.conf` (2026-10-08 04:09) -overrode BOTH `Environment=FRANK_PRIMARY_ENV_FILE` and `ExecStart` to the +`frank-archon`. Cause: a campaign leftover drop-in +`/etc/systemd/system/frank-archon.service.d/bench.conf` (2026-10-08 04:09) +overrode BOTH `Environment=FRANK_ARCHON_ENV_FILE` and `ExecStart` to the staging worktree `/home/dank/serverAppConfigs-swift15`. Every -`deploy.sh dankserver --service frank-primary` since then restarted the +`deploy.sh dankserver --service frank-archon` since then restarted the staging tree: green health gate, old configuration, silently. Verified before -removing: the staging `serve-frank-primary.sh` and `frank-primary.service` -are byte-identical to the checkout, its `frank-primary.env` differed only by +removing: the staging `serve-frank-archon.sh` and `frank-archon.service` +are byte-identical to the checkout, its `frank-archon.env` differed only by the alias line, and its HEAD (`8375567`) is an ancestor of `main`. The -drop-in is staged in `/home/dank/.AGENTTRASH/20261009-frank-primary-bench-dropin/`. +drop-in is staged in `/home/dank/.AGENTTRASH/20261009-frank-archon-bench-dropin/`. After `daemon-reload` + restart, `/v1/models` reports `frank-archon` (boot healthy in 102 s, shape unchanged: fp8 KV, spec depth 2, seqs 3, vram pair 26071/3543). @@ -190,9 +190,9 @@ run. After an LLM deploy, verify the served configuration behaviourally ## Deploy + verify ```bash -sudo systemctl stop frank-primary # drained window +sudo systemctl stop frank-archon # drained window bash convert-swift15-w4dn8.sh # if not already run -./scripts/deploy.sh dankserver --service frank-primary +./scripts/deploy.sh dankserver --service frank-archon ``` Post-cutover checklist: unit active/enabled; `/health` 200; boot ledger @@ -206,9 +206,9 @@ probe; `reasoning_effort` fold; Prometheus target green; `tests/run.sh` | Layer | Path | |---|---| -| FP8-native radiance (immediate) | revert `MODEL_FILE` in `scripts/frank-primary.env` + redeploy; `qwen4exp-fp8-native.rad` (173.0 GiB) on disk | -| FreeToken PR #587 | git tag `frank-primary-freetoken-pr587-20261005` | -| tcclaviger vLLM shape G | git tag `frank-primary-vllm-shapeG-20261003` | +| FP8-native radiance (immediate) | revert `MODEL_FILE` in `scripts/frank-archon.env` + redeploy; `qwen4exp-fp8-native.rad` (173.0 GiB) on disk | +| FreeToken PR #587 | git tag `frank-archon-freetoken-pr587-20261005` | +| tcclaviger vLLM shape G | git tag `frank-archon-vllm-shapeG-20261003` | Campaign artifacts on disk: BF16 checkpoint (335 GiB), `kld-ref` (24 GiB), grams (`/home/dank/corpora/calib`), corpora JSONL, logs @@ -218,7 +218,7 @@ re-convert source if the window ever reopens. ## Links -- [[frank-primary-radiance-qwen38-native-fp8]] — the replaced FP8-native era +- [[frank-archon-radiance-qwen38-native-fp8]] — the replaced FP8-native era - [[LLM/index]] — fleet index - [[swift15-campaign-worklog]] — campaign record - [[Dual-R9700-Cooperation]] — the board swap that made TP=2 legal here diff --git a/serverAppConfigs-docs/LLM/frank-large-benchmark.md b/serverAppConfigs-docs/LLM/frank-dragoon-benchmark.md similarity index 97% rename from serverAppConfigs-docs/LLM/frank-large-benchmark.md rename to serverAppConfigs-docs/LLM/frank-dragoon-benchmark.md index 18ed368..08e54d0 100644 --- a/serverAppConfigs-docs/LLM/frank-large-benchmark.md +++ b/serverAppConfigs-docs/LLM/frank-dragoon-benchmark.md @@ -1,6 +1,6 @@ --- type: reference -description: "This page records the benchmarks that chose the runtime for `frank-large` on Dankclaw." +description: "This page records the benchmarks that chose the runtime for `frank-dragoon` on Dankclaw." tags: - llm - frank @@ -11,10 +11,10 @@ timestamp: 2026-09-03 > See [frank-redo-2026-08-17.md](frank-redo-2026-08-17.md) and > [deployment.md](deployment.md) for the active configuration. -# frank-large — Backend and Spec Benchmark +# frank-dragoon — Backend and Spec Benchmark This page records the benchmarks that chose the runtime for -`frank-large` on Dankclaw. Every number came from the live +`frank-dragoon` on Dankclaw. Every number came from the live llama.cpp build on that machine (upstream, b10133+). ## Summary diff --git a/serverAppConfigs-docs/LLM/frank-dragoon-ciru-orca.md b/serverAppConfigs-docs/LLM/frank-dragoon-ciru-orca.md new file mode 100644 index 0000000..d76bf10 --- /dev/null +++ b/serverAppConfigs-docs/LLM/frank-dragoon-ciru-orca.md @@ -0,0 +1,16 @@ +--- +type: reference +title: "CIRU v4.4.1 Orca on Dankclaw (frank-dragoon)" +description: "The retired frank-dragoon runbook (2026-09-19 to 2026-09-21, rollback target) — CIRU v4.4.1 (QSA window hotfix) serving jcbtc/Qwen3.8-Flash-CIRU-STRIX-Orca on the Dankclaw Strix Halo iGPU: the private host build, the runtime gate, the payload, the deployed config, MTP and PLE, the client contract, and the failure modes worth knowing." +tags: + - llm + - ciru + - dankclaw + - frank-dragoon + - strix-halo + - gfx1151 + - qwen4exp + - rocm + - mtp +timestamp: 2026-09-19 +--- diff --git a/serverAppConfigs-docs/LLM/frank-large-flash-server-v2-swift15.md b/serverAppConfigs-docs/LLM/frank-dragoon-flash-server-v2-swift15.md similarity index 91% rename from serverAppConfigs-docs/LLM/frank-large-flash-server-v2-swift15.md rename to serverAppConfigs-docs/LLM/frank-dragoon-flash-server-v2-swift15.md index a029108..5f4348a 100644 --- a/serverAppConfigs-docs/LLM/frank-large-flash-server-v2-swift15.md +++ b/serverAppConfigs-docs/LLM/frank-dragoon-flash-server-v2-swift15.md @@ -1,14 +1,14 @@ -# frank-large — halogen-flash-server 0.16.2, Qwen3.8-Flash-Next v2 Swift1.5 ABLITERATED (Dankclaw, Strix Halo iGPU) +# frank-dragoon — halogen-flash-server 0.16.2, Qwen3.8-Flash-Next v2 Swift1.5 ABLITERATED (Dankclaw, Strix Halo iGPU) **ACTIVE since 2026-10-06.** Rollback = revert the swap commit's trio -(`scripts/frank-large.env`, `scripts/serve-frank-large.sh`, -`scripts/frank-large.service`); the retired 27B payload stays on disk at +(`scripts/frank-dragoon.env`, `scripts/serve-frank-dragoon.sh`, +`scripts/frank-dragoon.service`); the retired 27B payload stays on disk at `/home/dank/models/halogen-qwen3.8-27b/` and its fetch script -(`scripts/download-frank-large-halogen.sh`) stays in the repo. +(`scripts/download-frank-dragoon-halogen.sh`) stays in the repo. ## Why this shape exists -Frank's ask: replace the frank-large model with +Frank's ask: replace the frank-dragoon model with `https://huggingface.co/Quat3rnion/halogen-swift1.5-qwen3.8-flash-next-v2-abliterated`. That payload is an **abliterated Swift1.5 finetune of peonist's Qwen3.8-Flash-Next v2 checkpoint in the v2 `.hgn` format** — a file that @@ -70,13 +70,13 @@ Payload notes worth keeping: dangle inside the container mount; both the serve gate and the deployer refuse them). -Fetch: `scripts/download-frank-large-flashnext.sh` (`--verify-only` to +Fetch: `scripts/download-frank-dragoon-flashnext.sh` (`--verify-only` to re-check; `-f` + exact byte counts + LFS sha256 + resolve-the-CDN-then-`-C -` resume law throughout; no token — the repos are public). ## Shape — the knobs that are not free -`scripts/frank-large.env` carries the full rationale inline; the table: +`scripts/frank-dragoon.env` carries the full rationale inline; the table: | Env | Value | Why | |---|---|---| @@ -88,7 +88,7 @@ resume law throughout; no token — the repos are public). | `HALOGEN_MAX_TOK` / `HALOGEN_MAX_TOKENS_CAP` / `HALOGEN_QUEUE_TIMEOUT` | 8192 / 65536 / 7200 | 8192 is only the per-request DEFAULT (the harness sends at most its `maxTokens` 45,056); the cap/timeout pair is COUPLED per FLAGS.md (65536 at ~10 t/s serial needs > 6550 s) | | `HALOGEN_TEMPERATURE` / `TOP_P` / `TOP_K` | 1.0 / 0.95 / 20 | the card's thinking recipe as SERVER-SIDE defaults — the engine HAS a sampler now, so an absent temperature is no longer greedy; models.yml extraBody matches it (consistent, not load-bearing) | | `HALOGEN_WEIGHTS_LOCK` | 1 | card's belt-and-braces; the engine pins weights by default on v2 (`HALOGEN_FLASH_PIN_TRUNK=0` is a w4b-only knob and is REFUSED by v2) | -| `HALOGEN_MODEL_ID` / publish | **frank-dragoon** / 7770:8731 | served id renamed 2026-10-09 (service/unit/env keep `frank-large`); engine port 8730 never published | +| `HALOGEN_MODEL_ID` / publish | **frank-dragoon** / 7770:8731 | served id renamed 2026-10-09 (service/unit/env keep `frank-dragoon`); engine port 8730 never published | | MTP depth | default 2 | FLAGS.md: 2 is best all-round, 3 for code — Frank's traffic is agent/prose | **Memory ledger** (121.2 GiB unified, the referee is the boot ledger): @@ -112,7 +112,7 @@ instead of ~88 s cold — the big-TTFT win the 27B engine needed a manual outside `xhigh|medium|low` — the models.yml fold (high→xhigh) stays mandatory. - Vision: OpenAI `image_url` content parts only (the fleet's standard - contract; the legacy top-level `images` field is the frank-secondary trap). + contract; the legacy top-level `images` field is the frank-zealot trap). ≥256 px probe images or the model answers "video". - `HALOGEN_MAX_TOKENS_CAP` over-cap is a 400 naming the limit — never a truncation. `max_tokens` INCLUDES thinking. @@ -133,12 +133,12 @@ the 27B engine ran on. Only revisit if the ledger shows SVM complaints. ## Mechanics -- **Root systemd unit** (`scripts/frank-large.service`, `User=dank`, +- **Root systemd unit** (`scripts/frank-dragoon.service`, `User=dank`, `LimitMEMLOCK=infinity`, `Restart=always`, `ExecStop=podman stop -t 60 - frank-large-halogen`), driven by `scripts/serve-frank-large.sh` — the + frank-dragoon-halogen`), driven by `scripts/serve-frank-dragoon.sh` — the fleet's `podman run`-direct pattern. The script runs the container FOREGROUND so the boot ledger (weights resident, pool fit, MTP head, - prompt cache, any clamp) lands in `/home/dank/logs/frank_large.log`. + prompt cache, any clamp) lands in `/home/dank/logs/frank_dragoon.log`. - Serve gates mirror the deployer EXACTLY (2026-10-01 crash-loop law): image digest in podman storage, byte-exact checkpoint + n-gram table + vision tower, flat tokenizer with all six files as regular files, @@ -151,7 +151,7 @@ the 27B engine ran on. Only revisit if the ledger shows SVM complaints. gate) until the RAM clears; the 2026-10-06 cutover hit this (8 boots, MemAvailable 74.77 GiB vs the 78.11 GiB needed, self-resolved in ~2 min when the dying 27B engine freed RAM). The serve script now checks - `MemAvailable` BEFORE `podman run` and WAITS up to `FRANK_LARGE_RAM_WAIT` + `MemAvailable` BEFORE `podman run` and WAITS up to `FRANK_DRAGOON_RAM_WAIT` (default 600 s) for the RAM to clear, so a transient dip boots once instead of crash-looping; if it never clears it refuses loudly. The 16 GiB floor is the engine's (not `HALOGEN_HOST_RESERVE_GIB=20` — a @@ -162,7 +162,7 @@ the 27B engine ran on. Only revisit if the ledger shows SVM complaints. ## Verification checklist (run after any redeploy) -1. Boot ledger greps in `/home/dank/logs/frank_large.log`: resident +1. Boot ledger greps in `/home/dank/logs/frank_dragoon.log`: resident weights (~62 GiB), KV pool line, MTP/drafter line, prompt-cache line, **no clamp named**. 2. `curl http://192.168.0.143:7770/health` → 200. @@ -183,7 +183,7 @@ BELOW the 262,144 engine ceiling: the 45k gap absorbs the harness's `maxTokens: 45056`, `input: [text, image]`, `reasoningContentField: "reasoning_content"`, the `high→xhigh` effort fold, `extraBody` temperature 1.0 / top_p 0.95. Compaction still rides -frank-secondary (the `compactionModel` steering is unchanged; the input +frank-zealot (the `compactionModel` steering is unchanged; the input ≈ 170k fits its 200,704 slot). ## Rollback diff --git a/serverAppConfigs-docs/LLM/frank-large-gufo-qwen38-27b.md b/serverAppConfigs-docs/LLM/frank-dragoon-gufo-qwen38-27b.md similarity index 87% rename from serverAppConfigs-docs/LLM/frank-large-gufo-qwen38-27b.md rename to serverAppConfigs-docs/LLM/frank-dragoon-gufo-qwen38-27b.md index b509400..27198be 100644 --- a/serverAppConfigs-docs/LLM/frank-large-gufo-qwen38-27b.md +++ b/serverAppConfigs-docs/LLM/frank-dragoon-gufo-qwen38-27b.md @@ -1,13 +1,13 @@ --- type: reference -title: "gufo, Qwen3.8-27B UD-Q4_K_XL (DFlash2) on Dankclaw (frank-large)" -description: "The RETIRED frank-large runbook (rollback target) — gufo (gufo-org/gufo) v0.1.1, the Strix Halo inference engine, built from source on Dankclaw and serving unsloth/Qwen3.8-27B-GGUF UD-Q4_K_XL (vanilla) with the z-lab DFlash2 Q4_K_M drafter on the gfx1151 iGPU, ONE session at the full native 262,144 window with unquantized f16 KV: the from-source build and its two host workarounds, the GGUF header evidence, why the fleet's Qwen-Sharp chat template CANNOT be used on this runtime, the client-contract delta, the measured prefill/decode trade, and the failure modes worth knowing." +title: "gufo, Qwen3.8-27B UD-Q4_K_XL (DFlash2) on Dankclaw (frank-dragoon)" +description: "The RETIRED frank-dragoon runbook (rollback target) — gufo (gufo-org/gufo) v0.1.1, the Strix Halo inference engine, built from source on Dankclaw and serving unsloth/Qwen3.8-27B-GGUF UD-Q4_K_XL (vanilla) with the z-lab DFlash2 Q4_K_M drafter on the gfx1151 iGPU, ONE session at the full native 262,144 window with unquantized f16 KV: the from-source build and its two host workarounds, the GGUF header evidence, why the fleet's Qwen-Sharp chat template CANNOT be used on this runtime, the client-contract delta, the measured prefill/decode trade, and the failure modes worth knowing." tags: - llm - gufo - swift-1.5 - dankclaw - - frank-large + - frank-dragoon - strix-halo - gfx1151 - q8 @@ -16,12 +16,12 @@ tags: timestamp: 2026-09-28 --- -# frank-large — gufo, Qwen3.8-27B (UD-Q4_K_XL, DFlash2) +# frank-dragoon — gufo, Qwen3.8-27B (UD-Q4_K_XL, DFlash2) > **RETIRED 2026-10-02 — the rollback target.** Superseded by -> [[frank-large-rocmfpx-q8agent-mtp]] (Q8_0_ROCMFPX_AGENT at 8.39 bpw with +> [[frank-dragoon-rocmfpx-q8agent-mtp]] (Q8_0_ROCMFPX_AGENT at 8.39 bpw with > MTP4, 17.0 t/s measured). This era was itself a return after one day of -> [[frank-large-vllm-mimo-v26-bf16]] (battery decode 6.19-9.01 t/s; every +> [[frank-dragoon-vllm-mimo-v26-bf16]] (battery decode 6.19-9.01 t/s; every > ≥6-bit vLLM quant path dead on gfx1151). The shape > moved on the way back: payload is now **unsloth/Qwen3.8-27B-GGUF > UD-Q4_K_XL** (16.35 GiB, vanilla — the abliterated Swift Q8 was @@ -30,10 +30,10 @@ timestamp: 2026-09-28 > Swift-1.5 Q8 history below is retained for the engine/template law, > which still governs. > **Originally ACTIVE 2026-09-28.** Replaces -> [[frank-large-unsloth-qwen38-27b-q8xl]] (stock llama.cpp, the unsloth +> [[frank-dragoon-unsloth-qwen38-27b-q8xl]] (stock llama.cpp, the unsloth > b11030 prebuilt), which had replaced -> [[frank-large-kairic-edge-qwen38-27b]]. Same host, same port (7770), same -> alias (`frank-large`). +> [[frank-dragoon-kairic-edge-qwen38-27b]]. Same host, same port (7770), same +> alias (`frank-dragoon`). > > **The payload also changed on 2026-09-28**, later the same day: the target > went from `unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL` to @@ -44,16 +44,16 @@ timestamp: 2026-09-28 ## Identity -- **Endpoint:** `frank-large` at `192.168.0.143:7770` (Dankclaw). +- **Endpoint:** `frank-dragoon` at `192.168.0.143:7770` (Dankclaw). - **Runtime:** [gufo](https://github.com/gufo-org/gufo) — "the Strix Halo inference engine", a vertical engine built for exactly this hardware (Ryzen AI MAX+ 395 / Radeon 8060S, `gfx1151`, unified memory). Pinned at **v0.1.1** (commit `b0f8673`), built from source on the host to `/home/dank/GitPackages/gufo-v0.1.1/`. -- **Service shape:** root systemd unit `scripts/frank-large.service` +- **Service shape:** root systemd unit `scripts/frank-dragoon.service` (`User=dank`, `LimitMEMLOCK=infinity`), launched by - `scripts/serve-frank-large.sh` with tunables from - `scripts/frank-large.env`. + `scripts/serve-frank-dragoon.sh` with tunables from + `scripts/frank-dragoon.env`. gufo ships **no prebuilt Linux binaries** (the v0.1.0/v0.1.1 release assets are empty) and no Nix on this host, so the runtime is a source build. It is @@ -77,7 +77,7 @@ gufo's own measurement of the two engines on the same Qwen3.8-27B targets Read that honestly: **prefill, load time and short-context decode improve; deep-context decode on the 8-bit target gets worse.** The crossover on Q8 is -around 32k of cached depth. frank-large runs one 262,144-token conversation, +around 32k of cached depth. frank-dragoon runs one 262,144-token conversation, so a long agent session spends its life on the losing side of that line while a short turn wins. The Q4_K_XL target does not show the regression (gufo is +11.7 % to +17.0 % at every depth) — that is the honest reason to @@ -116,7 +116,7 @@ architecture, driver and queue budget. - **Model:** `ajgazin/Swift-1.5-Qwen3.8-27B-Uncensored-Dynamic-MTP-GGUF`, file `UD-Q8_K_XL` — 27B dense, 31,457,990,272 bytes, fetched and sha256-verified (`9076f99a…`, the Hub LFS oid) by - `scripts/download-frank-large-swift.sh`. It is an **abliterated + `scripts/download-frank-dragoon-swift.sh`. It is an **abliterated (uncensored)** fine-tune of Qwen3.8-27B. The repository also publishes an `mmproj-BF16.gguf`, which is **not** used: this endpoint is text-only. - **Licence:** the repo declares `other` — the **SWIFT OPEN LICENSE 1.0**, @@ -160,7 +160,7 @@ were confirmed against gufo's source rather than assumed: from `MODEL_DIR` and why the deployer's stray-run sweep keys on the drafter's filename rather than the target's. - **Sampling:** greedy (`--temperature 0`) server-side, as every prior - frank-large served. The harness overrides per request via `extraBody` + frank-dragoon served. The harness overrides per request via `extraBody` (1.0 / 0.95 / top-k 20). - **Memory:** gufo's own table puts the 8-bit target at **50.58 GiB** peak with context capacity 262,144, against the iGPU's ~114 GiB GTT aperture. @@ -227,8 +227,8 @@ tokens or `inter_token` is first-token noise. ## The template law: Qwen-Sharp is gone `scripts/qwen-sharp-v22.4.0.jinja` is the fleet's chat template — it is -wired into `frank-primary` as `R9V_CHAT_TEMPLATE_FILE` and it was -`frank-large`'s `--chat-template-file` under llama.cpp. **frank-large can no +wired into `frank-archon` as `R9V_CHAT_TEMPLATE_FILE` and it was +`frank-dragoon`'s `--chat-template-file` under llama.cpp. **frank-dragoon can no longer use it**, and the reason is stronger than "gufo lacks the flag": > gufo has **no Jinja engine at all.** `src/models/qwen/chat_template.cpp` @@ -265,7 +265,7 @@ second is the same class of change that produced the 2026-09-21 ## Client contract — what actually changed -Everything the fleet depended on still holds: port 7770, alias `frank-large`, +Everything the fleet depended on still holds: port 7770, alias `frank-dragoon`, `reasoning_content`, `tool_calls`, streaming SSE, and text-only (gufo auto-discovers a `mmproj` beside the model; this payload has none). @@ -300,9 +300,9 @@ The differences worth knowing: ## Failure modes worth knowing - **A missing runtime is a deploy error, not a restart loop.** The handler - gates on `LLM_LARGE_RUNTIME` *before* it stops anything, and the serve + gates on `LLM_DRAGOON_RUNTIME` *before* it stops anything, and the serve script exits with a `build-gufo.sh` pointer rather than exec'ing. -- **Host memory is the ceiling, and it is shared.** frank-large and ComfyUI +- **Host memory is the ceiling, and it is shared.** frank-dragoon and ComfyUI both hold gfx1151 compute queues. gufo reads `/sys/class/kfd/kfd/proc/*/queues/*/type` and caps itself (`GPU_MAX_HW_QUEUES`, 2 resident for `serve llm`) so a full device @@ -321,13 +321,13 @@ The differences worth knowing: Two independent rollbacks, because two things changed on 2026-09-28: -1. **Payload only** — repoint `MODEL_FILE` in `scripts/frank-large.env` at +1. **Payload only** — repoint `MODEL_FILE` in `scripts/frank-dragoon.env` at `/home/dank/models/Qwen3.8-27B-UD-Q8_K_XL/Qwen3.8-27B-UD-Q8_K_XL.gguf` and redeploy. **The 29.3 GiB target was reclaimed on 2026-09-28**, so this - path now needs a re-fetch first: `scripts/download-frank-large.sh`, then + path now needs a re-fetch first: `scripts/download-frank-dragoon.sh`, then the env edit. The DFlash2 drafter was never touched and still lives in that directory. -2. **Engine** — [[frank-large-unsloth-qwen38-27b-q8xl]]: the unsloth b11030 +2. **Engine** — [[frank-dragoon-unsloth-qwen38-27b-q8xl]]: the unsloth b11030 prebuilt is still at `/home/dank/GitPackages/unsloth-llama-b11030/`. Revert `RUNTIME_DIR` and the gufo-only tunables, restore the serve script's llama.cpp command, and redeploy. This is also the only way to @@ -343,8 +343,8 @@ Two independent rollbacks, because two things changed on 2026-09-28: - GGUF header evidence for the payload swap: both files' headers were parsed and diffed directly (architecture, all 866 tensor names in order, per-tensor `ggml_type` and dims) before either was loaded -- Build: `scripts/build-gufo.sh`; serve: `scripts/serve-frank-large.sh`; - tunables: `scripts/frank-large.env` -- Payload: `scripts/download-frank-large-swift.sh` (target), - `scripts/download-frank-large.sh` (DFlash2 drafter) -- Predecessor: [[frank-large-unsloth-qwen38-27b-q8xl]] +- Build: `scripts/build-gufo.sh`; serve: `scripts/serve-frank-dragoon.sh`; + tunables: `scripts/frank-dragoon.env` +- Payload: `scripts/download-frank-dragoon-swift.sh` (target), + `scripts/download-frank-dragoon.sh` (DFlash2 drafter) +- Predecessor: [[frank-dragoon-unsloth-qwen38-27b-q8xl]] diff --git a/serverAppConfigs-docs/LLM/frank-large-halogen27b-dflash2.md b/serverAppConfigs-docs/LLM/frank-dragoon-halogen27b-dflash2.md similarity index 88% rename from serverAppConfigs-docs/LLM/frank-large-halogen27b-dflash2.md rename to serverAppConfigs-docs/LLM/frank-dragoon-halogen27b-dflash2.md index 08fd65a..577e23e 100644 --- a/serverAppConfigs-docs/LLM/frank-large-halogen27b-dflash2.md +++ b/serverAppConfigs-docs/LLM/frank-dragoon-halogen27b-dflash2.md @@ -1,14 +1,14 @@ -# frank-large — halogen container, Qwen3.8-27B + DFlash2 (Dankclaw, ACTIVE 2026-10-05) +# frank-dragoon — halogen container, Qwen3.8-27B + DFlash2 (Dankclaw, ACTIVE 2026-10-05) -frank-large is the Strix Halo iGPU endpoint on Dankclaw (`:7770`). Since +frank-dragoon is the Strix Halo iGPU endpoint on Dankclaw (`:7770`). Since 2026-10-05 it runs the **halogen** engine — `ghcr.io/peonist-ai/halogen` at a -pinned digest, launched by `scripts/serve-frank-large.sh` under a root +pinned digest, launched by `scripts/serve-frank-dragoon.sh` under a root systemd unit as a podman container — serving **`peonist-ai/halogen-qwen3.8-27b`** (`qwen3.8-27b-p1w4d-d2.hgn`, 35,865,565,184 B ≈ 33.4 GiB, sha256 `274c3fc7…`, 1352 tensors) with the **DFlash2** drafter at **one slot x 200,700 ctx**. -It replaced the ROCmFPX llama.cpp fork endpoint ([[frank-large-rocmfpx-q6agent-uncensored-mtp]]), +It replaced the ROCmFPX llama.cpp fork endpoint ([[frank-dragoon-rocmfpx-q6agent-uncensored-mtp]]), which remains the rollback target with its payload on disk. ## Why swap @@ -25,21 +25,21 @@ confirmed by Frank before deploy: 1. **Text-only.** halogen loads the language tower only; README "honest limits": *"The vision encoder is ignored; image inputs are not supported."* - The mmproj-era vision role moves wholly to frank-secondary. + The mmproj-era vision role moves wholly to frank-zealot. 2. **Censored base.** The checkpoint is a finetune of the censored `Qwen/Qwen3.8-27B` base, built to make its DFlash2 head strong. The ROCmFPX AGENT file was an *Uncensored* build; refusals can return. ## Shape and why -`scripts/frank-large.env` carries every tunable with its evidence; the load- +`scripts/frank-dragoon.env` carries every tunable with its evidence; the load- bearing numbers: - **`HALOGEN_KV_SLOTS=1` + `HALOGEN_DRAFTER=2`** — the engine offers batch OR speculation, never both (FLAGS.md: "Batching and speculation are exclusive: a step batches when more than one conversation is running, so the drafter stays off with more than one slot"). Slots>1 silently loses DFlash2; the - sibling halogen engine measured 41 -> 14 t/s when slots went up. frank-large + sibling halogen engine measured 41 -> 14 t/s when slots went up. frank-dragoon was a one-conversation endpoint before (PARALLEL=1), so the contract holds. - **`HALOGEN_SLOT_CTX=200700`** — the per-conversation HARD ceiling: a longer prompt is a 400 naming the limit, never a truncation. The harness side is @@ -83,7 +83,7 @@ bearing numbers: |thinking field|`reasoning_content` (same as before)| |`reasoning_effort`|same Qwen3.8 template; outside {xhigh,medium,low} rejected — models.yml fold stays; unset defaults to xhigh, `none` disables thinking| |tools|server-side tool calls advertised — round-trip MUST be re-probed after deploy| -|image input|ignored/error — route to frank-secondary| +|image input|ignored/error — route to frank-zealot| ## Deploy mechanics @@ -91,7 +91,7 @@ bearing numbers: (published tag 0.1.4). The deployer gates the exact digest exists in podman storage before dispatch. NOT the 2026-09 `halogen-flash-server` repo — that was the Flash-Next w4b era, different image, retired. -- **Payload:** `scripts/download-frank-large-halogen.sh` (fetch law: `curl -f`, +- **Payload:** `scripts/download-frank-dragoon-halogen.sh` (fetch law: `curl -f`, exact byte count, LFS sha256 where the Hub publishes one, `--verify-only`, token never in argv) into `/home/dank/models/halogen-qwen3.8-27b/`. The tokenizer is a FLAT DIRECTORY (`tokenizer/`, 5 files — tokenizer.json, @@ -101,20 +101,20 @@ bearing numbers: docker-run parity). The deployer and serve script refuse a missing file or ANY symlink: an HF cache snapshot symlinks each entry into `blobs/` and those links dangle inside the container mount. -- **Unit:** `scripts/frank-large.service` (root, `User=dank`, relinked into +- **Unit:** `scripts/frank-dragoon.service` (root, `User=dank`, relinked into `/etc/systemd/system/`), `ExecStart` = serve script, `ExecStop` = `podman - stop -t 120 frank-large-halogen`, script runs `podman run` FOREGROUND + stop -t 120 frank-dragoon-halogen`, script runs `podman run` FOREGROUND (2026-10-06: the 2026-10-05 `-d` + `exec podman wait` shape captured only the container ID — the engine ledger existed nowhere on disk and the post-deploy grep below read a one-line hex file; foreground run returns the container's exit code so `Restart=always` is real and the ledger lands in the log). Engine stdout goes to - `/home/dank/logs/frank_large.log` (the boot ledger lives there, not in + `/home/dank/logs/frank_dragoon.log` (the boot ledger lives there, not in the journal). -- **Cutover:** `deploy_llm_large` in `scripts/deploy-remote.sh` sweeps the +- **Cutover:** `deploy_llm_dragoon` in `scripts/deploy-remote.sh` sweeps the legacy bare `llama-server --model /home/dank/models/kingjones-*` process and - the legacy `frank-large` container name by NAME (never `pkill -f - llama-server` — that hits frank-secondary), retires the old quadlet if the 2026-09 + the legacy `frank-dragoon` container name by NAME (never `pkill -f + llama-server` — that hits frank-zealot), retires the old quadlet if the 2026-09 halogen era's unit lingers, waits port 7770 free, relinks, health-gates. - **Bench law:** stop+mask the unit before any GPU experiment on this box (AGENTS.md); `/health` answers 503 while the 33.4 GiB payload loads — that @@ -122,7 +122,7 @@ bearing numbers: ## Verification (post-deploy checklist) -1. `grep -iE 'clamp|kv|pool|drafter|dflash|cache' /home/dank/logs/frank_large.log` +1. `grep -iE 'clamp|kv|pool|drafter|dflash|cache' /home/dank/logs/frank_dragoon.log` — ledger shows the pool at the asked shape, DFlash2 active, the prompt cache line naming the pinned budget, NO clamp line. EXPECT the WARNING "smaller than ONE full-context entry (18.4 GB at @@ -136,7 +136,7 @@ bearing numbers: `reasoning_content` populated; decode rate from the timings. 4. Spec decode fires: multi-token step behavior visible in rate; compare against DRAFTER=0 arm if in doubt (never against gufo — bench law). -5. Harness round-trip: an OMP call through `llamacpp (dankclaw)/frank-large` +5. Harness round-trip: an OMP call through `llamacpp (dankclaw)/frank-dragoon` incl. a tool call (V1TOOLS). 6. Prompt > 200,700 tokens returns the 400 naming the limit (contract test). @@ -172,10 +172,10 @@ Measured on real agent traffic (serve_api lines) the day after cutover: one with public evidence, and it moved nothing that matters here. - **Routing is the applied mitigation (2026-10-06):** the harness's deep-conversation roles (`slow`, `advisor` in `~/.omp/agent/config.yml`) - moved to frank-primary (radiance on Dankserver: fp8 KV at + moved to frank-archon (radiance on Dankserver: fp8 KV at 7.32 KiB/token = 8.7x less KV to read per round at depth, MTP depth 3, - 200k window, prefix-cache host+disk tiers). frank-large keeps OpenWebUI - and shallow bursts, where it runs 30-50 t/s. frank-primary's + 200k window, prefix-cache host+disk tiers). frank-dragoon keeps OpenWebUI + and shallow bursts, where it runs 30-50 t/s. frank-archon's depth-decode rate is designed-for but not yet measured on record. - **The lever that existed was the prompt cache, and it was OFF** (see the shape bullet). The pin turns the 85-180 s re-prefill per deep @@ -192,7 +192,7 @@ Measured on real agent traffic (serve_api lines) the day after cutover: ## Rollback -Revert the frank-large swap commit and redeploy `dankclaw --service frank-large`: +Revert the frank-dragoon swap commit and redeploy `dankclaw --service frank-dragoon`: the ROCmFPX payload (`/home/dank/models/kingjones-Qwen3.8-27B-ROCmFP4-STRIX-MTP/`), the fork build (`/home/dank/GitPackages/kingjones-ROCmFPX/build`), and its `scripts/build-rocmfpx.sh` pin (commit `36e9acd`, seam-tested) all remain on diff --git a/serverAppConfigs-docs/LLM/frank-large-ik-uncensored.md b/serverAppConfigs-docs/LLM/frank-dragoon-ik-uncensored.md similarity index 91% rename from serverAppConfigs-docs/LLM/frank-large-ik-uncensored.md rename to serverAppConfigs-docs/LLM/frank-dragoon-ik-uncensored.md index 4338c07..1768010 100644 --- a/serverAppConfigs-docs/LLM/frank-large-ik-uncensored.md +++ b/serverAppConfigs-docs/LLM/frank-dragoon-ik-uncensored.md @@ -1,11 +1,11 @@ --- type: reference -description: frank-large on Dankclaw serving the mradermacher Qwen3.8-Flash-Next-Uncensored i1-Q4_K_M GGUF via ik_llama.cpp on the RTX 3090 + Strix Halo hybrid — measured performance envelope, root-cause analysis, tuning levers, and traps -tags: [llm, frank-large, ik_llama, dankclaw, rtx3090, strix-halo, performance] +description: frank-dragoon on Dankclaw serving the mradermacher Qwen3.8-Flash-Next-Uncensored i1-Q4_K_M GGUF via ik_llama.cpp on the RTX 3090 + Strix Halo hybrid — measured performance envelope, root-cause analysis, tuning levers, and traps +tags: [llm, frank-dragoon, ik_llama, dankclaw, rtx3090, strix-halo, performance] timestamp: 2026-09-16T03:30:00-07:00 --- -# frank-large — ik_llama.cpp, Qwen3.8-Flash-Next-Uncensored i1-Q4_K_M +# frank-dragoon — ik_llama.cpp, Qwen3.8-Flash-Next-Uncensored i1-Q4_K_M **RETIRED 2026-09-16, after one day.** Replaced by [[halogen-flash-server]], which was the runtime before it as well — the fleet went ik → halogen → back. @@ -23,10 +23,10 @@ hardware, and they are why the fleet went back. It served `/home/dank/GitPackages/ik_llama.cpp/build` with `-DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=86 -DGGML_AVX512=ON -DGGML_AVX512_VBMI=ON -DGGML_AVX512_VNNI=ON -DGGML_AVX512_BF16=ON -DLLAMA_CURL=OFF`. -- Unit: **root systemd unit** `/etc/systemd/system/frank-large.service` - symlinked to `scripts/frank-large.service` in the repo; enabled at boot; - `Restart=always`. Serve script `scripts/serve-frank-large.sh` + env - `scripts/frank-large.env`. +- Unit: **root systemd unit** `/etc/systemd/system/frank-dragoon.service` + symlinked to `scripts/frank-dragoon.service` in the repo; enabled at boot; + `Restart=always`. Serve script `scripts/serve-frank-dragoon.sh` + env + `scripts/frank-dragoon.env`. - Topology: 3090 (PCIe x4 in the M.2 dock, link downgraded from x16) carries dense/attention/KV (~11.5 GiB); ALL MoE expert tensors (~84 GiB) and the ~33 GiB PLE n-gram table stay in LPDDR via CPU buffers. @@ -108,9 +108,9 @@ decoding is unavailable for this GGUF — mradermacher stripped the NextN head - **The systemd unit self-heals through manual tests**: `pkill` the server and the unit respawns it ~4 s later (Restart=always) — two instances, port races, phantom measurements. For manual experiments: - `sudo systemctl stop frank-large.service` first (it is a root unit; plain + `sudo systemctl stop frank-dragoon.service` first (it is a root unit; plain `systemctl --user` lines in older docs are stale), and restore with - `sudo systemctl start frank-large.service`. + `sudo systemctl start frank-dragoon.service`. - Verify "HTTP server listening" in the CURRENT log and `pgrep -xc llama-server` == 1 before trusting any measurement. - FA must stay ON — FA-off crashes the loader on this arch. diff --git a/serverAppConfigs-docs/LLM/frank-large-kairic-edge-qwen38-27b.md b/serverAppConfigs-docs/LLM/frank-dragoon-kairic-edge-qwen38-27b.md similarity index 50% rename from serverAppConfigs-docs/LLM/frank-large-kairic-edge-qwen38-27b.md rename to serverAppConfigs-docs/LLM/frank-dragoon-kairic-edge-qwen38-27b.md index 0a2ebb4..7e70d53 100644 --- a/serverAppConfigs-docs/LLM/frank-large-kairic-edge-qwen38-27b.md +++ b/serverAppConfigs-docs/LLM/frank-dragoon-kairic-edge-qwen38-27b.md @@ -1,13 +1,13 @@ --- type: reference -title: "Kairic Edge Qwen3.8-27B IU4 (W4A4) on Dankclaw (frank-large)" -description: "The RETIRED frank-large runbook (2026-09-21, same-day swap; replaced by [[frank-large-unsloth-qwen38-27b-q8xl]]) — the Kairic Edge runtime (ciru-ai/ROCmFPX, branch kairic-edge-qwen38-27b-v1.2, commit 205a3e5, TheRock 7.15.0, Composable Kernel) serving jcbtc/Qwen3.8-27B-IU4-Kairic-Edge (27B dense, IU4 W4A4) on the Dankclaw Strix Halo iGPU: the source-built runtime, the full-window/one-stream shape, the MTP depth 4 + n-gram spec method, the three PromptForge sidecars, the compatibility mode, the payload, the client contract, and the failure modes worth knowing." +title: "Kairic Edge Qwen3.8-27B IU4 (W4A4) on Dankclaw (frank-dragoon)" +description: "The RETIRED frank-dragoon runbook (2026-09-21, same-day swap; replaced by [[frank-dragoon-unsloth-qwen38-27b-q8xl]]) — the Kairic Edge runtime (ciru-ai/ROCmFPX, branch kairic-edge-qwen38-27b-v1.2, commit 205a3e5, TheRock 7.15.0, Composable Kernel) serving jcbtc/Qwen3.8-27B-IU4-Kairic-Edge (27B dense, IU4 W4A4) on the Dankclaw Strix Halo iGPU: the source-built runtime, the full-window/one-stream shape, the MTP depth 4 + n-gram spec method, the three PromptForge sidecars, the compatibility mode, the payload, the client contract, and the failure modes worth knowing." tags: - llm - kairic-edge - rocmfpx - dankclaw - - frank-large + - frank-dragoon - strix-halo - gfx1151 - iu4 @@ -18,11 +18,11 @@ tags: timestamp: 2026-09-21 --- -# frank-large — Kairic Edge Qwen3.8-27B IU4 (W4A4) (RETIRED) +# frank-dragoon — Kairic Edge Qwen3.8-27B IU4 (W4A4) (RETIRED) -> **RETIRED 2026-09-21 (same-day swap).** This was the ACTIVE frank-large +> **RETIRED 2026-09-21 (same-day swap).** This was the ACTIVE frank-dragoon > runbook on 2026-09-21 before it was replaced by -> [[frank-large-unsloth-qwen38-27b-q8xl]] later the same day. The payload +> [[frank-dragoon-unsloth-qwen38-27b-q8xl]] later the same day. The payload > and runtime remain on disk as the rollback target. ## What it served @@ -38,8 +38,8 @@ timestamp: 2026-09-21 ## Rollback -Payload and runtime intact on disk. See [[frank-large-unsloth-qwen38-27b-q8xl]] -for the current ACTIVE runbook and [[frank-large-unsloth-qwen38-flash-next]] +Payload and runtime intact on disk. See [[frank-dragoon-unsloth-qwen38-27b-q8xl]] +for the current ACTIVE runbook and [[frank-dragoon-unsloth-qwen38-flash-next]] for the predecessor. # Citations diff --git a/serverAppConfigs-docs/LLM/frank-large-rocmfpx-q6agent-uncensored-mtp.md b/serverAppConfigs-docs/LLM/frank-dragoon-rocmfpx-q6agent-uncensored-mtp.md similarity index 74% rename from serverAppConfigs-docs/LLM/frank-large-rocmfpx-q6agent-uncensored-mtp.md rename to serverAppConfigs-docs/LLM/frank-dragoon-rocmfpx-q6agent-uncensored-mtp.md index 65e3123..d3fdfc7 100644 --- a/serverAppConfigs-docs/LLM/frank-large-rocmfpx-q6agent-uncensored-mtp.md +++ b/serverAppConfigs-docs/LLM/frank-dragoon-rocmfpx-q6agent-uncensored-mtp.md @@ -1,10 +1,10 @@ --- type: reference -title: "frank-large on Dankclaw — ROCmFPX llama.cpp, Qwen3.8-27B Uncensored Q6_0_ROCMFPX_AGENT + MTP" -description: "The active frank-large runbook — the kingjones30/ROCmFPX llama.cpp fork (pinned commit, gfx1151) serving kingjones777's Uncensored Q6_0_ROCMFPX_AGENT GGUF (ftype 114, protected output heads), with the repo's own MTP-Q4_0 head drafting four tokens at one native 262,144 window, f16 KV, the BF16 projector for vision, and the measured rejection of the ngram-mod chain." +title: "frank-dragoon on Dankclaw — ROCmFPX llama.cpp, Qwen3.8-27B Uncensored Q6_0_ROCMFPX_AGENT + MTP" +description: "The active frank-dragoon runbook — the kingjones30/ROCmFPX llama.cpp fork (pinned commit, gfx1151) serving kingjones777's Uncensored Q6_0_ROCMFPX_AGENT GGUF (ftype 114, protected output heads), with the repo's own MTP-Q4_0 head drafting four tokens at one native 262,144 window, f16 KV, the BF16 projector for vision, and the measured rejection of the ngram-mod chain." tags: - llm - - frank-large + - frank-dragoon - dankclaw - llama-cpp - rocmfpx @@ -15,14 +15,14 @@ tags: timestamp: 2026-10-03 --- -# frank-large — ROCmFPX Uncensored Q6_0_ROCMFPX_AGENT + MTP (gfx1151) +# frank-dragoon — ROCmFPX Uncensored Q6_0_ROCMFPX_AGENT + MTP (gfx1151) > **RETIRED 2026-10-03 → 2026-10-05 (rollback target; payload, fork build and -> build script all on disk).** Replaced by [[frank-large-halogen27b-dflash2]] +> build script all on disk).** Replaced by [[frank-dragoon-halogen27b-dflash2]] > (DFlash2, publisher 31.7 t/s mean vs the 27.6–28.1 measured here). This page > remains the contract record for the rollback. Original banner follows. > ACTIVE since 2026-10-03. Cut over from -> [[frank-large-rocmfpx-q8agent-mtp]] (ALIGNED Q8_0_ROCMFPX_AGENT, 17.0 t/s) +> [[frank-dragoon-rocmfpx-q8agent-mtp]] (ALIGNED Q8_0_ROCMFPX_AGENT, 17.0 t/s) > on Frank's request: the *uncensored* variant of the same protected-heads > family, one quant rung down. The swap turned out to be a strict upgrade on > the axis that matters here: **decode 27.6–28.1 t/s at a 4,813-token prompt @@ -34,15 +34,15 @@ timestamp: 2026-10-03 | | | |---|---| | Host / device | Dankclaw (192.168.0.143), Radeon 8060S iGPU `gfx1151`, ~114 GiB GTT aperture | -| Endpoint | `http://192.168.0.143:7770` — alias `frank-large`, `/v1` OpenAI surface | +| Endpoint | `http://192.168.0.143:7770` — alias `frank-dragoon`, `/v1` OpenAI surface | | Runtime | **`kingjones30/ROCmFPX`** llama.cpp fork @ `36e9acd40e10a87cd3c3ef8ec734668757dc8520`, built by [`scripts/build-rocmfpx.sh`](../../scripts/build-rocmfpx.sh) — unchanged from the Q8 era; the fork already knew type 102 | -| Unit | root systemd `frank-large.service` ([`scripts/frank-large.service`](../../scripts/frank-large.service)), `User=dank`, `Restart=always` | -| Serve script | [`scripts/serve-frank-large.sh`](../../scripts/serve-frank-large.sh) (owns the argv), tunables [`scripts/frank-large.env`](../../scripts/frank-large.env) | +| Unit | root systemd `frank-dragoon.service` ([`scripts/frank-dragoon.service`](../../scripts/frank-dragoon.service)), `User=dank`, `Restart=always` | +| Serve script | [`scripts/serve-frank-dragoon.sh`](../../scripts/serve-frank-dragoon.sh) (owns the argv), tunables [`scripts/frank-dragoon.env`](../../scripts/frank-dragoon.env) | | Weights | `/home/dank/models/kingjones-Qwen3.8-27B-Uncensored-ROCmFP4-STRIX-MTP/Qwen3.8-27B-Uncensored-Q6_0_ROCMFPX_AGENT.gguf` — 24,856,607,008 B, sha256 `e966deb3…` | | Draft | `…/mtp-Qwen3.8-27B-Q4_0.gguf` — 1,680,271,648 B, sha256 `051a1764…` (byte-identical to the aligned repo's head; hardlinked, not re-downloaded) | | Projector | `…/mmproj-Qwen3.8-27B-BF16.gguf` — 931,145,888 B (hardlinked from the aligned payload dir; the same file the Q8 era served) | -| Fetch | [`scripts/download-frank-large-kingjones-uncensored.sh`](../../scripts/download-frank-large-kingjones-uncensored.sh) — hardlinks the draft/projector from the aligned dir when present, otherwise fetches; `-f`, byte-count + LFS sha256 verified, `--verify-only`, token never on the command line | -| Seam | `tests/frank_large_unit.bats` (payload gates, deployer/serve parity, spec block, KV dtype) | +| Fetch | [`scripts/download-frank-dragoon-kingjones-uncensored.sh`](../../scripts/download-frank-dragoon-kingjones-uncensored.sh) — hardlinks the draft/projector from the aligned dir when present, otherwise fetches; `-f`, byte-count + LFS sha256 verified, `--verify-only`, token never on the command line | +| Seam | `tests/frank_dragoon_unit.bats` (payload gates, deployer/serve parity, spec block, KV dtype) | ## Why this file @@ -78,7 +78,7 @@ Unchanged from the Q8 era — the swap was payload-only: | KV dtype | **f16** (both K and V) | ~64 KiB/token; free inside a 114 GiB aperture | | `--fit off` | on | the auto-fitter would silently resize the window | | `--flash-attn on` | on | required for the long-window attention path | -| `--direct-io`, `--ctx-checkpoints 16`, `--cache-ram 8192`, `--cache-idle-slots`, `--jinja`, `--reasoning on --reasoning-format deepseek --reasoning-budget -1` | | same as [[frank-large-rocmfpx-q8agent-mtp]] | +| `--direct-io`, `--ctx-checkpoints 16`, `--cache-ram 8192`, `--cache-idle-slots`, `--jinja`, `--reasoning on --reasoning-format deepseek --reasoning-budget -1` | | same as [[frank-dragoon-rocmfpx-q8agent-mtp]] | Spec decode: `--spec-type draft-mtp`, the repo's `mtp-Qwen3.8-27B-Q4_0.gguf`, `--spec-draft-n-max 4`, pinned `--spec-draft-device ROCm0`. @@ -138,37 +138,37 @@ models; the fleet law in `AGENTS.md → llama.cpp serving` records it. ## Client contract Unchanged from the Q8 era and re-verified on this payload 2026-10-03: model id -`frank-large`, native tools, thinking in `reasoning_content`, +`frank-dragoon`, native tools, thinking in `reasoning_content`, `reasoning_effort` ∈ {xhigh, medium, low} only (anything else HTTP 500), card-recipe sampling defaults server-side, vision through the BF16 projector (red PNG → **`Red`**, 74 prompt / 165 completion tokens). The traps list — `content: null` when reasoning eats the budget, the self-recovering MTP boundary log line, `enable_thinking:false` not `reasoning_effort:"none"` — is -in [[frank-large-rocmfpx-q8agent-mtp]] and still applies. +in [[frank-dragoon-rocmfpx-q8agent-mtp]] and still applies. Sweep key for scratch servers is now the payload name: `pkill -f 'Qwen3.8-27B-Uncensored-Q6_0_ROCMFPX_AGENT'` — never `pkill -f -llama-server` (frank-secondary is also one). +llama-server` (frank-zealot is also one). ## Operations ```bash -./scripts/deploy.sh dankclaw --service frank-large -systemctl status frank-large -journalctl -u frank-large -n 200 --no-pager -scripts/download-frank-large-kingjones-uncensored.sh --verify-only +./scripts/deploy.sh dankclaw --service frank-dragoon +systemctl status frank-dragoon +journalctl -u frank-dragoon -n 200 --no-pager +scripts/download-frank-dragoon-kingjones-uncensored.sh --verify-only ``` ## Rollback | Target | How | |---|---| -| **ALIGNED Q8_0_ROCMFPX_AGENT** (previous shape, 17 t/s) | the payload dir `/home/dank/models/kingjones-Qwen3.8-27B-ROCmFP4-STRIX-MTP/` is untouched on disk; revert the swap commit (unit/env/serve trio) and redeploy, or point `FRANK_LARGE_MODEL_FILE` + `LLM_LARGE_MODEL_FILE` at the old paths. Verify with `scripts/download-frank-large-kingjones.sh --verify-only` | -| gufo Q4_K_XL era | git tag `frank-large-gufo-q4kxl-20261001`, **but the gufo payloads (UD-Q4_K_XL 16.35 GiB, UD-Q8_K_XL + DFlash2 drafter) were removed from disk 2026-10-03 with Frank's approval** — this rollback now requires re-download per [[frank-large-gufo-qwen38-27b]] | +| **ALIGNED Q8_0_ROCMFPX_AGENT** (previous shape, 17 t/s) | the payload dir `/home/dank/models/kingjones-Qwen3.8-27B-ROCmFP4-STRIX-MTP/` is untouched on disk; revert the swap commit (unit/env/serve trio) and redeploy, or point `FRANK_DRAGOON_MODEL_FILE` + `LLM_DRAGOON_MODEL_FILE` at the old paths. Verify with `scripts/download-frank-dragoon-kingjones.sh --verify-only` | +| gufo Q4_K_XL era | git tag `frank-dragoon-gufo-q4kxl-20261001`, **but the gufo payloads (UD-Q4_K_XL 16.35 GiB, UD-Q8_K_XL + DFlash2 drafter) were removed from disk 2026-10-03 with Frank's approval** — this rollback now requires re-download per [[frank-dragoon-gufo-qwen38-27b]] | ## When it misbehaves -Same decision tree as [[frank-large-rocmfpx-q8agent-mtp]]: +Same decision tree as [[frank-dragoon-rocmfpx-q8agent-mtp]]: `unknown tensor type` ⇒ off the pinned fork; SIGSEGV in `ggml_compute_forward_set_rows` ⇒ pre-`36e9acd` build; slow decode with no error ⇒ draft not engaged (`draft_n` in `/completion` timings) or an orphaned diff --git a/serverAppConfigs-docs/LLM/frank-large-rocmfpx-q8agent-mtp.md b/serverAppConfigs-docs/LLM/frank-dragoon-rocmfpx-q8agent-mtp.md similarity index 80% rename from serverAppConfigs-docs/LLM/frank-large-rocmfpx-q8agent-mtp.md rename to serverAppConfigs-docs/LLM/frank-dragoon-rocmfpx-q8agent-mtp.md index af029b8..865bb23 100644 --- a/serverAppConfigs-docs/LLM/frank-large-rocmfpx-q8agent-mtp.md +++ b/serverAppConfigs-docs/LLM/frank-dragoon-rocmfpx-q8agent-mtp.md @@ -1,10 +1,10 @@ --- type: reference -title: "frank-large on Dankclaw — ROCmFPX llama.cpp, Qwen3.8-27B Q8_0_ROCMFPX_AGENT + MTP (retired)" -description: "The retired frank-large runbook — the kingjones30/ROCmFPX llama.cpp fork (pinned commit, gfx1151) serving kingjones777's Q8_0_ROCMFPX_AGENT GGUF, a ftype-115 file no other loader can read, with the repo's own MTP-Q4_0 head, f16 KV, and the BF16 projector. Measured MTP-vs-none A/B, the client contract, and the rollback state as of 2026-10-03." +title: "frank-dragoon on Dankclaw — ROCmFPX llama.cpp, Qwen3.8-27B Q8_0_ROCMFPX_AGENT + MTP (retired)" +description: "The retired frank-dragoon runbook — the kingjones30/ROCmFPX llama.cpp fork (pinned commit, gfx1151) serving kingjones777's Q8_0_ROCMFPX_AGENT GGUF, a ftype-115 file no other loader can read, with the repo's own MTP-Q4_0 head, f16 KV, and the BF16 projector. Measured MTP-vs-none A/B, the client contract, and the rollback state as of 2026-10-03." tags: - llm - - frank-large + - frank-dragoon - dankclaw - llama-cpp - rocmfpx @@ -15,17 +15,17 @@ tags: timestamp: 2026-10-02 --- -# frank-large — ROCmFPX Q8_0_ROCMFPX_AGENT + MTP (gfx1151, retired) +# frank-dragoon — ROCmFPX Q8_0_ROCMFPX_AGENT + MTP (gfx1151, retired) > **RETIRED 2026-10-03** — superseded by -> [[frank-large-rocmfpx-q6agent-uncensored-mtp]]: Frank swapped to the +> [[frank-dragoon-rocmfpx-q6agent-uncensored-mtp]]: Frank swapped to the > uncensored Q6_0_ROCMFPX_AGENT file (protected heads, one rung down), which > measures **27.6–28.1 t/s** at a deeper prompt than this file's 17.0. This > runbook stays live as the rollback reference and the trap catalogue; the > payload it documents remains on disk at > `/home/dank/models/kingjones-Qwen3.8-27B-ROCmFP4-STRIX-MTP/`. > -> Cut over 2026-10-02 from [[frank-large-gufo-qwen38-27b]] (Q4_K_XL, ~15 t/s) +> Cut over 2026-10-02 from [[frank-dragoon-gufo-qwen38-27b]] (Q4_K_XL, ~15 t/s) > on two requests from Frank: *highest quality that runs*, and *one full > context*. It delivered 8.39 bpw weights — two quant rungs above what gufo > could load — at 17.0 t/s, so quality was not bought with speed. @@ -39,15 +39,15 @@ timestamp: 2026-10-02 | | | |---|---| | Host / device | Dankclaw (192.168.0.143), Radeon 8060S iGPU `gfx1151`, ~114 GiB GTT aperture | -| Endpoint | `http://192.168.0.143:7770` — alias `frank-large`, `/v1` OpenAI surface | +| Endpoint | `http://192.168.0.143:7770` — alias `frank-dragoon`, `/v1` OpenAI surface | | Runtime | **`kingjones30/ROCmFPX`** llama.cpp fork @ `36e9acd40e10a87cd3c3ef8ec734668757dc8520`, built by [`scripts/build-rocmfpx.sh`](../../scripts/build-rocmfpx.sh) → `/home/dank/GitPackages/kingjones-ROCmFPX/build/bin/llama-server` | -| Unit | root systemd `frank-large.service` ([`scripts/frank-large.service`](../../scripts/frank-large.service)), `User=dank`, `Restart=always` | -| Serve script | [`scripts/serve-frank-large.sh`](../../scripts/serve-frank-large.sh) (owns the argv), tunables [`scripts/frank-large.env`](../../scripts/frank-large.env) | +| Unit | root systemd `frank-dragoon.service` ([`scripts/frank-dragoon.service`](../../scripts/frank-dragoon.service)), `User=dank`, `Restart=always` | +| Serve script | [`scripts/serve-frank-dragoon.sh`](../../scripts/serve-frank-dragoon.sh) (owns the argv), tunables [`scripts/frank-dragoon.env`](../../scripts/frank-dragoon.env) | | Weights | `/home/dank/models/kingjones-Qwen3.8-27B-ROCmFP4-STRIX-MTP/Qwen3.8-27B-Q8_0_ROCMFPX_AGENT.gguf` — 28,214,425,952 B, sha256 `f3ef2bdbf56e244f…` | | Draft | `…/mtp-Qwen3.8-27B-Q4_0.gguf` — 1,680,271,648 B, sha256 `051a1764cff8c4f3…` | | Projector | `…/mmproj-Qwen3.8-27B-BF16.gguf` — 931,145,888 B, sha256 `de2a4986…` | -| Fetch | [`scripts/download-frank-large-kingjones.sh`](../../scripts/download-frank-large-kingjones.sh) (`-f`, byte-count + LFS sha256 verified, `--verify-only`, token never on the command line) | -| Seam | `tests/frank_large_unit.bats` (19 tests: payload gates, deployer/serve parity, spec block, KV dtype, sweep identity) | +| Fetch | [`scripts/download-frank-dragoon-kingjones.sh`](../../scripts/download-frank-dragoon-kingjones.sh) (`-f`, byte-count + LFS sha256 verified, `--verify-only`, token never on the command line) | +| Seam | `tests/frank_dragoon_unit.bats` (19 tests: payload gates, deployer/serve parity, spec block, KV dtype, sweep identity) | ## Why this file, and why only this runtime @@ -117,7 +117,7 @@ there is no second 26 GiB copy in memory. See the fleet law in `AGENTS.md → llama.cpp serving`. **A/B, 2026-10-02** — same session, temp 0, 2,202-token prompt, 512 tokens, -`cache_prompt: false`, `frank-large.service` stopped for every scratch arm (the +`cache_prompt: false`, `frank-dragoon.service` stopped for every scratch arm (the benchmarking law), baseline arm stripped of `--model-draft` **and** every `--spec-*` flag: @@ -144,7 +144,7 @@ re-litigates this: | Behavior | Observation | |---|---| -| Model id | `/v1/models` → `frank-large` | +| Model id | `/v1/models` → `frank-dragoon` | | Tools | native: `get_weather` → `{"city": "Seattle"}` in `tool_calls` | | Thinking | in **`reasoning_content`** (llama.cpp field — *not* vLLM's `reasoning`); `models.yml` sets `reasoningContentField` accordingly | | `reasoning_effort` | accepts **only** `xhigh`, `medium`, `low`; anything else is HTTP 500 (the template raises, it does not clamp). `models.yml` folds `high`/`max` → `xhigh` | @@ -162,7 +162,7 @@ Three traps, all hit for real: enough for the vision probe). 2. **`MTP boundary missing for seq_id=… ; resyncing after a non-token step`** appears in the log under draft resets. Self-recovering; not an outage signal. -3. **Never `pkill -f llama-server` on Dankclaw** — frank-secondary is also a +3. **Never `pkill -f llama-server` on Dankclaw** — frank-zealot is also a `llama-server`. The sweep key here is the payload name: `pkill -f 'Qwen3.8-27B-Q8_0_ROCMFPX_AGENT'`. @@ -170,24 +170,24 @@ Three traps, all hit for real: ```bash # deploy (planner selects this endpoint only via its own unit/env/serve trio) -./scripts/deploy.sh dankclaw --service frank-large +./scripts/deploy.sh dankclaw --service frank-dragoon # status / logs / cause of a crash loop -systemctl status frank-large -journalctl -u frank-large -n 200 --no-pager +systemctl status frank-dragoon +journalctl -u frank-dragoon -n 200 --no-pager # rebuild the pinned fork (only when deliberately moving the pin) scripts/build-rocmfpx.sh # re-verify the payload without re-downloading -scripts/download-frank-large-kingjones.sh --verify-only +scripts/download-frank-dragoon-kingjones.sh --verify-only ``` -`serve-frank-large.sh` refuses to start — before touching the port — unless the -fork binary, the weights, the MTP head and (unless `FRANK_LARGE_MMPROJ=""`) the +`serve-frank-dragoon.sh` refuses to start — before touching the port — unless the +fork binary, the weights, the MTP head and (unless `FRANK_DRAGOON_MMPROJ=""`) the projector all exist; `scripts/deploy-remote.sh` mirrors the same predicate so a broken payload never stops the running unit. Caller environment **overrides** -`frank-large.env`, and defaults use `:=` so an explicitly empty value surfaces +`frank-dragoon.env`, and defaults use `:=` so an explicitly empty value surfaces as the error it reads as. ## Rollback (as of retirement, 2026-10-03) @@ -196,16 +196,16 @@ as the error it reads as. payload and remains on disk** at `/home/dank/models/kingjones-Qwen3.8-27B-ROCmFP4-STRIX-MTP/` — revert the 2026-10-03 swap commit (unit/env/serve trio) or repoint -`FRANK_LARGE_MODEL_FILE`/`LLM_LARGE_MODEL_FILE`, verify with -`scripts/download-frank-large-kingjones.sh --verify-only`, redeploy. +`FRANK_DRAGOON_MODEL_FILE`/`LLM_DRAGOON_MODEL_FILE`, verify with +`scripts/download-frank-dragoon-kingjones.sh --verify-only`, redeploy. -git tag **`frank-large-gufo-q4kxl-20261001`** (gufo v0.1.1, Q4_K_XL + +git tag **`frank-dragoon-gufo-q4kxl-20261001`** (gufo v0.1.1, Q4_K_XL + DFlash2) is now a **re-download** rollback: the gufo payloads `/home/dank/models/Qwen3.8-27B-UD-Q4_K_XL/` (16.35 GiB) and `/home/dank/models/Qwen3.8-27B-UD-Q8_K_XL/` (incl. the DFlash2 drafter) were removed from disk on 2026-10-03 with Frank's explicit approval to free space. `scripts/build-gufo.sh` remains on disk; re-fetch per -[[frank-large-gufo-qwen38-27b]]. +[[frank-dragoon-gufo-qwen38-27b]]. The one-day vLLM MiMo era's payloads (MiMo-V2.6 BF16 18 GiB, Qwen3.5-9B MTP source 19 GiB, both DFlash draft dirs) were staged to @@ -215,7 +215,7 @@ recoverable until the trash is purged, and never part of a rollback plan. ## When it misbehaves - **`unknown tensor type` / ftype 115 refused** — something moved off the - ROCmFPX binary. Check `readlink -f $(systemctl show frank-large -p ExecStart)` + ROCmFPX binary. Check `readlink -f $(systemctl show frank-dragoon -p ExecStart)` and the fork commit; this file cannot run on stock llama.cpp or gufo. - **SIGSEGV in `ggml_compute_forward_set_rows` during load** — a fork build older than the `36e9acd` pin; rebuild with `scripts/build-rocmfpx.sh`. diff --git a/serverAppConfigs-docs/LLM/frank-large-unsloth-qwen38-27b-q8xl.md b/serverAppConfigs-docs/LLM/frank-dragoon-unsloth-qwen38-27b-q8xl.md similarity index 70% rename from serverAppConfigs-docs/LLM/frank-large-unsloth-qwen38-27b-q8xl.md rename to serverAppConfigs-docs/LLM/frank-dragoon-unsloth-qwen38-27b-q8xl.md index 34c9a2d..e844436 100644 --- a/serverAppConfigs-docs/LLM/frank-large-unsloth-qwen38-27b-q8xl.md +++ b/serverAppConfigs-docs/LLM/frank-dragoon-unsloth-qwen38-27b-q8xl.md @@ -1,13 +1,13 @@ --- type: reference -title: "stock llama.cpp Qwen3.8-27B UD-Q8_K_XL (DFlash2) on Dankclaw (frank-large)" -description: "The RETIRED frank-large runbook (2026-09-21 → 2026-09-28; replaced by [[frank-large-gufo-qwen38-27b]], and the rollback target) — the stock llama.cpp prebuilt (unsloth b11030, ROCm gfx1151) serving unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL (27B dense, 31.46 GiB) with the z-lab DFlash2 Q4_K_M drafter (depth 4) and q8_0 KV on the Dankclaw Strix Halo iGPU: the prebuilt runtime, the full-window/one-stream shape, the DFlash2 spec method, the Qwen-Sharp template, the payload, the client contract, and the failure modes worth knowing." +title: "stock llama.cpp Qwen3.8-27B UD-Q8_K_XL (DFlash2) on Dankclaw (frank-dragoon)" +description: "The RETIRED frank-dragoon runbook (2026-09-21 → 2026-09-28; replaced by [[frank-dragoon-gufo-qwen38-27b]], and the rollback target) — the stock llama.cpp prebuilt (unsloth b11030, ROCm gfx1151) serving unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL (27B dense, 31.46 GiB) with the z-lab DFlash2 Q4_K_M drafter (depth 4) and q8_0 KV on the Dankclaw Strix Halo iGPU: the prebuilt runtime, the full-window/one-stream shape, the DFlash2 spec method, the Qwen-Sharp template, the payload, the client contract, and the failure modes worth knowing." tags: - llm - llama.cpp - unsloth - dankclaw - - frank-large + - frank-dragoon - strix-halo - gfx1151 - q8 @@ -17,31 +17,31 @@ tags: timestamp: 2026-09-21 --- -# frank-large — stock llama.cpp Qwen3.8-27B UD-Q8_K_XL (DFlash2) +# frank-dragoon — stock llama.cpp Qwen3.8-27B UD-Q8_K_XL (DFlash2) -> **RETIRED 2026-09-28**, replaced by [[frank-large-gufo-qwen38-27b]] (the +> **RETIRED 2026-09-28**, replaced by [[frank-dragoon-gufo-qwen38-27b]] (the > gufo engine, same weights, same port and alias); the prebuilt is intact on > disk as the rollback target. ACTIVE from 2026-09-21, when it replaced -> [[frank-large-kairic-edge-qwen38-27b]] (Kairic Edge IU4 W4A4) and -> [[frank-large-unsloth-qwen38-flash-next]] (the Flash-Next MoE it +> [[frank-dragoon-kairic-edge-qwen38-27b]] (Kairic Edge IU4 W4A4) and +> [[frank-dragoon-unsloth-qwen38-flash-next]] (the Flash-Next MoE it > preceded). ## Identity -- **Endpoint:** `frank-large` at `192.168.0.143:7770` (Dankclaw). +- **Endpoint:** `frank-dragoon` at `192.168.0.143:7770` (Dankclaw). - **Runtime:** stock llama.cpp — the unsloth `b11030` prebuilt (`/home/dank/GitPackages/unsloth-llama-b11030/llama-server`), ROCm gfx1151. A mainline build, not a fork: it supports the `qwen3_5` architecture and the DFlash2 drafter (`llama_model_qwen35`, `llama_model_dflash`, `common_speculative_impl_draft_dflash`). -- **Service shape:** root systemd unit `scripts/frank-large.service` - (`User=dank`), launched by `scripts/serve-frank-large.sh` with tunables from - `scripts/frank-large.env`. +- **Service shape:** root systemd unit `scripts/frank-dragoon.service` + (`User=dank`), launched by `scripts/serve-frank-dragoon.sh` with tunables from + `scripts/frank-dragoon.env`. ## Shape - **Model:** `unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL` — a 27B **dense** model, - 31.46 GiB GGUF (sha256-verified by `scripts/download-frank-large.sh`). + 31.46 GiB GGUF (sha256-verified by `scripts/download-frank-dragoon.sh`). - **Context:** one stream, full 262,144 tokens (the model's native window), `PARALLEL_SLOTS=1`. - **Placement:** all layers on the iGPU (`--n-gpu-layers 999`). The 27B dense @@ -75,18 +75,18 @@ harness folds its levels onto that set in `models.yml` (`reasoningEffortMap`). ## Payload -`scripts/download-frank-large.sh` fetches the main GGUF and the DFlash2 +`scripts/download-frank-dragoon.sh` fetches the main GGUF and the DFlash2 drafter, each verified against its declared byte count + sha256 (`--verify-only` re-checks). The serve script refuses to start if the binary, the main GGUF, or the drafter is missing. ## Client contract -- **Alias:** `frank-large` (the `id` at `/v1/models`). +- **Alias:** `frank-dragoon` (the `id` at `/v1/models`). - **Reasoning:** extracted to `reasoning_content` (`--reasoning auto`, `--reasoning-format deepseek`, unlimited budget). - **Tools:** supported (`--jinja` is pinned). -- **Vision:** none — text-only (no mmproj), matching the prior frank-large. +- **Vision:** none — text-only (no mmproj), matching the prior frank-dragoon. - **Sampling:** greedy by default; a client that sends a temperature gets its own, and the harness applies per-model overrides from `models.yml`. @@ -105,8 +105,8 @@ the main GGUF, or the drafter is missing. ## Rollback -Payload and runtime for [[frank-large-kairic-edge-qwen38-27b]] (Kairic Edge -IU4 W4A4) remain intact on disk. See [[frank-large-unsloth-qwen38-flash-next]] +Payload and runtime for [[frank-dragoon-kairic-edge-qwen38-27b]] (Kairic Edge +IU4 W4A4) remain intact on disk. See [[frank-dragoon-unsloth-qwen38-flash-next]] for the Flash-Next predecessor it replaced on 2026-09-21. # Citations @@ -114,4 +114,4 @@ for the Flash-Next predecessor it replaced on 2026-09-21. - unsloth prebuilts: https://huggingface.co/unsloth - Model: https://huggingface.co/unsloth/Qwen3.8-27B-GGUF - DFlash2 drafter: https://huggingface.co/z-lab -- Serve script: `scripts/serve-frank-large.sh`; tunables: `scripts/frank-large.env` +- Serve script: `scripts/serve-frank-dragoon.sh`; tunables: `scripts/frank-dragoon.env` diff --git a/serverAppConfigs-docs/LLM/frank-large-unsloth-qwen38-flash-next.md b/serverAppConfigs-docs/LLM/frank-dragoon-unsloth-qwen38-flash-next.md similarity index 59% rename from serverAppConfigs-docs/LLM/frank-large-unsloth-qwen38-flash-next.md rename to serverAppConfigs-docs/LLM/frank-dragoon-unsloth-qwen38-flash-next.md index f4b6d56..3ee9b18 100644 --- a/serverAppConfigs-docs/LLM/frank-large-unsloth-qwen38-flash-next.md +++ b/serverAppConfigs-docs/LLM/frank-dragoon-unsloth-qwen38-flash-next.md @@ -1,12 +1,12 @@ --- type: reference -title: "unsloth llama.cpp Qwen3.8-Flash-Next UD-IQ4_XS on Dankclaw (frank-large)" -description: "The RETIRED frank-large runbook (2026-09-21, same-day swap; replaced by [[frank-large-unsloth-qwen38-27b-q8xl]]) — the unsloth llama.cpp prebuilt (b11030-mix-5ff778e, ROCm gfx1151) serving unsloth/Qwen3.8-Flash-Next-GGUF:UD-IQ4_XS on the Dankclaw Strix Halo iGPU: the prebuilt runtime, the 200k/one-stream shape, the explicit -md MTP wiring, the payload, the client contract, and the failure modes worth knowing." +title: "unsloth llama.cpp Qwen3.8-Flash-Next UD-IQ4_XS on Dankclaw (frank-dragoon)" +description: "The RETIRED frank-dragoon runbook (2026-09-21, same-day swap; replaced by [[frank-dragoon-unsloth-qwen38-27b-q8xl]]) — the unsloth llama.cpp prebuilt (b11030-mix-5ff778e, ROCm gfx1151) serving unsloth/Qwen3.8-Flash-Next-GGUF:UD-IQ4_XS on the Dankclaw Strix Halo iGPU: the prebuilt runtime, the 200k/one-stream shape, the explicit -md MTP wiring, the payload, the client contract, and the failure modes worth knowing." tags: - llm - unsloth - dankclaw - - frank-large + - frank-dragoon - strix-halo - gfx1151 - qwen4exp @@ -15,11 +15,11 @@ tags: timestamp: 2026-09-21 --- -# frank-large — unsloth llama.cpp Qwen3.8-Flash-Next UD-IQ4_XS (RETIRED) +# frank-dragoon — unsloth llama.cpp Qwen3.8-Flash-Next UD-IQ4_XS (RETIRED) -> **RETIRED 2026-09-21 (same-day swap).** This was the ACTIVE frank-large +> **RETIRED 2026-09-21 (same-day swap).** This was the ACTIVE frank-dragoon > runbook on 2026-09-21 before it was replaced by -> [[frank-large-unsloth-qwen38-27b-q8xl]] (27B dense UD-Q8_K_XL) later the +> [[frank-dragoon-unsloth-qwen38-27b-q8xl]] (27B dense UD-Q8_K_XL) later the > same day. The payload and runtime remain on disk as the rollback target. ## What it served @@ -37,8 +37,8 @@ timestamp: 2026-09-21 ## Rollback -Payload and runtime intact on disk. See [[frank-large-unsloth-qwen38-27b-q8xl]] -for the current ACTIVE runbook and [[frank-large-ciru-orca]] for the +Payload and runtime intact on disk. See [[frank-dragoon-unsloth-qwen38-27b-q8xl]] +for the current ACTIVE runbook and [[frank-dragoon-ciru-orca]] for the predecessor. # Citations diff --git a/serverAppConfigs-docs/LLM/frank-large-vllm-mimo-v26-bf16.md b/serverAppConfigs-docs/LLM/frank-dragoon-vllm-mimo-v26-bf16.md similarity index 78% rename from serverAppConfigs-docs/LLM/frank-large-vllm-mimo-v26-bf16.md rename to serverAppConfigs-docs/LLM/frank-dragoon-vllm-mimo-v26-bf16.md index 8f331d2..23a107f 100644 --- a/serverAppConfigs-docs/LLM/frank-large-vllm-mimo-v26-bf16.md +++ b/serverAppConfigs-docs/LLM/frank-dragoon-vllm-mimo-v26-bf16.md @@ -1,10 +1,10 @@ --- type: reference -title: "frank-large on Dankclaw — vLLM TheRock, MiMo-V2.6-Distill-Qwen-9B BF16 + cross-model MTP (RETIRED)" -description: "The RETIRED frank-large runbook (2026-10-01, one day) — the digest-pinned kyuz0 TheRock gfx1151 vLLM image serving XiaomiMiMo MiMo-V2.6-Distill-Qwen-9B in full BF16 on the Strix Halo iGPU. Kept for the measured record: the roof math, the cross-model MTP drafter, and the autoresearch finding that spec decode is NET-NEGATIVE on real chat+reasoning traffic here (6.19 t/s with MTP-2 vs 9.01 t/s without). Rolled back to [[frank-large-gufo-qwen38-27b]] by Frank the same night." +title: "frank-dragoon on Dankclaw — vLLM TheRock, MiMo-V2.6-Distill-Qwen-9B BF16 + cross-model MTP (RETIRED)" +description: "The RETIRED frank-dragoon runbook (2026-10-01, one day) — the digest-pinned kyuz0 TheRock gfx1151 vLLM image serving XiaomiMiMo MiMo-V2.6-Distill-Qwen-9B in full BF16 on the Strix Halo iGPU. Kept for the measured record: the roof math, the cross-model MTP drafter, and the autoresearch finding that spec decode is NET-NEGATIVE on real chat+reasoning traffic here (6.19 t/s with MTP-2 vs 9.01 t/s without). Rolled back to [[frank-dragoon-gufo-qwen38-27b]] by Frank the same night." tags: - llm - - frank-large + - frank-dragoon - dankclaw - vllm - strix-halo @@ -15,27 +15,27 @@ tags: timestamp: 2026-10-01 --- -# frank-large — vLLM MiMo-V2.6-Distill-Qwen-9B BF16 (cross-model MTP) +# frank-dragoon — vLLM MiMo-V2.6-Distill-Qwen-9B BF16 (cross-model MTP) > **RETIRED 2026-10-01 night, one day active.** Frank's call after the > autoresearch loop: battery decode 6.19 t/s (MTP-2) / 9.01 t/s (no draft) > against gufo's ~15 t/s on the 27B — and every ≥6-bit quant path in vLLM > 0.30 is dead on gfx1151 (quark int8 rejected; all FP8 kernels CDNA-only; -> torchao config unwired). Back to [[frank-large-gufo-qwen38-27b]] +> torchao config unwired). Back to [[frank-dragoon-gufo-qwen38-27b]] > (Q4_K_XL, 1 x 262144). The measured content below stands as the record. ## Identity -- **Endpoint:** `frank-large` at `192.168.0.143:7770` (Dankclaw). +- **Endpoint:** `frank-dragoon` at `192.168.0.143:7770` (Dankclaw). - **Runtime:** vLLM 0.30.0 in the **digest-pinned** `docker.io/kyuz0/vllm-therock-gfx1151` image (image ID `2d24a8c5a3fd`, digest `sha256:98c1f3ac9833…` — ROCm 10.0.0 / torch 2.11.0 / TheRock, Triton Gated DeltaNet kernels). The official vLLM images are CUDA-only; this fork is the fleet's gfx1151 path. Plain - `podman run` driven by `scripts/serve-frank-large.sh` under a root unit - (`scripts/frank-large.service`, `User=dank`, `Restart=always`, + `podman run` driven by `scripts/serve-frank-dragoon.sh` under a root unit + (`scripts/frank-dragoon.service`, `User=dank`, `Restart=always`, `ExecStop=podman stop -t 120`, `TimeoutStopSec=180` > the stop grace). - **Model:** `XiaomiMiMo/MiMo-V2.6-Distill-Qwen-9B` in **full BF16** - (17.53 GiB, 4 shards) — the same checkpoint frank-secondary serves as an INT8 + (17.53 GiB, 4 shards) — the same checkpoint frank-zealot serves as an INT8 W8A16 AutoRound conversion on the 3090, here unquantized. - **Draft:** `Qwen/Qwen3.5-9B` (18 GiB on disk; only the 15 `mtp.*` tensors are loaded into the draft pass). @@ -67,7 +67,7 @@ scheduler instead of carved per session. | **BF16 + MTP 2 tok** | 7,380 t/s | **19.8 t/s** | pos0 71% pos1 44% (token rate 57.4%) | One session, temperature 0, 28,647-token prefill / 512-token decode, same -client for all three arms (2026-10-01 bench window, frank-large stopped per +client for all three arms (2026-10-01 bench window, frank-dragoon stopped per Benchmarking Policy). **MTP wins (+51% vs +33%) and needs only 2 draft tokens** — acceptance past position 1 is 44% and falling; DFlash's own curve decays 59/26/14/7, so 8 proposals are mostly wasted verification. @@ -82,7 +82,7 @@ Qwen3.5-9B that preserves the hidden-state geometry — identical per-position acceptance is the direct measurement that the distillation preserved more than geometry. MiMo itself ships **ZERO `mtp.*` tensors** (verified in both the BF16 base and the INT8 conversion) — which is exactly -why frank-secondary's SGLang NEXTN draft is a 0.00-acceptance ghost: SGLang +why frank-zealot's SGLang NEXTN draft is a 0.00-acceptance ghost: SGLang reads the head from the TARGET checkpoint, vLLM reads the draft from a separate path. That difference is the whole trick: @@ -91,8 +91,8 @@ separate path. That difference is the whole trick: ``` The alternative drafter (`z-lab/Qwen3.5-9B-DFlash`, 6 layers, target_layer_ids -[1,5,…,29]) stays fetched on disk; flip `FRANK_LARGE_SPEC=dflash` and repoint -`FRANK_LARGE_SPEC_DIR` to use it. Its card's "vLLM PR #40898 unmerged" claim +[1,5,…,29]) stays fetched on disk; flip `FRANK_DRAGOON_SPEC=dflash` and repoint +`FRANK_DRAGOON_SPEC_DIR` to use it. Its card's "vLLM PR #40898 unmerged" claim is FALSE — `vllm/v1/spec_decode/dflash.py` ships in 0.30. ## The numerics trap (greedy text is NOT preserved by spec decode) @@ -109,14 +109,14 @@ chase text drift between spec and no-spec arms as a regression. - Target: 4 safetensors shards (17.53 GiB) + config/tokenizer under `/home/dank/models/MiMo-V2.6-Distill-Qwen-9B-BF16/`, each shard byte-count + LFS sha256-verified by - `old/download-frank-large-mimo.sh` (`--verify-only` re-checks; no token on + `old/download-frank-dragoon-mimo.sh` (`--verify-only` re-checks; no token on the curl command line). -- MTP source: `old/download-frank-large-qwen35.sh` → +- MTP source: `old/download-frank-dragoon-qwen35.sh` → `/home/dank/models/Qwen3.5-9B/` (4 shards behind `model.safetensors.index.json`; the shards carry the odd HF asset names `model.safetensors-0000N-of-00004.safetensors` — the index resolves them, the engine boots from exactly this tree). -- DFlash drafter: `old/download-frank-large-dflash.sh` → +- DFlash drafter: `old/download-frank-dragoon-dflash.sh` → `/home/dank/models/Qwen3.5-9B-DFlash/`. - **Payload status 2026-10-02:** all three trees moved to `/home/dank/.AGENTTRASH/20261002-retired-llm-payloads/` (59 GiB staged with @@ -131,7 +131,7 @@ chase text drift between spec and no-spec arms as a regression. ## Client contract -- **Alias:** `frank-large` (the `id` at `/v1/models`). +- **Alias:** `frank-dragoon` (the `id` at `/v1/models`). - **Reasoning:** `--reasoning-parser qwen3`; vLLM emits the thinking text in **`reasoning`**, NOT llama.cpp/gufo's `reasoning_content` — the harness `models.yml` compat block for this provider sets @@ -146,7 +146,7 @@ chase text drift between spec and no-spec arms as a regression. `chat_template_kwargs.{enable_thinking,preserve_thinking}` — the `chat_template_kwargs` form is what vLLM reads; a top-level `preserve_thinking` is ignored there. -- **Env hygiene:** every tunable is `FRANK_LARGE_`-prefixed because HIP +- **Env hygiene:** every tunable is `FRANK_DRAGOON_`-prefixed because HIP reads bare `TEMP`/`HOST`/`GPU_MAX_HEAP_SIZE` and the serve script exports the env file with `set -a`. @@ -154,23 +154,23 @@ chase text drift between spec and no-spec arms as a regression. - Boot ~200–240 s warm; health 503 while loading (do not kill it). - The serve script sweeps stale container identities before starting: - `frank-large-mimo` itself and the bench-window container `vllm-mimo`. + `frank-dragoon-mimo` itself and the bench-window container `vllm-mimo`. - Container death → `podman wait` returns non-zero from ExecStart → `Restart=always` self-heals (a clean exit-0 drain also restarts, the - frank-primary lesson). -- Bench windows: `systemctl stop frank-large` is enough (mask fails on the + frank-archon lesson). +- Bench windows: `systemctl stop frank-dragoon` is enough (mask fails on the relinked unit; the deploy restores). - First-deploy facts (2026-10-01, deploy #3): healthy after **230 s**; boot log `GPU KV cache size: 819,332 tokens, Maximum concurrency for 262,144 tokens per request: 3.13x` — four sessions share the pool - (the scheduler, not a carve). Live battery green: alias `frank-large`, + (the scheduler, not a carve). Live battery green: alias `frank-dragoon`, reasoning split into `reasoning`, tool_calls with correct args, and `/metrics` acceptance pos0 69% pos1 44% (54/86 draft tokens accepted), matching the bench window. ## Rollback -Git tag **`frank-large-gufo-q4kxl-20261001`** — gufo v0.1.1 (built from +Git tag **`frank-dragoon-gufo-q4kxl-20261001`** — gufo v0.1.1 (built from source, `scripts/build-gufo.sh` stays on disk) + the Q4_K_XL Qwen3.8-27B payload + DFlash2 drafter, all still on the host. Restoring the tag's unit/env/serve trio and redeploying returns the 27B endpoint. @@ -181,6 +181,6 @@ unit/env/serve trio and redeploying returns the 27B endpoint. - Draft source: https://huggingface.co/Qwen/Qwen3.5-9B - DFlash drafter: https://huggingface.co/z-lab/Qwen3.5-9B-DFlash - Engine image: https://hub.docker.com/r/kyuz0/vllm-therock-gfx1151 -- Serve script: `scripts/serve-frank-large.sh`; tunables: `scripts/frank-large.env` -- Predecessor: [[frank-large-gufo-qwen38-27b]]; sibling on the same arch: - [[frank-secondary-sglang-mimo-v26]] +- Serve script: `scripts/serve-frank-dragoon.sh`; tunables: `scripts/frank-dragoon.env` +- Predecessor: [[frank-dragoon-gufo-qwen38-27b]]; sibling on the same arch: + [[frank-zealot-sglang-mimo-v26]] diff --git a/serverAppConfigs-docs/LLM/frank-large-ciru-orca.md b/serverAppConfigs-docs/LLM/frank-large-ciru-orca.md deleted file mode 100644 index a81964e..0000000 --- a/serverAppConfigs-docs/LLM/frank-large-ciru-orca.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -type: reference -title: "CIRU v4.4.1 Orca on Dankclaw (frank-large)" -description: "The retired frank-large runbook (2026-09-19 to 2026-09-21, rollback target) — CIRU v4.4.1 (QSA window hotfix) serving jcbtc/Qwen3.8-Flash-CIRU-STRIX-Orca on the Dankclaw Strix Halo iGPU: the private host build, the runtime gate, the payload, the deployed config, MTP and PLE, the client contract, and the failure modes worth knowing." -tags: - - llm - - ciru - - dankclaw - - frank-large - - strix-halo - - gfx1151 - - qwen4exp - - rocm - - mtp -timestamp: 2026-09-19 ---- diff --git a/serverAppConfigs-docs/LLM/frank-medium-batch-ubatch.md b/serverAppConfigs-docs/LLM/frank-medium-batch-ubatch.md index c12f8b6..7d6d19a 100644 --- a/serverAppConfigs-docs/LLM/frank-medium-batch-ubatch.md +++ b/serverAppConfigs-docs/LLM/frank-medium-batch-ubatch.md @@ -211,7 +211,7 @@ re-checking that 35:30 and 37:28 still fail so the gate keeps discriminating. - [[frank-medium-llamacpp-dflash2]] — the deployment this tuned, and its split history -- [[frank-secondary-benchmark]] — the same sweep on a CUDA 3090, where a 16k prompt +- [[frank-zealot-benchmark]] — the same sweep on a CUDA 3090, where a 16k prompt at depth 0 made prefill climb all the way to ubatch 2048. Depth is the difference: with no KV to attend over, per-pass overhead dominates and a bigger micro-batch wins; at 64k of resident KV it does not. diff --git a/serverAppConfigs-docs/LLM/frank-medium-llamacpp-dflash2.md b/serverAppConfigs-docs/LLM/frank-medium-llamacpp-dflash2.md index 84ad26d..3596cb8 100644 --- a/serverAppConfigs-docs/LLM/frank-medium-llamacpp-dflash2.md +++ b/serverAppConfigs-docs/LLM/frank-medium-llamacpp-dflash2.md @@ -312,7 +312,7 @@ came up healthy and *text-only*: image requests answered 500 "image input is not supported — hint: … provide the mmproj" and the load log had no mmproj line, so `llama-server` fb27a525 does not pick up `mmproj*.gguf` from the model directory. The serve script now passes `--mmproj` explicitly (the -frank-secondary pattern), refuses to start without the file when vision is on, and +frank-zealot pattern), refuses to start without the file when vision is on, and the deploy handler's preflight checks for it. Verified end-to-end after the fix: a generated 64x32 test image was described from its pixels — with thinking on the model reasoned about "the three horizontal bars" (its reading @@ -724,7 +724,7 @@ fleet. 2026-09-15, whose `--split-mode layer` measurements this service reuses - [[Dual-R9700-Cooperation]] — why the two cards cannot take part in a collective, and every software escape that is closed -- [[frank-secondary-qwen38-gsq-rco]] — the fleet's other llama.cpp endpoint (RTX +- [[frank-zealot-qwen38-gsq-rco]] — the fleet's other llama.cpp endpoint (RTX 3090, MTP, the image path) - [[Dankserver System Specs]] — hardware inventory - [[frank-medium-batch-ubatch]] — the batch/ubatch sweep that set the deployed diff --git a/serverAppConfigs-docs/LLM/frank-medium-radiance-mxfp4.md b/serverAppConfigs-docs/LLM/frank-medium-radiance-mxfp4.md index a0c2139..6160ada 100644 --- a/serverAppConfigs-docs/LLM/frank-medium-radiance-mxfp4.md +++ b/serverAppConfigs-docs/LLM/frank-medium-radiance-mxfp4.md @@ -602,7 +602,7 @@ but not both. That is the wall, and it is capacity, not scheduling. ### Watching it instead of measuring it by hand Everything above was diagnosed with ad-hoc probes. The same signals are now -scraped — Prometheus has `frank-medium` and `frank-large` jobs +scraped — Prometheus has `frank-medium` and `frank-dragoon` jobs (`shared/prometheus/prometheus.yml`), so the numbers that matter have history: `vllm:kv_cache_usage_perc` (per-card pool fill), `vllm:num_requests_waiting` (queue depth), `rate(vllm:prefix_cache_hits_total[5m]) / diff --git a/serverAppConfigs-docs/LLM/frank-medium-rocmfpx.md b/serverAppConfigs-docs/LLM/frank-medium-rocmfpx.md index 6f59385..2474853 100644 --- a/serverAppConfigs-docs/LLM/frank-medium-rocmfpx.md +++ b/serverAppConfigs-docs/LLM/frank-medium-rocmfpx.md @@ -144,7 +144,7 @@ ggml/src/ggml-backend.cpp:119: GGML_ASSERT(buffer) failed First deploy (2026-09-15) also ran `retire_root_llm_small()` in `scripts/deploy-remote.sh`: the CUDA-era `frank-small` unit was stopped, -disabled and moved to `~/.AGENTTRASH/20260915-frank-secondary-retire/host-units` +disabled and moved to `~/.AGENTTRASH/20260915-frank-zealot-retire/host-units` (the host's `systemctl disable` has been observed to delete unit files, 2026-08-26 incident, so both outcomes are tolerated). @@ -156,7 +156,7 @@ Deployed flags (see `scripts/frank-medium.env` for the full set): hidden state is produced. Reasoning on, deepseek format, unlimited budget; sampler defaults are the checkpoint's instruct table (temp 0.7, top-p 0.8, top-k 20, min-p 0, presence 1.5). Text only — vision stays on -`frank-large` (Dankclaw). +`frank-dragoon` (Dankclaw). ## Verified serving behavior (2026-09-15) @@ -181,7 +181,7 @@ are projected into `reasoning_content` (deepseek format); requests that send no sampler fields get the server's CLI defaults, not greedy. Text only. Harness routing after the cutover: blankpad `smol`/`tiny`/`commit`/`default` → `frank-medium`, Hermes `title_generation` (and its other dankserver-small -routes) → `frank-medium`, vision stays `frank-large`. +routes) → `frank-medium`, vision stays `frank-dragoon`. ## Host ROCm posture (post-cleanup) diff --git a/serverAppConfigs-docs/LLM/frank-npu.md b/serverAppConfigs-docs/LLM/frank-npu.md index bab3c5a..49b4b59 100644 --- a/serverAppConfigs-docs/LLM/frank-npu.md +++ b/serverAppConfigs-docs/LLM/frank-npu.md @@ -48,17 +48,17 @@ upstream project on this exact silicon. That single flag is the whole decision: Consequences accepted at retirement: **audio input left the fleet with no replacement** (halogen reads images only, no audio or video), and the surviving -image path is halogen's vision tower on `frank-large`. +image path is halogen's vision tower on `frank-dragoon`. ## Where its routes went | consumer | setting | now | |---|---|---| -| Hermes | `auxiliary.vision` | `dankclaw-large` / `frank-large` (halogen vision tower) | -| Hermes | `auxiliary.title_generation` | `dankserver-small` / `frank-secondary` | -| harness (`~/.omp/agent/models.yml`) | `modelRoles.vision` | `llamacpp (dankclaw)` / `frank-large` | -| harness | `modelRoles.tiny` | `llamacpp (dankserver)` / `frank-secondary` | -| harness | `modelRoles.task` | `llamacpp (dankclaw)` / `frank-large:medium` | +| Hermes | `auxiliary.vision` | `dankclaw-large` / `frank-dragoon` (halogen vision tower) | +| Hermes | `auxiliary.title_generation` | `dankserver-small` / `frank-zealot` | +| harness (`~/.omp/agent/models.yml`) | `modelRoles.vision` | `llamacpp (dankclaw)` / `frank-dragoon` | +| harness | `modelRoles.tiny` | `llamacpp (dankserver)` / `frank-zealot` | +| harness | `modelRoles.task` | `llamacpp (dankclaw)` / `frank-dragoon:medium` | The `flm (dankclaw-npu)` provider block was removed from the harness model config, and the `dankclaw-npu` provider from Hermes's live `config.yaml`. @@ -104,7 +104,7 @@ all live-verified on the host: carried `iommu=off`. With IOMMU off there are no IOMMU groups and no PASID state; `PASIDCtl: Enable-` was observed on `0000:c5:00.1`. 3. The fix was `iommu=pt`: passthrough keeps the iGPU default domain - identity-mapped (no DMA-translation overhead for `frank-large`) while + identity-mapped (no DMA-translation overhead for `frank-dragoon`) while enabling the IOMMU hardware and PASID that the driver's SVA bind needs. 4. Post-boot verification: `/sys/kernel/iommu_groups/` populated (30 groups), zero `SVA bind device failed` entries since boot, `accel0` recreated at diff --git a/serverAppConfigs-docs/LLM/frank-redo-2026-08-17.md b/serverAppConfigs-docs/LLM/frank-redo-2026-08-17.md index 6543fe9..d92bcaa 100644 --- a/serverAppConfigs-docs/LLM/frank-redo-2026-08-17.md +++ b/serverAppConfigs-docs/LLM/frank-redo-2026-08-17.md @@ -17,15 +17,15 @@ The old scripts moved to `old/scripts/` in this repository. | Service | Host | Runtime | Model | Port | |---------|------|---------|-------|------| -| frank-large | Dankserver | llama.cpp (patched FastMTP) | HauhauCS Qwen3.8-27B-Uncensored-Aggressive IQ4_XS | 7770 | -| frank-secondary | Dankclaw | vLLM ROCm | nameistoken Qwen3.6-35B-A3B Quark W8A8 INT8 | 52625 | +| frank-dragoon | Dankserver | llama.cpp (patched FastMTP) | HauhauCS Qwen3.8-27B-Uncensored-Aggressive IQ4_XS | 7770 | +| frank-zealot | Dankclaw | vLLM ROCm | nameistoken Qwen3.6-35B-A3B Quark W8A8 INT8 | 52625 | The RTX 3090 runs the whole 27B model standalone. No RPC worker, no tensor split, no NPU. ## Models -### frank-large — HauhauCS/Qwen3.8-27B-Uncensored-HauhauCS-Aggressive-MTP-GGUF:IQ4_XS +### frank-dragoon — HauhauCS/Qwen3.8-27B-Uncensored-HauhauCS-Aggressive-MTP-GGUF:IQ4_XS - Base: Qwen3.8-27B (dense 27B, 64 layers: 48 GatedDeltaNet + 16 gated-attention, hidden 5120, 24 Q heads / 4 KV heads, head dim 256, @@ -40,7 +40,7 @@ tensor split, no NPU. `--spec-draft-ngl all`, `--spec-draft-p-min 0`) then ngram-mod fallback (48/64/24). -### frank-secondary — nameistoken/Qwen3.6-35B-A3B-Quark-W8A8-INT8 +### frank-zealot — nameistoken/Qwen3.6-35B-A3B-Quark-W8A8-INT8 - Base: Qwen3.6-35B-A3B (hybrid MoE, 256 experts top-8, ~3B active, 40 layers: 10 blocks of 3 DeltaNet + 1 Attention, native 262144 ctx). @@ -55,7 +55,7 @@ tensor split, no NPU. instead of the Qwen3 XML structure). The Quark quant follows the format cleanly; swapped in the evening of 2026-08-17. -## Context Math (frank-large, RTX 3090) +## Context Math (frank-dragoon, RTX 3090) KV per token: 16 attention layers x 4 KV heads x 256 dim. K q8_0 = 1088 B/token, V f16 = 2048 B/token, total 50176 B/token. @@ -72,11 +72,11 @@ Budget (MiB): 24576 total - 14982 weights - 861 draft - 1024 fixed Production choice: **131072 (128K)** — the maximum that keeps about 1.4 GiB headroom for checkpoints. Lower `CTX_SIZE` in -`scripts/frank-large.env` to 122880 for ~1.8 GiB headroom. +`scripts/frank-dragoon.env` to 122880 for ~1.8 GiB headroom. ## Install Runbook -### Dankserver (frank-large) +### Dankserver (frank-dragoon) 1. Stop the old worker: `sudo systemctl stop frank-pp-worker`. 2. Download the model and draft to `/home/dank/models/hauhaucs-qwen38/`. @@ -96,17 +96,17 @@ Production choice: **131072 (128K)** — the maximum that keeps about measured 95 t/s vs 1300+ t/s at 8K on the 3090). 4. Symlink the unit, reload, enable, restart: ``` - sudo ln -sf /home/dank/vLLM/scripts/frank-large.service /etc/systemd/system/ - sudo systemctl daemon-reload && sudo systemctl enable frank-large - sudo systemctl restart frank-large + sudo ln -sf /home/dank/vLLM/scripts/frank-dragoon.service /etc/systemd/system/ + sudo systemctl daemon-reload && sudo systemctl enable frank-dragoon + sudo systemctl restart frank-dragoon ``` 5. Verify: `curl -sf http://127.0.0.1:7770/health` and a chat completion. 6. Confirm VRAM headroom with `nvidia-smi`. -### Dankclaw (frank-secondary) +### Dankclaw (frank-zealot) -1. Stop the old services: `sudo systemctl stop frank-large - frank-secondary` (retired PP head and NPU endpoint). +1. Stop the old services: `sudo systemctl stop frank-dragoon + frank-zealot` (retired PP head and NPU endpoint). 2. Install uv and create the venv: ``` curl -LsSf https://astral.sh/uv/install.sh | sh @@ -131,9 +131,9 @@ Production choice: **131072 (128K)** — the maximum that keeps about vision encoder falls back to torch SDPA and engine init OOMs. 5. Symlink the unit, reload, enable, restart: ``` - sudo ln -sf /home/dank/vllmScripts/scripts/frank-secondary.service /etc/systemd/system/ - sudo systemctl daemon-reload && sudo systemctl enable frank-secondary - sudo systemctl restart frank-secondary + sudo ln -sf /home/dank/vllmScripts/scripts/frank-zealot.service /etc/systemd/system/ + sudo systemctl daemon-reload && sudo systemctl enable frank-zealot + sudo systemctl restart frank-zealot ``` 6. Verify: `curl -sf http://127.0.0.1:52625/health` and a chat completion. @@ -159,7 +159,7 @@ on gfx1151; newer vLLM releases may already include it. Three changes landed after the initial deployment: -### 1. Tool calling on frank-secondary (HTTP 400 fix) +### 1. Tool calling on frank-zealot (HTTP 400 fix) Clients (pi) send `tool_choice: "auto"`. vLLM rejects it with HTTP 400 unless the server enables tool calling. Fixes applied: @@ -184,7 +184,7 @@ model behavior, which motivated the swap. ### 2. Model swap: Avesed INT8 W8A8 -> Quark W8A8 INT8 -`frank-secondary` now serves +`frank-zealot` now serves `nameistoken/Qwen3.6-35B-A3B-Quark-W8A8-INT8` (AMD Quark 0.11.1, ~35 GB, vLLM-native expert layout). The Avesed compressed-tensors quant's Qwen3-XML tool fidelity was poor. Verified with the Quark model: plain diff --git a/serverAppConfigs-docs/LLM/frank-secondary-qwen38-gsq-rco.md b/serverAppConfigs-docs/LLM/frank-secondary-qwen38-gsq-rco.md deleted file mode 100644 index 7c72457..0000000 --- a/serverAppConfigs-docs/LLM/frank-secondary-qwen38-gsq-rco.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -type: reference -title: "frank-secondary on Dankclaw — llama.cpp, Qwen3.8-27B GSQ-RCO IQ3_S" -description: "The RETIRED frank-secondary runbook (2026-09-16 → 09-17, rollback target) — mainline llama.cpp on Dankclaw's RTX 3090 serving ISTA-DASLab Qwen3.8-27B-GSQ-RCO at IQ3_S with the model's own in-file MTP head and the BF16 vision projector: identity, KV arithmetic, deployed flags, the MTP contract, the client contract, and what to check when it misbehaves." -tags: - - llm - - frank-secondary - - dankclaw - - llama.cpp - - rtx3090 - - qwen35 - - mtp - - vision -timestamp: 2026-09-16 ---- diff --git a/serverAppConfigs-docs/LLM/frank-secondary-benchmark.md b/serverAppConfigs-docs/LLM/frank-zealot-benchmark.md similarity index 94% rename from serverAppConfigs-docs/LLM/frank-secondary-benchmark.md rename to serverAppConfigs-docs/LLM/frank-zealot-benchmark.md index 92418a6..d91e2cb 100644 --- a/serverAppConfigs-docs/LLM/frank-secondary-benchmark.md +++ b/serverAppConfigs-docs/LLM/frank-zealot-benchmark.md @@ -1,7 +1,7 @@ --- timestamp: 2026-09-03 type: reference -title: frank-secondary Benchmark — ncmoe and Batch Tuning +title: frank-zealot Benchmark — ncmoe and Batch Tuning description: llama-bench sweep of MoE CPU offload (ncmoe) and batch/ubatch on the RTX 3090 for Qwen3.6-35B-A3B Q6_K_P. tags: - benchmark @@ -11,11 +11,11 @@ tags: - dankserver --- -# frank-secondary Benchmark — ncmoe and Batch/Ubatch Tuning +# frank-zealot Benchmark — ncmoe and Batch/Ubatch Tuning This page records a llama-bench sweep on Dankserver (RTX 3090, 24 GiB) for the HauhauCS Qwen3.6-35B-A3B Q6_K_P model. The sweep decided the final -`--n-cpu-moe` and `--ubatch-size` values for `frank-secondary`. +`--n-cpu-moe` and `--ubatch-size` values for `frank-zealot`. Run date: 2026-08-13. Build: llama.cpp `555881ebc` (10121). CUDA, 7 threads, `--cache-type-k q8_0 --cache-type-v f16`, `--fit-target 0` (KV auto-sized to @@ -106,7 +106,7 @@ service runs 700416 cells (13,680 MiB). ## Chosen State -> **Live drift (2026-08-22 audit):** the deployed `frank-secondary` now runs `--n-cpu-moe 38`, `--batch-size 4096`, `--ubatch-size 2048` (ncmoe raised from 36 for stability; batch lowered). The values below are the original benchmark recommendation. +> **Live drift (2026-08-22 audit):** the deployed `frank-zealot` now runs `--n-cpu-moe 38`, `--batch-size 4096`, `--ubatch-size 2048` (ncmoe raised from 36 for stability; batch lowered). The values below are the original benchmark recommendation. Prefill speed is the priority, so the state keeps the top prefill tier and moves one expert layer to CPU for stability: diff --git a/serverAppConfigs-docs/LLM/frank-secondary-gemma4-12b.md b/serverAppConfigs-docs/LLM/frank-zealot-gemma4-12b.md similarity index 74% rename from serverAppConfigs-docs/LLM/frank-secondary-gemma4-12b.md rename to serverAppConfigs-docs/LLM/frank-zealot-gemma4-12b.md index 42deb5b..a2b28c8 100644 --- a/serverAppConfigs-docs/LLM/frank-secondary-gemma4-12b.md +++ b/serverAppConfigs-docs/LLM/frank-zealot-gemma4-12b.md @@ -1,10 +1,10 @@ --- type: reference -title: "frank-secondary on Dankclaw — llama.cpp, Gemma4-12B QAT Q4_K_M" -description: "The active frank-secondary runbook — mainline llama.cpp on Dankclaw's RTX 3090 serving HauhauCS Gemma4-12B-QAT-Uncensored-HauhauCS-Balanced at Q4_K_M with a separate MTP assistant sidecar chained behind ngram-mod, q8_0 KV, and --fit sizing the full 262k window: identity, payload, KV arithmetic, the spec-decode chain, deployed flags, the client contract, and what to check when it misbehaves." +title: "frank-zealot on Dankclaw — llama.cpp, Gemma4-12B QAT Q4_K_M" +description: "The active frank-zealot runbook — mainline llama.cpp on Dankclaw's RTX 3090 serving HauhauCS Gemma4-12B-QAT-Uncensored-HauhauCS-Balanced at Q4_K_M with a separate MTP assistant sidecar chained behind ngram-mod, q8_0 KV, and --fit sizing the full 262k window: identity, payload, KV arithmetic, the spec-decode chain, deployed flags, the client contract, and what to check when it misbehaves." tags: - llm - - frank-secondary + - frank-zealot - dankclaw - llama.cpp - rtx3090 @@ -14,25 +14,25 @@ tags: timestamp: 2026-09-17 --- -# frank-secondary — llama.cpp Gemma4-12B QAT Q4_K_M (MTP + ngram-mod) +# frank-zealot — llama.cpp Gemma4-12B QAT Q4_K_M (MTP + ngram-mod) -> **ACTIVE since 2026-09-17.** Replaces [[frank-secondary-qwen38-gsq-rco]] +> **ACTIVE since 2026-09-17.** Replaces [[frank-zealot-qwen38-gsq-rco]] > (ISTA-DASLab Qwen3.8-27B-GSQ-RCO IQ3_S, now the rollback target) and -> [[frank-secondary-vllm-gemma4]] (the same-day vLLM experiment, also the -> rollback target). Same port (7771), same alias (`frank-secondary`), same +> [[frank-zealot-vllm-gemma4]] (the same-day vLLM experiment, also the +> rollback target). Same port (7771), same alias (`frank-zealot`), same > client contract surface. ## Identity -- **Endpoint:** `frank-secondary` at `192.168.0.143:7771` (Dankclaw). +- **Endpoint:** `frank-zealot` at `192.168.0.143:7771` (Dankclaw). - **Runtime:** mainline llama.cpp master `37b53fd`, CUDA build for sm_86 with `-DGGML_CUDA_FA_ALL_QUANTS=ON` (`/home/dank/GitPackages/llama.cpp-mainline/build-cuda/bin/llama-server`). The FA_ALL_QUANTS flag is required: without it, q8_0 KV + flash attention collapses prefill ~12x on CUDA. -- **Service shape:** root systemd unit `scripts/frank-secondary.service` - (`User=dank`), launched by `scripts/serve-frank-secondary.sh` with tunables from - `scripts/frank-secondary.env`. +- **Service shape:** root systemd unit `scripts/frank-zealot.service` + (`User=dank`), launched by `scripts/serve-frank-zealot.sh` with tunables from + `scripts/frank-zealot.env`. ## Shape @@ -51,7 +51,7 @@ timestamp: 2026-09-17 the card. 4 is the measured max. - **Placement:** the whole model in VRAM (`--gpu-layers 999`); the host CPU only tokenizes and samples (its CPU belongs to the halogen engine serving - frank-large). + frank-dragoon). ## Spec method @@ -90,7 +90,7 @@ fault). ## Client contract -- **Alias:** `frank-secondary` (the `id` at `/v1/models`). +- **Alias:** `frank-zealot` (the `id` at `/v1/models`). - **Reasoning:** extracted to `reasoning_content` (`--reasoning-format deepseek`, unlimited budget). - **Tools:** supported (`--jinja` is pinned even though this build defaults @@ -109,12 +109,12 @@ pp ~965 t/s, tg 257–302 t/s, idle 23,300 MiB of 24,576. Larger ubatches ## Rollback -Payload and runtime for [[frank-secondary-qwen38-gsq-rco]] (ISTA-DASLab -Qwen3.8-27B-GSQ-RCO IQ3_S) remain intact on disk. [[frank-secondary-vllm-gemma4]] +Payload and runtime for [[frank-zealot-qwen38-gsq-rco]] (ISTA-DASLab +Qwen3.8-27B-GSQ-RCO IQ3_S) remain intact on disk. [[frank-zealot-vllm-gemma4]] is the same-day vLLM experiment (also a rollback target). # Citations - Model + mmproj + MTP sidecar: https://huggingface.co/HauhauCS - llama.cpp: https://github.com/ggml-org/llama.cpp -- Serve script: `scripts/serve-frank-secondary.sh`; tunables: `scripts/frank-secondary.env` +- Serve script: `scripts/serve-frank-zealot.sh`; tunables: `scripts/frank-zealot.env` diff --git a/serverAppConfigs-docs/LLM/frank-secondary-llama-gemma4-q4km-200704.md b/serverAppConfigs-docs/LLM/frank-zealot-llama-gemma4-q4km-200704.md similarity index 96% rename from serverAppConfigs-docs/LLM/frank-secondary-llama-gemma4-q4km-200704.md rename to serverAppConfigs-docs/LLM/frank-zealot-llama-gemma4-q4km-200704.md index e1c4cd8..8a5dd32 100644 --- a/serverAppConfigs-docs/LLM/frank-secondary-llama-gemma4-q4km-200704.md +++ b/serverAppConfigs-docs/LLM/frank-zealot-llama-gemma4-q4km-200704.md @@ -1,7 +1,7 @@ -# frank-secondary — llama.cpp CUDA, Gemma4-26B-A4B Q4_K_M, 1×200,704 (Dankclaw) +# frank-zealot — llama.cpp CUDA, Gemma4-26B-A4B Q4_K_M, 1×200,704 (Dankclaw) **RETIRED 2026-10-07** — same day it went live. Superseded by -[[frank-secondary-llama-qwen35-9b-q6k-2x200704]] (Qwen3.5-9B Q6_K at +[[frank-zealot-llama-qwen35-9b-q6k-2x200704]] (Qwen3.5-9B Q6_K at 2 × 200,704 with exact KV); the payload stays at `/home/dank/models/Gemma4-26B-A4B/` as the rollback. This page keeps the Gemma4 KV-billing law (the `attention_k_eq_v` pair-billing measurement) and @@ -108,4 +108,4 @@ free). Revert to the Swift trio: `MODEL_FILE=/home/dank/models/Swift15-UncIQ3XXS/…`, `CTX_SIZE=229376`, `PARALLEL=2`, in-file `SPEC_TYPE=draft-mtp` — the Swift payload remains on disk. See -[[frank-secondary-llama-swift15-unc-iq3xxs-mtp-114688]]. +[[frank-zealot-llama-swift15-unc-iq3xxs-mtp-114688]]. diff --git a/serverAppConfigs-docs/LLM/frank-secondary-llama-mimo-q5km.md b/serverAppConfigs-docs/LLM/frank-zealot-llama-mimo-q5km.md similarity index 75% rename from serverAppConfigs-docs/LLM/frank-secondary-llama-mimo-q5km.md rename to serverAppConfigs-docs/LLM/frank-zealot-llama-mimo-q5km.md index a7a7f02..c119add 100644 --- a/serverAppConfigs-docs/LLM/frank-secondary-llama-mimo-q5km.md +++ b/serverAppConfigs-docs/LLM/frank-zealot-llama-mimo-q5km.md @@ -1,10 +1,10 @@ --- type: reference -title: "frank-secondary on Dankclaw — llama.cpp, MiMo-V2.6-Distill-Qwen-9B Q5_K_M GGUF (retired)" -description: "The retired 2026-10-02/03 frank-secondary runbook — the Q5_K_M rung at two wide unquantized-KV slots on the RTX 3090, superseded 2026-10-03 by the Q6_K file. Kept as the rollback reference: it carries the measured boot-pair table that prices every pool shape on this card, the slot-window contract, and the misbehaves tree." +title: "frank-zealot on Dankclaw — llama.cpp, MiMo-V2.6-Distill-Qwen-9B Q5_K_M GGUF (retired)" +description: "The retired 2026-10-02/03 frank-zealot runbook — the Q5_K_M rung at two wide unquantized-KV slots on the RTX 3090, superseded 2026-10-03 by the Q6_K file. Kept as the rollback reference: it carries the measured boot-pair table that prices every pool shape on this card, the slot-window contract, and the misbehaves tree." tags: - llm - - frank-secondary + - frank-zealot - dankclaw - llama-cpp - rtx3090 @@ -14,17 +14,17 @@ tags: timestamp: 2026-10-03 --- -# frank-secondary — llama.cpp MiMo-V2.6 Q5_K_M (RTX 3090, retired) +# frank-zealot — llama.cpp MiMo-V2.6 Q5_K_M (RTX 3090, retired) > **RETIRED 2026-10-03** — superseded by -> [[frank-secondary-llama-mimo-q6k-2x200704]]: the ~3.5 GiB this shape left free +> [[frank-zealot-llama-mimo-q6k-2x200704]]: the ~3.5 GiB this shape left free > bought the **Q6_K quant rung** (same runtime, same 2 × 200,704 pool, same > f16 KV), which measures 2,849 MiB free and 94.44 tok/s — 10 % slower > decode is the measured price of the higher rung on this bandwidth-bound > card. This file remains the rollback reference and the owner of the > measured boot-pair table. -> Its own history: one quant step down from [[frank-secondary-llama-mimo-q6k]] +> Its own history: one quant step down from [[frank-zealot-llama-mimo-q6k]] > (2026-10-01), resized twice on 2026-10-02 (three contexts with vision, then > the 2–3 GiB-band pool), and on 2026-10-03 morning reshaped to **two > conversations of 200,704 tokens with the KV VALUES unquantized** — @@ -36,11 +36,11 @@ timestamp: 2026-10-03 |Field|Value| |---|---| -|Endpoint|`192.168.0.143:7771`, served alias `frank-secondary`| +|Endpoint|`192.168.0.143:7771`, served alias `frank-zealot`| |Runtime|llama.cpp **master** (qwen35 model support), CUDA build `sm_86`, at `/home/dank/GitPackages/llama-master/build-cuda/bin/llama-server` — unchanged across the quant swap| -|Payload|`bartowski/MiMo-V2.6-Distill-Qwen-9B-GGUF` **Q5_K_M**, 6,876,124,704 B (6.40 GiB), sha256 `04cf46f2b5584ef922697d6c063f94879434fb86c467f1a09e52daf0cddaf35f` + the repo's `mmproj-MiMo-V2.6-Distill-Qwen-9B-f16.gguf`, 918,166,048 B, sha256 `ff348f3180a63188aa7285db85f550fe38acb61dd013c599eb8bad08d2cc2576` — both at `/home/dank/models/MiMo-Q5KM/`, fetched and byte- and sha256-verified by `scripts/download-frank-secondary.sh`| -|Unit|root `frank-secondary.service` (repo `scripts/frank-secondary.service`, `User=dank`, relinked), env `scripts/frank-secondary.env`, serve `scripts/serve-frank-secondary.sh`| -|Repo pins|`tests/frank_secondary_unit.bats` (stub-argv seam + the VRAM arithmetic), `deploy_llm_secondary` gates in `scripts/deploy-remote.sh`| +|Payload|`bartowski/MiMo-V2.6-Distill-Qwen-9B-GGUF` **Q5_K_M**, 6,876,124,704 B (6.40 GiB), sha256 `04cf46f2b5584ef922697d6c063f94879434fb86c467f1a09e52daf0cddaf35f` + the repo's `mmproj-MiMo-V2.6-Distill-Qwen-9B-f16.gguf`, 918,166,048 B, sha256 `ff348f3180a63188aa7285db85f550fe38acb61dd013c599eb8bad08d2cc2576` — both at `/home/dank/models/MiMo-Q5KM/`, fetched and byte- and sha256-verified by `scripts/download-frank-zealot.sh`| +|Unit|root `frank-zealot.service` (repo `scripts/frank-zealot.service`, `User=dank`, relinked), env `scripts/frank-zealot.env`, serve `scripts/serve-frank-zealot.sh`| +|Repo pins|`tests/frank_zealot_unit.bats` (stub-argv seam + the VRAM arithmetic), `deploy_llm_zealot` gates in `scripts/deploy-remote.sh`| ## Shape and the KV contract @@ -100,13 +100,13 @@ The per-slot window is the whole price, in both directions: - **A prompt over 200,704 tokens is a hard 400**, so `~/.omp/agent/models.yml` sets `contextWindow: 200704` for this endpoint — the harness compacts before it reaches the ceiling instead of discovering it. -- **frank-large's tallest pre-compaction prompt now fits here.** Compaction - for frank-large sessions runs on this endpoint (`compactionModel` in - `models.yml`); frank-large compacts at 70 % of 262,144 = 183,501 tokens, +- **frank-dragoon's tallest pre-compaction prompt now fits here.** Compaction + for frank-dragoon sessions runs on this endpoint (`compactionModel` in + `models.yml`); frank-dragoon compacts at 70 % of 262,144 = 183,501 tokens, which did **not** fit the old 180,224 slot and fits 200,704 with 17,163 tokens to spare. The 2026-10-02 window trim had restored the fit for - frank-primary's smaller 140,492-token trigger; the 2026-10-03 reslice widens - the fit to frank-large itself. Nothing routes compaction automatically — + frank-archon's smaller 140,492-token trigger; the 2026-10-03 reslice widens + the fit to frank-dragoon itself. Nothing routes compaction automatically — the point is the ceiling no longer forbids it. - Two simultaneous generations are the slot ceiling; a third request queues behind a released slot (the mechanism measured on the 3-slot shape). @@ -128,7 +128,7 @@ The per-slot window is the whole price, in both directions: "Brown.", i.e. it generated from text alone. `/completion` takes `images` but refuses a request without `messages` in this build, so chat is the only vision path. -- Setting `MMPROJ_FILE=` (explicitly empty) in `scripts/frank-secondary.env` drops +- Setting `MMPROJ_FILE=` (explicitly empty) in `scripts/frank-zealot.env` drops `--mmproj` and returns ~1.4 GiB of the card to KV — the documented text-only opt-out. `MMPROJ_FILE` pointing at a file that does not exist is a boot refusal, never a silent fallback to blindness. @@ -145,15 +145,15 @@ traffic first. The bats seam fails if a draft flag ships unannounced. |Target|How| |---|---| -|Previous shape: 3 × 180,224 + q8_0 V (2026-10-02)|`scripts/frank-secondary.env` `CTX_SIZE=540672 PARALLEL=3 CACHE_TYPE_V=q8_0` (measured 21,684 MiB used, 2,441 free) and `contextWindow: 180224` in `models.yml` — choose it when three simultaneous conversations matter more than per-slot window or exact V| -|Q6_K, same runtime|`scripts/frank-secondary.env` `MODEL_FILE=/home/dank/models/MiMo-Q6K/MiMo-V2.6-Distill-Qwen-9B-Q6_K.gguf` + `MMPROJ_FILE` in that dir — **this is the deployed rung since 2026-10-03** ([[frank-secondary-llama-mimo-q6k-2x200704]]): at 2 × 200,704 it fits with 2,849 MiB free, no pool cut needed (the older "+1.4 GiB, drop 49,152 tokens" estimate held only for the 3-slot shapes)| +|Previous shape: 3 × 180,224 + q8_0 V (2026-10-02)|`scripts/frank-zealot.env` `CTX_SIZE=540672 PARALLEL=3 CACHE_TYPE_V=q8_0` (measured 21,684 MiB used, 2,441 free) and `contextWindow: 180224` in `models.yml` — choose it when three simultaneous conversations matter more than per-slot window or exact V| +|Q6_K, same runtime|`scripts/frank-zealot.env` `MODEL_FILE=/home/dank/models/MiMo-Q6K/MiMo-V2.6-Distill-Qwen-9B-Q6_K.gguf` + `MMPROJ_FILE` in that dir — **this is the deployed rung since 2026-10-03** ([[frank-zealot-llama-mimo-q6k-2x200704]]): at 2 × 200,704 it fits with 2,849 MiB free, no pool cut needed (the older "+1.4 GiB, drop 49,152 tokens" estimate held only for the 3-slot shapes)| |Two 262,144 windows|`CTX_SIZE=524288 PARALLEL=2 CACHE_TYPE_V=q8_0` (measured 20,190 MiB used, 4,386 free **with q8_0 V** — with f16 V the same shape is 16,384 MiB of KV + ~7,986 non-KV and does not fit) and `contextWindow: 262144` in `models.yml` — choose it when a single conversation needs the native window| -|Vision off|`MMPROJ_FILE=` in the env file; the deployer gate then has to be satisfied too, so point `LLM_SECONDARY_MMPROJ` at any real projector file or drop the gate in the same commit| -|SGLang + INT8|[[frank-secondary-sglang-mimo-v26]] — venv and old unit/env/serve trio still in place; the INT8 payload was staged to `/home/dank/.AGENTTRASH/20261002-retired-llm-payloads/` on 2026-10-02, so restore it there or re-fetch with `old/download-frank-secondary-sglang-int8.sh`| +|Vision off|`MMPROJ_FILE=` in the env file; the deployer gate then has to be satisfied too, so point `LLM_ZEALOT_MMPROJ` at any real projector file or drop the gate in the same commit| +|SGLang + INT8|[[frank-zealot-sglang-mimo-v26]] — venv and old unit/env/serve trio still in place; the INT8 payload was staged to `/home/dank/.AGENTTRASH/20261002-retired-llm-payloads/` on 2026-10-02, so restore it there or re-fetch with `old/download-frank-zealot-sglang-int8.sh`| ## When it misbehaves -- Port 7771 dark: `journalctl -u frank-secondary -n 50`; the serve script exits 1 +- Port 7771 dark: `journalctl -u frank-zealot -n 50`; the serve script exits 1 naming the missing file if the binary or GGUF moved. - `No CUDA GPUs are available`: the 3090 vanished from the bus or the UVM node is missing — `nvidia-modprobe -u -c=0` (the serve script runs it). diff --git a/serverAppConfigs-docs/LLM/frank-secondary-llama-mimo-q6k-2x200704.md b/serverAppConfigs-docs/LLM/frank-zealot-llama-mimo-q6k-2x200704.md similarity index 77% rename from serverAppConfigs-docs/LLM/frank-secondary-llama-mimo-q6k-2x200704.md rename to serverAppConfigs-docs/LLM/frank-zealot-llama-mimo-q6k-2x200704.md index d4281a6..10a4c0f 100644 --- a/serverAppConfigs-docs/LLM/frank-secondary-llama-mimo-q6k-2x200704.md +++ b/serverAppConfigs-docs/LLM/frank-zealot-llama-mimo-q6k-2x200704.md @@ -1,10 +1,10 @@ --- type: reference -title: "frank-secondary on Dankclaw — llama.cpp, MiMo-V2.6 Q6_K, 2 x 200704, f16 KV (RETIRED)" -description: "The RETIRED frank-secondary runbook (2026-10-03 → 10-05 evening, rollback target) — llama.cpp master (CUDA sm_86) serving bartowski's MiMo-V2.6-Distill-Qwen-9B Q6_K GGUF on the RTX 3090: two conversations of 200,704 tokens with fully unquantized f16 KV, vision through the bundled projector, and the boot-pair arithmetic that prices every pool change. Superseded by the Swift-1.5-27B IQ3_S-mtp swap." +title: "frank-zealot on Dankclaw — llama.cpp, MiMo-V2.6 Q6_K, 2 x 200704, f16 KV (RETIRED)" +description: "The RETIRED frank-zealot runbook (2026-10-03 → 10-05 evening, rollback target) — llama.cpp master (CUDA sm_86) serving bartowski's MiMo-V2.6-Distill-Qwen-9B Q6_K GGUF on the RTX 3090: two conversations of 200,704 tokens with fully unquantized f16 KV, vision through the bundled projector, and the boot-pair arithmetic that prices every pool change. Superseded by the Swift-1.5-27B IQ3_S-mtp swap." tags: - llm - - frank-secondary + - frank-zealot - dankclaw - llama-cpp - gguf @@ -12,10 +12,10 @@ tags: timestamp: 2026-10-03 --- -# frank-secondary — llama.cpp MiMo Q6_K, 2 × 200,704, f16 KV +# frank-zealot — llama.cpp MiMo Q6_K, 2 × 200,704, f16 KV > **RETIRED 2026-10-05 (evening).** Superseded by -> [[frank-secondary-llama-swift15-unc-iq3xxs-mtp-114688]] — the Swift-1.5-27B +> [[frank-zealot-llama-swift15-unc-iq3xxs-mtp-114688]] — the Swift-1.5-27B > RCO-IQ3_XXS-mtp swap (uncensored, MTP drafted). Two facts for the trail: > committed earlier the same day (77decb5..380aafa) was **never deployed** — > THIS MiMo shape was the live payload when Swift cut over; (2) the KV @@ -29,14 +29,14 @@ timestamp: 2026-10-03 | | | |---|---| | Host / device | Dankclaw (192.168.0.143), RTX 3090, 24,576 MiB | -| Endpoint | `http://192.168.0.143:7771` — alias `frank-secondary`, `/v1` OpenAI surface | +| Endpoint | `http://192.168.0.143:7771` — alias `frank-zealot`, `/v1` OpenAI surface | | Runtime | llama.cpp master, CUDA sm_86 build `…/llama-master/build-cuda/bin/llama-server` (`GGML_CUDA_FA_ALL_QUANTS=ON`) | -| Unit | root systemd `frank-secondary.service` ([`scripts/frank-secondary.service`](../../scripts/frank-secondary.service)), `User=dank`, `Restart=on-failure`, `LimitMEMLOCK=infinity` | -| Serve script | [`scripts/serve-frank-secondary.sh`](../../scripts/serve-frank-secondary.sh), tunables [`scripts/frank-secondary.env`](../../scripts/frank-secondary.env) | +| Unit | root systemd `frank-zealot.service` ([`scripts/frank-zealot.service`](../../scripts/frank-zealot.service)), `User=dank`, `Restart=on-failure`, `LimitMEMLOCK=infinity` | +| Serve script | [`scripts/serve-frank-zealot.sh`](../../scripts/serve-frank-zealot.sh), tunables [`scripts/frank-zealot.env`](../../scripts/frank-zealot.env) | | Weights | `/home/dank/models/MiMo-Q6K/MiMo-V2.6-Distill-Qwen-9B-Q6_K.gguf` — bartowski/MiMo-V2.6-Distill-Qwen-9B-GGUF **Q6_K**, 7,793,710,624 B, sha256 `ef96d05a…` (qwen3_5 hybrid: 32 layers, 8 full-attention + 24 Gated DeltaNet, native 262,144, no MTP tensors) | | Projector | `…/MiMo-Q6K/mmproj-MiMo-V2.6-Distill-Qwen-9B-f16.gguf` — 918,166,048 B, sha256 `ff348f…` (hardlink of the Q5KM dir's copy, link-count-2 verified; the dir is self-contained) | -| Fetch | [`scripts/download-frank-secondary.sh`](../../scripts/download-frank-secondary.sh) — `-f`, byte count + LFS sha256 verified, `--verify-only`; both files verified against the pinned sha on the host before this deploy | -| Seam | `tests/frank_secondary_unit.bats` (argv assertions against a stub engine: payload path, slot geometry, KV pair, batch pair, projector opt-out) | +| Fetch | [`scripts/download-frank-zealot.sh`](../../scripts/download-frank-zealot.sh) — `-f`, byte count + LFS sha256 verified, `--verify-only`; both files verified against the pinned sha on the host before this deploy | +| Seam | `tests/frank_zealot_unit.bats` (argv assertions against a stub engine: payload path, slot geometry, KV pair, batch pair, projector opt-out) | ## Shape and KV contract @@ -62,12 +62,12 @@ MiB, +1,671 over Q6_K): at the live pool it would leave 1,178 MiB free — under the floor — and the calibrated bandwidth law (it predicted this file's 94.4 t/s from Q5_K_M's 104.84 within 1 %) puts decode at ~72 t/s, a further −24 % for the near-lossless rung. Fitting it was priced two ways (trim the -pool to 2 × 182,272 — which also breaks frank-large's 183,501-token +pool to 2 × 182,272 — which also breaks frank-dragoon's 183,501-token compaction-prompt fit by 1,236 tokens — or revert V to `q8_0`), and both were declined. Re-open only on evidence the Q6_K residual matters. **Pool prices on this card come from boots, never formulas** — the measured -boot-pair table lives in [[frank-secondary-llama-mimo-q5km]] (*Shape and KV +boot-pair table lives in [[frank-zealot-llama-mimo-q5km]] (*Shape and KV contract*) and still prices every rollback shape. ## Compute-buffer geometry (2026-10-05) @@ -78,7 +78,7 @@ measured rather than assumed, because the predecessor shape recorded **"ubatch **That failure was a different shape, and it did not reproduce here.** The service itself is the bench (one card holds one server, so no scratch port): -the old rung was re-booted through a transient `FRANK_SECONDARY_ENV_FILE` drop-in +the old rung was re-booted through a transient `FRANK_ZEALOT_ENV_FILE` drop-in and reproduced the 2026-10-03 boot **byte-identically** — 21,276 MiB used / 2,849 MiB free — which makes the ubatch the only variable in the comparison. @@ -99,7 +99,7 @@ Three readings: - **The price is 616 MiB out of a 2.8 GiB margin.** 2,279 MiB free is still inside the 2–3 GiB band, at its bottom edge. `4096/1536` is the middle rung, and the pool's 12,288-token (384 MiB) ladder in - [[frank-secondary-llama-mimo-q5km]] is the other way to buy room back. + [[frank-zealot-llama-mimo-q5km]] is the other way to buy room back. **Why 2048 is right HERE while 512 was right on the R9700 sibling: the curve is backend-specific.** The 2× R9700 layer split peaks at ubatch 512 and is 10 % @@ -125,7 +125,7 @@ that is the pair the curve was measured at. ## Client contract -llama.cpp surface, live-verified on this model family: model id `frank-secondary`, +llama.cpp surface, live-verified on this model family: model id `frank-zealot`, native tools via `--jinja` (`tool_calls` in the response), thinking in **`reasoning_content`**, vision via `image_url` content parts. Two vision traps, both measured here: @@ -147,13 +147,13 @@ so the harness compacts before llama.cpp answers a longer prompt with a 400. |Target|How| |---|---| -|Q5_K_M at the same shape|`scripts/frank-secondary.env` `MODEL_FILE=/home/dank/models/MiMo-Q5KM/MiMo-V2.6-Distill-Qwen-9B-Q5_K_M.gguf` (+ `MMPROJ_FILE` in that dir) and the deployer default — buys back 875 MiB (3,571 free measured) **and the 10 % decode rate** (104.84 tok/s measured). Payload sha-verified on disk| +|Q5_K_M at the same shape|`scripts/frank-zealot.env` `MODEL_FILE=/home/dank/models/MiMo-Q5KM/MiMo-V2.6-Distill-Qwen-9B-Q5_K_M.gguf` (+ `MMPROJ_FILE` in that dir) and the deployer default — buys back 875 MiB (3,571 free measured) **and the 10 % decode rate** (104.84 tok/s measured). Payload sha-verified on disk| |3 × 180,224 + q8_0 V|`CTX_SIZE=540672 PARALLEL=3 CACHE_TYPE_V=q8_0` (measured 21,684 used / 2,441 free **with Q5_K_M** — Q6_K does NOT fit that shape inside the floor; pair them explicitly)| -|SGLang + INT8|[[frank-secondary-sglang-mimo-v26]] — payload staged to `/home/dank/.AGENTTRASH/20261002-retired-llm-payloads/`| +|SGLang + INT8|[[frank-zealot-sglang-mimo-v26]] — payload staged to `/home/dank/.AGENTTRASH/20261002-retired-llm-payloads/`| ## When it misbehaves -Same decision tree as [[frank-secondary-llama-mimo-q5km]] (*When it misbehaves*): +Same decision tree as [[frank-zealot-llama-mimo-q5km]] (*When it misbehaves*): `No CUDA GPUs are available` ⇒ `nvidia-modprobe -u -c=0`; a 400 naming 200,704 ⇒ the conversation outgrew one slot, not the pool; slow decode after a shape change ⇒ check `nvidia-smi` for KV pushed into unified memory; queue diff --git a/serverAppConfigs-docs/LLM/frank-secondary-llama-mimo-q6k.md b/serverAppConfigs-docs/LLM/frank-zealot-llama-mimo-q6k.md similarity index 79% rename from serverAppConfigs-docs/LLM/frank-secondary-llama-mimo-q6k.md rename to serverAppConfigs-docs/LLM/frank-zealot-llama-mimo-q6k.md index 20bd64b..5095fde 100644 --- a/serverAppConfigs-docs/LLM/frank-secondary-llama-mimo-q6k.md +++ b/serverAppConfigs-docs/LLM/frank-zealot-llama-mimo-q6k.md @@ -1,10 +1,10 @@ --- type: reference -title: "frank-secondary on Dankclaw — llama.cpp, MiMo-V2.6-Distill-Qwen-9B Q6_K GGUF (retired)" -description: "The retired 2026-10-01 frank-secondary runbook — the first llama.cpp + GGUF shape on the RTX 3090: two native-window sessions, the asymmetric KV contract (f16 K + q8_0 V) that motivated the move off SGLang, the VRAM fit at Q6_K, and what to check when it misbehaves. Superseded the same night by the Q5_K_M payload." +title: "frank-zealot on Dankclaw — llama.cpp, MiMo-V2.6-Distill-Qwen-9B Q6_K GGUF (retired)" +description: "The retired 2026-10-01 frank-zealot runbook — the first llama.cpp + GGUF shape on the RTX 3090: two native-window sessions, the asymmetric KV contract (f16 K + q8_0 V) that motivated the move off SGLang, the VRAM fit at Q6_K, and what to check when it misbehaves. Superseded the same night by the Q5_K_M payload." tags: - llm - - frank-secondary + - frank-zealot - dankclaw - llama-cpp - rtx3090 @@ -14,10 +14,10 @@ tags: timestamp: 2026-10-01 --- -# frank-secondary — llama.cpp MiMo-V2.6 Q6_K (RTX 3090) +# frank-zealot — llama.cpp MiMo-V2.6 Q6_K (RTX 3090) > **RETIRED 2026-10-01 → 10-02** (one night): superseded by -> [[frank-secondary-llama-mimo-q5km]], the same runtime and shape one quant rung +> [[frank-zealot-llama-mimo-q5km]], the same runtime and shape one quant rung > down. The Q6_K file stays at `/home/dank/models/MiMo-Q6K/` as the rollback > target. > @@ -29,11 +29,11 @@ timestamp: 2026-10-01 |Field|Value| |---|---| -|Endpoint|`192.168.0.143:7771`, served alias `frank-secondary`| +|Endpoint|`192.168.0.143:7771`, served alias `frank-zealot`| |Runtime|llama.cpp **master** (qwen35 model support), CUDA build `sm_86`, at `/home/dank/GitPackages/llama-master/build-cuda/bin/llama-server`| |Payload|`bartowski/MiMo-V2.6-Distill-Qwen-9B-GGUF` **Q6_K**, 7,793,710,624 B, sha256 `ef96d05a2ddf2cbb450d1af1ac3860ec769d3575bafa70692ee5609bda3fad7d`, at `/home/dank/models/MiMo-Q6K/`| -|Unit|root `frank-secondary.service` (repo `scripts/frank-secondary.service`, `User=dank`, relinked), env `scripts/frank-secondary.env`, serve `scripts/serve-frank-secondary.sh`| -|Repo pins|`tests/frank_secondary_unit.bats` (stub-argv seam), `deploy_llm_secondary` gates in `scripts/deploy-remote.sh`| +|Unit|root `frank-zealot.service` (repo `scripts/frank-zealot.service`, `User=dank`, relinked), env `scripts/frank-zealot.env`, serve `scripts/serve-frank-zealot.sh`| +|Repo pins|`tests/frank_zealot_unit.bats` (stub-argv seam), `deploy_llm_zealot` gates in `scripts/deploy-remote.sh`| ## Shape and the KV contract @@ -95,12 +95,12 @@ cmake --build build-cuda -j 16 --target llama-server The SGLang venv (`/home/dank/GitPackages/sglang-cu128`) and the INT8 AutoRound payload (`/home/dank/models/MiMo-V2.6-Distill-Qwen-9B-INT8-W8A16-AutoRound`) stay on disk as the rollback: repoint the unit's serve script and env from -git history (`git show frank-large-gufo-q4kxl-20261001` era is BEFORE this; +git history (`git show frank-dragoon-gufo-q4kxl-20261001` era is BEFORE this; use the parent of the 2026-10-01 night swap commit). ## When it misbehaves -- Port 7771 dark: `journalctl -u frank-secondary -n 50`; the serve script +- Port 7771 dark: `journalctl -u frank-zealot -n 50`; the serve script exits 1 naming the missing file if the binary or GGUF moved. - `No CUDA GPUs are available`: the 3090 vanished from the bus or the UVM node is missing — `nvidia-modprobe -u -c=0` (the serve script runs it). diff --git a/serverAppConfigs-docs/LLM/frank-secondary-llama-qwen35-9b-q6k-2x200704.md b/serverAppConfigs-docs/LLM/frank-zealot-llama-qwen35-9b-q6k-2x200704.md similarity index 79% rename from serverAppConfigs-docs/LLM/frank-secondary-llama-qwen35-9b-q6k-2x200704.md rename to serverAppConfigs-docs/LLM/frank-zealot-llama-qwen35-9b-q6k-2x200704.md index 2bfa38f..777e412 100644 --- a/serverAppConfigs-docs/LLM/frank-secondary-llama-qwen35-9b-q6k-2x200704.md +++ b/serverAppConfigs-docs/LLM/frank-zealot-llama-qwen35-9b-q6k-2x200704.md @@ -1,10 +1,10 @@ --- type: reference -title: "frank-secondary on Dankclaw — llama.cpp, Qwen3.5-9B Q6_K, 2 x 200704, f16 KV (ACTIVE)" -description: "The ACTIVE frank-secondary runbook (since 2026-10-07) — llama.cpp master (CUDA sm_86) serving HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive at Q6_K on the RTX 3090: two conversations of 200,704 tokens with exact f16 KV, vision through the publisher's BF16 projector, MTP impossible (no tensors in the file), and the measured geometry that priced the shape." +title: "frank-zealot on Dankclaw — llama.cpp, Qwen3.5-9B Q6_K, 2 x 200704, f16 KV (ACTIVE)" +description: "The ACTIVE frank-zealot runbook (since 2026-10-07) — llama.cpp master (CUDA sm_86) serving HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive at Q6_K on the RTX 3090: two conversations of 200,704 tokens with exact f16 KV, vision through the publisher's BF16 projector, MTP impossible (no tensors in the file), and the measured geometry that priced the shape." tags: - llm - - frank-secondary + - frank-zealot - dankclaw - llama-cpp - gguf @@ -12,10 +12,10 @@ tags: timestamp: 2026-10-07 --- -# frank-secondary — llama.cpp Qwen3.5-9B Q6_K, 2 × 200,704, f16 KV +# frank-zealot — llama.cpp Qwen3.5-9B Q6_K, 2 × 200,704, f16 KV Live since 2026-10-07, replacing the -[[frank-secondary-llama-gemma4-q4km-200704]] era (Q4_K_M on ONE 200,704 +[[frank-zealot-llama-gemma4-q4km-200704]] era (Q4_K_M on ONE 200,704 slot). The swap is a capacity trade: the 9B dense-hybrid rung costs ~7 GiB of weights where the 26B MoE cost ~16.6 GiB, and the freed room buys the second conversation slot and unquantized KV back. @@ -25,14 +25,14 @@ conversation slot and unquantized KV back. | | | |---|---| | Host / device | Dankclaw (192.168.0.143), RTX 3090, 24,576 MiB | -| Endpoint | `http://192.168.0.143:7771` — served model id **`frank-zealot`** (`ALIAS` in the env; the SERVICE keeps the `frank-secondary` name), `/v1` OpenAI surface | +| Endpoint | `http://192.168.0.143:7771` — served model id **`frank-zealot`** (`ALIAS` in the env; the SERVICE keeps the `frank-zealot` name), `/v1` OpenAI surface | | Runtime | llama.cpp master (0.5.0-dev, commit `5fc4f3c`), CUDA sm_86 build `…/llama-master/build-cuda/bin/llama-server` (`GGML_CUDA_FA_ALL_QUANTS=ON`); `qwen35` is registered in the build's own `src/llama-arch.cpp` and `src/models/qwen35.cpp` exists at that commit | -| Unit | root systemd `frank-secondary.service` ([`scripts/frank-secondary.service`](../../scripts/frank-secondary.service)), `User=dank`, `Restart=on-failure`, `LimitMEMLOCK=infinity` | -| Serve script | [`scripts/serve-frank-secondary.sh`](../../scripts/serve-frank-secondary.sh), tunables [`scripts/frank-secondary.env`](../../scripts/frank-secondary.env) | +| Unit | root systemd `frank-zealot.service` ([`scripts/frank-zealot.service`](../../scripts/frank-zealot.service)), `User=dank`, `Restart=on-failure`, `LimitMEMLOCK=infinity` | +| Serve script | [`scripts/serve-frank-zealot.sh`](../../scripts/serve-frank-zealot.sh), tunables [`scripts/frank-zealot.env`](../../scripts/frank-zealot.env) | | Weights | `/home/dank/models/Qwen35-9B-HauhauCS-Q6K/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q6_K.gguf` — HauhauCS **Q6_K**, 7,359,259,008 B, sha256 `c0ba7beb68fd3fe47891bd549486d38dcf62d00817296ea314ad37017f5a4986` | | Projector | `mmproj-Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-BF16.gguf`, 921,704,448 B, sha256 `05f662501f8bd45607b079723a3e238a4e888fd085a10a53f4057a0e250f6934` — the model is natively multimodal and the Q6_K file carries no vision tensors, so this file IS the vision capability | -| Fetch | [`scripts/download-frank-secondary.sh`](../../scripts/download-frank-secondary.sh) — `-f`, byte-count + sha256 verified (the hashes are computed locally: the repo is Xet-backed, so the Hub publishes file OIDs, not file sha256), idempotent, `--verify-only` | -| Seam | `tests/frank_secondary_unit.bats` (argv assertions against a stub engine) | +| Fetch | [`scripts/download-frank-zealot.sh`](../../scripts/download-frank-zealot.sh) — `-f`, byte-count + sha256 verified (the hashes are computed locally: the repo is Xet-backed, so the Hub publishes file OIDs, not file sha256), idempotent, `--verify-only` | +| Seam | `tests/frank_zealot_unit.bats` (argv assertions against a stub engine) | ## Payload geometry (read from the GGUF header, not the model card) @@ -68,7 +68,7 @@ that is what makes two 200k slots affordable where the 26B MoE fit only one. **Priced from boots, not formulas.** MiMo-V2.6-Distill-Qwen-9B (identical qwen35 geometry, 7,793,710,624 B, same mmproj class) at 2 × 200,704 f16 K + f16 V measured **21,276 used / 2,849 free** at ubatch 1024 and **21,846 / -2,279** at ubatch 2048 — see [[frank-secondary-llama-mimo-q6k-2x200704]]. +2,279** at ubatch 2048 — see [[frank-zealot-llama-mimo-q6k-2x200704]]. This file is 415 MiB lighter in weights and its projector is 3 MiB heavier, so the projection is ~21,430 used / ~2,700 free. @@ -80,7 +80,7 @@ fallback rung if a future shape lands under the 2 GiB floor. `nvidia-smi`: **21,436 MiB used / 2,689 MiB free** — the MiMo-priced projection (~21,430 / ~2,700) was within 11 MiB. Engine ledger -(`--log-verbosity 4`, `journalctl -u frank-secondary`): +(`--log-verbosity 4`, `journalctl -u frank-zealot`): |Line|Value| |---|---| @@ -98,7 +98,7 @@ safe; the Gemma4 era's warning was the opposite case, a drafter running 53 % **past** its window). Weights load in ~6 s from page cache; `/health` answers `{"status":"ok"}` and `/v1/models` serves the alias `frank-zealot`. -**Wire rename (2026-10-09):** `ALIAS` moved `frank-secondary` → `frank-zealot`, +**Wire rename (2026-10-09):** `ALIAS` moved `frank-zealot` → `frank-zealot`, so the served id matches the harness model id and the family-facing name. Consumers re-keyed in the same change: OpenWebUI (`model` row, `access_grant` row, `openai.api_configs` index-2 `model_ids`) and `models.yml` (already @@ -111,7 +111,7 @@ unchanged. ## Client contract -llama.cpp surface: model id `frank-secondary`, native tools via `--jinja`, +llama.cpp surface: model id `frank-zealot`, native tools via `--jinja`, thinking in **`reasoning_content`**, vision via OpenAI `image_url` content parts (probe with a ≥ 256 px image, or the Qwen-VL tower answers "video"). The publisher's recipe ships in `models.yml` `extraBody`: thinking mode @@ -128,7 +128,7 @@ behind a live generation (the Gemma4 era's `--parallel 1` law), and the |Target|How| |---|---| -|Gemma4-26B-A4B Q4_K_M, 1 × 200,704, f16 K + q8_0 V|revert the swap commit — payload stays at `/home/dank/models/Gemma4-26B-A4B/`; see [[frank-secondary-llama-gemma4-q4km-200704]]| +|Gemma4-26B-A4B Q4_K_M, 1 × 200,704, f16 K + q8_0 V|revert the swap commit — payload stays at `/home/dank/models/Gemma4-26B-A4B/`; see [[frank-zealot-llama-gemma4-q4km-200704]]| |MiMo-V2.6 Q6_K, 2 × 200,704, f16 KV|`MODEL_FILE=/home/dank/models/MiMo-Q6K/MiMo-V2.6-Distill-Qwen-9B-Q6_K.gguf` + its mmproj — measured 21,276/2,849 at ubatch 1024, 21,846/2,279 at 2048| |Swift-1.5-27B IQ3_XXS 2 × 114,688 + MTP|payload on disk at `/home/dank/models/Swift15-UncIQ3XXS/`| @@ -138,13 +138,13 @@ Same decision tree as the predecessors: `No CUDA GPUs are available` ⇒ `nvidia-modprobe -u -c=0`; a 400 naming 200,704 ⇒ the conversation outgrew one slot, not the pool; queue behind two long generations ⇒ the slot ceiling is two, by contract; a boot that OOMs ⇒ read the verbosity-4 ledger in -`journalctl -u frank-secondary` (KV MiB, compute buffers) before touching +`journalctl -u frank-zealot` (KV MiB, compute buffers) before touching flags — the engine prints the exact figures the shape needs. -**`status=203/EXEC` boot loop**: the rewrite of `serve-frank-secondary.sh` +**`status=203/EXEC` boot loop**: the rewrite of `serve-frank-zealot.sh` shipped without its `#!/usr/bin/env bash` line, and systemd failed the `ExecStart` before the script ran — 10 s restarts, `Mem peak: 1.9M`, and `nvidia-smi` flat at 1 MiB used (the GPU is never touched). Journal signature: -`Failed at step EXEC spawning /home/dank/…/serve-frank-secondary.sh`. A +`Failed at step EXEC spawning /home/dank/…/serve-frank-zealot.sh`. A shebang is not decoration on this host: every LLM serve script is a direct `ExecStart`, so `head -1` is part of the deploy check (commit `ec6184d`). diff --git a/serverAppConfigs-docs/LLM/frank-secondary-llama-swift15-unc-iq3xxs-mtp-114688.md b/serverAppConfigs-docs/LLM/frank-zealot-llama-swift15-unc-iq3xxs-mtp-114688.md similarity index 88% rename from serverAppConfigs-docs/LLM/frank-secondary-llama-swift15-unc-iq3xxs-mtp-114688.md rename to serverAppConfigs-docs/LLM/frank-zealot-llama-swift15-unc-iq3xxs-mtp-114688.md index ce15fef..0283628 100644 --- a/serverAppConfigs-docs/LLM/frank-secondary-llama-swift15-unc-iq3xxs-mtp-114688.md +++ b/serverAppConfigs-docs/LLM/frank-zealot-llama-swift15-unc-iq3xxs-mtp-114688.md @@ -1,10 +1,10 @@ --- type: reference -title: "frank-secondary on Dankclaw — llama.cpp, Swift-1.5-27B Uncensored RCO IQ3_XXS-mtp, 2 x 114688, draft-mtp, q8_0 KV" -description: "The active frank-secondary runbook (live since 2026-10-05 evening; renamed from frank-small 2026-10-06, per-slot lowered to 112k and ubatch raised to 1024 the same evening) — llama.cpp master (CUDA sm_86) serving ajgazin's Swift-1.5-Qwen3.8-27B Uncensored RCO-IQ3_XXS (MTP head in the file, drafted) on the RTX 3090: TWO 114,688-token conversations at Frank's 112k cap, q8_0 K + q8_0 V (llama.cpp's FP8 class), vision through the publisher's own BF16 projector, and the full two-slot + drafter arithmetic." +title: "frank-zealot on Dankclaw — llama.cpp, Swift-1.5-27B Uncensored RCO IQ3_XXS-mtp, 2 x 114688, draft-mtp, q8_0 KV" +description: "The active frank-zealot runbook (live since 2026-10-05 evening; renamed from frank-small 2026-10-06, per-slot lowered to 112k and ubatch raised to 1024 the same evening) — llama.cpp master (CUDA sm_86) serving ajgazin's Swift-1.5-Qwen3.8-27B Uncensored RCO-IQ3_XXS (MTP head in the file, drafted) on the RTX 3090: TWO 114,688-token conversations at Frank's 112k cap, q8_0 K + q8_0 V (llama.cpp's FP8 class), vision through the publisher's own BF16 projector, and the full two-slot + drafter arithmetic." tags: - llm - - frank-secondary + - frank-zealot - dankclaw - llama-cpp - gguf @@ -15,7 +15,7 @@ tags: timestamp: 2026-10-06 --- -# frank-secondary — llama.cpp Swift-1.5-27B Uncensored RCO IQ3_XXS-mtp, 2 × 114,688, draft-mtp, q8_0 KV +# frank-zealot — llama.cpp Swift-1.5-27B Uncensored RCO IQ3_XXS-mtp, 2 × 114,688, draft-mtp, q8_0 KV > **ACTIVE since 2026-10-05 (evening); reshaped three times on > 2026-10-06, renamed from frank-small the same night.** A 27B replaces @@ -32,7 +32,7 @@ timestamp: 2026-10-06 > the 1024 rung; the 2048 rung cost 746 MiB, ~130 over the 616 MiB > measured prediction). This supersedes BOTH earlier 2026-10-05 > payloads: the live MiMo-V2.6 Q6_K shape -> ([[frank-secondary-llama-mimo-q6k-2x200704]], now retired) and the +> ([[frank-zealot-llama-mimo-q6k-2x200704]], now retired) and the > Ornith-1.5-9B Q8_0 swap that was committed (77decb5..380aafa) but > never deployed. @@ -41,14 +41,14 @@ timestamp: 2026-10-06 | | | |---|---| | Host / device | Dankclaw (192.168.0.143), RTX 3090, 24,576 MiB | -| Endpoint | `http://192.168.0.143:7771` — alias `frank-secondary`, `/v1` OpenAI surface | +| Endpoint | `http://192.168.0.143:7771` — alias `frank-zealot`, `/v1` OpenAI surface | | Runtime | llama.cpp master (0.5.0-dev, commit 5fc4f3c), CUDA sm_86 build `…/llama-master/build-cuda/bin/llama-server` (`GGML_CUDA_FA_ALL_QUANTS=ON` — required for quantized V) | -| Unit | root systemd `frank-secondary.service` ([`scripts/frank-secondary.service`](../../scripts/frank-secondary.service)), `User=dank`, `Restart=on-failure`, `LimitMEMLOCK=infinity` | -| Serve script | [`scripts/serve-frank-secondary.sh`](../../scripts/serve-frank-secondary.sh), tunables [`scripts/frank-secondary.env`](../../scripts/frank-secondary.env) | +| Unit | root systemd `frank-zealot.service` ([`scripts/frank-zealot.service`](../../scripts/frank-zealot.service)), `User=dank`, `Restart=on-failure`, `LimitMEMLOCK=infinity` | +| Serve script | [`scripts/serve-frank-zealot.sh`](../../scripts/serve-frank-zealot.sh), tunables [`scripts/frank-zealot.env`](../../scripts/frank-zealot.env) | | Weights | `/home/dank/models/Swift15-UncIQ3XXS/Swift-1.5-Qwen3.8-27B-Uncensored-Dynamic-MTP-RCO-IQ3_XXS.gguf` — ajgazin/Swift-1.5-Qwen3.8-27B-Uncensored-Dynamic-MTP-GGUF **RCO-IQ3_XXS -mtp**, 10,442,827,392 B, sha256 `e13d3e74…` (qwen35 hybrid: 64 real layers, 16 full-attention + 48 Gated DeltaNet, native 262,144; **MTP head in the file**: blk.64.nextn.*, `nextn_predict_layers=1`, and DRAFTED with it) | | Projector | `…/Swift15-UncIQ3XXS/mmproj-BF16.gguf` — PUBLISHER-SHIPPED in the same repo, 931,145,888 B, sha256 `19acd7fc…` (27-layer ViT → 5120) | -| Fetch | [`scripts/download-frank-secondary.sh`](../../scripts/download-frank-secondary.sh) — `-f`, byte count + sha256 verified per file (Xet repo: the Hub APIs expose no LFS oid, so the shas were computed locally after the first verified fetch; byte counts match the Hub's declared sizes) | -| Seam | `tests/frank_secondary_unit.bats` (argv assertions against a stub engine: payload path, slot geometry, KV pair, spec pair (both flags present), batch pair, projector opt-out) | +| Fetch | [`scripts/download-frank-zealot.sh`](../../scripts/download-frank-zealot.sh) — `-f`, byte count + sha256 verified per file (Xet repo: the Hub APIs expose no LFS oid, so the shas were computed locally after the first verified fetch; byte counts match the Hub's declared sizes) | +| Seam | `tests/frank_zealot_unit.bats` (argv assertions against a stub engine: payload path, slot geometry, KV pair, spec pair (both flags present), batch pair, projector opt-out) | ## Why this payload (2026-10-06 evening) @@ -90,7 +90,7 @@ built against the target's FULL context (262,144 — the draft window, not the 3-token proposal depth), so it costs **~2.4 GiB measured** (23,636 − 22,728 + 1,561), not the ~0.4 GiB the one-slot era assumed. The lighter quant pays for it: **23,636 used / 489 MiB free** (nvidia-smi `free` -field) — the tightest fit in frank-secondary's history, the 2–3 GiB floor +field) — the tightest fit in frank-zealot's history, the 2–3 GiB floor knowingly violated, and the 512×512 vision transient (34 MiB) still fits and recovers. @@ -114,7 +114,7 @@ drafters cannot share a process). `SPEC_DRAFT_N_MAX=3` is the proposal depth. **ngram-mod stays skipped, not swapped in:** on a qwen35 hybrid, ngram speculation logs *"recurrent state rollback is not compatible with 'ngram-mod' — disabling rollback support"* (fleet lesson from -frank-large's chain measurement, 2026-10-03). A rejected draft on Gated +frank-dragoon's chain measurement, 2026-10-03). A rejected draft on Gated DeltaNet layers cannot be rewound by KV truncation — without the rollback checkpoints the DeltaNet state carries phantom transitions and output degrades silently. The flags move as a set: the serve script emits BOTH @@ -216,7 +216,7 @@ leave room for thinking. a clean A/B needs stop + mask (bench policy). - **Smoke**: `READY` completion + `reasoning_content` populated; the harness reached :7771 under the new alias (models.yml provider/id - `frank-secondary`, config.yml modelRoles rewritten; per-slot + `frank-zealot`, config.yml modelRoles rewritten; per-slot `contextWindow: 114688`). ## Measured: ubatch 2048 (2026-10-06 midnight, live) @@ -284,7 +284,7 @@ recipes: `/home/dank/models/Swift15-IQ3S/`; the IQ3_XXS swap above. 2. **MiMo-V2.6 Q6_K 2×200,704 f16 KV** — the payload that was LIVE until the 2026-10-05 cutover: `/home/dank/models/MiMo-Q6K/`; revert - [[frank-secondary-llama-mimo-q6k-2x200704]] (env trio at commit e5893dc or + [[frank-zealot-llama-mimo-q6k-2x200704]] (env trio at commit e5893dc or 380aafa's parent), one `MODEL_FILE` + shape edit. 3. **Ornith-1.5-9B Q8_0** — the committed-but-never-deployed swap: `/home/dank/models/Ornith-Q8/`; revert to 380aafa's tree (ONE native @@ -300,12 +300,12 @@ recipes: read from the Hub file by HTTP range + struct parse — no download needed — before the payload was fetched. - Cutover 2026-10-05 ~23:26: the radiance-cutover session (parallel) - label-committed both sets at Frank's direction — 1919ad7 (frank-primary + label-committed both sets at Frank's direction — 1919ad7 (frank-archon radiance) then baf33d0 (this swap: trio, seam, runbooks, fleet docs). - Deploy ran `deploy.sh dankclaw --service frank-secondary`; the service + Deploy ran `deploy.sh dankclaw --service frank-zealot`; the service dispatch and health gate went green; the first e2e run failed ONE spec (12-crawl, `net::ERR_ABORTED` on `www.franksdank.cloud` — a transient, - unrelated to frank-secondary), green on rerun. + unrelated to frank-zealot), green on rerun. - The unit's `Description=` (MiMo era) was stale at cutover time and was updated in-repo afterward — the relinked unit picks it up at the next deploy/restart, not retroactively. @@ -320,13 +320,13 @@ recipes: second 131,072 slot: 489 MiB free, vision `Red` at a 128-token budget, decode 63.3 t/s recipe / 72.9 temp 0 (48.0 no-spec). - 2026-10-06 (late, Frank): the endpoint renamed frank-small → - **frank-secondary** (87721ab — scripts, unit, seam, runbooks, + **frank-zealot** (87721ab — scripts, unit, seam, runbooks, identifiers; historical references to the OLD FreeToken/CUDA frank-small, and to the Dankserver service that became frank-medium, stay frank-small) and the per-slot window cut 131,072 → 114,688 to fund ubatch 512 → 1024 (f2575a1). Live unit transition done by hand before the deploy: `systemctl stop frank-small` + `systemctl disable - frank-small`, then `deploy.sh dankclaw --service frank-secondary`. + frank-small`, then `deploy.sh dankclaw --service frank-zealot`. 1,751 MiB free; decode 58.2 t/s recipe / 66.9 temp 0; models.yml + config.yml retargeted. - 2026-10-06 (midnight, Frank): "set ubatch to 2k" → `UBATCH_SIZE=2048` diff --git a/serverAppConfigs-docs/LLM/frank-zealot-qwen38-gsq-rco.md b/serverAppConfigs-docs/LLM/frank-zealot-qwen38-gsq-rco.md new file mode 100644 index 0000000..95d9dde --- /dev/null +++ b/serverAppConfigs-docs/LLM/frank-zealot-qwen38-gsq-rco.md @@ -0,0 +1,15 @@ +--- +type: reference +title: "frank-zealot on Dankclaw — llama.cpp, Qwen3.8-27B GSQ-RCO IQ3_S" +description: "The RETIRED frank-zealot runbook (2026-09-16 → 09-17, rollback target) — mainline llama.cpp on Dankclaw's RTX 3090 serving ISTA-DASLab Qwen3.8-27B-GSQ-RCO at IQ3_S with the model's own in-file MTP head and the BF16 vision projector: identity, KV arithmetic, deployed flags, the MTP contract, the client contract, and what to check when it misbehaves." +tags: + - llm + - frank-zealot + - dankclaw + - llama.cpp + - rtx3090 + - qwen35 + - mtp + - vision +timestamp: 2026-09-16 +--- diff --git a/serverAppConfigs-docs/LLM/frank-secondary-sglang-mimo-v26.md b/serverAppConfigs-docs/LLM/frank-zealot-sglang-mimo-v26.md similarity index 82% rename from serverAppConfigs-docs/LLM/frank-secondary-sglang-mimo-v26.md rename to serverAppConfigs-docs/LLM/frank-zealot-sglang-mimo-v26.md index a95ff6d..8b37892 100644 --- a/serverAppConfigs-docs/LLM/frank-secondary-sglang-mimo-v26.md +++ b/serverAppConfigs-docs/LLM/frank-zealot-sglang-mimo-v26.md @@ -1,10 +1,10 @@ --- type: reference -title: "frank-secondary on Dankclaw — SGLang, MiMo-V2.6-Distill-Qwen-9B INT8 W8A16 (RETIRED)" -description: "The RETIRED frank-secondary runbook (2026-10-01, hours) — SGLang in a self-contained python3.12 venv serving leteschlead MiMo-V2.6-Distill-Qwen-9B-INT8-W8A16-AutoRound (qwen3_5 hybrid, 9B dense, in-checkpoint MTP + vision) on the RTX 3090: identity, payload, KV arithmetic, the NEXTN spec-decode ghost, the CUDA 13 nvcc toolchain the JIT needs, and the measured numbers kept for the record. Replaced by [[frank-secondary-llama-mimo-q6k]] the same night." +title: "frank-zealot on Dankclaw — SGLang, MiMo-V2.6-Distill-Qwen-9B INT8 W8A16 (RETIRED)" +description: "The RETIRED frank-zealot runbook (2026-10-01, hours) — SGLang in a self-contained python3.12 venv serving leteschlead MiMo-V2.6-Distill-Qwen-9B-INT8-W8A16-AutoRound (qwen3_5 hybrid, 9B dense, in-checkpoint MTP + vision) on the RTX 3090: identity, payload, KV arithmetic, the NEXTN spec-decode ghost, the CUDA 13 nvcc toolchain the JIT needs, and the measured numbers kept for the record. Replaced by [[frank-zealot-llama-mimo-q6k]] the same night." tags: - llm - - frank-secondary + - frank-zealot - dankclaw - sglang - rtx3090 @@ -15,10 +15,10 @@ tags: timestamp: 2026-10-01 --- -# frank-secondary — SGLang MiMo-V2.6-Distill-Qwen-9B INT8 W8A16 (NEXTN MTP) +# frank-zealot — SGLang MiMo-V2.6-Distill-Qwen-9B INT8 W8A16 (NEXTN MTP) > **RETIRED 2026-10-01, hours after cutover.** Replaced by -> [[frank-secondary-llama-mimo-q6k]] — llama.cpp CUDA on the MiMo Q6_K GGUF, +> [[frank-zealot-llama-mimo-q6k]] — llama.cpp CUDA on the MiMo Q6_K GGUF, > chosen for the asymmetric KV (f16 K + q8_0 V) SGLang cannot express. > The venv (`/home/dank/GitPackages/sglang-cu128/`) stays in place; the INT8 > payload was staged to @@ -28,13 +28,13 @@ timestamp: 2026-10-01 ## Identity -- **Endpoint:** `frank-secondary` at `192.168.0.143:7771` (Dankclaw). +- **Endpoint:** `frank-zealot` at `192.168.0.143:7771` (Dankclaw). - **Runtime:** SGLang (latest) in a self-contained python3.12 venv at `/home/dank/GitPackages/sglang-cu128/` (torch 2.13.0+cu130, transformers 5.12.1, flashinfer 0.6.18, sgl-kernel). No container — a root - systemd unit `scripts/frank-secondary.service` (`User=dank`, - `LimitMEMLOCK=infinity`) launched by `scripts/serve-frank-secondary.sh` with - tunables from `scripts/frank-secondary.env`. + systemd unit `scripts/frank-zealot.service` (`User=dank`, + `LimitMEMLOCK=infinity`) launched by `scripts/serve-frank-zealot.sh` with + tunables from `scripts/frank-zealot.env`. - **Model:** `letechlead/MiMo-V2.6-Distill-Qwen-9B-INT8-W8A16-AutoRound` (9B dense, 12.0 GiB, INT8 W8A16 AutoRound group-128 symmetric). @@ -48,14 +48,14 @@ timestamp: 2026-10-01 (`--context-length 262144`, `--max-running-requests 2`) against a **pinned** 606,208-token pool (`--max-total-tokens`) — 2026-10-01 reslice from four 151,552-token slots: 2 x 262,144 = 524,288 leaves - ~82k tokens of pool slack, and a compaction request (frank-primary's + ~82k tokens of pool slack, and a compaction request (frank-archon's trigger 183,501 + a 32,768-token summary budget = 216,269) now fits one request. A single request may grow to the whole pool — a 170,019-token prompt was verified at the 4-slot shape — the grid is the two-way concurrency contract. **That compaction arithmetic is specific to a 262,144-token slot**: the ACTIVE shape runs three slots of 180,224, which 183,501 tokens already exceeds — see *What three slots - cost* in [[frank-secondary-llama-mimo-q5km]]. + cost* in [[frank-zealot-llama-mimo-q5km]]. - **KV:** `fp8_e4m3` — 16 KiB/token (8 attn layers x 2 x 4 heads x 256 dim x 1 B), pool 9.31 GiB. - **The memory shape (the 4.5 GiB the naive math misses):** the DeltaNet @@ -126,15 +126,15 @@ change lands. Eight safetensors shards (12,891,718,440 B total) + tokenizer and config files under `/home/dank/models/MiMo-V2.6-Distill-Qwen-9B-INT8-W8A16-AutoRound/`, -all LFS sha256-verified by `old/download-frank-secondary-sglang-int8.sh` +all LFS sha256-verified by `old/download-frank-zealot-sglang-int8.sh` (`--verify-only` re-checks) — the script moved to `old/` when the endpoint cut over to llama.cpp + GGUF on 2026-10-01 night, and -`scripts/download-frank-secondary.sh` now fetches the GGUF quant instead. The +`scripts/download-frank-zealot.sh` now fetches the GGUF quant instead. The serve script refuses to start with a missing shard. ## Client contract -- **Alias:** `frank-secondary` (the `id` at `/v1/models`). +- **Alias:** `frank-zealot` (the `id` at `/v1/models`). - **Reasoning:** extracted to **`reasoning_content`** (live-verified 2026-10-01 — this SGLang build's qwen3 parser uses the same field name as llama.cpp; models.yml sets `reasoningContentField: @@ -160,14 +160,14 @@ serve script refuses to start with a missing shard. (216k tokens of live KV at once). 2-slot shape: two concurrent 50,000-token requests both answered (28.8 s wall). - **Compaction fit (the reslice's purpose):** a 200,000-token prompt — - well past frank-primary's 183,501-token compaction trigger (70% of its + well past frank-archon's 183,501-token compaction trigger (70% of its 262,144 window) — prefills and completes in ONE request. - Vision: a 64x64 red square answers "Red" with `image_tokens: 64`. ## Rollback -[[frank-secondary-llama-mimo-q5km]] is the live shape two steps forward; the -practical rollback today is [[frank-secondary-llama-mimo-q6k]] (payload at +[[frank-zealot-llama-mimo-q5km]] is the live shape two steps forward; the +practical rollback today is [[frank-zealot-llama-mimo-q6k]] (payload at `/home/dank/models/MiMo-Q6K/`). This era's own rollback, the llama.cpp Gemma4-12B QAT payload, was staged to `/home/dank/.AGENTTRASH/20261002-retired-llm-payloads/Gemma4-12B-QAT/` on @@ -177,4 +177,4 @@ Gemma4-12B QAT payload, was staged to - Model: https://huggingface.co/letechlead/MiMo-V2.6-Distill-Qwen-9B-INT8-W8A16-AutoRound - SGLang: https://github.com/sgl-project/sglang -- Serve script: `scripts/serve-frank-secondary.sh`; tunables: `scripts/frank-secondary.env` +- Serve script: `scripts/serve-frank-zealot.sh`; tunables: `scripts/frank-zealot.env` diff --git a/serverAppConfigs-docs/LLM/frank-secondary-vllm-gemma4.md b/serverAppConfigs-docs/LLM/frank-zealot-vllm-gemma4.md similarity index 82% rename from serverAppConfigs-docs/LLM/frank-secondary-vllm-gemma4.md rename to serverAppConfigs-docs/LLM/frank-zealot-vllm-gemma4.md index aaae3d6..9b39836 100644 --- a/serverAppConfigs-docs/LLM/frank-secondary-vllm-gemma4.md +++ b/serverAppConfigs-docs/LLM/frank-zealot-vllm-gemma4.md @@ -1,10 +1,10 @@ --- type: reference -title: frank-secondary on Dankclaw — vLLM, Gemma4-12B QAT w4a16 (compressed-tensors) -description: "The RETIRED frank-secondary runbook (2026-09-19, same-day revert; rollback target) — vLLM on Dankclaw's RTX 3090 serving google/gemma-4-12B-it-qat-w4a16-ct (Marlin int4 weights, bf16 KV, 262k window) with Google's bf16 MTP assistant, the audio-capable derived image, the no-nvidia-container-toolkit device mounts, measured throughput, and the drafter-Marlin bug that killed the w4a16 assistant. Replaced by [[frank-secondary-gemma4-12b]] on the same day." +title: frank-zealot on Dankclaw — vLLM, Gemma4-12B QAT w4a16 (compressed-tensors) +description: "The RETIRED frank-zealot runbook (2026-09-19, same-day revert; rollback target) — vLLM on Dankclaw's RTX 3090 serving google/gemma-4-12B-it-qat-w4a16-ct (Marlin int4 weights, bf16 KV, 262k window) with Google's bf16 MTP assistant, the audio-capable derived image, the no-nvidia-container-toolkit device mounts, measured throughput, and the drafter-Marlin bug that killed the w4a16 assistant. Replaced by [[frank-zealot-gemma4-12b]] on the same day." tags: - llm - - frank-secondary + - frank-zealot - dankclaw - vllm - rtx3090 @@ -15,12 +15,12 @@ tags: timestamp: 2026-09-19 --- -# frank-secondary — vLLM on the RTX 3090 (Gemma4-12B QAT w4a16) +# frank-zealot — vLLM on the RTX 3090 (Gemma4-12B QAT w4a16) > **RETIRED 2026-09-19 (same-day revert).** This vLLM deployment was cut -> back to [[frank-secondary-gemma4-12b]] (llama.cpp, now the ACTIVE runbook) +> back to [[frank-zealot-gemma4-12b]] (llama.cpp, now the ACTIVE runbook) > the same day it landed — this page is the rollback target. Same port -> (7771), same alias (`frank-secondary`), same client contract surface — the +> (7771), same alias (`frank-zealot`), same client contract surface — the > runtime, the model payload, the drafter and the service shape (root > systemd unit → rootless Quadlet) all changed. @@ -28,12 +28,12 @@ timestamp: 2026-09-19 | what | value | |---|---| -| runtime | vLLM `vllm/vllm-openai` dev build `gemma-x86_64-cu129` (base `sha256:e24d3d8e…001e`), audio extra pip-installed into `localhost/vllm/vllm-openai:frank-secondary` (`8dad46d7…`) | -| unit | **rootless Quadlet** `dankclaw/frank-secondary/quadlet/frank-secondary.container` (root systemd unit retired 2026-09-19) | +| runtime | vLLM `vllm/vllm-openai` dev build `gemma-x86_64-cu129` (base `sha256:e24d3d8e…001e`), audio extra pip-installed into `localhost/vllm/vllm-openai:frank-zealot` (`8dad46d7…`) | +| unit | **rootless Quadlet** `dankclaw/frank-zealot/quadlet/frank-zealot.container` (root systemd unit retired 2026-09-19) | | model | `google/gemma-4-12B-it-qat-w4a16-ct` — compressed-tensors w4a16 (int4 Marlin weights, 10,264,229,896 B) | | model dir | `/home/dank/models/gemma4-12b-qat-w4a16-ct/` | | drafter | `google/gemma-4-12B-it-assistant` **bf16** (845,719,296 B) at `/home/dank/models/gemma4-12b-assistant-bf16/` | -| port | 7771 → 8000 (alias `frank-secondary`; `frank-large` keeps 7770) | +| port | 7771 → 8000 (alias `frank-zealot`; `frank-dragoon` keeps 7770) | | window | 262,144; KV pool **289,647 tokens** bf16; **2 concurrent full-context sessions** | | multimodal | native: text + image + **audio** (derived image carries `av`/`scipy`/`soundfile`/`mistral_common[audio]`) | @@ -113,7 +113,7 @@ trade for the native w4a16 format + audio + CUDA graphs.) ## The image -`dankclaw/frank-secondary/Dockerfile` (repo) — 16 comment lines + `FROM +`dankclaw/frank-zealot/Dockerfile` (repo) — 16 comment lines + `FROM localhost/vllm/vllm-openai:gemma4-unified` + `RUN pip install --no-cache-dir av scipy soundfile "mistral_common[audio]"`. **No COPY lines** — the earlier `triton-sm89-sitecustomize.py` hack is gone: @@ -144,9 +144,9 @@ not a hardware mystery. ## Deployed config -Repo truth: `scripts/frank-secondary.env` + `scripts/serve-frank-secondary.sh` +Repo truth: `scripts/frank-zealot.env` + `scripts/serve-frank-zealot.sh` (mounted into the container at `/scripts/`, which is the entrypoint) + -`dankclaw/frank-secondary/quadlet/frank-secondary.container`. Key values: +`dankclaw/frank-zealot/quadlet/frank-zealot.container`. Key values: `KV_CACHE_DTYPE=auto` (resolves to bf16 — fp8_e5m2 is refused by compressed-tensors checkpoints and fp8 is hardware-dead on sm_86), `ENFORCE_EAGER=0` (CUDA graphs on), `max_model_len=262144`, MTP via @@ -186,27 +186,27 @@ container while it loads. - **`sm_89` in an error** — stale arch override; `TRITON_OVERRIDE_ARCH` must be absent. 8.6 is correct. - **Audio 400/500** — the container is running the *base* image, not the - derived `:frank-secondary` (missing `av`). Check the deployed image digest + derived `:frank-zealot` (missing `av`). Check the deployed image digest is `8dad46d7…`. - **CUDA not visible in container** — a `Device=` line or a lib mount dropped out of the unit after an edit; the unit is the source of truth, the host-side generated unit is not. -- Logs: `journalctl --user -u frank-secondary` (rootless Quadlet; `podman +- Logs: `journalctl --user -u frank-zealot` (rootless Quadlet; `podman logs` covers only the current `--replace --rm` instance). ## Rollback -[[frank-secondary-gemma4-12b]] — the llama.cpp deployment. Its weights, +[[frank-zealot-gemma4-12b]] — the llama.cpp deployment. Its weights, mmproj and MTP sidecar are still on the host under `/home/dank/models/Gemma4-12B-QAT/`, and the retired root unit is at -`scripts/.AGENTTRASH/frank-secondary.service.llama.cpp`. Restoring it means +`scripts/.AGENTTRASH/frank-zealot.service.llama.cpp`. Restoring it means reinstalling that unit and stopping the Quadlet (one owner per port). ## References -- `scripts/serve-frank-secondary.sh` — the actual exec line -- `dankclaw/frank-secondary/Dockerfile` — the audio-derived image -- `dankclaw/frank-secondary/quadlet/frank-secondary.container` — the unit -- [[frank-secondary-gemma4-12b]] — RETIRED predecessor (rollback) +- `scripts/serve-frank-zealot.sh` — the actual exec line +- `dankclaw/frank-zealot/Dockerfile` — the audio-derived image +- `dankclaw/frank-zealot/quadlet/frank-zealot.container` — the unit +- [[frank-zealot-gemma4-12b]] — RETIRED predecessor (rollback) - [[halogen-flash-server]] — the sibling endpoint on the iGPU - [[VLLM Overview]] / [[VLLM Index]] — runtime background diff --git a/serverAppConfigs-docs/LLM/freetoken-benchmark-sweep.md b/serverAppConfigs-docs/LLM/freetoken-benchmark-sweep.md index 7cb4d04..4bbc738 100644 --- a/serverAppConfigs-docs/LLM/freetoken-benchmark-sweep.md +++ b/serverAppConfigs-docs/LLM/freetoken-benchmark-sweep.md @@ -6,7 +6,7 @@ tags: - freetoken - benchmark - dankserver - - frank-secondary + - frank-zealot - qwen3.6 timestamp: 2026-09-02 --- diff --git a/serverAppConfigs-docs/LLM/freetoken-frank-small.md b/serverAppConfigs-docs/LLM/freetoken-frank-small.md index 892ee2b..71649c4 100644 --- a/serverAppConfigs-docs/LLM/freetoken-frank-small.md +++ b/serverAppConfigs-docs/LLM/freetoken-frank-small.md @@ -1,27 +1,27 @@ --- type: configuration -title: FreeToken frank-secondary Runbook -description: RETIRED 2026-09-15 - FreeToken v0.1.2 serving batsclamp/Huihui-Qwen3.6-35B-A3B-abliterated-FP8 as frank-secondary on Dankserver (RTX 3090 era). +title: FreeToken frank-zealot Runbook +description: RETIRED 2026-09-15 - FreeToken v0.1.2 serving batsclamp/Huihui-Qwen3.6-35B-A3B-abliterated-FP8 as frank-zealot on Dankserver (RTX 3090 era). tags: - freetoken - dankserver - - frank-secondary + - frank-zealot - qwen3.6 - moe - fp8 timestamp: 2026-08-30 --- -# FreeToken frank-secondary Runbook +# FreeToken frank-zealot Runbook > **RETIRED 2026-09-15.** The RTX 3090 left Dankserver and the successor > [[frank-medium-rocmfpx]] (charlie12345/ROCmFPX llama.cpp on 2x Radeon AI > PRO R9700) took the :7770 endpoint and the port. This page is kept as the > retirement record of the FreeToken/CUDA era; the unit was archived to -> `~/.AGENTTRASH/20260915-frank-secondary-retire/host-units/` and the repo files +> `~/.AGENTTRASH/20260915-frank-zealot-retire/host-units/` and the repo files > to `scripts/.AGENTTRASH/`. -The `frank-secondary` service on Dankserver is served by +The `frank-zealot` service on Dankserver is served by **FreeToken v0.1.2** — an edge-native MoE serving engine that keeps expert weights in host RAM with an LRU GPU cache. Model history on this runtime: official `Qwen/Qwen3.6-35B-A3B-FP8` (since 2026-09-02) → @@ -134,8 +134,8 @@ modelopt block-fp8 remains the only FP8 path that loads. ## Sampling -**frank-secondary samples by default, and our config never said so.** -`scripts/serve-frank-secondary.sh` passes no sampling arguments at all — only +**frank-zealot samples by default, and our config never said so.** +`scripts/serve-frank-zealot.sh` passes no sampling arguments at all — only `--model`, `--served-model-name`, `--host`, `--port`, `--moe-cache-size`, `--num-tokens` and `--max-running-requests`. The behaviour comes from the runtime's own default: @@ -158,9 +158,9 @@ sampling parameters sent at all** produced three different reasoning traces (sha `13ca02…`/487 chars, `d49928…`/540, `7b81b8…`/577). Greedy decoding would be byte-identical. -### This is the opposite of frank-large +### This is the opposite of frank-dragoon -| | frank-secondary (FreeToken) | frank-large (halogen) | +| | frank-zealot (FreeToken) | frank-dragoon (halogen) | |---|---|---| | Silent client (no `temperature`) | **samples** at temp 1.0 / top_k 20 / top_p 0.95 | **greedy** — no server-side sampler defaults | | Deterministic across runs | No | Yes | @@ -168,7 +168,7 @@ would be byte-identical. A client that talks to both endpoints and sends no sampler gets non-deterministic answers from :7770 on Dankserver and reproducible ones from -:7770 on Dankclaw. If a workflow needs determinism from frank-secondary it must +:7770 on Dankclaw. If a workflow needs determinism from frank-zealot it must send `temperature: 0` explicitly, or the service must be relaunched with `--sampling-defaults none` (framework defaults only). @@ -188,9 +188,9 @@ send `temperature: 0` explicitly, or the service must be relaunched with | File | Purpose | |------|---------| -| `scripts/serve-frank-secondary.sh` | Serve script (launches `ft serve`) | -| `scripts/frank-secondary.env` | Tunables (model path, pool sizes) | -| `scripts/frank-secondary.service` | Systemd unit | +| `scripts/serve-frank-zealot.sh` | Serve script (launches `ft serve`) | +| `scripts/frank-zealot.env` | Tunables (model path, pool sizes) | +| `scripts/frank-zealot.service` | Systemd unit | ## Limitations @@ -209,7 +209,7 @@ send `temperature: 0` explicitly, or the service must be relaunched with - **`model` field is required** in `/v1/chat/completions` bodies — FreeToken rejects requests without it with a 422 (`Field required`), unlike llama.cpp's server which defaults to the loaded model. Send - `"model": "frank-secondary"`. + `"model": "frank-zealot"`. - Load on this swap took well under the old llama.cpp numbers: weights → experts (parallel build) → CUDA graph capture → Uvicorn in ~2 minutes; the 2026-08-30 swap verified ~40 tok/s decode on a diff --git a/serverAppConfigs-docs/LLM/halogen-flash-server.md b/serverAppConfigs-docs/LLM/halogen-flash-server.md index 4fd3fab..037f796 100644 --- a/serverAppConfigs-docs/LLM/halogen-flash-server.md +++ b/serverAppConfigs-docs/LLM/halogen-flash-server.md @@ -1,12 +1,12 @@ --- type: reference -title: halogen-flash-server on Dankclaw (frank-large) -description: The active frank-large runbook — peonist-ai/halogen-flash-server 0.5.8 serving Qwen3.8-Flash-Next (w4b) on the Dankclaw gfx1151 box: container shape, deployed flags, the memory model, the client contract, and the failure modes worth knowing. +title: halogen-flash-server on Dankclaw (frank-dragoon) +description: The active frank-dragoon runbook — peonist-ai/halogen-flash-server 0.5.8 serving Qwen3.8-Flash-Next (w4b) on the Dankclaw gfx1151 box: container shape, deployed flags, the memory model, the client contract, and the failure modes worth knowing. tags: - llm - halogen - dankclaw - - frank-large + - frank-dragoon - strix-halo - gfx1151 - qwen4exp @@ -14,16 +14,16 @@ tags: timestamp: 2026-09-13 --- -# halogen-flash-server on Dankclaw (frank-large) +# halogen-flash-server on Dankclaw (frank-dragoon) > **ACTIVE again since 2026-09-16, and retuned.** It replaced the llama.cpp / > kingjones30-ROCmFPX STRIX deployment on 2026-09-11 (see > [[kingjones-strix-rocmfp4]]), was displaced for two days by ik_llama.cpp (see -> [[frank-large-ik-uncensored]], the current rollback), and came back as the +> [[frank-dragoon-ik-uncensored]], the current rollback), and came back as the > shape the fleet asked for: two 200k-token conversations rather than the > native-context pair. Deployed as a rootless Quadlet container, -> `dankclaw/frank-large/quadlet/frank-large.container`, port 7770. The RTX 3090 -> it does not touch now belongs to [[frank-secondary-qwen38-gsq-rco]]. +> `dankclaw/frank-dragoon/quadlet/frank-dragoon.container`, port 7770. The RTX 3090 +> it does not touch now belongs to [[frank-zealot-qwen38-gsq-rco]]. The engine is a from-scratch serving runtime for the Qwen3.8-Flash-Next architecture on AMD's gfx1151 (Strix Halo) — the same silicon this host runs. @@ -45,7 +45,7 @@ The `all` mode is upstream's default and the shape a single-container host wants: the front-end talks to the engine over loopback inside the container, so there is one process tree, one log, and one published port. -`HALOGEN_MODEL_ID=frank-large` sets the id reported at `/v1/models`, in +`HALOGEN_MODEL_ID=frank-dragoon` sets the id reported at `/v1/models`, in `/health`, and in every response body. Requests are **never rejected for naming a different model** — the server serves whatever asks. Keeping the fleet alias is therefore free, and it means Hermes, the harness config, the OpenWebUI @@ -94,13 +94,13 @@ upstream's defaults: | flag | value | why | |---|---|---| -| `HALOGEN_MODEL_ID` | `frank-large` | fleet identity; no client rename | -| `HALOGEN_CTX` | `200192` | **set 2026-09-16**: exactly half the pool, so two conversations of the full window are always resident. Not a round 200,000 — pool/2 is. The model's native window is 262,144, so this is a real reduction in the per-conversation ceiling, and a client asking for more gets a 400 (never a silent truncation). The harness declares 200192 for `frank-large` | +| `HALOGEN_MODEL_ID` | `frank-dragoon` | fleet identity; no client rename | +| `HALOGEN_CTX` | `200192` | **set 2026-09-16**: exactly half the pool, so two conversations of the full window are always resident. Not a round 200,000 — pool/2 is. The model's native window is 262,144, so this is a real reduction in the per-conversation ceiling, and a client asking for more gets a 400 (never a silent truncation). The harness declares 200192 for `frank-dragoon` | | `HALOGEN_KV_POOL_POSITIONS` | `400384` | **retuned 2026-09-16** (from 401,408): 2 x 200,192. Reserves ~11.0 GiB of KV, confirmed by the boot ledger as `400384 positions, ~27.2 GiB (16.2 GiB of it for everything but the pool, at max_tok 24576)` against a 33.5 GiB device budget — **no clamp**. Slots still oversubscribe the pool for any real request (admission reserves prompt + `max_tokens`), so a near-full pair that is both generating is pool-bound. `HALOGEN_KV_POOL_FIT` guards the boot: read the ledger, not this column | | `HALOGEN_KV_SLOTS` | `2` | **lowered from 3 on 2026-09-16** — one slot per half of the pool, and two is the fleet's shape now that Dankclaw serves two endpoints. Each slot is 111.0 MiB of O(1) state, so this hands ~111 MiB back as well | -| `HALOGEN_MAX_TOK` | `24576` | **halved from the 32768 default on 2026-09-16** for frank-secondary, its co-tenant on the same host. The arena's variable term goes `8.40 x 2 → 8.40 x 1.5`, handing ~4.2 GiB back at roughly a 4-5 % prefill cost — the same lever at 16,384 costs 8-9 %. The vendor's own notes call 24,576 the largest arena that allocated with headroom to spare, so it stays inside their tested range. 65536 still cannot boot. It sizes a per-call PREFILL CHUNK, not the prompt ceiling: a 200k conversation is prefilled in arena-sized pieces | +| `HALOGEN_MAX_TOK` | `24576` | **halved from the 32768 default on 2026-09-16** for frank-zealot, its co-tenant on the same host. The arena's variable term goes `8.40 x 2 → 8.40 x 1.5`, handing ~4.2 GiB back at roughly a 4-5 % prefill cost — the same lever at 16,384 costs 8-9 %. The vendor's own notes call 24,576 the largest arena that allocated with headroom to spare, so it stays inside their tested range. 65536 still cannot boot. It sizes a per-call PREFILL CHUNK, not the prompt ceiling: a 200k conversation is prefilled in arena-sized pieces | | `HALOGEN_HOST_RESERVE_GIB` | `20` | **raised from 15 with the same retune**, because the arena shrank: `budget = 121.2 − 67.7 − 20 = 33.5 GiB` against a measured need of ~27.2, so the fit check kept ~6 GiB of margin and did not clamp. It is **not** an allocation: raising it cannot return memory to the host, only take the pool away (see the ceiling section below) | -| `HALOGEN_VISION_TOWER` | *unset* | **removed 2026-09-16.** The tower charges 1.97 GiB against the same device budget as the pool and the arena, and the fleet's image path moved to [[frank-secondary-qwen38-gsq-rco]] (llama.cpp with `--mmproj`). This server refuses image content parts, and `models.yml` declares `frank-large` text-only to match | +| `HALOGEN_VISION_TOWER` | *unset* | **removed 2026-09-16.** The tower charges 1.97 GiB against the same device budget as the pool and the arena, and the fleet's image path moved to [[frank-zealot-qwen38-gsq-rco]] (llama.cpp with `--mmproj`). This server refuses image content parts, and `models.yml` declares `frank-dragoon` text-only to match | | `HALOGEN_DOWNLOAD` | `peonist-ai/halogen-qwen3.8-flash-next` | first-start fetch | | `HALOGEN_VERBOSE` | `1` | verbose engine logging — the fullest startup account, on permanently so an incident report needs no restart-into-debug | @@ -226,7 +226,7 @@ restart. That is the failure mode to watch, and it is the least diagnosable of the three: not a silent clamp, not a boot refusal, but a minutes-long freeze that -looks like a hang, for the neighbours as much as for frank-large. `free` is +looks like a hang, for the neighbours as much as for frank-dragoon. `free` is useless for spotting it — `MemAvailable` still reads ~74 GiB because the page cache counts as reclaimable. Watch the `host memory left for everything else` line and the contiguous-block count at boot instead. @@ -374,7 +374,7 @@ tables above. **None here since 2026-09-16.** `HALOGEN_VISION_TOWER` is deliberately unset: the tower is a 1.97 GiB charge against the same device budget as the pool and -the arena, and the fleet's image path moved to [[frank-secondary-qwen38-gsq-rco]], +the arena, and the fleet's image path moved to [[frank-zealot-qwen38-gsq-rco]], which loads the BF16 projector alongside its own weights. This server refuses image content parts and says why, rather than ignoring them: @@ -393,11 +393,11 @@ anywhere in the fleet — that left with [[frank-npu]]. ## Deploy and operate ```bash -./scripts/deploy.sh dankclaw --service frank-large +./scripts/deploy.sh dankclaw --service frank-dragoon ``` The handler retires the ik-era **root** unit first (stop, disable, move -`/etc/systemd/system/frank-large.service` into +`/etc/systemd/system/frank-dragoon.service` into `~/.AGENTTRASH/20260916-halogen-restore/host-units` — never `rm`; this host's `disable` may delete the file outright, which the handler now reports), stops the Quadlet's own unit if it is running, then pulls @@ -419,8 +419,8 @@ file plus linger on the deploy user — generated units **cannot** be `systemctl --user enable`d on this host. ```bash -systemctl --user status frank-large.service # the generated unit -podman logs frank-large | head -40 # version banner + memory ledger +systemctl --user status frank-dragoon.service # the generated unit +podman logs frank-dragoon | head -40 # version banner + memory ledger curl -s http://127.0.0.1:7770/health # 200 only after the engine PONGs curl -s http://127.0.0.1:7770/v1/models ``` @@ -447,13 +447,13 @@ steady-state noise on a shared host — raise it only for a live OOM report. The lines worth grepping first: ```bash -podman logs frank-large 2>&1 | grep -E '^(dmalloc|kv pool):' +podman logs frank-dragoon 2>&1 | grep -E '^(dmalloc|kv pool):' ``` -Retrieval: `podman logs frank-large` covers the **current** instance only — +Retrieval: `podman logs frank-dragoon` covers the **current** instance only — the Quadlet runs `--replace --rm`, so everything before the last recreate is -gone from the container log. `journalctl --user -u frank-large.service` is -the durable record. Both are rootless: `sudo podman logs frank-large` looks +gone from the container log. `journalctl --user -u frank-dragoon.service` is +the durable record. Both are rootless: `sudo podman logs frank-dragoon` looks in root's storage and answers "no such container". ## Rollback @@ -466,7 +466,7 @@ serve script and the Qwen-Sharp template are archived in the repo under is a `git revert` of this change set plus a deploy — **but the Quadlet must be removed from `~/.config/containers/systemd/` first**, or the restarted root unit and the still-installed container both claim port 7770. The port gate in -the handler now covers exactly that race. See [[frank-large-ik-uncensored]]. +the handler now covers exactly that race. See [[frank-dragoon-ik-uncensored]]. The `amd_iommu=off` kernel argument that came with this change is separate and reverts on its own — see [[dankclaw-iommu-translation-off]]. diff --git a/serverAppConfigs-docs/LLM/ikllama-ornith-dankserver.md b/serverAppConfigs-docs/LLM/ikllama-ornith-dankserver.md index 4cf702b..e6abe58 100644 --- a/serverAppConfigs-docs/LLM/ikllama-ornith-dankserver.md +++ b/serverAppConfigs-docs/LLM/ikllama-ornith-dankserver.md @@ -1,7 +1,7 @@ --- type: reference title: ik_llama.cpp on Dankserver (Ornith Q8_0) -description: ikawrakow/ik_llama.cpp replaces upstream llama.cpp for frank-secondary on the RTX 3090. Q8_0 model, KV K default f16 / V q6_0 with Hadamard on V only (iq5_k is not a KV-cache type in this build; q8_KV crashes on this arch), split-mode none, speculative decoding disabled, 3 parallel slots x 163840 ctx, the Qwen-Sharp template rendered with --jinja, and explicit CPU-expert offload. Includes the mandatory CUDA/IQK FA_ALL_QUANTS build flags. +description: ikawrakow/ik_llama.cpp replaces upstream llama.cpp for frank-zealot on the RTX 3090. Q8_0 model, KV K default f16 / V q6_0 with Hadamard on V only (iq5_k is not a KV-cache type in this build; q8_KV crashes on this arch), split-mode none, speculative decoding disabled, 3 parallel slots x 163840 ctx, the Qwen-Sharp template rendered with --jinja, and explicit CPU-expert offload. Includes the mandatory CUDA/IQK FA_ALL_QUANTS build flags. tags: - ikllama - llamacpp @@ -16,7 +16,7 @@ timestamp: 2026-08-26 # ik_llama.cpp on Dankserver (Ornith-1.5-35B-A3B CRACK) -> **Active 2026-08-26.** `frank-secondary` switched from upstream +> **Active 2026-08-26.** `frank-zealot` switched from upstream > llama.cpp (b10121) to `ikawrakow/ik_llama.cpp` (commit `b166e269`) on the > RTX 3090. This page documents the build, the mandatory FA build flags, and > the MoE / CPU-offload runtime arguments. @@ -101,8 +101,8 @@ a hard compile error. ## Runtime configuration -Files: `scripts/serve-frank-secondary.sh`, `scripts/frank-secondary.env`, -`scripts/frank-secondary.service` in the repo. The service just calls +Files: `scripts/serve-frank-zealot.sh`, `scripts/frank-zealot.env`, +`scripts/frank-zealot.service` in the repo. The service just calls the serve script; the env file holds all tunables. ### KV cache: K default f16 / V q6_0 + Hadamard (V only) @@ -241,7 +241,7 @@ apply. The previous runtime `upstream llama.cpp b10121` and its binary (`/home/dank/llama.cpp/build/bin/llama-server`) are **left untouched**. To rollback to the old stack, change `LLAMA_SERVER=` in -`scripts/frank-secondary.env` back to that path and +`scripts/frank-zealot.env` back to that path and `CACHE_TYPE_K/V` back to `f16` with Hadamard off, and re-enable the ngram spec / `--spec-type` flags. The model file is not changed either way. diff --git a/serverAppConfigs-docs/LLM/index.md b/serverAppConfigs-docs/LLM/index.md index 08e7e33..5410df3 100644 --- a/serverAppConfigs-docs/LLM/index.md +++ b/serverAppConfigs-docs/LLM/index.md @@ -1,6 +1,6 @@ # LLM Fleet — Knowledge Base -**Dankserver runs the radiance engine (StillDeadcode) on frank-primary** +**Dankserver runs the radiance engine (StillDeadcode) on frank-archon** (digest-pinned `stilldeadcode/radiance` image, engine as entrypoint, driving `podman run` directly, root systemd unit, :7770): the OFFICIAL `Qwen/Qwen3.8-Flash-Next-FP8` checkpoint at NATIVE block-FP8 precision @@ -8,15 +8,15 @@ driving `podman run` directly, root systemd unit, :7770): the OFFICIAL the descriptor-staging law), on BOTH R9700s TP=2 (`--tp-wire wht6`), experts in a 40 GiB/rank pinned host pool + VRAM cache (ratio 0.82), the 47.7 GiB PLE table pinned to host RAM, fp8 KV, MTP spec decode depth 3, -2 × 200,000 first boot. Rollback tags frank-primary-freetoken-pr587-20261005 -and frank-primary-vllm-shapeG-20261003), +2 × 200,000 first boot. Rollback tags frank-archon-freetoken-pr587-20261005 +and frank-archon-vllm-shapeG-20261003), and Dankclaw runs two endpoints — **halogen-flash-server 0.16.2 -(frank-large, port 7770: ghcr.io/peonist-ai/halogen-flash-server @ pinned +(frank-dragoon, port 7770: ghcr.io/peonist-ai/halogen-flash-server @ pinned digest serving the Quat3rnion ABLITERATED Swift1.5 finetune of Qwen3.8-Flash-Next v2, a ~62 GiB v2 .hgn that loads in no other engine, MTP spec decode always-on (HALOGEN_SPEC_ADAPT=0), TWO slots at 200,192 ctx, vision ON)** and -**llama.cpp CUDA (frank-secondary, port 7771: HauhauCS Gemma4-26B-A4B QAT +**llama.cpp CUDA (frank-zealot, port 7771: HauhauCS Gemma4-26B-A4B QAT Uncensored Q4_K_M GGUF — 26B MoE hybrid (25 sliding-window + 5 full-attention layers), ONE 200,704-token conversation, MTP disabled, q8_0 K + q8_0 V (FP8 class), vision via the publisher's own BF16 @@ -35,7 +35,7 @@ graph LR A[2x Radeon AI PRO R9700 gfx1201, 32 GiB each] B2[radiance StillDeadcode, digest-pinned image -podman run, frank-primary, port 7770] +podman run, frank-archon, port 7770] C[Qwen3.8-Flash-Next FP8 OFFICIAL, native block-FP8 2x R9700 TP=2 wht6, experts 40 GiB/rank pinned pool + VRAM, PLE 47.7 GiB pinned RAM, fp8 KV 7.32 KiB/tok, MTP depth 3, @@ -46,11 +46,11 @@ PLE 47.7 GiB pinned RAM, fp8 KV 7.32 KiB/tok, MTP depth 3, E2[RTX 3090 (PCIe x4 dock) + gfx1151 iGPU 114 GiB GTT] E[flash-server container gfx1151, digest-pinned image -frank-large, port 7770] +frank-dragoon, port 7770] F[flash-server v2 abliterated Swift1.5 .hgn + ngram table + vision tower 2 x 200192 ctx, MTP always-on, image input] G[llama.cpp master CUDA sm_86 -frank-secondary, port 7771] +frank-zealot, port 7771] H[Gemma4-26B-A4B QAT Uncensored Q4_K_M GGUF 1 x 200704 ctx, q8_0 K + q8_0 V, MTP off, mmproj vision] E2 --> E --> F @@ -71,7 +71,7 @@ frank-secondary, port 7771] ## Active Deployment -- [[frank-large-flash-server-v2-swift15]] — **ACTIVE since 2026-10-06** +- [[frank-dragoon-flash-server-v2-swift15]] — **ACTIVE since 2026-10-06** (root systemd unit + podman, port 7770): the digest-pinned `ghcr.io/peonist-ai/halogen-flash-server` 0.16.2 engine serving the Quat3rnion ABLITERATED Swift1.5 finetune of peonist's @@ -88,7 +88,7 @@ frank-secondary, port 7771] greedy, ~1,640 t/s prefill at 34k, ~72 % fewer thinking tokens. Rollback: revert the swap commit; the 27B payload + fetch script stay on disk -- [[frank-large-halogen27b-dflash2]] — **RETIRED 2026-10-05 → 10-06 +- [[frank-dragoon-halogen27b-dflash2]] — **RETIRED 2026-10-05 → 10-06 (rollback target; payload + fetch script + image on disk)**: the digest-pinned `ghcr.io/peonist-ai/halogen` 0.1.4 engine serving `peonist-ai/halogen-qwen3.8-27b` (`qwen3.8-27b-p1w4d-d2.hgn`, 33.4 GiB) @@ -99,24 +99,24 @@ frank-secondary, port 7771] the FA tile rejection (`HALOGEN_FA_TQ=256`: prefill −9.5 %, decode ±0.3 %), and deep decode at 3.3-3.8 t/s@80k being structural. The foreground-`podman run` ledger capture and the deep-role rerouting - (`slow`/`advisor` → frank-primary) carried forward. Superseded by the + (`slow`/`advisor` → frank-archon) carried forward. Superseded by the MODEL swap: the abliterated v2 .hgn loads only in flash-server, so the engine moved with the model -- [[frank-secondary-llama-qwen35-9b-q6k-2x200704]] — **ACTIVE since 2026-10-07** +- [[frank-zealot-llama-qwen35-9b-q6k-2x200704]] — **ACTIVE since 2026-10-07** (root systemd unit, port 7771): llama.cpp master (CUDA sm_86) serving HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive **Q6_K** on the RTX 3090 — TWO 200,704-token conversations (`--ctx-size 401408 --parallel 2`), exact f16 K + f16 V, vision via the publisher's BF16 mmproj. MTP is OFF because the file has no MTP tensors at all. Priced from the MiMo Q6_K boots (same qwen35 geometry, same card, same shape). Supersedes the Gemma4 era (below). -- [[frank-secondary-llama-gemma4-q4km-200704]] — **RETIRED 2026-10-07** (same +- [[frank-zealot-llama-gemma4-q4km-200704]] — **RETIRED 2026-10-07** (same day; superseded by qwen35-9b-q6k; payload on disk as rollback): llama.cpp master (CUDA sm_86) serving HauhauCS/Gemma4-26B-A4B-QAT-Uncensored- HauhauCS-Balanced-MTP **Q4_K_M** on the RTX 3090 — ONE 200,704-token conversation, f16 K + q8_0 V, vision via the publisher's mmproj. MTP was OFF (the gemma4-assistant drafter costs ~1.9 GiB: 23,806 used/319 free with it, 21,890/2,235 without). -- [[frank-secondary-llama-swift15-unc-iq3xxs-mtp-114688]] — **RETIRED +- [[frank-zealot-llama-swift15-unc-iq3xxs-mtp-114688]] — **RETIRED 2026-10-07** (superseded by gemma4-q4km; payload on disk as rollback); ACTIVE 2026-10-05 (evening) → 2026-10-07; UNCECERSED RCO-IQ3_XXS with MTP back on since @@ -139,7 +139,7 @@ frank-secondary, port 7771] 98/100). Replaces BOTH same-day payloads: the live MiMo Q6_K shape (below) and the Ornith-1.5-9B Q8_0 swap that was committed (77decb5..380aafa) but never deployed -- [[frank-secondary-llama-mimo-q6k-2x200704]] — **RETIRED 2026-10-05 (evening; +- [[frank-zealot-llama-mimo-q6k-2x200704]] — **RETIRED 2026-10-05 (evening; rollback target; payload on disk)**: llama.cpp master (CUDA sm_86) serving bartowski/MiMo-V2.6-Distill-Qwen-9B-GGUF **Q6_K**, TWO slots of 200,704 with FULLY UNQUANTIZED KV (f16 K + f16 V) and the mmproj for @@ -148,15 +148,15 @@ frank-secondary, port 7771] (+4.6 % prefill, measured), 2,279 MiB of the card left free. This was the LIVE payload when Swift cut over. The ubatch A/B table and the probe-size trap (>=256 px images or the model says "video") live inside -- [[frank-secondary-llama-mimo-q5km]] — **RETIRED 2026-10-02 → 10-03 (rollback +- [[frank-zealot-llama-mimo-q5km]] — **RETIRED 2026-10-02 → 10-03 (rollback target; payload on disk; owns the measured boot-pair table)**: the same runtime and the same 2 x 200,704 + f16 KV shape one quant rung lower — 104.8 tok/s, 3,571 MiB true free -- [[frank-primary-radiance-swift15-w4dn8]] — **STAGED (campaign running)**: +- [[frank-archon-radiance-swift15-w4dn8]] — **STAGED (campaign running)**: Swift1.5 Qwen3.8-Flash-Next BF16 → GPTQ-calibrated W4Dn8 `.rad` on radiance 1.0.13 (recipe + 10M-token calibration + KLD gate vs the BF16 container); replaces the FP8-native payload when the gates pass -- [[frank-primary-radiance-qwen38-native-fp8]] — **ACTIVE since 2026-10-05** +- [[frank-archon-radiance-qwen38-native-fp8]] — **ACTIVE since 2026-10-05** (root systemd unit, port 7770): the StillDeadcode **radiance** engine (C++/HIP, libr4d gfx1201 kernels, digest-pinned 287 MiB image, engine as the image entrypoint) serving the OFFICIAL `Qwen/Qwen3.8-Flash-Next-FP8` @@ -171,12 +171,12 @@ frank-secondary, port 7771] ram`), fp8 KV 7.32 KiB/token, MTP spec decode depth 3, 2 × 200,000 first boot, froggeric v22.5 template, vision + tools + `reasoning_content` auto, `/metrics` scraped. Rollback: git tag - `frank-primary-freetoken-pr587-20261005` (FreeToken image + orcarouter - payload on disk); older rollback `frank-primary-vllm-shapeG-20261003` -- [[frank-primary-freetoken-pr587]] — **RETIRED 2026-10-05 (same day; + `frank-archon-freetoken-pr587-20261005` (FreeToken image + orcarouter + payload on disk); older rollback `frank-archon-vllm-shapeG-20261003` +- [[frank-archon-freetoken-pr587]] — **RETIRED 2026-10-05 (same day; rollback target)**: FreeToken at PR #587 head `77a7201` (branch rocm714_torch214) built on the host into the local image - `frank-primary-freetoken:pr587-77a7201` (Dockerfile: digest-pinned + `frank-archon-freetoken:pr587-77a7201` (Dockerfile: digest-pinned rocm/pytorch rocm7.14 torch-2.11.0 base, libhiprtc dev-symlink law, curated --no-deps install per docs/install_amd.md), serving the SAME orcarouter FP8 payload on ONE R9700 — experts in pinned host RAM @@ -198,8 +198,8 @@ frank-secondary, port 7771] and a mounted compile cache. Why `--max-num-seqs` must stay 3 (SEQS 2 cannot compile this model), why the arena's levers are `max_model_len` and the overhead term rather than the KV pool, and the measured envelope -- [[frank-primary-glm53-flash-w4a16]] — RETIRED 2026-09-30 → 10-01 (the - failed GLM experiment; frank-primary runs Qwen FP8 again, see the intro): +- [[frank-archon-glm53-flash-w4a16]] — RETIRED 2026-09-30 → 10-01 (the + failed GLM experiment; frank-archon runs Qwen FP8 again, see the intro): the tcclaviger RDNA4 vLLM fork (digest-pinned `tcclaviger/vllm@sha256:da4029666…`, plain `podman run`, no shim) serving Intel/GLM-5.3-Flash-W4A16-AutoRound — AutoRound symmetric @@ -215,10 +215,10 @@ frank-secondary, port 7771] 35 tok/s target is NOT met, bounded by the fork's expert-gather read path (~8.2 GB/s effective vs a 22.74 GB/s link) at a 0.53-0.66 cache hit rate.** Rollback: commit `2339fae` (the qwen FP8 + MTP4 shape of 2026-09-29 → 09-30) -- [[frank-primary-r9v-radiance-qwen38-q8]] — RETIRED 2026-09-30 (two swaps +- [[frank-archon-r9v-radiance-qwen38-q8]] — RETIRED 2026-09-30 (two swaps back; payload and R9V state dirs intact on disk, git tag - frank-primary-r9v-q8-20260929 is the last pre-cutover commit): - [[frank-primary-r9v-radiance-qwen38-uncensored]] — RETIRED 2026-09-27 + frank-archon-r9v-q8-20260929 is the last pre-cutover commit): + [[frank-archon-r9v-radiance-qwen38-uncensored]] — RETIRED 2026-09-27 (same-day swap to the Q8_0 payload; rollback target, state + payload intact on disk): the R9V radiance-vLLM fork serving Dyluhn/Qwen3.8-Flash-Next-Uncensored-R9V-IQ4_XS (92.39 GiB, 3 shards) + @@ -226,8 +226,8 @@ frank-secondary, port 7771] experts (UVA pinned host copy, 62 hot + 160-slot LRU on rank 0, 428 static on rank 1), PLE n-gram on ssd-mmap, CED on, 196608 ctx. Cut over from llama.cpp the same day; rollback target - [[frank-primary-llamacpp-qwen38-flash-next-q8]] -- [[frank-primary-llamacpp-qwen38-flash-next-q8]] — RETIRED 2026-09-27 + [[frank-archon-llamacpp-qwen38-flash-next-q8]] +- [[frank-archon-llamacpp-qwen38-flash-next-q8]] — RETIRED 2026-09-27 (rollback target; the llama.cpp b11030 endpoint of 2026-09-26): unsloth llama.cpp (b11030-mix prebuilt, ROCm gfx120X, bundled runtime) serving unsloth/Qwen3.8-Flash-Next-GGUF at Q8_0 across both R9700s — @@ -236,7 +236,7 @@ frank-secondary, port 7771] (depth 2) chained behind ngram-mod, BF16 vision, one full 262,144-token conversation, `reasoning_content`, the placement law, the cutover and rollback -- [[frank-primary-lucebox-ds4]] — RETIRED 2026-09-26 (same-day swap, +- [[frank-archon-lucebox-ds4]] — RETIRED 2026-09-26 (same-day swap, rollback target; active for hours): the Lucebox DS4.1 engine (localhost/lucebox-rocm:gfx1201) serving Lucebox/DeepSeek-V4.1-Flash-ROCMFP23 (377.2 GiB) with streamed experts — @@ -259,8 +259,8 @@ frank-secondary, port 7771] ngram-fork-bug); the residual gap to ~60 tok/s is the fork's gather read path (6.5-9.5 GB/s effective vs 22.7 at the same slab size) - [[frank-medium-radiance-mxfp4]] — RETIRED 2026-09-26 (replaced by - [[frank-primary-lucebox-ds4]], then - [[frank-primary-llamacpp-qwen38-flash-next-q8]]): vllm-radiance 0.9.3 + [[frank-archon-lucebox-ds4]], then + [[frank-archon-llamacpp-qwen38-flash-next-q8]]): vllm-radiance 0.9.3 serving just1moremodel/Qwen3.8-27B-Uncensored-MXFP4-awq (MXFP4/quark W4A8) with the z-lab DFlash2-FP8 drafter as ONE tensor-parallel process (TP=2) behind :7770, on unquantized bf16 KV (`KV_DTYPE=auto`, cut @@ -288,15 +288,15 @@ frank-secondary, port 7771] kingjones777/Qwen3.8-27B-ROCmFPX-Q8_0-AGENT-GGUF; kept as the record of the runtime it replaced - [[freetoken-frank-small]] — RETIRED 2026-09-15, when the RTX 3090 moved to - frank-large: the FreeToken v0.1.2 frank-secondary runbook (batsclamp + frank-dragoon: the FreeToken v0.1.2 frank-zealot runbook (batsclamp Huihui-Qwen3.6-35B-A3B-abliterated-FP8), kept as the retirement record. The NAME was reused on 2026-09-16 by a different service on Dankclaw — see - [[frank-secondary-qwen38-gsq-rco]] + [[frank-zealot-qwen38-gsq-rco]] - [[freetoken-benchmark-sweep]] — KV pool vs decode speed sweep (bs1/bs3/bs4/bs6, 8k–700k KV) on Dankserver RTX 3090 - [[deployment]] — deploy and update process for both servers - [[frank-redo-2026-08-17]] — the 2026-08-17 topology change -- [[frank-large-rocmfpx-q6agent-uncensored-mtp]] — **RETIRED 2026-10-03 → +- [[frank-dragoon-rocmfpx-q6agent-uncensored-mtp]] — **RETIRED 2026-10-03 → 10-05 (rollback target; payload, fork build and build script on disk)**: the pinned ROCmFPX fork serving the uncensored protected-heads Q6_0_ROCMFPX_AGENT rung with the repo's MTP-Q4_0 head drafting 4 tokens, @@ -304,21 +304,21 @@ frank-secondary, port 7771] acceptance. Replaced by the halogen DFlash2 endpoint; the ngram-mod-onto-MTP rejection (-15 %, recurrent-state rollback) stays a live lesson for this architecture. -- [[frank-large-rocmfpx-q8agent-mtp]] — **RETIRED 2026-10-02 → 10-03 (the +- [[frank-dragoon-rocmfpx-q8agent-mtp]] — **RETIRED 2026-10-02 → 10-03 (the rollback target; payload still on disk)**: the same pinned ROCmFPX fork serving the ALIGNED `Q8_0_ROCMFPX_AGENT` (ftype 115, 17.0 t/s, MTP acceptance 0.462) — the MTP-vs-none +123 % A/B, the trap catalogue -- [[frank-large-gufo-qwen38-27b]] — **RETIRED 2026-10-02 (history; the +- [[frank-dragoon-gufo-qwen38-27b]] — **RETIRED 2026-10-02 (history; the payload dirs were removed from disk 2026-10-03, so this rollback is a re-download)** (root systemd unit, port 7770): gufo (gufo-org/gufo) v0.1.1, the Strix Halo inference engine, built from source on Dankclaw, serving unsloth/Qwen3.8-27B-GGUF **UD-Q4_K_XL** with the z-lab DFlash2 Q4_K_M drafter — ONE session at the full native 262,144 window, unquantized f16 KV. Rolled back by Frank after one day - of [[frank-large-vllm-mimo-v26-bf16]]. The two from-source build + of [[frank-dragoon-vllm-mimo-v26-bf16]]. The two from-source build workarounds, the client-contract delta, the measured prefill/decode trade against llama.cpp -- [[frank-large-vllm-mimo-v26-bf16]] — RETIRED 2026-10-01 (one day; +- [[frank-dragoon-vllm-mimo-v26-bf16]] — RETIRED 2026-10-01 (one day; rollback by Frank after the autoresearch loop): the digest-pinned kyuz0/vllm-therock-gfx1151 image serving XiaomiMiMo/MiMo-V2.6-Distill-Qwen-9B in FULL BF16, 4 x 262144 ctx, @@ -327,68 +327,68 @@ frank-secondary, port 7771] NEGATIVE on real chat+reasoning traffic), the roof math, the greedy-text numerics trap, and the death of every ≥6-bit vLLM quant path on gfx1151 (quark int8 rejected, FP8 kernels CDNA-only, torchao unwired) -- [[frank-large-unsloth-qwen38-27b-q8xl]] — RETIRED 2026-09-28 (replaced by - [[frank-large-gufo-qwen38-27b]]; rollback target): stock llama.cpp +- [[frank-dragoon-unsloth-qwen38-27b-q8xl]] — RETIRED 2026-09-28 (replaced by + [[frank-dragoon-gufo-qwen38-27b]]; rollback target): stock llama.cpp (unsloth b11030, ROCm gfx1151) serving unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL with the z-lab DFlash2 Q4_K_M drafter (depth 4) on the gfx1151 iGPU — one full 262,144-token conversation, q8_0 KV (the build lacks fp8), text-only, Qwen-Sharp v22.4.0 template, the 114 GiB GTT memory model, client contract, troubleshooting -- [[frank-large-kairic-edge-qwen38-27b]] — RETIRED 2026-09-21 (same-day - swap, replaced by [[frank-large-unsloth-qwen38-27b-q8xl]]; rollback +- [[frank-dragoon-kairic-edge-qwen38-27b]] — RETIRED 2026-09-21 (same-day + swap, replaced by [[frank-dragoon-unsloth-qwen38-27b-q8xl]]; rollback target): the Kairic Edge runtime (ciru-ai/ROCmFPX v1.2, built from source) serving jcbtc/Qwen3.8-27B-IU4-Kairic-Edge (IU4 W4A4, 27B dense) on the gfx1151 iGPU — one full 262,144-token conversation, MTP depth 4 + n-gram drafting, the three PromptForge sidecars, compatibility mode, the 114 GiB GTT memory model, client contract, troubleshooting -- [[frank-large-unsloth-qwen38-flash-next]] — RETIRED 2026-09-21 (same-day - swap, replaced by [[frank-large-kairic-edge-qwen38-27b]]; rollback target): +- [[frank-dragoon-unsloth-qwen38-flash-next]] — RETIRED 2026-09-21 (same-day + swap, replaced by [[frank-dragoon-kairic-edge-qwen38-27b]]; rollback target): the unsloth llama.cpp prebuilt (b11030-mix-5ff778e, ROCm gfx1151) serving unsloth/Qwen3.8-Flash-Next-GGUF:UD-IQ4_XS (125B MoE) on the gfx1151 iGPU — one 200,000-token conversation, MTP depth 2 via the explicit -md shared-Q8_0 head, the 114 GiB GTT memory model, client contract, troubleshooting -- [[frank-large-ciru-orca]] — RETIRED 2026-09-21 (replaced by - [[frank-large-unsloth-qwen38-flash-next]]; rollback target): the CIRU +- [[frank-dragoon-ciru-orca]] — RETIRED 2026-09-21 (replaced by + [[frank-dragoon-unsloth-qwen38-flash-next]]; rollback target): the CIRU v4.4.1 runtime (private host build, QSA hotfix) serving jcbtc/Qwen3.8-Flash-CIRU-STRIX-Orca w4b on the gfx1151 iGPU — one 262,144-token conversation, MTP depth 4, 4096 MiB PLE cache, runtime-root gate, client contract, troubleshooting (2026-09-19 → 09-21) - [[halogen-flash-server]] — RETIRED 2026-09-19 (replaced by - [[frank-large-ciru-orca]]; rollback target): peonist-ai halogen-flash-server + [[frank-dragoon-ciru-orca]]; rollback target): peonist-ai halogen-flash-server 0.5.8 serving peonist-ai/halogen-qwen3.8-flash-next (Qwen3.8-Flash-Next w4b .hgn + quality overlay) on the gfx1151 iGPU — two 200k conversations over one 400,384-position pool, deployed flags, memory model, client contract, troubleshooting (2026-09-16 → 09-19) -- [[frank-secondary-llama-mimo-q6k]] — **RETIRED 2026-10-01 → 10-02** (the same +- [[frank-zealot-llama-mimo-q6k]] — **RETIRED 2026-10-01 → 10-02** (the same rung returned ACTIVE 2026-10-03 at the 2 x 200,704 f16-KV shape — - [[frank-secondary-llama-mimo-q6k-2x200704]]): llama.cpp (master, CUDA sm_86 + [[frank-zealot-llama-mimo-q6k-2x200704]]): llama.cpp (master, CUDA sm_86 build) serving bartowski/MiMo-V2.6-Distill-Qwen-9B-GGUF **Q6_K** on the RTX 3090 — TWO native 262,144-token sessions with ASYMMETRIC KV (K f16 unquantized + V q8_0, which forces flash-attn), ~20.9/24.6 GiB measured, text-only (the GGUF has no vision), reasoning_content, no spec decode; payload still at `/home/dank/models/MiMo-Q6K/` -- [[frank-secondary-sglang-mimo-v26]] — RETIRED 2026-10-01 (hours; replaced - by [[frank-secondary-llama-mimo-q6k]] for the asymmetric KV SGLang cannot +- [[frank-zealot-sglang-mimo-v26]] — RETIRED 2026-10-01 (hours; replaced + by [[frank-zealot-llama-mimo-q6k]] for the asymmetric KV SGLang cannot express; venv still on disk, INT8 payload staged to `~dank/.AGENTTRASH/20261002-retired-llm-payloads/`): SGLang in a self-contained python3.12 venv serving leteschlead MiMo-V2.6 INT8 W8A16 AutoRound, 2 x 262144 ctx, fp8 KV, in-checkpoint vision, 83.9 tok/s decode -- [[frank-secondary-gemma4-12b]] — RETIRED 2026-09-17 → 2026-10-01 (replaced by - [[frank-secondary-sglang-mimo-v26]] → the llama.cpp MiMo shape; payload staged +- [[frank-zealot-gemma4-12b]] — RETIRED 2026-09-17 → 2026-10-01 (replaced by + [[frank-zealot-sglang-mimo-v26]] → the llama.cpp MiMo shape; payload staged to `~dank/.AGENTTRASH/20261002-retired-llm-payloads/Gemma4-12B-QAT/`): mainline llama.cpp serving HauhauCS/Gemma4-12B-QAT-Uncensored-HauhauCS-Balanced Q4_K_M on the RTX 3090, with the separate MTP assistant sidecar chained behind ngram-mod, q8_0 KV, and `--fit` sizing the full 262k window into ~12 GiB. -- [[frank-secondary-vllm-gemma4]] — RETIRED 2026-09-19 (same-day revert, +- [[frank-zealot-vllm-gemma4]] — RETIRED 2026-09-19 (same-day revert, rollback target): vLLM serving google/gemma-4-12B-it-qat-w4a16-ct (w4a16 Marlin) with the bf16 MTP assistant on the RTX 3090 — bf16 KV, 289,647- token pool, 2 concurrent full-context sessions, native text+image+audio. -- [[frank-secondary-qwen38-gsq-rco]] — RETIRED 2026-09-17 (rollback target): the - prior frank-secondary runbook (2026-09-16 → 09-17), ISTA-DASLab +- [[frank-zealot-qwen38-gsq-rco]] — RETIRED 2026-09-17 (rollback target): the + prior frank-zealot runbook (2026-09-16 → 09-17), ISTA-DASLab Qwen3.8-27B-GSQ-RCO IQ3_S with the model's own in-file MTP head and f16 KV at 131k - [[x4-pair-experiment]] — MEASURED 2026-09-16: what mainline llama.cpp can and @@ -398,7 +398,7 @@ frank-secondary, port 7771] that work (+7 % decode at 64k, cross-vendor included), the harness-parsing trap that invalidated the first round, and the iGPU-only result that matches halogen's deployed decode rate — at a memory cost the co-tenants cannot pay -- [[frank-large-ik-uncensored]] — RETIRED 2026-09-16 (rollback target): the +- [[frank-dragoon-ik-uncensored]] — RETIRED 2026-09-16 (rollback target): the ik_llama.cpp runbook (root systemd unit, 2026-09-15 → 09-16) serving mradermacher/Qwen3.8-Flash-Next-Uncensored-i1-Q4_K_M on the RTX 3090 (dense/attention/KV) + LPDDR (experts/PLE) hybrid; its measured envelope and @@ -407,7 +407,7 @@ frank-secondary, port 7771] `amd_iommu=off` since 2026-09-11 (13-16 % prefill, measured upstream), what it cost (the NPU endpoint), what was deliberately not copied from the reference machine, and how to revert -- [[kingjones-strix-rocmfp4]] — PRIOR frank-large runbook and rollback +- [[kingjones-strix-rocmfp4]] — PRIOR frank-dragoon runbook and rollback target: kingjones777/Qwen3.8-Flash-Next-ROCmFP4-STRIX-GGUF, 177B params (56B MoE + 51.2B PLE), single 113.47 GiB GGUF, on the card's pinned kingjones30/ROCmFPX fork (2026-08-30 → 2026-09-11) @@ -419,9 +419,9 @@ frank-secondary, port 7771] - [[eemin-rocmi4-mtp]] — the former caf-eemin Qwen3.8-27B embedded-MTP model on Dankclaw (retired) - [[dealign-ornith-crack]] — the retired Ornith-1.5-35B-A3B CRACK model on - Dankserver (frank-secondary, retired 2026-09-02) + Dankserver (frank-zealot, retired 2026-09-02) - [[ikllama-ornith-dankserver]] — the retired ik_llama.cpp runtime for - frank-secondary (2026-08-26): q8_0 + Hadamard KV cache, + frank-zealot (2026-08-26): q8_0 + Hadamard KV cache, split-mode none (single-GPU), mandatory FA_ALL_QUANTS build flags - [[kingjones-strix-mtp]] — the former Q6 AGENT runbook (restored 2026-09-01 after Q8_0 failure, then superseded by the STRIX deployment on 2026-08-27) @@ -429,9 +429,9 @@ frank-secondary, port 7771] on Dankclaw (superseded 2026-08-24 by the kingjones ROCmFP4 model) - [[kairic-edge]] — the retired Kairic Edge IU4 experiment (deployed and reverted 2026-08-22) -- [[Dankserver System Specs]] — the 2x R9700 box (frank-primary) -- [[Dankclaw System Specs]] — the Strix Halo gfx1151 box (frank-large on - the flash-server v2 runtime since 2026-10-06, frank-secondary on the RTX 3090) +- [[Dankserver System Specs]] — the 2x R9700 box (frank-archon) +- [[Dankclaw System Specs]] — the Strix Halo gfx1151 box (frank-dragoon on + the flash-server v2 runtime since 2026-10-06, frank-zealot on the RTX 3090) - [[frank-npu]] — RETIRED 2026-09-11: the FLM NPU sight+sound endpoint on Dankclaw (Gemma4 E4B vision+audio pack, XDNA2, port 7771), kept as the retirement record — the IOMMU/SVA err=-19 root cause and where @@ -455,7 +455,7 @@ frank-secondary, port 7771] - [[VLLM Overview]] — installation, CLI, API, architecture, quantization, parallelism - [[VLLM Index]] — quick reference with commands, endpoints, and parameter table - [[Running Qwen3.6 35B A3B FP8 on Dankserver]] — Qwen3.6-35B-A3B hardware - notes and sizing (this architecture family is what the retired frank-secondary + notes and sizing (this architecture family is what the retired frank-zealot served in the Huihui abliterated FP8 variant — see [[freetoken-frank-small]]; the Ornith-1.5-35B-A3B CRACK checkpoint that preceded it is archived at [[dealign-ornith-crack]]) @@ -471,7 +471,7 @@ frank-secondary, port 7771] - [[Qwen3.8 PP Deployment]] — the retired pipeline-parallel head + worker - [[qwen3.8-spec-matrix]] — Qwen3.8-27B spec history (superseded by FastMTP) - [[FastFlowLM NPU Inference]] — the retired FastFlowLM NPU endpoint -- [[frank-large-benchmark]] — backend/spec benchmark behind the old head +- [[frank-dragoon-benchmark]] — backend/spec benchmark behind the old head - [[dankserver-vram-growth]] — VRAM/RAM growth behind the retired cuBLAS crash - [[DFlash DSpark Speculative Decoding]] — retired DFlash/DSpark drafting - [[Quantization by Hardware Architecture]] — which quant format fits which GPU/CPU @@ -529,7 +529,7 @@ These sit alongside the operational pages under ## Related - [Project knowledge base](../index.md) — the Podman app stacks on the same - two hosts. OpenWebUI (Dankclaw) consumes the on-host `frank-large` + two hosts. OpenWebUI (Dankclaw) consumes the on-host `frank-dragoon` endpoint at `:7770`. The Gitea instance on Dankclaw hosts this repository. - [Deployment Flow](../Architecture/Deployment%20Flow.md) — the service-scoped git-based deploy with inference isolation \ No newline at end of file diff --git a/serverAppConfigs-docs/LLM/kairic-edge.md b/serverAppConfigs-docs/LLM/kairic-edge.md index a46b1d5..5557364 100644 --- a/serverAppConfigs-docs/LLM/kairic-edge.md +++ b/serverAppConfigs-docs/LLM/kairic-edge.md @@ -17,10 +17,10 @@ timestamp: 2026-08-22 > **Retired 2026-08-22.** This experiment was deployed, benchmarks were > collected, and the service reverted to v3 the same day (operator -> decision). `frank-large` serves v3 again. This page is kept as +> decision). `frank-dragoon` serves v3 again. This page is kept as > the retired experiment's build runbook and reference. -`frank-large` (port 52625) briefly served +`frank-dragoon` (port 52625) briefly served `jcbtc/Qwen3.8-27B-IU4-Kairic-Edge` through the Kairic Edge CIRU ROCmFPX llama.cpp runtime. The runtime routes qualified prompt and multi-token verification shapes through the RDNA 3.5 native @@ -215,7 +215,7 @@ service restart confirms the fresh tree, then it is a deletion candidate The service runs the pinned runner profile plus the local chat deviations below. Tunables live in -`scripts/frank-large.env`; flags in `scripts/serve-frank-large.sh`. +`scripts/frank-dragoon.env`; flags in `scripts/serve-frank-dragoon.sh`. See [[deployment]] for the update process. | Setting | Value | Origin | @@ -301,7 +301,7 @@ ubatches do not. Production runs the runner's qualified 2048/512. The v3 payload and binary stay on the machine for rollback. -1. Stop the service: `sudo systemctl stop frank-large` +1. Stop the service: `sudo systemctl stop frank-dragoon` 2. Restore the v3 scripts: `git revert 4c43839 7aee1df 40d50fe` (or checkout the script pair from commit `132e147`) diff --git a/serverAppConfigs-docs/LLM/kingjones-q8agent-rocmfpx.md b/serverAppConfigs-docs/LLM/kingjones-q8agent-rocmfpx.md index b15ae65..34939e6 100644 --- a/serverAppConfigs-docs/LLM/kingjones-q8agent-rocmfpx.md +++ b/serverAppConfigs-docs/LLM/kingjones-q8agent-rocmfpx.md @@ -8,7 +8,7 @@ tags: timestamp: 2026-09-15 --- -# frank-large: kingjones Qwen3.8-27B-ROCmFPX-Q8_0-AGENT +# frank-dragoon: kingjones Qwen3.8-27B-ROCmFPX-Q8_0-AGENT > **SUPERSEDED 2026-09-15.** The Q8_0_ROCMFPX-AGENT checkpoint (with the > separate `draft-mtp` head) now serves Dankserver as **frank-medium** on the @@ -21,7 +21,7 @@ the `set_rows` build bug** — the model loads but crashes in `ggml_compute_forward_set_rows` before it can serve. All config goals are met; a build fix is required for the model to run. -**Alias:** `frank-large`, port **7770**. +**Alias:** `frank-dragoon`, port **7770**. The large service serves the kingjones `Qwen3.8-27B-ROCmFPX-Q8_0-AGENT` GGUF from `/home/dank/models/kingjones-Qwen3.8-27B-ROCMFPX-Q8_0-AGENT/` with a @@ -42,8 +42,8 @@ fit in the lifted **114 GiB TTM/GTT** budget (see the 114 GiB change in | Reasoning | on, `deepseek`, budget `-1`, `--reasoning-format none` | | Chat template | Sharp (repo-tracked), `enable_thinking` + `preserve_thinking` on | | Host path | `/home/dank/models/kingjones-Qwen3.8-27B-ROCMFPX-Q8_0-AGENT/` | -| Tunables | `scripts/frank-large.env` | -| Serve script | `scripts/serve-frank-large.sh` | +| Tunables | `scripts/frank-dragoon.env` | +| Serve script | `scripts/serve-frank-dragoon.sh` | ## Serving status: the `set_rows` build bug (blocks serving) @@ -123,16 +123,16 @@ dl mtp-Qwen3.8-27B-Q4_0.gguf ``` The serve script checks each artifact is present and readable before launch -(`scripts/frank-large.env` -> the four `MODEL_*` files plus the chat +(`scripts/frank-dragoon.env` -> the four `MODEL_*` files plus the chat template). A missing file fails the artifact check with `missing or unreadable required artifact`. ## Serving profile -`scripts/serve-frank-large.sh` builds the `llama-server` call from the env: +`scripts/serve-frank-dragoon.sh` builds the `llama-server` call from the env: ``` -/dev/llama-server -m
--alias frank-large +/dev/llama-server -m
--alias frank-dragoon --host 0.0.0.0 --port 7770 --jinja -dev ROCm0 -ngl 999 -np 1 -c 262144 -b 512 -ub 512 -fa on @@ -213,7 +213,7 @@ and a 28 GB + 262k-KV load stalls. The GTT page-limit change is per the ## Env tunables -`scripts/frank-large.env`. Serving: `CTX_SIZE=262144`, +`scripts/frank-dragoon.env`. Serving: `CTX_SIZE=262144`, `PARALLEL=1`, `BATCH_SIZE=512`, `UBATCH_SIZE=512`, `NUM_THREADS=16`, `THREAD_BATCH=32`, `CACHE_TYPE_K=f16`, `CACHE_TYPE_V=turbo4`, `CTX_CHECKPOINTS=32`, `CACHE_RAM=8192`. Reasoning: `REASONING=on`, diff --git a/serverAppConfigs-docs/LLM/kingjones-strix-mtp.md b/serverAppConfigs-docs/LLM/kingjones-strix-mtp.md index 60fe35f..242c067 100644 --- a/serverAppConfigs-docs/LLM/kingjones-strix-mtp.md +++ b/serverAppConfigs-docs/LLM/kingjones-strix-mtp.md @@ -1,7 +1,7 @@ --- type: reference title: kingjones Qwen3.8-27B ROCmFP4 STRIX MTP on Dankclaw -description: kingjones777/Qwen3.8-27B-Uncensored-ROCmFP4-STRIX-MTP served by the CIRU ROCmFPX llama.cpp runtime on the Strix Halo iGPU. Dense model with a standalone MTP Q4_0 draft head. frank-large. +description: kingjones777/Qwen3.8-27B-Uncensored-ROCmFP4-STRIX-MTP served by the CIRU ROCmFPX llama.cpp runtime on the Strix Halo iGPU. Dense model with a standalone MTP Q4_0 draft head. frank-dragoon. tags: - llama.cpp - rocm @@ -15,7 +15,7 @@ timestamp: 2026-08-24 # kingjones Qwen3.8-27B ROCmFP4 STRIX MTP on Dankclaw -> **RETIRED 2026-08-29.** This payload was `frank-large` from 2026-08-25 +> **RETIRED 2026-08-29.** This payload was `frank-dragoon` from 2026-08-25 > until the Q8_0 AGENT experiment on 2026-08-29 (it was restored again > 2026-09-01 and served until 2026-08-30, when [[agentionai-fast-imatrix]] > took over). The Q8_0 model was retired because it crashed before @@ -24,7 +24,7 @@ timestamp: 2026-08-24 > This page documents a retired model and its runbook. -`frank-large` (port 7770) serves +`frank-dragoon` (port 7770) serves `Qwen3.8-27B-Uncensored-ROCmFP4-STRIX-MTP` from `kingjones777` on Hugging Face. It is a **dense** Qwen3.8-27B, abliterated (uncensored), quantized to the ROCmFP4 Q6 AGENT format (ftype 114). The MTP speculative head ships as diff --git a/serverAppConfigs-docs/LLM/kingjones-strix-rocmfp4.md b/serverAppConfigs-docs/LLM/kingjones-strix-rocmfp4.md index 4051584..4578f7f 100644 --- a/serverAppConfigs-docs/LLM/kingjones-strix-rocmfp4.md +++ b/serverAppConfigs-docs/LLM/kingjones-strix-rocmfp4.md @@ -1,7 +1,7 @@ --- type: reference title: kingjones Qwen3.8-Flash-Next ROCmFP4 STRIX on Dankclaw (prior, rollback target) -description: PRIOR frank-large runbook and rollback target (2026-08-30 → 2026-09-11). kingjones777/Qwen3.8-Flash-Next-ROCmFP4-STRIX-GGUF served by the card's pinned kingjones30/ROCmFPX fork. 177B params (56B MoE + 51.2B PLE streamed via mmap), single 113.47 GiB GGUF, 401408 ctx x 2 slots. +description: PRIOR frank-dragoon runbook and rollback target (2026-08-30 → 2026-09-11). kingjones777/Qwen3.8-Flash-Next-ROCmFP4-STRIX-GGUF served by the card's pinned kingjones30/ROCmFPX fork. 177B params (56B MoE + 51.2B PLE streamed via mmap), single 113.47 GiB GGUF, 401408 ctx x 2 slots. tags: - llama.cpp - rocm @@ -16,7 +16,7 @@ timestamp: 2026-08-30 # kingjones Qwen3.8-Flash-Next ROCmFP4 STRIX on Dankclaw -> **PRIOR / ROLLBACK TARGET since 2026-09-11** — frank-large moved to +> **PRIOR / ROLLBACK TARGET since 2026-09-11** — frank-dragoon moved to > [[halogen-flash-server]] (peonist-ai halogen-flash-server 0.5.8 serving > Qwen3.8-Flash-Next w4b), which upstream measures at roughly 4x this > runtime's prefill. Everything below documents the llama.cpp era and stays @@ -33,10 +33,10 @@ timestamp: 2026-08-30 > (the card ships no spec flags; the Flash-Next MTP heads do not load on > this loader family — see MTP Draft Head). -`frank-large` (port 7770) serves +`frank-dragoon` (port 7770) serves `Qwen3.8-Flash-Next-Q4_0-ROCmFP4-STRIX.gguf` (single file, 113.47 GiB) from `/home/dank/models/kingjones-Qwen3.8-Flash-Next-ROCmFP4-STRIX/` -via `scripts/serve-frank-large.sh` + `scripts/frank-large.env` +via `scripts/serve-frank-dragoon.sh` + `scripts/frank-dragoon.env` and the Qwen-Sharp chat template. ## Model Architecture @@ -188,7 +188,7 @@ cmake --build build --target llama-server llama-quantize -j16 ## Serving Profile -Deployed args (`scripts/frank-large.env` — our validated +Deployed args (`scripts/frank-dragoon.env` — our validated profile, unchanged from the FAST deployment except the binary and model): ``` @@ -282,9 +282,9 @@ The file is 113.47 GiB. Allow ~20-30 minutes for download depending on network. 1. Build the runtime (see Runtime build) BEFORE touching the service. 2. Point the model file's directory at the canonical path (a plain `mv` — never delete a 113 GiB payload to re-fetch it). -3. Edit `scripts/frank-large.env` (+ serve script defaults) via +3. Edit `scripts/frank-dragoon.env` (+ serve script defaults) via git: commit, push, `./scripts/deploy.sh dankclaw --service - frank-large`. + frank-dragoon`. 4. Verify health: `curl http://192.168.0.143:7770/health` and a real `/v1/chat/completions` probe. @@ -294,8 +294,8 @@ binary and the agentionai payload remain on disk. ### Config files -- Env: `scripts/frank-large.env` -- Serve: `scripts/serve-frank-large.sh` +- Env: `scripts/frank-dragoon.env` +- Serve: `scripts/serve-frank-dragoon.sh` - Chat template: `scripts/chat-template.jinja` ## Known Issues diff --git a/serverAppConfigs-docs/LLM/ling-3.0-flash-trial.md b/serverAppConfigs-docs/LLM/ling-3.0-flash-trial.md index fd79c94..507f937 100644 --- a/serverAppConfigs-docs/LLM/ling-3.0-flash-trial.md +++ b/serverAppConfigs-docs/LLM/ling-3.0-flash-trial.md @@ -8,11 +8,11 @@ timestamp: 2026-09-03 # Ling-3.0-flash Q6_K Trial on Dankclaw -> **RETIRED 2026-08-17.** The `frank-large-ling` unit is disabled under the boot policy. At this page's retirement date `frank-large` ran the Qwen3.8-27B PP head (since superseded by the STRIX deployment — see [[kingjones-strix-rocmfp4]]), not the Qwen3.6-27B config described in the (obsolete) switch-back section below. +> **RETIRED 2026-08-17.** The `frank-dragoon-ling` unit is disabled under the boot policy. At this page's retirement date `frank-dragoon` ran the Qwen3.8-27B PP head (since superseded by the STRIX deployment — see [[kingjones-strix-rocmfp4]]), not the Qwen3.6-27B config described in the (obsolete) switch-back section below. ## Status -- Service: `frank-large-ling` (systemd). +- Service: `frank-dragoon-ling` (systemd). - Model: `inclusionAI/Ling-3.0-flash` Q6_K (MoE, ~118B total params). - Runtime: llama.cpp **fork** `aetherbird/llama.cpp` branch `bailingmoe3-support` (commit `db4480bc8`, build b10411) at @@ -77,14 +77,14 @@ point varies (385-1588 tokens). Single streams never freeze. `SPEC_TYPE=none`, `PARALLEL=2`. All concurrent streams complete (EOS). Speed cost: ~10-13 t/s under contention vs ~28-32 t/s single-stream with MTP. Fallback chain if spec-off regresses: A) `PARALLEL=1` keep MTP, -B) switch back to Qwen3.6-27B (frank-large, MTP n_max 3). +B) switch back to Qwen3.6-27B (frank-dragoon, MTP n_max 3). ## Files -- `scripts/frank-large-ling.service` - systemd unit. +- `scripts/frank-dragoon-ling.service` - systemd unit. - `scripts/serve-ling-flash.sh` - serve script (fork binary, Vulkan, draft-mtp). -- `scripts/frank-large.ling.env` - tunables. +- `scripts/frank-dragoon.ling.env` - tunables. Passwordless management is installed: `/usr/local/sbin/frank-restart-ling.sh` and `/etc/sudoers.d/frank-ling`. @@ -92,9 +92,9 @@ Passwordless management is installed: ## Switch Back (obsolete) The switch-back commands below are obsolete. At retirement time -`frank-large` ran the Qwen3.8-27B pipeline-parallel head. To restore a Ling trial, -re-enable `frank-large-ling` from the repo unit -(`scripts/frank-large-ling.service`) and serve script +`frank-dragoon` ran the Qwen3.8-27B pipeline-parallel head. To restore a Ling trial, +re-enable `frank-dragoon-ling` from the repo unit +(`scripts/frank-dragoon-ling.service`) and serve script (`scripts/serve-ling-flash.sh`), then start it on a non-conflicting port. ## Caveats @@ -111,6 +111,6 @@ re-enable `frank-large-ling` from the repo unit ## See Also -- [[frank-large-benchmark]] +- [[frank-dragoon-benchmark]] - [[DFlash DSpark Speculative Decoding]] - [[deployment]] diff --git a/serverAppConfigs-docs/LLM/ling-3.0-flash-vllm-plan.md b/serverAppConfigs-docs/LLM/ling-3.0-flash-vllm-plan.md index b0d59ae..6a79b10 100644 --- a/serverAppConfigs-docs/LLM/ling-3.0-flash-vllm-plan.md +++ b/serverAppConfigs-docs/LLM/ling-3.0-flash-vllm-plan.md @@ -15,6 +15,6 @@ This page was the plan for a vLLM-ROCm deployment of Dankclaw. The deployment never shipped. The actual Ling work used the llama.cpp Q6_K fork trial instead: [[ling-3.0-flash-trial]]. -The trial service (`frank-large-ling`) is retired and disabled under the -boot policy (2026-08-17). `frank-large` is the Qwen3.8-27B PP +The trial service (`frank-dragoon-ling`) is retired and disabled under the +boot policy (2026-08-17). `frank-dragoon` is the Qwen3.8-27B PP head, not the Ling path. See git history for the full decision table. diff --git a/serverAppConfigs-docs/LLM/qwen3.8-spec-matrix.md b/serverAppConfigs-docs/LLM/qwen3.8-spec-matrix.md index 598597d..5d75eff 100644 --- a/serverAppConfigs-docs/LLM/qwen3.8-spec-matrix.md +++ b/serverAppConfigs-docs/LLM/qwen3.8-spec-matrix.md @@ -14,7 +14,7 @@ timestamp: 2026-09-03 # Qwen3.8-27B Speculative-Decoding Matrix This page records the speculative-decoding benchmark history and the -production tuning for the Qwen3.8-27B service (`frank-large`), +production tuning for the Qwen3.8-27B service (`frank-dragoon`), now a pipeline-parallel head with a Dankserver worker. ## Production state (2026-08-17: Q6_K, q8_0/f16 KV, split 0.68) @@ -154,7 +154,7 @@ that is the long-context attention penalty, not a spec artifact. ## Production Configuration -The live tunables live in `scripts/frank-large.env` (head) and +The live tunables live in `scripts/frank-dragoon.env` (head) and `scripts/frank-pp-worker.env` (worker) in this repo. The Production state section at the top of this page records the current values: Q6_K model + standalone MTP draft, split 0.68/0.32, 262144 ctx, PARALLEL=1, @@ -162,6 +162,6 @@ q8_0/f16 KV. ## See Also -- [[frank-large-benchmark]] +- [[frank-dragoon-benchmark]] - [[ling-3.0-flash-trial]] - [[deployment]] diff --git a/serverAppConfigs-docs/LLM/qwen3.8-strix-optimizations.md b/serverAppConfigs-docs/LLM/qwen3.8-strix-optimizations.md index ce97db0..4e8d683 100644 --- a/serverAppConfigs-docs/LLM/qwen3.8-strix-optimizations.md +++ b/serverAppConfigs-docs/LLM/qwen3.8-strix-optimizations.md @@ -15,7 +15,7 @@ and the test matrix planned for 2026-08-16 morning. Related pages: - [Speculative-decoding matrix](qwen3.8-spec-matrix.md) -- [Backend and spec benchmark](frank-large-benchmark.md) +- [Backend and spec benchmark](frank-dragoon-benchmark.md) - [Dankclaw Improvements](Dankclaw%20Improvements.md) (OS-level items) - [Pipeline Parallelism: Qwen3.8 PP Deployment](Pipeline%20Parallelism/Qwen3.8%20PP%20Deployment.md) @@ -66,7 +66,7 @@ Consequences of the hybrid design: ## Current production state (baseline) -`frank-large` (Dankclaw, Vulkan0, 2026-08-15): +`frank-dragoon` (Dankclaw, Vulkan0, 2026-08-15): - Model: UD-Q8_K_XL, 31.5 GB, bundled MTP head. - `--spec-default` (ngram-mod) with draft-mtp first in the chain. @@ -233,7 +233,7 @@ tensor cache warm). | E | A with n_max 3 and 5 | n_max curve on the split | | F | A, plain Q8_0 model file | same-bit A/B | | G | PP default proportional split (no `--tensor-split`) | confirms the 20/80 handicap | -| Ref | production frank-large (Vulkan, 2 slots) | the bar to beat | +| Ref | production frank-dragoon (Vulkan, 2 slots) | the bar to beat | Per config: `pp-test.sh bench 4` (4k prompt / 256 out) and `bench 16` (16k / 256). Report: decode t/s (server print_timing), prefill t/s, MTP @@ -253,5 +253,5 @@ production @16k) with the same 8-bit model. `-dio` for RPC). - llama.cpp b10433 source: `src/llama.cpp` (device selection), `common/speculative.cpp` (MTP/ngram-mod), `ggml/src/ggml-rpc` (protocol). -- Local benchmarks: [frank-large-benchmark](frank-large-benchmark.md), +- Local benchmarks: [frank-dragoon-benchmark](frank-dragoon-benchmark.md), [qwen3.8-spec-matrix](qwen3.8-spec-matrix.md). diff --git a/serverAppConfigs-docs/LLM/swift15-campaign-worklog.md b/serverAppConfigs-docs/LLM/swift15-campaign-worklog.md index bddcc2f..1cb81cd 100644 --- a/serverAppConfigs-docs/LLM/swift15-campaign-worklog.md +++ b/serverAppConfigs-docs/LLM/swift15-campaign-worklog.md @@ -4,9 +4,9 @@ Campaign branch `swift15-radiance-w4dn8`. Goal: convert `ukisai/Swift1.5-Qwen3.8-Flash-Next` (BF16, 335.3 GiB) to `qwen4exp-swift15-w4dn8-i8-hc8m.rad` (GPTQ gate_up w4nl64 + block-fp8 down + 10 protected bf16 experts + int8 trunk + fixed-scale PLE) and swap it into -frank-primary on the 1.0.13 pin. Design settled (25-question grill); this log +frank-archon on the 1.0.13 pin. Design settled (25-question grill); this log carries execution facts only. The cutover runbook -`frank-primary-radiance-swift15-w4dn8.md` replaces this page at cutover. +`frank-archon-radiance-swift15-w4dn8.md` replaces this page at cutover. ## 2026-10-06 evening @@ -44,7 +44,7 @@ carries execution facts only. The cutover runbook ≥126,000 MiB), `apply-protected-cast.sh` (derive → recipe PROTECTED section, refuses double-derive), `kld-gate-swift15.sh` (candidate vs reference on 1.0.13, gate mean KL ≤ 0.03 / top-1 ≥ 95 %). -- `frank-primary` showing `failed` during the campaign is the 143-on-stop +- `frank-archon` showing `failed` during the campaign is the 143-on-stop signature of the foreground podman unit — cosmetic, not a crash. ## 2026-10-07 morning diff --git a/serverAppConfigs-docs/LLM/ubatch-benchmark-large.md b/serverAppConfigs-docs/LLM/ubatch-benchmark-large.md index d5fe213..706c612 100644 --- a/serverAppConfigs-docs/LLM/ubatch-benchmark-large.md +++ b/serverAppConfigs-docs/LLM/ubatch-benchmark-large.md @@ -1,6 +1,6 @@ --- type: benchmark plan -title: frank-large ubatch sweep +title: frank-dragoon ubatch sweep description: Standardized ubatch sweep for the active kingjones Qwen3.8 ROCmFPX deployment. tags: - llama.cpp @@ -10,9 +10,9 @@ tags: timestamp: 2026-09-01 --- -# frank-large ubatch sweep +# frank-dragoon ubatch sweep -This benchmark uses the active `frank-large` model on Dankclaw with +This benchmark uses the active `frank-dragoon` model on Dankclaw with `llama-bench`. It does not use `llama-server`, HTTP requests, or server-log scraping. Stop the production service before running it and start the service again afterward. @@ -29,9 +29,9 @@ Each point runs three 128-token repetitions by default. Run on Dankclaw from the repository checkout: ```bash -sudo systemctl stop frank-large +sudo systemctl stop frank-dragoon ./scripts/bench-ubatch.sh -sudo systemctl start frank-large +sudo systemctl start frank-dragoon ``` The script uses the active Q6 AGENT model, an 8K prompt workload, equal diff --git a/serverAppConfigs-docs/LLM/vLLM Boot Forensics and Config Interrogation.md b/serverAppConfigs-docs/LLM/vLLM Boot Forensics and Config Interrogation.md index 2bd9e74..a35516d 100644 --- a/serverAppConfigs-docs/LLM/vLLM Boot Forensics and Config Interrogation.md +++ b/serverAppConfigs-docs/LLM/vLLM Boot Forensics and Config Interrogation.md @@ -8,7 +8,7 @@ timestamp: 2026-10-05T00:00:00-07:00 # vLLM Boot Forensics and Config Interrogation -For serve-script vLLM endpoints (frank-primary/qwen-fp8 on dankserver, any +For serve-script vLLM endpoints (frank-archon/qwen-fp8 on dankserver, any `podman rm -f` + restart service). ## 1. Capture the true cause — the journal, not `podman logs` @@ -204,4 +204,4 @@ clipping at depth) starts with sections 1–3 here before touching anything. - [[RDNA4 MoE Expert Offload VRAM Budget]] — the plan arithmetic behind OOMs - [[dankserver-qwen38-fp8-expert-offload-tuning]] — deployed shape and history -- [[frank-large-benchmark]] and [[frank-secondary-benchmark]] — probe/ladder hygiene on live hosts +- [[frank-dragoon-benchmark]] and [[frank-zealot-benchmark]] — probe/ladder hygiene on live hosts diff --git a/serverAppConfigs-docs/LLM/vLLM Porting and Compile Triage.md b/serverAppConfigs-docs/LLM/vLLM Porting and Compile Triage.md index 76cdb13..21dbfb8 100644 --- a/serverAppConfigs-docs/LLM/vLLM Porting and Compile Triage.md +++ b/serverAppConfigs-docs/LLM/vLLM Porting and Compile Triage.md @@ -302,7 +302,7 @@ consumed at `v1/worker/gpu/cudagraph_utils.py:621`). ### Window discipline and verification - Scratch boots on dankserver MUST stop + runtime-mask production - `frank-primary` first — the expert-offload planner reads `MemAvailable` at + `frank-archon` first — the expert-offload planner reads `MemAvailable` at plan time, and beside-prod boots die at plan with `ExpertPlanError: host holds N of M swappable experts`. After stop+mask, loop until `MemAvailable ≥ 230 GiB` before launching (a stop against a diff --git a/serverAppConfigs-docs/LLM/x4-pair-experiment.md b/serverAppConfigs-docs/LLM/x4-pair-experiment.md index 1c147ef..da137af 100644 --- a/serverAppConfigs-docs/LLM/x4-pair-experiment.md +++ b/serverAppConfigs-docs/LLM/x4-pair-experiment.md @@ -249,13 +249,13 @@ distinguishes a real split from a mislabelled sweep. The fleet's answer is unchanged — **two independent endpoints** ([[halogen-flash-server]] on the iGPU via halogen, -[[frank-secondary-qwen38-gsq-rco]] holding a whole 27B in the 3090's 24 GB) — but two +[[frank-zealot-qwen38-gsq-rco]] holding a whole 27B in the 3090's 24 GB) — but two claims from the first round of this experiment are now corrected: 1. **Cross-vendor layer split is possible** (measured: CUDA0 + Vulkan1, 27.23 tok/s and 268.5 t/s prefill at 64k). It is not a regime change (+7 % decode), and it costs the 3090 ~15 GiB — which this fleet spends on the vision endpoint - (`frank-secondary` holds 22.4 of the card's 24.6 GiB). An operator who wants the + (`frank-zealot` holds 22.4 of the card's 24.6 GiB). An operator who wants the 7 % must give up the fleet's only image-capable endpoint. 2. **Per-tensor placement across two devices is impossible while `-ot` is used**, for a scheduler-mechanical reason, regardless of driver or vendor mix. @@ -309,11 +309,11 @@ Operational notes for the next run: `GGML_CUDA_NO_PINNED_WEIGHTS`. Without it a CPU-overridden tensor can land in a pinned `CUDA_Host` buffer — the 2026-09-15 108 GiB page-lock that starved this host's co-tenants. -- `systemctl mask` is **refused** for a relinked root unit: frank-secondary's - `/etc/systemd/system/frank-secondary.service` is a symlink into the repo, so +- `systemctl mask` is **refused** for a relinked root unit: frank-zealot's + `/etc/systemd/system/frank-zealot.service` is a symlink into the repo, so `mask` exits with "File ... already exists". Stop it and rely on the absence of a restart trigger, or move the symlink aside. -- Restarting frank-large needs the quadlet source back in +- Restarting frank-dragoon needs the quadlet source back in `~/.config/containers/systemd/` plus `daemon-reload`; the generator re-creates the unit from that file only. After the restore (and the host reboot, see the landmines) the ledger read `400384 positions, ~27.2 GiB` against a 33.5 GiB diff --git a/serverAppConfigs-docs/Operations/Container Host Reachability.md b/serverAppConfigs-docs/Operations/Container Host Reachability.md index 22fc58c..c6088fb 100644 --- a/serverAppConfigs-docs/Operations/Container Host Reachability.md +++ b/serverAppConfigs-docs/Operations/Container Host Reachability.md @@ -94,7 +94,7 @@ earlier can still hold listener/TIME_WAIT state, so the replacement dies `pasta: ... bind: Address already in use` (conmon exit 126) — then **self-heals seconds later** under `Restart=on-failure`. The failure looks like it failed, then looks fine, and the missing gate stays invisible because the retry masks -it. Observed 2026-09-16 cutting `frank-large` from a root unit to a rootless +it. Observed 2026-09-16 cutting `frank-dragoon` from a root unit to a rootless Quadlet. Gate procedure: stop the old unit AND the new one (a redeploy's running diff --git a/serverAppConfigs-docs/Operations/Fleet Audit and Posture.md b/serverAppConfigs-docs/Operations/Fleet Audit and Posture.md index 72f7609..170cb3e 100644 --- a/serverAppConfigs-docs/Operations/Fleet Audit and Posture.md +++ b/serverAppConfigs-docs/Operations/Fleet Audit and Posture.md @@ -217,8 +217,8 @@ done ``` Ground truth (verify, don't assume — IPs can move): 192.168.0.143 = dankclaw -= AI stack + `frank-large` :7770 + `frank-secondary` :7771 (RTX 3090 + Strix -Halo iGPU); 192.168.0.235 = dankserver = media stack + `frank-primary` += AI stack + `frank-dragoon` :7770 + `frank-zealot` :7771 (RTX 3090 + Strix +Halo iGPU); 192.168.0.235 = dankserver = media stack + `frank-archon` :7770 (2× R9700). Repo dirs + live hostnames agree; the deploy tooling is hostname-anchored (`ssh dankclaw`/`ssh dankserver` via `~/.ssh/config`), so it is unaffected by IP drift. diff --git a/serverAppConfigs-docs/Operations/Fleet Ops Playbook.md b/serverAppConfigs-docs/Operations/Fleet Ops Playbook.md index d840a29..7163609 100644 --- a/serverAppConfigs-docs/Operations/Fleet Ops Playbook.md +++ b/serverAppConfigs-docs/Operations/Fleet Ops Playbook.md @@ -12,7 +12,7 @@ timestamp: 2026-10-05T00:00:00-07:00 Use when `:7770`/`:7771` gives **connection refused** (not a timeout) and the service was not crashed. Applies to `frank-medium` (dankserver, root unit), -`frank-secondary` (dankclaw, root unit), `frank-large` (dankclaw, rootless +`frank-zealot` (dankclaw, root unit), `frank-dragoon` (dankclaw, rootless Quadlet). **1. Classify the stop before touching anything** @@ -95,22 +95,22 @@ the local Gitea on Dankclaw — push allowed). unquoted word with `=` in an ssh one-liner (`echo ===` aborts the chain). A freshly restarted endpoint under live agent-queue backlog may return empty bodies/timeouts for minutes while `/health` is 200 — re-probe with a long -timeout. First request after a halogen (`frank-large`) restart can go silent -45–60 s and self-recover; do not restart over it. Rootless `frank-large`: +timeout. First request after a halogen (`frank-dragoon`) restart can go silent +45–60 s and self-recover; do not restart over it. Rootless `frank-dragoon`: read logs **without** sudo (per-user storage). If the restore never happened, the sudo journal names who and when: `journalctl -b | grep sudo`. ## Scratch vLLM boot on a fleet GPU host — stop-first law Any scratch/experimental vLLM container on a host that also runs a production -LLM service (`frank-primary`, `frank-large`, `frank-secondary`) MUST stop the +LLM service (`frank-archon`, `frank-dragoon`, `frank-zealot`) MUST stop the production unit first, and the window script must verify it. Two independent failure modes if skipped: 1. **Expert-offload planner dies on host RAM.** `vllm/model_executor/offloader/expert_plan.py` reads `MemAvailable` at plan time. A production rank worker holds tens of GiB of unevictable - pinned expert rows (frank-primary: ~76 GiB × 2 ranks), so a beside-prod + pinned expert rows (frank-archon: ~76 GiB × 2 ranks), so a beside-prod boot sees ~86 GiB instead of ~239 and dies at plan time: `ExpertPlanError: host holds 5113 of 12096 swappable experts per rank`. Looks like a planner bug; is pure RAM contention. Signature: container @@ -124,15 +124,15 @@ failure modes if skipped: Window skeleton (dankserver): ```bash -sudo systemctl stop frank-primary.service -sudo systemctl mask --runtime frank-primary.service # relinked unit: plain mask refuses; runtime mask self-clears at reboot +sudo systemctl stop frank-archon.service +sudo systemctl mask --runtime frank-archon.service # relinked unit: plain mask refuses; runtime mask self-clears at reboot sleep 3 -podman ps --format "{{.Names}}" | grep -q frank-primary-glm && { echo "prod still running - abort"; exit 1; } +podman ps --format "{{.Names}}" | grep -q frank-archon-glm && { echo "prod still running - abort"; exit 1; } # ... launch scratch container, watch logs ... podman rm -f # stuck vLLM ignores SIGTERM -sudo systemctl unmask --runtime frank-primary.service -sudo systemctl reset-failed frank-primary.service -sudo systemctl start frank-primary.service +sudo systemctl unmask --runtime frank-archon.service +sudo systemctl reset-failed frank-archon.service +sudo systemctl start frank-archon.service # restore oracle is a CONJUNCTION: health 200 AND is-active active AND is-enabled enabled AND no /run/systemd/system mask symlink ``` diff --git a/serverAppConfigs-docs/Operations/Payload and Disk Reclaim.md b/serverAppConfigs-docs/Operations/Payload and Disk Reclaim.md index 0e6dc0a..b756208 100644 --- a/serverAppConfigs-docs/Operations/Payload and Disk Reclaim.md +++ b/serverAppConfigs-docs/Operations/Payload and Disk Reclaim.md @@ -49,7 +49,7 @@ table. Three buckets: - **retired** — maps to a retired runtime. Safe candidates. Trap: a directory can hold **both** a dead target and a live drafter -(frank-large's DFlash2 drafter lives beside the previous target). Move the +(frank-dragoon's DFlash2 drafter lives beside the previous target). Move the single file, never the directory, and say so in the manifest. ## 3. The live-reference check — before moving anything @@ -64,7 +64,7 @@ done Then **read every hit**; do not count them. Most are benign (comments, retired fetch-script destinations, `retire_*_quadlet` helpers that move a quadlet not a model) — but on Dankclaw this check found a live bug: -`serve-frank-secondary.sh`'s `: "${MODEL_DIR:=...}"` fallback still pointed at a +`serve-frank-zealot.sh`'s `: "${MODEL_DIR:=...}"` fallback still pointed at a payload retired a week earlier. The env file always overrode it, so it was invisible; a missing env file would have produced a "missing asset" naming a model that no longer exists. @@ -99,7 +99,7 @@ active). ## 5. Verify, then report — and do not purge ```sh -systemctl is-active frank-large frank-secondary +systemctl is-active frank-dragoon frank-zealot curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:7770/health ``` @@ -149,7 +149,7 @@ name**, never `endswith('.gguf')` — mradermacher ships large quants as ## Refresh per engine — know the recovery path BEFORE deleting -- **frank-large (halogen)**: the engine fetches its own payload via +- **frank-dragoon (halogen)**: the engine fetches its own payload via `HALOGEN_DOWNLOAD` when the checkpoint is absent. Clear the directory but leave it **existing and empty**, then start the unit. **Bind-mount trap:** podman refuses a mount whose source is missing diff --git a/serverAppConfigs-docs/Research/Local TTS and Voice Cloning.md b/serverAppConfigs-docs/Research/Local TTS and Voice Cloning.md index 72d9aa4..264afd5 100644 --- a/serverAppConfigs-docs/Research/Local TTS and Voice Cloning.md +++ b/serverAppConfigs-docs/Research/Local TTS and Voice Cloning.md @@ -191,7 +191,7 @@ Ports 8880–8883 avoid the fleet's LLM ports (7770/7771). licenses (IndexTTS, Fish S2, XTTS v2). For a personal homelab voice, MIT / Apache-2.0 (Chatterbox, Qwen3-TTS, GLM-TTS, VoxCPM2) is the safe set. - **Co-locate on the 3090** with a low `--gpu-memory-utilization` (~0.35) so the - TTS engine shares the card with frank-secondary; move to the R9700s only if TTS + TTS engine shares the card with frank-zealot; move to the R9700s only if TTS throughput demand grows. - **Guard the endpoint like any other service:** if vhosted, it goes behind the Anubis → Authentik chain; non-browser clients (OMP's `curl`) must target the diff --git a/serverAppConfigs-docs/Research/Most Popular Self-Hosted AI Apps.md b/serverAppConfigs-docs/Research/Most Popular Self-Hosted AI Apps.md index 07f9f86..1610366 100644 --- a/serverAppConfigs-docs/Research/Most Popular Self-Hosted AI Apps.md +++ b/serverAppConfigs-docs/Research/Most Popular Self-Hosted AI Apps.md @@ -107,7 +107,7 @@ TTS), [Kokoro-82M](https://github.com/hexgrad/kokoro) (8,933, Apache-2.0, TTS), the `Comfy-Org` org. Already running on this fleet (Qwen-Image 2.1 GGUF) and wired as the Open WebUI image engine. - **llama.cpp** — the reference GGUF inference engine; `llama-server` exposes an - OpenAI-compatible endpoint. Backbone of this fleet's frank-secondary/frank-large. + OpenAI-compatible endpoint. Backbone of this fleet's frank-zealot/frank-dragoon. - **vLLM** — high-throughput PagedAttention serving with an OpenAI-compatible API; the multi-GPU option (frank-medium runs vLLM tensor-parallel across two R9700s). diff --git a/serverAppConfigs-docs/Research/Service Research Brief.md b/serverAppConfigs-docs/Research/Service Research Brief.md index 3eb7cc9..b6075a4 100644 --- a/serverAppConfigs-docs/Research/Service Research Brief.md +++ b/serverAppConfigs-docs/Research/Service Research Brief.md @@ -1,6 +1,6 @@ --- type: reference -description: "Consolidated research from the `frank-secondary` research subagents (2026-08-14) plus the pi agent knowledge base." +description: "Consolidated research from the `frank-zealot` research subagents (2026-08-14) plus the pi agent knowledge base." tags: - research timestamp: 2026-09-03 @@ -8,7 +8,7 @@ timestamp: 2026-09-03 # Service Research Brief -Consolidated research from the `frank-secondary` research subagents (2026-08-14) plus the pi agent knowledge base. This is the source material behind the per-service docs pages. +Consolidated research from the `frank-zealot` research subagents (2026-08-14) plus the pi agent knowledge base. This is the source material behind the per-service docs pages. ## Method diff --git a/serverAppConfigs-docs/Research/popular-self-hosted-ai-apps.html b/serverAppConfigs-docs/Research/popular-self-hosted-ai-apps.html index 4ffc914..dae80c4 100644 --- a/serverAppConfigs-docs/Research/popular-self-hosted-ai-apps.html +++ b/serverAppConfigs-docs/Research/popular-self-hosted-ai-apps.html @@ -227,7 +227,7 @@

llama.cpp EXCELLENT

129,149★ · MIT · LLM runtime
-

The reference GGUF inference engine; llama-server exposes an OpenAI-compatible endpoint. Backbone of this fleet's frank-secondary/frank-large endpoints. Runs on CPU, CUDA, ROCm, Vulkan, Metal.

+

The reference GGUF inference engine; llama-server exposes an OpenAI-compatible endpoint. Backbone of this fleet's frank-zealot/frank-dragoon endpoints. Runs on CPU, CUDA, ROCm, Vulkan, Metal.

diff --git a/serverAppConfigs-docs/index.md b/serverAppConfigs-docs/index.md index 2a4ad0e..c56d0f9 100644 --- a/serverAppConfigs-docs/index.md +++ b/serverAppConfigs-docs/index.md @@ -182,30 +182,30 @@ The LLM inference fleet on the two hosts. Full index: ### Deployment and Topology - [[deployment]] — unified deploy and update process for both servers -- [[frank-primary-radiance-swift15-w4dn8]] — STAGED frank-primary runbook: +- [[frank-archon-radiance-swift15-w4dn8]] — STAGED frank-archon runbook: Swift1.5 Qwen3.8-Flash-Next BF16 → GPTQ-calibrated W4Dn8 `.rad` (radiance 1.0.13), gated on KLD ≤ 0.03 vs the BF16 container and decode ≥ 30.8 t/s; - activates by flipping `MODEL_FILE` in `scripts/frank-primary.env`, rollback + activates by flipping `MODEL_FILE` in `scripts/frank-archon.env`, rollback = revert that line (the FP8-native `.rad` stays on disk) -- [[frank-primary-radiance-qwen38-native-fp8]] — the ACTIVE frank-primary +- [[frank-archon-radiance-qwen38-native-fp8]] — the ACTIVE frank-archon runbook (2026-10-05): the StillDeadcode radiance engine (digest-pinned 287 MiB image, libr4d gfx1201 kernels) serving the OFFICIAL `Qwen/Qwen3.8-Flash-Next-FP8` at native block-FP8 (no-recipe convert after the descriptor-staging drop) on BOTH R9700s TP=2 `wht6`, experts in a 40 GiB/rank pinned host pool, PLE 47.7 GiB pinned to RAM, fp8 KV 7.32 KiB/token, MTP depth 3, 2 × 200,000 first boot; rollback is the - FreeToken one-card era (tag `frank-primary-freetoken-pr587-20261005`), - then the tcclaviger shape-G era (tag `frank-primary-vllm-shapeG-20261003`) + FreeToken one-card era (tag `frank-archon-freetoken-pr587-20261005`), + then the tcclaviger shape-G era (tag `frank-archon-vllm-shapeG-20261003`) - [[swift15-campaign-worklog]] — ACTIVE campaign log: the Swift1.5 → - w4dn8 radiance convert and frank-primary swap in flight (branch + w4dn8 radiance convert and frank-archon swap in flight (branch `swift15-radiance-w4dn8`); the cutover runbook replaces it at completion. -- [[frank-primary-freetoken-pr587]] — RETIRED 2026-10-05 (superseded the +- [[frank-archon-freetoken-pr587]] — RETIRED 2026-10-05 (superseded the same day by the radiance cutover above; kept as the rollback runbook): FreeToken built at PR #587 head `77a7201` on the host into - `frank-primary-freetoken:pr587-77a7201`, ONE R9700 with experts in pinned + `frank-archon-freetoken:pr587-77a7201`, ONE R9700 with experts in pinned host RAM behind a 0.10 GPU LRU, 2 slots, parsers AUTO - [[frank-redo-2026-08-17]] — the 2026-08-17 topology change -- [[frank-primary-r9v-radiance-qwen38-q8]] — RETIRED 2026-09-30 (two swaps +- [[frank-archon-r9v-radiance-qwen38-q8]] — RETIRED 2026-09-30 (two swaps back; rollback target): the R9V radiance-vLLM fork (docker-pinned bundle `2dac17a2`, docker→podman shim) serving the unsloth Qwen3.8-Flash-Next-GGUF Q8_0 (175.30 GiB, 6 shards) + blockfp8 MTP4 + @@ -213,19 +213,19 @@ The LLM inference fleet on the two hosts. Full index: LRU cache), PLE pinned 54.4 GB in host RAM, CED off, 131,072 ctx single stream, Qwen-Sharp template, root unit with LimitMEMLOCK, the on-host qualified state, the cutover, and the rollback -- [[frank-primary-r9v-radiance-qwen38-uncensored]] — RETIRED 2026-09-27 +- [[frank-archon-r9v-radiance-qwen38-uncensored]] — RETIRED 2026-09-27 (rollback target): the R9V radiance-vLLM fork serving the abliterated Dyluhn Qwen3.8-Flash-Next-Uncensored IQ4_XS (92.39 GiB) + MTP4 + F16 vision — TP=2 tiered experts with a UVA pinned host copy, PLE on ssd-mmap, CED on, 196,608 ctx; state dir + frozen config + payload intact on disk -- [[frank-primary-llamacpp-qwen38-flash-next-q8]] — RETIRED 2026-09-27 +- [[frank-archon-llamacpp-qwen38-flash-next-q8]] — RETIRED 2026-09-27 (rollback target): unsloth llama.cpp (b11030-mix prebuilt, ROCm gfx120X, root unit) serving unsloth Qwen3.8-Flash-Next at Q8_0 (175.3 GiB) on Dankserver's both R9700s — the shared Q8_0 MTP head chained behind ngram-mod, BF16 vision, the experts and the 51B n-gram table computed in host RAM, the placement law, the cutover, and the rollback -- [[frank-primary-lucebox-ds4]] — RETIRED 2026-09-26 (same-day swap; +- [[frank-archon-lucebox-ds4]] — RETIRED 2026-09-26 (same-day swap; rollback target): the Lucebox runtime serving DeepSeek-V4.1-Flash-ROCMFP23 (377.2 GiB GGUF, **40**-layer MoE, **384** routed experts top-6, 189 GiB of embedded Engram) on Dankserver's R9700 @@ -250,8 +250,8 @@ The LLM inference fleet on the two hosts. Full index: concurrency, ngram-fork-bug); the residual gap to ~60 tok/s is the fork's gather read path (6.5-9.5 GB/s effective vs 22.7 at the same slab size) -- [[frank-primary-glm53-flash-w4a16]] — VERIFIED 2026-09-30: the ACTIVE - frank-primary runbook. The cutover to Intel/GLM-5.3-Flash-W4A16-AutoRound +- [[frank-archon-glm53-flash-w4a16]] — VERIFIED 2026-09-30: the ACTIVE + frank-archon runbook. The cutover to Intel/GLM-5.3-Flash-W4A16-AutoRound (symmetric int4 g128) on the tcclaviger fork, and the reason the int4 AutoRound payload is the ONLY one that serves here (its `auto-round` quant method routes to the W4A16 offload kernel; a compressed-tensors W4A16 @@ -290,11 +290,11 @@ The LLM inference fleet on the two hosts. Full index: - [[freetoken-benchmark-sweep]] — KV pool vs decode speed sweep (bs1/bs3/bs4/bs6, 8k–700k KV) on the retired Dankserver RTX 3090 - [[kingjones-strix-mtp]] — the Qwen3.8-27B-Q6_0 ROCmFPX AGENT era with the standalone MTP draft (Dankclaw, 2026-08-25 → 2026-08-29; historical) -- [[agentionai-fast-imatrix]] — the retired frank-large runbook: +- [[agentionai-fast-imatrix]] — the retired frank-dragoon runbook: agentionai/Qwen3.8-Flash-Next-ROCmFP4-FAST-imatrix (87.06 GiB, Q4_0_ROCMFP4_FAST) + own MTP draft, build-qwen38 (retired 2026-08-30; rollback record) -- [[frank-large-halogen27b-dflash2]] — the ACTIVE frank-large runbook since +- [[frank-dragoon-halogen27b-dflash2]] — the ACTIVE frank-dragoon runbook since 2026-10-05 (root systemd unit + podman, port 7770): the digest-pinned ghcr.io/peonist-ai/halogen image serving peonist-ai/halogen-qwen3.8-27b (qwen3.8-27b-p1w4d-d2.hgn, 33.4 GiB — a .hgn that loads in no other @@ -302,10 +302,10 @@ The LLM inference fleet on the two hosts. Full index: disables speculation — engine law); TEXT-ONLY and censored base, both accepted tradeoffs; no server-side sampler, so the thinking recipe rides the wire -- [[frank-large-flash-server-v2-swift15]] — the ACTIVE frank-large runbook +- [[frank-dragoon-flash-server-v2-swift15]] — the ACTIVE frank-dragoon runbook since 2026-10-06 (supersedes halogen 0.1.4): halogen-flash-server 0.16.2 serving the abliterated Swift1.5 Qwen3.8-Flash-Next v2 (.hgn) -- [[frank-large-rocmfpx-q6agent-uncensored-mtp]] — RETIRED 2026-10-03 → 10-05 +- [[frank-dragoon-rocmfpx-q6agent-uncensored-mtp]] — RETIRED 2026-10-03 → 10-05 (rollback target; payload, fork build and build script on disk): the pinned kingjones30/ROCmFPX fork (scripts/build-rocmfpx.sh) serving kingjones777/ Qwen3.8-27B-Uncensored-ROCmFP4-STRIX-MTP-GGUF @@ -314,64 +314,64 @@ The LLM inference fleet on the two hosts. Full index: host reads — with the repo's Q4_0 MTP head drafting 4 tokens (27.6-28.1 t/s measured, 86.8 % acceptance; the ngram-mod chain measured and rejected) and its BF16 projector, one session at the native 262,144 window -- [[frank-large-rocmfpx-q8agent-mtp]] — RETIRED 2026-10-02 → 10-03 (rollback +- [[frank-dragoon-rocmfpx-q8agent-mtp]] — RETIRED 2026-10-02 → 10-03 (rollback target, aligned Q8 payload still on disk): the same fork serving the ALIGNED Q8_0_ROCMFPX_AGENT at 17.0 t/s — the +123 % MTP A/B, the traps -- [[frank-large-gufo-qwen38-27b]] — RETIRED 2026-10-01 → 10-02 (history; +- [[frank-dragoon-gufo-qwen38-27b]] — RETIRED 2026-10-01 → 10-02 (history; the payload dirs were removed from disk 2026-10-03, `scripts/build-gufo.sh` remains): gufo v0.1.1 built from source serving Qwen3.8-27B UD-Q4_K_XL + the z-lab DFlash2 drafter on the gfx1151 iGPU — the two from-source build workarounds, the template-hash allowlist, the measured prefill/decode trade -- [[frank-large-vllm-mimo-v26-bf16]] — RETIRED 2026-10-01 (same day; +- [[frank-dragoon-vllm-mimo-v26-bf16]] — RETIRED 2026-10-01 (same day; replaced by the gufo rollback, then by - [[frank-large-rocmfpx-q8agent-mtp]]): the digest-pinned + [[frank-dragoon-rocmfpx-q8agent-mtp]]): the digest-pinned kyuz0/vllm-therock-gfx1151 image (vLLM 0.30, TheRock ROCm 10) serving XiaomiMiMo/MiMo-V2.6-Distill-Qwen-9B in FULL BF16 on the gfx1151 iGPU, 4 x 262,144 ctx, with CROSS-MODEL MTP spec decode from Qwen/Qwen3.5-9B — the roof math (13.1 t/s base is ~94% of LPDDR5x BF16), the measured MTP-vs-DFlash table (19.8 vs 17.4 t/s), the greedy-text numerics trap, the `reasoning` field change, troubleshooting -- [[frank-large-unsloth-qwen38-27b-q8xl]] — RETIRED 2026-09-28 (replaced by - [[frank-large-gufo-qwen38-27b]]; rollback target): stock llama.cpp +- [[frank-dragoon-unsloth-qwen38-27b-q8xl]] — RETIRED 2026-09-28 (replaced by + [[frank-dragoon-gufo-qwen38-27b]]; rollback target): stock llama.cpp (unsloth b11030, ROCm gfx1151) serving unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL with the z-lab DFlash2 Q4_K_M drafter (depth 4) on the gfx1151 iGPU — one 262,144-token conversation, q8_0 KV (the build lacks fp8), text-only, Qwen-Sharp v22.4.0 template, the 114 GiB GTT memory model, client contract -- [[frank-large-kairic-edge-qwen38-27b]] — RETIRED 2026-09-21 (replaced by - [[frank-large-unsloth-qwen38-27b-q8xl]]; same-day swap): the Kairic Edge +- [[frank-dragoon-kairic-edge-qwen38-27b]] — RETIRED 2026-09-21 (replaced by + [[frank-dragoon-unsloth-qwen38-27b-q8xl]]; same-day swap): the Kairic Edge runtime (ciru-ai/ROCmFPX kairic-edge-qwen38-27b-v1.2, TheRock 7.15.0, Composable Kernel) serving jcbtc/Qwen3.8-27B-IU4-Kairic-Edge (a 27B dense model, main GGUF + FFN/GDN/GDN-Output .pfs sidecars) on the gfx1151 iGPU — one 262,144-token conversation, native MTP depth 4 + n-gram drafting, compatibility mode, the 114 GiB GTT memory model, client contract -- [[frank-large-unsloth-qwen38-flash-next]] — RETIRED 2026-09-21 (replaced by - [[frank-large-kairic-edge-qwen38-27b]]; same-day swap): the unsloth +- [[frank-dragoon-unsloth-qwen38-flash-next]] — RETIRED 2026-09-21 (replaced by + [[frank-dragoon-kairic-edge-qwen38-27b]]; same-day swap): the unsloth llama.cpp prebuilt (b11030-mix-5ff778e, ROCm gfx1151) serving unsloth/Qwen3.8-Flash-Next-GGUF:UD-IQ4_XS (a 125B MoE / 6B active) on the gfx1151 iGPU — one 200,000-token conversation, MTP depth 2 via the explicit -md shared-Q8_0 head, the 114 GiB GTT memory model, client contract -- [[frank-large-ciru-orca]] — RETIRED 2026-09-21 (replaced by - [[frank-large-unsloth-qwen38-flash-next]]; rollback target, 2026-09-19 → +- [[frank-dragoon-ciru-orca]] — RETIRED 2026-09-21 (replaced by + [[frank-dragoon-unsloth-qwen38-flash-next]]; rollback target, 2026-09-19 → 09-21): the CIRU v4.4.1 runtime (private host build, QSA hotfix) serving jcbtc/Qwen3.8-Flash-CIRU-STRIX-Orca w4b on the gfx1151 iGPU — one 262,144-token conversation, MTP depth 4, 4096 MiB PLE cache, runtime-root gate, client contract - [[halogen-flash-server]] — RETIRED 2026-09-19 (replaced by - [[frank-large-ciru-orca]]; rollback target, 2026-09-16 → 09-19): + [[frank-dragoon-ciru-orca]]; rollback target, 2026-09-16 → 09-19): peonist-ai/halogen-flash-server 0.5.8 serving peonist-ai/halogen-qwen3.8- flash-next (w4b `.hgn` + quality overlay) on the gfx1151 iGPU — two 200k conversations over one 400,384-position pool, deployed flags, memory model, client contract -- [[frank-large-ik-uncensored]] — the RETIRED 2026-09-16 frank-large runbook +- [[frank-dragoon-ik-uncensored]] — the RETIRED 2026-09-16 frank-dragoon runbook and rollback target (2026-09-15 → 09-16): ik_llama.cpp serving mradermacher/Qwen3.8-Flash-Next-Uncensored-i1-Q4_K_M on the RTX 3090 + Strix Halo hybrid — its measured envelope is why the fleet went back - [[dankclaw-iommu-translation-off]] — why Dankclaw boots with `amd_iommu=off` since 2026-09-11 (13-16 % prefill), what it cost (the NPU endpoint), and how to revert -- [[kingjones-strix-rocmfp4]] — the PRIOR frank-large runbook +- [[kingjones-strix-rocmfp4]] — the PRIOR frank-dragoon runbook (2026-08-30 → 2026-09-11) and the rollback target: kingjones777/Qwen3.8-Flash-Next-ROCmFP4-STRIX-GGUF on the card's pinned kingjones30/ROCmFPX build @@ -380,21 +380,21 @@ The LLM inference fleet on the two hosts. Full index: - [[ciru-activefpx-promptforge]] — the RETIRED v3 CIRU PromptForge runtime on Dankclaw (superseded 2026-08-24) - [[kingjones-strix-mtp]] — the kingjones Qwen3.8-27B ROCmFP4 STRIX MTP model on Dankclaw (active) - [[dealign-ornith-crack]] — the retired Ornith-1.5-35B-A3B CRACK model on Dankserver (retired 2026-09-02) -- [[frank-secondary-llama-qwen35-9b-q6k-2x200704]] — the **ACTIVE** frank-secondary +- [[frank-zealot-llama-qwen35-9b-q6k-2x200704]] — the **ACTIVE** frank-zealot runbook since 2026-10-07 (late): llama.cpp master (CUDA sm_86) serving HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive **Q6_K** on the RTX 3090 — TWO 200,704-token conversations, exact f16 K + f16 V, MTP **impossible** (the file carries no `nextn`/`mtp` tensors), vision through the publisher's BF16 mmproj; priced from the MiMo Q6_K boots (same qwen35 geometry) -- [[frank-secondary-llama-gemma4-q4km-200704]] — RETIRED 2026-10-07 (same day; +- [[frank-zealot-llama-gemma4-q4km-200704]] — RETIRED 2026-10-07 (same day; payload on disk as rollback): llama.cpp master (CUDA sm_86) serving HauhauCS Gemma4-26B-A4B QAT Uncensored **Q4_K_M** on the RTX 3090 — ONE 200,704-token conversation, f16 K + q8_0 V, MTP **disabled** (the `gemma4-assistant` drafter costs ~1.9 GiB: boot was 23,806 used/319 free with it, 21,890/2,235 without), vision through the publisher's mmproj -- [[frank-secondary-llama-swift15-unc-iq3xxs-mtp-114688]] — RETIRED 2026-10-07 +- [[frank-zealot-llama-swift15-unc-iq3xxs-mtp-114688]] — RETIRED 2026-10-07 (superseded by gemma4; payload on disk as the rollback): the - frank-secondary runbook 2026-10-05 (evening) → 2026-10-07 + frank-zealot runbook 2026-10-05 (evening) → 2026-10-07 (**UNCECERSED RCO-IQ3_XXS with MTP back on since 2026-10-06 evening; renamed from frank-small and reshaped to TWO 114,688-token conversations at Frank's 112k cap with @@ -403,7 +403,7 @@ The LLM inference fleet on the two hosts. Full index: (the MTP head in the file is drafted) on the RTX 3090 — 1,005 MiB free at boot (763 settled after a vision probe), q8_0 K + q8_0 V, vision through the publisher's own projector, ~52–58 t/s recipe decode with MTP -- [[frank-secondary-llama-mimo-q6k-2x200704]] — RETIRED 2026-10-05 (evening, +- [[frank-zealot-llama-mimo-q6k-2x200704]] — RETIRED 2026-10-05 (evening, superseded by swift15): llama.cpp master serving bartowski/MiMo-V2.6-Distill-Qwen-9B-GGUF **Q6_K** — TWO conversations at 200,704 tokens each with fully unquantized f16 KV and mmproj vision; @@ -411,37 +411,37 @@ The LLM inference fleet on the two hosts. Full index: weight-bandwidth), batch 4096 / ubatch 2048 (+4.6 % prefill, measured 2026-10-05), 2,279 MiB free, and the ≥256 px image-probe trap (tiny images answer "video") -- [[frank-secondary-llama-mimo-q5km]] — RETIRED 2026-10-02 → 10-03 (rollback +- [[frank-zealot-llama-mimo-q5km]] — RETIRED 2026-10-02 → 10-03 (rollback target, payload on disk; owns the measured boot-pair table): same runtime and shape one rung lower — 104.8 tok/s, 3,571 MiB true free -- [[frank-secondary-llama-mimo-q6k]] — RETIRED 2026-10-01 (same day; that same +- [[frank-zealot-llama-mimo-q6k]] — RETIRED 2026-10-01 (same day; that same Q6_K rung returned ACTIVE 2026-10-03 at the new shape, see - [[frank-secondary-llama-mimo-q6k-2x200704]]): the first llama.cpp + GGUF shape + [[frank-zealot-llama-mimo-q6k-2x200704]]): the first llama.cpp + GGUF shape for this endpoint, Q6_K at 2 x 262,144 / f16-K + q8_0-V, 20.9 GiB measured -- [[frank-secondary-sglang-mimo-v26]] — RETIRED 2026-10-01 (rollback target): +- [[frank-zealot-sglang-mimo-v26]] — RETIRED 2026-10-01 (rollback target): SGLang in a self-contained python3.12 venv serving letechlead/MiMo-V2.6-Distill-Qwen-9B-INT8-W8A16-AutoRound (qwen3_5 hybrid, INT8 W8A16, in-checkpoint vision, NO MTP weights shipped) on Dankclaw's RTX 3090, port 7771 — fp8 KV, pinned 606,208-token pool, 2 x 262,144 slots, bf16 mamba states, eager prefill -- [[frank-secondary-gemma4-12b]] — RETIRED 2026-10-01 (rollback target): +- [[frank-zealot-gemma4-12b]] — RETIRED 2026-10-01 (rollback target): mainline llama.cpp serving HauhauCS/Gemma4-12B-QAT-Uncensored-HauhauCS-Balanced at Q4_K_M (MTP assistant sidecar + ngram-mod, q8_0 KV) on Dankclaw's RTX 3090, port 7771 -- [[frank-secondary-vllm-gemma4]] — RETIRED 2026-09-19 (same-day revert, +- [[frank-zealot-vllm-gemma4]] — RETIRED 2026-09-19 (same-day revert, rollback target): vLLM serving google/gemma-4-12B-it-qat-w4a16-ct (w4a16 Marlin) with the bf16 MTP assistant on the RTX 3090 — bf16 KV, 289,647- token pool, 2 concurrent full-context sessions, native text+image+audio -- [[frank-secondary-qwen38-gsq-rco]] — RETIRED 2026-09-17 (rollback target): - the prior frank-secondary runbook (2026-09-16 → 09-17), ISTA-DASLab +- [[frank-zealot-qwen38-gsq-rco]] — RETIRED 2026-09-17 (rollback target): + the prior frank-zealot runbook (2026-09-16 → 09-17), ISTA-DASLab Qwen3.8-27B-GSQ-RCO IQ3_S with own in-file MTP head + BF16 projector -- [[ikllama-ornith-dankserver]] — the retired ik_llama.cpp runtime for the old frank-secondary (q8_0 + Hadamard KV cache, split-mode none; 2026-08-26) +- [[ikllama-ornith-dankserver]] — the retired ik_llama.cpp runtime for the old frank-zealot (q8_0 + Hadamard KV cache, split-mode none; 2026-08-26) - [[freetoken-frank-small]] — RETIRED 2026-09-15: the FreeToken/CUDA frank-small runbook, retired with the RTX 3090 - [[kairic-edge]] — the retired Kairic Edge IU4 experiment (2026-08-22) - [[dflash2-large-vulkan]] — the retired DFlash2 Vulkan deployment (2026-08-21) - [[Dankserver System Specs]] — the 2x R9700 box hardware (frank-medium) -- [[Dankclaw System Specs]] — the Strix Halo gfx1151 box (frank-large) +- [[Dankclaw System Specs]] — the Strix Halo gfx1151 box (frank-dragoon) - [[Dankclaw Improvements]] — host-level changes on the Strix Halo box - [[Swap Configuration]] — the 64 GiB `/swap.img` host swapfile (raised from 8 GiB 2026-09-12): fstab-driven `swap.img.swap` unit, the safe resize @@ -454,9 +454,9 @@ The LLM inference fleet on the two hosts. Full index: ### Benchmarks and Sizing -- [[frank-large-benchmark]] — backend/spec benchmark behind the old head +- [[frank-dragoon-benchmark]] — backend/spec benchmark behind the old head - [[ubatch-benchmark-large]] — active-model llama-bench ubatch sweep plan and results -- [[frank-secondary-benchmark]] — the small-model benchmark suite +- [[frank-zealot-benchmark]] — the small-model benchmark suite - [[frank-medium-batch-ubatch]] — the 2026-09-16 batch/ubatch sweep on the 2x R9700 layer split: prefill PEAKS at ubatch 512 and falls on both sides, the logical batch buys nothing measurable, decode never moves, and the ubatch's diff --git a/serverAppConfigs-docs/log.md b/serverAppConfigs-docs/log.md index d8e86d9..84bee43 100644 --- a/serverAppConfigs-docs/log.md +++ b/serverAppConfigs-docs/log.md @@ -1,5 +1,25 @@ # Bundle Change Log +## 2026-10-10 +- **Fleet service rename: the StarCraft names became the SERVICE names.** + The 2026-10-09 wire alias moved onto every repo artifact: units, serve + scripts, env files and their `FRANK_*` variables, deployer service keys, + container names, Prometheus/Grafana job names, bats seams, runbook + filenames and all historical prose. `frank-archon` (dankserver :7770), + `frank-dragoon` (dankclaw :7770), `frank-zealot` (dankclaw :7771). The + three former service names are fully retired: `git grep` over the tree + returns zero, rollback tags were renamed in lockstep (e.g. tag + `frank-archon-freetoken-pr587-20261005`), and the harness `models.yml` + lore matches. Host cutover = stop old unit + remove old container, + deploy the renamed service (the deployer relinks the unit under the new + name; `add_pending_services` auto-trashes the retired markers). The + retired `frank-medium`/`frank-small`/`frank-npu` names are historical + and stay as they are. +- **Known casualty:** the two vendored vLLM-fork patches under + `scripts/patches/` carry the old service names in context lines; the + sweep rewrote them, so those patches (retired eras, rebuildable from + the renamed tags) no longer apply byte-exact. + ## 2026-10-09 - **Live — five authentik human accounts provisioned (Dankclaw, `ak shell` ORM, no repo objects):** kirby (pk 17), ry (18), nic (19), debo (20), @@ -20,18 +40,18 @@ that makes the picker model visible to every `role='user'` account. - **Live — the Protoss rename finished on the wire (all three endpoints).** - Served model ids moved `frank-primary` → **frank-archon** - (`FRANK_PRIMARY_SERVED_NAME`), `frank-large` → **frank-dragoon** - (`HALOGEN_MODEL_ID`), `frank-secondary` → **frank-zealot** (`ALIAS`). The + Served model ids moved `frank-archon` → **frank-archon** + (`FRANK_ARCHON_SERVED_NAME`), `frank-dragoon` → **frank-dragoon** + (`HALOGEN_MODEL_ID`), `frank-zealot` → **frank-zealot** (`ALIAS`). The services, units, scripts, env files and runbook pages keep the old names — container/unit identity stays stable, only the alias moved. Deploys in order: - `dankclaw --service frank-secondary` (e2e gate 33/33 green), `dankclaw - --service frank-large` (healthy 30 s), `dankserver --service frank-primary` + `dankclaw --service frank-zealot` (e2e gate 33/33 green), `dankclaw + --service frank-dragoon` (healthy 30 s), `dankserver --service frank-archon` (healthy 102 s), `dankclaw --service homepage`. Verified on `/v1/models`, not on chat echoes: `frank-zealot` (`n_ctx 200704`, Q6_K), `frank-dragoon` (`context_length 262144`), `frank-archon`. - **Live — OpenWebUI re-keyed in the same window** (snapshot - `webui.db.bak-20261009`): `model` row (`frank-secondary` → `frank-zealot`, + `webui.db.bak-20261009`): `model` row (`frank-zealot` → `frank-zealot`, params + `meta.description` preserved), the `access_grant` row (`model`/`frank-zealot`/`user`/`*`/`read`), and `openai.api_configs` `model_ids` on all three backends; `systemctl --user restart @@ -42,27 +62,27 @@ probe returns `{"items":[],"total":0}` for that account while the picker is plainly populated — the API census is not the acceptance test, the UI snapshot is. -- **Live — Hermes re-keyed** (`config.yaml` `frank-large` → `frank-dragoon` +- **Live — Hermes re-keyed** (`config.yaml` `frank-dragoon` → `frank-dragoon` in the provider block, `model.default` and the three `dankclaw-large` auxiliary routes; backup `config.yaml.bak-20261009`; `hermes.service` + `hermes-webui.service` restarted, gateway log clean, `/health` ok) and the repo baseline `dankclaw/hermes/config.yaml.example` synced to the live shape (context 262144). **Flagged, not fixed:** Hermes still routes its `dankserver-small` auxiliary tasks at the id `frank-medium` on - `192.168.0.235:7770`, an endpoint that has served `frank-primary` since + `192.168.0.235:7770`, an endpoint that has served `frank-archon` since 2026-09-20 — those routes were dead before this rename and remain dead; they need a routing decision (archon capacity), not a rename. - **Deployer blind spot found by accident:** every - `deploy.sh dankserver --service frank-primary` since 2026-10-08 04:09 + `deploy.sh dankserver --service frank-archon` since 2026-10-08 04:09 restarted the **staging worktree**, not the deploy checkout — a campaign - drop-in `frank-primary.service.d/bench.conf` overrode `Environment=` and + drop-in `frank-archon.service.d/bench.conf` overrode `Environment=` and `ExecStart`. The health gate went green each time. Verified parity before removing it (serve script + unit byte-identical, env identical except the alias, staging HEAD an ancestor of `main`), moved the drop-in to - `/home/dank/.AGENTTRASH/20261009-frank-primary-bench-dropin/`, and + `/home/dank/.AGENTTRASH/20261009-frank-archon-bench-dropin/`, and restarted: `/v1/models` then answered `frank-archon`. Post-deploy behavioural proof is now part of the runbook. -- Repo: seams re-pinned (`frank_secondary`/`frank_large`/`frank_primary` +- Repo: seams re-pinned (`frank_zealot`/`frank_dragoon`/`frank_archon` unit bats), fleet harnesses retargeted (`bench-probe`, `deep-probe`, `calib-push`, `fleet-probes-swift15`, `autoresearch*`, `bench-threads-batch-http`, `bench-decode`), `shared/homepage/docs.html` @@ -75,7 +95,7 @@ anywhere; rotation is Frank's call. ## 2026-10-08 -- **frank-primary (Dankserver): Swift1.5-Qwen3.8-Flash-Next GPTQ w4 — +- **frank-archon (Dankserver): Swift1.5-Qwen3.8-Flash-Next GPTQ w4 — the radiance quantization campaign.** ukisai's BF16 checkpoint (335.3 GiB, 397/397 sha256-verified) → `qwen4exp-swift15-w4dn8-i8-hc8m.rad` (~114 GiB): all 49,152 experts GPTQ w4 (act-order, damp 0.05) calibrated @@ -115,10 +135,10 @@ levels x4, reasoning_content, response_format, vision — all PASS. KLD gate vs the BF16 reference: recorded on 1.0.13 (50,235 positions, 197 prompts), scored on the same pin at the w4-legal shape. - Verdict: see runbook [[frank-primary-radiance-swift15-w4dn8]]. + Verdict: see runbook [[frank-archon-radiance-swift15-w4dn8]]. ## 2026-10-06 -- **frank-secondary (Dankclaw): ubatch 2048 — the second rung (llama.cpp, +- **frank-zealot (Dankclaw): ubatch 2048 — the second rung (llama.cpp, RTX 3090).** "set ubatch to 2k" → commit d8da7a9: `UBATCH_SIZE` 1024 → 2048 at the 2×114,688 shape. **Cost 746 MiB**, not the 616 MiB the same rung measured on the MiMo shape on 2026-10-05 (a rung's price @@ -135,16 +155,16 @@ 4096, so the seam's batch ≥ ubatch guard holds; **2048 is the ceiling for this shape** (4096 = no micro-split doubles the buffer growth again against 0.7–1.0 GiB of headroom). e2e gate 33/33 green. -- **frank-secondary (Dankclaw): RENAMED from frank-small, then reshaped +- **frank-zealot (Dankclaw): RENAMED from frank-small, then reshaped to 2×114,688 / ubatch 1024 (llama.cpp, RTX 3090).** The rename (commit 87721ab, 87 files: serve trio, unit, bats seam, 9 runbooks, identifiers - `FRANK_SECONDARY_*`/`llm_secondary`/`deploy_llm_secondary`; historical + `FRANK_ZEALOT_*`/`llm_zealot`/`deploy_llm_zealot`; historical refs to the OLD FreeToken/CUDA frank-small and to the Dankserver service that became frank-medium stay frank-small, as does `freetoken-frank-small.md`). Live unit transition by hand before the deploy: `systemctl stop frank-small` + `systemctl disable frank-small` (a relinked unit — disable removes only its stale symlink) → - `deploy.sh dankclaw --service frank-secondary`. The reshape (commit + `deploy.sh dankclaw --service frank-zealot`. The reshape (commit f2575a1, Frank's order "lower max context to 112k so we can increase ubatch to at least 1k"): `CTX_SIZE 262144→229376` (per-slot 131,072→114,688), `UBATCH_SIZE 512→1024` → **22,374 used / 1,751 MiB @@ -154,8 +174,8 @@ boot's 63.3/72.9 is confounded by prompt text, not a shape verdict). Harness retargeted: models.yml (id/name/compactionModels, `contextWindow: 114688`) + config.yml modelRoles ×14. Runbook renamed: - `serverAppConfigs-docs/LLM/frank-secondary-llama-swift15-unc-iq3xxs-mtp-114688.md`. -- **frank-secondary (Dankclaw): two Swift-1.5-27B reshapes (llama.cpp, RTX 3090).** + `serverAppConfigs-docs/LLM/frank-zealot-llama-swift15-unc-iq3xxs-mtp-114688.md`. +- **frank-zealot (Dankclaw): two Swift-1.5-27B reshapes (llama.cpp, RTX 3090).** Morning: Frank's order "drop mtp, skip ngram, ubatch 512, two 128k contexts" → 2×131,072 no-spec on the IQ3_S-mtp (commit 812d9eb): 22,728 used / 1,397 MiB free (the tight fit he ordered; the drafter's @@ -172,14 +192,14 @@ uncensored model thinks more — 64 tokens is all `reasoning_content`). ngram-mod still skipped (recurrent-state rollback law on the qwen35 hybrid). Runbook renamed + rewritten: - `serverAppConfigs-docs/LLM/frank-secondary-llama-swift15-unc-iq3xxs-mtp-114688.md`. -- **frank-large (Dankclaw): halogen 27B-dense → halogen-flash-server + `serverAppConfigs-docs/LLM/frank-zealot-llama-swift15-unc-iq3xxs-mtp-114688.md`. +- **frank-dragoon (Dankclaw): halogen 27B-dense → halogen-flash-server 0.16.2 v2 Swift1.5 ABLITERATED (Strix Halo iGPU, port 7770).** Cutover commit 31b1ec3 (03:07:40): the v2 `.hgn` payload loads ONLY in the flash-server line, so the engine moved with the model. Abliterated base (refusals gone), vision back (the v2 tower loads beside the checkpoint), MTP head inside the checkpoint, 2×200,192 slots, `HALOGEN_SPEC_ADAPT=0`. - Runbook: `serverAppConfigs-docs/LLM/frank-large-flash-server-v2-swift15.md`. + Runbook: `serverAppConfigs-docs/LLM/frank-dragoon-flash-server-v2-swift15.md`. **Incident (03:09:39–03:11:42):** the deploy started the unit while host `MemAvailable` was ~74.7 GiB, 3.34 GiB short of the engine's pin-gate requirement (62.11 GiB checkpoint + 16 GiB floor = 78.11 GiB); it @@ -187,16 +207,16 @@ self-resolved in ~2 min when the dying 27B engine freed RAM (boot #9 pinned clean at 88.4 GiB available). **Latent risk + fix:** the host was left with only ~1.8 GiB `MemAvailable`, so a restart would crash-loop - again; `serve-frank-large.sh` now has a host-RAM preflight that checks + again; `serve-frank-dragoon.sh` now has a host-RAM preflight that checks `MemAvailable` against the pin gate BEFORE `podman run` and WAITS up to - `FRANK_LARGE_RAM_WAIT` (600 s) for the RAM to clear, refusing loudly if + `FRANK_DRAGOON_RAM_WAIT` (600 s) for the RAM to clear, refusing loudly if it never does (the 16 GiB floor is the engine's, not `HALOGEN_HOST_RESERVE_GIB`). ## 2026-10-05 -- **frank-primary: tcclaviger vLLM fork → FreeToken (PR #587 ROCm) on +- **frank-archon: tcclaviger vLLM fork → FreeToken (PR #587 ROCm) on dankserver.** Built FreeToken at PR head `77a7201` on the host into the - local image `frank-primary-freetoken:pr587-77a7201` + local image `frank-archon-freetoken:pr587-77a7201` (digest-pinned rocm/pytorch rocm7.14 torch-2.11.0 base; two build laws bought with failures: the pip-ROCm wheel needs a `libhiprtc.so` dev symlink for the PR's `_cpu_moe` link, and a stale `docker login` at @@ -206,7 +226,7 @@ 299,968 tokens (multiple-of-64 — the `qsa_sparse` auto backend overrides page size to 64; 300,000 was refused), 2 slots, parsers AUTO (thinking → `reasoning_content`; models.yml flipped accordingly). Container renamed - to the unit name (Frank's call; `frank-primary-qwen` → legacy list); + to the unit name (Frank's call; `frank-archon-qwen` → legacy list); deployer image gate → `podman image exists` (local builds carry no RepoDigests) and health gate reads the BODY — FreeToken 200s with `{"status":"loading"}` mid-load, which false-greened a deploy at 6 s @@ -217,8 +237,8 @@ single-card LRU; TP=2 exists but the pynccl JIT can't compile for gfx1201 — probed, signature in the runbook). `/metrics` is a 404 — the Dankclaw Prometheus llm-fleet scrape of :7770 reads down until - repointed. Rollback: tag `frank-primary-vllm-shapeG-20261003`. - Runbook: `serverAppConfigs-docs/LLM/frank-primary-freetoken-pr587.md`. + repointed. Rollback: tag `frank-archon-vllm-shapeG-20261003`. + Runbook: `serverAppConfigs-docs/LLM/frank-archon-freetoken-pr587.md`. - **Skill library distilled into the vault (waves 1–7).** All ~173 managed skills read in full and merged, one polished reference page per skill-cluster: @@ -231,7 +251,7 @@ Triage, FreeToken Builds, plus deltas folded into the retired runbooks (GLM DFlash2 port laws, Lucebox dual-R9700, R9V qualification pipeline, FLM pack registration, ik hybrid envelope, frank-medium split - rebalance, frank-primary llama.cpp GGUF preflight, batch-ubatch split + rebalance, frank-archon llama.cpp GGUF preflight, batch-ubatch split section, bench-window D-state/stale-read notes, second-endpoint bring-up in Model Swap). - **Architecture (3):** Stale Signal Audit, Quadlet Lifecycle, Deploy @@ -273,12 +293,12 @@ Live pass of the frankbook walk itself is deferred to the next deploy with an awake host. - **Catch while verifying: the 17:47 Ornith-1.5-9B swap (`77decb5`) had - left `frank_secondary_unit.bats` and the deployer's payload gate stale** — + left `frank_zealot_unit.bats` and the deployer's payload gate stale** — the seam still expected MiMo-Q6K names and `deploy-remote.sh` gated `LLM_SMALL_MODEL_FILE`/`LLM_SMALL_MMPROJ` on files the unit no longer loads (the anti-drift seam doing its job). Both repointed to the Ornith-Q8 paths; full `./tests/run.sh` back to green (366 tests). -- **frank-secondary: compute-buffer pair doubled to 4096/2048, and the prefill win +- **frank-zealot: compute-buffer pair doubled to 4096/2048, and the prefill win measured rather than assumed.** Frank asked for the batch and ubatch doubled. The blocker was on record: the Q5_K_M predecessor documented **"ubatch 2048 failed the scratch boot"**, and this shape carries 616 MiB less free space @@ -288,7 +308,7 @@ `FRANK_SMALL_ENV_FILE` systemd drop-in, and it reproduced the 2026-10-03 boot **byte-identically** (21,276 used / 2,849 free), which is what makes ubatch the only variable. Repo never saw a fake revert commit; scaffolding - staged to `~/.AGENTTRASH/20261005-frank-secondary-ubatch-ab/`. + staged to `~/.AGENTTRASH/20261005-frank-zealot-ubatch-ab/`. - **At 8,928 prompt tokens: prefill 3,972/4,077 -> 4,207/4,212 t/s, +4.6 %, for 616 MiB (free 2,849 -> 2,279).** Decode flat (91.9–93.0 vs 93.8–94.3 — noise). The control that proves it is geometry and not drift: a 279-token @@ -311,10 +331,10 @@ edge of the 2–3 GiB floor. Deployed `e5893dc`, e2e gate PASSED (2 mini specs flaky-then-passed once the sleeping FrankBook-Pro woke mid-run — WoL took a second burst and ~90 s). Docs: - [[frank-secondary-llama-mimo-q6k-2x200704]] (*Compute-buffer geometry*). + [[frank-zealot-llama-mimo-q6k-2x200704]] (*Compute-buffer geometry*). ## 2026-10-03 -- **frank-primary: shape F then shape G — MNBT 2048, the CUDA-graph plan term +- **frank-archon: shape F then shape G — MNBT 2048, the CUDA-graph plan term pinned to the measured capture, KV forced to 400,700 tokens, and UTIL 1.0 proven UNBOOTABLE.** Frank asked what the batch was with GPUs showing open space; the audit found the arena is `budget - non-expert - KV reserve - @@ -351,7 +371,7 @@ Runbook: `serverAppConfigs-docs/LLM/dankserver-qwen38-fp8-expert-offload-tuning.md`. ## 2026-10-01 -- **frank-primary rolled BACK to Qwen3.8-Flash-Next-Uncensored-FP8 + MTP4; +- **frank-archon rolled BACK to Qwen3.8-Flash-Next-Uncensored-FP8 + MTP4; GLM/DFlash2 declared failed and purged.** The DFlash2 drafter booted and served (window 6j, 65,536 ctx, `glm53-flash` on :7773, both TP ranks captured FULL dflash2 cuda graphs — five patches deep: EAGLE3 wrapper @@ -370,7 +390,7 @@ unifier/tailpin/grouping/registry fixes, apply-verified). ## 2026-09-30 -- **frank-primary cut over to GLM-5.3-Flash W4A16 int4 — it serves, but NOT at +- **frank-archon cut over to GLM-5.3-Flash W4A16 int4 — it serves, but NOT at the 35 tok/s target, and the shortfall is measured rather than inferred.** - Payload `Intel/GLM-5.3-Flash-W4A16-AutoRound` (AutoRound symmetric int4 group 128, `auto_round:auto_gptq` packing, ~170 GiB, 34 shards + 2 extras, @@ -498,10 +518,10 @@ ## 2026-09-29 -- **frank-large tuning investigation: a measured NEGATIVE result, nothing +- **frank-dragoon tuning investigation: a measured NEGATIVE result, nothing changed.** Frank asked for iterative decode/prefill improvement at a 32k working point without touching the model or quantization. **No win exists - at gufo's served settings**, so no config change was shipped. frank-large + at gufo's served settings**, so no config change was shipped. frank-dragoon was stopped for the whole investigation (~4h) per the benchmarking policy and restored healthy in 9s afterwards. - Measured on the repo's own prose and shell sources at **32,762 prompt @@ -631,7 +651,7 @@ script; the 256k config relaunched with it. Host-side checks: health 200 on 127.0.0.1:7773 AND 192.168.0.235:7773, /v1/models lists qwen3.8-flash-next, decode through the published path - 36.49/34.55/35.98 (same band). 7773 chosen over 7770 — frank-primary + 36.49/34.55/35.98 (same band). 7773 chosen over 7770 — frank-archon owns 7770 when it ever returns. ## 2026-09-28 @@ -648,7 +668,7 @@ - **The 29.3 G rollback target went with them**, by Frank's decision. The payload-only rollback is now a re-fetch first; both the runbook and AGENTS.md say so. **The DFlash2 drafter was NOT reclaimed** — only the - `.gguf` was taken out of that directory, because the live frank-large + `.gguf` was taken out of that directory, because the live frank-dragoon drafter lives in it. The manifest warns against restoring the directory wholesale. - **Kept deliberately:** `checkpoints/` 23 G. It is unreferenced by the @@ -657,28 +677,28 @@ **sparse** file, 3.3 G apparent but 4 K real, so removing it frees nothing. - **A live reference check came first, and it earned its keep.** - `serve-frank-secondary.sh`'s *fallback* `MODEL_DIR` still pointed at the - retired GSQ-RCO payload frank-secondary served on 2026-09-16/17. The env + `serve-frank-zealot.sh`'s *fallback* `MODEL_DIR` still pointed at the + retired GSQ-RCO payload frank-zealot served on 2026-09-16/17. The env file has always overridden it, so the drift was invisible — but a missing or unreadable env file would have turned a config problem into a "missing asset" naming a model that no longer exists. Repointed at `Gemma4-12B-QAT/`, which is what the env file already sets. Every other hit was a comment, a retired fetch script's destination, or - `retire_halogen_large_quadlet` (which moves a *quadlet*, not a model). + `retire_halogen_dragoon_quadlet` (which moves a *quadlet*, not a model). - **Not taken, by Frank's decision — scope was models only:** podman images (**279 G reclaimable, 95%**; 170 images, 23 active) and the uv+pip caches (**73 G**). Together that is 352 G of regenerable garbage larger than the models reclaimed, and it is the obvious next move. - Pre-existing: **118 G of trash from 2026-09-21** was already staged - (`20260921-frank-large-assembled` 88 G, `-redownload` 30 G) and never + (`20260921-frank-dragoon-assembled` 88 G, `-redownload` 30 G) and never purged. Total now staged on this host: **627 G**. - - Verified after the moves: frank-large and frank-secondary both `active`, + - Verified after the moves: frank-dragoon and frank-zealot both `active`, both `/health` 200, and all three live assets (Swift target, DFlash2 drafter, Gemma4 target) still present. -- **frank-large payload swapped to Swift-1.5 (uncensored)** (production +- **frank-dragoon payload swapped to Swift-1.5 (uncensored)** (production change, Dankclaw). Frank asked whether the UD Q8 of `ajgazin/Swift-1.5-Qwen3.8-27B-Uncensored-Dynamic-MTP-GGUF` would load on - gufo, then said to do it. Port 7770, alias `frank-large`, one 262,144 + gufo, then said to do it. Port 7770, alias `frank-dragoon`, one 262,144 session, the DFlash2 drafter and the client contract are unchanged; the 27B dense weights are an **abliterated (uncensored)** fine-tune of the same base, under the **non-OSI SWIFT OPEN LICENSE 1.0**. @@ -696,7 +716,7 @@ which both files carry as `4` and which agrees with it. - **Fetched and verified:** 31,457,990,272 bytes, sha256 `9076f99a…` matching the Hub LFS oid, via the new - `/scripts/download-frank-large-swift.sh`. It sends **no auth header** — + `/scripts/download-frank-dragoon-swift.sh`. It sends **no auth header** — the repo is public and ungated, and a token on the curl command line is world-readable via `/proc//cmdline`. The anonymous transfer ran at ~1.8 MiB/s; resuming with the host's token through a **mode-600 @@ -730,9 +750,9 @@ tunable. That broke the deployer's stray-run sweep, which keyed on the *target* filename and would have silently stopped matching — a stray run would then have held 7770 past the port gate. It now keys on the - drafter, which every frank-large command line carries via + drafter, which every frank-dragoon command line carries via `--dflash-model` and which did not move. - - **`/tests/frank_large_unit.bats`** — 20 assertions. The mutation pass + - **`/tests/frank_dragoon_unit.bats`** — 20 assertions. The mutation pass found **four real gaps** on the first run, all now fixed: two fetch assertions were satisfied by a **header comment** rather than the URL assignment, so repointing a repo left them green; and nothing bound the @@ -745,12 +765,12 @@ the `1..N` count before believing a result. 16/16 mutations caught. - Docs: runbook gained a **Payload** section (the header evidence), **The template law** section and a two-way **Rollback**; AGENTS.md - fleet table, frank-large section and rollback. -- **frank-large runtime swapped to gufo** (production change, Dankclaw). + fleet table, frank-dragoon section and rollback. +- **frank-dragoon runtime swapped to gufo** (production change, Dankclaw). Frank asked for `github.com/gufo-org/gufo` — a vertical inference engine built for exactly this hardware (Ryzen AI MAX+ 395 / Radeon 8060S, `gfx1151`) — in place of the stock llama.cpp prebuilt. Port 7770, alias - `frank-large`, one 262,144-token session and the client contract were all + `frank-dragoon`, one 262,144-token session and the client contract were all unchanged; only the engine was new, and the payload was the unsloth Qwen3.8-27B UD-Q8_K_XL **at that point** — it was swapped for the abliterated Swift-1.5 later the same day, see the entry above. @@ -791,17 +811,17 @@ RSS 30.6 GiB; a live short-prompt request returned `Server-Timing: ttft;dur=549.8, inter_token;dur=24.2` (~41 tok/s). Verified live: `/health` 200, `/ready` 200, `/v1/models` → - `frank-large` at `context_length 262144`, a chat completion carrying + `frank-dragoon` at `context_length 262144`, a chat completion carrying `reasoning_content`, a `tool_calls` response with `finish_reason: tool_calls`, and SSE streaming. - **The trade, stated plainly.** gufo's own Q8_K_XL tables against llama.cpp b11069: prefill +37 % to +80 %, cold load 4.5× faster, decode +7 % at zero depth — but **−14 % at 65,536 tokens of depth and −24 % at - 131,072**. On the 8-bit target the crossover is ~32k and frank-large runs + 131,072**. On the 8-bit target the crossover is ~32k and frank-dragoon runs one 262,144-token conversation, so long agent sessions sit on the losing side of it. The Q4_K_XL target shows no such regression; revisiting the quantization is a separate decision. - - `/tests/frank_large_unit.bats` — Rewritten around behaviour: the seam + - `/tests/frank_dragoon_unit.bats` — Rewritten around behaviour: the seam runs the serve script against a stub engine and asserts on the argv it actually execs, instead of grepping the script's text. A caveat found while writing it: **bats 1.13 ignores a failing `A && B` in the middle of @@ -810,18 +830,18 @@ Mutations confirmed the seam bites: dead runtime gate, `DRAFT_TOKENS=0`, a wrong context/sessions/port, an alias swap, a moved drafter, a removed missing-asset message and a neutered commit pin each fail it. - - `/scripts/deploy-remote.sh` — `deploy_llm_large` gates on the runtime + - `/scripts/deploy-remote.sh` — `deploy_llm_dragoon` gates on the runtime binary as well as the payload and returns **before** it stops the serving unit, so a host whose gufo was never built reports the failure instead of taking the endpoint down on the way there. - - Docs: new `/serverAppConfigs-docs/LLM/frank-large-gufo-qwen38-27b.md`; - `frank-large-unsloth-qwen38-27b-q8xl.md` marked RETIRED (still the + - Docs: new `/serverAppConfigs-docs/LLM/frank-dragoon-gufo-qwen38-27b.md`; + `frank-dragoon-unsloth-qwen38-27b-q8xl.md` marked RETIRED (still the rollback target — the prebuilt and the payload are both intact on disk); - AGENTS.md fleet table, frank-large section, bench policy and runbook + AGENTS.md fleet table, frank-dragoon section, bench policy and runbook index; both vault indexes; `Dankclaw System Specs.md`; `README.md`. - **e2e gate: 32/33.** The one failure is `192.168.0.112` (the FrankBook-Pro Mac mini) at 100 % packet loss — offline, and the same failure recorded - in `564a781`. Not related to this change; no frank-large test failed. + in `564a781`. Not related to this change; no frank-dragoon test failed. - **Frontier-MoE feasibility study on Dankserver** (research + build, no production change). Frank asked which of DeepSeek-V4.1-Flash, MiMo-V2.6-Flash-MOPD and GLM-5.3-Flash would run best on the 2x R9700 box, @@ -855,71 +875,71 @@ - `/serverAppConfigs-docs/LLM/dankserver-frontier-moe-feasibility.md` — new runbook; indexed in `LLM/index.md`. - **LANDMINE, not changed here:** `/home/dank/models` was cleared by Frank - mid-session to free space. frank-primary is still answering `:7770` from + mid-session to free space. frank-archon is still answering `:7770` from mmapped-but-unlinked inodes (`/models` is empty inside the running container) — **the endpoint cannot be restarted until the 175 GiB payload - is re-fetched.** A reboot or a container restart takes frank-primary down. + is re-fetched.** A reboot or a container restart takes frank-archon down. - Deploy-state reconciliation (Frank's call: no restart) — the autoresearch trio (`f187165` PLE 1800, `41e9189` prefix caching, `ba2100e` docs) was found already - MERGED to main + pushed AND already live on frank-primary: the running - `frank-primary-r9v` container (booted 12:13 from the `ba2100e` checkout) carries + MERGED to main + pushed AND already live on frank-archon: the running + `frank-archon-r9v` container (booted 12:13 from the `ba2100e` checkout) carries `--enable-prefix-caching` in argv and `VLLM_PLE_OFFLOAD_READY_TIMEOUT=1800` in env, - `/health` 200 — but `deploy-state/frank-primary` was still stamped `f187165`. A - `deploy.sh` run would have re-selected frank-primary and reloaded the 175 GiB + `/health` 200 — but `deploy-state/frank-archon` was still stamped `f187165`. A + `deploy.sh` run would have re-selected frank-archon and reloaded the 175 GiB payload (~16–19 min) for zero behavioral change, on the endpoint this harness itself runs on. Stamped the marker `f187165 → ba2100e` (status `deployed`, atomic mktemp+mv per the deployer idiom); service untouched. e2e gate 32/33 — the lone failure `11-admin` is the FrankBook-Pro Mac mini (`192.168.0.112:8989`) offline (100 % ICMP loss + TCP timeout), the documented asleep-host condition, not a regression. -- `scripts/frank-primary.env`, runbook — **prefix caching DEPLOYED on - frank-primary** (Frank's go-ahead; commit `41e9189`): E8-qualified, zero +- `scripts/frank-archon.env`, runbook — **prefix caching DEPLOYED on + frank-archon** (Frank's go-ahead; commit `41e9189`): E8-qualified, zero VRAM cost, 9x/63x reuse TTFT. Verified on :7770 (argv flag, health 200, completion "PREFIX-CACHE-LIVE"). Gotcha re-confirmed: the container is in dank's ROOTLESS podman store (`sudo podman` inspects an empty store and reports nothing); probe via the shim's `docker` or the unit MainPID. -- `/scripts/frank-primary.env`, `/serverAppConfigs-docs/LLM/frank-primary-r9v-radiance-qwen38-q8.md`, `/serverAppConfigs-docs/index.md` — **frank-primary prefill/decode bench matrix** (scratch :7773, prod stopped 00:06 for the window per fleet bench law): baseline E0 (chunk 4096 / 80-slot sync / MTP4) = PP8K 954.6, PP131K 883.0 tok/s, decode 141.9 ms/step ≈ 23.8 t/s effective. Chunk 8192 (E1R): PP8K +25.9% (1201.4) but decode −8.5% and PP131K −4.4% — short-prompt win, decode tax, not the fleet's dominant shape. Chunk 16384 boots but OOMs at request time (0.93 GiB free) — 4096 is the ceiling (engine spec-config cap + memory). Expert cache 80 slots is the policy max (doctor: capacities 48/64/80, synchronous LRU only — async unsupported, 96/112 rejected); MTP depth 6 is 3.7x SLOWER than depth 4. Prefix caching (E8/E9): zero VRAM cost, cold path unchanged, reuse hits 32k 44.2→3.6–4.3 s (9x), 131k 439→6.9 s (63x); hit pattern rounds 1–2 miss / 3+ hit — RECOMMENDED, pending Frank's go-ahead. Two failure laws recorded: unqualified shapes fail mid-request (health stays 200), and PLE registration can blow the engine's 600 s `VLLM_PLE_OFFLOAD_READY_TIMEOUT` under page-cache churn (measured 740 s) — launch.sh gained `R9V_PLE_READY_TIMEOUT` forwarding (fork `2de0357`, local-only) and prod now sets 1800. -- **Incident — frank-primary down 00:06 → ~11:00 (11h)**: the bench window's required prod stop was never restored — the matrix + follow-ups ran 00:44 → 09:02 and the session let the endpoint sit dead (the 2026-09-18 "a bench session owes the fleet a health 200" lesson, re-offended). The first restore boot (09:46) then failed on the PLE 600 s timeout above (unit "Deactivated successfully", no journal error — the serve script exits 0 on the wait). Restored by the `R9V_PLE_READY_TIMEOUT=1800` fix deploy (f187165, from main — the deploy gate refuses non-main): health 200 + MainPID = the serve script's own `podman wait` + live completion verified ~11:00. Deploy e2e gate 32/33 — the one failure (11-admin) needs the FrankBook-Pro Mac mini, which was asleep and ignored two WoL bursts (240 packets); recurring pattern per the wol-wake skill. Lesson: a multi-hour bench window needs an explicit restore task, not a "watch for DONE" — DONE ≠ prod up. +- `/scripts/frank-archon.env`, `/serverAppConfigs-docs/LLM/frank-archon-r9v-radiance-qwen38-q8.md`, `/serverAppConfigs-docs/index.md` — **frank-archon prefill/decode bench matrix** (scratch :7773, prod stopped 00:06 for the window per fleet bench law): baseline E0 (chunk 4096 / 80-slot sync / MTP4) = PP8K 954.6, PP131K 883.0 tok/s, decode 141.9 ms/step ≈ 23.8 t/s effective. Chunk 8192 (E1R): PP8K +25.9% (1201.4) but decode −8.5% and PP131K −4.4% — short-prompt win, decode tax, not the fleet's dominant shape. Chunk 16384 boots but OOMs at request time (0.93 GiB free) — 4096 is the ceiling (engine spec-config cap + memory). Expert cache 80 slots is the policy max (doctor: capacities 48/64/80, synchronous LRU only — async unsupported, 96/112 rejected); MTP depth 6 is 3.7x SLOWER than depth 4. Prefix caching (E8/E9): zero VRAM cost, cold path unchanged, reuse hits 32k 44.2→3.6–4.3 s (9x), 131k 439→6.9 s (63x); hit pattern rounds 1–2 miss / 3+ hit — RECOMMENDED, pending Frank's go-ahead. Two failure laws recorded: unqualified shapes fail mid-request (health stays 200), and PLE registration can blow the engine's 600 s `VLLM_PLE_OFFLOAD_READY_TIMEOUT` under page-cache churn (measured 740 s) — launch.sh gained `R9V_PLE_READY_TIMEOUT` forwarding (fork `2de0357`, local-only) and prod now sets 1800. +- **Incident — frank-archon down 00:06 → ~11:00 (11h)**: the bench window's required prod stop was never restored — the matrix + follow-ups ran 00:44 → 09:02 and the session let the endpoint sit dead (the 2026-09-18 "a bench session owes the fleet a health 200" lesson, re-offended). The first restore boot (09:46) then failed on the PLE 600 s timeout above (unit "Deactivated successfully", no journal error — the serve script exits 0 on the wait). Restored by the `R9V_PLE_READY_TIMEOUT=1800` fix deploy (f187165, from main — the deploy gate refuses non-main): health 200 + MainPID = the serve script's own `podman wait` + live completion verified ~11:00. Deploy e2e gate 32/33 — the one failure (11-admin) needs the FrankBook-Pro Mac mini, which was asleep and ignored two WoL bursts (240 packets); recurring pattern per the wol-wake skill. Lesson: a multi-hour bench window needs an explicit restore task, not a "watch for DONE" — DONE ≠ prod up. ## 2026-09-27 -- `/scripts/frank-primary.env`, `/scripts/frank-primary.service`, `/scripts/serve-frank-primary.sh`, `/scripts/deploy-remote.sh`, `/tests/frank_primary_unit.bats`, `/serverAppConfigs-docs/LLM/frank-primary-r9v-radiance-qwen38-q8.md` (new), AGENTS.md + LLM index — **frank-primary cut over to the Q8_0 payload** (uncensored IQ4_XS → unsloth Qwen3.8-Flash-Next Q8_0, 175.30 GiB / 6 shards) at Frank's direction. Launcher gained the opt-in `R9V_CHAT_TEMPLATE_FILE`/`R9V_CHAT_TEMPLATE_KWARGS` passthrough (fork commit `30d4a32`, local-only) — the Qwen-Sharp v22.4.0 template now serves, fleet parity with frank-large. Env points at `/home/dank/r9v-state/q8xl/setup.json` + the quantized-inject dev-overlay adapter (fork `363d606`) + `R9V_FULL_MUTABLE_CACHE=0`; shard gates extended to SHARD4/5/6 (unset-safe); seams recalibrated; ctx window 131072 (models.yml maxTokens 36864). Spec decode is MTP4 only — the fork's `speculative_config` is a single dict, no chaining, so llama.cpp's `draft-mtp,ngram-mod` pattern is NOT expressible (PLE n-gram rides along architecturally). Uncensored state + payload remain on disk as the rollback target. 346 tests green. -- Dankserver frank-primary slot (experiment window) — the `radiance-vllm-qwen4exp` fork qualified the unsloth `Qwen3.8-Flash-Next-GGUF` **Q8_0** payload (175.30 GiB, 6 split parts) on the dual R9700. Two launch blockers fixed loader-side in the fork: `runtimes/dev-overrides/qwen4_exp.py` dequantizes quantized `block_inject` shards in-stream (the Q8_0 payload quantizes BOTH fused-HC shards; IQ4_XS ships inject as F32 — the uniformity check rejected the mixed projection) and `R9V_FULL_MUTABLE_CACHE=0` passthrough for the 80-slot tiered cache (fork commits 363d606, 2fe6dbb, 50a79ec — GitHub remote, not pushed). Battery on :7773: text + reasoning channel, vision ("Red" on a red PNG), prose ≈11.0 tok/s wall, MTP4 mean acceptance length 3.19–5.00; PLE pinned residency proven (`mapping_bytes=54400261120`, `mapping_rss_bytes` == mapping size, both ranks required 108.8 GiB vs 140.9 available). Relaunch recipe saved at `dankserver:/home/dank/r9v-state/q8xl/START-COMMAND.txt`; record at fork `docs/qualification/qwen38-q8-0-dual-r9700-2026-09-27.md`. -- Dankserver frank-primary restore — uncensored UD-IQ4_XS back on `0.0.0.0:7770` as `frank-primary-r9v` from its frozen config (health 200 in ~60 s; LAN-path completion returns content + reasoning); `frank-primary.service` (llama.cpp) **runtime-masked** for the window (`/run/systemd/system/frank-primary.service → /dev/null` — the `/etc` relink symlink blocks a plain mask; self-clears at reboot, unit file untouched) and the container runs `restart=no`, so a reboot returns the repo-configured llama.cpp with no contention. Restore config preserved at `dankserver:/home/dank/r9v-state/uncensored/restore-config-20260927.env`; scratch in `dankserver:~/.AGENTTRASH/20260927-q8xl-bringup/`. +- `/scripts/frank-archon.env`, `/scripts/frank-archon.service`, `/scripts/serve-frank-archon.sh`, `/scripts/deploy-remote.sh`, `/tests/frank_archon_unit.bats`, `/serverAppConfigs-docs/LLM/frank-archon-r9v-radiance-qwen38-q8.md` (new), AGENTS.md + LLM index — **frank-archon cut over to the Q8_0 payload** (uncensored IQ4_XS → unsloth Qwen3.8-Flash-Next Q8_0, 175.30 GiB / 6 shards) at Frank's direction. Launcher gained the opt-in `R9V_CHAT_TEMPLATE_FILE`/`R9V_CHAT_TEMPLATE_KWARGS` passthrough (fork commit `30d4a32`, local-only) — the Qwen-Sharp v22.4.0 template now serves, fleet parity with frank-dragoon. Env points at `/home/dank/r9v-state/q8xl/setup.json` + the quantized-inject dev-overlay adapter (fork `363d606`) + `R9V_FULL_MUTABLE_CACHE=0`; shard gates extended to SHARD4/5/6 (unset-safe); seams recalibrated; ctx window 131072 (models.yml maxTokens 36864). Spec decode is MTP4 only — the fork's `speculative_config` is a single dict, no chaining, so llama.cpp's `draft-mtp,ngram-mod` pattern is NOT expressible (PLE n-gram rides along architecturally). Uncensored state + payload remain on disk as the rollback target. 346 tests green. +- Dankserver frank-archon slot (experiment window) — the `radiance-vllm-qwen4exp` fork qualified the unsloth `Qwen3.8-Flash-Next-GGUF` **Q8_0** payload (175.30 GiB, 6 split parts) on the dual R9700. Two launch blockers fixed loader-side in the fork: `runtimes/dev-overrides/qwen4_exp.py` dequantizes quantized `block_inject` shards in-stream (the Q8_0 payload quantizes BOTH fused-HC shards; IQ4_XS ships inject as F32 — the uniformity check rejected the mixed projection) and `R9V_FULL_MUTABLE_CACHE=0` passthrough for the 80-slot tiered cache (fork commits 363d606, 2fe6dbb, 50a79ec — GitHub remote, not pushed). Battery on :7773: text + reasoning channel, vision ("Red" on a red PNG), prose ≈11.0 tok/s wall, MTP4 mean acceptance length 3.19–5.00; PLE pinned residency proven (`mapping_bytes=54400261120`, `mapping_rss_bytes` == mapping size, both ranks required 108.8 GiB vs 140.9 available). Relaunch recipe saved at `dankserver:/home/dank/r9v-state/q8xl/START-COMMAND.txt`; record at fork `docs/qualification/qwen38-q8-0-dual-r9700-2026-09-27.md`. +- Dankserver frank-archon restore — uncensored UD-IQ4_XS back on `0.0.0.0:7770` as `frank-archon-r9v` from its frozen config (health 200 in ~60 s; LAN-path completion returns content + reasoning); `frank-archon.service` (llama.cpp) **runtime-masked** for the window (`/run/systemd/system/frank-archon.service → /dev/null` — the `/etc` relink symlink blocks a plain mask; self-clears at reboot, unit file untouched) and the container runs `restart=no`, so a reboot returns the repo-configured llama.cpp with no contention. Restore config preserved at `dankserver:/home/dank/r9v-state/uncensored/restore-config-20260927.env`; scratch in `dankserver:~/.AGENTTRASH/20260927-q8xl-bringup/`. ## 2026-09-25 - `/serverAppConfigs-docs/Dankserver/Jellyfin.md` — Jellyfin LDAP 401 resolved: the auth works via the modern `/Users/AuthenticateByName` endpoint (HTTP 200, alex authenticated, full plugin flow logged: service bind → search → ldapUid → user bind → token). The 401 was a test artifact — I had been probing the legacy `/Users/Auth/Password` route, which Jellyfin 12.1 removed (the `LegacyEmbyRouteRewriteMiddleware` is gone). The web UI uses the modern endpoint, so user logins are fine. No config change needed; the LDAP-Auth 23.0.0.0 plugin + authentik 2026.8.3 outpost are healthy. -- `/shared/homepage/services.json`, `/shared/homepage/docs.html` — Suggested uses added to the three LLM model descriptions (status cards + the `/docs` model guide + the "which one to pick" foot-note): frank-large → cybersecurity + debugging (use requires Frank's permission); frank-medium → the primary intelligent model (surpasses Claude Sonnet 5 per Artificial Analysis) for software engineering, sysadmin, instruction tasks; frank-secondary → the fast/cheap utility model (agentic search, RAG, research subagents, translation, roleplay, summarization). Deployed to `/srv/homepage`; bats 19/19 + non-Mac-mini e2e green (d3c8197). -- `/shared/homepage/{services.json,app.js,style.css,docs.html}` — Model cards reworked to a structured three-line shape: each LLM card now carries a `details` object (role / spec / use) rendered as a bold pale-green role, a bright-green spec line, and a dim "Use:" line (`app.js` `descHTML()` falls back to the plain `description` for non-LLM cards; new `.desc-role`/`.desc-spec`/`.desc-use` CSS + bare-mode reset). Roles made neutral (no nicknames): frank-large = deep reasoning, frank-medium = primary model, frank-secondary = fast utility model. The `/docs` model guide was also fixed — it had drifted to retired model info (frank-large listed as Qwen3.8-Flash-Next 87.3 GiB / 200k, frank-medium as FP8 ~31 GiB) — now Qwen3.8-27B UD-Q8_K_XL 31.5 GiB / 262k and MXFP4/W4A8 19.4 GiB, reordered large→medium→small. bats 30/30 + live browser render verified. +- `/shared/homepage/services.json`, `/shared/homepage/docs.html` — Suggested uses added to the three LLM model descriptions (status cards + the `/docs` model guide + the "which one to pick" foot-note): frank-dragoon → cybersecurity + debugging (use requires Frank's permission); frank-medium → the primary intelligent model (surpasses Claude Sonnet 5 per Artificial Analysis) for software engineering, sysadmin, instruction tasks; frank-zealot → the fast/cheap utility model (agentic search, RAG, research subagents, translation, roleplay, summarization). Deployed to `/srv/homepage`; bats 19/19 + non-Mac-mini e2e green (d3c8197). +- `/shared/homepage/{services.json,app.js,style.css,docs.html}` — Model cards reworked to a structured three-line shape: each LLM card now carries a `details` object (role / spec / use) rendered as a bold pale-green role, a bright-green spec line, and a dim "Use:" line (`app.js` `descHTML()` falls back to the plain `description` for non-LLM cards; new `.desc-role`/`.desc-spec`/`.desc-use` CSS + bare-mode reset). Roles made neutral (no nicknames): frank-dragoon = deep reasoning, frank-medium = primary model, frank-zealot = fast utility model. The `/docs` model guide was also fixed — it had drifted to retired model info (frank-dragoon listed as Qwen3.8-Flash-Next 87.3 GiB / 200k, frank-medium as FP8 ~31 GiB) — now Qwen3.8-27B UD-Q8_K_XL 31.5 GiB / 262k and MXFP4/W4A8 19.4 GiB, reordered large→medium→small. bats 30/30 + live browser render verified. - Fleet-wide container update (dankclaw + dankserver) — every pullable image brought current. Pinned bumps: authentik `2026.8.0`→`2026.8.3` (server/worker/outpost), tautulli `v2.18.1-ls242`→`ls245`, calibre-web `0.6.27-ls397`→`ls402`, plex `1.43.3.10896`→`1.43.4.10903`; seerr already at `v3.4.1`. Local-build rebuilds (forced `--no-cache`, the base images had moved): caddy (xcaddy porkbun), alloy, loki, comfyui-rocm (ComfyUI re-cloned), hermes ×3 (fresh `:latest`, `23986f31`→`e1e87aec`). anubis already at latest stable `v1.27.0` (only pre-releases exist beyond). Verified: all 16 floating-tag services CURRENT (zero stale), every real container active, caddy edge serving (auth 302 / ai 200), 340 bats green. Excluded: frank-medium/radiance-vllm (custom LLM build). - `/dankserver/{tautulli,calibre-web,plex}/quadlet/*.container`, `/dankclaw/authentik/quadlet/*.container` — version pins bumped; docs (Tautulli.md, Calibre-Web.md, Plex.md, Authentik.md + server/worker, index.md) and the dead `dankserver/compose.yaml` plex entry synced (0b1ea2e). ## 2026-09-22 -- `/serverAppConfigs-docs/**` — OKF v0.1 frontmatter migration: `type`/`description`/`tags`/`timestamp` added to the 65 non-reserved pages lacking them (timestamps from each file's last git commit); `timestamp` added to `LLM/frank-medium-batch-ubatch.md` and `LLM/frank-secondary-benchmark.md`; unquoted YAML scalars (colons, `*arr`) fixed in 13 pre-existing frontmatter blocks; frontmatter stripped from the reserved `LLM/Pipeline Parallelism/index.md`; `log.md` restructured to the OKF format (date-grouped, newest first, one line per change) from 40 narrative entries. -- `/serverAppConfigs-docs/**` — Fact-check pass against scripts/AGENTS.md ground truth: 6 false "Active" banners fixed on retired runbooks, 96→114 GiB GTT in `Shared Memory Architecture Dankclaw.md`, `deployment.md` + `Architecture/Deployment Flow.md` rewritten to the Quadlet/deploy-plan.py truth, `Calibre.md` 9.9.0→9.15.0 + CVE-2025-7404 conflation (it is the Calibre-Web CVE), `Copyparty.md` v1.20.24, `RomM.md` 5.3.0 breaking change; `*arr` docs moved to a new `FrankBook-Pro/` section (git mv, link-safe); active runbook bodies written for frank-large (unsloth UD-Q8_K_XL) and frank-secondary (Gemma4-12B). +- `/serverAppConfigs-docs/**` — OKF v0.1 frontmatter migration: `type`/`description`/`tags`/`timestamp` added to the 65 non-reserved pages lacking them (timestamps from each file's last git commit); `timestamp` added to `LLM/frank-medium-batch-ubatch.md` and `LLM/frank-zealot-benchmark.md`; unquoted YAML scalars (colons, `*arr`) fixed in 13 pre-existing frontmatter blocks; frontmatter stripped from the reserved `LLM/Pipeline Parallelism/index.md`; `log.md` restructured to the OKF format (date-grouped, newest first, one line per change) from 40 narrative entries. +- `/serverAppConfigs-docs/**` — Fact-check pass against scripts/AGENTS.md ground truth: 6 false "Active" banners fixed on retired runbooks, 96→114 GiB GTT in `Shared Memory Architecture Dankclaw.md`, `deployment.md` + `Architecture/Deployment Flow.md` rewritten to the Quadlet/deploy-plan.py truth, `Calibre.md` 9.9.0→9.15.0 + CVE-2025-7404 conflation (it is the Calibre-Web CVE), `Copyparty.md` v1.20.24, `RomM.md` 5.3.0 breaking change; `*arr` docs moved to a new `FrankBook-Pro/` section (git mv, link-safe); active runbook bodies written for frank-dragoon (unsloth UD-Q8_K_XL) and frank-zealot (Gemma4-12B). - `/serverAppConfigs-docs/Research/` — Three new research briefs (OKF): `Local TTS and Voice Cloning.md`, `AI Job Search and Resume Tools.md`, `Most Popular Self-Hosted AI Apps.md` (the 15 most popular self-hosted AI apps of Jun–Sep 2026, ranked by GitHub stars) + a self-contained dark-theme HTML report `popular-self-hosted-ai-apps.html`; upstream-version rows added to the ComfyUI/OpenWebUI/Hermes app docs (ComfyUI 0.37.0 native Qwen-Image 2.1, OpenWebUI 0.11.4 + `/api/v1/images/generations`, Hermes v0.21.4/CalVer v2026.9.21). All 336 tests pass; 136 pages, 0 unresolved wikilinks; docs-only deploy no-op. ## 2026-09-21 - `/dankserver/frank-medium/quadlet/frank-medium.container` — frank-medium cut back to the MXFP4 checkpoint (`just1moremodel/Qwen3.8-27B-Uncensored-MXFP4-awq`); `KV_DTYPE` became a quadlet tunable, set `auto` (unquantized bf16 KV) to test whether fp8 KV had been degrading W4A8 output quality; pool auto-sized to 486,464 tokens; vision re-verified; e2e 32/32 (a45f396). - `/dankserver/calibre-server/quadlet/calibre-server.container` — New boot-persistent Quadlet: Calibre Content Server on 192.168.0.235:8084 (OPDS + web UI), HTTP Basic auth, LAN-only; desktop image 9.15.0, `--auth-mode=basic` pinned, internal port 8090. - `/serverAppConfigs-docs/Dankserver/Calibre.md` — Content-server section rewritten from "not running" to the deployed shape; Calibre-Web → authentik feasibility answered (guard chain, not in-app OIDC). -- `/scripts/serve-frank-large.sh`, `/scripts/frank-large.env`, `/scripts/frank-large.service`, `/scripts/download-frank-large-unsloth.sh` — frank-large (dankclaw :7770) moved CIRU Orca → unsloth llama.cpp b11030 prebuilt serving `unsloth/Qwen3.8-Flash-Next-GGUF:UD-IQ4_XS` (87.3 GiB), 200k ctx, MTP depth 2 via explicit `-md`; the split parts ARE the payload — concatenating them trips `invalid split file name` (part 1's header advertises `file_count=3`); draft acceptance verified live 0.83–0.92. -- `/serverAppConfigs-docs/LLM/frank-large-unsloth-qwen38-flash-next.md` — New runbook; `frank-large-ciru-orca.md` marked RETIRED (rollback target); AGENTS.md + LLM index updated. +- `/scripts/serve-frank-dragoon.sh`, `/scripts/frank-dragoon.env`, `/scripts/frank-dragoon.service`, `/scripts/download-frank-dragoon-unsloth.sh` — frank-dragoon (dankclaw :7770) moved CIRU Orca → unsloth llama.cpp b11030 prebuilt serving `unsloth/Qwen3.8-Flash-Next-GGUF:UD-IQ4_XS` (87.3 GiB), 200k ctx, MTP depth 2 via explicit `-md`; the split parts ARE the payload — concatenating them trips `invalid split file name` (part 1's header advertises `file_count=3`); draft acceptance verified live 0.83–0.92. +- `/serverAppConfigs-docs/LLM/frank-dragoon-unsloth-qwen38-flash-next.md` — New runbook; `frank-dragoon-ciru-orca.md` marked RETIRED (rollback target); AGENTS.md + LLM index updated. - `/shared/prometheus/prometheus.yml` — `node-dankclaw` target fixed to `host.containers.internal:9100` (netavark DNATs published ports only; the node-exporter's host bind was unreachable by construction — a fourth down job the 09-16 audit had not listed); `Infrastructure/Prometheus.md` targets table + `tests/observability_quadlet.bats` contract updated. ## 2026-09-20 - `/dankserver/frank-medium/quadlet/frank-medium.container` — Checkpoint swapped MXFP4 → FP8 (`orcarouter/Qwen3.8-27B-Uncensored-FP8`, MTP self-speculation depth 8, acceptance 5.66/8); the swap is now one command via `scripts/hf-manifest.py` + `scripts/hf-fetch.sh` + `scripts/swap-frank-medium.sh`; A/B on the FP8 target: DFlash2 100.0 t/s decode beats MTP 85.9 (accept length is a proxy, not the metric) — DFlash2 is the deployed shape. - `/dankserver/frank-medium/quadlet/frank-medium.container` — Cutover to vllm-radiance TP=2 (95.8 t/s / 0.21 s TTFT / 259.4 burst-4 vs llama layer split 45.7 / 0.72 / 71.7; the winning arm is also 4-bit, part of the margin is quant); the llama root unit moved to `scripts/.AGENTTRASH/20260920-llama-layersplit/` (never `systemctl disable`); KV pool auto-sized to 943,581 tokens (3.59× the window); tools, reasoning and vision verified live against the endpoint. - `/scripts/build-llama-rdna4.sh` — Now takes `GGML_HIP_RCCL`; the RCCL build (`build-rdna4-rocm714-rccl`) made the tensor-mode bench arm fair (Ubuntu RCCL 2.27 carries gfx1201 device code; TheRock's does not — `invalid device function`). -- `/shared/prometheus/rules/llm-fleet.yml`, `/shared/prometheus/prometheus.yml`, `/shared/grafana/provisioning/` — Monitoring spans the `vllm:` + `llamacpp:` namespaces (6 alerts + 3 recording rules); frank-secondary/frank-large targets fixed to `host.containers.internal`; the prefix-cache reuse rule divides by `cached + prompt` (llama.cpp's `prompt_tokens_total` EXCLUDES cached tokens); prefix caching measured at 1,648-token block granularity (13,021-token prompt 2.30 s → 0.68 s, 76 % reused). +- `/shared/prometheus/rules/llm-fleet.yml`, `/shared/prometheus/prometheus.yml`, `/shared/grafana/provisioning/` — Monitoring spans the `vllm:` + `llamacpp:` namespaces (6 alerts + 3 recording rules); frank-zealot/frank-dragoon targets fixed to `host.containers.internal`; the prefix-cache reuse rule divides by `cached + prompt` (llama.cpp's `prompt_tokens_total` EXCLUDES cached tokens); prefix caching measured at 1,648-token block granularity (13,021-token prompt 2.30 s → 0.68 s, 76 % reused). - `/scripts/dankserver-route-primary.sh` — `eno1` pinned primary (metric 100), `eno2` retained failover (metric 200); applied with `nmcli device reapply` (no `connection reapply` in NM 1.54). - Hardware — dankserver board swapped to the ASUS ProArt B850-Creator WiFi NEO: both R9700s on CPU root ports at Gen5 x8, every bridge `AtomicOpsCap: Routing+`, both endpoints `ReqEn+` — the PCIe-atomics wall is gone; GPU BDFs moved, kernel 7.0.0-31, SMT back on (16 CPUs). - `/serverAppConfigs-docs/LLM/frank-medium-radiance-mxfp4.md` — Now the ACTIVE runbook (deployed flags, battery, capabilities, rollback); `frank-medium-llamacpp-dflash2.md` carries the SUPERSEDED banner; `Dual-R9700-Cooperation.md` states the measured verdict; `Dankserver System Specs.md` gained a Motherboard section; `frank-medium-model-swap.md` is the new swap runbook; AGENTS.md topology/sections/lessons flipped. ## 2026-09-19 -- `/scripts/frank-large.service`, `/scripts/serve-frank-large.sh` — frank-large: halogen → CIRU v4.4.1 Orca (jcbtc Qwen3.8-Flash-CIRU-STRIX-Orca w4b, 262144 ctx, MTP depth 4, 4096 MiB PLE cache, text only); halogen is the rollback target (b6ce3af, f68bda5). -- `/serverAppConfigs-docs/LLM/frank-large-ciru-orca.md` — New runbook. +- `/scripts/frank-dragoon.service`, `/scripts/serve-frank-dragoon.sh` — frank-dragoon: halogen → CIRU v4.4.1 Orca (jcbtc Qwen3.8-Flash-CIRU-STRIX-Orca w4b, 262144 ctx, MTP depth 4, 4096 MiB PLE cache, text only); halogen is the rollback target (b6ce3af, f68bda5). +- `/serverAppConfigs-docs/LLM/frank-dragoon-ciru-orca.md` — New runbook. - `/scripts/frank-medium.env`, `/scripts/serve-frank-medium.sh` — frank-medium: ajgazin UD-Q8_K_XL → orcarouter Q8_0 + z-lab DFlash2 Q4_K_M drafter; split re-balanced 35:30 → 32:33; pool 393216 → 327680 (d374ab9). -- `/scripts/frank-secondary.env`, `/scripts/serve-frank-secondary.sh` — frank-secondary: same-day vLLM detour reverted to mainline llama.cpp Gemma4-12B Q4_K_M + MTP sidecar + ngram-mod, q8_0 KV, 4 slots of 262144 (374041c). +- `/scripts/frank-zealot.env`, `/scripts/serve-frank-zealot.sh` — frank-zealot: same-day vLLM detour reverted to mainline llama.cpp Gemma4-12B Q4_K_M + MTP sidecar + ngram-mod, q8_0 KV, 4 slots of 262144 (374041c). - Hardware — 3090 EVGA FTW3 iCX3 RGB set MODE_OFF and saved to EEPROM (persists across reboots, headless). - AGENTS.md, both indexes, halogen runbook retirement banner (764cf41, 88331e2); 331 bats + 32 e2e green. @@ -928,9 +948,9 @@ - Incident — frank-medium found stopped twice: (morning) a bench round ended without the protocol's restore half; (midday) an orphaned `llama-server` from `third_party/llamacpp/build-merge` (PPID 1, loopback :17770) held ~16 GiB on each R9700 and would have starved the 35:30 allocation — proven abandoned (frozen CPU ticks, zero connections) then killed; health 200 in ~20 s. Lesson: "GPUs idle" is a check, not an assumption. ## 2026-09-17 -- `/scripts/frank-secondary.env`, `/scripts/serve-frank-secondary.sh` — frank-secondary: ISTA-DASLab GSQ-RCO IQ3_S → `HauhauCS/Gemma4-12B-QAT-Uncensored-HauhauCS-Balanced` Q4_K_M + separate MTP assistant sidecar (`--spec-type draft-mtp,ngram-mod`); q8_0 KV (`build-cuda` rebuilt with `-DGGML_CUDA_FA_ALL_QUANTS=ON`, else ~12× prefill collapse); `--fit` chose the full 262144 window; audio transcribes verbatim; Gemma4 accepts every `reasoning_effort` level. -- `/scripts/frank-secondary.env` — `CTX_SIZE=1048576` / `PARALLEL=4` (four FULL 262144-token slots, the measured card ceiling: ~3,450 MiB/slot + ~8,546 fixed); ubatch 1024 deployed (pp ~965 / tg 226–302 at 253k; ubatch 2048 OOMs the MTP draft's pp buffer); draft n-max 4 + poll 100 measured WORSE at long ctx. -- `/serverAppConfigs-docs/LLM/frank-secondary-gemma4-12b.md` — New ACTIVE runbook; `frank-secondary-qwen38-gsq-rco.md` retired as rollback target. +- `/scripts/frank-zealot.env`, `/scripts/serve-frank-zealot.sh` — frank-zealot: ISTA-DASLab GSQ-RCO IQ3_S → `HauhauCS/Gemma4-12B-QAT-Uncensored-HauhauCS-Balanced` Q4_K_M + separate MTP assistant sidecar (`--spec-type draft-mtp,ngram-mod`); q8_0 KV (`build-cuda` rebuilt with `-DGGML_CUDA_FA_ALL_QUANTS=ON`, else ~12× prefill collapse); `--fit` chose the full 262144 window; audio transcribes verbatim; Gemma4 accepts every `reasoning_effort` level. +- `/scripts/frank-zealot.env` — `CTX_SIZE=1048576` / `PARALLEL=4` (four FULL 262144-token slots, the measured card ceiling: ~3,450 MiB/slot + ~8,546 fixed); ubatch 1024 deployed (pp ~965 / tg 226–302 at 253k; ubatch 2048 OOMs the MTP draft's pp buffer); draft n-max 4 + poll 100 measured WORSE at long ctx. +- `/serverAppConfigs-docs/LLM/frank-zealot-gemma4-12b.md` — New ACTIVE runbook; `frank-zealot-qwen38-gsq-rco.md` retired as rollback target. - `/shared/homepage/` — The three LLM cards moved to the user page with live descriptions; new static `/docs` user page (access chain, model guide, how-tos) routed in the post-auth listener (32751c0). - `/scripts/deploy-remote.sh` — The pending pass now prunes stale `pending` state entries for retired services into `~/.AGENTTRASH` and keeps going (a stale `frank-default-sightsound` entry made every `--pending` run exit 2) (02a7876). - Fleet audit — Every vhost classified against the guard policy (no new exposure); `systemd-hermes` logged as a boot-persistence gap (running container, no quadlet); stray stopped `test-vllm` container on dankserver held for approval. @@ -939,10 +959,10 @@ - `/scripts/bench-batch-ubatch.sh` — New harness: one `llama-bench` invocation per cell (a test that cannot allocate `exit(1)`s, taking a whole sweep with it), per-cell VRAM sampler, service stopped/started from a trap; must run from a transient unit (`LimitMEMLOCK=infinity` is load-bearing) (87845fc, 77a07ff). - `/scripts/frank-medium.env` — `UBATCH_SIZE` 1536 → 512 (prefill peaks at 512: 1193 vs 1078 t/s at 2048; 3.71 GiB cheaper) and `TENSOR_SPLIT` 36,29 → 35,30 (ubatch buffers cost ROCm1 ~2× what they cost ROCm0) (a11fae0); `tests/frank_medium_unit.bats` balance seam re-fitted as a shape assertion. - `/serverAppConfigs-docs/LLM/frank-medium-batch-ubatch.md` — New page: the sweep, the logical-batch irrelevance, the amdgpu settle-after-kill trap. -- `/dankclaw/frank-large/quadlet/frank-large.container` — halogen restored as frank-large, retuned: ctx 262144 → 200192, pool 401408 → 400384, slots 3 → 2, max-tok 32768 → 24576, host-reserve 15 → 20 GiB, vision tower unset (moved to frank-secondary); ledger 95.4 GiB held / 14.7 GiB spare, no clamp. -- `/scripts/frank-secondary.env`, `/scripts/frank-secondary.service`, `/scripts/serve-frank-secondary.sh` — New frank-secondary: mainline llama.cpp 37b53fd on the RTX 3090 serving ISTA-DASLab GSQ-RCO IQ3_S with the in-file MTP head (`draft-mtp`), BF16 projector, 131072 ctx, f16 KV, port 7771. -- `/scripts/deploy-remote.sh` — `deploy_llm_large` flipped back to halogen with a `wait_port_free 7770` gate (the first cutover died on `Address already in use` two seconds after the old server exited); `deploy_llm_small` added. -- `/serverAppConfigs-docs/LLM/frank-secondary-qwen38-gsq-rco.md`, `/serverAppConfigs-docs/LLM/halogen-flash-server.md` — New / re-activated runbooks; `frank-large-ik-uncensored.md` marked retired. +- `/dankclaw/frank-dragoon/quadlet/frank-dragoon.container` — halogen restored as frank-dragoon, retuned: ctx 262144 → 200192, pool 401408 → 400384, slots 3 → 2, max-tok 32768 → 24576, host-reserve 15 → 20 GiB, vision tower unset (moved to frank-zealot); ledger 95.4 GiB held / 14.7 GiB spare, no clamp. +- `/scripts/frank-zealot.env`, `/scripts/frank-zealot.service`, `/scripts/serve-frank-zealot.sh` — New frank-zealot: mainline llama.cpp 37b53fd on the RTX 3090 serving ISTA-DASLab GSQ-RCO IQ3_S with the in-file MTP head (`draft-mtp`), BF16 projector, 131072 ctx, f16 KV, port 7771. +- `/scripts/deploy-remote.sh` — `deploy_llm_dragoon` flipped back to halogen with a `wait_port_free 7770` gate (the first cutover died on `Address already in use` two seconds after the old server exited); `deploy_llm_small` added. +- `/serverAppConfigs-docs/LLM/frank-zealot-qwen38-gsq-rco.md`, `/serverAppConfigs-docs/LLM/halogen-flash-server.md` — New / re-activated runbooks; `frank-dragoon-ik-uncensored.md` marked retired. - `/serverAppConfigs-docs/LLM/x4-pair-experiment.md` — New page: 3090 + Strix Halo over the x4 link. iGPU-only Vulkan matches halogen's ~25 tok/s with the 3090 idle but commits 116 of 121 GiB (throughput parity, memory bankruptcy); per-tensor cross-device placement is killed by `-ot` itself (`has_tensor_overrides()` → `pipeline_parallel` → `n_copies == 1`); the first "CUDA + Vulkan cannot serve one model" conclusion was a llama-bench parsing artifact (`-dev A,B` is a SWEEP, not a list — correct `-dev A/B -ts x/y` gives 27.55 / 27.23 tok/s, +7 % decode / +16 % prefill vs iGPU-only). - Incident — The rootless podman pause process died (trigger NOT established; no OOM kill in the kernel log): every `podman` command failed, all 28 quadlets looped, `podman system migrate` panics in 5.7.0; a reboot repaired it. The reboot exposed `hermes.franksdank.cloud` 502: the Caddyfile dialed `192.168.0.143:8787` (a host bind, not a published port) — fixed to `host.containers.internal:8787`, and the seam that had accepted any numeric upstream was strengthened. - Host — Model cache cleared on operator instruction (298 → 895 GB free) and re-fetched: halogen's sidecars came back LARGER (in-place versioning — a stale copy is invisible from the file name); Q4_K_S vs Q4_K_M measured +2–3 % with ~5 GiB more host RAM; IQ4_XS fetched as the next comparison payload; `halogen-flash-server.md` gained a "Refreshing the weights" note. @@ -951,8 +971,8 @@ - `/scripts/frank-medium.env`, `/scripts/serve-frank-medium.sh`, `/scripts/frank-medium.service` — frank-medium: the 3090 left Dankserver, two R9700s (gfx1201) in; runtime charlie12345/ROCmFPX c49ebdb with its self-contained ROCm 7.14 toolchain (bypassing the host's broken mixed ROCm); kingjones Q8_0 AGENT + Q4_0 MTP head; layer split chosen by measurement (1991/18.8 t/s vs tensor 271.8/26.3 — tensor's decode win costs a 7× prefill collapse with no RCCL); draft pinned to ROCm1; frank-small retired (`retire_root_llm_small()` archived the CUDA-era unit). - `/serverAppConfigs-docs/LLM/frank-medium-rocmfpx.md` — New runbook; `freetoken-frank-small.md` and `kingjones-q8agent-rocmfpx.md` marked retired/superseded; AGENTS.md, indexes, System Specs, deployment/Hermes/OpenWebUI/Plex/Stack pages updated. - Host — Purged 167 stale AMD-repo ROCm 6.3.3 packages, removed the radeon apt pin and the `ld.so.conf` hijack (staged in `~/.AGENTTRASH/20260915-rocm633-cleanup/`). -- `/scripts/frank-large.service`, `/scripts/serve-frank-large.sh` — frank-large cut to ik_llama.cpp (halogen quadlet retired to `~/.AGENTTRASH/20260915-ik-swap/`); overnight decode campaign: 3.8–4.3 t/s across every safe configuration — the wall is ~100 CPU↔GPU section launches per token, not compute; mainline 37b53fd runs 1.0 t/s; the GGUF has no MTP head; 84 GiB of experts cannot fit 24 GiB VRAM (0c1e10a, 795b0b3). -- `/serverAppConfigs-docs/LLM/frank-large-ik-uncensored.md` — New runbook with the full evidence chain. +- `/scripts/frank-dragoon.service`, `/scripts/serve-frank-dragoon.sh` — frank-dragoon cut to ik_llama.cpp (halogen quadlet retired to `~/.AGENTTRASH/20260915-ik-swap/`); overnight decode campaign: 3.8–4.3 t/s across every safe configuration — the wall is ~100 CPU↔GPU section launches per token, not compute; mainline 37b53fd runs 1.0 t/s; the GGUF has no MTP head; 84 GiB of experts cannot fit 24 GiB VRAM (0c1e10a, 795b0b3). +- `/serverAppConfigs-docs/LLM/frank-dragoon-ik-uncensored.md` — New runbook with the full evidence chain. ## 2026-09-14 - `/dankclaw/compose.yaml`, `/dankclaw/.env.example` — New `hermes-webui` service (Hermex): `bootstrap.py --foreground` in the agent image, shares `/home/dank/hermes-data`, loopback-only publish 127.0.0.1:8787, password-gated via `HERMES_WEBUI_PASSWORD`. @@ -981,7 +1001,7 @@ - `/serverAppConfigs-docs/Infrastructure/FrankBook-Pro.md` — Rewritten to the active-tunnel reality (VM placement, WG gate, socat LaunchAgents, PBKDF2 seed); RDAP proved the "custom WG server" is a ProtonVPN Seattle server (full 65535-port scan: no admin surface anywhere). - `/dankclaw/authentik/quadlet/authentik-outpost-ldap.container` — New LDAP outpost for Jellyfin (amd64 single-platform digest-pinned — podman 5.7.0 refuses the tag's nested manifest list); authentik objects provisioned via `ak shell` ORM; live bind tests proved two rules: the token intent must be `verification`, and the provider needs the `search_full_directory` object permission. - `/serverAppConfigs-docs/Infrastructure/Authentik.md`, `/serverAppConfigs-docs/Dankclaw/Jellyfin.md` — LDAP-outpost section (objects table + rules) and the LDAP-Auth 23.0.0.0 plugin section (`LdapSearchAttributes` is comma-separated; username attribute `cn`). -- `/scripts/frank-secondary.env`, `/scripts/serve-frank-secondary.sh` — Two compressed-tensors FP8 swaps attempted on FreeToken and both failed to load (ornith-1.5: expert naming; HauhauCS aggressive: block scales do not broadcast in `_dequant_fp8_weight`); reverted to Huihui FP8 within the hour; `freetoken-frank-small.md` quant matrix updated (modelopt block-fp8 is the only FP8 path that loads); the deploy health gate passed for BOTH failed loads — a swap is only proven by the journal + a real completion. +- `/scripts/frank-zealot.env`, `/scripts/serve-frank-zealot.sh` — Two compressed-tensors FP8 swaps attempted on FreeToken and both failed to load (ornith-1.5: expert naming; HauhauCS aggressive: block scales do not broadcast in `_dequant_fp8_weight`); reverted to Huihui FP8 within the hour; `freetoken-frank-small.md` quant matrix updated (modelopt block-fp8 is the only FP8 path that loads); the deploy health gate passed for BOTH failed loads — a swap is only proven by the journal + a real completion. - `/dankserver/{romm,jellyfin,calibre-web,copyparty}/quadlet/` — After a hard crash left every bare compose container dead at boot, the media stack standardized to quadlet: six units shipped + cutover handlers (retire bare containers, rescue RomM's anonymous volume, merge-move `/opt/` → `/home/dank/Containers/`); v1 generator quirks fixed (`Command=`→`Exec=`, `Device=`→`AddDevice=`, `HealthCmd=` space-splitting, the `HOME=/root` EnvironmentFile trap). - `/dankclaw/` — Data roots of gitea, authentik, and the hermes trios moved to `/home/dank/Containers//` while running (rename is inode-bound — zero downtime); `deploy_hermes` ordering fixed (generated units reload AFTER the unit files are copied). - `/dankclaw/seerr/quadlet/seerr.container` — New Seerr v3.4.1 request manager: loopback-only 127.0.0.1:5055, guarded vhost + outpost provider `seerr-proxy`; `/tests/seerr_quadlet.bats` new seam; `/serverAppConfigs-docs/Dankclaw/Seerr.md` new page. @@ -992,8 +1012,8 @@ ## 2026-08-30 - `/scripts/frank-npu.env`, `/scripts/serve-frank-npu.sh`, `/scripts/frank-npu.service` — New `frank-npu` on Dankclaw: FLM v1.0.1 serving the whole local registry (36 tags) on 52626; first deploy crash-looped (`/dev/accel/accel0` err=-19) — root cause: the XDNA2 SVA bind fails whenever the AMD IOMMU is off; fixed with `iommu=pt` + reboot; vision + audio towers proven end-to-end; health probe is `/v1/version` (FLM has no `/health` route) (c3ed3a6, cf0c541). - `/serverAppConfigs-docs/LLM/frank-npu.md` — New runbook; AGENTS.md fleet table + the IOMMU/SVA hard requirement. -- `/dankclaw/frank-large/quadlet/frank-large.container` — frank-large: swapped to `kingjones777/Qwen3.8-Flash-Next-ROCmFP4-STRIX-GGUF` on the pinned `kingjones30/ROCmFPX` fork (fa-on works UNPATCHED — the QSA F32 assert was agentionai-specific); ~225 s load, real 111k-token prefill at 213–232 t/s. -- `/scripts/frank-secondary.env` — frank-secondary (FreeToken): model swapped to `batsclamp/Huihui-Qwen3.6-35B-A3B-abliterated-FP8` (native block-fp8); ~40 tok/s verified. +- `/dankclaw/frank-dragoon/quadlet/frank-dragoon.container` — frank-dragoon: swapped to `kingjones777/Qwen3.8-Flash-Next-ROCmFP4-STRIX-GGUF` on the pinned `kingjones30/ROCmFPX` fork (fa-on works UNPATCHED — the QSA F32 assert was agentionai-specific); ~225 s load, real 111k-token prefill at 213–232 t/s. +- `/scripts/frank-zealot.env` — frank-zealot (FreeToken): model swapped to `batsclamp/Huihui-Qwen3.6-35B-A3B-abliterated-FP8` (native block-fp8); ~40 tok/s verified. - `/serverAppConfigs-docs/LLM/kingjones-strix-rocmfp4.md` — Reactivated as the large runbook; `agentionai-fast-imatrix.md` marked RETIRED; `freetoken-frank-small.md` model sections updated; LLM index + AGENTS fleet tables refreshed. - `/serverAppConfigs-docs/Dankserver/prowlarr.md`, `/serverAppConfigs-docs/Dankserver/qbittorrent.md` — Rewritten: the arr↔Prowlarr feed contract (`/{indexerId}/api`, the global key — the hand-rolled `/torznab/` paths were Forms-auth catch-alls returning 302), TV + music chains proven live, first real grab (The Dark Knight 2160p, imported), Prowlarr auto-sync broken by version skew, qB persistent credentials (`WebUI\Password_PBKDF2`, host-local 0600), Readarr parked (abandoned upstream; its client cannot authenticate against qB 5). @@ -1013,7 +1033,7 @@ - `/tests/caddy_quadlet.bats` (new) + caddyfile/deployment_flow/pihole seams — quadlet boot persistence, self-healing, network, env, and sysctl coverage. - `/serverAppConfigs-docs/Infrastructure/Caddy.md`, `/serverAppConfigs-docs/Infrastructure/Pi-hole.md`, `/serverAppConfigs-docs/Dankclaw/Dankclaw Stack.md`, `/serverAppConfigs-docs/Dankclaw/Gitea.md`, `/serverAppConfigs-docs/Architecture/Deployment Flow.md` — quadlet runtime facts, the 2026-08-26 incident, the sysctl-conflict failure mode, canonical Caddy ownership. -## 2026-10-01 — frank-primary RESTORED to fp8 3 x 262144 (bf16 boot fails) +## 2026-10-01 — frank-archon RESTORED to fp8 3 x 262144 (bf16 boot fails) bf16 (--kv-cache-dtype auto) at 2 x 262144 did not stay up, with OR without --expert-precise-memory: @@ -1040,7 +1060,7 @@ KV 6.1e9 -> 792,069 tokens / 3.02x / arena 6,248 / 3.59 GiB free): KV dtype Restored: fp8 3 x 262144, MNBT 2048, KV_BYTES 6,100,000,000, no precise flag. Next: bisect bf16 vs SEQS in a window (bf16 + SEQS=3 isolates the dtype). -## 2026-10-01 — frank-primary: --expert-precise-memory + bf16 = boot crash loop +## 2026-10-01 — frank-archon: --expert-precise-memory + bf16 = boot crash loop **Reverted.** The two changes Frank asked for were applied together and the result crash-looped: `NRestarts` climbed 1 -> 2 -> 3, each attempt running @@ -1072,7 +1092,7 @@ overhead: arena 14.31 GiB, ~2.4 GiB free at boot. default — it is the budget for the phase that allocates last. Reclaim it only by paying for it elsewhere (smaller pool, fewer sessions, or a shorter context). -## 2026-10-01 — frank-primary: 2 bf16 windows + --expert-precise-memory +## 2026-10-01 — frank-archon: 2 bf16 windows + --expert-precise-memory Frank's final shape for the night. Two changes at once, both measured in principle before the boot: @@ -1097,12 +1117,12 @@ planner's OWN one-max-model-len reserve (2.48 GiB at TP2) and does NOT scale with SEQS. The pinned `--kv-cache-memory-bytes` therefore does not shrink the planned arena; it comes out of free VRAM instead. -## 2026-10-01 — frank-large: Q4_K_XL payload + 4 x 163840 sessions +## 2026-10-01 — frank-dragoon: Q4_K_XL payload + 4 x 163840 sessions Frank's call. Payload swapped from ajgazin's **abliterated** Swift-1.5 UD-Q8_K_XL (29.3 GiB) to **unsloth/Qwen3.8-27B-GGUF UD-Q4_K_XL** (16.35 GiB, sha256 3f227079…b01e, vanilla/Apache-2.0 — the endpoint is no longer -uncensored). New fetcher `scripts/download-frank-large-q4.sh`; the DFlash2 +uncensored). New fetcher `scripts/download-frank-dragoon-q4.sh`; the DFlash2 drafter and its fetcher are unchanged. Shape: **`--sessions 4 --context 163840`** with unquantized KV. gufo has no @@ -1136,12 +1156,12 @@ deployer's `DEPLOY INCOMPLETE` banner can be raised by a flake. Re-run stable underlying issue and it lives in Plex's web-client/image config, not in any repo service. -## 2026-10-01 — frank-primary bf16 no-spec cutover +## 2026-10-01 — frank-archon bf16 no-spec cutover -- `/scripts/frank-primary.env` — bf16 no-spec cutover, FINAL shape after the +- `/scripts/frank-archon.env` — bf16 no-spec cutover, FINAL shape after the night ladder: MAXLEN **241664** x SEQS 3, KV_BYTES **10,184,000,000**/rank, KV_DTYPE auto (bf16), MNBT 1024, GATHER CHUNKS=32/LANES=64, UTIL 0.98; - FRANK_PRIMARY_SPEC deleted (no spec). Engine measured at the winner: + FRANK_ARCHON_SPEC deleted (no spec). Engine measured at the winner: "KV cache size: 732,359 tokens, Maximum concurrency for 241,664 tokens per request: 3.03x". - **The night ladder (Frank's method).** 262144 OOMed at CUDA graph capture @@ -1156,10 +1176,10 @@ any repo service. - **Util stays 0.98.** The earlier 0.90 edit was wrong — lowering `--gpu-memory-utilization` shrinks the engine's own budget rather than buying slack; Frank forbade it and the winning ladder ran at 0.98. -- `/scripts/serve-frank-primary.sh` — `--speculative-config` line removed; +- `/scripts/serve-frank-archon.sh` — `--speculative-config` line removed; `--max-num-batched-tokens` and the `-e R4D_LRU_GATHER_CHUNKS/LANES` container-env passthrough added; shape header rewritten. -- `/tests/frank_primary_unit.bats` — seam re-pinned: bf16-KV-present, +- `/tests/frank_archon_unit.bats` — seam re-pinned: bf16-KV-present, spec-absent-by-measurement, gather-32x64-present, MNBT-1024 tests; the qualified-shape and flags tests flipped to the new env keys. - Overnight redo campaign (prefetch OFF everywhere) tabled in @@ -1168,7 +1188,7 @@ any repo service. 1024-4096, KV pool law (7,926 fp8 / 14,047 bf16 B/token), arena flat zone, six-slot refusal, bf16 3x262144 boot failure root cause (CUDA OOM at KV_BYTES 11.3e9; boots clean at 11.047e9 — captured from journald `-o json`). -- `/AGENTS.md` — fleet table frank-primary row rewritten to the bf16 shape. +- `/AGENTS.md` — fleet table frank-archon row rewritten to the bf16 shape. - `/serverAppConfigs-docs/LLM/index.md` — fleet intro + mermaid node updated out of the GLM era. - **Client contract fixed (thinking + tools).** The live endpoint returned a @@ -1204,7 +1224,7 @@ any repo service. knife-edge shape change, send a large-`max_tokens` request before calling it done. FOUR slots x 262144 fp8 (KV_BYTES 8,311,013,376/rank) returns ~1.93 GiB per rank for activations/graph capture. Frank's call 2026-10-01. -- `/scripts/frank-primary.service` — **Restart=always, not on-failure** (plus +- `/scripts/frank-archon.service` — **Restart=always, not on-failure** (plus `StartLimitIntervalSec=0` and `OOMScoreAdjust=-500`). A runtime worker fault makes vLLM's API server exit CLEAN, so ExecStart returned 0, systemd logged "Deactivated successfully", and on-failure NEVER fired: the endpoint stayed @@ -1224,20 +1244,20 @@ any repo service. - Production bring-up: the shape boots and serves on :7770 — engine log verified (KV cache size, concurrency, MNBT 1024, gather 32x64) plus live contract probes (reasoning split, tool_calls). Rollback target for the - 2026-09-29 fp8+MTP4 shape: git tag `frank-primary-fp8-mtp-20261001`. + 2026-09-29 fp8+MTP4 shape: git tag `frank-archon-fp8-mtp-20261001`. -## 2026-10-01 — frank-large cutover: gufo -> vLLM TheRock, MiMo-V2.6 BF16 + cross-model MTP +## 2026-10-01 — frank-dragoon cutover: gufo -> vLLM TheRock, MiMo-V2.6 BF16 + cross-model MTP - **Question that started it:** can a Qwen3.5 MTP drafter attach to - frank-secondary, and how does vLLM run the FULL BF16 MiMo checkpoint? Answer 1: - not on frank-secondary — SGLang reads the MTP head from the TARGET checkpoint + frank-zealot, and how does vLLM run the FULL BF16 MiMo checkpoint? Answer 1: + not on frank-zealot — SGLang reads the MTP head from the TARGET checkpoint and MiMo ships ZERO `mtp.*` tensors (base and INT8 alike). Answer 2: the digest-pinned `kyuz0/vllm-therock-gfx1151` image (vLLM 0.30 / torch 2.11 / TheRock ROCm 10) boots BF16 MiMo on the gfx1151 iGPU in ~200-240 s, and vLLM reads the draft from a SEPARATE path — so cross-model MTP from `Qwen/Qwen3.5-9B` (the distill's source, identical 4096/248320/32-layer - geometry) works. Frank's call: ship that as frank-large. -- **Bench window (frank-large stopped, one session, temp 0, 28,647-token + geometry) works. Frank's call: ship that as frank-dragoon. +- **Bench window (frank-dragoon stopped, one session, temp 0, 28,647-token prefill / 512 decode):** base 17,876 t/s prefill / 13.1 t/s decode (13.1 is ~94% of the LPDDR5x BF16 roof - decode here is bandwidth, not a bug); +DFlash-8 7,976 / 17.4 (acceptance 59%/26% per position); +MTP-2 7,380 / @@ -1248,7 +1268,7 @@ any repo service. cascade). vLLM spec decode is distribution-preserving, not bitwise-greedy-preserving. - **Client-contract delta wired:** vLLM emits `reasoning`, not - `reasoning_content` - `models.yml` frank-large block now sets + `reasoning_content` - `models.yml` frank-dragoon block now sets `reasoningContentField: "reasoning"`, and the extraBody moved to the Qwen3.5-family recipe (0.7/0.8) with `chat_template_kwargs` (a top-level `preserve_thinking` is ignored by vLLM). @@ -1260,7 +1280,7 @@ any repo service. 0.30 (verified in-image); the drafter stays on disk as the alternative. - Host state: +38 GiB fetched (MiMo BF16 17.53 GiB, Qwen3.5-9B 18 GiB, DFlash 2.58 GiB), disk down to ~26 GiB free - reclaim pass due. gufo - rollback pinned at git tag `frank-large-gufo-q4kxl-20261001`; engine, + rollback pinned at git tag `frank-dragoon-gufo-q4kxl-20261001`; engine, Q4_K_XL payload and DFlash2 drafter all remain on the host. - First deploy attempt #2 crash-looped the container 51 times: the serve script handed vLLM the HOST model path while the tree is mounted at @@ -1269,14 +1289,14 @@ any repo service. already converted; the target was not), pinned by bats. Also fixed the deployer's own draft gate (same single-file bug as the serve script's). - Reclaim (Frank approved): Swift-1.5 Q8_K_XL payload (30 G, refetchable via - `scripts/download-frank-large-swift.sh`) and the orphaned flux-2-klein + `scripts/download-frank-dragoon-swift.sh`) and the orphaned flux-2-klein tree under `models/checkpoints` (23 G; ComfyUI mounts `comfyui-data/models`, not this) purged via - `~/.AGENTTRASH/20261001-frank-large-reclaim/` — 52 G freed. KEPT the + `~/.AGENTTRASH/20261001-frank-dragoon-reclaim/` — 52 G freed. KEPT the 1.1 G `Qwen3.8-27B-DFlash2-Q4_K_M.gguf` (it is the gufo rollback's drafter, not a remnant). -## 2026-10-02 — frank-large cutover: vLLM MiMo -> ROCmFPX Q8_0_ROCMFPX_AGENT + MTP +## 2026-10-02 — frank-dragoon cutover: vLLM MiMo -> ROCmFPX Q8_0_ROCMFPX_AGENT + MTP Frank's order was the highest quality of `kingjones777/Qwen3.8-27B-ROCmFP4-STRIX-MTP-GGUF` on one full context, "whatever @@ -1296,16 +1316,16 @@ bundled BF16 mmproj, and MTP from the repo's own `mtp-Qwen3.8-27B-Q4_0.gguf` output-head tensors at plain Q8_0 instead of 2, which measured MTP acceptance 0.953 vs 0.911. - Steady GTT occupancy 63.1 GiB of the ~114 GiB aperture; boot to healthy 16 s. -- Rollback: git tag `frank-large-gufo-q4kxl-20261001`. The retired vLLM-era +- Rollback: git tag `frank-dragoon-gufo-q4kxl-20261001`. The retired vLLM-era fetchers moved to `old/`. Runbook - [[frank-large-rocmfpx-q8agent-mtp]]. + [[frank-dragoon-rocmfpx-q8agent-mtp]]. -## 2026-10-02 — frank-secondary: Q5_K_M, then three contexts + vision, sized by two boots +## 2026-10-02 — frank-zealot: Q5_K_M, then three contexts + vision, sized by two boots Three orders in one day on the same endpoint: `bartowski/…Q5_K_M` on llama.cpp with two contexts ("whatever context size fits the 3090"), then **three contexts** "as much as can fit while keeping overhead open space to 2-3gb on -the 3090", then **"frank-secondary should have vision"**. +the 3090", then **"frank-zealot should have vision"**. - **Final shape: `CTX_SIZE=540672 PARALLEL=3` = 3 x 180,224**, f16 K + q8_0 V under flash attention, `--mmproj` vision, all layers on the 3090. Measured @@ -1321,9 +1341,9 @@ the 3090", then **"frank-secondary should have vision"**. - **Three contexts cost window, and that is the tradeoff Frank was told:** 180,224 tokens per conversation, not the native 262,144. A longer prompt is a hard `400 exceed_context_size_error`, so `models.yml` sets - `contextWindow: 180224`. Consequence at the time: frank-primary's then + `contextWindow: 180224`. Consequence at the time: frank-archon's then 183,501-token compaction request did not fit here with summary room — - resolved later the same day when frank-primary's window moved to 200,704 + resolved later the same day when frank-archon's window moved to 200,704 and its trigger fell to 140,492 (see the shape-D entry below). - Measured (2026-10-02, this shape): decode **106.8 t/s**, prefill **3,814 t/s** (~5 % faster decode than 2 x 262,144 — shorter slot, shorter attention @@ -1343,11 +1363,11 @@ the 3090", then **"frank-secondary should have vision"**. `~/.AGENTTRASH/20261002-retired-llm-payloads/` (~59 GiB of superseded payloads). Kept in place for rollback: `MiMo-Q6K/`, `MiMo-Q5KM/`, `Qwen3.8-27B-UD-Q4_K_XL/` and `Qwen3.8-27B-UD-Q8_K_XL/` (the latter holds the - gufo DFlash2 drafter). Runbook [[frank-secondary-llama-mimo-q5km]]. + gufo DFlash2 drafter). Runbook [[frank-zealot-llama-mimo-q5km]]. -## 2026-10-02 — frank-primary shape D: 3 x 200704, fp8, pool sized for 2 contexts +## 2026-10-02 — frank-archon shape D: 3 x 200704, fp8, pool sized for 2 contexts -Frank's order: shrink frank-primary to a 200704-token window with about two +Frank's order: shrink frank-archon to a 200704-token window with about two resident full-length contexts, cut the KV pool, and drop MNBT to 1024. The first attempt (`30904ba`, 2 x 200704 + SEQS=2) **crash-looped**; the revert went live as `e460bbb`, and the shape was then re-applied one law at a time on @@ -1412,13 +1432,13 @@ top of the proven-good base, root cause first. 400 for anything else (re-measured; the fork's message names the set). - **Harness contract followed the window:** `models.yml` `contextWindow` 262144 -> **200704** (compaction trigger 140,492 + 36,864 = 177,356 <= - 200,704). Side effect: frank-primary's compaction request now fits inside a - frank-secondary slot again, which it had stopped doing when frank-secondary went to + 200,704). Side effect: frank-archon's compaction request now fits inside a + frank-zealot slot again, which it had stopped doing when frank-zealot went to 3 x 180,224. - **Comment-only follow-up** `295d578` recorded the measured numbers and was deployed so the per-service revision marker sits at HEAD; e2e 33/33 again. - Rollback for the pre-shape-D fp8+MTP4 era stays git tag - `frank-primary-fp8-mtp-20261001`. Runbook + `frank-archon-fp8-mtp-20261001`. Runbook [[dankserver-qwen38-fp8-expert-offload-tuning]]. ## 2026-10-02 - plex: the readiness gate probed HTTP against a TLS-only service @@ -1452,12 +1472,12 @@ and then answers with nothing, and curl reports "Empty reply from server" (52). - Re-deployed `39f0e0d`: plex recorded deployed, the *arr services recorded (compose-recorded on this host, no restart attempted), tautulli deployed, e2e 33/33. Verified after: `plex-https=200`, plex container up, tautulli - healthy, frank-primary untouched (`health=200`, NRestarts=0). + healthy, frank-archon untouched (`health=200`, NRestarts=0). - **Operating lesson: `deploy.sh ` with no `--service` is a fleet-wide drain.** It restarts every service whose recorded revision is behind HEAD and whose paths changed since. To touch one service, name it. -## 2026-10-02 — frank-primary shape E: `--expert-precise-memory` (+1,026 arena slots), a mounted compile cache, and the P2P answer +## 2026-10-02 — frank-archon shape E: `--expert-precise-memory` (+1,026 arena slots), a mounted compile cache, and the P2P answer Shape D left one question open — the plan's overhead term was reserving 2.35 GiB of compile headroom the boot never used — and the answer to Frank's free-VRAM @@ -1466,7 +1486,7 @@ every restart since the cutover. - **`--expert-precise-memory` is real and it fits (option A).** Boot-probed on the shape-D base with production stopped, the candidate booted AS the service - (`FRANK_PRIMARY_ENV_FILE=/tmp/probe-b.env bash scripts/serve-frank-primary.sh`, + (`FRANK_ARCHON_ENV_FILE=/tmp/probe-b.env bash scripts/serve-frank-archon.sh`, trap-guaranteed restore), the numbers read off the engine's own plan lines: | plan line | shape D | shape E | @@ -1495,7 +1515,7 @@ every restart since the cutover. range (1, 1024) takes 173.19 s` ... `torch.compile took 181.20 s in total` ... `init engine (profile, create kv cache, warmup model) took 217.26 s (compilation: 181.20 s)`. The serve script now mounts - `FRANK_PRIMARY_CACHE_DIR` at `/root/.cache` — the **parent**, so the vLLM + `FRANK_ARCHON_CACHE_DIR` at `/root/.cache` — the **parent**, so the vLLM AOT/torch_compile tree (`VLLM_CACHE_ROOT`, default `/root/.cache/vllm`) and the comgr JIT cache both persist, and nothing is hidden because the image has no such directory. Same class of fix as the recipe's diff --git a/shared/grafana/provisioning/dashboards/llm-fleet.json b/shared/grafana/provisioning/dashboards/llm-fleet.json index dbe75f0..c2bf94c 100644 --- a/shared/grafana/provisioning/dashboards/llm-fleet.json +++ b/shared/grafana/provisioning/dashboards/llm-fleet.json @@ -1,7 +1,7 @@ { "uid": "llm-fleet", "title": "LLM fleet \u2014 capacity and reuse", - "description": "The signals that explain the LLM endpoints under load. One metric namespace: llamacpp:* across all three endpoints — frank-secondary (Dankclaw, RTX 3090), frank-large (Dankclaw, gfx1151 iGPU) and frank-primary (Dankserver, 2x R9700, llama.cpp again since the 2026-09-26 swap back from Lucebox DS4.1). The endpoint picker selects between them. See serverAppConfigs-docs/Infrastructure/Observability.md for the namespace split and the addressability rules.", + "description": "The signals that explain the LLM endpoints under load. One metric namespace: llamacpp:* across all three endpoints — frank-zealot (Dankclaw, RTX 3090), frank-dragoon (Dankclaw, gfx1151 iGPU) and frank-archon (Dankserver, 2x R9700, llama.cpp again since the 2026-09-26 swap back from Lucebox DS4.1). The endpoint picker selects between them. See serverAppConfigs-docs/Infrastructure/Observability.md for the namespace split and the addressability rules.", "tags": [ "llm", "capacity" @@ -110,7 +110,7 @@ "id": 3, "type": "timeseries", "title": "Requests waiting (queue depth)", - "description": "llama.cpp: anything above zero means the engine is serialising (with --parallel 1 a second concurrent request always shows up here). All three endpoints are llama.cpp since the 2026-09-26 frank-primary swap.", + "description": "llama.cpp: anything above zero means the engine is serialising (with --parallel 1 a second concurrent request always shows up here). All three endpoints are llama.cpp since the 2026-09-26 frank-archon swap.", "gridPos": { "h": 8, "w": 12, @@ -166,7 +166,7 @@ "id": 5, "type": "timeseries", "title": "Decode steps and batch size", - "description": "Per-step counters: steps per second and the busy-slot count per step (the effective batch). With frank-primary's --parallel 1 the slot count stays at 0 or 1 and says nothing about the card; with frank-secondary's 4 slots it tracks the agent-fleet burst shape.", + "description": "Per-step counters: steps per second and the busy-slot count per step (the effective batch). With frank-archon's --parallel 1 the slot count stays at 0 or 1 and says nothing about the card; with frank-zealot's 4 slots it tracks the agent-fleet burst shape.", "gridPos": { "h": 8, "w": 12, diff --git a/shared/prometheus/prometheus.yml b/shared/prometheus/prometheus.yml index d1db406..cb750fc 100644 --- a/shared/prometheus/prometheus.yml +++ b/shared/prometheus/prometheus.yml @@ -32,7 +32,7 @@ scrape_configs: # bridge container, and on this netavark host a container can only reach the # host's LAN IP at a PUBLISHED port — node-exporter's net=host bind on # 192.168.0.143:9100 is refused by construction (the same rule that sends - # frank-large and frank-secondary to the gateway below). node-dankserver is a + # frank-dragoon and frank-zealot to the gateway below). node-dankserver is a # different machine, so its LAN address works. - job_name: "node-dankclaw" static_configs: @@ -79,55 +79,55 @@ scrape_configs: # this container, not the guarded vhosts: these are machine clients and # Prometheus cannot solve an Anubis challenge. # - # One metric namespace: llamacpp:* — frank-large, frank-secondary and - # frank-primary, all llama.cpp with /metrics (the family verified from + # One metric namespace: llamacpp:* — frank-dragoon, frank-zealot and + # frank-archon, all llama.cpp with /metrics (the family verified from # /metrics on 2026-09-16 and 2026-09-20) and all exporting # requests_deferred (the queue depth, the only form llama.cpp shows the # capacity wall in), spec_decode_num_drafts_total, tokens_predicted_total, # and the prompt_tokens_cached_total / prompt_tokens_total reuse pair. # - # frank-large and frank-secondary are scraped over host.containers.internal, + # frank-dragoon and frank-zealot are scraped over host.containers.internal, # not their own LAN addresses: this Prometheus is a bridge-networked # container (Network=dankclaw_default), and on this netavark host a # container can only reach the host's LAN IP at a PUBLISHED port — a # host-process bind like llama-server's 0.0.0.0:7770 is refused at # 192.168.0.143:7770 while it answers at 169.254.1.2:7770. That is - # why frank-secondary was red here for days (up{job="frank-secondary"} == 0, + # why frank-zealot was red here for days (up{job="frank-zealot"} == 0, # "dial tcp 192.168.0.143:7771") even though the endpoint was healthy and # exporting: the target address was unreachable by construction, not the # service down. Same host, same rule, so both local endpoints use the # gateway. # - # (2026-10-05) frank-primary LEFT the llamacpp family with FreeToken + # (2026-10-05) frank-archon LEFT the llamacpp family with FreeToken # (the PR587 ROCm engine then serving it had NO /metrics — the job # scraped 404s forever, a structural never-green) and RE-JOINED the same # day on the radiance engine: its exporter speaks vLLM-compatible names # plus radiance:* families, a different namespace — hence the separate # job below, not a re-add to the llamacpp pair. The netavark quirk above # is same-host only; plain LAN routing REACHES 192.168.0.235:7770. - - job_name: "frank-secondary" + - job_name: "frank-zealot" metrics_path: "/metrics" static_configs: - targets: ["host.containers.internal:7771"] labels: - service: frank-secondary + service: frank-zealot - - job_name: "frank-large" + - job_name: "frank-dragoon" metrics_path: "/metrics" static_configs: - targets: ["host.containers.internal:7770"] labels: - service: frank-large + service: frank-dragoon - # frank-primary (dankserver) — the radiance engine since 2026-10-05. + # frank-archon (dankserver) — the radiance engine since 2026-10-05. # A DIFFERENT host, so plain LAN routing is correct here (the # host.containers.internal trick is same-host only): health answers at # 192.168.0.235:7770 from this bridge container. Radiance exports # vLLM-compatible names plus radiance:* families — NOT the llamacpp:* # namespace, so llm-fleet rules must not be pointed at this target. - - job_name: "frank-primary" + - job_name: "frank-archon" metrics_path: "/metrics" static_configs: - targets: ["192.168.0.235:7770"] labels: - service: frank-primary + service: frank-archon diff --git a/shared/prometheus/rules/llm-fleet.yml b/shared/prometheus/rules/llm-fleet.yml index e48e679..e843b68 100644 --- a/shared/prometheus/rules/llm-fleet.yml +++ b/shared/prometheus/rules/llm-fleet.yml @@ -1,8 +1,8 @@ # Alerting and recording rules for the LLM fleet. # -# One metric namespace: llamacpp:* — frank-secondary and frank-large, both +# One metric namespace: llamacpp:* — frank-zealot and frank-dragoon, both # llama.cpp with /metrics (the family verified from /metrics on 2026-09-16 -# and 2026-09-20). frank-primary LEFT the family 2026-10-05: FreeToken (the +# and 2026-09-20). frank-archon LEFT the family 2026-10-05: FreeToken (the # PR587 ROCm engine) has no /metrics endpoint, so its scrape job was # deleted rather than left never-green. # (The netavark published-port quirk that forces the Dankclaw endpoints @@ -110,8 +110,8 @@ groups: annotations: summary: "{{ $labels.job }}: scrape target down for 2 minutes" description: >- - Prometheus cannot reach the LLM endpoint. frank-secondary and - frank-large are root units on Dankclaw: `systemctl is-active - frank-secondary` / `frank-large`. Both scraped endpoints export - the llamacpp:* family. (frank-primary left the scrape set + Prometheus cannot reach the LLM endpoint. frank-zealot and + frank-dragoon are root units on Dankclaw: `systemctl is-active + frank-zealot` / `frank-dragoon`. Both scraped endpoints export + the llamacpp:* family. (frank-archon left the scrape set 2026-10-05 — FreeToken exports no /metrics.) diff --git a/tests/autoresearch_measure.bats b/tests/autoresearch_measure.bats index 1a7afa9..b87e2b4 100755 --- a/tests/autoresearch_measure.bats +++ b/tests/autoresearch_measure.bats @@ -1,7 +1,7 @@ #!/usr/bin/env bats # Seam: autoresearch measure client behavior. # -# The measure client is the whole yardstick of the frank-primary speed +# The measure client is the whole yardstick of the frank-archon speed # session, so its METRIC arithmetic gets a behavior test: against a # deterministic mock endpoint that emits a KNOWN number of completion # tokens at a KNOWN per-token delay, the reported decode rate must land @@ -16,7 +16,7 @@ load helpers -MEASURE="$REPO_ROOT/scripts/autoresearch/frank-primary-measure.py" +MEASURE="$REPO_ROOT/scripts/autoresearch/frank-archon-measure.py" MOCK="$BATS_TEST_TMPDIR/mock.py" PORT="" MOCK_PID="" diff --git a/tests/changed_tests.bats b/tests/changed_tests.bats index 731bb82..eec3888 100644 --- a/tests/changed_tests.bats +++ b/tests/changed_tests.bats @@ -21,16 +21,16 @@ load helpers [[ "$output" != *"tests/homepage_pages.bats"* ]] } -@test "changed-test wrapper maps the frank-primary trio to its focused tests" { +@test "changed-test wrapper maps the frank-archon trio to its focused tests" { # The root-unit shape since the 2026-09-26 swap: the trio lives in # scripts/ and must select the unit seam before the generic # scripts/*.service fallbacks can swallow it. run bash "$REPO_ROOT/scripts/test-changed.sh" --list --paths \ - scripts/frank-primary.env \ - scripts/frank-primary.service \ - scripts/serve-frank-primary.sh + scripts/frank-archon.env \ + scripts/frank-archon.service \ + scripts/serve-frank-archon.sh [ "$status" -eq 0 ] - [[ "$output" == *"tests/frank_primary_unit.bats"* ]] + [[ "$output" == *"tests/frank_archon_unit.bats"* ]] [[ "$output" == *"tests/llm_units.bats"* ]] [[ "$output" == *"tests/deployment_scoping.bats"* ]] [[ "$output" != *"tests/homepage_pages.bats"* ]] @@ -42,8 +42,8 @@ load helpers run bash "$REPO_ROOT/scripts/test-changed.sh" --list --paths \ dankserver/.AGENTTRASH/20260926-frank-medium-radiance/frank-medium.container \ scripts/.AGENTTRASH/20260920-llama-layersplit/serve-frank-medium.sh.llamacpp-layersplit \ - dankserver/.AGENTTRASH/20260926-llamacpp-cutover/frank-primary.container + dankserver/.AGENTTRASH/20260926-llamacpp-cutover/frank-archon.container [ "$status" -eq 0 ] [[ "$output" != *"tests/frank_medium_unit.bats"* ]] - [[ "$output" != *"tests/frank_primary_unit.bats"* ]] + [[ "$output" != *"tests/frank_archon_unit.bats"* ]] } diff --git a/tests/deployment_flow.bats b/tests/deployment_flow.bats index afde086..c529dd5 100644 --- a/tests/deployment_flow.bats +++ b/tests/deployment_flow.bats @@ -68,13 +68,13 @@ load helpers } @test "remote runner has a handler per inference service" { - grep -q 'deploy_llm_large' "$REPO_ROOT/scripts/deploy-remote.sh" - grep -q 'deploy_llm_primary' "$REPO_ROOT/scripts/deploy-remote.sh" - grep -q 'deploy_llm_secondary' "$REPO_ROOT/scripts/deploy-remote.sh" + grep -q 'deploy_llm_dragoon' "$REPO_ROOT/scripts/deploy-remote.sh" + grep -q 'deploy_llm_archon' "$REPO_ROOT/scripts/deploy-remote.sh" + grep -q 'deploy_llm_zealot' "$REPO_ROOT/scripts/deploy-remote.sh" } @test "inference restarts are absent from the top-level dispatcher" { - ! grep -qE 'systemctl .*restart (frank-medium|frank-large|frank-npu)' "$REPO_ROOT/scripts/deploy.sh" + ! grep -qE 'systemctl .*restart (frank-medium|frank-dragoon|frank-npu)' "$REPO_ROOT/scripts/deploy.sh" } @test "remote runner health-checks an inference endpoint" { diff --git a/tests/deployment_scoping.bats b/tests/deployment_scoping.bats index 9a39f49..5c2e24c 100644 --- a/tests/deployment_scoping.bats +++ b/tests/deployment_scoping.bats @@ -18,9 +18,9 @@ REMOTE_DEPLOY="$REPO_ROOT/scripts/deploy-remote.sh" @test "deployment planner maps large-model changes to the large model only" { run python3 "$PLANNER" --target dankclaw --paths \ - scripts/frank-large.env + scripts/frank-dragoon.env [ "$status" -eq 0 ] - [ "$output" = "frank-large" ] + [ "$output" = "frank-dragoon" ] } @test "the retired NPU endpoint is absent from the deployment inventory" { @@ -31,7 +31,7 @@ REMOTE_DEPLOY="$REPO_ROOT/scripts/deploy-remote.sh" @test "the retired ik chat template plans nothing, and its archive is still here" { # scripts/chat-template.jinja existed only for the ik_llama.cpp runtime # (retired 2026-09-16 in favour of halogen-flash-server again). The - # llama.cpp frank-secondary runtime serves the template the GGUF itself + # llama.cpp frank-zealot runtime serves the template the GGUF itself # carries, which is the one with reasoning_effort, preserve_thinking and # the tool-call grammar. Editing the archive must deploy nothing -- and the # archive must still be present, so this cannot pass by the file having @@ -63,36 +63,36 @@ REMOTE_DEPLOY="$REPO_ROOT/scripts/deploy-remote.sh" [ -z "$output" ] } -@test "deployment planner maps the frank-primary trio to frank-primary only" { +@test "deployment planner maps the frank-archon trio to frank-archon only" { # The root-unit shape since the 2026-09-26 swap: unit, env and serve - # script live in scripts/ and select exactly frank-primary. The + # script live in scripts/ and select exactly frank-archon. The # download script fetches host-side state and must select nothing, and # the lucebox quadlet-era tree in dated trash plans nothing either. run python3 "$PLANNER" --target dankserver --paths \ - scripts/frank-primary.env \ - scripts/frank-primary.service \ - scripts/serve-frank-primary.sh + scripts/frank-archon.env \ + scripts/frank-archon.service \ + scripts/serve-frank-archon.sh [ "$status" -eq 0 ] - [ "$output" = "frank-primary" ] + [ "$output" = "frank-archon" ] run python3 "$PLANNER" --target dankserver --paths \ - scripts/download-frank-primary.sh \ - dankserver/.AGENTTRASH/20260926-llamacpp-cutover/frank-primary.container + scripts/download-frank-archon.sh \ + dankserver/.AGENTTRASH/20260926-llamacpp-cutover/frank-archon.container [ "$status" -eq 0 ] [ -z "$output" ] } @test "the small endpoint is Dankclaw's again, and Dankserver's copy stays retired" { run python3 "$PLANNER" --target dankclaw --paths \ - scripts/frank-secondary.env scripts/frank-secondary.service scripts/serve-frank-secondary.sh + scripts/frank-zealot.env scripts/frank-zealot.service scripts/serve-frank-zealot.sh [ "$status" -eq 0 ] - [ "$output" = "frank-secondary" ] + [ "$output" = "frank-zealot" ] - # frank-secondary runs on Dankclaw on the RTX 3090; the Dankserver endpoint of + # frank-zealot runs on Dankclaw on the RTX 3090; the Dankserver endpoint of # that name was retired with the FreeToken runtime on 2026-09-15 and must # not come back through a planner mapping. run python3 "$PLANNER" --target dankserver --paths \ - scripts/frank-secondary.env scripts/frank-secondary.service scripts/serve-frank-secondary.sh + scripts/frank-zealot.env scripts/frank-zealot.service scripts/serve-frank-zealot.sh [ "$status" -eq 0 ] [ -z "$output" ] } @@ -205,8 +205,8 @@ REMOTE_DEPLOY="$REPO_ROOT/scripts/deploy-remote.sh" @test "remote deployer routes inference restarts through selected handlers" { # The runner may restart inference only from the service-dispatch path. It # must not contain a host-wide restart loop. - grep -q 'deploy_llm_large' "$REMOTE_DEPLOY" - grep -q 'deploy_llm_primary' "$REMOTE_DEPLOY" + grep -q 'deploy_llm_dragoon' "$REMOTE_DEPLOY" + grep -q 'deploy_llm_archon' "$REMOTE_DEPLOY" grep -q 'deploy_service' "$REMOTE_DEPLOY" ! grep -qE 'for .*frank-(small|large|npu)-?' "$REMOTE_DEPLOY" } diff --git a/tests/frank_primary_unit.bats b/tests/frank_archon_unit.bats similarity index 65% rename from tests/frank_primary_unit.bats rename to tests/frank_archon_unit.bats index 0abc696..36283eb 100755 --- a/tests/frank_primary_unit.bats +++ b/tests/frank_archon_unit.bats @@ -1,11 +1,11 @@ #!/usr/bin/env bats -# Seam: frank-primary — the Dankserver LLM endpoint on :7770. +# Seam: frank-archon — the Dankserver LLM endpoint on :7770. # # This file asserts the RADIANCE shape (StillDeadcode engine, digest-pinned # stilldeadcode/radiance image, BOTH R9700s TP=2 on the wht6 wire, the # OFFICIAL Qwen/Qwen3.8-Flash-Next-FP8 at native block-FP8 precision in a # rad-convert container). It replaces the FreeToken seam of 2026-10-05 -# (git tag frank-primary-freetoken-pr587-20261005) and pins what flags +# (git tag frank-archon-freetoken-pr587-20261005) and pins what flags # alone do not say: the served window clears the harness worst case, the # pinned-host ledger has a ttm pages cap floor and the serve script # ENFORCES it, the served window is what models.yml must quote, the host- @@ -20,16 +20,16 @@ load helpers -UNIT="$REPO_ROOT/scripts/frank-primary.service" -SERVE="$REPO_ROOT/scripts/serve-frank-primary.sh" -ENV_FILE="$REPO_ROOT/scripts/frank-primary.env" +UNIT="$REPO_ROOT/scripts/frank-archon.service" +SERVE="$REPO_ROOT/scripts/serve-frank-archon.sh" +ENV_FILE="$REPO_ROOT/scripts/frank-archon.env" REMOTE_DEPLOY="$REPO_ROOT/scripts/deploy-remote.sh" -DOWNLOAD="$REPO_ROOT/scripts/download-frank-primary-swift15.sh" +DOWNLOAD="$REPO_ROOT/scripts/download-frank-archon-swift15.sh" BUILD="$REPO_ROOT/scripts/convert-swift15-w4dn8.sh" HFGET="$REPO_ROOT/scripts/hfget.sh" TEMPLATE="$REPO_ROOT/scripts/qwen38-froggeric-v22.5.jinja" -@test "frank-primary unit, serve script, env, fetch and build scripts and template exist" { +@test "frank-archon unit, serve script, env, fetch and build scripts and template exist" { [ -f "$UNIT" ] [ -x "$SERVE" ] [ -f "$ENV_FILE" ] @@ -40,11 +40,11 @@ TEMPLATE="$REPO_ROOT/scripts/qwen38-froggeric-v22.5.jinja" # The FreeToken-era Dockerfile is retired with the runtime it built: # the radiance image is the publisher's, pulled and digest-pinned, not # built on the host. - [ ! -f "$REPO_ROOT/scripts/docker/frank-primary-freetoken.Dockerfile" ] + [ ! -f "$REPO_ROOT/scripts/docker/frank-archon-freetoken.Dockerfile" ] } -@test "frank-primary unit is boot-persistent, self-healing and unprivileged" { - # Root unit parity with frank-large/frank-secondary: enable is the [Install] +@test "frank-archon unit is boot-persistent, self-healing and unprivileged" { + # Root unit parity with frank-dragoon/frank-zealot: enable is the [Install] # section, the restart policy survives a crash, and the pinned host RAM # (expert pools + PLE table + prefix host tier, ~132 GiB) needs an # unbounded memlock (a root unit grants it via PID1; the dank session's @@ -70,9 +70,9 @@ TEMPLATE="$REPO_ROOT/scripts/qwen38-froggeric-v22.5.jinja" grep -q '^LimitMEMLOCK=infinity$' "$UNIT" } -@test "frank-primary runs the repo's own serve script with the repo's env" { - grep -q '^ExecStart=/home/dank/serverAppConfigs/scripts/serve-frank-primary.sh$' "$UNIT" - grep -q 'FRANK_PRIMARY_ENV_FILE=/home/dank/serverAppConfigs/scripts/frank-primary.env' "$UNIT" +@test "frank-archon runs the repo's own serve script with the repo's env" { + grep -q '^ExecStart=/home/dank/serverAppConfigs/scripts/serve-frank-archon.sh$' "$UNIT" + grep -q 'FRANK_ARCHON_ENV_FILE=/home/dank/serverAppConfigs/scripts/frank-archon.env' "$UNIT" } @test "the unit stops the container child explicitly — container identity is the unit name" { @@ -81,9 +81,9 @@ TEMPLATE="$REPO_ROOT/scripts/qwen38-froggeric-v22.5.jinja" # outlives the unit and holds the GPU. The container name IS the # service name across runtimes (Frank's 2026-10-05 call). grep -q '^ExecStop=/usr/bin/podman stop' "$UNIT" - grep -q 'podman stop -t 120 frank-primary$' "$UNIT" - grep -q '^FRANK_PRIMARY_CONTAINER=frank-primary$' "$ENV_FILE" - grep -q 'frank-primary-qwen' "$ENV_FILE" + grep -q 'podman stop -t 120 frank-archon$' "$UNIT" + grep -q '^FRANK_ARCHON_CONTAINER=frank-archon$' "$ENV_FILE" + grep -q 'frank-archon-qwen' "$ENV_FILE" } @test "the serve shape is direct podman run, not a launcher or a predecessor runtime" { @@ -106,7 +106,7 @@ TEMPLATE="$REPO_ROOT/scripts/qwen38-froggeric-v22.5.jinja" @test "the image is the publisher's, digest-pinned by manifest" { # stilldeadcode/radiance@sha256:<64 hex> — a name@digest ref exists in # storage only if THAT manifest was pulled. The tag form would float. - grep -qE '^FRANK_PRIMARY_IMAGE=stilldeadcode/radiance@sha256:[0-9a-f]{64}$' "$ENV_FILE" + grep -qE '^FRANK_ARCHON_IMAGE=stilldeadcode/radiance@sha256:[0-9a-f]{64}$' "$ENV_FILE" } @test "the radiance engine shape is in the env file" { @@ -115,65 +115,65 @@ TEMPLATE="$REPO_ROOT/scripts/qwen38-froggeric-v22.5.jinja" # prompt can legally reach that height — 140,492 + 36,864 = 177,356 at # the FreeToken-era window was the record; the same relation must hold # here (140,000 + 36,864 = 176,864 <= 200,000). - grep -q '^FRANK_PRIMARY_MAX_MODEL_LEN=200000$' "$ENV_FILE" - ml=$(awk -F= '/^FRANK_PRIMARY_MAX_MODEL_LEN=/{print $2}' "$ENV_FILE") + grep -q '^FRANK_ARCHON_MAX_MODEL_LEN=200000$' "$ENV_FILE" + ml=$(awk -F= '/^FRANK_ARCHON_MAX_MODEL_LEN=/{print $2}' "$ENV_FILE") [ "$ml" -ge 177356 ] # Decode-sweep shape (2026-10-06): 3 slots, spec depth 2 — the measured # optimum (33.06 t/s). The fused TP all-reduce is declared over # seqs x (1 + spec) rows = 9. - grep -q '^FRANK_PRIMARY_MAX_SEQS=3$' "$ENV_FILE" - grep -q '^FRANK_PRIMARY_TP=2$' "$ENV_FILE" - grep -q '^FRANK_PRIMARY_TP_WIRE=wht6$' "$ENV_FILE" - grep -q '^FRANK_PRIMARY_SPEC_TOKENS=2$' "$ENV_FILE" + grep -q '^FRANK_ARCHON_MAX_SEQS=3$' "$ENV_FILE" + grep -q '^FRANK_ARCHON_TP=2$' "$ENV_FILE" + grep -q '^FRANK_ARCHON_TP_WIRE=wht6$' "$ENV_FILE" + grep -q '^FRANK_ARCHON_SPEC_TOKENS=2$' "$ENV_FILE" # Native-precision economics: the expert pool is per rank (56.4 GiB # slice per rank at TP2), the PLE ngram table is pinned in host RAM per # Frank's law, KV is fp8, the ratio is the publisher's production # value. - grep -q '^FRANK_PRIMARY_PLACEMENT=expert_tiered$' "$ENV_FILE" - grep -q '^FRANK_PRIMARY_HOST_POOL_MIB=40960$' "$ENV_FILE" - grep -q '^FRANK_PRIMARY_VRAM_WEIGHTS_MIB=[1-9]' "$ENV_FILE" - grep -q '^FRANK_PRIMARY_VRAM_KV_MIB=[1-9]' "$ENV_FILE" - grep -q '^FRANK_PRIMARY_KV_DTYPE=fp8$' "$ENV_FILE" - grep -q '^FRANK_PRIMARY_NGRAM_PLACEMENT=ram$' "$ENV_FILE" + grep -q '^FRANK_ARCHON_PLACEMENT=expert_tiered$' "$ENV_FILE" + grep -q '^FRANK_ARCHON_HOST_POOL_MIB=40960$' "$ENV_FILE" + grep -q '^FRANK_ARCHON_VRAM_WEIGHTS_MIB=[1-9]' "$ENV_FILE" + grep -q '^FRANK_ARCHON_VRAM_KV_MIB=[1-9]' "$ENV_FILE" + grep -q '^FRANK_ARCHON_KV_DTYPE=fp8$' "$ENV_FILE" + grep -q '^FRANK_ARCHON_NGRAM_PLACEMENT=ram$' "$ENV_FILE" # Prefix cache tiers (publisher pattern; disk tier sized for 2 slots). - grep -q '^FRANK_PRIMARY_PREFIX_HOST_MIB=4096$' "$ENV_FILE" - grep -q '^FRANK_PRIMARY_PREFIX_DISK_MIB=65536$' "$ENV_FILE" + grep -q '^FRANK_ARCHON_PREFIX_HOST_MIB=4096$' "$ENV_FILE" + grep -q '^FRANK_ARCHON_PREFIX_DISK_MIB=65536$' "$ENV_FILE" # The pinned ledger (2 x pool + 47.7 GiB PLE + prefix host) must be # under the ttm pages cap, and the env states the floor the serve # script enforces (>= 140,000 MiB — the current cap ~123 GiB fails it, # which is the point). - grep -q '^FRANK_PRIMARY_TTM_MIN_MIB=' "$ENV_FILE" - ttmm=$(awk -F= '/^FRANK_PRIMARY_TTM_MIN_MIB=/{print $2}' "$ENV_FILE") - pool=$(awk -F= '/^FRANK_PRIMARY_HOST_POOL_MIB=/{print $2}' "$ENV_FILE") - ph=$(awk -F= '/^FRANK_PRIMARY_PREFIX_HOST_MIB=/{print $2}' "$ENV_FILE") + grep -q '^FRANK_ARCHON_TTM_MIN_MIB=' "$ENV_FILE" + ttmm=$(awk -F= '/^FRANK_ARCHON_TTM_MIN_MIB=/{print $2}' "$ENV_FILE") + pool=$(awk -F= '/^FRANK_ARCHON_HOST_POOL_MIB=/{print $2}' "$ENV_FILE") + ph=$(awk -F= '/^FRANK_ARCHON_PREFIX_HOST_MIB=/{print $2}' "$ENV_FILE") # 2 pools + PLE 47.7 GiB (48,824 MiB) + prefix host, rounded up. ledger=$(( 2 * pool + 48824 + ph + 2048 )) [ "$ttmm" -ge "$ledger" ] # The .rad size floor is positive (a truncated convert must fail fast). - grep -q '^FRANK_PRIMARY_RAD_MIN_MIB=' "$ENV_FILE" - [ "$(awk -F= '/^FRANK_PRIMARY_RAD_MIN_MIB=/{print $2}' "$ENV_FILE")" -gt 0 ] + grep -q '^FRANK_ARCHON_RAD_MIN_MIB=' "$ENV_FILE" + [ "$(awk -F= '/^FRANK_ARCHON_RAD_MIN_MIB=/{print $2}' "$ENV_FILE")" -gt 0 ] } @test "the serve script wires the engine flags from the env" { - grep -q -- '--model "/models/$FRANK_PRIMARY_MODEL_FILE"' "$SERVE" - grep -q -- '--served-model-name "$FRANK_PRIMARY_SERVED_NAME"' "$SERVE" - grep -q -- '--host :: --port "$FRANK_PRIMARY_PORT"' "$SERVE" + grep -q -- '--model "/models/$FRANK_ARCHON_MODEL_FILE"' "$SERVE" + grep -q -- '--served-model-name "$FRANK_ARCHON_SERVED_NAME"' "$SERVE" + grep -q -- '--host :: --port "$FRANK_ARCHON_PORT"' "$SERVE" grep -q -- '--override-chat-template /templates/template.jinja' "$SERVE" - grep -q -- '--tp "$FRANK_PRIMARY_TP" --tp-wire "$FRANK_PRIMARY_TP_WIRE"' "$SERVE" - grep -q -- '--max-num-seqs "$FRANK_PRIMARY_MAX_SEQS"' "$SERVE" - grep -q -- '--max-model-len "$FRANK_PRIMARY_MAX_MODEL_LEN"' "$SERVE" - grep -q -- '--placement "$FRANK_PRIMARY_PLACEMENT"' "$SERVE" - grep -q -- '--host-pool-mib "$FRANK_PRIMARY_HOST_POOL_MIB"' "$SERVE" - grep -q -- '--vram-weights-mib "$FRANK_PRIMARY_VRAM_WEIGHTS_MIB"' "$SERVE" - grep -q -- '--vram-kv-mib "$FRANK_PRIMARY_VRAM_KV_MIB"' "$SERVE" - grep -q -- '--kv-cache-dtype "$FRANK_PRIMARY_KV_DTYPE"' "$SERVE" - grep -q -- '--prefix-cache-host-mib "$FRANK_PRIMARY_PREFIX_HOST_MIB"' "$SERVE" - grep -q -- '--prefix-cache-disk-mib "$FRANK_PRIMARY_PREFIX_DISK_MIB"' "$SERVE" - grep -q -- '--ngram-placement "$FRANK_PRIMARY_NGRAM_PLACEMENT"' "$SERVE" - grep -q -- '--num-speculative-tokens "$FRANK_PRIMARY_SPEC_TOKENS"' "$SERVE" + grep -q -- '--tp "$FRANK_ARCHON_TP" --tp-wire "$FRANK_ARCHON_TP_WIRE"' "$SERVE" + grep -q -- '--max-num-seqs "$FRANK_ARCHON_MAX_SEQS"' "$SERVE" + grep -q -- '--max-model-len "$FRANK_ARCHON_MAX_MODEL_LEN"' "$SERVE" + grep -q -- '--placement "$FRANK_ARCHON_PLACEMENT"' "$SERVE" + grep -q -- '--host-pool-mib "$FRANK_ARCHON_HOST_POOL_MIB"' "$SERVE" + grep -q -- '--vram-weights-mib "$FRANK_ARCHON_VRAM_WEIGHTS_MIB"' "$SERVE" + grep -q -- '--vram-kv-mib "$FRANK_ARCHON_VRAM_KV_MIB"' "$SERVE" + grep -q -- '--kv-cache-dtype "$FRANK_ARCHON_KV_DTYPE"' "$SERVE" + grep -q -- '--prefix-cache-host-mib "$FRANK_ARCHON_PREFIX_HOST_MIB"' "$SERVE" + grep -q -- '--prefix-cache-disk-mib "$FRANK_ARCHON_PREFIX_DISK_MIB"' "$SERVE" + grep -q -- '--ngram-placement "$FRANK_ARCHON_NGRAM_PLACEMENT"' "$SERVE" + grep -q -- '--num-speculative-tokens "$FRANK_ARCHON_SPEC_TOKENS"' "$SERVE" # The boot-ladder escape hatch is opt-in: unset renders NO extra argv. - grep -q -- '${FRANK_PRIMARY_EXTRA_ARGS:+$FRANK_PRIMARY_EXTRA_ARGS}' "$SERVE" - ! grep -q '^FRANK_PRIMARY_EXTRA_ARGS=.' "$ENV_FILE" + grep -q -- '${FRANK_ARCHON_EXTRA_ARGS:+$FRANK_ARCHON_EXTRA_ARGS}' "$SERVE" + ! grep -q '^FRANK_ARCHON_EXTRA_ARGS=.' "$ENV_FILE" } @test "the container contract is the publisher's (host network, io_uring, pin, cards)" { @@ -185,16 +185,16 @@ TEMPLATE="$REPO_ROOT/scripts/qwen38-froggeric-v22.5.jinja" grep -q -- '--network host' "$SERVE" ! grep -q -- '--publish' "$SERVE" ! grep -q -- '-p 7770' "$SERVE" - grep -q '^FRANK_PRIMARY_PORT=7770$' "$ENV_FILE" - grep -q '^FRANK_PRIMARY_SERVED_NAME=frank-archon$' "$ENV_FILE" + grep -q '^FRANK_ARCHON_PORT=7770$' "$ENV_FILE" + grep -q '^FRANK_ARCHON_SERVED_NAME=frank-archon$' "$ENV_FILE" grep -q -- '--init' "$SERVE" grep -q -- '--security-opt seccomp=unconfined' "$SERVE" grep -q -- '--ulimit memlock=-1' "$SERVE" grep -q -- '--device /dev/kfd' "$SERVE" grep -q -- '--device /dev/dri' "$SERVE" - grep -q -- '-v "$FRANK_PRIMARY_MODEL_DIR":/models:ro' "$SERVE" - grep -q -- '-v "$FRANK_PRIMARY_STATE_DIR":/data' "$SERVE" - grep -q -- '-v "$FRANK_PRIMARY_TEMPLATE":/templates/template.jinja:ro' "$SERVE" + grep -q -- '-v "$FRANK_ARCHON_MODEL_DIR":/models:ro' "$SERVE" + grep -q -- '-v "$FRANK_ARCHON_STATE_DIR":/data' "$SERVE" + grep -q -- '-v "$FRANK_ARCHON_TEMPLATE":/templates/template.jinja:ro' "$SERVE" } @test "parsers are AUTO — the engine infers them natively, the harness maps the field" { @@ -206,8 +206,8 @@ TEMPLATE="$REPO_ROOT/scripts/qwen38-froggeric-v22.5.jinja" ! grep -q -- '--reasoning-parser' "$SERVE" ! grep -q -- '--tool-call-parser' "$SERVE" ! grep -q -- '--enable-auto-tool-choice' "$SERVE" - ! grep -q 'FRANK_PRIMARY_REASONING_PARSER' "$ENV_FILE" - ! grep -q 'FRANK_PRIMARY_TOOL_PARSER' "$ENV_FILE" + ! grep -q 'FRANK_ARCHON_REASONING_PARSER' "$ENV_FILE" + ! grep -q 'FRANK_ARCHON_TOOL_PARSER' "$ENV_FILE" } @test "the serve script gates the image, the .rad payload, the template and the GPU nodes" { @@ -215,12 +215,12 @@ TEMPLATE="$REPO_ROOT/scripts/qwen38-froggeric-v22.5.jinja" # .rad file and its size floor — a truncated convert would otherwise be # a guaranteed long-timeout boot instead of a fast failure. The ttm # preflight refuses to start under a pages cap below the pinned ledger. - grep -q 'FRANK_PRIMARY_IMAGE' "$SERVE" + grep -q 'FRANK_ARCHON_IMAGE' "$SERVE" grep -q 'podman image exists' "$SERVE" - grep -q 'FRANK_PRIMARY_MODEL_FILE' "$SERVE" - grep -q 'FRANK_PRIMARY_RAD_MIN_MIB' "$SERVE" - grep -q 'FRANK_PRIMARY_TEMPLATE' "$SERVE" - grep -q 'FRANK_PRIMARY_TTM_MIN_MIB' "$SERVE" + grep -q 'FRANK_ARCHON_MODEL_FILE' "$SERVE" + grep -q 'FRANK_ARCHON_RAD_MIN_MIB' "$SERVE" + grep -q 'FRANK_ARCHON_TEMPLATE' "$SERVE" + grep -q 'FRANK_ARCHON_TTM_MIN_MIB' "$SERVE" grep -q 'pages_limit' "$SERVE" grep -q 'pages_max' "$SERVE" grep -q '/dev/kfd' "$SERVE" @@ -231,20 +231,20 @@ TEMPLATE="$REPO_ROOT/scripts/qwen38-froggeric-v22.5.jinja" # A crashed unit can leave the container name registered forever after; # the legacy identities hold the same GPUs and die here too. Then block # on the container so a crash is a nonzero ExecStart. - grep -q 'FRANK_PRIMARY_LEGACY_CONTAINERS' "$ENV_FILE" - grep -q 'frank-primary-qwen' "$ENV_FILE" - grep -q 'frank-primary-r9v' "$ENV_FILE" + grep -q 'FRANK_ARCHON_LEGACY_CONTAINERS' "$ENV_FILE" + grep -q 'frank-archon-qwen' "$ENV_FILE" + grep -q 'frank-archon-r9v' "$ENV_FILE" grep -q 'qwen-fp8' "$ENV_FILE" - grep -q 'exec podman wait "$FRANK_PRIMARY_CONTAINER"' "$SERVE" + grep -q 'exec podman wait "$FRANK_ARCHON_CONTAINER"' "$SERVE" } @test "the model id matches the payload's build and fetch scripts" { # The payload dir/file are the convert script's output layout; the fetch # script must name the repo the convert stages from. (FP8-native era, - # the rollback payload, keeps its own trio: build-frank-primary-rad.sh + - # download-frank-primary.sh.) - grep -q '^FRANK_PRIMARY_MODEL_DIR=/home/dank/models/rad$' "$ENV_FILE" - grep -q '^FRANK_PRIMARY_MODEL_FILE=qwen4exp-swift15-w4dn8-i8-hc8m.rad$' "$ENV_FILE" + # the rollback payload, keeps its own trio: build-frank-archon-rad.sh + + # download-frank-archon.sh.) + grep -q '^FRANK_ARCHON_MODEL_DIR=/home/dank/models/rad$' "$ENV_FILE" + grep -q '^FRANK_ARCHON_MODEL_FILE=qwen4exp-swift15-w4dn8-i8-hc8m.rad$' "$ENV_FILE" grep -q 'qwen4exp-swift15-w4dn8-i8-hc8m.rad' "$BUILD" grep -q 'ukisai/Swift1.5-Qwen3.8-Flash-Next' "$DOWNLOAD" grep -q 'hfget.sh' "$DOWNLOAD" @@ -255,7 +255,7 @@ TEMPLATE="$REPO_ROOT/scripts/qwen38-froggeric-v22.5.jinja" @test "no bare HIP-reserved env var is defined" { # HIP reads bare TEMP for its JIT cache path (2026-08-13: TEMP=1.0 # segfaulted every load), and HOST/GPU_MAX_HEAP_SIZE are the same - # class. Every key here is FRANK_PRIMARY_-prefixed. + # class. Every key here is FRANK_ARCHON_-prefixed. ! grep -qE '^(TEMP|HOST|GPU_MAX_HEAP_SIZE)=' "$ENV_FILE" ! grep -qE '^(export )?(TEMP|HOST|GPU_MAX_HEAP_SIZE)=' "$SERVE" } @@ -265,18 +265,18 @@ TEMPLATE="$REPO_ROOT/scripts/qwen38-froggeric-v22.5.jinja" # storage or the .rad is missing/too small — then clears stale # containers (including the legacy identities), waits out the port, # relinks/enables/restarts the root unit and health-gates it. - grep -q 'LLM_PRIMARY_CONTAINER=frank-primary$' "$REMOTE_DEPLOY" - grep -q 'FRANK_PRIMARY_IMAGE' "$REMOTE_DEPLOY" + grep -q 'LLM_ARCHON_CONTAINER=frank-archon$' "$REMOTE_DEPLOY" + grep -q 'FRANK_ARCHON_IMAGE' "$REMOTE_DEPLOY" grep -q 'podman image exists' "$REMOTE_DEPLOY" - grep -q 'FRANK_PRIMARY_MODEL_FILE' "$REMOTE_DEPLOY" - grep -q 'FRANK_PRIMARY_RAD_MIN_MIB' "$REMOTE_DEPLOY" - grep -q 'frank-primary-qwen' "$REMOTE_DEPLOY" + grep -q 'FRANK_ARCHON_MODEL_FILE' "$REMOTE_DEPLOY" + grep -q 'FRANK_ARCHON_RAD_MIN_MIB' "$REMOTE_DEPLOY" + grep -q 'frank-archon-qwen' "$REMOTE_DEPLOY" grep -q 'qwen-fp8' "$REMOTE_DEPLOY" grep -q 'glm-probe' "$REMOTE_DEPLOY" grep -q 'wait_port_free 7770' "$REMOTE_DEPLOY" - grep -q 'relink_unit frank-primary' "$REMOTE_DEPLOY" - grep -q 'systemctl enable frank-primary.service' "$REMOTE_DEPLOY" - grep -q 'systemctl restart frank-primary.service' "$REMOTE_DEPLOY" + grep -q 'relink_unit frank-archon' "$REMOTE_DEPLOY" + grep -q 'systemctl enable frank-archon.service' "$REMOTE_DEPLOY" + grep -q 'systemctl restart frank-archon.service' "$REMOTE_DEPLOY" # The health gate is a bare curl: the HTTP listener binds AFTER the # full load (main.cpp — engine.start() then engine.serve()), so during # load the port refuses connections and a bare curl is honest. The @@ -289,6 +289,6 @@ TEMPLATE="$REPO_ROOT/scripts/qwen38-froggeric-v22.5.jinja" # The 2026-09-26 false green: a leftover probe held :7770 and satisfied # the health curl while the real unit was stopped. The deploy is only # green when the unit's own MainPID is live behind the health answer. - grep -q 'systemctl show -p MainPID --value frank-primary.service' "$REMOTE_DEPLOY" + grep -q 'systemctl show -p MainPID --value frank-archon.service' "$REMOTE_DEPLOY" grep -q 'stray process holds the port' "$REMOTE_DEPLOY" } diff --git a/tests/frank_large_unit.bats b/tests/frank_dragoon_unit.bats similarity index 77% rename from tests/frank_large_unit.bats rename to tests/frank_dragoon_unit.bats index e0fa765..9ce038d 100755 --- a/tests/frank_large_unit.bats +++ b/tests/frank_dragoon_unit.bats @@ -1,5 +1,5 @@ #!/usr/bin/env bats -# Seam: frank-large serves the Quat3rnion ABLITERATED Swift1.5 finetune of +# Seam: frank-dragoon serves the Quat3rnion ABLITERATED Swift1.5 finetune of # peonist's Qwen3.8-Flash-Next v2 checkpoint (a .hgn flash-server payload) # on the Strix Halo iGPU through the halogen-flash-server CONTAINER (0.16.2, # digest-pinned), driven by the root unit's serve script — two 262,144-token @@ -22,9 +22,9 @@ setup() { ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/.." && pwd)" - SERVE="$ROOT/scripts/serve-frank-large.sh" - ENV_FILE="$ROOT/scripts/frank-large.env" - UNIT="$ROOT/scripts/frank-large.service" + SERVE="$ROOT/scripts/serve-frank-dragoon.sh" + ENV_FILE="$ROOT/scripts/frank-dragoon.env" + UNIT="$ROOT/scripts/frank-dragoon.service" DEPLOYER="$ROOT/scripts/deploy-remote.sh" BUILD="$ROOT/scripts/build-rocmfpx.sh" TEST_TMP="$(mktemp -d)" @@ -63,47 +63,47 @@ good_env() { # the artifact gates below are the thing under test. printf 'MemTotal: 127108112 kB\nMemAvailable: 100000000 kB\n' > "$TEST_TMP/meminfo" GOOD_ENV=( - "FRANK_LARGE_ENV_FILE=$TEST_TMP/empty.env" - "FRANK_LARGE_IMAGE=ghcr.io/peonist-ai/halogen-flash-server@sha256:cafe" - "FRANK_LARGE_CONTAINER=frank-large-halogen" - "FRANK_LARGE_LEGACY_CONTAINERS=frank-large" - "FRANK_LARGE_DEV_KFD=$TEST_TMP/qwen.hgn" - "FRANK_LARGE_DEV_DRI=$TEST_TMP" - "FRANK_LARGE_LOG=$TEST_TMP/serve.log" - "FRANK_LARGE_PUBLISH=7770:8731" - "FRANK_LARGE_MODEL_DIR=$TEST_TMP" - "FRANK_LARGE_CHECKPOINT=qwen.hgn" - "FRANK_LARGE_CHECKPOINT_BYTES=0" - "FRANK_LARGE_NGRAM_TABLE=ngram.hgn" - "FRANK_LARGE_NGRAM_BYTES=0" - "FRANK_LARGE_VISION_TOWER=vision.hgn" - "FRANK_LARGE_VISION_BYTES=0" - "FRANK_LARGE_TOKENIZER_FILES=tok.json" + "FRANK_DRAGOON_ENV_FILE=$TEST_TMP/empty.env" + "FRANK_DRAGOON_IMAGE=ghcr.io/peonist-ai/halogen-flash-server@sha256:cafe" + "FRANK_DRAGOON_CONTAINER=frank-dragoon-halogen" + "FRANK_DRAGOON_LEGACY_CONTAINERS=frank-dragoon" + "FRANK_DRAGOON_DEV_KFD=$TEST_TMP/qwen.hgn" + "FRANK_DRAGOON_DEV_DRI=$TEST_TMP" + "FRANK_DRAGOON_LOG=$TEST_TMP/serve.log" + "FRANK_DRAGOON_PUBLISH=7770:8731" + "FRANK_DRAGOON_MODEL_DIR=$TEST_TMP" + "FRANK_DRAGOON_CHECKPOINT=qwen.hgn" + "FRANK_DRAGOON_CHECKPOINT_BYTES=0" + "FRANK_DRAGOON_NGRAM_TABLE=ngram.hgn" + "FRANK_DRAGOON_NGRAM_BYTES=0" + "FRANK_DRAGOON_VISION_TOWER=vision.hgn" + "FRANK_DRAGOON_VISION_BYTES=0" + "FRANK_DRAGOON_TOKENIZER_FILES=tok.json" "HALOGEN_MODEL_ID=frank-dragoon" "HALOGEN_CTX=262144" "HALOGEN_KV_POOL_POSITIONS=524288" "HALOGEN_KV_SLOTS=2" "HALOGEN_SPEC_ADAPT=0" "HALOGEN_MAX_TOK=8192" - "FRANK_LARGE_MEMINFO=$TEST_TMP/meminfo" + "FRANK_DRAGOON_MEMINFO=$TEST_TMP/meminfo" "STUB_DIGESTS=localhost/x ghcr.io/peonist-ai/halogen-flash-server@sha256:cafe" ) } @test "the env file defines the flash-server deployment values" { - grep -qE '^FRANK_LARGE_IMAGE=ghcr\.io/peonist-ai/halogen-flash-server@sha256:[0-9a-f]{64}$' "$ENV_FILE" - grep -qE '^FRANK_LARGE_CONTAINER=frank-large-halogen$' "$ENV_FILE" - grep -qE '^FRANK_LARGE_PUBLISH=7770:8731$' "$ENV_FILE" - grep -qE '^FRANK_LARGE_CHECKPOINT=.*\.hgn$' "$ENV_FILE" - grep -qE '^FRANK_LARGE_CHECKPOINT_BYTES=[0-9]+$' "$ENV_FILE" - grep -qE '^FRANK_LARGE_CHECKPOINT_SHA256=[0-9a-f]{64}$' "$ENV_FILE" - grep -qE '^FRANK_LARGE_NGRAM_TABLE=.*\.hgn$' "$ENV_FILE" - grep -qE '^FRANK_LARGE_NGRAM_BYTES=[0-9]+$' "$ENV_FILE" - grep -qE '^FRANK_LARGE_NGRAM_SHA256=[0-9a-f]{64}$' "$ENV_FILE" - grep -qE '^FRANK_LARGE_VISION_TOWER=.*\.hgn$' "$ENV_FILE" - grep -qE '^FRANK_LARGE_VISION_BYTES=[0-9]+$' "$ENV_FILE" - grep -qE '^FRANK_LARGE_VISION_SHA256=[0-9a-f]{64}$' "$ENV_FILE" - grep -qE '^FRANK_LARGE_TOKENIZER_FILES="tokenizer\.json( [a-z_.]+)+"$' "$ENV_FILE" + grep -qE '^FRANK_DRAGOON_IMAGE=ghcr\.io/peonist-ai/halogen-flash-server@sha256:[0-9a-f]{64}$' "$ENV_FILE" + grep -qE '^FRANK_DRAGOON_CONTAINER=frank-dragoon-halogen$' "$ENV_FILE" + grep -qE '^FRANK_DRAGOON_PUBLISH=7770:8731$' "$ENV_FILE" + grep -qE '^FRANK_DRAGOON_CHECKPOINT=.*\.hgn$' "$ENV_FILE" + grep -qE '^FRANK_DRAGOON_CHECKPOINT_BYTES=[0-9]+$' "$ENV_FILE" + grep -qE '^FRANK_DRAGOON_CHECKPOINT_SHA256=[0-9a-f]{64}$' "$ENV_FILE" + grep -qE '^FRANK_DRAGOON_NGRAM_TABLE=.*\.hgn$' "$ENV_FILE" + grep -qE '^FRANK_DRAGOON_NGRAM_BYTES=[0-9]+$' "$ENV_FILE" + grep -qE '^FRANK_DRAGOON_NGRAM_SHA256=[0-9a-f]{64}$' "$ENV_FILE" + grep -qE '^FRANK_DRAGOON_VISION_TOWER=.*\.hgn$' "$ENV_FILE" + grep -qE '^FRANK_DRAGOON_VISION_BYTES=[0-9]+$' "$ENV_FILE" + grep -qE '^FRANK_DRAGOON_VISION_SHA256=[0-9a-f]{64}$' "$ENV_FILE" + grep -qE '^FRANK_DRAGOON_TOKENIZER_FILES="tokenizer\.json( [a-z_.]+)+"$' "$ENV_FILE" grep -qE '^HALOGEN_MODEL_ID=frank-dragoon$' "$ENV_FILE" grep -qE '^HALOGEN_CTX=[0-9]+$' "$ENV_FILE" } @@ -131,7 +131,7 @@ good_env() { podman_stub good_env run env PATH="$TEST_TMP/bin:$PATH" "${GOOD_ENV[@]}" \ - FRANK_LARGE_DEV_KFD="$TEST_TMP/absent-node" "$SERVE" + FRANK_DRAGOON_DEV_KFD="$TEST_TMP/absent-node" "$SERVE" [ "$status" -ne 0 ] [[ "$output" == *"no gfx1151 to serve on"* ]] } @@ -142,7 +142,7 @@ good_env() { # ~28 KiB/position (FLAGS.md). Against it: ~62 GiB resident weights, # the arena scratch 3.8 + 8.4*(MAX_TOK/16384) GiB, the vision tower # ~2 GiB pool charge, the 20 GiB host reserve and the host baseline - # + co-tenancy (frank-secondary, ComfyUI, Caddy/observability) ~15. The + # + co-tenancy (frank-zealot, ComfyUI, Caddy/observability) ~15. The # box has 121 GiB unified. The n-gram table rides as mmap'd page # cache beside the checkpoint and is not a pinned charge (the card's # own quickstart arithmetic does not bill it). @@ -171,10 +171,10 @@ good_env() { podman_stub good_env run env PATH="$TEST_TMP/bin:$PATH" "${GOOD_ENV[@]}" \ - FRANK_LARGE_CHECKPOINT=absent.hgn "$SERVE" + FRANK_DRAGOON_CHECKPOINT=absent.hgn "$SERVE" [ "$status" -ne 0 ] [[ "$output" == *"checkpoint"*"missing"* ]] - [[ "$output" == *"download-frank-large-flashnext.sh"* ]] + [[ "$output" == *"download-frank-dragoon-flashnext.sh"* ]] } @test "the serve script refuses a checkpoint of the wrong byte count" { @@ -183,7 +183,7 @@ good_env() { podman_stub good_env run env PATH="$TEST_TMP/bin:$PATH" "${GOOD_ENV[@]}" \ - FRANK_LARGE_CHECKPOINT_BYTES=42 "$SERVE" + FRANK_DRAGOON_CHECKPOINT_BYTES=42 "$SERVE" [ "$status" -ne 0 ] [[ "$output" == *"expected 42"* ]] } @@ -195,11 +195,11 @@ good_env() { podman_stub good_env run env PATH="$TEST_TMP/bin:$PATH" "${GOOD_ENV[@]}" \ - FRANK_LARGE_NGRAM_TABLE=absent.hgn "$SERVE" + FRANK_DRAGOON_NGRAM_TABLE=absent.hgn "$SERVE" [ "$status" -ne 0 ] [[ "$output" == *"n-gram-table"*"missing"* ]] run env PATH="$TEST_TMP/bin:$PATH" "${GOOD_ENV[@]}" \ - FRANK_LARGE_NGRAM_BYTES=42 "$SERVE" + FRANK_DRAGOON_NGRAM_BYTES=42 "$SERVE" [ "$status" -ne 0 ] [[ "$output" == *"expected 42"* ]] } @@ -211,11 +211,11 @@ good_env() { podman_stub good_env run env PATH="$TEST_TMP/bin:$PATH" "${GOOD_ENV[@]}" \ - FRANK_LARGE_VISION_TOWER=absent.hgn "$SERVE" + FRANK_DRAGOON_VISION_TOWER=absent.hgn "$SERVE" [ "$status" -ne 0 ] [[ "$output" == *"vision-tower"*"missing"* ]] run env PATH="$TEST_TMP/bin:$PATH" "${GOOD_ENV[@]}" \ - FRANK_LARGE_VISION_BYTES=42 "$SERVE" + FRANK_DRAGOON_VISION_BYTES=42 "$SERVE" [ "$status" -ne 0 ] [[ "$output" == *"expected 42"* ]] } @@ -244,7 +244,7 @@ good_env() { good_env printf 'MemTotal: 127108112 kB\nMemAvailable: 10000000 kB\n' > "$TEST_TMP/meminfo-short" run env PATH="$TEST_TMP/bin:$PATH" "${GOOD_ENV[@]}" \ - FRANK_LARGE_MEMINFO="$TEST_TMP/meminfo-short" FRANK_LARGE_RAM_WAIT=0 "$SERVE" + FRANK_DRAGOON_MEMINFO="$TEST_TMP/meminfo-short" FRANK_DRAGOON_RAM_WAIT=0 "$SERVE" [ "$status" -ne 0 ] [[ "$output" == *"pin gate"* ]] [[ "$output" == *"refusing to start"* ]] @@ -260,7 +260,7 @@ good_env() { # lands there, so the render assertions read the same log. output="$output $(cat "$TEST_TMP/serve.log")" - [[ "$output" == *"--name frank-large-halogen"* ]] + [[ "$output" == *"--name frank-dragoon-halogen"* ]] [[ "$output" == *"--publish 7770:8731"* ]] [[ "$output" == *"-e HALOGEN_MODEL_ID=frank-dragoon"* ]] [[ "$output" == *"-e HALOGEN_CTX=262144"* ]] @@ -293,7 +293,7 @@ $(cat "$TEST_TMP/serve.log")" # both monotone maxima of est + budget (est ≤ 217088 − 4096): # full budget at the compaction threshold: 1.03*184524 + 45056 # clamped budget at the clamp's zero point: 1.03*212992 + 0 - # and the compaction request that rides on frank-secondary (its + # and the compaction request that rides on frank-zealot (its # 200,704-token slot) must fit: input ≈ threshold − keepRecent(20k). grep -qE '^HALOGEN_CTX=262144$' "$ENV_FILE" ctx=262144 @@ -317,41 +317,41 @@ $(cat "$TEST_TMP/serve.log")" # Serve and deploy must name the SAME image digest, checkpoint and # tokenizer: the 2026-10-01 crash-loop was exactly these twins # disagreeing mid-cutover. - img="$(sed -nE 's/^FRANK_LARGE_IMAGE=(.*)$/\1/p' "$ENV_FILE")" - grep -qF "LLM_LARGE_IMAGE=\"\${LLM_LARGE_IMAGE:-$img}\"" "$DEPLOYER" - dir="$(sed -nE 's/^FRANK_LARGE_MODEL_DIR=(.*)$/\1/p' "$ENV_FILE")" - ckpt="$(sed -nE 's/^FRANK_LARGE_CHECKPOINT=(.*)$/\1/p' "$ENV_FILE")" - tokf="$(sed -nE 's/^FRANK_LARGE_TOKENIZER_FILES=\"(.*)\"$/\1/p' "$ENV_FILE")" - grep -qF "LLM_LARGE_TOK_DIR=\"\${LLM_LARGE_TOK_DIR:-$dir/tokenizer}\"" "$DEPLOYER" - grep -qF "LLM_LARGE_TOK_FILES=\"\${LLM_LARGE_TOK_FILES:-$tokf}\"" "$DEPLOYER" - bytes="$(sed -nE 's/^FRANK_LARGE_CHECKPOINT_BYTES=([0-9]+)$/\1/p' "$ENV_FILE")" - grep -qF "LLM_LARGE_CKPT_BYTES=\"\${LLM_LARGE_CKPT_BYTES:-$bytes}\"" "$DEPLOYER" + img="$(sed -nE 's/^FRANK_DRAGOON_IMAGE=(.*)$/\1/p' "$ENV_FILE")" + grep -qF "LLM_DRAGOON_IMAGE=\"\${LLM_DRAGOON_IMAGE:-$img}\"" "$DEPLOYER" + dir="$(sed -nE 's/^FRANK_DRAGOON_MODEL_DIR=(.*)$/\1/p' "$ENV_FILE")" + ckpt="$(sed -nE 's/^FRANK_DRAGOON_CHECKPOINT=(.*)$/\1/p' "$ENV_FILE")" + tokf="$(sed -nE 's/^FRANK_DRAGOON_TOKENIZER_FILES=\"(.*)\"$/\1/p' "$ENV_FILE")" + grep -qF "LLM_DRAGOON_TOK_DIR=\"\${LLM_DRAGOON_TOK_DIR:-$dir/tokenizer}\"" "$DEPLOYER" + grep -qF "LLM_DRAGOON_TOK_FILES=\"\${LLM_DRAGOON_TOK_FILES:-$tokf}\"" "$DEPLOYER" + bytes="$(sed -nE 's/^FRANK_DRAGOON_CHECKPOINT_BYTES=([0-9]+)$/\1/p' "$ENV_FILE")" + grep -qF "LLM_DRAGOON_CKPT_BYTES=\"\${LLM_DRAGOON_CKPT_BYTES:-$bytes}\"" "$DEPLOYER" } @test "the deployer points a missing artifact at the flashnext fetch script" { - grep -qE 'download-frank-large-flashnext\.sh' "$DEPLOYER" + grep -qE 'download-frank-dragoon-flashnext\.sh' "$DEPLOYER" grep -qE 'podman pull' "$DEPLOYER" } -@test "the stray sweep cannot take frank-secondary or the deployer down" { - # frank-secondary also listens on this host (7771, llama-server) and the - # deployer's own command line contains "frank-large"; only the FULL +@test "the stray sweep cannot take frank-zealot or the deployer down" { + # frank-zealot also listens on this host (7771, llama-server) and the + # deployer's own command line contains "frank-dragoon"; only the FULL # container name matches a stray manual flash-server run and nothing # else. - grep -q "pkill -f 'frank-large-halogen'" "$DEPLOYER" + grep -q "pkill -f 'frank-dragoon-halogen'" "$DEPLOYER" ! grep -qE "pkill -f 'llama-server'" "$DEPLOYER" - ! grep -qE "pkill -f 'frank-large'" "$DEPLOYER" + ! grep -qE "pkill -f 'frank-dragoon'" "$DEPLOYER" } @test "the deployed unit keeps the fleet's restart and boot-persistence shape" { grep -qE '^Restart=(always|on-failure)$' "$UNIT" grep -qE '^WantedBy=' "$UNIT" - grep -qE '^ExecStart=.*/serve-frank-large\.sh$' "$UNIT" + grep -qE '^ExecStart=.*/serve-frank-dragoon\.sh$' "$UNIT" grep -qE '^User=dank$' "$UNIT" grep -qE '^LimitMEMLOCK=infinity$' "$UNIT" # The service's lifetime is the container's; stopping the service # must stop the container by its real name. - grep -qE '^ExecStop=.*podman stop .* frank-large-halogen$' "$UNIT" + grep -qE '^ExecStop=.*podman stop .* frank-dragoon-halogen$' "$UNIT" } @test "the unit runs the flash-server runtime and no retired path" { diff --git a/tests/frank_secondary_unit.bats b/tests/frank_zealot_unit.bats similarity index 87% rename from tests/frank_secondary_unit.bats rename to tests/frank_zealot_unit.bats index 870b94e..a5e28be 100755 --- a/tests/frank_secondary_unit.bats +++ b/tests/frank_zealot_unit.bats @@ -1,5 +1,5 @@ -# Seam: the frank-secondary llama.cpp root unit on dankclaw. -# frank-secondary is the RTX 3090 endpoint; since 2026-10-07 it serves +# Seam: the frank-zealot llama.cpp root unit on dankclaw. +# frank-zealot is the RTX 3090 endpoint; since 2026-10-07 it serves # HauhauCS's Qwen3.5-9B-Uncensored-HauhauCS-Aggressive (Q6_K, qwen35 hybrid: # 32 layers, 8 full-attention + 24 Gated DeltaNet, no MTP tensors in the file) # via the CUDA (sm_86) build of llama.cpp master: TWO 200,704-token @@ -13,11 +13,11 @@ load helpers -UNIT="$REPO_ROOT/scripts/frank-secondary.service" -SERVE="$REPO_ROOT/scripts/serve-frank-secondary.sh" -ENV_FILE="$REPO_ROOT/scripts/frank-secondary.env" +UNIT="$REPO_ROOT/scripts/frank-zealot.service" +SERVE="$REPO_ROOT/scripts/serve-frank-zealot.sh" +ENV_FILE="$REPO_ROOT/scripts/frank-zealot.env" REMOTE_DEPLOY="$REPO_ROOT/scripts/deploy-remote.sh" -ENV_LARGE="$REPO_ROOT/scripts/frank-large.env" +ENV_LARGE="$REPO_ROOT/scripts/frank-dragoon.env" setup() { STAGE="$(mktemp -d)" @@ -64,7 +64,7 @@ SPEC_DRAFT_N_MAX=$(sed -nE 's/^SPEC_DRAFT_N_MAX=([0-9]+)$/\1/p' "$ENV_FILE") VERBOSITY=$(sed -nE 's/^VERBOSITY=([0-9]+)$/\1/p' "$ENV_FILE") NGL=$(sed -nE 's/^NGL=([0-9]+)$/\1/p' "$ENV_FILE") EOF - run env FRANK_SECONDARY_ENV_FILE="$envf" nvidia-modprobe=true bash "$SERVE" + run env FRANK_ZEALOT_ENV_FILE="$envf" nvidia-modprobe=true bash "$SERVE" } argv_value() { @@ -76,23 +76,23 @@ argv_value() { # append a drafter) must exec through this, not serve_argv — which silently # undoes the mutation and makes the assertion a tautology. run_stage() { - run env FRANK_SECONDARY_ENV_FILE="$STAGE/test.env" nvidia-modprobe=true bash "$SERVE" + run env FRANK_ZEALOT_ENV_FILE="$STAGE/test.env" nvidia-modprobe=true bash "$SERVE" } -@test "frank-secondary unit, serve script and env exist in scripts/" { +@test "frank-zealot unit, serve script and env exist in scripts/" { [ -f "$UNIT" ] [ -f "$SERVE" ] [ -f "$ENV_FILE" ] } -@test "frank-secondary is boot-persistent, self-healing and unprivileged" { +@test "frank-zealot is boot-persistent, self-healing and unprivileged" { grep -q '^WantedBy=multi-user.target$' "$UNIT" grep -q '^Restart=' "$UNIT" grep -q '^RestartSec=' "$UNIT" grep -q '^User=dank$' "$UNIT" grep -q '^LimitMEMLOCK=infinity$' "$UNIT" - grep -q '^ExecStart=/home/dank/serverAppConfigs/scripts/serve-frank-secondary.sh$' "$UNIT" - grep -q 'FRANK_SECONDARY_ENV_FILE=/home/dank/serverAppConfigs/scripts/frank-secondary.env' "$UNIT" + grep -q '^ExecStart=/home/dank/serverAppConfigs/scripts/serve-frank-zealot.sh$' "$UNIT" + grep -q 'FRANK_ZEALOT_ENV_FILE=/home/dank/serverAppConfigs/scripts/frank-zealot.env' "$UNIT" } @test "the shipped env points at the llama.cpp runtime and the Qwen3.5-9B Q6_K GGUF" { @@ -107,7 +107,7 @@ run_stage() { # would be gating on a file nobody reads — and a missing projector would # ship a blind endpoint. local env_v dep_v path pair - for pair in "MODEL_FILE LLM_SECONDARY_MODEL_FILE" "MMPROJ_FILE LLM_SECONDARY_MMPROJ"; do + for pair in "MODEL_FILE LLM_ZEALOT_MODEL_FILE" "MMPROJ_FILE LLM_ZEALOT_MMPROJ"; do env_v="${pair%% *}" dep_v="${pair##* }" path="$(sed -nE "s/^${env_v}=(.+)$/\1/p" "$ENV_FILE")" @@ -236,7 +236,7 @@ run_stage() { # The documented opt-out must reach the engine as ABSENCE of the flag, # not as an argument pointing at an empty string. sed -i 's|^MMPROJ_FILE=.*|MMPROJ_FILE=|' "$STAGE/test.env" - run env FRANK_SECONDARY_ENV_FILE="$STAGE/test.env" nvidia-modprobe=true bash "$SERVE" + run env FRANK_ZEALOT_ENV_FILE="$STAGE/test.env" nvidia-modprobe=true bash "$SERVE" [ "$status" -eq 0 ] ! grep -qxF -- '--mmproj' <<<"$output" } @@ -256,30 +256,30 @@ run_stage() { rm -f "$MODEL_DIR/$MM_STUB" serve_argv [ "$status" -ne 0 ] - [[ "$output" == *"frank-secondary: missing"* ]] + [[ "$output" == *"frank-zealot: missing"* ]] rm -f "$RUNTIME_DIR/bin/llama-server" serve_argv [ "$status" -ne 0 ] - [[ "$output" == *"frank-secondary: missing"* ]] + [[ "$output" == *"frank-zealot: missing"* ]] } @test "the deploy handler gates on binary, GGUF and projector, then MainPID-hardens health" { - grep -q 'deploy_llm_secondary' "$REMOTE_DEPLOY" - grep -q 'LLM_SECONDARY_RUNTIME' "$REMOTE_DEPLOY" - grep -q 'LLM_SECONDARY_MODEL_FILE' "$REMOTE_DEPLOY" - grep -q 'LLM_SECONDARY_MMPROJ' "$REMOTE_DEPLOY" - grep -q 'relink_unit frank-secondary' "$REMOTE_DEPLOY" - grep -q 'systemctl enable frank-secondary.service' "$REMOTE_DEPLOY" + grep -q 'deploy_llm_zealot' "$REMOTE_DEPLOY" + grep -q 'LLM_ZEALOT_RUNTIME' "$REMOTE_DEPLOY" + grep -q 'LLM_ZEALOT_MODEL_FILE' "$REMOTE_DEPLOY" + grep -q 'LLM_ZEALOT_MMPROJ' "$REMOTE_DEPLOY" + grep -q 'relink_unit frank-zealot' "$REMOTE_DEPLOY" + grep -q 'systemctl enable frank-zealot.service' "$REMOTE_DEPLOY" grep -q '127.0.0.1:7771/health' "$REMOTE_DEPLOY" - grep -q 'frank-secondary.service has no MainPID' "$REMOTE_DEPLOY" + grep -q 'frank-zealot.service has no MainPID' "$REMOTE_DEPLOY" } @test "the two endpoints keep separate ports and the large handler never pkills llama-server" { - # frank-large's sweeps must not take down frank-secondary, whose + # frank-dragoon's sweeps must not take down frank-zealot, whose # process is llama-server on the SAME host. grep -q '^LISTEN_PORT=7771$' "$ENV_FILE" local large - large="$(sed -n '/^deploy_llm_large() {/,/^}/p' "$REMOTE_DEPLOY")" + large="$(sed -n '/^deploy_llm_dragoon() {/,/^}/p' "$REMOTE_DEPLOY")" ! grep -q 'pkill -x llama-server' <<<"$large" } diff --git a/tests/hermes_webui.bats b/tests/hermes_webui.bats index b45866d..9018302 100644 --- a/tests/hermes_webui.bats +++ b/tests/hermes_webui.bats @@ -97,7 +97,7 @@ webui_service_yaml() { [ "$status" -eq 0 ] [ "$output" = "hermes" ] # And an unrelated service must not be dragged in. - ! grep -qE 'caddy|prometheus|frank-large' <<< "$output" + ! grep -qE 'caddy|prometheus|frank-dragoon' <<< "$output" } @test "remote deployer accepts and dispatches hermes-webui" { diff --git a/tests/observability_quadlet.bats b/tests/observability_quadlet.bats index 4202b5d..ff2d312 100755 --- a/tests/observability_quadlet.bats +++ b/tests/observability_quadlet.bats @@ -316,7 +316,7 @@ PAIRS @test "prometheus scrapes every LLM endpoint that exports metrics" { # The LLM endpoints are the services whose behaviour this fleet argues about # most (KV pressure, prefix-cache reuse, queue depth). Both Dankclaw - # endpoints export the llamacpp:* family. frank-primary LEFT the set + # endpoints export the llamacpp:* family. frank-archon LEFT the set # 2026-10-05: the FreeToken PR587 ROCm engine has NO /metrics endpoint — # scraping it was a structural never-green (404), so the job was deleted # rather than left vacuous (the Lucebox DS4.1 precedent, 2026-09-26). @@ -325,18 +325,18 @@ PAIRS # container, and on this netavark host a container can only reach the # host's LAN IP at a PUBLISHED port — a host-process bind like # llama-server's 0.0.0.0:7770 is refused at 192.168.0.143:7770 while it - # answers at 169.254.1.2:7770 (why frank-secondary stayed red by construction + # answers at 169.254.1.2:7770 (why frank-zealot stayed red by construction # for days until the 2026-09-20 /targets audit). local cfg="$REPO_ROOT/shared/prometheus/prometheus.yml" - grep -q '"host.containers.internal:7771"' "$cfg" || { echo "frank-secondary not scraped"; return 1; } - grep -q '"host.containers.internal:7770"' "$cfg" || { echo "frank-large not scraped"; return 1; } + grep -q '"host.containers.internal:7771"' "$cfg" || { echo "frank-zealot not scraped"; return 1; } + grep -q '"host.containers.internal:7770"' "$cfg" || { echo "frank-dragoon not scraped"; return 1; } ! grep -q '"192.168.0.235:7770"' "$cfg" grep -q '"host.containers.internal:7770,192.168.0.235:7770"' "$cfg" \ - && { echo "frank-primary folded into a Dankclaw gateway target"; return 1; } - for job in frank-secondary frank-large; do + && { echo "frank-archon folded into a Dankclaw gateway target"; return 1; } + for job in frank-zealot frank-dragoon; do grep -q "job_name: \"$job\"" "$cfg" || { echo "no scrape job for $job"; return 1; } done - ! grep -q 'job_name: "frank-primary"' "$cfg" + ! grep -q 'job_name: "frank-archon"' "$cfg" # None of them is reached through a guarded vhost: Prometheus cannot solve # an Anubis challenge, so a franksdank.cloud target is red by construction. ! grep -qE '^\s*-\s*"?https?://[^"]*franksdank' "$cfg" @@ -383,11 +383,11 @@ for want in ('job:llm_prefix_cache_reuse:rate5m', # Every rule must be keyed to a series that actually exists. A rule naming a # series nobody exports evaluates nothing forever and errors never — the # failure this seam exists for. Since the 2026-09-26 cutover the only scraped -# LLM runtime is llama.cpp (frank-secondary, frank-large); the vllm: family left +# LLM runtime is llama.cpp (frank-zealot, frank-dragoon); the vllm: family left # with frank-medium's radiance runtime and must not survive in any expr. exprs = [r.get('expr', '') for g in d['groups'] for r in g['rules']] # llama.cpp families measured from /metrics on 2026-09-16 and 2026-09-20 -# (frank-secondary, frank-large). Anything else is a guess. +# (frank-zealot, frank-dragoon). Anything else is a guess. live = {'llamacpp:prompt_tokens_total', 'llamacpp:prompt_tokens_cached_total', 'llamacpp:requests_deferred', 'llamacpp:requests_processing', 'llamacpp:spec_decode_num_drafts_total', diff --git a/tests/open_webui_quadlet.bats b/tests/open_webui_quadlet.bats index d77b867..d02bdf2 100644 --- a/tests/open_webui_quadlet.bats +++ b/tests/open_webui_quadlet.bats @@ -4,7 +4,7 @@ # The old open-webui was a bare container on dankserver (port 3000) pointing at a # dead LLM backend (:9090). This unit stands one up on dankclaw on a free port # (3005), on the CPU image (dankclaw is CPU-only), wired to the live -# llama.cpp backend (192.168.0.143:7770, model frank-large). +# llama.cpp backend (192.168.0.143:7770, model frank-dragoon). load helpers @@ -63,7 +63,7 @@ QDIR="$REPO_ROOT/dankclaw/open-webui/quadlet" # gateway (10.89.3.1) lives in the rootless netns, NOT the host netns # where llama-server runs -- it refuses. The host's LAN IP reaches it # through the rootless NAT (verified from the container, 2026-08-22). - # 2026-08-22: frank-large moved from :52625 to :7770. + # 2026-08-22: frank-dragoon moved from :52625 to :7770. grep -qE '^Environment=OPENAI_API_BASE_URL=http://192\.168\.0\.143:7770' \ "$QDIR/open-webui.container" \ || { echo "open-webui.container must set OPENAI_API_BASE_URL to the LLM at 192.168.0.143:7770"; return 1; }