E-02 · Этап 6: план ревизии#
Подготовлен: 2026-09-16 · дополнен: 2026-09-17 · на входе — 20 находок из 99-findings.md и отчёт о проверке правок E-01
Решения по Б1–Б6 приняты, правки исполнены 2026-09-17. Б1 — отвод сейчас;
D-04отвечает за саги, массовая раздача отводится явно; окончательное место для неё определит исследование. Б2 — обе, деградация первой:D-06деградация,D-07декомпозиция данных (материализация — один из режимов). Б3 — это тот же вопрос, что Б1: связанные применения — частный случай мастер-решения; форма ждёт исследования, пока записываются одним ADR. Б4 — придержано: третий режим в мастер-шаблон не поднят. Б5 — исследование типовых проблем и практик. Б6 — двустороннюю форму принять; встречные силы внедрены также вD-01,D-03иD-05. Находка 17 — различение модульности и гранулярности введено вD-02.Версии после правок:
D-01 v2.0·D-02 v4.0·D-03 v3.0·D-04 v3.0·D-05 v2.0· мастер-шаблон осталсяv4.0.Дополнение от 2026-09-17. Находки 17–20 принесены разбором глав 6 и 7 Форда и Ричардса — вне прогона. Они добавили одну правку в раздел A (находка 20), расширили развилку Б2 и потребовали шестой развилки Б6.
Прогон закончен по существу: пять этапов, четыре ADR, четыре документа решений испытаны на кейсе, противоположном первому по каждой оси, которую они используют. Осталось превратить находки в правки. План устроен так же, как план E-01: то, что исполняется без обсуждения, отдельно от того, где выбор не мой.
Главный итог прогона в одной строке. Ни одна правка E-01 не откатилась, и при этом все четыре документа решений набрали на MAJOR. Это не противоречие, а ровно то, ради чего второй кейс и брался: правки были верны, но сделаны по одному случаю и потому неполны.
A. Делаю сам — правки следуют из находок однозначно#
Тринадцать находок из двадцати не содержат развилки: они называют ошибку и способ её исправить.
| Находка | Правка | Документ |
|---|---|---|
| 2 | Уточнить, чьё соотношение чтений к записям. Вопрос 2 спрашивает про соотношение, не говоря чьё; системное и для конкретного хранилища могут быть перевёрнуты друг относительно друга. Спрашивать про это хранилище, а системное приводить отдельно и помечать как контекст | D-01, вопрос 2 |
| 3 | Объём может быть параметром, а не данностью. Если он зависит от нашего выбора (длина материализованной ленты, глубина истории, срок хранения), сначала назвать параметр и метрику, которая его задаёт, и лишь потом заполнять ось | D-01, вопрос 3 |
| 4 | Добавить вопрос о существующей декомпозиции и правило: текущий разрез сам проходит через дисквалификаторы наравне с кандидатами. Без этого нулевой вариант «оставить как есть» не формулируется | D-02, раздел 1 |
| 5 | Назвать порог связности изменений — около 80 % задач в одной границе, с оговоркой, что это ориентир для разговора, а не константа приёмки | D-02, раздел 3 |
| 6 | Разделить строку «по поддомену и ограниченному контексту» на две формы с разными условиями применимости: поддомен — пространство задачи, ограниченный контекст — пространство решения; совпадение это цель, а не данность | D-02, раздел 4 |
| 7 | Назвать Эванса прямо в критерии «по языку», а не только в источниках: граница контекста проходит там, где ломается единый язык. Без имени критерий читается как бытовая эвристика | D-02, раздел 4 |
| 9 | Заменить порог «дольше часа» на произведение длительности на частоту. Если экземпляры процесса есть в любой момент, перезапуск теряет процесс независимо от того, живёт он час или тридцать секунд | D-04, раздел 2 |
| 11 | Считать независимых потребителей события, а не шаги нашего процесса. Дисквалификатор «пять и более участников» при хореографии через общую шину не сработает никогда, а неотлаживаемость приходит именно оттуда | D-04, раздел 2 |
| 12 | Третий ответ у проверочного вопроса про инициатора: «инвариант закрывается на другом пути». Не «ответ нужен» и не «уведомим потом», а «этот процесс вообще не про этот инвариант» | D-04, раздел 1 |
| 13 | Снять противоречие между дисквалификатором «устарелость недопустима» и умолчанием. Сейчас они предписывают одно и то же теми же словами, а дисквалификатор при этом говорит «это уже не умолчание». Развести: умолчание допускает потерю инвалидации, здесь она недопустима, и разница — в обязательной сверке и в TTL как верхней границе ущерба, а не в стратегии | D-03, разделы 2 и 3 |
| 14 | Сказать, что отклонения складываются, а цены при этом — нет. Добавить абзац после таблицы: при наложении двух отклонений цену надо пересчитывать, а не суммировать по строкам; одно отклонение способно погасить цену другого | D-03, раздел 3 |
| 20 | Добавить дисквалификатор об архитектурном кванте: разные цели по доступности у частей, лежащих в одном кванте (общая база, общий выкат, синхронная связь на каждой операции), недостижимы — сколько бы ни стояло в требованиях. Проверять до сравнения кандидатов, вместе с прочими организационными | D-02, раздел 2 |
| 16 | Назвать вторую цену локального кэша: его отказ совпадает с перезапуском процесса, то есть с плановым выкатом. Прогрев перед приёмом трафика — обязательная работа, а не улучшение | D-03, раздел 3 |
Плюс хозяйственное: занести итоги обоих прогонов в 96-backlog.md таблицей «было / стало».
B. Решаешь ты — шесть развилок#
Б1. Что делать с D-04, когда процесс не сага (находки 8 и 10)#
Массовая раздача одного шага не классифицируется на входе документа и не получает смысла внутри него. Это самая крупная находка прогона, и способов её закрыть три.
| Вариант | За | Против |
|---|---|---|
| а. Явный отвод — строка в разделе 1: «один шаг, повторённый многократно, — вне пространства восьми ячеек» | Дёшево, честно, сохраняет закрытость множества — главное достоинство документа | Отвести мало: настоящие вопросы раздачи (чанк, курсор, приоритет) остаются без дома |
| б. Новый документ про производные данные | Даёт дом и раздаче, и материализации, и списку крупных подписок — три случая за один прогон | Крупная работа; пока не написан, отвод всё равно нужен |
в. Четвёртая ось в D-04 |
Всё остаётся в одном документе | Ломает то, ради чего документ третьего типа и заводился: множество перестаёт быть закрытым и полным по построению |
Моя рекомендация: а — сейчас, вместе с правками раздела A. И б — отдельным документом, см. Б2. Вариант в я бы не брал: закрытость множества здесь ценнее полноты охвата, а раздача от неё всё равно не выигрывает.
Б2. Два кандидата на D-06, и оба потребованы дважды#
| Кандидат | Кто потребовал | Сколько раз |
|---|---|---|
| Деградация и поведение при отказе | Дисквалификатор D-03 «система не переживает отказа кэша в пик» |
Дважды: E-01 (схема зала) и E-02 (досбор постов) |
| Материализация производных данных | Отсутствие документа под центральное решение кейса | Дважды в одном прогоне: сама лента и список крупных подписок |
Оба блокируют уже принятые решения, а не будущие: без деградации нельзя вводить кэши, которые уже описаны в двух ADR; без материализации два решения E-02 приняты вне метода.
| Вариант | Следствие |
|---|---|
| Деградация первой, материализация второй | Деградация меньше и подтверждена на двух непохожих кейсах. Материализация крупнее и, вероятно, заберёт часть вопросов у D-01, D-03 и D-04 — её лучше писать после их правок, а не до |
| Материализация первой | Закрывает больший пробел сразу, но родится до правок и по старому шаблону — ровно та ошибка, которой мы избежали в E-01 |
| Только деградация, материализацию отложить | Набор остаётся тоньше, но два случая из одного прогона говорят, что откладывать больше нечего |
Моя рекомендация: обе, деградация первой. И присвоить номера сразу — D-06 деградация, D-07 — чтобы не повторить коллизию, случившуюся в E-01.
Находка 19 расширила второго кандидата. «Материализация производных данных» — частный случай декомпозиции данных: вопроса «делятся ли сами данные и по каким критериям» не задаёт ни
D-01, ниD-02, а в E-02 он решался дважды внутри чужих документов. У Форда и Ричардса под это готовый костяк — шесть сил дезинтеграции и две интеграции. Отсюда подвопрос: назватьD-07«Декомпозиция данных» с материализацией как одним из режимов, или держать два документа на общем списке критериев. Моя рекомендация — один документ: разделять их сейчас значит повторить ошибкуD-02, который два прогона отвечал на два разных вопроса, не имея слов для разницы (находка 17).
Б3. Форма записи для связанных применений D-03 (находка 15)#
Правило «одно узкое место — одно применение» верное и работает. Но три куска одного пути чтения делят бюджет памяти и вытекают из одного числа, а форма записи (пять строк на применение) предполагает, что они независимы.
| Вариант | Следствие |
|---|---|
| а. Абзац в разделе 6: связанные применения записываются одним ADR — общий контекст, несколько коротких записей, общие последствия | Дёшево, ровно то, что пришлось сделать вручную на этапе 5 |
| б. Завести отдельное понятие «связка решений» в мастер-шаблоне | Общее правило вместо частного; но пока связка встретилась один раз |
| в. Ничего не менять | Каждый решит сам, и половина потеряет сумму |
Моя рекомендация: а. Вариант б — заманчиво, но обобщать по одному случаю мы уже пробовали, и E-02 показал, чем это кончается.
Б4. Поднимать ли две находки в мастер-шаблон#
Находка 10 вводит третий режим работы документа решения: помимо «даёт ответ» и «вне области применения» есть «применим и бесполезен» — координата определяется, и из неё ничего не следует. Находка 15 — про форму записи связанных применений. Обе не про D-03 и не про D-04, а про метод вообще.
| Вариант | За | Против |
|---|---|---|
Поднять в 00-template.md (v5.0) |
Общие правила, оставленные в частном документе, расходятся — это уже было с ADR-шаблоном, который жил внутри W11 и разошёлся с D-01 |
Третий режим виден пока на одном примере |
Оставить в D-03 и D-04 |
Честнее по числу наблюдений | Следующий документ третьего типа наступит на то же |
Моя рекомендация: поднять третий режим (находка 10) — он про природу решений, а не про раздачу. Форму записи (находка 15) оставить в D-03, как в Б3.
Б5. Что дальше после этапа 6#
| Вариант | Что проверит |
|---|---|
| Третья стадия — «система под изменением» | Пласт, которого нет вовсе. Оба прогона кончились миграцией — strangler fig и перенос графа подписок в E-02, сосуществование путей чтения в обоих, — и ни одного документа под это нет. Миграция уже дважды оказалась самым рискованным шагом принятого решения и ни разу не была решением сама |
| E-03 — третий кейс | Подтвердит правки E-02. Но все четыре документа сейчас идут в MAJOR: третий прогон по ним — это проверка почти новых документов, а не проверка сходимости |
| Остальные недостающие решения | Авторизация, ключ шардирования, контракт API. Ширина вместо глубины |
Моя рекомендация: третья стадия. И к ней отдельный вопрос, который стоит держать в виду: если E-03 снова даст MAJOR всем документам, это будет означать не «нашли ещё», а отсутствие сходимости — то есть что форма документа решения не стабилизируется на кейсах и её надо менять, а не дополнять.
Б6. Принимать ли двустороннюю форму для D-02 (находки 17 и 18)#
Форд и Ричардс строят решение как баланс двух наборов сил: силы дезинтеграции (за разделение) против сил интеграции (за объединение). Наша форма другая: вопросы → дисквалификаторы → оси → решение. Разница не косметическая — у нас нет места для силы, тянущей назад, и «общий код» поэтому отсутствует целиком.
| Вариант | За | Против |
|---|---|---|
а. Добавить раздел «силы интеграции» в D-02, сохранив остальную форму |
Дёшево, закрывает находку 18 точечно: общий код, отношения в данных, рабочий процесс как встречная сила | Форма становится гибридной: часть решения через оси, часть через силы |
б. Перестроить D-02 на двустороннюю форму целиком |
Для вопроса «делить или не делить» она честнее: это не выбор из N вариантов, а баланс | Крупная переделка, и у нас уже есть проверенная форма, которая на двух кейсах сработала |
| в. Оставить как есть, дописав недостающие оси | Минимум изменений | Ось «общий код» без встречной силы читается как «чем меньше общего кода, тем лучше» — это неверно |
Отдельно — находка 17: D-02 не различает модульность (где линия) и гранулярность (насколько мелко) и на двух прогонах ответил на два разных вопроса. Это не обязательно новый документ; возможно, достаточно словаря и вопроса «что мы сейчас решаем» в начале.
Моя рекомендация: а — раздел сил интеграции в D-02, плюс словарь модульности и гранулярности в шапку. Двусторонняя форма целиком — в новом документе про данные (Б2), где она уместнее всего: там вопрос ровно «делить или держать вместе». Так мы её и испытаем, не ломая работающее.
C. Что намеренно НЕ делаем#
ADR-0001…0004 не переписываются. Их поле «Метод» указывает на D-01 v1.1, D-02 v3.0, D-04 v2.0, D-03 v2.0, и это остаётся верным навсегда. В E-01 это было решением на будущее; теперь у него есть проверка — записи E-01, написанные по старым версиям, за весь прогон E-02 ни разу не ввели в заблуждение, а история версий отвечала на вопрос «что перепроверять» без обращения к автору.
Прогон не переделывается под новые версии. Если правки верны, повторный прогон даст те же решения.
D-03 и D-04 не сводятся в один документ, хотя раздача и кэш здесь переплелись теснее некуда: порог гибрида живёт в двух ADR сразу и определяет и нагрузку на запись, и стоимость чтения. Соблазн объединить есть, и он ошибочен — это ровно то размывание ответственности, против которого была принята позиция при разделении D-02 / D-05. Связь между решениями лечится полем в ADR, а не слиянием документов.
Находка 10 не чинится расширением пространства D-04 — см. Б1.
D. Порядок исполнения#
- Ответы по Б1–Б6.
- Правки раздела A, сгруппированные по документам:
D-01→D-02→D-03→D-04→00-template.md(если Б4 «поднять»). - Прогон
check.py; совместимость MAJOR-версий с мастер-шаблоном. - Итог обоих прогонов в
96-backlog.md: таблица «было / стало» по каждой находке, E-01 и E-02 вместе. - Новые документы из Б2 — отдельными шагами после правок.
Предварительная арифметика версий, если правки раздела A пройдут целиком:
| Документ | Было | Станет | Почему MAJOR |
|---|---|---|---|
00-template.md |
v4.0 | v5.0 | Третий режим работы документа решения — если Б4 «поднять» |
D-01 |
v1.1 | v2.0 | Соотношение чтений к записям может быть перевёрнуто для отдельного хранилища, а объём может быть выбираемым параметром. И то и другое меняло исход на этом прогоне |
D-02 |
v3.0 | v4.0 | Без вопроса о существующей декомпозиции нулевой вариант не формулируется; без порога связности доля не интерпретируется; дисквалификатор об архитектурном кванте отменяет разрезы, принятые при разных целях доступности внутри одного кванта |
D-03 |
v2.0 | v3.0 | Читатель, понявший дисквалификатор «устарелость недопустима» как запрет кэшировать, мог отказаться от кэша там, где умолчание подходит |
D-04 |
v2.0 | v3.0 | Порог «дольше часа» оставлял состояние в памяти там, где это недопустимо; отсутствие третьего ответа про инициатора строило синхронный участок, которого не должно быть |
Все четыре документа решений идут в MAJOR по итогам второго кейса. Стоит сказать это прямо в истории версий каждого: правки E-01 были верны — ни одна не откатилась, — но сделаны по одному случаю. Второй случай не опроверг их, а показал, чего в них не хватало. Это и есть ответ на вопрос, зачем нужен был второй прогон.