# Eval-set for the retrieval quality gate (module 5, phase 3, plan §6.2,
# docs/kb/modules/05-faza3-plan.md). Transcribed 1:1 from the pilot baseline,
# docs/kb/eval/retrieval-pilot-2026-07-16.md (read-only source -- this file is the versioned
# copy the plan asked for, so the set stops living only in a session transcript).
#
# kind:
#   hit                 -- pilot found a correct top-1 match (dist < 0.45)
#   grey_zone           -- pilot landed in the 0.45-0.55 band (on-topic, imprecise)
#   negative_control            -- pilot correctly found nothing (dist > 0.55)
#   negative_control_borderline -- pilot correctly found nothing, but close to the 0.55 edge
#
# expected_envelope is null for both negative-control kinds: there is no document these
# queries should match, by design.

queries:
  - id: "1"
    text: "polisa ubezpieczeniowa PZU warunki odpowiedzialności"
    kind: hit
    expected_envelope: "paperless:14"
    baseline_top1_dist: 0.3418
    note: >
      Pilot top-1 = paperless:14 (OWU PZU Auto); ujawnił duplikat paperless:14 ≡ paperless:74
      (flagowany excluded_reason='duplicate' w kroku 1 fazy 3).

  - id: "2"
    text: "faktura za usługi telekomunikacyjne kwota do zapłaty"
    kind: hit
    expected_envelope: "paperless:192"
    baseline_top1_dist: 0.3447
    note: >
      Pilot top-1 = paperless:192 (faktura P4); poz. 3/5 w pilocie był chunk z OCR-śmieciem
      (kody kreskowe) -- powinien wypaść po excluded_reason='ocr_junk' z kroku 1.

  - id: "3"
    text: "zasady punktacji FLL Challenge robot game (PL)"
    kind: grey_zone
    expected_envelope: "paperless:5"
    baseline_top1_dist: 0.4154
    note: >
      Pilot: szara strefa -- rodzina dokumentów OK, sedno (zasady punktacji) nie trafione
      precyzyjnie. Kandydat na poprawę: czy pre-filtr po streszczeniu podnosi trafność?

  - id: "4"
    text: "FLL robot game mission scoring points table (EN)"
    kind: hit
    expected_envelope: "paperless:5"
    baseline_top1_dist: 0.4114
    note: >
      Cross-lingual (EN zapytanie) trafia lepiej niż PL (zapytanie 3); poz. 2+ w pilocie =
      paperless:119 (scoresheet, mojibake) -- mojibake nie jest śmieciem, niesie sygnał.

  - id: "5"
    text: "innovation project scoring"
    kind: hit
    expected_envelope: "paperless:3"
    baseline_top1_dist: 0.3869
    note: "Najlepszy wynik pilota: top-5 spójnie z jednego właściwego dokumentu (arkusz ocen IP)."

  - id: "N"
    text: "przepis na sernik z rodzynkami"
    kind: negative_control
    expected_envelope: null
    baseline_top1_dist: 0.6210
    note: "Poprawny brak w pilocie; separacja od trafień wyraźna."

  - id: "N2"
    text: "piaskownica plastikowa"
    kind: negative_control_borderline
    expected_envelope: null
    baseline_top1_dist: 0.5533
    no_answer_threshold: 0.50
    note: >
      Poprawnie na granicy "brak" w pilocie -- semantycznie sąsiednie dokumenty wspólnoty
      mieszkaniowej, nie odpowiedź na zapytanie. Faza mailowa, bramka po Etapie A
      (2026-07-23): po dolaniu chunków mailowych top-1 = newsletter szkoły narciarskiej
      (Rossignol, rozmiary nart 155-181cm, dist 0.5298) -- zweryfikowana treść pokazuje, że to
      kolizja semantyczna krótkich, liczbowych tekstów w przestrzeni wektorowej, NIE realny
      mail o piaskownicy -- korpus mailowy takiego trafienia nie zawiera (próbne zapytanie
      "piaskownica plac zabaw wspólnota" dało dist 0.5585, miss; odrzucone jako mail_queries
      wpis, patrz historia sesji). Próg tej kontroli obniżony do 0.50 (z 0.55) właśnie z powodu
      tej znanej kolizji, żeby bramka nie płonęła co uruchomienie na nie-problemie.

# Faza mailowa (docs/kb/modules/05-faza-mailowa-plan.md, §8, Krok 5) -- bramka jakościowa dla
# treści mailowej wprowadzonej w Etapie A (ostatnie 12 miesięcy, plan §7 Krok 4). Wypełniona
# przez operatora 2026-07-23 (5 zapytań "wiem że to mam w mailach z ostatniego roku"; M5
# odrzucone po weryfikacji, patrz N2 powyżej i historia sesji). expected_envelope celowo null
# dla wszystkich -- operator dostarczył treść zapytania, nie surowy Message-ID; kind: mail_hit
# ma inną semantykę hit@3 niż `queries:` powyżej: hit iff top-3 hybrid zawiera wynik z gałęzi
# mailowej (envelope.source w summaryless_sources, dziś gmail) z dist < 0.45
# (retrieval_eval.py::mail_hit_at_3) -- identity-match na expected_envelope nie ma tu
# zastosowania, bo nie ma czego dopasować.
#
# Format wpisu (identyczny co do pól z `queries:` powyżej, minus baseline_top1_dist -- nie było
# pilota mailowego przed tą bramką):
#   - id: "M1"
#     text: "..."
#     kind: mail_hit
#     expected_envelope: "<raw gmail Message-ID lub null>"
#     note: "..."
mail_queries:
  - id: "M1"
    text: "szkolenie narciarskie zegrze termin"
    kind: mail_hit
    expected_envelope: null
    note: "Wątek listy klubowej (lasery-zegrze) — celowo na granicy filtra newsletterowego."
  - id: "M2"
    text: "faktura Play kwota do zapłaty telefon"
    kind: mail_hit
    expected_envelope: null
    note: "Faktury operatora przychodzą mailem co miesiąc."
  - id: "M3"
    text: "wznowienie polisy OC składka samochód"
    kind: mail_hit
    expected_envelope: null
    note: "Korespondencja ubezpieczeniowa — cross-source z dokumentami OWU."
  - id: "M4"
    text: "rejestracja drużyny FLL zgłoszenie sezon"
    kind: mail_hit
    expected_envelope: null
    note: "Wątki organizacyjne FLL 25-26."
