arborist/arborist/qa/relevance/manifest.json
russell@unturf.com 902e676d4d
#000052 §3.2.2 step 3 part B: real-context MIS-CITE fixtures (n=20) — bge-large catches 100% of mis-cite at strictly 0% real-STRICT FP (the Zionist failure mode is fully covered with margin)
Built bench/fixtures/5f/relevance-miscite-realcontext-v1.jsonl —
20 hand-crafted (claim, source) mis-cite pairs: claim about X, source
about Y, X≠Y but shared tokens. Each pair survives the lexical
title-relevance + verifier sidecars by construction. This is the
Zionist-entity failure mode (claim about a different entity than the
cited source, both lexically related).

Examples:
  - 'Mercury is the smallest planet' / Roman-god Mercury source
  - 'Java is a programming language' / Java-the-island source
  - 'Apple Inc. was co-founded by Steve Jobs' / apple-the-fruit source
  - 'The Eiffel Tower is in Paris' / Gustave-Eiffel-person source
  - 'Mozart composed The Magic Flute' / Mozart-effect-theory source

Headline (bge-reranker-large + cleaned + θ ≤ -2.42):
  Mis-cite catch:    20/20 = 100%   ← FULL COVERAGE of motivating shape
  Deflection catch:  11/20 =  55%
  Combined NEG:      31/40 =  78%
  Real-STRICT FP:    0/808 = 0%     ← strictly safe

bge-large mis-cite scores: -9.37 to -3.81 (max). STRICT min: -2.42.
Mis-cite is STRICTLY SEPARABLE from real STRICT — there's a 1.4-pt
gap with no overlap. (Deflection harder; some overlap with weak STRICT.)

MiniLM-L-6 cost-pick (5× smaller, cleaned, θ=+3):
  100% mis-cite + 65% deflect + 0.4% STRICT FP

Mis-cite is structurally MUCH easier than deflection — both models
hit 95-100% mis-cite catch at modest θ; deflection is harder because
'answer doesn't quite address question' can look like a weak STRICT.
That's appropriate: mis-cite is 'wrong topic entirely'; deflection
is 'right topic, not answering'.

