Три задачи в temp-репозитории: implementer'ы deepseek-flash, все ревью deepseek-v4-pro. Ревьюер Task 2 независимо нашёл T2.1 (медиана чётной длины противоречит спеке) и T2.2 (нет теста), fix-раунд 1 → 186575c, скоуп-ре-ревью APPROVED, финальное ревью ветки APPROVED. Режим 2 (фоновый контроллер, глубина 2) проверен отдельной пробой: вызов subagent из контроллера прошёл. Артефакты прогона — openspec/changes/dsh-sdd/trial/ (план, спека, брифы, отчёты, ledger), результаты — design.md. По урокам прогона skill sdd уточнён: DONE_WITH_CONCERNS при замеченном расхождении, число тестов в плане — ориентир, повтор при ошибке валидации provider/model. Co-Authored-By: DeepSeek Harness <noreply@deepseek.com>
30 lines
2.0 KiB
Markdown
30 lines
2.0 KiB
Markdown
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;
|
||
тест проверяет только тип исключения (по плану).
|