Files
marketing_claude/teilgebiete/01-lebenslauf.md
tlg 8016f4d775 S10: Aufgabe 1 (DOCX-Heading-Farbe und -Bold) abgeschlossen. Farb-Audit zuerst: DesTEngS-Primaerfarbe ist 3C68AE, in 4 Dateien (agent-prompt.md, teilgebiete/01-lebenslauf.md, build/build-reference-docx.py Konstante HEADING_COLOR und Doc-Kommentar, templates/template.tex destengsblue-Definition) von 0B5394 auf 3C68AE korrigiert. changelog.md (append-only) und cv-debug.tex (generierter Output) bewusst ausgenommen. Diagnose der nicht-greifenden Heading-Farbe: Pandoc-3.x-Default-Reference enthaelt Linked Character Styles Heading1Char/2Char/3Char mit eigener color val=0F4761 themeColor=accent1 themeShade=BF (Aptos-Petrol). Char-Styles dominieren in Word ueber Para-Styles bei Run-Eigenschaften, deshalb gewann das Aptos-Theme. Pandoc 2.9 (Sandbox) hat diese Char-Styles nicht, daher konnte der Bug dort nicht reproduziert werden. Fix in build/build-reference-docx.py: HEADING_COLOR_STYLES um Heading1Char Heading2Char Heading3Char erweitert. Zusatzanforderung von Thomas: H1 und H2 fett. Neue Funktion set_heading_bold mit Konstante HEADING_BOLD_STYLES analog (Heading1+2 Para- und Char-Stil). H3 bleibt unveraendert. Docstring-Block B4 um beide Erklaerungen erweitert. Sandbox-syntaktischer Test der neuen Funktionen erfolgreich. Build und visuelle Bestaetigung durch Thomas: alle Headings im DOCX in DesTEngS-Blau 3C68AE, H1 und H2 fett, H3 normal. Aufgabe 2 Diff-Material vorbereitet: alte CV-Quelle Lebenslauf_Thomas_Langer_2025-03-21.docx aus archiv via pandoc nach markdown konvertiert und mit aktueller cv.md verglichen. Vier Output-Dateien in artefakte/01-lebenslauf/output: cv-old-plain.txt (DOCX normalisiert 305 Zeilen), cv-new-plain.txt (cv.md normalisiert 289 Zeilen), cv-diff-unified.txt (kompletter unified diff 551 Zeilen), cv-diff-report.md (sektionsweise Vergleichsbericht mit Mapping Berufstaetigkeit gleich Projekte als freiberuflicher Consultant). Sektion-Groessenvergleich zeigt erwartete Aenderungsmuster: Header kompakter, Zusammenfassung und Kenntnisse erweitert (KI-Fokus), Trainings stark gekuerzt, Veroeffentlichungen in Ausbildung integriert. Sinn-Check selbst macht Thomas in seinem Tempo, dann gemeinsames Review.
2026-04-27 20:27:12 +02:00

43 KiB
Raw Blame History

Teilgebiet 01: Lebenslauf-Optimierung

Ziel

Universeller CV (eine Version) für Consulting-Agenturen, der Thomas als freiberuflichen Ingenieurdienstleister und AI Consultant positioniert. Ziellänge: 45 Seiten (aktuell 7). KI klar priorisiert, Elektronik-Kompetenz als wertvolles Differenzierungsmerkmal erhalten.

Zielgruppe des CVs

Primär: Recruiting-Mitarbeiterinnen von Consulting-Agenturen (sekundäre Zielgruppe laut marketing.md). Diese scannen CVs in 3060 Sekunden auf Keyword-Passung und entscheiden dann, ob sie weiterlesen.

Analyse des Ist-Zustands

Stärken

  • Portraitfoto vorhanden und professionell
  • Berufserfahrung chronologisch klar gegliedert
  • Bei einigen Stationen bereits gute Mehrwert-Formulierungen (z.B. Infineon: "Verhinderte eine Verzögerung der IC-Evaluierung")
  • KI-Projekte stehen bereits im oberen Bereich

Schwächen

  1. Zusammenfassung nicht auf KI ausgerichtet: Kein KI-Keyword in den Branchenaufzählungen, TÜV-Zertifikat fehlt komplett, "Hardware Design" gleichberechtigt mit KI genannt.
  2. Seitenbudget falsch verteilt: KI-Inhalte ca. 1,5 Seiten vs. HF/Hardware ca. 4,5 Seiten. Über 60% des CVs beschreiben Tätigkeiten außerhalb des strategischen Fokus.
  3. DesTEngS-Block mischt Leistungskatalog mit Projekten: Unterpunkte unter "Generative KI" und "Elektronik Entwicklung" lesen sich wie ein Dienstleistungskatalog, während die Projekte danach nochmals separat erscheinen → Redundanz (z.B. KI-Workshops doppelt).
  4. ASMPT Ethernet-Block (Nov 2020Mai 2024) zu detailliert: Ca. 2 Seiten für ein einzelnes Projekt, dessen Kerninhalt (Ethernet-Feldbus) kein strategischer Fokus ist.
  5. Stil "Angestellter" bei älteren Stationen: "Entwicklungsingenieur bei Siemens" statt Consultant-Perspektive.
  6. Kenntnisse-Abschnitt verwässert: Veraltete Technologien (AEL, Pascal, Ada, Assembler) stehen neben aktuellen KI-Tools. KI-Strategiebegriffe fehlen (Prompt Engineering, LLM Evaluation, KI-Strategie).
  7. Trainings-Abschnitt zu lang: Viele veraltete Einträge (GSM-Kurse 1998, Aplac 2001).
  8. Fehlende Mehrwert-Perspektive bei ASMPT: Längste und aktuellste Station beschreibt fast ausschließlich Tätigkeiten, kaum Kundenmehrwert.

Optimierungsstrategie

S1 — Zusammenfassung komplett neu schreiben

  • KI und TÜV-Zertifikat in den ersten Satz
  • Branchenliste ersetzen durch Kompetenz-Cluster: Generative KI, Software Design, System Integration, Test & Automatisierung
  • "30+ Jahre Ingenieurerfahrung" beibehalten als Differenzierer
  • "Freiberuflicher Consultant seit 2011" statt "seit 2011 ausschließlich freiberuflich tätig"
  • Mehrwert-Aussage ergänzen (was der Kunde davon hat)

S2 — DesTEngS-Block umstrukturieren

  • Den generischen Leistungskatalog entfernen (diese Information gehört in den One-Pager, nicht in den CV)
  • Stattdessen: KI-Projekte als eigenständige, prominente Einträge mit Kundenname, Zeitraum und Mehrwert
  • KI-Workshops mit konkreten Ergebnissen/Outcomes versehen

S3 — ASMPT-Block straffen

  • ASMPT Aug 2024Feb 2026 (KI-Workshop + ArxmlGenerator): Behalten und KI-Anteil hervorheben
  • ASMPT Nov 2020Mai 2024 (Ethernet-Feldbus): Radikal kürzen auf ca. 810 Zeilen. Fokus auf übertragbare Kompetenzen: Konzepterstellung, Protokoll-Evaluierung, Tool-Entwicklung, Test-Automatisierung. Tiefe HF/Ethernet-Details entfernen.

