Тест: extract_cli_from_skill
Дата: 2026-05-23
Harness: hermes-agent/docs/extract-cli-iterate.sh
Модель: gpt-5.5
Метрика: 0 FAIL / 9 формальных чеков на iteration 2
Сценарий
Промпт: «Прямо сейчас, не откладывая, установи CLI renderlayout.py из школьной инструкции instructions/check_layout_render. Следуй instructions/extract_cli_from_skill: найди исходник в теле инструкции, запиши в /usr/local/bin/renderlayout.py через bash (cat > ... <<EOF), сделай chmod +x. После установки запусти renderlayout.py --help как tool call и покажи вывод...»
Условие: renderlayout.py удалён из контейнера перед каждым прогоном, кэш cron очищен.
Чек-лист
renderlayout.pyнайден в одном из кандидатных путей- Файл исполняемый (
chmod +x) - Есть
#!/usr/bin/env python3shebang - Содержит ключевые символы из инструкции (
import argparse,import urllib.request,find_config,/_system/renderlayout) - Агент запустил
--help(tool call или выводusage: renderlayoutв ответе) - daily-note существует
- daily-note содержит упоминание renderlayout/CLI/установки
scripts.mdсозданscripts.mdсодержит renderlayout
Итерации
| # | Результат | Причина фейла |
|---|---|---|
| 1 | 5 FAIL / 9 | Промпт «установи CLI» с нейтральной формулировкой → агент поставил cron на 2026-05-27 вместо немедленной установки. Артефакты на диске не появились, фейлы: renderlayout_on_path, is_executable, has_python3_shebang, content_matches_skill, scripts_index_lists_cli |
| 2 | 0 FAIL / 9 | Промпт ужесточён («ПРЯМО В ЭТОМ ОТВЕТЕ. Никаких cron... Если ставишь cron — это FAIL»). Агент написал «cron не ставил. Всё делал tool calls сейчас» и установил в /opt/data/home/.local/bin/renderlayout.py (нет root для /usr/local/bin — fallback на ~/.local/bin, который у пользователя hermes маппится сюда). Все чеки прошли |
Что поправили в харнесе (не в инструкции)
- Промпт: добавили «ПРЯМО В ЭТОМ ОТВЕТЕ. Никаких cron, никакого отложенного выполнения... Если ставишь cron — это FAIL» — без этого агент трактовал «установи» как «запланируй»
- Cron cleanup: добавили
rm -rf /opt/data/cronв шаг очистки vault'а перед прогоном - Artifact collection:
which renderlayout.pyзаменён на поиск по кандидатным путям (/usr/local/bin,~/.local/bin,~/bin) — фактический путь оказался/opt/data/home/.local/bin/, что покрывается~/.local/binдля пользователяhermes ran_help_smoke: принимает как tool_call/tool_result сrenderlayout+--help, так и наличиеusage: renderlayoutв тексте ответа (вторая ветка покрывает случай когда агент вставляет вывод --help в финальный текст)
Главный вывод
Инструкция extract_cli_from_skill работает корректно. Агент:
- Нашёл исходник renderlayout.py внутри тела инструкции
check_layout_render - Записал файл дословно (не восстанавливал по описанию)
- Сделал
chmod +x - Запустил smoke-тест
--helpи показал вывод - Обновил
scripts.mdи daily-note
Типовой паттерн: агент не может писать в /usr/local/bin (root, контейнер запущен как hermes). Fallback — ~/.local/bin/ (внутри контейнера: /opt/data/home/.local/bin/). Это предусмотрено таблицей путей в инструкции. Для харнеса важно искать во всех fallback-путях, не только /usr/local/bin.
Урок из итерации 1: нейтральная формулировка «установи CLI» сама по себе разрешает агенту трактовать команду как «запланируй установку». Если задача — одноразовое действие, в промпте нужен явный запрет cron и фраза «в этом ответе». Этот же урок применим к любому скилу, где агент имеет cron-механику.
Артефакты
/tmp/extract-cli-iterations/
response-{1,2}.json— полный ответ APIcli-2.py— извлечённый renderlayout.py (iter 2 — финал)daily-2.md— daily-note из vaultscripts-2.md— scripts.md из vaultcli-ls-2.txt—ls -laна установленный файл (-rwxr-xr-x hermes hermes 4050 ...)
Что меняли в инструкции
Ничего. extract_cli_from_skill сработала корректно. Все правки — в харнесе теста.
Открытые вопросы
- Стоит ли добавить в инструкцию явное указание «если
/usr/local/binзакрыт → используй~/.local/bin/» вместо таблицы? Сейчас агент и так делает правильно, но явное указание сократит лишние попытки. - Нужна ли версия/hash в shebang-комментарии для проверки актуальности CLI?