diff --git a/docs/ref-kb-correctness-program-2026-06.md b/docs/ref-kb-correctness-program-2026-06.md index 29b4559..974e6ec 100644 --- a/docs/ref-kb-correctness-program-2026-06.md +++ b/docs/ref-kb-correctness-program-2026-06.md @@ -96,11 +96,11 @@ Status-nøkkel: 🔴 ikke startet · 🟡 pågår · 🟢 lukket. | # | Gap (mekanismen mangler) | Forhindrer feilklasse | Lukke-fase | Status | MÅ lukkes før | |---|---|---|---|---|---| -| **G1** | Judgen er ikke herdet mot de 8 dokumenterte feilmodusene (`source_silent`-maskerer-fravær, legacy-rad-match, ramme-skifte-tall-overlever, nedre-grense-understatement, eksakt-streng-pedanteri, taksonomi-nyanse, kapabilitet-bom) | Judge-FN/FP påvist i Spor 2b (8 mål, se `ref-kb-gold-reconciliation-2026-06.md`) | **Spor 2a** — judge-prompt-v3, MÅLT single vs v3/ensemble på herdet gull; adopter kun ved målt forbedring (ad-hoc-patch overfitter + bytter P/R) | 🟡 **v3 målt + forkastet 2026-06-30** (regredierte; v2 beholdt) — **v3.1 neste** | Spor 1 korpus-pass (judgen brukes i ~2700 fetches) | +| **G1** | Judgen er ikke herdet mot de 8 dokumenterte feilmodusene (`source_silent`-maskerer-fravær, legacy-rad-match, ramme-skifte-tall-overlever, nedre-grense-understatement, eksakt-streng-pedanteri, taksonomi-nyanse, kapabilitet-bom) | Judge-FN/FP påvist i Spor 2b (8 mål, se `ref-kb-gold-reconciliation-2026-06.md`) | **Spor 2a** — judge-prompt-v3, MÅLT single vs v3/ensemble på herdet gull; adopter kun ved målt forbedring (ad-hoc-patch overfitter + bytter P/R) | 🟡 **v3 REHABILITERT 2026-06-30 av G5** — mot fersk gull slår v3 (P 89,7/R 92,1) v2 (P 86,8/R 86,8) på BEGGE akser; «regresjonen» var stale gull. v3 = interim baseline; **v3.1 neste** (slå v3, ikke v2) | Spor 1 korpus-pass (judgen brukes i ~2700 fetches) | | **G2** | Herdet judge er ikke wired inn i Port 2 (born-verified create-guard) + Port 3 (kadens) — uten innplugging binder ikke hardningen mekanisk | Re-introdusert drift ved nye/regenererte filer + kadens-bom | Del av Spor 2a→3: bytt ut v2 med v3 i `transform.mjs`-judge-passet + kadens-runneren | 🔴 (avh. G1) | Spor 1 | | **G3** | Ingen deterministisk gull-intern-konsistens-vakt (`verdict=correct` mens egen `notes` sier «uverifisert/illustrativ») | Gull-labeling-feil av FP1-klassen (selvmotsigende annotasjon) | Liten TDD-lint over `gold-correctness-set.json` (+ kjøres på fremtidige gull-bygg) | 🟢 **lukket 2026-06-30** | Spor 1 (nytt gull bygges) / §7 friskt utvalg | | **G4** | Nedre-grense-policyen lever kun i prosa (denne dok + reconciliation-logg) — ikke kodet i judge-prompt ELLER `build-gold-set`-instruks | Re-introdusert nedre-grense-ambivalens i fremtidige gull-bygg + judge-kjøringer | Kod policyen inn i judge-prompt-v3 (G1) + build-gold-set-instruks | 🟢 **kodet 2026-06-30** (build-instruks + v3 R1); håndheving rir på G1/G2-adopsjon | Spor 1 / §7 friskt utvalg | -| **G5** | Gull-fasiten kan aldre — ingen friskhets-/re-adjuderings-vakt på selve svarnøkkelen. v3-målingen avdekket at flere judge-«feil» trolig er *utdatert gull*, ikke judge-feil (`genaiops-llm-specific#2`: claim «1600+», live=1900 ⇒ 1,19× tett nedre grense, R1 sier korrekt `grounded`, gull sier `outdated` — gull-standarden er her for streng) | Feil adopsjonsbeslutning bygd på aldrende baseline; falsk feilrate i §7-nordstjernen | Friskhets-mikropass: re-adjuder de ~5 omstridte v3-vs-v2-claims mot live MS Learn (avgjør gull-feil vs judge-feil) + periodisk gull-re-adjudering knyttet til §7 friskt utvalg | 🔴 | v3.1-adopsjon (baseline må være til å stole på FØR ny prompt måles mot den) | +| **G5** | Gull-fasiten kan aldre — ingen friskhets-/re-adjuderings-vakt på selve svarnøkkelen. v3-målingen avdekket at flere judge-«feil» trolig er *utdatert gull*, ikke judge-feil (`genaiops-llm-specific#2`: claim «1600+», live=1900 ⇒ 1,19× tett nedre grense, R1 sier korrekt `grounded`, gull sier `outdated` — gull-standarden er her for streng) | Feil adopsjonsbeslutning bygd på aldrende baseline; falsk feilrate i §7-nordstjernen | Friskhets-mikropass: re-adjuder de ~5 omstridte v3-vs-v2-claims mot live MS Learn (avgjør gull-feil vs judge-feil) + periodisk gull-re-adjudering knyttet til §7 friskt utvalg | 🟢 **lukket 2026-06-30** (2 gull-feil rettet, 3 judge-feil bekreftet; **reverserte adopsjonsbeslutningen** — se lukke-logg) | v3.1-adopsjon (baseline må være til å stole på FØR ny prompt måles mot den) | **Ikke mekanisme-gap, men sporet backlog (innhold, ikke loop):** reference-`.md`-fil-fiksene fra Spor 2b (FP1 11000+/40+, FP2 «kun», FP6 Preview/Norway-East, FN2–FN6 utdaterte tall) er **Spor 0/1**-innholdsarbeid — pekt per-claim i `notes`, ikke gjentakelses-mekanisme. Føres i Spor 0-manifest / Spor 1-korpus-pass, ikke her. @@ -111,7 +111,16 @@ Status-nøkkel: 🔴 ikke startet · 🟡 pågår · 🟢 lukket. - **G1 (Spor 2a) 🟡 v3 MÅLT + FORKASTET (2026-06-30).** Fan-out kjørt: 255 claims / 45 filer, inline Agent-fan-out (45 Opus-4.8-xhigh-subagenter, live MS Learn, én per fil), aggregert 255/255 rent → `judge-bakeoff-results-v3.json`, deterministisk re-score mot herdet gull → `judge-bakeoff-report-v3.{json,md}`. - **Resultat: v3 P 89,7 % / R 87,5 % vs v2 P 92,1 % / R 87,5 %.** Recall flat, **presisjon −2,4 pp** (FP 3→4). Adopsjonsgaten (P OG R ≥ v2) **ikke klarert** → **v2 beholdt** (forhåndsregistrert regel). Rapportens egen «GATE: PASS» er kun det løse gulvet (R≥0,70/P≥0,60), ikke adopsjonsbaren. - **22 claims flippet v3-vs-v2:** 8 forbedringer (5 FN→TP via R1/R2/R3/R4; 3 FP→TN via R5/R6) + 9 regresjoner (5 TP→FN; 4 TN→FP). Recall-gevinst/-tap kansellerte eksakt; presisjon endte −1 FP. Reglene er **dobbelteggede ved full populasjon** — table-top validerte de 8 målene isolert, men over de 247 øvrige produserer R1–R7 like mange nye feil som de fikser. - - **Konkrete bakslag (input til v3.1):** R1 misanvendt på *øvre* grense (`multi-model-strategy-costs#2`: «up to 18» tak, live 28 — R1 er for *nedre* grenser); R7 for ettergivende (`model-selection#8`, `token-usage#3`, `ai-foundry-dr#9` — fulgte til kanonisk side, fant grunnlag, flippet v2s korrekte `not_grounded`); R2/R6 nye FP (`adr-template#1`, `multi-region-azure-openai#2`, `network-resilience#4`, `vector-storage#7`). + - **Konkrete bakslag (input til v3.1):** R1 misanvendt på *øvre* grense (`multi-model-strategy-costs#2`: «up to 18» tak, live 28 — R1 er for *nedre* grenser); R7 for ettergivende (`model-selection#8`, `token-usage#3`, `ai-foundry-dr#9` — fulgte til kanonisk side, fant grunnlag, flippet v2s korrekte `not_grounded`) **[G5-korreksjon: `model-selection#8` var gull-feil, ikke R7-bom; se G5-lukke-logg]**; R2/R6 nye FP (`adr-template#1`, `multi-region-azure-openai#2`, `network-resilience#4`, `vector-storage#7`). - **Nyanse → G5:** minst én «regresjon» er trolig aldrende gull, ikke v3-feil (`genaiops#2`, se G5-raden). Derfor må gull-friskhet (G5) avgjøres FØR v3.1 måles mot baseline. - **Neste (ny sesjon):** (1) G5 friskhets-mikropass på de ~5 omstridte claims → fastslå gull-feil vs judge-feil; (2) v3.1 = v3 minus bakslagene (R1 kun nedre grenser; R7-ettergivenhets-vakt; R2/R6 FP-vakt); (3) re-mål samme 45-veis fan-out; (4) adopter vinneren; (5) G2-wiring av adoptert judge. -- **G5 🔴 åpen (2026-06-30, avdekket av v3-målingen).** Se rad over. Friskhets-mikropass på de omstridte claims er første konkrete handling i v3.1-loopen — billig, høy verdi, de-risker baselinen som hele adopsjonsbeslutningen hviler på. +- **G5 🟢 lukket (2026-06-30) — REVERSERTE adopsjonsbeslutningen.** Friskhets-mikropass: de 5 omstridte claims (alle v2=`not_grounded`, v3=`grounded`, gull=`outdated`) re-adjudert mot live MS Learn, én Opus-4.8-subagent per claim, blinde for gull/v3-verdikt (anti-anchoring). + - **Utfall — 2 gull-feil + 3 judge-feil (even-handed: rettet gull i begge retninger etter ground truth):** + 1. `genaiops-llm-specific-practices#2` «1600+» — live «over 1 900» (1,19×, tett nedre grense). **Gull-feil** (motsa egen ratifiserte nedre-grense-policy): outdated→correct. v3 `grounded` (R1) korrekt. + 2. `multi-model-strategy-costs#2` «opptil 18» — live 28 (v2025-11-18). **Judge-feil**: «up to 18» er et *tak* som er brutt; v3 misanvendte R1 (nedre-grense) på en øvre grense. Gull `outdated` opprettholdt. → v3.1 R1-vakt (kun nedre grenser). + 3. `model-selection-price-performance#8` «Model Router GA» — live GA (nov 2025; kanonisk concept-side uten «(preview)»; siteringssiden bar stale «(preview)»-lenkelabel). **Gull-feil** (aldret — GA skjedde etter gull-bygg): outdated→correct. v3 `grounded` (R7) **vindisert** — R7s «følg til kanonisk side» fant GA korrekt. + 4. `token-usage-tracking-attribution#3` metrikk-navn — live `ProcessedPromptTokens`/`InputTokens`/`GeneratedTokens`/`OutputTokens`; bare `PromptTokens`/`CompletionTokens` finnes ikke. **Judge-feil**: navnet er load-bearing → eksaktverdi skal styre, R7-leniens feil. Gull `outdated` opprettholdt. → v3.1 R7-load-bearing-vakt. + 5. `ai-foundry-disaster-recovery-planning#9` Global training + Norway East — live: Global training er GA (ingen «Public Preview»-label), «billigere/ingen residency» stemmer, MEN Norway East er en **Global** (ikke-residency) trenings-region, ikke regional/residency (Standard fine-tune-regioner: North Central US / Sweden Central / East US2). 2 av 3 last-bærende delpåstander feil. **Judge-feil** (v3 `grounded`, ingen regel; ufullstendig fler-delt verifisering). Gull `outdated` opprettholdt. → v3.1 fler-delt-fullstendighets-krav. Fil-fiks (Spor 0): fjern «(Public Preview)» + rett Norway-East-anbefalingen. + - **Korreksjon av linje 114 (v3-måling, mot stale gull):** `model-selection#8` var IKKE «R7 for ettergivende» — det var R7 vindisert (gull-feil). v3.1 R7-vakten gjelder kun load-bearing-strenger (`token-usage#3`). + - **Baseline-revurdering (re-score, samme gull begge):** v2 falt 92,1/87,5 → **86,8/86,8** (mistet 2 TP→FP på de rettede claims — var oppblåst av stale gull). v3 steg 89,7/87,5 → **89,7/92,1** (2 FN→TN). **v3 slår nå v2 på BEGGE akser.** Den opprinnelige «v3 regredierte» var et stale-gull-artefakt. Den detaljerte 22-flip-tellingen i linje 113 var mot stale gull (2 «regresjoner» = claims 1+3 er nå presisjon-forbedringer FP→TN) — superseded av re-scoren. Artefakter: `judge-bakeoff-report-v2-g5gold.{json,md}`, `judge-bakeoff-report-v3-g5gold.{json,md}`. Gull-`_meta.reconciliation_log` + lint (373 claims, 0 flagget) + suite 641/641 grønt. + - **Beslutning:** v3 = **interim adoptert baseline** (slår v2 på fersk gull per forhåndsregistrert gate). v3.1-baren er nå **v3 (89,7/92,1)**, ikke v2 — strengere og ærligere. **Completeness-caveat:** kun de 5 omstridte ble re-sjekket; de 4 v3-FP-claims (`adr-template#1` m.fl.) sitt gull er IKKE re-verifisert (antatt `correct`; spot-sjekk under v3.1). Periodisk gull-re-adjudering knyttes til §7 friskt utvalg (G5-mekanismen er nå et mønster, ikke engangs). diff --git a/scripts/kb-eval/data/gold-correctness-set.json b/scripts/kb-eval/data/gold-correctness-set.json index 32664ae..606c529 100644 --- a/scripts/kb-eval/data/gold-correctness-set.json +++ b/scripts/kb-eval/data/gold-correctness-set.json @@ -5,7 +5,11 @@ "sample_frame": "fase0-sample-frame.json", "raw_returns": "fase0-returns/batch-*.json", "note_evidence_quote": "Per-claim evidence_quote omitted here to bound size; full verbatim quotes live in the session transcript. notes + evidence_url capture each verdict basis.", - "claim_count": 373 + "claim_count": 373, + "reconciliation_log": [ + "2026-06-30 Spor 2b: 12 judge-vs-gold-uenigheter adjudert mot live; 4 gull-feil rettet + 1 note-fiks. Logg: docs/ref-kb-gold-reconciliation-2026-06.md.", + "2026-06-30 G5 friskhets-mikropass: 5 omstridte claims (gold=outdated, v3=grounded) re-adjudert mot live MS Learn. 2 stale gull rettet outdated->correct (genaiops-llm-specific-practices.md#2 '1600+' live 1900 tett nedre grense; model-selection-price-performance.md#8 Model Router GA nov 2025). 3 opprettholdt som outdated (judge-feil bekreftet: multi-model-strategy-costs.md#2, token-usage-tracking-attribution.md#3, ai-foundry-disaster-recovery-planning.md#9). Logg: docs/ref-kb-correctness-program-2026-06.md §8 G5." + ] }, "claims": [ { @@ -1705,11 +1709,11 @@ "stratum": "volatile", "claim": "Model Catalog 1600+ foundation models", "claim_type": "sku", - "verdict": "outdated", + "verdict": "correct", "evidence_url": "https://learn.microsoft.com/azure/foundry/concepts/foundry-models-overview", "lastmod_changed": false, "file_last_updated": "2026-06-19", - "notes": "Kilde over 1900. 1600+ utdatert lavere tall." + "notes": "RECONCILED 2026-06-30 (G5 friskhets-mikropass): outdated->correct. Live (foundry-models-overview): 'There are over 1,900 models'. '1600+' er en SANN nedre grense (1900 >= 1600), understatement kun ~1,19x - innenfor den ratifiserte nedre-grense-policyen (grov = >~2x og beslutningsendrende). Gull var her for strengt: motsa egen policy. v3 grounded (R1) var korrekt. Fil kan friskes til '1900+' (Spor 0, valgfritt) men er IKKE feil som den star." }, { "id": "ms-ai-engineering/mlops-genaiops/genaiops-llm-specific-practices.md#3", @@ -4008,11 +4012,11 @@ "stratum": "volatile", "claim": "Model Router er GA-funksjonalitet i Microsoft Foundry", "claim_type": "status", - "verdict": "outdated", + "verdict": "correct", "evidence_url": "https://learn.microsoft.com/azure/foundry/foundry-models/how-to/model-choice-guide", "lastmod_changed": false, "file_last_updated": "2026-06-01", - "notes": "Kilde lenker 'model router for Foundry (preview)'. Fortsatt preview, ikke GA." + "notes": "RECONCILED 2026-06-30 (G5 friskhets-mikropass): outdated->correct. Model Router gikk GA nov 2025: whats-new-model-router har 'Model router GA version', kanonisk concept-side (foundry/openai/concepts/model-router) titulerer uten '(preview)' og lister v2025-11-18 som 'Active (latest)'. Gull var stale - basert pa en utdatert '(preview)'-lenkelabel pa siteringssiden (model-choice-guide); resterende '(preview)' gjelder enkelt-modeller (grok/DeepSeek/Claude-fotnoter), ikke ruter-tjenesten. v3 grounded (R7, fulgte til kanonisk side) var korrekt." }, { "id": "ms-ai-security/cost-optimization/model-selection-price-performance.md#9", diff --git a/scripts/kb-eval/data/judge-bakeoff-report-v2-g5gold.json b/scripts/kb-eval/data/judge-bakeoff-report-v2-g5gold.json new file mode 100644 index 0000000..ff13025 --- /dev/null +++ b/scripts/kb-eval/data/judge-bakeoff-report-v2-g5gold.json @@ -0,0 +1,234 @@ +{ + "_meta": { + "source": "gold-correctness-set.json + judge-bakeoff-results.json", + "thresholds": { + "minRecall": 0.7, + "minPrecision": 0.6 + }, + "judged": 255 + }, + "population": { + "total": 255, + "verifiable": 240, + "positives": 38, + "negatives": 202, + "unsourcedInP": 15 + }, + "arms": { + "staleness": { + "tp": 0, + "fp": 0, + "fn": 38, + "tn": 202, + "positives": 38, + "negatives": 202, + "flagged": 0, + "precision": null, + "recall": 0, + "f1": null, + "recallWilson": { + "p": 0, + "low": 0, + "high": 0.09181293258383999 + }, + "precisionWilson": null + }, + "judge": { + "tp": 33, + "fp": 5, + "fn": 5, + "tn": 197, + "positives": 38, + "negatives": 202, + "flagged": 38, + "precision": 0.868421052631579, + "recall": 0.868421052631579, + "f1": 0.868421052631579, + "recallWilson": { + "p": 0.868421052631579, + "low": 0.7267282994850112, + "high": 0.9424621712426856 + }, + "precisionWilson": { + "p": 0.868421052631579, + "low": 0.7267282994850112, + "high": 0.9424621712426856 + } + }, + "hybrid": { + "tp": 33, + "fp": 5, + "fn": 5, + "tn": 197, + "positives": 38, + "negatives": 202, + "flagged": 38, + "precision": 0.868421052631579, + "recall": 0.868421052631579, + "f1": 0.868421052631579, + "recallWilson": { + "p": 0.868421052631579, + "low": 0.7267282994850112, + "high": 0.9424621712426856 + }, + "precisionWilson": { + "p": 0.868421052631579, + "low": 0.7267282994850112, + "high": 0.9424621712426856 + } + } + }, + "sourceSilent": { + "onVerifiableNegative": 3, + "onVerifiableError": 2, + "agreesWithUnsourced": 5, + "disagreesWithUnsourced": 10 + }, + "byClaimType": { + "version": { + "tp": 6, + "fp": 0, + "fn": 1, + "tn": 21, + "positives": 7, + "negatives": 21, + "flagged": 6, + "precision": 1, + "recall": 0.8571428571428571, + "f1": 0.923076923076923, + "recallWilson": { + "p": 0.8571428571428571, + "low": 0.4868654966809701, + "high": 0.9743210440510252 + }, + "precisionWilson": { + "p": 1, + "low": 0.6096569663469354, + "high": 0.9999999999999999 + } + }, + "tpm": { + "tp": 4, + "fp": 0, + "fn": 1, + "tn": 20, + "positives": 5, + "negatives": 20, + "flagged": 4, + "precision": 1, + "recall": 0.8, + "f1": 0.888888888888889, + "recallWilson": { + "p": 0.8, + "low": 0.3755282641185388, + "high": 0.9637768390302125 + }, + "precisionWilson": { + "p": 1, + "low": 0.5100999795960008, + "high": 1 + } + }, + "region": { + "tp": 1, + "fp": 0, + "fn": 0, + "tn": 14, + "positives": 1, + "negatives": 14, + "flagged": 1, + "precision": 1, + "recall": 1, + "f1": 1, + "recallWilson": { + "p": 1, + "low": 0.2065432914738929, + "high": 1 + }, + "precisionWilson": { + "p": 1, + "low": 0.2065432914738929, + "high": 1 + } + }, + "status": { + "tp": 6, + "fp": 1, + "fn": 1, + "tn": 45, + "positives": 7, + "negatives": 46, + "flagged": 7, + "precision": 0.8571428571428571, + "recall": 0.8571428571428571, + "f1": 0.8571428571428571, + "recallWilson": { + "p": 0.8571428571428571, + "low": 0.4868654966809701, + "high": 0.9743210440510252 + }, + "precisionWilson": { + "p": 0.8571428571428571, + "low": 0.4868654966809701, + "high": 0.9743210440510252 + } + }, + "taxonomy": { + "tp": 11, + "fp": 3, + "fn": 0, + "tn": 83, + "positives": 11, + "negatives": 86, + "flagged": 14, + "precision": 0.7857142857142857, + "recall": 1, + "f1": 0.88, + "recallWilson": { + "p": 1, + "low": 0.7411599827511859, + "high": 1 + }, + "precisionWilson": { + "p": 0.7857142857142857, + "low": 0.5241027622679172, + "high": 0.9242875166308363 + } + }, + "sku": { + "tp": 5, + "fp": 1, + "fn": 2, + "tn": 14, + "positives": 7, + "negatives": 15, + "flagged": 6, + "precision": 0.8333333333333334, + "recall": 0.7142857142857143, + "f1": 0.7692307692307692, + "recallWilson": { + "p": 0.7142857142857143, + "low": 0.35892909014821267, + "high": 0.9177828342909844 + }, + "precisionWilson": { + "p": 0.8333333333333334, + "low": 0.43649056343635395, + "high": 0.9699474141282697 + } + } + }, + "gate": { + "pass": true, + "recallOk": true, + "precisionOk": true, + "beatsStaleness": true, + "thresholds": { + "minRecall": 0.7, + "minPrecision": 0.6 + }, + "reasons": [ + "all criteria met" + ] + } +} diff --git a/scripts/kb-eval/data/judge-bakeoff-report-v2-g5gold.md b/scripts/kb-eval/data/judge-bakeoff-report-v2-g5gold.md new file mode 100644 index 0000000..4e6887c --- /dev/null +++ b/scripts/kb-eval/data/judge-bakeoff-report-v2-g5gold.md @@ -0,0 +1,54 @@ +# Judge bake-off-rapport — S1 (Fase 3 de-risk) + +_Generert deterministisk av `run-judge-bakeoff.mjs` over `gold-correctness-set.json` + `judge-bakeoff-results.json`. Tall fra testet `lib/judge-bakeoff.mjs`. Ikke rediger for hånd — regenerer._ + +**Forhåndsregistrert gate (låst FØR fan-out):** recall ≥ 0.7, presisjon ≥ 0.6, OG judge-recall > staleness-recall. + +## Evaluerings-populasjon (P) + +Volatil stratum + fetchbare claim_types (price ekskludert) — der feilene bor; unngår «invertert leverage». + +| metrikk | verdi | +|---|---| +| P totalt | 255 | +| Verifiserbare (correct/outdated/wrong) | 240 | +| Positive (reelle feil å fange) | 38 | +| Negative (correct) | 202 | +| Unsourced i P (kjørt, men utenfor P/R) | 15 | + +## Arm-sammenligning (detektering over de 240 verifiserbare) + +| arm | TP | FP | FN | TN | presisjon | recall | recall Wilson 95% | F1 | +|---|---|---|---|---|---|---|---|---| +| staleness (billig baseline) | 0 | 0 | 38 | 202 | n/a | 0.0% | [0.0%, 9.2%] | n/a | +| judge (per-påstand groundedness) | 33 | 5 | 5 | 197 | 86.8% | 86.8% | [72.7%, 94.2%] | 0.868 | +| hybrid (union) | 33 | 5 | 5 | 197 | 86.8% | 86.8% | [72.7%, 94.2%] | 0.868 | + +## Judge per claim_type (verifiserbar delmengde) + +| claim_type | positive | TP | FP | FN | presisjon | recall | +|---|---|---|---|---|---|---| +| taxonomy | 11 | 11 | 3 | 0 | 78.6% | 100.0% | +| version | 7 | 6 | 0 | 1 | 100.0% | 85.7% | +| status | 7 | 6 | 1 | 1 | 85.7% | 85.7% | +| sku | 7 | 5 | 1 | 2 | 83.3% | 71.4% | +| tpm | 5 | 4 | 0 | 1 | 100.0% | 80.0% | +| region | 1 | 1 | 0 | 0 | 100.0% | 100.0% | + +## source_silent-diagnostikk + +Judgen hentet siden men fant ikke verdien. Diagnostisk, ikke et flagg. + +| signal | antall | tolkning | +|---|---|---| +| På verifiserbar feil | 2 | judge-bom: reell feil oversett via «kan ikke verifisere» | +| På verifiserbar correct | 3 | judge reproduserte ikke et korrekt faktum mennesket fant | +| Enig med unsourced | 5 | judge reproduserer den uverifiserbare grensen (godt) | +| Uenig med unsourced | 10 | judge hevdet grunnet/ugrunnet der mennesket ikke fant kilde | + +## GATE: ✅ PASS — bygg S3 + +- recall 0.868 ≥ 0.7? **ja** +- presisjon 0.868 ≥ 0.6? **ja** +- slår staleness (recall 0.000)? **ja** +- begrunnelse: all criteria met diff --git a/scripts/kb-eval/data/judge-bakeoff-report-v3-g5gold.json b/scripts/kb-eval/data/judge-bakeoff-report-v3-g5gold.json new file mode 100644 index 0000000..06536be --- /dev/null +++ b/scripts/kb-eval/data/judge-bakeoff-report-v3-g5gold.json @@ -0,0 +1,234 @@ +{ + "_meta": { + "source": "gold-correctness-set.json + judge-bakeoff-results.json", + "thresholds": { + "minRecall": 0.7, + "minPrecision": 0.6 + }, + "judged": 255 + }, + "population": { + "total": 255, + "verifiable": 240, + "positives": 38, + "negatives": 202, + "unsourcedInP": 15 + }, + "arms": { + "staleness": { + "tp": 0, + "fp": 0, + "fn": 38, + "tn": 202, + "positives": 38, + "negatives": 202, + "flagged": 0, + "precision": null, + "recall": 0, + "f1": null, + "recallWilson": { + "p": 0, + "low": 0, + "high": 0.09181293258383999 + }, + "precisionWilson": null + }, + "judge": { + "tp": 35, + "fp": 4, + "fn": 3, + "tn": 198, + "positives": 38, + "negatives": 202, + "flagged": 39, + "precision": 0.8974358974358975, + "recall": 0.9210526315789473, + "f1": 0.9090909090909091, + "recallWilson": { + "p": 0.9210526315789473, + "low": 0.792003210797347, + "high": 0.972785898605735 + }, + "precisionWilson": { + "p": 0.8974358974358975, + "low": 0.7642084129775517, + "high": 0.9593873444171301 + } + }, + "hybrid": { + "tp": 35, + "fp": 4, + "fn": 3, + "tn": 198, + "positives": 38, + "negatives": 202, + "flagged": 39, + "precision": 0.8974358974358975, + "recall": 0.9210526315789473, + "f1": 0.9090909090909091, + "recallWilson": { + "p": 0.9210526315789473, + "low": 0.792003210797347, + "high": 0.972785898605735 + }, + "precisionWilson": { + "p": 0.8974358974358975, + "low": 0.7642084129775517, + "high": 0.9593873444171301 + } + } + }, + "sourceSilent": { + "onVerifiableNegative": 0, + "onVerifiableError": 0, + "agreesWithUnsourced": 2, + "disagreesWithUnsourced": 13 + }, + "byClaimType": { + "version": { + "tp": 7, + "fp": 0, + "fn": 0, + "tn": 21, + "positives": 7, + "negatives": 21, + "flagged": 7, + "precision": 1, + "recall": 1, + "f1": 1, + "recallWilson": { + "p": 1, + "low": 0.6456611570247934, + "high": 1 + }, + "precisionWilson": { + "p": 1, + "low": 0.6456611570247934, + "high": 1 + } + }, + "tpm": { + "tp": 5, + "fp": 0, + "fn": 0, + "tn": 20, + "positives": 5, + "negatives": 20, + "flagged": 5, + "precision": 1, + "recall": 1, + "f1": 1, + "recallWilson": { + "p": 1, + "low": 0.5655085052479191, + "high": 1 + }, + "precisionWilson": { + "p": 1, + "low": 0.5655085052479191, + "high": 1 + } + }, + "region": { + "tp": 1, + "fp": 1, + "fn": 0, + "tn": 13, + "positives": 1, + "negatives": 14, + "flagged": 2, + "precision": 0.5, + "recall": 1, + "f1": 0.6666666666666666, + "recallWilson": { + "p": 1, + "low": 0.2065432914738929, + "high": 1 + }, + "precisionWilson": { + "p": 0.5, + "low": 0.09452865480086614, + "high": 0.9054713451991339 + } + }, + "status": { + "tp": 6, + "fp": 3, + "fn": 1, + "tn": 43, + "positives": 7, + "negatives": 46, + "flagged": 9, + "precision": 0.6666666666666666, + "recall": 0.8571428571428571, + "f1": 0.75, + "recallWilson": { + "p": 0.8571428571428571, + "low": 0.4868654966809701, + "high": 0.9743210440510252 + }, + "precisionWilson": { + "p": 0.6666666666666666, + "low": 0.3541973474990897, + "high": 0.8794184013172571 + } + }, + "taxonomy": { + "tp": 9, + "fp": 0, + "fn": 2, + "tn": 86, + "positives": 11, + "negatives": 86, + "flagged": 9, + "precision": 1, + "recall": 0.8181818181818182, + "f1": 0.9, + "recallWilson": { + "p": 0.8181818181818182, + "low": 0.5230138624217553, + "high": 0.9486333993289995 + }, + "precisionWilson": { + "p": 1, + "low": 0.7008472464490407, + "high": 1 + } + }, + "sku": { + "tp": 7, + "fp": 0, + "fn": 0, + "tn": 15, + "positives": 7, + "negatives": 15, + "flagged": 7, + "precision": 1, + "recall": 1, + "f1": 1, + "recallWilson": { + "p": 1, + "low": 0.6456611570247934, + "high": 1 + }, + "precisionWilson": { + "p": 1, + "low": 0.6456611570247934, + "high": 1 + } + } + }, + "gate": { + "pass": true, + "recallOk": true, + "precisionOk": true, + "beatsStaleness": true, + "thresholds": { + "minRecall": 0.7, + "minPrecision": 0.6 + }, + "reasons": [ + "all criteria met" + ] + } +} diff --git a/scripts/kb-eval/data/judge-bakeoff-report-v3-g5gold.md b/scripts/kb-eval/data/judge-bakeoff-report-v3-g5gold.md new file mode 100644 index 0000000..2dec728 --- /dev/null +++ b/scripts/kb-eval/data/judge-bakeoff-report-v3-g5gold.md @@ -0,0 +1,54 @@ +# Judge bake-off-rapport — S1 (Fase 3 de-risk) + +_Generert deterministisk av `run-judge-bakeoff.mjs` over `gold-correctness-set.json` + `judge-bakeoff-results.json`. Tall fra testet `lib/judge-bakeoff.mjs`. Ikke rediger for hånd — regenerer._ + +**Forhåndsregistrert gate (låst FØR fan-out):** recall ≥ 0.7, presisjon ≥ 0.6, OG judge-recall > staleness-recall. + +## Evaluerings-populasjon (P) + +Volatil stratum + fetchbare claim_types (price ekskludert) — der feilene bor; unngår «invertert leverage». + +| metrikk | verdi | +|---|---| +| P totalt | 255 | +| Verifiserbare (correct/outdated/wrong) | 240 | +| Positive (reelle feil å fange) | 38 | +| Negative (correct) | 202 | +| Unsourced i P (kjørt, men utenfor P/R) | 15 | + +## Arm-sammenligning (detektering over de 240 verifiserbare) + +| arm | TP | FP | FN | TN | presisjon | recall | recall Wilson 95% | F1 | +|---|---|---|---|---|---|---|---|---| +| staleness (billig baseline) | 0 | 0 | 38 | 202 | n/a | 0.0% | [0.0%, 9.2%] | n/a | +| judge (per-påstand groundedness) | 35 | 4 | 3 | 198 | 89.7% | 92.1% | [79.2%, 97.3%] | 0.909 | +| hybrid (union) | 35 | 4 | 3 | 198 | 89.7% | 92.1% | [79.2%, 97.3%] | 0.909 | + +## Judge per claim_type (verifiserbar delmengde) + +| claim_type | positive | TP | FP | FN | presisjon | recall | +|---|---|---|---|---|---|---| +| taxonomy | 11 | 9 | 0 | 2 | 100.0% | 81.8% | +| version | 7 | 7 | 0 | 0 | 100.0% | 100.0% | +| status | 7 | 6 | 3 | 1 | 66.7% | 85.7% | +| sku | 7 | 7 | 0 | 0 | 100.0% | 100.0% | +| tpm | 5 | 5 | 0 | 0 | 100.0% | 100.0% | +| region | 1 | 1 | 1 | 0 | 50.0% | 100.0% | + +## source_silent-diagnostikk + +Judgen hentet siden men fant ikke verdien. Diagnostisk, ikke et flagg. + +| signal | antall | tolkning | +|---|---|---| +| På verifiserbar feil | 0 | judge-bom: reell feil oversett via «kan ikke verifisere» | +| På verifiserbar correct | 0 | judge reproduserte ikke et korrekt faktum mennesket fant | +| Enig med unsourced | 2 | judge reproduserer den uverifiserbare grensen (godt) | +| Uenig med unsourced | 13 | judge hevdet grunnet/ugrunnet der mennesket ikke fant kilde | + +## GATE: ✅ PASS — bygg S3 + +- recall 0.921 ≥ 0.7? **ja** +- presisjon 0.897 ≥ 0.6? **ja** +- slår staleness (recall 0.000)? **ja** +- begrunnelse: all criteria met