ADR-0076: Точность подбора требует положительной оси совместимости
Status: accepted Date: 2026-08-07 Deciders: belkanov, agent-claude
Контекст
ADR-0075 ввёл product
family как область совместимости и правило точности: режимы exact и
substitute возможны, только когда каждая активная ось профиля с ролью
identity или range сравнима у якоря и у кандидата.
Ревью реализации нашло вырождение этого правила на пустом множестве. Условие «каждая ось сравнима» выполняется тривиально, когда сравнивать нечего:
- профиль состоит только из осей
scoreиignored— они на допустимость не влияют по определению; - профиль состоит только из осей вида
candidate_only_forbidden— направленный запрет по наличию.
В обоих случаях кандидат объявлялся бы точным аналогом, не пройдя ни одной проверки. Второй случай тоньше первого: запрет — полноценная eligibility-ось, он умеет отклонить кандидата с лишней функцией. Но подтвердить сходство он не способен: «у кандидата нет дифференциального тока, которого нет и у якоря» доказывает лишь «ничего плохого не нашли», а не «изделия эквивалентны».
Состояние достижимо не только по ошибке автора профиля: разбор LLM-предложения
понижает роль оси до score, когда у неё нет рода величины или потолка запаса
(ADR-0075, решение п. 6). Профиль из четырёх осей, у трёх из которых понижена
роль, а четвёртая — запрет, выглядит наполненным и при этом не доказывает
ничего.
Решение
Положительная eligibility-ось — ось с ролью identity или range, кроме
вида сравнения candidate_only_forbidden. Только такая ось способна
подтвердить сходство, а не только отклонить.
- Если в опубликованном профиле нет ни одной положительной eligibility-оси,
любой кандидат получает режим
reviewс причинойno_positive_eligibility_axes. - Режимы
exactиsubstituteвозможны только при наличии такой оси И успешной проверке всех активных eligibility-осей (правило ADR-0075 сохраняется целиком). - Отклонения работают независимо от состава профиля: расхождение
identity, срабатывание запрета по наличию и выход за потолок запаса отсекают кандидата как прежде. Ослабляется только право объявить сходство доказанным.
Проверка выполняется после отклонений: профиль из одних запретов обязан по-прежнему отсекать нарушителей, а не отправлять их на ревью.
Последствия
Плюсы
- Пустое множество проверок перестаёт быть доказательством. «Точный аналог» без единой пройденной проверки более невозможен.
- Неполный профиль становится наблюдаемым: причина
no_positive_eligibility_axesпопадает в ответ и в отчёты обхода качества, то есть указывает на семьи, где авторинг не доведён. - Понижение роли при разборе LLM-предложения перестаёт быть тихой потерей строгости: профиль, у которого понизили все положительные оси, честно перестаёт выдавать точные аналоги.
Минусы
- Семья с профилем, собранным из одних запретов, выдаёт только
review— для автоматических потребителей это равносильно отсутствию аналогов (автовыбор разрешён только дляexact). - Ещё одно условие в правиле вывода режима; правило перестаёт формулироваться одной фразой.
Нейтральные последствия
- Контракт ответа не меняется:
no_positive_eligibility_axes— ещё один код в существующем поле причин. - На выдачу сегодня не влияет: правило живёт в
DeriveMode, который ни к одному потребителю не подключён.
Рассмотренные альтернативы
A. Считать запрет по наличию положительной осью
Отвергнуто: запрет отвечает на вопрос «нет ли у кандидата лишней функции» и не способен ответить на вопрос «эквивалентны ли изделия». Признание его положительным вернуло бы ровно тот дефект, ради которого пишется этот ADR.
B. Запретить публикацию профиля без положительной оси и оставить рантайм как есть
Гейт на публикации нужен и будет, но как единственная мера недостаточен: строки профиля переживают миграции данных, ручные правки и восстановление из бэкапа. Рантайм не вправе полагаться на то, что запись всегда прошла через ручку. Проверка на публикации остаётся, но добавляется к рантайм-правилу, а не заменяет его.
C. Внести уточнение в текст ADR-0075
Так и было сделано первоначально (коммит ce294979) и откачено коммитом
419b8251. Отвергнуто: adr/AGENTS.md объявляет принятый ADR иммутабельным.
Правка принятой записи задним числом лишает её роли точки отсчёта — непонятно,
что именно ревьюер одобрял.
Ссылки
- ADR-0075 — семья как область совместимости; уточняемое правило точности в решении п. 7
- Design spec:
docs/superpowers/specs/2026-08-07-product-family-compatibility-design.md, §5.0 - План пилота:
docs/superpowers/plans/2026-08-07-product-family-pilot.md, Task 3 - Реализация:
backend/internal/core/catalog/canonical/app/family/mode.go