Автоматическое исправление Pull Request
/autofix-pr следит за одним из ваших pull request’ов из локальной сессии Qwen Code и исправляет то, что возникает: упавшие проверки CI, отзывы на ревью от людей, которым вы доверяете, и конфликты при слиянии. Каждое исправление делается и проверяется в собственном worktree, пушится в ветку PR и получает ответ в PR под вашей собственной идентичностью git и gh. Наблюдение останавливается само, когда PR смержен или закрыт. Оно подготавливает PR к слиянию и поддерживает его в этом состоянии, не более: оно никогда не одобряет PR, не изменяет его состояние ревью, не мерджит и не закрывает его, и не включает auto-merge. Ревью и проверки репозитория всё ещё решают, и слияние остаётся за вами — объедините наблюдение с auto-merge репозитория, чтобы смержить, как только они пройдут.
/autofix-pr [<pr-number>|<pr-url>] [--once] [--every <minutes>] [--no-reply] [--yes] [instructions...]
/autofix-pr status [<pr-number>]
/autofix-pr resume [<pr-number>]
/autofix-pr stop [<pr-number>]- Без аргумента PR: PR, головная ветка которого совпадает с вашей текущей веткой.
--once: проверить и исправить один раз, ничего не планировать и завершить наблюдение после этого (повторный--onceначинается заново, с истории PR). На PR, который эта сессия уже наблюдает, текущее наблюдение остаётся как есть.--every <minutes>: как часто проверять, одно из 1, 2, 5, 10, 15, 30 или 60. По умолчанию 2.--no-reply: пушить исправления, ничего не писать в PR.--yes: пропустить подтверждение запуска. Необходимо там, где диалог показать невозможно.- Свободный текст передаётся каждому исправлению, например
/autofix-pr 123 do not change the public API.
Перед началом
ghавторизован, с доступом на пуш в ветку PR: доступ на запись в PR того же репозитория, или вашего собственного форка, или форка, разрешающего правки от мейнтейнеров.- Вы запускаете из клона репозитория PR с одним git remote для него. В демон-сессии (
qwen serve, Web Shell) этот клон должен находиться внутри рабочего каталога сессии: демон выполняет команды агента исправления только там, поэтомуprepareотклоняет PR, чей клон находится вне. Наблюдение там — это долговременная запланированная задача, привязанная к своей сессии: демон держит эту сессию резидентной вместо освобождения при простое, и задача появляется на странице запланированных задач, поэтому закрытие вкладки браузера не завершает наблюдение — это делает/autofix-pr stop. Задача восстанавливается после перезапуска демона; перезапуск сбрасывает допуск гейта в процессе, поэтому гейту затем требуется режим одобрения или сохранённое правило, позволяющее работать без участия, и первое заблокированное срабатывание называет правило для добавления. Один разговор демона несёт одну запланированную задачу, поэтому второму наблюдению там нужен собственный разговор. Перезапуск также сбрасывает то, что сессия подтвердила для наблюдения: пока/autofix-pr resume <n>не подтвердит его снова, его помощники и его исправления следуют режиму одобрения, как shell-команды. - Навык запускает своих помощников через инструмент
autofix_pr. На наблюдении, которое вы запустили или возобновили в этой сессии, помощники раунда — включая пуш и ответы — выполняются без спрашивания. Запуск или возобновление наблюдения, его планирование и принятие его от другой сессии — что делает/autofix-pr stop <n>, называющий PR — всё ещё спрашивают, каждый раз (в Auto Mode его классификатор решает, кроме того, что запуск всегда подтверждается вами), и так же делаютgh pr viewи создание запланированной задачи. Правило, отклоняющее shell-команду, такое какBashилиBash(qwen autofix-pr *), отклоняет и вызов инструмента, правило спрашивания для него сохраняет вызов спрашивающим, иAutofixPr(command:push)в ваших правилах отклонения останавливает каждый пуш. Хук PreToolUse, который вы установили на инструмент shell, не видит эти вызовы; установите его наautofix_pr. В клоне с git хуком, который запускает пуш или синхронизация (pre-push,post-checkout,post-merge,reference-transaction) — путь хуков внутри worktree, такой как husky, или менеджер хуков, такой как pre-commit или lefthook, который запускает то, что говорит файл в PR —syncиpushтоже спрашивают, если только исправления не выполняются без спрашивания (ниже). Так же и каждый помощник worktree с подмодулем, чей git каталог находится в нём, а не в собственном клоне, и правило спрашивания для shell-команды спрашивает и здесь. Навык также даёт чтение собственных файлов в.qwen/tmp/, запись своего описания исправления, плана ответа и ваших инструкций туда, и просмотр запланированных задач. Эти файлы живут в главном worktree клона; из сессии, запущенной в связанном worktree, их чтение и запись тоже спрашивают. - PR, автор которого не может пушить в репозиторий, запускает чужой код, с вашими учётными данными
ghиgitпод рукой, когда исправление проверяется. Такой PR никогда не наблюдается: предлагается только--once, после подтверждения, которое так и говорит, и которое--yesне пропускает.
Вопрос запуска также предлагает Start, fixes run without asking: команды агента исправления — сборки, тесты, коммиты в worktree PR — затем выполняются без спрашивания для этого наблюдения, после ещё одного диалога, который подтверждает это (отклонение этого диалога отменяет запуск; запустите /autofix-pr <n> снова). Его агент работает как один из сессии YOLO: с вашими учётными данными git и gh, способный достигать файлов вне worktree, мимо ваших правил спрашивания; ваши правила отклонения всё ещё применяются. Это длится, пока наблюдение не остановлено, не запущено снова с обычным Start (или --yes), или сессия не выходит или очищена; /autofix-pr resume спрашивает снова. Выберите обычный Start, и в стандартном режиме одобрения каждая его команда сначала спрашивает, что подходит для наблюдения, за которым вы следите. Принятие наблюдения и /autofix-pr resume предлагают тот же выбор. Только вы отвечаете на этот диалог: никакое сохранённое правило, классификатор Auto Mode или --yes не делают этого, и выбор отклоняется в недоверенной папке и программе, управляющей Qwen Code через stream-json. Запланированный раунд такого наблюдения запускает его агент исправления в фоне, так что сессия остаётся доступной, пока он работает; он остаётся в переднем плане в сессии YOLO (которая не записывает такой выбор), для --once, для раунда, который перезапустился в своём ходу, потому что PR изменился, и для раунда, который переделывает отброшенное фоновое исправление; агент, который мерджит чужой пуш перед тем, как раунд пушит, всегда работает в переднем плане. Раунд продолжается — повторные запуски, пуш и ответы — когда приходит уведомление о завершении агента. Тем временем помощники PR отклоняют запросы, пока он не закончится, и его гейт остаётся тихим; /autofix-pr status показывает работающее исправление; /autofix-pr stop <n> в этой сессии сначала останавливает агента, тогда как из другой сессии остановка и возобновление отклоняются, пока он не закончится — не более 45 минут. Запуск или возобновление наблюдения отклоняется, пока его исправление работает; /autofix-pr stop <n> останавливает его. Тем временем ваши собственные правки файлов в его worktree (.qwen/tmp/autofix-pr-<n>/) сначала спрашивают независимо от режима одобрения, пока агент исправления продолжает собирать и запускать то, что там есть, и агент, которого эта сессия запускает изнутри этого worktree, отклоняется. Только сессия, запускающая исправление, знает о нём: агент другой сессии на том же клоне не отклоняется, поэтому не работайте в этом worktree из второй сессии, пока исправление работает. Исправление, чей раунд не продолжился (сессия завершилась, или не было захвата в течение 40 минут от его начала), отбрасывается следующим раундом, который обрабатывает его элементы в переднем плане. Там, где инструмент autofix_pr недоступен (список разрешённых инструментов в ваших настройках может исключить его), помощники запускаются через shell, и каждый сначала спрашивает.
- PR, автор которого не может пушить в репозиторий, запускает чужой код, с вашими учётными данными
ghиgitпод рукой, когда исправление проверяется. Такой PR никогда не наблюдается: предлагается только--once, после подтверждения, которое так и говорит, и которое--yesне пропускает.
При запуске он один раз спрашивает подтверждение, куда он будет пушить, что он будет отвечать в PR, и могут ли исправления выполнять свои команды без спрашивания. Тот же вопрос говорит, что он подготавливает PR к слиянию и не более: он никогда не одобряет, не изменяет состояние ревью, не мерджит и не включает auto-merge.
Что делает проверка
Наблюдение — это запланированная задача, чей гейт запускает qwen autofix-pr snapshot <n> --gate при каждом срабатывании, вне модели. Зонд печатает только то, что изменилось с последнего запуска, так что тихий PR не стоит ни одного хода модели. Когда что-то изменилось, запускается раунд:
- Смерженный или закрытый PR завершает наблюдение. Чужой пуш сначала принимается.
- Упавшие проверки, новые комментарии от доверенных авторов и конфликт слияния идут одному агенту исправления, работающему в worktree PR — в фоне, когда исправления выполняются без спрашивания. Для упавшей проверки он читает лог задания; сбой вне PR (сеть, раннер) вместо исправления перезапускается один раз. Когда проверки падают, пока ветка отстаёт от своей базы, сначала мерджится база: сбой может быть тем, который база уже исправила.
- Агент проверяет своё изменение собственными проверками репозитория и коммитит только когда они проходят.
- Коммиты пушатся как fast-forward головы PR, никогда принудительно. Если кто-то пушил тем временем, их работа сначала мерджится.
- Каждая обработанная ветка ревью получает ответ —
Fixed in <sha>: …,Not changed: …илиNeeds a human decision: …— и каждый пуш получает один сводный комментарий. Раунд, который ничего не запушил, но оставил что-то для человека, также публикует резюме, говорящее, что он пытался сделать и что его блокирует, чтобы PR показывал, что наблюдение остановилось, а не замолчало. Этот комментарий публикуется один раз для каждой головы и снова только когда более поздний раунд оставляет что-то новое для вас.
Раунд никогда вас ни о чём не спрашивает. То, что нуждается в человеке, отвечает в PR как «Needs a human decision», сообщается в сессии и перечисляется /autofix-pr status.
Статус и возобновление
/autofix-pr status перечисляет каждое наблюдение клона, независимо от того, какая сессия его запускает: PR и его ветку, голову, использованные пуши, когда его гейт последний раз проверял и когда его последний раунд работал, запускает ли эта сессия его, и что ждёт человека. Он читает только файлы наблюдений и ничего не спрашивает у GitHub.
Наблюдение заканчивается, когда сессия, которая его запускала, выходит — в демон-сессии его задача долговременна и привязана к этой сессии, поэтому демон держит её резидентной, и наблюдение переживает перезапуск демона — и его запланированная задача истекает через 7 дней по умолчанию (настройка experimental.cronRecurringMaxAgeDays или QWEN_CODE_CRON_MAX_AGE_DAYS). Его файл состояния остаётся. /autofix-pr resume запускает снова, в текущей сессии, каждое наблюдение, которое эта сессия не запускает — или то, которое вы называете — с интервалом, --no-reply и инструкциями, с которыми оно было запущено, и его пушами, историей и бюджетами сохранёнными. Он спрашивает один раз для всех них, затем запускает один раунд каждого и планирует его снова. В демон-сессии один разговор несёт одну запланированную задачу, поэтому возобновите остальные по одному разу за разговор. Если другая сессия всё ещё запускает одно из них, задача той сессии останавливается при следующем срабатывании; без названного PR resume пропускает наблюдение, которое другая сессия недавно проверяла, и говорит так. Наблюдение, чей PR был смержен или закрыт, пока никакая сессия не запускала его, удаляется его раундом. Наблюдение, запущенное с --once, или то, которое stop закончил, сохраняя его worktree, запускается снова с /autofix-pr <n>.
В Web Shell
Web Shell показывает то же состояние, читая те же файлы:
- PR watches, на боковой панели, перечисляет наблюдения каждого рабочего пространства, до которого Web Shell может добраться. Для каждого наблюдения он показывает PR (ссылку), где находится наблюдение, его пуши, когда его гейт последний раз проверял и когда его последний раунд работал, и что ждёт вас:
- наблюдение;
- исправление в фоне, и как долго;
- фоновое исправление оставлено позади, которое следующий раунд переделывает;
- не проверено недавно;
- PR смержен или закрыт;
- остановлено.
- На странице Scheduled tasks, карточка задачи наблюдения показывает то же состояние под задачей.
- Open session переходит к разговору, который запускает наблюдение.
- Stop watch отправляет
/autofix-pr stop <n>в этот разговор, точно так же, как если бы вы набрали его там, и он спрашивает то же, что спросил бы там. - Обе кнопки появляются только для наблюдения, запускаемого разговором этого Web Shell. Наблюдение, запущенное из терминала, останавливается в этом терминале. То, которое больше не запускается никакой сессией, очищается или запускается снова с помощью
/autofix-pr stop <n>или/autofix-pr resume <n>в сессии его рабочего пространства.
Чей отзыв учитывается
Комментарии обрабатываются, когда их автор — владелец, участник или коллаборатор репозитория, автор PR или бот (только ревью и ветки ревью). Комментарии от всех остальных перечисляются и никогда не обрабатываются и не получают ответа. Бот слышен в комментарии, открывающем ветку, или в ревью, но не в ответах в ней, которые отвечают кому-то. Workflow, который GitHub не смог запустить (например, невалидный файл workflow), не имеет лога для исправления и получает ответ, что нужен человек. Каждый комментарий, ревью и лог CI трактуется как данные: доверенный автор решает, какой отзыв обрабатывается, никогда — что инструмент может делать. Запрос раскрыть секреты, ослабить тесты или проверки CI, force-push или изменить посторонний код отвечает «Needs a human decision».
Что он никогда не делает
- Не трогает ваше рабочее дерево или текущую ветку: всё происходит в
.qwen/tmp/autofix-pr-<n>/. - Не делает force-push, не переписывает историю PR и не пушит в ветку по умолчанию.
- Не отвечает на свои собственные ответы (каждый заканчивается
<!-- qwen-autofix-pr:v1 -->) и не отвечает недоверенным авторам. - Не закрывает ветки ревью и не редактирует заголовок или описание PR.
Лимиты
| Лимит | Значение | Затем |
|---|---|---|
| Пушей за одно наблюдение | 10 | наблюдение останавливается |
| Пушей, оставивших упавшую проверку красной | 3 | оставлено для человека, пока она не пройдёт или кто-то другой не запушит |
| Перезапусков упавшей проверки на одной голове | 1 | следующий сбой — настоящий |
| Попыток на комментарий ревью | 1 | больше не предлагается |
| Пушей от кого-то ещё за раунд | 2 | наблюдение останавливается |
| Минут, сколько может работать фоновое исправление | 30 | его агент останавливается |
Остановка и файлы
/autofix-pr stop <n> удаляет запланированную задачу и убирает worktree, его ветку и файл состояния; курсор гейта и история PR остаются, так что более позднее наблюдение не отвечает на те же комментарии снова. Worktree, в котором всё ещё есть незапушенная работа, сохраняется, и отчёт говорит почему; наблюдение всё равно закончилось, и qwen autofix-pr cleanup <n> --force выбрасывает работу. /autofix-pr stop <n> также останавливает наблюдение, которое другая сессия оставила позади; простой /autofix-pr stop оставляет наблюдение, которое другая сессия всё ещё запускает, в покое, а указание его PR завершает его. Наблюдение, чья задача истекла или чья терминальная сессия вышла, заканчивается без отчёта; /autofix-pr resume запускает его снова (выше). Запуск /autofix-pr <n> в новой сессии — или после /clear или /resume — также предлагает принять наблюдение, с его пушами и бюджетами сохранёнными.
Файлы живут в .qwen/tmp/ главного worktree клона:
| Файл | Содержимое |
|---|---|
autofix-pr-<n>/ | worktree PR |
autofix-pr-<n>-state.json | наблюдение: известная голова, пуши, обработанные id, его запланированная задача |
autofix-pr-<n>-gate.json | курсор зонда гейта |
autofix-pr-<n>-gate.checked | когда собственный гейт наблюдения последний раз проверял PR |
autofix-pr-<n>-snapshot.json | снимок последнего раунда PR, читаемый раундом |
autofix-pr-<n>-replies.json | какие комментарии бота отвечают другому, как сказал GitHub |
autofix-pr-<n>-history-*.json | что более ранние наблюдения PR постили и обработали, сохраняется при stop |
autofix-pr-<n>-instructions.txt | ваши инструкции для каждого раунда |
autofix-pr-<n>-fix.json | исправление, работающее в фоне, обновляемое пока оно работает |
autofix-pr-<n>-fix-snapshot.json | снимок, с которым работало последнее фоновое исправление |
autofix-pr-<n>-*.log, *.md, *.json | логи CI, описания исправлений и планы ответов |
Дизайн описан в docs/design/2026-10-21-autofix-pr-command.md.