raw derive PDF: Kennzeichnungen auf ein Minimum mit eigenen Regeln (A+) – Struktur zuerst, ~~/**/* nur wo eindeutig, präziser Bildseiten-CHECK #231

Closed
opened 2026-10-14 06:15:50 +00:00 by torben · 9 comments
Owner

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.yml Run 715, alle grün). Beim Abschluss fiel auf, dass Durchstreichung und Textmarker Code-Blöcke nicht ausnahmen; behoben in 10.1.0-beta.6 (Commit cb1c9a2; CI Run 716, Converters Run 717, release.yml Run 718, alle grün). Das Ergebnis steht unter „Ergebnis des Baus“.

Messkorpus

Seit #232 im privaten Repo torben/chemenu-testfiles unter corpus/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), Grundlinie harness/baseline.json im privaten Repo (Commit 916a718). 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.md Schritt 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):

    Datei eigene pymupdf4llm
    BHV II 57,2 % 4,2 %
    NIST SSDF 47,6 % 2,4 %
    Guide 24,4 % 3,1 %
    IHF 10,5 % 5,2 %
    Girokonten 8,8 % 5,3 %
    Bilderservice 5,7 % 1,6 %
    Deck 4,9 % 3,9 %
    BHV III 3,7 % 1,3 %
    Concurrency 3,6 % 1,0 %
    ecoDMS 3,4 % 1,6 %
    Factsheet 2,4 % 0,8 %
    NIST RMF 2,4 % 2,3 %
    BHV I 1,4 % 0,5 %
    Azure 0,5 % 1,6 %

    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:

    Datei eigene MuPDF
    IHF 152 157
    Girokonten 190 0
    BHV I 1 1
    BHV II 2 5
    BHV III 2 2
    Guide 2 4
    Bilderservice 1 1
    Deck 0 1
    Azure 0 1
    Einstein 0 2

    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.

    Datei Präzision Seiten
    AGB 0 18 genannt, keine inhaltlich
    Einstein 0 20; ganzseitige Scans fallen unter die 80-%-Regel
    BHV I 0,07 14 genannt, 1 inhaltlich
    IHF 0,17 96 genannt, 16 inhaltlich
    Guide 0,54
    Girokonten 0,57
    NIST SSDF 0,60
    Concurrency 0,77
    Deck, Azure, ecoDMS ≥ 0,98
    die übrigen 1,0

    Für IHF liefert das Orakel genau {1, 2, 6–8, 29, 48–55, 81, 96}. Kein inhaltliches Bild fehlte im CHECK.

    • Einstein (entschieden beim Bau): Punkt 6 bleibt unverändert. Ganzseitige Scans fallen aus dem CHECK, die Scan-Warnung meldet das Dokument bereits als Scan; Einstein zählt nicht gegen das Kriterium.
  • 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):

    • Fett war in jeder Datei 0, weil 10.1.0-beta.1 kein ** erzeugt; MuPDF zählt Hunderte fette Läufe, auch in Überschriften.
    • Concurrency: 5.824 *-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):

  • DOCX: Die eigene Ableitung trägt keine Inline-Formatierung. word-complex hat in der XML 19 fette, 27 kursive und 1 durchgestrichenen Lauf; markitdown und pandoc übernehmen sie. Wort-Übereinstimmung 0,95–1,0. Änderungsverfolgung und Kommentare lassen sich nicht messen: Keine Korpusdatei hat welche.
  • PPTX: Die Notizen sind vollständig (die eigene Ableitung findet mindestens so viele wie python-pptx). markitdown findet weniger Text (Recall 0,63–0,93). pptx-master: 5,9 % Mehrlänge aus 8 **-Titeln.
  • XLSX: Die Formeln sind vollständig (mindestens so viele wie openpyxl); markitdown liefert nur Werte. Kein Korpus-Workbook hat ausgeblendete Blätter.
  • MSG/EML: markitdown taugt für MSG kaum als Referenz (Präzision ≈ 0,02); für EML gibt es keine.

