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
+34 -23
View File
@@ -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 P5P8 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 **4161 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 **4161 PT** geschätzt. **Überholt — Stand 13.08.2026 sind noch 713 PT offen**, weil die Avalonia-Portierung (P5P8) 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 | **~3351 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 | **~713 Personentage offen** (Stand 13.08.2026). Die UI-Portierung ist inhaltlich durch (P5P8); 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) | **23 PT** |
| **P4** | PDF-Export: PDFsharp Core + `IFontResolver` + eingebettete Schrift | — | **12 PT** |
| **P5** | Charts auf LiveCharts2 | **+1 PT** (Entscheidung 8) | **2 PT** |
| **P6** | UI-Shell: Launcher, Fenstermenü (deklarativ!), `ShellUiHost`, Shutdown-, Lizenz-Dialog, Widgets | — | **57 PT** |
| **P7** | Core-Views: Dashboard, Settings, Jobs, Terminal (inkl. **2 PropertyGrid-Ersätze** + `RichTextBox`) | **+3 PT** (Entscheidung 4) | **1115 PT** |
| **P8** | Modul-Fenster: CopyTrading (5), ResolutionFarming, Supervisor, Accounting (inkl. **4 PropertyGrid-Ersätze**, 20 DataGrids) | **+2 PT** (Entscheidung 4) | **1420 PT** |
| **P9** | Tests, `--smoke-ui` auf `Avalonia.Headless`, Linux-CI | — | **34 PT** |
| **P10** | Deployment: systemd, TZ, Logrotate, Feldtest im Zielland | **0,5 PT** (Lizenz-Neubindung entfällt) | **34 PT** |
| **P11** | **WinForms endgültig ausbauen** (nach L4): `Ui/`, Designer-Dateien, `UseWindowsForms`, `WinExe` | **neu** (Entscheidung 3) | **1 PT** |
| | **Summe (offen)** | | **4161 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** | — | **23 PT** |
| **P10** | Deployment: systemd, TZ, Logrotate, Feldtest im Zielland | | **23 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** | **24 PT** |
| | **Summe (offen)** | | **713 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
**P1P4 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: **P1P4 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) | 69 PT | Zeitzone bei Installation festlegbar; Deploymentcenter angebunden; Linux-Kleinkram erledigt |
| **L2** | Headless-Einstiegspunkt + systemd + Feldtest im Zielland | 35 PT | **Trading läuft headless auf Linux.** ⭐ Meilenstein |
| **L3** | P5 + P6 + P7 (Charts, Shell, Core-Views) | 1824 PT | Avalonia-Grundgerüst steht; Dashboard, Settings, Terminal nutzbar |
| **L4** | P8 + P9 (Modul-Fenster, Tests, CI) | 1724 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)** | 24 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 | 24 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**) | 24 PT | Modul-Fenster portiert (`669676a`), Restlücken A1A4 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 4161 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 4161 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.
---