# VIGÍA CI Dependencies — Mínimas para validación forense
# NO instalar torch, clip, opencv aquí — solo lo necesario para los checks

pytest>=8.0.0
pytest-repeat>=0.9.0
# S-1 (Fase 0, 2026-07-05): pytest-cov es obligatorio — pyproject.toml lo exige
# vía addopts (--cov); sin él pytest aborta con "unrecognized arguments".
pytest-cov>=4.0.0
# S-1 (Fase 0, 2026-07-05): pytest-asyncio es obligatorio — pyproject.toml
# configura asyncio_mode="auto" y los 21 tests async de e2e fallan sin él
# ("async def functions are not natively supported"). Reproducido 2026-07-05.
pytest-asyncio>=0.21.0
ruff>=0.4.0
mypy>=1.10.0
bandit>=1.7.0
scikit-learn>=1.3.0
defusedxml>=0.7.1
# S-1 (Fase 0, 2026-07-05): psutil lo importan los tests e2e/adversarial vía
# módulos locales; estaba en requirements.txt pero no acá (misma clase de
# deriva que T-2/defusedxml en B-017). Guard: tests/test_requirements_ci_contract.py
# NOTA: `mcp` queda deliberadamente FUERA — no instalable con PyJWT de sistema
# (ver KNOWN_LIMITATIONS.md L-045).
psutil>=5.9.0
# S-1 (contrato 2026-07-05): pyyaml es importado por vigia/config/ vía yaml.safe_load;
# estaba en requirements.txt pero no acá. Detectado por test_requirements_ci_contract.py.
pyyaml>=6.0.0
# FastAPI is imported by both documented HTTP wrapper paths and their boundary
# contract tests. Keep it in the minimal CI environment rather than relying on
# a developer machine's global installation.
fastapi>=0.100.0

# httpx: NO lo importa ningun test por nombre — lo exige en tiempo de import
# `fastapi.testclient.TestClient` (starlette). Sin el, los 3 archivos que usan
# TestClient (test_webui_endpoints, test_webui_security, test_r8_ui_verification)
# levantan RuntimeError, que no es un skip: es un error de coleccion.
#
# El contrato S-1 (tests/test_requirements_ci_contract.py) NO puede verlo: resuelve
# con importlib.util.find_spec, que LOCALIZA el modulo sin ejecutarlo, asi que el
# RuntimeError nunca se dispara durante el barrido. Es la clase
# "dependencia transitiva por uso": invisible a un contrato estatico.
httpx>=0.25.0

# uvicorn: lo importa vigia/ui/__main__.py, que tests/test_r9_ui_bind_exposure.py
# ejecuta como subproceso para comprobar que la UI se NIEGA a ligar fuera de
# loopback. Sin uvicorn esos tests hacen importorskip y se saltean EN SILENCIO —
# quedaria verde sin haber probado la negativa a exponerse.
uvicorn>=0.23
