granite — calibration report

2026-09-05 12:24 · pipeline 2026.09.05 · seed ? · 60 probe generations · 24 repair attempts

Scope: this file. granite-4.1-3b-Q5_K_M.gguf

Everything below was measured on this model, at this size, at this quantization. Quantization changes the logit distribution and every signal here is a property of that distribution — a different quant of the same weights is a different organism and needs its own run. None of it is claimed to transfer to another model.

Entropy signal
none
p=0.151
Effect seen
d=-0.55
detectable: d≥1.06
Failures
8
of 60 generations
Recoverable
4 / 8
by any strategy tested

The rule

Implementable as written. Every number below was measured on this model, on this run.

  1. Do not gate generation on entropy. No entropy statistic separates this model's correct from incorrect output well enough to act on, so an entropy gate costs compute and buys nothing.
  2. On a failed generation, repair in this order: skeleton_fill → test_retry. This ordering is greedy set cover over what actually recovered failures in this run, not a preference — skeleton_fill alone recovered 3 of 8.
  3. When the failure is a logic error, route to test_retry first (1/4, 25%), ahead of skeleton_fill 25%, temp_retry 0%.
  4. When the failure is an assertion error, route to test_retry first (2/3, 67%), ahead of skeleton_fill 67%, temp_retry 0%.
  5. When the failure is a syntax error, nothing recovered it. All 3 strategies scored 0 of 1. Don't spend retries here — escalate or drop the task.
  6. Stop after the ordered chain. 4 of 8 failures were recoverable by any strategy tested; the remaining 4 were not recovered by any of them, so further retries on those are spend without evidence behind it.

Where to cut, and what it costs

One signal, one curve. What changes is where you cut it and what you do with each side. Fitted and scored across cross-validation folds on 60 unique generations (8 failures) — each number is what the rule did on records its own fold never saw. Pick one row; they are three settings of the same dial, not three rules to stack.

Catch wrong — regenerate when margin_mean ≤ 0.9688. Chosen in 4 of 5 folds; only readable once the generation is complete, so the tokens are already spent when it fires.
Failures caught
80%
of all failing generations
Correct work lost
41%
regenerated needlessly
Net tokens
-95,210
per 1000 generations (-71.6%)

Per 1000 generations: 106.7 doomed runs aborted early, 357.9 correct ones thrown away and regenerated. Token counts are this run's own.

Trust right — ship untested when margin_mean > 0.9665. Chosen in 2 of 5 folds; only readable once the generation is complete, so the tokens are already spent when it fires.
Output covered
76%
shipped without testing
Purity
93.0%
of what ships is correct
Defects shipped
53.5
per 1000 generations

This saves test execution, not generation tokens — the generation is already paid for by the time any signal can be read. Worth it when the test suite is expensive or latency matters more than compute. The defect count is the price.

Both — one cut point, not two, on margin_mean. Chosen in 2 of 5 folds; only readable once the generation is complete, so the tokens are already spent when it fires.

The fit put both cut points at the same value, so there is no undecided band: every generation lands in trust or in bail. That makes this row the same single threshold as the two above, read from both sides — not a third, richer rule.

ZoneConditionWhat to doShare of output
Trustmargin_mean > 0.9688ship untested — 71.9% correct58%
Bandbetween the twotest it — the signal cannot decide0%
Bailmargin_mean ≤ 0.9688regenerate — catches 60% of all failures42%

Net -45,638 tokens per 1000 generations from the bail zone (-34.3% of baseline).

Ship the trust zone untested, regenerate the bail zone, test the band between them. Both cut points come from one fit on one signal, ordered so the zones cannot overlap. The band is what the signal cannot decide — the honest residue, not a gap in the analysis.

No operating point here pays for itself in tokens. The best of them still nets -45,638 tokens per 1000 generations. That is not a flaw in the rule — this run's winning signal is only readable once a generation is complete, so aborting saves nothing that was not already spent, while every wrongly flagged generation pays for a full replacement. Use these rules to spend less on testing, or to decide what to ship, not to spend fewer tokens.

Does entropy predict correctness here?

