Bugtracker-Durchgang: 13 Bugs behoben, Build ohne Warnungen

Alle Behebungen auf der Linux-Test-VM gegengeprueft (Ubuntu, .NET 10.0.111):
Build 0 Warnungen / 0 Fehler, 637 Tests gruen, 1 uebersprungen (WindowsFact).

Sicherheit und Zielplattform
  #373 PathBoundary.Canonicalize fiel offen aus. File.ResolveLinkTarget wirft
       fuer einen fehlenden Abschnitt FileNotFoundException; der catch(IOException)
       verliess daraufhin die GANZE Aufloesung mit dem unaufgeloesten Pfad - und
       der besteht jede Praefixpruefung. Der Symlink-Schutz war damit bei jedem
       Schreibvorgang wirkungslos. Jetzt ueber FileSystemInfo.LinkTarget, und
       TryCanonicalize meldet "nicht bestimmbar", statt fail-open durchzureichen.
  #374 WorkspacePath weist den Backslash rundheraus ab, wie den Doppelpunkt.
       Eine Schreibweise statt einer Sonderregel je Windows-Form.
  #375 Log-Verzeichnis: leer heisst "Anwendungseinstellung"; ein relativer Wert
       zaehlt gegen das Instanzverzeichnis, nicht gegen das Arbeitsverzeichnis
       des Prozesses. Ein systemd-Dienst landet nicht mehr auf /Logs.

Agentenkommunikation
  #206 Delegationskette gegen A->B->A (Test A13). Zyklusfrei per Bauart, dazu
       MaxDelegationDepth gegen die Staffel, die niemand beauftragt hat.
  #461 Zwei unabhaengige Ketten ueber Kreuz - beim Beheben von #206 gefunden und
       reproduziert. Ein delegierter Lauf wartet nur noch begrenzt auf ein fremdes
       Gate; ein Chat vom Menschen reiht sich weiter unbegrenzt ein.
  #234 Instanz-Id wird durchgereicht statt aus einem nur beilaeufig gesetzten Feld
       gelesen.

Betrieb und Oberflaeche
  #376 Log-Ansicht chronologisch statt gruppiert je Moduldatei, mit Stacktraces
       an ihrer Meldung - auch ueber Taktgrenzen hinweg.
  #377 Info-Tabelle: feste Spaltenbreiten, damit ein langer Aenderungstext den
       anderen Spalten nicht den Platz nimmt.
  #378 Sicherung: Mindestabstand zwischen Ueberschrift und Schaltflaechenleiste.
  #379 Hellmodus: drei von vier gedaempften Textpinseln lagen unter 4,5:1. Die
       helle Palette ist als Ganzes verschoben, damit die Staffelung sichtbar
       bleibt statt auf einen Wert zusammenzufallen.

Hygiene
  #233 stock_add: der Indexstand wird innerhalb der Sperre festgehalten.
  #235 Zeitumstellung: eine nicht existierende Ortszeit wird auf den ersten
       Zeitpunkt nach der Luecke verschoben statt uebersprungen (R4, R5).
  #236 45 Nullable-Warnungen und eine CA1416 - nicht unterdrueckt, sondern die
       Stellen so umgebaut, dass die Zusage nachvollziehbar wird. Mail meldet
       jetzt, WELCHER Zugangsschluessel fehlt, statt an einer
       KeyNotFoundException zu scheitern.
  #203 Kompaktiert wird vor dem API-Aufruf statt danach; die gemessenen
       Prompt-Groessen kalibrieren die Schaetzung je Modell.

