335 lines
14 KiB
Markdown
335 lines
14 KiB
Markdown
# Meilensteine – KI-gestützte Umbenennung OCR-verarbeiteter PDFs
|
||
|
||
## Grundsätze für alle Meilensteine
|
||
|
||
- Jeder Meilenstein liefert einen **in sich geschlossenen, lauffähigen Entwicklungsstand**.
|
||
- Jeder Meilenstein umfasst **Implementierung, Konfiguration, JavaDoc und Tests**, soweit für den jeweiligen Stand sinnvoll.
|
||
- Die Lösung wird von Beginn an in **strenger hexagonaler Architektur** umgesetzt.
|
||
- Jeder Meilenstein baut auf dem vorherigen Stand auf, ohne Architekturbrüche oder provisorische Seiteneffekte zu erzeugen.
|
||
- Die Meilensteine bilden zusammen vollständig die fachlichen Anforderungen sowie das technische Zielbild ab.
|
||
- Fachliche Entscheidungen werden nicht in technische Adapter verschoben, technische Infrastruktur nicht in die Domain.
|
||
|
||
---
|
||
|
||
## M1 – Vollständiges Maven-Projekt und technisches Grundgerüst
|
||
|
||
### Ziel
|
||
Erstellung eines vollständig lauffähigen Multi-Modul-Maven-Projekts als stabile Basis der Gesamtentwicklung.
|
||
|
||
### Inhalt
|
||
- vollständige Maven-Projektstruktur in strenger Hexagonal-Architektur erstellen:
|
||
- `domain`
|
||
- `application`
|
||
- `adapter-in`
|
||
- `adapter-out`
|
||
- `bootstrap`
|
||
- Parent-POM mit `packaging=pom` anlegen
|
||
- Modul-POMs vollständig konfigurieren
|
||
- alle benötigten Dependencies fest einbinden, insbesondere für:
|
||
- Log4j2
|
||
- Apache PDFBox
|
||
- SQLite JDBC
|
||
- OpenAI-kompatiblen HTTP-Zugriff
|
||
- JSON-Verarbeitung
|
||
- Test-Frameworks
|
||
- benötigte Maven-Plugins vollständig konfigurieren, insbesondere für:
|
||
- Compiler
|
||
- Surefire
|
||
- Enforcer
|
||
- Shade im Bootstrap-Modul
|
||
- Logging-Konfiguration mit Log4j2 anlegen
|
||
- lauffähigen Bootstrap-Einstiegspunkt bereitstellen
|
||
- `.properties`-Konfiguration grundlegend laden
|
||
- Grundvalidierung der Startkonfiguration vorsehen
|
||
- Build-, Start- und Testfähigkeit herstellen
|
||
|
||
### Lauffähiger Stand
|
||
- das Projekt baut vollständig mit Maven
|
||
- das ausführbare JAR startet erfolgreich
|
||
- Logging funktioniert
|
||
- Konfiguration wird geladen oder sauber validiert
|
||
- das Programm beendet sich kontrolliert ohne fachliche Verarbeitung
|
||
|
||
### Tests
|
||
- Build-/Smoke-Test für Programmstart
|
||
- Tests für Konfigurationsladen und Grundvalidierung
|
||
- Tests für Logging-/Bootstrap-Grundverhalten, soweit sinnvoll
|
||
|
||
---
|
||
|
||
## M2 – Hexagonaler Kern, Batch-Startfall und Startschutz
|
||
|
||
### Ziel
|
||
Der fachliche Kern, der Batch-Einstieg und der technische Startschutz sind sauber modelliert, jedoch noch ohne vollständige Dokumentverarbeitung.
|
||
|
||
### Inhalt
|
||
- Domain-Objekte und Statusmodell anlegen
|
||
- zentrale Ports definieren
|
||
- zentralen Inbound-Use-Case für den Batch-Lauf implementieren
|
||
- CLI-/Batch-Adapter implementieren
|
||
- Bootstrap-Verdrahtung vervollständigen
|
||
- Run-Lock-Port und erste Lock-Implementierung einführen
|
||
- Lauf-ID-Konzept einführen
|
||
- Exit-Code-Grundverhalten vorbereiten:
|
||
- `0` für technisch ordnungsgemäß ausgeführten Lauf
|
||
- `1` für harte Start-/Bootstrap-Fehler
|
||
- JavaDoc für Architekturgrenzen, Ports und zentrale Typen ergänzen
|
||
|
||
### Lauffähiger Stand
|
||
- das Programm startet als Batch-Prozess
|
||
- Lauf-Sperre wird gesetzt und freigegeben
|
||
- eine zweite Instanz beendet sich kontrolliert sofort
|
||
- der Use-Case wird über den Inbound-Adapter erreicht
|
||
- Architekturgrenzen sind technisch sichtbar und eingehalten
|
||
- noch keine echte PDF-Verarbeitung, aber kontrollierter Batch-Ablauf vorhanden
|
||
|
||
### Tests
|
||
- Unit-Tests für Domain-Objekte und Statusmodell
|
||
- Tests für Lock-Verhalten
|
||
- Tests für Bootstrap- und Use-Case-Verdrahtung
|
||
- Tests für Exit-Code-Verhalten bei Startschutz- und Bootstrap-Fehlern, soweit in diesem Stand sinnvoll
|
||
|
||
---
|
||
|
||
## M3 – Dateisystemzugriff, Kandidatenermittlung und PDF-Textauslese
|
||
|
||
### Ziel
|
||
Der Batch-Prozess kann PDFs im Quellordner finden, fachlich als Verarbeitungskandidaten behandeln sowie Text und Seitenzahl extrahieren.
|
||
|
||
### Inhalt
|
||
- Dateisystem-Adapter für Quellordnerzugriff implementieren
|
||
- PDF-Dateifilter gemäß fachlicher Regeln umsetzen
|
||
- PDFBox-Adapter zur Textauslese implementieren
|
||
- Seitenzahlermittlung integrieren
|
||
- Prüfung auf „brauchbaren Text“ umsetzen
|
||
- konfigurierbares Seitenlimit einführen
|
||
- erste Dateiobjekte und Metadatenfluss im Use-Case herstellen
|
||
- sicherstellen, dass bei fehlendem brauchbarem Text oder überschrittenem Seitenlimit **kein KI-Aufruf** erfolgt
|
||
- JavaDoc für Adapter, Fehlerfälle und Kandidatenbegriff ergänzen
|
||
|
||
### Lauffähiger Stand
|
||
- das Programm scannt den Quellordner
|
||
- passende PDFs werden erkannt
|
||
- Text und Seitenzahl werden extrahiert
|
||
- Dateien ohne brauchbaren Text oder oberhalb des Seitenlimits werden erkannt und protokolliert
|
||
- diese Fälle werden als deterministische Inhaltsfehler behandelt
|
||
- noch keine KI-Anbindung und noch keine Ergebnisdatei
|
||
|
||
### Tests
|
||
- Unit-Tests für PDF-Filterlogik
|
||
- Tests für Textauslese und Seitenzahlerkennung
|
||
- Tests für Fehlerfälle „kein brauchbarer Text“ und „Seitenlimit überschritten“
|
||
- Tests dafür, dass in diesen Fehlerfällen kein KI-Aufruf stattfindet
|
||
|
||
---
|
||
|
||
## M4 – Fingerprint, SQLite-Persistenz und Idempotenz
|
||
|
||
### Ziel
|
||
Die Anwendung kann verarbeitete Dateien stabil wiedererkennen, Bearbeitungszustände dauerhaft speichern und jeden Verarbeitungsversuch nachvollziehbar historisieren.
|
||
|
||
### Inhalt
|
||
- Fingerprint-Port und SHA-256-basierte Implementierung einführen
|
||
- SQLite-Schema vollständig implementieren
|
||
- Persistenzmodell explizit in **zwei Ebenen** umsetzen:
|
||
- Dokument-Stammsatz pro Fingerprint
|
||
- Versuchshistorie mit einem Datensatz pro Verarbeitungsversuch
|
||
- Statusmodell persistent nutzbar machen
|
||
- Retry-Zähler und Fehlstatus speichern
|
||
- Regeln für „bereits erfolgreich verarbeitet“ und „final fehlgeschlagen“ umsetzen
|
||
- Versuchshistorie explizit mit mindestens folgenden technischen Metadaten anlegen:
|
||
- Lauf-ID
|
||
- Versuchsnummer
|
||
- Start- und Endzeitpunkt
|
||
- Ergebnisstatus
|
||
- Fehlerklasse
|
||
- Fehlermeldung bzw. fachliche/systemische Begründung
|
||
- Retryable-Flag
|
||
- JavaDoc für Persistenzmodell, Statusübergänge und Idempotenz ergänzen
|
||
|
||
### Lauffähiger Stand
|
||
- das Programm erkennt identische Quelldateien über Fingerprint wieder
|
||
- erfolgreich verarbeitete Dateien werden in späteren Läufen übersprungen
|
||
- final fehlgeschlagene Dateien werden in späteren Läufen übersprungen
|
||
- Bearbeitungsstände werden in SQLite gespeichert
|
||
- jeder Verarbeitungsversuch wird separat historisiert
|
||
- der Batch-Lauf ist idempotent gegenüber Wiederholungen
|
||
- noch keine KI-Anbindung und noch keine Zielkopie
|
||
|
||
### Tests
|
||
- Unit-Tests für Fingerprint-Erzeugung
|
||
- Repository-Tests gegen SQLite
|
||
- Tests für Statusübergänge, Retry-Zähler und Skip-Logik
|
||
- Tests für Versuchshistorie pro Lauf und pro Versuch
|
||
|
||
---
|
||
|
||
## M5 – KI-Integration, Prompt-Bezug und validierter Benennungsvorschlag
|
||
|
||
### Ziel
|
||
Die Anwendung kann aus extrahiertem PDF-Text per KI einen validierten Benennungsvorschlag erzeugen und alle KI-bezogenen Nachvollziehbarkeitsdaten persistent festhalten.
|
||
|
||
### Inhalt
|
||
- externe Prompt-Datei laden und versionierbar anbinden
|
||
- OpenAI-kompatiblen HTTP-Adapter implementieren
|
||
- Basis-URL, Modellname, Timeout und API-Zugriff vollständig konfigurierbar machen
|
||
- Priorität Umgebungsvariable vor Properties für API-Key umsetzen
|
||
- Begrenzung des an die KI gesendeten Inhalts umsetzen
|
||
- parsebares JSON-Ergebnis mit `date`, `title`, `reasoning` verarbeiten
|
||
- Validierung umsetzen:
|
||
- `title` ist verpflichtend
|
||
- `reasoning` ist verpflichtend
|
||
- `date` ist optional
|
||
- fachliche Validierung für Datum und Titel umsetzen
|
||
- falls die KI **kein** belastbares Datum liefert, den Fallback **durch die Anwendung** über die technische Uhr/Clock vorsehen
|
||
- unbrauchbare KI-Antworten als Fehlerfälle behandeln
|
||
- Versuchshistorie um KI-Nachvollziehbarkeit explizit erweitern, insbesondere um:
|
||
- Modellname
|
||
- Prompt-Identifikator oder Prompt-Dateiname
|
||
- verarbeitete Seitenzahl
|
||
- an KI gesendete Zeichenzahl
|
||
- KI-Rohantwort
|
||
- KI-Reasoning
|
||
- aufgelöstes Datum
|
||
- Datumsquelle
|
||
- JavaDoc für KI-Port, Antwortvalidierung und Datumsauflösung ergänzen
|
||
|
||
### Lauffähiger Stand
|
||
- das Programm kann für verarbeitbare PDFs einen gültigen Benennungsvorschlag erzeugen
|
||
- gültige und ungültige KI-Antworten werden korrekt unterschieden
|
||
- bei fehlendem belastbarem KI-Datum wird das Datum durch die Anwendung als Fallback aufgelöst
|
||
- KI-Nachvollziehbarkeit ist persistent gespeichert
|
||
- noch keine physische Zielkopie, aber der vollständige Benennungsvorschlag ist verfügbar und gespeichert
|
||
|
||
### Tests
|
||
- Unit-Tests für Response-Validierung
|
||
- Tests für Prompt-Laden und Konfigurationsauflösung
|
||
- Tests für Fehlerfälle wie Timeout, ungültiges JSON und unbrauchbaren Titel
|
||
- Tests für Datums-Fallback durch die Anwendung
|
||
- Mock-/Adapter-Tests für den KI-Port
|
||
|
||
---
|
||
|
||
## M6 – Dateinamensbildung, Dublettenbehandlung und Zielkopie
|
||
|
||
### Ziel
|
||
Der vollständige Erfolgspfad wird umgesetzt: Aus KI-Ergebnis und technischer Datumsauflösung wird ein zulässiger Zielname erzeugt und eine Kopie im Zielordner abgelegt.
|
||
|
||
### Inhalt
|
||
- technische Dateinamensbildung implementieren
|
||
- verbindliches Zielformat umsetzen: `YYYY-MM-DD - Titel.pdf`
|
||
- Windows-Zeichenbereinigung ergänzen
|
||
- Titellängenregel für den **Basistitel** umsetzen
|
||
- feste deutsche Titelregeln technisch absichern
|
||
- fachliche Titelregel „keine Sonderzeichen außer Leerzeichen“ technisch absichern
|
||
- Dubletten-Suffix `(1)`, `(2)` usw. implementieren
|
||
- Zielordnerprüfung und Zielpfadbildung vervollständigen
|
||
- Kopierlogik in den Zielordner implementieren
|
||
- temporäre Zieldatei mit finalem Rename bzw. atomisches Schreiben umsetzen, soweit möglich
|
||
- Erfolgsstatus erst nach erfolgreichem Schreiben **und** erfolgreicher Persistenz setzen
|
||
- finalen Zieldateinamen und Zielpfad persistent speichern
|
||
- JavaDoc für Dateinamensregeln, Dubletten und Zielerzeugung ergänzen
|
||
|
||
### Lauffähiger Stand
|
||
- das Programm verarbeitet PDFs Ende-zu-Ende erfolgreich
|
||
- bei Erfolg entsteht eine korrekt benannte Kopie im Zielordner
|
||
- die Quelldatei bleibt unverändert erhalten
|
||
- Dubletten werden korrekt ab `(1)` behandelt
|
||
- Erfolgsstatus, Zieldateiname und Zielpfad werden konsistent gespeichert
|
||
|
||
### Tests
|
||
- Unit-Tests für Dateinamensbildung und Dubletten-Suffixe
|
||
- Tests für technische Zeichenbereinigung
|
||
- Tests für Basistitel-Längenregel und Zielformat
|
||
- integrationsnahe Tests für Zielkopie und Erfolgsstatus
|
||
|
||
---
|
||
|
||
## M7 – Fehlerbehandlung, Retry-Logik, Logging und betriebliche Robustheit
|
||
|
||
### Ziel
|
||
Die Lösung wird robust gegen typische Fehlerfälle und verhält sich in wiederholten Task-Scheduler-Läufen stabil, nachvollziehbar und konsistent.
|
||
|
||
### Inhalt
|
||
- fachliche Retry-Logik über spätere Läufe vollständig umsetzen
|
||
- deterministische Inhaltsfehler mit genau **1 Retry** in späterem Lauf umsetzen
|
||
- transiente technische Fehler mit Retry bis zum konfigurierten Maximalwert umsetzen
|
||
- finalen Fehlerstatus nach Ausschöpfen der jeweiligen Retry-Regeln umsetzen
|
||
- Sofort-Wiederholversuch nur für Schreibfehler der Zielkopie implementieren
|
||
- Skip-Logik für bereits erfolgreich verarbeitete und final fehlgeschlagene Dateien vervollständigen
|
||
- Logging auf den final geforderten Mindestumfang bringen, insbesondere mit:
|
||
- Laufstart
|
||
- Laufende
|
||
- Lauf-ID
|
||
- erkannte Quelldatei
|
||
- Überspringen bereits erfolgreicher Dateien
|
||
- Überspringen final fehlgeschlagener Dateien
|
||
- erzeugter Zielname
|
||
- Retry-Entscheidung
|
||
- Fehler mit Klassifikation
|
||
- Sensibilitätsregel für Logs umsetzen:
|
||
- vollständige KI-Rohantwort standardmäßig **nicht** ins Log
|
||
- vollständige KI-Rohantwort **in SQLite**
|
||
- Ausgabe sensibler Inhalte konfigurierbar
|
||
- Exit-Code-Verhalten finalisieren:
|
||
- `0` auch bei Teilfehlern einzelner Dateien, solange der Lauf technisch ordnungsgemäß ausgeführt wurde
|
||
- `1` nur bei harten Start-/Bootstrap-Fehlern
|
||
- Konfigurationsvalidierung vervollständigen
|
||
- Fehlernachvollziehbarkeit in Logs und SQLite konsistent machen
|
||
- JavaDoc zu Fehlersemantik, Retry-Regeln, Exit-Codes und Logging ergänzen
|
||
|
||
### Lauffähiger Stand
|
||
- die Anwendung verhält sich in Erfolg, Teilfehlern und Endfehlern stabil
|
||
- wiederholte Scheduler-Läufe führen zu keinem inkonsistenten Verhalten
|
||
- Fehler einzelner Dateien blockieren nicht den Gesamtlauf
|
||
- Retry-Zähler, Endstatus und Überspringen funktionieren konsistent
|
||
- Exit-Code und Logging entsprechen dem definierten Betriebsmodell
|
||
|
||
### Tests
|
||
- Tests für Retry-Abläufe über mehrere Läufe
|
||
- Tests für finale Fehlerzustände
|
||
- Tests für Skip-Logik bei bereits verarbeiteten Dateien
|
||
- Tests für Sofort-Wiederholversuch bei Zielkopierfehlern
|
||
- Tests für Logging-Sensibilitätsregel, soweit automatisierbar
|
||
- Tests für Konfigurationsfehler und finales Exit-Code-Verhalten
|
||
|
||
---
|
||
|
||
## M8 – Abschlussmeilenstein: Qualitätssicherung, Feinschliff und vollständige Entwicklungsfreigabe
|
||
|
||
### Ziel
|
||
Die Entwicklung wird vollständig abgeschlossen und der Gesamtstand auf Produktionsreife innerhalb des definierten Projektumfangs gebracht.
|
||
|
||
### Inhalt
|
||
- Review aller Architekturgrenzen und Sicherstellung der strengen Hexagonal-Architektur
|
||
- Abgleich aller Meilenstein-Ergebnisse mit Fachlichkeit sowie Technik/Architektur
|
||
- letzte technische und fachliche Restlücken schließen
|
||
- JavaDoc vervollständigen
|
||
- Testabdeckung gezielt vervollständigen
|
||
- Konfigurationsbeispiel und Startdokumentation konsolidieren
|
||
- Logging- und Fehlermeldungen sprachlich und inhaltlich schärfen
|
||
- letzte Inkonsistenzen in Statusmodell, Persistenz und Adapterverhalten bereinigen
|
||
- End-to-End-Gesamtprüfung des vollständigen Soll-Ablaufs durchführen
|
||
|
||
### Lauffähiger Stand
|
||
- die Lösung ist innerhalb des definierten Umfangs vollständig implementiert
|
||
- alle Kernanforderungen aus Fachlichkeit sowie Technik/Architektur sind umgesetzt
|
||
- der Stand ist stabil, testbar, dokumentiert und für den geplanten Betrieb bereit
|
||
|
||
### Tests
|
||
- vollständige End-to-End-Tests, soweit im Projekt sinnvoll automatisierbar
|
||
- Regressionstests für Kernregeln
|
||
- Konsistenztests für Persistenz, Dateinamensbildung, Retry-Logik und Skip-Verhalten
|
||
- abschließende Smoke-Tests für Build, Start und Batch-Lauf
|
||
|
||
---
|
||
|
||
## Abschlussbewertung
|
||
|
||
Die Meilensteine sind mit diesem Stand:
|
||
|
||
- vollständig auf das fachliche Zielbild ausgerichtet
|
||
- mit dem technischen Architekturziel konsistent
|
||
- widerspruchsfrei und logisch aufeinander aufbauend
|
||
- für eine schrittweise produktive Umsetzung geeignet
|