Plandokumente auf den tatsaechlichen Codestand gezogen

Beide Portierungsdokumente hingen dem Code hinterher. Commit 7f0b05e setzte A1
bis A4 um, ohne eine einzige Markdown-Datei mitzuziehen - der Leitfaden wies die
vier Punkte weiter als offen aus. Ein Agent, der ihn als Arbeitsanweisung nimmt,
haette sie ein zweites Mal gebaut.

LEITFADEN-Avalonia-Portierung.md:
- A1 bis A4 als erledigt markiert, mit Ist-Tabelle: wo der Code liegt und dass
  auch die Feinheiten sitzen (nullables GetService fuer Supervisor, LaunchUriAsync
  statt Process.Start, DialogWindow.Confirm vor Delete, ContextMenu mit beiden
  Eintraegen). Die Soll-Beschreibungen bleiben als Pruefvorlage fuer A5 stehen.
- A5 (Durchsehen mit echten Daten) als einziger offener Punkt ausgewiesen.
- Abschnitt B um das Lizenz-Gate und den Watchdog-Heartbeat ergaenzt. Wichtig fuer
  den Naechsten: die Avalonia-App setzt derzeit GAR KEINE Lizenz durch, waehrend
  die WinForms-Fassung das Gate weiter hat. Beides kommt mit dem Deploymentcenter
  neu, also dort nichts mehr investieren.
- Neuer Abschnitt C fuer Folgepunkte ohne Blockerwirkung.

ANALYSE-Linux-Portierung.md (Revision 5):
- P5 bis P8 als erledigt, Stufen L3 und L4 entsprechend; Restaufwand von 33-51 PT
  auf 7-13 PT korrigiert.
- Offen bleiben P3c (Deploymentcenter, steht als Naechstes), CI, systemd/Feldtest,
  WinForms-Ausbau und die Abnahme A5.
- Historische Aufwandszahlen als Rueckblick gekennzeichnet statt geloescht.

Nachgeprueft statt uebernommen: A1-A4 gegen den Code verifiziert, ebenso dass es
keinerlei CI-Konfiguration gibt (weder .github noch .gitea) und dass --headless in
App.Avalonia/Program.cs bereits existiert.

