mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-08 03:38:23 +00:00
Three waits in the logout flow were blind sleeps scaled by the onion multiplier. A timeout is an upper bound and shrinks to nothing when the answer arrives early, but page.waitForTimeout always burns its full duration, so multiplying it by five spends the time whether the target is slow or not. The settle before the logout sweep cost three seconds on clearnet and fifteen on an onion, every persona, every role; the dropdown settle cost that again per menu trigger tried; and the poll interval of waitForAnyLogoutCandidate was multiplied too, which made detection five times coarser exactly where the target is slowest. So the sleeps become waitForLogoutControl, a bounded poll that keeps the scaled deadline and drops the scaling from the interval. It returns the moment a logout-shaped element is visible, which is the condition the click that follows needs anyway. Worst case is unchanged: with nothing to find it runs the deadline out, exactly what the sleep did unconditionally. The first of the two waitForAnyLogoutCandidate calls around the settle went with it; its result was discarded, and the second still carries the thirty second deadline that covers a navbar arriving late. Four unit tests pin the contract, since the argument for the change is entirely about when it stops waiting: it returns without sleeping when the control is already there, returns as soon as one appears, costs at most the deadline when none ever does, and polls on a fixed 250ms interval no multiplier touches. Measured context, from run 34348821577: the same dashboard logout test takes 161.0 to 164.0s over Tor and 34.1 to 34.8s on clearnet across five jobs spanning two distros, both deploy modes and three filesystems. A 1.9% spread across five runner VMs is not network latency, it is a constant being multiplied, and the ratio 4.73 is the multiplier itself. Solving the pair puts 32.0s of that test inside scaled waiting against 2.3s of work. This commit removes the part of that which is a sleep; the larger part is timeout caps on waits that expire and are swallowed by a catch, which is a separate defect and stays for now. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>