Трекеры и посадка
Где живут тикеты, как приземляется волна и как волны выстраиваются в цепочку. Каждый упомянутый здесь ключ описан в справочнике по конфигурации; каждая подкоманда — в справочнике по CLI.
Трекеры
emet работает с Linear, GitHub Issues или локальными файлами, что задаётся через tracker.kind. Для трекера github нужен gh. Для трекера linear сервер Linear MCP должен быть объявлен в .mcp.json (или на уровне пользователя); см. справочник по зависимостям.
Локальный трекер
При tracker.kind: "local" спецификации и тикеты — это markdown-файлы в .scratch/ основного worktree (не под версионным контролем): .scratch/<slug>/spec.md и .scratch/<slug>/issues/<NN>-<slug>.md, каждый со строками Status: и Blocked by: и комментариями под ## Comments. Координатор читает и записывает их через emet tracker (create-spec, create-ticket, read, frontier, set-state, comment, close). emet init --tracker local настраивает это. См. ADR-0011.
Посадка
landing.mode — это "pr" (по умолчанию) или "merge", независимо от трекера. В режиме merge волна приземляется как одно локальное слияние в trunk командой emet land, при этом вместо CI выступает commands.selfCheck, а push не выполняется. gh нужен только если трекер — github или посадка выполняется через pr. См. ADR-0010.
PR посадки
Одна волна — один PR. В его тексте для каждого тикета есть Closes #N (закрывающее ключевое слово трекера), а координатор переводит тикеты в in-review, когда открывает PR. Затем PR сливается согласно pr.autoMerge или остаётся открытым, если волна была помечена, autoMerge равен false или исправления CI закончились (тогда PR получает метку human-decision). После слияния emet cleanup --run <runId> освобождает ветки волны, захваты тикетов и слоты воркеров.
После того как ветки волны слиты вместе, commands.fullSuite один раз запускается на интеграционной ветке. Красный результат блокирует PR и autoChain. Гейт получает результат как --integration.
Цепочки волн
Последующие волны выполняются в собственных сессиях, никогда не в той, что выполняла волну 1. Два необязательных раздела emet.config.json управляют тем, что происходит дальше (оба проверяются emet preflight):
{ "pr": { "autoMerge": true, "mergeMethod": "squash", "maxCiFixAttempts": 2 }, "handoff": { "autoChain": false, "launcher": "auto", "permissionMode": "bypassPermissions" }}-
pr.autoMerge(по умолчаниюtrue): дождаться проверок PR и слить; если проверок нет, слить сразу. Упавшая проверка исправляется и отправляется, доmaxCiFixAttemptsраз, после чего PR остаётся открытым для человека. Волна с чем-либо помеченным никогда не сливается автоматически. -
handoff.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>. -
handoff.launcher(по умолчаниюauto): дополнительно открыть волну во вкладке Orca, выполняющейclaude attach.autoопрашивает среду выполнения Orca (orca status), поэтому работает и из сессийclaude --bg, у которых нетTERM_PROGRAM;orcaпробует всегда,bg— никогда. В любом случае волна работает в фоне, а вкладка, которую не удалось открыть, никогда не останавливает цепочку.emet launch <spec-id> --wave <n>выполняет запуск целиком (проверка дубликатов сессий,claude --bg, вкладка) и выводит{ name, id, attach, orcaTab: { opened, reason } }. Используйте его, а не голыйclaude --bg, когда нужно вручную запустить волну в другой сессии. -
handoff.permissionMode(по умолчаниюbypassPermissions): режим разрешений цепочечной сессии. Он не наследуется от запускающей сессии, потому что классификатор режимаautoможет отклонить шаг вродеgh pr mergeи оставить волну недоделанной. Ваши правилаpermissions.denyпо-прежнему действуют, но предупреждение об обходе нужно один раз принять интерактивно (skipDangerousModePermissionPrompt).
Гейты, бюджеты и записи
Фазы сами не решают, когда тикет готов, пригоден к слиянию или заслуживает повторной попытки. Они вызывают команду CLI, которая читает запись на диске и выводит решение. Записи запусков хранятся в .emet/runs/<run-id>/, а журнал ревью — в .emet/review/, в основном чекауте, а не в worktree воркера. Каждая команда выводит справку по использованию с --help. Таблица команд и того, что обеспечивает каждая, приведена в разделе Гейты и записи.
Бюджеты (emet.config.json, все необязательны):
{ "budgets": { "workerAttempts": 2, "reviewRounds": 2, "stallNudgeCap": 6 } }workerAttempts: сколько раз тикет может провалитьverify, прежде чем гейт ответитdefer. Тикет получает метку deferred, а остальная часть волны продолжается. Сбой окружения, например выход тестовой команды с кодом 126/127 или сбой провайдера, приостанавливает запуск, не расходуя попытку.reviewRounds: сколько раундов ревью и исправлений получает тикет до одной эскалации на следующий уровень модели. Всё, что остаётся открытым после этого, получает решение.stallNudgeCap: сколько раз застрявшего воркера подталкивают. Счётчик никогда не сбрасывается.
Живые спецификации, карта и метрики
Живые спецификации. После автоматического слияния волны emet spec-merge --spec <id> вливает дельты требований ADDED/MODIFIED/REMOVED спецификации в docs/specs/<area>.md (specs.dir). Перед записью он проверяет каждую область. Конфликт или требование, которое потеряло бы сценарий, завершается кодом 1 и оставляет все файлы нетронутыми.
Карта кодовой базы. emet map записывает обзор существующей кодовой базы (стек, структура, соглашения, тестирование, горячие точки) в docs/agents/codebase.md (map.path) с отметкой SHA коммита, по которому он построен. Один и тот же коммит всегда даёт один и тот же файл. emet map --stale завершается кодом 1, когда HEAD ушёл дальше отметки, и в этом случае emet preflight предупреждает. emet map --for <globs> выводит только разделы, соответствующие поверхностям правок тикета. Этот вывод — единственная часть карты, входящая в задание воркера.
Метрики. emet metrics --run <id> сообщает токены, стоимость в эквиваленте API и время выполнения по тикету, по волне и по запуску, считывая их из транскриптов сессий. Он также сравнивает бюджет контекста, оценённый для каждого тикета, с фактически использованным каждым воркером. Его сводка помещается в конец итогового отчёта запуска.