Run 173's Linux job failed on the contract test added one commit earlier — my
test, not the product.
LauncherExecutableSet refuses a host that exists but has no execute bit on
Linux (HasUnixExecutePermission), which is a real and useful check: an update
whose extraction lost its permissions would otherwise fail deep inside process
start instead of at the launch gate. The stubs were written with
File.WriteAllText, which is 0644, so on Linux every one of the four tests died
at that gate before reaching the command-line contract they exist to pin.
Windows never sees this — the predicate short-circuits to true off Linux — so
the test passed locally and could only fail on the runner.
Stubs are now created through a helper that chmods them executable on non-
Windows. Verified on Windows (4 passed); the Linux half is what run 174 checks.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>