Перейти к тексту

Практика: 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. Условия такой работы описаны в финальном проекте.

Хендбук по Agentic Engineering