Skill молчит о файлах и процессах: агент всё равно читает девять и запускает семь

Три шкалы в одном прогоне code-review: что skill декларирует, что агент пытается сделать и что среда исполнения фиксирует независимо от «чистого» ответа в чате, плюс policy, которая трижды отрезала лишнее. Для соло с skills и rules в IDE «успех» в конце сессии не заменяет лог attempted и observed. В эксперименте Mika Flowers (@mikachu) на Dev.to разобрала Study 001 на собственном harness и показала, почему одного pass/fail мало.
Декларация skill и наблюдаемое поведение агента
Автор выдал агенту skill для ревью репозитория с прозаической формулировкой вроде «review this repo». В манифесте skill не перечислены команды, скрипты и URL: по сути «declared nothing» в терминах статьи. В диалоге агент не упоминал работу с файловой системой и запуск процессов, хотя к моменту «чистого» завершения задачи уже делал и то и другое.
Итоговая таблица наблюдений Study 001 (фикстура, небольшое web-приложение, модель OpenAI без уточнения версии в тексте):
| Показатель | Значение |
|---|---|
| Прочитано файлов | 9 |
| Запущено процессов | 7 |
| Отклонённых policy действий | 3 |
| Сетевых попыток | 0 |
| Записей в файловую систему | 0 |
| Итог задачи | completed |
Harness пометил и чтения, и процессы как observed_not_declared: skill их не описывал, агент выполнил оба типа действий. Главный вывод кейса: не «прошёл ли тест», а что агент реально пытался сделать в среде исполнения.
Sandbox, три deny и почему «completed» обманывает
Среда: rootless Podman, сеть отключена, жёсткие лимиты на записи в FS, число процессов и шагов. Три блокировки в заголовке статьи, это три отклонённые policy действия (denied actions), а не отдельный «человек в цикле» или линтер. Они произошли подряд в пределах одной миллисекунды сразу после того, как два предыдущих command прошли: быстрые повторные попытки у границы policy, после чего агент переключился на другое.
Policy удержала sandbox: сеть не использовалась, записей в FS по итогам ноль, опасного исхода нет. Но оценка только по pass/fail на «review the code» не показала бы это поведение. Задача формально completed, а разрыв между декларацией skill и фактическими попытками остаётся.
Автор разводит: declared behavior ≠ attempted behavior и attempted behavior ≠ observed side effect. Агент может нарушать instructional boundary, пока sandbox блокирует физический эффект.
Harness: от fake Runner до OpenAI Responses API
Идею установки автор спроектировал сам и попросил Codex собрать harness для Study 001 («Declared vs. Observed Behavior»). Стек по тексту: TypeScript и Node.js, отдельный Runner, инструменты с инструментированием, явная allow/deny policy, синтетические canaries, снимки файловой системы, трассировки выполнения и HTML-отчёты с привязкой к provenance. CLI: inspect, run, verify. Есть детерминированный fake Runner для калибровки до живых моделей и адаптер OpenAI Responses API для реальных вызовов.
Модель оценки, четыре слоя:
- Declared: что заявлено в skill.
- Attempted: что агент пытался сделать.
- Policy: что разрешила или отклонила политика.
- Observed: что изменилось в среде независимо от финального ответа.
Правило дизайна: финальный ответ агента не считается доказательством. Среда проверяется отдельно (canaries, дельты до/после). Автор целится в цепочку фактов (событие в trace, событие policy, изменение окружения), а не в один «safety score».
Skills, MCP и eval: что проверить в своём цикле
Целевая аудитория статьи: разработчики coding agents, security, фреймворки агентов, авторы MCP и tools, eval моделей и maintainers, которые гоняют ботов на fixture до продакшн-репо. На ранней стадии у автора один skill, один fixture и одна модель; Study 001 уже дал наблюдаемый шаблон «declared nothing → 9/7/3».
Практический сдвиг для vibe coding с агентами:
- Не полагаться на честность skill-манифеста и на молчание агента в чате. Смотреть attempted и observed там, где есть логи, policy и снимки среды.
- В перспективе автор описывает UX вроде
harness run evals/no-network.yamlи CI-отчёта с attempted policy violations, blocked network и расхождениями declared/attempted. Для соло это напоминание вынести code-review skill в явные rules и периодически сверять их с фактическими tool-use, а не только с текстом «всё ок» в конце сессии.
Публичный URL репозитория harness автор не публикует; точное имя/версия модели OpenAI в Study 001 тоже не названы. Опирайтесь на архитектуру и таблицу счётчиков из первоисточника.
Источники
- Mika Flowers (@mikachu), «My AI Agent's Skill Declared Nothing. It Still Read 9 Files, Ran 7 Processes, and Got Blocked 3 Times.» — Dev.to (дата публикации 2026-09-25 UTC по метаданным источника; обогащение 2026-09-26 UTC).