Codex сам ганяє тести — досить рядка в AGENTS.md
Команда з 30 «AI-співробітниками» навчила Codex самому писати й запускати тести — на третій день забули прогнати їх вручну і зламали систему перемикання акаунтів. Рішення — один рядок у AGENTS.md: «Якщо змінюєш JS-файл, завжди запускай npm test» — і Codex сам ганяє тести, не звітуючи про завершення, доки вони не пройдуть. Для CI використовують `codex exec` і дію `openai/codex-action@v1`: одна робота без прав запису запускає тести, друга публікує коментар у PR. Тестів стало 118 замість початкових 34, а деплой заборонили за будь-яких провалених тестів — навіть якщо це затримує реліз на день.
Три частини одного рядка в AGENTS.md
Codex читає AGENTS.md перед стартом роботи. Файл можна покласти глобально — в ~/.codex/AGENTS.md у домашній папці, він діє для будь-якого репозиторію, — або на кожному рівні ієрархії проєкту, від кореня репозиторію до робочої папки. Файли конкатенуються від кореня до робочої папки, і ближчий до робочої папки текст перекриває попередні інструкції. Загальний ліміт — 32 КіБ, порожні файли пропускаються, а після досягнення ліміту решта файлів уже не читається.
Робочий рядок складається не з однієї команди, а з трьох елементів:
- команда тестів, яка реально працює в репозиторії — якщо вона не працює, Codex вирішить, що тестів немає, і піде далі;
- умова у форматі «Якщо змінюєш [щось], завжди запускай [команду]» — якщо ганяти тести на кожну зміну задорого, умову звужують до конкретної папки;
- обіцянка на випадок провалу, наприклад
Do not say you are finished while tests are still failing— без неї Codex може написати «тести не пройшли, але реалізація готова».
Ланцюжок: чат → codex exec → CI
Перший крок — прохання в звичайному чаті, де написання й запуск тесту об'єднані в одному запиті: Add one test for the current change and run it along with the existing tests. If it fails, fix it; if it passes, tell me what you fixed. Якщо розбити це на два окремі запити, можна отримати ситуацію, коли тест написаний, але жодного разу не запущений. Початковий набір тестів для системи перемикання акаунтів налічував 34 кейси — по одному на кожну умову перемикання, і команда змогла прочитати їх усі.
Для роботи без людини є codex exec — команда без екрана діалогу, призначена для CI-пайплайнів, перевірок перед мерджем і передачі результату іншим інструментам: codex exec "Run all tests and report the cause of any failures". Прогрес іде в stderr, фінальний звіт — у stdout, прапорець --json стрімить проміжні події по одному об'єкту на рядок, а -o записує у файл лише фінальне повідомлення. Команда використовує це для ранкової перевірки: тести на нічні зміни запускаються вранці, а людина читає тільки звіт про провали.
Ключі не варто лишати змінними середовища при запуску без нагляду — недовірений код може їх прочитати; документація радить передавати ключі лише на одне виконання, а для GitHub Actions користуватись офіційною дією openai/codex-action@v1. Перша робота без прав запису перевіряє репозиторій read-only і запускає Codex, друга — з правами запису — публікує результат коментарем у PR. Розділення обмежує масштаб шкоди, якщо щось піде не так. Офіційне застереження: Codex має бути останнім кроком роботи, бо будь-який крок після нього виконається вже у зміненому Codex стані.
Головна пастка: тести, які написав сам Codex
Якщо ШІ пише тести сам, чи не пропустиш момент, коли тест написаний неправильно? Автор відповідає прямо: так, пропустиш. Тому людина вручну читає лише першу версію тестів — якщо їх 34, на це йде година, і завдання просте: перевірити, чи умова «тест проходить, якщо виконано ось це» відповідає очікуванням.
Далі Codex сам додає тести з кожною зміною, і людина читає вже не всі, а лише ті, що впали — назва проваленого тесту показує, що саме він мав захищати, тож достатньо прочитати цю частину. Для системи перемикання акаунтів кількість тестів виросла з 34 до 118 саме так, без повного перечитування кожного нового кейса.
Останнє правило команди — не деплоїти зміни, які не проходять тести, без винятків, навіть коли поспішаєш. Реліз системи перемикання акаунтів затримали на день, поки всі 118 тестів не пройшли на обох Mac, бо день затримки коштує дешевше за третій день, коли тести забули прогнати вручну і зламали систему.