feat: assembly_add_mate — упрочнение по ревью Codex реализации

#1: Valid==false → ошибка (откат), а не «успех с valid=false»; косвенно отсекает
грани одного компонента (вырожденный мат). #6/#7: distance value строго > 0
(нулевой зазор = coincidence) + unit-кейс value=0 бросает. #8: негативный
интеграционный тест — точка в пустоте → грань не найдена → ошибка.
#2/#3/#4 оставлены по обоснованию (best-effort откол, Add??throw, первый IFace —
консистентно с HoleService). #9 точечный release RCW отклонён (конвенция v2-2).

Тесты: 98 unit + 58 integration = 156 зелёных.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-27 13:45:35 +03:00
parent 8282716773
commit 3fe06f61dc
5 changed files with 39 additions and 6 deletions
@@ -1,7 +1,20 @@
# Дизайн: сопряжение компонентов сборки (assembly_add_mate) через API7
**Дата:** 2026-05-27
**Статус:** спайк зелёный; ревью Codex учтено (8 замечаний); реализуется
**Статус:** реализовано и проверено (2 интеграционных + 14 unit, всего 154); ревью Codex спека (8) и реализации (9) учтено
## Правки по ревью реализации Codex (9 замечаний)
- **#1 `Valid==false` → ошибка** (а не «успех с valid=false»): после Update+Rebuild проверяем
`mate.Valid`, иначе бросаем (срабатывает откат). `AddedMate.Valid` теперь всегда true при успехе.
Это же косвенно ловит грани одного компонента (#5) — мат выродится.
- **#6/#7 distance `value` > 0** (не ≥0): нулевой зазор вырождается в coincidence →
`RequireMateValue` требует строго `> 0`; unit-кейс `value=0` бросает.
- **#8 негативный интеграционный тест**: точка в пустоте → грань не найдена → ошибка.
- **#2 откат best-effort** оставлен намеренно (исходное исключение важнее ошибки отката; паттерн
`HoleService`). **#3** `mates.Add ?? throw` до try корректно (null = ничего не добавлено).
**#4** «первый IFace» оставлен (консистентно с HoleService/move_face). **#9** точечный release
RCW отклонён (конвенция v2-2).
## Решения по ревью Codex (важные правки к дизайну ниже)