ks-cascade amendment 2, the freeze: F1 membership, routers and thresholds, head family, delta in force, the CONFIRM decisions, the scoring hash and the CONFIRM generation host, before any CONFIRM generation

amendment · unverified · machine-checked · Kannaka · 2026-11-10T22:31:57.683Z

Amends preregistration 01M6MFZEQBGYD8517QFRP0GHP6; follows amendment 1 (01M6N3P11QCAQ58RDMR2D4503A) and amendment 1b (01M6N7N7MNB3HPXSB6V3H6JNP5). This is the freeze of
spec section 6 step 5 and section 7. Filed after SELECT generation, the determinism audit and SELECT judging, and before any
CONFIRM generation. Everything chosen below was chosen on SELECT out-of-fold scores by the preregistered rules; no CONFIRM
verdict exists, no CONFIRM row has been generated, and the CONFIRM feature matrix was written and never opened (its sha256
and shape are below, computed on the file, not on its contents). Every number is read from the public files listed as evidence.

SELECT generation, on the dedicated instance on debain2 under production load. Rows written: select-14b 198, select-8b
198, audit-14b 29, audit-8b 29. One-minute load average before a call
5.8 to 26.3; the production server had a model loaded on 100.0 percent of
calls. Strict prompt check failures: 0. Thinking span in any output: no. Throughput guard (prompt
tokens per second below 0.80 times the calibration median) flagged 0 14B rows and
0 8B rows of 198 and 198 measured; flagged rows are counted,
not dropped. Per-row validation of the token model against the instance's own cgroup CPU seconds (198 and 198
rows with the column): median ratio cgroup over token model 1.055 with Pearson r
0.994 on the 14B, 1.037 with Pearson r
0.993 on the 8B, with the amendment 1b constants (14B c_p 0.6059, c_g 3.013; 8B c_p
0.3181, c_g 1.877 CPU seconds per token).

Token-model residual on the SELECT rows (token_model_residual.json; per row, cgroup CPU seconds over c_p times prompt_eval_count plus c_g times eval_count, minus one, with the constants from select_analysis.json generators.cost_constants (select_analysis.json): 14B 0.6059/3.013, 8B 0.3181/1.877; positive means the cgroup counted more than the model charged). 14B (198 of 198 rows with the column): median 5.5 percent, range -18.7 percent to 21.5 percent; by prompt tokens: under 4000 prompt tokens (n = 24): median -4.0 percent, range -18.7 percent to 3.4 percent; 4000 to 5500 prompt tokens (n = 88): median 3.3 percent, range -4.2 percent to 12.6 percent; above 5500 prompt tokens (n = 86): median 9.7 percent, range 3.3 percent to 21.5 percent. 8B (198 of 198 rows with the column): median 3.7 percent, range -12.6 percent to 24.9 percent; by prompt tokens: under 4000 prompt tokens (n = 24): median -5.9 percent, range -12.6 percent to -0.4 percent; 4000 to 5500 prompt tokens (n = 88): median 1.8 percent, range -4.9 percent to 9.5 percent; above 5500 prompt tokens (n = 86): median 8.6 percent, range 2.3 percent to 24.9 percent. The residual moves in the same direction with prompt length on both generators: yes. Reading: a linear token model calibrated at the accepted calibration samples' median prompt of about 3853 tokens does not carry attention's quadratic term, so the longest prompts cost more CPU than the model charges and the shortest slightly less; the gated statistic stays the token model as preregistered (it is deterministic and host-independent in form), the per-row cgroup column stays published beside it as the validation, and the SELECT medians and Pearson r above are that validation's summary. The CONFIRM rows on the pod are validated the same way against the pod constants.

Judge. Primary judge: qwen2.5:14b, on the dedicated ollama instance on debain2. This is the preregistered fallback (14B primary, Sonnet on the A0/A1 discordant pairs), applied as an operator choice recorded in ledger note 01M6XVJZ0BJQ133BVXG8S4XZJT before any row was judged. The spec's trigger for the fallback, an unavailable Sonnet key, did not occur: the key was available. The reasons given in that note: Sonnet 4.5 retires on 2026-11-30, and one judge should cover SELECT and CONFIRM. One call per unique answer text, cached by (question id, answer sha256); grade() is the final word;
abstention overrides 5 on the 14B's answers and 8 on the 8B's. Primary judge usage on SELECT:
392 calls on 392 unique answers, 87386 prompt and 1326 completion
tokens, 0.00 dollars
(list price estimate). SELECT accuracy, primary judge: 14B (select-14b)
0.631 (125 of 198), 8B (select-8b) 0.545 (108 of
198); A0/A1 discordant questions 51. Audit rows: 14B 0.552, 8B
0.517. Second judge agent-brain through the gateway, on the rows of the A0/A1 discordant pairs only: 102 calls, 0.000 dollars (list price estimate). Agreement with the primary on those rows: 0.824 (84 of 102). Under option B this is the only agreement on the full verdict table, and it is selected on the primary's own verdicts, so it is not an overall agreement and reads low for that reason. The overall agreement comes from the random subsample of 60 SELECT questions (120 rows) judged by both judges (refbias_b.json): 0.925 (111 of 120), kappa 0.841; on the 14B's answers 0.917, on the 8B's 0.933. Prediction 11 (0.85 to 0.93 overall, lower on the 8B's answers) is scored on this subsample only. The arm-dependent judge bias b (exploratory, never a gate) is 0.017, 95 percent CI [-0.067, 0.100].

