Pipeline Stufe E: Slot-Trennung und Attribut-Reihenfolge (tools/check_slots.py)

User: "Uebernehme die Logikpruefung auf allen Slots in die Deployment pipeline" -
nach dem Ausfall, bei dem der Serverstart komplett abbrach und zwei Minuten lang
kein Close moeglich war.

ZWEI FEHLERKLASSEN, beide binnen zwei Tagen real aufgetreten, beide von KEINER
bestehenden Stufe gefangen (py_compile, ruff F821, ty, pytest: alle gruen):

(A) ATTRIBUT VOR SEINER ZUWEISUNG. `self.trader_brk.history = self.history`
    stand in `__init__` VOR `self.trader_brk = TradeManager(...)`.
    AttributeError im Konstruktor -> Serverstart brach ab -> "Netzwerkfehler" am
    Close-Knopf. Syntaktisch korrekt, und kein Test instanziiert die Engine (sie
    braucht MT5). Gefunden hat es erst deploy.py Schritt 2 - also NACH dem Kill
    des laufenden Servers. Derselbe Fehler am Vortag mit `_margin_brk` vor
    `_load_runtime_state()`, dort sogar still.
    Die Pruefung sammelt je `self.X` die ZEILE der ersten Zuweisung und meldet
    jede Benutzung davor.

(B) SLOT-VERWECHSLUNG. BRK-Pfade (_check_auto_squeeze, _manage_squeeze_pending,
    _check_pending_fill) duerfen den SLOT-ZUSTAND von `self.trader` nicht
    anfassen (close/snapshot/open_*/set_open_context/refresh). ⚠ Bewusst eine
    WEISSE Liste der Pfade - eine schwarze wuerde jede neue Funktion still
    durchlassen. `pending_orders`/`cancel_pending`/`place_stop` sind ausdruecklich
    ERLAUBT: magic-basierte Broker-Abfragen ohne Slot-Zustand (geprueft).
    Dazu die Invariante, dass `TradingEngine.close` beide Slots erwaehnen muss -
    sonst waere eine BRK-Position per Dashboard nicht schliessbar.

DREI RICHTUNGEN VERIFIZIERT: sauber -> gruen; Reihenfolge-Fehler zurueckgebaut ->
"self.trader_brk benutzt, aber erst in Zeile 270 zugewiesen"; Slot-Verwechslung
zurueckgebaut -> "self.trader.close im BRK-Pfad". Danach wieder gruen.

Statisch (AST), kein MT5, Millisekunden. Werkzeugfehler gilt NICHT als sauber.
Laeuft ueber check_nfalle.py im pre-commit-Hook mit.

⚠ Was diese Stufe NICHT kann: ein Startfehler AUSSERHALB von __init__. Dafuer
bliebe ein echter Rauchtest mit gestubbtem MT5 - der ist nicht gebaut.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-20 08:47:28 +02:00
co-authored by Claude Opus 5
parent a652223a05
commit 2b498fc20e
3 changed files with 239 additions and 1 deletions
+29
View File
@@ -420,8 +420,37 @@ print(" keine gefunden." if not sig else f" {sig} Stellen.")
print()
print("=" * 88)
# ── E) SLOT-TRENNUNG + ATTRIBUT-REIHENFOLGE ──────────────────────────────
# ⚠⚠ Beide Fehlerklassen haben binnen zwei Tagen je einmal zugeschlagen, und
# KEINE andere Stufe hat sie gefangen (py_compile, ruff F821, ty, pytest:
# alle gruen). Der Attribut-Reihenfolge-Fehler brach den Serverstart KOMPLETT
# ab — der Nutzer konnte zwei Minuten lang nicht schliessen. Gefunden hat ihn
# erst `deploy.py` Schritt 2, also NACH dem Kill des laufenden Servers.
# Diese Stufe findet ihn VORHER.
def _stufe_slots():
print("")
print("=" * 88)
print(" E) SLOTS — Attribut-Reihenfolge in __init__ + Slot-Trennung")
print("=" * 88)
try:
sys.path.insert(0, str(WURZEL / "tools"))
import check_slots
import importlib
importlib.reload(check_slots)
for z in check_slots.pruefe():
befunde.append("SLOT " + z)
print(" FEHLER " + z)
if not check_slots.pruefe():
print(" keine Slot-/Reihenfolge-Fehler.")
except Exception as e:
print(f" ⚠ Slot-Pruefung nicht ausfuehrbar ({e}) — NICHT als sauber gewertet.")
befunde.append("SLOT Werkzeugfehler")
_stufe_typen()
_stufe_render()
_stufe_slots()
print("")
print("=" * 88)