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. Только такая ось способна подтвердить сходство, а не только отклонить.

  1. Если в опубликованном профиле нет ни одной положительной eligibility-оси, любой кандидат получает режим review с причиной no_positive_eligibility_axes.
  2. Режимы exact и substitute возможны только при наличии такой оси И успешной проверке всех активных eligibility-осей (правило ADR-0075 сохраняется целиком).
  3. Отклонения работают независимо от состава профиля: расхождение 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