docs: spec #331 revision 3 — AC6 tells the two sides apart

r2 M-r2-1: AC6 now mirrors AC5's structure with two explicit cases — a
candidate-side TypeError is an honest WS error, a previous-side TypeError
falls back to "no baseline" and the unrelated write passes. An
implementation with swapped or missing asymmetry turns at least one of the
two units red. L2: the risk wording follows §2.3's component-sum phrasing.

Issue: #331
User-Visible: no
This commit is contained in:
Codex
2026-08-28 04:30:13 +03:00
parent ebbfe4588f
commit 4423d28579
+10 -6
View File
@@ -1,6 +1,6 @@
# Issue #331 — пограничная точность ограничений стыков (#329)
Статус: ревизия 2 (spec-ревью r1: H1 — квантование по формуле канонизации
Статус: ревизия 3 (r2: M-r2-1 — AC6 различает стороны, L2 — формулировка риска синхронизирована с §2.3. spec-ревью r1: H1 — квантование по формуле канонизации
вместо нативного round, M1 — порог инцидентности 2e-7 и исправленный пример,
M2 — узкий except только для кандидата, M3 — обход по рёбрам вместо DFS,
M4 — USER-GUIDE, L1 — пользовательская фраза §1). Родители: #329 (правила), #330 (производительность —
@@ -141,9 +141,13 @@ python. Порог выбран на два порядка грубее кано
- **AC5 (fail-closed).** Синтетическое исключение в проверке кандидата
(мутант/подмена) — запись отклонена с тостом `junction.limit_check_failed`;
исключение на baseline — запись проходит. Смок/юнит.
- **AC6 (except).** Битая форма документа (TypeError в миграции) — честная
ошибка WS, не тихое «нарушений нет»; `WallSegmentMigrationError` —
прежний фолбэк «нет базы». Backend-юниты.
- **AC6 (except).** Два явных случая по образцу AC5 (r2 M-r2-1):
(а) TypeError в миграции **кандидата** — честная ошибка WS, не тихое
«нарушений нет»; (б) TypeError в миграции **previous** — запись
ПРОХОДИТ по фолбэку «нет базы для наследования» (несвязанную правку не
блокирует баг чужой стороны). `WallSegmentMigrationError` в обоих случаях
— прежний фолбэк «нет базы». Реализация с перепутанными сторонами или без
асимметрии красит хотя бы один из двух юнитов. Backend-юниты.
- **AC7 (паритет и регресс).** Паритет-набор расширен всеми классами выше;
все существующие юниты/смоки/мутанты #329+#330 и бенч #330 зелёные без
изменения ожиданий (кроме прямо описанных в §3 пограничных вердиктов).
@@ -163,8 +167,8 @@ python. Порог выбран на два порядка грубее кано
- **i18n**: один новый ключ `junction.limit_check_failed` (en+ru).
- **Touch**: не задет.
- **Риски**: (1) квантование ключей меняет вердикты классов входов —
закрыто явным перечнем §3 и паритетом; (2) выбор максимальной ветви может
легализовать ранее отклонявшиеся конфигурации — это исправление
закрыто явным перечнем §3 и паритетом; (2) сумма коллинеарной компоненты
может легализовать ранее отклонявшиеся конфигурации — это исправление
занижения, фиксируется юнитом с точным ожиданием; (3) 0°-нарушение
может всплыть на легаси-планах с дублями — наследование #329 §3
по-прежнему пропускает несвязанные правки (инвариант не трогается).