# Dependencies only the paid fidelity eval and CI need — kept out of
# requirements.txt so `npx master-skill` users never install them.
#
# WHY THESE ARE PINNED HARD while requirements.txt uses floors:
#
# CI ran `pip install -r requirements.txt anthropic` — completely unpinned —
# in the same job that carries ANTHROPIC_API_KEY in its environment. Two
# problems, one supply-chain and one measurement:
#
#   1. Any release of any of these lands straight in a process holding a live
#      API key. A floor is not a defence there; an exact version is.
#   2. Every fidelity number in eval/reports/ before 2026-09 was produced
#      against anthropic's 0.x line. A grading harness that silently changes
#      SDK major versions between runs is not an instrument.
#
# 1.7.0, verified 2026-09-23 (moved from 1.6.0 in #267, the first bump
# dependabot grouped; 1.6.0 came in #264, 1.5.0 in #175) in two ways, neither of
# which is CI going green — the grading never runs without a key, so a
# breaking SDK change would not show up until someone spent money:
#
#   - scripts/check-eval-sdk-surface.py reads the surface test-fidelity.py
#     calls, and confirms the installed version is this one:
#         messages.create(model, max_tokens, system, messages, timeout)
#         Anthropic(max_retries=...)
#         Message.stop_reason, TextBlock.text
#         Usage.cache_read_input_tokens / cache_creation_input_tokens
#   - scripts/smoke-eval-sdk.py sends a real request through test-fidelity.py
#     to a local server and checks the reply is parsed, graded and audited,
#     the persona prompt still carries cache_control, and the cache token
#     counts come back. It needs no key, so CI runs it on every PR —
#     together with `--break`, which must fail.
#
# Two things the 0.x -> 1.x jump changes that neither check shows:
#   - requires-python >= 3.10, where 0.x allowed 3.9. The eval jobs run 3.11,
#     so CI is unaffected, but anyone running the sweep needs 3.10+ (README's
#     "Python 3.9+" badge covers the generator tools, not this file).
#   - the HTTP layer moved to httpx2, which handles proxies differently — on a
#     machine with a SOCKS proxy set, constructing the client now raises unless
#     `socksio` is installed. Hit while verifying this bump.
anthropic==1.7.0

# >=9.0.3, not the 8.x line this file first pinned. PYSEC-2026-1845: pytest
# through 9.0.2 on UNIX uses the predictable directory name
# `/tmp/pytest-of-{user}`, which lets a local user cause a denial of service
# or possibly escalate privileges. `pytest>=8.3,<9` capped *below* the fix.
#
# Found by the pip-audit job added alongside this line — on its first run,
# against a pin written the day before. Which is the argument for the job.
# Verified: the full suite passes unchanged under pytest 9.1.1.
pytest>=9.1.1,<10

# The deepseek / gemini providers go through the OpenAI-compatible client
# (test-fidelity.py imports `openai`, and its ImportError branch tells you to
# install it), so leaving it out meant `--provider deepseek` could not run from
# a clean checkout — while the guard test only grepped for anthropic and pytest.
#
# `==`, same reasoning as anthropic above, and pinned to the version actually
# verified: 3.16.2 (moved from 3.14.1 in #267; 3.14.1 came in #264, 3.13.0
# in #174), checked 2026-09-23 by the same two scripts. It still takes `OpenAI(api_key, base_url, max_retries)` and
# `chat.completions.create(model, max_tokens, messages, timeout)`, and the
# smoke confirms the request lands on the patched base_url's
# /v1/chat/completions with the key in the Authorization header. An earlier
# comment here guessed that 3.x was where `max_tokens` gave way to
# `max_completion_tokens`; checked on 3.10.0, both were accepted, so
# build_request() needed no change. Same >= 3.10 floor as anthropic.
openai==3.16.2
