Projektstand dokumentiert; Modularisierungsplan auf den Iststand nachgezogen

docs/PROJEKTSTAND.md neu: Einstiegsdokument mit Gesamtueberblick - Architektur,
Modul-Stand, was abgeschlossen ist und was offen. Alle Angaben am Code
nachgeprueft, nicht aus den Plandokumenten uebernommen. Die offenen Punkte sind
danach getrennt, ob sie am Schreibtisch erledigt werden koennen oder echtes
Geld/den Zielserver brauchen - das war vorher nirgends zusammengefasst.

Modularisierungsplan korrigiert: Die Phasen 3 bis 6 standen auf "IN ARBEIT"
beziehungsweise offen, obwohl die Arbeit seit Wochen getan war. Nachgeprueft und
abgehakt sind unter anderem:
- Phase 5: alle Modul-Services liegen im Modulprojekt, frm_main ist weg, alle
  vier Module implementieren IPolyTraderModule
- Phase 6: komplett - kein MongoDB.Driver/LiteDB mehr in irgendeiner csproj
- Phase 7 teilweise: 476 Tests, keine leeren catch-Bloecke mehr,
  Secrets-Verschluesselung umgesetzt (AES-GCM statt DPAPI, da DPAPI Windows-only
  ist und die Linux-Portierung blockiert haette)
Offen bleiben aus Phase 7 nur God-Methoden und die TerminalLogger-Umstellung.

Beim Nachpruefen aufgefallen: Accounting A-3 (US-Steuerschicht, Form 8949) ist
entgegen der bisherigen Annahme nicht gebaut - es gibt keinen UsTaxEngine.
A-2 und A-4 dagegen sind da. Im Projektstand vermerkt.

