feat(ci): красная база получает один перезапуск - #1530
Conversation
Красная `main` замораживает очередь мержа (#1326, #1510) — и правильно делает: мержить поверх сломанной базы бессмысленно. Но выхода из положения у правила не было, когда база красная НЕ ПО ДЕЛУ. Круг замыкался: новый прогон `main` рождается только новым мержем, мерж заморожен, а перезапуск требует `actions:write`, которого у облачной сессии нет — прокси закрывает запись. Оставался клик человека. Замер 08–09.09.2026, две красноты подряд, обе по ОДНОЙ упавшей проверке: `test (macos-latest, 3.12)` после мержа #1516 (следующие три мержа дали зелёные прогоны) и `e2e` после мержа #1518 (весь набор на той же голове прошёл локально целиком). Каждый раз очередь замирала. `scripts/rerun_red_main.py` + `.github/workflows/rerun-red-main.yml` перезапускают упавшие джобы последнего прогона базы ровно при двух условиях, и обе половины обязательны: * упала РОВНО ОДНА проверка. Настоящая поломка почти никогда не роняет одну ячейку матрицы — она валит сборку, линтер или весь ряд ОС; мигание, наоборот, почти всегда одиночное; * попытка РОВНО ОДНА. Второй перезапуск — уже не проверка гипотезы, а добывание зелёного. Не помогло — заморозка остаётся, и очередь двигает PR с меткой `blocker`. Механизм не отменяет правило, а доводит его до конца. Рекурсии нет: перезапуск порождает новый прогон, тот разбудит workflow снова и получит отказ по `run_attempt`. Граница держит цикл сама. След обязателен — итог уходит в summary прогона: «было красным, стало зелёным» без объяснения выглядит как исчезнувшая улика. Closes #1524 Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wqpt9etxi7Hz6dNyhmYfx1
Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wqpt9etxi7Hz6dNyhmYfx1
|
Упало тестов: 4 — в джобах:
Прогон: https://github.com/ArtVsMark/Stepik-Python-Grader/actions/runs/34327290449 Сводка обновляется на каждом красном прогоне этого PR ( |
Красная
mainзамораживает очередь мержа (#1326, #1510) — и правильноделает: мержить поверх сломанной базы бессмысленно. Но выхода из
положения у правила не было, когда база красная НЕ ПО ДЕЛУ. Круг
замыкался: новый прогон
mainрождается только новым мержем, мержзаморожен, а перезапуск требует
actions:write, которого у облачнойсессии нет — прокси закрывает запись. Оставался клик человека.
Замер 08–09.09.2026, две красноты подряд, обе по ОДНОЙ упавшей
проверке:
test (macos-latest, 3.12)после мержа #1516 (следующие тримержа дали зелёные прогоны) и
e2eпосле мержа #1518 (весь набор натой же голове прошёл локально целиком). Каждый раз очередь замирала.
scripts/rerun_red_main.py+.github/workflows/rerun-red-main.ymlперезапускают упавшие джобы последнего прогона базы ровно при двух
условиях, и обе половины обязательны:
одну ячейку матрицы — она валит сборку, линтер или весь ряд ОС;
мигание, наоборот, почти всегда одиночное;
добывание зелёного.
Не помогло — заморозка остаётся, и очередь двигает PR с меткой
blocker. Механизм не отменяет правило, а доводит его до конца.Рекурсии нет: перезапуск порождает новый прогон, тот разбудит workflow
снова и получит отказ по
run_attempt. Граница держит цикл сама.След обязателен — итог уходит в summary прогона: «было красным, стало
зелёным» без объяснения выглядит как исчезнувшая улика.
Closes #1524
Работа сделана вместе: @ArtVsMark — постановка, решения и приёмка; Claude Code — реализация.