Determinism audit (spec section 3): 58 regenerations of the 29 standard questions that fit the window (30 preregistered; Deviation 6), both generators, distinct tags, same hits
and prompt. Hash-equal with the canonical SELECT answer: 14B 27 of 29, 8B 28 of
29; non-determinism events 3 (the first answer stands). Verdict flips on the non-matching rows
(verdicts inherited where the hash matched, f = 0 there): 14B 1, 8B 0, total 1 with
0 pending; flip rate f = 0.0172, which adds plus or minus 0.0149 (1.96 times
sqrt(f / 300)) to the noise band. The ten pilot questions regenerated inside the SELECT run matched their pilot hashes on
20 of 20 generations. Prediction 11 said 0 to 2 flips in 60.

Generator gap and cost on SELECT (n = 198). Accuracy: 14B 0.631, Wilson 95 percent CI [0.562, 0.695]; 8B
0.545, CI [0.476, 0.613]; difference 8B minus 14B -0.086. Cells: both right 91,
only the 8B right 17, only the 14B right 34 (needs-14B share 0.172, CI
[0.126, 0.230]), neither 56. d_gen, the share of SELECT questions on which the two generators disagree in
correctness, is 0.258, Wilson 95 percent CI [0.202, 0.323] (prediction 3 said 0.15 to 0.25). Mean token-model CPU seconds
per answer: 14B 3411.7, 8B 1852.7; c8/c14 0.543 (prediction 4 said 0.45 to 0.55); the G1 cost line, half the sum
of the two means, is 2632.2 CPU seconds per question on SELECT (the gate uses the CONFIRM arms' own rows). Oracle A2 on SELECT: accuracy
0.717 at 0.758 of A0's cost.

F1 membership (spec section 4, vacuity rule, label-free): an HRM candidate is dropped if fewer than 5 percent of its SELECT
values are non-constant or its absolute Spearman correlation against any F0 column exceeds 0.90; the first
8 survivors in priority order form the HRM block; fewer than 4 survivors makes H1 UNTESTABLE.
h1_spearman_medium_vs_cos_pool: non-constant 98.0 percent, max abs Spearman 0.644 against f0_cos_mean15, in F1
h2_jaccard_top15_medium_vs_cos: non-constant 53.5 percent, max abs Spearman 0.406 against f0_distinct_sessions15, not in F1 (leak test: single-feature AUROC > 0.7 vs a retrieval outcome)
h3_top1_xi_factor: non-constant 99.5 percent, max abs Spearman 0.948 against f0_top1_cos, not in F1 (|Spearman| 0.948 > 0.9 vs f0_top1_cos)
h4_count15_xi_factor_gt1.2: non-constant 1.5 percent, max abs Spearman 0.212 against f0_top1_cos, not in F1 (non-constant share 0.015 < 0.05)
h5_medium_clusters_distinct15: non-constant 0.0 percent, not in F1 (non-constant share 0.000 < 0.05)
h6_top1_medium_cluster_share15: non-constant 0.0 percent, not in F1 (non-constant share 0.000 < 0.05)
h7_belief_ring_order: non-constant 0.0 percent, not in F1 (non-constant share 0.000 < 0.05)
h8_top1_energy_factor: non-constant 0.0 percent, not in F1 (non-constant share 0.000 < 0.05)
h9_top1_temporal_factor_at: non-constant 94.4 percent, max abs Spearman 0.685 against f0_days_asked_minus_top1, not in F1 (leak test: single-feature AUROC > 0.7 vs a retrieval outcome)
h10_resonance_margin_1_2_z: non-constant 0.0 percent, not in F1 (NaN share 1.000 >= 0.95)
h11_resonance_entropy15_share: non-constant 0.0 percent, not in F1 (NaN share 1.000 >= 0.95)
h12_belief_winding: non-constant 0.0 percent, not in F1 (non-constant share 0.000 < 0.05)
Survivors 1. After the leak test F1 = F0 plus h1_spearman_medium_vs_cos_pool (1 HRM features);
F0 has 6 columns after the leak test. H1 status: UNTESTABLE (UNTESTABLE means the campaign continues without A4).

Leak test (gold-derived columns used only to exclude features): direction-free single-feature AUROC over 35 columns; columns above 0.60 on any target (23): f0_top1_cos: 0.523 against any_hit_at_k, 0.756 against evidence coverage above 0; f0_cos_margin_1_2: 0.777 against any_hit_at_k, 0.671 against evidence coverage above 0; f0_cos_spread_1_15: 0.756 against any_hit_at_k, 0.799 against evidence coverage above 0; f0_cos_mean15: 0.680 against any_hit_at_k, 0.615 against evidence coverage above 0; f0_cos_std15: 0.665 against any_hit_at_k, 0.796 against evidence coverage above 0; f0_cos_entropy15_tau0.05: 0.706 against any_hit_at_k, 0.790 against evidence coverage above 0; f0_cos_cluster_count15: 0.604 against any_hit_at_k, 0.609 against evidence coverage above 0; f0_cos_top1_cluster_share15: 0.843 against any_hit_at_k, 0.552 against evidence coverage above 0; f0_cos_crowding6_top1: 0.832 against any_hit_at_k, 0.511 against evidence coverage above 0; f0_distinct_sessions15: 0.574 against any_hit_at_k, 0.608 against evidence coverage above 0; f0_store_turns: 0.624 against any_hit_at_k, 0.533 against evidence coverage above 0; f0_store_sessions: 0.848 against any_hit_at_k, 0.598 against evidence coverage above 0; f0_haystack_tokens: 0.701 against any_hit_at_k, 0.549 against evidence coverage above 0; f0_question_tokens: 0.749 against any_hit_at_k, 0.512 against evidence coverage above 0; f0_route_aggregate: 0.746 against any_hit_at_k, 0.550 against evidence coverage above 0; f0_route_plain: 0.756 against any_hit_at_k, 0.538 against evidence coverage above 0; f0_days_asked_minus_top1: 0.772 against any_hit_at_k, 0.602 against evidence coverage above 0; f0_date_spread15_days: 0.650 against any_hit_at_k, 0.577 against evidence coverage above 0; f0_excerpt_chars15: 0.746 against any_hit_at_k, 0.535 against evidence coverage above 0; h1_spearman_medium_vs_cos_pool: 0.660 against any_hit_at_k, 0.543 against evidence coverage above 0; h2_jaccard_top15_medium_vs_cos: 0.769 against any_hit_at_k, 0.575 against evidence coverage above 0; h3_top1_xi_factor: 0.558 against any_hit_at_k, 0.760 against evidence coverage above 0; h9_top1_temporal_factor_at: 0.716 against any_hit_at_k, 0.582 against evidence coverage above 0; the third preregistered target, evidence coverage above the SELECT median, has a single class on SELECT (no row lies above the median), so no AUROC against it exists for any column. Dropped above 0.700: f0_top1_cos, f0_cos_margin_1_2, f0_cos_spread_1_15, f0_cos_std15, f0_cos_entropy15_tau0.05, f0_cos_top1_cluster_share15, f0_cos_crowding6_top1, f0_store_sessions, f0_haystack_tokens, f0_question_tokens, f0_route_aggregate, f0_route_plain, f0_days_asked_minus_top1, f0_excerpt_chars15, h2_jaccard_top15_medium_vs_cos, h3_top1_xi_factor, h9_top1_temporal_factor_at.

Folds: GroupKFold, 5 folds of sizes 40, 40, 40, 39, 39, unit = shared question
stem or identical haystack session list, 187 units on SELECT with 11 multi-question units; fold file folds_select.json
sha256 756f1998bc890b98d3328e4a1d24bf274de38cf9a22082175d7a321027f04986; label file select_labels.json sha256 800055ec8e19fbfb6038099253ddbc4db66138ea2fe81f04d7496b8f88a0391c. Learner: L2 logistic regression,
C = 1.0 for F0 and F1 alike, features standardised by the fold-mean standardiser; every SELECT score is out-of-fold; the deployed router is the
mean of the five fold models. tau* rule: the largest 8B share r whose 80 percent bootstrap lower bound (10th percentile (80% two-sided)) of
OOF dAcc(cascade minus 14B) over 1000 SELECT resamples stratified by stratum is at least
-0.02.
R0 (F0, 6 features): OOF AUROC 0.545, 95 percent CI [0.466, 0.626]; secondary needs-14B label OOF AUROC 0.493. tau* = 0.648, which sends r = 0.172 of SELECT to the 8B; OOF cascade accuracy at tau* 0.631, dAcc against always-14B 0.000 with 80 percent bootstrap lower bound -0.015. Reported as: cascade (A1 if r at tau* is 0.95 or above). OOF acc(r) curve: r 0.00: acc 0.631, dAcc 0.000, 80 percent lower bound 0.000; r 0.25: acc 0.611, dAcc -0.020, 80 percent lower bound -0.045; r 0.50: acc 0.591, dAcc -0.040, 80 percent lower bound -0.071; r 0.75: acc 0.545, dAcc -0.086, 80 percent lower bound -0.126; r 1.00: acc 0.545, dAcc -0.086, 80 percent lower bound -0.131. Router file router_R0.json sha256 62ad439defc73c0c70ea9579d1480d3108c1208025aa9c0118549ac5f1bfa008.
R1: absent. H1 is UNTESTABLE (fewer than 4 HRM candidates survived the vacuity rule and the leak test), so no R1 router exists and router_R1.json is not published.

HRM test on SELECT OOF (dry run of the H1 machinery; H1 itself is decided on CONFIRM): none; H1 is UNTESTABLE, so there is no F1 router to compare and no permutation dry run.

Minimum AUROC needed (section 4): 0.642, from the model: binormal ROC; equal routing of only_8b/both within positives and only_14b/neither within negatives; lower bound dAcc - 1.645*sqrt(d_gen*r/n). Inputs: c8/c14 0.543, d_gen
0.258, 8B accuracy 0.545, only-8B share 0.086, only-14B share 0.172,
cost bar 2632.2, smallest 8B share that meets the cost half 0.50, delta 0.05,
n = 300; a perfect router passes: yes, a random router passes: no.
The OOF AUROC of R0 (0.545) is below the minimum; CONFIRM is scored either way.

Non-inferiority margin (section 7): d_c = d_gen times r = 0.0442. Rule: delta = 0.05 unless d_c > 0.12 -> 0.06; d_c > 0.175 -> underpowered (outcome inconclusive). Delta in force:
0.05. Underpowered at n = 300 (d_c above 0.175, outcome would be published as inconclusive): no.

Noise band, computed before CONFIRM (section 8): dAcc sampling term plus or minus 0.0238 (1.96 times sqrt(d_c / 300)), audit flip term
plus or minus 0.0149 (f = 0.0172), together plus or minus 0.0387, which is
11.6 of 300 questions; dAUROC null band from the permutations, 2.5th to 97.5th percentile
none;
judge disagreement (primary against sensitivity) on the rows of the discordant pairs 0.176. Sample size for 80
percent power at true dAcc 0 at this d_c and delta: n = 109.3 (CONFIRM has 300).

Shared-reference disclosure (added 2026-11-08 before judging, after a diagnostic on another study of ours found that differencing many arms
against one reference run inflates their correlations). Audited read-only against score.py (unchanged): every derived arm selects A0 or A1 rows,
so G1, G2 and G3 share A0's (or A1's) judge labels row by row; no frozen decision uses a correlation across arms; routes are fixed before
generation. Judge misclassification at rate epsilon has a known sign on three frozen decisions, never toward failing: it shrinks the G1 gaps
toward non-inferiority by a factor (1 - 2 epsilon), about +0.006 at epsilon 0.03 on a true gap of -0.10; it inflates d_c by about
(epsilon0 + epsilon1)(1 - 2 d_gen) r, toward the looser delta or underpowered; and the largest-passing-r rule biases r* upward. Epsilon is
bounded by the disagreement between the two judges on the random subsample reported above, 9 of 120 = 0.075; the agreement on the A0/A1 discordant rows is selected on the primary judge's own verdicts and is not used for epsilon.

