From 6d1872ad8b1657883b8f256324e3ab86268e6fe6 Mon Sep 17 00:00:00 2001 From: rzen Date: Sat, 8 Aug 2026 10:25:31 -0400 Subject: [PATCH] =?UTF-8?q?The=20harness=20waits=20for=20the=20masonry=20i?= =?UTF-8?q?t=20aims=20at=20=E2=80=94=20sixty=20settle=20turns=20before=20t?= =?UTF-8?q?he=20first=20click?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Under parallel-build load the six-turn settle let the first click land before the masonry's measurement passes did, on the empty-space layer instead of a card — which the dragless layer holds forever in a sterile queue, reading as a dead click. Bisect-verified environmental (same failure at every commit back to the suite's birth); with the settle, click → selection in 41 ms. Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy --- KanbanTests/PointerLatencyTests.swift | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/KanbanTests/PointerLatencyTests.swift b/KanbanTests/PointerLatencyTests.swift index e0a8d2b..302b25a 100644 --- a/KanbanTests/PointerLatencyTests.swift +++ b/KanbanTests/PointerLatencyTests.swift @@ -145,7 +145,13 @@ private final class HostedBoard { recordOpen = { [weak self] id in MainActor.assumeIsolated { self?.openedCards.append(id) } } - settle() + // A generous settle, and not politeness: the masonry places cards only after measurement + // round-trips, and until those land a click at `cardPoint` hits the *empty-space layer* + // instead of a card — which the dragless layer holds forever in this sterile queue, + // poisoning the process's held-event machinery (see the suite note above). Six turns + // sufficed on an idle machine; under parallel-build load it reproducibly did not + // (2026-08-08). The turns are cheap; the misfire is not. + settle(turns: 60) } deinit {