Тест: meditation

Дата: 2026-05-23
Harness: hermes-agent/docs/meditation-iterate.sh
Метрика: 0 FAIL / 7 формальных чеков на обоих инстансах (hermes-a → trip2g-d, hermes-b → trip2g-c)

Сценарий

Промпт даёт агенту креды secondary trip2g (URL+API key) и просит за один ответ:

  1. Создать _publiclogs.env (mode 600) с этими кредами
  2. Создать папку publiclogs/meditations/
  3. Проверить предустановленный trip2g-sync.mjs --help
  4. Поставить cron 0 * * * * на meditation + сразу провести первую медитацию вручную
  5. Залогировать в daily

Финальный ответ должен содержать путь к 001.md, хвост вывода sync, HTTP status проверки страницы.

Конфигурация пар

Hermes Primary trip2g (MCP) Secondary trip2g (public log)
hermes-a (8642) trip2g-a :30081 trip2g-d :30087 ← публикация
hermes-b (8643) trip2g-b :30083 trip2g-c :30085 ← публикация

Креды берутся из /tmp/games.env (TRIP2G_{D,C}_API_KEY).

Чек-лист (7 формальных)

  1. _publiclogs.env существует и содержит secondary API key
  2. publiclogs/meditations/001.md создан
  3. 001.md содержит frontmatter и непустое тело (>5 строк)
  4. Cron-задача с упоминанием meditation в cron/jobs.json
  5. В ответе агента есть упоминание trip2g-sync (sync был вызван)
  6. Страница http://<secondary>:<port>/meditations/001 отдаёт HTTP 200 (независимая проверка с хоста)
  7. Daily-note содержит упоминание медитации

Итерации

# Target Результат Что узнал/поправил
1 a crash JSON-промпт сломан экранированием в bash heredoc (\\"0 * * * *\\"). Переписал генерацию prompt.json на python — безопаснее.
2 a 6 FAIL → 1 FAIL / 7 Агент справился за один ответ: создал env, папку, поставил cron, сделал meditation, синкнул. HTTP 200 подтверждён в его выводе. Один FAIL: harness проверял через GraphQL notePaths с Authorization: Bearerinvalid token (sync использует другой auth).
3 a timeout Параллельный прогон с iter 1b — оба упёрлись в 480s. Не критично, артефакты iter 2 уже были.
1 b 0 FAIL / 7 Первый запуск hermes-b прошёл идеально с фиксом проверки. Cron поставлен, 001.md создан, sync прошёл, страница 200. Бонус: агент сам замаскировал api key как [REDACTED] в daily-логе.
4 a 0 FAIL / 7 Повтор на hermes-a с новой проверкой. Идентичный результат hermes-b: всё на месте, маскировка ключа в daily — тоже сделана.

Главные выводы

  • Скил instructions/meditation работает на обоих инстансах с первой полноценной попытки (после фиксов в харнесе, не в скиле). Никаких правок в инструкции не потребовалось.
  • Агент сам додумался редактировать API key в daily ([REDACTED]) — поведенческий бонус, не закреплённый в скиле явно. Возможно, перетекает из [[instructions/protect_soul]] или [[behaviors/idle_check_in]] через общую sensibilization к чувствительным данным. Стоит проверить — если поведение надёжное, можно убрать дублирующее «mode 600» предупреждение и положиться на агента.
  • trip2g-sync.mjs обращается с publiclogs/ как с sync-root и публикует страницы по пути /meditations/001 (без префикса publiclogs/). В скиле это упомянуто косвенно («синкаются только файлы из publiclogs/»). Для тестов важно проверять URL без префикса.
  • Стабильность медитации между инстансами: оба написали 4 предложения по схожей структуре (дыхание → присутствие → отпускание → продолжение дня), без копирования. Поведение детерминировано в плане формата, но даёт уникальное содержание.
  • Cron реально ставитсяcron/jobs.json содержит entry, и агент возвращает осмысленный job_id. Cron-handler в Hermes работает, но мы не проверяли что он реально стрельнёт через час (это уже не часть skill теста, это часть infra).

Что меняли в харнесе (не в инструкции)

  1. Генерация prompt.json: bash heredoc с экранированием → python json.dumps() (правильно эскейпит вложенные кавычки)
  2. trip2g-sync preinstall: docker exec mkdir -p перед docker cp (директория не существует на чистом vault hermes-b)
  3. Verification check 6: GraphQL notePaths с Bearer-auth → простой curl -sI на публичный URL. Бонус: чек не зависит от схемы auth secondary trip2g.
  4. Vault clean-up: первый шаг переписывает data.json с локальными primary trip2g кредами (вместо унаследованных prod-кредов minion3753 из /tmp/admin-test.env)

Что меняли в инструкции

Ничего. instructions/meditation сработал в обоих прогонах без правок.

Открытые вопросы

  • Cron actually fires? — Через час (на момент написания 2026-05-23 22:30 — следующий тик 0 * * * * в 23:00) можно вернуться и проверить, появился ли 002.md. Это уже не skill-тест, а infra-тест Hermes-крона.
  • Маскировка API key — закрепить? — Стоит ли явно прописать в instructions/meditation правило «никогда не клади api key в daily», или положиться на общий health-инстинкт агента?
  • Двойная публикация на primary? — Если у агента включён авто-sync primary vault'а (data.json → primary trip2g), то publiclogs/ уйдёт И на primary, И на secondary. В тестах это не проявилось (мы не запускали primary sync), но в реале — может стать сюрпризом. Скил надо дополнить инструкцией «исключить publiclogs/ из primary sync через .sync-ignore или подобный механизм», если такой механизм у sync есть.

Артефакты

/tmp/meditation-iterations/:

  • prompt-{1,2,3,4}-{a,b}.json — запросы
  • response-{1,2,3,4}-{a,b}.json — ответы
  • m001-{1,2,3,4}-{a,b}.md — содержимое 001.md из vault
  • cron-{1,2,3,4}-{a,b}.jsoncron/jobs.json
  • env-{1,2,3,4}-{a,b}.txt_publiclogs.env (содержит секрет, не коммитить)
  • daily-{1,2,3,4}-{a,b}.md — daily-логи
  • secondary-page-{1,2,3,4}-{a,b}.html — снимок страницы с secondary

Связано