From 4423d28579a48049b0cf7fcea8e05977882968c4 Mon Sep 17 00:00:00 2001 From: Codex Date: Fri, 28 Aug 2026 04:30:13 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20spec=20#331=20revision=203=20=E2=80=94?= =?UTF-8?q?=20AC6=20tells=20the=20two=20sides=20apart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- docs/specs/331-junction-limit-precision.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/specs/331-junction-limit-precision.md b/docs/specs/331-junction-limit-precision.md index cba8b1fe..bc51cf39 100644 --- a/docs/specs/331-junction-limit-precision.md +++ b/docs/specs/331-junction-limit-precision.md @@ -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 по-прежнему пропускает несвязанные правки (инвариант не трогается).