From 353231fe6e4d95c01c732a9443b089551c745486 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 19 Aug 2026 14:23:31 +0200 Subject: [PATCH] docs: correct two landmine rows that my own later fixes disproved MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The transport row said to cap xUnit.MaxParallelThreads; serializing that assembly actually REGRESSED Windows (1000 passed in 7 s -> 999/1000 in 17 s) and the real fix was widening the virtual-clock harness's wall-clock patience. The Avalonia row said to serialize via xunit.runner.json; that does not fix it either — proven twice, including with a compiled-in attribute so delivery could not be blamed. It needs a real desktop and is now Lane=Manual. Both rows now record what was tried and disproved, which is the part worth keeping. --- docs/ci-and-releases.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/ci-and-releases.md b/docs/ci-and-releases.md index ecedc638..4369f6b4 100644 --- a/docs/ci-and-releases.md +++ b/docs/ci-and-releases.md @@ -94,7 +94,8 @@ directory and `current.json` names the installed version. ## Landmines -Each of these cost a red pipeline; none was a config typo. +Each of these cost a red pipeline; none was a config typo. Two rows record a +fix that was tried and **disproved** — read those before repeating it. | Symptom | Cause | |---|---| @@ -104,8 +105,8 @@ Each of these cost a red pipeline; none was a config typo. | ~40 tests fail on formatted numbers | Runner's `HKCU` locale was `en-SE` (comma decimal): expected `"update:0.25"`, got `"update:0,25"`. `Set-Culture` does **not** reach a scheduled task without a loaded profile — set the registry directly | | `DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1` as the locale fix | Too blunt — it breaks tests that legitimately construct a culture. Fix the machine locale instead | | `FileNotFoundException: client_cell_1.dat` | DAT-dependent tests missing `[Trait("Lane", "InstalledDat")]`. Build machines have no DATs | -| Timing-sensitive test fails only under load | `FakeAceTransportTests.PausedSelector_…` took 37 s under full-assembly parallelism vs ~350 ms isolated. Cap `xUnit.MaxParallelThreads` on small runners rather than edit transport code | -| Avalonia "calling thread cannot access this object" in cleanup | Serialize that assembly (`xunit.runner.json`). The stack shows a compositor being **constructed** during teardown; `TestAppBuilder` documents the hazard. Do **not** "fix" it by de-async-ing the test — that causes the failure | +| Timing-sensitive test fails only under load | `FakeAceTransportTests.PausedSelector_…` took 37-42 s under load vs ~350 ms isolated. Its harness drives a VIRTUAL clock but asserted on 2 s wall-clock windows; those are patience, not assertions, and now share a 60 s `HarnessPatience`. **Do not serialize the assembly to fix it** — that regressed Windows from 1000 passed in 7 s to 999/1000 in 17 s, breaking a loss-soak test that had never failed | +| Avalonia "calling thread cannot access this object" in cleanup | `MainWindowViewTests` needs a real desktop session and is `Lane=Manual`. Measured: PASSES on a dev desktop and on the CI Windows box over SSH; FAILS under `act_runner` and on Linux. Serializing the assembly does **not** fix it (tried via `xunit.runner.json` and a compiled-in `CollectionBehavior` attribute), and de-async-ing the test actively causes the failure. The stack shows a compositor being **constructed** during teardown — it is the headless session lifecycle, not parallelism | ## Culture note