**Root cause**: SchemaStore's `pyproject.json` recently switched from absolute URLs to **relative `$ref` URLs** (e.g. `"$ref": "partial-black.json"`). The code was passing these directly to `load_from_uri`, which tried to open them as local files, causing `FileNotFoundError`.
1. **`src/validate_pyproject/remote.py`** — Resolve relative `$ref` URLs using `urllib.parse.urljoin`:
- When loading tool schemas from the store, resolve `$ref` against the store URL.
- When loading nested `$ref`s inside a schema's `properties`, resolve against the schema's `$id`.
- Also fixed a typo in the protocol check (`("https://", "https://")` → `("http://", "https://")`).
2. **`tools/cache_urls_for_tests.py`** — Updated the cache script to:
- Resolve relative `$ref`s against `SCHEMA_STORE`.
- Recursively discover and download nested relative refs (so offline tests work too).
3. **Populated `tests/.cache/`** with all required schemas so the tests run offline.
Signed-off-by: Henry Schreiner <henryfs@princeton.edu>
Assisted-by: OpenCode:Kimi-K2.6