"""CI gate. Fails if any metric drops more than TOLERANCE below the committed baseline.json.
Update baseline.json deliberately (in the same PR, reviewed) when you improve the pipeline."""
import json, os, pytest
from rag import Retriever, Config
from harness import load_golden, evaluate

HERE = os.path.dirname(__file__)
TOLERANCE = 0.05   # absolute; 30 questions = 0.033 per question, so one flipped answer passes, two fail
CONFIG = Config(**json.loads(os.environ.get("RAG_CONFIG_OVERRIDE", "{}")))

@pytest.fixture(scope="module")
def result():
    metrics, rows = evaluate(Retriever(CONFIG), load_golden())
    return metrics, rows

@pytest.mark.parametrize("metric", ["hit@1", "hit@5", "mrr"])
def test_metric_not_regressed(result, metric):
    metrics, rows = result
    base = json.load(open(os.path.join(HERE, "baseline.json")))[metric]
    misses = [r["question"] for r in rows if r["rank"] is None or r["rank"] > 5]
    assert metrics[metric] >= base - TOLERANCE, (
        f"{metric} {metrics[metric]:.3f} < baseline {base:.3f} - {TOLERANCE}; "
        f"{len(misses)} questions missed top-5, e.g. {misses[:3]}")
