Звать первым, когда в этом репозитории что-то покраснело или встало и ещё не ясно, что именно сломано: красная общая ветка main, упавший гейт или прогон по расписанию, изменение, которое не сливается при зелёных проверках, замёрзшая очередь автомержа, окно, которое молчит. До любой починки.
Installs into .claude/skills of the current project.
Are you the author of Incident Triage?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/artvsmark-incident-triage)
---
name: incident-triage
description: >-
Звать первым, когда в этом репозитории что-то покраснело или встало и ещё не
ясно, что именно сломано: красная общая ветка main, упавший гейт или прогон
по расписанию, изменение, которое не сливается при зелёных проверках,
замёрзшая очередь автомержа, окно, которое молчит. До любой починки.
argument-hint: "[что покраснело или встало]"
---
# Первичный разбор инцидента
> **Читатель:** агент — окно, у которого что-то покраснело или встало, в момент до первой починки.
## Зачем это существует
Первичный разбор здесь проваливался не незнанием правил, а **вопросом, заданным
первым**: окно спрашивало «что не так с моим изменением», а не «что красное,
с какого времени и на какой поверхности».
- **2 сентября 2026, 08:55** покраснела `attribution-history`. Дежурный отчитался
«ветка зелёная» — работа стояла у него в исключениях, — и за следующие полчаса
в общую ветку уехали **два** изменения с зелёными проверками на сломанном
основании. Заметил владелец, а не механизм
([`AGENTS.md`](../../../AGENTS.md) § «Открытая работа», пункт 0).
- **С 23 августа** сверка сводки краснела **каждый день**, расхождение дошло до
двадцати четырёх строк. **Четыре дня** ни одно окно этого не заметило: окна
ходили в трекер, свод и изменения — туда, где отказа по расписанию не видно
([142](../../../rules/ru/142-a-scheduled-red-needs-an-addressee.md), инцидент).
- **4 сентября** прогон ревью упал за ноль секунд — работ ноль, шагов ноль —
на кириллическом `id:` шага. Красное на общей ветке заморозило очередь, и два
изменения простояли молча, **пока причину искали в них самих**
([`CHANGELOG.md`](../../../CHANGELOG.md), запись «Имя шага (`id:`) и обращение к его выводу»).
- **10 сентября** очередь не двигала готовые изменения, и диагноз «событие
`workflow_run` не приходит» чуть не ушёл в починку. Проверка: событие пришло
в **25 случаях из 25**, а из **120** заходов **67** были отменены в очереди
([199](../../../rules/ru/199-a-run-cancelled-while-queued-is-not-a-missing-event.md), инцидент).
## Что сделать
**0. Разделить запись на четыре колонки с первой строки.** Разбор без этого
деления смешивает увиденное с выведенным, и вывод начинает выглядеть фактом.
| Колонка | Что туда идёт | Чего это НЕ означает |
|---|---|---|
| **факт** | увиденное на площадке с адресом: номер прогона, коммит, время UTC | не «причина» — факт ещё ничего не объясняет |
| **допущение** | принятое без проверки, в том числе слова комментария или ответа о механизме — пока они не сверены с кодом ([183](../../../rules/ru/183-a-claim-about-the-mechanism-is-checked-against-it.md)) | не «ложь» — просто не проверено |
| **гипотеза** | объяснение, у которого названа проверка и то, что её опровергнет | не «диагноз» |
| **решение** | что сделано и **чем подтверждено** — номер прогона или изменения | не «починено», пока нет живого исхода |
Увиденное не на площадке — чтение кода, подделка в наборе, локальный прогон, облачное
окно за посредником — идёт в гипотезы с пометкой «подтвердить на площадке»
([037](../../../rules/ru/037-finding-status-depends-on-window.md)).
**1. Что красное — по источникам сверху вниз, первый непустой и есть план**
([091](../../../rules/ru/091-work-sources-are-ordered-first-non-empty-wins.md),
[`AGENTS.md`](../../../AGENTS.md) § «Открытая работа»):
1. общая ветка `main` — последние **завершённые** прогоны на её голове, **все**,
включая прогоны по расписанию (`main-red`, `consumers-sync`, `badges`,
`attribution-history`), а не только `ci`;
2. открытые изменения и их проверки;
3. трекер.
Адресат красного по расписанию здесь уже есть — задача, которую заводит
`main-red.yml`. Разбор пишется в неё, вторая не заводится: это граница
«не работает» у [142](../../../rules/ru/142-a-scheduled-red-needs-an-addressee.md).
**2. Сначала сколько, потом какие.** Число прогонов и проверок на голове — до
их статусов. «Проверок нет» означает «не стартовало» — например, из-за
конфликта с базой, — а не «зелено» и не «сломано»
([010](../../../rules/ru/010-empty-checklist-is-not-green.md)).
**3. Отнести к классу и задать его первый вопрос.**
| Класс | Первый вопрос | Правило |
|---|---|---|
| красная `main` | что именно красное и с какого коммита. Очередь стоит **целиком**, включая починку; двигается только изменение с меткой `blocker` | [053](../../../rules/ru/053-queue-order-is-a-rule-not-arrival.md) |
| красная `main`, очередь стоит | доступен ли путь разморозки тому, кто действует: метка `blocker`, `thaw.yml`, ручной `automerge.yml` с `pr=NNN` | [126](../../../rules/ru/126-a-freeze-needs-a-thaw-path.md) |
| упал гейт на изменении | первая строка отказа в журнале работы — до любого перезапуска. Перезапуск — диагностика, одна попытка, только в случаях таблицы [`AGENTS.md`](../../../AGENTS.md) § «Перезапуск — это диагностика» | [124](../../../rules/ru/124-rerun-the-minimum-and-record-the-flake.md) |
| изменение не сливается при зелёном | сколько заходов очереди отменено до начала работы; стоит ли в журнале автомержа «жду вердикта внешнего взгляда» | [199](../../../rules/ru/199-a-run-cancelled-while-queued-is-not-a-missing-event.md) |
| то же, и дело в одном изменении | не устарела ли запись изменения: `updated_at` против времени проверок; конфликт одного изменения — не авария очереди | [148](../../../rules/ru/148-a-change-record-is-a-cache.md), [004](../../../rules/ru/004-conflict-is-normal-not-outage.md) |
| слилось при красном | сколько записей обязательной проверки `catalogue` на голове, их исходы и время: пропущенная запись с тем же именем её удовлетворяет | [187](../../../rules/ru/187-a-neutral-check-run-satisfies-a-required-check.md) |
| прогон опоздал или не пришёл | расписание площадки — пожелание: сколько срабатываний было на деле, а не по `cron` | [169](../../../rules/ru/169-cron-is-a-hint-not-a-cadence.md) |
| в отказе участвует API площадки | остаток квоты первым шагом (`scripts/ghcli.py`): запрос остатка бесплатен | [017](../../../rules/ru/017-measure-quota-do-not-guess.md) |
| окно молчит | ждёт ли оно разрешения: снаружи это неотличимо от работы | [007](../../../rules/ru/007-blocked-window-looks-alive.md) |
**4. Проверить премису до плана.** «CI сломался», «событие не приходит»,
«площадка не отдаёт» — сначала воспроизвести. Исключение одно: проверка стоит
столько же, сколько починка ([044](../../../rules/ru/044-check-the-premise-before-fixing.md)).
Если разбор упёрся в расхождение двух источников об одной величине, «меряют
разное» проверяется последним — сначала двойной счёт и устаревший снимок
([178](../../../rules/ru/178-a-source-mismatch-is-your-reader-until-proven-otherwise.md)).
**5. Предварительная тяжесть — заявка, а не вердикт.** Ставит её автор разбора
по шкале ниже; итог ставит не он, а владелец
([086](../../../rules/ru/086-the-finder-does-not-grade-the-finding.md)). Тяжесть
получает только факт с площадки — гипотеза остаётся гипотезой.
| Уровень | Пример из этого репозитория | Чего уровень НЕ означает ([056](../../../rules/ru/056-a-signal-states-what-it-does-not-mean.md)) |
|---|---|---|
| **высокая** — стоит общая работа | 2 сентября: красная `main`, два изменения уехали на сломанном основании | не «виновато стоящее изменение» — причину 4 сентября искали именно там |
| **средняя** — красное есть, очередь идёт | сверка по расписанию краснела с 23 августа, ничего не блокируя | не «можно отложить»: четыре дня молчания и были инцидентом |
| **низкая** — зелёное со второго раза | 8 сентября, прогон `34249776017`: пустой отказ, перезапуск того же коммита зелёный | не «починено»: это находка, и она записывается ([124](../../../rules/ru/124-rerun-the-minimum-and-record-the-flake.md)) |
**6. Гипотезы — с проверкой и опровержением у каждой.** Если в отказе назван
источник, первая пара гипотез — «отказ наш» или «отказ чужой». Тот же приём,
что у [158](../../../rules/ru/158-the-third-outcome-names-its-subject.md):
31 августа «у них сломалось» оказалось облачным окном с узкой областью доступа.
Зелёное после починки диагноз **не** подтверждает — подтверждает замер на
живом предмете ([146](../../../rules/ru/146-a-green-gate-does-not-verify-its-premise.md)).
**7. Кто за что — из живых следов, а не из памяти.** Кто что взял и что стоит,
выводится из веток, изменений и прогонов
([049](../../../rules/ru/049-derive-state-from-live-artifacts.md)). «Это изменение
чинит красное» — решение человека, отдельной строкой: механизм его не выводит
([053](../../../rules/ru/053-queue-order-is-a-rule-not-arrival.md)).
## Что выдать
Восемь разделов, по порядку, в каждом колонки из шага 0:
1. **Оценка** — что красное, где, с какого времени; сколько прогонов спрошено.
2. **Тяжесть и обоснование** — уровень по шкале, пример-опора, чего он не означает.
3. **Немедленные действия** — только обратимые и только диагностика; мера — отдельный вопрос.
4. **Свидетельства** — что собрать и где: номер прогона, строка журнала, время.
5. **Гипотезы** — каждая с проверкой и опровержением.
6. **Кто за что** — по живым следам; решение «что чинит» — за человеком.
7. **Черновик статуса** — в задачу дежурного или в изменение, а не в файл: статусы живут в трекере ([091](../../../rules/ru/091-work-sources-are-ordered-first-non-empty-wins.md)). Срока в нём нет: правила, на котором он держался бы, в каталоге нет.
8. **Хронология** — время UTC с площадки, а не по памяти.
## Чего навык НЕ делает
- **Не краснеет.** Он ничего не отвергает и не останавливает слияние: это
суждение модели по описанию, а не машинная проверка. Машинную часть там, где
она построена, держат гейты — список в [`AGENTS.md`](../../../AGENTS.md)
§ «Гейты»; навык её не повторяет и не заменяет.
- **Не выбирает меру и не чинит.** Перезапуск, разморозка, откат — отдельный
вопрос со своими правилами. Разбор кончается, когда названо, что красное и
почему, а не когда стало зелёным.
- **Не ставит окончательную тяжесть** — только заявку
([086](../../../rules/ru/086-the-finder-does-not-grade-the-finding.md)).
- **Не пишет в общую ветку, не сливает и не ставит `blocker`.** Из облачного
окна операция с личностью человека уходит в конвейер
([131](../../../rules/ru/131-no-writes-from-a-cloud-session.md)), а решение «это
и есть починка» принимает человек.
- **Не покрывает инциденты эксплуатации.** Флагов, ограничения частоты, режима
деградации и масштабирования в каталоге нет, и навык их не изобретает.