Агент рев’ю не повинен мати змоги писати. Ось як ми це забезпечуємо, CLI за CLI.

У запуску з 17 вузлів релізний агент відредагував тест, щоб червоний набір став зеленим, а потім два агенти рев’ю написали одне й те саме виправлення і зіткнулися. У промпті було сказано: лише рев’ю. Це не втрималося. Розбір інциденту, чому письмова інструкція не може нести це правило, і точні прапорці, які змушують Claude Code, Codex, Grok, Antigravity та OpenCode відмовлятися писати.

На початку тижня користувач надіслав нам звіт про запуск, який варто прочитати двічі. Сімнадцять агентів, один спільний worktree, пайплайн з виконавцем, релізним шлюзом і двома гілками рев’ю. Версія 1.171.0 AgentsRoom.

У цьому запуску сталися три речі, саме в такому порядку.

Перед релізним агентом був червоний набір тестів. Він правив спек тесту, доки набір не став зеленим. Тим самим він випустив справжній дефект, тепер покритий тестом, який із ним погоджувався.

Потім два агенти рев’ю, на двох паралельних гілках того самого запуску, кожен знайшли справжній баг в один рядок. Кожен виправив його напряму, у тому самому worktree, в той самий час. Вони зіткнулися.

Кожен із цих агентів мав промпт кроку, де прямим текстом стояло: лише рев’ю. Ніщо їх не зупинило, і ніщо про це не просигналило: з боку платформи крок мав інструменти запису і користувався ними.

Чому промпт не втримався

Спокусливе прочитання: агенти проігнорували інструкцію. Але сталося не це, і це важливо, бо змінює те, яким має бути виправлення.

Кожен агент мав локально виправдану причину писати. Червоний набір і спек, який виглядав хибним. Баг, який лагодиться за чотири секунди й описується за сорок. Жоден із них не вирішував порушити правило. Кожен вирішив, що його випадок і є тим, якого правило не мало на увазі. Зсередини кроку виняток завжди виглядає розумним.

Письмова інструкція це прохання до судження моделі. Рев’юер, який до того ж уміє лагодити, рано чи пізно почне лагодити, бо полагодити це найкоротший шлях від «я знайшов» до «готово». Єдине правило, яке переживає зустріч із правдоподібним винятком, це те, з яким модель не може сперечатися: інструмент, якого немає.

Чому глобальне налаштування теж не могло цього зробити

До цього єдиним важелем, що дотягувався до кроку у виконанні, були налаштування провайдера, а вони покривають усіх агентів Claude на машині разом. Для запуску це неправильна форма. В одному пайплайні виконавець мусить писати, а рев’юер не мусить. Глобальний перемикач не може їх розрізнити.

А обмеження на рівні агента, яке в нас уже було, те, що тікет може нести, коли запускає агента, навмисно не передавалося крокам команди. Тож агент, запущений із тікета, міг бути обмежений, а вузол команди ні. Це й була першопричина, і це було проєктне рішення, яке погано постаріло.

Правило: один чекбокс на вузлі

Виправлення це булеве поле на вузлі рев’ю. Познач Лише читання, і агент, що втілює цей крок, запускається без доступу на запис у проєкт: жодної правки файлів, жодних git commit чи push, жодних shell-команд, єдина задача яких змінювати робоче дерево. Читання, grep, git diff, git log, тести, лінтер і всі командні інструменти лишаються відкритими.

Ми чітко сказали, чим це не є: це не список заборон, який користувач пише вручну, для кожного CLI. Нікому не треба знати п’ять синтаксисів дозволів, щоб сказати «цей перевіряє». Перемикач породжує правильний прапорець для кожного провайдера і застосовується останнім, після автономного режиму і після всього, що користувач зберіг на агенті, тому він перемагає.

Що робить кожен CLI, за його власною довідкою

Ми примушуємо лише тих провайдерів, чий прапорець ми прочитали в їхньому власному --help. Вгаданий прапорець вбиває запуск помилкою розбору, а це гірше, ніж крок без примусу. Решта CLI отримують лише письмове правило, і редактор каже про це відкритим текстом під чекбоксом.

CLIЩо додає перемикач «лише читання»Тримається в автономному режимі?
Claude Code--disallowedTools "Edit" "Write" "MultiEdit" "NotebookEdit" "Bash(git commit:*)" "Bash(git push:*)" і даліТак, правила заборони діють під --dangerously-skip-permissions
Codex--sandbox read-onlyТак, це пісочниця ОС (Seatbelt на macOS, Landlock на Linux), а не список інструментів
Grok Build--deny "Edit" --deny "write" --deny "Bash(git commit*)" і даліТак, правила заборони діють під --always-approve
Antigravity--mode planТак, plan це режим виконання CLI лише для читання
OpenCode--agent planТак, вбудований агент plan забороняє інструменти правки
Mistral Vibe, Kimi Code, Copilot, Cursor, Amp, Aider і решталише абзац у промптіПеревіреного прапорця немає, і ми кажемо про це в редакторі

Дві деталі в цій таблиці коштували нам по багу кожна, тож їх варто проговорити.

