e210fd8c1f
PairingStore(profile=None) resolved its storage directory from the module-level PAIRING_DIR constant, which was computed exactly once, at module import time. A long-lived process (the gateway, started once at container/process boot) can import this module before HERMES_HOME or a profile's context is fully established, freezing PAIRING_DIR to a wrong value for the rest of that process's lifetime -- even though a freshly started, short-lived process (e.g. the `hermes pairing` CLI) re-imports the module later with the environment already correct. That asymmetry is exactly what made pending pairing codes issued by the gateway process unrecoverable (the pending-code write landed under the stale, wrong directory) while CLI-invoked writes to the same nominal directory kept working -- see #93449 for the full writeup and a live reproduction. tests/hermes_cli/test_dashboard_admin_endpoints.py already carried a comment acknowledging this exact staleness in passing ("the module-level PAIRING_DIR is bound at import"), and TestProfileScopedStorage::test_default_store_uses_global_dir's own comment describes working around it rather than it being intentional behavior -- this fixes the underlying cause both were compensating for. The profile-scoped branch already resolved its directory lazily inside __init__ (matching this docstring's claim that resolution is lazy); this brings the non-profile branch in line with it. Fix keeps PAIRING_DIR as the same test seam already used throughout the test suite (`patch("gateway.pairing.PAIRING_DIR", tmp_path)`, ~30 call sites) unchanged: it's now a None sentinel instead of an eagerly computed path, and a new _default_pairing_dir() helper resolves it fresh on every call, honoring a patched (non-None) value when one is set. No existing test needed to change. Added a regression test that does not patch PAIRING_DIR directly and instead exercises the real lazy-resolution path across two different HERMES_HOME values in the same process -- confirmed it fails on the pre-fix code (gets stuck with whatever the first PairingStore() call in the test session happened to see) and passes with the fix. Verified: tests/gateway/test_pairing.py (39, incl. the new one), tests/hermes_cli/test_pairing.py, and tests/tools/test_pr_6656_regressions.py all pass unmodified.