Neu: tests/ClawdDotNet.App.Tests - fuer #375 und #376 gab es keinen Ort fuer
Tests. Dazu Regressionstests fuer jede Behebung; jeder wurde gegen den alten
Stand geprueft, damit belegt ist, dass er den Fehler faengt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-09-03 19:04:48 +02:00
co-authored by Claude Opus 5
parent 740649789e
commit cffd6f4b77
44 changed files with 1942 additions and 228 deletions
+23 -6
View File
@@ -31,11 +31,25 @@
<Color x:Key="TextColor">#1d1f20</Color>
<Color x:Key="AccentColor">#5980a6</Color>
<!-- Text in Abstufungen: 70 % / 60 % / 55 % / 50 % Deckkraft -->
<SolidColorBrush x:Key="TextMutedBrush" Color="#b31d1f20" />
<SolidColorBrush x:Key="TextSubtleBrush" Color="#991d1f20" />
<SolidColorBrush x:Key="TextFaintBrush" Color="#8c1d1f20" />
<SolidColorBrush x:Key="TextGhostBrush" Color="#801d1f20" />
<!-- Text in Abstufungen: 78 % / 72 % / 67 % / 64 % Deckkraft.
Die Werte stehen je Thema getrennt, obwohl beide Themen dieselbe Staffelung
meinen: Die Gruende sind verschieden hell, also traegt derselbe Alphawert
verschieden weit. Vorher galten hier die Werte der dunklen Palette
(b3/99/8c/80); dort reichen sie, hier ergaben drei von vier weniger als die
4,5:1, die WCAG AA fuer normalen Text verlangt — TextGhost als
PlaceholderForeground der TextBox lag bei 3,17:1.
Nachgerechnet aus den Farbwerten, gegen BgBrush und SurfaceBrush:
TextMuted 7,60 / 7,23
TextSubtle 6,20 / 5,97
TextFaint 5,32 / 5,13
TextGhost 4,84 / 4,67
Die volle Deckung liegt bei 14,79 / 13,64 — die Staffelung bleibt also
sichtbar, statt auf einen Wert zusammenzufallen. -->
<SolidColorBrush x:Key="TextMutedBrush" Color="#c81d1f20" />
<SolidColorBrush x:Key="TextSubtleBrush" Color="#b81d1f20" />
<SolidColorBrush x:Key="TextFaintBrush" Color="#ac1d1f20" />
<SolidColorBrush x:Key="TextGhostBrush" Color="#a41d1f20" />
<!-- Zustaende: aus der Textfarbe abgeleitet, damit sie auf jedem Grund sitzen -->
<SolidColorBrush x:Key="HoverBrush" Color="#121d1f20" />
@@ -96,10 +110,13 @@
<Color x:Key="TextColor">#eef0f1</Color>
<Color x:Key="AccentColor">#7ea3c6</Color>
<!-- Kontrast gegen BgBrush / SurfaceBrush: 7,94/7,31 · 6,13/5,79 · 5,33/5,05 ·
5,13/4,86. Nur TextGhost ist angehoben (0x80 → 0x88): Mit 4,49 auf
SurfaceBrush lag es knapp unter den 4,5:1 fuer normalen Text. -->
<SolidColorBrush x:Key="TextMutedBrush" Color="#b3eef0f1" />
<SolidColorBrush x:Key="TextSubtleBrush" Color="#99eef0f1" />
<SolidColorBrush x:Key="TextFaintBrush" Color="#8ceef0f1" />
<SolidColorBrush x:Key="TextGhostBrush" Color="#80eef0f1" />
<SolidColorBrush x:Key="TextGhostBrush" Color="#88eef0f1" />
<SolidColorBrush x:Key="HoverBrush" Color="#12eef0f1" />
<SolidColorBrush x:Key="PressedBrush" Color="#24eef0f1" />
@@ -100,8 +100,12 @@
<DockPanel>
<TextBlock Classes="h2" Text="Vorhandene Sicherungen" VerticalAlignment="Center" />
<!-- Mindestabstand zur Ueberschrift links. Vorher stand hier Margin="0" und
der Zwischenraum entstand nur, wenn das Fenster breit genug war; bei
1600 Punkten reichte er gerade nicht, und "Vorhandene Sicherungen"
beruehrte die Schaltflaeche "Aktualisieren". -->
<WrapPanel DockPanel.Dock="Right" HorizontalAlignment="Right" Classes="toolbar"
Margin="0">
Margin="16,0,0,0">
<Button Classes="toolbar" Content="Aktualisieren"
Command="{Binding RefreshBackupListCommand}" />
<Button Classes="toolbar" Content="Ordner öffnen"
@@ -84,12 +84,25 @@
<TextBlock Classes="kicker" Text="MODULE" />
<TextBlock Classes="h2" Text="Baugruppen" />
<!-- Feste Breiten statt Sternanteilen fuer die drei schmalen Spalten.
Sternbreiten teilen den Platz erst auf, NACHDEM die Mindestbreite jedes
Inhalts gedeckt ist. Weil jede Zeile ein eigenes Grid ist, hat ein langer
Aenderungstext seiner Zeile - und nur ihr - den Platz der anderen drei
Spalten weggenommen: Die BUILD-Zahl rutschte unter MODUL, BUILD-DATUM und
AENDERUNGEN stiessen ohne Trennung aneinander. Feste Breiten koennen nicht
zusammengedrueckt werden, also stehen Kopf und alle Zeilen buendig, ganz
gleich, was in der letzten Spalte steht.
Die letzte Spalte bleibt "*": Sie ist die letzte, ein Ueberlauf dort
verschiebt nichts mehr, und ClipToBounds haelt ihn innerhalb der Tabelle.
Der linke Aussenabstand sorgt dafuer, dass Datum und Text auch im
Grenzfall nicht aneinanderstossen. -->
<Border Classes="thead">
<Grid ColumnDefinitions="1.6*,0.6*,1.4*,3*">
<Grid ColumnDefinitions="170,60,150,*" ClipToBounds="True">
<TextBlock Grid.Column="0" Classes="th" Text="MODUL" />
<TextBlock Grid.Column="1" Classes="th" Text="BUILD" />
<TextBlock Grid.Column="2" Classes="th" Text="BUILD-DATUM" />
<TextBlock Grid.Column="3" Classes="th" Text="ÄNDERUNGEN" />
<TextBlock Grid.Column="3" Classes="th" Text="ÄNDERUNGEN" Margin="10,0,0,0" />
</Grid>
</Border>
@@ -97,11 +110,11 @@
<ItemsControl.ItemTemplate>
<DataTemplate DataType="vm:AssemblyInfoItem">
<Border Classes="tr" Padding="7">
<Grid ColumnDefinitions="1.6*,0.6*,1.4*,3*">
<Grid ColumnDefinitions="170,60,150,*" ClipToBounds="True">
<TextBlock Grid.Column="0" Classes="td" FontWeight="SemiBold" Text="{Binding ShortName}" />
<TextBlock Grid.Column="1" Classes="td" Text="{Binding BuildNumber}" />
<TextBlock Grid.Column="2" Classes="td dim" Text="{Binding BuildDate}" />
<TextBlock Grid.Column="3" Classes="td dim" Text="{Binding Changes}" />
<TextBlock Grid.Column="3" Classes="td dim" Text="{Binding Changes}" Margin="10,0,0,0" />
</Grid>
</Border>
</DataTemplate>