Перейти к содержимому

Трекеры и посадка

Где живут тикеты, как приземляется волна и как волны выстраиваются в цепочку. Каждый упомянутый здесь ключ описан в справочнике по конфигурации; каждая подкоманда — в справочнике по CLI.

emet mascot, working

Трекеры

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>. Требования:

    1. claude в PATH с поддержкой --bg.
    2. Доверенное рабочее пространство. --bg работает неинтерактивно, поэтому диалог доверия не показывается; один раз откройте claude интерактивно в репозитории и подтвердите его.
    3. Предупреждение об обходе, один раз принятое в интерактивной сессии (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 и время выполнения по тикету, по волне и по запуску, считывая их из транскриптов сессий. Он также сравнивает бюджет контекста, оценённый для каждого тикета, с фактически использованным каждым воркером. Его сводка помещается в конец итогового отчёта запуска.