CorrectIncorrect
Every probe generation, placed by its max_entropy. Vertical marks are group means.
0.5 1 1.5 max_entropy Correct n=52 max_entropy = 0.1443 (correct) max_entropy = 0.1564 (correct) max_entropy = 0.2692 (correct) max_entropy = 0.2758 (correct) max_entropy = 0.3967 (correct) max_entropy = 0.4291 (correct) max_entropy = 0.4514 (correct) max_entropy = 0.4904 (correct) max_entropy = 0.4994 (correct) max_entropy = 0.5114 (correct) max_entropy = 0.6003 (correct) max_entropy = 0.6347 (correct) max_entropy = 0.6412 (correct) max_entropy = 0.6535 (correct) max_entropy = 0.6580 (correct) max_entropy = 0.6653 (correct) max_entropy = 0.6757 (correct) max_entropy = 0.6774 (correct) max_entropy = 0.6796 (correct) max_entropy = 0.6824 (correct) max_entropy = 0.6852 (correct) max_entropy = 0.6885 (correct) max_entropy = 0.6901 (correct) max_entropy = 0.6919 (correct) max_entropy = 0.6948 (correct) max_entropy = 0.6955 (correct) max_entropy = 0.7035 (correct) max_entropy = 0.7101 (correct) max_entropy = 0.7451 (correct) max_entropy = 0.7538 (correct) max_entropy = 0.7587 (correct) max_entropy = 0.7754 (correct) max_entropy = 0.7843 (correct) max_entropy = 0.8057 (correct) max_entropy = 0.8229 (correct) max_entropy = 0.8433 (correct) max_entropy = 0.8665 (correct) max_entropy = 0.9327 (correct) max_entropy = 1.0800 (correct) max_entropy = 1.0800 (correct) max_entropy = 1.0944 (correct) max_entropy = 1.1380 (correct) max_entropy = 1.1394 (correct) max_entropy = 1.1775 (correct) max_entropy = 1.1922 (correct) max_entropy = 1.2080 (correct) max_entropy = 1.2147 (correct) max_entropy = 1.2458 (correct) max_entropy = 1.2676 (correct) max_entropy = 1.5121 (correct) max_entropy = 1.5393 (correct) max_entropy = 1.5437 (correct) mean 0.794 Incorrect n=8 max_entropy = 0.6928 (incorrect) max_entropy = 0.7856 (incorrect) max_entropy = 0.7948 (incorrect) max_entropy = 0.8177 (incorrect) max_entropy = 0.9352 (incorrect) max_entropy = 1.0384 (incorrect) max_entropy = 1.0893 (incorrect) max_entropy = 1.6358 (incorrect) mean 0.974

Correct generations averaged max_entropy 0.794; incorrect ones 0.974. The groups are shifted, not merely overlapping — this is the separation the rule above is built on.

A permutation test puts that difference at p=0.1511, against an alpha of 0.05. Reshuffling which generations were labelled correct reproduces a gap this large routinely.

Across 146 candidate statistics the largest effect was plateau_start_quartile at d=-1.327 (high=bad), and it does not survive correction for the number tested.

4 of 8 failures were recoverable by at least one repair strategy. Recovery is measured directly — break it, repair it, re-run the tests — so these counts do not depend on any of the statistical argument above.

Power: underpowered. This run could only reliably detect an effect of d>=1.06; the effect it saw was d=-0.55. That means this run cannot tell 'no entropy signal' apart from 'too few failures to see one'. Re-running with --repeats 4 (this run used 1) would give ~80% power on an effect that size.

Every candidate signal, corrected

All 146 numeric statistics were tested against the same pass/fail outcome, so raw p-values are corrected with Benjamini-Hochberg FDR. A statistic is called usable only if its adjusted p clears 0.05 and |d| ≥ 0.2. The shaded band is what this run was too small to detect at all.

