diff --git a/scripts/deploy-remote.sh b/scripts/deploy-remote.sh index 4444b51..4fe482c 100755 --- a/scripts/deploy-remote.sh +++ b/scripts/deploy-remote.sh @@ -1277,11 +1277,14 @@ deploy_llm_zealot() { } # 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 +# digest-pinned stilldeadcode/radiance image) serving the PUBLISHER's +# 4-bit-codebook container of the official Qwen/Qwen3.8-Flash-Next +# (qwen3.8-next-flash-fp8-iq4r-moe.rad, fetched by +# scripts/download-frank-archon-iq4r.sh) 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-15 payload swap from the in-house w4dn8 (payload on disk = +# rollback). # 2026-10-05 cutover from FreeToken (pre-cutover tag # frank-archon-freetoken-pr587-20261005); before that, the tcclaviger vLLM # fork (tag frank-archon-vllm-shapeG-20261003). Same port and alias; the @@ -1290,7 +1293,7 @@ deploy_llm_zealot() { # Gates: the image must exist under its digest ref in dank's rootless # 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 +# a truncated fetch 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. @@ -1325,13 +1328,13 @@ deploy_llm_archon() { fi if [[ ! -f "$model_dir/$model_file" ]]; then echo "ERROR: .rad container missing: $model_dir/$model_file" >&2 - echo "frank-archon: run scripts/build-frank-archon-rad.sh" >&2 + echo "frank-archon: run scripts/download-frank-archon-iq4r.sh --fetch" >&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-archon: rebuild it (scripts/build-frank-archon-rad.sh --force)" >&2 + echo "frank-archon: re-fetch it (scripts/download-frank-archon-iq4r.sh --fetch; delete the staged file first if its sha256 failed)" >&2 return 1 fi diff --git a/scripts/download-frank-archon-iq4r.sh b/scripts/download-frank-archon-iq4r.sh new file mode 100755 index 0000000..12328da --- /dev/null +++ b/scripts/download-frank-archon-iq4r.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash +# download-frank-archon-iq4r.sh — payload fetch/verify for the frank-archon +# swap to the PUBLISHER's 4-bit-codebook container: +# StillDeadcode/qwen3.8-next-flash-fp8-iq4r-moe — the official +# Qwen/Qwen3.8-Flash-Next bf16 checkpoint rad-converted by the engine's own +# author into ONE .rad: routed experts as 4-bit codes into a 16-level +# non-uniform codebook (Walsh–Hadamard rotation, GPTQ + coordinate-descent, +# 10M-token calibration), ten bf16-protected experts per layer, int8 trunk + +# lm_head, fp8 HC mixtures, the PLE n-gram table at fp8 fixed scale, the MTP +# head, and the bf16 vision tower. File: +# qwen3.8-next-flash-fp8-iq4r-moe.rad — 121,969,901,568 B (113.6 GiB, +# 116,322 MiB), card KL 0.0789 all-tokens / top-1 92.85 % vs bf16. +# Repo is UNGATED — no token needed (never put one on the command line). +# +# bash scripts/download-frank-archon-iq4r.sh --fetch resume/complete +# bash scripts/download-frank-archon-iq4r.sh verify only +# +# Fetch uses the vendored scripts/hfget.sh (curl+jq only): per-file size +# checks against the Hub listing, `-C -` resume, disk-fit gate. The side +# files (LICENSE, README, the w4nl recipe) stay in the staging dir as +# provenance; the serve gate mounts ONLY /home/dank/models/rad, so the +# verified .rad alone moves into it. +# +# Verify (default) is the AGENTS.md law in two parts: the file lands at the +# final path with the Hub's EXACT byte count, and its sha256 equals the +# Hub's LFS oid. A truncated transfer is a guaranteed long-timeout boot +# without this gate. +set -euo pipefail + +REPO="StillDeadcode/qwen3.8-next-flash-fp8-iq4r-moe" +RAD_NAME="qwen3.8-next-flash-fp8-iq4r-moe.rad" +STAGE="/home/dank/models/StillDeadcode/qwen3.8-next-flash-fp8-iq4r-moe" +DEST="/home/dank/models/rad/$RAD_NAME" +SIZE=121969901568 +SHA256="0af5e96244e80c21ac8edca1719dae49b8a201b94a2f3994c3e24026ceaa4d20" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +mode="verify" +[[ "${1:-}" == "--fetch" ]] && mode="fetch" + +if [[ "$mode" == "fetch" ]]; then + # HFGET_JOBS=4 is hfget's default (a few streams saturate the link). + bash "$SCRIPT_DIR/hfget.sh" "$REPO" "$STAGE" main + + staged="$STAGE/$RAD_NAME" + if [[ ! -f "$staged" ]]; then + echo "FETCH FAILED: $staged absent after hfget" >&2 + exit 1 + fi + got=$(stat -c %s "$staged") + if [[ "$got" != "$SIZE" ]]; then + echo "FETCH FAILED: staged .rad is $got B, want $SIZE B" >&2 + exit 1 + fi + echo "staged .rad byte-exact ($SIZE B); hashing (one full read, minutes)" + got_sha=$(sha256sum "$staged" | cut -d' ' -f1) + if [[ "$got_sha" != "$SHA256" ]]; then + echo "FETCH FAILED: sha256 $got_sha, want $SHA256 — DELETE the staged" \ + "file before re-fetching (curl -C - cannot repair a corrupt body)" >&2 + exit 1 + fi + mkdir -p "$(dirname "$DEST")" + mv "$staged" "$DEST" + echo "payload placed: $DEST" +fi + +echo "verifying deployed payload: $DEST" +if [[ ! -f "$DEST" ]]; then + echo " BAD payload absent: $DEST" >&2 + exit 1 +fi +got=$(stat -c %s "$DEST") +if [[ "$got" != "$SIZE" ]]; then + echo " BAD payload is $got B, want $SIZE B" >&2 + exit 1 +fi +echo "byte-exact ($SIZE B); hashing (one full read, minutes)" +got_sha=$(sha256sum "$DEST" | cut -d' ' -f1) +if [[ "$got_sha" != "$SHA256" ]]; then + echo " BAD sha256 $got_sha, want $SHA256" >&2 + exit 1 +fi +echo "payload verified: $RAD_NAME, size and sha256 match the Hub LFS oid" diff --git a/scripts/frank-archon.env b/scripts/frank-archon.env index 3910b83..2f20824 100644 --- a/scripts/frank-archon.env +++ b/scripts/frank-archon.env @@ -1,7 +1,15 @@ -# frank-archon.env — radiance (StillDeadcode, Apache-2.0) serving -# ukisai/Swift1.5-Qwen3.8-Flash-Next converted to GPTQ w4 (MODEL_FILE below, -# built by scripts/convert-swift15-w4dn8.sh) on BOTH R9700s (TP=2), -# dankserver :7770. +# frank-archon.env — radiance (StillDeadcode, Apache-2.0) serving the +# PUBLISHER's 4-bit-codebook container of the official Qwen/Qwen3.8-Flash-Next +# (MODEL_FILE below, fetched by scripts/download-frank-archon-iq4r.sh) on +# BOTH R9700s (TP=2), dankserver :7770. +# 2026-10-15 PAYLOAD SWAP: the model moved from the in-house w4dn8 conversion +# of the Swift1.5 finetune to the engine author's published container +# qwen3.8-next-flash-fp8-iq4r-moe.rad (116,322 MiB, sha256-verified at fetch — +# the w4dn8 measured 116,416 MiB, so this shape carries over with 94 MiB to +# spare). NO argument changed: every number below is the 2026-10-13 shape, +# kept verbatim. The swap commit is the rollback (the w4dn8 payload stays on +# disk). + # # SHAPE (2026-10-13): THREE decode slots x 200,000 tokens, fp8 (quantized) KV, # with the per-card budget spent on resident experts: 25,600 MiB of slab + @@ -13,9 +21,11 @@ # +25 % at the full window) while KV beyond the contract buys nothing. # Consequence, deliberate: a FOURTH full-height conversation does not fit this # pair, and the engine refuses it — it never truncates. See the KV block for the -# arithmetic and the measured dtype law. The fp8-native payload this file was -# written for is the rollback target and keeps its own trio under the -# fp8-native runbook. +# arithmetic and the measured dtype law. The w4dn8 payload is the swap +# rollback and keeps its trio under the w4dn8 runbook; the fp8-native payload +# that came before it was DELETED from disk 2026-10-15 (Frank's call, to free +# the volume for this download — rebuildable via the fetch + build scripts +# named in the fp8-native runbook). # # 2026-10-05 cutover from FreeToken (PR #587 ROCm, one card, experts in # pinned host RAM; git tag frank-archon-freetoken-pr587-20261005 is the @@ -30,20 +40,30 @@ # (`X.weight_scale_inv` is the scale plane — checkpoint.h). The PLE n-gram # table (51B params, 47.7 GiB) is served from pinned host RAM via io_uring # reads — Frank's call: "Native FP8. Experts from ram. Pin the PLE to ram." -# The 4-bit-codebook publisher shape (qwen3.8-next-flash-fp8-iq4r-moe.rad, -# --host-pool-mib 12288) remains the documented fallback if the native -# container proves unbootable. +# THE 4-bit-codebook publisher shape is the DEPLOYED payload since +# 2026-10-15. The card's own run line (--host-pool-mib 12288, +# --expert-vs-cache-ratio 0.82, seqs 8, spec 3) is the publisher's +# suggestion on 32 GB cards; this file's shape is the fleet's measured one. # -# PAYLOAD: /home/dank/models/rad/qwen4exp-fp8-native.rad — a rad-convert -# NO-RECIPE pure copy of the official 131-shard checkpoint (every weight -# keeps its block-FP8 encoding; ~161 GiB). The convert runs against a -# staging dir whose config.json drops `quantization_config`: the descriptor -# string is only the plugin SELECTION key (spec §2.4 — exact match, no -# fallback), and no shipped plugin claims (qwen4exp, "fp8"); the shipped -# 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-archon-rad.sh (staging + convert + rad-info). +# PAYLOAD: /home/dank/models/rad/qwen3.8-next-flash-fp8-iq4r-moe.rad — the +# official Qwen3.8-Flash-Next bf16 checkpoint rad-converted by the engine's +# own author (recipe qwen4exp-w4nl64-i8-hc8m: experts as 4-bit codes into a +# 16-level non-uniform codebook after a 128-point Walsh–Hadamard rotation, +# GPTQ + 3 coordinate-descent sweeps on a 10M-token calibration, ten +# bf16-protected experts per layer, int8 W8A8 trunk + lm_head, fp8 HC +# mixtures, PLE n-gram fp8 fixed-scale, MTP head, bf16 vision tower; card KL +# 0.0789 all-tokens / top-1 92.85 % vs bf16). Fetched byte-exact + sha256 by +# scripts/download-frank-archon-iq4r.sh; the recipe/LICENSE stay in the +# staging dir beside it as provenance. ROLLBACK: revert the swap commit — the +# in-house qwen4exp-swift15-w4dn8-i8-hc8m.rad (scripts/convert-swift15-w4dn8.sh, +# KLD-gated) stays on disk. Behind it, the fp8-native +# qwen4exp-fp8-native.rad was DELETED from disk 2026-10-15 (Frank's call, +# one-time rm, to free the volume for this payload); rebuild = +# scripts/download-frank-archon.sh + scripts/build-frank-archon-rad.sh — a +# NO-RECIPE rad-convert copy of the official 131-shard checkpoint under the +# descriptor law (no shipped plugin claims (qwen4exp, "fp8"), so the staging +# config.json drops quantization_config; per-weight encodings are data, not +# the descriptor). # # SERVING FACTS (docs/GUIDE.md, docs/DOCKER.md, compose/flashnext.yaml): # - The HTTP listener binds AFTER the full load (main.cpp: engine.start() @@ -59,12 +79,12 @@ # enable_thinking, preserve_thinking (core/server/oai.cpp:194-205) — # models.yml's extraBody set is fully inside it. Unknown params are # refused (400), which is why nothing unverified rides the wire. -# - MTP: the official checkpoint carries the mtp.* head (3,101 tensors, -# mtp_num_hidden_layers=1) and the plugin probes draft depth 3 — the -# publisher's throughput peak for this model. Stated explicitly with -# --num-speculative-tokens 3. +# - MTP: the .rad carries the model's mtp.* head (the publisher's recipe +# names the mtp.fc_hidden/fc_embedding/draft_head rules; card default +# depth 3). Served at the depth named by FRANK_ARCHON_SPEC_TOKENS below — +# the depth this shape's decode ladder was measured at. # - The fused TP all-reduce is declared over max-num-seqs x -# (1 + --num-speculative-tokens) rows; 2 x 3 = 6 rows, under the 25-row +# (1 + --num-speculative-tokens) rows; 3 x (1+2) = 9 rows, under the 25-row # exactness bound of the wht6 wire. # Engine pin: Codeberg tag v1.0.13 (commit 53282fa), Docker Hub tag 1.0.13, # index digest below. REJECTED UPGRADE: 1.2.0 (sha256:665775ed1d90de6dbb @@ -88,7 +108,7 @@ FRANK_ARCHON_IMAGE=stilldeadcode/radiance@sha256:4c3f484564bb2872784e46b0a59cbd7 # .rad files; the raw HF download and its staging dir live beside it and # are never mounted. FRANK_ARCHON_MODEL_DIR=/home/dank/models/rad -FRANK_ARCHON_MODEL_FILE=qwen4exp-swift15-w4dn8-i8-hc8m.rad +FRANK_ARCHON_MODEL_FILE=qwen3.8-next-flash-fp8-iq4r-moe.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 @@ -242,9 +262,10 @@ FRANK_ARCHON_VRAM_KV_MIB=5120 # ledgers' `kv tier transfer` lines), so the host tier below parks twice as # many conversations as it did at bf16 — no re-size needed to park three slots. 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). +# Spec decode: the checkpoint's own MTP head, served at depth 2 — the +# publisher's card ships depth 3 as its peak; this fleet's ladder was +# measured at 2 and the swap keeps every argument, so 2 stays (rows +# 3 x (1+2) = 9, inside the wht6 25-row exactness bound). FRANK_ARCHON_SPEC_TOKENS=2 FRANK_ARCHON_MAX_BATCHED_TOKENS=2048 # Prefix cache tiers (publisher pattern). The host tier is sized in ENTRIES, @@ -278,9 +299,8 @@ FRANK_ARCHON_TTM_TARGET_MIB=204800 # multi-flag values as one string; the serve script expands it unquoted on # purpose. 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. +# The .rad's minimum size in MiB (deployer gate; a truncated fetch is a +# guaranteed long-timeout boot instead of a fast failure). The deployed +# publisher container measures 116,322 MiB (121,969,901,568 B); the +# in-house w4dn8 rollback measured 116,416 MiB. Floor sits just under both. FRANK_ARCHON_RAD_MIN_MIB=110000 diff --git a/scripts/frank-archon.service b/scripts/frank-archon.service index 47811ee..4b1eb80 100644 --- a/scripts/frank-archon.service +++ b/scripts/frank-archon.service @@ -1,9 +1,9 @@ # 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-archon-freetoken-pr587-20261005 is the pre-cutover state; the -# retired unit/env/serve trio and Dockerfile are in that tag). +# (the publisher's 4-bit-codebook container of the official +# Qwen/Qwen3.8-Flash-Next, qwen3.8-next-flash-fp8-iq4r-moe.rad, fetched by +# scripts/download-frank-archon-iq4r.sh) on BOTH R9700s (TP=2, wht6 wire), +# dankserver :7770. 2026-10-15 payload swap from the in-house w4dn8 (the +# swap commit is the revert; its .rad stays on disk). # # Same port, same served alias, same container identity as the unit name; # the harness models.yml id is unchanged. The serve script drives @@ -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-archon — radiance Qwen3.8-Flash-Next-FP8 (native) on 2x R9700 TP=2 +Description=frank-archon — radiance Qwen3.8-Flash-Next (publisher iq4r) 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 diff --git a/scripts/serve-frank-archon.sh b/scripts/serve-frank-archon.sh index 8c8c9b4..d7bc77e 100755 --- a/scripts/serve-frank-archon.sh +++ b/scripts/serve-frank-archon.sh @@ -1,11 +1,13 @@ #!/usr/bin/env bash # 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-archon-freetoken-pr587-20261005 is the -# pre-cutover state). +# Apache-2.0) serving the PUBLISHER's 4-bit-codebook container of the +# official Qwen/Qwen3.8-Flash-Next (the engine author's own rad-convert of +# the bf16 checkpoint: qwen3.8-next-flash-fp8-iq4r-moe.rad, fetched by +# scripts/download-frank-archon-iq4r.sh) on BOTH R9700s (TP=2, wht6 wire), +# dankserver :7770. 2026-10-15 payload swap from the in-house w4dn8 of the +# Swift1.5 finetune (payload on disk = rollback; the swap commit is the +# revert); 2026-10-05 radiance cutover from FreeToken (git tag +# frank-archon-freetoken-pr587-20261005 is the pre-radiance state). # # The run line below IS the engine argv: the image's entrypoint is the # engine and its tools sit beside it on PATH. Unlike every predecessor diff --git a/shared/homepage/services.json b/shared/homepage/services.json index 49d12c9..5f061da 100644 --- a/shared/homepage/services.json +++ b/shared/homepage/services.json @@ -366,13 +366,13 @@ "model": { "unit": "archon", "role": "Frank's strongest and fastest model runtime", - "hf": "https://huggingface.co/frank8465/Swift-1.5-Qwen3.8-Flash-Next-GPTQ-W4A8-Radiance-AMD-R9700", + "hf": "https://huggingface.co/StillDeadcode/qwen3.8-next-flash-fp8-iq4r-moe", "tagline": "...Power Overwhelming...", "sfx": [ "archon-power.ogg" ], "equiv": "Equivalent to Claude Opus 4.8 / OpenAI-Terra (Summer 2026 frontier intelligence).", - "spec": "Our own build: a GPTQ-w4 quant of Swift1.5-Qwen3.8-Flash-Next, quantized and tuned in-house (radiance, ~114 GiB) on twin AMD R9700s with more than 200 GB of system RAM — 200k-token context, three submissions at a time; sees images.", + "spec": "The engine author's published quant: 4-bit codebook experts + int8 trunk of Qwen3.8-Flash-Next (radiance, ~114 GiB) on twin AMD R9700s with more than 200 GB of system RAM — 200k-token context, three submissions at a time; sees images.", "inputs": [ "text", "image" diff --git a/tests/frank_archon_unit.bats b/tests/frank_archon_unit.bats index 8ce2be3..befe2c6 100755 --- a/tests/frank_archon_unit.bats +++ b/tests/frank_archon_unit.bats @@ -3,8 +3,10 @@ # # This file asserts the RADIANCE shape (StillDeadcode engine, digest-pinned # stilldeadcode/radiance image, BOTH R9700s TP=2 on the wht6 wire, serving -# the Swift1.5 Qwen3.8-Flash-Next GPTQ-w4 .rad built by -# scripts/convert-swift15-w4dn8.sh). It replaces the FreeToken seam of +# the publisher's 4-bit-codebook .rad of the official Qwen3.8-Flash-Next +# (fetched by scripts/download-frank-archon-iq4r.sh; the in-house +# Swift1.5 w4dn8 .rad of scripts/convert-swift15-w4dn8.sh is the on-disk +# rollback). It replaces the FreeToken seam of # 2026-10-05 (git tag frank-archon-freetoken-pr587-20261005) and pins what # flags alone do not say: the served window clears the harness worst case, # the KV pool backs seqs x max-model-len at the declared cache dtype (an @@ -28,7 +30,7 @@ SERVE="$REPO_ROOT/scripts/serve-frank-archon.sh" TTM_LIB="$REPO_ROOT/scripts/ttm-preflight.sh" ENV_FILE="$REPO_ROOT/scripts/frank-archon.env" REMOTE_DEPLOY="$REPO_ROOT/scripts/deploy-remote.sh" -DOWNLOAD="$REPO_ROOT/scripts/download-frank-archon-swift15.sh" +DOWNLOAD="$REPO_ROOT/scripts/download-frank-archon-iq4r.sh" BUILD="$REPO_ROOT/scripts/convert-swift15-w4dn8.sh" HFGET="$REPO_ROOT/scripts/hfget.sh" TEMPLATE="$REPO_ROOT/scripts/qwen38-froggeric-v22.5.jinja" @@ -381,18 +383,23 @@ nosudo_bin() { 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-archon-rad.sh + - # download-frank-archon.sh.) +@test "the model id matches the payload's fetch script (and the rollback's build script)" { + # The deployed payload is the PUBLISHER's .rad: the fetch script names + # the repo, the file, and the Hub's LFS sha256; nothing is converted on + # the host for it. The in-house w4dn8 rollback keeps its own trio + # (convert-swift15-w4dn8.sh + download-frank-archon-swift15.sh, and the + # fp8-native era keeps 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 '^FRANK_ARCHON_MODEL_FILE=qwen3.8-next-flash-fp8-iq4r-moe.rad$' "$ENV_FILE" + grep -q 'StillDeadcode/qwen3.8-next-flash-fp8-iq4r-moe' "$DOWNLOAD" + grep -q 'qwen3.8-next-flash-fp8-iq4r-moe.rad' "$DOWNLOAD" + grep -q '0af5e96244e80c21ac8edca1719dae49b8a201b94a2f3994c3e24026ceaa4d20' "$DOWNLOAD" grep -q 'hfget.sh' "$DOWNLOAD" # The repo is UNGATED — no token may be required on the fetch path. ! grep -q 'HF_TOKEN' "$DOWNLOAD" + # Rollback provenance: the w4dn8 build script names its payload. + grep -q 'qwen4exp-swift15-w4dn8-i8-hc8m.rad' "$BUILD" } @test "no bare HIP-reserved env var is defined" {