D-02 · Границы сервисов в работающей системе#
- Версия: 5.1 · 2026-09-18 · по мастер-шаблону v6.0
- Известно также как: декомпозиция, разрезание на сервисы, service boundaries, bounded context, разбиение монолита
- Этап: W4 · Верхнеуровневая архитектура · граница данных проверяется на W3, транзакционная — на W6
- Стадия: работающая — раздел 1 построен на истории изменений; на гринфилде измерять нечего — D-05
- Профиль: дорого изменить · высокое влияние → полная форма
- Не решает: как сервисы разговаривают после разреза — это D-04; путь чтения под нагрузкой — D-03; делятся ли сами данные — D-07; что обещано потребителям контракта, который создаёт разрез, — D-11
- Не путать с: D-05 · Границы на старте — там границы закладывают предсказанием, здесь режут по измерению
- Карточки: ARCH-01 монолит и микросервисы · ARCH-02 границы и ограниченный контекст · ARCH-03 внутренняя архитектура сервиса · ARCH-13 strangler fig · DIST-08 распределённые транзакции · SEC-13 классификация данных · OPS-17 когнитивная нагрузка
Требуется история. Документ измеряет связность изменений по репозиторию и трекеру. Если системы ещё нет, измерять нечего, и это не «часть вопросов останется пустой» — это другой вопрос: не «где резать», а «какие границы заложить». Такое решение живёт в D-05.
Чем это решение отличается от выбора продукта. Варианты не берутся с рынка — их надо построить. Поэтому раздел 1 делает две вещи: собирает факты и порождает кандидатов. Рыночного слоя здесь нет; его место занимают типовые формы разреза — они не устаревают, и даты съёмки у раздела 4 нет.
Решение двустороннее. Силы разделения (разделы 2–4) взвешиваются против сил интеграции — того, что тянет части обратно друг к другу (Ford, Richards, гл. 7). Одна половина без другой даёт разрез, который выглядит обоснованным и не работает.
1. Что выяснить#
Сначала — что именно решаем#
Модульность и гранулярность — разные вопросы, и документ отвечает на оба. Их легко перепутать, потому что оба про «где сервисы»:
| Вопрос | Пример ответа | |
|---|---|---|
| Модульность | Где проходит линия между уже существующими частями | Перенести профили из web в шлюз, граф подписок — к ленте |
| Гранулярность | Насколько мелко резать: сколько частей и надо ли резать вообще | Оставить модульный монолит; выделить третий сервис |
Ответ «резать не надо» относится к гранулярности; ответ «резать здесь, а не там» — к модульности. На прогоне E-01 решалась гранулярность, на E-02 — модульность, и документ обслужил оба случая, не называя разницы. Назвать её нужно ради одного: дисквалификаторы и формы разреза у них разные. «Нет наблюдаемости» и «сервисов больше, чем команд» отсекают гранулярность — саму идею дробить. «Разрез по техническим слоям» и «больше одного пишущего» отсекают конкретную линию, то есть модульность.
Первым делом записать, какой из двух вопросов открыт. Если открыты оба — сначала гранулярность: линию проводят внутри уже принятого числа частей.
Факты — из истории, а не из головы#
Главная особенность этого решения: почти всё, что нужно, уже записано в репозитории, трекере и списке инвариантов. Оценка «мне кажется, каталог и биллинг меняются независимо» проверяется за час и оказывается неверной чаще, чем хотелось бы.
| Вопрос | Где смотреть | Заполняет ось |
|---|---|---|
| Какая декомпозиция есть сейчас: какие части, что внутри каждой, кто владеет? | Репозиторий, схема развёртывания, зоны ответственности | Нулевой вариант — «оставить как есть» |
| Сколько изменений за последние 3–6 месяцев затронуло больше одного модуля? | История коммитов и задач | Связность изменений |
| Какие операции обязаны выполняться атомарно и какие инварианты нельзя нарушать? | Требования из W0 | Транзакционные разрывы |
| У каких таблиц и сущностей сегодня больше одного пишущего? | Схема данных и код | Владение данными |
| Где одно и то же слово означает разное? | Глоссарий, разногласия на встречах | Языковая чистота |
| Сколько команд, кто за что отвечает, как они договариваются? | Состав команд и зоны ответственности | Организационное соответствие |
| У каких частей профиль нагрузки или требования к доступности различаются на порядок? | Замеры и SLO | Технические причины разделения |
| Что по плану будет переписываться в ближайший год? | Роадмап | Стоимость перехода, обратимость |
| Есть ли данные, требующие особого режима защиты, и как они лежат относительно рассматриваемых линий? | Требования W0, закон, договор, внутренняя политика | Дисквалификатор и форма разреза |
Текущий разрез — такой же кандидат, как остальные, и проходит дисквалификаторы наравне с ними. Он существует, значит выглядит нормальным; но чаще всего он сложился исторически, а не по решению, и первым же дисквалификатором оказывается «разрез по техническим слоям». На прогоне E-02 именно так и вышло: существующая граница web / posts шла по слоям, и 32 % сквозных задач были её симптомом. Без этого вопроса нулевой вариант не формулируется, а без нулевого варианта матрица сравнивает кандидатов не с реальностью, а друг с другом.
Четыре вопроса о силах интеграции#
Вопросы выше собирают доводы за разделение. Эти четыре собирают доводы против — то, что тянет части обратно друг к другу. Они заполняют не оси, а встречный список раздела 2.
| Вопрос | Где смотреть | Какая сила |
|---|---|---|
| Какой код используют обе стороны линии и что с ним станет — дублирование, библиотека, свой сервис? | Общие модули, зависимости | Общий код |
| Какие внешние ключи, триггеры и представления пересекают линию? | Схема данных | Отношения в данных |
| Сколько процессов после разреза обязаны разговаривать через линию и с какой частотой? | Основные сценарии, замеры | Рабочий процесс |
| Нужна ли ACID-транзакция поперёк линии? | Инварианты из W0 | Транзакции |
Последняя сила у нас уже работает дисквалификатором — «разрез разрывает атомарную операцию в основном сценарии». Здесь она названа для полноты: сила, доведённая до предела, перестаёт быть доводом и становится запретом. Остальные три предела не имеют и взвешиваются.
Вопросов стало одиннадцать при верхней границе в семь, и это сигнал. Возможно, документ пора делить по линии модульность / гранулярность. Пока не делим: разделяющий признак виден на двух случаях, и оба наши — ровно то основание, которого мы сочли недостаточным в прошлый раз. Записано в 96-backlog.md.
Вопросы, порождающие кандидатов#
Варианты в матрице — это конкретные разрезы нашей системы, и их надо построить. Каждый строится применением одного принципа к уже собранным фактам:
- Если резать по языку (ответ на четвёртый вопрос) — сколько получится частей и какие?
- Если резать по тому, что меняется вместе (первый вопрос) — какие?
- Если резать по командам (пятый) — какие?
Обычно получается два-три кандидата, и они частично совпадают. Совпадение — не совпадение: линия, на которой сошлись разные принципы, почти наверняка настоящая граница. Разошедшиеся линии и есть предмет решения.
2. Оси и дисквалификаторы#
Оси сравнения. Связность изменений · транзакционные разрывы · владение данными · языковая чистота · организационное соответствие · глубина синхронной цепочки · стоимость перехода · обратимость. Что писать в каждую — в таблице раздела 3.
Дисквалификаторы — проверяются до сравнения:
- разрез разрывает операцию, обязанную быть атомарной, в основном сценарии — сага в главном пути, а не в исключении (DIST-08);
- после разреза у сущности больше одного пишущего или остаётся общая таблица — это не граница, а её видимость;
- разрез идёт по техническим слоям («сервис API», «сервис базы») — даёт связность на каждое изменение;
- у получившегося сервиса нет владельца — некому дежурить, решать и отвечать за контракт;
- нет наблюдаемости, автоматического выката и трассировки — для микросервисов это входное требование, а не следствие (OPS-07);
- сервисов получается больше, чем команд, способных их содержать, и это не осознанное решение;
- разрез рассекает класс защищаемых данных, и они оказываются у нескольких владельцев: каждый попадает в периметр аудита и обязан держать режим целиком — шифрование, аудит доступа, локализацию, ограниченный круг лиц. Стоимость режима умножается на число мест, и почти никогда это не окупается. Линию двигают, а не оплачивают (DATA-19, D-07);
- части с разными целями по доступности или по темпу выката остаются в одном архитектурном кванте — общая база, общий выкат, синхронная связь на каждой операции. Квант имеет одну доступность, какие бы числа ни стояли в требованиях: 99,95 % на одной части и 99,9 % на другой внутри общего кванта — это 99,9 % на обеих. Либо квант делится вместе с сервисами, либо цели выравниваются по худшей, и это записывается как решение, а не остаётся расхождением между документами (Ford, Richards, гл. 7).
Первые три отсекают разрез, последние три отсекают саму идею разрезать сейчас — и это нормальный исход. Дисквалификатор о кванте отсекает не разрез и не идею, а требование: недостижимая цель по доступности снимается или оплачивается делением кванта.
Силы интеграции — встречная половина#
Ответы на четыре вопроса раздела 1 сводятся сюда. Сила интеграции — не балл и не ось: это счёт, который разрез выставляет. У каждой силы ровно два исхода, и третьего нет.
| Сила | Чем измеряется | Оплатить можно так | Когда отменяет линию |
|---|---|---|---|
| Общий код | Сколько модулей используют обе стороны и как часто они меняются | Дублировать (и принять расхождение) · вынести в библиотеку (и принять версионирование) · вынести в сервис (и принять ещё одну границу) | Общий код — сама предметная логика: дублирование даст два расходящихся правила, библиотека — синхронный выкат обеих сторон |
| Отношения в данных | Внешние ключи, триггеры и представления, пересекающие линию | Денормализация (и сверка) · синхронизация событием (и отставание) · оставить данные с одной стороны | Целостность обеспечивается связью на уровне БД и требуется инвариантом: после разреза её не обеспечивает никто |
| Рабочий процесс | Сколько процессов пересекают линию и с какой частотой | Уменьшить частоту (кэш, материализация, батч) · изменить процесс так, чтобы он не пересекал линию | Пересечение происходит на каждой операции основного сценария и снять частоту нечем |
| Транзакции | Нужна ли ACID поперёк линии | — | Всегда: это дисквалификатор выше, а не сила |
Правило чтения. Каждая сила либо оплачена названной ценой, либо отменяет линию. Ответ «мы это учтём» — не оплата: цена должна быть записана в ADR и попасть в последствия. Сила, про которую нечего написать в колонку «оплатить можно так», уже отменила линию — просто этого ещё никто не сказал вслух.
Зачем встречный список, если есть оси и дисквалификаторы. Оси сравнивают кандидатов между собой, дисквалификаторы запрещают. Ни то, ни другое не удерживает довод «эти части лучше не разделять вовсе» — он проваливается между ними, и разрез получается обоснованным по всем осям и всё равно плохим. Прогон E-02 прошёл без этого списка, и общий код в нём не обсуждался ни разу — не потому, что его не было, а потому, что спросить было нечем.
3. Матрица оценки#
Колонки — кандидаты, построенные в разделе 1. В ячейках факты с пометкой источника, не баллы.
Словарь пометок здесь свой. Вендорской документации в этом решении нет, поэтому [док] не встречается: [история N мес] — из репозитория или трекера за указанный период, [схема] — из схемы данных и кода, [требования] — из инвариантов W0, [орг] — из состава команд, зон ответственности и принятой терминологии, [нет данных]. Правило общее для всех решений: ячейка без пометки считается непроверенной.
Пример условный. Числа выдуманы, форма — настоящая.
| Ось | Что записывать в ячейку | Модульный монолит (сейчас) | Разрез A — по языку | Разрез B — по командам |
|---|---|---|---|---|
| Связность изменений | Доля задач за период, уместившихся в одну границу — процентом, не ощущением | 100 % по определению — границы внутри процесса | 82 % из 140 задач [история 6 мес] |
61 % — каталог и биллинг меняются вместе [история 6 мес] |
| Транзакционные разрывы | Список операций основного сценария, пересекающих границу, и какая согласованность обязательна в каждой — не количество | Нет | Одна: списание остатка при оформлении, требуется атомарность [требования] |
Три, включая оплату; двум достаточно итоговой [требования] |
| Владение данными | Сколько сущностей после разреза имеют больше одного пишущего | 0 — один процесс | 0 [схема] |
2 — заказ пишут каталог и биллинг [схема] |
| Языковая чистота | Сколько терминов остаётся с двойным значением внутри одной границы | 4 — «заказ» значит разное в трёх модулях [орг] |
0 — разрез строился по языку [орг] |
3 [орг] |
| Организационное соответствие | Сколько команд владеет больше чем одной границей и наоборот | Неприменимо — одна кодовая база | Одна команда владеет двумя контекстами [орг] |
Полное — разрез строился по командам [орг] |
| Глубина синхронной цепочки | Сколько сетевых вызовов в основном пользовательском сценарии | 0 | 2 [схема] |
4 — оформление проходит через все [схема] |
| Стоимость перехода | Сколько шагов миграции от сегодняшнего состояния и что ломается в каждом | 0 — уже здесь | 3 шага strangler fig, разделение таблицы заказов [схема] |
2 шага, но общая база на переходный период [схема] |
| Обратимость | Что стоит переделать, если граница окажется ложной | Перенос модуля — дни | Перенос между сервисами — недели плюс миграция данных | То же |
Нулевой вариант — обязательная колонка. Когда кандидатов строят, а не берут готовыми, их легко построить все «интересными» и не заметить, что ничего делать не надо. Модульный монолит здесь не поддавки: он выигрывает по четырём осям из восьми и проигрывает по тем, которые начинают что-то значить только при определённом организационном масштабе. В решениях с рынком ту же роль играет колонка «оставить как есть».
Связность изменений считается первой. Это единственная ось, которую нельзя оценить на глаз и можно посчитать за час. Пока она не посчитана, остальная матрица — разговор о вкусах.
Порог — около 80 % задач в одной границе. Ниже — линия проведена не там: каждая третья задача тянет согласование двух команд, двух выкатов и двух контрактов. Выше 90 % — обычно признак того, что границ мало или период измерения слишком короткий. Это ориентир для разговора, а не критерий приёмки: он зависит от длины периода, от того, что считать задачей, и от доли инфраструктурной работы. Называть его всё равно нужно — без него доля «68 %» не интерпретируется, и на прогоне E-02 порог пришлось брать из условий пересмотра чужого ADR, то есть из примера, а не из метода.
Разрыв считается ценой, а не количеством. Разрез определяет, какие рабочие процессы станут распределёнными, — но не то, как они будут выполняться. Это выбирается потом и отдельно для каждого процесса, по трём независимым осям (Ford, Richards, «Software Architecture: The Hard Parts», гл. 12):
| Ось | Значения |
|---|---|
| Взаимодействие | синхронное · асинхронное |
| Согласованность | атомарная · итоговая |
| Координация | оркестровка · хореография |
Восемь сочетаний стоят очень по-разному, и разброс между ними больше, чем разница между «один разрыв» и «три». Разрез с единственным разрывом, который обязан быть атомарным при асинхронном взаимодействии и хореографии, хуже разреза с тремя разрывами, где всюду достаточно итоговой согласованности с оркестратором. Поэтому в ячейку пишется список с требуемой согласованностью, а не число.
Почему эти три оси не стали осями матрицы. Они описывают динамическую связанность — как сервисы общаются во время работы. Разрез — это статическая связанность: кто от кого зависит и кто чем владеет. Сравнивать кандидатов по «синхронно или асинхронно» нельзя: это не свойство разреза, а решение, принимаемое после него. Связь односторонняя — разрез задаёт, для каких процессов этот выбор вообще придётся делать, и в этом качестве три силы уточняют одну ось, а не добавляют три. Сам выбор — отдельное решение: D-04 · Связь сервисов в рабочем процессе, по одному применению на процесс.
4. Типовые формы разреза#
Рынка здесь нет: границу не покупают. Место рыночного слоя занимают формы разреза — способы провести линию, каждый со своим условием применимости. Они не устаревают, поэтому даты съёмки у раздела нет; вместо неё — источники.
| Форма | По какому признаку режет | Когда даёт верную границу | Чем оборачивается при ошибке | Статус у нас |
|---|---|---|---|---|
| По поддомену — пространство задачи | По тому, чем занимается бизнес: области деятельности, которые существовали бы и без нашей системы | Области деятельности различимы и устойчивы | Разрез по вывеске: поддомены названы, а модель внутри осталась общей | заполняется в проекте |
| По ограниченному контексту — пространство решения | По языку: где термин меняет значение. Граница контекста проходит там, где ломается единый язык (Эванс) | Предметная область развитая, язык устоявшийся | Контексты, не совпадающие с реальной работой | |
| По бизнес-способности | По тому, что организация умеет делать | Способности стабильнее, чем структура команд | Разрез повторяет оргсхему прошлого года | |
| По транзакционной границе | По тому, что обязано меняться атомарно | Есть жёсткие инварианты: деньги, остатки, лимиты | Границ мало, сервисы крупные — но это редко проблема | |
| По скорости изменений | По тому, что меняется часто и что почти никогда | Часть системы переписывается регулярно | Граница устаревает вместе с роадмапом | |
| По владению данными | Один пишущий на сущность | Данные уже структурированы, владельцы очевидны | Россыпь мелких сервисов вокруг таблиц | |
| По команде — закон Конвея, применённый сознательно | По зонам ответственности людей | Команды стабильны и автономны | Перестройка команд ломает архитектуру | |
| По профилю нагрузки или требованиям | По тому, что надо масштабировать или изолировать отдельно | Разница измерена, составляет порядок и у выделяемой части есть свои данные | Вместо границы получается кэш, названный сервисом | |
| По классу защищаемых данных | По тому, что требует особого режима: персональные данные, платёжные, врачебная тайна | Класс очерчен и его можно сузить до одной границы | Режим приходится держать везде, куда класс просочился | |
| По техническим слоям — анти-форма | По слоям: API, логика, доступ к данным | Никогда для границ между сервисами | Связность на каждое изменение: любая задача трогает все |
Поддомен и ограниченный контекст — не одно и то же, и раньше в этой таблице они стояли одной строкой. Поддомен лежит в пространстве задачи: это то, чем занимается бизнес, и оно существовало бы, даже если бы нашей системы не было. Ограниченный контекст лежит в пространстве решения: это модель, которую проводим мы, и граница, за которой её термины перестают действовать. Совпадение одного с другим — цель, а не данность: устаревшая модель спокойно обслуживает два поддомена одним контекстом, и на прогоне E-02 было именно так — сервис web держал ленту, профили и подписки, то есть три области деятельности в одной модели. Разрез «по поддомену» в такой ситуации назовёт правильные части и не тронет модель; разрез «по контексту» тронет модель и может разойтись с тем, как устроен бизнес. Проверять стоит обоими.
Критерий «по языку» — это метод, а не наблюдение. Единый язык (Эванс) — свойство внутренности контекста: внутри одно слово значит одно, и как только для одних и тех же данных нужны два разных значения, граница уже проходит здесь, просто её ещё не провели. Без этого имени критерий читается как бытовая эвристика «слова разные — режем тут», и тогда по нему режут синонимы вместо контекстов.
Колонка «статус у нас» заполняется теми же тремя значениями, что и рыночный слой: используем · не используем, потому что… · не рассматривали. Здесь она фиксирует принятый в команде принцип разреза, и второе значение так же ценно: «по командам не режем, потому что состав меняется каждые полгода» — это решение, к которому иначе возвращаются на каждом обсуждении.
Осторожно с разрезом по профилю нагрузки. Разница в нагрузке — самый обманчивый признак: она заметна, измерима и почти никогда не является границей. Проверка в одну строку: есть ли у выделяемой части собственный язык, собственные инварианты и собственный владелец данных? Если нет — это проекция чужих данных для ускорения чтения, и решается она кэшем или репликой (D-03), а не границей сервиса. На прогоне E-01 двадцатисемикратная разница чтений и записей выглядела основанием для разреза ровно до этой проверки.
Формы не исключают друг друга: на практике берут одну ведущую и проверяют результат остальными. Проверка транзакционной границей обязательна при любой ведущей форме — она единственная даёт дисквалификатор, а не соображение.
- Источники раздела: Eric Evans — Domain-Driven Design · Martin Fowler — BoundedContext · microservices.io — Decompose by subdomain · microservices.io — Decompose by business capability · Melvin Conway — How Do Committees Invent? (Datamation, апрель 1968) · Sam Newman — Building Microservices · Neal Ford, Mark Richards — Software Architecture: The Hard Parts (статическая и динамическая связанность)
5. Эвристики#
Ничья по осям. Выбрать разрез, при котором ошибка дешевле. Почти всегда это меньшее число границ: неверную границу внутри процесса переносят за день, между сервисами — за квартал.
Разрезы совпали на части линий. Резать по тем линиям, где сошлись разные принципы, остальное оставить внутри. Частичный разрез — нормальный исход, а не компромисс: два сервиса и модульный монолит рядом с ними лучше, чем шесть сервисов по неподтверждённым границам.
Нет данных о связности изменений. Не решать. Это час работы с историей трекера, и он снимает больше вопросов, чем любое обсуждение.
Если модулей ещё нет — порядок другой, и час превращается в дни. В системе без выделенных границ доля «уместившихся в одну границу» не определена ни для чего, кроме тривиальных 100 % у нулевого варианта. Тогда:
| Что | Как |
|---|---|
| Когда считать | После построения кандидатов, по каждому отдельно — а не первой. Правило «связность считается первой» относится к системе, где границы уже есть |
| По чему считать | По коммитам, если задачи ведутся нерегулярно. На прогоне E-03 было 268 коммитов против 94 задач за те же полгода |
| Сколько стоит | Дни, а не час: сопоставление файлов с кандидатами — отдельная работа, и на 340 таблицах с неизвестными владельцами она заняла три дня |
И различать две нехватки истории. Нет истории происхождения (почему таблица появилась, кто её завёл) — это не нехватка для D-02; нет истории изменений за период — это она и есть. Первое бывает при живом репозитории, и решение не блокирует.
Давление «микросервисы, потому что так делают». Проверить по ARCH-01, какая из причин применима: разный цикл релизов, разные команды-владельцы, разный профиль нагрузки или надёжности, организационный масштаб. Если ни одна — причина не техническая, и обсуждать надо её, а не архитектуру.
Отложить — здесь это конкретная конструкция, а не бездействие. Модульный монолит с явными границами модулей, запретом на чужие таблицы и проверкой зависимостей на сборке даёт ту же дисциплину при цене ошибки в днях (ARCH-01). Условие возврата записывается не сроком, а событием: появилась вторая команда-владелец, профиль нагрузки частей разошёлся на порядок, понадобился независимый выкат.
6. Запись в ADR#
| Поле ADR | Чем заполняется отсюда |
|---|---|
| Контекст | Ответы на семь вопросов раздела 1 — числами, с периодом, за который они посчитаны |
| Дисквалификаторы | Какие кандидаты отпали без сравнения и по какому условию |
| Рассмотренные варианты | Кандидаты вместе с принципом, по которому построен каждый — заполненная матрица целиком, снимком |
| Решение | Выбранный разрез: перечень границ и владелец каждой сущности |
| Обоснование | Какие оси перевесили; если была ничья — какая эвристика применена |
| Последствия | Какие операции становятся сагами, какие вызовы — сетевыми, что дорожает в эксплуатации |
| Условия пересмотра | Раздел 7 |
| Самая дорогая будущая граница | По какой линии разрез обойдётся дороже всего и почему — обычно по ней идёт транзакция основного сценария. Через год это первое, что нужно знать, и последнее, что кто-либо помнит |
| Метод | D-02 v<версия> · шаблон ADR v<версия> — две позиции вместо трёх: раздел 4 не датирован |
Перечень границ с владельцами — главный выход этого решения: он переживает сам разрез и используется дальше на W3 и W6. Матрица копируется в ADR снимком, а не прикладывается ссылкой: ADR отвечает на вопрос, почему так решили тогда, а связность изменений через год будет другой.
7. Условия пересмотра#
- Изменился состав или число команд. Закон Конвея работает и в обратную сторону: архитектура, не совпадающая с коммуникациями, воспроизводит их через обходные пути.
- Доля изменений внутри одной границы упала ниже зафиксированного в матрице значения — граница перестала быть границей.
- В основном сценарии появилась сага, которой при выборе не было.
- У сущности появился второй пишущий.
- Профиль нагрузки или требования к доступности частей разошлись на порядок — появилась техническая причина, которой не было.
- Отложенное решение вернулось по своему условию: модульный монолит перестал устраивать по одному из записанных событий.
Проверка перед тем, как считать решение принятым — пять пунктов в шаблоне.
История версий#
| Версия | Дата | Изменение |
|---|---|---|
| 5.1 | 2026-09-18 | MINOR, по итогам прогона E-03. Уточнена эвристика о связности для системы без выделенных модулей: считается по кандидатам после их построения, по коммитам при нерегулярных задачах, и стоит дни, а не час. Различены две нехватки истории — происхождения и изменений. Прежний исход правило не меняет |
| 5.0 | 2026-09-17 | MAJOR. Добавлен класс защищаемых данных как участник решения о границах: вопрос в раздел 1, дисквалификатор «разрез рассекает класс защищаемых данных» и одноимённая форма разреза. Повод — разбор пилота И0′: требования к данным особого режима влияют не только на хранение, но и на то, где проходит линия. Старым ADR: проверить, не оказались ли персональные, платёжные или иные защищаемые данные у нескольких владельцев — если да, режим оплачивается столько раз, сколько мест |
| 4.0 | 2026-09-17 | MAJOR, по итогам прогона E-02 и разбора глав 6–7 Форда и Ричардса. Решение стало двусторонним: добавлены четыре вопроса и встречный список сил интеграции (общий код, отношения в данных, рабочий процесс, транзакции) с правилом «оплачена названной ценой или отменяет линию». Добавлен вопрос о существующей декомпозиции и правило, что текущий разрез проходит дисквалификаторы наравне с кандидатами. Добавлен дисквалификатор об архитектурном кванте: разные цели по доступности внутри одного кванта недостижимы. Назван порог связности изменений (~80 %) как ориентир. Введено различение модульности и гранулярности. Форма разреза «по поддомену и ограниченному контексту» разделена на две, критерий «по языку» связан с единым языком Эванса. Старым ADR: проверить, обсуждался ли общий код и не остались ли части с разными целями по доступности в одном кванте — оба вопроса прежняя версия задать не могла |
| 3.0 | 2026-09-16 | MAJOR, по итогам прогона E-01. Область применения сужена до работающей системы: документ измеряет связность изменений, и на гринфилде его раздел 1 неприменим — эта половина выделена в D-05. Добавлена проверка разреза по профилю нагрузки (свой язык, свои инварианты, свой владелец данных — иначе это кэш, а не граница) и поле «самая дорогая будущая граница». Старым ADR: если решение принималось на системе без истории изменений, метод был неприменим — перепройти по D-05. Предписание относится к E-01 · ADR-0002 и по состоянию на 2026-09-21 не исполнено. Развилкой Ж6 решено не исполнять его задним числом: D-05 выведен из этого же прогона, и проверять им этот прогон — замкнутый круг. Первое применение D-05 идёт на свежем гринфилде, шаг Ш2 плана. |
| 2.1 | 2026-09-16 | MINOR: ссылка вперёд на D-04, где выбирается ячейка для каждого разорванного процесса. Метод не изменился |
| 2.0 | 2026-09-16 | MAJOR: ось «транзакционные разрывы» заполняется ценой, а не количеством — для каждого разрыва указывается требуемая согласованность. Старым ADR: пересчитать сравнение, если у кандидатов разное число разрывов — ранжирование могло измениться. Добавлено разграничение статической и динамической связанности |
| 1.0 | 2026-09-16 | Первая версия: 7 вопросов к истории изменений плюс вопросы, порождающие кандидатов; 8 осей, 6 дисквалификаторов, 8 типовых форм разреза, 5 эвристик |