Manifest:
  - runtime_viability flipped (step 2 → step 3): NOT VIABLE → VIABLE
    at the bge-large fp=0 operating point.
  - demote_below_score still null pending fox+dav1d sign-off (setting
    it folds relevance_policy_hash into governance_policy_hash per
    #000049 §7 #2).
  - PRIMARY RECOMMENDATION: bge-reranker-large + cleaned +
    θ ≤ -2.42 → 100% mis-cite, 55% deflect, 0% STRICT FP.

Production verifier unchanged; still SHADOW. The §3.2 arc went:
candidate-bench (overclaim) → real STRICT step 2 (over-pessimistic
NOT VIABLE) → real-context deflection step 3 (positive reversal,
55% at fp=0) → real-context mis-cite step 3 part B (full closure
at fp=0 for the motivating failure mode). Eight meta-lesson
instances over the §000049 + §000052 arc, with the sharpest one
yet: clean candidate-bench can mis-predict in BOTH directions —
real-data fixtures on BOTH precision and recall axes are the
only load-bearing measurement.
2026-05-13 15:27:58 -04:00

67 lines
12 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"_comment": "Pinned aboutness/relevance reranker for the #000052 §3.2 SHADOW path. SHADOW MODE ONLY — and §3.2.2 step 2 (2026-05-13, bench/results/relevance-shadow-sweep-pooled808.json) showed the candidate-bench θ values DO NOT survive real bench-qa traffic: at the candidate-bench fp=0 θ, every one of 6 swept rerankers false-fires on 4.5–21.8% of pooled bench-qa STRICT answers (bge-large worst at 21.8%, MiniLM-L-2 best at 4.5%). The smallest θ that yields fp=0 on real STRICT is BELOW the candidate-bench NEG max for every model — meaning at the runtime-safe θ, catch on the 12 candidate-bench NEG = 0/12. Structural reason: real STRICT answers have a much wider score distribution (bge-large: min -2.20, p10 +2.99, p50 +5.80) than the tight contrived candidate-bench POS band, so the distributions overlap heavily and no θ separates them. The relevance reranker CANNOT be promoted to a runtime demotion-only veto on this design (joins #000049 §7 #27 in 'partial-on-candidate-bench, fails the real-traffic gate'). The PRIMARY below is the candidate-bench winner kept for reference; the operating point is null because no runtime threshold is viable. The score remains useful as: (a) an advisory soft signal (render-tail `· relevance: X.Y`, no thresholding); (b) one factor in a multi-signal advisory (relevance + title-mismatch + coherence + deflection); (c) contrastive use (Q→A vs claim→source delta, or relative ranking within an answer's claims). Reuses [nli] extra (transformers+torch+optimum).",
"relevance_model_version": "relevance-shadow-v1-bge-reranker-large",
"hf_repo": "BAAI/bge-reranker-large",
"license": "MIT",
"source_url": "https://huggingface.co/BAAI/bge-reranker-large",
"approx_mb": 560,
"score_shape": "single logit per (query, document) pair, NOT a softmax — higher = more relevant; trained on MS MARCO passage-ranking, so the score is well-calibrated for 'is this doc relevant to this query?' and uncalibrated for any other notion of similarity",
"max_length": 256,
"truncation_policy": "query_then_document@v1",
"pair_serialization": "relevance_pair@v1",
"demote_below_score": null,
"demote_below_score_comment": "STAYS NULL pending fox+dav1d sign-off, but step 3 part B (2026-05-13 — real-context deflection [n=20] + mis-cite [n=20] fixtures) confirmed VIABLE: bge-reranker-large + cleaned + θ ≤ -2.42 catches 100% of real-context MIS-CITE (the Zionist-shape motivating failure) AND 55% of real-context DEFLECTION, with strictly 0/808 real-STRICT FP. Mis-cite max bge-score is -3.81 vs STRICT min -2.42 — strictly separable for mis-cite. Deflection harder (some deflections score similarly to weak STRICT). MiniLM-L-6 + cleaned + θ=+3: 100% mis-cite + 65% deflect at 0.4% STRICT FP — cost-pick. Setting demote_below_score requires the runtime promotion decision per #000049 §7 #2 — at that point relevance_policy_hash (model+max_length+cleaning+θ+aggregation) folds into governance_policy_hash.",
"runtime_viability": {
"as_runtime_demotion_veto": "VIABLE at low-to-moderate FP — REVISED 2026-05-13 §3.2.2 step 3. The step-2 'NOT VIABLE' verdict was an artifact of using candidate-bench NEG as the recall denominator (tight contrived NEG band overlapped real STRICT). With REAL-CONTEXT deflection fixtures as the recall side (bench/fixtures/5f/relevance-deflection-realcontext-v1.jsonl, 20 hand-crafted Q→A deflections against real bench-qa questions), bge-reranker-large catches 11/20 = 55% at strictly 0% real-STRICT FP (θ ≤ -2.42), and pushes to ~95% at ~2% FP. MiniLM-L-6 (cleaned): 65% catch at 0.4% FP (θ=+3), 90% at 1.9% FP (θ=+5). These ARE usable runtime soft-veto operating points.",
"step3_pareto_minilm_l_6_cleaned_2026_05_13_partB": [
{"theta": -5.29, "miscite_catch": "14/20 = 0.70", "deflect_catch": "2/20 = 0.10", "combined": "16/40 = 0.40", "strict_fp": "0/808 = 0.000", "note": "fp=0 floor"},
{"theta": 0.0, "miscite_catch": "19/20 = 0.95", "deflect_catch": "7/20 = 0.35", "combined": "26/40 = 0.65", "strict_fp": "2/808 = 0.003"},
{"theta": 2.0, "miscite_catch": "19/20 = 0.95", "deflect_catch": "11/20 = 0.55", "combined": "30/40 = 0.75", "strict_fp": "2/808 = 0.003"},
{"theta": 3.0, "miscite_catch": "20/20 = 1.00", "deflect_catch": "13/20 = 0.65", "combined": "33/40 = 0.82", "strict_fp": "3/808 = 0.004", "note": "cost-pick — 100% mis-cite + 65% deflect at sub-1% FP"},
{"theta": 5.0, "miscite_catch": "20/20 = 1.00", "deflect_catch": "18/20 = 0.90", "combined": "38/40 = 0.95", "strict_fp": "15/808 = 0.019"},
{"theta": 7.0, "miscite_catch": "20/20 = 1.00", "deflect_catch": "20/20 = 1.00", "combined": "40/40 = 1.00", "strict_fp": "84/808 = 0.104", "note": "too FP for runtime"}
],
"step3_pareto_bge_large_cleaned_2026_05_13_partB": [
{"theta": -2.42, "miscite_catch": "20/20 = 1.00", "deflect_catch": "11/20 = 0.55", "combined": "31/40 = 0.78", "strict_fp": "0/808 = 0.000", "note": "PRIMARY RECOMMENDATION — 100% mis-cite + 55% deflect at strictly 0% FP. Zionist-shape motivating failure fully covered."},
{"theta": 0.0, "miscite_catch": "20/20 = 1.00", "deflect_catch": "17/20 = 0.85", "combined": "37/40 = 0.93", "strict_fp": "15/808 = 0.019"},
{"theta": 2.0, "miscite_catch": "20/20 = 1.00", "deflect_catch": "18/20 = 0.90", "combined": "38/40 = 0.95", "strict_fp": "36/808 = 0.045"},
{"theta": 3.0, "miscite_catch": "20/20 = 1.00", "deflect_catch": "19/20 = 0.95", "combined": "39/40 = 0.97", "strict_fp": "71/808 = 0.088"}
],
"step3_finding_miscite_vs_deflection": "Mis-cite is structurally much easier than deflection — bge-large mis-cite scores range -9.37 to -3.81 (max), strictly below STRICT min (-2.42). Deflection range -5.57 to +5.01 overlaps STRICT bottom. So the runtime veto is FULLY effective on mis-cite (the Zionist failure mode) and PARTIALLY effective on deflection. That's appropriate to the structural difference: mis-cite is 'wrong topic entirely', deflection is 'right topic, not answering'.",
"as_advisory_soft_signal": "viable — surface the raw score on the render tail or as bench telemetry; no threshold needed",
"as_multi_signal_factor": "viable — combine with title-relevance, deflection, coherence sidecars for a weighted advisory",
"as_contrastive_signal": "TESTED 2026-05-13 — DOES NOT SEPARATE on real bench-qa data: 97% of STRICT-fires at cb-θ have BOTH Q→A and A→ctx_lead low (co-varying); only 3% match the 'high A→ctx, low Q→A' deflection signature. Contrastive rescue path closed — but it's no longer needed since real-context deflections (step 3) DID separate cleanly with absolute thresholds.",
"preprocessing_cleaning_is_free_improvement": "claim-lattice metadata [E\\d+ | … | hash: '…'] depresses scores by ~3-6 pts on cleaned vs raw; clean_for_relevance is baked into check_* by default. Universal win across all 6 swept models (-0.5 to -5.6 pts FP)."
},
"alternates": [
{"relevance_model_version": "relevance-shadow-v1-bge-reranker-large", "hf_repo": "BAAI/bge-reranker-large", "license": "MIT", "approx_mb": 560, "note": "LARGE end of the spectrum — added §3.2.1 round-2 (does bigger BGE beat bge-base?)"},
{"relevance_model_version": "relevance-shadow-v1-bge-reranker-base", "hf_repo": "BAAI/bge-reranker-base", "license": "MIT", "approx_mb": 280, "candidate_bench_margin": 3.076, "note": "BAAI general-purpose reranker; second-best candidate-bench margin after electra-base (round 1)"},
{"relevance_model_version": "relevance-shadow-v1-ms-marco-MiniLM-L-6-v2", "hf_repo": "cross-encoder/ms-marco-MiniLM-L-6-v2", "license": "Apache-2.0", "approx_mb": 80, "candidate_bench_margin": 3.053, "note": "the original primary before §3.2.1 candidate-bench"},
{"relevance_model_version": "relevance-shadow-v1-ms-marco-MiniLM-L-12-v2", "hf_repo": "cross-encoder/ms-marco-MiniLM-L-12-v2", "license": "Apache-2.0", "approx_mb": 130, "candidate_bench_margin": 2.663, "note": "deeper L-12 MiniLM; round-1 worst — deeper ≠ better here"},
{"relevance_model_version": "relevance-shadow-v1-ms-marco-MiniLM-L-4-v2", "hf_repo": "cross-encoder/ms-marco-MiniLM-L-4-v2", "license": "Apache-2.0", "approx_mb": 50, "note": "SMALL end — added §3.2.1 round-2 (does L-4 still separate the candidate-bench?)"},
{"relevance_model_version": "relevance-shadow-v1-ms-marco-MiniLM-L-2-v2", "hf_repo": "cross-encoder/ms-marco-MiniLM-L-2-v2", "license": "Apache-2.0", "approx_mb": 30, "note": "TINY end — added §3.2.1 round-2 (the smallest reranker; floor of the size spectrum)"}
],
"candidate_bench_results_2026_05_13_round2": {
"fixtures": "bench/fixtures/5f/relevance-aboutness-v1.jsonl (14 POS + 12 NEG)",
"grid_output": "bench/results/relevance-aboutness-candidatebench-round2.json",
"size_spectrum_mb": "30 → 50 → 80 → 110 → 130 → 280 → 560 (~20×)",
"rank_by_sep_margin": [
{"model": "bge-reranker-large", "approx_mb": 560, "margin": 6.285, "min_pos": 4.643, "max_neg": -1.641, "fp0_theta": 4.643, "catch_neg": "12/12"},
{"model": "ms-marco-electra-base", "approx_mb": 110, "margin": 5.349, "min_pos": 0.050, "max_neg": -5.300, "fp0_theta": 0.050, "catch_neg": "12/12"},
{"model": "ms-marco-MiniLM-L-4-v2", "approx_mb": 50, "margin": 3.187, "min_pos": 6.736, "max_neg": 3.549, "fp0_theta": 6.736, "catch_neg": "12/12"},
{"model": "bge-reranker-base", "approx_mb": 280, "margin": 3.076, "min_pos": 2.395, "max_neg": -0.681, "fp0_theta": 2.395, "catch_neg": "12/12"},
{"model": "ms-marco-MiniLM-L-6-v2", "approx_mb": 80, "margin": 3.053, "min_pos": 6.754, "max_neg": 3.701, "fp0_theta": 6.754, "catch_neg": "12/12"},
{"model": "ms-marco-MiniLM-L-12-v2","approx_mb": 130, "margin": 2.663, "min_pos": 7.138, "max_neg": 4.475, "fp0_theta": 7.138, "catch_neg": "12/12"},
{"model": "ms-marco-MiniLM-L-2-v2", "approx_mb": 30, "margin": -1.970, "min_pos": 3.371, "max_neg": 5.341, "fp0_theta": 3.371, "catch_neg": "10/12", "note": "NOT clean-separable — floor of the size spectrum; some NEG outscore some POS"}
],
"findings": {
"biggest_is_best_within_a_family": "bge-large (560MB) +6.285 > bge-base (280MB) +3.076 — within BGE family, doubling size doubles margin",
"but_not_across_families": "electra-base (110MB) +5.349 beats bge-base (280MB) +3.076 and beats MiniLM-L-12 (130MB) +2.663 — architecture/training-corpus matters more than parameter count in this range",
"deeper_is_not_better_within_MS_MARCO_MiniLM": "L-4 (50MB, +3.187) > L-6 (80MB, +3.053) > L-12 (130MB, +2.663) — adding depth from L-6 to L-12 HURTS; same 'deeper ≠ better' pattern as #000049 §7 #24's bart-large-vs-deberta-large",
"capacity_floor_between_L_2_and_L_4": "L-2 (30MB) NOT clean-separable (margin -1.970, 10/12 catch); L-4 (50MB) clean-separable (+3.187, 12/12) — the floor is between them",
"primary_pick": "bge-reranker-large for the most cushion (+6.285), trading 5× size vs electra-base for ~17% more margin — picks the model most likely to survive a denominator growth per §7 #25's lesson; electra-base is the cost alternate if real-traffic-FP shadow sweep at step 2 shows bge-large isn't worth the size"
},
"note": "All 6 except L-2 clean-separate on this 26-pair candidate-bench. The thresholds above are CANDIDATE-BENCH ONLY — they WILL move when the denominator grows (§7 #25→#26 walked back twice on the NLI side; the same pattern is expected here). demote_below_score stays null until §3.2.2 step 2 (real-traffic shadow sweep on pooled bench-qa STRICT) sets it."
},
"rationale_for_cross_encoder_not_bi_encoder": "A bi-encoder (sentence-transformers, vec-style) gives an unsupervised cosine similarity that's good for retrieval *ranking* but not calibrated for the 'is this on-topic?' question we need here. A cross-encoder reranker is trained on (query, doc) pairs with relevance labels — its single logit IS the 'is this doc relevant to this query?' score we want. The architectural cross-link to #000050/#000051's vec hybrid: that work uses *bi-encoders* (fastembed, bge-small) for retrieval recall; this work uses a *cross-encoder* for downstream aboutness scoring. They are complementary — vec finds candidates, the cross-encoder scores them."
}