Grounding head (section 4, exploratory arms A6 and A7): label 8B judged wrong (grade() final correct == False); inputs the router features plus
ans_tokens, ans_is_abstention, ans_date_mentions, ans_numeric_flag, ans_overlap_top3_excerpts; GroupKFold by unit. A6-C (F0 plus answer features): OOF AUROC on the non-abstaining subset
0.661, CI [0.577, 0.744], n = 166; on all rows 0.712; the trivial control
(route_aggregate, ans_tokens) 0.586, dAUROC against it
0.074 (DeLong p 0.137); Brier 0.229,
ECE 0.077; confident-wrong rate of the 8B before any abstention 0.323. gamma =
0.776 (maximises OOF accuracy under the cost bar 2632.2: accuracy 0.596, escalates
19.2 percent, mean cost 2519.4); gamma_a = 0.845 (abstains on
9.6 percent of SELECT 8B answers, at most 10 percent; confident-wrong falls to 0.318, accuracy
loss 0.010). A6-H (F1 plus answer features): non-abstaining OOF AUROC none, CI
none, dAUROC against A6-C none (DeLong p
none); gamma none, gamma_a none.
Prediction 10 said 0.68 to 0.78 against a control of 0.62 to 0.70.

Head family (section 4, SELECT OOF only). TinyJev built: yes (all five folds and the final fit ran for both tasks and both controls). Router heads: logistic 0.545 CI [0.464, 0.626] on the same 198 rows; LAYA 0.517 CI [0.435, 0.595]; TinyJev 0.601 CI [0.525, 0.676]; shuffled-rank control LAYA 0.508 CI [0.429, 0.590], TinyJev 0.529 CI [0.449, 0.606]. Paired dAUROC TinyJev minus LAYA 0.085, CI [-0.039, 0.199], DeLong p 0.161; at n = 198 a gap under about 0.08 is not distinguishable, not equal. Replacement rule outcome: logistic stands. Grounding heads: logistic 0.661 CI [0.578, 0.739] on the same 166 rows; LAYA 0.479 CI [0.387, 0.566]; TinyJev 0.593 CI [0.507, 0.680]; shuffled-rank control LAYA 0.530 CI [0.440, 0.618], TinyJev 0.601 CI [0.516, 0.691]. Paired dAUROC TinyJev minus LAYA 0.114, CI [-0.009, 0.239], DeLong p 0.070; at n = 166 a gap under about 0.08 is not distinguishable, not equal. Replacement rule outcome: logistic stands. Stacked logistic over features plus the text head's OOF logit, nested: none (not computed). Rule: text head replaces logistic only if its pooled OOF AUROC lower 95% bound exceeds logistic's point estimate; bound applied here: two-sided 95% CI lower bound (2.5th percentile). Decision: router family logistic, grounding family logistic; the HRM test uses logistic on both sides regardless. GPU: 0.79 hours at 0.87 dollars an hour, 0.69 dollars of the 4.00 cap. Head weights: jev_grounding/final/backbone/head.pt sha256 b4f5ca69382a11b0157fb050ced91ebe8e2dbab0e1aba38b794348eb987fe40e at flaukowski/ks-cascade-heads commit 911adab8a6139612079842c828c9524254d4b4d3; jev_grounding/final/backbone/model.safetensors sha256 1b195073f51d54b52c4b555a7b9307844a08b28c48ea5cad2f175d80b7023876 at flaukowski/ks-cascade-heads commit 911adab8a6139612079842c828c9524254d4b4d3; jev_grounding/final/tinyjev/head.safetensors sha256 3bf98314fca45e73c08adb963832c2ccef9762749572d84db2159a0500702d71 at flaukowski/ks-cascade-heads commit 911adab8a6139612079842c828c9524254d4b4d3; jev_grounding/final/tinyjev/model.safetensors sha256 1b195073f51d54b52c4b555a7b9307844a08b28c48ea5cad2f175d80b7023876 at flaukowski/ks-cascade-heads commit 911adab8a6139612079842c828c9524254d4b4d3; jev_router/final/backbone/head.pt sha256 fa429abe9422b0f715d81d55e130c1e3b41b17a4c2bd47787e4fcd9142e83096 at flaukowski/ks-cascade-heads commit 1e9876f4743e5f64d4c9f06c313fc62c252780be; jev_router/final/backbone/model.safetensors sha256 e87ae3ce1255004c4cc7a3895bf780c97c4c35c284be99e9acde017f83534fe3 at flaukowski/ks-cascade-heads commit 1e9876f4743e5f64d4c9f06c313fc62c252780be; jev_router/final/tinyjev/head.safetensors sha256 3aa8bd658caa53bf1cb160252c29b6794af2a9c034e7ddfcfa5b6f56b80ae64d at flaukowski/ks-cascade-heads commit 1e9876f4743e5f64d4c9f06c313fc62c252780be; jev_router/final/tinyjev/model.safetensors sha256 e87ae3ce1255004c4cc7a3895bf780c97c4c35c284be99e9acde017f83534fe3 at flaukowski/ks-cascade-heads commit 1e9876f4743e5f64d4c9f06c313fc62c252780be; laya_grounding/final/model.safetensors sha256 c6771c1b86793ee63cd33bb284c66ac5834a5336818a29247f6db76773d2f0e4 at flaukowski/ks-cascade-heads commit 3198209f4152089676b36cf31c5a87af1abbb1b0; laya_router/final/model.safetensors sha256 c1d8069c1313d766ee686c4137141eed9167b52d4f9e9471581d8f7bd833f6c2 at flaukowski/ks-cascade-heads commit 9cd21dd11225f88cf98a4f84a636c4ea404736a8. Training manifest sha256 6b2ef6890f75d22d4da6fb7318c47c05fb74b51e992f9e9ada310dbbf0eab404. CONFIRM head probabilities, hashed and not opened: none exported.

