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
+39 -2
View File
@@ -162,6 +162,16 @@
<Setter Property="Foreground" Value="{DynamicResource AppMutedTextBrush}" />
</Style>
<!-- Gewinn/Verlust als Klasse statt als im Code aufgelöster Pinsel. Über DynamicResource
folgt die Farbe dem Themenwechsel von selbst; ein im Code geholter Pinsel blieb dagegen
auf der Farbe stehen, die beim Erzeugen der Zeile galt (Befund B-6). -->
<Style Selector="TextBlock.positive, SelectableTextBlock.positive">
<Setter Property="Foreground" Value="{DynamicResource AppPositiveBrush}" />
</Style>
<Style Selector="TextBlock.negative, SelectableTextBlock.negative">
<Setter Property="Foreground" Value="{DynamicResource AppNegativeBrush}" />
</Style>
<Style Selector="TextBlock.mono, SelectableTextBlock.mono">
<Setter Property="FontFamily" Value="{DynamicResource AppFontMono}" />
</Style>
@@ -173,7 +183,6 @@
<Style Selector="Button">
<Setter Property="CornerRadius" Value="0" />
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
<Setter Property="FontSize" Value="13" />
<Setter Property="Padding" Value="10,5" />
<Setter Property="Background" Value="Transparent" />
@@ -181,6 +190,19 @@
<Setter Property="BorderThickness" Value="1" />
</Style>
<!-- Die Schriftart bewusst OHNE die Schaltflaechen, die zur Vorlage eines anderen
Steuerelements gehoeren (#PART_Button - z.B. der Kalenderknopf des
CalendarDatePicker). In Avalonia stechen die Styles der Anwendung die Setter eines
ControlTheme aus; unsere Schriftliste landete damit auch auf dem Kalenderknopf und
verdraengte die Symbolschrift, aus der sein Zeichen stammt. Unter Windows faellt das
nicht auf, unter Linux setzt Fontconfig stillschweigend irgendeine andere Schrift
ein, in der derselbe Zeichencode etwas voellig anderes bedeutet - im Test stand dort
statt eines Kalenders eine sinnlose "26" (Befund B-9 des Linux-Sichttests).
ACHTUNG: nur am Bild zu pruefen, nie im Log - Gegenprobe auf der Linux-VM noetig. -->
<Style Selector="Button:not(#PART_Button)">
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
</Style>
<!-- Fluent malt Füllung und Rahmen im Vorlagenteil und überschreibt sie je Zustand.
Deshalb müssen Schwebe- und Druckzustand dort gesetzt werden, sonst blitzt beim
Überfahren wieder das Fluent-Grau durch. -->
@@ -237,7 +259,15 @@
<!-- ═══ Tabellen ══════════════════════════════════════════════════════════════
Kopfzeile klein, gesperrt und gedämpft; Zeilen nur durch eine Haarlinie
getrennt (keine Gitterkästen). -->
getrennt (keine Gitterkästen).
SPALTENBREITEN – Regel für alle Grids: feste Pixelbreiten nur, wo sie wirklich
gebraucht werden. Der Normalfall ist Width="Auto" (misst Überschrift UND Werte)
plus genau eine Width="*"-Spalte mit MinWidth für den Fließtext. Die aus WinForms
übernommenen festen Breiten waren auf die Datenwerte ausgelegt, nicht auf die
Überschriften – in der breiteren Avalonia-Standardschrift standen dann „Trades (7",
„Winrate '" und „Fee (bp" in den Köpfen, während die Werte darunter mühelos passten
(Befunde B-11 und B-13 des Linux-Sichttests). -->
<Style Selector="DataGrid">
<Setter Property="GridLinesVisibility" Value="Horizontal" />
<Setter Property="HeadersVisibility" Value="Column" />
@@ -263,6 +293,13 @@
<Setter Property="Padding" Value="7,5" />
</Style>
<!-- Jede Textzelle zeigt ihren vollen Inhalt im Tooltip. Auch mit sauberen Breiten
bleiben lange Marktfragen und Meldungen zwangsläufig abgeschnitten; so kommt man
ohne Spaltenziehen an den ganzen Text. -->
<Style Selector="DataGridCell TextBlock">
<Setter Property="ToolTip.Tip" Value="{Binding $self.Text}" />
</Style>
<!-- ═══ Bausteine ═════════════════════════════════════════════════════════════ -->
<!-- KPI-Kachel: entspricht den zweizeiligen Labels der WinForms-Oberfläche