# M4 - Arbeitspakete

## Geltungsbereich

Dieses Dokument beschreibt ausschließlich die Arbeitspakete für den definierten Meilenstein **M4 – Fingerprint, SQLite-Persistenz und Idempotenz**.

Die Meilensteine **M1**, **M2** und **M3** werden als vollständig umgesetzt vorausgesetzt.

Die Arbeitspakete sind bewusst so geschnitten, dass:

- **KI 1** daraus je Arbeitspaket einen klaren Einzel-Prompt ableiten kann,
- **KI 2** genau dieses eine Arbeitspaket in **einem Durchgang** vollständig umsetzen kann,
- nach **jedem** Arbeitspaket wieder ein **fehlerfreier, buildbarer Stand** vorliegt.

Die Reihenfolge der Arbeitspakete ist verbindlich.

## Zusätzliche Schnittregeln für die KI-Bearbeitung

- Pro Arbeitspaket nur die **minimal notwendigen Querschnitte** durch Domain, Application, Adapter und Bootstrap ändern.
- Keine Annahmen treffen, die nicht durch dieses Dokument oder die verbindlichen Spezifikationen gedeckt sind.
- Kein Vorgriff auf **M5+**.
- Kein Umbau bestehender M1–M3-Strukturen ohne direkten M4-Bezug.
- Neue Typen, Ports und Adapter so schneiden, dass sie aus einem einzelnen Arbeitspaket heraus **klar benennbar, testbar und reviewbar** sind.

## Explizit nicht Bestandteil von M4

- KI-Anbindung
- Prompt-Laden oder Prompt-Verarbeitung
- Validierung von KI-Antworten
- Dateinamensbildung
- Zielkopie in den Zielordner
- Windows-Zeichenbereinigung für Zieldateinamen
- physische Dublettenbehandlung im Zielordner
- M5+-Persistenzfelder wie Modellname, Prompt-Identifikator, KI-Rohantwort, KI-Reasoning, Datumsquelle, finaler Titel oder finaler Zieldateiname
- vollständige laufübergreifende Retry-Logik späterer Meilensteine für KI- und Zielkopie-Fehler
- Logging-Feinschliff des Endstands

## Verbindliche M4-Regeln für **alle** Arbeitspakete

### 1. Identifikation
- Die Identifikation eines Dokuments erfolgt in M4 **ausschließlich über den SHA-256-Fingerprint des Dateiinhalts**.
- Dateiname und Pfad dienen **nicht** als Identifikator.
- Gleicher Inhalt unter anderem Dateinamen oder anderem Pfad ist **dasselbe Dokument**.
- Geänderter Inhalt ist **ein neuer fachlicher Vorgang**.

### 2. Persistenzmodell
M4 führt die Persistenz verbindlich in **zwei Ebenen**:

1. **Dokument-Stammsatz** pro Fingerprint
2. **Versuchshistorie** mit einem Datensatz pro historisiertem dokumentbezogenem Verarbeitungsversuch

### 3. Minimale Pflichtdaten im Dokument-Stammsatz für M4
Im Dokument-Stammsatz müssen in M4 mindestens speicherbar sein:

- interne ID
- Fingerprint
- letzter bekannter Quellpfad
- letzter bekannter Quelldateiname
- aktueller Gesamtstatus
- Anzahl bisheriger Inhaltsfehler
- Anzahl bisheriger transienter Fehler
- letzter Fehlerzeitpunkt
- letzter Erfolgzeitpunkt
- Erstellungszeitpunkt
- Änderungszeitpunkt

**Nicht** Bestandteil von M4-Stammsatzfeldern sind Zielpfad, Zieldateiname oder KI-bezogene Felder.

### 4. Minimale Pflichtdaten der Versuchshistorie für M4
Für jeden in M4 zu historisierenden Versuch müssen mindestens speicherbar sein:

- Versuchs-ID
- Fingerprint-Referenz
- Lauf-ID
- Versuchsnummer
- Startzeitpunkt
- Endzeitpunkt
- Ergebnisstatus
- Fehlerklasse
- Fehlermeldung bzw. Begründung
- Retryable-Flag

### 5. Statusmodell für M4
Für M4 müssen folgende Statuswerte fachlich klar verwendbar sein:

