Trading-Plattform-Pruefung: Nachtrag nach der kritischen Pruefung (Paket NR, Task 746) und LIESMICH (Task 745)

abendkontrolle.py: Die Unterzeile zu einer nicht geschriebenen Ergebnisdatei sagt nur
noch, wann ein spaeterer Lauf ohne --tag den Tag erneut prueft (Werktag ab dem ersten
Prueftag des Teils, hoechstens NACHHOLEN_TAGE zurueck, unter dem Namen der Datei nichts);
der Docstring nennt den Fall ohne lauf.log. Treiber zieht den Wortlaut nach (46 Faelle,
70 Mutanten, keiner ueberlebt; Windows-Teil ohne Abweichung). LIESMICH: Abschnitt
Paket NR, Grenze im Abschnitt NT ersetzt. Vault-Teil von 746 aus der Plankopie
uebernommen, byte-gleich (Beginn 23:44:58, die Windows-Aufgabe war deaktiviert).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_0126RDfXiECscXipzf67uypJ
This commit is contained in:
Pascal MichelandClaude Opus 5.5 committed 2026-10-12 23:48:53 +02:00
1 parent 94f6dfeeeb
commit 3a38cb7e83
3 files changed
+41 -11

No files matched your search

@@ -230,12 +230,33 @@ Seit Paket NT bricht `abendkontrolle.py` die Sicherung ab, wenn der Docker-Host
Was die Kette nicht prüft:
- Ob Exit 255 unter Win32-OpenSSH 9.5p2 auch kommt, wenn auf dem Host ein Signal `abendkontrolle-lesen.sh` beendet. Laut Quelltext von OpenSSH-portable 9.5p1 ja; dann hieße die Zeile bei Summe oder Bestätigung „Docker-Host nicht erreichbar“, obwohl er erreichbar war.
- Lässt sich `lauf.log` nicht schreiben, fehlt auch die Zeile in der Notiz; übrig bleibt Exit 1 (kritische Prüfung NT, Befund 3, so seit E9). Ein Fall dazu fehlt, die Abhilfe steht im `todo.md` des Projekts.
- Bis 0.39.2 fehlte auch die Zeile in der Notiz, wenn sich `lauf.log` nicht schreiben ließ; übrig blieb Exit 1 (kritische Prüfung NT, Befund 3, so seit E9). Seit 0.39.3 hält das Ergebnisdateien, Zeilen und Sicherung nicht mehr auf, mit sieben Fällen dazu (Abschnitt „Paket NR“ unten).
- Bricht das Archiv der letzten Instanz des letzten Tags ab, weil der Host gerade wegfällt, folgt keine Frage nach einer Summe mehr; die Zeile nennt dann nur „Archiv nicht geholt (… Exit 255 …)“, nicht „Docker-Host nicht erreichbar“.
- Bricht das erste Archiv eines Tags ab, bleibt der leere Tagesordner auf D: zurück (so seit E9).
- Ohne eigenen Fall: die ASCII-Darstellung des Tags in der Meldung zu `--tag` (ein Mutant `!a` nach `!r` überlebte), und „kein WSL“ bei falschem `--tag` misst der Fall nur mit `--quelle dockerhost`.
- Ein Abend mit ausgeschaltetem Host über das echte `ssh.exe`.
## Paket NR (Trading Plattform 0.39.3): `lauf.log` und Ergebnisdatei halten die Notizzeile nicht auf
Seit Paket NR hält ein nicht schreibbares `lauf.log` in `abendkontrolle.py` weder Ergebnisdatei noch Notizzeile noch Sicherung auf, und eine nicht schreibbare Ergebnisdatei weder die Zeile ihres Tages noch die folgenden Tage. Plan im Projekt: `docs/plans/2026-10-12-paket-nr-pruefreste/` (Task 743); Codedoku dort in `docs/code/deployment.md`, Unterabschnitt „Sicherung (seit 0.39.0, Paket E9)“, Absatz „Bekannte Grenzen“.
- **Wirkt ab dem nächsten Start der Windows-Aufgabe,** nicht erst mit einem Abbild: Sie führt `abendkontrolle.py` aus diesem Ordner aus, abends und fünf Minuten nach jeder Anmeldung.
- **`lauf.log` nicht schreibbar** (Sperre, Rechte, volle Platte; jede Ausnahme beim Anlegen der Ablage, beim Öffnen oder beim Schreiben): `logge` wirft nicht mehr und merkt sich den Typ der Ausnahme in `LOG_FEHLER`, `main` setzt ihn zu Beginn jedes Laufs zurück. Am Ende, nach der Sicherung, schreibt der Lauf genau eine Zeile in die Notiz von heute, auch wenn `--tag` einen anderen Tag nennt: `Abendkontrolle lauf.log (automatisch): **nicht schreibbar** (<Typ>) #needs-review. Mindestens ein Eintrag dieses Laufs fehlt dort; …`, und endet mit Exit 1. Kein Pfad, kein Inhalt, nur der Typ der letzten Ausnahme. Scheitert auch diese Notiz, endet `main` ohne Ausnahme mit Exit 1.
- **Ergebnisdatei nicht schreibbar:** Die Zeile des Tages entsteht trotzdem, mit der Unterzeile `Ergebnisdatei nicht geschrieben (<Typ>) #needs-review. …`; die folgenden Tage des Teils laufen weiter, `lauf.log` bekommt einen Eintrag, Exit 1.
- Stand 0.39.3: Der Treiber hat 46 Fälle und 70 Mutanten. Weicht die Zählzeile eines Laufs davon ab, gilt sie.
| Datei | Was sich ändert | Aufruf |
|---|---|---|
| `abendkontrolle.py` | `logge` fängt jede Ausnahme und setzt `LOG_FEHLER`; `main` setzt ihn zurück und schreibt am Ende die Zeile mit dem Kopf `LOG_KOPF`; `fahre_teil` fängt einen Fehler beim Schreiben der Ergebnisdatei, hängt die Unterzeile an die Zeile des Tages und macht mit dem nächsten Tag weiter; Kopf-Docstring und ein Kommentar in `main` nachgezogen | `python abendkontrolle.py --quelle dockerhost --quelle-ibkr dockerhost [--tag JJJJ-MM-TT]` |
| `abendkontrolle_dockerhost_angriffe.py` | Neue Hilfsfunktionen `lauf_log_sperren` (legt an der Stelle von `lauf.log` einen Ordner an; Öffnen zum Anhängen scheitert dann wie bei einer Sperre, und der Fall misst den Typ der Ausnahme selbst) und `typ_beim_schreiben` (misst den Typ, wenn sich ein Pfad nicht als Datei schreiben lässt). Sieben neue Fälle: `ein_gesperrtes_lauf_log_haelt_ergebnis_notiz_und_sicherung_nicht_auf`, `ein_gesperrtes_lauf_log_verschluckt_die_zeile_zum_unerreichbaren_host_nicht`, `ein_gesperrtes_lauf_log_verschluckt_die_zeilen_gescheiterter_teile_nicht`, `eine_gesperrte_notiz_neben_gesperrtem_lauf_log_bricht_main_nicht_ab`, `ein_fehler_in_logge_der_kein_oserror_ist_haelt_den_lauf_nicht_auf`, `eine_ablage_die_sich_nicht_anlegen_laesst_haelt_die_zeilen_nicht_auf` und `eine_nicht_schreibbare_ergebnisdatei_haelt_weder_zeile_noch_folgende_tage_auf`. In `MUTANTEN` dazu E743-01 bis E743-13 | unter Windows `PYTHONIOENCODING=utf-8 python -X utf8 abendkontrolle_dockerhost_angriffe.py [--mutanten]`; Exit 0 ohne Abweichung, sonst 2 |
Was die Kette nicht prüft:
- Ein echt gesperrtes `lauf.log` (ein anderes Programm, volle Platte): Nachgestellt ist es als Ordner an der Stelle von `lauf.log`; den Typ der Ausnahme misst der Fall selbst, statt ihn je Betriebssystem zu raten.
- Ohne eigenen Mutanten: dass `fahre_teil` die Unterzeile für jeden Tag neu leert. Der Fall zur Ergebnisdatei prüft aber, dass der Folgetag keine Unterzeile trägt.
- Eine halb geschriebene Ergebnisdatei: Sie zählt für `faellige_tage` als erledigt (`exists()`), kein Lauf prüft den Tag erneut, und der Lauf räumt nichts weg. Kein Fall dazu; die Unterzeile sagt es.
- `rueckweg_aapl.py` schreibt `lauf.log` ungeschützt vor der Notizzeile, `abbau_restbestand.py` schluckt Fehler an `abbau.log` still: derselbe Mechanismus, ohne Änderung in NR. Die Aufgabe „Rueckweg AAPL“ wird in Phase 9 entfernt, die Abbau-Werkzeuge sollen stillgelegt werden (Punkt im `todo.md` des Projekts).
## Paket AB (2026-10-07): Abbau des Restbestands nach dem Netzschalter-Abriss
Am 2026-10-07 um 20:13 beendete ein Druck auf den Netzschalter beide Paper-Runner mitten im Handel, ohne Glattstellen. Pascal am selben Abend: am 2026-10-08 soweit es geht alles verkaufen, Testläufe bis Dienstag gestoppt. Die Zeitgeber `trading-paper.timer` und `trading-paper-ibkr.timer` sind seitdem aus, die Abendkontrolle ebenfalls; die Meldung dieses Werkzeugs ist in der Pause das einzige Netz. Plan im Projekt: `docs/plans/2026-10-07-paket-ab-abbau-restbestand/`.
@@ -17,7 +17,9 @@ die mit "## Agentenprotokoll" beginnt.
- Scheitert nur die Notiz (etwa eine Datei, die kein UTF-8 ist), bleibt es bei der Ergebnisdatei und
einer Zeile in lauf.log: Die Kontrolle ist gelaufen und hat ihre Meldung schon geschickt; ein zweiter
Lauf schickte sie nur noch einmal.
- Ein Tag, der laenger als NACHHOLEN_TAGE scheitert, faellt aus dem Fenster (lauf.log behaelt ihn).
- Ein Tag, der laenger als NACHHOLEN_TAGE scheitert, faellt aus dem Fenster. lauf.log behaelt ihn, solange es
sich schreiben laesst; sonst bleiben nur seine Zeilen "gescheitert" in der Notiz seines Tags, soweit sie sich
schreiben liessen, und die Zeile zu lauf.log in der Notiz von heute (kritische Pruefung NR, Task 746).
Seit Paket IB2 zwei Teile je Tag, nacheinander: alpaca wie oben, dann ibkr (abendkontrolle_wsl.py
--teil ibkr) mit eigener Ergebnisdatei <tag>-ibkr.json, eigener Zeile "Abendkontrolle IBKR" in
derselben Notiz und eigenem Nachholen ab IBKR_ERSTER_TAG. --teil nimmt nur einen Teil; mit
@@ -747,8 +749,10 @@ def fahre_teil(teil: str, tage: list[str], jetzt: datetime, vault: Path, ablage:
# Seit Paket NR (Plankritik NR): Liess sich die Ergebnisdatei nicht schreiben, flog die Ausnahme vorher
# aus fahre_teil, und es fehlten die Zeile dieses Tages und die aller folgenden Tage des Teils. Jetzt
# bekommt die Zeile eine Unterzeile mit dem Typ der Ausnahme, die folgenden Tage laufen weiter, Exit 1.
# Ob der naechste Lauf den Tag erneut prueft, entscheidet faellige_tage: nur im Fenster und nur, wenn
# unter dem Namen der Datei nichts liegt, auch keine halb geschriebene Datei.
# Ob ein spaeterer Lauf ohne --tag den Tag erneut prueft, entscheidet faellige_tage: nur einen Werktag ab
# ERSTER_TAG bzw. IBKR_ERSTER_TAG, hoechstens NACHHOLEN_TAGE zurueck, und nur, wenn unter dem Namen der
# Datei nichts liegt, auch keine halb geschriebene Datei. Einen Tag, den nur --tag erreicht (Wochenende,
# vor dem ersten Tag, aelter als das Fenster), prueft kein Lauf von selbst erneut (kritische Pruefung NR).
zusatz = ""
if ergebnis.get("exit") != 2:
try:
@@ -759,9 +763,10 @@ def fahre_teil(teil: str, tage: list[str], jetzt: datetime, vault: Path, ablage:
code = 1
logge(ablage, f"{vorsatz}{tag}: Ergebnisdatei nicht geschrieben {ausnahme!r}")
zusatz = (
f"\n - Ergebnisdatei nicht geschrieben ({type(ausnahme).__name__}) #needs-review. Der nächste "
"Lauf prüft den Tag erneut, wenn er dann noch im Nachholfenster ist und unter dem Namen der "
"Datei nichts liegt, auch keine halb geschriebene."
f"\n - Ergebnisdatei nicht geschrieben ({type(ausnahme).__name__}) #needs-review. Ein späterer "
"Lauf ohne --tag prüft den Tag nur erneut, wenn er ein Werktag ab dem ersten Prüftag des Teils "
f"ist, höchstens {NACHHOLEN_TAGE} Kalendertage zurückliegt und unter dem Namen der Datei nichts "
"liegt, auch keine halb geschriebene. Sonst prüft ihn kein Lauf von selbst."
)
else:
code = 1
@@ -1348,11 +1348,15 @@ def typ_beim_schreiben(pfad):
def ergebnis_zusatz(typ):
"""Die Unterzeile unter der Zeile eines Tages, dessen Ergebnisdatei sich nicht schreiben liess."""
"""Die Unterzeile unter der Zeile eines Tages, dessen Ergebnisdatei sich nicht schreiben liess.
Seit Task 746 (kritische Pruefung NR) sagt sie nur, was faellige_tage hergibt; 7 ist NACHHOLEN_TAGE.
"""
return (
f" - Ergebnisdatei nicht geschrieben ({typ}) #needs-review. Der nächste Lauf prüft den Tag erneut, "
"wenn er dann noch im Nachholfenster ist und unter dem Namen der Datei nichts liegt, auch keine halb "
"geschriebene."
f" - Ergebnisdatei nicht geschrieben ({typ}) #needs-review. Ein späterer Lauf ohne --tag prüft den Tag "
"nur erneut, wenn er ein Werktag ab dem ersten Prüftag des Teils ist, höchstens 7 Kalendertage "
"zurückliegt und unter dem Namen der Datei nichts liegt, auch keine halb geschriebene. Sonst prüft ihn "
"kein Lauf von selbst."
)