diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index f38143d8..48a319f5 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -3,7 +3,7 @@ > **Единственный трекер проекта.** Здесь живут строки, на которые доки, промты и D-ноты ссылаются словами «строка N» / «строка бэклога N»: **ID строки стабилен навсегда**, не перенумеровывается и не переиспользуется (D39.80). Правки — только через оркестратора; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено. > ⚠ **Это НЕ бэклог зоны `docs/`, а бэклог ПРОЕКТА.** У зон свои, с другими неймспейсами ID, и единый их строк не принимает (D39.84): платформа — [../platform/BACKLOG.md](../platform/BACKLOG.md) (`П-N`) и её регистр дефектов `platform/docs/DEFECT_REGISTER.md` (`PD-N`); фронт — [../frontend/docs/BACKLOG.md](../frontend/docs/BACKLOG.md) (`Ф-N`). > ⚠ **Состояние проекта — не здесь.** Очередь, курс, CURRENT-STATE, состояние паков и живая хроника — шапка [PROGRESS.md](PROGRESS.md). Здесь только долг и его диспозиции. -> - **СЧЁТ ОЧЕРЕДИ на 17.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **369** строк · зона бэкенд **194** строго / **247** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **197** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 17.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **370** строк · зона бэкенд **194** строго / **247** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **197** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - ⚠ **Переезд 06.09 (D39.218):** таблица вынесена из `PROGRESS.md` ДОСЛОВНО и ни один ID не сдвинут — **с единственным исключением: две ячейки (строки 220 и 306) тронуты РОВНО в номере якоря `docs/scripts/counts.py:566`→`:569` и `:592`→`:595`**, потому что цель сдвинул этот же коммит; текст ячеек не менялся, длины равны. В `PROGRESS.md` на прежнем месте оставлен заголовок-указатель, поэтому ссылки «секция „Бэклог“» доезжают в один хоп. ## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора) @@ -405,3 +405,4 @@ | 488 | ⛔ **ТЕСТ ГЕЙТА ГРУЗИТ ВЕСЬ МОДУЛЬ С СИНТАКСИСОМ И ТИПАМИ — 1.44 ГБ БЕЗ `-race`, 3.2 ГБ С НИМ, И РАСТЁТ ВМЕСТЕ С РЕПОЗИТОРИЕМ.** `backend/internal/archguard/shippingtree_test.go:34`=`Mode: packages.LoadAllSyntax, Tests: true` грузит `textmachine/backend/...` целиком ⇒ его память пропорциональна размеру РЕПО, а не предмету теста. Замерено зоной 17.09 после ТРЁХ убийств гейта подряд; пере-снято оркестратором чтением (`LoadAllSyntax` 1 хит, `Tests: true` 1 хит в пакете). ⭐ **ПРИЧИНА УТОЧНЕНА 17.09 ТРЕТЬИМ НЕЗАВИСИМЫМ ЗАМЕРОМ, и прежняя редакция ряда читалась опаснее правды: бьёт СУПЕРВИЗОР ФОНОВЫХ ЗАДАЧ ХАРНЕССА, а ПЕРЕДНИЙ ПЛАН ему не подчиняется.** Та же команда с теми же флагами в переднем плане проходит: `go test ./internal/archguard/ -race -count=1 -timeout=20m` → `ok 29.048s`, пик **3 418 648 kB (3.26 ГБ)**, совпавший с показанием семплера ДО КИЛОБАЙТА. ⇒ гейт в машину ПОМЕЩАЕТСЯ; не помещается он в фоновую задачу. Умерли ПЯТЬ версий причины (конкуренция наборов · параллелизм `-p` · тяжесть пакета конвейера · потолок cgroup · нехватка памяти машины), живёт одна. ⚠ Следствие для приёмок: «гнать гейт, когда рядом нет второго тяжёлого прогона» — НЕ лечение, а суеверие; лечение — гнать не в фоне. ⭐ **ВТОРАЯ УЛИКА 17.09, приёмочная: потолок фоновых задач НЕ ОДИНАКОВ У СЕССИЙ.** У зоны `make battery` целиком не прошёл ЧЕТЫРЕ раза (включая попытку на пустой машине); у оркестратора тот же гейт на копии того же дерева прошёл ЦЕЛИКОМ и В ФОНЕ с первого раза, при `MemFree` **0.5 ГБ** на старте — то есть в ХУДШИХ условиях по свободной памяти. ⇒ «гейт не помещается в машину» неверно даже как описание: он не помещается в ЧУЖУЮ фоновую задачу, и чья именно сессия его запускает — несущий параметр, а не деталь. ⛔ **Убивает не нехватка памяти и не потолок cgroup:** `memory.max = max` у обоих слайсов, `MemAvailable` держался ≈4.2 ГБ — падал **`MemFree`, до 110 МБ**, и супервизор бьёт по НЕМУ. ⇒ «свободных четыре гигабайта» ничего не гарантирует, и это практическое знание для всех зон, а не частность движка. ⭐ **Три версии причины, выдвинутые до замера, оказались ЛОЖНЫМИ, и это стоит держать видимым:** «конкуренция наборов» (убило в одиночку) · «параллелизм пакетов» (убило с `-p=2`) · «тяжёлый `internal/pipeline`» (замер: пик 313 МБ под `-race`). ⚠ **И контроль A/B едва не обманул в ОБРАТНУЮ сторону:** первая попытка шла с `-run TestShipping`, вернула `ok … [no tests to run]` и 126 МБ; прими зона этот «дешёвый базис» за `HEAD`, вышел бы вывод «пак утроил память» — из контроля, который НЕ ЗАПУСКАЛСЯ. Настоящее имя — `TestInvariantsHoldInTheShippingTree`. Честное A/B: чистый `HEAD` 1.44 ГБ против рабочего дерева 1.44 ГБ, разница **+0.3 %** ⇒ дефект НЕ от пака. ⚠ Границы: в батарейное подмножество каталога мутаций `archguard` НЕ входит (пере-снято оркестратором: 0 упоминаний при 491 записи и 280 в батарее), поэтому кампанию он не трогает — страдает только `make battery`. Родня — ряд **484** (ратифицированный рецепт, не помещающийся в машину, на которой его требуют гонять) | бэкенд | скоро | тест судит инварианты, не загружая весь модуль, либо гейт объявляет свою потребность в памяти и условие, при котором не запускается | замер зоны 17.09, контроли оркестратора | | 489 | ⚠ **РЕВИЗИЯ ДОКУМЕНТАЦИИ ЗОНЫ БЭКЕНДА (пинг оркестратора №22 от 04.09, 10 пунктов) ЖИВА НА ТРИНАДЦАТЫЙ ДЕНЬ — пере-снято 17.09 приборами, а не перечитыванием.** Пинг сидит семьюдесятью строками в журнале прогресса и адресован ЗОНЕ, которой сейчас нет (слот свободен), поэтому живое уезжает сюда прежде, чем носитель будет свёрнут (условие владельца `D39.261` п.2). **ИЗМЕРЕНО ЧЕТЫРЕ ЖИВЫХ:** (1) `backend/README.md` описывает инвариант канала через ключи, которые ЗАГРУЗКА ОТВЕРГАЕТ — «permissive» 1 хит, а настоящий механизм (метки контента против принимаемых меток) **0 хитов**; (2) оба PUML (`components.puml`, `pipeline.puml`) БЕЗ предупреждающего баннера в шапке, при том что карта доков подаёт их как текущие; (6) ⛔ **тяжелейший: ратифицированная норма зоны висит на ЗАКРЫТОЙ строке** — `backend/docs/DISCLOSURE_LAW_DESIGN.md:219-221` обусловливает себя словами «пока строка бэклога 246 открыта», и сам текст обещает «закроется 246 — оговорка снимается вместе с ней», НО ряд 246 закрыт лендингом (в таблице его нет, журнал решений подтверждает) ⇒ оговорка действует без предмета; (10) пакет `backend/internal/langscreen` существует и лежит на денежном пути вердиктов, а в README о нём **0 упоминаний**. ✅ **ИЗМЕРЕНО ЗАКРЫТЫМ ОДНО:** (7) «семь протухших токен-якорей в `backend/docs/`» — красных якорей с целью в этом каталоге **0** при 327 адресах. ⚠ **НЕ ИЗМЕРЕНО ПЯТЬ** (3 · 4 · 5 · 8 · 9): они про содержание прозы README и требуют чтения, а не грепа; «не измерено» здесь значит именно это, а не «исполнено». ⛔ Правит ЗОНА: `backend/` мне писать нельзя, и тринадцать дней простоя — следствие того, что пинг жил в журнале, а не строкой трекера. Нести в промт следующего бэкенд-пака | бэкенд | скоро | четыре живых пункта исполнены или названы неисполнимыми, пять неизмеренных измерены | пинг №22 04.09, замеры оркестратора 17.09 | | 490 | **РАЗРЫВ ОКОН ГЛАВ У БАНКОВЫХ СТРОК НЕ ПРОВЕРЯЕТ НИКТО — страж построен только для ГОЛОСОВ.** Загрузчик отбивает ПЕРЕСЕЧЕНИЕ окон и полисемию (`backend/internal/membank/memseed.go:201-236`), а РАЗРЫВ — `until_ch=3` при следующем `since_ch=5`, то есть глава 4 без закона — не ловится ничем. Готовый образец лежит рядом и построен для другой сущности: `backend/internal/membank/memvoice.go:271`=`func VoiceWindowGaps`, и его докблок объявляет разрыв у голосов ЗАКОННЫМ намеренно (`backend/internal/membank/memvoice.go:268`=`a deliberate gap`), поэтому он логирует, а не роняет. ⚠ **Контроль области напечатан, потому что отрицательный замер без него неотличим от непрочитанного:** в не-тестовых `.go` каталога `membank` — 11 совпадений `windowsOverlap` и 7 хитов `gap` ВНЕ голосов, и все семь про пропуски склонений в пост-чеке, то есть о другом предмете; стража разрыва у банковых строк среди них нет. ⛔ **Чем это стоит качества перевода:** преемник термина собирается тремя отдельными решениями владельца, и опечатка в границе оставляет главу без закона МОЛЧА — редактор переводит её без банка, а замечает это уже читатель книги. Проверка живёт над тем же документом решений: глаголов не добавляет, `DecisionsVersion` не двигает, контракт не трогает — $0. ⚠ Беря у образца форму, взять и его гарантию: намеренный разрыв законен и в сид-файле невидим, поэтому исход — громкая строка оператору, а не отказ загрузки | бэкенд | скоро | разрыв окон у банковых строк называется оператору тем же способом, что у голосов, и запинен посадкой, которая краснеет именно им | `research/35` N-7, замеры оркестратора 17.09 | +| 491 | **УЛИКА ПЕРЕЗАГРУЗКИ ХОСТА СУЩЕСТВУЕТ И НЕ ЧИТАЕТСЯ ЗОНОЙ ВОВСЕ — различие «ребут» против «ручной остановки» сегодня ВЫВОДИТСЯ, хотя могло бы быть ФАКТОМ.** Платформа решает судьбу прогона, вышедшего с кодом остановки без записанного намерения, предположением о причине (`platform/internal/runs/reconcile.go:573`=`interruptedBySomeoneElse(l, marker)`), и тот же файл честно говорит, что смысл ОТСУТСТВИЯ записи решается уровнем выше. ⚠ **Замер оркестратора 17.09 (знаменатель напечатан, потому что это отрицательный замер):** имена `btime` · `boot_id` · `BootID` · `InvocationID` · `uptime` дают **по 0 хитов** в не-тестовых `.go` платформы при **88** прочитанных файлах; при этом улика на хосте есть и читается — `/proc/stat` несёт время старта системы, `boot_id` доступен. ⇒ различить перезагрузку от ручной остановки можно было бы фактом, а не асимметрией цен. ⛔ **Почему это НЕ взято в пак 17.09 и довод сильный (сессия зоны, выдача №15):** ошибка в сторону «ребута не было» возвращает дефект на ВЕСЬ хост — терминирование пользовательского менеджера мимо перезагрузки прочиталось бы как ручной стоп и убило бы все прогоны разом, — а выигрыш совпадает с тем, что уже даёт предел перезапусков ряда 398. ⇒ строка заводится, чтобы довод не растворился вместе с отчётом пака, и оживает, если предел окажется недостаточным или если появится второй хост | платформа | когда-нибудь (гейт: предел ряда 398 построен и оказался недостаточен, либо второй хост) | различие ребут/ручная остановка опирается на улику хоста, а не на вывод из кода выхода | замер оркестратора 17.09, довод сессии `textmachine-main-78` |