- `SUCCESS`
- `FAILED_RETRYABLE`
- `FAILED_FINAL`
- `SKIPPED_ALREADY_PROCESSED`
- `SKIPPED_FINAL_FAILURE`

Ein technischer Zwischenstatus `PROCESSING` ist zusätzlich zulässig, aber für M4 nicht verpflichtend.

### 6. Verbindliche M4-Minimalregeln für Status und Zähler
Für M4 gelten **genau** diese Minimalregeln:

- Bereits erfolgreich verarbeitete Dokumente werden in späteren Läufen übersprungen.
- Bereits final fehlgeschlagene Dokumente werden in späteren Läufen übersprungen.
- Ein **deterministischer Inhaltsfehler aus M3**  
  - beim **ersten** historisierten Auftreten führt zu `FAILED_RETRYABLE`, erhöht den **Inhaltsfehlerzähler** auf 1 und setzt `retryable = true`,
  - beim **zweiten** historisierten Auftreten in einem späteren Lauf führt zu `FAILED_FINAL`, erhöht den **Inhaltsfehlerzähler** auf 2 und setzt `retryable = false`.
- In M4 sind die deterministischen Inhaltsfehler ausschließlich die bereits aus M3 bekannten Fälle:
  - kein brauchbarer Text
  - Seitenlimit überschritten
- Dokumentbezogene **technische** Fehler nach erfolgreicher Fingerprint-Ermittlung bleiben in M4 `FAILED_RETRYABLE`, erhöhen den **Transientfehlerzähler** und setzen `retryable = true`.
- Skip-Ereignisse ändern **keinen** Fehlerzähler.

### 7. Historisierung in M4
- Jeder **identifizierte** dokumentbezogene Verarbeitungsversuch wird separat historisiert.
- Die Versuchsnummer beginnt pro Fingerprint bei **1** und steigt pro historisiertem Versuch monoton um **1**.
- Auch Skip-Fälle werden historisiert:
  - `SKIPPED_ALREADY_PROCESSED`
  - `SKIPPED_FINAL_FAILURE`
- Ein in M4 historisierter Versuch setzt einen **erfolgreich ermittelten Fingerprint** voraus.
- Technische Fehler **vor** erfolgreicher Fingerprint-Ermittlung sind in M4 **keine** SQLite-historisierten Versuche; sie werden nur kontrolliert als dokumentbezogene Laufereignisse behandelt.

### 8. Reihenfolge pro Dokument in M4
Die Verarbeitung eines einzelnen Kandidaten erfolgt in M4 verbindlich in dieser Reihenfolge:

1. Fingerprint berechnen
2. Dokument-Stammsatz laden
3. bei `SUCCESS` Skip-Entscheidung treffen und Skip-Versuch historisieren
4. bei `FAILED_FINAL` Skip-Entscheidung treffen und Skip-Versuch historisieren
5. sonst bestehenden M3-Ablauf ausführen
6. M3-Ergebnis in M4-Status, Zähler und Retryable-Flag überführen
7. Versuch historisieren
8. Dokument-Stammsatz fortschreiben

### 9. Konsistenz pro identifiziertem Dokument
- Für jeden identifizierten dokumentbezogenen Versuch müssen **Versuchshistorie und Stammsatz konsistent** fortgeschrieben werden.
- Teilaktualisierungen zwischen Historie und Stammsatz sind zu vermeiden.
- Wenn die Persistenz eines dokumentbezogenen Versuchs technisch scheitert, darf **kein inkonsistenter Teilzustand** zurückbleiben.

### 10. Schema-Initialisierung
- Die Initialisierung des SQLite-Schemas erfolgt in M4 **beim Programmstart**, bevor der Batch-Lauf mit der Dokumentverarbeitung beginnt.
- Eine nur implizite oder ausschließlich lazy Initialisierung während des laufenden Dokumentdurchsatzes ist **nicht** Ziel von M4.

---

## AP-001 M4-Kernobjekte, Statussemantik und Port-Verträge präzisieren

### Voraussetzung
Keine. Dieses Arbeitspaket ist der M4-Startpunkt.

### Ziel
Die M4-relevanten Typen, Statusbedeutungen und Port-Verträge werden eindeutig eingeführt, damit spätere Arbeitspakete ohne Interpretationsspielraum implementiert werden können.

