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:
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."
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user