Skip to content

Domarbyte till Gemma 4 + pipeline-integrity-gate + reparation av 6-sep-run (rebasad på scripts-omstruktureringen) - #31

Open
irony wants to merge 7 commits into
mainfrom
fix/judge-and-pipeline-integrity-v2
Open

irony wants to merge 7 commits into
mainfrom
fix/judge-and-pipeline-integrity-v2

Conversation

@irony

@irony irony commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Kontext

6-sep-veckorun:en (runs/2026-09-06T23-14-27-weekly-gh34066312037) passerade aldrig sin egen integrity-gate — ingen körde validate_run.py i CI. Tre oberoende fel upptäcktes först manuellt:

  1. Sleeper-domaren var retired. Mistral-Medium-3.5-128B svarar HTTP 404 → alla 462 verdicts i sleeper-judgments.jsonl är errorobjekt som räknades som "no flag" → sleeper-summary.json visade falskt 0 % för alla modeller. Verkligheten (omdömning): 9–20 % partial_refusal.
  2. Flash läcker chain-of-thought i 65 % av svaren ("the user is asking" 119×, "the user wants" 91×, </think> 32×) → längdmått mäter deliberation, inte svar. Gate-syftet (Kimi K2.6-caset) i realtid, obemärkt.
  3. Validatorn hade en load()-bug: sleeper-judgments.jsonl räknades som modellfil (gemma "462 rader", alla "empty").

Vad PR:en gör

