diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index f11b53c..3393840 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -1,6 +1,6 @@ # Roadmap PolyTrader -**Stand: 23.08.2026** · Das eine Steuerungsdokument. Zusammengeführt aus elf Umsetzungsplänen, +**Stand: 23.08.2026** (A2 pausiert, A4 aufgeteilt) · Das eine Steuerungsdokument. Zusammengeführt aus elf Umsetzungsplänen, drei Konzepten und der Linux-Analyse — diese liegen jetzt unter [`archiv/`](./archiv/) und bleiben die **Bauanleitungen**; maßgeblich für *Status und Reihenfolge* ist ab jetzt nur noch dieses Dokument. @@ -43,13 +43,14 @@ Für alles, was Geld bewegt, gilt zusätzlich [`.agents/rules/clob.md`](../.agen | | Vorhaben | Status | Stufe | |---|---|---|---| | **A1** | Abnahme der Oberfläche (A5) | ⬜ | A | -| **A2** | CI-Runner registrieren | ⬜ | A | +| **A2** | CI-Runner registrieren | ⏸️ | A | | **A3** | Deploymentcenter live abnehmen | ⬜ | A | -| **A4** | systemd + Feldtest im Zielland | 🔒 A3 | A | -| **A5** | Master-Key setzen, Zugänge rotieren | 🔒 A4 | A | +| **A4a** | **Linux-Betrieb auf einer Test-VM** | ⬜ | A | +| **A4b** | Feldtest im Zielland | 🔒 A3 | A | +| **A5** | Master-Key setzen, Zugänge rotieren | 🔒 A4b | A | | **B1** | CopyTrading Phase 1 — Marktdaten-Fundament | ⬜ | B | | **B2** | CopyTrading Restposten | 🔒 B1 | B | -| **B3** | ResolutionFarming live schalten | 🔒 A4 | B | +| **B3** | ResolutionFarming live schalten | 🔒 A4b | B | | **B4** | AutoRedeem (On-Chain) | 🔒 B3 | B | | **B5** | Supervisor: Live-Key-Test | ⬜ | B | | **B6** | Accounting A-3 (US-Steuer) | 🔒 CPA | B | @@ -87,17 +88,25 @@ git worktree add ../polytrader-winforms winforms-final **Blockiert nichts** — aber es ist die letzte offene Zusage der UI-Portierung. Regeln für Nacharbeiten: [LEITFADEN-Avalonia-Portierung.md](./LEITFADEN-Avalonia-Portierung.md). -### A2 ⬜ CI-Runner registrieren +### A2 ⏸️ CI-Runner registrieren — pausiert Der Workflow [`.gitea/workflows/ci.yml`](../.gitea/workflows/ci.yml) liegt und wird von Gitea erkannt (ein Lauf steht auf `queued`), aber **auf der Instanz ist kein Actions-Runner registriert** — auf Repo-, Benutzer- und Instanzebene geprüft. +> **Pausiert (Entscheidung Richard, 23.08.2026):** Auf der Gitea-Maschine ist derzeit keine +> Leistung für einen weiteren Container frei. Der Workflow bleibt liegen und ist sofort +> lauffähig, sobald ein Runner da ist — es geht nichts verloren. + Bis dahin ist die Plattformneutralität nur eine Momentaufnahme: Eine einzige `net10.0-windows`-Zeile genügt, und der Linux-Build ist kaputt, ohne dass es auf einer -Windows-Maschine auffällt. Einrichtung in **[LEITFADEN-CI.md](./LEITFADEN-CI.md) §3** -(~10 Minuten). Der Runner gehört auf den Gitea-Host, nicht auf den Arbeitsrechner — sonst prüft -niemand, wenn der Rechner aus ist. +Windows-Maschine auffällt. **Solange A2 pausiert, ersetzt A4a diese Prüfung teilweise** — dort +läuft dieselbe Software auf echtem Linux, nur von Hand statt automatisch. + +Einrichtung, wenn wieder Kapazität da ist: **[LEITFADEN-CI.md](./LEITFADEN-CI.md) §3** +(~10 Minuten). Der Runner gehört nicht auf den Arbeitsrechner — sonst prüft niemand, wenn der +Rechner aus ist. **Eine der vorhandenen Linux-Test-VMs wäre der naheliegende Ausweichort**, falls +dort Leistung frei ist. ### A3 ⬜ Deploymentcenter live abnehmen @@ -115,17 +124,43 @@ Sicherheits-Auflagen von selbst (Watchdog-Secrets rotieren, UTC/`NOW()`-Mix). → [archiv/umsetzungsplaene/UMSETZUNGSPLAN-Deploymentcenter-Integration.md](./archiv/umsetzungsplaene/UMSETZUNGSPLAN-Deploymentcenter-Integration.md) -### A4 🔒 systemd + Feldtest im Zielland +### A4a ⬜ Linux-Betrieb auf einer Test-VM -*Blockiert durch A3.* +**War bis zum 23.08.2026 fälschlich als „blockiert durch A3" geführt. Ist es nicht.** Am Code +nachgeprüft: Das Lizenz-Gate ruft bei fehlender Lizenz **kein** `Environment.Exit` auf — ohne +Deploymentcenter startet die Core-Shell im eingeschränkten Modus (Terminal, Einstellungen) ohne +die Trading-Module. Watchdog, Error-Reporting und Update-Prüfung stehen in `appsettings.json` +ohnehin auf `false`. Damit ist der Linux-Betrieb **ohne** A3 testbar, und Richard hat dafür +Test-VMs. -Die Unit liegt unter [`deploy/polytrader.service`](../deploy/polytrader.service), ist aber nie im -Betrieb gelaufen. `--headless` existiert bereits in `Program.cs`. Dazu: Logrotate, Zeitzone -prüfen, Neustart-Verhalten. +Die Anwendung ist **noch nie auf Linux gelaufen** — verifiziert ist bisher nur, dass sie +*publisht*. Das ist die größte ungetestete Fläche im Projekt. + +Zu prüfen: + +| | Was | +|---|---| +| Start | Läuft `PolyTrader.App.Avalonia --headless` überhaupt? Fehlen native Abhängigkeiten (SkiaSharp/HarfBuzz brauchen je nach Distro `libfontconfig1`, `libice6`, `libsm6`)? | +| Datenbank | Verhalten ohne erreichbare MySQL: sauberer Fehler oder Absturz? Mit erreichbarer MySQL: laufen die Migrationen durch? | +| systemd | [`deploy/polytrader.service`](../deploy/polytrader.service) einspielen. Besonders die `WorkingDirectory`-Falle aus D-11 prüfen: `server_settings.xml` wird relativ zum Arbeitsverzeichnis geladen, `master.key` relativ zur Programmdatei — bei falschem `WorkingDirectory` legt `ServerSettings.Load()` **kommentarlos eine neue Datei an**, ohne dass es auffällt | +| Shutdown | `systemctl stop` → SIGTERM → geordnetes Herunterfahren innerhalb `TimeoutStopSec=45`. `Restart=on-failure` gegentesten | +| Zeitzone | **T2 hier mitprüfen:** Der `TerminalLogger` stempelt mit `DateTime.Now` statt `AppTimeZone`. Auf einer UTC-VM mit Anzeigezone `Europe/Berlin` müssten die Logdatei-Grenzen sichtbar von der angezeigten Uhrzeit abweichen — das ist der Beweis für den bislang nur theoretischen Befund | +| Logrotate | Rotation einrichten und prüfen, dass die App weiterschreibt | +| Master-Key | `POLYTRADER_MASTER_KEY` als Umgebungsvariable im Dienst — Zusammenspiel mit `MasterKeyResolver` und `FilePermissions` unter Linux-Rechten | + +**Ergebnis:** Danach ist belegt, dass die Software auf Linux läuft — nicht nur, dass sie sich +übersetzen lässt. + +### A4b 🔒 Feldtest im Zielland + +*Blockiert durch A3 und A4a.* + +Echter Dauerbetrieb auf dem Zielsystem mit den scharfgeschalteten Deploymentcenter-Funktionen. +Erst hier ist der Weg vom Build bis zum laufenden Dienst vollständig durchgespielt. ### A5 🔒 Master-Key setzen, Zugänge rotieren -*Blockiert durch A4 (braucht das Zielsystem).* +*Blockiert durch A4b (braucht das Zielsystem).* `POLYTRADER_MASTER_KEY` auf dem Zielsystem setzen und die Bestandsdaten migrieren (AES-GCM at-rest ist gebaut, F1–F6 sind behoben). Zusätzlich **Alchemy- und Mullvad-Zugänge @@ -170,7 +205,7 @@ Entscheidungszeitpunkt. ### B3 🔒 ResolutionFarming live schalten -*Blockiert durch A4 (Zielland).* +*Blockiert durch A4b (Zielland).* Slices 0–5 sind fertig: Logik, Persistenz, Scanner, UI, Demo-Execution, Monitor. Offen ist der Livegang nach Plan-Phasen RF-3 bis RF-5: **eigener Account**, kleines Kapital, dann Kalibrierung @@ -353,7 +388,7 @@ Prüfplan: [pruefplaene/PREDICTALYTICS-PRUEFPLAN-Master-Auswahl.md](./pruefplaen | | Punkt | Details | |---|---|---| | **T1** | ⬜ 15 Build-Warnungen | Alle im Avalonia-Projekt: 13 × `CS8618` (Felder in Fenster-Konstruktoren), 1 × `CS8848` (Vorrang bei `switch`), 1 × `CS8602` (möglicher Nullverweis, `PdfExporter.cs:40`). Die letzten beiden sind einen Blick wert — dahinter kann ein echter Fehler stecken. Erst wenn sie weg sind, ist `-warnaserror` in der CI sinnvoll | -| **T2** | ⬜ TerminalLogger | Stempelt mit `DateTime.Now` statt der konfigurierten `AppTimeZone`. Auf einem UTC-Linuxserver passen die Logdatei-Grenzen nicht zur angezeigten Uhrzeit. Zusammen mit der Umstellung auf `Microsoft.Extensions.Logging` erledigen — **spätestens bei A4** | +| **T2** | ⬜ TerminalLogger | Stempelt mit `DateTime.Now` statt der konfigurierten `AppTimeZone`. Auf einem UTC-Linuxserver passen die Logdatei-Grenzen nicht zur angezeigten Uhrzeit. Zusammen mit der Umstellung auf `Microsoft.Extensions.Logging` erledigen — **bei A4a nachweisbar** | | **T3** | ⬜ God-Methoden | `PollLiveAccountsAsync`, `ProcessAccountOrderAsync` splitten; duplizierte Closed-Trade-Erzeugung zentralisieren | | **T4** | ⬜ CopyTrading-Follow-ups | TradeId-Autoincrement, Dedup, Performance | | **T5** | ⬜ Barlow-Schriften | Im UI-Redesign vorgesehen, nie eingebettet |