Thank you—you identified the right mechanism to investigate. The completed controls show that the October 19 versus October 24 discrepancy was caused by llama-server’s prompt-cache state interacting with execution history, not by a different artifact, binary, fixture set, or failed seed propagation.
First, the direct artifact answer remains yes:
- Qwen2.5-7B Q4_K_M SHA-256 in both runs:
dcbe3199008880ff6cbdf058c5f054eb4fbf3cdc6a3b7bf6fbf249eea5137eae
- Same F16 artifact
- Same llama-server binary
- Same 200 base cases and prompts
- Same context and decoding parameters
- Same recorded seed, 42
The initial five-seed experiment was internally valid within its targeted, stateful-first execution context, but it was not directly comparable to the production-order run. Your cache hypothesis explains why.
1. Five-seed experiment
The five-seed experiment evaluated seeds 42–46 on the same 200 crossed stateful cases.
| Operation |
F16 range |
Q4_K_M range |
Q4−F16 range |
reverse_primary_tags |
50–50/50 |
35–37/50 |
−0.30 to −0.26 |
rotate_queue_left |
14–16/50 |
26–29/50 |
+0.20 to +0.30 |
expire_decoy_record |
37–37/50 |
43–44/50 |
+0.12 to +0.14 |
raise_primary_priority |
50–50/50 |
50–50/50 |
0.00 |
This established operation-specific seed sensitivity within that context. It did not explain why seed-42 Q4 scored 155/200 there but 144/200 in production order.
2. Counterbalanced execution-context experiment
I then ran three independent seed-42 realizations in each of two contexts:
- Cold/stateful-first: stateful began at call 2.
- Production order: JSON and JSON multistep preceded stateful, which began at approximately call 514 for F16 and 506 for Q4.
All three realizations were byte-identical within each arm.
| Context |
F16 |
Q4_K_M |
| Cold/stateful-first |
152/200 |
155/200 |
| Production order |
152/200 |
144/200 |
The production-order arm reproduced the October 19 production trajectory. The cold arm reproduced the later seed-42 trajectory.
Across contexts:
- F16: 34/200 raw outputs changed, with one cold-only and one production-only pass.
- Q4_K_M: 104/200 raw outputs changed, with 19 cold-only and eight production-only passes.
- Q4’s exact two-sided paired p-value was
0.052239, matching your calculation.
The Q4 outcome changes were not bunched near the start of the stateful block:
| Position |
Raw outputs changed |
Cold-only passes |
Production-only passes |
| 1–50 |
24 |
3 |
3 |
| 51–100 |
29 |
4 |
1 |
| 101–150 |
24 |
5 |
3 |
| 151–200 |
27 |
7 |
1 |
The 27 pass/fail changes were therefore distributed 6, 5, 8, 8 across the four 50-case position bins. Raw changes extended from position 2 through position 194.
By operation:
| Operation |
Cold Q4 |
Production Q4 |
Cold-only |
Production-only |
Raw changed |
reverse_primary_tags |
35 |
29 |
10 |
4 |
29 |
rotate_queue_left |
26 |
21 |
8 |
3 |
36 |
expire_decoy_record |
44 |
44 |
1 |
1 |
17 |
raise_primary_priority |
50 |
50 |
0 |
0 |
22 |
That answered the execution-position question, but not yet the lower-level cause.
3. Backend-mechanism experiment
Your cache_prompt and slot-routing hypothesis prompted a six-arm experiment with three fresh-process realizations per arm—18 runs total:
- Cold, cache enabled
- Production order, cache enabled
- Production order followed by server restart
- Cold, prompt cache disabled
- Production order, prompt cache disabled
- Request-count-matched neutral warmup
The controls recorded:
- Explicit prompt-cache policy
--parallel slot count
- Server epoch
- Sanitized slot snapshots
- Preceding scored-call and token volume
- Neutral-warmup volume
- Top-20 pre-sampling log-softmax diagnostics
I did not capture the full vocabulary logits, so I am not claiming full-logit identity. The captured pre-sampling surface was sufficient to locate the first observable divergence.
Every arm was byte-stable across its three realizations.
| Arm |
F16 |
Q4_K_M |
| Cold, cache enabled |
152/200 |
155/200 |
| Production order, cache enabled |
152/200 |
144/200 |
| Production order, then server restart |
152/200 |
155/200 |
| Cold, cache disabled |
151/200 |
156/200 |
| Production order, cache disabled |
151/200 |
156/200 |
| Neutral warmup, cache enabled |
152/200 |
155/200 |
The discriminating comparisons were exact:
Cache enabled: cold versus production order
- F16: 34 raw outputs changed.
- Q4_K_M: 104 raw outputs changed.
- The captured first-step pre-sampling probability surface changed in all 400 turn-level records for each runner.
- The first captured divergence occurred at generation step 1 in all 400 records.
- The selected first token changed in 25 F16 records and 68 Q4 records.
Cache disabled: cold versus production order
For both F16 and Q4_K_M:
- Zero raw-output changes
- Zero pass/fail changes
- Zero captured pre-sampling probability-surface changes
- Zero selected-first-token changes
Production order followed by server restart
The restarted server reproduced the cold trajectory exactly for both artifacts:
- Zero raw-output changes
- Zero pass/fail changes
- Zero captured probability-surface changes
Neutral warmup
The neutral arm matched the production arm’s request counts—512 preceding calls for F16 and 504 for Q4—and used slightly greater token volume. It nevertheless reproduced the cold trajectory exactly.
That rules out request count or approximate token volume alone. The effect required content-specific cached prompt history.
So your proposed mechanism was correct: with prompt caching enabled, prior prompt content changed the pre-sampling probability surface. Repeating the same seed and same call history reproduced the same trajectory, but that was same-history reproducibility—not context-independent same-seed reproducibility.
4. Production correction and validation
quant_eval’s local llama-server production contract now enforces:
--no-cache-prompt
--parallel 1
The runner, telemetry, manifest, reporting, comparability contract, data dictionary, and publication validation all fail closed if the required state-isolation evidence is missing or inconsistent.
A 50-case-per-family calibration completed successfully with the corrected backend. The subsequent locked publication evaluation ran:
- 200 cases per canonical family
- 200 separately reported exogenous fuzz-replay cases
- 3,600 scored CSV rows
- 5,758 reconciled scored generation records
The publication bundle passed independent checksum, schema, telemetry-join, token-reconciliation, paired-statistics, effect-concentration, and claim-lineage validation with no blockers.
For stateful follow-up under the corrected production contract:
- F16: 151/200
- Q4_K_M: 156/200
- F16-only passes: 18
- Q4-only passes: 23
- Delta:
+0.025
- Conclusion: inconclusive
That result belongs to the corrected v7.22.44 execution contract. I am not back-applying it to the older cache-enabled runs.
5. Separate Modal control
I also tested the hosted llama-cpp-python path separately because it does not use the local llama-server slot architecture.
For Qwen2.5-14B F16 and Q4_K_M, the backend called llm.reset() before every request. All 800 scored turn calls returned machine-readable proof that request state had been reset.
The artifacts, A100-40GB tier, llama-cpp-python 0.3.20 runtime, 8,192-token context, decoding parameters, seed, and 200 base cases matched the historical reference.
| Lane |
Historical |
Request-reset |
Outcome changes |
Raw changes |
| F16 |
163/200 |
162/200 |
1 |
16 |
| Q4_K_M |
162/200 |
163/200 |
1 |
96 |
Both changed outcomes were on the same rotate_queue_left base case, in opposite directions.
This shows that request-state reset did not materially alter the capability conclusion, but it also did not eliminate raw-output movement on the hosted GPU path. I therefore did not promote llm.reset() into ordinary Modal production inference. The remaining hosted raw variability is reported separately and is not labeled a prompt-cache effect or evidence that quantization adds entropy.
Bottom line
Your reconciliation criticism was correct, and my earlier same-seed interpretation was too strong.
The completed evidence supports these narrower conclusions:
- The October 19 versus October 24 Q4 discrepancy was not caused by an artifact, binary, fixture, decoding, or seed mismatch.
- It was caused by content-specific llama-server prompt-cache history changing the pre-sampling probability surface.
- The 27 Q4 outcome flips were distributed throughout the stateful block, not concentrated near its start.
- Disabling prompt caching eliminated all cold-versus-production-order movement in the controlled local experiment.
- Restarting the server also restored the cold trajectory.
- Request count alone did not reproduce the effect.
- Q4 was more behaviorally sensitive to the cached-history change than F16, but that does not by itself establish that quantization adds sampling entropy.
- Current local production runs use the corrected cache-disabled, single-slot contract and fail publication closed if that contract is not verified.
The consolidated evidence is recorded under:
Qwen2.5_7B_Instruct_20261102_stateful_context_study
Qwen2.5_7B_Instruct_20261105_backend_mechanism_study
Qwen2.5_7B_Instruct_20261106_013427
Qwen2.5_7B_Instruct_20261106_025009
Qwen2.5_14B_Instruct_1M_20261106_052249
If you would like the complete case-level results, telemetry, manifests, fixtures, probability diagnostics, and machine-readable decision matrices, those runs can be requested by name through https://pbhappliedsystems.com/contact.
I will be establishing a public changelog for quant_eval on Hugging Face and pbhappliedsystems.com to document changes and their supporting evidence. As previously mentioned, I would like to attribute the improvements prompted by your comments appropriately. The changelog will proceed regardless; if you are comfortable being credited, please let me know your preferred name or profile link for attribution.