Testanleitung: eigenes X-Display je Projekt fuer Parallelbetrieb
CI / Build & Tests (Linux) (push) Canceled after 0s
CI / Plattformneutralität & Hygiene (push) Canceled after 0s

Damit mehrere Agenten gleichzeitig Oberflaechen testen koennen, bekommt jedes
Projekt eine feste Displaynummer (Vorgabe Richard):

  :99 PolyTrader, :98 Predictalytics, :97 ClawdDotNet, :96 IBKRTrader,
  :95 und absteigend fuer kuenftige Projekte.

Zwei Prozesse auf demselben Display sehen die Fenster des jeweils anderen -
Klicks landen im falschen Programm, Aufnahmen zeigen fremde Anwendungen.

Beim Durcharbeiten fielen zwei weitere Kollisionspunkte auf, die zum
Parallelbetrieb dazugehoeren und mit aufgenommen wurden:

- Screenshot- und Logdateien in /tmp brauchen ein Projektpraefix. /tmp/v_1.png
  ueberschreiben sich parallel laufende Projekte gegenseitig.
- "xvfb-run -a" darf NICHT mehr verwendet werden: Das -a sucht sich selbst ein
  freies Display und beginnt dabei bei :99 - ausgerechnet PolyTraders Nummer.
  Stattdessen "xvfb-run -n <nummer>".

Die Warnung ist nicht theoretisch: Auf der VM lag ein verwaister X98-Socket,
entstanden durch genau so einen "xvfb-run -a"-Aufruf beim smoke-ui-Test, als
:99 belegt war. Er blockierte Predictalytics' reservierte Nummer, ohne dass ein
Prozess lief. Entfernt, und die Anleitung erklaert jetzt, wie man verwaiste
Sockets erkennt (ls /tmp/.X11-unix/ gegen pgrep -a Xvfb lesen) und aufraeumt.

Weiter ergaenzt:
- pkill nie ohne Displaynummer - "pkill Xvfb" erschlaegt die Sitzungen aller
  anderen Projekte.
- DISPLAY in jedem Skript setzen, sonst landet man auf :0, dem echten Desktop.
- Die Skriptvorlage hat jetzt einen Kopf mit PROJEKT/DISP/FENSTER; das ist
  alles, was sich je Projekt unterscheidet. Praktisch gegengetestet.
- Aufraeumabschnitt und Belegungsliste um Displays und Verzeichnisse erweitert.

