Skip to content

fix: Eval-Seitenzahlen im PageLabel-Namespace + Hash-Guard-Index#181

Merged
TillQuandel merged 2 commits into
masterfrom
fix/80-151-eval-namespace-hashguard
Jul 10, 2026
Merged

fix: Eval-Seitenzahlen im PageLabel-Namespace + Hash-Guard-Index#181
TillQuandel merged 2 commits into
masterfrom
fix/80-151-eval-namespace-hashguard

Conversation

@TillQuandel

Copy link
Copy Markdown
Owner

Closes #80, refs #151 (Punkt 3).

#80 Fund 1 (MED): Stage-8-Eval las den physischen Seitenindex

Seit PR #79 tragen source_anchors Druckseiten-Labels — _pdf_sentences (v2) und der v1-NLI-Pfad indexierten aber weiter physisch. Folge bei Label-PDFs: best_page/Judge-Pool-Header in anderem Namespace als die Note; v1 prüfte die falsche Seite (Buch: Label 159 = physisch 178).

Fix: Gemeinsames Mapping in pdf_chunker (anchor_page_numbers, physical_pages_by_anchor) — wiederverwendet _resolve_page_numbers, keine zweite Label-Logik. build_chunks/_pdf_artifacts (Stage-8-Memo, #171) reichen es durch; v1 übersetzt Anker→physisch vor dem pdf_doc-Zugriff, Folgeseite = physisch+1, nicht Label+1 (Labels springen — mit Lücken-Label-Fixture 159,160,200,201 bewiesen). PDFs ohne Labels: exakt unverändert (Regressionstests).

#80 Fund 2 (LOW): stiller Figuren-Totalverlust sichtbar gemacht

bind_figures_to_drafts: stderr-Hinweis bei Kandidaten + 0 Matches (typisch: versions-gemischtes --load-drafts). Nur wenn ALLE Skips no_match sind — ambiguous-Skips hatten Matches (Codex-Fund).

#151 Punkt 3: Hash-Guard ohne 24-MB-Linearscan pro Note

find_cached_eval baut einmal pro Prozess einen In-Memory-Index (last-wins wie bisher); save_result hält ihn nach. Zähler-Beweis: Datei-Open 3→1. Konsistenz-Annahmen im Docstring (append-only, Stage 8 sequenziell; Locking-Hinweis für die offene Parallelisierung).

Verifikation

  • Kanonische Suite: 5643 passed, 3 skipped (Baseline 5621 + 22 neue Tests)
  • TDD mit RED-Beweisen: v1-Weiße-Box calls == [1, 160][1, 2, 3]; Hash-Guard assert 3 == 1 → grün
  • Tests gegen die echte PageLabels-Fixture (Test-Blindspot: keine Fixture-PDF mit /PageLabels — #79-Wurzelfix laeuft nie gegen echte Labels #154) + generierte Satz-/Lücken-Fixtures (gleiches pypdf-Rezept)
  • ruff format --check + ruff check grün
  • Codex-Review: 0 HIGH/MED, 2 LOW — beide adressiert (+ Kalibrierungs-Neutralität bestätigt: kein Downstream-Konsument dereferenziert best_page physisch)

Nebenbefunde (nicht in diesem PR)

Tilltime added 2 commits July 10, 2026 22:32
 #80, refs #151)

- #80 Fund 1 (MED): eval_quality.py (v1) und eval_quality_v2/_v4.py lasen den
  physischen PDF-Index statt der Druckseiten-Labels aus /PageLabels (seit PR #79
  der Namespace von source_anchors). Neue Helfer pdf_chunker.anchor_page_numbers/
  physical_pages_by_anchor als gemeinsames Mapping; v1 uebersetzt Anker-Seiten vor
  dem pdf_doc-Zugriff zurueck (inkl. Folgeseite physisch+1, nicht Label+1); v2/v4
  reichen die Anker-Seitenzahl durch _pdf_sentences/build_chunks/_pdf_artifacts
  durch. PDFs ohne Labels bleiben bit-identisch (i+1-Fallback unveraendert).

- #80 Fund 2 (LOW): figure_alt.bind_figures_to_drafts loggt jetzt sichtbar, wenn
  Kandidaten existieren aber 0 Anker-Matches gebunden werden (typisch bei
  versions-gemischtem --load-drafts). Kein Verhaltens-Change, nur Sichtbarkeit.

- #151 Punkt 3: eval_quality_v4.find_cached_eval scannte quality_history.jsonl
  linear bei jedem Aufruf (bis 24 MB, bis 10x/Lauf). Prozessweiter Index scannt
  einmal pro Pfad; save_result traegt neue Records direkt nach.
…Annahmen dokumentiert, Lücken-Label-Beweis

- figure_alt: '0 Anker-Matches'-Warnung feuert nicht mehr bei ambiguous-Skips
  (die HATTEN Matches — Namespace-Verdacht wäre irreführend) + Test
- _cached_eval_index: Konsistenz-Annahmen (append-only, save_result-only,
  Stage-8-sequenziell) im Docstring; Locking bei Parallelisierung mitdenken
- neuer Test: springende Labels 159,160,200,201 beweisen physisch+1 statt
  Label+1 (Mapping bildet Lücke exakt ab)
- build_labels: 'Druckseiten-Label bei gelabelten PDFs' klargestellt
@TillQuandel TillQuandel merged commit d2d0c6e into master Jul 10, 2026
4 checks passed
@TillQuandel TillQuandel deleted the fix/80-151-eval-namespace-hashguard branch July 10, 2026 20:52
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.

PageLabel-Namespace propagiert nicht in Stage-8-Eval (+ version-gemischtes --load-drafts)

2 participants