# Tasks Aufteilung: 1. Ursache feststellen (blockierend), 2. Testschicht, 3. Spec/README, 4. Serverseitiger Fix nur falls 1 ihn hergibt. ## 1. Ursache feststellen (Verifikation des Ist-Zustands) - [ ] 1.1 Jobpfad reproduzieren: Image bauen, Testcontainer mit `PRINTER_OPTIONS="BRColorMode=None TonerSaveMode=True"` starten, einen Job einreichen (`podman exec lp -d -o raw ` oder `cupsfilter `), und im versandten PostScript (`/var/spool/cups/d-*`, Job-Nummer aus `lpstat -W completed -o`) prüfen, ob der Tonerspar-Zweig (`statusdict/tonersave` … `true`) enthalten ist. Verifikation: Ergebnis (enthalten/nicht enthalten) mit dem ausgelesenen Spool-Pfad und der CUPS-Version in design.md notieren. - [ ] 1.2 Zweiten Messpunkt gegen die Queue-Defaults aufnehmen: denselben Job zusätzlich mit explizitem `-o BRColorMode=Vivid` einreichen und die `UseCIEColor`-Zeile im Spool mit der des ersten Jobs vergleichen. Verifikation: dokumentierter Unterschied (oder dessen Fehlen) zeigt, ob per-Job-Optionen im selben Pfad sichtbar werden — belegt, dass die Messmethode aus 1.1 trägt. - [ ] 1.3 Queue-Zustand desselben Containers gegengelesen: `lpoptions -p -l` (Sternchen) und `grep '^Default' /etc/cups/ppd/.ppd`. Verifikation: die Abweichung aus dem Ausgangsbefund ist entweder bestätigt (`*False` bei `DefaultTonerSaveMode True`) oder widerlegt; Ergebnis in design.md festhalten. - [ ] 1.4 Ergebnis einordnen und die Entscheidung nach Design D3 treffen: erreicht der Queue-Default den Job (Szenario in specs/… bleibt) oder nicht (design.md um das Resultat ergänzen, Szenario auf das verifizierte Verhalten umformulieren, Limitation explizit benennen). Verifikation: design.md enthält den Messwert und die getroffene Entscheidung; die betroffenen Tasks aus 2/3 sind entsprechend markiert. Ohne dieses Ergebnis werden 2.x/3.x nicht abgehakt. ## 2. Automatisierter Nachweis (neue Testschicht) - [ ] 2.1 `tests/test-queue-defaults.sh` anlegen: baut das Image, startet einen Container mit `PRINTER_OPTIONS="BRColorMode=Vivid TonerSaveMode=False"`, wartet auf `ready: CUPS on 631/tcp`, reicht einen Job ohne `print-quality`/Preset-Attribute ein und liest das letzte Spool-File (`lpstat -W completed -o` → `/var/spool/cups/d-*`). Verifikation: Skript läuft lokal durch (`bash tests/test-queue-defaults.sh`), Ausgabe zeigt den Spool-Pfad und die gefundenen PostScript-Zeilen. - [ ] 2.2 Assertions gemäß Ergebnis aus 1.4 einbauen: `UseCIEColor true` für den Queue-Default `Vivid` und der Tonerspar-Zustand aus dem verifizierten Verhalten für `TonerSaveMode=False`; zusätzlich muss die `UseCIEColor`-Zeile bei explizitem `-o BRColorMode=None` abweichen (Regressionsschutz). Vergleich nur über `grep -F` auf Zeilen, kein Parsen von PDF/PS-Struktur. Verifikation: Skript endet mit Exit 0 und einer PASS-Zeile pro Assertion; eine absichtlich falsch gesetzte Erwartung lässt es mit Exit ≠ 0 und Klartextzeile scheitern. - [ ] 2.3 Lebensdauer/Umgebung absichern: Container immer aufräumen (Trap), kurze Wiederholung des Spool-Lesens statt Polling, und im Skriptkopf die verifizierte CUPS-Version notieren. Verifikation: `podman ps -a` zeigt nach einem Lauf keinen Testcontainer; zweiter Lauf hintereinander ist grün. ## 3. Spec und README angleichen - [ ] 3.1 `README.md`, Abschnitt *Environment variables* / `PRINTER_OPTIONS`: eine Zeile ergänzen, was ein Queue-Default für den Ausdruck bedeutet (Queue-Default schlägt den PPD-Default, sichtbar im versandten PostScript), mit Verweis auf das Testskript. Verifikation: `grep -n 'PRINTER_OPTIONS' README.md` zeigt den neuen Satz; die genannte Assertion stimmt mit 2.2 überein. - [ ] 3.2 `entrypoint.sh`-Hinweis prüfen: der bestehende Kommentar bei `apply_printer_options` (Zeile ~341–345) behauptet, `lpadmin` würde unbekannte Zuweisungen speichern — mit dem Befund aus 1.x abgleichen und nur bei Bedarf präzisieren. Verifikation: `jj diff` zeigt entweder keine Änderung an entrypoint.sh oder ausschließlich Kommentar/Log-Text, ohne Verhaltensänderung. ## 4. Aktualisierung der Hauptspec (Archive-Zeitpunkt) - [ ] 4.1 Beim Archivieren die Delta-Spec nach `openspec/specs/printserver/cups/spec.md` übernehmen und dabei die alte Fassung des Requirements *Queue defaults are configurable at runtime* (Zeilen 69–89) durch die neue, job-beobachtbare Fassung ersetzen. Verifikation: `openspec validate --strict` ohne Findings; die Hauptspec enthält genau eine Fassung des Requirements.