raw derive PDF: Kennzeichnungen auf ein Minimum mit eigenen Regeln (A+) – Struktur zuerst, ~~/**/* nur wo eindeutig, präziser Bildseiten-CHECK
#231
Reference in new issue
Block a user
Folgepaket aus der Prüfung am Original von #225 (2026-10-14, Filter von 10.1.0-beta.1). Ein Issue für das Thema Kennzeichnung (Betreiber, 2026-10-14): Es nimmt #229 (Bildseiten-CHECK) und #230 (Tags an Leerzeichen) auf; beide sind geschlossen und verweisen hierher. Der gezielte Blick eines multimodalen Modells ist als zweiter Schritt ausgegliedert (#234). Gemessen wird mit dem Konverter-Vergleich (#233,
instructions/dev/converter-comparison.md) am privaten Korpus (#232).Stand (2026-10-14, abgeschlossen): umgesetzt in 10.1.0-beta.5 (Commit
a581271; CI Run 713, Converters Run 714,release.ymlRun 715, alle grün). Beim Abschluss fiel auf, dass Durchstreichung und Textmarker Code-Blöcke nicht ausnahmen; behoben in 10.1.0-beta.6 (Commitcb1c9a2; CI Run 716, Converters Run 717,release.ymlRun 718, alle grün). Das Ergebnis steht unter „Ergebnis des Baus“.Messkorpus
Seit #232 im privaten Repo
torben/chemenu-testfilesuntercorpus/pdf/: NIST ×2, IFG, Einstein-Scan, IHF-Regeln 2025, BHV-Durchführungsbestimmungen Teil I–III, Dynamics 365 Licensing Guide und Deck (Sep. 2026), Inway-Factsheet ELO-Connector, AGB 1.0 2026-09, test 2/2003 „Digitaler Bilderservice“, Girokonten-Übersicht, ecoDMS-Handbuch (296 S.), „Concurrency in C# Cookbook“ (205 S.), „Azure for Architects“ (701 S.). Gliederung in allen mit Outline korrekt: 25, 49, 10, 13, 85, 79, 643, 415, 486 Einträge, jede Ziel-Zeile = Seitenmarker.Ausgangslage (Konverter-Vergleich, Grundlinie)
Gemessen mit
instructions/dev/converter-comparison.md(#233), Grundlinieharness/baseline.jsonim privaten Repo (Commit916a718). Sie zeigt den Stand der Filter von 10.1.0-beta.1, gemessen im Checkout von 10.1.0-beta.3. Ein Wiederholungslauf ergab keinen Unterschied. Hier stehen nur Zahlen, keine Textproben (dev-setup.mdSchritt 6). Gegen diese Grundlinie misst das Korpus-Kriterium unten.PDF (17 Dateien)
Wortlaut (Maß 1): Ohne Auszeichnung ist der Text in allen 17 PDFs gleich dem ohne Layoutanalyse.
Mehrlänge (Maß 2, eigene / pymupdf4llm):
AGB, IFG und Einstein lagen bei 0. BHV II und NIST SSDF waren die lautesten Dateien; die Mehrlänge kam fast ganz aus Hinterlegungen (138 bzw. 969
<mark>-Stellen).Durchstreichung, eigene / MuPDF-Orakel:
Die Zählung von MuPDF ist kein Wahrheitswert: Bei BHV II und Bilderservice hat es dieselben Fehltreffer wie die eigene Ableitung (siehe Stand der Technik).
Präzision am Seitenbild (Maß 3, Stichprobe): Bei IHF auf S. 29 und 68 waren die Durchstreichungen echt (2 von 2). Girokonten S. 13: keine Durchstreichung im Original (0 von 2). Bilderservice S. 3: Kastenetikett, nicht gestrichen (0 von 1).
Bild-CHECK (Maß 6): Verglichen mit den Seiten mit inhaltlichem Bild nach Punkt 6 unten, unabhängig über MuPDF umgesetzt.
Für IHF liefert das Orakel genau {1, 2, 6–8, 29, 48–55, 81, 96}. Kein inhaltliches Bild fehlte im CHECK.
Gedrehte Seiten: Girokonten S. 7–13 sind über den Text gedreht, nicht über
/Rotate; Punkt 2 erkennt sie daher am Text.Fehlende Semantik (Maß 4):
**erzeugt; MuPDF zählt Hunderte fette Läufe, auch in Überschriften.*-Stellen (Syntaxfarbe); pymupdf4llm erkennt dort 480 Codeblöcke, die eigene Ableitung keinen.Struktur (Maß 5): Alle Gliederungseinträge treffen ihre Seitenmarke; bei Einstein haben 4 Einträge keine Seite.
Laufzeit (Maß 7): eigene Ableitung 249 s gesamt, pymupdf4llm 441 s. Ausreißer ist das Deck: eigene 53,6 s gegen 19,5 s.
Andere Formate (nicht Thema dieses Pakets, Ausgangslage für spätere):
**-Titeln.Problem (Stand 10.1.0-beta.1, behoben in 10.1.0-beta.5)
*…*-Stellen und 294 blaue Balken, Concurrency: Syntax-Färbung im Code als*…*. Echte Fettungen im Fließtext („Minilabor“ im Bilderservice) gingen dagegen verloren.reis“), BHV II (Randstrich vor „E-Mail“/„Mob.“), Bilderservice („PAPIERFORMATE“, Kastenetikett).<mark>-Grenze einen*…*-Lauf, entstand*warehouse ⚫ *bzw.* *(Guide 172 Zeilen, Deck 23).pypdfschreibt bei manchen PDFs „fontTools is required …“ auf stderr (schon vor #225, erscheint auch beiraw derive). Nicht Teil dieses Pakets und weiter so.Entscheidung (Betreiber, 2026-10-14)
<mark data-farbe>aus #225 entfällt; IHF gelb/grün sind nur noch über die Seiten in der Legende trennbar.Umsetzung (A+)
Gemessene Grundlage A: alle falschen Durchstreichungen weg, alle echten erhalten; Mehrlänge IHF 2,7 %, sonst ≤ 0,3 %. Ergänzt um „Struktur zuerst“ aus der Recherche. Die Schwellen stehen als Konstanten am Kopf von
tools/chemenu/filters/pdf_layout.py; die Startwerte unten haben die Kalibrierung am Korpus (#233) unverändert bestanden.~~…~~überall außer in Code: Linie mit Mitte bei 0,30–0,75 der Zeichenhöhe, Stärke ≤ 1,5 pt, kreuzt ≥ 2 Zeichen, reicht höchstens 0,5 Zeichenhöhen über das erste/letzte gekreuzte Zeichen hinaus. Verworfen: Anschluss an ein Tabellengitter, äußere 5 % der Seite mit < 2 Zeichen, Vorlage. Gedrehte Seiten: Die Richtung wird gegen die Grundlinie des Texts gemessen (umgesetzt; um eine Vierteldrehung gedrehter Text wird nur von einer Linie in seiner eigenen Richtung gestrichen). Abweichung, behoben in 10.1.0-beta.6: In beta.5 nahm die Regel Code-Blöcke nicht aus; am Korpus ohne Folgen, im Test mit Streichlinie im Code sichtbar.**…**: gefüllte Fläche vor dem Text, Höhe ≤ 1,8 × Zeichenhöhe, höchstens 2 Zeichenhöhen breiter als der gedeckte Text, < 8 % der Seitenfläche, keine Vorlage, kräftig-bunt (hellster Kanal ≥0xC0, Spanne ≥0x60). Die Farbpflicht bleibt, weil kein Beleg dafür sprach, sie fallen zu lassen. Abweichung beim Bau: Der Textmarker gilt nicht nur in Fließtext-Zeilen, sondern wie die Durchstreichung überall außer in Code, Tabellengitter und Vorlage; die Form (Höhe, Breite, Fläche, Farbe) grenzt ihn ein. So beschreibt es auchraw/CONTRACT.md. Den Ausschluss von Code erhielt er erst mit 10.1.0-beta.6, wie Punkt 2.**…**, kursiv →*…*nur in Fließtext-Zeilen außerhalb von Code und Tabelle. Fett/kursiv aus dem Schriftnamen (Bold,Black,Heavy,Semibold,Demi;Italic,Oblique). Farbe zählt ab einem Kanalabstand >0x30zur Fließtextfarbe, nicht unter Links, und nur bis 40 % der Zeile.~~;**mit Textmarker-Farben und Seiten;*). Leerraum steht immer außerhalb eines Tags; ein Lauf nur aus Leerraum bekommt keins.raw/CONTRACT.md§ „Getting a document in:raw derive“, der Hilfetext intools/chemenu/commands/raw/derive.py(cli_contract, daraustools/CONTRACT.mdund die Referenz) unddocs/how-to/ingest-a-source.mdbeschreiben die drei Formen und den CHECK in Worten und nennen<mark data-farbe>nicht mehr. DerCHANGES.md-Eintrag des Kandidaten 10.1.0 ist auf die neue Form berichtigt. Beim Abschluss erneut gegen den Code gelesen: Alle drei sagen, was 10.1.0-beta.6 tut.Stand der Technik (Recherche 2026-10-14)
Eigene Recherche, Messung und Perplexity-Analyse des Betreibers, im Ergebnis: Kein fertiges Werkzeug löst das deterministisch; ein öffentlicher Benchmark für Durchstreichung, Textmarker und Hervorhebung fehlt, das eigene Korpus ist der Maßstab. Die Architektur (
pypdfals Text, Geometrie als Seitenkanal) entspricht der empfohlenen. Neu übernommen: „erst Struktur, dann Auszeichnung“, Code-Ausschluss, Vorlagen-Erkennung über Seiten, Vektor-Cluster als Bildinhalt, Präzision vor Trefferquote, Kontext-Mehrlänge als Maß.TEXT_COLLECT_STYLES)~~<mark>14</mark>~~ <mark>16</mark>), Guide-Tabellen sauber, „Minilabor“ fett; Girokonten-Fußnoten zerstückelt (+21 %), Code-Leerzeichen verloren; ~230 MBPyMuPDF darf im Konverter-Vergleich (#233) als Prüforakel dienen, nie als Abhängigkeit einer Instanz.
Ergebnis des Baus (10.1.0-beta.5
a581271, 10.1.0-beta.6cb1c9a2)Konverter-Vergleich
--format pdf --renderam Arbeitsbaum vor der Veröffentlichung von beta.5, gegen die Grundlinie916a718; nur Zahlen. Keine Schwelle gegenüber den Startwerten geändert. Die Messung des Vergleichs bildet**nur als Fett ab, die Hinterlegung zählt dort 0; das ist ein Maß der Harness, kein Fehler der Ableitung. Für beta.6 lief--format pdferneut: Alle Maße sind gleich denen von beta.5, nur die Laufzeiten weichen ab.**-Stellen. Gewollt so belassen, die Legende ist nicht verkürzbar, ohne ihren Inhalt zu verlieren.~~in Einstein sind Zeichen aus der OCR-Textschicht, keine Auszeichnung (eigene Zählung 0).*. Azure: 5 Fett- und 5 Kursiv-Stichproben richtig. Wenige Satzzeichen stehen allein im Fett-/Kursiv-Tag (z. B. Komma nach kursivem Wort): formal richtig, im Lesefluss unschön, bewusst nicht behoben.916a718; sie auf diesen Stand fortzuschreiben ist ein bewusster Schritt des Betreibers (converter-comparison.mdSchritt 6).pytest3072 bestanden, 4 übersprungen (gehärteter Lauf mitenv -i, für beta.5 und beta.6),docs verify,instructions verifygrün.a581271: Run 713 (verify,pwsh), Converters Run 714 (per Push gestartet),release.ymlRun 715 grün. beta.6cb1c9a2: Run 716 (verify,pwsh), Converters Run 717 (per Push gestartet),release.ymlRun 718 grün.Akzeptanzkriterien
<markin einer Ableitung; die Legende hat höchstens drei Zeilen.~~; Streichlinie über einem Wort →~~Wort~~; Linie am Seitenrand vor 1 Zeichen → keine~~; gelber Textmarker im Fließtext →**…**; graue Zelle, breite Kopfzeile, dunkler Balken → nichts; fettes Wort mitten in einer Fließtextzeile →**Wort**; ganz fette Zeile → nichts; kursives Wort →*Wort*; mehrfarbiger Monospace-Block, auch mit Streichlinie und Textmarker → keine Auszeichnung (letzteres seit beta.6).CHANGES.md-Eintrags;grep -rn 'data-farbe'außerhalb von Tests findet nichts mehr.pytest,docs verify,instructions verifygrün (lokal, beta.5 und beta.6); CI und Konverter-Workflow (#232) auf beiden veröffentlichten Commits grün (Runs 713–715 und 716–718).tools/chemenu/filters/**, nicht perworkflow_dispatch(Runs 714 und 717, Ereignispush). Übernommen aus #232: Dieses Paket ist die erste Änderung unterfilters/seit dem Workflow und belegt damit diesen Eintrag derpaths:-Liste.Versionsteil
Fällt in den laufenden Kandidaten 10.1.0 (noch Beta;
<mark data-farbe>war in keinem Release). Drop-in: Nichts im Stack parst den Text vonderived.md, bestehende Ableitungen bleiben gültig. Bump: der Kandidatenzähler, 10.1.0-beta.5 für die Umsetzung, 10.1.0-beta.6 für den Code-Ausschluss beim Abschluss.Kette
Kette „Konverter-Qualität“
`raw derive` PDF: Kennzeichnungen in tabellenlastigen PDFs – fast gleiche Farben, Zellschattierungen und Text +24 %to `raw derive` PDF: Kennzeichnungen auf ein Minimum – Durchstreichung, Textmarker und Hervorhebung im Fließtext als `~~`/`**`/`*`, keine Tabellen- und GestaltungsflächenChangelog: Betreiber hat die Richtung entschieden: Kennzeichnung auf ein Minimum, fett/kursiv statt
<mark data-farbe>, vor allem im Fließtext. Die drei Einzelfragen sind durch einen gemessenen Gesamtvorschlag ersetzt: eng anliegende Form, Textmarker nur bei kräftiger bunter Farbe, Hervorhebung nur innerhalb von Fließtextzeilen, Legende höchstens drei Zeilen. Messung um vier PDFs erweitert (Bilderservice, Girokonten, AGB, BHV II): falsche Durchstreichungen auf gedrehten Tabellenseiten und an Randstrichen gefunden, beide durch die Regel erledigt. #230 ist hier als Kriterium aufgenommen. Bleibtkind/decision, bis der Vorschlag bestätigt ist.`raw derive` PDF: Kennzeichnungen auf ein Minimum – Durchstreichung, Textmarker und Hervorhebung im Fließtext als `~~`/`**`/`*`, keine Tabellen- und Gestaltungsflächento `raw derive` PDF: Kennzeichnungen auf ein Minimum, Bildseiten-CHECK, gezielter Blick auf Problemseiten – eigene Regeln oder vorhandenes WerkzeugChangelog: Zum Sammel-Issue des Themas gemacht (Betreiber: ein Issue). #229 (Bildseiten) und #230 (Leerraum) aufgenommen und geschlossen. Messkorpus auf
testfiles/pdf/umgestellt, drei neue PDFs gemessen (ecoDMS, Concurrency, Azure): Gliederung korrekt, neue Lärmquelle Syntax-Färbung im Code. Recherche zum Stand der Technik ergänzt und PyMuPDF/pymupdf4llm auf dem Korpus gemessen. Zu entscheiden jetzt: Weg A/B/C und der gezielte Blick.size/M→size/L.Changelog: Perplexity-Recherche des Betreibers eingearbeitet und mit den eigenen Messungen abgeglichen. Neu sind: „Struktur zuerst, dann Auszeichnung“ (Tabellen, Code, Vorlagen als Ausschlussmasken), Startschwellen für Strich, Textmarker, Hervorhebung und Bilder, Code-Erkennung, Vektor-Cluster als Bildinhalt, Punktwert und Platzhalter für den gezielten Blick, Präzision vor Trefferquote. Zwei Abweichungen festgehalten (PyMuPDF nicht „leicht“, pymupdf4llm-Strich funktioniert). Vorschlag A → A+, Empfehlung: keine neue Laufzeit-Abhängigkeit, PyMuPDF höchstens als Prüforakel im Konverter-Workflow (#232). Weiter
kind/decision.`raw derive` PDF: Kennzeichnungen auf ein Minimum, Bildseiten-CHECK, gezielter Blick auf Problemseiten – eigene Regeln oder vorhandenes Werkzeugto `raw derive` PDF: Kennzeichnungen auf ein Minimum mit eigenen Regeln (A+) – Struktur zuerst, `~~`/`**`/`*` nur wo eindeutig, präziser Bildseiten-CHECKChangelog: Betreiber hat entschieden: Weg A+ (eigene Regeln, keine neue Laufzeit-Abhängigkeit). Der gezielte Blick ist als zweiter Schritt nach #234 ausgegliedert. Body auf Bauform gebracht: Umsetzung mit Startschwellen in acht Punkten, Stand der Technik verdichtet, Kriterien geschärft (u. a. Randstrich, Code-Block, Vektor-Diagramm). Korpus-Nachweis über den Vergleich #233.
kind/decision→kind/build,status/blockedauf #233. Drittes Glied der Kette „Konverter-Qualität“ (#232 → #233 → #231 → #234).Changelog: Punkt 8 ergänzt:
CHANGES.md-Eintrag des Kandidaten 10.1.0 berichtigen; den Hilfetext inderive.pysamt generiertemtools/CONTRACT.mdausdrücklich genannt. Neues Kriterium: keindata-farbemehr außerhalb von Tests. Im Versionsteil der Fall ergänzt, dass 10.1.0 vorher freigegeben wird.Changelog: Neuer Abschnitt „Ausgangslage“ aus dem ersten Lauf des Konverter-Vergleichs (#233), Grundlinie
916a718im privaten Repo, nur Zahlen. Neu gefunden: BHV II (57 %) und NIST SSDF (48 %) sind die lautesten Dateien, beides fast nur Hinterlegungen. Die gedrehten Girokonten-Seiten sind über den Text gedreht, nicht über/Rotate. Bild-CHECK-Präzision je Datei (IHF 0,17; AGB 0). Einstein-Scans fallen unter die 80-%-Regel, als nicht blockierender Prüfpunkt mit beiden Folgen notiert. Sonst unverändert;status/blockedbleibt, bis #233 geschlossen ist.Changelog: #233 ist geschlossen; es war der einzige offene Blocker. Deshalb ist
status/blockedentfernt und der Abschnitt „Blockiert durch“ aus dem Body gestrichen. Der Vergleich (instructions/dev/converter-comparison.md) und seine Grundlinie stehen bereit; das Korpus-Kriterium misst gegenharness/baseline.json(916a718). Baubereit:kind/build, keinstatus/incomingoderstatus/unconfirmed.Build-Sitzung: A+ umgesetzt und als 10.1.0-beta.5 veröffentlicht (Commit
a581271).pdf_layout.pyneu: Struktur zuerst (Fließtext, Code, Tabellengitter, Vorlagen),~~/**/*nur wo eindeutig, Legende ≤ 3 Zeilen, Leerraum nie am Tag-Rand, Bildseiten-CHECK nur für Inhaltsbilder und Vektorcluster. Doku undCHANGES.mdnachgezogen. Schwellen unverändert. Abweichung: Bilderservice (1,28 %) und Factsheet (1,06 %) liegen wegen der festen Legende knapp über 1 % Mehrlänge. CI 713, Converters 714 undrelease.yml715 grün. Zahlen im Body unter „Ergebnis des Baus“.Abschluss: Beim Abgleich von Body und Code nahmen Durchstreichung und Textmarker Code-Blöcke nicht aus. Behoben in 10.1.0-beta.6 (
cb1c9a2), der Code-Block-Test hat jetzt Streichlinie und Textmarker. Am Korpus sind alle Maße gleich geblieben. CI 716, Converters 717 undrelease.yml718 grün. Die Abweichung beim Textmarker (gilt wie die Durchstreichung auch außerhalb von Fließtext) ist im Body unter Punkt 3 vermerkt. Doku gegen den Code gelesen: stimmt. Die Grundlinie im privaten Repo ist nicht fortgeschrieben; das bleibt dem Betreiber überlassen.