diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 3ddd8ab1..2944303c 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). Здесь только долг и его диспозиции. -> - **СЧЁТ ОЧЕРЕДИ на 16.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **365** строк · зона бэкенд **190** строго / **243** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **193** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 16.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **366** строк · зона бэкенд **191** строго / **244** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **194** (перечень — грепом по таблице, рукописный список снят 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; правки — только через оркестратора) @@ -401,3 +401,4 @@ | 484 | ⛔ **РАТИФИЦИРОВАННЫЙ РЕЦЕПТ МУТАЦИЙ ТРЕБУЕТ ПАРАЛЛЕЛЬНЫХ БАТАРЕЙ, А БАТАРЕЯ ЗОНЫ СОДЕРЖИТ ФИКСТУРЫ С АБСОЛЮТНЫМИ СРОКАМИ И НАСТОЯЩИМ КОММИТОМ В POSTGRES — ЭТО КОНФЛИКТ ДВУХ РАТИФИЦИРОВАННЫХ ВЕЩЕЙ, А НЕ ДЕФЕКТ ОДНОГО ПАКЕТА.** `D39.159` §2 велит сажать мутации в КОПИЮ дерева ⇒ всякая приёмка гонит две батареи разом; пакет `platform/internal/books` при этом краснеет КАЖДЫЙ РАЗ НА ДРУГОМ ТЕСТЕ — подпись голодания планировщика, а не логики. ⭐ Измерено ДВАЖДЫ и двумя сторонами: зона — двумя полными батареями, запущенными в одну секунду (чистый `HEAD` и дерево пака красны ОБА, на РАЗНЫХ тестах); оркестратор при приёмке 17.09 — двумя изолированными прогонами пакета в двух деревьях одновременно: `ok 76.816s` и `ok 75.761s`, оба `GOTEST_EXIT=0` при нагрузке 6.05/6.21, тогда как внутри полной батареи тот же пакет красный. ⇒ изолированно зелен всегда, красен только под собственной батареей зоны с `-race` плюс сторонней нагрузкой. **Механизм пере-снимался ТРИЖДЫ, и все три редакции стоит держать видимыми:** (1) «фикстуры сжимают продуктовые 220 с до 700 мс» — верно про `TestTheCutOfAnUploadIsBoundedByTheWalk…`, но падение приёмки не объясняет; (2) «фикстура называет посылку `on an idle host` четырежды и не проверяет её ни разу» (`Skip`/`loadavg`/`NumCPU` → 0) — верно по классу, но сжимает не она; (3) решающая, зоны: в `TestAnUploadThatRunsOutOfBudgetWaitingForASlot…` `uploadSettle = 0` ВОЗВРАЩАЕТ продуктовые 210 с, а режет невозвращённый `writeBudget = 20 мс`, поставленный для ПЕРВОЙ половины теста ⇒ падает утверждение «настоящий коммит укладывается в 20 мс», а называет себя оно «загрузка на простаивающем хосте». Лечение дешёвое: сбросить `writeBudget` вместе с `uploadSettle` либо дать второй половине свои бюджеты; сверх того — утверждать посылку простоя замером с внятным скипом или перестать зависеть от абсолютного времени. ⚠ **ГРАНИЦА СНЯТА ЗАМЕРОМ 17.09, и прежнюю оставляю видимой:** зона говорила «сколько тестов семейства подвержено — я НЕ измеряла; три теста за три прогона это ВСТРЕЧЕННОЕ, а не посчитанное», затем посчитала прогоном по всем тест-файлам пакета с разрешением констант — **6 тестов из 73** кладут настоящую операцию Postgres внутрь суб-секундного бюджета (`failfast_test.go` 1 · `limit_test.go` 4 · `walk_test.go` 1), и ВСЕ ЧЕТЫРЕ красневших — внутри этих шести, ни одного за их пределами. ⛔ **Четвёртый красный снёс довод о нагрузке:** `TestAnUploadTheHostCouldNotCutStillLeavesSomebodyToFinishTheBook` упал при длительностях пакетов, почти равных ЗЕЛЁНОМУ прогону (`pgstore` 322 против 317 с, `runs` 284 против 278, `books` 113 против 115) ⇒ грубого замедления не требуется, хватает МГНОВЕННОЙ ЗАМИНКИ, что для бюджета 20 мс поверх сетевого коммита ожидаемо. Носители: `PD-469` (диагноз, замер двумя деревьями) и `PD-420` (второе лицо того же конфликта, диагноз не установлен). ⛔ Цена бездействия названа: ложный красный у КАЖДОЙ будущей приёмки, и он неотличим от регрессии, пока кто-нибудь не потратит два прогона на разделение | платформа | скоро | фикстуры семейства не зависят от абсолютных сроков либо утверждают свою посылку; сосчитано, сколько тестов подвержено | приёмка 17.09, замеры зоны и оркестратора | | 485 | ⛔ **ПЕРВАЯ ВРЕЗКА ФАЙЛА, КОТОРЫЙ ЧИТАЕТ КАЖДАЯ ПОЛИГОН-СЕССИЯ ПРИ ОНБОРДИНГЕ, ДЕРЖИТ ЗАПРЕТ, СНЯТЫЙ ПОЛТОРА МЕСЯЦА НАЗАД.** `eval/README.md:7`=`Платные прогоны/докупки СТОП` объявляет «Платные прогоны/докупки СТОП до ре-пробы (бэклог-строка 74)», а строка **74 ЗАКРЫТА актом `D39.95` (02.08)**: в таблице трекера её нет вовсе (греп по номеру ряда → 0 при 354 рядах), ограничение пало лендингом 112. ⇒ обязательное чтение роли объявляет ЗАПРЕЩЁННЫМ то, что зона делает ежедневно, и этим обесценивает все прочие предупреждения того же файла — формулировка пинга оркестратора №20 от 02.09, не исполненного с тех пор. ⭐ **И вот что здесь дороже самого дефекта: норму против него сформулировал ТОТ ЖЕ акт, который закрыл строку.** `D39.95` записан в реестре с уроком «закрытие строки обязано триггерить греп по её номеру во всех живых доках» — и для строки 74 этот греп не сделан до сих пор, то есть нота не исполнила собственный вывод. ⇒ закрывать ряд надо ОБОИМИ движениями: снять врезку и прогнать греп по номерам закрытых строк по живым докам, иначе класс вернётся. ⚠ Живым из врезки остаётся ДРУГОЕ, и его не потерять: смена весов под тем же слагом (⚠0731) и стохастичность эха по вызову. ⚠ Заведено 17.09 при выносе хроники полигона в архив: по условию владельца (`D39.261` п.2) живое уезжает СТРОКОЙ ТРЕКЕРА прежде своего носителя. `eval/` — чужая зона, рукой не трогаю | полигон | скоро | врезка пере-написана под живое ограничение, и греп по номерам закрытых строк в живых доках даёт 0 | пинг №20 02.09, замер 17.09 | | 486 | ⚠ **МУТАЦИОННЫЙ ХАРНЕСС ЗОНЫ ПЛАТФОРМЫ СЧИТАЕТ ПОИМКОЙ ЛЮБОЕ КРАСНОЕ И НЕ ТРЕБУЕТ ЗЕЛЁНОГО БАЗОВОГО ПРОГОНА — два пункта, каждый превращает число «посадок N, поймано M» в утверждение о другом предмете.** (1) **Нет зелёного базового прогона пакета ДО первой посадки:** пакет, красный по своей причине, отчитается КАЖДОЙ посадкой как о поимке. Норму про это зонный стандарт держит отдельно (`PD-395`), но сам инструмент её не исполняет. (2) **Засчитывается любое `--- FAIL`, а не падение ИМЕННО ожидаемого пина** ⇒ правый вердикт по неправой причине неотличим от поимки — класс `D39.217` п.2в. ⭐ Найдено сессией зоны 17.09 на себе: она написала СВОЙ харнесс, не проверив, что у зоны уже есть `platform/tools/mutate.py`, — то есть завела второй механизм на тот же вопрос, — и, разбирая это, обнаружила, что её собственный критерий был СТРОЖЕ зонного (требовал обоих условий). ⇒ забирать её скрипт в зону НЕ НАДО (два механизма на один вопрос — то, что канон запрещает); надо добавить два пункта в существующий инструмент, это десяток строк. ⚠ Числа кампании пака `PLATFORM_BANK_READOUT` (17 посадок, 17 RED) от этого не шатаются: они сняты строгим критерием, а не зонным | платформа | скоро | `platform/tools/mutate.py` требует зелёного базового прогона и падения названного пина, иначе исход «не измерена» | зона 17.09, приёмка D39.262 | +| 487 | ⚠ **МАЙНЕР ПРОИЗВОДИТ СОСТОЯНИЕ, КОТОРОЕ ЧЕТЫРЕ ЕГО ЖЕ КОММЕНТАРИЯ ОБЪЯВЛЯЮТ НЕВОЗМОЖНЫМ: `status:auto` с НЕПУСТЫМ `dst`.** Движок утверждает «`auto` ⇒ dst нет, строка инертна» в четырёх местах: `backend/internal/miner/miner_emit.go:22`=`status:auto, no dst` · `miner_emit.go:53`=`inert until someone signs it` · `miner_emit.go:274`=`term with no dst stays` · `backend/internal/terminology/terminology.go:693`=`status:auto (inert)`. Но ветка `miner_emit.go:272-273` ставит `st.Dst = props[0].Dst` при `props[0].Via == ""` и статуса НЕ трогает (он остаётся `auto` из `:251`; `draft` выставляется только на `:279` при консолидированном dst) ⇒ рождается пара, которой двухрежимная эмиссия §C2-7 не предусматривает. ⛔ **Пина нет ни одного:** утверждений о паре статус/dst в тестах пакета майнера 0 при контроле «12 функций Test в трёх файлах»; ряда в трекере не было (0 по четырём шаблонам при контроле «майнер» → 12). ⚠ **ЧТО ИЗМЕРЕНО И ЧТО НЕТ, раздельно.** Измерено: состояние достижимо по коду и не запинено; на ПРОВОД оно не уходит — отбор в инжект требует `approved` и непустого dst (`backend/internal/membank/memory.go:1245`, `:442`), то есть денежной утечки здесь НЕТ. НЕ измерено: как такую строку читает ЧЕЛОВЕК в карте подписи — рядом стоит собственное предупреждение движка, что dst без провенанса приглашает владельца прочесть его как уже-канон (`appendProposalNote`). Это и есть вопрос ряда, а не утверждение. ⭐ Найдено 17.09 при разборе строки Д-3 консилиума: сама Д-3 ОТКЛОНЕНА (её адрес указывал в несуществующий путь, а по верному адресу ветка статуса не касается), но проверка её формулировки вскрыла это | бэкенд | скоро | пара статус/dst либо запинена как законная с объяснением, либо `auto` перестаёт получать dst | разбор Д-3, 17.09 |