Keep the end-to-end GUI-launch case (bare PATH, CLI under a prefix → real
version) and rewrite the ordering test to the mixed-name case (PATH
claude-code beats a stale prefix claude). Real files in tmp_path and the
module's own prefix seam replace the process-wide expanduser/isfile/which
patches; the version cache is reset per test.
Claude Code version detection resolved the CLI by bare name, which only
searches PATH. GUI-launched processes on macOS (the Electron desktop app,
LaunchAgents) inherit the bare /usr/bin:/bin:/usr/sbin:/sbin, which carries
none of the CLI's install prefixes. Detection found nothing there even with a
current CLI installed and fell through to the stale fallback constant, which
Anthropic rejects:
HTTP 400: Claude Code 2.1.74 does not support this model;
version 2.1.251 or newer is required.
Same machine, same CLI, same account: fine from a terminal, rejected from the
desktop app. Verified by running the unmodified function under each PATH —
GUI PATH returned 2.1.74, terminal PATH returned the installed 2.1.276.
Probe the well-known install prefixes in addition to PATH. Additive only: a
PATH hit still wins and is tried first, and on Windows no prefix resolves to a
file so detection falls back to the PATH lookup exactly as before.