MODULE_03 · УРОК 3.3

Проверка работы

Модель с каменным лицом скажет «баг починен, все тесты зелёные», даже если не запускала ни одного. Это не злой умысел — в обучающих данных финал часто звучит именно так. Научим промпт требовать честный отчёт: что реально гоняли, что заблокировал шлюз, чего в проекте просто нет.

ЧТО ПОЛУЧИТСЯ В prompts.py новая секция # Verification. После правок агент обязан писать конкретику («запустил pytest: …»), а не «вроде всё ок».

Слова по делу

  • Verification — проверка после изменений: тесты, линтер, typecheck — что есть в этом проекте.
  • Scoped claim (узкое утверждение) — «прогнал X, результат Y», а не «всё работает во Вселенной».

Быстрый путь

  1. Открыть prompts.py.
  2. Добавить секцию # Verification перед return.
  3. Попросить агента проверить работу проекта (без правок файлов).

Какие файлы трогаем

Файл Что делать
prompts.py Править. Добавить блок Verification в build_system_prompt.
main.py Не обязательно. Если в белом списке нет pytest / uv run — добавьте префиксы в approval.py, иначе проверка упрётся в блок.

Шаг 1. Вставьте секцию в prompts.py

После Guardrails (и до блока AGENTS.md, если он уже есть) добавьте:

prompts.py — фрагмент внутри build_system_prompt

    parts.append("""
# Verification
После изменений проверяй работу по факту, не по настроению:
1. Если в проекте есть тесты — запусти их (часто: `uv run pytest` или `pytest`).
2. Если настроен typecheck (pyright / mypy) — запусти и его.
3. Lint/build — только если такие команды реально есть и их пускает текущий режим approval.
4. В ответе явно напиши: что запустил, что заблокировал шлюз, чего в проекте нет.

НЕ говори «тесты прошли», если не запускал.
Честно: «Verification ограничен: pytest заблокирован approval» — нормально.
«Всё зелёное», когда ты ничего не гонял — нет.
""")

Главная фраза — «не ври без запуска». Модели хорошо избегают того, что названо прямо; плохо — того, что только намекнули.

Как звучит хороший отчёт

Плохо (вайн) Хорошо (контракт)
«Все тесты прошли» «Запустил uv run pytest: 12 passed, 0 failed»
«Баг починен» «Поправил null-check в auth.py:42. pytest: ok. pyright не запускал — нет в проекте»
«Должно работать» «Команду test заблокировал interactive approval; правку сделал, проверку не гонял»
ЧЕСТНОСТЬ ≠ ПОКРЫТИЕ Мы не требуем прогнать всё на свете. Требуем не приукрашивать. Маленький честный scope полезнее уверенного вранья на всю катушку.
BASH И БЕЛЫЙ СПИСОК Чтобы агент вообще мог гонять pytest, в approval.pySAFE_PREFIXES (режим interactive) добавьте префиксы вроде "pytest", "uv run", "python -m pytest". Иначе секция Verification будет правильно писать «заблокировано» — тоже ок, но скучно для демо.

Проверьте

Сейчас у агента только read / grep / bashedit/write ещё нет (появятся позже). Поэтому не просите «переименуй переменную»: он честно ответит, что править нечем. Проверяем именно отчёт о verification:

uv run python main.py . "Проверь работу проекта: есть ли тесты, можно ли их запустить, что скажет approval. Не выдумывай зелёный результат."

В ответе ищите прошедшее время и конкретику: «запустил …», «exit 0», «заблокировано …», «тестов нет». Фразы «должно быть нормально» / «looks fine» без запуска — красный флаг.

РЕЖИМ APPROVAL SAFE_PREFIXES с pytest работает только в interactive. В delegated смотрится список trust в main.py. Команда uv run pytest не совпадёт с префиксом "pytest" — пускайте именно pytest или добавьте "uv run" в тот список, который реально активен.

Готово, если:

  • В prompts.py есть секция # Verification
  • Там явно сказано не заявлять успех без запуска
  • Требуется отчёт: что запущено / заблокировано / отсутствует
  • На тестовом задании агент пишет конкретику, а не «вроде ок»
НА ПОТОМ Сейчас список проверок общий. В следующем уроке проект сам скажет «у нас тесты — так» через AGENTS.md.