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:
@@ -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 0–6 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 3–6 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`.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user