Тема
Практика: harness и ALGI
Начнём с ручного runner v01. Через него соберём v02 с журналом событий, через v02 - дневник ALGI и runner v03, а через v03 - отчёт для врача. Так доработка инструмента сразу получает применение на следующей задаче.
В этой цепочке нет обращения к модели. Поле scripted_fixture указывает на заранее подготовленные файлы, которые играют роль ответа backend. Runner применяет их и запускает проверки. Начальная папка ALGI содержит только правила и спецификацию; реализация появляется в рабочей копии после запуска harness.
Подготовка
Нужны Python 3.10+ и копия репозитория курса. Внешние Python-пакеты и API-ключи не требуются. Запускайте команды из корня репозитория в одной сессии терминала: переменная LAB_ROOT будет использоваться на следующих шагах.
bash
LAB_ROOT=$(mktemp -d /tmp/handbook-labs.XXXXXX)Команда создаёт новую временную папку. При повторном прохождении создайте другую: runner заменяет файлы из fixture, поэтому прежняя рабочая папка может содержать изменения от прошлого упражнения.
Файлы задач оставляем в репозитории. Пути scripted_fixture отсчитываются от их расположения; перенос файла задачи без исправления этих путей сломает запуск.
1. Ручной runner собирает v02
Разберите или напишите v01 по главе о первом harness. Ниже используется готовый образец из репозитория.
bash
cp -a examples/harness-labs/harness-seed "$LAB_ROOT/harness-v02"
python3 examples/harness-labs/01-manual-runner/runner.py \
--task examples/harness-labs/tasks/02-build-observable-runner.json \
--workspace "$LAB_ROOT/harness-v02"В $LAB_ROOT/harness-v02/runner.py теперь находится v02. Проверка py_compile должна завершиться успешно, а v01 напечатает done: all checks passed. Журнала JSONL пока нет: первая версия пишет только в терминал.
2. Полученный v02 собирает дневник ALGI
bash
cp -a examples/algi-lite "$LAB_ROOT/algi"
python3 "$LAB_ROOT/harness-v02/runner.py" \
--task examples/harness-labs/tasks/algi-01-pain-diary.json \
--workspace "$LAB_ROOT/algi"Появятся algi/domain.py, algi/__init__.py и tests/test_domain.py. На этом этапе есть валидация записи и функция clinician_summary; тестов три.
Runner напечатает путь к журналу. Он расположен в $LAB_ROOT/harness-v02/runs/, рядом с исполняемым runner, а не внутри ALGI. Найдите в нём context_ready, file_written, check_finished и result_classified.
Перед следующим шагом можно пройти разбор проверки результата: там показано, какую ошибку эти три зелёных теста пропускают.
3. V02 собирает v03 с policy
bash
cp -a "$LAB_ROOT/harness-v02" "$LAB_ROOT/harness-v03"
python3 "$LAB_ROOT/harness-v02/runner.py" \
--task examples/harness-labs/tasks/03-build-policy-runner.json \
--workspace "$LAB_ROOT/harness-v03"В новой папке обновится runner.py и появится policies/local-dev.json. Этот запуск выполняет v02, поэтому его журнал снова находится в harness-v02/runs/. Папка harness-v03 также содержит копию старых журналов после cp; отличайте их по задаче и времени.
Проверка компиляции подтверждает синтаксис новой версии. Чтобы проверить её поведение, нужно выполнить следующие задачи и случаи отказа из главы о проверке harness.
4. V03 собирает отчёт ALGI
bash
python3 "$LAB_ROOT/harness-v03/runner.py" \
--task examples/harness-labs/tasks/algi-02-clinician-report.json \
--workspace "$LAB_ROOT/algi" \
--policy "$LAB_ROOT/harness-v03/policies/local-dev.json"Теперь в algi/domain.py добавлена clinician_report, обновлена обработка заметок и появился tests/test_clinician_report.py. Всего выполняются пять тестов. Новый журнал лежит в harness-v03/runs/ и содержит события policy_check перед записью файлов и запуском команды тестов.
Посмотрите также diff между двумя fixtures:
bash
git diff --no-index \
examples/harness-labs/fixtures/algi-pain-diary/algi/domain.py \
examples/harness-labs/fixtures/algi-clinician-summary/algi/domain.pyДля git diff --no-index код завершения 1 означает, что найдены различия. Обратите внимание на изменение validate_pain_entry: оно затрагивает ввод заметок, хотя задача названа добавлением отчёта. В главе о ревью разберём, как оценить такое изменение.
Что проверено, а что осталось открытым
Успешная цепочка показывает, что runner применил подготовленные файлы и выполнил перечисленные команды. Она не доказывает, что модель самостоятельно решила задачи: вызова модели не было. Пять тестов также не доказывают полное отсутствие личных данных в отчёте.
Учебная policy проверяет аргументы команд и пути записи. Она не изолирует Python-процесс от сети или файлов хоста. Поэтому для стенда используем только синтетические данные и известные fixtures.
Как практика связана с главами
| Главы | Работа с полученными файлами |
|---|---|
| Спецификация, задача, инструкции, контекст | Проверить постановку до первого запуска ALGI. |
| Первый harness и журнал запуска | Написать v01, собрать v02, разобрать его события. |
| Доступ к инструментам и безопасность | Собрать v03, проверить отказ policy и понять пределы её защиты. |
| Проверка результата и harness | Найти пропущенную ошибку, составить случаи отказа runner. |
| Ревью и память проекта | Описать фактический diff и предложить запись о найденной проблеме. |
| Очередь, эксплуатация, автономность | Спроектировать следующий этап работы за пределами локального стенда. |
| Доработка самого harness и финальный проект | Выпустить собственную следующую версию через предыдущую. |
Готовой v04 в репозитории пока нет. Для неё можно выбрать проверку структуры задачи, отказ при пустом наборе проверок или формирование отчёта о запуске. После проверки новой версии поручите ей следующую задачу ALGI. Условия такой работы описаны в финальном проекте.