6. Durchgang: Slots, JavaScript, Bibliotheken - jede Achse jetzt eine Pipeline-Stufe

Die vorigen Durchgaenge waren Handarbeit und liefen nur, wenn jemand daran
dachte. Jetzt sind alle drei automatisiert.

JAVASCRIPT - DIE RENDER-PROBE DECKTE 2 VON 15 FUNKTIONEN AB.
render_check.mjs schnitt per Regex genau ZWEI Funktionen heraus (renderM15,
renderBrk). renderKontext und 13 weitere waren nie abgedeckt - und genau dort
ist mir heute der d-statt-snap-Beinahefehler unterlaufen. Die Probe haette ihn
DURCHGELASSEN.
Neu geschrieben: die komplette app.js laeuft in einem VM-Kontext gegen ein
Minimal-DOM, jede render*-Funktion wird aufgerufen - zweimal, mit dem Fixture
UND mit einem leeren Snapshot (der Kaltstart, in dem jedes Feld fehlt).
13 Funktionen laufen durch. Mutationsprobe mit genau dem heutigen Fehler:
4 Treffer, waehrend node --check NICHTS meldet - der blinde Fleck ist damit zu.
Kein npm, kein jsdom: das DOM ist eine Attrappe von 20 Zeilen, Pruef- und
Laufumgebung bleiben derselbe Parser.

ZWEI NEUE STUFEN, beide mutationsgeprueft:
  F) ELEMENT-IDs - JS gegen HTML. Stand: 133 IDs, keine verwaist, keine doppelt.
     Kommentare werden vorher entfernt, sonst waeren die Beispiele im
     Kopfkommentar zwei Dauer-Fehlalarme (die Lehre vom Linter).
  G) ABHAENGIGKEITEN - jeder Import aus server.py/core/ gegen requirements.txt.
     Stand: 39 Dateien, alle 9 externen Importe aufgefuehrt, keine Versionsdrift.

UND DIE PIPELINE HAT SICH SELBST ERWISCHT: mein erster Entwurf von Stufe G
importierte `ast` nicht. Der stille except-continue liess JEDE Datei
durchfallen, und die Stufe meldete "alle 0 externen Laufzeit-Importe sind
aufgefuehrt" - ein gruener Haken, hinter dem nichts geprueft wurde. Fuenfte
Wiederholung dieser Fehlerklasse. Gefangen hat es ruff F821 in derselben
Pipeline. Behoben doppelt: Import ergaenzt UND Plausibilitaetspruefung (weniger
Dateien gelesen als vorhanden oder 0 Importe -> Befund).

SLOTS - keine neuen Defekte, drei Punkte praezisiert:
  · Kein geteilter Modul-Zustand. Die modulweiten Container in trailing.py und
    trader.py sind reine Nachschlagetabellen, kein global-Statement. Die beiden
    Instanzen sind tatsaechlich unabhaengig - Voraussetzung des ganzen Umbaus.
  · set_sltp bleibt Slot-1-only, verhaelt sich aber SICHER: liegt nur eine
    BRK-Position, gibt modify_sltp einen Fehlertext zurueck. Es fasst NICHT die
    falsche Position an. Bekannte Grenze, kein Fehler.
  · trail_brk.enabled wird nicht persistiert; _rebind_brk schaltet es nach einem
    Neustart bedingungslos ein. Sichere Richtung, bewusst so gelassen.

BIBLIOTHEKEN: nichts fehlt, nichts driftet. pandas/scikit-learn stehen in
requirements-dev und werden in 0 Dateien importiert (so dokumentiert); numba,
joblib, tqdm, pandas_ta, rich, httpx sind Beifang und ungenutzt - kein
Handlungsbedarf, sie stehen nicht im Laufzeit-Pfad.
Struktureller Rest benannt: engine.py importiert weekly_review und
measurement_reminder, zwei Skripte der obersten Ebene - dieselbe Klasse wie der
frueher direkte backtest-Import. Hier entschaerft, weil lazy und in try, mit
sichtbarer Fehlermeldung. In Stufe G als projekteigen ausgenommen, mit
Begruendung im Code.