### Muss umgesetzt werden
- Neue M4-relevante Kernobjekte bzw. Application-nahe Typen anlegen, insbesondere für:
  - Dokument-Fingerprint
  - Dokument-Stammsatz
  - Verarbeitungsversuch
  - Fehlerzählerstände
  - dokumentbezogene Persistenzentscheidung bzw. Lookup-Ergebnis
  - technische Fehlerklassifikation für dokumentbezogene M4-Verarbeitung
- Statusmodell so vervollständigen oder schärfen, dass die verbindlichen M4-Statuswerte fachlich eindeutig abbildbar sind.
- Eindeutige Semantik für folgende Fälle im Typmodell bzw. in JavaDoc festlegen:
  - unbekanntes Dokument
  - bekanntes, noch nicht terminales Dokument
  - bereits erfolgreiches Dokument
  - bereits final fehlgeschlagenes Dokument
  - historisierbarer dokumentbezogener Versuch
  - nicht historisierbarer Vor-Fingerprint-Fehler
- Outbound-Ports definieren für:
  - Erzeugung eines Fingerprints für genau einen Verarbeitungskandidaten
  - Lesen und Schreiben des Dokument-Stammsatzes
  - Schreiben und Lesen der Versuchshistorie
  - technische Initialisierung des SQLite-Schemas
- Port-Verträge so schneiden, dass **weder `Path`/`File` noch JDBC-/SQLite-Typen** in Domain oder Application durchsickern.
- Port-Rückgaben so modellieren, dass spätere Arbeitspakete ohne zusätzliche Annahmen unterscheiden können:
  - Dokument unbekannt
  - Dokument bekannt und aktiv weiter zu verarbeiten
  - Dokument terminal erfolgreich
  - Dokument terminal final fehlgeschlagen
  - technischer Persistenzfehler
- JavaDoc und `package-info` für:
  - Statusbedeutungen
  - Zählersemantik
  - Historisierungsgrenzen
  - Architekturgrenzen
  ergänzen.

### Explizit nicht Teil
- SHA-256-Implementierung
- SQLite-Implementierung
- konkrete SQL-Tabellen
- Batch-Integration
- Repository-Code

### Fertig wenn
- die M4-relevanten Typen und Port-Verträge vorhanden sind,
- die M4-Statussemantik eindeutig dokumentiert ist,
- Historisierung vs. Vor-Fingerprint-Fehler klar abgegrenzt ist,
- Domain und Application frei von Infrastrukturtypen bleiben,
- der Build weiterhin fehlerfrei ist.

---

## AP-002 SHA-256-Fingerprint-Adapter für Verarbeitungskandidaten implementieren

### Voraussetzung
AP-001 ist abgeschlossen.

### Ziel
Für jeden Verarbeitungskandidaten kann ein stabiler, deterministischer SHA-256-Fingerprint erzeugt werden; technische Probleme werden kontrolliert in den Port-Vertrag überführt.

### Muss umgesetzt werden
- Fingerprint-Port technisch im Adapter-Out implementieren.
- SHA-256-basierte Fingerprint-Erzeugung für genau einen Verarbeitungskandidaten umsetzen.
- Sicherstellen, dass der Fingerprint ausschließlich aus dem **Dateiinhalt** abgeleitet wird.
- Kontrolliertes technisches Fehlerverhalten für mindestens folgende Fälle abbilden:
  - Datei nicht lesbar
  - Datei zwischen Kandidatenermittlung und Fingerprint-Erzeugung nicht mehr vorhanden
  - sonstige technische IO-Probleme
- Sicherstellen, dass Dateisystem- und Hashing-Details ausschließlich im Adapter-Out verbleiben.
- JavaDoc für Determinismus, Fehlerverhalten und M4-Grenze ergänzen, dass Vor-Fingerprint-Fehler **nicht** als SQLite-historisierte Versuche gelten.

### Explizit nicht Teil
- SQLite-Persistenz
- Batch-Orchestrierung
- Versuchshistorie
- Skip-Logik
- Zählerfortschreibung

