From ac5e16f0a6531334d1688b6035077defd2161d93 Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 13 Aug 2026 21:59:10 +0200 Subject: [PATCH] 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 --- docs/ANALYSE-Linux-Portierung.md | 57 ++++++++++++++++----------- docs/LEITFADEN-Avalonia-Portierung.md | 50 +++++++++++++++++------ 2 files changed, 73 insertions(+), 34 deletions(-) diff --git a/docs/ANALYSE-Linux-Portierung.md b/docs/ANALYSE-Linux-Portierung.md index 01a084c..748e815 100644 --- a/docs/ANALYSE-Linux-Portierung.md +++ b/docs/ANALYSE-Linux-Portierung.md @@ -1,7 +1,12 @@ # Analyse & Umsetzungsrahmen: Linux-Fähigkeit von PolyTrader -**Stand:** 06.08.2026 · **Revision 4** (P1 + P3b + P4 umgesetzt – nur noch PolyTrader.App ist Windows-gebunden) -**Basis:** 7 Projekte, ~24.250 LOC Produktivcode (ohne Tests/EF-Migrationen), 448 Tests +**Stand:** 13.08.2026 · **Revision 5** (Avalonia-Portierung P5–P8 durch; offen sind Deploymentcenter, CI, systemd/Feldtest, WinForms-Ausbau) +**Basis:** 8 Projekte auf `net10.0` (`PolyTrader.App` als `net10.0-windows` noch als Fallback), 450 Tests + +> **Als Nächstes:** die Integration des überarbeiteten **Deploymentcenters** (P3c). Sie ersetzt +> **Lizenzverwaltung, Watchdog und Error-Reporting** grundlegend. Alles, was in diesem Dokument zu +> LicenseLabrador oder zum Watchdog-Heartbeat steht, ist damit Übergangszustand — dort nichts mehr +> ausbauen. --- @@ -18,7 +23,7 @@ | 7 | Threema | **entfernt** ✅; Nachfolger: **RocketChat + Telegram** | umgesetzt am 06.08.2026, siehe [5.3](#53-threema--entfernt-) | | 8 | Charts | **LiveCharts2** bestätigt (nach Klarstellung, dass die Integration nicht komplex ist) | +1 PT ggü. ScottPlot.Avalonia | -**Netto-Effekt auf den Gesamtaufwand:** leicht gesunken auf **41–61 PT**. PropertyGrid (+5 PT) und LiveCharts2 (+1 PT) stehen gegen den bereits **erledigten** Threema-Ausbau (−2 PT), die vereinfachte Zeitzonen-Anforderung (−1 PT) und den entfallenden Lizenz-Umbau (−2 PT). +**Netto-Effekt auf den Gesamtaufwand:** damals auf **41–61 PT** geschätzt. **Überholt — Stand 13.08.2026 sind noch 7–13 PT offen**, weil die Avalonia-Portierung (P5–P8) inzwischen durch ist; siehe [Abschnitt 7](#7-fahrplan). --- @@ -29,9 +34,9 @@ | Ist es machbar? | Ja, ohne architektonische Sackgassen. | | Was ist der Löwenanteil? | Die UI. ~8.300 LOC (34 % des Produktivcodes) hängen an WinForms. | | Was ist überraschend gut? | Die **gesamte Trading-Kernlogik ist bereits portabel**: kein einziger `DllImport`, keine Registry, keine WMI, keine DPAPI, keine `SpecialFolder`, saubere `Path.Combine`-Nutzung. Nethereum, Pomelo/EF, `HttpClient`, `ClientWebSocket`, AES-GCM laufen unverändert. | -| Was ist der teuerste Einzelpunkt? | Der **`PropertyGrid`-Ersatz** durch handgebaute Steuerelemente (6 Instanzen in 4 Fenstern). | -| Gesamtaufwand | **~33–51 Personentage offen** (P1, P3b, P4 und der Kultur-Fix sind erledigt) | -| Wichtigste Erkenntnis | **Für ~15 PT (≈ 25 %) bekommst du 80 % des Nutzens**: Der Trading-Kern läuft headless auf Linux, die WinForms-UI bleibt als eingefrorener Fallback. Siehe [Abschnitt 7](#7-fahrplan). | +| Was war der teuerste Einzelpunkt? | Der **`PropertyGrid`-Ersatz** — erledigt, ersetzt durch den kategorisierten `SettingsEditor`. | +| Gesamtaufwand | **~7–13 Personentage offen** (Stand 13.08.2026). Die UI-Portierung ist inhaltlich durch (P5–P8); offen sind nur noch **P3c Deploymentcenter**, **CI**, **systemd/Feldtest**, der **WinForms-Ausbau** und die Abnahme A5. | +| Wichtigste Erkenntnis | Galt: „Für ~15 PT bekommst du 80 % des Nutzens." **Eingetreten und überholt** — die UI wurde nicht als Fallback eingefroren, sondern vollständig nach Avalonia portiert. Der Rückfallstand liegt im Tag `winforms-final`. Siehe [Abschnitt 7](#7-fahrplan). | --- @@ -423,14 +428,15 @@ Heute laufen Generic Host und `Application.Run` im **selben Prozess**; darunter | ~~**P3b**~~ | ~~Threema-Ausbau + `INotificationSink`~~ | **erledigt 06.08.2026** ✅ | ~~2 PT~~ | | **P3c** | **Lizenz/Watchdog auf Deploymentcenter umstellen** | **neu** (Entscheidung 5) | **2–3 PT** | | **P4** | PDF-Export: PDFsharp Core + `IFontResolver` + eingebettete Schrift | — | **1–2 PT** | -| **P5** | Charts auf LiveCharts2 | **+1 PT** (Entscheidung 8) | **2 PT** | -| **P6** | UI-Shell: Launcher, Fenstermenü (deklarativ!), `ShellUiHost`, Shutdown-, Lizenz-Dialog, Widgets | — | **5–7 PT** | -| **P7** | Core-Views: Dashboard, Settings, Jobs, Terminal (inkl. **2 PropertyGrid-Ersätze** + `RichTextBox`) | **+3 PT** (Entscheidung 4) | **11–15 PT** | -| **P8** | Modul-Fenster: CopyTrading (5), ResolutionFarming, Supervisor, Accounting (inkl. **4 PropertyGrid-Ersätze**, 20 DataGrids) | **+2 PT** (Entscheidung 4) | **14–20 PT** | -| **P9** | Tests, `--smoke-ui` auf `Avalonia.Headless`, Linux-CI | — | **3–4 PT** | -| **P10** | Deployment: systemd, TZ, Logrotate, Feldtest im Zielland | **−0,5 PT** (Lizenz-Neubindung entfällt) | **3–4 PT** | -| **P11** | **WinForms endgültig ausbauen** (nach L4): `Ui/`, Designer-Dateien, `UseWindowsForms`, `WinExe` | **neu** (Entscheidung 3) | **1 PT** | -| | **Summe (offen)** | | **41–61 PT** | +| ~~**P5**~~ | ~~Charts auf LiveCharts2~~ | — | ✅ **erledigt** (`0b8728b`) | +| ~~**P6**~~ | ~~UI-Shell: Launcher, Fenstermenü (deklarativ!), `ShellUiHost`, Shutdown-Dialog, Widgets~~ | — | ✅ **erledigt** (`cd59e5c`, `7f0b05e`). Lizenzdialog **bewusst ausgenommen** → kommt mit P3c | +| ~~**P7**~~ | ~~Core-Views: Dashboard, Settings, Jobs, Terminal~~ | — | ✅ **erledigt** (`0b8728b`, `4ba8149`, `929fa20`) – PropertyGrid durch kategorisierten `SettingsEditor` ersetzt | +| ~~**P8**~~ | ~~Modul-Fenster: CopyTrading, ResolutionFarming, Supervisor, Accounting~~ | — | ✅ **erledigt** (`669676a`, `7f0b05e`) | +| **P9** | Tests ✅ (450 grün), `--smoke-ui` auf `Avalonia.Headless`, **Linux-CI fehlt vollständig** | — | **2–3 PT** | +| **P10** | Deployment: systemd, TZ ✅, Logrotate, Feldtest im Zielland | — | **2–3 PT** | +| **P11** | **WinForms endgültig ausbauen** (nach L4): `Ui/`, Designer-Dateien, `UseWindowsForms`, `WinExe` | — | **1 PT** | +| **P3c** | **Deploymentcenter**: Lizenzverwaltung, Watchdog, Error-Reporting neu | ⬅️ **als Nächstes** | **2–4 PT** | +| | **Summe (offen)** | | **7–13 PT** | *Personentage entwickelnder Arbeit. Mit Agentenunterstützung sinkt die Kalenderzeit deutlich; der Review- und Feldtest-Anteil (P9, P10) bleibt weitgehend gleich – bei einer Anwendung, die echtes Geld bewegt, ist das die richtige Reihenfolge.* @@ -438,22 +444,27 @@ Heute laufen Generic Host und `Application.Run` im **selben Prozess**; darunter ## 7. Fahrplan -### Die zentrale Erkenntnis bleibt +### Die zentrale Erkenntnis — eingetreten, dann überholt -**P1–P4 brauchen kein Avalonia.** Sie sind auf Windows entwickelbar und verifizierbar. Zusammen mit einem headless-Einstiegspunkt hast du für **~15 PT von rund 50** den eigentlichen Nutzen: +Ursprünglich galt: **P1–P4 brauchen kein Avalonia**, und mit einem headless-Einstiegspunkt hätte man +für ~15 PT von rund 50 den eigentlichen Nutzen — Bot auf Linux, WinForms-UI als eingefrorener +Fallback. -> Der **Bot läuft auf Linux**. Die **WinForms-UI bleibt als eingefrorener Fallback** (Entscheidung 3) und greift über dieselbe MySQL auf dieselben Daten zu. +**So ist es nicht gekommen, und das ist gut so.** Die Portierung lief weiter, bis die Oberfläche +vollständig unter Avalonia stand. Der Fallback wurde damit vom Dauerzustand zur reinen +Rückversicherung im Tag `winforms-final`. Der aktuelle Engpass ist nicht mehr die UI, sondern die +**Betriebsreife**: Deploymentcenter, CI, systemd und der Feldtest im Zielland. | Stufe | Inhalt | Aufwand | Ergebnis | |---|---|---:|---| | ~~**L0**~~ | ~~Kultur-Bug~~ | — | ✅ **erledigt** – Faktor-100-Preisfehler behoben, 10 Regressionstests | | ~~**L0b**~~ | ~~Threema-Ausbau + `INotificationSink`~~ | — | ✅ **erledigt** – 36 Dateien raus, 448 Tests grün, 8 Warnungen weniger | | ~~**L1a**~~ | ~~Tag `winforms-final` + P1 (Core/Module entkoppeln) + P4 (PDF)~~ | — | ✅ **erledigt** – Core, 4 Module und Testprojekt sind `net8.0`; alle sechs publishen für linux-x64 ohne Windows-Pakete; 442 Tests grün | -| **L1b** | P0 (Avalonia-Spike) + P2 (Zeitzone/Kultur) + P3 (Mullvad, Dateirechte) + P3c (Deploymentcenter) | 6–9 PT | Zeitzone bei Installation festlegbar; Deploymentcenter angebunden; Linux-Kleinkram erledigt | -| **L2** | Headless-Einstiegspunkt + systemd + Feldtest im Zielland | 3–5 PT | **Trading läuft headless auf Linux.** ⭐ Meilenstein | -| **L3** | P5 + P6 + P7 (Charts, Shell, Core-Views) | 18–24 PT | Avalonia-Grundgerüst steht; Dashboard, Settings, Terminal nutzbar | -| **L4** | P8 + P9 (Modul-Fenster, Tests, CI) | 17–24 PT | WinForms funktional abgelöst | -| **L5** | P11 – WinForms endgültig aus dem Build entfernen | 1 PT | Keine Altlast mehr; ~4.500 LOC Designer-Code fallen weg | +| **L1b** | P0 ✅ + P2 ✅ + P3 (Mullvad, Dateirechte) + **P3c (Deploymentcenter)** | 2–4 PT | P0/P2 erledigt (Spike wurde zur vollen Portierung; Zeitzone konfigurierbar). **Offen: P3c — steht als Nächstes an** und ersetzt Lizenzverwaltung, Watchdog und Error-Reporting grundlegend. | +| **L2** | ~~Headless-Einstiegspunkt~~ ✅ + systemd + Feldtest im Zielland | 2–4 PT | `--headless` existiert ([`App.Avalonia/Program.cs:41`](../src/PolyTrader.App.Avalonia/Program.cs)). Offen: systemd-Unit + Feldtest. **Trading läuft headless auf Linux.** ⭐ Meilenstein | +| ~~**L3**~~ | ~~P5 + P6 + P7 (Charts, Shell, Core-Views)~~ | — | ✅ **erledigt** – Avalonia-Grundgerüst (`cd59e5c`), Dashboard mit LiveCharts2 (`0b8728b`), Settings (`4ba8149`), Terminal (`929fa20`), Dunkelmodus (`487ea44`) | +| **L4** | ~~P8 (Modul-Fenster)~~ ✅ + P9 (**CI**) | 2–4 PT | Modul-Fenster portiert (`669676a`), Restlücken A1–A4 geschlossen (`7f0b05e`), 450 Tests grün. **Offen: es gibt keinerlei CI-Konfiguration** – weder `.github/workflows` noch `.gitea/workflows`. | +| **L5** | P11 – WinForms endgültig aus dem Build entfernen | 1 PT | Erst nach Abnahme (A5). Keine Altlast mehr; ~4.500 LOC Designer-Code fallen weg, die 23 Build-Warnungen verschwinden mit | ### Reihenfolge-Begründung @@ -500,7 +511,7 @@ Heute laufen Generic Host und `Application.Run` im **selben Prozess**; darunter - **Watchdog-Payload-Schema** (`source`/`instance`/`interval` passen bereits zur Deploymentcenter-API), Modularitäts-Infrastruktur - **438 von 448 Tests** -Das ist der Grund, warum die Schätzung trotz 24.000 LOC bei 41–61 PT landet und nicht bei 150: **Zwei Drittel des Codes sind bereits plattformneutral, und die Trennung ist sauber.** +Das ist der Grund, warum die Schätzung trotz 24.000 LOC damals bei 41–61 PT landete und nicht bei 150: **Zwei Drittel des Codes waren bereits plattformneutral, und die Trennung war sauber.** Rückblickend hat sich das bestätigt — die Portierung lief schneller als veranschlagt. --- diff --git a/docs/LEITFADEN-Avalonia-Portierung.md b/docs/LEITFADEN-Avalonia-Portierung.md index 708c2d8..e80be14 100644 --- a/docs/LEITFADEN-Avalonia-Portierung.md +++ b/docs/LEITFADEN-Avalonia-Portierung.md @@ -1,6 +1,6 @@ # Portierungsleitfaden Avalonia (Fortsetzung) -**Stand:** 06.08.2026 · **Zielgruppe:** KI-Agent, der die UI-Portierung fortsetzt +**Stand:** 13.08.2026 (A1–A4 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):** A1–A4 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 A1–A4 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()`. | +| **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) — `` 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 `` 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