Problem (Stand 10.1.0-beta.1, behoben in 10.1.0-beta.5)

  1. Kennzeichnung zu laut. #225 kennzeichnete jede sichtbare Form; die meisten PDFs nutzen Farbe als Gestaltung. Guide +24 % Text (Tabellenzellen, Kopfbalken, Grautöne knapp neben dem Fließtext), Deck +4 % (Folienflächen), ecoDMS 1.571 *…*-Stellen und 294 blaue Balken, Concurrency: Syntax-Färbung im Code als *…*. Echte Fettungen im Fließtext („Minilabor“ im Bilderservice) gingen dagegen verloren.
  2. Falsche Durchstreichungen. Girokonten 190 (Gitterlinien der gedrehten Tabellenseiten 7–13 durch einzelne Buchstaben: „Preis“), BHV II (Randstrich vor „E-Mail“/„Mob.“), Bilderservice („PAPIERFORMATE“, Kastenetikett).
  3. Tags an Leerzeichen (vormals #230): Teilte eine <mark>-Grenze einen *…*-Lauf, entstand *warehouse ⚫ * bzw. * * (Guide 172 Zeilen, Deck 23).
  4. Bildseiten-CHECK nannte fast alles (vormals #229): IHF S. 1–96 (ganzseitiges Hintergrundbild, 2×2-px-Füllbild auf 77 Seiten, wiederkehrendes Symbol auf 25), Deck 1–57, Factsheet 1–8, AGB 1–18. Ohne Hintergründe, Füllflächen und wiederkehrende Bilder blieben bei IHF S. 1, 2, 6–8, 29, 48–55, 81, 96 – die Handzeichen-Tafeln und Abbildungen.
  5. Nebenbei: pypdf schreibt bei manchen PDFs „fontTools is required …“ auf stderr (schon vor #225, erscheint auch bei raw derive). Nicht Teil dieses Pakets und weiter so.

Entscheidung (Betreiber, 2026-10-14)

  • Kennzeichnung auf ein Minimum, abgebildet auf gewöhnliches Markdown (fett/kursiv), vor allem im Fließtext. Farben sind meist Gestaltung, farbige Hinterlegungen erst recht. Die Regelwerke sind die Ausnahme; dort zählt vor allem die Durchstreichung. <mark data-farbe> aus #225 entfällt; IHF gelb/grün sind nur noch über die Seiten in der Legende trennbar.
  • Weg: eigene Regeln (A+), keine neue Laufzeit-Abhängigkeit. Abgelehnt für jetzt: B (PyMuPDF als zweite Quelle für Stilsignale) und C (pymupdf4llm ersetzt die Ableitung; ~230 MB, schwächer bei gedrehten Tabellen und Code).
  • Gezielter Blick eines multimodalen Modells: zweiter Schritt (#234).

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.

  1. Struktur zuerst. Pro Seite vor jeder Auszeichnung bestimmen:
    • Fließtext-Zeilen: Schriftgröße 0,85–1,20 × Körpergröße (häufigste Größe nach Zeichen), Zeile ≥ 15 Zeichen, davon ≥ 60 % schlichter Fließtext;
    • Code-Blöcke: ≥ 3 von Monospace-Schrift, ≥ 5 Textfarben, Operatordichte > 15 %, Einrückung, Code-Hintergrund;
    • Vorlagen: dieselbe Form oder Linie an derselben Stelle auf ≥ 20 % der Seiten (mindestens 3);
    • einfache Tabellenregionen: Gitter aus waagerechten und senkrechten Linien mit Kreuzungen, Toleranz 3 pt (pdfminer liefert die Linien schon).
  2. Durchstreichung → ~~…~~ ü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.
  3. Textmarker → **…**: 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 auch raw/CONTRACT.md. Den Ausschluss von Code erhielt er erst mit 10.1.0-beta.6, wie Punkt 2.
  4. Fett oder deutlich andere Farbe → **…**, 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 > 0x30 zur Fließtextfarbe, nicht unter Links, und nur bis 40 % der Zeile.
  5. Legende ≤ 3 Zeilen, eine je Form (~~; ** mit Textmarker-Farben und Seiten; *). Leerraum steht immer außerhalb eines Tags; ein Lauf nur aus Leerraum bekommt keins.
  6. Bildseiten-CHECK je Bildvorkommen. Nicht gezählt: gezeichnete Fläche > 80 % der Seite, Quellgröße ≤ 4 px oder gezeichnet < 10 pt, derselbe Bildinhalt auf ≥ 20 % der Seiten (mindestens 3). Gezählt zusätzlich: Vektorgrafik-Cluster (≥ 20 Pfade, wenig Text, ≥ 2 % der Seite).
  7. Wortlaut: Ohne Kennzeichnungen derselbe Text wie ohne Layoutanalyse (unverändert aus #225).
  8. Doku: raw/CONTRACT.md § „Getting a document in: raw derive“, der Hilfetext in tools/chemenu/commands/raw/derive.py (cli_contract, daraus tools/CONTRACT.md und die Referenz) und docs/how-to/ingest-a-source.md beschreiben die drei Formen und den CHECK in Worten und nennen <mark data-farbe> nicht mehr. Der CHANGES.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 (pypdf als 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ß.

Werkzeug Auf unserem Korpus
MuPDF-Stil-Flags (TEXT_COLLECT_STYLES) echte Durchstreichungen wie A (IHF 157, BHV I, BHV III), aber dieselben Fehltreffer, die A ausfiltert (BHV II, „PAPIERFORMATE“, Einzelbuchstaben Guide); Girokonten korrekt 0
pymupdf4llm 1.28.2 IHF richtig (~~<mark>14</mark>~~ <mark>16</mark>), Guide-Tabellen sauber, „Minilabor“ fett; Girokonten-Fußnoten zerstückelt (+21 %), Code-Leerzeichen verloren; ~230 MB
pdf-strikethrough-detect nicht gemessen; ≥ 50 % Abdeckung je Zeichen, 99,8 % Übereinstimmung mit MuPDF auf 55.200 Wörtern

PyMuPDF 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.6 cb1c9a2)

Konverter-Vergleich --format pdf --render am Arbeitsbaum vor der Veröffentlichung von beta.5, gegen die Grundlinie 916a718; 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 pdf erneut: Alle Maße sind gleich denen von beta.5, nur die Laufzeiten weichen ab.

  • Wortlaut: in allen 17 PDFs gleich dem ohne Layoutanalyse (0 abweichende Zeilen).
  • Mehrlänge (alt → neu): IHF 10,5 → 1,9 %; BHV II 57,2 → 0; NIST SSDF 47,6 → 0,33; Guide 24,4 → 0,19; Girokonten 8,8 → 0,20; Deck 4,9 → 0; Bilderservice 5,7 → 1,28; BHV III 3,7 → 0,48; Concurrency 3,6 → 0,18; ecoDMS 3,4 → 0,50; Factsheet 2,4 → 1,06; NIST RMF 2,4 → 0,32; BHV I 1,4 → 0,22; Azure 0,5 → 0,86; IFG 0 → 0,91; Einstein 0 → 0,75. Abweichung vom Kriterium: Bilderservice (1,28 %) und Factsheet (1,06 %) liegen über 1 %, weil die Legende als fester Block (zwei Zeilen) bei kleinen Dateien (≈ 20.000 bzw. ≈ 11.000 Zeichen) den Großteil der Mehrlänge stellt; der Text selbst trägt 34 bzw. 4 **-Stellen. Gewollt so belassen, die Legende ist nicht verkürzbar, ohne ihren Inhalt zu verlieren.
  • Durchstreichung: Girokonten 190 → 0, BHV II 2 → 0, Bilderservice 1 → 0; BHV I „vier“ und BHV III S. 5 (2 Zeilen) erhalten; IHF 152 → 127 (MuPDF 157). Die ~~ in Einstein sind Zeichen aus der OCR-Textschicht, keine Auszeichnung (eigene Zählung 0).
  • Fett: Azure 1.862, ecoDMS 578, IHF 574, Guide 65, NIST RMF 37, BHV I 3, Bilderservice 16; Concurrency 0 (Code). Kursiv: Concurrency 169 (alt 5.824), Azure 209 (alt 1.162), NIST RMF 93, IHF 221.
  • Präzision am Seitenbild (Stichprobe, nur Zahlen): IHF S. 29 und 61: Durchstreichung und Hinterlegung wie im Original (alle Stichproben richtig); IHF-Fett markiert die ganze hervorgehobene Zeile; Bilderservice S. 2: Fett am Zwischentitel und Fachbegriff richtig, die kursive Bildunterschrift ist im Original fett-kursiv und erhält nur *. 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.
  • Code-Blöcke (Concurrency): keine Auszeichnung im Code; Kursiv nur im Fließtext. Seit beta.6 auch durch die Regeln für Durchstreichung und Textmarker gesichert, nicht nur dadurch, dass das Korpus dort keine Linien und Marker hat.
  • Bild-CHECK: AGB 18 → 0 Seiten; BHV I 14 → 1; IHF 96 → 16, genau {1, 2, 6–8, 29, 48–55, 81, 96}; Einstein 20 → 0 (Scan, wie bei Punkt 6 entschieden); Präzision 1,0 in 16 Dateien. Azure: Präzision 0,9969 → 0,9694 durch 9 Seiten ohne Bildobjekt, die ein Vektordiagramm tragen (am Seitenbild geprüft: Architekturdiagramm, also richtig; das Maß kennt nur Bildobjekte).
  • Fehlende Semantik gegen Referenz: Streichungen bei BHV II (5), Guide (4), Deck, Bilderservice (je 1) bleiben fehlend, in Übereinstimmung mit „Präzision vor Trefferquote“; Fett im Deck (730) und in der Concurrency (2.542, Code) bleibt unmarkiert, weil außerhalb von Fließtext.
  • Laufzeit: Vergleichslauf PDF gesamt 14,5 min (mit Seitenbildern).
  • Grundlinie: im privaten Repo weiter 916a718; sie auf diesen Stand fortzuschreiben ist ein bewusster Schritt des Betreibers (converter-comparison.md Schritt 6).
  • Lokal: pytest 3072 bestanden, 4 übersprungen (gehärteter Lauf mit env -i, für beta.5 und beta.6), docs verify, instructions verify grün.
  • CI: beta.5 a581271: Run 713 (verify, pwsh), Converters Run 714 (per Push gestartet), release.yml Run 715 grün. beta.6 cb1c9a2: Run 716 (verify, pwsh), Converters Run 717 (per Push gestartet), release.yml Run 718 grün.

Akzeptanzkriterien

  • Kein <mark in einer Ableitung; die Legende hat höchstens drei Zeilen.
  • Erzeugte Test-PDFs: Gitterlinie durch ein Zeichen oder weit über den Text → keine ~~; 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).
  • Kein Tag beginnt oder endet mit Leerraum (Test über alle erzeugten PDFs).
  • Ohne Kennzeichnungen derselbe Text wie ohne Layoutanalyse.
  • Bildseiten-CHECK: ganzseitiger Hintergrund auf jeder Seite + Bild auf einer Seite → genau diese Seite; 2×2-px-Bild → keine; gleiches Bild auf ≥ 20 % der Seiten → keine; Vektor-Diagramm ohne Bildobjekt → Seite genannt.
  • Korpus, gemessen mit dem Vergleich (#233) gegen dessen Grundlinie: IHF-Mehrlänge < 5 % (1,9 %), BHV-Streichungen wie gemessen (BHV I „vier“, BHV III S. 5); keine Durchstreichung in Girokonten, BHV II, Bilderservice; keine Auszeichnung in Code-Blöcken (Concurrency); IHF-Bildseiten ⊆ {1, 2, 6–8, 29, 48–55, 81, 96}. Ausnahme: „alle anderen < 1 %“ gilt für 14 von 16 Dateien; Bilderservice (1,28 %) und Factsheet (1,06 %) liegen wegen der festen Legende darüber (siehe Ergebnis).
  • Doku nach Punkt 8 nachgezogen, einschließlich des berichtigten CHANGES.md-Eintrags; grep -rn 'data-farbe' außerhalb von Tests findet nichts mehr.
  • pytest, docs verify, instructions verify grü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).
  • Der Konverter-Workflow ist auf dem veröffentlichten Commit von selbst gestartet, über den Pfad tools/chemenu/filters/**, nicht per workflow_dispatch (Runs 714 und 717, Ereignis push). Übernommen aus #232: Dieses Paket ist die erste Änderung unter filters/ seit dem Workflow und belegt damit diesen Eintrag der paths:-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 von derived.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“

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.yml` Run 715, alle grün). Beim Abschluss fiel auf, dass Durchstreichung und Textmarker Code-Blöcke nicht ausnahmen; behoben in 10.1.0-beta.6 (Commit `cb1c9a2`; CI Run 716, Converters Run 717, `release.yml` Run 718, alle grün). Das Ergebnis steht unter „Ergebnis des Baus“. ## Messkorpus Seit #232 im privaten Repo `torben/chemenu-testfiles` unter `corpus/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), Grundlinie `harness/baseline.json` im privaten Repo (Commit `916a718`). 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.md` Schritt 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):** | Datei | eigene | pymupdf4llm | |---|---|---| | BHV II | 57,2 % | 4,2 % | | NIST SSDF | 47,6 % | 2,4 % | | Guide | 24,4 % | 3,1 % | | IHF | 10,5 % | 5,2 % | | Girokonten | 8,8 % | 5,3 % | | Bilderservice | 5,7 % | 1,6 % | | Deck | 4,9 % | 3,9 % | | BHV III | 3,7 % | 1,3 % | | Concurrency | 3,6 % | 1,0 % | | ecoDMS | 3,4 % | 1,6 % | | Factsheet | 2,4 % | 0,8 % | | NIST RMF | 2,4 % | 2,3 % | | BHV I | 1,4 % | 0,5 % | | Azure | 0,5 % | 1,6 % | 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:** | Datei | eigene | MuPDF | |---|---|---| | IHF | 152 | 157 | | Girokonten | 190 | 0 | | BHV I | 1 | 1 | | BHV II | 2 | 5 | | BHV III | 2 | 2 | | Guide | 2 | 4 | | Bilderservice | 1 | 1 | | Deck | 0 | 1 | | Azure | 0 | 1 | | Einstein | 0 | 2 | 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. | Datei | Präzision | Seiten | |---|---|---| | AGB | 0 | 18 genannt, keine inhaltlich | | Einstein | 0 | 20; ganzseitige Scans fallen unter die 80-%-Regel | | BHV I | 0,07 | 14 genannt, 1 inhaltlich | | IHF | 0,17 | 96 genannt, 16 inhaltlich | | Guide | 0,54 | | | Girokonten | 0,57 | | | NIST SSDF | 0,60 | | | Concurrency | 0,77 | | | Deck, Azure, ecoDMS | ≥ 0,98 | | | die übrigen | 1,0 | | Für IHF liefert das Orakel genau {1, 2, 6–8, 29, 48–55, 81, 96}. Kein inhaltliches Bild fehlte im CHECK. - **Einstein (entschieden beim Bau):** Punkt 6 bleibt unverändert. Ganzseitige Scans fallen aus dem CHECK, die Scan-Warnung meldet das Dokument bereits als Scan; Einstein zählt nicht gegen das Kriterium. - **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):** - Fett war in jeder Datei 0, weil 10.1.0-beta.1 kein `**` erzeugt; MuPDF zählt Hunderte fette Läufe, auch in Überschriften. - Concurrency: 5.824 `*`-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): - **DOCX:** Die eigene Ableitung trägt keine Inline-Formatierung. word-complex hat in der XML 19 fette, 27 kursive und 1 durchgestrichenen Lauf; markitdown und pandoc übernehmen sie. Wort-Übereinstimmung 0,95–1,0. Änderungsverfolgung und Kommentare lassen sich nicht messen: Keine Korpusdatei hat welche. - **PPTX:** Die Notizen sind vollständig (die eigene Ableitung findet mindestens so viele wie python-pptx). markitdown findet weniger Text (Recall 0,63–0,93). pptx-master: 5,9 % Mehrlänge aus 8 `**`-Titeln. - **XLSX:** Die Formeln sind vollständig (mindestens so viele wie openpyxl); markitdown liefert nur Werte. Kein Korpus-Workbook hat ausgeblendete Blätter. - **MSG/EML:** markitdown taugt für MSG kaum als Referenz (Präzision ≈ 0,02); für EML gibt es keine. ## Problem (Stand 10.1.0-beta.1, behoben in 10.1.0-beta.5) 1. **Kennzeichnung zu laut.** #225 kennzeichnete jede sichtbare Form; die meisten PDFs nutzen Farbe als Gestaltung. Guide +24 % Text (Tabellenzellen, Kopfbalken, Grautöne knapp neben dem Fließtext), Deck +4 % (Folienflächen), ecoDMS 1.571 `*…*`-Stellen und 294 blaue Balken, Concurrency: Syntax-Färbung im Code als `*…*`. Echte Fettungen im Fließtext („Minilabor“ im Bilderservice) gingen dagegen verloren. 2. **Falsche Durchstreichungen.** Girokonten 190 (Gitterlinien der gedrehten Tabellenseiten 7–13 durch einzelne Buchstaben: „P~~r~~eis“), BHV II (Randstrich vor „E-Mail“/„Mob.“), Bilderservice („~~PAPIERFORMATE~~“, Kastenetikett). 3. **Tags an Leerzeichen** (vormals #230): Teilte eine `<mark>`-Grenze einen `*…*`-Lauf, entstand `*warehouse ⚫ *` bzw. `* *` (Guide 172 Zeilen, Deck 23). 4. **Bildseiten-CHECK nannte fast alles** (vormals #229): IHF S. 1–96 (ganzseitiges Hintergrundbild, 2×2-px-Füllbild auf 77 Seiten, wiederkehrendes Symbol auf 25), Deck 1–57, Factsheet 1–8, AGB 1–18. Ohne Hintergründe, Füllflächen und wiederkehrende Bilder blieben bei IHF S. 1, 2, 6–8, 29, 48–55, 81, 96 – die Handzeichen-Tafeln und Abbildungen. 5. Nebenbei: `pypdf` schreibt bei manchen PDFs „fontTools is required …“ auf stderr (schon vor #225, erscheint auch bei `raw derive`). Nicht Teil dieses Pakets und weiter so. ## Entscheidung (Betreiber, 2026-10-14) - Kennzeichnung auf ein Minimum, abgebildet auf gewöhnliches Markdown (fett/kursiv), vor allem im Fließtext. Farben sind meist Gestaltung, farbige Hinterlegungen erst recht. Die Regelwerke sind die Ausnahme; dort zählt vor allem die Durchstreichung. `<mark data-farbe>` aus #225 entfällt; IHF gelb/grün sind nur noch über die Seiten in der Legende trennbar. - **Weg: eigene Regeln (A+)**, keine neue Laufzeit-Abhängigkeit. Abgelehnt für jetzt: B (PyMuPDF als zweite Quelle für Stilsignale) und C (pymupdf4llm ersetzt die Ableitung; ~230 MB, schwächer bei gedrehten Tabellen und Code). - Gezielter Blick eines multimodalen Modells: zweiter Schritt (#234). ## 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. 1. **Struktur zuerst.** Pro Seite vor jeder Auszeichnung bestimmen: - Fließtext-Zeilen: Schriftgröße 0,85–1,20 × Körpergröße (häufigste Größe nach Zeichen), Zeile ≥ 15 Zeichen, davon ≥ 60 % schlichter Fließtext; - Code-Blöcke: ≥ 3 von Monospace-Schrift, ≥ 5 Textfarben, Operatordichte > 15 %, Einrückung, Code-Hintergrund; - Vorlagen: dieselbe Form oder Linie an derselben Stelle auf ≥ 20 % der Seiten (mindestens 3); - einfache Tabellenregionen: Gitter aus waagerechten und senkrechten Linien mit Kreuzungen, Toleranz 3 pt (pdfminer liefert die Linien schon). 2. **Durchstreichung → `~~…~~`** ü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. 3. **Textmarker → `**…**`:** 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 auch `raw/CONTRACT.md`. Den Ausschluss von Code erhielt er erst mit 10.1.0-beta.6, wie Punkt 2. 4. **Fett oder deutlich andere Farbe → `**…**`, 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 > `0x30` zur Fließtextfarbe, nicht unter Links, und nur bis 40 % der Zeile. 5. **Legende ≤ 3 Zeilen**, eine je Form (`~~`; `**` mit Textmarker-Farben und Seiten; `*`). **Leerraum steht immer außerhalb eines Tags**; ein Lauf nur aus Leerraum bekommt keins. 6. **Bildseiten-CHECK** je Bildvorkommen. Nicht gezählt: gezeichnete Fläche > 80 % der Seite, Quellgröße ≤ 4 px oder gezeichnet < 10 pt, derselbe Bildinhalt auf ≥ 20 % der Seiten (mindestens 3). Gezählt zusätzlich: Vektorgrafik-Cluster (≥ 20 Pfade, wenig Text, ≥ 2 % der Seite). 7. **Wortlaut:** Ohne Kennzeichnungen derselbe Text wie ohne Layoutanalyse (unverändert aus #225). 8. **Doku:** `raw/CONTRACT.md` § „Getting a document in: `raw derive`“, der Hilfetext in `tools/chemenu/commands/raw/derive.py` (`cli_contract`, daraus `tools/CONTRACT.md` und die Referenz) und `docs/how-to/ingest-a-source.md` beschreiben die drei Formen und den CHECK in Worten und nennen `<mark data-farbe>` nicht mehr. Der `CHANGES.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 (`pypdf` als 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ß. | Werkzeug | Auf unserem Korpus | |---|---| | MuPDF-Stil-Flags (`TEXT_COLLECT_STYLES`) | echte Durchstreichungen wie A (IHF 157, BHV I, BHV III), aber dieselben Fehltreffer, die A ausfiltert (BHV II, „PAPIERFORMATE“, Einzelbuchstaben Guide); Girokonten korrekt 0 | | pymupdf4llm 1.28.2 | IHF richtig (`~~<mark>14</mark>~~ <mark>16</mark>`), Guide-Tabellen sauber, „Minilabor“ fett; Girokonten-Fußnoten zerstückelt (+21 %), Code-Leerzeichen verloren; ~230 MB | | pdf-strikethrough-detect | nicht gemessen; ≥ 50 % Abdeckung je Zeichen, 99,8 % Übereinstimmung mit MuPDF auf 55.200 Wörtern | PyMuPDF 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.6 `cb1c9a2`) Konverter-Vergleich `--format pdf --render` am Arbeitsbaum vor der Veröffentlichung von beta.5, gegen die Grundlinie `916a718`; 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 pdf` erneut: Alle Maße sind gleich denen von beta.5, nur die Laufzeiten weichen ab. - **Wortlaut:** in allen 17 PDFs gleich dem ohne Layoutanalyse (0 abweichende Zeilen). - **Mehrlänge (alt → neu):** IHF 10,5 → 1,9 %; BHV II 57,2 → 0; NIST SSDF 47,6 → 0,33; Guide 24,4 → 0,19; Girokonten 8,8 → 0,20; Deck 4,9 → 0; Bilderservice 5,7 → 1,28; BHV III 3,7 → 0,48; Concurrency 3,6 → 0,18; ecoDMS 3,4 → 0,50; Factsheet 2,4 → 1,06; NIST RMF 2,4 → 0,32; BHV I 1,4 → 0,22; Azure 0,5 → 0,86; IFG 0 → 0,91; Einstein 0 → 0,75. **Abweichung vom Kriterium:** Bilderservice (1,28 %) und Factsheet (1,06 %) liegen über 1 %, weil die Legende als fester Block (zwei Zeilen) bei kleinen Dateien (≈ 20.000 bzw. ≈ 11.000 Zeichen) den Großteil der Mehrlänge stellt; der Text selbst trägt 34 bzw. 4 `**`-Stellen. Gewollt so belassen, die Legende ist nicht verkürzbar, ohne ihren Inhalt zu verlieren. - **Durchstreichung:** Girokonten 190 → 0, BHV II 2 → 0, Bilderservice 1 → 0; BHV I „vier“ und BHV III S. 5 (2 Zeilen) erhalten; IHF 152 → 127 (MuPDF 157). Die `~~` in Einstein sind Zeichen aus der OCR-Textschicht, keine Auszeichnung (eigene Zählung 0). - **Fett:** Azure 1.862, ecoDMS 578, IHF 574, Guide 65, NIST RMF 37, BHV I 3, Bilderservice 16; Concurrency 0 (Code). **Kursiv:** Concurrency 169 (alt 5.824), Azure 209 (alt 1.162), NIST RMF 93, IHF 221. - **Präzision am Seitenbild (Stichprobe, nur Zahlen):** IHF S. 29 und 61: Durchstreichung und Hinterlegung wie im Original (alle Stichproben richtig); IHF-Fett markiert die ganze hervorgehobene Zeile; Bilderservice S. 2: Fett am Zwischentitel und Fachbegriff richtig, die kursive Bildunterschrift ist im Original fett-kursiv und erhält nur `*`. 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. - **Code-Blöcke (Concurrency):** keine Auszeichnung im Code; Kursiv nur im Fließtext. Seit beta.6 auch durch die Regeln für Durchstreichung und Textmarker gesichert, nicht nur dadurch, dass das Korpus dort keine Linien und Marker hat. - **Bild-CHECK:** AGB 18 → 0 Seiten; BHV I 14 → 1; IHF 96 → 16, **genau** {1, 2, 6–8, 29, 48–55, 81, 96}; Einstein 20 → 0 (Scan, wie bei Punkt 6 entschieden); Präzision 1,0 in 16 Dateien. Azure: Präzision 0,9969 → 0,9694 durch 9 Seiten ohne Bildobjekt, die ein Vektordiagramm tragen (am Seitenbild geprüft: Architekturdiagramm, also richtig; das Maß kennt nur Bildobjekte). - **Fehlende Semantik gegen Referenz:** Streichungen bei BHV II (5), Guide (4), Deck, Bilderservice (je 1) bleiben fehlend, in Übereinstimmung mit „Präzision vor Trefferquote“; Fett im Deck (730) und in der Concurrency (2.542, Code) bleibt unmarkiert, weil außerhalb von Fließtext. - **Laufzeit:** Vergleichslauf PDF gesamt 14,5 min (mit Seitenbildern). - **Grundlinie:** im privaten Repo weiter `916a718`; sie auf diesen Stand fortzuschreiben ist ein bewusster Schritt des Betreibers (`converter-comparison.md` Schritt 6). - **Lokal:** `pytest` 3072 bestanden, 4 übersprungen (gehärteter Lauf mit `env -i`, für beta.5 und beta.6), `docs verify`, `instructions verify` grün. - **CI:** beta.5 `a581271`: Run 713 (`verify`, `pwsh`), Converters Run 714 (per Push gestartet), `release.yml` Run 715 grün. beta.6 `cb1c9a2`: Run 716 (`verify`, `pwsh`), Converters Run 717 (per Push gestartet), `release.yml` Run 718 grün. ## Akzeptanzkriterien - [x] Kein `<mark` in einer Ableitung; die Legende hat höchstens drei Zeilen. - [x] Erzeugte Test-PDFs: Gitterlinie durch ein Zeichen oder weit über den Text → keine `~~`; 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). - [x] Kein Tag beginnt oder endet mit Leerraum (Test über alle erzeugten PDFs). - [x] Ohne Kennzeichnungen derselbe Text wie ohne Layoutanalyse. - [x] Bildseiten-CHECK: ganzseitiger Hintergrund auf jeder Seite + Bild auf einer Seite → genau diese Seite; 2×2-px-Bild → keine; gleiches Bild auf ≥ 20 % der Seiten → keine; Vektor-Diagramm ohne Bildobjekt → Seite genannt. - [x] Korpus, gemessen mit dem Vergleich (#233) gegen dessen Grundlinie: IHF-Mehrlänge < 5 % (1,9 %), BHV-Streichungen wie gemessen (BHV I „vier“, BHV III S. 5); keine Durchstreichung in Girokonten, BHV II, Bilderservice; keine Auszeichnung in Code-Blöcken (Concurrency); IHF-Bildseiten ⊆ {1, 2, 6–8, 29, 48–55, 81, 96}. **Ausnahme:** „alle anderen < 1 %“ gilt für 14 von 16 Dateien; Bilderservice (1,28 %) und Factsheet (1,06 %) liegen wegen der festen Legende darüber (siehe Ergebnis). - [x] Doku nach Punkt 8 nachgezogen, einschließlich des berichtigten `CHANGES.md`-Eintrags; `grep -rn 'data-farbe'` außerhalb von Tests findet nichts mehr. - [x] `pytest`, `docs verify`, `instructions verify` grü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). - [x] Der Konverter-Workflow ist auf dem veröffentlichten Commit **von selbst** gestartet, über den Pfad `tools/chemenu/filters/**`, nicht per `workflow_dispatch` (Runs 714 und 717, Ereignis `push`). Übernommen aus #232: Dieses Paket ist die erste Änderung unter `filters/` seit dem Workflow und belegt damit diesen Eintrag der `paths:`-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 von `derived.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“ - Vorgänger: #233 - Nachfolger: #234
torben added the prio/plannedsize/Marea/kbkind/decision labels 2026-10-14 06:15:50 +00:00
torben changed title from `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ächen 2026-10-14 08:26:25 +00:00
Author
Owner

Changelog: 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. Bleibt kind/decision, bis der Vorschlag bestätigt ist.

**Changelog:** 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. Bleibt `kind/decision`, bis der Vorschlag bestätigt ist.
torben changed title from `raw derive` PDF: Kennzeichnungen auf ein Minimum – Durchstreichung, Textmarker und Hervorhebung im Fließtext als `~~`/`**`/`*`, keine Tabellen- und Gestaltungsflächen to `raw derive` PDF: Kennzeichnungen auf ein Minimum, Bildseiten-CHECK, gezielter Blick auf Problemseiten – eigene Regeln oder vorhandenes Werkzeug 2026-10-14 10:38:59 +00:00
Author
Owner

Changelog: 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:** 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`.
torben added size/L and removed size/M labels 2026-10-14 10:39:05 +00:00
Author
Owner

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.

**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`.
torben changed title from `raw derive` PDF: Kennzeichnungen auf ein Minimum, Bildseiten-CHECK, gezielter Blick auf Problemseiten – eigene Regeln oder vorhandenes Werkzeug to `raw derive` PDF: Kennzeichnungen auf ein Minimum mit eigenen Regeln (A+) – Struktur zuerst, `~~`/`**`/`*` nur wo eindeutig, präziser Bildseiten-CHECK 2026-10-14 12:10:07 +00:00
torben added kind/buildstatus/blocked and removed kind/decision labels 2026-10-14 12:10:07 +00:00
Author
Owner

Changelog: 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/blocked auf #233. Drittes Glied der Kette „Konverter-Qualität“ (#232 → #233 → #231 → #234).

**Changelog:** 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/blocked` auf #233. Drittes Glied der Kette „Konverter-Qualität“ (#232 → #233 → #231 → #234).
Author
Owner

Changelog: Punkt 8 ergänzt: CHANGES.md-Eintrag des Kandidaten 10.1.0 berichtigen; den Hilfetext in derive.py samt generiertem tools/CONTRACT.md ausdrücklich genannt. Neues Kriterium: kein data-farbe mehr außerhalb von Tests. Im Versionsteil der Fall ergänzt, dass 10.1.0 vorher freigegeben wird.

**Changelog:** Punkt 8 ergänzt: `CHANGES.md`-Eintrag des Kandidaten 10.1.0 berichtigen; den Hilfetext in `derive.py` samt generiertem `tools/CONTRACT.md` ausdrücklich genannt. Neues Kriterium: kein `data-farbe` mehr außerhalb von Tests. Im Versionsteil der Fall ergänzt, dass 10.1.0 vorher freigegeben wird.
Author
Owner

Changelog: Neuer Abschnitt „Ausgangslage“ aus dem ersten Lauf des Konverter-Vergleichs (#233), Grundlinie 916a718 im 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/blocked bleibt, bis #233 geschlossen ist.

**Changelog:** Neuer Abschnitt „Ausgangslage“ aus dem ersten Lauf des Konverter-Vergleichs (#233), Grundlinie `916a718` im 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/blocked` bleibt, bis #233 geschlossen ist.
torben removed the status/blocked label 2026-10-14 16:45:38 +00:00
Author
Owner

Changelog: #233 ist geschlossen; es war der einzige offene Blocker. Deshalb ist status/blocked entfernt 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 gegen harness/baseline.json (916a718). Baubereit: kind/build, kein status/incoming oder status/unconfirmed.

**Changelog:** #233 ist geschlossen; es war der einzige offene Blocker. Deshalb ist `status/blocked` entfernt 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 gegen `harness/baseline.json` (`916a718`). Baubereit: `kind/build`, kein `status/incoming` oder `status/unconfirmed`.
Author
Owner

Build-Sitzung: A+ umgesetzt und als 10.1.0-beta.5 veröffentlicht (Commit a581271). pdf_layout.py neu: 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 und CHANGES.md nachgezogen. 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 und release.yml 715 grün. Zahlen im Body unter „Ergebnis des Baus“.

Build-Sitzung: A+ umgesetzt und als 10.1.0-beta.5 veröffentlicht (Commit `a581271`). `pdf_layout.py` neu: 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 und `CHANGES.md` nachgezogen. 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 und `release.yml` 715 grün. Zahlen im Body unter „Ergebnis des Baus“.
Author
Owner

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 und release.yml 718 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.

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 und `release.yml` 718 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.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#231