### Fertig wenn
- für denselben Dateiinhalt stabil derselbe SHA-256-Fingerprint erzeugt wird,
- Fingerprint und Fehler kontrolliert über den Port geliefert werden,
- keine Hashing- oder Dateisystemdetails in Domain oder Application durchsickern,
- der Build weiterhin fehlerfrei ist.

---

## AP-003 SQLite-Schema, Start-Initialisierung und Persistenzbasis im Adapter-Out einführen

### Voraussetzung
AP-001 und AP-002 sind abgeschlossen.

### Ziel
Die SQLite-basierte Persistenzgrundlage für M4 wird technisch sauber eingeführt und beim Programmstart kontrolliert initialisiert.

### Muss umgesetzt werden
- SQLite-Dateizugriff im Adapter-Out technisch einführen.
- Technischen Initialisierungsbaustein für SQLite-Schema anlegen und über den dafür vorgesehenen Port anbinden.
- M4-Schema explizit in **zwei Ebenen** anlegen:
  - Dokument-Stammsatz
  - Versuchshistorie
- Tabellen, Primärschlüssel, Fremdschlüssel, Unique-Regeln und sinnvolle Indizes für den M4-Stand definieren.
- Dokument-Stammsatz so anlegen, dass die in diesem Dokument festgelegten M4-Pflichtfelder speicherbar sind.
- Versuchshistorie so anlegen, dass die in diesem Dokument festgelegten M4-Pflichtfelder speicherbar sind.
- Sicherstellen, dass:
  - Versuchsnummer pro Fingerprint eindeutig ist,
  - Skip-Versuche speicherbar sind,
  - keine M5+-Spalten angelegt werden.
- Die Schema-Initialisierung so vorbereiten, dass sie **beim Programmstart** explizit aufgerufen werden kann.
- JavaDoc für Schema-Zweck, Zwei-Ebenen-Modell und Initialisierungszeitpunkt ergänzen.

### Explizit nicht Teil
- Repository-Fachlogik
- Use-Case-Integration
- Statusübergänge im Batch-Lauf
- KI-bezogene Persistenzfelder
- Zielpfad- oder Dateinamenspersistenz

### Fertig wenn
- die SQLite-Datei und das M4-Schema technisch anlegbar sind,
- beide Persistenzebenen den M4-Pflichtumfang abbilden,
- die Start-Initialisierung technisch vorbereitet ist,
- keine M5+-Felder im Schema enthalten sind,
- der Stand fehlerfrei buildbar bleibt.

---

## AP-004 Repository für Dokument-Stammsatz mit vollständigem M4-Minimalumfang implementieren

### Voraussetzung
AP-003 ist abgeschlossen.

### Ziel
Der Dokument-Stammsatz kann pro Fingerprint zuverlässig gelesen, angelegt und fortgeschrieben werden, ohne fachliche Entscheidungslogik in den Adapter-Out zu verlagern.

### Muss umgesetzt werden
- Repository-Adapter für den Dokument-Stammsatz implementieren.
- Folgende technischen Fähigkeiten bereitstellen:
  - Suche eines Stammsatzes über Fingerprint
  - Neuanlage eines Stammsatzes für bisher unbekannte Dokumente
  - Fortschreibung von:
    - letztem bekanntem Quellpfad
    - letztem bekanntem Quelldateinamen
    - Gesamtstatus
    - Inhaltsfehlerzähler
    - Transientfehlerzähler
    - letztem Fehlerzeitpunkt
    - letztem Erfolgzeitpunkt
    - Änderungszeitpunkt
- Sicherstellen, dass die Repository-Operationen **keine** fachlichen Entscheidungen über Retry-Regeln oder Skip-Logik treffen.
- Mapping zwischen Application-Typen und SQLite-Struktur explizit und nachvollziehbar halten.
- Upsert-/Neuanlageverhalten für den M4-Einzelprozess reproduzierbar modellieren.
- JavaDoc für Verantwortlichkeit und Mapping ergänzen.

### Explizit nicht Teil
- Versuchshistorie
- Batch-Skip-Logik
- Versuchsnummernvergabe
- konkrete Statusentscheidungen im Use-Case
- KI- oder Zielkopie-bezogene Persistenz

### Fertig wenn
- der Dokument-Stammsatz pro Fingerprint zuverlässig gelesen und geschrieben werden kann,
- alle M4-Pflichtfelder des Stammsatzes technisch fortschreibbar sind,
- fachliche Entscheidungen nicht in das Repository abgerutscht sind,
- der Build weiterhin fehlerfrei ist.

