Справочник по конфигурации
Каждый ключ emet.config.json со значением по умолчанию и смыслом. Источник истины — emet/schema/emet.config.schema.json. Термины соответствуют GLOSSARY.md. Назад к README.
emet init записывает файл. emet preflight и emet doctor проверяют его. Ключ с пометкой prose-only читают промпты /emet, а не CLI. Ключ с пометкой deprecated по-прежнему принимается. Схема также допускает свободный текстовый ключ "//" для заметок (его не читает ни один инструмент) и "version", который всегда равен 1.
pr
Как сливается PR волны.
{ "pr": { "autoMerge": true, "mergeMethod": "squash", "maxCiFixAttempts": 2 } }autoMerge(по умолчаниюtrue): дождаться проверок PR и слить; если проверок нет, слить сразу. Упавшая проверка исправляется и отправляется, доmaxCiFixAttemptsраз, после чего PR остаётся открытым для человека. Волна с чем-либо помеченным никогда не сливается автоматически.mergeMethod(по умолчаниюsquash):squash,mergeилиrebase, передаётся вgh pr merge.maxCiFixAttempts(по умолчанию2, минимум0): сколько раз координатор может попытаться исправить упавшую проверку, прежде чем оставить PR открытым для человека.
handoff
Что происходит после закрытия волны, и ограничения размера заметки передачи воркера. Проверяется emet preflight.
{ "handoff": { "autoChain": false, "launcher": "auto", "permissionMode": "bypassPermissions" }}-
maxLines(по умолчанию60): наибольшее число строк в заметке.emet/handoff-<ticket>.md, после которогоemet handoff --checkеё отклоняет. -
maxChars(по умолчанию8000, около 2k токенов): наибольшее число символов в заметке передачи. -
autoChain(по умолчаниюfalse): после чистой, слитой волны, если остались ещё волны, запустить следующую черезclaude --bgвместо вывода/emet:run --dispatch <spec-id>. Посмотреть её можно черезclaude agentsилиclaude attach emet-<spec-id>-w<n>. Требования:claudeв PATH с поддержкой--bg.- Доверенное рабочее пространство.
--bgработает неинтерактивно, поэтому диалог доверия не показывается; один раз откройтеclaudeинтерактивно в репозитории и подтвердите его. - Предупреждение об обходе, один раз принятое в интерактивной сессии (
skipDangerousModePermissionPrompt), поскольку следующая волна выполняется вhandoff.permissionMode, а не в режиме запускающей сессии.
Запуск происходит, только если PR слит и ничего не помечено, и пропускается, если сессия
emet-<spec-id>-*уже активна (claude agents --json). Если запуск не удался, выводится/emet:run --dispatch <spec-id>. -
launcher(по умолчаниюauto, одно изauto,orca,bg): дополнительно открыть волну во вкладке Orca, выполняющейclaude attach.autoопрашивает среду выполнения Orca (orca status), поэтому работает и из сессийclaude --bg, у которых нетTERM_PROGRAM;orcaпробует всегда;bg— никогда. В любом случае волна работает в фоне, а вкладка, которую не удалось открыть, никогда не останавливает цепочку.emet launch <spec-id> --wave <n>выполняет запуск целиком; см.emet launch. -
permissionMode(по умолчаниюbypassPermissions, одно изbypassPermissions,auto,acceptEdits): режим разрешений цепочечной сессии. Он не наследуется от запускающей сессии, потому что классификатор режимаautoможет отклонить шаг вродеgh pr mergeи оставить волну недоделанной. Ваши правилаpermissions.denyпо-прежнему действуют, но предупреждение об обходе нужно один раз принять интерактивно (skipDangerousModePermissionPrompt).
budgets
Все необязательны.
{ "budgets": { "workerAttempts": 2, "reviewRounds": 2, "stallNudgeCap": 6 } }workerAttempts(по умолчанию2, минимум1): сколько раз тикет может провалитьverify, прежде чем гейт ответитdefer. Тикет получает метку deferred, а остальная часть волны продолжается. Сбой окружения, например выход тестовой команды с кодом 126/127 или сбой провайдера, приостанавливает запуск, не расходуя попытку.reviewRounds(по умолчанию2, минимум1): сколько раундов ревью и исправлений получает тикет до одной эскалации на следующий уровень модели. Всё, что остаётся открытым после этого, получает решение.stallNudgeCap(по умолчанию6, минимум1): сколько раз застрявшего воркера подталкивают. Счётчик никогда не сбрасывается.
models
Модель и усилие для каждой роли. Каждый ключ необязателен; если раздел опущен, остаются воркер sonnet/medium и ревьюер opus/medium. Усилие — одно из low, medium, high, xhigh, max.
{ "models": { "worker": { "model": "sonnet", "effort": "medium" }, "reviewer": { "medium": { "model": "opus", "effort": "medium" }, "high": { "model": "opus", "effort": "medium" } }, "triage": "haiku" }}worker.model(по умолчаниюsonnet),worker.effort(по умолчаниюmedium): воркер. СтрокаModel:тикета переопределяетworkerтолько для этого воркера.reviewer.mediumиreviewer.high(по умолчанию у каждогоopus,medium): ревьюер для каждого уровня риска, возвращаемогоemet assess. Повысьтеreviewer.high.effort(например, доhigh), чтобы усилить проверку рискованных волн.triage(по умолчаниюhaiku): недорогая модель для триажа логов CI и ревью уровня passive. Упавшая проверка передаётся агенту на этой модели, который возвращает не более примерно 2k токенов с указателямиfile:line.escalation(по умолчанию{ "sonnet": "opus" }): следующий уровень модели для каждого имени модели, используется, когда тикет достигает предела исправлений.
review
{ "review": { "highRiskPaths": [] } }highRiskPaths(по умолчанию[]): дополнительные подстроки путей без учёта регистра, которые принудительно задают уровень ревьюhighвemet assessсверх встроенного набора (аутентификация, безопасность, платежи, вебхуки, CI, установщик, lock-файлы, миграции и опасные sink, такие как сырой SQL или pipe-to-shell).
landing
mode(по умолчаниюpr):prоткрывает pull request (требуетсяgh).mergeсливает интеграционную ветку в локальный trunk командойemet landи никогда не отправляет изменения, при этом вместо CI выступаетcommands.selfCheck. Не зависит от трекера. См. ADR-0010.
tracker
С каким трекером задач работает /emet. CLI читает kind, чтобы решить, какие проверки зависимостей применимы; остальное описывает адаптер, которому следует команда /emet (см. docs/agents/issue-tracker.md).
kind(обязателен):linear,githubилиlocal. Дляlocalсм. Локальный трекер и ADR-0011.transitions.onStart,transitions.onPrOpen,transitions.onPrMerge: кто записывает каждый переход состояния тикета:worker,coordinatorилиautomatic(это делает интеграция трекера, например интеграция Linear с GitHub при открытии или слиянии PR). Координатор никогда не записывает переход с пометкойautomatic.github.priorityLabels: сопоставляет уровень приоритета ("1"= P0 наивысший до"4"= P3) с именем метки GitHub, например{"1":"P0","2":"P1"}. Если ничего не объявлено, тикеты упорядочиваются поcreatedAtпо возрастанию, иemet doctorсообщает об этом.github.stateLabels: сопоставляет состояние рабочего процесса (todo,in-progress,in-review) с именем метки GitHub, например{"todo":"status:todo"}.doneиcanceledвыводятся из закрытого состояния задачи иstate_reason.linear: настройки, специфичные для Linear (ключ команды, имена состояний рабочего процесса). Читаются только моделью, следующейdocs/agents/issue-tracker.md, но не CLI.local.idPrefix(deprecated): идентификаторы локальных тикетов теперь имеют вид<feature-slug>-<NN>.readyLabel,triageLabels,prReference(deprecated): шаблоны меток и ссылок на PR, напримерCloses #{number}(github) илиRefs: {id}(linear).
preflight
requiredFiles(по умолчанию нет): файлы, которыеemet preflightтребует в корне репозитория перед диспетчеризацией волны, каждый в виде{ "path", "why" };whyпоказывается в сообщении об ошибке. Пустое значение означает, что проверка не выполняется.requiredCommands(по умолчанию нет): бинарные файлы, которые должны разрешаться в PATH до диспетчеризации.emet preflightзавершается кодом 1 с перечислением неразрешённых, аemet doctorсообщает о них. Это собственный список репозитория, отдельный от проверок зависимостей, определяемых трекером; дляghуже есть отдельная проверка, так что включать его необязательно. Частые дополнения:rgиsg.
specs
dir(по умолчаниюdocs/specs): каталог живых спецификаций относительно репозитория, в который пишетemet spec-merge.
map
path(по умолчаниюdocs/agents/codebase.md): путь относительно репозитория к карте, которую генерируетemet map.
concurrency
waveSize(по умолчанию4, минимум1): наибольшее число вызовов Agent, диспетчеризуемых вместе в одной волне.maxLiveWorkers(по умолчаниюauto): глобальный предел, общий для всех координаторов/emet, работающих на этом хосте, во всех репозиториях. Пул слотов находится в~/.local/state/emet/slots, а не в каком-либо одном репозитории.autoвыводит предел из числа процессоров и объёма ОЗУ хоста; положительное целое число фиксирует его. Отдельная проверка запаса памяти (EMET_MEM_RESERVE_GIB, по умолчанию 8 GiB) отклоняет захват слота, когда доступной памяти слишком мало, независимо от этого предела. Переменная окруженияEMET_MAX_LIVE_WORKERSпереопределяет это поле и тоже принимаетauto.runIdleThresholdMs(по умолчанию5400000, 90 минут): как долго запуск без живого якоря всё ещё считается простаивающим, а не мёртвым, исходя только из свежести транскрипта. Переменная окруженияEMET_RUN_IDLE_THRESHOLD_MSпереопределяет его.
См. Переменные окружения.
ticket
idPattern: исходный текст якорного регулярного выражения, которому должен соответствовать идентификатор тикета, например^PROJ-\d+$. Неверный шаблон — грубая ошибка конфигурации.branchPrefix: префикс в нижнем регистре (^[a-z0-9-]+$) для локальной ветки воркера. Ветки имеют вид<branchPrefix>-<number>-<slug>, аcleanupобходит glob<branchPrefix>-*.idExample(deprecated, prose-only): один пример идентификатора, соответствующийidPattern.branchPattern(deprecated, prose-only): полный шаблон имени ветки.
commands
Все prose-only.
selfCheck: команды, которые воркер запускает, прежде чем считать изменение готовым, например["npm run check"]. Приlanding.modemergeзаменяет CI.workerScopedSuite: команда, которой воркер тестирует только затронутую область.emet verifyтребует, чтобы она проходила.fullSuite.run: команда для набора тестов всего репозитория, запускается один раз на интеграционной ветке после слияния веток волны. Красный результат блокирует PR иautoChain.fullSuite.singleton:true, если набор тестов может запускать только один worktree одновременно.fullSuite.runInBackground,fullSuite.reset(deprecated): флаг фонового запуска и команды сброса состояния.
worktree
lockReason: шаблон причиныgit worktree lock, которую воркер записывает при начальной настройке и которую заполняетemet lock-reason. По умолчанию этоemet run={runId} ticket={ticket} anchor={anchorPid} slug={coordinatorSlug} at={iso}. Переопределяйте только для добавления полей:emet lock-reasonотклоняет шаблон, в котором нет буквального токенаemet, а также любого изrun=,ticket=,anchor=,at=илиslug=.copyFromMain(prose-only): пути, копируемые из чекаута trunk в свежий worktree перед начальной настройкой, например неотслеживаемые env-файлы.bootstrap(prose-only): shell-команды, выполняемые один раз в свежем worktree до старта воркера, например["npm ci"]. Выполняются фазой 6/emet, но не CLI.stateDir(deprecated, prose-only): каталог для локальных логов запуска, например.emet.
usage
oversizedReadLines(по умолчанию400, минимум1): Read без offset и limit для файла длиннее этого числа строк считается чрезмерным вemet usage.stalledMinutes(по умолчанию10, минимум1): порог--minutesпо умолчанию дляemet usage --stalled.
sizing
inlineMaxLines(по умолчанию100, минимум1): наибольший размер текста тикета в строках, остающегося встроенным в промпт воркера.
schema
Только prose-only. Принадлежность схем данных в этом репозитории, используется правилом избежания конфликтов фазы 3 при разбиении тикетов. Пустое значение или отсутствие пропускает правило.
ownedPaths: пути, определяющие общую схему, например["prisma/schema.prisma"]. Затрагивать их может не более одного воркера на волну.sharedDatabase(deprecated):true, если воркеры используют одну физическую базу данных.
commit
Только prose-only.
trailer: ключ git-трейлера, который воркер добавляет к коммитам со ссылкой на тикет, напримерRefs.trailerPosition:bodyилиfooter.
repo
trunk: ветка, в которую сливаются изменения каждого воркера и которая служит базой любого git-сравнения в cleanup и preflight, напримерmain.remote(по умолчаниюorigin): git-удалённый репозиторий, на котором находитсяtrunk.integrationBranch(deprecated, prose-only): необязательная долгоживущая ветка, на которую волна интегрируется перед trunk.commitTypes(deprecated, prose-only): допустимые типы Conventional Commit для коммитов воркеров.
design
Необязательно, prose-only. null или отсутствие пропускает шаг ревью дизайна и интерфейса.
canvasIndex(deprecated): путь к файлу дизайн-холста, который воркеры проверяют перед изменениями интерфейса.