From 4930363d05cce3f7be4f5e2093b658014d7a4b1c Mon Sep 17 00:00:00 2001 From: heaven Date: Thu, 10 Sep 2026 22:45:22 +0300 Subject: [PATCH] Record that a process can see two terminate signals as one, so the stop ladder now orders them by an observable state instead of assuming delivery. --- docs/PROGRESS.md | 3 ++- docs/architecture/05-decisions-index.md | 3 ++- docs/architecture/05-decisions-log.md | 20 +++++++++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 66c94dbc..d6ae84a8 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-10, голова D39.237 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ИСПОЛНЕН, испр. 08.09 (висел как «первым» неделю после исполнения):** (0а) ревизия документации на протухшее ОТРАБОТАНА 01.09 воркфлоу `docs-staleness-revision-A` (15 срезов), провенанс находок — `D39.185`; (0б) планы доработок в бэкенд и платформу — исполняются ПАКАМИ, за 07–08.09 закрыты два движковых (`D39.225`, `D39.226`); (0в) вынос неактуального в архив идёт батчами `DOC_CLEANUP_PLAN.md` (Б14/Б15/Б17 живы). ⇒ строка ниже — не заказ, а история: (0а) ревизия документации на ПРОТУХШЕЕ — по всем зонам; (0б) планы доработок в БЭКЕНД и ПЛАТФОРМУ; (0в) вынос неактуального в АРХИВ (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **94** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 109 (major 1), всего рядов 465 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-10, голова D39.238 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ИСПОЛНЕН, испр. 08.09 (висел как «первым» неделю после исполнения):** (0а) ревизия документации на протухшее ОТРАБОТАНА 01.09 воркфлоу `docs-staleness-revision-A` (15 срезов), провенанс находок — `D39.185`; (0б) планы доработок в бэкенд и платформу — исполняются ПАКАМИ, за 07–08.09 закрыты два движковых (`D39.225`, `D39.226`); (0в) вынос неактуального в архив идёт батчами `DOC_CLEANUP_PLAN.md` (Б14/Б15/Б17 живы). ⇒ строка ниже — не заказ, а история: (0а) ревизия документации на ПРОТУХШЕЕ — по всем зонам; (0б) планы доработок в БЭКЕНД и ПЛАТФОРМУ; (0в) вынос неактуального в АРХИВ (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **94** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 109 (major 1), всего рядов 465 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). > ⛔ **ПЯТЬ ПОТОКОВ РАБОТЫ — состояние на 07.09 (пере-снято лендингами смены №23).** > **(1) ПОЛИГОН — «ремонт прибора»** (`docs/POLYGON_INSTRUMENT_REPAIR_SESSION_PROMPT.md`, строки 319 · 300 · 265 · 143): > ⚠ **ЕДИНСТВЕННЫЙ ПОТОК, НЕ СДВИНУВШИЙСЯ ЗА СМЕНУ — сессия по промту так и не стартовала.** Блокирующая линза @@ -13,6 +13,7 @@ > `3d90943`). Строки 285 · 305 · 325 закрыты. ⚠ **Синхронный разрез приёма принят ПОСТРОЕННЫМ, НО НЕ ГОТОВЫМ** — > сработало правило остановки (9 major из 11 в одном механизме), десять пунктов несёт строка **332**; ложный > инвариант бюджета заландён осознанно (окно лжи 8 секунд при дефолте в 16 минутах, ломается идемпотентность). +> **(15) ⛔ ДВА SIGTERM ПОДРЯД GO-ПРОЦЕСС ВИДИТ КАК ОДИН — акт `D39.238`, замерено дважды независимо** (`gap 0` → 0 из 20, `gap 1 мс` → 20 из 20, контроль 5 из 5). Ратифицированная форма двух остановок стояла на посылке «послать два = получить два», которой нет: «останови сейчас» первым нажатием давало бы МЯГКУЮ остановку молча, а пере-выпуск жёсткого сигнала свипом — третий SIGTERM, то есть смерть без кадра и сеттла. Форма остаётся, добавлен контракт: сигналы упорядочены НАБЛЮДЕНИЕМ, факт доставки долговечен. ⭐ Первая серия замера была неверна ПРИБОРОМ и дала противоположный ответ — сессия починила прибор и назвала это сама. > **(14) ОБЕ СЕССИИ ПАКА «ДВЕ ОСТАНОВКИ» ПРИНЯЛИ РАБОТУ И ОТВЕТИЛИ ЭХО-ПРОТОКОЛОМ; шесть возражений, шесть приняты — акт `D39.236`.** Три из них — ошибки В МОИХ ПАКАХ (счётчик оценки копился бы с нуля и пин равенства был бы вакуумен · «опора готова» для строки оператору · неверный механизм следствия у блокирующего `stop`), одно — правило версий, которое я нарушил бы молча. ⭐ Все шесть пришли ПОСЛЕ двух кругов ревью: эхо-протокол оказался третьим рубежом, а не формальностью входа. > **(13) ДВА ПАРНЫХ ПРОМТА «ДВЕ ОСТАНОВКИ» ВЫДАНЫ, акт `D39.235`** — движковый и платформенный, порознь не лендятся. Форма кадра остановки ЗАФИКСИРОВАНА нотой ДО старта работ (две зоны, один шов). ⛔ Эррата к `D39.234` п.1б: мой механизм «отказ на гейте» ратифицированных ~20 минут не даёт — резервация держит всю цепочку ретраев. ⛔ Замером исполнением найдено, что платформенный `Stop` без `--no-block` блокируется на весь грейс и сломал бы `202` контракта. **Сплошной инвентарь живых доков по слову владельца: 19 мест починено**, контракт исправлен минором `0.13.1` (схема требовала отставленный член ⇒ каждый ответ `Run` был невалиден). > **(12) СЛОВО ВЛАДЕЛЬЦА ПО ОСТАНОВКАМ ПОЛУЧЕНО И РАТИФИЦИРОВАНО, акт `D39.234`:** первое нажатие — мягкая, второе — жёсткая; ждём одну летящую попытку (~20 мин), не цепочку; пак мягкой остановки и строку **377** делаем ОДНИМ заходом; коды выхода не трогаем. Пак движка ПАРНЫЙ платформенному. ⛔ Тем же актом сверены носители, которых `D39.232` не тронул: закрыты и убраны строки **78** · **331** · **360** · **369**; блокеров очереди в трекере теперь **0**. Инвентарь живых доков прогнан (94 файла): `15-money-path.md` чинен в трёх местах. diff --git a/docs/architecture/05-decisions-index.md b/docs/architecture/05-decisions-index.md index 891931e4..b8b12402 100644 --- a/docs/architecture/05-decisions-index.md +++ b/docs/architecture/05-decisions-index.md @@ -1,4 +1,4 @@ -# Реестр D-нот — карта актуальности v2 (D1–D39.237; титул — носитель головы, бампать при каждом аппенде) +# Реестр D-нот — карта актуальности v2 (D1–D39.238; титул — носитель головы, бампать при каждом аппенде) > ⚠ **Колонку «тело» `counts.py --check` НЕ сторожит по устройству:** он сверяет полноту НОМЕРОВ, а не > место тела, поэтому колонка держится дисциплиной лендинга. Не нашёл тело по колонке — иди в слайсы, @@ -296,3 +296,4 @@ | D39.235 | 10.09 | **ФОРМА КАДРА ОСТАНОВКИ ЗАФИКСИРОВАНА ДО РАБОТ; два парных промта выданы; сплошной инвентарь живых доков.** Кадр: `Finished.Stop{mode,…}` присутствием (прецедент `Volume`), `estimated{rows,micro_usd}` на ОБОИХ кадрах, `Money` на `stopped` всегда, запасной канал — обязанность платформы; минор потока `1.3→1.4`. ⛔ Эррата к `D39.234` п.1б: «отказ на гейте» ратифицированных ~20 мин НЕ даёт — резервация держит ВСЮ цепочку ретраев, нужен и `retryLoop`. ⛔ Замер исполнением: платформенный `Stop` без `--no-block` блокируется на весь грейс (15,21 с против 0,019 с) ⇒ сломал бы `202` контракта. Инвентарь: **19** мест починено, самый урожайный класс — УСЛОВНОЕ ЗАКРЫТИЕ. Контракт `0.13.0→0.13.1`: `Run.required` требовал отставленный член ⇒ каждый ответ был невалиден. Закрыта строка **166** | стоп · шов · контракт · инвентарь | | D39.236 | 10.09 | **ДИСПОЗИЦИИ ПО ЭХО-ПРОТОКОЛАМ обеих сессий пака «две остановки»: шесть возражений, шесть приняты, ТРИ — мои ошибки.** (1) счётчик оценки СИДИРУЕТСЯ из стора, а не копится с нуля — иначе пин равенства двух каналов зелен на пустом сценарии; (2) расширение правила присутствия `Money` формально МАЖОР, везём минором `1.3→1.4` как осознанное исключение (мажор читателем отвергается целиком); (3) «опора готова» для строки оператору — преувеличение, прогонного реестра летящих вызовов нет; (4) платформа поднимает `StreamVersion` и тем же движением пишет, каких полей 1.2/1.3 не читает; (5) «свип встанет на 20 минут» — неверный механизм, настоящий ущерб — ложная тревога `StalledAfter`; (6) 1240 с — свойство ПАРЫ, не константа платформы. ⭐ Все шесть пришли ПОСЛЕ двух кругов ревью: эхо-протокол — третий рубеж, а не формальность | стоп · шов · метод | | D39.237 | 10.09 | **ЗАПИСКА-ПЛАН ПЛАТФОРМЫ.** ⛔ Мой корректирующий минор контракта (`D39.235` п.6) положил гейт ЧУЖОЙ зоны — базовая линия была красной на входе сессии; носитель один (`platform/internal/httpapi/capabilities.go`), правку берёт сессия. **Норма: правка ратифицированного носителя сверяется с ГЕЙТАМИ на него тем же движением** (второй раз за две недели, ср. эрратy 08.09-б). ⭐ Сессия нашла сверх заказа: повторный `stop --no-block` по `deactivating` НЕ шлёт второй SIGTERM — иначе свип давал бы АВТОМАТИЧЕСКУЮ эскалацию в жёсткую остановку; свойство держалось на удаче, теперь пинится. Потолок ожидания — свойство каталога И бюджета: беcключевой `zai` перерастает 1240 с при `edit_ceiling_out` ≈ 9 900 против 8 000 сегодня. Нетухнущая форма — строка **383** | стоп · шов · метод | +| D39.238 | 10.09 | ⛔ **ДВА SIGTERM ПОДРЯД GO-ПРОЦЕСС ВИДИТ КАК ОДИН** — замерено дважды независимо: `gap 0` → **0 из 20**, `gap 1 мс` → 20 из 20, контроль `gap 100 мс` → 5 из 5; коалесценция ниже канала (`runtime/sigqueue` держит БИТ, не счётчик), буфер не чинит. ⇒ ратифицированная форма «первый мягкий, второй жёсткий, третий дефолт» (`D39.234` п.1а) стояла на посылке «послать два = получить два», которой НЕТ: `mode: hard` первым нажатием давал бы МЯГКУЮ остановку молча, а пере-выпуск жёсткого сигнала свипом — ТРЕТИЙ SIGTERM, то есть смерть без кадра и сеттла. Контракт: сигналы упорядочены НАБЛЮДЕНИЕМ входа в фазу остановки, факт доставки долговечен. ⭐ Первый замер был неверен из-за прибора и дал противоположное число — сессия починила прибор и назвала это сама | стоп · шов · метод | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 4c24db55..a6ec3d5d 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.237 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) +# Журнал решений оркестратора — контракт D1–D39.238 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто: > ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 — в слайсе `../archive/architecture/05-decisions-D39-106-123.md` (испр. 05.09: прежнее «живёт ниже в этом файле» протухло подрезкой D39.139) (голова D39.106+). @@ -3352,3 +3352,21 @@ bought NOTHING». ⇒ **`tmctl manifest` есть НИЖНЯЯ граница, **7. Перестановка порядка работ ПРИНЯТА и довод записан.** `--no-block` (§4.7) идёт ВТОРЫМ, до пути второго сигнала: до него любой живой сценарий на грейсе больше 600 с блокирует и пробник, и свип на весь грейс — то есть инструмент проверки грейса упирается в дефект, который тот же пак и чинит. ⇒ **правило шире случая: если пак чинит инструмент, которым сам же проверяется, эта починка идёт первой.** **8. Границы.** Пункт 1 пере-снят мной. Пункты 2–4 — замеры сессии на её юнитах и её программой; я их не воспроизводил и говорю это прямо, но пункт 4 совпал с независимым замером старшего коллеги, а пункт 3 совпал с моим счётом каталога (3 из 8 с ключом). Пункт 3 в части «120 с на свёртку» — АЛЛОКАЦИЯ, названная аллокацией самой сессией. + +## D39.238 — ⛔ ДВА SIGTERM ПОДРЯД GO-ПРОЦЕСС ВИДИТ КАК ОДИН: ратифицированная форма двух остановок стояла на посылке, которой нет (10.09, оркестратор №23) ✅ + +**1. Факт, замеренный ДВУМЯ независимыми приборами.** Платформенная сессия — программой на `signal.Notify` с буфером канала **8**; я — своей, тем же способом, на том же рантайме. Числа сошлись: + `gap 0 мс` — оба сигнала увидены в **0 из 20** (слиплись все двадцать) · `gap 1 мс` — **20 из 20** · `gap 5 мс` — 10 из 10 · контроль `gap 100 мс` — 5 из 5. + ⇒ **коалесценция живёт НИЖЕ канала**, в `runtime/sigqueue`, где на сигнал заведён БИТ, а не счётчик; размер буфера её не чинит. Гонка «сигнал до установки обработчика» исключена по построению: сендер ждёт «READY», печатаемое ПОСЛЕ `signal.Notify`. + +**2. Почему это ломает ратифицированное.** `D39.234` п.1а зафиксировал форму «первое нажатие — мягкая, второе — жёсткая, третье — дефолт процесса». Форма ОСТАЁТСЯ, но она молча предполагала, что «послать два сигнала» и «получить два сигнала» — одно и то же. Не одно: + **(а)** `mode: hard` НА ПЕРВОМ НАЖАТИИ требует от платформы двух сигналов; посланные подряд, они станут ОДНИМ — пользователь просит «останови сейчас», получает мягкую остановку, движок продолжает покупать вызовы. Молча, без ошибки, без строки. + **(б)** ТРЕТИЙ сигнал СМЕРТЕЛЕН (дефолт процесса) ⇒ платформа обязана послать РОВНО два, никогда три. А `systemctl kill`, в отличие от `stop`, инертным НЕ является и доходит каждый раз (`D39.237` п.2) — значит пере-выпуск жёсткого сигнала свипом на следующем проходе дал бы третий SIGTERM: мгновенная смерть без терминального кадра и без сеттла, ровно та потеря, ради которой пак делается. + +**3. Контракт между половинами — принят.** Платформа упорядочивает сигналы НАБЛЮДЕНИЕМ, а не задержкой: `stop --no-block` (сигнал №1, он же вооружает грейс) → ожидание наблюдаемого входа юнита в фазу остановки (`SubState`; замеренный путь — 0,014 с) → `kill --signal=SIGTERM --kill-whom=main` (сигнал №2). Не дождалась в бюджете — жёсткий сигнал НЕ шлёт: намерение с режимом уже в базе, доделает следующий проход. ⛔ **И факт «жёсткий сигнал уже послан» делается ДОЛГОВЕЧНЫМ** — столбец рядом с режимом, а не память процесса, иначе перезапуск платформы между проходами даёт третий SIGTERM. Это усиливает `D39.236` п.2 и §4.2-бис платформенного пака: пережить перезапуск обязан не только режим, но и факт доставки. + +**4. Движковой половине передано как ВОПРОС, а не как приказ.** Ей сказано дословно: считать сигналы можно, считать ДОСТАВКИ нельзя; если её конструкция где-то опирается на «платформа пошлёт два — значит увижу два», она опирается на неправду. Спрошено, устраивает ли её контракт «второй сигнал отделён наблюдаемым входом в фазу остановки», или жёсткость надо определять не СЧЁТОМ, а признаком «сигнал пришёл, когда я УЖЕ в состоянии мягкой остановки». Проектное решение — её, но принять его надо ДО пина эскалации. + +**5. ⭐ УРОК О ПРИБОРЕ, который дороже самого факта.** Первая серия платформенной сессии дала «2 из 2» и была НЕВЕРНОЙ: она слала `kill` из шелла, и запуск двух процессов сам создавал зазор в миллисекунды. Она починила прибор, число перевернулось на ПРОТИВОПОЛОЖНОЕ, и она это назвала сама. **На неверном приборе вопрос был бы закрыт как несуществующий, и обе половины пака ушли бы в лендинг на посылке, которой нет.** ⇒ норма: замер, чей результат подтверждает УДОБНОЕ, проверяется на прибор прежде, чем на предмет; и «слипание» ловится только тем прибором, который умеет создать нулевой зазор. + +**6. Границы.** Пункты 1 и 5 — замерены, дважды и независимо. Пункт 2 — вывод из замера плюс ратифицированной формы, не отдельный замер. Пункт 3 — конструкция платформенной зоны, объявленная ею; путь до `deactivating` 0,014 с — её число, я его не воспроизводил. Ответ движковой половины на п.4 ещё не получен.