diff --git a/scripts/convert-qwen38-w5nl64.sh b/scripts/convert-qwen38-w5nl64.sh
index 58cb384..d2ac331 100755
--- a/scripts/convert-qwen38-w5nl64.sh
+++ b/scripts/convert-qwen38-w5nl64.sh
@@ -47,7 +47,12 @@
set -u -o pipefail
SELF="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-IMAGE=${IMAGE:-stilldeadcode/radiance@sha256:d590e300234bf6d2f942a0b8d456d183153fd808f28820e6c2fa69c9389178ed}
+# THE TOOLCHAIN PIN. `:latest` on 2026-10-30 is v1.14.0 (revision 4a61d7296bc5),
+# the same image the tap producer boots: a tap must be converted by the line that
+# is current, and rad-convert's `gptq:calib=
` input contract is version-stable
+# (RADGRAM2 + gram.r..bin), so nothing else about the recipe moves with
+# it. Production stays on its own pin — this is the campaign's toolchain.
+IMAGE=${IMAGE:-stilldeadcode/radiance@sha256:69add58f7de1ed2bca2b1e20a4cc75717557df3f73569a178eca5aafe8c44093}
CKPT=${CKPT:-/home/dank/models/Qwen3.8-Flash-Next}
CAMPAIGN=${CAMPAIGN:-/home/dank/campaign/qwen38-w5nl64}
RECIPE=${RECIPE:-$SELF/recipes/qwen4exp-qwen38-w5nl64-bf16trunk.recipe}
diff --git a/scripts/run-qwen38-bf16.sh b/scripts/run-qwen38-bf16.sh
index 5527b60..2782938 100755
--- a/scripts/run-qwen38-bf16.sh
+++ b/scripts/run-qwen38-bf16.sh
@@ -25,13 +25,17 @@
# through the ro /models mount); OUT lands on a writable
# mount because --kld-out F also writes F.rows beside it.
# calib serve on :7770 with the calibration tap open
-# (RADIANCE_CALIB_DIR + RADIANCE_CALIB_TOKENS=12000000). A
+# (RADIANCE_CALIB_DIR + RADIANCE_CALIB_TOKENS=1500000). A
# separate driver — scripts/calib-push.py --port 7770
# --container qwen38-bf16 --corpus
# /home/dank/corpora/out/calib.jsonl — pushes the corpus; at
-# 12M pooled positions the engine writes the Grams and the
-# tap switches itself off (calib-push prints TAP_DONE). Stop
-# this script after that; the trap brings frank-archon back.
+# the floor the engine writes the Grams and the tap switches
+# itself off (calib-push prints TAP_DONE). Stop this script
+# after that; the trap brings frank-archon back. The vendor's
+# own measurement is the floor's warrant — "a pooled Gram
+# from 10 M tokens beat one from 1 M by under 1 %" — and at
+# this rig's measured push rate a 1.5 M floor is hours, not
+# the 29 h a 6 M floor cost. One seal writes ~40 GiB.
#
# Shape: the vendor's bf16 calibration lines — expert_tiered placement with the
# weights disk tier, deterministic (the resident set pinned to the loader's plan,
@@ -113,12 +117,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck disable=SC1091
source "$SCRIPT_DIR/frank-archon.env"
IMAGE="${FRANK_ARCHON_IMAGE:?FRANK_ARCHON_IMAGE must name the radiance image}"
-# THE CALIBRATION PIN. RADIANCE_CALIB_DIR/TOKENS arms the expert tap on the 1.2.x
-# line only. 1.8.1 still carries every plugin string and the seal message, and a
-# 17-hour run on it wrote ZERO bytes into the tap dir while /health, /stats and
-# the push all looked healthy (measured 2026-10-30) — so calib boots THIS digest
-# and any other image must be named deliberately with --image.
-CALIB_IMAGE="${Q38_CALIB_IMAGE:-stilldeadcode/radiance@sha256:665775ed1d90de6dbb25558e07fc60d20328f1346f96f3c6e00845eb763f01fa}"
+# THE CALIBRATION PIN: the LATEST radiance, pinned by digest because a tag is a
+# moving target and a tap must name the producer that wrote it. `:latest` on
+# 2026-10-30 resolves to v1.14.0 (revision 4a61d7296bc5), and on that image a
+# calib boot prints the arming line — "recorded passes: off, the program
+# accumulates calibration Grams (gram_accum)" — where the production pin
+# (1.8.1) prints nothing of the kind: a 17-hour run on 1.8.1 wrote ZERO bytes
+# into the tap dir while /health, /stats and the push all looked healthy
+# (measured 2026-10-30). The tap code is identical in both trees' sources, so
+# the shipped 1.8.1 build is what drops it; do not spend another window on it.
+# Any other image must be named deliberately with --image.
+CALIB_IMAGE="${Q38_CALIB_IMAGE:-stilldeadcode/radiance@sha256:69add58f7de1ed2bca2b1e20a4cc75717557df3f73569a178eca5aafe8c44093}"
IMAGE_EXPLICIT=0
MODE=""
@@ -348,7 +357,7 @@ case "$MODE" in
}
MOUNTS+=(-v "$CALIB_DIR:/data/calib")
TAPENV=(-e RADIANCE_CALIB_DIR=/data/calib
- -e "RADIANCE_CALIB_TOKENS=${FRANK_QWEN38_CALIB_TOKENS:-12000000}")
+ -e "RADIANCE_CALIB_TOKENS=${FRANK_QWEN38_CALIB_TOKENS:-1500000}")
# The tap's own authorization. A pusher must see this marker before it sends
# a prompt (calib-push.py --tap-marker), it names the container so a push
# aimed anywhere else refuses, and a boot that fails removes it again below.
diff --git a/tests/qwen38_reference.bats b/tests/qwen38_reference.bats
index a45415d..3e1ee86 100755
--- a/tests/qwen38_reference.bats
+++ b/tests/qwen38_reference.bats
@@ -157,12 +157,15 @@ flag_value() {
[[ "$output" != *"--vram-kv-mib"* ]]
}
-@test "the calib dry run opens the tap at 12M tokens and serves on 7770" {
+@test "the calib dry run opens the tap at the 1.5M floor, on the latest pin, and serves on 7770" {
run bash "$RUNNER" calib --dry-run
[ "$status" -eq 0 ]
flat="$(oneline)"
- [[ "$flat" == *"-e RADIANCE_CALIB_TOKENS=12000000"* ]]
+ [[ "$flat" == *"-e RADIANCE_CALIB_TOKENS=1500000"* ]]
[[ "$flat" == *"-e RADIANCE_CALIB_DIR=/data/calib"* ]]
+ # the tap producer is the campaign's own pin (latest radiance), not production's
+ [[ "$flat" == *"radiance@sha256:69add58f"* ]]
+ [[ "$flat" != *"radiance@sha256:d590e300"* ]]
[[ "$flat" == *"--port 7770"* ]]
[[ "$flat" == *":/data/calib "* ]]
# calib serves; it does not record