Andrey Epifancev c8b92fae01 docs(dsh): пробный прогон SDD — режимы, дефект и fix-loop (#41)
Три задачи в 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>
2026-10-24 17:49:38 +04:00

2.9 KiB
Raw Blame History

Review Task 3: describe

Вердикт: VERDICT: APPROVED

Что проверено

  • Спека (SPEC.md): describe(values) → {"count": int, "mean": float, "median": float}.
  • План Task 3: дописать describe и DescribeTest, код «дословно из плана».
  • Дифф review/pkg-task-3.txt и фактические файлы на feat/trial (коммит 7cb0383).

Соответствие спеке

  • describe не дублирует логику mean/median — вызывает их напрямую: {"count": len(values), "mean": mean(values), "median": median(values)}.
  • Ключи словаря: count, mean, median — ровно по спеке, лишних/недостающих нет.
  • Типы: count — int (результат len); mean — float (возврат mean); median — float (возврат median). Сходится с {"count": int, "mean": float, "median": float}.
  • Пустой список: describe([]) бросает ValueError("empty") через делегирование в mean/median — поведение согласовано с модулем, спека отдельного контракта для describe на [] не задаёт.

Соответствие плану

  • Код src/stats.py и tests/test_stats.py совпадает с «Exact code» Task 3 дословно.
  • Импорт describe добавлен, класс DescribeTest.test_describe присутствует.

Проверка теста Task 3 (ловит поведение, а не повторяет реализацию)

Тест сравнивает describe([1, 2, 3]) с независимыми константами {"count": 3, "mean": 2.0, "median": 2.0}, вычисленными вручную из спеки, а не через вызовы len/mean/median внутри теста. То есть это оракул, а не тавтология: он ловит неверные ключи (переименование/лишние/недостающие), неверный count и неверные значения mean/median.

Наблюдение (не блокирует): вход [1, 2, 3] симметричен — mean == median == 2.0, поэтому тест не отличил бы перестановку mean/median местами. Это слабость теста, но она зафиксирована самим планом («Exact code»), реализация при этом корректна и читаема (mean для mean, median для median). Как дефект не считаю.

Прогон тестов

Ran 7 tests in 0.000s ... OK

git status чистый; лишних файлов в коммите нет.

Находки

Находок нет.


VERDICT: APPROVED — Находок нет