Конфигурация Codex - это не один файл, а стек слоёв с определённым приоритетом, и понимание этого стека важнее знания отдельных ключей. CLI, IDE-расширение и локальное приложение используют совместимые слои config.toml. Эффективное значение любой настройки выбирается по документированному приоритету слоёв, а не по тому, где вы записали его последним. При этом проектные слои загружаются только для доверенного проекта - ровно как и вся остальная исполняемая конфигурация.
Приоритет выстроен от разового к постоянному, и это логично. Выше всего - флаги CLI и разовые переопределения через -c key=value: они для эксперимента здесь и сейчас. Ниже - проектный .codex/config.toml, читаемый от корня репозитория к текущему каталогу. Ещё ниже - выбранный файл профиля, затем пользовательский config.toml, затем системный /etc/codex/config.toml на Unix, если он есть, и только в самом низу встроенные значения по умолчанию. Системный слой легко забыть, а он реален: настройка, которую вы не находите ни в проекте, ни у себя, может приходить именно оттуда. Более конкретный и более близкий к моменту слой перекрывает общий, поэтому одну и ту же настройку в разных слоях встречает разное решение.
Полезно один раз увидеть разовое переопределение и команды диагностики рядом. Ниже - codex -c с временным значением и команды /debug-config и /status в TUI. К этой форме возвращаются, когда поведение не совпадает с ожиданием: чаще всего дело не в "баге", а в том, что какой-то слой перекрыл ваш. Разовое -c удобно именно для эксперимента - проверить эффект настройки, не трогая постоянные файлы.
Managed requirements.toml стоит особняком и меняет саму логику стека. Это не просто ещё один слой значений по умолчанию: он может запрещать значения, которые нижние слои не имеют права расширить. Обычный слой можно перекрыть слоем выше; managed-требование - нельзя, в этом его смысл. Организация задаёт им обязательные границы, и попытка ослабить их проектным или пользовательским config не сработает - именно так и должна вести себя централизованная политика.
Полезно один раз свести приоритет слоёв в таблицу, чтобы не гадать, какой из них победит. Ниже - карта от CLI-флагов до встроенных значений. К ней возвращаются, разбирая, почему настройка не применилась: достаточно пройти по приоритету сверху вниз и найти слой, который её перекрыл. Понимание порядка превращает загадочное "не работает" в предсказуемое "перекрыто вот здесь", которое видно в /debug-config.
Диагностика конфигурации держится на двух командах. /debug-config показывает порядок слоёв, их активное или отключённое состояние и источники политики - то есть отвечает на вопрос "какой слой откуда взялся и что победило". /status показывает эффективный результат в целом. Вместе они снимают неопределённость: вместо предположения о том, какое значение в игре, вы видите его источник. Проверять настройку этими командами дешевле, чем гадать по содержимому файлов.
| Приоритет | Layer | Пример |
|---|---|---|
| 1 - высший | CLI flags и -c key=value | Разовый эксперимент |
| 2 | Project .codex/config.toml (root -> CWD) | Defaults репозитория и модуля |
| 3 | Выбранный profile file | $CODEX_HOME/review.config.toml |
| 4 | User config.toml | Личные постоянные настройки |
| 5 | System /etc/codex/config.toml (Unix, если есть) | Настройки машины |
| 6 - низший | Built-in defaults | Значения самого Codex |
| managed | requirements.toml запрещает | Границы организации, их не ослабить снизу |
Отдельного внимания заслуживает --strict-config, особенно в CI и раскатке. По умолчанию неизвестное поле поддерживающие runtime-команды могут молча проигнорировать - и вы не заметите опечатку в ключе. С --strict-config неизвестное поле становится ошибкой, а не тихо пропущенной строкой. В CI это важно: лучше упасть на непонятном ключе сразу, чем обнаружить, что настройка годами не применялась, потому что была написана с ошибкой и молча игнорировалась.
Типичные провалы вокруг конфигурации предсказуемы. Записать настройку в один слой и удивиться, что её перекрыл другой, более приоритетный. Ждать, что проектный config ослабит managed requirements, - хотя тот запрещает именно это. Гадать об эффективном значении вместо /debug-config и /status. И не включить --strict-config в CI, оставив опечатки молча игнорируемыми. Понимайте приоритет слоёв, помните, что managed запрещает, проверяйте эффективное значение командой и включайте строгую проверку там, где важна точность.
codex -c 'model_reasoning_effort="high"' # разовое переопределение (высший приоритет)
# В TUI:
/debug-config # порядок слоёв, active/disabled, источники policy
/status # эффективный результат
# --strict-config: неизвестное поле становится error, а не тихо игнорируется (CI/rollout)