beb2e91d04
Two assertions per offloaded site: - a loop probe, where the stubbed callee records whether an event loop is running in its own thread — the idiom already used by tests/hermes_cli/test_cron_dashboard_off_loop.py; and - a concurrency proof, where the stubbed callee blocks on a threading.Event while an unrelated request is timed. On the unfixed handlers that request waits out the whole block; served off the loop it returns in milliseconds. The concurrency proof needs a single event loop across requests, so the client fixture enters the TestClient context manager: that pins one blocking portal for the whole fixture, where a bare TestClient(app) would spin up a fresh loop per request and pass even unfixed. Also covers the status-code mapping through the executor hop (404 on a missing profile, 400 on a rename collision, 404 from the resolve that stays on the loop ahead of describe-auto) and the _MISSING sentinel cases: a desktop.json holding `null` still reports exists=true, an absent one reports exists=false, and an empty SOUL.md is still distinguishable from a missing one. The client fixtures read web_server._SESSION_TOKEN from the module rather than pinning a literal. web_server resolves that token once at import, so whichever test file imports it first fixes the value for the session and a later monkeypatch.setenv is silently ignored — two files hardcoding different tokens would 401 depending on collection order.