---

## AP-005 Repository für Versuchshistorie mit monotoner Versuchsnummer implementieren

### Voraussetzung
AP-003 ist abgeschlossen.

### Ziel
Jeder historisierbare dokumentbezogene M4-Versuch kann separat und nachvollziehbar persistiert werden.

### Muss umgesetzt werden
- Repository-Adapter für die Versuchshistorie implementieren.
- Schreiben genau eines Versuchseintrags pro historisiertem dokumentbezogenem M4-Versuch umsetzen.
- Lesefähigkeiten bereitstellen, soweit sie für M4-Use-Case und Tests benötigt werden.
- Versuchsnummern pro Fingerprint reproduzierbar ableiten oder fortschreiben.
- Sicherstellen, dass die Versuchsnummer:
  - bei **1** beginnt,
  - pro Fingerprint monoton steigt,
  - auch bei Skip-Versuchen mitgezählt wird.
- M4-relevante Historisierungsdaten persistieren:
  - Fingerprint-Referenz
  - Lauf-ID
  - Versuchsnummer
  - Startzeitpunkt
  - Endzeitpunkt
  - Ergebnisstatus
  - Fehlerklasse
  - Fehlermeldung bzw. Begründung
  - Retryable-Flag
- Sicherstellen, dass nur **identifizierte** Dokumente historisiert werden.
- JavaDoc für Historisierungszweck, Versuchsnummernlogik und M4-Grenzen ergänzen.

### Explizit nicht Teil
- Dokument-Stammsatz
- fachliche Zählerlogik
- Batch-Orchestrierung
- KI-Rohantwort, Modellname oder Prompt-Identifikator
- Zielname, Zielpfad oder Zielkopie

### Fertig wenn
- pro historisiertem dokumentbezogenem Verarbeitungsvorgang ein separater Versuchseintrag gespeichert werden kann,
- die Versuchsnummern pro Fingerprint reproduzierbar und monoton sind,
- Skip-Versuche historisierbar sind,
- Vor-Fingerprint-Fehler nicht fälschlich historisiert werden,
- der Stand fehlerfrei buildbar bleibt.

---

## AP-006 M4-Entscheidungslogik und Batch-Integration für Idempotenz, Zähler und konsistente Persistenz umsetzen

### Voraussetzung
AP-001 bis AP-005 sind abgeschlossen.

### Ziel
Der bestehende M3-Verarbeitungslauf wird zu einem echten M4-Lauf erweitert, der Dokumente über Fingerprint wiedererkennt, Status und Zähler korrekt fortschreibt, Skip-Fälle historisiert und dabei keinen inkonsistenten Persistenzzustand hinterlässt.

### Muss umgesetzt werden
- Den bestehenden Batch-Use-Case so erweitern, dass pro Verarbeitungskandidat verbindlich diese Reihenfolge gilt:
  1. Fingerprint erzeugen
  2. Dokument-Stammsatz laden
  3. terminale Fälle entscheiden
  4. gegebenenfalls bestehenden M3-Ablauf ausführen
  5. Ergebnis in M4-Status, Zähler und Retryable-Flag überführen
  6. Versuch historisieren
  7. Dokument-Stammsatz fortschreiben
- Folgende M4-Regeln explizit umsetzen:
  - vorhandener Gesamtstatus `SUCCESS` → Dokument wird nicht erneut fachlich verarbeitet, sondern mit `SKIPPED_ALREADY_PROCESSED` historisiert
  - vorhandener Gesamtstatus `FAILED_FINAL` → Dokument wird nicht erneut fachlich verarbeitet, sondern mit `SKIPPED_FINAL_FAILURE` historisiert
  - unbekanntes oder noch nicht terminales Dokument wird regulär weiterverarbeitet
