DONE ## Коммит - `836a730` — `feat: add median` - Ветка: `feat/trial`, родитель: `dc1670f` (`feat: add mean`) - Файлы: `src/stats.py` (дописан `median`), `tests/test_stats.py` (импорт `median`, класс `MedianTest`) — код дословно из плана Task 2 - `git status` чистый; в коммит не попали `reports/` (в `.gitignore`) и `__pycache__` ## Тесты `python3 -m unittest discover -s tests` → `Ran 4 tests ... OK` (exit 0): `MeanTest.test_mean`, `MeanTest.test_mean_empty`, `MedianTest.test_median_odd`, `MedianTest.test_median_empty`. ## Concerns 1. **Расхождение плана со SPEC (важное, не исправлял — по брифу план дословен).** Реализация из плана возвращает `float(xs[n // 2])` и для чётной длины берёт верхний средний элемент, а SPEC требует среднее двух средних: - `median([1, 2])` → `2.0`, по SPEC `1.5`; - `median([1, 2, 3, 4])` → `3.0`, по SPEC `2.5`. Тесты плана чётную длину не проверяют, поэтому 4 теста проходят и нарушение спеки не ловится. Решение — за контроллером: чинить план/код и добавлять тест на чётную длину отдельной задачей. 2. `median` не мутирует вход: `sorted()` возвращает копию — требование SPEC «does not mutate values» выполнено. 3. В разделе «Interfaces» плана заявлены аннотации `list[float] -> float`, в «Exact code» их нет (как и в Task 1); внёс дословно, без аннотаций. 4. `ValueError("empty")` на пустом списке — есть, сообщение совпадает со SPEC; тест проверяет только тип исключения (по плану).