Releases: ArtVsMark/Engineering-Incidents-Playbook
Releases · ArtVsMark/Engineering-Incidents-Playbook
Release list
v1.2.0
Immutable
release. Only release title and notes can be modified.
1.2.0
Добавлено · Added
- Правило 164: номер версии говорит, чего он версия. Проект, публикующий несколько независимо версионируемых артефактов, обязан сделать так, чтобы каждый номер называл свой предмет — в имени поля или рядом с ним, в точке чтения. Инцидент двойной, и вторая половина резче первой. Сначала владелец спросил: «почему 1.2, если версия 1.1 — мы же не делали релиз 1.2». Вопрос законный: у каталога четыре независимо двигающихся номера, и три названы одним ключом
schema— выгрузка правил (1.2), ответ потребителя (1.1), сводка потребителей (1.0), — а четвёртый это тег выпуска. Затем нашёлся чужой файл. У подключённого проекта в.rules/bindings.jsonстоит"schema": "1.2"— номер формата выгрузки в поле формата ответа, где контракт требует 1.1. Файл валиден, его гейт зелёный, колонка сводки показывает то, что он написал у себя. Из трёх подключённых ответов с контрактом совпал один: третий отстал на 1.0. Нашло это окно соседнего проекта, читавшее наш контракт глазами. Что сделано на нашей стороне: -VERSIONING.mdполучил таблицу всех номеров: что версионирует, кто смотрит, когда двигается; - вexport/README.mdоговорка стоит в точке чтения — строкой рядом с числом, а не в отдельном документе: тому, кто копирует строку, отдельный документ не помогает; -check_prose.pyкраснеет на схеме, объявленной в файле и не названной в политике версий; -aggregate_bindings.py --checkназывает расхождение версий на каждом изменении. Раньше это считал только ночной прогон — собранное и никому не доставленное адресата не имеет (142). Чужое печатается без отказа (файл чужой), своё — отказ. Переименование самого ключа (export_schemaвместоschema) правило допускает как лучший ответ, но здесь не сделано: ключ читают четыре потребителя, и смена имени — это подъём версии контракта, то есть работа с их стороны (157). Формулировка приехала от подключённого проекта; инцидент, номер и вердикт — наши. check_workflows.pyнаучился ещё двум требованиям к файлам прогонов, и оба профилактические: нарушений у каталога сегодня нет, гейт сторожит их появление. 084 — прогон, не объявленный основной работой, не просыпается на изменении. Значок или ночная сверка, отказавшие наpull_request, задерживают слияние и роняют его, при том что их отсутствие — штатный исход, а не ошибка. Список тех, кому положено, разрешительный:ci.ymlиautomerge.yml. 152 — закрепление вызываемого требуется там и только там, где вызывающий тоже берётся с общей ветки: наpull_request_targetиworkflow_run. Наpull_requestтребовать его нельзя, и это не смягчение, а инцидент самого правила: файл прогона там приходит из изменения, правящий изменение переписывает шаг целиком, и закреплённый скрипт просто перестаёт вызываться. Инструмент для второго появился сегодня же — разбор блокаon:, написанный для ручной кнопки. До него причина «не дошли руки» была честной.scripts/check_workflows.pyдержит два требования к файлам конвейера, которые каталог объявлял выполненными и не проверял ничем: у каждого прогона есть ручная кнопка (126), у каждой работы — предел времени (100). Оба ответа разошлись с фактом. Кнопку вagent-pr.ymlпришлось ставить рукой, когда разрешимостьwhereпотребовала назвать несуществующий адрес механизма; а предела времени не было у работciиattribution-history— при том что ответ каталога утверждал обратное про каждую работу. Первая версия разбора была зелёной на живом корпусе и не держала ничего: работа закрывалась только началом следующей, а конец файла обозначался строкой с кириллическим именем, ключом не считавшейся, — то есть последняя работа в каждом файле не проверялась вовсе. Поймано это знанием факта заранее, а не механизмом; теперь такой случай стоит в наборе, и мутация разбора его роняет.- «Не применимо» перестало быть словом на веру: у ответа появилась проба, а у картинки — колонка. Проба опровергает утверждение о проекте одной командой без сети; асимметрия односторонняя — нашли опровержение отказ, не нашли молчание. Число непроверенных печатается: пробой покрыто 5 из 35, остальные названы. На картинке «не применимо» стоит отдельной колонкой: без неё «ничем» читалось двусмысленно — и как долг (механизма ещё нет), и как решение (механизм не нужен).
- Во «входящие» потребителя приезжает раздел «Возможно, про это ваши задачи»: правила, ещё не разобранные у него, рядом с его открытыми задачами, чьи заголовки говорят о том же. Правило 130 держалось ничем с ответом «не дошли руки». Предмет при этом был под рукой:
sync_inbox.pyработает в репозитории потребителя и уже спрашивает его трекер — он там ищет собственную задачу-«входящие». Доставить правило мало. Без предмета в своём проекте оно остаётся абстракцией, которую откладывают — «понятно, но не про нас». Список кандидатов превращает его в вопрос о конкретной задаче, а на такой вопрос отвечают. Связывают значимые слова: короче пяти знаков в счёт не идут — в русском это почти всегда служебное; общие слова каталога («правило», «механизм», «проект») исключены поимённо, потому что стоят и в правилах, и в задачах, и связывают всё со всем. Порог мягкий: два общих слова либо одно длиной от девяти. Показывается не больше двух задач на правило — список-отчёт не читают (016). Граница названа в самом разделе, а не только в скрипте: совпадение по словам — подсказка, а не вердикт. Ни принять правило, ни отклонить его этот список не может; он говорит «посмотрите сюда», и смотрит человек. Трекер не ответил — раздела просто нет: 130 говорит «приходит вместе с», а не «не приходит без», и ронять доставку правил из-за подсказки значило бы менять предмет на украшение (084). Семь случаев с обеих сторон, включая «одно частое слово не связывает» и «общие слова каталога в счёт не идут». Метрика: гейтом 83, конвейером 6, документом 24, НИЧЕМ 7. - Во «входящие» потребителя приезжает раздел «У соседей это уже решено»: правила, которые у него признаны действующими и не держатся ничем, а у соседнего проекта держатся — с адресом механизма. Знание для этого раздела существовало с самого появления сводки:
export/where.mdотвечает на вопрос «кто уже сталкивался и чем закрыл». Но лежало оно в ЧУЖОМ репозитории, файлом в двести строк, и приходили в него те, кто уже выбрал, чем держать правило. Собрано и никому не доставлено — та же поломка, что у красного без адресата (142). Первый прогон от лица витрины показал четырнадцать правил, закрытых у грейдера с адресами, — при том что у неё они стоят «ничем». Границы названы в самом разделе: чужой механизм не обязан подойти, стеки разные, и раздел отвечает не «сделай так», а «вот кто уже сталкивался». Сосед без разрешимого адреса в раздел не идёт: пересказ помогает не больше, чем молчание. Недоступность сводки делает раздел пустым, а не задачу неоткрытой (084), и отказ называет адрес источника (158). - Выгрузка публикует все номера контрактов разом и отметку времени:
export/rules.jsonполучил блокcontracts(шесть номеров форматов, читаются живыми из самих файлов) иgenerated_at; сводкаexport/where.json— тожеgenerated_at. Номера двинулись: выгрузка 1.2 → 1.3, сводка 1.0 → 1.1. Оба прибавления совместимы — читатель прежней версии новых ключей не видит, — но номер двигается всё равно: состав полей изменился. Единого номера нет намеренно: он вернул бы поломку 164, а по 157 подъём контракта означает перечитывание ответов на той стороне, и общий номер заставлял бы перечитывать форматы, которые не двигались. - Гейт витрины сверяет утверждение «предмета нет» с деревом (правило 175): ответ, начинающийся этими словами, обязан быть опровергаем одной командой без сети. Асимметрия односторонняя — предмет найден означает отказ, не найден означает молчание: в мелком клоне «не нашли» и «нет» неразличимы. Первая же проба оказалась грубой и покраснела на верном ответе: она опровергала «в PyPI не публикуется» наличием манифеста, тогда как утверждение было о ПУБЛИКАЦИИ. Проба уточнена до прогона публикации, а разбор записан в самом гейте.
- Гейт прогонов держит ещё одно требование: имена ключей
env:и присваиваний в шагах — латиницей (правило 167). Тихая половина ошибки иначе не ловится ничем: переменная окружения с не-ASCII именем создаётся, а$ИМЯне раскрывается вовсе — условие на ней всегда даёт одну ветку, и шаг зеленеет, не проверив ничего. Замер на живом дереве: таких имён нет ни одного, гейт заведён до того, как они появятся. Проза, имена шагов и сообщения не трогаются. - Ещё два правила очереди «ничем» закрыты механизмами. 147 «У переключателя, отменяющего операцию, должен быть адресат отмены» — прогоном
off-prefix.yml. Толчок в ветку мимо префиксаagent/поднимает прогон, единственная работа которого — сказать, что изменение по этой ветке не откроется, и назвать, чего именно не произойдёт: не запустится открывающий прогон, не проставится зона, не посчитаются пересечения. Предмет правила ровно этот: отмена происходила молча — «не совпало» и «совпало, но делать нечего» давали один наблюдаемый результат, тишину. Цена измерена: готовое правило пролежало сутки на ветке мимо префикса, и нашёл его случайный взгляд — прогона не было вовсе, а значит не было ни красного, ни лога, ни кода возврата. Прогон не отказывает: ветка мимо префикса это штатное состояние, и красное на ней приучало бы читать красное как фон (051). Он даёт отмене место, где её видно (142). 159 «Вердикт выносится после последнего случая» — гейтомcheck_verdict_order.py, разбором синтаксиса, а не поиском по тексту. В функции ищется накопитель, затем цикл, который в него добавляет, затемreturnвнутри этого цикла, читающий накопитель. Возврат третьего исхода находкой не является и обязан быть ранним: продолжать перебор, не прочитав источник, значит копить находки о состоянии, которого не знаешь (039). Замер, на котором различие и построено: вscripts/таких возвратов внутри накопительных циклов два, и оба именно третий исход — сборщика нет, сборщик отказа...
v1.1.0
What's Changed
- feat(gates): дежурный по общей ветке стал доступен потребителям by @ArtVsMark in #141
- Сторожа дубликатов смотрели не на тот признак — оба by @ArtVsMark in #138
- Сводка догнала ответ внешнего потребителя by @ArtVsMark in #137
- Автор коммита сверяется разрешительным списком, а не запретом на одно написание by @ArtVsMark in #132
- Все значки уехали на ветку badges, как в грейдере by @ArtVsMark in #140
- У HISTORY.md появился критерий, и первые три поворота записаны по нему by @ArtVsMark in #127
- У починки появился момент, в который спрашивают про правило by @ArtVsMark in #130
- Значки ушли из общей ветки окончательно by @ArtVsMark in #144
- Каталог ответил за каждое своё правило: очередь «не рассмотрено» пуста by @ArtVsMark in #143
- Первая гипотеза в candidates/ приехала с источником и замером by @ArtVsMark in #145
- Пустое множество проверок перестало считаться зеленью by @ArtVsMark in #146
- У растущей истории появился предел, выраженный числом by @ArtVsMark in #147
- Сторожа дубликатов смотрели не на тот признак — оба by @ArtVsMark in #142
- Вызов gh собран в один модуль: у потребителя механизм молча зеленел by @ArtVsMark in #149
- У «объявлен, но не подключился» появился срок и адресат by @ArtVsMark in #150
- Подключение и отключение собираются одной командой и описаны оба by @ArtVsMark in #151
- fix(export): у витрины появился адрес предложений в реестре by @ArtVsMark in #155
- Каркас записи собирается механизмом — содержание нет, и это граница by @ArtVsMark in #153
- Реестр догнал потребителя, который подключился сам by @ArtVsMark in #157
- feat(export): обратная сторона следа стала доступна потребителям by @ArtVsMark in #154
- Правка реестра доехала до общей ветки без самой правки by @ArtVsMark in #158
- Сводка говорит, ЧЕМ держится правило, а не только действует ли оно by @ArtVsMark in #160
- Сводка стала отчётом: следы, ответы, лишние, механизмы by @ArtVsMark in #162
- Три правила из разбора красной матрицы доехали до каталога by @ArtVsMark in #163
- У вопроса «сколько разобрано» появился механизм и адресат by @ArtVsMark in #164
- Дефект соседа перестал держать общую ветку красной by @ArtVsMark in #168
- fix(export): задача-«входящие» открыта, когда в ней есть работа by @ArtVsMark in #172
- Два предложения витрины приняты записями 152 и 153 by @ArtVsMark in #171
- Хранилище убрано из реестра потребителей by @ArtVsMark in #173
- Журнал догнал свои выпуски: 1.0.0 записан, 1.1.0 собран by @ArtVsMark in #174
- Три счётных значка отвечали сопровождающему, а не посетителю by @ArtVsMark in #175
- Витрина показывает картинкой, чем держится правило у потребителей by @ArtVsMark in #176
- Картинка перерисована в стиле витрины, а не своим by @ArtVsMark in #177
- Сборка журнала вливалась в раздел, а не поверх него by @ArtVsMark in #178
- Картинка стала таблицей: колонки сравниваются, полосы не сравнивались by @ArtVsMark in #179
- Журнал забрал последние два фрагмента: тело выпуска полно by @ArtVsMark in #180
- Английская витрина получила свою картинку, подпись плашек — центр by @ArtVsMark in #181
- Механизм различает конвейер, документ и ничто — «шаг процесса» их путал by @ArtVsMark in #183
- Свежие данные потребителя пересобираются сами, а не красят общую ветку by @ArtVsMark in #184
- У поля where появилось то же требование, что у «Следа»: адрес, а не рассказ by @ArtVsMark in #185
- Гипотезы поехали потребителям: растут не только правила by @ArtVsMark in #188
- Журнал собран под выпуск 1.1.0: шесть фрагментов легли в раздел by @ArtVsMark in #189
Full Changelog: v1.0.0...v1.1.0
v1.0.0
What's Changed
- Значок с числом правил и метрика одиночных областей by @ArtVsMark in #6
- Правило 126 о ловушке заморозки; 068 дополнено вторым инцидентом by @ArtVsMark in #9
- Правило 127: число в тексте живёт только с маркером, сборкой и гейтом by @ArtVsMark in #11
- Правило 128: обязательное поле проверяется на полноту, а не на непустоту by @ArtVsMark in #13
- История: релиз v0.1.0 по образцу грейдера by @ArtVsMark in #17
- Правила 129 и 130: контракт потребления и кандидаты из бэклога by @ArtVsMark in #18
- Экспорт каталога и контракт потребления — первый этап механизма by @ArtVsMark in #19
- Гейт атрибуции: трейлеры сверяются со списком согласованных имён до слияния by @ArtVsMark in #20
- Журнал изменений из фрагментов — вторая половина конвейера авторства by @ArtVsMark in #22
- Метки репозитория: свой набор по зонам каталога by @ArtVsMark in #23
- Каталог отвечает за каждое своё правило by @ArtVsMark in #25
- Свод проекта с картой направлений by @ArtVsMark in #26
- Сборщик указателя различает три исхода, а не два by @ArtVsMark in #27
- Число правил в прозе витрин маркером, а не только значком by @ArtVsMark in #28
- START под стартовый набор и точка входа для участника by @ArtVsMark in #30
- Правила 131–133: запись из облачного окна, одна тема, пересечение файлов by @ArtVsMark in #31
- Ревизор стал гейтом, а не строкой в карте направлений by @ArtVsMark in #32
- Правило 134: окно открывается с контекстом проекта, а не со знанием прошлого окна by @ArtVsMark in #33
- Свод хранит договорённости об окне, а не стартовое сообщение by @ArtVsMark in #37
- Автомерж с атрибуцией, гейт на первопредках main и правило 135 by @ArtVsMark in #38
- Атрибуция доезжает до первопредков: автомерж составляет тело слияния, гейт это проверяет by @ArtVsMark in #46
- Свод называет проверку первопредков и её место в конвейере by @ArtVsMark in #47
- Репозиторием в следе считается только потребитель из реестра by @ArtVsMark in #48
- Правила 136 и 137: перебор перед вердиктом, сырое значение перед сторожем by @ArtVsMark in #49
- Вторые инциденты к 049 и 068 — у каждого своя недостающая граница by @ArtVsMark in #50
- Путь каталог → проект: действие «входящие» и сводка «где действует» by @ArtVsMark in #51
- Витрина подключена к сводке, сеть убрана из обязательного гейта by @ArtVsMark in #52
- Правило 138: эстафета собирается по ходу, а не в конце by @ArtVsMark in #53
- Находки аудита: форма записи стала гейтом, карта направлений сверена с фактом by @ArtVsMark in #55
- Метки применяются из labels.yml конвейером, а не остаются решением на бумаге by @ArtVsMark in #56
- Гейт атрибуции отвязан от своего репозитория и отдаётся потребителям by @ArtVsMark in #58
- Правила 139 и 140: прогон подтверждает механизм, отказ проверяет гейт by @ArtVsMark in #59
- Правило 142: у красного по расписанию должен быть адресат by @claude[bot] in #78
- Гейт содержательной полноты записи: под заголовком должно быть то, ради чего он стоит by @claude[bot] in #71
- Байт-код Python убран из репозитория, .gitignore заведён by @claude[bot] in #73
- Правило 141: маркер сверяется целиком, а не началом by @claude[bot] in #75
- Правило 143: подпись агента принадлежит трейлеру, а не полю автора by @claude[bot] in #81
- Обе красноты на main гасятся: долг атрибуции объявлен, consumers-sync получил повод перезапуститься by @claude[bot] in #84
- Починен разбор первопредков: регрессия из #81 покрасила общую ветку by @claude[bot] in #85
- Карта направлений сверена с фактом: два непокрытых вопроса названы by @claude[bot] in #86
- Изменение открывает конвейер токеном владельца: исполнение 131 (#79) by @ArtVsMark in #90
- Три направления получили механизм: свод, заготовка и общая ветка (#86, #87, #68) by @ArtVsMark in #93
- Правило 143 удалено как дубль: на тот же вопрос отвечали 131 и 135 (#91) by @ArtVsMark in #94
- Дежурный по общей ветке получил право читать вкладку прогонов (#95) by @ArtVsMark in #97
- docs(rules): 144 — окно контекста для разбора прозы это абзац, а не предложение by @ArtVsMark in #99
- Расстановка меток доходит до конца: три объявленных исхода снова доступны (#98) by @ArtVsMark in #100
- У нового правила спрашивают о соседях, прежде чем оно написано (#91) by @ArtVsMark in #101
- Сводка «где действует» догнала ответ потребителя по 144 (#102) by @ArtVsMark in #103
- Действие атрибуции дотягивается до ключей самого гейта (#80) by @ArtVsMark in #107
- Ревизор видит утверждение об отсутствии документа, который есть (#67) by @ArtVsMark in #108
- Исходник превью лежит рядом с картинкой (#57) by @ArtVsMark in #109
- Правило 145: объявленный исход прогоняется, иначе его может не быть (#83) by @ArtVsMark in #110
- Действие «входящие» доходит до разбора кода возврата (#82) by @ArtVsMark in #111
- Вопрос о соседях задаётся до записи, а не после (#91) by @ArtVsMark in #112
- Политика версионирования и два значка, схема взята у грейдера (#76) by @ArtVsMark in #114
- Правило 146: зелёный гейт подтверждает себя, а не своё основание (#88) by @ArtVsMark in #116
- Правило 147: у отменяющего переключателя должен быть адресат отмены (#96) by @ArtVsMark in #117
- Правила из проектов доезжают сюда механизмом: зубы для 080 (#91) by @ArtVsMark in #113
- feat(gates): скрипты каталога проверяются тестами, покрытие держит значок by @ArtVsMark in #119
- Тесты для двух последних гейтов, метрика научилась видеть оба механизма by @ArtVsMark in #121
- Изменение снова закрывает свою задачу: вторая половина 064 получила механизм by @ArtVsMark in #123
- 140 получило вторую половину: набор из одних отказов проверяет гейт наполовину by @ArtVsMark in #124
- Сводка сверяется с ответом на диске, а не только сама с собой by @ArtVsMark in #126
- Две метки объявлены с причиной, пять остаются решением человека by @ArtVsMark in #129
- Витрина отвечает на объявленный набор, а пробел в нём назван by @ArtVsMark in #131
- Кандидаты в правила получили папку и забор вокруг неё by @ArtVsMark in #125
- Правило 148: запись изменения — кэш, а не состояние (#74) by @ArtVsMark in #118
- Правило 148: запись изменения — кэш, а не состояние (#74) by @ArtVsMark in #136
- Кандидаты в правила получили папку и забор вокруг неё by @ArtVsMark in #135
- Переносимость записи стала объявленным поле...
v0.1.0 — 125 правил, двуязычный каталог
Первый выпуск каталога как переносимого актива, а не рабочего журнала.
Что внутри
- 125 правил на двух языках,
rules/ru/иrules/en/, с одинаковыми именами файлов - у каждого: правило → инцидент → почему → применимость → след
- 51 предметная область, вход в каталог по областям, а не только по номеру
START.md— порядок первого дня, отсортированный по цене ошибкиTOP-10.md— десять правил, которые переносятся дальше своего стекаtemplates/— десять исполняемых заготовок со ссылками на правила, из которых выросла каждая строка
Механизмы
Указатель собирается скриптом и падает, если правило есть только на одном языке,
если у него нет области, если область вне словаря или если деревья разошлись.
Все локальные ссылки и якоря под отдельным гейтом. Оба стоят в CI.
Лицензия CC BY 4.0.
What's Changed
- Область правила — в самом правиле; вход по областям, карта ролей, точки входа by @ArtVsMark in #4
- Вход по областям — таблица с описанием, что в области лежит by @ArtVsMark in #5
New Contributors
- @ArtVsMark made their first contribution in #4
Full Changelog: https://github.com/ArtVsMark/claude-code-playbook/commits/0.1.0