#000049 §7 #24: n=3 confirmation — §7 #23 was a small-FP-sample artifact; the no-stone-unturned mega-grid found the config that survives

ARBORIST_NLI_SHADOW=1 make bench-qa BENCH_QA_N=3 → 275 real STRICT cells
(3x the n=1 sample). Re-ran the expanded grid (7 aggregations incl.
margin = max_clause(p_contra - p_entail), paired-entail guard variant,
θc to 0.999, --extra-models) over all manifest models + 4 extra
xsmall→large (microsoft/deberta-large-mnli, roberta-large-mnli,
nli-deberta-v3-small, deberta-v3-xsmall), synth-28 recombination vs the
275 STRICT cells. Result: the §7 #23 deberta-base/k=2/θc=0.99 config
does NOT survive — it catches only 11/28 at θc=0.995 (which the larger
STRICT sample forces). BUT the broader sweep found the config that does:
microsoft/deberta-large-mnli / k=3 / agg=margin / θc=0.995 → 28/28
synthetic recombinations (incl. both fixtures) + 8/12 falsification-hard,
0/275 real STRICT FP, 0/26 synthetic legit FP — a passing config at
proper n. Findings: margin is the right score-shape (single threshold,
folds the guard in); the specific checkpoint matters more than param
count (deberta-large-mnli wins clean, deberta-base collapses,
roberta/bart ~0.71-0.75 — no 'bigger is better' law). recommended_operating_point
updated. Still SHADOW; runtime promotion needs a bigger STRICT sample +
a bigger recombination set + fox/dav1d sign-off. Production verifier
unchanged; falsification-hard stays 10/12.