docs/README.md verweist jetzt auf den Projektstand und fuehrt die bisher
fehlenden Ordner sicherheit/ und den Deploymentcenter-Plan auf.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-08-22 11:04:02 +02:00
co-authored by Claude Opus 5
parent bf8048b82a
commit 1fd3671b42
3 changed files with 277 additions and 42 deletions
@@ -1,8 +1,18 @@
# Umsetzungsplan: Modularisierung PolyTraderSharp
> Stand: 2026-07-01
> Ziel: Umbau des monolithischen WinForms-Copytraders in ein modulares System
> mit einem schlanken **Core** und unabhängigen **Modulen**. Erstes Modul: **Copytrading**.
> **Stand: 22.08.2026 — Ziel erreicht, Plan weitgehend abgearbeitet.**
> Ursprünglicher Plan vom 01.07.2026. Ziel war der Umbau des monolithischen
> WinForms-Copytraders in ein modulares System mit schlankem **Core** und unabhängigen
> **Modulen**. Erstes Modul: **Copytrading**.
>
> **Was daraus geworden ist:** Der Core steht, und es sind **vier** Module entstanden —
> CopyTrading, ResolutionFarming, Supervisor und Accounting. Die Phasen 06 sind
> abgeschlossen, der WinForms-Monolith ist am 22.08.2026 vollständig aus dem Repo entfernt.
> Offen sind nur noch zwei bewusst zurückgestellte Nacharbeiten aus Phase 7.
>
> ⚠️ **Die Phasen 36 waren bis zum 22.08.2026 fälschlich als „IN ARBEIT" bzw. offen
> markiert** — die Arbeit war längst getan, der Plan wurde nur nicht mitgezogen. Die
> Häkchen unten sind am Code nachgeprüft, nicht aus der Erinnerung gesetzt.
---
@@ -208,7 +218,7 @@ Modul-Instanz.
- [ ] *Offen (bewusst später):* Alchemy-Key / Mullvad-Account / Threema bleiben vorerst
im GUI-editierbaren `server_settings.xml` (kein Konflikt mit Settings-Tab).
### Phase 3 — Persistenz-Abstraktion (DB noch Mongo) *(IN ARBEIT)*
### Phase 3 — Persistenz-Abstraktion *(ABGESCHLOSSEN — nachgetragen 22.08.2026)*
- [x] **3a** (`8b3264f`): Core-Modelle `AccountState`/`Position`/`MarketData` in den Core
verschoben (Namespace `PolyTraderSharp.Models` beibehalten), MongoDB.Driver-Paket im Core.
- [x] **3b** (`ed5d6e3`): Repository-Interfaces + Mongo-Implementierungen im Core
@@ -217,13 +227,13 @@ Modul-Instanz.
- [x] **3d — Hot-Path** (`a0e367e`, `0c6fc6a`): TraderMonitorService + CopyTradingEngine
auf `IPositionRepository`/`IMarketRepository`/`IAccountRepository` umgestellt.
`_db` aus CopyTradingEngine komplett entfernt; Verhalten unverändert.
- [ ] **frm_main-UI:** Account/Market/Demo-Position-Zugriffe → wird zusammen mit der
UI-Zerlegung in Phase 5 migriert (vermeidet Wegwerf-Arbeit).
- [ ] *Offen für Phase 5:* generisches `ITradeLogRepository` (Core) + `ICopyTradeLogRepository`
+ `ITraderRepository` (Modul), sobald `ClosedTrade`/`TrackedTrader` ins Modul wandern.
- [ ] **Ergebnis (Ziel):** Kein direkter DB-Zugriff mehr außerhalb der Repository-Schicht.
- [x] **frm_main-UI:** erledigt — `frm_main` existiert nicht mehr (Avalonia-Portierung,
Rest mit dem WinForms-Ausbau am 22.08.2026 gelöscht).
- [x] Generisches `ITradeLogRepository` (Core) + `ICopyTradeLogRepository` + `ITrackedTraderRepository`
(Modul) sind gebaut und in Gebrauch.
- [x] **Ergebnis erreicht:** Kein direkter DB-Zugriff mehr außerhalb der Repository-Schicht.
### Phase 4 — Core herauslösen *(IN ARBEIT)*
### Phase 4 — Core herauslösen *(ABGESCHLOSSEN — nachgetragen 22.08.2026)*
- [x] **4.1** (`9039af8`): TerminalLogger, JobManager, JobStatusRow → Core;
toten Stub `logging.cs` gelöscht.
- [x] **4.2** (`eebe992`): PolymarketClobClient → Core (+ Nethereum.Web3), reines Verschieben.
@@ -235,9 +245,9 @@ Modul-Instanz.
- [x] **4.6a** (`9c068b4`): CopySignal + PolymarketApiService → Core.
- [x] **4.7** (`0ffc041`): MullvadVpnService + ThreemaService (+ Threema-Lib-Ref) → Core;
toter Stub `mullvad.cs` gelöscht.
- [ ] **BLOCKIERT durch TradingState-Split (→ Phase 5):** MarketSyncService,
AlchemyWebsocketService, PolymarketWssClient, SnapshotService nutzen `TradingState`
(MarketCache/Accounts/globale Flags). Sie können erst nach dem Split in den Core.
- [x] **Ehemals blockiert durch den TradingState-Split:** aufgelöst. `MarketSyncService` und die
Streaming-Infrastruktur liegen im Core (`src/PolyTrader.Core/Streaming/`); `PolymarketWssClient`
ist bewusst im CopyTrading-Modul geblieben, weil er modulspezifisch filtert.
- [x] **Ergebnis:** Core baut eigenständig und enthält jetzt: Modelle (Account/Position/
Market/CopySignal/JobStatusRow/ServerSettings), Repository-Schicht, Config, Logging,
JobManager, CLOB-Client, API-Service, Mullvad, Threema, IPolyTraderModule.
@@ -253,7 +263,7 @@ Dreh- und Angelpunkt für Phase 5.
> Signal). Das entkoppelt die Polymarket-Infrastruktur sauber in den Core. Der Channel/Workflow
> bleibt Copytrading. Umbenennung zu `TradeSignal` optional/später.
### Phase 5 — CopyTrading-Modul herauslösen *(IN ARBEIT)*
### Phase 5 — CopyTrading-Modul herauslösen *(ABGESCHLOSSEN — nachgetragen 22.08.2026)*
- [x] **5.1** (`55050a1`): Modul-Modelle (TrackedTrader, TraderAnalyticsResult,
MasterTraderHistoryRecord) ins Modul verschoben.
- [x] **5.2** (`f8d395b`): **TradingState-Split** — Core `TradingState` (globale Schalter,
@@ -268,11 +278,11 @@ Dreh- und Angelpunkt für Phase 5.
(+ Mongo-Impl) im Modul; `closed_trades`-Zugriffe der Services (TraderMonitor,
Persistence, WSS, TraderAnalytics) auf das Repo umgestellt. TraderMonitor nutzt kein
`_db` mehr. frm_main/Program.cs bleiben auf `_db`.
- [ ] **5.3b (jetzt unblockiert):** Modul-Services physisch ins Modul-Projekt verschieben:
TraderMonitorService, CopyTradingEngine, TraderAnalyticsJob, MasterTraderAnalyticsJob.
(Vorher: reststehende `PolyTraderSharp.Extensions`-Usings in CopyTradingEngine entfernen.)
- [ ] **5.3-WSS 2/2:** `CopyTradingBlockchainListener` → Modul (eigener Key + Filter);
API-Keys → Modul-Settings. Analog `PolymarketWssClient`.
- [x] **5.3b:** erledigt — `TraderMonitorService`, `CopyTradingEngine`, `TraderAnalyticsJob`,
`MasterTraderAnalyticsJob` und `PersistenceService` liegen unter
`src/PolyTrader.Modules.CopyTrading/Services/`.
- [x] **5.3-WSS 2/2:** erledigt — `PolymarketWssClient` liegt im Modul, die generische
Verbindungsschicht (`IBlockchainWssClient` + Factory) im Core.
- **UI-Trennung (Launcher-Modell, entschieden 2026-07-01):** Hauptfenster = schlanke
Startleiste; jede Ansicht öffnet als eigenständiges Fenster. Module liefern designbare
`UserControl`s via `IPolyTraderModule.RegisterUi` / `IModuleUiHost`. `frm_main` bleibt
@@ -280,32 +290,41 @@ Dreh- und Angelpunkt für Phase 5.
- [x] UI-Contract im Core (`IModuleUiHost`, `ModuleView`, `RegisterUi`) — `26dd68a`.
- [x] Proof-of-Pattern: `LauncherForm` + `ViewHostForm` + `ShellUiHost` + erste View
`TerminalView` (designbar); App startet Launcher — `3503bbb`.
- [ ] Restliche Views view-für-view extrahieren:
**App/Core:** Jobs, Server Settings, Dashboard (Overview), License, Accounts (Slave),
Offene Positionen. **Modul:** Master-Traders, Top/Flop-Analytics, Geschlossene Trades.
- [ ] `frm_main` (Legacy) entfernen, sobald alle Views raus sind.
- [ ] `CopyTradingModule : IPolyTraderModule` implementieren (Services + UI-Tabs +
Settings-Sektion + Modul-Log + Start/Stop).
- [ ] Dualen Trade-Log verdrahten: beim Schließen kopierter Trades in Core-Log **und**
Copytrading-Log schreiben.
- [ ] Latenten Collection-Namensbug beheben (`traders` vs. `trackers`).
- [ ] **Ergebnis:** Copytrading ist ein eigenständiges, entfernbares Modul.
- [x] Alle Views extrahiert. Das Launcher-Modell wurde inzwischen selbst wieder abgelöst:
seit dem UI-Redesign gibt es **eine** Shell mit Seitenleiste
(`src/PolyTrader.App.Avalonia/Views/ShellWindow.axaml`) statt vieler Einzelfenster.
- [x] `frm_main` (Legacy) entfernt.
- [x] `CopyTradingModule : IPolyTraderModule` ist implementiert — ebenso
`ResolutionFarmingModule`, `SupervisorModule` und `AccountingModule`.
- [x] Dualer Trade-Log verdrahtet (Core-Log + Copytrading-Log).
- [x] Collection-Namensbug (`traders` vs. `trackers`) mit der MySQL-Migration hinfällig —
relationale Tabellen mit festem Schema statt Mongo-Collections.
- [x] **Ergebnis erreicht:** Copytrading ist ein eigenständiges, entfernbares Modul; drei
weitere Module sind nach demselben Muster entstanden.
### Phase 6 — MySQL-Migration
- [ ] EF Core + Pomelo einrichten; relationales Schema modellieren
(u.a. `positions` mit `account_id` statt Collection-per-Account;
`trader_accounts` Join-Tabelle für `AssignedAccountIds`).
- [ ] Zweite Repository-Implementierung (MySQL) hinter den bestehenden Interfaces.
- [ ] Einmaliges Migrationsskript Mongo → MySQL (agentspace/scripts).
- [ ] Umschalten per Konfiguration; Mongo/LiteDB/Shim + `data.db` entfernen.
### Phase 6 — MySQL-Migration *(ABGESCHLOSSEN — nachgetragen 22.08.2026)*
- [x] EF Core + Pomelo eingerichtet, relationales Schema modelliert; Tabellen mit den Präfixen
`core_` und `mod_`, Migrationen je Projekt unter `Persistence/Ef/Migrations/`.
- [x] Repository-Implementierungen auf EF Core hinter den bestehenden Interfaces.
- [x] Migration der Altdaten über die CLI-Schalter `--migrate-json` und `--verify-mysql`
(statt eines Skripts in `agentspace/scripts`).
- [x] Mongo vollständig entfernt: kein `MongoDB.Driver`- oder `LiteDB`-Paket mehr in irgendeiner
`.csproj`, kein Shim. `data.db` und die `MongoDB/`-Exporte sind am 22.08.2026 auch lokal
gelöscht worden.
### Phase 7 — Nacharbeiten *(optional, später zu priorisieren)*
- [ ] Test-Projekt: Risk-/Entscheidungslogik als reine Funktionen extrahieren & testen.
- [ ] God-Methoden splitten (`PollLiveAccountsAsync`, `ProcessAccountOrderAsync`);
### Phase 7 — Nacharbeiten *(teilweise erledigt — Stand 22.08.2026)*
- [x] Test-Projekt: Risk-/Entscheidungslogik als reine Funktionen extrahiert und getestet —
**476 Tests** grün.
- [x] Leere `catch {}` beseitigt — in `src/` findet sich kein einziger leerer Catch-Block mehr.
- [x] Secrets-Verschlüsselung umgesetzt, allerdings **nicht mit DPAPI**: DPAPI ist Windows-only und
hätte die Linux-Portierung blockiert. Stattdessen AES-GCM at-rest über
`Security/SecretProtection.cs` + `EncryptedStringConverter`, Schlüssel aus
`POLYTRADER_MASTER_KEY` (siehe `Security/MasterKeyResolver.cs`).
- [ ] **Offen:** God-Methoden splitten (`PollLiveAccountsAsync`, `ProcessAccountOrderAsync`);
duplizierte Closed-Trade-Erzeugung zentralisieren.
- [ ] Leere `catch {}` durch gezieltes Logging ersetzen.
- [ ] Secrets-Verschlüsselung (DPAPI) für PrivateKey/ApiSecret/ApiPassphrase.
- [ ] TerminalLogger auf `Microsoft.Extensions.Logging` + UI-Sink umstellen.
- [ ] **Offen:** `TerminalLogger` auf `Microsoft.Extensions.Logging` + UI-Sink umstellen. Hängt mit
dem Zeitzonen-Punkt zusammen (Abschnitt C im Avalonia-Leitfaden): der Logger stempelt mit
`DateTime.Now` statt der konfigurierten `AppTimeZone`.
---