"""Freeze scripts/jyotish_api_server.py growth. New endpoints and features must live in new modules and be thinly registered from the main file. This cap is the live line count at freeze (11063 on 2026-09-02, via `wc -l`) plus 300 lines of bugfix slack. """ from __future__ import annotations from pathlib import Path ROOT = Path(__file__).resolve().parents[1] API_SERVER = ROOT / "scripts" / "jyotish_api_server.py" AGENTS = ROOT / "AGENTS.md" # Live `wc -l scripts/jyotish_api_server.py` at freeze. New features must not # consume this budget; open a module instead. JYOTISH_API_SERVER_LINE_COUNT_BASELINE = 11063 JYOTISH_API_SERVER_LINE_COUNT_CAP = JYOTISH_API_SERVER_LINE_COUNT_BASELINE + 300 def test_jyotish_api_server_must_not_grow_beyond_bugfix_slack() -> None: line_count = API_SERVER.read_bytes().count(b"\n") assert line_count <= JYOTISH_API_SERVER_LINE_COUNT_CAP, ( f"{API_SERVER.as_posix()} has {line_count} lines; cap is " f"{JYOTISH_API_SERVER_LINE_COUNT_CAP} ({JYOTISH_API_SERVER_LINE_COUNT_BASELINE} " "baseline + 300 bugfix slack). New endpoints and features must be new " "modules, thinly registered from this file." ) def test_agents_forbids_growing_jyotish_api_server() -> None: agents = AGENTS.read_text(encoding="utf-8") assert "scripts/jyotish_api_server.py" in agents assert "must not grow" in agents assert "thinly registered" in agents def test_quality_gate_runs_api_server_growth_contract() -> None: from scripts.run_quality_gate import CORE_PYTEST_TARGETS assert "tests/test_api_server_growth_contract.py" in CORE_PYTEST_TARGETS quality_gate = (ROOT / "scripts" / "run_quality_gate.py").read_text(encoding="utf-8") assert '"tests/test_api_server_growth_contract.py"' in quality_gate