Frozen files and hashes. Feature extractor features.py sha256 6b9ce8d97621f29772477afd30a2da5b735ee8fc438222d390ecb7cec8b99ad0; feature schema sha256 a93651099ac4c7fb2c19a40038d7e33971f3a0a03d0ef2a731ca3a2ab0776e76.
features_select.npz sha256 a0bf7a978b5a75ccc070292dd01ab96907be0aec2599ad7001ab2d8c620e7ca6, shape [198, 35]. features_confirm.npz sha256
4b60db18ac223ffc66970a878dffb488a61d660a95dae1ac3006baf5b1998e4a, shape [300, 35], written and not opened (opened for analysis:
no). Router JSONs: router_R0.json 62ad439defc73c0c70ea9579d1480d3108c1208025aa9c0118549ac5f1bfa008, router_R1.json
none. Thresholds (tau* for R0 and R1, gamma, gamma_a, delta), the grounding head coefficients, the variance
table and the leak table are inside select_analysis.json, whose sha256 is in the evidence list. CONFIRM decisions: confirm_decisions.json sha256
6d7e4167198b66c376227f79997545c77412dfa312bdc9a3b84bc0f8f6c62721, 300 rows keyed by sha256(question id) with the route for R0 (53 to the 8B,
247 to the 14B), R1 (none to the 8B, none to the 14B) and
A3-0 (157 to the 8B, 143 to the 14B; the regex route read each question's text from the dataset at decision time and
wrote only the hashed id and the decision); R0 and R1 disagree on none questions (the G3
decision set). Scoring script score.py sha256 ea53274f6d5ef6d2e6efb0b3d5f1236a01035b237ff9b6f8a871775d9327d6e4: it refuses to run if the decisions file, either feature matrix, either router
JSON, the sealed rows or the verdict table differ from this record. kannaka-bench commit 9cf1cbac2518ef1e101178eb121f29edc4e247b1. Evidence files are at the HF commit named
in each evidence URL.

