Files
esh-pfi-infrastructure/persistent-memory.d/2026-08-27-dose-response-entanglement.md
vh 98e7d4886a memory: snapshot — run 3 gated DO-NOT-SERVE, run 3c held on a tripped breaker
Run 3 trained, gated and dispositioned do-not-serve on a measured 44pp self-harm
guardrail regression that its own preregistered rule passed -- a pooled preserve-list
test cannot see a single-axis collapse. Run 3c (lr 20x cut, single variable) launched,
killed by an Anaheim power-breaker trip at step 80, relaunched, then stopped by the
operator at step 22 pending a weekend power triage.

Also captured: the corpus mix was specified in a unit the optimiser never sees
(45.8% dialogue by context, 24.2% by loss); the dose-response says benefit and damage
are one direction in weight space, so the merge-back measures the problem rather than
fixing it; four guests including the storage SPOF had onboot unset and never came back
from the outage, now fixed with dependency ordering; and a transport failure that
enters a measurement as a value looks like whatever you hoped to find -- which found a
live defect in another agent's instrument an hour after it was reported.

Auto-archived 8 entries to archival-memory.md (Recent decisions: 8, Tried and
abandoned: 0); 4 held back on open deferred-work pointers.
2026-08-27 07:27:41 -07:00

3.2 KiB

[2026-08-27] The dose-response says benefit and damage are ONE direction in weight space

vLLM cannot LoRA-serve Gemma-4-26B-A4B at all — it is an MoE and the LoRA manager has no expert mapping (AttributeError: To support LoRA for MoE model, 'get_expert_mapping' must be implemented, vllm/lora/utils.py:398, v0.24.0). Found by trying it: one container start, which is exactly what playbook §3.10 exists to buy.

So each scale point was pre-merged instead — merge_and_unload with the adapter's alpha pre-scaled, which reproduces exactly what a LoRA at scale s would serve, on the same serving path as the gate. Artifacts held at /tank/erp-tune/serve/merged-run03{,-s075,-s050,-s025}.

scale     attractor   gain kept   noise@31   damage     prose@40 cost
s=0.50       0.9684        0.0%     1.0000     0.00pp          0.00pp
s=0.75       0.8966       42.0%     0.9688     3.12pp          6.25pp
s=1.00       0.8049      100.0%     0.5938    40.62pp         15.62pp

first 42% of the gain costs   3.12pp of noise coherence
last  58% of the gain costs  37.50pp more   -> 12x worse per point

Every axis is monotone in scale — attractor, distance, marker density, RP length, both coherence measures, even truncation count. No knee anywhere.

The conclusion, which is stronger than an exchange rate

An exchange rate says the trade is expensive. This says there is no trade to make: the adapter learned ONE direction and everything rides it. brokkr's framing, worth keeping: scaling moves you along the direction the adapter already learned; it cannot give you a different one.

That converts the merge-back from a candidate fix into a measurement of the problem. zerofata's MeroMero v1 ships the merge-back as its answer, so it was worth testing — and testing it is what proved it cannot be the answer here.

The T4 mechanism is NOT register capture

pad type    base            tuned
prose       1.0000 flat     mild knee, onset ~1,600 tok
noise       1.0000 flat     1.0000 -> 0.5938    <- SEVERE

The prose-gradient "wedge" predicted prose should be the worst case. Instead prose is the mild axis and shuffled tokens are where it collapses — a continuation prior has nothing to continue in shuffled tokens. Every miss is wrong-name: correct format, on task, wrong answer. State mis-tracking, not register capture.

brokkr: "The tune did not teach it to continue prose — it destroyed its ability to skip text that is not worth reading."

⚠ INSTRUMENT FLOOR — temperature 0 is NOT deterministic under concurrency

same seat, same items, temperature 0, --jobs 8
  prose reps 31   0.9375  0.9688  0.9688    spread 3.12pp
  noise reps 24   0.7500  0.7188  0.7188    spread 3.12pp

vLLM's continuous batching is not numerically invariant to batch composition. Any eval delta under ~3.1pp at n=64/jobs=8 is inside the floor. Only --jobs 1 shrinks it; more n averages over it. Also in auto-memory as reference_vllm_temp0_not_deterministic_under_jobs.

Corollary: it retro-closes the window-2 concurrency worry — measured dirty-vs-clean divergence was 1.56pp, comfortably inside this floor.

See 2026-08-27-mix-specified-in-the-wrong-unit for the wedge this displaced.