Roadmap: CI-Runner pausiert, Linux-Test von der Zielland-Abnahme getrennt

A2 (CI-Runner) auf pausiert: auf der Gitea-Maschine ist derzeit keine Leistung
fuer einen weiteren Container frei (Entscheidung Richard). Der Workflow bleibt
liegen und ist sofort lauffaehig, sobald ein Runner da ist.

A4 aufgeteilt, weil die bisherige Blockade nicht stimmte:

- A4a "Linux-Betrieb auf einer Test-VM" ist NICHT durch A3 blockiert. Am Code
  nachgeprueft: LicenseGate ruft bei fehlender Lizenz kein Environment.Exit auf,
  sondern startet die Core-Shell im eingeschraenkten Modus ohne Trading-Module.
  Watchdog, Error-Reporting und Update-Pruefung stehen in appsettings.json
  ohnehin auf false. Der Linux-Betrieb ist damit ohne Deploymentcenter testbar -
  und Richard hat dafuer Test-VMs.
- A4b "Feldtest im Zielland" bleibt blockiert (A3 + A4a).
- A5 und B3 haengen jetzt praeziser an A4b statt an "A4".

Das ist mehr als Umsortieren: Die Anwendung ist noch nie auf Linux GELAUFEN -
verifiziert war bisher nur, dass sie sich publishen laesst. Das ist die groesste
ungetestete Flaeche im Projekt, und sie ist ab sofort adressierbar.

A4a listet konkret, was zu pruefen ist: native Abhaengigkeiten von
SkiaSharp/HarfBuzz, DB-Verhalten mit und ohne erreichbare MySQL, die
WorkingDirectory-Falle aus D-11 (server_settings.xml relativ zum
Arbeitsverzeichnis, master.key relativ zur Programmdatei - bei Abweichung legt
ServerSettings.Load() kommentarlos eine neue Datei an), SIGTERM-Shutdown,
Logrotate und der Master-Key als Umgebungsvariable unter Linux-Rechten.

Nebenbei wird dort T2 nachweisbar: der TerminalLogger stempelt mit DateTime.Now
statt AppTimeZone - auf einer UTC-VM mit Anzeigezone Europe/Berlin muessen die
Logdatei-Grenzen sichtbar von der angezeigten Uhrzeit abweichen. Bisher ist das
ein theoretischer Befund.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-08-23 21:07:08 +02:00
co-authored by Claude Opus 5
parent 6218a04fe4
commit 636713b573
+52 -17
View File
@@ -1,6 +1,6 @@
# Roadmap PolyTrader # 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 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 bleiben die **Bauanleitungen**; maßgeblich für *Status und Reihenfolge* ist ab jetzt nur noch
dieses Dokument. dieses Dokument.
@@ -43,13 +43,14 @@ Für alles, was Geld bewegt, gilt zusätzlich [`.agents/rules/clob.md`](../.agen
| | Vorhaben | Status | Stufe | | | Vorhaben | Status | Stufe |
|---|---|---|---| |---|---|---|---|
| **A1** | Abnahme der Oberfläche (A5) | ⬜ | A | | **A1** | Abnahme der Oberfläche (A5) | ⬜ | A |
| **A2** | CI-Runner registrieren | | A | | **A2** | CI-Runner registrieren | ⏸️ | A |
| **A3** | Deploymentcenter live abnehmen | ⬜ | A | | **A3** | Deploymentcenter live abnehmen | ⬜ | A |
| **A4** | systemd + Feldtest im Zielland | 🔒 A3 | A | | **A4a** | **Linux-Betrieb auf einer Test-VM** | ⬜ | A |
| **A5** | Master-Key setzen, Zugänge rotieren | 🔒 A4 | A | | **A4b** | Feldtest im Zielland | 🔒 A3 | A |
| **A5** | Master-Key setzen, Zugänge rotieren | 🔒 A4b | A |
| **B1** | CopyTrading Phase 1 — Marktdaten-Fundament | ⬜ | B | | **B1** | CopyTrading Phase 1 — Marktdaten-Fundament | ⬜ | B |
| **B2** | CopyTrading Restposten | 🔒 B1 | B | | **B2** | CopyTrading Restposten | 🔒 B1 | B |
| **B3** | ResolutionFarming live schalten | 🔒 A4 | B | | **B3** | ResolutionFarming live schalten | 🔒 A4b | B |
| **B4** | AutoRedeem (On-Chain) | 🔒 B3 | B | | **B4** | AutoRedeem (On-Chain) | 🔒 B3 | B |
| **B5** | Supervisor: Live-Key-Test | ⬜ | B | | **B5** | Supervisor: Live-Key-Test | ⬜ | B |
| **B6** | Accounting A-3 (US-Steuer) | 🔒 CPA | 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. **Blockiert nichts** — aber es ist die letzte offene Zusage der UI-Portierung.
Regeln für Nacharbeiten: [LEITFADEN-Avalonia-Portierung.md](./LEITFADEN-Avalonia-Portierung.md). 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 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 erkannt (ein Lauf steht auf `queued`), aber **auf der Instanz ist kein Actions-Runner
registriert** — auf Repo-, Benutzer- und Instanzebene geprüft. 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 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 `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** Windows-Maschine auffällt. **Solange A2 pausiert, ersetzt A4a diese Prüfung teilweise** — dort
(~10 Minuten). Der Runner gehört auf den Gitea-Host, nicht auf den Arbeitsrechner — sonst prüft läuft dieselbe Software auf echtem Linux, nur von Hand statt automatisch.
niemand, wenn der Rechner aus ist.
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 ### 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) → [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 Die Anwendung ist **noch nie auf Linux gelaufen** — verifiziert ist bisher nur, dass sie
Betrieb gelaufen. `--headless` existiert bereits in `Program.cs`. Dazu: Logrotate, Zeitzone *publisht*. Das ist die größte ungetestete Fläche im Projekt.
prüfen, Neustart-Verhalten.
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 ### 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 `POLYTRADER_MASTER_KEY` auf dem Zielsystem setzen und die Bestandsdaten migrieren
(AES-GCM at-rest ist gebaut, F1F6 sind behoben). Zusätzlich **Alchemy- und Mullvad-Zugänge (AES-GCM at-rest ist gebaut, F1F6 sind behoben). Zusätzlich **Alchemy- und Mullvad-Zugänge
@@ -170,7 +205,7 @@ Entscheidungszeitpunkt.
### B3 🔒 ResolutionFarming live schalten ### B3 🔒 ResolutionFarming live schalten
*Blockiert durch A4 (Zielland).* *Blockiert durch A4b (Zielland).*
Slices 05 sind fertig: Logik, Persistenz, Scanner, UI, Demo-Execution, Monitor. Offen ist der Slices 05 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 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 | | | 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 | | **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 | | **T3** | ⬜ God-Methoden | `PollLiveAccountsAsync`, `ProcessAccountOrderAsync` splitten; duplizierte Closed-Trade-Erzeugung zentralisieren |
| **T4** | ⬜ CopyTrading-Follow-ups | TradeId-Autoincrement, Dedup, Performance | | **T4** | ⬜ CopyTrading-Follow-ups | TradeId-Autoincrement, Dedup, Performance |
| **T5** | ⬜ Barlow-Schriften | Im UI-Redesign vorgesehen, nie eingebettet | | **T5** | ⬜ Barlow-Schriften | Im UI-Redesign vorgesehen, nie eingebettet |