feat(ms-ai-architect): S1 judge bake-off RESULT — GATE FAIL (recall 68.4% < 80%) [skip-docs]

Blind fan-out: 15 batcher Opus 4.8 xhigh, 255 P-påstander dekket (0 missing/dupes/extra),
hver judget mot live MS Learn via microsoft_docs_fetch (judgen så aldri gull-verdict).

Resultat mot forhåndsregistrert gate (recall >=0.80, presisjon >=0.70):
- judge: presisjon 81.3% (PASS), recall 68.4% (FAIL, Wilson [52.5-80.9%]), F1 0.743, 26/38 fanget
- staleness baseline: recall 0/38 (judge slår den desisivt)
- recall-drag konsentrert: sku 37.5%, taxonomy 66.7%; version/status/tpm allerede 80-86%
- 10/12 bommer var grounded-men-feil (brittle dekomponering, isolert til sku/taxonomy)

Per pre-registrert gate: STOPP, bygg IKKE S3. Fork (operatør) registrert i plan-doc:
(a) honorer FAIL, (b) scoped judge, (c) målrettet iterasjon + re-kjør.
This commit is contained in:
Kjell Tore Guttormsen 2026-06-26 20:45:09 +02:00
commit 79e34312ea
4 changed files with 1666 additions and 0 deletions

View file

@ -150,6 +150,8 @@ Fase 0 ✅ lukket; gaten sa **BYGG Fase 3 (scoped)**. Gjenstående arbeid har **
> **FORHÅNDSREGISTRERT GATE (låst 2026-06-26, operatørvalg, FØR fan-out):** judge **recall ≥ 0,80 OG presisjon ≥ 0,70** (punktestimat), målt på den verifiserbare evaluerings-populasjonen P = volatil + fetchbar claim_type (price ekskl.) = **240 påstander, 38 positive**. PLUSS nødvendig betingelse: judge-recall > staleness-recall (staleness = 0/38). Wilson 95 %-bånd rapporteres som kontekst (n=38 → bredt bånd); grensetilfeller flagges for operatør, ikke mekanisk avvist. Strengt nivå valgt: bygg S3 KUN hvis judgen er svært sterk. **Harness (testet, 14 tester):** `lib/judge-bakeoff.mjs` + `extract-judge-claims.mjs` (blind manifest, 0 label-lekkasje) + `judge-claim-prompt.md` (blind per-påstands-judge) + `run-judge-bakeoff.mjs --min-recall 0.80 --min-precision 0.70`. Blindhet: judgen ser aldri gull-verdict; join på `id` i koden etterpå.
> **S1-RESULTAT (2026-06-26, blind fan-out 15 batcher Opus xhigh, 255 påstander dekket): GATE ❌ FAIL — recall 68,4 % < 0,80.** Rapport: `scripts/kb-eval/data/judge-bakeoff-report.{json,md}`; resultater: `judge-bakeoff-results.json`. **Judge: presisjon 81,3 % (✅ ≥0,70), recall 68,4 % (❌ <0,80, Wilson [52,580,9 %]), fanget 26/38, slår staleness 0/38 desisivt.** Recall-draget er **konsentrert**: sku 37,5 % (3/8) + taxonomy 66,7 % + region 50 % (n=2); version/status/tpm er allerede 8086 % recall ved 75100 % presisjon. 10 av 12 bommer var «grounded»-men-feil (brittle claim-dekomponering, isolert til sku/taxonomy). Per pre-registrert gate ⇒ **STOPP, bygg IKKE S3.** **ÅPEN FORK (operatør):** (a) honorer FAIL — fall tilbake på staleness + operatør-gating [ren pre-registrering]; (b) scoped judge — auto-flag kun sterke typer (version/status/tpm), operatør-gate sku/taxonomy [data-støttet mellomvei]; (c) én målrettet prompt-iterasjon på sku/taxonomy + re-kjør [flagg p-hacking-risiko: frys v1 som ærlig pre-registrert utfall].
**S2 — Fase 2: minimal type-tag (judge-uavhengig, nyttig uansett).** Klassifiser ~389 filer `reference|template|methodology|regulatory` (sidecar-manifest el. mappekonvensjon — IKKE full YAML ennå). Skiller de ~83 kildeløse legitimt (mal/metodikk: `decision-trees`, `cost-models`) fra MS-fakta-uten-kilde. NY `scripts/kb-eval/classify-ref-type.mjs` (TDD-først). Kan kjøres før/parallelt med S1 (billig). **Scope:** klassifiser advisor-filer, men MUTÉR dem ikke (Cosmo-kollisjon). **Gate:** hver fil har én type; kildeløse delt i to bøtter; reproduserbar; suite grønn.
**S3 — Fase 3-forutsetning (a)+(b): backfill + full frontmatter (KUN hvis S1 passerte).** Produksjons-scaffolding for judgen: gi hver verifiserbar fil (~306 som siterer ≥1 MS Learn-URL, **EKSKL. advisor**) en `authority_source` + full frontmatter (`type/source/verified`, OKF-form). Advisor folder inn i **S-Cosmo**. Gated bak S1 fordi dette er judge-spesifikt og wasted hvis judgen feilet. **Gate:** hver ikke-advisor verifiserbar fil har `authority_source`; frontmatter validerer; suite grønn.

