diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 1f0085f9..0596bd13 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -19,7 +19,7 @@ > - **Курс:** этапы ОБЩНОСТЬ · КАЧЕСТВО БАНКА · ПАКЕТ-ЧЕКЕРОВ · ФРОНТ-ЭРА · шов/платформа/движковые блокеры — ПРОЙДЕНЫ (D39.59–123). Хвосты курса живут строками: 16 (полная цена холодного старта; edit-волна на малых прогонах отработала и оплачена — 58 вызовов волновым драйвером 23–25.07 плюс 648 до драйвера, счёт по леджерам `~/books/gu-zhenren/**/*.db`) · coldrun-b фаза C заморожена чекпойнтом легитимно (D39.86; эталон денег/поведения — coldrun-a, read-only); развилка 0731 решена и исполнена (D39.87/91, код `553f1a3`). > - **Горизонт (D39.62/67, освежён D39.95):** **ДОБОР ИДЕАЛА** (первым прогоном: оси голоса 24 · авто-режим · цена 16; остаток арбитража банка = рецензент спорных кластеров при ре-пробе — D39.102). ⚠ **Испр. 05.09 (D39.198 п.5):** прежняя редакция держала здесь ТРИ предусловия, снятых владельцем, — жильцы ролей (149: разморозка ничего не разблокирует, пока идут доработки) · веса K1–K12 (13а: веса не нужны, мерить по узлам) · вне-претрейн чекпоинт (55: прогоняем на тех же текстах, оговорка — ограничение ВЫВОДА, а не требование новой книги) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 62–68, 85) → Ф3 ридер-IDE (69–71). **Стоячие:** ToS-триггер 25.10 · Ш-2 до go1.27 (⚠ + x/text Unicode 17 тем же тулчейном — строка 119, реестр §Б-108 справочника якорей) · платные прогоны разблокированы (проба провода — D39.97, конфиги 112 залендены). > - **Стек (полная карта роль→модель→конфиг→квирки — [STACK.md](STACK.md), D39.126):** draft deepseek-v4-flash thinking-ON `low` **⚠0731** → терминолог (та же модель) → editor deepseek-v4-pro БИЛИНГВ ИНТЕРИМ (топология ПОДТВЕРЖДЕНА при неразличимости жильцов — D39.117; закон-блок ОБЯЗАТЕЛЕН и ВНЕСЁН — D39.104 п.2, вайр-батч принят D39.199; glm-5 резерв; вахта маппинга эффорта pro — §Б-108) → судья gemini (Ф2, в движке НЕ построен — строка 33); канал B Mistral+grok; ~$0.85/ранобэ (D30.4) — ⚠ **ТРИГГЕР ПЕРЕ-КАЛИБРОВКИ СРАБОТАЛ 31.08** (испр. 02.09): платный прогон отработал и дал собственную оценку движка `projected_book_usd = 1.1377277707` на десяти главах при куплённых $0.436110; число D30.4 держать как июльское. ⚠ **Вендор-факты 13–15.08 (пере-пин ИСПОЛНЕН и ПРИНЯТ, D39.137):** таблица цен запинена ПИКОМ (flash 0.44/1.32 · pro 1.32/3.96/кэш-хит 0.044 за 1M; счёт шиппинг-c1 = 100% DeepSeek ⇒ ×4.2–4.4 в пике / ×2.1–2.2 в долине — замер по трём прогонам); ⚠ **испр. 05.09: носители про эффорт `pro` БОЛЬШЕ НЕ ПРОТИВОРЕЧАТ** — и квирки (§3г), и `STACK.md` говорят одно: ручка ДОХОДИТ до модели с вендор-апдейта 13.08. Живой остаток один — вендор-сверка маппинга и ВЕЛИЧИНА эффекта, строка **237**(б); ⚠ ВЕСА pro сменились под тем же слагом (V4-Pro-0813, класс D39.61) — вахта-риг готов (остаток 172); покупки фазы Д на deepseek до 16.08 16:00 UTC — по старым ценам. ⚠ **ВЕСЬ банковый контур (банкнота+терминолог+классификатор) ВКЛЮЧЁН в shipping-c1 с `b8154cd`** — `enabled: true` у обоих гейтов и `classify_types: true`, бюджеты по $1.00 (прежде жил только ран-локальным конфигом книги; строка 140 — ⛔ его единственный вход `mining.contrast_path` в git ОТСУТСТВУЕТ, развёртывание обязано положить артефакт, иначе контур не исполняется вовсе, носитель — строка 251; сверка STACK.md 09.08 — факт шире прежней декларации «одна банкнота»); эскалация в shipping за `budget_usd: 0` (STACK.md §примечания). -> - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 05.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **211** строк · зона бэкенд **106** строго / **143** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **82** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 05.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **212** строк · зона бэкенд **106** строго / **143** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **83** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - Архивы хроники: `archive/PROGRESS-2026-07-04-10.md` (D31) · `-10-13` (D39.6-гигиена) · `-13-25` (стройка паков 11–16, rerun2) · **`-25-31` (паки 17–20 · мини-прогон · полигон-пакеты 5–8 · ToS · холодный прогон; D39.26–58)** · **`-08-01-02` (сессии №9/№10: общность · качество банка · coldrun-b · открытие фронта/платформы; D39.59–90, срез D39.105)** · **`-08-02-04` (сессии №11–№13: ручки эффорта · стандарты · контракт API · платформа P0 · банк-арбитраж; D39.91–105 + снимок шапки эры №15)** · `-08-04-09` (пинги закрытых паков эры №15) · **`-08-14-15` (закрытые бэкенд-записи №16–17: эмиттер шва · migrate · пере-пин DeepSeek; вынесено D39.139)**. Записи ниже — живой хвост (№16+, эра D39.124+; подрезка D39.139). ## 📌 СОСТОЯНИЕ ПАКОВ @@ -350,6 +350,7 @@ | 290 | **ARM 1 нового теста банкноты проходит ВАКУУМНО, если каталог пары переедет — класс `WB41`, названный самой сессией.** Тест вписывает `langpack_root`, но не проверяет, что пак ЗАГРУЗИЛСЯ (`r.pack != nil`). Предъявлено: с несуществующим корнем все три плеча зелёные, а посадка `WB58` (снятие плеча контраста) **ПЕРЕЖИВАЕТ**. То есть красный `WB58` держится не тестом, а наличием каталога на диске. Лечение — посылка о состоянии пака в самом тесте. ⚠ Тот же класс: **тест исчерпаемости флагов слеп ещё на ДВЕ формы** сверх найденной первым верификатором — `var X = FlagReason("…")` на уровне пакета и `const` ВНУТРИ тела функции: обе посадки прошли, ни пол `found < 15`, ни сверка с картой не сработали (объявлено 17, найдено 16, карта 16). Итого форм пять, тест держит две, комментарий обещает «обе» | бэкенд | скоро | посылка о загрузке пака + покрыть или сузить обещание исчерпаемости | верификаторы приёмки 05.09 | | 291 | **ОТКАЗ РЕЗЕРВАЦИИ НА РЕТРАЕ НЕ ДЕГРАДИРУЕТ И НЕ ОСТАВЛЯЕТ СЛЕДА — юнит может заклинить НАВСЕГДА, а волна не может продолжиться без дыры.** `maxTokensForAttempt` удваивает бюджет на каждой регенерации (`backend/internal/pipeline/disposition.go`, греп `maxTokensForAttempt`), так что attempt 1 резервирует вдвое больше attempt 0. Отказ ретрая уходит наверх из цикла попыток (`backend/internal/pipeline/stagerun.go`, греп `return nil, err` в цикле попыток) **РАНЬШЕ `UpsertChunkStatus`** ⇒ чекпойнт attempt 0 есть (реплей за $0), **строки `chunk_status` НЕТ**, читающие модели видят юнит как `pending`, экспорт не отдаёт ничего. **Следствия два.** (1) Если потолок покупки не вмещает attempt 1 — юнит не доделается НИКОГДА: каждый резюм реплеит attempt 0 за $0 и умирает на attempt 1, прогон уходит exit 4 при ПОЛНОСТЬЮ доставленных купленных юнитах. (2) Продолжить волну после отказа ретрая нельзя без ДЫРЫ в непрерывном префиксе — то есть цена глобальной защёлки (недодача юнитов, которые влезали; разброс резервов внутри волны замерен ×2.976) различителем «свежий/ретрай» НЕ снимается. ⚠ **Оркестратор предлагал такой различитель на посылке «ретрай оставляет ФЛАГОВАННЫЙ юнит» — посылка ЛОЖНА, опровергнута зоной по строкам.** **Два пути лечения, ВЫБОР НЕ СДЕЛАН:** (а) отказ ретрая деградирует во флаг attempt 0 — смена `D2.3`, закрывает ОБА следствия; (б) минимальная покупка платформы ≥ `step_max_usd` движка (он включает ретраи именно поэтому) — закрывает только (1) и стоит продукту минимальной покупки ~5 глав | бэкенд+платформа | скоро | выбор владельца между (а) и (б) + пин | бэкенд-сессия денежного стопа 05.09, формулировка зоны | | 292 | ⛔ **ЧЕСТНОСТЬ ТРЁХ СТРОК НАБЛЮДАЕМОСТИ — ЖИВАЯ ПОЛОВИНА (б) ЗАКРЫТОЙ СТРОКИ 105, заведена 05.09 отдельным носителем.** Закрытие 105 сняло только половину (а) — предикат `isBankRole`; половину (б) чинить никто не заказывал, а на неё ссылались ДВА носителя как на «до фикса 105». Три дефекта, все воспроизведены: **(1)** строка `VOICE` берёт `rules=` из конфига ВРЕМЕНИ ОТЧЁТА (`backend/internal/pipeline/quality.go`, греп `rules=`), поэтому включение `gates.voice` ПОСЛЕ прогона печатает «измерено, чисто» для книги, которую никто не мерил; **(2)** та же строка печатается при ВЫКЛЮЧЕННОМ гейте, если `SpoilerLeaks>0` — поведение верное, неверна формулировка отчёта; **(3)** знаменатель `BANKNOTE` = `len(states)` вместе с призрачными строками `retrieval_state`, тогда как соседний агрегатор их фильтрует ⇒ после пере-чанковки покрытие ЗАНИЖАЕТСЯ. ⚠ Цена молчания прямая: отчёт говорит «измерено», когда не мерили, — это ложь читателю в том самом месте, куда смотрят, решая, готова ли книга. Печатает `cmd/tmctl/render.go` (греп `rules=`), пин — `render_observability_test.go`. | бэкенд | скоро | правка формулировки + знаменателя + тест на «включил гейт после прогона» | D39.86, D39.200; археология — `architecture/13-tech-debt-anchors.md` §Б-105 п.(б) | +| 293 | ⛔ **ФАЙЛ ПОД ЛЮБЫМ КАТАЛОГОМ `books/` НЕВИДИМ ДЛЯ GIT — `git status` его не показывает, `git add` молча не берёт, и сдающая зона теряет работу, не заметив.** Предъявлено 05.09 платформенной сессией и проверено оркестратором до лендинга: `git check-ignore -v platform/internal/books/counter_test.go` → `/info/exclude:9:books`. **Причина: правило `books` в `.git/info/exclude` НЕЯКОРЕНО**, а gitignore без ведущего `/` ловит каталог с этим именем на ЛЮБОЙ глубине. ⚠ Неякорность ОСМЫСЛЕННА и снимать её нельзя не думая: `books` в связанном рабочем дереве — СИМЛИНК, а трекнутое правило `/books/` матчит только каталоги (комментарий стоит там же). ⚠ **Почему это не поймал никто:** тронутые файлы того же каталога в `git status` ВИДНЫ (игнор действует лишь на неотслеживаемое), поэтому пропажа не читается глазами; а `git commit -- <путь>` untracked роняет и без игнора. Замер: без `git add -f` уехал бы 31 файл из 32. **Лечение — не «поправить exclude»:** файл ОБЩИЙ для всех рабочих деревьев клона, включая полигонное, и менять семантику игнора под живыми сессиями нельзя. Формы, между которыми выбирать: (а) якорить правило под КОНКРЕТНЫЙ симлинк (`/books` в корне дерева) и проверить, что симлинк по-прежнему игнорируется во ВСЕХ деревьях; (б) оставить как есть и завести проверку лендинга — `git status --ignored --short <зона>` перед каждым актом. | оркестратор | скоро (гигиена лендинга, $0) | выбор формы + проверка во всех воркtree | предъявлено платформенной сессией 05.09; проверено исполнением при лендинге `7e2226a` | *(Указатели на архив-слайсы хроники — бюллетенем «Архивы хроники» в CURRENT-STATE; здесь копий нет.)*