CONFIRM generation host. Deviation 5, the generation host is split between SELECT and CONFIRM. Spec section 6 preregistered one host for every generation call, with the alternative of all generation on one qBraid CPU pod under its own calibration constants, to be chosen before SELECT generation so that arms are never split across hosts; amendment 1 (Deviation 2) kept all generation on debain2 because the 400 plan hours, about 54 wall hours of an 8-core pod, could not hold the 1,060 preregistered generations. SELECT generation ran on debain2 and cannot move mid-arm. The AE0RM lab outage of 2026-11-06T00:35Z and the production load debain2 carries round the clock make the 600 CONFIRM answer calls (300 questions by both generators, Deviation 6 below) fit the pod, so they run on one qBraid lab2 CPU pod, profile 8vCPU_25GB (AMD EPYC 7763; the container cgroup cpu.max 740000/100000 (7.4 CPUs); 62 GB visible; Ubuntu 24.04.4; python 3.12.3; kernel 6.8.0-1071-azure; the lab2 subscription server, host name withheld because it encodes the account e-mail), reached through the Oracle box O1 (ssh only; the pod is a private host). CONFIRM retrieval (store build and kannaka recall, bench.run) stays on debain2 exactly as for SELECT; only the answer stage moves, and both generators move together. The confound this introduces, named here before any CONFIRM row exists: the router labels, tau*, gamma, gamma_a and the audit flip rate f were measured on debain2 generations, and the CONFIRM rows that score them come from the pod; the same digests at temperature 0 and seed 0 on a different CPU do not guarantee identical outputs. What stays single-host: every CONFIRM arm is generated on the pod, so the accuracy and cost comparisons inside CONFIRM mix no hosts, each host's rows are charged with that host's own constants, and no CPU second is compared across hosts. This record claims no cross-host hash equality; whether a cross-host determinism check (the 29 standard questions that fit the window regenerated once on the pod under distinct tags, hashes against the canonical SELECT rows) was run, and its counts, go into the sealed-rows run record.

