diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 1c739395..66de0906 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). Здесь только долг и его диспозиции. -> - **СЧЁТ ОЧЕРЕДИ на 08.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **263** строк · зона бэкенд **125** строго / **172** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 1** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **118** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 08.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **266** строк · зона бэкенд **128** строго / **175** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 2** (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; правки — только через оркестратора) @@ -299,3 +299,6 @@ | 368 | **ОПЕРАТОРСКИЙ ЭКРАН ЗАНИЖАЕТ ОЦЕНОЧНЫЕ ТОКЕНЫ В 5 РАЗ.** `est_tokens` в `request_log` считается `r.estOutTokens(ch.Text)` по фертильности видимого перевода, а у DeepSeek размышление сидит ВНУТРИ `completion_tokens` ⇒ на строках `decode_error` стоит 2887/2854/3162, тогда как соседние попытки тех же чанков реально дали **16 000** (`finish=length`). Занижение **5.0–5.6×**. Читатель — `cmd/tmctl/render.go` («estimated-cost rows: N … ~M est. output tok»): оператор видит впятеро меньше правды. ⚠ В `cost_usd` это число НЕ входит — деньги считаются грантом, — то есть врёт легенда, а не счёт; но врёт она ровно тому, кто по ней решает, продолжать ли платить. Класс «прибор отвечает на свой вопрос» (`D39.202`). Находка консилиума с чистым Fable 5, 08.09 | бэкенд | скоро | легенда считает то же, что считает счёт, либо честно говорит, чего не знает | консилиум по строке 360, 08.09 | | 369 | ⛔ **ОСЬ ЭСКАЛАЦИИ D2 СЕГОДНЯ ФИКТИВНА: БРОНИРУЕТСЯ 32 000 ТОКЕНОВ, ДОСТИЖИМО ~19 400.** Реген удваивает `max_tokens` 16 000 → 32 000 и НЕ трогает время, а `attempt_s: 240` при 70–90 tok/s даёт потолок **17–21 тыс. токенов**. Замер по 20 регенам трёх DeepSeek-армов (`docs/experiments/23-editor-tier.md` + леджеры `probe-4axes/arms/`): доставлено первой попыткой 17, обрезано 3; максимум, когда-либо доставленный регеном — **19 354 = 60 % гранта**; **13 доставок из 17 уложились бы в ИСХОДНЫЙ грант 16 000** ⇒ реген «срабатывает» пере-броском длины размышления, а не бо́льшим бюджетом. ⚠ Цена не только в обрывах: резервация бронирует полные 32 000 ($0.127 выхода) при досягаемых ~$0.08 — фикция съедает headroom под книжным потолком. ⇒ дедлайн от бюджета (строка **360**) — не подкрутка таймаута, а то, что делает эту ось настоящей; закрывать вместе с ней. Категорика, которая держится: реген не может использовать верхние ~40 % выданного, и всякий, кому эскалация РЕАЛЬНО нужна, обрезается по построению | бэкенд | скоро | эскалация досягаема по времени либо не бронирует недостижимое | консилиум по строке 360, 08.09 | | 370 | **Anthropic-адаптер не несёт капа ретраев, который есть у общего транспорта.** `backend/internal/llm/provider_anthropic.go` возвращает `BilledDecodeError` с `retryable=true` без ограничителя `billedDecodeSeen`, который стоит в `httpllm.go` — то есть на этом адаптере оплаченный 2xx может повториться до `max_attempts`, а не один раз. ⚠ **Боевой цены сегодня НОЛЬ:** поверхность deprecated, Anthropic убран из стека 04.07, вызовов по этому пути в прогонах нет. ⇒ сознательно вынесено ИЗ пака «вызов, который оборвали мы» (строка 360) по доводу ревью: пак получил бы тесты и мутации на мёртвую поверхность. Чинить при воскрешении адаптера — тогда же и проверять, применим ли к нему признак доставки | бэкенд | когда-нибудь | адаптер получает тот же кап ЛИБО удалён вместе с поверхностью | ревью пака «вызов, который оборвали мы», 08.09 | +| 371 | ⛔ **`WroteRequest` НЕ ДОКАЗЫВАЕТ, ЧТО ПРОВАЙДЕР ПРИНЯЛ ЗАПРОС — и ошибка идёт в сторону ПЕРЕПЛАТЫ ЧИТАТЕЛЯ, единственную, которую `D39.196` п.2а называет недопустимой.** Признак доставки, на котором стоит вся денежная граница пака «вызов, который оборвали мы» (строка **360**), срабатывает, когда байты ушли в НАШ сокет, а не когда их прочитал провайдер. Замер движковой сессии 08.09 (25 прогонов, два независимых серверных счётчика): **3 из 25 списывают оценку за вызов, которого не было** — `elapsed=0s`, `bytes_read=0`. ⚠ Отдельно замерено, что расширение признака заставляет платить и за ОТКАЗЫ: 22 из 25, на боевом пути **$0.80 за запрос, который провайдер отклонил** (эту половину сессия ПОЧИНИЛА, остаётся первая). ⛔ Чинится порогом по времени жизни вызова — а порог по латентности пак ЗАПРЕЩАЕТ, и строка **331** требует ЗАМЕРЕННОГО порога, не назначенного. ⇒ **вопрос владельцу, один: платить ли за вызов, чьи байты ушли в сокет, но провайдер их не прочитал.** До ответа класс живёт с известной переплатой | бэкенд | блокер-очереди для решения о деньгах (кода не блокирует) | порог замерен ЛИБО признак различает «ушло в сокет» и «прочитано» иначе | сдача пака «вызов, который оборвали мы» 08.09 | +| 372 | **СТРАЖ ОТМЕНЫ ГЛОТАЕТ НАСТОЯЩУЮ ДЕНЕЖНУЮ ОСТАНОВКУ, когда прогон отменил не человек, а упавший сосед.** Платформа получит `failed` вместо `paused`, а книга без денег упрётся в потолок на ПЕРВОЙ резервации следующего прогона. Сессия стража оставила и была права: ратифицированный комментарий ветки `waitAborted` требует ровно этого для ОБОИХ случаев. ⇒ предмет не движковый, а **продуктовое решение о шве**: должна ли платформа отличать «остановлено человеком» от «остановлено падением соседа» | бэкенд | скоро | шов различает две отмены ЛИБО объявлено, что не различает, с ценой | сдача пака «вызов, который оборвали мы» 08.09 | +| 373 | **НА HTTP/2 НАШ ДЕДЛАЙН ИНЕРТЕН, если тело запроса больше окна пира, а провайдер отвечает ранним 2xx, не дочитав его.** Замер движковой сессии: вызов длится столько, сколько держит сервер — **4 с и 8 с при дедлайне 700 мс**, — и всё уезжает в `decode_error`, ту самую дверь, которую пак 360 объявил закрытой. Механизм: запись паркуется в `awaitFlowControl` на `sync.Cond`, которую контекст НЕ будит. ⚠ Дыра ПРЕДШЕСТВУЕТ паку и требует пирa, отвечающего не дочитав тело (НЕ форма DeepSeek). Лечится `http2.Transport.WriteByteTimeout`, но его значение — НОВЫЙ порог, а пороги назначать нельзя | бэкенд | когда-нибудь | дедлайн действует и на записи тела ЛИБО класс объявлен недостижимым с замером | сдача пака «вызов, который оборвали мы» 08.09 |