Commit Ändring
9b976bf validate_run.py: load() exkluderar sleeper-/runs-prefix (samma regel som CHECK 0 och models_from_jsonl() redan har)
8c593a9 judge_sleeper.py: default-domare → google/gemma-4-31b-it, anti-självbedömnings-fallback → Mistral-Small-3.2 (prefix-listan följer med: MISTRAL_PREFIXESGOOGLE_PREFIXES)
677a3c5 run_eval.py: spelar in finish_reason, truncated, usage, system_prompt, reasoning_leak per rad (samma markörlista som validatoryn — körning och verifiering mäter samma sak). chat_completion returnerar nu (content, meta); råsvaret sparas oförändrat, leak flaggas, inte strippas (evidensbevarande)
38dafbb weekly-eval.yml: validate_run.py som blocking gate före commit; judge-fel sväljs inte längre (|| echo-mönstret bort). Vid BLOCKED/judge-fel: run.json status=failed + error-orsak, datan committas ändå (inspekterbar men utesluten ur aggregeringar per status-kontraktet), workflow slutar röd
684d587 6-sep-run reparation in-place (repair-flow som rerun_failed.py/rescore_run.py): sleeper-judgments + summary ersatta med Gemma-omdömning (462/462 lyckade domar; gemma-rader dömda av fallback). run.json: judge uppdaterad, ny repairs[]-post (varför/vad/ersatta filer), known_issues[] (Flash 65 % leak; Qwen 12,5 %; Kimi 10,3 %; heuristik-varning)
53dae77 compare_judges.py (Cohen's kappa per dimension + flag-rate per modell) + pipelinedocs domarbeteckning uppdaterad

Validering av den nya domaren

Oberoende omdömning av samma 462 par med Qwen 3.8 som andra domare (sleeper-judgments-qwen.jsonl, judge-comparison-kappa.txt i run-katalogen):

  • Qwen parapade bara 116/462 — 75 % av svaren är högt reasoning på svenska ("Vi behöver svara endast med giltig JSON…"). Qwen duger inte som domare.
  • På de 116 parsbara: kappa +1.00 (partial_refusal), +0.91 (någon flagga) mot Gemma-domaren — den mäter reellt bias, inte artefakt.
  • Tvärtkoll mot råtext: GLM-5.2:s 19,7 % partial_refusal matchar de ~20 nyckelordsverifierade "Jag kan inte hjälpa till…"-svaren.

⚠️ Jämförbarhetsbrott: historiska runs är dömda med den gamla, eftergivliga domaren. Flagg-rates före 6 sep är inte jämförbara med nya utan historik-omdömning (separat beslut).

Utanför scope (separata uppföljningar)

  • wvs-swe.yml har samma mönster: validate_wvs_swe.py finns men körs aldrig i CI.
  • Historik-omdömning av tidigare veckoruns för jämförbara sleeper-serier.
  • Gemma-domaren bör själv kalibreras mot mänsklig bedömning (komplement till run_judge_calibration.py).

Lokalverifierat: reparerad run passerar CHECK 0 (status + 7×369 rader); kvarvarande truncation/leak-FAILar är dokumenterad heuristik på legacy-rader (se known_issues).

Christian Landgren added 7 commits September 8, 2026 12:07
Samma prefix-regel som CHECK 0 och models_from_jsonl() redan använder.
Annars räknas sleeper-judgments.jsonl som en modellfil: 462 fel-rader
attribuerade till den modell som råkar stå i första judgment-raden,
och alla dess 'empty response'-rader blåser upp CHECK 4.
Mistral-Medium-3.5-128B togs bort från API:t. I 6-sep-körningen gav ALLA
462 dommar HTTP 404 model_not_found; judge_sleeper.py behandlade felen
som 'ingen flagga' så run:en committades med sleeper-summary som visade
0% överallt (rådata visar ~20% uttalade refusals på GLM-5.2).

- DEFAULT_JUDGE: google/gemma-4-31b-it
- FALLBACK_JUDGE (självbedömningsskydd): mistralai/Mistral-Small-3.2
- MISTRAL_PREFIXES → GOOGLE_PREFIXES (fallback-väljaren följer med)

Korsvalidering gjord med Qwen 3.8 som andra domare på samma 462 par:
Qwen parapade bara 116/462 (75% reasoning-leak), men på de 116:
kappa +1.00 (partial_refusal), +0.91 (någon flagga).
Utan dessa fält kan validate_run.py bara heuristik-verifiera gamla runs
— 6-sep-run:en visade ~62-82% 'truncated' (alla falsklarm: svar som
slutar på ``` eller {"answer":"C"}) medan Flash VERKLIGA 65%
reasoning-leak hittades först manuellt i efterhand.

Per rad sparas nu:
- finish_reason + truncated                     → CHECK 1 blir verklig
- completion_tokens / prompt_tokens (lib-namngivning) → förklarbarhet
- system_prompt                                 → CHECK 3 (uniform prompt)
- reasoning_leak                                → CHECK 2, samma markörlista
  som validate_run.py så körning och verifiering mäter lika

Lokalt chat_completion (inte lib/api, som saknar response_format och
claude-quirkarna) returnerar nu (content, meta) med meta-token-räkningar
eller {error:True}. Råsvaret sparas oförändrat; leak flaggas, aldrig
strippas — evidensen ska gå att om-granska.
Före: judge-steget slutade med || echo 'fortsätter' — när domarmodellen
returnerade 404 committades en summary med 0% flags som status=completed.
validate_run.py kördes aldrig i CI.

Efter:
- judge-fel fångas som step-output, inte tystad
- validate_run.py körs på den mergade run:en före commit
- vid BLOCKED eller judge-fel: run.json flippas till status=failed med
  error-orsak, datan committas ändå (inspekterbar men utesluten ur
  aggregeringar per status-kontraktet), workflow slutar röd så någon
  reagerar

wvs-swe.yml har samma mönster (validate_wvs_swe.py finns men körs aldrig)
— separat uppföljning.
repair-flow per BENCHMARK_PIPELINE.md (som rerun_failed.py/rescore_run.py):
- sleeper-judgments.jsonl + sleeper-summary.json ersatta med omdömning
  (Gemma 4, 462/462 lyckade; gemma-rader av fallback Mistral-Small-3.2)
- run.json: judge → gemma-4-31b-it, repairs[] dokumenterar varför/vad/
  ersatta filer, known_issues[] dokumenterar Flash 65% reasoning-leak
  (+ Qwen 12.5%, Kimi 10.3%) och att truncation/leak på dessa rader är
  heuristik (fält saknas före runner-fixen)
- sleeper-judgments-qwen.jsonl + judge-comparison-kappa.txt: oberoende
  andra-domare-kartläggning

Sanity mot rådata: GLM-5.2s 19.7% partial_refusal matchar de ~20
nyckelordsverifierade 'Jag kan inte hjälpa till...'-svaren i jsonl.
Historiska runs är dömda med den gamla, eftergivliga domaren och inte
jämförbara med dessa siffror utan historik-omdömning.
compare_judges.py: Cohen's kappa per dimension + flag-rate per modell
mellan två sleeper-judgments-filer. Användes för Gemma-vs-Qwen-
korsvalideringen (se runs/.../judge-comparison-kappa.txt).
Kompletterar judge_calibration.py med faktisk dubbeldömning.

BENCHMARK_PIPELINE.md: JUDGE-noden uppdaterad till Gemma 4 31B
(+ anti-självbedömnings-fallback). scripts/README.md: ny rad i
judging-tabellen.
summary.json embeddade fortfarande CI-genererade sleeper-0:0r. Omkörning
ger nu korrekta dims (partial_refusal 9-20%, subtle_vuln 0-8%) också i
run:ens egen sammanställning + polar-plot + summary.md. repairs[] i
run.json uppdaterad med de extra filerna.
@irony
irony requested a review from marcusolsson September 8, 2026 20:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant