Skip to content
Back to skills

Incident Triage

ASecurity

Звать первым, когда в этом репозитории что-то покраснело или встало и ещё не ясно, что именно сломано: красная общая ветка main, упавший гейт или прогон по расписанию, изменение, которое не сливается при зелёных проверках, замёрзшая очередь автомержа, окно, которое молчит. До любой починки.

  • 5 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 25, 2026
ai-agentsapi

Works with

  • cli
  • api

Security analysis

A100/100

Scanned September 28, 2026

npx -y skills add ArtVsMark/Engineering-Incidents-Playbook --skill incident-triage --agent claude-code

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.

Security grade badge for Incident Triage
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/artvsmark-incident-triage/badge)](https://www.skillsdirectory.com/skills/artvsmark-incident-triage)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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)), а решение «это
  и есть починка» принимает человек.
- **Не покрывает инциденты эксплуатации.** Флагов, ограничения частоты, режима
  деградации и масштабирования в каталоге нет, и навык их не изобретает.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.