Pipeline jetzt A A2 A3 B B2 C C2 D E F G - alle gruen, 97 Tests, deployt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-20 20:06:46 +02:00
co-authored by Claude Opus 5
parent 3391e04f32
commit 3fb9c3fd2e
3 changed files with 311 additions and 30 deletions
+85
View File
@@ -9257,6 +9257,91 @@ liegen — meine Invariante war zu streng; (2) zwei inhaltsgleiche dicts sind
mich selbst: auf einer frischen Maschine soll der Bot mit möglichst kleiner
Oberfläche wieder laufen. Ergänzt wurde ausschliesslich `requirements-dev.txt`.
## ⚠⚠ SECHSTER DURCHGANG: SLOTS · JAVASCRIPT · BIBLIOTHEKEN (2026-08-20)
User-Auftrag. Diesmal wurde aus **jeder** der drei Achsen eine **Pipeline-Stufe**
gemacht — die vorigen Durchgänge waren Handarbeit und liefen nur, wenn jemand
daran dachte.
### JavaScript — die Render-Probe deckte 2 von 15 Funktionen ab
⚠⚠ **`tools/render_check.mjs` schnitt per Regex genau ZWEI Funktionen heraus**
(`renderM15`, `renderBrk`). **`renderKontext` und 13 weitere waren nie
abgedeckt** — und genau in `renderKontext` ist mir am selben Tag der
`d`-statt-`snap`-Beinahe-Fehler unterlaufen. Die Probe hätte ihn **durchgelassen**.
**Neu geschrieben**: die **komplette** `app.js` läuft in einem VM-Kontext gegen
ein Minimal-DOM, und **jede** gefundene `render*`-Funktion wird aufgerufen —
zweimal: mit dem Fixture **und mit einem leeren Snapshot** (der Kaltstart, in dem
jedes Feld fehlt; dort schlagen fehlende Null-Prüfungen zu, nicht bei vollen
Daten). **13 Funktionen laufen durch.**
✅ **Mutationsprobe mit genau dem heutigen Fehler:**
```
❌ renderKontext(Fixture): ReferenceError: d is not defined
❌ render(Fixture): ReferenceError: d is not defined
❌ renderKontext(leerer Snapshot): …
```
**`node --check` meldet dabei NICHTS** — die Datei ist syntaktisch einwandfrei.
Das ist der blinde Fleck, den diese Stufe schliesst.
⚠ Kein npm, kein jsdom: das DOM ist eine Attrappe von 20 Zeilen. Prüf- und
Laufumgebung bleiben derselbe Parser (V8).
### Zwei neue Pipeline-Stufen
**F) ELEMENT-IDs** — greift die JS auf IDs zu, die es in der HTML nicht gibt, und
gibt es doppelte? Stand: **133 IDs, keine verwaist, keine doppelt.**
⚠ Kommentare werden vorher entfernt: `$("neu")` und `$("x")` stehen als
**Beispiele** im Kopfkommentar von `app.js` und wären sonst zwei Dauer-Fehlalarme
— und eine Prüfung mit Dauer-Treffern wird ignoriert (die Lehre vom Linter).
**G) ABHÄNGIGKEITEN** — ist jeder Import aus `server.py`/`core/` in
`requirements.txt`? Stand: **39 Dateien gelesen, alle 9 externen Importe
aufgeführt**, keine Versions-Drift zwischen gepinnt und installiert.
✅ Beide **mutationsgeprüft**: ID umbenannt → Befund; `feedparser` aus der Liste
gestrichen → Befund.
⚠⚠ **UND DIE PIPELINE HAT SICH SELBST ERWISCHT.** Mein erster Entwurf von Stufe G
importierte `ast` nicht. Der stille `except Exception: continue` liess dadurch
**jede** Datei durchfallen — und die Stufe meldete *„alle 0 externen
Laufzeit-Importe sind aufgeführt."* Ein grüner Haken, hinter dem **nichts**
geprüft wurde: die **fünfte** Wiederholung dieser Fehlerklasse im Projekt.
Gefangen hat es **`ruff F821` in derselben Pipeline**.
✅ Behoben doppelt: `ast` importiert **und** eine Plausibilitätsprüfung
(„weniger Dateien gelesen als vorhanden, oder 0 externe Importe → Befund"). Eine
Stufe, die nichts gelesen hat, darf nicht „sauber" melden.
### Slots — keine neuen Defekte, drei Punkte präzisiert
**Kein geteilter Modul-Zustand**: die modulweiten Container in `trailing.py`
und `trader.py` (`_TF_LABELS`, `_PHASE_RANK`, `_RETCODE_MSG`) sind reine
Nachschlagetabellen, kein `global`-Statement. Die beiden Instanzen sind
tatsächlich unabhängig — das war die Voraussetzung des ganzen Umbaus.
**`set_sltp` bleibt Slot-1-only, verhält sich aber SICHER**: liegt nur eine
BRK-Position, gibt `modify_sltp` einen Fehlertext zurück (`if not self.ticket`).
Es fasst also **nicht** die falsche Position an — die SL/TP-Felder der
Trade-Leiste sind lediglich auf Slot 1 beschränkt. Bekannte Grenze, kein Fehler.
**`trail_brk.enabled` wird NICHT persistiert** (nur `brk_ticket`).
`_rebind_brk` schaltet es nach einem Neustart bedingungslos ein. Das ist die
sichere Richtung — aber wer es bewusst abgeschaltet hat, bekommt es nach einem
Neustart zurück. Bewusst so gelassen: eine BRK-Position ohne Trailing ist
gemessen die schlechtere Variante.
### Bibliotheken
**Nichts fehlt, nichts driftet.** `pandas` und `scikit-learn` stehen in
`requirements-dev.txt` und werden in **0** Dateien importiert (so dokumentiert);
`numba`, `joblib`, `tqdm`, `pandas_ta`, `rich`, `httpx` sind als Beifang anderer
Pakete installiert und ebenfalls ungenutzt. Kein Handlungsbedarf — sie stehen
nicht im Laufzeit-Pfad.
**Struktureller Rest, jetzt benannt**: `core/engine.py` importiert
`weekly_review` und `measurement_reminder` — zwei Skripte der obersten Ebene.
Dieselbe Klasse wie der frühere `backtest_breakout_squeeze`-Import, der am 07.08.
nach `core/squeeze_scan.py` gezogen wurde. **Hier entschärft**, weil beide
**lazy** und in `try` importiert werden (1×/Tag bzw. 1×/Woche) und ein
Fehlschlag sichtbar gemeldet wird. In Stufe G als projekteigen ausgenommen —
mit Begründung im Code, damit es nicht als Versehen gelesen wird.
**Pipeline jetzt: A · A2 · A3 · B · B2 · C · C2 · D · E · F · G** — alle grün,
97 Tests, deployt und verifiziert.
## ⚠⚠⚠ P(break) IST LIVE **INVERTIERT** — und es steuert echtes Geld (2026-08-19)
Die fällige Messung ist entscheidbar geworden: **n=530 entkoppelt** gegen die