Beim Pruefen aufgefallen, kein Fehler: TerminalLogger schreibt die Tagesdatei mit
DateTime.Now und der Launcher liest sie mit DateTime.Now - konsistent, aber beide
ignorieren die in P2 eingefuehrte AppTimeZone. Als Folgepunkt C notiert, relevant
erst beim Headless-Betrieb auf einem UTC-Server.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-08-13 21:59:10 +02:00
co-authored by Claude Opus 5
parent 7f0b05e9ba
commit ac5e16f0a6
2 changed files with 73 additions and 34 deletions
+39 -11
View File
@@ -1,6 +1,6 @@
# Portierungsleitfaden Avalonia (Fortsetzung)
**Stand:** 06.08.2026 · **Zielgruppe:** KI-Agent, der die UI-Portierung fortsetzt
**Stand:** 13.08.2026 (A1A4 abgehakt, Deploymentcenter-Hinweis) · **Zielgruppe:** KI-Agent, der die UI-Portierung fortsetzt
**Vorgänger-Dokumente:** [`UI-SPEZIFIKATION-WinForms.md`](UI-SPEZIFIKATION-WinForms.md) (wie die alte
Oberfläche aussah), [`ANALYSE-Linux-Portierung.md`](ANALYSE-Linux-Portierung.md) (Gesamtplan)
@@ -171,11 +171,26 @@ public MeinFenster(IModuleUiHost host, /* Abhängigkeiten */) : this()
## 3. Was noch fehlt — die Aufgabenliste
Der Stand ist ehrlich gesagt: **alle acht Fenster existieren und konstruieren, aber mehrere sind
inhaltlich unvollständig.** Ich habe sie gegen den Tag `winforms-final` verglichen. Sortiert nach
Wichtigkeit:
> **Stand 13.08.2026 (nachgeprüft am Code):** A1A4 sind mit Commit `7f0b05e` **umgesetzt**. Der
> Commit hat dieses Dokument seinerzeit nicht mitgezogen, weshalb die Liste unten zwei Wochen lang
> Arbeit als offen auswies, die längst erledigt war. **Real offen ist nur noch A5.**
>
> Die Beschreibungen von A1A4 bleiben als *Soll-Spezifikation* stehen — sie sind die Vorlage, gegen
> die bei A5 geprüft wird. Was tatsächlich gebaut wurde:
### A1 — Launcher: Live-Überblick fehlt vollständig ⚠️ größte Lücke
| | Soll | Ist (geprüft) |
|---|---|---|
| **A1** ✅ | Drei Widgets + Modul-KPIs | [`LauncherWindow.axaml`](../src/PolyTrader.App.Avalonia/Views/LauncherWindow.axaml) — „Auffällige Trades (24h)", „Warnungen & Fehler (heute)", „Supervisor-KI", `Modul-KPIs` als `ItemsControl`. Supervisor korrekt über nullables `GetService<ISupervisorReportRepository>()`. |
| **A2** ✅ | Account-Übersicht mit Profil-Schaltfläche | Spalten inkl. „3T Winrate %" / „Overall P/L"; `OnOpenPolymarketProfileClick` nutzt wie empfohlen `TopLevel.Launcher.LaunchUriAsync`, mit Hinweis bei fehlender Wallet-Adresse. |
| **A3** ✅ | „Neu" + „Löschen" für Master-Trader | [`CopyTradingWindow.axaml.cs`](../src/PolyTrader.App.Avalonia/Views/Modules/CopyTradingWindow.axaml.cs) — `DeleteSelectedTrader()` mit `DialogWindow.Confirm` vor `_traderRepo.Delete(id)`. |
| **A4** ✅ | Kontextmenü im Terminal | [`TerminalWindow.axaml`](../src/PolyTrader.App.Avalonia/Views/TerminalWindow.axaml) — `<ContextMenu>` am `ScrollViewer` mit „Kopieren" und „Alles auswählen". |
**Wenn du hier etwas änderst, zieh dieses Dokument im selben Commit mit.** Genau das ist beim
letzten Mal unterblieben.
---
### A1 — Launcher: Live-Überblick ✅ ERLEDIGT (Commit `7f0b05e`)
Die WinForms-Fassung hatte unter den Fenster-Buttons ein `LauncherWidgetsPanel` (205 + 244 LOC) mit
drei Bereichen nebeneinander in einem `TableLayoutPanel`:
@@ -193,7 +208,7 @@ Dazu die **Modul-KPIs** (`UpdateModuleKpis`): je Modul PnL/Winrate aus dem Trade
**Achtung:** Der Supervisor-Teil darf nur erscheinen, wenn das Modul geladen ist — nutze
`services.GetService<…>()` (nullable) statt `GetRequiredService`.
### A2 — Launcher: Account-Übersicht fehlt vollständig ⚠️
### A2 — Launcher: Account-Übersicht ✅ ERLEDIGT (Commit `7f0b05e`)
Grid mit: Account, Module, Polymarket, Wallet (USDC), 3T PnL, 3T Winrate %, Overall P/L.
Die Spalte „Polymarket" war ein **Button**, der das Polymarket-Profil des Kontos im Browser öffnet.
@@ -206,7 +221,7 @@ funktioniert auch auf Linux, ist aber unnötig — nimm stattdessen
`TopLevel.GetTopLevel(this)!.Launcher.LaunchUriAsync(new Uri(url))`. Das ist Avalonias
plattformneutraler Weg.
### A3 — Copytrading: „Neu" und „Löschen" für Master-Trader fehlen
### A3 — Copytrading: „Neu" und „Löschen" für Master-Trader ✅ ERLEDIGT (Commit `7f0b05e`)
Die WinForms-`MasterTradersView` hatte vier Werkzeugleisten-Schaltflächen: Aktualisieren, **Neu**,
Speichern, **Löschen**. Im Avalonia-Fenster sind nur Aktualisieren und Speichern verdrahtet.
@@ -217,16 +232,16 @@ Speichern, **Löschen**. Im Avalonia-Fenster sind nur Aktualisieren und Speicher
Löschen mit `DialogWindow.Confirm` absichern, danach `ITrackedTraderRepository.Delete(id)` und den
Eintrag aus `CopyTradingState.Traders` entfernen.
### A4 — Terminal: Kontextmenü fehlt
### A4 — Terminal: Kontextmenü ✅ ERLEDIGT (Commit `7f0b05e`)
Vorhanden sind Schaltflächen für „Alles kopieren" und „Terminal leeren". Es fehlen die Einträge
**„Kopieren" (nur Auswahl)** und **„Alles auswählen"** als Kontextmenü auf der Log-Ausgabe.
In Avalonia deklarativ über `<ContextMenu>` am Container, gebunden an Befehle im Code-Behind.
### A5 — Durchsehen mit echten Daten
### A5 — Durchsehen mit echten Daten ⬅️ **der einzige noch offene Punkt**
Ich habe alle Fenster **konstruiert** und die App laufen lassen, aber **nicht jedes Fenster mit
Alle Fenster wurden **konstruiert** und die App lief, aber es wurde **nicht jedes Fenster mit
echten Daten durchgeklickt**. Layout-Details siehst du erst im Gebrauch:
- Spaltenbreiten (feste Pixel wurden teils in Sternbreiten übersetzt)
@@ -238,11 +253,24 @@ echten Daten durchgeklickt**. Layout-Details siehst du erst im Gebrauch:
### B — Bewusst zurückgestellt (NICHT anfassen)
> **Stand 13.08.2026:** Die Deploymentcenter-Integration steht unmittelbar bevor und ersetzt
> **Lizenzverwaltung, Watchdog und Error-Reporting** noch einmal grundlegend. Alles, was unten
> steht, wird davon berührt — fass es nicht an, sonst ist es Wegwerfarbeit.
| Was | Warum |
|---|---|
| **Lizenzdialog** (`LicenseDialog`) | Hängt am alten LicenseLabrador-SDK, das durch die Deploymentcenter-Anbindung ersetzt wird. Eine Portierung wäre Wegwerfarbeit. Die Schaltfläche „Lizenz prüfen / setzen …" fehlt deshalb im Einstellungsfenster. |
| **Lizenzdialog** (`LicenseDialog`) | Hängt am alten LicenseLabrador-SDK, das durch die Deploymentcenter-Anbindung ersetzt wird. Die Schaltfläche „Lizenz prüfen / setzen …" fehlt deshalb im Einstellungsfenster. |
| **Lizenz-Startprüfung** (`LicenseGate`) | In der Avalonia-App **bewusst nicht verdrahtet**. Konsequenz, die man kennen muss: der Avalonia-Build setzt derzeit **gar keine Lizenz durch** — alle Module laufen ungeprüft. In der WinForms-Fassung ([`Program.cs`](../Program.cs)) gibt es das Gate weiterhin. Kommt mit dem Deploymentcenter neu. |
| **Watchdog-Heartbeat** | `WatchdogHeartbeatService` **ist** in der Avalonia-App registriert und läuft. Wird vom Deploymentcenter abgelöst — keine Erweiterungen mehr investieren. |
| **WinForms-Projekt entfernen** | Erst wenn die Avalonia-Fassung abgenommen ist. Betrifft `PolyTrader.App` und `Ui/`. |
### C — Kleinere Folgepunkte (kein Blocker)
| Was | Befund |
|---|---|
| Logging kennt `AppTimeZone` nicht | [`TerminalLogger.cs:23`](../src/PolyTrader.Core/Services/TerminalLogger.cs) stempelt mit `DateTime.Now`, und der Launcher liest die Tagesdatei mit `DateTime.Now`. Schreiber und Leser stimmen also überein — **kein Fehler**. Beide ignorieren aber die in P2 eingeführte konfigurierbare Zeitzone, sodass auf einem UTC-Linuxserver mit Anzeigezone `Europe/Berlin` die Dateigrenzen nicht zur angezeigten Uhrzeit passen. Beim Headless-Schritt (L2) mitbehandeln. |
| Ungenutzte Designer-Felder | Der Solution-Build wirft 23 Warnungen, überwiegend `CS0169` aus WinForms-Designer-Resten. Verschwinden mit dem WinForms-Ausbau von selbst. |
---
## 4. Wie du prüfst, ob es funktioniert