{
  "_comment": "Pinned NLI checkpoint for the #000049 Phase-2 shadow path. SHADOW MODE ONLY: this manifest does NOT yet fold into governance_policy_hash because shadow output cannot touch audit_mode (ticket #000049 §7 #2). Phase 3 (demotion-only runtime) MUST add a single-blob checkpoint_sha256 + tokenizer_sha256 + an explicit nli_policy_hash that folds into governance_policy_hash before any audit_mode effect. The benched checkpoints are not pre-exported to ONNX; a Phase-3 step should ONNX-export the chosen one and switch the [nli] extra to onnxruntime-cpu to drop the torch dependency (cf. the [vec] extra).",
  "nli_model_version": "nli-shadow-v1-minilm2-l6-h768",
  "hf_repo": "cross-encoder/nli-MiniLM2-L6-H768",
  "pinned_revision": "b95119ce93d3e065de6214e38cd4a97b0f2f2c6d",
  "license": "Apache-2.0",
  "source_url": "https://huggingface.co/cross-encoder/nli-MiniLM2-L6-H768",
  "approx_mb": 90,
  "onnx": false,
  "runtime": "transformers-torch-cpu",
  "label_map_source": "read from model.config.id2label at load time (cross-encoder ordering is contradiction/entailment/neutral; do not hardcode)",
  "max_length": 256,
  "max_candidate_clauses": 6,
  "max_candidate_clauses_provenance": "§7 #5 step 3 + §7 #20 — NLI runs only on the top-N source clauses by content-token overlap with the answer claim, never the whole context; running it over every clause of a real 30 KB retrieved context is a multiple-comparisons false-positive machine (~30% would-demote on STRICT in the first real-traffic smoke). A Phase-3 runtime hook would instead pass the clauses the verifier's quote/span/entity matching actually touched.",
  "truncation_policy": "source_clause_then_claim@v1",
  "pair_serialization": "nli_pair@v1",
  "thresholds": {
    "contradiction_veto": 0.5,
    "entailment_block_veto": 0.9
  },
  "thresholds_provenance": "the bench-validated operating point — arborist-nli-bench commit a1cb28d, ticket #000049 §7 #18; on the 28+26-case synth set this point gives 28/28 catch, 0/26 false positives, and the entailment guard is what filters the spurious competing-superlative contradictions",
  "recommended_operating_point": {
    "_comment": "ticket #000049 §7 #27 — REVISED at recall-side realism. The §7 #26 'deberta-large-mnli + margin@0.995 → 28/28 · 0/808 settled' was a synthetic-recall artifact: on the 25 hand-built real-context recombination fixtures (bench/fixtures/5f/recombination-realcontext-v1.jsonl — false re-attributions inside real bench-qa 30 KB haystacks) the same config catches only 6/25 = 0.24. The clean 28-case eval inflated recall 4x. The new fp=0 leader on real haystacks is bart-large-mnli + k=12 + agg=max + θc=0.999 → 12/25 = 0.48 recall, 0/808 STRICT FP. Diagnosis: the candidate-clause selector (top-k by content-token overlap) misses the contradicting clause when it isn't lexically close to the answer's subject (e.g. for 'Kilimanjaro is in central Kenya' against the real Kilimanjaro article, the Mount Kenya clause only shares 'Kenya' and gets ranked low). The architectural fix that lifts the ceiling is a SEMANTIC candidate selector (vec-driven, sibling of #000050/#000051's hybrid retrieval — embedding similarity finds meaning-similar clauses, not just token-similar) — not threshold tuning. Caveats: still SHADOW; the 25 fixtures are hand-built (representative but not exhaustive); the deberta-large-mnli/margin@0.995 config IS still 28/28 · 0/808 on the synthetic-eval side AND its real-context pareto at fp=0.001 (1 STRICT FP) jumps to catch=0.56 — so a 'near-fp=0' permissive variant is on the menu if dav1d signs off. Runtime promotion is fox+dav1d-decides.",
    "nli_model_version": "nli-shadow-v1-bart-large-mnli",
    "hf_repo": "facebook/bart-large-mnli",
    "max_candidate_clauses": 12,
    "aggregation": "max",
    "guard": "max_entail",
    "thresholds": {"contradiction_veto": 0.999, "entailment_block_veto": 0.5},
    "real_context_realism_n25_n808": {"catch": "12/25 = 0.480", "fp": "0/808", "note": "the fp=0 frontier point on real-haystack recombinations; bart's score distribution is more spread, so it stays FP-safe at k=12 while other models can't use k=12 without false-firing"},
    "pareto_above_fp0": [
      {"config": "bart k=12/max/θc=0.998", "catch": "0.52", "fp": "0.011"},
      {"config": "bart k=8/top2/θc=0.98", "catch": "0.60", "fp": "0.022"},
      {"config": "bart k=12/max/θc=0.97", "catch": "0.84", "fp": "0.057"},
      {"config": "deberta-large k=8/top2/θc=0.95", "catch": "0.56", "fp": "0.001 (1 STRICT FP)", "note": "deberta-large's near-fp=0 knee — single false-demote in 808 buys recall from 0.24 to 0.56"}
    ],
    "synthetic_eval_alternate": {"hf_repo": "microsoft/deberta-large-mnli", "config": "k=3/agg=margin/θc=0.995", "catch_synth28": "28/28 = 1.000", "catch_realctx25": "6/25 = 0.240", "fp_pooled808": "0/808", "note": "the §7 #26 'settled' config — synthetic-side perfect, real-haystack only 0.24; kept here as a 'best on synth + 0 FP' reference but NOT the runtime recommendation"},
    "model_science_summary": [
      {"hf_repo": "facebook/bart-large-mnli", "realctx_recall_fp0": "0.48", "note": "407M; the real-haystack fp=0 winner — uses k=12 cleanly because its score distribution is more spread"},
      {"hf_repo": "microsoft/deberta-large-mnli", "realctx_recall_fp0": "0.24", "note": "400M; synthetic-set winner but only ~half of bart on real haystacks at fp=0"},
      {"hf_repo": "roberta-large-mnli", "realctx_recall_fp0": "0.12", "note": "355M"},
      {"hf_repo": "cross-encoder/nli-MiniLM2-L6-H768", "realctx_recall_fp0": "0.08", "note": "82M; small models cap low on real haystacks too"},
      {"hf_repo": "MoritzLaurer/DeBERTa-v3-base-mnli-fever-anli", "realctx_recall_fp0": "0.04", "note": "184M; collapses on real-haystack recall"}
    ]
  },
  "alternates": [
    {"nli_model_version": "nli-shadow-v1-minilm-l6-mnli", "hf_repo": "cross-encoder/nli-MiniLM2-L6-H768", "pinned_revision": "b95119ce93d3e065de6214e38cd4a97b0f2f2c6d", "license": "Apache-2.0", "approx_mb": 90, "note": "= the main checkpoint; listed here too so a grid sweep includes 'small' explicitly"},
    {"nli_model_version": "nli-shadow-v1-deberta-v3-base", "hf_repo": "MoritzLaurer/DeBERTa-v3-base-mnli-fever-anli", "pinned_revision": "6f5cf0a2b59cabb106aca4c287eed12e357e90eb", "license": "MIT", "approx_mb": 440, "note": "184M; the threshold-equivalent base candidate (mid)"},
    {"nli_model_version": "nli-shadow-v1-bart-large-mnli", "hf_repo": "facebook/bart-large-mnli", "license": "MIT", "approx_mb": 1600, "note": "407M; the threshold-robust reference (clean separation with no entailment guard on the synthetic set) — large"},
    {"nli_model_version": "nli-shadow-v1-deberta-v3-large", "hf_repo": "MoritzLaurer/DeBERTa-v3-large-mnli-fever-anli", "license": "MIT", "approx_mb": 870, "note": "~435M; tried in the §7 #18 candidate bench but the repo id failed to resolve under transformers 5.x — the grid attempts it and skips on load failure (a clean retry under a different transformers/hub version)"}
  ]
}
