Files
claude-regelwerk/.vault-tools/trading-plattform-pruefung/LIESMICH.md
T
Pascal MichelandClaude Opus 5 246af19683 Automatischer Push: 14 Datei(en) geändert
- .vault-tools/plan-kopie/LIESMICH.md
- .vault-tools/plan-kopie/rot_nachweis.py
- .vault-tools/trading-plattform-pruefung/LIESMICH.md
- .vault-tools/trading-plattform-pruefung/dienste_stand.sh
- .vault-tools/trading-plattform-pruefung/ha_einrichten.py
- .vault-tools/trading-plattform-pruefung/hole_kerzen.py
- .vault-tools/trading-plattform-pruefung/neustart_echtlauf.py
- .vault-tools/trading-plattform-pruefung/ntfy_lesen.py
- .vault-tools/trading-plattform-pruefung/pause_echtlauf.py
- .vault-tools/trading-plattform-pruefung/wiederanlauf_probe.ps1
- AI/Regelwerk/codeworkflow.md
- AI/Regelwerk/projekte.md
- … und 2 weitere

Erzeugt vom PostToolUse-Hook .vault-tools/auto-push/auto_push.py.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-21 04:00:01 +02:00

15 KiB

type, status, title, summary, tags, created, updated
type status title summary tags created updated
resource active Trading Plattform: Prüfwerkzeuge des Koordinators fürs Dashboard Eigener Lauf mit echten Daten zum Dashboard der Trading Plattform — Vergleich der Endpunkte gegen Vollparse und pandas, zwei WebSocket-Verbindungen, Browser-Lauf und Wiederaufbau mit Playwright, gefahrlose Proben der zwei Skripte, Mutantenläufe. Entstanden 2026-09-17 (Teil 3b), erweitert 2026-09-18 (Teil 10: Anmeldung, Angriffsfälle, Beobachtung, Kerzenlatenz), bewusst nicht im Projekt-Repo.
vault-tools
trading-plattform
2026-09-17 2026-09-21

Prüfwerkzeuge fürs Dashboard der Trading Plattform

Koordinator-Werkzeuge, nicht fürs Repo. Sie starten nie den echten Broker: Das Probe-Backend läuft mit BrokerAttrappe und einem Wegwerf-Register unter /tmp, liest aber die echten Protokolle und den echten Katalog. Python-Teile laufen in WSL aus dem Projektordner, die Browser-Teile mit dem Windows-Python und Playwright (Chromium).

Datei Was sie tut Aufruf
pruef_teil3b.py Liste und Einzelansicht der Läufe gegen einen eigenen Vollparse, Kerzen gegen eine eigene pandas-Rechnung; --sabotage verfälscht je einen Wert und muss mit Exit 2 enden (sieben Fälle) wsl -d Debian -- bash -s -- pruef_teil3b.py alles [--sabotage zahl] < lauf_pruef.sh
pruef_ws.py, lauf_ws_probe.sh, start_probe_backend.py, start_probe.sh zwei WebSocket-Verbindungen am Probe-Backend müssen dieselben zeit-Werte sehen wsl -d Debian -- bash -s < lauf_ws_probe.sh
browserlauf.py bei 375, 768, 1024 und 1440 px: Zeilen in „Läufe", zwei Einzelansichten, Minuten- und Tageschart gezeichnet, kein waagerechter Scroll, keine Konsolenmeldung; schreibt Screenshots — ansehen Probe-Backend starten (wsl -d Debian -- bash -s 8145 2.0 < start_probe.sh, im Hintergrund), dann python -X utf8 browserlauf.py http://localhost:8145 <ausgabeordner>
wiederaufbau.py Backend beenden und neu starten, die Kopfzeile muss „Backend getrennt" und wieder „Backend verbunden" zeigen, ohne Neuladen; --ohne-neustart muss rot enden python -X utf8 wiederaufbau.py
skripte_probe.sh, abkuerzung_probe.sh --help, Lauf ohne Schalter, unbekanntes Argument und Abkürzungen von --ausfuehren — ausschließlich aus einem leeren Temp-Verzeichnis; die Übung selbst wird nie gefahren wsl -d Debian -- bash -s < skripte_probe.sh
mutanten_py.py, mutanten_ts.py Mutanten zu Teil 3b auf einer Kopie mit angewendetem Plan, je mit Fehlerzeile Pfad der Kopie als erstes Argument
real_pytest.sh volle Suite im echten Baum, mit Zählung der „Task was destroyed"-Meldungen wsl -d Debian -- bash -s -- -q < real_pytest.sh

Teil 10 (2026-09-18): Paper-Runner, Anmeldung, Härtung

Datei Was sie tut Aufruf
start_probe_zugang.py die echte App mit Attrappe, Wegwerf-Register und Wegwerf-Zugang (Benutzer probe, bekanntes Passwort, TOTP-Beispielgeheimnis der RFC-Literatur; beides in zugang.json der Ablage), auf Wunsch mit einer Paper-Statusdatei aus dem Projektordner in WSL: PYTHONPATH=. python start_probe_zugang.py <port> <ablage> [mit-paperstatus]
angriffe.py 56 Fälle gegen Host-Positivliste, Origin, Sitzungszwang, Cookie-Attribute, Bremse, CSP und die anderen Header, WebSocket ohne Sitzung; Regressionsnachweis gegen das Backend vor Teil B: 45 rot python angriffe.py <basis-url> <ablage-mit-zugang.json>
browserlauf_zugang.py Anmeldeformular ohne Sitzung, falsche und richtige Anmeldung (frischer TOTP-Code), Name und „Abmelden" in der Kopfzeile, Strom, Karte „Paper-Betrieb", alle Ansichten unter der CSP, Abmelden und Neuladen, 375 px; protokolliert jede Antwort ab 400 mit Phase und Pfad (antworten-ab-400.json); --sabotage muss rot enden; Screenshots — ansehen (der Lauf fand so das GET /api/paper vor dem Tor und die unbeschrifteten Felder) python -X utf8 browserlauf_zugang.py http://localhost:<port> <ablage>/zugang.json <ausgabeordner> [--sabotage]
pruef_beobachtung_echt.py baue_beobachtung gegen NautilusEnv._beobachtung auf den echten IEX-Kerzen eines Tages, beide Seiten unabhängig gerechnet; Sabotage rot. Seit 2026-09-18 mit zweitem Teil: eine feste Aktionsfolge über alle fünf Stufen, Vergleich nach jedem Schritt bei gleichem Zustand (gemessen am 2026-09-17: 120 Beobachtungen bitgleich, davon 50 long, 50 short, Kontowert in allen ungleich dem Startkapital, Zähler in 60 größer null); --mutant-vorzeichen (Betrag statt Vorzeichen der Position) lässt genau die 50 Short-Beobachtungen rot fallen, während der erste Teil grün bleibt PYTHONPATH=. python pruef_beobachtung_echt.py JJJJ-MM-TT aus dem Projektordner
lies_paper_protokoll.py fasst ein Paper- oder Probe-Protokoll zusammen (Takte je Phase, Killswitch je Takt, frische Kerzen, erste Entscheidung, Orders, Schlussphase, Ende) python lies_paper_protokoll.py <jsonl>
handelstag_auswertung.py wertet einen Paper-Handelstag aus: Takte je Phase, frische Kerzen, Spanne Taktzeile gegen Minutenende (Obergrenze für „Kerze abrufbar"), Orders, Ende; mit --broker lesend die Orders des Paper-Kontos (Füllzeit aus submitted_at/filled_at gegen order_timeout_s, Vorzeichen offener Positionen), mit --kerzen die Kosten je Order gegen den Schluss der letzten abgeschlossenen IEX-Kerze in Basispunkten. Am 2026-09-18 an den zwei Protokollen der Nacht erprobt (Probe: Spanne ausgelassen, weil die Kerzen gespielt sind) aus dem Projektordner: python handelstag_auswertung.py <protokoll.jsonl> [--broker] [--kerzen]
vorstart_pruefung.py liest vor dem Runner-Start: läuft schon ein Runner, Killswitch-Zustand im Register (nur Auskunft — der Start stellt nach der Neustartregel immer auf angehalten; ein Befund ist allein gesperrt), Paper-Konto glatt, Marktuhr des Brokers, eigene Uhr gegen den Date-Kopf des Brokers. Am 2026-09-18 fand der erste trockene Lauf einen Killswitch auf aktiv (Klick um 08:55 Uhr), den der Start überschreibt aus dem Projektordner: python vorstart_pruefung.py
runner_stand.py zeigt den Stand eines laufenden Paper-Runners aus seinem Protokoll: Zeilen je Art, Takte je Phase und Killswitch-Zustand, letzter Takt, Order- und Ende-Zeilen. Urteilt nicht und gibt keine Kontowerte aus. Am 2026-09-18 am Protokoll der Nacht erprobt (drei Zeilen: kopf, ereignis, ende); an einem Protokoll mit Takten noch nicht in WSL: python runner_stand.py [<protokoll.jsonl>], ohne Angabe das neueste *-paper.jsonl im Projektordner
protokoll_vergleich.py vergleicht zwei JSONL-Protokolle der Messwerkzeuge Wert für Wert (Bitgleichheit nach einem Umbau); trennt ABWEICHUNG, NUR NEU (neuer Schlüssel, kein Befund ohne --streng) und NUR ALT. Erprobt am 2026-09-18: Selbstvergleich 5.190 Werte ohne Befund, --sabotage (ein ULP) rot, der Ein-Jahres-Lauf mit OMP_NUM_THREADS=8 gegen den ohne 621 Abweichungen ab der dreizehnten Stelle python protokoll_vergleich.py <alt.jsonl> <neu.jsonl> [--ohne …] [--streng] [--sabotage]
probe_neu_einfrieren.py friert tests/fixtures/tage_t0_t1_referenz.json nur neu ein, wenn der Diff genau der vorhergesagte ist (neuer Schlüssel fenster_ausgelassen_pool in den Poolzeilen, geänderte Werte allein in der T1-Poolzeile und dort nur in den gelisteten Feldern); erprobt am 2026-09-18 an der Kopie mit angewendetem Plan B: 24 erlaubte Änderungen, 0 Befunde; --sabotage (ein ULP in einer T0-Zeile) rot, und --schreiben schrieb dann nichts in WSL aus der Projektwurzel: python probe_neu_einfrieren.py [--schreiben] [--sabotage]
ntfy_probe_server.py nimmt ntfy-Meldungen auf 127.0.0.1 entgegen und schreibt sie als JSONL mit (Titel, Priorität, Tags, Text; vom Authorization-Kopf nur Schema und Länge) — für den Lauf mit echten Daten zu Paket D ohne echtes Thema; --status 403 lässt jede Zustellung scheitern python ntfy_probe_server.py <port> <mitschrift.jsonl> [--status 200] [--verzoegerung 0.0]
handabruf_kerzen.py Alter der jüngsten AAPL-Minutenkerze per REST (feed iex oder sip) mit Urteil FRISCH/ALT — die Messung vor dem ersten Paper-Tag; nachts nur ein Funktionsnachweis. Gemessen 2026-09-18 nachts: iex antwortet in 0,5 s, sip mit 403 „subscription does not permit querying recent SIP data" aus dem Projektordner: `TZ=Europe/Berlin python handabruf_kerzen.py [iex

Seit 2026-09-18 kennen angriffe.py und browserlauf_zugang.py https. angriffe.py erwartet je nach Schema der Basis-URL Secure am Cookie und Strict-Transport-Security (https) oder beides nicht (http), dazu unter https keine Antwort 200 auf Klartext; --ca <pem> nennt das Zertifikat, dem vertraut wird (geprüft, nicht abgeschaltet). browserlauf_zugang.py --selbstsigniert schaltet die Zertifikatsprüfung des Browsers ab. Regressionsnachweis vom selben Tag: gegen ein TLS-Backend mit einem Mutanten von sicherheit.py (ohne Secure, ohne HSTS) fielen genau die vier https-Fälle rot, Exit 2; Grundlinie über http 59 Fälle, über https 60. Läuft das Backend auf einem anderen Rechner, fährt man angriffe.py dort in einem Wegwerf-Container mit --network host und legt die drei Dateien der Ablage (zugang.json, status.json, anmeldungen.jsonl) per Verknüpfung in einen Ordner — das Werkzeug braucht Dateizugriff auf die Ablage des Backends.

Paket F (2026-09-20): Produktivbetrieb als Dienst

Datei Was sie tut Aufruf
pause_echtlauf.py Tagesverlust-Schutz in der Pause auf den echten IEX-Kerzen eines Tages: rechnet aus den Rohkerzen vor, in welchem Takt die Grenze reißen muss (long und short, Grenze bei der Hälfte des größten Tagesverlusts), und hält das gegen das Protokoll der echten PaperSitzung im Zustand angehalten; dazu die Gegenprobe ohne Position. Einziger Netzzugriff: die Kerzen, lesend; Meldungen gehen an einen mitschreibenden Transport. Gemessen am 2026-09-17: long Takt 6, short Takt 173, je erwartet gleich gemessen aus dem Projektordner in WSL: python pause_echtlauf.py JJJJ-MM-TT
dienste_stand.sh nur lesend: Unit-Dateien, is-enabled, Zustand, Startzeiten und letzter Exit-Code von Dashboard-Dienst und Runner, Zeitgeber, /api/gesund, Start von systemd, die letzten Journalzeilen beider Dienste, status.json und tagesstart.json ohne Kontowerte. Das Journal geht ohne sudo, wenn der Benutzer in adm oder systemd-journal ist (hier: ja); sonst nimmt das Skript sudo -S mit WSL_PW aus der Umgebung aus PowerShell: wsl -d Debian --exec bash /mnt/d/Claude/.vault-tools/trading-plattform-pruefung/dienste_stand.sh
hole_kerzen.py holt die echten IEX-Minutenkerzen eines Handelstags lesend und legt sie als JSON ab — die Eingabe für neustart_echtlauf.py. Gemessen am 2026-09-20 für den 2026-09-17: 390 Kerzen, byte-gleich mit dem Abruf des Abschlussprüfers aus dem Projektordner in WSL: python hole_kerzen.py JJJJ-MM-TT <ziel.json>
neustart_echtlauf.py der Tagesverlust nach einem Neustart mitten am Tag: rechnet aus den Rohkerzen vor, bei welcher Kerze die echte Grenze (0,2 Prozent) gegen den Tagesstart reißt und bei welcher gegen den Neustartkurs, und fährt dann zwei echte PaperSitzungen nacheinander mit gemeinsamer tagesstart.json, dazu die Gegenprobe ohne Datei. Kein Netz. Gemessen am 2026-09-20 auf den Kerzen des 2026-09-17 und 2026-09-18: mit Datei Riss bei der vorgerechneten Kerze (5, 150, 19), ohne erst bei 18, 173, 42 aus dem Projektordner in WSL: python neustart_echtlauf.py <kerzen.json>
ntfy_lesen.py liest über die Abfrage-Schnittstelle von ntfy zurück, was in der letzten Stunde unter dem Thema der Maschine ankam — Titel, Priorität, Zeit, erste Zeile. Schickt nichts und gibt das Thema nie aus, auch nicht in einer Fehlermeldung aus dem Projektordner in WSL: python ntfy_lesen.py
wiederanlauf_probe.ps1 beendet die Distribution hart (wsl --terminate) und misst, wann geplante Aufgabe, Distribution und Dashboard von selbst zurück sind. Ein laufender Runner stirbt mit — nur außerhalb der Handelszeit, nur mit -Ausfuehren (ohne den Schalter Exit 2, nichts getan). Während der Messung kein anderer wsl.exe-Aufruf, jeder Klient weckt die Distribution selbst. Gemessen am 2026-09-20: Rückkehr am nächsten Fünf-Minuten-Rasterpunkt, Dashboard 13 s danach powershell -File wiederanlauf_probe.ps1 -Ausfuehren

Paket H (2026-09-21): Kennzahlen nach Home Assistant

Datei Was sie tut Aufruf
ha_einrichten.py richtet in Home Assistant die Gegenstelle für den Hausmelder ein: acht Helfer mit dem Präfix trading_ und eine Automation mit Webhook-Auslöser (local_only, nur POST). Die Webhook-ID entsteht im Skript (64 Hex-Zeichen), wird nie ausgegeben und landet nur in [homeassistant] der config/secrets.toml des Trading-Projekts, mit aktiv = false. pruefen und lesen lesen nur (lesen zeigt zusätzlich die Zustände der Helfer), probe schickt eine Beispiel-Nutzlast und liest zurück, entfernen baut Helfer und Automation wieder ab. Läuft unter Windows mit dem Python des Home-Assistant-Projekts — dort liegen der Klient src/ha_verbindung.py, die Adresse der Instanz und der Name der Token-Variable; das Token bleibt auf der Windows-Seite und kommt nie auf den Trading-Rechner. Gemessen am 2026-09-20/21: eingerichtet, probe rückgelesen wie gesendet, und ein POST des echten Hausmelder aus WSL kam in den Helfern an `.venv\Scripts\python.exe -X utf8 ha_einrichten.py <pruefen

Das Einrichten selbst (deploy/dienste-einrichten.sh unter sudo -S, deploy/windows/wsl-wachhalten.ps1 -Aktion einrichten) und das Eintragen des ntfy-Themas liefen aus dem Scratchpad der Sitzung; die Befehle stehen in der Administrator-Anleitung des Projekts, Abschnitt „Produktivbetrieb als Dienst".

Die Compose-Probe (Bauen aus dem echten Baum mit verankerten Ausschlüssen, Start, Healthcheck, Angriffsfälle, Runner-Probe im Container, Aufräumen) lag als compose_probe_echt.sh im Scratchpad der Sitzung und braucht sudo -S mit dem WSL-Passwort aus $WSL_PW; sie ist deshalb nicht hier abgelegt. Muster: tar --exclude=./data — ohne Anker fällt auch trading/data weg.

Vor dem Browser-Lauf npm run build im Projekt, sonst dient das Backend eine alte Oberfläche aus. Die Datensatz- und Dateinamen in browserlauf.py und pruef_teil3b.py sind die des Bestands vom 2026-09-17; nach einem neuen Katalog oder neuen Protokollen nachziehen. Die Statustexte in wiederaufbau.py sind aus Kopfzeile.tsx abgeschrieben.

Die generischen Planwerkzeuge liegen unter .vault-tools/plan-kopie/.