Skip to content

fix: Seitenanker aus PDF-Druckseiten (/PageLabels) + 3 kleine Pipeline-Bugs#79

Open
TillQuandel wants to merge 3 commits into
masterfrom
fix/pagelabel-anchors
Open

fix: Seitenanker aus PDF-Druckseiten (/PageLabels) + 3 kleine Pipeline-Bugs#79
TillQuandel wants to merge 3 commits into
masterfrom
fix/pagelabel-anchors

Conversation

@TillQuandel

Copy link
Copy Markdown
Owner

Zwei Fix-Gruppen aus einem Multi-Agent-Review-Durchgang über die generative Pipeline.

1. Seitenanker aus PDF-Druckseiten (/PageLabels)

pdf_to_pages nummerierte Seiten stumpf ab 1 (Form-Feed-Position) und ignorierte die echten Druckseiten-Labels → Buch-Kapitel zitierten falsche Seiten (S. 1 statt S. 159). Liest jetzt /PageLabels via _pdf_page_labels + _resolve_page_numbers (Whitespace/non-str gehärtet).

Eindeutigkeits-Gate _usable_page_labels: Label-Modus nur bei vollständig numerischen, eindeutigen UND monoton steigenden Labels — sonst einheitlicher i+1-Fallback. Verhindert Namespace-Kollision römisch↔arabisch (False-Bind in figure_alt) und falsche min/max-Chunk-Ranges.

figure_alt.pdf_index_to_anchor_page + eval_figure_feasibility._page_visual_signals an die Druckseiten-Labels angepasst (sonst Seite==Index-Regression).

2. Drei kleine Pipeline-Bugs

  • cross_reference._clean_wikilink: strip('[]') verstümmelte Titel mit Klammern an einem Ende ([2024] Projekt2024] Projekt).
  • extractor: Trunkierungs-Retry-format() fehlte related_mentions_blockKeyError → Note ging verloren statt Fallback.
  • vault_writer.build_quellen_block: Seiten lexikografisch sortiert; jetzt numerisch + range-aware (159–160) + Leerstring-Filter.

Review & Tests

Cross-Model-reviewt: Codex fing den HIGH False-Bind (2 Re-Review-Runden bis Konvergenz), Mistral + Qwen ergänzend. 668 generative-Tests grün.

Verbleibende dokumentierte Bugs aus diesem Durchgang: #74, #75, #76, #77, #78.

Tilltime added 3 commits June 27, 2026 19:45
pdf_to_pages nummerierte Seiten stumpf ab 1 (Form-Feed-Position) und
ignorierte die echten Druckseiten-Labels -> Buch-Kapitel zitierten falsche
Seiten (S. 1 statt S. 159). pdf_to_pages liest jetzt /PageLabels via
_pdf_page_labels + _resolve_page_numbers (Whitespace/non-str gehaertet).

Eindeutigkeits-Gate _usable_page_labels: Label-Modus nur bei vollstaendig
numerischen, eindeutigen UND monoton steigenden Labels -- sonst einheitlicher
i+1-Fallback. Verhindert Namespace-Kollision roemisch<->arabisch (False-Bind
in figure_alt) und falsche min/max-Chunk-Ranges.

figure_alt.pdf_index_to_anchor_page + eval_figure_feasibility._page_visual_signals
an die Druckseiten-Labels angepasst (sonst Seite==Index-Regression).

Cross-Model-reviewt (Codex fing den HIGH False-Bind + 2 Re-Review-Runden),
668 Tests gruen.
- cross_reference._clean_wikilink: strip('[]') verstuemmelte Titel mit
  Klammern an einem Ende ('[2024] Projekt' -> '2024] Projekt'); jetzt nur
  paarweise von aussen strippen, wenn beide Enden Klammern tragen.
- extractor: Trunkierungs-Retry-_PROMPT.format() fehlte related_mentions_block
  -> KeyError -> Note ging verloren statt Fallback aufs Original.
- vault_writer.build_quellen_block: Seiten lexikografisch sortiert
  (S. 159, 160, 9); jetzt numerisch + range-aware ('159-160') + Leerstring-Filter.

668 Tests gruen.
Zwei Lücken im PageLabel-Gate (PR #79), gefunden im Cross-Model-Bug-Hunt
(Qwen + Codex) am echten KSS-Handbuch-Kapitel (Reimer 2013, B 3):

1. Eindeutigkeit wurde auf Strings geprüft (len(set(stripped))), die
   Monotonie ließ aber numerische Duplikate durch: ["01","1","2"] passierte
   das Gate (Strings unique, sorted([1,1,2])==[1,1,2]) → zwei Seiten "S. 1"
   → False-Bind. Jetzt numerische Eindeutigkeit (len(set(nums))).
2. str.isdigit() ist True für Unicode-Superscripts (²), die int() nicht
   parsen kann → ValueError, bisher nur durch das except im Aufrufer
   maskiert. isdecimal() lehnt sie sauber ab (Gate selbst-korrekt).

Beide via TDD, 34 pdf_chunker-Tests + volle generative-Suite (621) grün.
@TillQuandel

Copy link
Copy Markdown
Owner Author

Bug-Hunt-Durchgang 2026-06-27 (echtes Kapitel: KSS-Handbuch B 3 Wissensorganisation, Reimer 2013, S. 172–182 — erstes label-tragendes PDF durch die Pipeline).

Commit a27289a härtet _usable_page_labels gegen zwei im Cross-Model-Review (Qwen + Codex) gefundene Gate-Lücken:

  • Zero-Pad-Duplikat ["01","1","2"] passierte das Gate (String-Eindeutigkeit + sorted([1,1,2])==[1,1,2]) → zwei Seiten S. 1 → False-Bind. Fix: numerische Eindeutigkeit.
  • Unicode-Superscript (²): isdigit() True, int() crasht → bisher nur durch das except im Aufrufer maskiert. Fix: isdecimal().

Beide TDD-getestet; volle generative-Suite (621) grün.

End-to-End-Beleg: Die erzeugten Notes ankern auf Druckseiten 172/178/181 (nicht Form-Feed 1/7/10) — der PageLabel-Pfad greift auf einem echten label-tragenden PDF. Alle 4 Quote-Blöcke wörtlich gegen das Original verifiziert.

Offene Namespace-Reste (separates Issue, diagnostisch, nicht in diesem PR): Stage-8-Eval nummeriert Seiten weiter physisch (PyMuPDF) statt Label.

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.

2 participants