- M3-Ergebnisse exakt wie folgt in M4 überführen:
  - M3 erfolgreich abgeschlossen → `SUCCESS`, keine Fehlerzähler erhöhen, `retryable = false`
  - M3-Inhaltsfehler „kein brauchbarer Text“ oder „Seitenlimit überschritten“ beim ersten historisierten Auftreten → `FAILED_RETRYABLE`, Inhaltsfehlerzähler +1, `retryable = true`
  - derselbe Dokumenttyp eines bereits identifizierten Dokuments mit erneutem deterministischen Inhaltsfehler in einem späteren Lauf → `FAILED_FINAL`, Inhaltsfehlerzähler +1, `retryable = false`
  - dokumentbezogener technischer Fehler nach erfolgreicher Fingerprint-Ermittlung → `FAILED_RETRYABLE`, Transientfehlerzähler +1, `retryable = true`
- Skip-Fälle so behandeln, dass:
  - ein eigener Versuchseintrag geschrieben wird,
  - kein Fehlerzähler verändert wird,
  - der Gesamtstatus des Stammsatzes terminal bestehen bleibt.
- Vor-Fingerprint-Fehler ausdrücklich **nicht** als SQLite-Versuch historisieren.
- Für identifizierte Dokumente sicherstellen, dass **Historie und Stammsatz konsistent** fortgeschrieben werden und keine inkonsistenten Teilzustände entstehen.
- Falls eine dokumentbezogene Persistenzoperation technisch scheitert:
  - darf kein teilaktualisierter Zustand zurückbleiben,
  - bleibt der Batch-Lauf für andere Dokumente kontrolliert weiter lauffähig,
  - wird kein M5+-Verhalten vorweggenommen.
- JavaDoc für Idempotenz, Zählerfortschreibung, Skip-Semantik und Persistenzkonsistenz ergänzen.

### Explizit nicht Teil
- KI-Aufruf
- Dateinamensbildung
- Zielkopie
- M5+-Retry-Regeln für KI- oder Zielkopiefehler
- M5+-Persistenzfelder
- spätere Reporting- oder Auswertungslogik

### Fertig wenn
- der Batch-Lauf identische Inhalte über Fingerprint wiedererkennt,
- `SUCCESS`- und `FAILED_FINAL`-Dokumente in späteren Läufen historisiert übersprungen werden,
- die Minimalregel „erster deterministischer Inhaltsfehler retryable, zweiter final“ explizit umgesetzt ist,
- technische dokumentbezogene Fehler nach Fingerprint als retryable behandelt werden,
- Historie und Stammsatz pro identifiziertem Dokument konsistent fortgeschrieben werden,
- weiterhin keine M5+-Funktionalität enthalten ist.

---

## AP-007 Bootstrap- und CLI-Anpassungen für SQLite-Konfiguration, Start-Initialisierung und M4-Verdrahtung durchführen

### Voraussetzung
AP-001 bis AP-006 sind abgeschlossen.

### Ziel
Der Programmeinstieg ist sauber an den M4-Lauf angepasst; die Persistenz wird beim Start initialisiert und die neuen M4-Bausteine sind vollständig verdrahtet.

### Muss umgesetzt werden
- Bootstrap-Verdrahtung auf die neuen M4-Ports, Adapter und Persistenzbausteine erweitern.
- M4-relevante Konfiguration ergänzen bzw. verdrahten, insbesondere für:
  - `sqlite.file`
- Startvalidierung so ergänzen, dass mindestens geprüft wird:
  - SQLite-Dateipfad ist vorhanden oder technisch anlegbar
  - Persistenzkonfiguration ist nutzbar
- Technische Schema-Initialisierung **beim Programmstart** ausführen, bevor der eigentliche Dokumentlauf beginnt.
- CLI-/Batch-Startpfad auf den realen M4-Ablauf ausrichten.
- Sicherstellen, dass harte Start-, Verdrahtungs- oder Initialisierungsfehler weiterhin zu **Exit-Code 1** führen.
- Sicherstellen, dass dokumentbezogene Fehler im späteren Lauf **nicht** als Startfehler fehlmodelliert werden.
- M1–M3-Grundverhalten erhalten und sauber mit den M4-Bausteinen kombinieren.
- JavaDoc und `package-info` für aktualisierte Verdrahtung, Konfiguration und Modulgrenzen ergänzen.

### Explizit nicht Teil
- neue Exit-Code-Semantik späterer Meilensteine
- KI-Verdrahtung
- Zielordner- oder Dateinamensverdrahtung
- Logging-Feinschliff