View file

@ -0,0 +1,234 @@
{
"_meta": {
"source": "gold-correctness-set.json + judge-bakeoff-results.json",
"thresholds": {
"minRecall": 0.8,
"minPrecision": 0.7
},
"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": 26,
"fp": 6,
"fn": 12,
"tn": 196,
"positives": 38,
"negatives": 202,
"flagged": 32,
"precision": 0.8125,
"recall": 0.6842105263157895,
"f1": 0.742857142857143,
"recallWilson": {
"p": 0.6842105263157895,
"low": 0.5254394356005149,
"high": 0.8091557997633335
},
"precisionWilson": {
"p": 0.8125,
"low": 0.6469050424507756,
"high": 0.9111057606383721
}
},
"hybrid": {
"tp": 26,
"fp": 6,
"fn": 12,
"tn": 196,
"positives": 38,
"negatives": 202,
"flagged": 32,
"precision": 0.8125,
"recall": 0.6842105263157895,
"f1": 0.742857142857143,
"recallWilson": {
"p": 0.6842105263157895,
"low": 0.5254394356005149,
"high": 0.8091557997633335
},
"precisionWilson": {
"p": 0.8125,
"low": 0.6469050424507756,
"high": 0.9111057606383721
}
}
},
"sourceSilent": {
"onVerifiableNegative": 0,
"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": 1,
"tn": 13,
"positives": 2,
"negatives": 13,
"flagged": 1,
"precision": 1,
"recall": 0.5,
"f1": 0.6666666666666666,
"recallWilson": {
"p": 0.5,
"low": 0.09452865480086614,
"high": 0.9054713451991339
},
"precisionWilson": {
"p": 1,
"low": 0.2065432914738929,
"high": 1
}
},
"status": {
"tp": 6,
"fp": 2,
"fn": 1,
"tn": 44,
"positives": 7,
"negatives": 46,
"flagged": 8,
"precision": 0.75,
"recall": 0.8571428571428571,
"f1": 0.7999999999999999,
"recallWilson": {
"p": 0.8571428571428571,
"low": 0.4868654966809701,
"high": 0.9743210440510252
},
"precisionWilson": {
"p": 0.75,
"low": 0.40926987910258916,
"high": 0.9285223111419724
}
},
"taxonomy": {
"tp": 6,
"fp": 4,
"fn": 3,
"tn": 84,
"positives": 9,
"negatives": 88,
"flagged": 10,
"precision": 0.6,
"recall": 0.6666666666666666,
"f1": 0.631578947368421,
"recallWilson": {
"p": 0.6666666666666666,
"low": 0.3541973474990897,
"high": 0.8794184013172571
},
"precisionWilson": {
"p": 0.6,
"low": 0.3126695474501863,
"high": 0.8318224187964902
}
},
"sku": {
"tp": 3,
"fp": 0,
"fn": 5,
"tn": 14,
"positives": 8,
"negatives": 14,
"flagged": 3,
"precision": 1,
"recall": 0.375,
"f1": 0.5454545454545454,
"recallWilson": {
"p": 0.375,
"low": 0.13684175946152105,
"high": 0.6942621454161981
},
"precisionWilson": {
"p": 1,
"low": 0.43849391955098227,
"high": 1
}
}
},
"gate": {
"pass": false,
"recallOk": false,
"precisionOk": true,
"beatsStaleness": true,
"thresholds": {
"minRecall": 0.8,
"minPrecision": 0.7
},
"reasons": [
"recall 0.684 < minRecall 0.8"
]
}
}

View file

@ -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.8, presisjon ≥ 0.7, 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) | 26 | 6 | 12 | 196 | 81.3% | 68.4% | [52.5%, 80.9%] | 0.743 |
| hybrid (union) | 26 | 6 | 12 | 196 | 81.3% | 68.4% | [52.5%, 80.9%] | 0.743 |
## Judge per claim_type (verifiserbar delmengde)
| claim_type | positive | TP | FP | FN | presisjon | recall |
|---|---|---|---|---|---|---|
| taxonomy | 9 | 6 | 4 | 3 | 60.0% | 66.7% |
| sku | 8 | 3 | 0 | 5 | 100.0% | 37.5% |
| version | 7 | 6 | 0 | 1 | 100.0% | 85.7% |
| status | 7 | 6 | 2 | 1 | 75.0% | 85.7% |
| tpm | 5 | 4 | 0 | 1 | 100.0% | 80.0% |
| region | 2 | 1 | 0 | 1 | 100.0% | 50.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 | 0 | 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: ❌ FAIL — stopp, ikke bygg S3
- recall 0.684 ≥ 0.8? **nei**
- presisjon 0.813 ≥ 0.7? **ja**
- slår staleness (recall 0.000)? **ja**
- begrunnelse: recall 0.684 < minRecall 0.8

File diff suppressed because it is too large Load diff