too small for this run to detect (|d| < 1.06) -1 0 1 ← higher on incorrect Cohen's d higher on correct → plateau_start_quartile plateau_start_quartile: d=-1.327, p=0.0162, adjusted p=0.1478 — not usable -1.33 margin_mean margin_mean: d=+1.230, p=0.0009, adjusted p=0.0584 — not usable +1.23 mass1_mean mass1_mean: d=+1.187, p=0.0014, adjusted p=0.0584 — not usable +1.19 phi_mean phi_mean: d=+1.187, p=0.0014, adjusted p=0.0584 — not usable +1.19 surprisal_mean surprisal_mean: d=-1.169, p=0.0016, adjusted p=0.0584 — not usable -1.17 mass5_f10_max mass5_f10_max: d=+1.167, p=0.0043, adjusted p=0.0698 — not usable +1.17 kl_uniform_mean kl_uniform_mean: d=+1.119, p=0.0029, adjusted p=0.0584 — not usable +1.12 mean_entropy mean_entropy: d=-1.119, p=0.0029, adjusted p=0.0584 — not usable -1.12 full_ent_mean full_ent_mean: d=-1.118, p=0.0029, adjusted p=0.0584 — not usable -1.12 margin_std margin_std: d=-1.114, p=0.0032, adjusted p=0.0584 — not usable -1.11 kl_step_mean kl_step_mean: d=+1.046, p=0.0049, adjusted p=0.0715 — not usable +1.05 mass1_std mass1_std: d=-1.034, p=0.0068, adjusted p=0.0903 — not usable -1.03 q3 q3: d=-1.001, p=0.0100, adjusted p=0.1123 — not usable -1.00 surprisal_std surprisal_std: d=-0.976, p=0.0097, adjusted p=0.1123 — not usable -0.98 spike_token_idx spike_token_idx: d=-0.970, p=0.0131, adjusted p=0.1366 — not usable -0.97 kl_step_std kl_step_std: d=-0.906, p=0.0146, adjusted p=0.1421 — not usable -0.91 kl_uniform_std kl_uniform_std: d=-0.892, p=0.0186, adjusted p=0.1525 — not usable -0.89 full_ent_std full_ent_std: d=-0.891, p=0.0188, adjusted p=0.1525 — not usable -0.89 osc_rate osc_rate: d=+0.870, p=0.0213, adjusted p=0.1637 — not usable +0.87 kl_step_early_vs_rest kl_step_early_vs_rest: d=-0.861, p=0.0241, adjusted p=0.1759 — not usable -0.86 kl_cent_late_minus_early kl_cent_late_minus_early: d=-0.790, p=0.0371, adjusted p=0.2526 — not usable -0.79 margin_f10_mean margin_f10_mean: d=+0.771, p=0.0396, adjusted p=0.2526 — not usable +0.77 mono_down_frac mono_down_frac: d=-0.759, p=0.0398, adjusted p=0.2526 — not usable -0.76 mass20_late_minus_early mass20_late_minus_early: d=+0.753, p=0.0612, adjusted p=0.2553 — not usable +0.75 tail_mass_late_minus_early tail_mass_late_minus_early: d=-0.753, p=0.0612, adjusted p=0.2553 — not usable -0.75 spike_height spike_height: d=+0.748, p=0.0474, adjusted p=0.2553 — not usable +0.75 spike_quartile spike_quartile: d=-0.748, p=0.0593, adjusted p=0.2553 — not usable -0.75 mass1_f10_mean mass1_f10_mean: d=+0.740, p=0.0479, adjusted p=0.2553 — not usable +0.74 phi_first10_mean phi_first10_mean: d=+0.740, p=0.0479, adjusted p=0.2553 — not usable +0.74 surprisal_f10_mean surprisal_f10_mean: d=-0.720, p=0.0540, adjusted p=0.2553 — not usable -0.72 q1 q1: d=-0.713, p=0.0601, adjusted p=0.2553 — not usable -0.71 head_entropy head_entropy: d=-0.712, p=0.0601, adjusted p=0.2553 — not usable -0.71 first10_mean first10_mean: d=-0.711, p=0.0595, adjusted p=0.2553 — not usable -0.71 full_ent_f10_mean full_ent_f10_mean: d=-0.711, p=0.0595, adjusted p=0.2553 — not usable -0.71 kl_uniform_f10_mean kl_uniform_f10_mean: d=+0.711, p=0.0595, adjusted p=0.2553 — not usable +0.71 surprisal_f10_max surprisal_f10_max: d=-0.661, p=0.0850, adjusted p=0.3135 — not usable -0.66 margin_min margin_min: d=+0.652, p=0.0826, adjusted p=0.3135 — not usable +0.65 total_variation total_variation: d=-0.651, p=0.0859, adjusted p=0.3135 — not usable -0.65 mass20_min mass20_min: d=+0.650, p=0.0759, adjusted p=0.2995 — not usable +0.65 tail_mass_max tail_mass_max: d=-0.650, p=0.0759, adjusted p=0.2995 — not usable -0.65 q4 q4: d=-0.608, p=0.0996, adjusted p=0.3547 — not usable -0.61 mass1_min mass1_min: d=+0.595, p=0.1166, adjusted p=0.3869 — not usable +0.59 first10_std first10_std: d=-0.582, p=0.1344, adjusted p=0.4085 — not usable -0.58 spike_relative_pos spike_relative_pos: d=-0.575, p=0.1303, adjusted p=0.4085 — not usable -0.57 first10_max first10_max: d=-0.573, p=0.1409, adjusted p=0.4085 — not usable -0.57 full_ent_f10_max full_ent_f10_max: d=-0.573, p=0.1409, adjusted p=0.4085 — not usable -0.57 surprisal_max surprisal_max: d=-0.572, p=0.1354, adjusted p=0.4085 — not usable -0.57 trend_rho trend_rho: d=+0.556, p=0.1501, adjusted p=0.4085 — not usable +0.56 full_ent_max full_ent_max: d=-0.552, p=0.1506, adjusted p=0.4085 — not usable -0.55 kl_uniform_min kl_uniform_min: d=+0.551, p=0.1511, adjusted p=0.4085 — not usable +0.55 max_entropy max_entropy: d=-0.551, p=0.1511, adjusted p=0.4085 — not usable -0.55 n_semantic n_semantic: d=-0.484, p=0.2108, adjusted p=0.5496 — not usable -0.48 n_tokens n_tokens: d=-0.484, p=0.2108, adjusted p=0.5496 — not usable -0.48 mass20_std mass20_std: d=-0.482, p=0.1148, adjusted p=0.3869 — not usable -0.48 tail_mass_std tail_mass_std: d=-0.482, p=0.1148, adjusted p=0.3869 — not usable -0.48 q2 q2: d=-0.414, p=0.2863, adjusted p=0.7207 — not usable -0.41 kl_cent_slope kl_cent_slope: d=-0.411, p=0.2715, adjusted p=0.6954 — not usable -0.41 kl_step_late_minus_early kl_step_late_minus_early: d=+0.388, p=0.3137, adjusted p=0.7633 — not usable +0.39 kl_cent_f5_mean kl_cent_f5_mean: d=+0.371, p=0.3434, adjusted p=0.8219 — not usable +0.37 mass5_slope mass5_slope: d=+0.353, p=0.1426, adjusted p=0.4085 — not usable +0.35 mass5_late_minus_early mass5_late_minus_early: d=+0.327, p=0.3135, adjusted p=0.7633 — not usable +0.33 early_slope early_slope: d=-0.319, p=0.4126, adjusted p=0.9268 — not usable -0.32 full_ent_slope full_ent_slope: d=-0.319, p=0.4126, adjusted p=0.9268 — not usable -0.32 kl_uniform_slope kl_uniform_slope: d=+0.319, p=0.4126, adjusted p=0.9268 — not usable +0.32 q_slope q_slope: d=+0.316, p=0.4121, adjusted p=0.9268 — not usable +0.32 kl_cent_std kl_cent_std: d=+0.310, p=0.4227, adjusted p=0.9351 — not usable +0.31 q_range q_range: d=-0.305, p=0.4308, adjusted p=0.9388 — not usable -0.30 margin_early_vs_rest margin_early_vs_rest: d=+0.286, p=0.4670, adjusted p=1.0000 — not usable +0.29 q_curvature q_curvature: d=+0.262, p=0.4735, adjusted p=1.0000 — not usable +0.26 mass1_early_vs_rest mass1_early_vs_rest: d=+0.262, p=0.5002, adjusted p=1.0000 — not usable +0.26 kl_step_slope kl_step_slope: d=-0.250, p=0.5001, adjusted p=1.0000 — not usable -0.25 mass20_mean mass20_mean: d=+0.244, p=0.5042, adjusted p=1.0000 — not usable +0.24 tail_mass_mean tail_mass_mean: d=-0.244, p=0.5042, adjusted p=1.0000 — not usable -0.24 kl_step_f10_max kl_step_f10_max: d=-0.243, p=0.7488, adjusted p=1.0000 — not usable -0.24 surprisal_early_vs_rest surprisal_early_vs_rest: d=-0.239, p=0.5381, adjusted p=1.0000 — not usable -0.24 q1_over_mean q1_over_mean: d=+0.227, p=0.5566, adjusted p=1.0000 — not usable +0.23 margin_f5_mean margin_f5_mean: d=+0.223, p=0.6211, adjusted p=1.0000 — not usable +0.22 mass1_slope mass1_slope: d=+0.222, p=0.5705, adjusted p=1.0000 — not usable +0.22 early_vs_rest early_vs_rest: d=-0.212, p=0.5807, adjusted p=1.0000 — not usable -0.21 kl_uniform_early_vs_rest kl_uniform_early_vs_rest: d=+0.212, p=0.5807, adjusted p=1.0000 — not usable +0.21 full_ent_early_vs_rest full_ent_early_vs_rest: d=-0.211, p=0.5813, adjusted p=1.0000 — not usable -0.21 margin_slope margin_slope: d=+0.207, p=0.5970, adjusted p=1.0000 — not usable +0.21 mass5_min mass5_min: d=+0.201, p=0.6551, adjusted p=1.0000 — not usable +0.20 surprisal_slope surprisal_slope: d=-0.193, p=0.6244, adjusted p=1.0000 — not usable -0.19 tail_entropy tail_entropy: d=-0.191, p=0.6440, adjusted p=1.0000 — not usable -0.19 mass5_max mass5_max: d=-0.190, p=0.8928, adjusted p=1.0000 — not usable -0.19 mass1_first mass1_first: d=-0.189, p=0.9602, adjusted p=1.0000 — not usable -0.19 phi_first phi_first: d=-0.189, p=0.9602, adjusted p=1.0000 — not usable -0.19 surprisal_first surprisal_first: d=+0.189, p=0.9602, adjusted p=1.0000 — not usable +0.19 margin_first margin_first: d=-0.189, p=0.9640, adjusted p=1.0000 — not usable -0.19 mass20_early_vs_rest mass20_early_vs_rest: d=-0.184, p=0.6126, adjusted p=1.0000 — not usable -0.18 tail_mass_early_vs_rest tail_mass_early_vs_rest: d=+0.184, p=0.6126, adjusted p=1.0000 — not usable +0.18 mass20_slope mass20_slope: d=+0.184, p=0.6916, adjusted p=1.0000 — not usable +0.18 tail_mass_slope tail_mass_slope: d=-0.184, p=0.6916, adjusted p=1.0000 — not usable -0.18 mass1_f5_mean mass1_f5_mean: d=+0.179, p=0.6183, adjusted p=1.0000 — not usable +0.18 margin_max margin_max: d=-0.176, p=0.8813, adjusted p=1.0000 — not usable -0.18 late_vs_early_half late_vs_early_half: d=-0.175, p=0.6472, adjusted p=1.0000 — not usable -0.17 surprisal_f5_mean surprisal_f5_mean: d=-0.174, p=0.6271, adjusted p=1.0000 — not usable -0.17 first3_mean first3_mean: d=+0.172, p=0.9597, adjusted p=1.0000 — not usable +0.17 first_to_max_ratio first_to_max_ratio: d=+0.172, p=0.9761, adjusted p=1.0000 — not usable +0.17 first_token_entropy first_token_entropy: d=+0.171, p=0.9595, adjusted p=1.0000 — not usable +0.17 full_ent_first full_ent_first: d=+0.171, p=0.9595, adjusted p=1.0000 — not usable +0.17 kl_uniform_first kl_uniform_first: d=-0.171, p=0.9595, adjusted p=1.0000 — not usable -0.17 kl_uniform_max kl_uniform_max: d=-0.169, p=0.8817, adjusted p=1.0000 — not usable -0.17 full_ent_min full_ent_min: d=+0.168, p=0.8817, adjusted p=1.0000 — not usable +0.17 mass1_max mass1_max: d=-0.168, p=0.8817, adjusted p=1.0000 — not usable -0.17 surprisal_min surprisal_min: d=+0.168, p=0.8820, adjusted p=1.0000 — not usable +0.17 kl_step_max kl_step_max: d=-0.168, p=0.8840, adjusted p=1.0000 — not usable -0.17 n_spikes n_spikes: d=+0.167, p=0.8213, adjusted p=1.0000 — not usable +0.17 full_ent_late_minus_early full_ent_late_minus_early: d=-0.165, p=0.6660, adjusted p=1.0000 — not usable -0.17 kl_uniform_late_minus_early kl_uniform_late_minus_early: d=+0.164, p=0.6679, adjusted p=1.0000 — not usable +0.16 kl_step_f5_mean kl_step_f5_mean: d=+0.161, p=0.6784, adjusted p=1.0000 — not usable +0.16 q_monotone_down q_monotone_down: d=-0.157, p=0.7616, adjusted p=1.0000 — not usable -0.16 q4_over_mean q4_over_mean: d=-0.155, p=0.6951, adjusted p=1.0000 — not usable -0.15 kl_cent_f10_max kl_cent_f10_max: d=-0.153, p=0.7143, adjusted p=1.0000 — not usable -0.15 mass5_f5_mean mass5_f5_mean: d=-0.144, p=0.8753, adjusted p=1.0000 — not usable -0.14 first5_mean first5_mean: d=-0.137, p=0.6587, adjusted p=1.0000 — not usable -0.14 full_ent_f5_mean full_ent_f5_mean: d=-0.137, p=0.6587, adjusted p=1.0000 — not usable -0.14 kl_uniform_f5_mean kl_uniform_f5_mean: d=+0.137, p=0.6587, adjusted p=1.0000 — not usable +0.14 q_early_drop q_early_drop: d=-0.124, p=0.7576, adjusted p=1.0000 — not usable -0.12 mass5_std mass5_std: d=-0.112, p=0.7969, adjusted p=1.0000 — not usable -0.11 mass5_mean mass5_mean: d=+0.111, p=0.8055, adjusted p=1.0000 — not usable +0.11 mass5_early_vs_rest mass5_early_vs_rest: d=-0.106, p=0.8274, adjusted p=1.0000 — not usable -0.11 path_ratio path_ratio: d=-0.106, p=0.8331, adjusted p=1.0000 — not usable -0.11 kl_step_f10_mean kl_step_f10_mean: d=+0.105, p=0.7797, adjusted p=1.0000 — not usable +0.10 mass1_late_minus_early mass1_late_minus_early: d=+0.101, p=0.7940, adjusted p=1.0000 — not usable +0.10 osc_sign_changes osc_sign_changes: d=-0.099, p=0.8073, adjusted p=1.0000 — not usable -0.10 mass20_f5_mean mass20_f5_mean: d=-0.094, p=0.9630, adjusted p=1.0000 — not usable -0.09 tail_mass_f5_mean tail_mass_f5_mean: d=+0.094, p=0.9630, adjusted p=1.0000 — not usable +0.09 surprisal_late_minus_early surprisal_late_minus_early: d=-0.084, p=0.8271, adjusted p=1.0000 — not usable -0.08 kl_cent_max kl_cent_max: d=-0.073, p=0.8814, adjusted p=1.0000 — not usable -0.07 margin_late_minus_early margin_late_minus_early: d=+0.066, p=0.8646, adjusted p=1.0000 — not usable +0.07 kl_cent_early_vs_rest kl_cent_early_vs_rest: d=+0.063, p=0.8730, adjusted p=1.0000 — not usable +0.06 kl_cent_mean kl_cent_mean: d=-0.058, p=0.8779, adjusted p=1.0000 — not usable -0.06 mass20_f10_mean mass20_f10_mean: d=-0.045, p=0.9967, adjusted p=1.0000 — not usable -0.04 tail_mass_f10_mean tail_mass_f10_mean: d=+0.045, p=0.9967, adjusted p=1.0000 — not usable +0.04 q_argmax q_argmax: d=+0.045, p=1.0000, adjusted p=1.0000 — not usable +0.04 kl_uniform_f10_max kl_uniform_f10_max: d=+0.043, p=0.9317, adjusted p=1.0000 — not usable +0.04 mass5_first mass5_first: d=-0.033, p=0.9501, adjusted p=1.0000 — not usable -0.03 mass20_first mass20_first: d=+0.027, p=0.9642, adjusted p=1.0000 — not usable +0.03 tail_mass_first tail_mass_first: d=-0.027, p=0.9642, adjusted p=1.0000 — not usable -0.03 tail_mass_f10_max tail_mass_f10_max: d=-0.025, p=0.9945, adjusted p=1.0000 — not usable -0.03 mass1_f10_max mass1_f10_max: d=+0.022, p=0.9624, adjusted p=1.0000 — not usable +0.02 mass5_f10_mean mass5_f10_mean: d=-0.015, p=0.9973, adjusted p=1.0000 — not usable -0.01 margin_f10_max margin_f10_max: d=-0.014, p=0.9742, adjusted p=1.0000 — not usable -0.01 kl_cent_f10_mean kl_cent_f10_mean: d=+0.007, p=0.9898, adjusted p=1.0000 — not usable +0.01
Table view — all signals
SignalDirectiondpp adjustedUsable
margin_meanhigh=good+1.2300.00090.0584no
mass1_meanhigh=good+1.1870.00140.0584no
phi_meanhigh=good+1.1870.00140.0584no
surprisal_meanhigh=bad-1.1690.00160.0584no
full_ent_meanhigh=bad-1.1180.00290.0584no
kl_uniform_meanhigh=good+1.1190.00290.0584no
mean_entropyhigh=bad-1.1190.00290.0584no
margin_stdhigh=bad-1.1140.00320.0584no
mass5_f10_maxhigh=good+1.1670.00430.0698no
kl_step_meanhigh=good+1.0460.00490.0715no
mass1_stdhigh=bad-1.0340.00680.0903no
surprisal_stdhigh=bad-0.9760.00970.1123no
q3high=bad-1.0010.01000.1123no
spike_token_idxhigh=bad-0.9700.01310.1366no
kl_step_stdhigh=bad-0.9060.01460.1421no
plateau_start_quartilehigh=bad-1.3270.01620.1478no
kl_uniform_stdhigh=bad-0.8920.01860.1525no
full_ent_stdhigh=bad-0.8910.01880.1525no
osc_ratehigh=good+0.8700.02130.1637no
kl_step_early_vs_resthigh=bad-0.8610.02410.1759no
kl_cent_late_minus_earlyhigh=bad-0.7900.03710.2526no
margin_f10_meanhigh=good+0.7710.03960.2526no
mono_down_frachigh=bad-0.7590.03980.2526no
spike_heighthigh=good+0.7480.04740.2553no
mass1_f10_meanhigh=good+0.7400.04790.2553no
phi_first10_meanhigh=good+0.7400.04790.2553no
surprisal_f10_meanhigh=bad-0.7200.05400.2553no
spike_quartilehigh=bad-0.7480.05930.2553no
first10_meanhigh=bad-0.7110.05950.2553no
full_ent_f10_meanhigh=bad-0.7110.05950.2553no
kl_uniform_f10_meanhigh=good+0.7110.05950.2553no
head_entropyhigh=bad-0.7120.06010.2553no
q1high=bad-0.7130.06010.2553no
mass20_late_minus_earlyhigh=good+0.7530.06120.2553no
tail_mass_late_minus_earlyhigh=bad-0.7530.06120.2553no
mass20_minhigh=good+0.6500.07590.2995no
tail_mass_maxhigh=bad-0.6500.07590.2995no
margin_minhigh=good+0.6520.08260.3135no
surprisal_f10_maxhigh=bad-0.6610.08500.3135no
total_variationhigh=bad-0.6510.08590.3135no
q4high=bad-0.6080.09960.3547no
mass20_stdhigh=bad-0.4820.11480.3869no
tail_mass_stdhigh=bad-0.4820.11480.3869no
mass1_minhigh=good+0.5950.11660.3869no
spike_relative_poshigh=bad-0.5750.13030.4085no
first10_stdhigh=bad-0.5820.13440.4085no
surprisal_maxhigh=bad-0.5720.13540.4085no
first10_maxhigh=bad-0.5730.14090.4085no
full_ent_f10_maxhigh=bad-0.5730.14090.4085no
mass5_slopehigh=good+0.3530.14260.4085no
trend_rhohigh=good+0.5560.15010.4085no
full_ent_maxhigh=bad-0.5520.15060.4085no
kl_uniform_minhigh=good+0.5510.15110.4085no
max_entropyhigh=bad-0.5510.15110.4085no
n_semantichigh=bad-0.4840.21080.5496no
n_tokenshigh=bad-0.4840.21080.5496no
kl_cent_slopehigh=bad-0.4110.27150.6954no
q2high=bad-0.4140.28630.7207no
mass5_late_minus_earlyhigh=good+0.3270.31350.7633no
kl_step_late_minus_earlyhigh=good+0.3880.31370.7633no
kl_cent_f5_meanhigh=good+0.3710.34340.8219no
q_slopehigh=good+0.3160.41210.9268no
early_slopehigh=bad-0.3190.41260.9268no
full_ent_slopehigh=bad-0.3190.41260.9268no
kl_uniform_slopehigh=good+0.3190.41260.9268no
kl_cent_stdhigh=good+0.3100.42270.9351no
q_rangehigh=bad-0.3050.43080.9388no
margin_early_vs_resthigh=good+0.2860.46701.0000no
q_curvaturehigh=good+0.2620.47351.0000no
kl_step_slopehigh=bad-0.2500.50011.0000no
mass1_early_vs_resthigh=good+0.2620.50021.0000no
mass20_meanhigh=good+0.2440.50421.0000no
tail_mass_meanhigh=bad-0.2440.50421.0000no
surprisal_early_vs_resthigh=bad-0.2390.53811.0000no
q1_over_meanhigh=good+0.2270.55661.0000no
mass1_slopehigh=good+0.2220.57051.0000no
early_vs_resthigh=bad-0.2120.58071.0000no
kl_uniform_early_vs_resthigh=good+0.2120.58071.0000no
full_ent_early_vs_resthigh=bad-0.2110.58131.0000no
margin_slopehigh=good+0.2070.59701.0000no
mass20_early_vs_resthigh=bad-0.1840.61261.0000no
tail_mass_early_vs_resthigh=good+0.1840.61261.0000no
mass1_f5_meanhigh=good+0.1790.61831.0000no
margin_f5_meanhigh=good+0.2230.62111.0000no
surprisal_slopehigh=bad-0.1930.62441.0000no
surprisal_f5_meanhigh=bad-0.1740.62711.0000no
tail_entropyhigh=bad-0.1910.64401.0000no
late_vs_early_halfhigh=bad-0.1750.64721.0000no
mass5_minhigh=good+0.2010.65511.0000no
first5_meanhigh=bad-0.1370.65871.0000no
full_ent_f5_meanhigh=bad-0.1370.65871.0000no
kl_uniform_f5_meanhigh=good+0.1370.65871.0000no
full_ent_late_minus_earlyhigh=bad-0.1650.66601.0000no
kl_uniform_late_minus_earlyhigh=good+0.1640.66791.0000no
kl_step_f5_meanhigh=good+0.1610.67841.0000no
mass20_slopehigh=good+0.1840.69161.0000no
tail_mass_slopehigh=bad-0.1840.69161.0000no
q4_over_meanhigh=bad-0.1550.69511.0000no
kl_cent_f10_maxhigh=bad-0.1530.71431.0000no
kl_step_f10_maxhigh=bad-0.2430.74881.0000no
q_early_drophigh=bad-0.1240.75761.0000no
q_monotone_downhigh=bad-0.1570.76161.0000no
kl_step_f10_meanhigh=good+0.1050.77971.0000no
mass1_late_minus_earlyhigh=good+0.1010.79401.0000no
mass5_stdhigh=bad-0.1120.79691.0000no
mass5_meanhigh=good+0.1110.80551.0000no
osc_sign_changeshigh=bad-0.0990.80731.0000no
n_spikeshigh=good+0.1670.82131.0000no
surprisal_late_minus_earlyhigh=bad-0.0840.82711.0000no
mass5_early_vs_resthigh=bad-0.1060.82741.0000no
path_ratiohigh=bad-0.1060.83311.0000no
margin_late_minus_earlyhigh=good+0.0660.86461.0000no
kl_cent_early_vs_resthigh=good+0.0630.87301.0000no
mass5_f5_meanhigh=bad-0.1440.87531.0000no
kl_cent_meanhigh=bad-0.0580.87791.0000no
margin_maxhigh=bad-0.1760.88131.0000no
kl_cent_maxhigh=bad-0.0730.88141.0000no
full_ent_minhigh=good+0.1680.88171.0000no
kl_uniform_maxhigh=bad-0.1690.88171.0000no
mass1_maxhigh=bad-0.1680.88171.0000no
surprisal_minhigh=good+0.1680.88201.0000no
kl_step_maxhigh=bad-0.1680.88401.0000no
mass5_maxhigh=bad-0.1900.89281.0000no
kl_uniform_f10_maxhigh=good+0.0430.93171.0000no
mass5_firsthigh=bad-0.0330.95011.0000no
first_token_entropyhigh=good+0.1710.95951.0000no
full_ent_firsthigh=good+0.1710.95951.0000no
kl_uniform_firsthigh=bad-0.1710.95951.0000no
first3_meanhigh=good+0.1720.95971.0000no
mass1_firsthigh=bad-0.1890.96021.0000no
phi_firsthigh=bad-0.1890.96021.0000no
surprisal_firsthigh=good+0.1890.96021.0000no
mass1_f10_maxhigh=good+0.0220.96241.0000no
mass20_f5_meanhigh=bad-0.0940.96301.0000no
tail_mass_f5_meanhigh=good+0.0940.96301.0000no
margin_firsthigh=bad-0.1890.96401.0000no
mass20_firsthigh=good+0.0270.96421.0000no
tail_mass_firsthigh=bad-0.0270.96421.0000no
margin_f10_maxhigh=bad-0.0140.97421.0000no
first_to_max_ratiohigh=good+0.1720.97611.0000no
kl_cent_f10_meanhigh=good+0.0070.98981.0000no
tail_mass_f10_maxhigh=bad-0.0250.99451.0000no
mass20_f10_meanhigh=bad-0.0450.99671.0000no
tail_mass_f10_meanhigh=good+0.0450.99671.0000no
mass5_f10_meanhigh=bad-0.0150.99731.0000no
q_argmaxhigh=good+0.0451.00001.0000no

