feat(ms-ai-architect): G1 v3 bake-off MÅLT — v3 regredierte (P 92.1→89.7, R flat), v2 beholdt; G5 gull-friskhet åpnet [skip-docs]
This commit is contained in:
parent
fde6ac1c1f
commit
8ca8f33835
4 changed files with 1576 additions and 2 deletions
|
|
@ -96,10 +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) | 🔴 | 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 målt + forkastet 2026-06-30** (regredierte; v2 beholdt) — **v3.1 neste** | 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) |
|
||||
|
||||
**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.
|
||||
|
||||
|
|
@ -107,4 +108,10 @@ Status-nøkkel: 🔴 ikke startet · 🟡 pågår · 🟢 lukket.
|
|||
|
||||
- **G3 🟢 lukket (2026-06-30).** Deterministisk lint `lib/gold-consistency.mjs` + CLI `lint-gold-consistency.mjs` + TDD `tests/kb-eval/test-gold-consistency.test.mjs` (4 tester); wiret som hard gate på `build-gold-set.mjs --write` (dry-run forhåndsviser ikke-fatalt). De 3 nåværende shippet-gull-treffene resolvert med `consistency_waiver` (én — `reserved-capacity-planning#5` — live kilde-bekreftet FØR waiver, verifiseringsplikt). **Bevist mot FP1:** rebuild fra batch-returns flagger `azure-ai-foundry.md#2` (verdict=correct, note «11000+/40+ uverifisert») — nøyaktig claimen Spor 2b fant via dyr live re-fetch. Linten fanger klassen gratis ved bygg.
|
||||
- **G4 🟢 kodet (2026-06-30).** Nedre-grense-policyen + konsistens-policyen kodet inn i `build-gold-set.mjs` `_meta.lower_bound_policy` / `_meta.consistency_policy` (instruks subagenter følger ved fremtidig gull-bygg) OG inn i `judge-claim-prompt-v3.md` som **R1** (nedre-grense-understatement >~2× = `not_grounded`). Policyen er nå kodet begge steder; **håndheving** rir på at G1/G2 adopterer en prompt som bærer R1 (v3 hvis bakeoff-målt forbedring; ellers carry R1 inn i adoptert prompt).
|
||||
- **G1 (Spor 2a) 🟡 v3 forfattet (2026-06-30), måling gjenstår.** `judge-claim-prompt-v3.md` bygget fra v2 med R1–R7 mot de 8 feilmodusene (R1–R4 strammere recall; R5–R7 gjenvunnet presisjon). Table-top: alle 8 mål mapper korrekt ved design. **Fan-out-målingen (255 claims/45 filer, live) ikke kjørt** — venter på operatør-valg av mekanisme (inline Agent / Workflow / Voyage). Adopter v3 KUN ved målt P/R-forbedring vs `-v2-reconciled` (P 92,1 / R 87,5).
|
||||
- **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`).
|
||||
- **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å.
|
||||
|
|
|
|||
234
scripts/kb-eval/data/judge-bakeoff-report-v3.json
Normal file
234
scripts/kb-eval/data/judge-bakeoff-report-v3.json
Normal file
|
|
@ -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": 40,
|
||||
"negatives": 200,
|
||||
"unsourcedInP": 15
|
||||
},
|
||||
"arms": {
|
||||
"staleness": {
|
||||
"tp": 0,
|
||||
"fp": 0,
|
||||
"fn": 40,
|
||||
"tn": 200,
|
||||
"positives": 40,
|
||||
"negatives": 200,
|
||||
"flagged": 0,
|
||||
"precision": null,
|
||||
"recall": 0,
|
||||
"f1": null,
|
||||
"recallWilson": {
|
||||
"p": 0,
|
||||
"low": 0,
|
||||
"high": 0.08762453925039232
|
||||
},
|
||||
"precisionWilson": null
|
||||
},
|
||||
"judge": {
|
||||
"tp": 35,
|
||||
"fp": 4,
|
||||
"fn": 5,
|
||||
"tn": 196,
|
||||
"positives": 40,
|
||||
"negatives": 200,
|
||||
"flagged": 39,
|
||||
"precision": 0.8974358974358975,
|
||||
"recall": 0.875,
|
||||
"f1": 0.8860759493670887,
|
||||
"recallWilson": {
|
||||
"p": 0.875,
|
||||
"low": 0.7388757932976187,
|
||||
"high": 0.9454058022645873
|
||||
},
|
||||
"precisionWilson": {
|
||||
"p": 0.8974358974358975,
|
||||
"low": 0.7642084129775517,
|
||||
"high": 0.9593873444171301
|
||||
}
|
||||
},
|
||||
"hybrid": {
|
||||
"tp": 35,
|
||||
"fp": 4,
|
||||
"fn": 5,
|
||||
"tn": 196,
|
||||
"positives": 40,
|
||||
"negatives": 200,
|
||||
"flagged": 39,
|
||||
"precision": 0.8974358974358975,
|
||||
"recall": 0.875,
|
||||
"f1": 0.8860759493670887,
|
||||
"recallWilson": {
|
||||
"p": 0.875,
|
||||
"low": 0.7388757932976187,
|
||||
"high": 0.9454058022645873
|
||||
},
|
||||
"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": 2,
|
||||
"tn": 42,
|
||||
"positives": 8,
|
||||
"negatives": 45,
|
||||
"flagged": 9,
|
||||
"precision": 0.6666666666666666,
|
||||
"recall": 0.75,
|
||||
"f1": 0.7058823529411765,
|
||||
"recallWilson": {
|
||||
"p": 0.75,
|
||||
"low": 0.40926987910258916,
|
||||
"high": 0.9285223111419724
|
||||
},
|
||||
"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": 1,
|
||||
"tn": 14,
|
||||
"positives": 8,
|
||||
"negatives": 14,
|
||||
"flagged": 7,
|
||||
"precision": 1,
|
||||
"recall": 0.875,
|
||||
"f1": 0.9333333333333333,
|
||||
"recallWilson": {
|
||||
"p": 0.875,
|
||||
"low": 0.5291051942301386,
|
||||
"high": 0.9775830911367038
|
||||
},
|
||||
"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"
|
||||
]
|
||||
}
|
||||
}
|
||||
54
scripts/kb-eval/data/judge-bakeoff-report-v3.md
Normal file
54
scripts/kb-eval/data/judge-bakeoff-report-v3.md
Normal 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.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) | 40 |
|
||||
| Negative (correct) | 200 |
|
||||
| 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 | 40 | 200 | n/a | 0.0% | [0.0%, 8.8%] | n/a |
|
||||
| judge (per-påstand groundedness) | 35 | 4 | 5 | 196 | 89.7% | 87.5% | [73.9%, 94.5%] | 0.886 |
|
||||
| hybrid (union) | 35 | 4 | 5 | 196 | 89.7% | 87.5% | [73.9%, 94.5%] | 0.886 |
|
||||
|
||||
## Judge per claim_type (verifiserbar delmengde)
|
||||
|
||||
| claim_type | positive | TP | FP | FN | presisjon | recall |
|
||||
|---|---|---|---|---|---|---|
|
||||
| taxonomy | 11 | 9 | 0 | 2 | 100.0% | 81.8% |
|
||||
| status | 8 | 6 | 3 | 2 | 66.7% | 75.0% |
|
||||
| sku | 8 | 7 | 0 | 1 | 100.0% | 87.5% |
|
||||
| version | 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.875 ≥ 0.7? **ja**
|
||||
- presisjon 0.897 ≥ 0.6? **ja**
|
||||
- slår staleness (recall 0.000)? **ja**
|
||||
- begrunnelse: all criteria met
|
||||
1279
scripts/kb-eval/data/judge-bakeoff-results-v3.json
Normal file
1279
scripts/kb-eval/data/judge-bakeoff-results-v3.json
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue