Der Status des Projekts stand verstreut in elf Umsetzungsplaenen, drei Konzepten, der Linux-Analyse und dem Projektstand - teils widersprechend, teils wochenlang veraltet. Ab jetzt gibt es genau eine Statusquelle. docs/ROADMAP.md (neu): - Alle Vorhaben in vier Stufen A bis D, plus technische Schuld und Verlauf. Die Stufen sind eine Reihenfolge, keine Termine: jede schafft die Voraussetzung fuer die naechste. - Statuszeichen: erledigt / offen / blockiert (mit Ursache) / bewusst zurueckgestellt / Idee, nicht beschlossen. Damit ist das, was wir NICHT bauen wollen, sichtbar vorgehalten statt unauffindbar in einem Plan zu schlummern. - Inhaltlich getragen, nicht nur verlinkt: je Vorhaben Ziel, Phasen, Akzeptanzkriterien, offene Entscheidungen und Leitplanken aus den Quelldokumenten. - Sichtbar gemacht, was vorher zwischen den Dokumenten verborgen lag: CopyTrading Phase 1 ist der Engpass der gesamten Roadmap (MarketMaking und BundleArbitrage haben harte Voraussetzungen darauf), und die Sniper-Metriken aus Phase 3.2 sind ein Spezialfall des StrategieDrift-Fingerprints - zusammen bauen statt doppelt. Archiv (docs/archiv/): - 15 Dokumente verschoben (11 Umsetzungsplaene, 3 Konzepte, ANALYSE-Linux-Portierung). Sie bleiben die Bauanleitungen mit Code-Bezuegen, Risikotabellen und Begruendungen - eingefroren ist nur ihr Status. - archiv/README.md ordnet jedes Dokument seinem Roadmap-Punkt zu. Verweise nachgezogen - der eigentliche Aufwand: - 25 Markdown-Links repariert. 15 davon verschiebungsbedingt (eine Ebene tiefer), der Rest war schon vorher falsch: die Ideensammlung verlinkte Quellcode relativ zum Repo-Wurzelverzeichnis statt zu docs/. - 12 Dateien ausserhalb von docs/ verwiesen in Kommentaren auf die Plaene (csproj, props, setup.json, sechs Quelldateien) - alle auf archiv/ umgebogen. - Verweise auf Dateien, die der Fruehjahrsputz geloescht hat (Ui/, Program.cs, WindowMenuBar), zu Klartext entschaerft statt tote Links zu lassen. - Gegenprobe: 85 Links geprueft, 0 kaputt. Build gruen, 476 Tests gruen. PROJEKTSTAND.md entdoppelt: Abschnitt "Offen" verweist jetzt auf die Roadmap. Arbeitsteilung ist damit klar - Projektstand sagt was IST, Roadmap was KOMMT. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
14 KiB
Konzept: Modul „Supervisor" (KI-gestützte Handels-Analyse & Forensik)
Stand: 2026-07-16 Ziel: ALLES, was PolyTrader getan (und bewusst NICHT getan) hat, auf einfachem Wege detailliert analysierbar machen — Logs, DB-Einträge und das echte Geschehen auf der Plattform — und die Analyse durch ein KI-Modell (OpenRouter) durchführen lassen: Warum hat ein Trade funktioniert? Warum nicht? Woran lag es? Leitidee: Erst das Datenfundament, dann die KI. Ein Modell kann nur erklären, was aufgezeichnet wurde. Die Analyse ist maximal so gut wie die Rekonstruierbarkeit unserer Entscheidungen.
0. Datenlage-Audit: Was haben wir, was fehlt?
Vorhanden ✅
| Quelle | Inhalt | Qualität für Analyse |
|---|---|---|
core_trade_log (TradeRecord) |
abgeschlossene Trades aller Module | gut (strukturiert), aber nur das ERGEBNIS |
Modul-Logs (mod_copytrading_closed_trades, rf_*) |
Modul-Details inkl. Fees, SourceTrader, Cluster | gut |
Terminal-/Datei-Logs (/Logs, Freitext) |
Verlauf inkl. TradeReasoning (Begründungen) |
schlecht maschinenlesbar: Freitext, deutsch, ohne IDs |
rf_candidates |
Scanner-Entscheidungen inkl. Reject-Grund | Vorbild! genau das Muster, das wir überall brauchen |
geplant: acc_ledger (Accounting-Modul) |
unabhängige Plattform-Ground-Truth je Wallet | schließt „echtes Geschehen auf der Plattform" |
Fehlend ❌ (die eigentlichen Lücken)
- Entscheidungsjournal — der größte Gap. Jede Engine-Entscheidung (BUY/SELL ausgeführt, abgelehnt, übersprungen) existiert nur als Freitext-Log. Nicht abfragbar („zeig alle MaxBuyPrice-Rejects der Woche"), nicht mit dem späteren Marktausgang verknüpfbar („was WÄRE aus den Rejects geworden?" — das ist die halbe Strategie-Kalibrierung!).
- Order-Lifecycle nicht persistiert — Platzierungsversuche, CLOB-Responses, Cancels, Leiter-Stufen (Preis je Stufe, Wartezeiten, Floor-Erreichung) stehen nur im Log. Für „warum schlechter Fill?" brauchen wir die Kette als Daten.
- Korrelation — es gibt keine
SignalId, die Signal → Entscheidung(en) → Order(s) → ClosedTrade verbindet. Ohne sie ist jedes „Dossier" Handarbeit über Zeitstempel. - Markt-Kontext zum Entscheidungszeitpunkt — mindestens Signalpreis vs. erzielter Preis vs. Zeitversatz (Latenz!); mit Phase 1 (Orderbuch) auch Spread/Tiefe. Ohne Kontext kann niemand beurteilen, ob eine Entscheidung RICHTIG war — nur ob sie gut AUSGING.
- Strukturierte Logs — zusätzlich zum Text ein JSONL-Sink (Timestamp, Level, Source, CorrelationId, Message, Data), damit Logs filterbar/parsebar sind statt grep-über-Freitext.
1. Frage 1 — Aufbereitung: das „Trade-Dossier" als zentrale Einheit
S-0: Datenfundament (Core, nützt sofort auch OHNE KI — z. B. beim Zielland-Debugging):
core_decision_journal: eine Zeile je Entscheidung. Felder:SignalId, Timestamp, Modul, AccountId, TokenId, Side, Decision (Executed/Rejected/Skipped/Deferred), ReasonCode (Enum!) (z. B.MaxBuyPriceExceeded,PartialSellBelowThreshold,ExitPendingSkip,SpamBlock,BudgetExhausted,BelowPolymarketMinimum, …), Kontext-Zahlen (SignalPreis, Limitwert, verfügbares Budget, …) als kompaktes JSON, Freitext wie bisher zusätzlich. → Die bestehenden ~20TradeReasoning-Stellen bleiben, schreiben aber ZUSÄTZLICH strukturiert.core_order_events: Order-Lifecycle (Placed/Rejected/Cancelled/LadderStep/Filled) mit Preisen, CLOB-Response,SignalId.SignalId(GUID) imCopySignal/RF-Flow erzeugen und bis inClosedTrade/TradeRecorddurchreichen.- JSONL-Log-Sink (TerminalLogger erweitert): eine JSON-Zeile je Event (
ts,level,source,correlationId,message, optionaldata). JSONL statt JSON-Array: append-fähig, streambar, zeilenweise filterbar — das KI-freundliche UND effiziente Format. Übergang: zunächst Dual-Sink (Text + JSONL), Text-Sink später abschaltbar, sobald der Log Viewer etabliert ist. - Log Viewer im Terminal-Fenster (zweiter Tab neben der Live-Anzeige): lädt die JSONL-Dateien und bereitet sie menschenlesbar auf — Filter nach Datum/Level/Quelle/Text und CorrelationId („zeig mir alles zu diesem Signal"); Klick auf eine SignalId springt zur kompletten Kette. Damit ist das effiziente Speicherformat für Menschen genauso zugänglich wie heute der Freitext.
S-1: Dossier-Generator (pur, testbar): Für einen Trade / ein abgelehntes Signal alles zusammensetzen:
Signal → Journal-Einträge → Order-Events → Fill/Leiter-Verlauf → ClosedTrade/RF-Position →
acc_ledger-Einträge (Plattform-Wahrheit!) → Log-Ausschnitt (Zeitfenster+CorrelationId) → Marktdaten.
Ausgabe als JSON (fürs Modell) und Markdown (für Menschen). Dazu Perioden-Reports über TradeAnalytics.
2. Frage 2 — WIE analysieren: OpenRouter-Agent mit Read-only-Tool-Registry
v1: Agent IM Prozess (kein separater MCP-Server nötig). Wir kontrollieren beide Seiten — ein Function-Calling-Loop gegen OpenRouter (Chat Completions + Tools) ist in C# klein und ohne neue Abhängigkeit machbar (HttpClient + System.Text.Json). Der Agent bekommt:
- System-Kontext: ein kuratiertes, versioniertes Dokument
docs/analyse/ARCHITEKTUR-KONTEXT.md(„So funktioniert PolyTrader": Module, Entscheidungswege, Reason-Codes, Limits, Leiter-Mechanik, bekannte Eigenheiten). KEIN Code-Dump — destilliertes Verhalten. Wird bei Änderungen am Geld-Pfad mitgepflegt (Checkliste). - Read-only-Tools (Registry im Supervisor-Modul):
query_trades(filter)— Core-Trade-Logquery_decisions(filter)— Entscheidungsjournal (inkl. Rejects!)get_dossier(signalId | tokenId+account)— das komplette Dossierread_logs(zeitraum, level, correlationId, textfilter)— JSONL-Logsget_ledger(account, zeitraum)+get_ledger_diff(...)— Plattform vs. eigene DB (Accounting)get_kpis(scope)— TradeAnalyticsget_architecture_context()— das Kontext-Dokument- Predictalytics-Tools (
query_predictalytics_*): historische Trade-Daten fremder Trader, Master-Historien, Markt-Statistiken aus unserem Predictalytics-Tool (dessen API wir ohnehin integrieren). Analytisch besonders wertvoll: „schlechtes Signal" von „schlechter Ausführung" trennen — z. B. Master-Fill vs. unser Fill (Latenzkosten) oder unser Ergebnis vs. das anderer Trader im selben Markt (Benchmark). Architektur:IPredictalyticsClientim Core (auch Trading-Module nutzen ihn später, z. B. Master-Auswahl/AI-Rating); der Supervisor konsumiert ihn nur read-only. Eigener Egress-Eintrag (unsere eigene API, aber dokumentiert). Hart: KEIN Tool kann handeln, canceln oder schreiben. Der Supervisor ist Beobachter.
Analyse-Modi:
- Einzeltrade-Forensik: „Erkläre Trade X" → Dossier → Modell begründet mit Daten.
- Batch-/Muster-Analyse: „Alle Verlierer der letzten 14 Tage → gemeinsame Faktoren?" (Kategorie? Uhrzeit? Master? Preisband? Latenz? Leiter-Floor-Fälle?)
- Counterfactual: „Was wurde abgelehnt und wie ist der Markt ausgegangen?" (Journal × Resolution).
- Reconciliation-Anomalien: DB ↔ Plattform-Differenzen erklären lassen.
- Täglicher Supervisor-Bericht (später): Kurzfassung via Threema.
MCP-Server-Light: ja, aber als Phase S-4. Dieselbe Tool-Registry zusätzlich über einen lokalen MCP-Endpoint exponieren → dann können auch externe Clients (Claude Code/Desktop) direkt gegen die laufende App analysieren. Architektonisch nur ein zweiter Transport über dieselben Tools — deshalb lohnt es, die Registry von Anfang an transport-agnostisch zu bauen.
3. Frage 3 — Core- oder Modulebene? Hybrid.
- Datenfundament = Core. Journal, Order-Events, SignalId, JSONL sind Core-Contracts (wie der generische Trade-Log heute); alle Module schreiben hinein (Dual-Write-Muster existiert bereits).
- Analyse = modulübergreifend. Profitabilität ist eine Frage über Module/Accounts hinweg — genau wie das Dashboard.
- Modul-Spezifisches via Contract: Core definiert
IAnalysisContextSource(liefert z. B. RF-Kandidaten-Kontext oder Copytrading-Master-Kontext zu einem Dossier); Module registrieren Implementierungen per DI; der Supervisor konsumiert alle. So bleibt „Module kennen einander nicht" gewahrt (beide Seiten referenzieren nur den Core).
4. Frage 4 — Unterbringung: eigenes Modul „Supervisor"
src/PolyTrader.Modules.Supervisor/ als IPolyTraderModule (Name="Supervisor", DbPrefix="sup_"),
Registrierung in Program.cs, referenziert nur den Core. Eigenes Fenster (Muster RF/Copytrading):
- Tab Analyse (Chat mit dem Agenten, Tool-Aufrufe sichtbar/expandierbar — Nachvollziehbarkeit!)
- Tab Dossier-Browser (Trade/Signal auswählen → Dossier ansehen, auch ohne KI)
- Tab Berichte (gespeicherte Analysen/Tagesberichte,
sup_reports) - Tab Settings (API-Key, Modellwahl je Aufgabe, Kosten-/Tokenbudget, Bericht-Zeitplan)
Warum Modul statt Core-Fenster: passt ins etablierte Muster (eigene Persistenz sup_reports/
sup_conversations, eigene Settings, eigener Launcher-Button), hält die KI-Abhängigkeit aus dem Core
heraus und ist einzeln abschaltbar.
4a. Supervisor-„Team": Profile statt getrennter Agenten
Die Idee (technischer Supervisor + je Modul ein Strategie-Supervisor) ist richtig — aber als Profile über EINER gemeinsamen Infrastruktur, nicht als getrennte Agenten/Fenster/Prozesse:
| Profil | Fokus | Tools (Subset) | Kontext |
|---|---|---|---|
| Technik-Supervisor | Fehler-/Warning-Muster in Logs, Job-Health, API-Ausfälle, Latenzen, Reconciliation-Differenzen — KEINE Strategie-Meinung | read_logs, get_ledger_diff, query_order_events | Architektur-Doku |
| CopyTrading-Supervisor | Master-Qualität vs. Ausführungsqualität, Leiter-Verhalten, Reject-Muster | query_decisions, get_dossier, Predictalytics (Master-Historie) | + CopyTrading-Kontextabschnitt |
| ResolutionFarming-Supervisor | Kalibrierung (Winrate je Preisband vs. Erwartung), Cluster-Risiken, Scanner-Rejects | query_decisions, rf-Kontext, get_kpis | + RF-Kontextabschnitt |
| (später) Chef-Supervisor | fasst die Einzelberichte zusammen | die Berichte der anderen | Gesamtsicht |
Ein Profil = System-Prompt + Tool-Subset + Zeitplan + Modellwahl. Gleiche Registry, gleicher Agent-
Runner, gleiche UI (Profil-Auswahl im Analyse-Tab; Berichte je Profil). Modul-Wissen kommt über die
IAnalysisContextSource-Registrierung der Module — ein neues Modul bringt seinen Supervisor-Kontext
selbst mit, ohne dass der Supervisor es kennt.
Bewusst NICHT (v1): Agent-zu-Agent-Orchestrierung/Diskussionen — teuer, schwer debugbar, wenig Mehrwert. Profile laufen unabhängig (on-demand oder per Zeitplan); der „Chef" liest nur deren Berichte.
5. API-Key: ja, getrennt
Separater OpenRouter-Key für den Supervisor (getrennt von künftigen Trading-Modul-Keys wie dem AI-Markt-Rating):
- Kostenzuordnung — Forensik-Sessions können tokenintensiv werden; sauber getrennt sichtbar.
- Spend-Limits je Key bei OpenRouter → ein Analyse-Amok kann nie das Trading-Budget fressen (und umgekehrt).
- Unabhängige Rotation/Sperrung (Incident-Response, siehe Sicherheitskonzept).
- Modellwahl je Aufgabe: Routineberichte mit günstigem Modell, Tiefen-Forensik mit starkem Modell — je Aufgabe konfigurierbar.
Ablage: beide Keys über die vorhandene SecretProtection (F1-Mechanik) verschlüsselt — nicht im
Klartext in DB/Config.
6. Sicherheit (Verzahnung mit docs/sicherheit)
- OpenRouter = NEUER externer Datenempfänger. Bewusste Erweiterung der Egress-Allowlist (§5.3 im Sicherheitskonzept) + Dokumentation dort. Es verlassen uns: Trade-/Entscheidungs-/Log-Daten (Wallet- Adressen sind ohnehin öffentlich on-chain). Redaction-Schicht vor dem Versand: niemals Secrets/ Keys/Connection-Strings in Tool-Antworten (Log-Reader filtert Muster; Secrets stehen per F6-Prüfung ohnehin nicht in Logs — Doppelboden bleibt).
- Read-only by design: kein Order-/Schreib-Tool. Damit ist auch Prompt-Injection über Fremdtexte (Marktfragen in Dossiers) auf „falsche Analyse" begrenzt, kann aber nie handeln.
- Tool-Aufrufe des Agenten werden geloggt (sup_-Tabelle) — der Supervisor ist selbst auditierbar.
7. Phasen
- S-0 Datenfundament (Core):
core_decision_journal+ ReasonCode-Enum +SignalId-Durchreichung +core_order_events+ JSONL-Sink + Log Viewer im Terminal. Engine/Leiter/Monitor/RF schreiben strukturiert. Pure Logik + Tests; Migrationen offline. Sofortnutzen ohne KI (abfragbare Rejects, Log-Forensik per CorrelationId, Zielland-Debugging). - S-1 Dossier: Generator (pur, testbar) + Dossier-Browser-UI (Modul-Skelett Supervisor).
- S-2 Agent: OpenRouter-Client, Tool-Registry (read-only, transport-agnostisch), Analyse-Chat-Tab mit Profil-Auswahl (zunächst 1 Profil „Allgemein"), Architektur-Kontext-Dokument.
- S-3 Team & Berichte: Technik-/Modul-Supervisor-Profile, Batch-Analysen, Counterfactual-Report,
täglicher Threema-Bericht;
IPredictalyticsClient(Core) + Predictalytics-Tools. - S-4 MCP-Light (optional): Tool-Registry zusätzlich als lokaler MCP-Server für externe Clients.
8. Offene Entscheidungen (Richard)
- Start mit S-0 sofort? (Empfehlung: ja — nützt auch ohne KI und VOR dem Live-Start; alles Weitere baut darauf.)
- Counterfactual-Tracking („was wäre aus Rejects geworden") von Anfang an im Journal vorsehen (Resolution-Nachverfolgung abgelehnter Signale) oder später?
- Modellwahl-Defaults (günstig vs. stark) und Tokenbudget/Monat für den Supervisor.
- Tagesbericht via Threema gewünscht (S-3)?
- Text-Log-Sink nach Etablierung des Log Viewers abschalten (nur noch JSONL) oder dauerhaft dual?
- Predictalytics-API: Auth/Key-Mechanik und welche Endpoints der Supervisor bekommt (read-only-Subset).
Ergänzungen Richard (2026-07-16, eingearbeitet)
- ✅ Predictalytics-Daten als Analyse-Quelle (§2,
IPredictalyticsClientim Core, S-3). - ✅ Supervisor-„Team" — als Profile über einer Infrastruktur statt getrennter Agenten (§4a).
- ✅ Reasoning/Logs KI-freundlich als JSONL + menschenlesbarer Log Viewer im Terminal (§1, S-0).