Which set of signals covers the most failures

Not run: needs ~12+ failures to cross-validate a combination (8 present). Raise --repeats.

What repairs failures

Direct measurement, not correlation: each failed generation was re-attempted with every strategy and re-tested. Nothing in this section depends on the entropy question above.

0 1 2 3 failures recovered (of 8) skeleton_fill skeleton_fill: recovered 3 of 8 failures, 1 of them recovered by nothing else 3 (38%) · 1 only here test_retry test_retry: recovered 3 of 8 failures, 1 of them recovered by nothing else 3 (38%) · 1 only here temp_retry 0 (0%)

Routing by error type

logic errors
25%50%75%100%skeleton_fillskeleton_fill on logic errors: 1/4 recovered (25%)1/4test_retrytest_retry on logic errors: 1/4 recovered (25%)1/4temp_retry0/4
assertion errors
25%50%75%100%skeleton_fillskeleton_fill on assertion errors: 2/3 recovered (67%)2/3test_retrytest_retry on assertion errors: 2/3 recovered (67%)2/3temp_retry0/3
syntax errors
25%50%75%100%skeleton_fill0/1temp_retry0/1test_retry0/1

What shows promise

Leads, not findings. Each one names the run that would settle it.

margin_mean

d=+1.230, raw p=0.0009, adjusted p=0.0584. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
mass1_mean