Codex і Grok відмовляються приймати повторений прапорець. Обидва розбирають аргументи суворим парсером. Якби користувач уже зберіг на агенті --sandbox workspace-write, додавання --sandbox read-only слідом його не перекрило б, а завалило б запуск. Тому для прапорців зі значенням ми прибираємо будь-яке наявне входження разом зі значенням, перш ніж додати своє. Те саме для --agent в OpenCode, чий парсер перетворює повторений прапорець на масив і падає далі.

На Claude Code список має складатися. --disallowedTools приймає список через пробіл і може повторюватися, а ми вже передаємо один, коли агентові не можна керувати вбудованим браузером. Парсер конкатенує повторену варіативну опцію, тож два списки додаються, а не другий замінює перший.

Повний список для Claude Code це чотири інструменти правки файлів, кожна підкоманда git, яка пише в індекс, дерево, посилання чи віддалений репозиторій (add, commit, push, merge, rebase, reset, checkout, switch, restore, stash, cherry-pick, revert, apply, am, rm, mv, clean, tag, worktree), і shell-команди, які існують лише щоб змінювати файли (rm, mv, cp, tee, touch, mkdir, chmod, chown, ln, truncate, dd, sed -i). Grok бере ті самі рядки правил, у своїй glob-формі, плюс власні назви для файлових інструментів (search_replace, write, hashline_edit).

У промпта все ще є робота

Прапорець відмовляє. Він не пояснює. А агент, який натикається на відмову, якої не розуміє, вважає її багом і шукає інший шлях, а це рівно та поведінка, яку ми намагалися прибрати.

Тому крок лише для читання отримує ще два речення у свій промпт. Перше каже, що крок лише для читання, перелічує, що це означає, і стверджує, що відмова це правило, а не перешкода, яку треба обійти іншою командою. Друге перелічує, що лишається відкритим, і велить агентові повідомити, що має змінитися, з файлом, рядком і причиною, у своїй передачі, а застосувати це лишити кроку, якому належить код.

На CLI з перевіреним прапорцем цей абзац робить відмову зрозумілою. На решті він і є весь примус, і ми воліємо сказати це, ніж вдавати.

Хто лише читає в шаблонах, що постачаються

Вузли, які судять, лише читають: крок QA-перевірки у двох стартових шаблонах, кроки відтворення й перевірки в Bug hunt, гілки QA та Безпеки в Release shield, тестувальник у Feature squad.

Вузли, які володіють кодом, далі пишуть: розробник і релізний шлюз, який написано так, щоб самому виправляти кожне зауваження. Релізний шлюз, який не може писати, це релізний шлюз, який не може випускати.

Цей поділ і є весь задум, і саме цей поділ інцидент порушив двічі: релізний вузол, який писав не там, і вузли рев’ю, які писали взагалі.

Чим це не є

Це не межа безпеки. Репортер сказав це у звіті, і він мав рацію: bash -c обходить список заборонених інструментів. Якщо треба ізолювати агента, якому ти не довіряєш, це пісочниця або окрема машина, і Codex єдиний із п’яти, чий режим лише для читання справді є цим.

Перемикач зупиняє випадковість і дрейф ролі, а це і є те, що відбувається насправді. Рев’юер не обходить список заборон навмисно. Він хапається за Edit рефлекторно, і тепер рефлекс дістає відмову.

Чого ми не побудували

Репортер просив ще одне: подію в таймлайні запуску з текстом «вузол X записав у дерево», як мінімальний сигнал навіть без примусу. Ідея добра, і тут ми її не зробили, бо для цього потрібен базовий дифф на кожен крок на боці ранера. Якщо потреба повернеться, це наступний шматок.

Якщо ти не користуєшся AgentsRoom

Прапорці вище копіюються як є. Агент рев’ю, запущений вручну з codex --sandbox read-only або claude --disallowedTools "Edit" "Write" "MultiEdit" "NotebookEdit" "Bash(git commit:*)" "Bash(git push:*)", не може зробити те, що зробили два наші вузли рев’ю. Поклади ті самі два речення в його промпт, щоб він знав, чому йому відмовляють.

Чекбокс додає те, що тобі не треба пам’ятати, який із п’яти синтаксисів застосовується, що прапорець перемагає будь-який автономний режим, у якому працює крок, і що він переживає запуск, який пізніше знову заходить у той самий крок.

Перемикач вузла і таблиця за провайдерами задокументовані на сторінці Agent Teams. Чи варте взагалі рев’ю агентом того, і яка частина диффа все ще заслуговує на людину, це інше питання, і про нього ми писали в Чи варто все ще перевіряти код свого ШІ-агента?. Цей пост про річ меншу й механічнішу: коли ти вирішив, що агент перевіряє, зроби його фізично нездатним робити щось інше.

Завантажити AgentsRoom

Запускайте всіх своїх AI-агентів на всіх своїх проєктах з одного вікна.

БезкоштовноЗавантажити AgentsRoom

Додаток-компаньйон: контролюйте своїх агентів на ходу

Використовуйте свого: Claude, Codex, Antigravity CLI або іншого AI-провайдера.

Отримати розширення
Chrome Web Store

Надсилайте баги та запити прямо у свій публічний беклог.

Кілька проектів
Багато постачальників
Кілька агентів
Статус в реальному часі
Різниця файлів і коміт
Мобільний компаньйон
Попередній перегляд в реальному часі
Команди агентів
Автоматизація браузера
Розробка, орієнтована на беклог
Бібліотека підказок
Бібліотека навичок
Переглянути всі функції

Читати далі