diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index fed09600..f44c2136 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). Здесь только долг и его диспозиции. -> - **СЧЁТ ОЧЕРЕДИ на 07.09 (вечер) (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **258** строк · зона бэкенд **127** строго / **173** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **117** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 07.09 (вечер) (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **260** строк · зона бэкенд **129** строго / **175** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **119** (перечень — грепом по таблице, рукописный список снят 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; правки — только через оркестратора) @@ -294,3 +294,5 @@ | 354 | ⛔ **ОПЛАЧЕННЫЙ `2xx` С ОБОРВАННЫМ ТЕЛОМ — КЛАСС, СТОИВШИЙ 32 % ЖИВОГО ПРОГОНА, И СТРАНИЦА КВИРКОВ О НЁМ МОЛЧИТ.** Живой прогон 08.09 (10 глав, `committed=$1.259217`): два вызова редактора вернулись `2xx` с нечитаемым JSON и были ОПЛАЧЕНЫ — `$0.407606`, то есть **32 % бюджета прогона**. Движок класс ЗНАЕТ и обрабатывает штатно: `backend/internal/pipeline/disposition.go:79` `FlagDecodeError` — «2xx with an unreadable body — billed, conservatively settled, flagged». ⛔ Но `docs/experiments/00-provider-quirks.md` — страница, которую канон велит читать ПЕРЕД правкой адаптеров и вызовов, — о нём не несёт НИ СТРОКИ: греп по `decode`/`unexpected end of JSON`/«оборван» даёт **0 при 250 строках файла** (контроль: слово `provider` там встречается 3 раза, то есть спрошено существующее). ⇒ следующая сессия, читающая квирки перед платным прогоном, не узнает о поведении, которое съедает треть бюджета. ⚠ Зона — ПОЛИГОН (`docs/experiments/` по зонной таблице), живой сессии полигона нет; строка заведена оркестратором как носитель, писать в файл полигону | полигон | скоро (перед следующим платным прогоном любой зоны) | строка в `00-provider-quirks.md` с частотой, стоимостью и тем, что движок делает с классом | живой прогон 08.09, пак «правда оператору и деньги» | | 355 | **РАЗЛОЖЕНИЕ «ЗА ЧТО ЗАПЛАЧЕНО» ОТНОСИТ КЛАССИФИКАТОР В `superseded`, ПОТОМУ ЧТО БЭНК-РОЛИ ДЕЛЯТ ОДНУ ПОЗИЦИЮ.** Бэнк-роли адресуются синтетическим чанком (глава 0, `chunk_idx` = номер батча), а разложение ключуется `{глава, чанк, стадия}` (`backend/internal/pipeline/paidtail.go:120-123`: `p := pos{u.Chapter, u.ChunkIdx, u.Stage}`, затем `case lastPaid[p] != i` → `SupersededUSD`). Классификаторский батч 0 и терминологический батч 0 занимают ОДНУ позицию `{0,0,terminology}` ⇒ более ранний уезжает в «superseded», то есть в «купил ничего». Улика живого прогона 08.09 — три строки леджера (`0 0 terminology classifier $0.009013` · `0 0 terminology terminologist $0.002775` · `0 1 terminology terminologist $0.001820`) при печатном «the book's TERMINOLOGY $0.004595 (2)», где два — ровно последние. ⚠ На стенде цена копеечная, на боевом `classify_budget_usd: 1.00` доля может быть большой: оператор читает, что классификатор куплен зря, тогда как он куплен и использован. Найдено зонной сессией на прогоне, ею НЕ чинилось — вне её заказа | бэкенд | скоро (до следующего платного прогона, где смотрят разложение) | разведение позиций бэнк-ролей в ключе разложения + пин на три строки леджера | живой прогон 08.09 | | 356 | **КНИГА У СВОЕГО ПОЖИЗНЕННОГО ПОТОЛКА РОЛИ НАВСЕГДА ОСТАЁТСЯ БЕЗ КОНСОЛИДИРОВАННОГО БАНКА, и ни одно сообщение не говорит именно этого.** `store/ledger.go` `RoleSpentUSD` суммирует чекпойнты роли за ВСЮ жизнь книги, предполётный срез сеет `probe := spent` и обрывается на `probe+want > budgetUSD`; при `fits == 0` цикл попыток не запускается вовсе. ⚠ Оператор ПРИ ЭТОМ извещён — `terminologist.go:936` печатает `batches_planned=N batches_running=0 batches_dropped=N spent_usd budget_usd` ДО первого вызова (сверено оркестратором 08.09), поэтому «тихо» здесь неверно, и находка приёмки в этой части ОТКЛОНЕНА доводом зоны. Верен остаток: сообщение говорит про ЭТОТ прогон, а не про то, что книга исчерпала пожизненный бюджет роли и консолидации не получит НИКОГДА, сколько её ни перезапускай. Свойство `budget_usd`, а не фильтра пака «правда оператору и деньги»: тот на решение бюджета не влияет. ⇒ решить, что показывать оператору и владельцу: отдельное сообщение «книга у пожизненного потолка роли», подъём потолка как явный акт, или сознательное молчание с записью | бэкенд | когда-нибудь (гейт: первая книга, упёршаяся в пожизненный потолок роли) | сообщение об исчерпании пожизненного бюджета либо ратифицированное молчание | приёмка `D39.226`, линза «вне карты» | +| 357 | **ПОМЕТКА «БАНК УЖЕ РЕНДЕРИТ ЭТУ ПОВЕРХНОСТЬ» ЕСТЬ ТОЛЬКО В ОДНОЙ ИЗ ТРЁХ ПОВЕРХНОСТЕЙ ПОДПИСИ — а первой владелец читает НЕ её.** Пак `D39.226` довёл пометку `NOT ASKED(the bank already renders this surface and every draft agreed — nothing to decide)` до ТЕКСТОВОГО сайдкара стоп-таблицы, и там она предъявлена исполнением. Остаются две: **(а)** экран стопа на stdout (`cmd/tmctl/render.go`, то, что печатает `renderSignatureStop` первым) о пропущенном кандидате не знает — 0 ссылок на признак, и приёмка предъявила контролем, что этот же рендерер УМЕЕТ печатать пер-строчные пометки (`invented`): пропущенная строка и неотвеченная выглядят одинаково (`方源 — … —` против `花家 — … —`). Это НЕ ложь о решении (решать там действительно нечего), это отсутствующее объяснение на экране, который читают первым. **(б)** машинный сайдкар `BankExportProposal` факта не несёт — но это ОБЪЯВЛЕНО (`mining.go:412`) и упирается в строку **353**, чью секцию заказ пака трогать запрещал. ⇒ (а) — дофикс одной пометки в рендерере; (б) — вместе с первым читателем секции, то есть со строкой 224 | бэкенд | скоро (до первой подписи банка внешним пользователем) | пометка в stdout-рендерере + решение по (б) вместе со строкой 353 | приёмка `D39.226`, линза «вне карты» | +| 358 | **ИТОГ ТРАТ ПРОГОНА ЗАНИЖЕН: `TOTAL (this run)` не включает стоимость классификатора.** `backend/internal/pipeline/waverun.go:218` — замер живого прогона 08.09: сырой леджер даёт `$0.007280`, отчёт печатает `$0.005460`, разница ровно классификаторская. Предсуществующее, паком `D39.226` не вносилось и им не чинилось. ⚠ Класс тот же, что у строки 355: оператор читает о СВОИХ деньгах число, которое не сходится с леджером, и не может этого заметить без второго чтения. ⇒ либо включить, либо назвать в самой строке, что классификатор считается отдельно | бэкенд | скоро (до следующего платного прогона, где смотрят итог) | итог сходится с леджером либо объявляет своё исключение + пин | приёмка `D39.226`, живой прогон 08.09 |