REN eval: round-4 adapter vs base (s04-vs-base)
- base_model: Qwen/Qwen3.5-9B
- adapter: Oviezibe/ren-s04 @
2ca3a441 (continued from s03 @ c142b458)
- smoke_test: False (full heldout_v1)
- load_mode: lora16_2gpu
- finished: Mon Oct 5 00:08:35 2026 UTC (main eval, 76.9 min on 2×T4); LoRA scale check committed 01:24 WAT (15 min)
- Kaggle: nutinman/ren-s02-train Version 7 (scriptVersionId 355288092)
- HF results:
Oviezibe/ren-evals s04-vs-base/ (results.json, results.md, lora_scale_check.json)
- Training: step 122/122, train_loss 0.636, skipped 0; data
Oviezibe/ren-data-v3 @ bc8703cb13; 55% coding (base self-distill)
- Overlap: heldout_v1 vs ren-data-v3 + templates, 0 items dropped in every section
Same harness as s03 (stop at <|im_end|>), so s03 and s04 absolute numbers compare directly.
Headline: base vs s03 vs s04
| Area |
base |
s03 |
s04 |
s04 Δ vs base |
s04 vs s03 |
| Format compliance (all, n=350) |
0.897 |
1.000 |
1.000 |
+0.103 |
= |
| Format answer (all) |
0.657 |
0.977 |
0.980 |
+0.323 |
+0.3 pp |
| Decide accuracy (n=300) |
0.680 |
0.827 |
0.840 |
+0.160 |
+1.3 pp |
| Decide Brier (lower better) |
0.419 |
0.238 |
0.231 |
-0.188 |
better |
| HumanEval+ pass@1 (n=163) |
0.804 |
0.755 |
0.773 |
-0.031 (6 gained / 11 lost, p=0.33, CI [-0.080, 0.018]) |
+1.8 pp (9 gained / 6 lost) |
| HumanEval+ at LoRA scale 0.5 |
0.804 |
- |
0.779 |
-0.025 (6 / 10) |
- |
| Terminal success (n=42) |
0.857 |
0.881 |
0.905 |
+0.048 |
+2.4 pp |
| Interrupt (all, n=42) |
0.786 |
0.810 |
0.833 |
+0.048 |
+2.4 pp |
| Interruption stop |
0.857 |
1.000 |
1.000 |
+0.143 |
= |
| Interruption correction |
0.857 |
0.786 |
0.929 |
+0.071 |
+14.3 pp |
| Interruption add_info |
0.643 |
0.643 |
0.571 |
-0.071 (3 / 4) |
-7.1 pp (1 item) |
| Agent format / answer |
1.000 / 0.740 |
1.000 / 1.000 |
1.000 / 1.000 |
0 / +0.260 |
= |
| MMLU-Pro (n=200) |
0.615 |
0.640 |
0.635 |
+0.020 |
-0.5 pp (noise) |
Round-4 gate (round4-build.md): HumanEval+ >= base with no regressions
| Gate |
Target |
s04 |
Result |
| HumanEval+ >= base |
>= 0.804 |
0.773 (126 vs 131 of 163) |
miss by 5 problems (not significant: p=0.33, CI crosses 0) |
| No regression > 2 pp vs s03 on passing gates |
- |
Decide, terminal, interruption, format all up; interruption add_info -1 item of 14; MMLU-Pro -0.5 pp |
pass (add_info dip is one item, n=14) |
| Half-strength fallback reaches parity |
>= 0.804 |
0.779 |
no (+1 problem only) |
Diagnosis
- Coding moved the right way but did not fully close. s04 is 0.755 to 0.773 vs s03 (9 gained, 6 lost) and 0 timeouts
(s03 had 2). The 11 problems still lost vs base are HumanEval/19, 20, 40, 57, 64, 67, 93, 97, 102, 113, 134; 8 of
those (20, 57, 64, 93, 97, 102, 113, 134) were already s03 losses, i.e. the inherited s02 LoRA drift. All are
AssertionError edge cases in well-formed full functions, not format problems (code-block rate 0.982 vs 0.963 base).
- Halving the LoRA barely helps (0.773 to 0.779, still loses 20, 57, 64, 93, 97, 102, 113, which shows the drift lives
in the low-rank update itself, not in its magnitude). Weight interpolation is not a cheap fix, and halving would
likely give up some of the interruption/agent gains it was not measured on.
- In-notebook code check (64 held-out OpenCodeInstruct problems): s04 61 vs base 60. General coding is at or above
base; the HumanEval+ gap is a handful of benchmark-style edge cases.
- Everything else is REN's best yet: best Decide accuracy and calibration, best terminal score, interruption correction
jumped to 0.929, stop still 14/14, agent answer 50/50, format answer 0.980.
Decision
- Serve s04 at full strength (
Oviezibe/ren-s04 @ 2ca3a441). It beats s03 on every area except one interruption
add_info item and MMLU-Pro noise, and the 0.5 scale gains only one HumanEval problem while untested elsewhere.
s03 stays the rollback.
- Ship-ready: yes for a first product (beta), with an honest coding caveat. The strict gate missed by 5/163
problems and that gap is inside noise; REN's selling points (interrupts, agent tool calls, Decide, format)
are all clearly above base. Do not market it as "better than Qwen at coding"; market interruption/agent work, with coding
"on par".
- Serving must keep the stop-at-
<|im_end|> rule (part of the measured behaviour).
- Next coding fix belongs to the bigger-model round, not another 9B continuation: the drift is baked into the
s02-lineage LoRA and only ~4 h of Kaggle T4 remain until Sat Oct 10 01:00 WAT. Options for later: retrain a fresh
LoRA from base on the v3 mix (no s02 inheritance), or apply the recipe to the 14-30B model.
Raw Hub table mirrored below for archival.
REN eval: pilot adapter vs base (s04-vs-base)
- base_model: Qwen/Qwen3.5-9B
- adapter: Oviezibe/ren-s04
- adapter_revision: 2ca3a4416cf846177ba7f7a0e056f3e2cde5d793
- smoke_test: False
- load_mode: lora16_2gpu
- sandbox: uid
- finished: Mon Oct 5 00:08:35 2026
- minutes: 76.9
- heldout_version: heldout_v1
- overlap_check: Oviezibe/ren-data-v3@bc8703cb13 (24172 records, sha256-checked) + templates
Paired over the items both runs completed (greedy decoding, same prompts). Δ = adapter − base; 95% CI from a paired bootstrap over items; p = exact McNemar on the items that changed (binary metrics).
| section |
group |
metric |
n |
base |
adapter |
Δ |
95% CI |
gained / lost |
p |
| format |
agent |
format compliance |
50 |
1.000 |
1.000 |
+0.000 |
[0.000, 0.000] |
0 / 0 |
1 |
| format |
decide |
format compliance |
50 |
1.000 |
1.000 |
+0.000 |
[0.000, 0.000] |
0 / 0 |
1 |
| format |
interruption_add_info |
format compliance |
50 |
0.460 |
1.000 |
+0.540 |
[0.400, 0.680] |
27 / 0 |
1.49e-08 |
| format |
interruption_correct |
format compliance |
50 |
1.000 |
1.000 |
+0.000 |
[0.000, 0.000] |
0 / 0 |
1 |
| format |
interruption_stop |
format compliance |
50 |
1.000 |
1.000 |
+0.000 |
[0.000, 0.000] |
0 / 0 |
1 |
| format |
fast |
format compliance |
50 |
1.000 |
1.000 |
+0.000 |
[0.000, 0.000] |
0 / 0 |
1 |
| format |
think |
format compliance |
50 |
0.820 |
1.000 |
+0.180 |
[0.080, 0.280] |
9 / 0 |
0.00391 |
| format |
all |
format compliance |
350 |
0.897 |
1.000 |
+0.103 |
[0.071, 0.134] |
36 / 0 |
2.91e-11 |
| format |
agent |
answer correct |
50 |
0.740 |
1.000 |
+0.260 |
[0.160, 0.380] |
13 / 0 |
0.000244 |
| format |
decide |
answer correct |
50 |
0.880 |
1.000 |
+0.120 |
[0.040, 0.220] |
6 / 0 |
0.0312 |
| format |
interruption_add_info |
answer correct |
50 |
0.260 |
0.920 |
+0.660 |
[0.520, 0.800] |
34 / 1 |
2.1e-09 |
| format |
interruption_correct |
answer correct |
50 |
0.000 |
1.000 |
+1.000 |
[1.000, 1.000] |
50 / 0 |
1.78e-15 |
| format |
interruption_stop |
answer correct |
50 |
0.920 |
0.980 |
+0.060 |
[-0.020, 0.160] |
4 / 1 |
0.375 |
| format |
fast |
answer correct |
50 |
0.900 |
0.960 |
+0.060 |
[-0.020, 0.140] |
4 / 1 |
0.375 |
| format |
think |
answer correct |
50 |
0.900 |
1.000 |
+0.100 |
[0.020, 0.200] |
5 / 0 |
0.0625 |
| format |
all |
answer correct |
350 |
0.657 |
0.980 |
+0.323 |
[0.271, 0.371] |
116 / 3 |
8.45e-31 |
| decide |
all |
accuracy |
300 |
0.680 |
0.840 |
+0.160 |
[0.110, 0.210] |
58 / 10 |
2.36e-09 |
| decide |
all |
Brier (multi-class, lower=better) |
300 |
0.419 |
0.231 |
-0.188 |
[-0.242, -0.139] |
- |
- |
| decide |
choice |
accuracy |
66 |
0.667 |
0.803 |
+0.136 |
[0.030, 0.258] |
12 / 3 |
0.0352 |
| decide |
score |
accuracy |
28 |
0.357 |
0.714 |
+0.357 |
[0.143, 0.571] |
12 / 2 |
0.0129 |
| decide |
yes_no |
accuracy |
206 |
0.728 |
0.869 |
+0.141 |
[0.087, 0.199] |
34 / 5 |
2.43e-06 |
| decide |
json_schema |
accuracy |
23 |
0.739 |
0.739 |
+0.000 |
[-0.174, 0.174] |
2 / 2 |
1 |
| decide |
pep440_contains |
accuracy |
19 |
0.947 |
1.000 |
+0.053 |
[0.000, 0.158] |
1 / 0 |
1 |
| decide |
pep440_count |
accuracy |
13 |
0.231 |
0.692 |
+0.462 |
[0.231, 0.769] |
6 / 0 |
0.0312 |
| decide |
pep440_resolve |
accuracy |
16 |
0.500 |
0.812 |
+0.312 |
[0.000, 0.625] |
7 / 2 |
0.18 |
| decide |
pep440_select |
accuracy |
13 |
0.538 |
0.462 |
-0.077 |
[-0.308, 0.154] |
1 / 2 |
1 |
| decide |
py_exception |
accuracy |
19 |
0.684 |
0.842 |
+0.158 |
[0.000, 0.316] |
3 / 0 |
0.25 |
| decide |
py_output |
accuracy |
34 |
0.706 |
0.912 |
+0.206 |
[0.059, 0.382] |
8 / 1 |
0.0391 |
| decide |
py_raises |
accuracy |
34 |
0.912 |
0.971 |
+0.059 |
[0.000, 0.147] |
2 / 0 |
0.5 |
| decide |
py_raises_random |
accuracy |
19 |
0.421 |
0.789 |
+0.368 |
[0.158, 0.579] |
7 / 0 |
0.0156 |
| decide |
regex_count |
accuracy |
15 |
0.467 |
0.733 |
+0.267 |
[-0.067, 0.600] |
6 / 2 |
0.289 |
| decide |
regex_match |
accuracy |
33 |
0.788 |
0.909 |
+0.121 |
[0.030, 0.242] |
4 / 0 |
0.125 |
| decide |
regex_random |
accuracy |
14 |
0.929 |
1.000 |
+0.071 |
[0.000, 0.214] |
1 / 0 |
1 |
| decide |
shell_destructive |
accuracy |
33 |
0.636 |
0.879 |
+0.242 |
[0.091, 0.394] |
8 / 0 |
0.00781 |
| decide |
shell_destructive_random |
accuracy |
15 |
0.533 |
0.600 |
+0.067 |
[-0.133, 0.267] |
2 / 1 |
1 |
| humaneval |
all |
HumanEval+ pass@1 (greedy) |
163 |
0.804 |
0.773 |
-0.031 |
[-0.080, 0.018] |
6 / 11 |
0.332 |
| humaneval |
all |
answer has a code block |
163 |
0.963 |
0.982 |
+0.018 |
[0.000, 0.043] |
3 / 0 |
0.25 |
| terminal |
all |
task success (end-state checks) |
42 |
0.857 |
0.905 |
+0.048 |
[-0.095, 0.190] |
5 / 3 |
0.727 |
| terminal |
all |
every tool call well-formed |
42 |
1.000 |
1.000 |
+0.000 |
[0.000, 0.000] |
0 / 0 |
1 |
| terminal |
all |
used the tool at all |
42 |
1.000 |
1.000 |
+0.000 |
[0.000, 0.000] |
0 / 0 |
1 |
| interruption |
add_info |
interrupt handled (exec-verified) |
14 |
0.643 |
0.571 |
-0.071 |
[-0.429, 0.286] |
3 / 4 |
1 |
| interruption |
correction |
interrupt handled (exec-verified) |
14 |
0.857 |
0.929 |
+0.071 |
[-0.143, 0.286] |
2 / 1 |
1 |
| interruption |
stop |
interrupt handled (exec-verified) |
14 |
0.857 |
1.000 |
+0.143 |
[0.000, 0.357] |
2 / 0 |
0.5 |
| interruption |
all |
interrupt handled (exec-verified) |
42 |
0.786 |
0.833 |
+0.048 |
[-0.119, 0.214] |
7 / 5 |
0.774 |
| interruption |
add_info |
interruption format |
14 |
1.000 |
0.929 |
-0.071 |
[-0.214, 0.000] |
0 / 1 |
1 |
| interruption |
correction |
interruption format |
14 |
1.000 |
1.000 |
+0.000 |
[0.000, 0.000] |
0 / 0 |
1 |
| interruption |
stop |
interruption format |
14 |
0.857 |
1.000 |
+0.143 |
[0.000, 0.357] |
2 / 0 |
0.5 |
| interruption |
all |
interruption format |
42 |
0.952 |
0.976 |
+0.024 |
[-0.048, 0.095] |
2 / 1 |
1 |
| mmlu_pro |
all |
accuracy (letter logits) |
200 |
0.615 |
0.635 |
+0.020 |
[-0.010, 0.055] |
8 / 4 |
0.388 |
| mmlu_pro |
all |
top-1 token is a letter |
200 |
1.000 |
1.000 |
+0.000 |
[0.000, 0.000] |
0 / 0 |
1 |
| decide |
all |
ECE (10 bins, lower=better) |
300 |
0.070 |
0.054 |
-0.017 |
[-0.070, 0.015] |
- |
- |
| decide |
all |
ECE after cross-fitted temperature |
300 |
0.036 |
0.026 |
-0.009 |
- |
- |
- |
| decide |
all |
label-token probability mass |
300 |
0.995 |
1.000 |
+0.005 |
- |
- |
- |
| decide |
all |
top-1 token is a label |
300 |
1.000 |
1.000 |
+0.000 |
- |
- |
- |
| decide |
all |
MAE vs exact probability |
48 |
0.239 |
0.213 |
-0.026 |
- |
- |
- |
LoRA scale check (HumanEval+ only)
| adapter scale |
n |
base |
adapter (scale 1) |
scaled |
gained / lost vs base |
| 0.5 |
163 |
0.804 |
0.773 |
0.779 |
6 / 10 |