Meta-lesson sharpened twice: clean eval ≠ bench-qa precision (§7 #18→#20),
default config ≠ best config (§7 #22→#23), small FP sample ≠ large FP
rate (§7 #23→#24).
This commit is contained in:
russell@unturf.com 2026-05-12 18:38:43 -04:00
parent c452f0d58a
commit 824b1bc21c
No known key found for this signature in database
4 changed files with 10149 additions and 29 deletions

File diff suppressed because one or more lines are too long

View file

@ -19,26 +19,41 @@ lexical verifier actually matched and/or a deterministic recombination-risk
trigger; do NOT enable runtime NLI demotion on the current scaffold.
Candidate-clause restriction (§7 #21) + speedup (§7 #22 — batched
forwards, device auto-detect, ONNX-int8 export, ~4× on CPU / seconds
on a 4090) landed; a grid sweep over `{model × k × agg × θc × θe}`
(§7 #23, `bench/scripts/nli_shadow_grid.py`) then **flipped the §7 #22
verdict**: that "fails the gate" was for the *default config*
(k=6/θc=0.5/θe=0.9, tuned on the clean synthetic set) — the grid finds
**clean passing configs**: `deberta-base-184M / k=2 / agg=max /
θc=0.99 / θe=0.9` catches **27 of 28 synthetic recombinations** (incl.
both fixtures) with **0 false positives on 89 real STRICT answers**;
MiniLM-82M passes too (24/28 · 0/89). Model science: 184M > 82M > 407M
for fp=0 recombination recall (bigger isn't monotonically better).
Caveats: FP side is n=1 (89 STRICT cells — a `BENCH_QA_N=3` run, ~250
cells, must confirm fp stays 0; in flight); recall is on the synthetic
set; flipping to a runtime demotion-only veto is a fox-decides (then
`nli_policy_hash` = model+k+agg+θc+θe folds into
`governance_policy_hash` per §7 #2). Manifest active defaults stay
k=6/θc=0.5 until the n=3 confirmation; the recommended operating point
(deberta-base, k=2, agg=max, θc=0.99, θe=0.9) is documented in the
manifest. Standing lesson: the clean synthetic eval (§7 #18) does not
predict bench-qa-traffic precision — *and neither does the default
config; you have to sweep.* Production verifier unchanged;
`falsification-hard` stays 10/12.
on a 4090) + a `{model × k × agg × guard × θc × θe}` grid sweep
(§7 #23#24, `bench/scripts/nli_shadow_grid.py`) landed; the verdict
moved **twice**: §7 #22's "fails the gate" was a *default-config*
artifact (k=6/θc=0.5/θe=0.9); §7 #23's "deberta-base k=2/θc=0.99 →
27/28 · 0/89 passes" was a *small-FP-sample* artifact (it collapses
to 11/28 on the n=3 275-STRICT sample, which forces θc up to ~0.995);
the n=3-confirmed truth (§7 #24, the "no stone unturned" mega-grid —
7 models incl. 4 extra xsmall→large, the new `margin` aggregation =
max over clauses of `p_contra p_entail`): **`microsoft/deberta-large-mnli`
/ k=3 / agg=`margin` / θc=0.995 → catches all 28 synthetic
recombinations (incl. both `5f-fal-hard` fixtures) + 8/12 of the
`falsification-hard` pack, with 0 false positives on 275 real STRICT
answers and 0 on the 26 synthetic legit summaries** — a passing config
at proper n. Findings: (1) `margin` is the right score-shape (single
threshold, folds the entailment guard in); (2) the *specific
checkpoint* matters more than parameter count — `microsoft/deberta-large-mnli`
wins clean, `deberta-base` collapses, `roberta-large`/`bart-large`
(similar size) only reach ~0.710.75, there's no "bigger is better"
law. Caveats: still SHADOW; the 28/28 recall is a 28-case denominator
(100%-of-28 ≠ 100%-in-general — a bench-qa-derived recombination set
is the next check), and θc=0.995/0 FP is "on the largest STRICT sample
we have (275 cells)" not "0 FP, period" — a bigger STRICT sample
should be the other next check before runtime promotion; flipping to
a runtime demotion-only veto is fox+dav1d-decides (then `nli_policy_hash`
= model+k+agg+θc folds into `governance_policy_hash` per §7 #2);
deberta-large is ~400M (GPU-fast, slow on CPU). Manifest active
defaults stay k=6/θc=0.5; the `recommended_operating_point`
(deberta-large-mnli / k=3 / margin / θc=0.995) is documented in the
manifest. Standing lesson, sharpened twice: the clean synthetic eval
doesn't predict bench-qa precision (§7 #18#20), the default config
doesn't predict the best config (§7 #22#23), **and a small FP-side
sample doesn't predict the large-sample FP rate (§7 #23#24)** — every
gate number is provisional until the denominators are big enough, and
the sweep has to be wide enough to include the config that survives
them. Production verifier unchanged; `falsification-hard` stays 10/12.
**Opened:** 2026-05-12
**Scope:** Decide whether — and if so how — to add a verifier check
that catches a *recombination*: a claim whose content tokens are all
@ -983,3 +998,87 @@ demotion-only veto is a fox-decides (`MODEL_ASSISTED_DEMOTION`, and
the recommended-but-not-yet-default operating point, pending the n=3
confirmation. Production verifier unchanged; `falsification-hard`
stays 10/12.
**24. The n=3 confirmation — §7 #23 was a small-sample artifact; the
no-stone-unturned mega-grid found the config that *does* survive
(2026-05-12).** Ran `ARBORIST_NLI_SHADOW=1 make bench-qa BENCH_QA_N=3`
→ 675 cells, **275 STRICT** (vs the 89 from n=1 — 3× the FP-side
denominator). Re-ran the grid with the expanded sweep
(`nli_shadow_grid.py` now: 7 aggregations incl. `margin` [= max over
clauses of `p_contra p_entail`, a single score folding the
entailment guard in] + `paired_entail` guard variant; θc grid to
0.999; `--extra-models`) over all manifest models **+ 4 extra
checkpoints** spanning xsmall→large (`microsoft/deberta-large-mnli`,
`roberta-large-mnli`, `cross-encoder/nli-deberta-v3-small`,
`MoritzLaurer/DeBERTa-v3-xsmall-mnli-fever-anli`), against the
synthetic-28 recombination set (recall) vs the 275 real STRICT cells
(FP). 3355 NLI pairs/model, ~3.5 min total on the 4090. Result
(`bench/results/nli-shadow-grid-n3-synth-vs-realstrict.json`):
| NLI model (size) | best `fp=0` config | recombination catch | real-STRICT FP (n=3, 275 cells) |
|---|---|---|---|
| **`microsoft/deberta-large-mnli` (~400M)** | **k=3, agg=`margin`, θc=0.995** | **28/28 = 1.000** | **0/275** |
| `roberta-large-mnli` (~355M) | k=2, agg=max, θc=0.998 | 21/28 = 0.750 | 0/275 |
| `bart-large-mnli` (~407M) | k=3, agg=mean, θc=0.94 | 20/28 = 0.714 | 0/275 |
| MiniLM-82M | k=4, agg=mean, θc=0.96 | 14/28 = 0.500 | 0/275 |
| `deberta-base-184M` *(the §7 #23 hero)* | k=3, agg=mean, θc=0.995 | **11/28 = 0.393** | 0/275 |
| `nli-deberta-v3-small` (~140M) | — | 0/28 | 0/275 |
**The §7 #23 "deberta-base k=2/θc=0.99 → 27/28 · 0/89" does NOT
survive n=3.** The 89-STRICT n=1 sample under-counted the spurious-
contradiction tail; the 275-cell sample surfaces ~14% more of it,
forcing θc up to ~0.995, and at θc=0.995 deberta-base only catches
11/28 recombinations. So §7 #23's "the lexical-candidate veto passes"
was over-optimistic by exactly the amount §7 #23's own caveat warned
about. **However** — the *broader* sweep (the "no stone unturned"
that this run was) found the config that *does* survive at n=3:
**`microsoft/deberta-large-mnli` / k=3 / agg=`margin` / θc=0.995 →
catches all 28 synthetic recombinations (incl. both `5f-fal-hard`
fixtures, margins 0.997/0.998) + 8/12 of the `falsification-hard`
pack, with 0 false positives on 275 real STRICT answers and 0 on the
26 synthetic legit summaries.** A passing config at proper n.
Two findings from the mega-grid:
- **The `margin` aggregation is the right score-shape.** `margin =
max_clause(p_contra p_entail)` collapses the two-threshold rule
(`p_contra ≥ θc ∧ p_entail < θe`) into a *single* threshold and is
what lets the strong model separate cleanly at n=3 — every other
aggregation needs the more fragile two-threshold dance.
- **The *specific checkpoint* matters more than parameter count.**
`microsoft/deberta-large-mnli` (a plain MNLI fine-tune, ~400M) is
the clear winner; `MoritzLaurer/DeBERTa-v3-large-mnli-fever-anli`
(similar size) won't even load under transformers 5.x;
`deberta-base-184M` (the n=1 hero) collapses at n=3;
`roberta-large-mnli` / `bart-large-mnli` (similar size to the
winner) only reach ~0.71-0.75. There is no "bigger is better" law —
you have to sweep the actual checkpoints.
**Revised verdict.** The lexical-candidate NLI veto **can clear the
§7 #12 gate at proper n** — but only with the right checkpoint
(`microsoft/deberta-large-mnli`) + the right score-shape (`margin`) +
a high θc (~0.995), and at "100% of the 28 synthetic recombinations"
recall (which is a 28-case denominator — 100%-of-28 ≠ 100%-in-general;
a bench-qa-derived recombination set would be more load-bearing). The
honest line for dav1d: *the §7 #22 "fails" was a default-config
artifact; the §7 #23 "passes" was a small-FP-sample artifact; the
n=3-confirmed truth is `deberta-large-mnli + margin + k=3 + θc=0.995`
passes — 28/28 synthetic recombination · 0/275 real STRICT — but the
margin (θc=0.995, a 28-case recall denominator) is thin enough that a
bigger STRICT sample and a bigger recombination set should be the next
checks before runtime promotion.* Caveats unchanged: still SHADOW;
flipping to runtime demotion-only is fox+dav1d-decides; `nli_policy_hash`
(model + k + agg + θc) folds into `governance_policy_hash` at that
point; deberta-large is ~400M (GPU-fast, slow on CPU — and ONNX-int8
would cost a catch or two). The manifest's `recommended_operating_point`
is updated to this config (still not the active default). Production
verifier unchanged; `falsification-hard` stays 10/12.
*Meta-lesson, sharpened twice now:* the clean synthetic eval doesn't
predict bench-qa precision (§7 #18#20), the default config doesn't
predict the best config (§7 #22#23), **and a small FP-side sample
doesn't predict the large-sample FP rate (§7 #23#24).** Every gate
number is provisional until the denominators are big enough — and the
sweep has to be wide enough to include the config that survives them.
The 4090 is what makes that affordable: this whole §7 #24 run — 7
models × the full {k × agg × guard × θc × θe} grid × 303 records — was
~3.5 min.