Server on the pod: ollama 0.33.3 (the same as debain2's calibration) on 127.0.0.1:11440 with OLLAMA_NUM_PARALLEL 1, OLLAMA_MAX_LOADED_MODELS 2, OLLAMA_KEEP_ALIVE 60m, OLLAMA_NUM_THREADS 6, the model store on the pod's ephemeral overlay and rebuilt from the persistent GGUF files by pod_serve.sh in about a minute. Weights: the GGUF files on the pod are byte-identical to debain2's blobs (kannaka-brain-v3 sha256 e374d409c8ab2c38ef2e22b0c7bb6d9850cd2e5152458ecce0ae7f2e64bc9fef, kannaka-brain-7b-v2 sha256 760d28bf800b602e870afa57f3fbedcb5585176c9fe0feb75e5374ea77035834); the dataset copy on the pod has sha256 08d8dad4be43ee2049a22ff5674eb86725d0ce5ff434cde2627e5e8e7e117894, the preregistered hash. Tags: ks-cascade-14b digest ebf1d622ac50ea2c0c88185476898cdd9f82e5eadb5572b94aac3fc427bf7b4a and ks-cascade-8b digest ed092dfd1914b79aa09a3216ac16d51f20431bab95499443fde052d9ef5b9394, equal to the preregistered digests (this filing refuses otherwise); template layer sha256 eb4402837c7829a690fa845de4d7f3fd842c2adee476d5341da8a46ea9255175 (14B) and 229d17479d9590f526cf45e95e09a97c331844c4cab39a74bcc568e6588a0bdc (8B), equal to debain2's; the Modelfile text that ollama show returns differs between the hosts only by the host's own FROM reference, the digests do not.

Pod calibration (pod_calibration.json; calibrate.py's protocol with the same five prompts as amendment 1b by sha256: yes; 1 repetition, 10 of 10 calls, status complete, this filing refuses a calibration that is not complete on those prompts; 2026-11-06T00:11Z to 2026-11-06T00:42Z; one-minute load average before an accepted call, both models, 6.0 to 6.7; thinking span in any output: no). 14B: c_p = 0.3624, c_g = 1.732 CPU seconds per token (accepted n = 4 of 5 calls, 0 rejected as prefix-cache hits, the first call excluded as the load; c_p across prompts 0.3610 to 0.3661; least squares c_p 0.3622, c_g 2.124), which is 0.60 and 0.57 of debain2's frozen 0.6059 and 3.013; prompt evaluation 16.5 tokens per second (debain2 9.9), CPU over wall 5.99, median wall 236 s per call at 3675 to 4036 prompt tokens. 8B: c_p = 0.1944, c_g = 1.043 CPU seconds per token (accepted n = 4 of 5 calls, 0 rejected as prefix-cache hits, the first call excluded as the load; c_p across prompts 0.1937 to 0.1960; least squares c_p 0.1960, c_g 0.956), which is 0.61 and 0.56 of debain2's frozen 0.3181 and 1.877; prompt evaluation 30.8 tokens per second (debain2 18.8), CPU over wall 5.99, median wall 131 s per call at 3679 to 4040 prompt tokens. c8 over c14 on the pod 0.550 (range over prompts 0.525 to 0.557) against debain2's 0.537; the preregistered c8 over c14 range, 0.45 to 0.55 (prediction 4 in spec section 9; amendment 1b called it prediction 3), holds on both hosts. Rule: the pod constants charge every pod row and the debain2 constants every debain2 row; the SELECT analysis above used the amendment 1b constants (the analysis file carries them unchanged).

CPU seconds on the pod come from the cgroup cpu.stat usage_usec of the container root (/sys/fs/cgroup; on debain2 the counter was the dedicated instance's own unit, /sys/fs/cgroup/system.slice/ks-cascade-ollama.service). That root cgroup holds the ollama server, the stdlib bench driver (the bench.answer module), the idle JupyterHub singleuser process, the five-minute keepalive ping, and the ssh session and ten-minute scp pulls of the O1 chain; the chain does not police other processes in the cgroup, and the CPU of everything beside the server lands in the per-row cgroup column, never in the token model. Production stamps: the pod has no production ollama and BENCH_PRODUCTION_PS_URL is unset there, so pod rows carry loadavg_before and cgroup_cpu_s but no production_busy or production_loaded field (the bench writes those only when that URL is set; the calibration samples show production_busy null on 10 of 10 calls); the production-loaded share is a debain2 number only. Throughput guard on pod rows: prompt tokens per second below 0.80 times the pod calibration median, 13.2 on the 14B and 24.7 on the 8B; flagged rows are counted, not dropped; their cgroup cost may be re-taken under the canonical-hash rule (the token-model cost of a row cannot change), and the counts of flagged and re-taken rows are published.

Interruption and resume: the pod server has been stopped from outside before, so the answer stage is written to be resumed: bench.answer appends one row per answer and skips every (model, question) already in answers-<tag>.jsonl, the first answer stays canonical and its hash is written at generation time, a relaunch continues from the last row, the ollama store is rebuilt from the persistent home, and every stop and restart of the pod is logged with timestamps by the O1 chain (o1_confirm_chain.sh) and summarised in the sealed-rows run record.

Budget: lab2 plan hours only, about 7.4 plan hours per wall hour at this profile from the 400 monthly hours renewed 2026-11-06T00:25Z; no credits and no dollars. At the calibration's median wall per call the 600 calls are about 31 wall hours (226 plan hours), a lower bound: the calibration prompts are shorter than the SELECT median prompt, and pod start, the model rebuild after a stop and the chain's polling draw plan hours too; the chain's log carries the realised plan hours.

Sealed-rows plan (section 6 steps 6 to 8), with the host change above: CONFIRM retrieval on debain2 (fresh stores, kannaka recall, k = 15, as for
SELECT), then Deviation 6's context-window scan of the CONFIRM prompts (its count into the run record below), then CONFIRM generation of the
questions that fit the window (300 less any the scan excludes) by both generators on the pod named above, same tags and digests, bench.answer
--native-ollama --no-judge --quiet-ids <file of the run's question ids> --strict-prompt-check, answer sha256 appended per row at write; the sealed rows' sha256 goes on the ledger
in a run record before any CONFIRM verdict exists, together with the pod's stop and restart log and the CONFIRM scan's count; then the primary judge, cached per unique
answer, then the 14B sensitivity column (both on debain2); then one scoring run by the script hashed above, which writes score_output.json and
the RESULTS.md section. A5 uses seeds 0 to 9 at A3's realised share. A3 is the primary cascade arm unconditionally; A4 is never promoted by a
CONFIRM outcome.

Deviations and notes since amendment 1b. Deviation 4, the lab outage: SELECT generation was interrupted 1 time: the SELECT 14B pass stopped at 2026-11-06T00:35:02Z with 41 rows on disk and resumed at 2026-11-06T03:13:22Z with 41 rows (debain2 up since 2026-11-06T03:10:57Z; ollama 0.33.3 (unchanged); kernel 6.12.107+deb13-amd64 (unchanged)); cause: the AE0RM lab outage of 2026-11-06T00:35Z; the lab's operator reported an external RAID card bumped by accident while preparing a UPS upgrade, and the whole lab, debain2 included, went dark; the AE0RM lab (debain2, skywave, groundwave) lost power or connectivity when an external RAID card was bumped during preparation for a UPS upgrade (the lab owner's account; accidental); lab-watch last saw debain2 at 00:35:02Z; no row was lost; the pass resumed at row 41 with the identical ollama and kernel versions; the transient dedicated instance and the embed server were recreated with the same properties by resume_after_reboot.sh. No row on disk was lost (the rows before and after each stop are equal). Rows are appended one per answer; the resumed pass skipped the rows already on disk, the first answer per (question, model) stays canonical, and an interruption cannot change any row's tokens or hash, only the wall and load stamps of the rows generated after the restart. Deviation 5, the generation host split between SELECT
and CONFIRM, is stated in the host clause above. Deviation 6, the context-window exclusion, decided before any SELECT or audit answer was judged. The preregistered experiment tags run with num_ctx 8192, and bench.answer's strict prompt check stops a run rather than let the server truncate a prompt. On 2026-11-06T06:37Z SELECT generation stopped on that check at row 57 of the 14B pass: that question's standard prompt is longer than the window. Every SELECT prompt was then counted exactly with each generator's own tokenizer and chat template (ctxscan.py), a count validated against the server: the 14B count minus the recorded prompt_eval_count is 0 on all 56 rows answered before the stop. 2 of the 200 SELECT questions exceed 8,192 tokens for both generators (8,688 and 9,122 tokens); the next largest prompt, about 7,862 tokens, fits. Rule, the same on both splits: a question whose standard prompt exceeds the preregistered 8192-token window for either generator is excluded from every arm on its split, so the arms are always compared on the same questions; no prompt is shortened, no question is re-retrieved, and num_ctx is not raised (that would change the preregistered tag digests). The rule was decided and applied from token counts alone: no label, verdict or answer text entered it. SELECT keeps 198 questions, and every SELECT number in this record (labels, folds, routers, tau*, gamma, gamma_a, d_gen, the costs) is on those 198. One of the two is among the 30 standard questions, so the determinism audit has 29 pairs (58 regenerations) and prediction 11's 0 to 2 flips in 60 is read against 58. The answers written before the stop were kept unchanged in the 198-question run (same bytes, same sha256); a relaunch of the unchanged driver against the full list at 2026-11-06T06:50Z was stopped before it wrote any row, and generation resumed on the 198 questions at 2026-11-06T06:52Z after the dedicated instance read idle. The two question ids stay private with the other held-out ids; only their count and token lengths are published. On CONFIRM this record files the rule, not a count: the same exact count (each generator's tokenizer and chat template) runs on the CONFIRM questions after this amendment is filed, after CONFIRM retrieval and before any CONFIRM answer is generated, from token counts alone, so CONFIRM retrieval, whose run also writes gold-derived retrieval metrics, happens after the freeze. A CONFIRM question whose standard prompt exceeds the window for either generator leaves every CONFIRM arm. The count, the token lengths of any excluded prompts, the largest fitting prompt and the resulting CONFIRM n are recorded in the CONFIRM run record (the sealed-rows run record) before any CONFIRM verdict is read; the ids stay private. Every CONFIRM number in this record (the decisions file, the noise band and its flip term, the power sentence, the minimum-AUROC model and the underpowered statement) is at the preregistered 300 questions; if the scan excludes k of them, the run record restates those numbers at 300 minus k with the same formulas, the excluded questions' decisions are dropped rather than scored as missing, and nothing else changes. Note, the merge census: On 2026-11-05, while SELECT generation was still running, a label-free constant-value census was run once over the merged feature chunks of all 500 questions (SELECT and CONFIRM together) as a sanity check that the chunk merge was right (preview_vacuity.py: the vacuity rule's variance table on the SELECT rows only, no leak test); it read no label, no verdict and no answer, fitted nothing, printed no id, and no CONFIRM row entered any fit then or since; the vacuity rule itself was decided on SELECT alone as preregistered. Note, the
as-run base Modelfile: The 14B base tag kannaka-brain-v3 on debain2 was built from a Modelfile whose template and system layers differ from the Modelfile in the public GGUF repository (the repository's has other system text, no explicit TEMPLATE and no num_thread); the preregistered experiment digest ebf1d622ac50 was reproduced on the pod only from debain2's as-run base Modelfile, dumped from the tag with ollama show --modelfile on 2026-11-06 (template layer sha256 eb4402837c7829a690fa845de4d7f3fd842c2adee476d5341da8a46ea9255175); the weights blob is identical on both hosts (GGUF sha256 above), the experiment Modelfile 62511d38... is unchanged, and generation is unaffected because the bench supplies its own system message on every call. The 8B base rebuilt from its repository Modelfile reproduced the preregistered digest ed092dfd1914 directly. The as-run base Modelfile goes into the public repro bundle as a correction. From the analysis files: H1 is UNTESTABLE on this corpus: 1 HRM candidates survive the vacuity and leak rules (fewer than 4); no router_R1.json is published, every CONFIRM R1 decision is null, and the campaign continues without A4. head family: the LAYA loader reported that the base checkpoint ships temperatures outside [0.5, 5] and clamped them on load (a RuntimeWarning in every LAYA fold log); no setting was changed by us. head family: the first two provisioning attempts for the GPU session (2026-11-10 21:16Z and 21:20Z) failed with no capacity before any instance existed; the one session that ran is the one in gpu_session.json.

Nothing else in the preregistration changes: splits, arms, gate, predictions, selection rule and the hash order stand. Written by Claude Code
in a session run by the maintainer, who asked for the filing.

Evidence

content hash d0c9e1981d6fd72f368de55f884cf067e161063d327d993bec4ec08b979f6208

Machine check: machine-checked

Derived from verify_record.py at b3ba75d; it never changes the standing.