d=+1.187, raw p=0.0014, adjusted p=0.0584. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
phi_mean

d=+1.187, raw p=0.0014, adjusted p=0.0584. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
surprisal_mean

d=-1.169, raw p=0.0016, adjusted p=0.0584. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
full_ent_mean

d=-1.118, raw p=0.0029, adjusted p=0.0584. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
kl_uniform_mean

d=+1.119, raw p=0.0029, adjusted p=0.0584. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
mean_entropy

d=-1.119, raw p=0.0029, adjusted p=0.0584. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
margin_std

d=-1.114, raw p=0.0032, adjusted p=0.0584. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
mass5_f10_max

d=+1.167, raw p=0.0043, adjusted p=0.0698. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
kl_step_mean

d=+1.046, raw p=0.0049, adjusted p=0.0715. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
mass1_std

d=-1.034, raw p=0.0068, adjusted p=0.0903. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
surprisal_std

d=-0.976, raw p=0.0097, adjusted p=0.1123. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
q3

d=-1.001, raw p=0.0100, adjusted p=0.1123. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
spike_token_idx

d=-0.970, raw p=0.0131, adjusted p=0.1366. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
kl_step_std

d=-0.906, raw p=0.0146, adjusted p=0.1421. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
plateau_start_quartile

d=-1.327, raw p=0.0162, adjusted p=0.1478. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
kl_uniform_std