### Fertig wenn
- das Programm im M4-Stand vollständig startbar ist,
- das SQLite-Schema beim Start kontrolliert initialisiert wird,
- die neuen Adapter korrekt verdrahtet sind,
- harte Persistenz-Startfehler kontrolliert zu Exit-Code 1 führen,
- der Build fehlerfrei bleibt.

---

## AP-008 Tests für Fingerprint, SQLite-Repositories, M4-Statusfortschreibung, Historie und Skip-Logik vervollständigen

### Voraussetzung
AP-001 bis AP-007 sind abgeschlossen.

### Ziel
Der vollständige M4-Zielzustand wird automatisiert abgesichert und als konsistenter Übergabestand nachgewiesen.

### Muss umgesetzt werden
- Unit-Tests für die SHA-256-Fingerprint-Erzeugung implementieren.
- Repository-Tests gegen SQLite implementieren, insbesondere für:
  - Schema-Initialisierung
  - Anlegen und Lesen eines Dokument-Stammsatzes
  - Fortschreiben aller M4-Pflichtfelder des Stammsatzes
  - Anlegen und Lesen von Versuchshistorie
  - stabile Versuchsnummern pro Fingerprint
- Tests für M4-Statusfortschreibung und Zähler ergänzen, insbesondere:
  - unbekanntes Dokument mit erfolgreichem M4-Ende wird als `SUCCESS` persistiert
  - erster deterministischer Inhaltsfehler führt zu `FAILED_RETRYABLE`
  - zweiter deterministischer Inhaltsfehler in einem späteren Lauf führt zu `FAILED_FINAL`
  - technischer dokumentbezogener Fehler nach erfolgreicher Fingerprint-Ermittlung erhöht den Transientfehlerzähler und bleibt `FAILED_RETRYABLE`
  - Skip-Fälle verändern keine Fehlerzähler
- Tests für Idempotenz- und Skip-Logik ergänzen, insbesondere:
  - bereits erfolgreiches Dokument wird historisiert übersprungen
  - final fehlgeschlagenes Dokument wird historisiert übersprungen
  - gleicher Inhalt unter anderem Dateinamen wird über denselben Fingerprint erkannt
- Tests ergänzen, die belegen:
  - pro identifiziertem dokumentbezogenem Verarbeitungsvorgang entsteht genau **ein** Historieneintrag
  - Skip-Ereignisse werden historisiert
  - Vor-Fingerprint-Fehler nicht in SQLite-Historie auftauchen
- Tests für Bootstrap- und Startverhalten ergänzen, insbesondere:
  - Schema-Initialisierung beim Start
  - harter Persistenz-Startfehler führt zu Exit-Code 1
- Den M4-Stand abschließend auf Konsistenz, Architekturtreue und Nicht-Vorgriff auf M5+ prüfen.

### Explizit nicht Teil
- Tests für KI, Prompt-Laden oder KI-JSON
- Tests für Zielkopie oder Dateinamensbildung
- Tests für M5+-Persistenzfelder
- Tests für vollständige Retry-Logik späterer Meilensteine

### Fertig wenn
- die Test-Suite für den M4-Umfang grün ist,
- die wichtigsten M4-Randfälle automatisiert abgesichert sind,
- der definierte M4-Zielzustand vollständig erreicht ist,
- ein fehlerfreier, übergabefähiger Stand vorliegt.

---

## Abschlussbewertung

Die Arbeitspakete decken den vollständigen M4-Zielumfang aus den verbindlichen Spezifikationen ab:

- Fingerprint über SHA-256
- SQLite-Persistenz in zwei Ebenen
- Dokument-Stammsatz mit M4-Minimalumfang
- Versuchshistorie pro identifiziertem dokumentbezogenem Versuch
- Idempotenz über Fingerprint
- Skip-Regeln für bereits erfolgreiche und final fehlgeschlagene Dokumente
- explizite Minimalregel für deterministische Inhaltsfehler in M4
- Tests für Fingerprint, Persistenz, Statusfortschreibung, Historie und Skip-Logik

Gleichzeitig bleiben die Grenzen zu M1–M3 sowie zu M5+ gewahrt. Insbesondere werden **keine** KI-Funktionalitäten, **keine** Dateinamensbildung und **keine** Zielkopie vorweggenommen.