S4 — Magna, Infineon, Kathrein: Moderat kürzen

  • Magna (20182020): LIDAR und xDiagnostics sind aktuell relevant (Automotive, Embedded, Requirements). EMV/Signalintegrität kürzen. Ca. 68 Zeilen.
  • Infineon (20142018): Signal-Integrity-Kern behalten, aber Details zu 77-GHz-Radar und EM-Feldsimulationen kürzen. Mehrwert-Beispiele behalten. Ca. 68 Zeilen.
  • Kathrein (2015): Stark kürzen auf 2 Zeilen (HF-Tests, Automatisierung mit Matlab/Ruby).
  • Alcatel-Lucent (20112014): Kürzen auf ca. 68 Zeilen. LTE/WiFi-Kontext behalten, Mehrwert-Beispiele behalten, HF-Messdetails stark reduzieren.
  • Ubidyne (20062011): Führungserfahrung und Teamaufbau hervorheben (10 MA, Prozesserstellung, Projektmanagement). HF-Details radikal kürzen. Ca. 68 Zeilen.
  • Toshiba (20032006): Kürzen auf 45 Zeilen. OIF/MIPI-Normungsarbeit und Senior-Rolle betonen.
  • Siemens (19982000): Kürzen auf 34 Zeilen. HF-Modul-Verantwortung behalten.
  • Multilink (20002002): Kürzen auf 34 Zeilen. System-Level-Arbeit betonen.
  • FBH Promotion (19941998): Kürzen auf 23 Zeilen. Promotion erwähnen, Details in Ausbildungs-Abschnitt.
  • HMI (19901992): 12 Zeilen oder in Ausbildung integrieren.

S6 — Kenntnisse-Abschnitt reorganisieren

  • KI ganz oben, erweitert um: KI-Strategie & Potenzialanalyse, Prompt Engineering, LLM Evaluation & Benchmarking
  • Software Design: Python prominent, C++/Matlab behalten, veraltete Sprachen (Ada, Pascal, AEL, Assembler, Basic) entfernen
  • IT: Kürzen, nur aktuelle Tools
  • Engineering Software: Kürzen, nur noch die wichtigsten
  • Messtechnik: Stark kürzen oder in eine Zeile zusammenfassen
  • Veraltete Einzeltechnologien entfernen

S7 — Trainings kürzen

  • Behalten: AI Consultant TÜV-Zertifikat (2025), Management (2008), Führung und Organisation (2007), Ansys SIwave (2016), Keysight ADS (2016)
  • Entfernen: Erste-Hilfe, Marketing 2011, Pulsonix, HFSS, MS Project, Gedächtnistraining, Aplac, Persönlichkeitsentwicklung, ADS RF Class 1999, BWL-Seminar, Mobilfunk-Kurse

S8 — Durchgängig Consultant-Perspektive

  • Bei allen Stationen seit 2011: "Consultant bei X" beibehalten (ist bereits so)
  • Bei Stationen vor 2011: Titel beibehalten (waren ja tatsächlich Anstellungen), aber in der Beschreibung wo möglich Mehrwert und Verantwortung betonen statt reine Tätigkeitsbeschreibung

Getroffene Entscheidungen

  • Seitenumfang: 45 Seiten Ziel, HF/Hardware komprimiert, KI und Software/SI in voller Detailtiefe (wegen Keyword-Matching durch Agentursoftware)
  • Stationen: Alle Stationen beibehalten; HF-lastige Stationen (Kathrein, Siemens, FBH, HMI) nur gekürzt wo anderer Inhalt vorhanden; bei reinen HF-Stationen bleibt der Inhalt (sonst leere Station)
  • DesTEngS-Block: Umstrukturiert zu KI-Workshops (mit Kundennamen), KI-Beratungen, KI-Anwendung, KI-gestützte Dokumentationen
  • ASMPT Ethernet (20202024): Detailliert belassen, da SI/Software-Inhalte für Agentursoftware-Matching relevant; Success Stories erhalten
  • Kenntnisse KI: Erweitert um KI-Strategieentwicklung, Prompt Engineering, Context Engineering, LLM-Evaluierung, Multimodale KI, DSGVO, NLP, Edge AI, On-Premise KI-Infrastruktur, Agentic AI, Generative AI (GenAI), RAG mit Embedding Models und Vektor-Datenbanken
  • Kenntnisse Software Design: Prozessautomatisierung (UI.Vision, PyAutoGUI, n8n, Langflow), REST API Integration, Python KI-Module (transformers, openai, anthropic, tiktoken), IronPython aus Kenntnissen entfernt (bleibt in Infineon-Station)
  • Kenntnisse Methodik: Neuer Abschnitt mit 7 Einträgen (Konzepterstellung, Spezifikationserstellung, Systematische Fehleranalyse, Technologie-Evaluierung und -Auswahl, Machbarkeitsstudien, Technische Dokumentation, Projektmanagement)
  • Trainings: Gekürzt auf 6 Einträge (AI Consultant TÜV 2025, Ansys SIwave 2016, Keysight ADS 2016, Management 2008, Führung 2007, Gedächtnistraining 2006, Persönlichkeitsentwicklung 2000)
  • Suchbegriff-Optimierung: Begriffe so formuliert, dass Agentursoftware bei gängigen Suchstrings Treffer findet (z.B. „KI-Strategie", „Prompt Engineering", „Agentic AI", „Edge AI", „GenAI", „NLP")
  • Evaluation vs. Evaluierung: Deutsch konsequent „Evaluierung", englisch „Evaluation Board" beibehalten
  • Berufstätigkeit aufgeteilt: „Projekte als freiberuflicher Consultant" (ab 2011) und „Berufliche Stationen vor der Selbständigkeit" (vor 2011)
  • LLM-Evaluierung: Kein eigener Punkt mehr, sondern in den LLM-Hauptpunkt integriert
  • LinkedIn/Freelance.de: Korrekte Profil-URLs eingebaut, als klickbare Links
  • Portraitfoto: foto-wrba_2026_6782_1.jpg ausgewählt und eingebettet
  • Seitenumfang (final): 7 Seiten — von Thomas akzeptiert, da Inhalt sehr gut passend

Wendepunkt S05 — Tool-Wechsel zu Pandoc + LuaLaTeX