d=-0.892, raw p=0.0186, adjusted p=0.1525. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
full_ent_std

d=-0.891, raw p=0.0188, adjusted p=0.1525. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
osc_rate

d=+0.870, raw p=0.0213, adjusted p=0.1637. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
kl_step_early_vs_rest

d=-0.861, raw p=0.0241, adjusted p=0.1759. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
kl_cent_late_minus_early

d=-0.790, raw p=0.0371, adjusted p=0.2526. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
margin_f10_mean

d=+0.771, raw p=0.0396, adjusted p=0.2526. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
mono_down_frac

d=-0.759, raw p=0.0398, adjusted p=0.2526. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
spike_height

d=+0.748, raw p=0.0474, adjusted p=0.2553. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
mass1_f10_mean

d=+0.740, raw p=0.0479, adjusted p=0.2553. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
phi_first10_mean

d=+0.740, raw p=0.0479, adjusted p=0.2553. Clears p<0.05 on its own but not after correcting for the 146 statistics tested against the same outcome. With that many tests, one or two hits at p<0.05 is what noise looks like.

To settle it: Pre-register it: decide in advance to test this one statistic on a fresh run and report that result whichever way it goes. Re-scanning and picking the new winner is how the original mistake happened.
More failures would settle the entropy question

This run saw d=-0.55 and could only reliably detect d≥1.06. That gap is why the verdict is 'none' rather than 'no'.

To settle it: Re-run with --repeats 4 (this run used 1). The run checkpoints after every generation, so it can be stopped and resumed.

Settings this run used

ParameterValueSource
min_p0.0registry (card-verified)
presence_penalty0.0registry (card-verified)
repeat_penalty1.0registry (card-verified)
temp0.0registry (card-verified)
top_k0registry (card-verified)
top_p1.0registry (card-verified)
thinkingFalseregistry (card-verified)

Generated by the Local Model Calibration Kit. Raw records for every generation and repair attempt are in the run’s _raw.jsonl; calibrate.py reanalyze rebuilds this report from them without re-running the model.