Nebenbei aufgefallen: Das PolyTrader-Publish lag unter ~/pt-test statt
~/polytrader-test und verletzte damit die eigene Verzeichniskonvention.
Umbenannt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-08-27 20:49:28 +02:00
co-authored by Claude Opus 5
parent 62570cfdd8
commit 9b2294cb4c
33 changed files with 979 additions and 244 deletions
@@ -1,4 +1,4 @@
<UserControl xmlns="https://github.com/avaloniaui"
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:shell="using:PolyTrader.App.Avalonia.Shell"
xmlns:vm="using:PolyTrader.App.Avalonia.ViewModels"
@@ -71,9 +71,9 @@
<HeaderedContentControl Header="Account-Übersicht">
<DataGrid Name="gridAccounts" x:DataType="vm:AccountOverviewRow" Height="180">
<DataGrid.Columns>
<DataGridTextColumn Header="Account" Width="180" Binding="{Binding Name}" />
<DataGridTextColumn Header="Module" Width="220" Binding="{Binding Modules}" />
<DataGridTemplateColumn Header="Polymarket" Width="110">
<DataGridTextColumn Header="Account" Width="Auto" Binding="{Binding Name}" />
<DataGridTextColumn Header="Module" Width="Auto" Binding="{Binding Modules}" />
<DataGridTemplateColumn Header="Polymarket" Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate x:DataType="vm:AccountOverviewRow">
<Button Content="Profil"
@@ -83,10 +83,10 @@
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Wallet (USDC)" Width="130" Binding="{Binding Balance, StringFormat=\{0:N2\}}" />
<DataGridTextColumn Header="3T PnL" Width="120" Binding="{Binding Pnl3d, StringFormat=\{0:N2\}}" />
<DataGridTextColumn Header="3T Winrate %" Width="120" Binding="{Binding WinRate3d, StringFormat=\{0:N1\}}" />
<DataGridTextColumn Header="Overall P/L" Width="130" Binding="{Binding OverallPnl, StringFormat=\{0:N2\}}" />
<DataGridTextColumn Header="Wallet (USDC)" Width="Auto" Binding="{Binding Balance, StringFormat=\{0:N2\}}" />
<DataGridTextColumn Header="3T PnL" Width="Auto" Binding="{Binding Pnl3d, StringFormat=\{0:N2\}}" />
<DataGridTextColumn Header="3T Winrate %" Width="Auto" Binding="{Binding WinRate3d, StringFormat=\{0:N1\}}" />
<DataGridTextColumn Header="Overall P/L" Width="Auto" Binding="{Binding OverallPnl, StringFormat=\{0:N2\}}" />
</DataGrid.Columns>
</DataGrid>
</HeaderedContentControl>
@@ -106,11 +106,19 @@
CornerRadius="4"
Background="{DynamicResource AppCardBrush}"
Padding="10,8" Margin="0,0,8,8" Width="250">
<!--
Die Vorzeichenfarbe kommt ueber Klassen + DynamicResource, nicht
mehr als im Code aufgeloester Pinsel: der wurde beim Themenwechsel
nicht neu ausgewertet und blieb dann auf der Hell-Farbe stehen -
dunkelgruen auf dunklem Grund, 2,3:1 statt der geforderten 4,5:1
(Befund B-6 des Linux-Sichttests).
-->
<StackPanel Spacing="4">
<TextBlock Text="{Binding ModuleName}" FontWeight="SemiBold" FontSize="13" />
<TextBlock Text="{Binding Text}"
Foreground="{Binding ForegroundBrush}"
FontFamily="Consolas,Menlo,monospace"
Classes.positive="{Binding IsPositive}"
Classes.negative="{Binding IsNegative}"
FontFamily="{DynamicResource AppFontMono}"
FontSize="11" />
</StackPanel>
</Border>
@@ -125,10 +133,10 @@
<HeaderedContentControl Grid.Column="0" Header="Auffällige Trades (24h)" Height="250">
<DataGrid Name="gridNotable" x:DataType="vm:NotableTradeRow">
<DataGrid.Columns>
<DataGridTextColumn Header="Modul" Width="110" Binding="{Binding Module}" />
<DataGridTextColumn Header="Markt" Width="*" Binding="{Binding Market}" />
<DataGridTextColumn Header="PnL" Width="85" Binding="{Binding Pnl, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="PnL %" Width="75" Binding="{Binding PnlPct, StringFormat=\{0:F1\}}" />
<DataGridTextColumn Header="Modul" Width="Auto" Binding="{Binding Module}" />
<DataGridTextColumn Header="Markt" Width="*" MinWidth="180" Binding="{Binding Market}" />
<DataGridTextColumn Header="PnL" Width="Auto" Binding="{Binding Pnl, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="PnL %" Width="Auto" Binding="{Binding PnlPct, StringFormat=\{0:F1\}}" />
</DataGrid.Columns>
</DataGrid>
</HeaderedContentControl>
@@ -139,9 +147,9 @@
<HeaderedContentControl Grid.Column="2" Name="grpAlerts" Header="Warnungen &amp; Fehler (heute)" Height="250">
<DataGrid Name="gridAlerts" x:DataType="vm:LogAlertRow">
<DataGrid.Columns>
<DataGridTextColumn Header="Zeit" Width="75" Binding="{Binding Time}" />
<DataGridTextColumn Header="Level" Width="80" Binding="{Binding Level}" />
<DataGridTextColumn Header="Nachricht" Width="*" Binding="{Binding Message}" />
<DataGridTextColumn Header="Zeit" Width="Auto" Binding="{Binding Time}" />
<DataGridTextColumn Header="Level" Width="Auto" Binding="{Binding Level}" />
<DataGridTextColumn Header="Nachricht" Width="*" MinWidth="180" Binding="{Binding Message}" />
</DataGrid.Columns>
</DataGrid>
</HeaderedContentControl>