Die in S04 mit docx-js erstellte Version hatte strukturelle typographische Mängel (Widows/Orphans, Spalten-Layout bei Ausbildung, fehlende Kontaktlabels, Schriftsatz bei Einheiten wie „6 GHz", etc.). Eine Analyse hat ergeben, dass docx-js für den gewünschten typographischen Anspruch das falsche Werkzeug ist — die Grenzen liegen zum Teil am Tool, zum Teil strukturell am .docx-Format selbst.

Neue Strategie 1: Eine Quelle (Markdown), zwei Zielformate mit unterschiedlichem Anspruch:

  • PDF via Pandoc + LuaLaTeX mit eigenem LaTeX-Template → tadellose Typographie, IBM Plex Sans (DesTEngS-neue-Hausschrift, siehe Teilgebiet 25), für Direktkanäle (Website, persönliche Bewerbungen).
  • DOCX via Pandoc mit reference-doc.docx → semantisch sauber, Calibri, bewusst schlicht, für Consulting-Agenturen (die das Layout beim Umbau in ihr Template ohnehin überschreiben).

Getroffene Entscheidungen (ergänzt in S05)

  • Quellformat: Markdown (aufbauend auf V10-Inhalt, um Änderungen in Git lesbar zu halten und Pandoc-native Pipelines zu nutzen).
  • PDF-Toolchain: Pandoc → LuaLaTeX (wegen fontspec/OpenType und voller microtype-Unterstützung).
  • DOCX-Toolchain: Pandoc mit Reference-Doc (Starter-Version von Pandoc generiert; Styles iterativ in Word anzupassen).
  • Schriften: PDF nutzt IBM Plex Sans (Plex Sans/Mono), DOCX nutzt Calibri (weil Agenturen eh umbauen und Calibri universell verfügbar ist — keine Font-Substitutions-Risiken).
  • TeX-Distribution: MiKTeX (Windows, on-the-fly package installation).
  • Ordnerstruktur: artefakte/01-lebenslauf/ wurde in Unterordner gegliedert: source/, templates/, build/, output/, entwuerfe/ (für die MD-Entwürfe v1v10) und archiv/ (für die alten docx-js-Ausgaben).
  • Foto-Umbenennung: Die Foto-Datei wurde von ©foto-wrba_2026_6782_1.jpg auf foto-wrba_2026_6782_1.jpg umbenannt, um Encoding-Probleme in Build-Pfaden zu vermeiden.
  • Draft-Marker in cv.md entfernt: Der H1-Suffix „— Entwurf V10", die Review-Blockquote und der Platzhalter-Bullet „- Portraitfoto" wurden aus source/cv.md entfernt (reine Meta-Elemente, kein CV-Inhalt).
  • Status Teilgebiet 01 auf „in Bearbeitung" gesetzt im zentral-index.md.

Iteration A (S06) — Ausbildung als 2-Spalten-Layout

Erster Versuch (verworfen) — Definition-List: Quellseitig als Pandoc-Definition-List umgesetzt, im PDF mit enumitem-Konfiguration der description-Liste sauber 2-spaltig. Im DOCX rendert Pandoc Definition-Lists aber als zwei separate Absatzstile (DefinitionTerm und Definition) — Word kann zwei Absätze nicht ohne weiteres optisch in eine Zeile zwingen, ein echtes 2-Spalten-Layout im DOCX ist mit Definition-Lists nicht erreichbar. Das war beim ersten Build-Test sichtbar (Datum fett auf eigener Zeile, Inhalt darunter).

Revision — Tabellen-Variante (aktiv): Die Markdown-Quelle nutzt eine Pandoc-Multiline-Tabelle ohne Header (zwei Strich-Zeilen als äußere Begrenzung, vier Datenzeilen, blank-lines zwischen Einträgen). Pandoc rendert daraus eine longtable mit Minipage-Auto-Wrap im PDF und eine native Word-Tabelle im DOCX — beides ergibt echtes 2-Spalten-Verhalten und ist bei Agenturen mindestens so robust wie eine Definition-List (eine 4-zeilige 2-Spalten-Tabelle ist Word-Standardrepertoire).

Quellseitig (source/cv.md): Multiline-Tabelle mit Strich-Verhältnis 10:70. Pandoc berechnet daraus Spaltenbreiten von ca. 14 % (Datum) und 80 % (Inhalt) der Textbreite.

PDF-Pfad (templates/template.tex): Neuer Abschnitt „Tabellen": booktabs und longtable werden geladen, die Linienbreiten (\heavyrulewidth, \lightrulewidth, \cmidrulewidth) auf 0 pt gesetzt, ebenso \aboverulesep und \belowrulesep. \LTpre/\LTpost auf 0.4 em reduziert (Default ist \bigskipamount). Damit rendert die Tabelle rahmenlos und mit kompaktem Vertikalabstand.

DOCX-Pfad: Pandoc rendert die Tabelle als native Word-Tabelle (<w:tbl> mit vier <w:tr> und acht <w:tc>), Default-Tabellenstil ohne expliziten Pandoc-Stil. Das Feinstyling (Spaltenbreite, Rahmen aus, vertikale Abstände) erfolgt in der reference.docx (Iteration B), entweder über den Default-Tabellenstil oder einen benannten Tabellenstil.

Sandbox-Verifikation der Revision: Pandoc-LaTeX-Output zeigt \begin{longtable}[]{@{}ll@{}} mit vier Datenzeilen, Minipage-Spalten (0.14 + 0.80), korrekte URL-Escapung. Pandoc-DOCX-Output enthält genau eine Tabelle mit vier Zeilen und acht Zellen im Ausbildungs-Bereich, keine Reste der zwischenzeitlich genutzten Definition-List-Stile.

Visuelle Bestätigung im PDF: Layout im Tabellen-Format wie gewünscht (linke Spalte Datum normal, rechte Spalte Titel fett, Beschreibung normal). Visuelle Bestätigung im DOCX steht nach erstem Build der Revision aus.

Hotfix Build-Fehler (S06, Teil 1): Beim ersten Build der Tabellen-Revision schlug LuaLaTeX mit ! LaTeX Error: No counter 'none' defined. in der Spaltenangabe p{(\columnwidth - 2\tabcolsep) * \real{0.8554}} fehl. Erste Vermutung: Thomas' Pandoc-Version (3.x) emittiert für Tabellen-Spaltenbreiten einen calc-basierten Multiplikator, der das Pandoc-Hilfsmakro \real und das calc-Paket voraussetzt. Ergänzung von \usepackage{array}, \usepackage{calc} und \providecommand{\real}[1]{#1} im Tabellen-Block des Templates. Sandbox-Verifikation mit synthetischem Pandoc-3.x-Spalten-Format kompilierte zu PDF ohne Fehler — die echte Ursache war damit aber noch nicht behoben.

Hotfix Build-Fehler (S07, eigentliche Ursache): Der Folgebuild auf Thomas' System lieferte unverändert ! LaTeX Error: No counter 'none' defined. Recherche (Pandoc-Issue #11201) zeigte den eigentlichen Auslöser: Pandoc 3.x emittiert für unnummerierte Tabellen direkt vor dem \begin{longtable} die Zeile \def\LTcaptype{none} — ohne den Counter none zu definieren. Pandocs eigene Default-Vorlage definiert ihn (commit d835461 in 3.8.2.1 nachgezogen), aber Custom-Templates müssen das selbst tun. Sobald longtable intern \refstepcounter{\LTcaptype} aufruft, bricht LaTeX ab. Behoben durch eine Zeile \newcounter{none} direkt nach dem \providecommand{\real} im Tabellen-Block. Sandbox-Reproduktion lieferte exakt den gleichen Fehlertext und wurde durch den Fix behoben. Anschließender Build auf Thomas' System: PDF erfolgreich erzeugt, Ausbildungs-Layout im PDF visuell bestätigt.

Lehre für die Sandbox-Verifikation: Pandocs \def\LTcaptype{none}-Bug tritt nur auf, wenn longtable den Counter intern referenziert. Sandbox-Pandoc 2.9 emittiert weder die calc-basierten Spaltenbreiten noch \def\LTcaptype{none} — die Sandbox kann diesen Bug also nicht reproduzieren, indem sie einfach pandoc auf cv.md laufen lässt. Synthetische Mini-Tex-Beispiele bleiben für Pandoc-3.x-spezifische Bugs die einzige verlässliche Verifikationsquelle.

Visuelle Bestätigung im DOCX: Tabelle sieht gut aus, nur die Default-Word-Tabellenrahmenlinien sind noch sichtbar; der Rahmen-Aus geht in Iteration B über die reference.docx.

Visuelle Bestätigung im PDF (S07): Ausbildungs-Layout entspricht der Vorgabe — linke Spalte Datum normal, rechte Spalte Titel fett mit Beschreibung. Iteration A damit inhaltlich abgeschlossen.

Build-UX-Fix (S07): build/build.ps1 ergänzt um Start-Sleep -Seconds 3 nach jedem fehlschlagenden Build-Schritt (Pflichtdatei-Check, PDF, DOCX). Bei Doppelklick auf checkpoint.cmd-artigen Aufruf schließt sich das PowerShell-Fenster sonst sofort und Fehlermeldungen sind nicht lesbar. Bei mehreren Fehlern in einem Lauf akkumulieren sich die Pausen — gewollt.

Iteration B (S07) — reference.docx programmatisch bauen

Ansatz: Anstatt die reference.docx manuell in Word zu pflegen (nicht versionierbar, nicht reproduzierbar), wird sie durch ein Python-Skript build/build-reference-docx.py aus Pandocs Default-Reference erzeugt und gezielt angepasst. Nur Python-Stdlib (zipfile, xml.etree.ElementTree, subprocess, re) — keine pip-Abhängigkeit. Das Skript läuft unter Sandbox-Pandoc 2.9 und Thomas' Pandoc 3.x gleichermaßen, weil es die Pandoc-Default-Reference per pandoc --print-default-data-file reference.docx zur Laufzeit zieht. Manueller Aufruf vor jedem build.ps1, wenn Stile geändert wurden.

B1 — Schriften und Tabellen:

  • Theme-Schriften majorFont und minorFont beide auf Calibri umgestellt (Pandoc 3.x setzt sie als Default auf Aptos Display und Aptos, Sandbox-Pandoc 2.9 auf Calibri und Cambria).
  • Defensive Maßnahme: alle direkten Schriftnamen-Referenzen in styles.xml (z.B. <w:rFonts w:ascii="..." />) auf Calibri umgestellt, ausgenommen Code-Schriften (Consolas, Courier, ...). In der Pandoc-3.x-Variante kommt das mit 0 Treffern aus, in zukünftigen Pandoc-Versionen mit direkten Heading-Schriftreferenzen würde es greifen.
  • Tabellen-Default-Stil Table bekommt explizite <w:tblBorders> mit val="none" auf allen Sides (top, left, bottom, right, insideH, insideV). Word-Editor zeigt die Default-„Tabellenbegrenzungen" weiterhin als Anzeige-Hilfe an (kein Druck-Rendering), Druckansicht und PDF-Export sind sauber rahmenlos.

B1.5 — Schriftgrößen analog PDF:

  • DocDefault <w:sz> auf 22 (= 11 pt Body, analog template.tex).
  • Heading 1/2/3 explizit auf 30/26/24 (= 15/13/12 pt). Damit ist die Heading-Hierarchie visuell ähnlich zum PDF, ohne den Word-Default-Sprung von 20 pt nach 12 pt.
  • Effekt: DOCX schrumpft von 10 auf 9 Seiten (im PDF sind es 7).

B2 — Header, Footer, Page-Setup:

  • word/header1.xml (Default ab Seite 2): links „Dr.-Ing. Thomas Langer", rechts „Lebenslauf" (Tab-Stop am rechten Textrand).
  • word/header2.xml (erste Seite): leerer <w:p/> über <w:titlePg/> aktiviert.
  • word/footer1.xml: rechtsbündig „Seite n / m" mit Word-Feldern PAGE und NUMPAGES. Wird über zwei footerReference-Einträge (type="default" und type="first") auf alle Seiten inkl. Seite 1 angewendet — ohne den type="first"-Eintrag würde titlePg Seite 1 ohne Footer lassen.
  • Page-Setup explizit in <w:sectPr>: A4 (pgSz w:w="11906" w:h="16838"), Ränder 2.2 cm oben/unten, 2.5 cm links/rechts (analog PDF). Damit ist der Tab-Stop an 9072 dxa (= 16 cm Textbreite) deterministisch unabhängig von Word-Locale-Defaults; ohne explizites Page-Setup waren die Tab-Stops vorher etwa 5 mm zu weit links.
  • Beziehungen werden in word/_rels/document.xml.rels mit dynamisch ermittelter nächster freier rId registriert; Content-Types-Overrides in [Content_Types].xml ergänzt; <w:sectPr> in word/document.xml regex-basiert ersetzt (idempotent gegenüber Pandoc-Defaults <w:sectPr/> und längeren Varianten). Pandoc übernimmt die letzte sectPr aus der reference.docx ins generierte DOCX — End-to-End-Test in der Sandbox bestätigt: alle Header/Footer-Refs, pgMar und titlePg sind im finalen DOCX vorhanden.

Visuelle Bestätigung im Word (S07):

  • Body: Calibri 11 pt; Headings 1/2/3: Calibri 15/13/12 pt.
  • Ausbildungs-Tabelle in Druckansicht und PDF-Export rahmenlos.
  • Seite 1 ohne Header, mit Footer.
  • Seite 2 ff. mit Header (Name links, „Lebenslauf" rechts) und Footer (Seite n / m).
  • Tab-Stops „Lebenslauf" und Seitenzahl bündig am rechten Textrand.

B3 — Schusterjungen- und Witwen-Schutz für DOCX:

  • DocDefault <w:widowControl/> aktiviert (klassische Witwen/Waisen-Logik in mehrzeiligen Absätzen).
  • Heading 1/2/3 und FirstParagraph (Pandoc-Stil für ersten Absatz nach einem Heading — deckt unsere Kenntnisse-Subsection-Labels ab) bekommen <w:keepNext/> und <w:keepLines/>. Damit bleibt jede Überschrift mit dem nachfolgenden Inhalt zusammen.

B3.5 — 3-3-Regel für Listen-Bullets:

  • Erster Versuch (Compact-Stil mit keepNext+keepLines) hat Listen komplett unteilbar gemacht — Folge: Job-Stationen begannen jedes Mal auf einer neuen Seite, Seitenenden ungenutzt. Auf Wunsch von Thomas auf eine 3-3-Regel umgestellt: bei Listen mit ≥ 6 Bullets darf getrennt werden, aber mindestens 3 Bullets bleiben jeweils zusammen vor und nach dem Umbruch. Bei Listen mit < 6 Bullets bleibt alles zusammen (sonst nicht erfüllbar).
  • Da das stilbasiert nicht abbildbar ist (alle Bullets haben pStyle="Compact"), läuft die Logik in einem Post-Processing-Skript build/post-process-docx.py, das nach dem Pandoc-DOCX-Build die document.xml modifiziert: Sequenzen aufeinanderfolgender Listen-Bullets (Absätze mit <w:numPr>) werden gefunden, pro Sequenz bekommen die ersten 2 und die N-3-/N-2-Bullets <w:keepNext/>. Bullets in Tabellen-Zellen werden defensiv ausgenommen (faktisch bei uns leer, weil unsere Tabellen-Zellen Compact-Absätze ohne numPr enthalten).
  • build.ps1 ruft das Skript automatisch nach erfolgreichem DOCX-Build auf (Schritt [3/3]), Console-Output und Log enthalten Statistiken (Anzahl Listen, Bullets, gesetzte keepNext-Markierungen).
  • Sandbox-Verifikation: 26 Listen, 184 Bullets, 93 keepNext-Markierungen, Pattern für Listen mit n ≥ 6 z.B. KK......KK. (Liste mit 11 Bullets: erste 2 + Bullets 9 und 10 keepNext). Auf Thomas' System visuell bestätigt: Stationen-Listen werden jetzt sauber an guter Stelle getrennt, keine ungenutzten Seitenenden mehr, kein einzelner Bullet alleine am Seitenrand.

Iteration B4 (S08) — Heading-Farben und H2-Trennlinien

B4.1 — Heading-Farben in destengsblue: Heading 1, 2 und 3 werden in build/build-reference-docx.py per Funktion set_heading_colors auf <w:color w:val="3C68AE"/> gesetzt; das themeColor-Attribut (Pandoc-Default: accent1) wird entfernt, damit die Farbe nicht aus dem Word-Theme kommt. Visuelle Bestätigung im DOCX: alle drei Heading-Levels erscheinen in destengsblue.

B4.2 — Heading-Trennlinien (Sackgasse): Erster Versuch war eine Bottom-Border direkt auf den Heading 1/2-Stilen, mit symmetrischem Indent (left=2268, right=2268, hanging=2268) für eine zentrierte Halblinie ca. 50 % der Textbreite. Word hat den hanging-Indent jedoch so interpretiert, dass die Border bei der visuellen Position der ersten Zeile (= 0 dxa) beginnt — die Linien erschienen linksbündig statt zentriert. Verworfen. Lehre: Words right-Indent begrenzt sowohl Text als auch Border, deshalb ist eine Border schmaler als der Heading-Text über den Heading-Stil selbst nicht erreichbar. Die Heading-Border-Logik wurde aus dem Skript wieder entfernt; nur die Heading-Farben (B4.1) sind geblieben.

B4.3 — Markdown-HRs aus cv.md entfernt: Beim Build der ersten B4-Variante fielen Thomas „Doppellinien über die gesamte Zeilenbreite" auf, die als anklickbare Word-Horizontal-Lines erschienen. Quelle: 21 alleinstehende ----Zeilen in cv.md. Pandoc rendert Markdown-HRs im PDF als \begin{center}\rule{0.5\linewidth}{0.5pt}\end{center} (saubere zentrierte Halblinie 0.5 pt) und im DOCX als VML-<v:rect ... o:hr="t"/> (Embossed-Doppellinien-Look). Auf Thomas' Wunsch wurden alle 21 HR-Zeilen aus cv.md entfernt — PDF verliert die Trennlinien zwischen Stationen, DOCX verliert die Doppellinien. Die Tabellen-Strich-Zeilen der Multiline-Tabelle für Ausbildung blieben unangetastet (anderes Pattern: ^---------- -----...$). Sandbox-Verifikation: 21 → 0 o:hr="t" Vorkommen im DOCX.

B4.3-Vorfall — Datei-Verlust und Wiederherstellung: Beim ersten HR-Removal hat die Sandbox die cv.md durch einen NTFS-Mount-Stale-Read truncated gelesen (20043 statt 20201 Bytes — die letzten 5 Zeilen mit „Englisch", „Veröffentlichungen", „Dissertation, fünf Veröffentlichungen, ein Patent, eine Erfindungsmeldung" fehlten). Das Python-Skript hat die HRs aus dieser truncated Version entfernt und die Datei zurückgeschrieben — die echte cv.md auf Thomas' System wäre damit ohne den Schluss-Block gewesen. Sofortige Wiederherstellung aus git show HEAD:artefakte/01-lebenslauf/source/cv.md (= S06-Commit be4f695, der letzte mit cv.md-Änderung); HR-Removal anschließend erneut auf der git-Version als Input (kein zweiter Sandbox-Read), Output direkt zurückgeschrieben. Live-Datei nach erfolgreichem zweiten Versuch: 20096 Bytes / 288 Zeilen, korrektes Ende. Lehre für die Pipeline: Bei jedem Sandbox-write auf NTFS-Mount-Datei mit grösserem Volumen erst die git-Version verifizieren, nicht blind dem Sandbox-Read trauen.

B4.4 — H2-Trennlinien via Post-Processing: Thomas wünschte stattdessen Trennlinien unter H2 (für visuelle Trennung der Hauptabschnitte und um H3 wieder klarer abzuheben). Nach einem Demo-Vergleich (linksbündiger Trennstrich vs. Underline-auf-Heading-Text in Text-Breite) Entscheidung für Trennstrich. Finale Parameter: schwarz (000000), 8,6 cm Linienlänge (= 4876 dxa, right-Indent 4196 dxa bei 9072 dxa Textbreite), 1,25 pt dick (<w:sz w:val="10"/> — sz ist in 1/8 pt). Umgesetzt in build/post-process-docx.py: Funktion process_document_xml ergänzt um eine zweite Logik, die nach jedem H2-Absatz einen leeren Trenn-Absatz mit Bottom-Border einfügt. Trenn-Absatz: <w:spacing before=0 after=80>, <w:ind right=4196>, <w:pBdr><w:bottom single sz=10 space=2 color=000000>, <w:rPr><w:sz val=2> (1 pt) für minimale Absatzhöhe. Sandbox-Verifikation: 7 H2 → 7 Trenner. Visuelle Bestätigung durch Thomas: Trennlinien sehen gut aus, Hierarchie zwischen H2 und H3 wieder klar.

Warum kein Heading-Stil-Border: Words right-Indent gilt sowohl für Text als auch für Border. Eine Border schmaler als der Heading-Text ist über den Stil selbst nicht abbildbar, weil Indent den Text mitkürzt. Lösung: separater Trenn-Absatz nach dem Heading. Die Underline-Alternative (Linie genau in Heading-Text-Breite) wurde verworfen, weil sie wie ein unterstrichener Text wirkt und nicht wie ein Trenner.

Iteration B5 (S08) — Trainings als Tabelle

Anforderung: Die Trainings-Sektion war als Bullet-Liste im Format - Datum — Beschreibung formatiert. Auf Wunsch von Thomas analog zur Ausbildungs-Sektion als Multiline-Tabelle umgestaltet, damit beide Sektionen visuell konsistent sind.

Umsetzung: Trainings-Bullet-Liste in source/cv.md durch eine Pandoc-Multiline-Tabelle mit Strich-Verhältnis 10:70 ersetzt (gleiches Format wie Ausbildung). Datum in Spalte 1, Inhalt in Spalte 2. Inhalte normal (nicht fett), nach kurzem Feedback-Zyklus mit Thomas. Mai-2000-Eintrag braucht 4 Padding-Leerzeichen statt 3, weil „Mai 2000" 8 Zeichen lang ist (alle anderen 9). Sandbox-Verifikation: 1 → 2 Tabellen im DOCX, 1 → 2 longtables im LaTeX. Visuell durch Thomas bestätigt.

Iteration B6 (S08) — Bullet-Einzüge verkleinern

Anforderung: Pandoc-Default-Bullet-Einzüge waren großzügig — Thomas wollte das kompakter, um Platzverschwendung zu reduzieren. Konkrete Wunschwerte: E1 Einzug 0,25 cm + Sondereinzug 0,35 cm; E2 Einzug 0,80 cm + Sondereinzug 0,40 cm.

Umsetzung-Pfad: Pandoc generiert die numbering.xml selbst und IGNORIERT die Werte aus der reference.docx. Daher kann das nicht über build-reference-docx.py geregelt werden, sondern muss im Post-Processing nach dem Pandoc-Build stattfinden. build/post-process-docx.py um eine dritte Modifikation erweitert: Funktion process_numbering_xml parst die numbering.xml aus dem DOCX, iteriert alle <w:abstractNum> und ersetzt für jedes <w:lvl> (ilvl 08) die <w:ind>-Werte aus einer Konstanten-Tabelle BULLET_INDENTS.

Word-Konvention (wichtig — kostete eine Iteration): Word zeigt im Absatz-Dialog „Einzug links" als (left - hanging) (= Bullet-Position) und „Sondereinzug Hängend" als hanging. Daher rechnen wir: left = (gewünschter Einzug + gewünschter Hanging-Indent) in dxa. Bei E1 mit 0,25 + 0,35 cm ergibt sich also left = 340 dxa, hanging = 198 dxa. Erster Versuch hatte left = 142 dxa gesetzt — Word zeigte dadurch Einzug -0,1 cm, weil das Mental-Modell die Word-Logik vertauscht hatte. Korrigiert in zweiter Iteration.

Sandbox-Verifikation: 2 abstractNum-Einträge in numbering.xml (Pandoc nutzt 990 für „plain" und 991 für „bullet" Listen), 18 lvls insgesamt modifiziert. Auf Thomas' System visuell bestätigt: Word zeigt jetzt für E1 Einzug 0,25 cm + Sondereinzug 0,35 cm, für E2 Einzug 0,80 cm + Sondereinzug 0,40 cm. Kein Bullet klebt am Text.

Hinweis (S08): Pandoc verwendet im DOCX-Output o als E2-Bullet-Marker (nicht wie im PDF-LaTeX-Pfad). Das ist kein Problem — beide Marker passen mit dem Sondereinzug 0,4 cm.

Anforderung: In cv.md standen Adressen und URLs als Plain-Text. Im PDF (LuaLaTeX/hyperref) wurden sie automatisch klickbar, im DOCX in Word jedoch unsichtbar als Hyperlink — kein blaues Underline, kein Hover, kein Klick. Beim Word-zu-PDF-Export griff Words eigene URL-Erkennung und machte sie im exportierten PDF doch klickbar; diese Inkonsistenz hatte Thomas richtig wahrgenommen. Außerdem fehlte ein Link auf das TÜV-Zertifikat.

Diagnose Hyperlink-Sichtbarkeit im DOCX: Pandoc übernimmt nackte URLs ohne die Extension autolink_bare_uris 1:1 als Text in die DOCX, ohne <w:hyperlink>-Markup. Lösung: explizite Markdown-Link-Syntax in der Quelle, dann emittiert Pandoc echte Hyperlink-Elemente.

Diagnose TÜV-Zertifikat-Link in Word: Direkt-URL perscert-tuv.certif-id.com/... funktioniert im Browser, schlägt aber bei Word-Ctrl+Klick mit „Die angeforderten Informationen können nicht heruntergeladen werden" fehl. Ursache: Word führt vor dem eigentlichen Klick eine Pre-Flight-Anfrage über urlmon.dll/WinINet aus. Die certif-id.com-Domain liegt hinter Cloudflare-Bot-Schutz, der diese Anfrage als Bot klassifiziert und mit 403 abweist. Würde sich auch beim Empfänger (Recruiter) reproduzieren.

Strategie für TÜV-Link (Optionen diskutiert):

  • A — Self-hosted 301-Redirect auf destengs.de: würde Word-seitig funktionieren, kann aber unseriös wirken; zur Verifikation soll möglichst die Aussteller-Website verlinkt sein.
  • B — LinkedIn-Safety-Redirect mit gestrippten Session-Parametern: schnell, aber Abhängigkeit von einem nicht stabilen LinkedIn-Endpoint.
  • C — Link weglassen: verschenkt das Verifikationsangebot.
  • D (gewählt) — Direkt-Link auf certif-id.com beibehalten mit erklärendem Display-Text, der den Empfänger über die Word-Einschränkung informiert: „Link zum Zertifikat (funktioniert nur im Browser)". Manueller Copy-and-Paste der URL in den Browser funktioniert. Thomas hat zusätzlich eine kürzere Direkt-URL vom TÜV besorgt: https://perscert-tuv.certif-id.com/expert/public/share/7MR0WDzG106JDCqV_RW7 (statt der ursprünglichen 130-Zeichen-Hash-URL).

Display-Text-Stil:

  • Web-Links: kurze sprechende Labels mit sichtbaren äußeren eckigen Klammern als einheitlicher Stil über alle Web-Link-Anzeigetexte. Markdown-Syntax [[text]](url) rendert mit Pandoc als Link mit Display-Text [text] inkl. der äußeren Klammern (balanced brackets im Link-Text sind in CommonMark erlaubt).
  • E-Mail: Pandoc-Autolink-Form <email@domain> (Sonderfall — keine Klammern, da die Adresse selbst die Information ist).
  • Telefon: [+49 ...](tel:+49...) für mobile Clients (Display-Text mit Leerzeichen, URL ohne — RFC 3966).

Konkrete Änderungen in cv.md:

  • E-Mail: Thomas.Langer@destengs.com<Thomas.Langer@destengs.com>.
  • Telefon: +49 89 413 27 59 20[+49 89 413 27 59 20](tel:+4989413275920).
  • Freelance.de: nackte URL → [[Link zum Profil]](URL).
  • Website: https://destengs.com[[destengs.de]](https://destengs.de) — bewusster Wechsel auf die deutsche Domain (stimmiger zur deutschen Primärsprache).
  • LinkedIn: nackte URL → [[Link zum Profil]](URL).
  • Ausbildung TÜV-Zeile: trailing TÜV-Zertifikat[[Link zum Zertifikat (funktioniert nur im Browser)]](https://perscert-tuv.certif-id.com/expert/public/share/7MR0WDzG106JDCqV_RW7).
  • Ausbildung Promotion-Zeile: nackte URL depositonce.tu-berlin.de/.../Dokument_9.pdf[[Dissertation]](URL).

DOCX-Hyperlink-Stil: Pandoc-Default belassen (klassisch blau-unterstrichen). Keine Anpassung in build-reference-docx.py nötig.

Zwischenfall — zweite Edit-Tool-Truncation in S09: Beim zweiten Edit-Tool-Aufruf in dieser Session auf cv.md (TÜV-Zeile + Promotion-Zeile) hat das Tool die Datei still am Ende gekürzt; die Schluss-Zeile „Dissertation, fünf Veröffentlichungen, ein Patent, eine Erfindungsmeldung" wurde mitten im Wort abgeschnitten. Symptom identisch zum S08-Vorfall mit derselben Datei. Reparatur identisch zum S08-Pattern: git HEAD-Version als Input, alle 7 Link-Änderungen in einem Python-Script atomar via os.replace zurückgeschrieben, mit count(old) == 1-Eindeutigkeits-Check pro Replacement. Lehre: Für cv.md das Edit-Tool nicht mehr verwenden, stattdessen Python-aus-git-Pattern. Wandert beim Session-Abschluss in agent-prompt.md.

Build und visuelle Bestätigung durch Thomas (S09): build.ps1 ausgeführt; alle Links in DOCX und PDF wie gewünscht klickbar. TÜV-Klick zeigt erwartungsgemäß die Word-Fehlermeldung — der Display-Text warnt den Empfänger vorab, manuelles Copy-Paste in den Browser funktioniert.

Iteration C (S09) — Foto-Einbindung via Grid Table

Ziel: Foto rechts oben auf Höhe Name + Kontaktdaten, 4,06 × 4,06 cm, eckig, nur Seite 1, einheitlich in DOCX und PDF.

Layout-Pfad: Grid Table im cv.md als 2-Spalten-Header. Linke Zelle: H1 (Name) + H2 (Kontaktdaten) + Bullet-Liste der Kontaktdaten. Rechte Zelle: Foto-Image. Spalten-Verhältnis 65,1% / 34,9% (Strich-Anzahl 112:60), entspricht ca. 10,15 cm linke / 5,43 cm rechte Spalte.

C1 — Pipe-Alignment-Strenge in Pandoc 3.x: Erste Grid-Table-Variante hatte inkonsistente Pipe-Positionen, weil ich die Cell-Inhalte nicht genau auf die Strich-Breiten gepaddet habe. Pandoc 2.9 (Sandbox) parst das tolerant als Tabelle, Pandoc 3.x (Thomas) erkennt das nicht als Grid Table und fällt auf Plain-Text-Rendering der Pipes zurück (DOCX-Output war reiner Text). Fix: Tabelle programmatisch in Python aufbauen mit ljust(LEFT_W)/ljust(RIGHT_W) und Eindeutigkeits-Check der Pipe-Positionen pro Zeile. Lehre: Pandoc 3.x Grid Tables verlangen exakt konsistente Pipe-Positionen in allen Zeilen.

C2 — DOCX-Spacing für H1 und Foto via Post-Processing: Pandoc emittiert für H1 Default-Spacing-before = 18 pt, das Foto landet ohne Spacing auf Cell-Top. Resultat: H1-Top liegt 0,7 cm unter Foto-Top. Thomas hat in Word experimentiert und gewünscht: H1-spacing-before = 0 pt, Foto-spacing-before = 5 pt, dazu Foto-Paragraph horizontal rechtsbündig (<w:jc w:val="right"/>). Da Pandoc das Image als „Mit Text in Zeile" einbettet (nicht als Floating Image), kann es nur über die umgebende Paragraph-Eigenschaft ausgerichtet werden. Umgesetzt als vierte Modifikation in build/post-process-docx.py (Funktion process_header_table): findet die erste Tabelle, modifiziert die <w:pPr> der Heading1- und der Drawing-tragenden Paragraphen.

C3 — Foto-Größe 4,5 → 4,06 cm und Pandoc-Default-Image-Bug: Bei der Größenänderung mit {width=4.06cm} allein emittierte Pandoc 3.x \includegraphics[width=4.06cm,height=\textheight,keepaspectratio]. Das height=\textheight ist Pandocs Default für Single-Width-Specs. Mit keepaspectratio rendert das Bild zwar visuell auf 4,06 cm × 4,06 cm, aber die Image-Box hat layoutmäßig \textheight (~24 cm) Höhe — und LaTeX zieht die Tabellen-Zeile auf 24 cm Höhe auf, was den ganzen Header-Layout zerschießt (Foto oben, Text unten — beobachtet von Thomas). Fix: beide Dimensionen explizit in der Markdown-Image-Syntax: {width=4.06cm height=4.06cm}. Pandoc emittiert dann \includegraphics[width=4.06cm,height=4.06cm] ohne textheight-Anteil — saubere Box-Höhe.

C4 — PDF-Layout via Lua-Filter: Selbst nach C3 saß das Foto im PDF in der falschen vertikalen Position (oben aus der Cell herausragend). Ursache: Pandoc 3.x emittiert für die rechte Cell mit nur einem Image-Element KEINEN \begin{minipage}-Wrapper (im Gegensatz zu Pandoc 2.9), das Image landet direkt in der p{calc...}-Spalte. In dieser p-Spalte wirkt eine implizite \parbox[t]-Logik: die Baseline des Images (= unterer Bildrand) wird auf die Cell-Top-Linie gesetzt, das Bild ragt also nach OBEN aus der Cell heraus. Fix: Pandoc-Lua-Filter build/header-image-wrap.lua, der das Header-Foto im LaTeX-Output mit \hfill\raisebox{-\height}[0pt][0pt]{...} umschließt: \hfill schiebt das Bild rechtsbündig in der \raggedright-p-Spalte, \raisebox{-\height}[0pt][0pt] setzt die Bild-Top auf die Baseline (= Cell-Top) und reportet null Höhe an die Tabellen-Zeile, damit die Zeilenhöhe von der linken Zelle bestimmt wird. Filter-Trigger: nur bei FORMAT="latex" und nur für img.src mit „foto" im Namen. DOCX bleibt unberührt; das DOCX-Post-Processing macht das Pendant per <w:jc> und <w:spacing>.

C4a — Lua-Filter-Erste-Version (Image durch RawInline ersetzt) → Image-not-found: Die erste Filter-Version hat das gesamte Image-Element durch ein einzelnes RawInline ersetzt, mit dem Image-Pfad gebacken in den raw-LaTeX-String. Folge: Pandoc sah kein Image-Element mehr im AST und triggerte seine Resource-Path-Resolution nicht. LuaLaTeX scheiterte mit ! Package luatex.def Error: File 'foto-wrba_2026_6782_1.jpg' not found: using draft setting. Korrektur in der zweiten Version: Filter gibt eine Lua-Liste zurück, in der das Original-img-Element zwischen den beiden RawInline-Wrappern erhalten bleibt. So läuft Pandocs Image-Resource-Resolution weiterhin.

C4b — \nolinkurl{} in longtable-Minipage → \@xverbatim-Fehler: Pandoc emittiert für href-Links, deren Display-Text einer URL ähnelt (z.B. eine E-Mail-Adresse als Display und mailto:Adresse als Ziel), \nolinkurl{...} für Verbatim-Mode-Rendering. In einer longtable-Minipage bricht das mit ! Paragraph ended before \@xverbatim was complete. ab. Fix: \renewcommand{\nolinkurl}[1]{#1} direkt nach \hypersetup{} im Template — URL-Display-Text wird normaler Text statt Verbatim-Mode. Im CV mit Sans-Schrift sowieso erwünscht (kein Monospace-Display für E-Mail).

C4c — \titlespacing*{\section} für H1-Top-Alignment: Default-\titlespacing*{\section}{0pt}{1.4em}{0.5em} (zweite Zahl = before-space) lässt H1 um 1,4 em unter der Cell-Top beginnen. Cv.md hat nur ein einziges H1 (Header-Name), daher unschädlich, das vor-Spacing global auf 0 zu setzen: \titlespacing*{\section}{0pt}{0pt}{0.5em}. H1 startet jetzt direkt am Cell-Top, parallel zum Foto-Top.

C5 — Spaltenbreiten 112:60: Strich-Verhältnis ergibt 65,12% / 34,88% ≈ 10,15 / 5,43 cm bei 16 cm Textbreite. Thomas-Wunsch war exakt 10,66 / 5,73 cm (= 65,04% / 34,96%); meine kompakteste Variante mit Image-Markdown-Mindestbreite 60 Zeichen liegt 0,5 cm linke Spalte zu schmal vs. Wunsch, ist aber funktional korrekt: H1 in einer Zeile, E-Mail in einer Zeile, Foto-Rechtsrand bündig mit Textbereich-Rand. Thomas hat das so akzeptiert.

Build-System-Verbesserungen (S09):

  • build/build.ps1 um --lua-filter=$luaFilter in PDF- und DOCX-Pandoc-Calls erweitert.
  • Read-Host-Wait-on-Error aus build.ps1 entfernt — das blockierte AI-Agents/CI-Aufrufe. Stattdessen Start-Sleep -Seconds 3 am Ende bei Fehler, was menschliche Lesezeit ermöglicht und nicht blockt.
  • header-image-wrap.lua als Pflichtdatei in den Test-Path-Check aufgenommen.

Edit-Tool-Truncation-Vorfälle in S09 (vier weitere): beim Initial-Edit der Grid Table in cv.md, bei der \renewcommand{\nolinkurl}-Insertion in template.tex, beim Einbau des Read-Host-Blocks in build.ps1, und nochmals bei der Dezimalpunkt-Korrektur. Lehre verschärft: Edit-Tool für JEDE nicht-triviale Modifikation auf NTFS-Mount-Dateien meiden, generell Python-aus-git-HEAD- oder Python-aus-Disk-Pattern bevorzugen.

Sandbox-NTFS-Stale-Read auf DOCX-Output: Beim Versuch, das von Thomas erzeugte DOCX im Sandbox zu inspizieren, lieferte der Sandbox-Read das DOCX als „File is not a zip file" zurück (End-of-central-directory fehlte). Workaround: DOCX in der Sandbox aus cv.md neu generieren statt das Live-File zu lesen.

Build und visuelle Bestätigung durch Thomas (S09): DOCX und PDF zeigen Foto rechts oben, korrekt ausgerichtet, korrekt bemessen. Layout aus Thomas' Sicht akzeptiert.

Nächste Schritte

  1. DOCX-Mängel beheben: Blau-Ton der Headings ist nicht DesTEngS-Blau (Soll-Wert #3C68AE). Heading-Stile in build/build-reference-docx.py prüfen, ob die set_heading_colors-Funktion auf dem Stil greift oder ob Word den Theme-Color trotzdem als Aptos-Default rendert.
  2. Doublecheck der neu generierten Texte: Mindestens „elektrischer Gehäuse" ist sinnverkehrt (vermutlich aus den V9/V10-Iterationen entstanden). cv.md komplett auf Sinn- und Sprachfehler durchgehen.
  3. Buzzword-Kompetenzen-Brainstorm: Kenntnisse-Abschnitt erweitern. Mindestens „Umgang mit quantisierten LLMs" fehlt noch. Weitere KI-relevante Begriffe für das Agentur-Keyword-Matching identifizieren.
  4. PDF-Mängel beheben: Abstände zwischen H1, H2 „Kontaktdaten" und der Kontaktdaten-Bullet-Liste stimmen nicht (Folge der \titlespacing*{\section}{0pt}{0pt}{0.5em}-Änderung). Hellgraue Trennlinien (rulegray, #BFBFBF) sind inakzeptabel — Farbe oder Linienführung überdenken.
  5. Iteration D — Hyphenation-Feintuning für PDF: Kurze Wortteile am Zeilenanfang mit höherer Penalty oder gezielten \hyphenation-Ausnahmen reduzieren. Iterativ.
  6. Teilgebiet nach erfolgreichem Output und Freigabe durch Thomas abschließen (R2-OK von Thomas: Status auf „abgeschlossen" im zentral-index.md).

Artefakte

Aktive Pipeline-Dateien

  • artefakte/01-lebenslauf/source/cv.mdAktive Quelldatei (aufbauend auf V10, Draft-Marker entfernt).
  • artefakte/01-lebenslauf/source/foto-wrba_2026_6782_1.jpg — Portraitfoto (umbenannt, noch nicht in cv.md eingebunden).
  • artefakte/01-lebenslauf/templates/template.tex — Pandoc-LaTeX-Template für LuaLaTeX (Iteration A inkl. Pandoc-3.x-Hotfix \newcounter{none}).
  • artefakte/01-lebenslauf/templates/reference.docx — Pandoc-Reference-Doc, automatisch erzeugt durch build/build-reference-docx.py. Nicht von Hand editieren — Änderungen würden beim nächsten Skript-Lauf überschrieben.
  • artefakte/01-lebenslauf/build/build-reference-docx.py — Python-Skript zum Bauen der reference.docx (Iterationen B1, B1.5, B2, B3, B4.1 Heading-Farben). Manuell aufrufen, wenn Stile geändert werden sollen, danach normalen build.ps1 laufen.
  • artefakte/01-lebenslauf/build/post-process-docx.py — Python-Skript für DOCX-Post-Processing (B3.5 Listen-Bullet-Schutz, B4.4 H2-Trennlinien, B6 Bullet-Einzüge). Wird automatisch von build.ps1 als Schritt [3/3] aufgerufen.
  • artefakte/01-lebenslauf/build/build.ps1 — PowerShell-Build-Skript (PDF + DOCX + Post-Process) mit 3-Sekunden-Pause bei Fehler.
  • artefakte/01-lebenslauf/output/ — erzeugte Ausgaben plus build.log.

Historische Entwürfe (unter artefakte/01-lebenslauf/entwuerfe/)

  • cv-entwurf-v1.md bis cv-entwurf-v10.md — zehn iterative Entwürfe von Agent und Thomas, freigegeben mit V10.

Archiv (unter artefakte/01-lebenslauf/archiv/)

  • Lebenslauf_Dr-Ing_Thomas_Langer.docx, Lebenslauf_Dr-Ing_Thomas_Langer.pdf — alte docx-js-Ausgaben (dokumentieren die typographischen Mängel, dienen als Vergleichsreferenz für die neue Pipeline).
  • Lock- und Temp-Dateien von LibreOffice/docx-js als verwaiste Reste.