453 lines
204 KiB
Markdown
453 lines
204 KiB
Markdown
# Журнал прогресса
|
||
|
||
> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-15, голова D39.133 — передача №16→№17; приёмки S3.6/S3.7 — D39.127/129, приёмка P5 — D39.130, приёмка эмиттера — D39.131, приёмка P6+дофикс — D39.132). Оркестраторов ДВА (решение владельца 07.08): этот — движок/платформа/фронт/доки; параллельный (РОЛЬЮ, без номера — счётчик один, D39.112 п.6) — приёмка полигона. Одновременно не запускаются; CURRENT-STATE ведут оба, чужие строки не трогают. Норма изоляции панелей после инцидента отката чужих файлов — D39.113, гардрейлы в CLAUDE.md.
|
||
> - **Эра №15 закрыта — семь приёмок, все ПРИНЯТЫ и залендены**; лента, коммиты и разборы — D39.109–123 (D-лог) и реестр нот `architecture/05-decisions-index.md`; снимок прежних бюллетеней этой шапки — архив-слайс `-08-02-04`.
|
||
> - **ЖИВОЕ:** полигон эксп-22/23 — дерево ЗАЛЕНДЕНО 10.08 с ревью-шапками приёмки №16 (числа подтверждены независимым пересчётом; **выводы НЕ ратифицированы** — владелец 10.08 признал постановку неполной), **фаза Д ИДЁТ (заказ 10.08)**: промт `docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md` (staged полигоном), потолок фазы $4.50 словом владельца (ход — секция «Полигон» ниже); при ратификации фазы Д в D-ноту: декой-правило + обязательный кросс-семейный опровергатель приёмки (одобрены владельцем 10.08) · фронт: S3.5–S3.7 ИСПОЛНЕНЫ и ПРИНЯТЫ (D39.127/D39.129, лендинги `57e6bd1`/`3e465bd`), контракт **0.2.2** в каноне, i18n-механизм построен (ПТ-36 🔶) — **гейт S4 ПАЛ (P5 принят D39.130): S4-промт по слову владельца** (вход: экраны библиотеки/загрузки на живом `POST /books` · находки приёмки S3.7 · спек-правка 0.2.3) · **платформа P5 ИСПОЛНЕНА и ПРИНЯТА в три раунда (D39.130, `69d485a`)**: интейк книг `POST /books` с сентинелом хранилища · стоп/резюм с намерением в Postgres · Prometheus · Go-floor 1.26.6; развилка `book.yaml`: бета = форма Б (стройка следующим касанием зоны), движковая форма = строка 170 · **эмиттер ИСПОЛНЕН и ПРИНЯТ (D39.131, `9cfe080`, дофикс до лендинга)**: `events.jsonl` (StreamVersion 1.1) + exit 4 потолок / 5 graceful / полоса отказов 10–19 + пер-вызовный репэйр-гейт; строки 103/135/165/102 закрыты; движковая половина PD-113/PD-196 построена D39.131 · **платформа P6 + дофикс ИСПОЛНЕНЫ и ПРИНЯТЫ (D39.132)**: потребительская половина шва (exit-коды одним словарём, `unit_done` присваиванием, scope потолка, TM_TRACE_ID против усыновления) + интейк формы Б + дев-стенд с сидом — **PD-113/PD-196 ЗАКРЫТЫ, шов закрыт с обеих сторон, major в регистре платформы 0**; деплой-порядок против деадлока v15 записан и исполним (`tmplatformctl books --migratable`), сам `tmctl migrate` — дерево бэкенда ЖДЁТ ПРИЁМКИ (строки 174/175 закрываются ею; exit 13 ратифицирован направлением) · эскроу (136) — следующим денежным промтом (П-18).
|
||
> - **Открыто на владельце:** Приложение А контракта (148: реконструкция с баннером или заново) · продуктовое слово «остановлена: лимиты» (В-3) · К-13/Ф-31 (paused_reason один — «свой потолок» и «нет кредита» неразличимы) · В-4/Ф-30 (глава без заголовка) · фри-тир PD-104 (ноль на бете против автогранта $5 с суточным потолком) · порог 116 · мини-проба флора 44 (одобрена, промт не выдан) · подпись денежного шага 46 · лист В-3+К-6 · авто-резюм paused (вопрос платформы) · приёмка S4 фронта (бежит) и бэкенд-migrate (дерево ждёт — закрывает 174/175) · **строка 172: цены DeepSeek ×2.3–4.7 с 16.08 — СТОП-решение и пере-пин, носителя-промта нет** · **СТОП ja-оси фазы Д** (гардрейл 18+ на `isekai_majutsushi_jp`, 3 чанка из 184: выбросить помеченное или сменить книгу) · **возражение Sol по проходу `tier` эксп-23** (пере-судить починенным ригом или оставить с записанным возражением — PROGRESS «Полигон») · ~~поле `title` в `BookIntake`~~ РЕШЕНО 14.08: ратифицировано в 0.2.3 (замечание 12 S3.5, владелец подтвердил; исполняет S4) · фронт-вопросы зонного журнала: В-7 (плотность интерфейса; держит и Ф-54 — обрезку центра на зуме) · В-8 (слово состояния в дереве) · **В-9 (какие языки интерфейса обещает продукт — механизм готов, ПТ-36)** · Ф-38 (вкладка «Замечания») · граница ПТ-33 для добавочных полей `BankTerm` (черновик S3.5/S3.6, D39.127 п.2б).
|
||
> - **Сделано (сводно)** — снимок ленты закрытых эр в [archive/PROGRESS-2026-08-04-09.md](archive/PROGRESS-2026-08-04-09.md); детали — D-лог и слайсы.
|
||
> - **Курс:** ОБЩНОСТЬ ✅ → КАЧЕСТВО БАНКА ✅ → ПАКЕТ-ЧЕКЕРОВ ✅ (D39.59–78) → **ФРОНТ-ЭРА** (D39.81–100: зоны живые, контракт API ратифицирован) → **шов/платформа/движковые блокеры построены** (D39.106–123). Хвосты курса живут строками: 16 (edit-волна не гонялась НИ РАЗУ — держит и оси голоса 13б/24) · 46 (дизайн заморожен D39.92/93, промт ждёт выдачи) · coldrun-b фаза C заморожена чекпойнтом легитимно (D39.86; эталон денег/поведения — coldrun-a, read-only); развилка 0731 решена и исполнена (D39.87/91, код `553f1a3`).
|
||
> - **Горизонт (D39.62/67, освежён D39.95):** **ДОБОР ИДЕАЛА** (первым прогоном: оси голоса 24 · авто-режим · цена 16; жильцы ролей решаются ДО прогона эксп-22 — строка 149 · веса K1–K12 13а · вне-претрейн чекпоинт 55; остаток арбитража банка = рецензент спорных кластеров при ре-пробе 74 — D39.102) → ВТОРАЯ ПАРА живьём (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; закон-блок ОБЯЗАТЕЛЕН — строка 134; glm-5 резерв; вахта маппинга эффорта pro — §Б-108) → судья gemini (Ф2, в движке НЕ построен — строка 33); канал B Mistral+grok; ~$0.85/ранобэ (D30.4, пере-калибровка при следующем платном прогоне). ⚠ **Вендор-факты 13.08 (сняты 14.08, строка 172):** цены deepseek с 16.08 16:00 UTC ×2.3–4.7 (пик/офф-пик; пик 01–04·06–10 UTC), у pro эффорт стал настраиваемым low/high/max (квирк 3а устарел — вахта §Б-108 сработала); покупки фазы Д на deepseek до 16.08 идут по старым ценам. ⚠ **ВЕСЬ банковый контур (банкнота+терминолог+классификатор) в shipping-c1 НЕ включён** — жив ран-локальным конфигом книги (строка 140; сверка STACK.md 09.08 — факт шире прежней декларации «одна банкнота»); эскалация в shipping за `budget_usd: 0` (STACK.md §примечания).
|
||
> - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 15.08 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **137** строк · зона бэкенд **68** строго / **93** широко (169 пере-зонирована 14.08: движковая половина построена D39.122; 175 заведена 14.08; 176 заведена 15.08 — паника движка = exit 2, PD-212) (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0**, платные прогоны разблокированы · «скоро» **31** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строки эксп-22: 55·153 (плюс 150 — руки владельца); строка 5 — остаток гейчен ре-пробой 74 (D39.102 п.2); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже).
|
||
> - Архивы хроники: `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)**. Записи ниже — живой хвост (№14+, эра D39.106+).
|
||
|
||
## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора)
|
||
|
||
Закрытые строки здесь НЕ хранятся — они уходят в D-лог с номером решения. **ID строки стабилен навсегда** (не перенумеровывается и не переиспользуется — на «строку N» ссылаются доки и промты, D39.80). Вес: «блокер-очереди» = мешает текущему шагу · «скоро» = ближайшие 1–2 касания · «когда-нибудь» = записано, не потеряно. Длинная строка начинается жирным лидом — таблица сканируется по лидам; «диспозиция сверху, археология вниз», ячейка >800 байт — кандидат на выселение в `architecture/13-tech-debt-anchors.md` (D39.125 п.3/D39.126). ⚠ **Счёт очереди — НИЖНЯЯ граница долга, а не потолок:** трекер содержит только замеченное, и 02.08 дважды за $0 свежие глаза вытащили из кода дефекты, которых в нём не было (релей фронта → строки 99/100/102; приёмочное ревью → третий шов в 104 и честность в 105); ленту ✅ шапки читать как «долга нет» неверно (D39.89). **Зонные бэклоги (решение владельца 02.08, D39.84):** фронт и платформа ведут СВОИ бэклоги (`frontend/docs/BACKLOG.md` · `platform/BACKLOG.md`) — их строки сюда НЕ заходят; здесь движок/полигон/доки, включая движковые стыки фронта (зона «бэкенд», как 99–102); строки 96/97 переехали в платформенный (П-1/П-2), надгробия-указатели сохранены.
|
||
|
||
| ID | Хвост (одной фразой) | Зона | Вес | Чем закрывается | Источник |
|
||
|---|---|---|---|---|---|
|
||
| **— ВИСИТ НА ВЛАДЕЛЬЦЕ —** | | | | | |
|
||
| 2 | Четыре вопроса границы «алгоритмического идеала» (Annotator · семантический судья · ja→ru §B5 · ru-target до/после) | владелец | скоро (гейт «добора идеала» перед МАСШТАБОМ) | отдельное решение | D39.33, D39.38 |
|
||
| 4 | **Ре-чек ToS по триггерам** — первый ИСПОЛНЕН 31.07, дельт вердиктов нет (D39.57); предмет Google-мониторинга перевешен на цепочку договора (PUP · Additional ToS · Google APIs ToS); следующие: квартал 25.10.2026 · первая лейблованная книга · любая правка `accepts_labels` | владелец/полигон | скоро (следующий триггер 25.10.2026) | отдельное решение (правило) | D39.32, D39.57 |
|
||
| 5 | **Арбитраж банка: замер ИСПОЛНЕН и ПРИНЯТ (research/24, D39.102).** Закрыто классом: равноправный совет · кросс-модельные веса уверенности · self-consistency · селекция из вариантов · отказ-сигнал ⟦TM-NO-DST⟧; Q2 отвечен — семейства не окупаются (C3−SC=+3 и все три добычи = один кластер; glm-соло 25/45 > совет 23/45). **ОСТАТОК СТРОКИ:** рецензент-другого-семейства ТОЛЬКО на спорных КЛАСТЕРАХ (слот при ре-пробе 74), роутинг целыми family/series-юнитами (G4), эмиссия рецензента — та же draft/⟨проверить⟩. История захода — D39.89/90/101/102 | полигон/ресёрч | **ОСТАТОК ГЕЙЧЕН ре-пробой 74** (D39.102 п.2) | замер (остаток) → решение | D39.89, **D39.102** |
|
||
| 6 | **Строка Gemini в `accepts_labels`** — ждёт слова владельца о подписи интерпретации сужения как разрешения; ре-чек 31.07 понизил приоритет: подпись даёт ПРАВО, но не судью 18+ (фильтр неконфигурируем D22.6 + обход запрещён договором) — возвращаться при вопросе, требующем именно права | владелец | когда-нибудь | отдельное решение | D39.32, D39.57 |
|
||
| 7 | Q2 «редактор под `sexually-explicit`» (grok-4.3 интерим · glm-5 после сверки ToS Z.AI · mistral вон) | владелец | когда-нибудь (перед первой explicit-книгой) | отдельное решение | D39.27 п.7 |
|
||
| 8 | D22.7 пер-чанковый L3-скрин — неснятое предусловие первой erotica-книги в проде, отдельный гейт | владелец | когда-нибудь | отдельное решение | D22.7, CURRENT-STATE (оркестратор) |
|
||
| 9 | Промпт-слой под лейблом: лейбл не доезжает до промпта — должны ли переводчик/редактор знать о свойстве контента | владелец | когда-нибудь | отдельное решение | CURRENT-STATE (владелец, из пака-17) |
|
||
| 10 | Дата создания аккаунта OpenAI (низкий приоритет, OpenAI вне цепочки) + применимость OpenAI Sharing & publication policy 2022 (quirks:128) | владелец | когда-нибудь | отдельное решение | D39.32 |
|
||
| 11 | Флип coverage-гейта (`enabled:false`, D12-Q4) — за подписью владельца ; при флипе решить судьбу v1.1 quote-absorption (D12-Q1, Python-first лок-степ) | владелец | когда-нибудь | отдельное решение | D39.34(2) |
|
||
| 12 | **`postcheck_gate` в hard-gate** — требует пере-замера recall (recall чекеров измерен и низок); ⚠ «fn=0» демоции #10 класс-вакуумен на labels (ноль одно-Han-позитивов, D39.78) — пере-замер обязан добрать одно-Han-позитивы, на «fn=0» не опираться; одно-Han-класс при gate-on вне гейта (Unverified+Demoted); тем же решением строится HARD-value-детектор 成/万 (Q3 §6 — честный hard-gate требует value-чека; либо раньше при ненулевом потоке value-дефектов добора, D39.79; **$0-прототип получен эксп-21: `battery.check_numbers`, симметричный разбор, синтетика 16/16 — D39.117**) · recall существующих гейтов печатал арм C эксп-21 на контаминированном срезе (D39.108/D39.117) | владелец | когда-нибудь (после фазы 2) | отдельное решение | D39.34(2), D24.4+D28.1, D39.39, D39.78, D39.79 |
|
||
| 13 | **Включение платной петли ремонта + per-class исходы ремонта** (схемное решение принимается вместе) — вернуться при расширении классов детекторов и ненулевом остатке; ⚠ при включении: репэйр-гард №5 после #10 слеп на одно-Han-дифференциал (демоция в обоих прогонах ⇒ 0>0 — репэйр, стёрший верно отрендеренный одно-Han-термин, не ветируется; D39.78-ревью) | владелец | когда-нибудь | отдельное решение | D39.38, D39.39(а), D39.78, CURRENT-STATE |
|
||
| 13а | Веса рубрики K1–K12 не выбраны (Q1: «по данным фазы B»; фаза B прошла на BWS без весов — выбор нужен к агрегатной приёмке качества книги) | владелец | когда-нибудь (к пилоту) | Ф2.5 / отдельное решение | D39.44 Q1, D39.46 |
|
||
| 13б | **`speech-cue.txt` zh НЕ шипить до замера голос-флаггера; замера НЕТ (D39.86): флаггер живёт на ФИНАЛЬНОЙ волне, редакторская волна не гонялась ⇒ оси не считались НИ РАЗУ.** Гейт: первый прогон добора идеала С редакторской волной (строка 24) → решение владельца о шипе. ⚠ `rules=` в отчёте = «гейт СКОНФИГУРИРОВАН», не «отработал» — до фикса 105 читать по знаменателям `replies=`. Археология дословно — `architecture/13-tech-debt-anchors.md` §Б-13б | владелец | отложено-до-замера | первый прогон добора идеала С РЕДАКТОРСКОЙ ВОЛНОЙ (оси голоса, строка 24) → отдельное решение | D39.56, PACK19_BUILD §7.2, чат 31.07, D39.86 |
|
||
| 14 | **Четыре data-инженерных флага фазы-2 общности, каждый с рекомендованным дизайном** (§5 отчёта): ё-фолд → target-данные (`char_fold`; смена сигнатуры core-примитива через вердикт-несущий банк, сдвиг `memory_version`) · segmentation-фолбэк громким (ломает контракт corridor-фолбэка `pipeline.go:839-848` + голден-фикстура на нём; лечение — объявить блок в голден-yaml) · `Fertility` per-script map (калибровка ждёт боевого токенизатора) · `source-encoding.txt` + Go-реестр декодеров | владелец | когда-нибудь (следующий пак общности) | отдельное решение | D39.64, GENERALITY_PHASE2 §5.1–5.4 |
|
||
| 86 | **Мелкие открытые решения одним списком** (свип D39.66): echo-семантика дропнутого c-lite-члена (D39.18 — оставить pre-c-lite?) · magnitude-кап тяжёлой CJK-утечки (D38.3 п.4в; сейчас strip+flag) | владелец | когда-нибудь | отдельные решения | D39.66, D39.69(feed_cap закрыт §1) |
|
||
| **— ХВОСТЫ ХОЛОДНОГО ПРОГОНА (исполнен достаточно, D39.58; Р7 владельца) —** | | | | | |
|
||
| 16 | Полная цена холодного старта: edit-волна не гонялась (Р7); измерено всё ДО редактуры (драфт+банкнота $0.0247/волна · терминолог $0.006–0.013/проход). ⚠ **Прогон НЕ НАЧАТ и закрыт владельцем как неуспешный на этом этапе (02.08, D39.90)** — деньги фазы C не тронуты ($0). Свежие числа с пробы `bank-low` (10 глав, `low` на черновике И на бэнк-ролях): черновая волна 20/20 ok — $0.031639 flash + $0.010350 pro · терминолог $0.005750 · классификатор $0.004286 · **весь заход $0.045095**, леджер ≡ независимому пересчёту до нуля. Редакторская волна по-прежнему НЕ гонялась ⇒ строка жива, и она же держит оси голоса (13б/24) | бэкенд | когда-нибудь (первый прогон добора идеала — после решения по 46) | добор идеала | D39.58, **D39.90** |
|
||
| 18 | **Эмиссия головы 蛊**: сид-половина = чек-лист (определяющий терм книги сидится `allow_short`, D39.50); эмиссия-КАНАЛ демотирован до ИЗМЕР-ГЕЙТА (Q7): полигон-замер «меняет ли эмиссия головы рендер композитов» — строить ТОЛЬКО по эффекту и ПОСЛЕ #10 (однознаковый пост-чек чинится чекер-паком); перед стройкой резолвить K-гейт и KWIC-грязь одиночной головы | полигон → бэкенд | скоро (санкция Q7 D39.70 — после #10, очередью с ре-пробой) | полигон-замер → решение | D39.58, D39.60, D39.69 |
|
||
| 24 | **Остаток: авто-режим флага** (проект Б не гонялся) · оси голоса A–D (профили не подписаны; черновик готов — `coldrun-a/SIGN-PACKAGE.md` §3) ; + слот инъекции голоса и решение gates.voice при ненулевых осях (D39.55/D21 п.2) · слой-2 voice не строим до доказательства слоя-1 · сверить until_ch 白凝冰 при курации сида (D19.3в) | бэкенд | когда-нибудь (первый прогон добора идеала) | добор идеала | D39.40, D39.58 |
|
||
| **— ТЕКУЩАЯ ОЧЕРЕДЬ (D39.59) —** | | | | | |
|
||
| 78 | **Леджер денег = НИЖНЯЯ граница**: «2xx body decode failed (call IS billed)» — провайдер списал, исходная попытка в `request_log` НЕ попадает (≤$0.009/сессия); дизайн фикса ГОТОВ (GENERALITY_PHASE2 §5.6: `BilledDecodeFails` + per-billed-attempt settle с `Estimated=true`), но это money/ledger-путь — не $0-хастл. **Живое число (D39.86):** на ре-пробе 74 — 3 таких вызова на 14, неизвестность **$0.015111** при леджере $0.114378 (13% захода); движок засеттлил оценку и честно напечатал `estimated-cost rows: 3` ⇒ канал ВИДЕН, но `decode_error` при этом ещё и терминален (не retryable, не escalatable) — 3 из 7 терминальных флагов пробы A | бэкенд | когда-нибудь (money-паком) | отдельное решение (дизайн §5.6) | D39.61, D39.64, D39.86 |
|
||
| 79 | **Граница ПЛОТНОСТИ письма для серий**: `enabled` через Go-константу `cjkScriptNames` — новый плотный скрипт требует правки Go (head-finality уже в данных script-series.txt; пре-существующая граница, D39.75). Первые два компонента строки (isCyrLetter→`isTargetWordLetter` · magnitude `SourceScripts`-гейт) исполнены пакетом-чекеров, D39.78 | бэкенд | когда-нибудь | следующий пак общности / касание чекеров | D39.64, D39.78 |
|
||
| 90 | **Ф2-кандидаты 02-mvp-плана без носителя** (свип-хвост, D39.73): CometKiwi/T-index метрики судьи · Batch API судьи (экономия) · llama-server-интеграция локали · стриминг — взять/закрыть при пилот-препе; + H16 самоулучшение (V3-п.2, ПТ-26): дизайн петли по данным судьи — тем же препом | полигон/бэкенд | когда-нибудь (Ф2.5) | пилот-преп-промт (с 85) | 02-mvp-plan, D39.66, D39.73, D39.80 |
|
||
| **— НАХОДКИ СВИПА ПОЛНОТЫ (D39.66: 951 обязательство проверено, потери возвращены в трекер) —** | | | | | |
|
||
| 80 | **Резюме-слой памяти** — проза-суммарайзер ЗАКРЫТ (D39.69); строка = ГЕЙТ ПИЛОТА Ф2.5: первый деливерабл пилота — «допускает ли автономная нарратив-состояние-строка ДЕТЕРМИНИРОВАННЫЙ верификатор (source-anchored) — или это D1-компаундинг со схемой»; не-покрытые классы (source-anchored reveal · арк-колбэки без ключа) реальны, но не измерены как дефект | Ф2.5 (Q3 подтверждён D39.70) | когда-нибудь (пилот) | Ф2.5 пре-рег | D25 п.8–9, D39.66, D39.69 |
|
||
| 81 | **ja-преп B6-ja (сужено пост-сверкой D39.66)**: Поливанов-валидатор (`translit_policy` = «Phase 2»-заглушка, migrate.go:186/194) + kana-омограф POS/known-word гейтинг / B6-токенизатор (memory.go:1048); чек-лист kana-алиасов сида УЖЕ построен (backend/README §ja + `AttachRubyAliasesToManual`) — остаток в нём только дизамбигуация двойных чтений (тот же B6) | бэкенд | когда-нибудь (перед ja→ru) | ja→ru-пак (рядом 35) | D16.4, D17.1, D18, D39.66 |
|
||
| 82 | **Морфо-гейт РОДА** (C3: русский глагол прош. вр. при gender=hidden = механический спойлер-канал; «жалоба №1 читателей MTL»; python-сайдкар/pymorphy, связка с морфопроходом Decl из 73). **$0-прототип получен эксп-21** (`battery.check_gender`: карточки из подписанного сида, фильтр по именительному падежу, 86–112 сверок/арм — D39.117); движковый гейт не построен | бэкенд | когда-нибудь (Ф2-гейты) | отдельный пак (с 52) | 06-реестр C3, research/12, D39.66, **D39.117** |
|
||
| 85 | **Пилот-преп добор** (к переупаковке PACKAGE4): Bertalign GOLD-пары + zh→ru spot-check (D29.2в; GPL-тулинг отдельно) · fidelity-каскад R2 shadow с корпус-подготовкой (D25.2) · exp08 v3 пере-съём COGS до фиксации budget_usd (D21.8) | полигон | когда-нибудь (Ф2.5) | пилот-преп-промт | D25, D29, D21.8, D39.66 |
|
||
| **— ПАК-21 «чекеры»: РАСТВОРЁН (D39.62); шестёрка исполнена 2/6 фазой 2 (D39.64: #11 · строка 26), остаток — ниже —** | | | | | |
|
||
| 93 | **Остатки строки 93 после пачки (D39.82):** строгий OffLanguage (36а, deferred D39.78) · 分之-разметка прежде стройки DC2 word↔word (полигон) · F4-хвост: `redrive --dry-run` обходит pre-flight, а `store.Open` мутирует SPOF-файл (миграции + recoverReservations; коммент «mutates nothing» неверен) — pre-flight и на dry-run при существующей БД либо read-only план; заодно stat-скип точной формой `fs.ErrNotExist`. ⚠ **Остаток НЕ однороден по гейту (сверка 02.08):** F4-хвост и строгий OffLanguage свободны, а `分之`-часть ГЕЙЧЕНА полигон-разметкой среза («строить вслепую против мандата» — якорь техдолга) ⇒ не подавать строку как «малое касание без гейта» | бэкенд/полигон | когда-нибудь | малое касание / полигон-слот | D39.78, D39.82 |
|
||
| 98 | **DC7 грейд-консистентность — пере-гейчен по сид-покрытию (D39.82):** замер пачки реален (25 юнитов/93 «разряд» ≠ канон «класс» на labels-финалах), НО финалы — прогоны до/вне сид-v2-канона, а грейды 甲/乙/丙/丁等 теперь approved-записи сида с decl-формами: mempostcheck флагнёт «разряд» промахом dst; строить DC7 только если ОСТАТОК девиаций переживёт сид-покрытие — замер на первом СИДОВОМ прогоне добора идеала; дом канона при стройке = book.yaml (как register_blocklist; ратифицировано D39.82 — НЕ dc-checkers.txt, посылка D39.79 исправлена) | бэкенд | когда-нибудь (гейт: первый сидовый прогон добора идеала) | замер остатка → решение | D39.79, D39.82, SMALLPACK §5-E1 |
|
||
| 28 | Банк-линт латиницы в dst или строгая форма языкового предиката (7 строк утечки алфавита проходят экран) | бэкенд | когда-нибудь (добор идеала — носитель «свежий мини-прогон» растворён D39.67, актуализация D39.79) | касание чекеров при данных добора (помнить оговорку 36а: «甲等 → класс Цзя» строгой формой не ловится) | D39.52, D39.62, D39.64, D39.79 |
|
||
| 28а | **Prompt-injection-проба входного текста** ($0): сепаратор ⟦TM-BANK-v1⟧ и якорь-подобные маркеры В ТЕКСТЕ КНИГИ — поведение среза/парсера/инъекции (книга = недоверенные данные; инструментов у моделей нет, но канал банкноты читает вывод по маркеру) | бэкенд/полигон | когда-нибудь | малая проба | сводка-ревью 26.07 |
|
||
| **— СВИП ГИПОТЕЗ —** | | | | | |
|
||
| 30а | **Перерисовка puml-диаграмм под пост-пак-20 пайплайн** (терминолог, банкнота отдельным файлом); дом диаграмм теперь `backend/docs/` — правятся одним коммитом с кодом (D39.80); PUML НЕ рендерить (гардрейл) | бэкенд | когда-нибудь | ближайший пак, касающийся pipeline | аудит доков 26.07, D39.80 |
|
||
| **— ОТДЕЛЬНЫЕ ПАКИ/РЕШЕНИЯ (бэкенд, добор идеала) —** | | | | | |
|
||
| 31 | Слой-2: извлечение дискурс-норм/few-shot из ТЕЛ промтов (форсинг = ja→ru) | бэкенд | когда-нибудь | отдельный пак (идеал D39.33) | CURRENT-STATE, D39.33 |
|
||
| 33 | **native-Gemini судья** (Ф2-механизм) ; до прод-заводки: $0.01-проба thinking⊆max_tokens на боевом слаге (D22.3) + включить sanitizer в pipeline-c2 при оживлении (D33.4б) | бэкенд | когда-нибудь | отдельный пак (идеал) | CURRENT-STATE, D39.33 |
|
||
| 34 | **Генеральность нарезки** — ОСТАТОК после фазы 2: сами per-script коэффициенты (`est_out` ja завышен ~1.7× МОЛЧА · `EstimateTokens` недосчитывает кириллицу); консолидация класса письма СДЕЛАНА (один дом `DenseScript`, D39.64) — лечение = `Fertility`-map (строка 14) + офлайн-калибровка при боевом токенизаторе | бэкенд | когда-нибудь | строка 14 + отдельный пак (с ja→ru) | D39.37(5), D39.64 |
|
||
| 34а | **Экран кодировки не видит `<meta charset>` без XML-объявления** (епаб с gb18030-метой прочтётся как UTF-8) — до-паковая дыра, сознательно не тронута пачкой 14а (паритет со старым ридером) | бэкенд | когда-нибудь | отдельное решение | D39.54, SMALLPACK §8 |
|
||
| 35 | **Не-CJK майнер/банк**: en-детектора не существует (hanRuns=0), ja с zh-таблицами активно неверен (0/10); нужен второй ДЕТЕКТОР (прототип `mine_nonhan.py`) + G1–G10 требования generic-майнера (вкл. квадратичность G9 ≈4.6 ч) | бэкенд | когда-нибудь | отдельный пак generic-майнера (с ja→ru) | D39.37(8), D39.43, D39.50 п.8, POLYGON_PREMEASURE §6 |
|
||
| 36 | Кластеризация майнера глотает родовые титулы (族长/学堂家老 в кластере 葛家) — закрыто на границе сборки входа, сама кластеризация не чинилась | бэкенд | когда-нибудь | отдельное решение | D39.43, D39.45 |
|
||
| 36б | **Второе мнение по банку**: рецензент ДРУГОЙ моделью, несогласия — отдельной колонкой подписной таблицы (судья-с-декоем в роли рецензента; решает владелец, D39.46-ограничение не бьёт). ⚠ **Бэкенд-стройки НЕТ** (D39.69 закрыл по нужности); замер ИСПОЛНЕН (research/24, D39.102) — остаток = строка 5: рецензент спорных КЛАСТЕРОВ при ре-пробе 74, роутинг family/series-юнитами; переживёт замер → тонкая колонка наблюдаемости, не гейт | полигон (замер) → бэкенд (только если переживёт) | когда-нибудь (слот при ре-пробе 74, остаток строки 5) | замер остатка → решение | D39.69, D39.90, **D39.102** |
|
||
| 36г | **Проводной формат каналов пересказан прозой в каждом пар-промпте, парсер в Go, связи нет** — формат в шаблон движка (`{{banknote_format}}`); линты держат класс, дублирование остаётся | бэкенд | когда-нибудь (со следующей правкой промптов) | отдельное решение (Р5) | D39.58 |
|
||
| 37 | **Квадратичности: `AttachKWIC`** (16.8 с / 2000 кандидатов; фикс — многошаблонный поиск; ⚠ опция фикс-пака 128 НЕ взята — «чисто не ложится»: автомат в `membank` неэкспортирован, вынос в общий пакет = рефакторинг слоя, `terminology` PURE не может импортировать банк-стор — отчёт пака §4 п.5, D39.118) + src-правило банкноты при промахе чанк-пути (строка × длина книги; на 10 главах не видна) | бэкенд | когда-нибудь | отдельное решение | D39.45, PACK20_BANK_BUILD §8.5.1, D39.58, D39.118 |
|
||
| 38 | Смета не видит пере-покупку прохода терминолога на каждой итерации подписи (роль не пишет `chunk_status`, не видна `projectRebill`) · хвост приёмки №13: адрес чекпойнта батча = ординал при частотной сортировке ⇒ реюз чекпойнтов прохода ~0 на инкрементальной книге — **механика ПОДТВЕРЖДЕНА КОДОМ фикс-паком (§2 отчёта, D39.118):** G1 двигает состав юнитов и те же ординалы, на первом прогоне после пака перекупаются все бэнк-батчи (центы) | бэкенд | когда-нибудь | отдельное решение | D39.45, PACK20_BANK_BUILD §8.5.2, D39.102, D39.118 |
|
||
| 39 | S12 частичен: `malformedSeparatorAt` не ловит подмену слова разделителя и обрыв токена (комментарий обещает) | бэкенд | когда-нибудь | отдельное решение | D39.45, PACK20_BANK_BUILD §8.5.3 |
|
||
| 40 | `bankTokenBudget`: worst-case зашит zh→ru (признанная утечка §0; CJK-цель недобирает вдвое) | бэкенд | когда-нибудь | отдельное решение | D39.45, PACK20_BANK_BUILD §8.5.4 |
|
||
| 41 | golden: вторая фикстура С langpack (сейчас пинится только фолбэк-путь) ; + golden-счётчики голоса (хвост D39.58) | бэкенд | когда-нибудь | отдельное решение | D39.37(6) |
|
||
| 42 | `prompt_override` — легальный обход гарантии слоя-2, сформулировать честно | бэкенд | когда-нибудь | отдельное решение | D39.37(7) |
|
||
| 43 | `request_log` без скоупа/ретеншена + `first_flag_reason` = третье представление истории попыток (корень — неразведённые скоупы) | бэкенд | когда-нибудь | отдельное решение | D39.37(9) |
|
||
| 44 | **Флор — выбор числа ПОСЛЕ ре-пробы 74; модель «thinking в completion» ПОЛУЧЕНА замером (D39.86): рычаг против неограниченного думания = `reasoning_effort`, флор не рычаг.** Мини-проба флора одобрена владельцем, промт не выдан; у dspro эффорт не настраивается (quirks 3а). Расхождение трекера с 74 снято D39.90. Археология дословно — `architecture/13-tech-debt-anchors.md` §Б-44. ⚠ **Вводная сменилась 13.08 (вахта §Б-108 СРАБОТАЛА):** вендор дал pro/flash настраиваемые уровни low/high/max — квирк 3а («у dspro эффорт не настраивается») устарел, пере-проба маппинга ПОВЕДЕНИЕМ + абсорбция в quirks — полигоном | бэкенд | когда-нибудь (триггер «приёмка 104» НАСТУПИЛ — D39.91, ручка заленжена; «сколько ставить» остаётся НЕзамеренным — нужен вариационный замер флора при `low`) | отдельное решение | D39.37(10), D39.86, **D39.90**, вендор 13.08 |
|
||
| 45 | `max_tokens`-упоры (две единицы) — вернутся на en-книге ; halve-chunk-on-retry (research/22 §2 №7) ОТКЛОНЁН D39.74 — вернуться сюда же при живых упорах | бэкенд | когда-нибудь | отдельное решение (с en) | D39.37(11) |
|
||
| 46 | **Экран целевого языка: «полный связный перевод на английский» проходит classify как ok — живой носитель класса (D39.86); дизайн пака ЗАМОРОЖЕН (D39.92 п.1 closed-set + D39.93: изолированный модуль, именованные причины), промт ждёт выдачи.** Гейт-связка: мини-проба флора (44). Археология дословно (двусторонняя дыра оси цели · константы · мины реализации) — `architecture/13-tech-debt-anchors.md` §Б-46 | владелец → бэкенд | **скоро (порядок §5.4: сначала 113, шаг 6 — под подпись)** | правка Go по плану §5.4 | D39.39(д), D39.86, **D39.90** |
|
||
| 47 | M2-кэш / доктрина Д2 — кандидат на отдельную ратификацию | оркестратор/бэкенд | когда-нибудь | отдельное решение | D39.42 |
|
||
| 48 | Направленная банкнота — вернуться по замеру покрытия терминолога | бэкенд | когда-нибудь | отдельное решение | D39.42 |
|
||
| 48а | **Серийный шаринг банка** — РЕАЛИЗАЦИЯ (экспорт подписанного глоссария как сид-YAML следующей книги серии; спойлер-окна плющатся в since_ch=0); контракт round-trip держится тестом, самой фичи нет | бэкенд | когда-нибудь (перед второй книгой серии) | отдельное решение | D39.42 задел (а), PACK20_BANK_BUILD З-а |
|
||
| 48б | **Импорт «оригинал + чужой перевод» как режим данных терминолога** (target-агностичный вход есть контрактом; сам режим + провенанс источника + юр-сторона в юр-пакете) | бэкенд/владелец | когда-нибудь | отдельное решение + Ф2.5 (юр) | D39.42 задел (б), PACK20_BANK_BUILD З-б |
|
||
| 130 | **emitRankCap × writeAutoBank — ОСТАТОК после фикс-пака (D39.118):** $0-минимум ИСПОЛНЕН (дифф старого/нового авто-файла + WARN с именами выпавших; само-исключение сырого seed закрыто `unsignedEngineSurfaces` дофиксом приёмки); остаток = накопительный мердж авто-банка / освобождение слотов seed-rejects — СТОП-решение владельца (двигает банк → memory_version); материал для решения даст WARN со ВТОРОГО прогона (§6 п.8 отчёта пака) | владелец → бэкенд | когда-нибудь (гейт: WARN второго прогона) | СТОП-решение | D39.102 п.3, **D39.118** |
|
||
| 131 | **Кап инъекции не считает маркер и гендер-ноты**: `glossaryLineTokens` бюджетирует только «src → dst» (`memory.go:512-515` против рендера `:698-708`) — авто-книга (все строки Ambiguous с ⟨проверить⟩) превышает `glossary_token_budget` ~на 40–60% при budget 800; биллинг/потолки компенсированы (резервация по фактическому рендеру, `stagerun.go:469-477`), сам кап не исполняется. Фикс двигает состав инъекций → RequestHash → перекупка волн ⇒ СТОП-решение с названной ценой. ⚠ После строки 134 (единый блок, маркер снят с провода — D39.104) превышение пере-замерить: состав рендера сменится | бэкенд | когда-нибудь | СТОП-решение | D39.102 п.3 |
|
||
| 132 | **Стойкий (пост-ретрайный) аутедж ТОЛЬКО банк-провайдера валит весь ран** вопреки коммент-контракту «optional step never aborts» (`terminologist.go:630-634` — деградация только на ceiling; транспортные ретраи гасят transient, `httpllm.go:126-160`; потерь нет — чекпойнты реплеятся за $0): решить — деградировать в «термы неконсолидированы»+WARN либо честно переписать коммент | бэкенд | когда-нибудь | малое касание через СТОП-решение | D39.102 п.3 |
|
||
| 134 | **Дата-правка инжект-заголовков под доктрину D39.105** (единый закон-блок редактора вместо двухсекционки · оговорка ОБЛАСТИ употребления · снятие маркера ⟨проверить⟩ с провода; статусы строк и подписная таблица НЕ меняются): кандидат-тексты — §B промта пробы 18; **ГЕЙТ ПАЛ (D39.108):** текст = ОТПРАВЛЕННАЯ строка пробы 18 БЕЗ оговорки области (девиация №1; оговорка опровергнута §A.4 — НЕ вносить); двигает рендер → RequestHash → перекупка, цену назвать при внесении | бэкенд | скоро | малое касание | D39.104 п.2, **D39.108** |
|
||
| **— ШОВ ДВИЖОК↔ПЛАТФОРМА: деньги и механизмы (D39.106/107 п.2) —** | | | | | |
|
||
| 136 | **Write-ahead intent + состояние `uncertain`-эскроу + `closing`**: холд НЕ освобождается по выходу юнита (сигнал обгоняет денежные события); spend не постится без свидетельства провайдера; расход сверх холда — полной суммой, превышение явной строкой убытка | платформа/бэкенд | скоро (промты по команде владельца) | стройка по research/25 | D39.106 |
|
||
| 137 | **Ночная сверка расходов с данными провайдера** (в движок цены входят float64 по ручной таблице `ledger/pricing.go` — систематика процентная; сверка приоритетнее споров об округлении) | платформа | когда-нибудь (до первого платного пользователя) | стройка по research/25 | D39.106 |
|
||
| **— НАХОДКИ ПРИЁМКИ ЭКСПОВ 18–20 (D39.108) —** | | | | | |
|
||
| 140 | **Банковый контур в shipping-c1 НЕ включён — и это ШИРЕ прежней постановки про одну банкноту (сверка STACK.md, D39.126 п.2а): терминолог и классификатор тоже живут только ран-локальным конфигом книги** (ратифицированный путь D39.42 п.4; coldrun 56/128; `gates.terminology`/`gates.banknote` в c1 = 0 вхождений); решить: включить в c1 (двигает промпт драфта → RequestHash — цену назвать) либо поправить декларацию; родня 36г | владелец → бэкенд | скоро | СТОП-решение | D39.108, exp20 §6, **D39.126** |
|
||
| 141 | **Дыра детектора примечаний: сноска «[1] …» без слова-заголовка проходит мимо** (`sanitizer.go:273-278` требует «Примечание:/прим. перев.») — после StripCosmetic уезжает в экспорт с дырой на месте вырезанного ханьцзы | бэкенд | когда-нибудь | малое касание + тест | D39.108 (приёмка 20) |
|
||
| 142 | **Механизм «гейты флагают → точечная починка по флагу» как прод-путь**: exp20 §3.3 — $0.0002/дефект, 12/12 (при ИДЕАЛЬНОЙ детекции); механизм конкурентов (research/22:179), у нас петля пака-16 за `enabled:false` (строка 13); детекторы «выдуманное слово»/«инверсия» прототипированы эксп-21. **ДИСПОЗИЦИЯ D39.117:** ОТКЛОНЁН как замена редактора (`C2/A_law` −3.75 Holm 0.0006; «$0.0002 чинит всё» мерилось при идеальных флагах и при реальной детекции пало), ПРИНЯТ формой «механический ПРЕ-ГЕЙТ перед редактором» — брак 5 клеток против 10/23 при половинной цене ($0.00298/$0.00602); ремонт ТОЛЬКО с банком (без банка ломает канон 0.917→0.895) | владелец → бэкенд | скоро (форма решена D39.117; стройка — бэкенд-промтом по команде владельца) | бэкенд-промт | D39.108, **D39.117** |
|
||
| 143 | **Абсорбция норматива судейства в `09-pilot-protocol.md`**: разброс инструмента ДО замера · объявленный порог различимости · MQM-lite/error-span первичен, pairwise только для стиля · декой обязателен · запрет судьи семейства жильца арма | полигон/оркестратор | скоро ($0) | правка дока | D39.108, exp20 §7 |
|
||
| 144 | **Вахта: grok `reasoning_tokens` ВНЕ `completion_tokens`** — формула цены харнессов может недосчитывать (до $0.0325 на exp20); вендор-сверка биллинга xAI при следующем прогоне с grok | полигон | когда-нибудь (следующий xAI-прогон) | вендор-чек | D39.108 (приёмка) |
|
||
| 146 | **Два техдолга движка без строки трекера** (свип 08.08): `prices_checked` (120 д) гейтит read-only `report` и $0-resume — свежесть цен проверять только на ПЛАТНОМ пути (`03-implementation-notes:244`) · `cache_ttl` ↔ `cache_write_per_m`: цена записи в кэш задана под ОДИН TTL (5 м), при другом TTL расчёт врёт (`:246`). Оба жили только в справочнике якорей, то есть вне единственного трекера | бэкенд | когда-нибудь | малое касание | свип доков 08.08 |
|
||
| 147 | **Транспортные частичные из research/21 без носителя** (свип 08.08): п.16 HTTP/1.1-escape на последней попытке как ДИАГНОСТИКА тихого усечения 2–8k [PARTIAL, GATED] · п.17 assistant-prefill continuation на `finish=length` вместо ре-рана всего вызова [PARTIAL, DEFER]. Оба помечены в ресёрче как отложенные и ни в одной строке трекера не появились | бэкенд/полигон | когда-нибудь | замер → решение | свип доков 08.08, research/21 §16–17 |
|
||
| 148 | **Приложение А контракта потеряно инцидентом 08.08 и подлежит восстановлению** (D39.113): карта «вердикт движка → продуктовая фраза → ступень» была заполнена №14, откатилась к ЗАГОТОВКЕ с плейсхолдерами. Текст реконструкции держит оркестратор №15; решение владельца — брать реконструкцию черновиком С БАННЕРОМ «требует сверки» либо оставить заготовку и заполнять заново. Карта нужна фронту для замечаний (Ф-14) | владелец → оркестратор | скоро | решение владельца | D39.113, свип доков 08.08 |
|
||
| 149 | **Эксп-22 «панель жильцов»**: профиль-скрин (pass/fail пороги ДО замера; урок эксп-21 — скрин, убивший 2 из 12, скрином не был) → панель черновиков (слот несёт ~70% эффекта финала, мерился ТОЛЬКО flash за всю историю) → панель редакторов поверх замороженных черновиков (обязательный кандидат `gemini-3.1-pro` — аутлаер-гипотеза эксп-04) + шумовой пол + прямой `D_/A` довесками; агент-судейство под капом ≤60; невиданный zh-срез — повторный жёсткий заказ | полигон | **ИСПОЛНЕН и заленден 10.08** (приёмка №16; промт — `archive/prompts/POLYGON_TENANT_PANEL_SESSION_PROMPT_2026-08-08.md`); выводы заморожены до фазы Д — закрыть строку при ратификации | прогон по промту → ратификация | **D39.117**, приёмка №16 |
|
||
| 150 | **Sol-арбитраж — внешний контур вместо слепого чтения владельца**: пере-суд расходящихся контрастов эксп-21 (`A/F`: luna +0.84 против gemini +3.03 — расхождение 14 sd шума судьи-замены) и слепых пар эксп-22 руками владельца через подписку (третье семейство, high reasoning); пакеты готовит эксп-22 Ф0.4 (слепые метки · оба порядка · декой), транскрипты персистятся как голоса внешнего судьи; luna-клетки Sol не судит (своё семейство) | владелец + полигон | скоро (пакет арбитража — из существующего сырья) | эксп-22 Ф0.4 + руки владельца | **D39.117** |
|
||
| 151 | **Отказной режим связки**: эхо-мина черновика воспроизводима на материале (глава 11 — 3/3 попыток; частота 31% на zh), связка покрыла 9/10 подряд идущих глав против 10/10 у однопроходки — единственный довод ПРОТИВ связки во всём эксп-21; движку нужен fallback при невозможности годного черновика (вариация ре-гена · эскалация модели черновика · деградация в однопроходку) | владелец → бэкенд | когда-нибудь (до МАСШТАБА) | СТОП-решение | **D39.117**, exp21 §14 |
|
||
| 152 | **Слипание абзацев — слепое пятно детерминированного контура**: батарея на тех же текстах даёт ДРУГОЙ порядок армов (`D` — худший по судье — лучший по правилам), расхождение локализовано в слипании, которого не проверяет ни одно правило; правило в батарею полигона + кандидат в гейты движка | бэкенд/полигон | когда-нибудь | малое касание + тест | **D39.117**, exp21 §13 |
|
||
| 153 | **Чистый контраст мандата перевёрстки**: `D/D_` загрязнён (объём промта ×1.92 + вёрсточная строка + правило чэнъюй); уравненные промты и пере-гон ≈$0.35; по грязному контрасту мандат ВРЕДИТ по оси ФОРМА (−1.09 из −3.31 `D/A`) | полигон | когда-нибудь (опция эксп-22 Ф3 — реши сессия) | замер | **D39.117**, exp21 §16.3 |
|
||
| **— ХВОСТЫ ФИКС-ПАКА БАНКА (D39.118) —** | | | | | |
|
||
| 154 | **Одноруновая голова семьи** (`蛊`/`转`/`窍` едет в отдельном вызове от 12 своих поверхностей — якорь семьи обязан быть ≥2 рун) — включается ОДНОЙ строкой данных `family_containment_runes han 1`, Go не трогается; не включена: цена в размере юнитов не замерена | бэкенд | скоро (гейт: замер размеров юнитов на первом холодном прогоне, вместе со 157) | строка данных по замеру | **D39.118**, отчёт §5 |
|
||
| 155 | **Скрипт-слепой резолв семей/серий**: han-правила режут кану и хангыль (синтетика: 24 катаканных имени с общим アリ → батч 8036 рун при бюджете 6000); живого вреда нет — пары в репо нет; та же слепота у серий уже в HEAD | бэкенд | когда-нибудь (преп ja→ru, с 81/120) | ja-пак | **D39.118**, отчёт §5 |
|
||
| 156 | **`banknote_truncated` — ПОЛ, а не счёт**: обрыв, срезавший сам разделитель, флага не даёт; буквальный фикс зажёг бы колонку на каждом обрыве в прогонах без канала — нужен гейт по `Gates.Banknote.Enabled` | бэкенд | когда-нибудь | малое касание | **D39.118**, отчёт §5 |
|
||
| 157 | **Пере-подтвердить `family_max_members=24` и `families_held`** на длинной книге (24 калиброван на дистилляции в 150 поверхностей; кап эмиссии 200 + реверс-секция дают другой список); если `families_held` велик — ослабить гард до «родство по любому члену юнита» вместо «по корню серии» | бэкенд | скоро (гейт: первый холодный прогон, §6 отчёта) | замер → решение | **D39.118**, отчёт §7 п.7 |
|
||
| 158 | **Уверенность не гейтится данными пары**: канал снимает третью колонку у любой пары, чей промпт её попросит; у пары с ДВУХпольным промптом узкий риск «Пик␣␣99» (число ≤100 за двойным пробелом уедет в conf); при нужде — дата-декларация пары | бэкенд | когда-нибудь | дата-декларация | **D39.118**, отчёт §4 п.6/§7 п.8 |
|
||
| 159 | **Durable-имена эвиктнутых** (`retrieval_state.evicted_detail` = миграция; сегодня лог, и приёмка ратифицировала «этого достаточно») — заводить только при доказанной потребности, одним касанием с идемпотентностью миграций 49а | бэкенд | когда-нибудь (гейт: доказанная потребность) | миграция с 49а | **D39.118**, отчёт §7 п.2 |
|
||
| 160 | **Структура глав, Этап 0** ($0, wire-нейтрально): `titleRaw` в манифест (subtitle добывается `matchHeaderLine` и ПОНИЖАЕТСЯ в тело прозы (испр. D39.125), а не выбрасывается) + provenance у heading + тип chapter/fragment + вердикт структуры (бамп manifestVersion) · **дыра Р6**: projectRebill слеп к контент/позиционной оси (rebill.go:32-35) — ревизия структуры перекупила бы хвост МОЛЧА, закрыть read-path-расширением · слой пользовательских правок отдельным сайдкаром · **зонная половинка темы:** Ф-30 фронта / В-4 владельца (глава без заголовка на экране — метка из ДАННЫХ, К-3) ждут ровно эту строку; `heading` манифеста до неё = ВРЕМЕННЫЙ рендер движка (D39.122 п.2д) | бэкенд | скоро (кандидат в ближайший бэкенд-пак; Р6 — приоритет пачки) | пак | research/27 §6 Этап 0 |
|
||
| 161 | **Структура глав, Этап 1 «большой перекрой»** (единственное дешёвое resnapshot-окно — пока платная книга одна, ДО интейка): IR + формато-адаптеры (epub nav/NCX, fb2) + индуктор с валидаторами и вердиктами + третий версионный план паттернов (не в снапшот волн) + развязка чанкера от глав + банк-окна на chapter-ID + контент-адресуемый resume (долг D15.2) + формула Chapter.ID «окно» + роль title (мини-сессия названий: редакторский слот · инъекция банка · двухфазно вокруг подписи) + аддитивное расширение контракта 14; жизненный цикл дерева — research/27 §3а (решение владельца 09.08) | бэкенд (+фронт/платформа аддитивно) | скоро (после эмиттера; дизайн-ратификация владельца ДО стройки) | ратификация → пак(и) | research/27 §3/§5/§6 |
|
||
| 162 | **Структура глав, Этап 2**: in-band метки глав в потоке перевода (третий эшелон детекта + коррекция структуры по ходу черновой волны, §3а п.3) + канон-гейт названий ($0) + миграционные карты якорей (same/moved/split/merged/gone/new) + калибровочный корпус детекта в CI | бэкенд + полигон | когда-нибудь (после Этапа 1) | пак + корпус | research/27 §5/§6 Этап 2 |
|
||
| 163 | **Версии модулей x/text|x/net двигают нарезку МИМО всех ключей** (NFC в NormalizeSource — таблицы модуля, не тулчейна; epub-токенайзер): бамп `go get -u` тихо меняет нарезку при свежих на вид манифесте/чекпойнтах/снапшоте — класс всей чекпойнт-плоскости, унаследован манифестом; вплести версии модулей (debug.ReadBuildInfo) в NormVersion/chunkerVersion либо явный запрет бампа без `--resnapshot` | бэкенд | когда-нибудь (до второго прогона книги) | малое касание | **D39.122**, приёмка (охотник №1) |
|
||
| 164 | **Rebill-проекция `status` с nil baseMemory завышает RebillUSD**: read-путь не материализует base-банк → renderedContentHashes даёт пустую инъекцию → repin недоопознан, строка считается re-pay (консервативная сторона, но противоречит комменту «status can never quote a different number than translate»); материализовать base-банк на read-пути либо смягчить клейм | бэкенд | когда-нибудь | малое касание | **D39.122**, приёмка (охотник №1); preexisting |
|
||
| 166 | **Движковая поверхность оценки $/глава** (ставка-константа платформы $0.03 из exp08 v2 — временная мера беты, П-10 зоны платформы; честная оценка по книге/паре — движковая) | бэкенд | когда-нибудь | отдельный пак | D39.123 |
|
||
| 167 | **Докс-пак по аудиту D39.125 — ЯДРО ИСПОЛНЕНО (D39.126):** реестр всех нот `architecture/05-decisions-index.md` · counts.py `--check` полнота реестра + `--lint` якорей · разгрузка топ-10 строк · входы 15-money-path/16-events-emitter/STACK.md · К-статусы сведены · 09-target/product-requirements освежены. **Остаток строки:** статус-баннеры экспов + шапка эндпоинтов quirks (передано полигону промтом фазы Д, §Д8 п.12) · DEFECT_REGISTER секциями (зона платформы, пинг отправлен 09.08) | доки/полигон/платформа | скоро (остаток — фаза Д полигона) | пинги зонам | D39.125, **D39.126** |
|
||
| 168 | **Состав волн пайплайна = пар-конфиг (данные), не общий хардкод**: вопрос владельца 10.08 «нормально ли под китайский строить весь бэкенд и конфиги?» — жильцы ролей и промпты уже конфиг/langpacks, но ТОПОЛОГИЯ волн (перепис · точечный edit-контур · без второго прохода) одна на всех пар; если фаза Д покажет разных победителей по парам (H-3/H-4: en-черновик+edit против zh-связки), состав волн уезжает в пар-конфиг данными; ревью-вопрос общности §0 `12-go-style-notes.md` | бэкенд | когда-нибудь (после данных фазы Д) | замер (фаза Д) → решение владельца → малое касание | слово владельца 10.08, промт фазы Д |
|
||
| 169 | **Экспорт банка для чтения фронтом — ДВИЖКОВАЯ половина ПОСТРОЕНА, строка заводилась слепой к ней (испр. оркестратором 14.08):** сайдкар `<project_db>.bank.json` — весь банк тремя статусами, стабильные id, атомарная запись — существует с D39.122 (`internal/pipeline/bankexport.go`; рядом `bank-stop.json` — полная таблица подписи для S5); прежний текст строки («артефакта экспорта нет») повторял жалобу Ф-43, снятую тем паком. ОСТАТОК: платформенная проекция сайдкаров в `GET /books/{id}/bank` + канал решений подписи — пак читающей поверхности платформы; без неё витрина банка фронта стоит на моке, подписной экран S5 строить не на чем | платформа | скоро (гейт S5 фронта) | пак читающей поверхности (П-1) | Ф-43 фронта, D39.122, **D39.127**, испр. 14.08 |
|
||
| 170 | **`tmctl init` — движок сам заводит книгу** (форма В развилки интейка): платформа зовёт $0-команду, движок пишет СВОЙ `book.yaml` — требования к полям живут там же, где проверяются (`config/book.go`); до неё бета живёт формой Б (рендер из деплой-шаблона платформой при создании книги, ратификация D39.130) | бэкенд | когда-нибудь (после беты формы Б) | малый пак | приёмка P5, **D39.130** |
|
||
| 172 | **Пере-пин цен DeepSeek + решение time-based прайсинга** (вендор-факт 13.08, снят 14.08 с `api-docs.deepseek.com/quick_start/pricing`+news260813): с 16.08 16:00 UTC пик/офф-пик (пик 01–04·06–10 UTC, офф-пик = 50%): пик flash $0.44/$1.32 in/out (было $0.14/$0.28), pro $1.32/$3.96 (было $0.435/$0.87), cache-hit pro $0.022–0.044 против $0.003625 (×6–12); наша таблица `models.yaml` (факт 2026-07-10) протухает 16.08, схема прайсинга плоская — time-based не выражает. Делать: пере-пин цен + `prices_checked` + СТОП-решение владельца «как леджеру жить с пик/офф-пик» (консервативный пин пиком против офф-пик+scheduler строки 60 — её ценность выросла до ×2 COGS) + пере-калибровка ставки $0.03/глава (166/П-10) + exp08 v3 (85) из опции стал обязателен до budget_usd | владелец → бэкенд | **скоро (цены протухают 16.08)** | СТОП-решение → правка данных + exp08 v3 | вендор 13.08, строка 60, D30.4 |
|
||
| 171 | **Число символов книги — от движка** (PD-177 платформы: `character_count` интейка точен только для UTF-8; GB18030/UTF-16 движок декодирует сам — цифра платформы на них неверна, для UTF-16 занижена ~вдвое): счёт символов в манифест (рядом `source_bytes`/`encoding`) либо перерасчёт платформой после разбора | бэкенд | когда-нибудь | малое касание (манифест) | П-13 платформы, PD-177, приёмка P5 |
|
||
| 173 | **`backupStamp` секундной точности**: два `translate` в одну секунду дают коллизию имени бэкапа и exit 1, маскируя класс «проект занят» (12) — метка до наносекунд/uniquify либо распознавать коллизию явно; преexisting, вскрыт ревью эмиттер-пака | бэкенд | когда-нибудь | малое касание | приёмка D39.131 |
|
||
| 174 | **Деадлок деплоя v15**: read-only `status` отказывает схеме старее бинаря, а платформа зовёт его ПЕРЕД каждым спавном и для settle ⇒ апгрейд движка запирает ВСЕ существующие книги (write-команда, которая мигрировала бы, не наступает никогда); решить ДО деплоя эмиттер-бинаря на платформу: движковая $0-команда `tmctl migrate` либо деплой-шаг «write-команда по каждой книге» | владелец → бэкенд/платформа | **скоро (гейт деплоя эмиттер-бинаря)** | отдельное решение | приёмка D39.131 (шов-ревьюер) |
|
||
| 175 | **Деплой движка «в полёте» — ОСТАТОК после ресёрча 14.08** (внешний агент, две итерации: сначала абстрактная индустрия-съёмка, затем вердикт по нам; вывод — exact-match читателей на деньгах = осознанный fail-closed, корень не выдёргивать, приделать дверь). Ближняя половина УШЛА в работу: типизированная ошибка version-mismatch у `status` + money-тест — промт migrate; правило свипа «мигрировать только книги БЕЗ открытых попыток» + settle ЗАПИНЕННЫМ бинарём попытки (`run_attempts.engine_binary`, строка 139) — аддендум P6. Дальний остаток: (а) при СЛЕДУЮЩЕМ бампе схемы проставить в файл книги `application_id` + `min_reader_version` — данные-задел под окно совместимости, ~0 логики; (б) GC бинарей: удалять не пиненные ни одной незакрытой попыткой, последние 2–3 релиза держать для отката; (в) окно совместимости читателей / пин уровня книги — строить ТОЛЬКО по триггерам: много тенантов · бампы схемы еженедельно+ · потребители `status` кроме платформы | платформа/бэкенд | когда-нибудь (по названным триггерам; (а) — попутно первым бампом схемы) | данные-задел + малые касания | владелец 14.08, ресёрч 14.08, строки 139/174 |
|
||
| 176 | **Паника движка неотличима от «completed with flags»**: непойманная паника Go-рантайма = exit 2, а 2 — «успешный» код контракта; платформа записывает `ready` для прогона, упавшего посреди работы (деньги целы — расчёт из `status --json`; врёт статус). Лечение движковое: `recover` в main tmctl либо другой номер для флагов; найдено адверсариальным ревью P6 (PD-212 регистра платформы) | бэкенд | когда-нибудь (следующее касание exit-контракта) | малое касание | D39.132, PD-212 |
|
||
| 49 | **Этапы Б+В спеки D15.2** (content-addressed resume / `guard_hash` — D39.31 сознательно не строил) ; этап В = tmctl export-контракт D29.1 (annot-v1 · цвет-мап+rollup · политика красных fail-closed) + операторский протокол-документ релиза гендер-твиста (D5.1): сам механизм УЖЕ построен — until_ch-правка → точечный re-edit со сметой и $0-пере-пином (`repin.go`/`rebill.go`, D39.42 п.5/D39.45) | бэкенд | скоро (ПОДТЯНУТА D39.81: annot-v1 = источник замечаний для фронта — критический путь подключения) | отдельное решение (annot-половина — по контракту 14, D39.99) | D39.34(4), D33 п.5, D39.81 |
|
||
| 49а | **ALTER-шаги миграций v8–v14 не идемпотентны вопреки шапке `migrate.go:9-11`** (полу-применённая БД не сходится; счётчик версий скрывает) — находка критика полноты пака-19 | бэкенд | когда-нибудь | отдельное решение | D39.56, PACK19_BUILD §6.9 |
|
||
| 50 | F3-остаток идемпотентности | бэкенд | когда-нибудь | отдельное решение | D39.34(4) |
|
||
| 51 | `human_override` LOCK (D29 п.1г, в коде 0 вхождений) | бэкенд | когда-нибудь | отдельное решение | D39.34(4) |
|
||
| 52 | **Ф2-гейты вне идеала**: морфо-гейты канцелярита + L1-лемматизация (python-сайдкар) · полный OpenCC · опциональный пре-перевод гейт ; состав явно: канцелярит + РОД (строка 82) + класс Ф2-гейтов карты 04-unhappy (обсцен-гейт/феминитивы/время сцены — состав решить паком) ; + класс идиоматики (свип-хвост, D39.73): сехоуюй-словарь · вэньянь-классификатор (zh) · васэй-эйго ложные друзья (к ja-паку 81) — данные пары или закрытие «банк книги покрывает» тем же паком | бэкенд | когда-нибудь | отдельное решение | D39.34(4) |
|
||
| 54 | Масштаб целой книги: волны/каденс/потолки/ETA на сотнях глав (гоняли максимум 10; книга 7,78 млн симв., ~2284 раздела) | бэкенд | когда-нибудь (последним по курсу) | МАСШТАБ | D39.33, CURRENT-STATE |
|
||
| **— ПОЛИГОН (кандидаты пакетов) —** | | | | | |
|
||
| 55 | **`dialogue_dash` мерить только на невиданном тексте** (подогнан под 蛊真人; цифры мини-прогона аргументом не считаются) ; расширено до вне-претрейн чекпоинта целиком: r-коэффициенты exp01/08 · precision чекеров · частота эха · чистовик exp15-выводов ; + arity-полоса паспорта (D29.2г): решить — dialogue_dash покрывает диалоговую половину или мерить (D39.73). **Частично закрыта эксп-21 (D39.117):** направление главного вывода воспроизведено на чистом en-материале (узнавание 1/5), $0-довесок исполнен частично; **срез эксп-21 НЕ купил** (главный zh-замер на книге 4/5, без пинга) — остаток = неконтаминированный zh-срез | полигон | скоро (эксп-22 Ф0 — повторный ЖЁСТКИЙ заказ, стоп при неисполнимости) | эксп-22 | D39.37(4), D39.40, D39.46, D39.108, **D39.117** |
|
||
| 56 | Ёфикатор/санитайзер-классы не размечены (§6.5 отчёта пакета-6) | полигон | когда-нибудь | полигон-пакет | D39.46, CURRENT-STATE |
|
||
| 57 | Пере-замер «контексты — главный рычаг» на трудной выборке пакета-7 с боевой сборкой (до него kwic-веса/семантику не трогать; перф-хвост AttachKWIC — строка 37: фикс-пак 128 закрыт D39.118, опция в нём не взята, семантика не менялась) — напряжение с D39.46 названо, не отменено | полигон | когда-нибудь | полигон-пакет | D39.50, D39.118 |
|
||
| 58 | **Не покрыто пакетом-8**: вторая книга/пара/модель · строка `drafts:` · ось `batch_runes` · разметчики-модели (не люди) · precision роли на «расширенном, но осмысленном» материале ; + контрастивный регрессионный сьют по каталогам режимов отказа (12-*) · чистовик exp15-выводов | полигон | когда-нибудь | полигон-пакет | POLYGON_PREMEASURE §1.8/§2.5/§3.5/§7.6 |
|
||
| 59 | **Вендор-чек префикс-кэша ZAI/GLM** (на нём стоит вся кэш-экономика W1/Q2c) ; + GLM context-overflow гард (finish=model_context_window_exceeded — NOT-do пака-12 без решения) ; + Mistral-strip гейт message-builder (research/21 §1.1: extra_forbidden на reasoning-поля; ЛАТЕНТЕН при нашем single-shot wire — гейт перед прод-путём mistral в канале B / любым multi-turn; D39.74) | полигон | когда-нибудь (до МАСШТАБА) | полигон-пакет | D39.34(6) |
|
||
| 60 | Scheduler-aware волны под peak-valley DeepSeek (прямой COGS-рычаг) | полигон/бэкенд | когда-нибудь (до МАСШТАБА) | отдельное решение | D39.34(6) |
|
||
| 61 | **Прайс/wire-гигиена**: продление `prices_checked` без правки чисел · гейтнутые платные армы (edit-единица >3200 и др.) · wire-probe temperature в thinking-канале DeepSeek | полигон | когда-нибудь | полигон-пакет | D39.34(6) |
|
||
| **— Ф2.5 / ПИЛОТ / ПРОД —** | | | | | |
|
||
| 62 | Билингв-якорь (D25 п.9 Q1) | владелец | когда-нибудь | Ф2.5 | D25 п.9, CURRENT-STATE |
|
||
| 63 | Контаминация корпуса (D27 п.4) | владелец/полигон | когда-нибудь | Ф2.5 | D27 п.4, CURRENT-STATE |
|
||
| 64 | Судья-дублёр (D22.6) | бэкенд | когда-нибудь | Ф2.5 | D22.6, CURRENT-STATE |
|
||
| 66 | Пилотные D25-гейты: publishable/waiver (п.1) · FN-bound L3 (п.4) | владелец | когда-нибудь | Ф2.5 | D25, CURRENT-STATE |
|
||
| 67 | **Прод-гигиена: юр-пакет · провенанс 12-*-доков · xAI-ключ off перед продом** (D27) ; + юрисдикционные annex-ре-чеки при новых рынках (D39.29) + поле «версия исходника» book.yaml на интейке (04-unhappy §5) | владелец | когда-нибудь | Ф2.5 | D27, CURRENT-STATE |
|
||
| 68 | Residual-тачпойнты exp16, не влитые в сид-дельту: мини-голд алиасов (ОТЛОЖЕН до первого длинного прогона — D39.103) · precision@30 (`books/gu-zhenren/exp16/`) | полигон | когда-нибудь | Ф2.5 / полигон-пакет | CURRENT-STATE |
|
||
| **— Ф3 / ПРОДУКТ —** | | | | | |
|
||
| 69 | Gemini API «под-18» обязательство на конечный продукт (независимо от лейблов) | владелец | когда-нибудь | Ф3 / отдельное решение | D39.32, D39.34(7) |
|
||
| 70 | Action-security gate перед выдачей tools/webfetch (D25 п.5) | бэкенд | когда-нибудь | Ф3 | D39.34(7) |
|
||
| 71 | **Планы research/22**: epub-tag-rewrite · Q7-леджер ; + F3-brief из D29 п.3 (chat-edit · Not-useful-петля · cost-of-fix) + Ф3-скоуп 02-mvp-plan (TMX/TBX · Bertalign · дистилляция 7–14B); + V5: фронт ВЕБ-ПЕРВЫЙ, SEO/ранжирование (куки · страницы-сироты · актуальные алгоритмы Google) — определяет выбор фреймворка (SSR vs SPA), в Ф3-дизайн ДО выбора стека (ПТ-23) | бэкенд | когда-нибудь | Ф3 | D39.34(7), START_PROMT V5, D39.80 |
|
||
| 94 | **Продукт-механика входа и прогона** (V2, ПТ-16..18): абьюз/misuse-прескрин дёшево и точно ДО трат токенов (H8) + UI-контракт отказа (проект-решение D39.80) · лимит размера входа настройкой (H7) · продукт-кнопки «стоп/продолжить» поверх построенных graceful stop и redrive, абьюзивный прогон НЕ продолжать (H10); API-форма — по контракту 14 (D39.99; статус отказа — открытый К-9) | бэкенд | к подключению фронта (ПОДТЯНУТА D39.81; лимит можно раньше, к пилоту) | отдельный пак при Ф3-препе (контракт 14 ратифицирован) | START_PROMT V2, H7/H8/H10, D39.80, D39.81 |
|
||
| 96 | **→ переехала в `platform/BACKLOG.md` П-1** (зонные бэклоги, D39.84: HTTP/SSE-слой, обвязка, аутентификация, порядок деплоя); здесь остаётся ратифицированным сам ИНВАРИАНТ D39.81 — движок = процесс-на-прогон (EXCLUSIVE flock `store.go:43`), сервер в backend НЕ пишется | платформа | — | зонный бэклог | D39.81, D39.84 |
|
||
| 97 | **→ переехала в `platform/BACKLOG.md` П-2** (глобальный брокер рейт-лимитов; гейт «до второго параллельного пользователя» зафиксирован там же) | платформа | — | зонный бэклог | D39.81, D39.84 |
|
||
| 126 | **Потолок прогона УПРАВЛЯЕМЫЙ (владелец 07.08, D39.110); максимум шкалы = `Balance` КАК ЕСТЬ — поправка D39.115 п.2(а), «минус холды» = ошибка.** Форма: шкала в ГЛАВАХ (не доллары — D39.84 цел), ноль нельзя; потолок принадлежит ПРОГОНУ, приём аргументом построен (строка 145 закрыта D39.122: `--ceiling-usd`); фронт-форма — `run-options`/`CeilingBounds` (D39.115 п.4); пересчёт «главы→деньги» — платформа, ставка $0.03/глава (D39.123 п.2г; формула аргумента = committed + прирост, БЕЗ reserved — PD-158). Остаток строки: ручка на экране фронта (S4+). Археология дословно — `architecture/13-tech-debt-anchors.md` §Б-126 | платформа/фронт/бэкенд | скоро (форма решена, стройка — промтами) | дизайн-вход П-1 + правка спеки + строка 145 | ревью контракта 04.08, D39.99, **D39.110** |
|
||
| 127 | **Устаревший DDL-коммент `glossary.source`** (`migrate.go:193`: «seed|ruby|auto», фактические пути записи — seed/ruby/mined, `auto` не пишет никто; фантом уже утёк во фронт-доки дважды) — поправить коммент | бэкенд | когда-нибудь (попутно любым паком store) | однострочная правка | ревью контракта 04.08, D39.99 |
|
||
| 105 | **Роль `classifier` мис-вердиктится как эхо (`verdict=cjk_artifact` при `bad_lines=0`); ЛАТЕНТНО — `classify_types` выключен во всех шиппинг-конфигах.** Цена фикса, знать заранее: бамп `classifierVersion` → перекупка чекпойнтов классификатора (центы). Поля `rules=`/`VOICE` читать по знаменателям (13б). Разбор дословно — `architecture/13-tech-debt-anchors.md` §Б-105 | бэкенд | когда-нибудь (ближайшее касание банка/наблюдаемости; (б) — дешёвая часть, вердиктов не двигает) | малое касание + вердикт-двигающая половина (а) через СТОП-решение | D39.86 |
|
||
| 106 | **Слой 3: целевой контракт «узкие мандаты + ДИФФЫ» против текущего full-regen — гейт «перепроверить до стройки» в силе, приоритет ПОНИЖЕН (D39.117: full-regen выигрывает у ремонта; оговорка полигона — чинил дешёвый фиксер по предложению, не сильный редактор узким мандатом).** Реактивация — только через эту строку. Археология дословно (эмпирика D39.108 · история дыры учёта) — `architecture/13-tech-debt-anchors.md` §Б-106 | владелец → бэкенд | когда-нибудь (пере-проверка «сильный редактор × узкий мандат» — перед стройкой слоя 3) | замер → решение владельца | 09 §Слой 3, D39.90, D39.108, **D39.117** |
|
||
| 113 | **Запас боевого гейта не зафиксирован тестом, а харнесс, давший число, УДАЛЁН (Д-хвост D39.90).** Числа «18 из 20 · 0 ложных на 1055 · запас 13× (0.0117 против 0.15)» и «санитайзер поймал бы английский черновик» получены ВРЕМЕННЫМ тестом в пакете pipeline (`splitBanknote`+`StripThink`+`sourceScriptShare`), который сессия удалила после снятия. Число ушло в контракт (строка 46), воспроизвести его нечем. **Делать:** корпус-фикстура в репо (~20 off-target + ~40 здоровых, с движковой предобработкой; снапшот НЕ двигает) + регресс-тест на реальный запас — это база, которую обязано побить любое предложение по 46. СТОП, если фикстура не воспроизводит 18/20 при 0 FP, или если запас меньше 3× | бэкенд | скоро (перед любой правкой по строке 46) | $0 фикстура + регресс-тест | D39.90, EFFORT_HANDLE §5.4 шаги 1–2, §7 |
|
||
| 114 | **Конфиго-слой ручки эффорта: два дешёвых хвоста приёмки (вне снапшота, $0 прогонов).** (а) **Д4 отчёта:** `gates.terminology.target_script` НЕ сверяется с `book.target_lang` — `target_lang: ru` + `target_script: Latin` грузится чисто и **ИНВЕРТИРУЕТ** банковский экран (ловит целевой, пропускает чужой); сверка при загрузке против `lang.LangScripts(TargetLang)` — тот же дата-план, что у экрана строки 46, громкий отказ на несовпадении. (б) **Находка-2 приёмки:** стейл-доккоммент `capability.go:78` — у константы `ReasoningExtraBodyDisable` до сих пор «effort "" leaves the provider default», противореча проводу (`applyToBody` мержит disable на `""`, комментарий в теле arm это прямо объясняет) и починенному `ThinksOnWire`; однострочник тем же касанием | бэкенд | скоро (мелкий пак или попутно со строкой 46) | правка Go, снапшот не двигает | D39.91, EFFORT_HANDLE Д4 |
|
||
| 115 | **`//go:embed` целевых данных — ЯВНЫЙ список файлов: новая ЦЕЛЬ требует правки Go (Д6 отчёта).** `internal/lang/embedded.go:22` перечисляет файлы поимённо, `CompileCheckers` паникует при неполном файле цели ⇒ на канон-вопрос «заработает ли пара, которой в репо НЕТ, без правки Go» ответ сегодня **НЕТ** — дыра в ратифицированной «ФАЗЕ 2 ОБЩНОСТИ ✅» (D39.64), и она не про язык, а про строку эмбеда. Решить форму: `embed data/*` (и как манифест фолдится в `EmbeddedVersion`, чтобы НЕ перекупать чужие пары) против явного списка как осознанного гейта полноты данных цели | оркестратор → бэкенд | когда-нибудь (триггер: первая новая целевая пара; учтён в реестре 108) | отдельное решение | D39.91, EFFORT_HANDLE Д6, D39.64 |
|
||
| 116 | **Порог классификатора «6/6» ратифицирован для ОДНОГО вызова, не для выборки — и на рекомендованном `low` риг N=5 КРАСНЫЙ: 4/5 (Д8 отчёта).** Контракт обязан стать выборочным («≥4/5 при N=5» или иная форма — решение) ДО применения (б) к любому конфигу, иначе рекомендация `low` противоречит собственному приёмочному числу. Честная граница чисел (D39.86, подтверждена приёмкой по сырью): 2 из 6 термов (元石/灵泉) стоят дословно в промпте классификатора = припоминание; падение `low` — ровно по дискриминирующему подмножеству (1/4 против 4/4); единственный промах — вызов на 91 completion-токене (модель не подумала), уровень ни при чём **02.08 вечер: рекомендация подана владельцу — «≥4/5 прогонов N=5 достигают 6/6»** (альтернатива жёстче: 4/4 по дискриминирующему подмножеству без термов-припоминаний); ждёт слова | владелец → оркестратор | скоро (112 залендена (D39.97) — порог не должен отстать) | пере-ратификация порога, $0 | D39.91, EFFORT_HANDLE Д8, D39.86 |
|
||
| 108 | **Реестр ЗАГЕЙЧЕННЫХ ТРИГГЕРОВ (триггер → что вернётся → источник) — ВЫСЕЛЕН ДОСЛОВНО в `architecture/13-tech-debt-anchors.md` §Б-108; сверять на каждом переходе горизонта (норма D39.66 «каждое отложено получает носитель» в силе).** ⚠ Живое оттуда: go.work-триггер УЖЕ наступил (`platform/go.mod` заведён) · вахта маппинга эффорта dspro «early August 2026» · движение тулчейна к go1.27 ⇒ строка 119 ПЕРВОЙ | оркестратор | скоро ($0, гигиена трекера) | завести реестр + сверку в норму лендинга | D39.66, D39.90 |
|
||
| 109 | **Продуктовые требования без строки-носителя: ПТ-6 (структура абзацев) · ПТ-7 (слабый оригинал — вопрос владельца) · ПТ-22 (продуктовый интейк настроек) · ПТ-10 (механизм веб-фетча).** Носители заводить при первом касании тем; реестр `product-requirements.md` первичен. Разбор дословно — `architecture/13-tech-debt-anchors.md` §Б-109 | оркестратор/владелец | скоро ($0 — расписать носители) | завести строки/вопросы → диспозиции | D39.90, product-requirements |
|
||
| 110 | **Детектор повторов лемм / защита авторских рефренов** (`04-unhappy-paths.md:97,130 п.5`): $0-минимум исполнен промптом (editor.md, пакет-чекеров 02.08), механизм явно не строился — «нет размеченного класса; связка с alignment/Bertalign». Строки-носителя не было; предмет живой, потому что отличить дефектный повтор от авторского рефрена без выравнивания нельзя | бэкенд/полигон | когда-нибудь (с корпусом пилота, строка 85) | размеченный класс → решение | 04-unhappy §5, D39.90 |
|
||
| 111 | **Дубль ключа пар-файла: фикс накрыл половину.** D39.82 закрыл строку 53 через `putUniqueDC` в `parseDCCheckers`, но генерик-парсер категорий `parseCategoryRows` (`internal/lang/langpack.go:806-826`, строка `cats[f[0]][f[1]] = val`) по-прежнему МОЛЧА last-wins — а якорь техдолга указывал именно на него. Пар-данные с опечаткой-дублем тихо теряют первую строку | бэкенд | когда-нибудь (малое касание, с любой правкой langpack) | fail-loud + тест | 13-tech-debt-anchors, D39.82, D39.90 |
|
||
| 118 | **tools/go.mod — РЕШЕНИЕ ПРИНЯТО (D39.97 п.4): строить отдельным малым паком.** `cmd/tmvet`+`internal/archguard` → отдельный модуль (`backend/tools/`); `make battery` гоняет оба модуля; `tool`-директива Go 1.24 НЕ решает (MVS общий). Выигрыш: бамп инструментов физически не двигает x/net/x/text. Sqlite 1.55 остаётся (D39.97 п.4) | бэкенд | скоро (до следующего бампа зависимостей) | малый пак по D39.97 п.4 | D39.96 п.6, D39.97 |
|
||
| 119 | **x/text-детерминизм: вердикт-несущие вызовы НЕ свёрнуты в версии (находки-5/6 приёмки).** `SanitizerVersion` не сворачивает ничего x/text-ного, а `detectCJKLeak` зависит от `width.Fold` (`sanitizer.go:211,687`) — смена x/text перевернула бы вердикт БЕЗ смены снапшота; `ExportNormalize` меняет экспортные байты вне хешей (`sanitizer.go:709`); `xTextVersion` пинит строку go.mod, НЕ скомпилированные таблицы — тулчейн go1.27 переключит x/text на Unicode 17.0.0 МОЛЧА (`tables17.0.0.go //go:build go1.27`; жилец реестра 108). Делать: явные версии-свёртки + механическую сверку «таблицы↔константа» вместо совпадения | бэкенд | скоро | правка версий-свёрток + тест | D39.96 п.6, отчёт §5 находки-5/6 |
|
||
| 120 | **`buildCheckers` жёстко берёт `lang.Load(root,"zh","ru")`, бейзлайны ключуются по классу, не по паре (§7-8) — приезд ja-ru требует правки Go, против мандата общности §0.1.** Родня строки 115 (явный embed-список целей) — брать одним касанием | бэкенд | скоро | правка Go + тест на паре-которой-нет | D39.96 п.6, отчёт §7-8 |
|
||
| 121 | **archguard v2 — остаток (б)/(в)/(г)/(д); (0а)/(0б)/(а) ЗАКРЫТЫ дофиксом D39.97.** Полный фикс-лист посадок приёмки D39.96 с file:line — дословно в `architecture/13-tech-debt-anchors.md` §Б-121 | бэкенд | скоро (остаток: (б) тип вместо свитча · (в) build-теги · (г) 4-й анализатор · (д) семь пропусков) | правка анализатора + посадки | D39.96 п.2/п.6, отчёт §7-9/12/13 |
|
||
| 122 | **Гигиена пака стандартов — 11 микро-пунктов, не-блокеры приёмки (D39.96/97).** Полный список дословно — `architecture/13-tech-debt-anchors.md` §Б-122 | бэкенд | когда-нибудь | мелкие правки | D39.96 п.6, отчёт §7-6/7, §9 хвост |
|
||
| 123 | **Полигон: `jieba==0.42.1` — build-time зависимость артефакта контраста `eval/exp16/data/jieba_dict_general_zh.txt`** (пере-собран бэкенд-сессией 03.08, полный sha256 сошёлся с пином `16-bank-mining.md`); дописать в манифест окружения полигона с пометкой «build-time, не runtime» | полигон | когда-нибудь | строка манифеста | D39.96 п.6, отчёт §7-4/§6 |
|
||
| 124 | **Калибровка снапшота (вопрос владельца 04.08, разбор D39.97 п.5): нацеленность, не агрессивность.** Три оси одним дизайн-паком: (а) недо-чувствительность — вердикт-несущие вызовы x/text не свёрнуты (вход: строка 119); (б) пере-охват — `EmbeddedVersion` фолдит все пары разом → пер-парный хеш (родня 115/120); (в) дешёвая перекупка: `tmctl resnapshot --dry-run` — байт-сверка тел по чекпойнтам (`msgsContentHash`), идентичные юниты пере-привязываются без пере-вызова, платятся только изменившиеся. «Поведенческий отпечаток вместо строки версии» отложен (пол ≠ доказательство) | бэкенд | когда-нибудь (перед МАСШТАБОМ — когда перекупки станут реальными деньгами) | дизайн-пак по D39.97 п.5 | D39.97 |
|
||
|
||
*(Хроника сессий №11–№13, 02–04.08 (D39.91–105: ручки эффорта · стандарты репо · archguard · S2 · контракт API v0 · платформа P0 · банк-арбитраж research/24) — в [archive/PROGRESS-2026-08-02-04.md](archive/PROGRESS-2026-08-02-04.md).)*
|
||
|
||
*(Хроника сессий №9/№10, 31.07–02.08 (D39.59–90: курс «общность вперёд» · свип полноты · качество банка · фикс-пак · coldrun-b · фронт/платформа открыты · шов движок↔платформа · промт арбитража банка) — в [archive/PROGRESS-2026-08-01-02.md](archive/PROGRESS-2026-08-01-02.md).)*
|
||
|
||
|
||
*(Хроника 25.07–31.07 до курса D39.59 — эры №7/№8 и начало №9: паки 16–20, мини-прогон, полигон-пакеты 5–8, ToS-речеки, пак-19, холодный прогон (лендинги D39.26–58) — в [archive/PROGRESS-2026-07-25-31.md](archive/PROGRESS-2026-07-25-31.md).)*
|
||
|
||
## Бэкенд
|
||
|
||
**⟶ Состояние бэкенда — CURRENT-STATE (один носитель, D39.80); здесь только пинги живых сессий.**
|
||
|
||
*(Пинги закрытых паков — фикс-пак банка D39.118, блокеры контракта D39.122 — в [archive/PROGRESS-2026-08-04-09.md](archive/PROGRESS-2026-08-04-09.md), D39.125.)*
|
||
|
||
*(Закрытые бэкенд-записи 01–02.08 — общность фаза 2 · качество банка (оба этапа) · фикс-пак банка · finding-1 · пакет-чекеров · мелкая пачка · coldrun-b · ручка эффорта — в [archive/PROGRESS-2026-08-01-02.md](archive/PROGRESS-2026-08-01-02.md).)*
|
||
|
||
|
||
### Пак «эмиттер шва» (строки 103 + 135 + 165 + PD-196) — исполнен, дерево на лендинг (14.08)
|
||
|
||
Зона `backend/` только; чужого не тронуто (`git status` в начале: чужие `docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md`, `docs/README.md`, `docs/experiments/23-editor-tier.md` — не трогал). Пак $0: ни одного платного вызова, всё на фикстурах и фейках.
|
||
|
||
**§0. Комплектность против промта, пункт за пунктом.**
|
||
|
||
| Пункт промта | Статус | Где |
|
||
|---|---|---|
|
||
| 1. Четыре развилки дизайна, решены ДО кода | сделано | §1 (формат · PD-60 · fsync · формула outbox) |
|
||
| 2. Эмиттер `events.jsonl` (103): hello/seq/повторимость/словарь/деньги/сброс буфера | сделано | §2, §3 |
|
||
| 3. Событие потолка + различимые exit-коды (165, PD-113, PD-196) + день-потолок (PD-157) | сделано | §4 |
|
||
| 4. Гейт потолка пер-вызов (135) | сделано + оспорена посылка дока | §5 |
|
||
| 5. Внешний trace-контекст (102) — «если ложится единичным касанием» | взято | §6 |
|
||
| Дифф словаря против `events.go` | сделано, 6 позиций, п.4 — запрос к платформе | §3 |
|
||
| Сверка с `research/23` §2 (оговорка нормдока §7 п.1) | сделано, расхождений нет | §3а |
|
||
| Батарея EXIT=0 вкл. `-race`, счётчик тестов вырос, удалённых 0 | сделано | §7 |
|
||
| Тесты пака, каждый падает на сломанном коде | сделано, 8/8 мутаций CAUGHT | §7 |
|
||
| Сквозная проба настоящим читателем платформы в КОПИИ зоны | сделано | §7 |
|
||
| Голден/снапшот-нейтральность | доказана | §7, §7а(2) |
|
||
| Мандат самопроверки: ревью ИСПОЛНЕНИЕМ | сделано (мутации · крэш-тест · сквозная проба · батарея) | §7 |
|
||
| Мандат самопроверки: адверсариальное ревью диффа `author≠reviewer` | **ИСПОЛНЕНО НЕ ПО БУКВЕ** — ревьюером был автор, независимого контекста не было | §7 |
|
||
| Предметные оси D39.120 (общность · деньги/детерминизм · транзакционность) | сделано | §7а |
|
||
| **Открытые вопросы оркестратору** | 3 | §5 (эскалационный кап; формулировка строки 135/дока), §3 п.4 (фолд `unit_done` у платформы) |
|
||
|
||
**§1. Развилки дизайна — решены до кода.**
|
||
|
||
1. **Формат журнала — одиночный `events.jsonl`, одна строка = один `write(2)`.** Отвергнуто: пофайловые `events/<seq>.json` и CRC-фрейминг — читатель платформы построен ровно под одиночный файл (`ingest/tail.go:17`, `runs/reconcile.go:237`, `runs/spawn.go:258`), смена формы = согласованная правка ОБЕИХ зон. Возражение research/25 («JSONL слеп к битой записи с валидным `\n`») разобрано и не выжило: строка и её `\n` уходят одним write, поэтому рваный хвост может оставить только МЁРТВЫЙ процесс, а тейлер намеренно не двигает курсор за строку без `\n` — значит обрезка хвоста до последней полной строки не может укоротить файл ниже смещения живого читателя и его алярм «shrank ⇒ not append-only» не сработает. Ремонт хвоста делается один раз, при открытии, до своего hello.
|
||
2. **PD-60 «журнал не пишется» — ДЕГРАДИРУЕМ ГРОМКО, прогон не останавливаем** (позиция выбрана явно; вторая — блокировать/падать — законна и отвергнута с обоснованием). Оплаченная книга не должна умирать из-за канала свежести: деньги держат холд платформы и потолок движка, ни то ни другое от файла не зависит (D39.106 п.2), а два самых важных факта — стоп по потолку и graceful stop — дублируются РАЗЛИЧИМЫМИ кодами выхода, т.е. переживают ненаписанный журнал. Ничего не теряется: строки лежат в outbox, каждое следующее событие ре-проецирует весь незакрытый префикс, транзиентный ENOSPC/EIO самозалечивается. Не залечился — ратифицированный запасной канал `status --json`. ERROR печатается один раз на переход, не на событие.
|
||
3. **fsync: файла — НЕТ, каталога — ОДИН РАЗ при создании.** Журнал есть проекция коммитов SQLite при `synchronous(NORMAL)` («survives kill -9; power loss is outside the MVP threat model», `store/store.go`) — проекция не может быть надёжнее источника, поэтому fsync на событие не покупает ничего и стоит одного fsync на юнит книги в 4000 юнитов. Каталог синкается ровно там, где это что-то значит: имя файла не пере-создаётся ни одним последующим append. Закрывает NOTE D39.122.
|
||
4. **Как «строка события в той же транзакции, что чекпойнт» легла на `internal/store`.** Порядок-инвариант: факт коммитится в SQLite → строка кладётся в outbox → outbox проецируется в файл. Журнал не может утверждать то, чего нет в БД (направление, которое стоило бы денег и врало пользователю). Транзакцию делит ОДНО событие — `spend`, внутри `SettleWithCheckpoint` (номер seq и сумма `committed` читаются в той же транзакции после дебета): это единственное место, где расхождение было бы расхождением о ДЕНЬГАХ. Разбор по событиям: потеря строки безвредна для `spend` (кумулятив) и `progress` (присваивание) и НЕ безвредна для `unit_done` (единственный считающий эффект) — для него сделан отдельный механизм (см. §2). Отвергнуто: тянуть транзакцию в `UpsertChunkStatus` — у юнита черновой волны нет ОДНОЙ строки (члены пишутся разными воркерами), и вычислять «волна закрыла юнит» пришлось бы SQL-запросом внутри store, чей заявленный принцип — «dumb storage».
|
||
|
||
**§2. Эмиттер (строка 103).** `hello` первой строкой, `seq` плотный, резюм = новый процесс со своим `engine_run_id` и `seq` с 1 в тот же файл. Строка хранится в outbox БАЙТАМИ и проецируется копией — пере-рендер с новым timestamp дал бы `ErrPayloadConflict` и карантин проекции. Буфера в юзерспейсе НЕТ вовсе — это и есть ответ на PD-61(а): `os.Exit`/`log.Fatal`/паника пропускают defer, а терять нечего, если ничего не удерживается (краш-пути перечислены и покрыты: SIGKILL посреди волны, `os.Exit` без defer, отказ файла, отказ outbox). Счётчики — в ВЫХОДНЫХ ЮНИТАХ, через ту же одну арифметику, что и `status` (`waveShape`, вынесена из `status.go`), иначе поток и ре-синк-канал считали бы в разных шкалах, а платформа складывает их в одну колонку.
|
||
**`unit_done` — реестр «объявлено однажды» в outbox** (`once_key`, строки переживают свой прогон). Ключ пишется ПОСЛЕ того, как строка легла на файл, и это несущий порядок: реестр запоминает не «строка создана», а «читатель её видел». Крэш-тест поймал реальную дыру: окно между коммитом диспозиции юнита и объявлением — не микросекунды, а миллисекунды (пост-чек, дешёвые гейты, voice, retrieval_state), и SIGKILL посреди волны терял 1–4 объявления на прогон, т.е. главу, которая НИКОГДА больше не досчитается (`chapters.units_done >= units_total` — вход в `ChaptersLeft`). После фикса — 0 потерь на 12 прогонах. Остаточное окно (строка на файле, реестр ещё не записан) даёт ДУБЛЬ, а не потерю: это ратифицированная сторона at-least-once (D39.119 п.3), и её обязан поглощать потребитель — см. дифф ниже.
|
||
|
||
**§3. Дифф словаря против `platform/internal/ingest/events.go` (ответ зоны движка, пингом, не молча).**
|
||
|
||
| # | Расхождение | Почему |
|
||
|---|---|---|
|
||
| 1 | `Progress.eta_seconds` ЭМИТИТСЯ, из темпа ЭТОГО прогона | ⚠ Первая редакция пака его опускала — довод «поле опционально, ре-синк его несёт» **опровергнут независимым ревью и проверен по коду потребителя**: обработчик `progress` присваивает колонку безусловно (`update runs set … eta_seconds = $6` через `etaOrNil`, `pgstore/sink.go:110-113`), поэтому отсутствующее поле декодится в 0 и ОБНУЛЯЕТ оценку, которую только что записал ре-синк, — на каждой строке потока. Опустить поле ≠ оставить его в покое. Считается ин-процесс (время с начала волн ÷ юнитов, решённых этим прогоном, × остаток), без единого запроса; расхождение с книго-пожизненным средним `status.go` намеренно — альтернативой было не «второе мнение», а «оценки нет вовсе». |
|
||
| 2 | `Ceiling` += `scope: book\|day` | Не деньги, а КАКОЙ потолок остановил прогон. Закрывает диагностическую половину PD-157: дневной потолок платформа не выбирает и не видит, и сегодня не отличает его от своего. |
|
||
| 3 | `Finished.outcome` += `ceiling`, `stopped` | В предложении clean\|flagged\|bank_stop\|failed. Стоп по потолку не ложится ни в одно: `failed` — ровно то, что контракт запрещает для резюмируемого стопа (PD-113), а поток без терминальной строки делает «остановлен намеренно» неотличимым от «обрублен крэшем». `stopped` — то же для пойманного SIGTERM (PD-152). Сегодня безопасно: `RunSink.effect` на `finished` — no-op. |
|
||
| 4 | **ЗАПРОС К ПЛАТФОРМЕ: складывать `unit_done` ПРИСВАИВАНИЕМ, а не инкрементом** | `pgstore/sink.go:171-176` делает `units_draft_done + 1`. При at-least-once (ратифицировано D39.119 п.3) считающий эффект обязан быть идемпотентным у ПОТРЕБИТЕЛЯ — со стороны движка граница «файл записан / доставка отмечена» транзакцией не накрывается ничем. Событие несёт стабильную тройку (chapter, unit=leader `first_chunk_idx`, wave) — ровно ключ манифеста, — поэтому присваивание точно при любой доставке. То же снимает пере-счёт при `redrive`/`--resnapshot`/пере-нарезке. |
|
||
| 5 | `unit_done.unit` = ЛИДЕРНЫЙ индекс чанка | Это `first_chunk_idx` манифеста, «the join key for every progress read» — джойнится напрямую, без догадок. |
|
||
| 6 | Чёрновая волна считается в ЮНИТАХ, не в чанках | `chapters.units_total` приходит из манифеста в выходных юнитах; счёт чанками разъехался бы со знаменателем. |
|
||
|
||
**§3а. Сверка с `research/23` §2 (оговорка нормдока §7 п.1 — «со словарём не сверялся»).** Расхождений НЕТ: один JSON-объект на строку · первая строка всегда version-хендшейк · semver по terraform (минор = игнорируй незнакомое, мажор = отвергай) · дисциплина stdout (машинный канал отдельно от человеческих логов; у нас он вообще файл, а slog как был на stderr) · обязательная пара «поток + реконсиляция», консюмер идемпотентен по `(run_id, seq)`. Единственное уточнение против §2: у нас транспорт не stdout, а файл — это уже ратифицировано D39.106 п.2 поверх D39.85, `research/23` в этой части superseded, не противоречив.
|
||
|
||
**§4. Строка 165 + PD-196 — shell-контракт.** Занятые 0/1/2/3 не тронуты. Новое: **4** — стоп по потолку (`*pipeline.CeilingHalt`, типизированная ошибка, обёртывает прежний сентинел, поэтому все `errors.Is`-деградации хопа/репэйра/терминолога работают как были); **5** — graceful stop (в tmctl контекст прогона отменяет ТОЛЬКО `signal.NotifyContext`); **10–19 — ПОЛОСА ОТКАЗОВ**, «отказано до всякой работы»: 10 конфиг невалиден, 11 источник нечитаем, 12 проект занят другим процессом, 19 класс, которому у этой сборки нет номера. Полоса, а не список, — это и есть «расширяемость словарём»: потребитель читает диапазон, и НЕзнакомый класс попадает в него же и читается как «отказ», а не как «упало» (интейк тогда не удаляет файл пользователя). Класс живёт в `pipeline.RefusalClass`, номер — в таблице `cmd/tmctl/main.go`. ⚠ **Граница класса 11 после независимого ревью сдвинута и стала УЗКОЙ:** он выдаётся ТОЛЬКО когда чтение и нарезка прошли, а книги в байтах нет. Всё остальное — 10. Довод ревьюеров принят: 11 — это вердикт, по которому интейк УДАЛЯЕТ загрузку пользователя, а отсутствующий путь, права, I/O-ошибка и даже провал декодирования конфигурационно объяснимы (декодирование ведут объявленные `encoding`/`source_lang`, то есть «байты не текст» и «ты сказал читать их не так» — одна и та же ошибка). Единственное, что движок может утверждать о ТЕКСТЕ без конфига в промежутке, — «прочли, нарезали, переводить нечего». День-потолок: решено дёшево — `scope` внутри `ceiling` (см. дифф п.2).
|
||
|
||
**§5. Строка 135 — фактическая граница по коду, «было/стало» числом.** Посылка дока разобрана: **потолки книги/дня были пер-вызовными уже давно** — `Reserve` вызывается на каждый свежий attempt (`stagerun.go`) и сверяет накопленное committed+reserved с потолками (`ledger.go:44,67-72`). То есть `15-money-path.md` §2 п.2 («гейт сегодня на границе юнита работы») по отношению к ПОТОЛКАМ неверен — **пинг оркестратору: поправить формулировку строки 135/дока**. На границе юнита сидел РЕПЭЙР-суб-бюджет: одно решение `spent >= budget` перед циклом кандидатов, после которого юнит покупал до `max_calls_per_unit` свежих вызовов, и каждый параллельный воркер — столько же. Ужесточено до пер-вызовного с ЦЕНОЙ вызова (форма, которая у терминолога была всегда). Измерено на фикстуре, лог прогона: `spent_usd=0.000000 next_call_usd=0.001063 budget_usd=0.0005315` — БЫЛО: вызов покупался, бюджет превышен в 2.0×; СТАЛО: 0 вызовов, дефект остаётся флагнутым (шаг опциональный), уже оплаченный репэйр по-прежнему реплеится бесплатно.
|
||
**Не сделано осознанно, вопрос оркестратору:** эскалационный кап `escalationBudgetRemains` — уже пер-вызовный (хоп = один вызов), но не ПРИЦЕНИВАЕТ его; допустимый перелёт «до одного хопа» задокументирован в коде и запинен ТРЕМЯ тестами, т.е. это ратифицированная граница, а не недосмотр. Ужесточение сломало бы их (проверено исполнением) — по CLAUDE.md «несогласие с тестом — вопрос, не правка». Ужесточать?
|
||
|
||
**§6. Строка 102 — взято.** `TM_TRACE_ID` принимается средой (не argv: argv в этой зоне намеренно свободен от идентичности прогона — PD-99), валидируется (≤64, печатаемый ASCII без пробелов), негодное ЗНАЧЕНИЕ отвергается и чеканится своё. Он же становится `engine_run_id`, т.е. пространство идемпотентности шва делается платформенным по построению — ровно то, что предвидит коммент `events.go:75-78`.
|
||
|
||
**§7. Проверки исполнением.** Батарея зоны целиком EXIT=0 (`make battery`: build · vet ×4 · gofmt · golangci-lint 2.12.2 «0 issues» · `go test ./... -race -count=1`), скипы: `TestHelperEventsRun`, `TestHelperKillLoop` (оба — хелпер-процессы by design). Тестов **749 → 784** (+35, удалённых 0; `git grep -c "^func Test"` HEAD против дерева). Голден/снапшот-нейтральность: `TestGoldenDeterminism` зелёный, `testdata/` не тронут (`git status` пуст по каталогу) — snapshotID/request_hash/wire пинятся им бит-в-бит, значит эмиттер наблюдаемость, а не семантика. **Мутации (каждый тест обязан падать на сломанном коде): 8/8 CAUGHT** — репэйр-гейт назад в пер-юнитный · exit-код потолка схлопнут в 1 · счётчики пере-считывают реплей · progress застыл на нуле · `bufio.Writer` вокруг журнала (PD-61а) · ремонт рваного хвоста снят · seq съеден упавшим рендером · `spend` выкинут из транзакции settle. **Сквозная проба с НАСТОЯЩИМ читателем платформы** — в КОПИИ зоны вне рабочего дерева (D22 п.10, `scratchpad/platform-copy`), журнал произведён боевым `tmctl translate` дважды: `ingest.Tail` принял (hello adopted, `seq=15`, materialized `progress:5 unit_done:4 spend:4 finished:1`, регион второго процесса корректно пропущен как чужой run id); повторное чтение за курсором применяет 0 событий; подделка payload на том же seq → `ErrPayloadConflict`; строгий ДЕВ-декодер пайпа принял один регион целиком (14 событий после хендшейка).
|
||
**⚠ Про `author≠reviewer` — исполнено НЕ по букве, и это пропуск, а не формальность.** Ревью диффа делал АВТОР, в СВОЁМ контексте: отдельного ревьюера/свежего контекста не было, субагенты и воркфлоу не запускались (дефолт харнесса запрещает звать их без явного запроса пользователя, и сессия прочла этот запрет как побеждающий строку промта; санкция механизма в промте названа не была). Значит ровно то, ради чего требование существует — снятие контекстного закрепления и self-preference (D39.120 п.1б) — НЕ получено: свои слепые пятна изнутри не снимаются, сколько бы находок пас ни дал. Первая редакция этой записи подавала пас формулировкой «author≠reviewer», приписывая разделение, которого не было — исправлено здесь. **Независимый пас ПРОВЕДЁН (см. §9), так что дыра ниже закрыта — но закрыта позже отчёта, и запись оставлена как есть.** Ультраревью владельца 14.08 вторым рубежом не стало, и это установлено исполнением: облачный бандл собирает ОТСЛЕЖИВАЕМЫЕ файлы, а весь новый код пака лежит untracked (`??`) — `internal/runevents/`, `pipeline/events.go`, `pipeline/refusal.go`, `store/outbox.go` и все новые тесты. Ревью честно отчиталось «пакет не собирается, символов нет» (его находка bug_001) — против дерева, в котором этих файлов действительно не было; у себя `go build ./...` зелёный, файлы на месте, символы определены (сверено пофайлово). Корреляция точная и в обе стороны: КАЖДЫЙ файл, названный отсутствующим, — untracked; КАЖДЫЙ разобранный — tracked. Следствие для приёмки: **молчание ультраревью о шве не есть свидетельство его корректности — шов оно не читало**; независимый пас по эмиттеру всё ещё не проведён. Чтобы облачное ревью его увидело, файлы должны быть сначала застейджены/залендены (лендит оркестратор — сессия не коммитит). Ниже — записка-план того, что дал пас АВТОРА (5 находок, все закрыты): A1 отказ чтения диспозиций ронял оплаченный прогон вопреки собственной политике §1.2 → деградирует, счётчики просто не публикуются; A2 `openEvents` возвращал ошибку, которую никто не мог вернуть (мёртвая ветка и потенциальный канал «наблюдаемость останавливает прогон») → сигнатура без ошибки; A3 `draftUnitOutcome` перестраивал индекс чанков на КАЖДЫЙ закрытый юнит — квадратично по книге (18M операций на 4276 юнитов) → индекс строится один раз в трекере; A4 `bankCallEstimateUSD` держал вторую копию арифметики оценки вызова → делегирует в `callEstimateUSD` (одно определение — то же основание, что у `attemptRequest`); A5 классификация «источник нечитаем vs конфиг битый» не была запинена → три теста в `internal/config`.
|
||
|
||
**§7а. Предметные оси самопроверки (D39.120).** (1) **Общность §0.1** — «заработает ли пара, которой в репо нет, без правки Go?» ДА и для событий: словарь несёт счётчики, порядковые номера, имена волн (`draft`/`edit` — роли движка, не язык), движковые enum-причины флагов и целые micro-USD; ни одной пар-, книго- или письменность-зависимой ветки в `internal/runevents` нет (пакет не импортирует ни `lang`, ни `config`), пара-специфика в поток не попадает вовсе. (2) **Деньги и детерминизм** — события не входят ни в `BriefHash` (канон-структура явная), ни в снапшот, ни в `RequestHash`: доказано зелёным `TestGoldenDeterminism`, который пинит snapshotID/request_hash/wire бит-в-бит, и нетронутым `testdata/`. Суммы едут только внутри `spend`, целыми micro-USD с округлением ВВЕРХ (леджер — нижняя граница), float и строковых форм на шве нет (урок PD-79); `ceiling` несёт факт и `scope`, ни одной цифры (пинится тестом, ищущим `$`/`usd` в payload); в INFO и argv деньги и id книги не добавлены. Строка повторима байт-в-байт по построению (хранится, а не пере-рендерится). (3) **Транзакционная целостность outbox — краш-точки поимённо и чем покрыты:** ① между коммитом факта и вставкой в outbox → `unit_done` объявит следующий процесс (реестр «объявлено», крэш-тест: покрытие всех unit×wave после SIGKILL); `spend` вообще не в окне — он ВНУТРИ транзакции settle (`TestASettleThatRollsBackLeavesNeitherCheckpointNorEvent`); ② между вставкой и попаданием строки на файл → строка остаётся в outbox, ре-проецируется следующим событием байт-в-байт (`TestAStoredLineIsHandedBackByteForByte`), при смерти процесса ключ реестра не выставлен ⇒ следующий процесс объявит заново (`TestAnUndeliveredAnnouncementIsRetriedByTheNextRunAndADeliveredOneIsNot`); ③ между попаданием на файл и записью в реестр → ДУБЛЬ, не потеря; at-least-once сторона, названа в §3 п.4; ④ откат транзакции с уже выданным seq → номер не тратится (`TestARolledBackEventConsumesNoSequenceNumber`), дыра для читателя фатальна; ⑤ смерть посреди `write(2)` → рваный хвост, обрезается при следующем открытии до последней полной строки (`TestATornTailIsCutBackToTheLastCompleteLine`), а тейлер такую строку и так не читает; ⑥ `os.Exit`/`log.Fatal`/паника → терять нечего, буфера нет (`TestTheTerminalEventSurvivesAnExitThatSkipsEveryDefer`, ловит посадку `bufio.Writer`).
|
||
|
||
**§9. Независимое адверсариальное ревью (14.08, после отчёта) — и оно оплатилось.** Два пасa со СВОИМ контекстом: панель из 13 агентов (6 осей → по опровергателю на ось → синтез; 25 находок пережили опровержение, 5 опровергнуто) и кросс-семейный ревьюер ДРУГОЙ модели (D39.120 п.1а — в первом заходе я его не запустил, это был мой пропуск). Обе панели независимо назвали одни и те же два несущих дефекта. Записка-план «находка → статус → улика»:
|
||
|
||
| ID | Находка | Статус | Улика |
|
||
|---|---|---|---|
|
||
| R1 | Переиспользованный `TM_TRACE_ID` продолжает нумерацию прошлого процесса: проекция стартует с курсора 0 и **пере-дописывает весь прошлый поток**, затем ставит hello на seq≠1 → тейлер отвергает хендшейк навсегда | ЗАКРЫТО | воспроизведено мной живым бинарём: 33 строки, 15 байт-в-байт дублей, hello@16. Свежая идентичность потока + ERROR; тест + мутация |
|
||
| R2 | Частичная запись оставляет префикс строки, а ретрай дописывает ту же строку целиком → склейка, которую не чинит никакой ремонт | ЗАКРЫТО | ретрай досылает ТОЛЬКО остаток; тест на коротком писателе + мутация. Мой доккоммент «транзиентный ENOSPC самозалечивается» был ложью |
|
||
| R3 | Ремонт рваного хвоста ОБРЕЗАЛ файл ниже смещения, которое платформа сеет из `stat` (`journalSize`) → «journal shrank ⇒ not append-only» → карантин здорового резюма | ЗАКРЫТО | сверено по коду платформы; ремонт теперь ПАДДИТ пробелами (файл монотонен по длине), тест на «не укоротился» + мутация |
|
||
| R4 | Пропуск `eta_seconds` не «оставляет поле в покое», а ОБНУЛЯЕТ колонку читателя на каждой строке | ЗАКРЫТО | сверено по `pgstore/sink.go:110-113`; поле эмитится, тест + мутация |
|
||
| R5 | Класс 11 (по которому интейк удаляет загрузку) ловил конфиг-объяснимые отказы: неверный `encoding`, отсутствующий путь, права, I/O | ЗАКРЫТО | граница сужена до «прочли и нарезали — книги нет»; 4 подтеста живым бинарём + 2 мутации |
|
||
| R6 | Отказ чтения базовой линии счётчиков глушил и `unit_done` — вопреки моему же доккомменту | ЗАКРЫТО | объявление больше не зависит от счётчиков |
|
||
| R7 | Ключ реестра «объявлено» без измерения КНИГИ: две книги на одном `project_db` — вторая не объявляет ничего | ЗАКРЫТО | ключ книго-скоупнут; тест на две книги + мутация |
|
||
| R8–R10 | Три ВЫЖИВШИЕ мутации в моих тестах: payload `unit_done` (shipped/flagged/reason) не проверялся · расположение журнала не пинилось · политика PD-60 не проверялась ничем | ЗАКРЫТО | три теста, каждый убивает свою мутацию |
|
||
| R11 | Отказ писал в поток терминальное `finished{failed}`, хотя код выхода говорил «отказано, ничего не делали» | ЗАКРЫТО | отказ не пишет терминальной строки вовсе |
|
||
| R12 | При деградации журнала каждое событие пере-читает весь непроецированный хвост (квадратично по длине деградации) | НЕ ЧИНЮ | производительность на аварийном пути; названо |
|
||
| R13 | Крэш-тест разбирает журнал сам, а не настоящим тейлером | НЕ ЧИНЮ | модуль движка не может импортировать `platform/`; покрыто ручной сквозной пробой в копии зоны (§7) |
|
||
| R14 | `scope` в `ceiling` не закрывает PD-157: потребитель поле игнорирует | НЕ ЧИНЮ | это ПРЕДЛОЖЕНИЕ платформе, уже в диффе §3 п.2 |
|
||
| R15 | Два `translate` в одну секунду дают 1 вместо 12 (коллизия имени бэкапа по секундной метке маскирует класс «занято») | НЕ ЧИНЮ | преexisting дефект `backupStamp`, вскрыт ревью; не мой пак — оркестратору |
|
||
|
||
Перепроверено после починок: батарея EXIT=0 целиком (`-race`, lint 0 issues), тестов **749 → 792** (+43, удалённых 0), сквозная проба настоящим тейлером/декодером платформы пере-прогнана на НОВОМ потоке и проходит, голден не двинулся.
|
||
|
||
**§10. Дофикс до лендинга (записка приёмки 14.08, три пункта).**
|
||
|
||
| # | Пункт | Что сделано | Улика исполнением |
|
||
|---|---|---|---|
|
||
| 1 | `EnqueueOnce` шёл полным SCAN'ом мимо частичного UNIQUE-индекса | Воспроизведено у себя: `EXPLAIN QUERY PLAN` на `once_key = ?` → **`SCAN events_outbox`**; с предикатом `AND once_key <> ''` → **`SEARCH events_outbox USING COVERING INDEX events_outbox_once (once_key=?)`**. Взята форма «предикат в запросе» — схема не трогается вовсе (v15 остаётся как есть), партиал-индекс начинает работать. Запрос вынесен в константу `onceKeyLookup`, чтобы тест объяснял БОЕВОЙ запрос, а не свою копию | `store.TestTheAnnounceLedgerLookupUsesItsIndex` (гоняет EXPLAIN над константой и требует `USING COVERING INDEX`, запрещая `SCAN`); мутация «снять предикат» — CAUGHT |
|
||
| 2 | `PendingEvents` при деградации перечитывал весь непроведённый префикс на каждое событие | Добавлен `LIMIT` (батч 256) + `project()` крутит цикл до опустошения. На здоровом прогоне поведение прежнее (один батч), на аварийном пути стоимость события стала константой вместо длины префикса; аллокация под мьютексом ограничена батчем | `store.TestPendingEventsReturnsAtMostOneBatch`; мутация «снять LIMIT» — CAUGHT |
|
||
| 3 | `StreamVersion` остался `1.0` при добавленном поле и двух значениях исхода | **Бампнут в `1.1`** — решение явное. Правило, которое я сам цитировал, говорит «добавление поля бампает минор», а версия есть факт о БАЙТАХ на проводе, не о том, принят ли дифф словаря: оставить 1.0 значило бы, что два потока с разным содержимым объявляют одну версию. Читатель сверяет только мажор (`ingest.checkVersion`), поэтому бамп безопасен в обе стороны — если `scope` позже отклонят, снятие поля будет ещё одним минором | сквозная проба пере-снята: тейлер принял поток `1.1` (`adopted … version="1.1"`, materialized `progress:5 unit_done:4 spend:4 finished:1`), подделка payload → `ErrPayloadConflict`, строгий дев-декодер принял регион целиком |
|
||
|
||
После дофикса: батарея EXIT=0 (`-race`, lint 0 issues), тестов **749 → 794** (+45, удалённых 0), голден не двинулся.
|
||
|
||
**§8. Открытое / грабли для приёмки.** (а) Миграция v15 поднимает пол схемы: `OpenReadOnly` громко отказывает БД старее бинаря, а платформа читает `status --json` ПЕРЕД спавном (`bookMeter`) ⇒ на апгрейде движка над старой книгой первый `status` упадёт, пока не отработает write-команда. Свойство преexisting для любой миграции, но у платформы теперь есть путь, который на него наступает — назвать вслух, лечить не в этом паке. (б) `redrive` удаляет строки диспозиций ДО прогона, поэтому базовая линия счётчиков окажется ниже, чем в прошлом прогоне: `progress` честно уедет вниз на число сброшенных юнитов (работа действительно отменена); `unit_done` при этом НЕ пере-объявляется (реестр). (в) Объём: 2 строки на юнит на волну (`unit_done`+`progress`) + `spend` на каждый платный вызов ⇒ ~6 строк на юнит (замерено на пробе: 2 юнита → 15 строк) ⇒ на 4276-юнитной книге ~26k строк (~4 МБ) и столько же мелких SQLite-транзакций; при WAL/NORMAL это единицы секунд, но цифра названа. (г) Пере-нарезка книги минтит новые id юнитов ⇒ новые ключи реестра ⇒ юниты будут объявлены заново; у платформы главы в этот момент и так пере-материализуются — за ней решение, сбрасывать ли счётчики глав.
|
||
|
||
### Микро-касание «`tmctl migrate`» (строка 174 — деадлок деплоя v15) — исполнено, дерево на лендинг (14.08)
|
||
|
||
Зона `backend/` только (`git status` в начале и в конце; чужие `docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md`, `docs/experiments/23-editor-tier.md`, `eval/*`, `frontend/*`, `platform/*` не трогал — платформенные читал read-only). $0: ни одного платного вызова, ни одной сетевой ручки. Промт закрывает §8(а) собственной приёмки эмиттер-пака.
|
||
|
||
**§1. Что построено.**
|
||
|
||
1. **`tmctl migrate --config book.yaml`** (`cmd/tmctl/migrate.go`) — write-open проекта БЕЗ прогона через `store.Migrate` (flock → шов `beforeApply` → миграции → `recoverReservations`) → печать `schema vN -> vM` / `already at schema vM` / `created … at schema vM`. Ни LLM, ни сети, ни ключей, ни денег.
|
||
2. **Конфиг-стек минимальный — только `config.LoadBook`** (прецедент `backup`): `LoadModels` отказывает конфигу с ценами старше 120 дней (строка 146), и $0-миграция поверх полного стека воспроизвела бы ровно тот деадлок, который лечит. Проверено исполнением: с ценами 200-дневной давности `status` = 10, `migrate` = 0; без `models.yaml` вообще — то же.
|
||
3. **Типизированный отказ схемы**: `store.SchemaMismatchError{Path,Found,Expected}` вместо двух прозаических ошибок `OpenReadOnly` (обе стороны + «файл есть, но не применено ничего» = v0, раньше это был exit 1 «проект сломан»). Класс `pipeline.RefusalSchemaMismatch` → **exit 13** в полосе 10–19; в тексте стабильный машинный токен `schema_mismatch found=N expected=M`. Классификация store-открытий сведена в ОДНУ экспортированную `pipeline.RefuseStoreOpen` (её зовут и `openRunner`, и `migrate`); неопознанный отказ остаётся вне полосы (exit 1) — полоса обещает «ничего не произошло», и по ней потребитель ЖДЁТ, а не чинит.
|
||
4. **Расширение сверх буквы промта, называю явно**: write-путь тоже ОТКАЗЫВАЕТ БД новее бинаря (`store.migrate`, до `recoverReservations`). Раньше `Open` открывал её молча и писал в неё кодом, который её схемы не знает, — при том что read-only путь ровно это запрещал. Для деплоя это обязательно: иначе `migrate` на такой БД «успешно» врёт и самолечение платформы («поймал 13 → migrate → повтор») уходит в вечный цикл.
|
||
5. **Restore point — ПОД ЛОКОМ и только когда шаг реально применяется** (шов `beforeApply` в `store.Migrate`), имя `<метка>-pre-migrate.db`. Посылка промта «write-open уже делает бэкап» НЕ подтвердилась: бэкап живёт в `preflightBackup` у translate/redrive.
|
||
|
||
**§2. Что нашла адверсариальная панель (4 линзы × 2 опровергателя, субагенты — разрешены промтом) и что с этим сделано.** Три линзы независимо воспроизвели ОДИН major, которого я не увидел: бэкап брался ДО флока и в том же секундном неймспейсе, что и платный путь. Следствия, воспроизведённые исполнением: (а) занятый проект получал полную VACUUM-копию под живым писателем и отказ 12 — и так на КАЖДЫЙ повтор; (б) повтор в ту же секунду падал с exit 1 («backup already exists») вместо 12, то есть вне полосы; (в) хуже всего — `migrate` → спавн прогона в ту же секунду ронял `translate` в его же pre-flight-гарде с exit 1, а это ровно та последовательность, ради которой команда сделана. То есть на строку 173 я наступил, хотя промт прямо просил не наступать. Исправлено швом под локом + отдельным именем; обе половины теперь закрыты тестами, которые ловят мутацию (см. §3). Ещё из панели: exit 1 на БД без `schema_version` (закрыто, п.3), «свойство «бэкап ДО шага» ничем не проверялось» (закрыто), «`RefuseStoreOpen` default-ветка без теста» (закрыто), формулировка деплой-порядка в моём README вела к миграции СТАРЫМ бинарём (исправлено), фикстура теста правит пакетную переменную `migrations` (restore переведён на `defer`). **§2а. ВТОРОЙ адверсариальный заход — по ИСПРАВЛЕННОМУ диффу (38 агентов, 0 ошибок; 3 линзы × 2 опровергателя + критик полноты).** Из 17 находок пережили верификацию 3, и главная — снова моя, в самом шве.
|
||
|
||
1. **MAJOR, найдено двумя линзами независимо, воспроизведено на 2.6 ГБ базе: шов сидел внутри общего 10-секундного `opTimeout`.** `open()` заводил ОДИН бюджет на всё открытие и отдавал его и шву, и шагам, и recovery. Бэкап — единственная работа, чья стоимость растёт с книгой; на большой книге он съедал бюджет, и первый же шаг падал `context deadline exceeded` → **exit 1 вне полосы отказов**, после уже оплаченной полной копии, а повтор писал ещё одну копию (метка секундная, имена не совпадают) — деплой не сходился и заливал том. Проверено вживую агентом на бинаре из этого дерева: копия 2.5 ГБ записана, миграции нет, exit 1; повтор — ещё 2.5 ГБ. **Починено:** каждая фаза берёт СВОЙ бюджет (`schemaBaseline` · `applyStep` на шаг · recovery), а шов не бежит ни под каким дедлайном пакета — работа каллера, его и границы. Побочно закрыт латентный дефект: один 10-секундный бюджет на всю 15-шаговую цепочку. Тест `TestTheSeamIsNotChargedToTheStoreOperationBudget` (бюджет ужат до 150 мс вместо десятисекундного сна; `opTimeout` стал `var` ради тестируемости) — мутация «вернуть общий дедлайн» ловится.
|
||
2. **MINOR: тест на имя restore point проверял константу, а не вызов.** `TestTheMigrationRestorePointNeverCollidesWithThePaidPath` не звал `migrateCmd` вовсе, поэтому пережил бы отказ продакшена от суффикса; связывал их только сквозной тест, зависящий от попадания в одну секунду. **Переписан** — гоняет реальный `migrateCmd`, снимает имя, которое выбрал продакшен, и требует, чтобы «голая» метка осталась свободной под pre-flight платного пути. Мутация «убрать суффикс на вызове» ловится детерминированно (и сквозной тест её ловит 10/10, а не «1 из 15» — измерено).
|
||
3. Третья находка — дубль первой другой линзой.
|
||
|
||
Правки после ревью: `store/store.go`, `store/migrate.go` + два теста; `README.md`, `main.go`, `refusal.go`, `runner.go`, `cmd/tmctl/migrate.go` с досмотра не менялись (сверено по патчу) — в репозиторий ревьюеры не лазили, мутации им были предписаны в копию.
|
||
|
||
**§3. Проверки — исполнением, не чтением.** `cd backend && make battery` **EXIT=0** (`-race`, golangci-lint 0 issues), пропущены только `TestHelperEventsRun`, `TestHelperKillLoop` (хелпер-процессы; корпусные — `battery-stand`, стенд-данных нет). Тестов **794 → 810** (+16 функций, изменённых/удалённых tracked-тестовых файлов — 0, проверено `git diff --name-only`). Голден бит-в-бит (`TestGoldenDeterminism` зелёный): промпты, провод и снапшоты не тронуты. **Мутационный прогон своего же кода (8 мутаций, все CAUGHT, дерево после — байт-идентично):** бэкап вне лока → падает locked-подтест; бэкап после шагов → падает шов-тест и money-тест CLI; имя бэкапа как у платного пути → падает сквозной тест; шов на no-op → падают два; `default`-ветка `RefuseStoreOpen` в полосу → падает refusal-тест; снятие гарда «новее бинаря» → падают три; пропуск `recoverReservations` → падают money-тесты; From/To местами → падают пять. **Живая проба на РЕАЛЬНЫХ БД стенда (копии в скрэтчпаде, оригиналы не тронуты):** `coldrun-a` v14 (149 чекпойнтов, $0.126068) — `status --json` = 13 с токеном `found=14 expected=15` → `migrate` v14→v15 → `status` = 0; `acceptance` v7 → v15 (весь ALTER-хвост v8–v14 разом); в обоих `committed` не сдвинулся ни на цент, чекпойнты целы, restore point лежит в ПРЕД-миграционной версии и с зелёным integrity; занятый проект (flock держит чужой процесс) — 12 дважды и каталога `backups/` не появилось вовсе; БД с версией 99 — 13 в обе стороны (`status` и `migrate`), файл не тронут. Транзакционность применения ШАГА проверена тестом (сорванный шаг оставляет версию прежней и не оставляет своих объектов); формулировку уточняю по замечанию критика — закрыт именно шаг, а не весь класс «крэш посреди migrate»: повтор после срыва заново снимает restore point, и эти копии никто не подчищает. Строку 49а не чинил и новых ALTER не вводил. **После правок второго захода** батарея пере-прогнана (EXIT=0, lint 0 issues, голден зелёный), мутаций стало 10 из 10 пойманных (+«вернуть общий дедлайн», +«снять суффикс на вызове»), живая проба на реальных v14/v7 книгах ПЕРЕ-снята новым бинарём: те же переходы, `committed` тот же до цента (0.126068 / 0.408077), restore point в ПРЕД-миграционной версии, `status` после — 0.
|
||
|
||
**§4. Деньги и PD-158 (проверено кодом и исполнением, как требовал промт).** `recoverReservations` трогает ТОЛЬКО `reserved_usd` (`store/store.go:226`, `UPDATE spend SET reserved_usd = 0 …`); `committed_usd` не читается и не пишется, чекпойнты не трогаются. Формула потолка PD-158 (аргумент = committed + прирост, БЕЗ reserved) стоит ровно на этом свойстве и НЕ ломается: `migrate` перед спавном делает `status` честнее — leftover-reserved зануляется тем же правилом, что и у `translate`, и только под флоком, то есть живую резервацию идущего прогона занулить невозможно (проект занят ⇒ 12). Settle-инвариант: `committed == SUM(checkpoints)` командой не двигается, поэтому `migrate`, случившийся между выходом процесса и расчётом платформы, расчёта не искажает; `reserved` легитимно ноль в любой момент (advisory, восстановим).
|
||
|
||
**§5. Платформе (пинг оркестратора в их журнал — их зона, я только читал).** (а) **Зоны сошлись на 13 независимо друг от друга** (вскрыто критиком второго захода; моя прежняя формулировка «их `exit.go` числа 13 не знает» была неверна уже на момент написания): их живое незакоммиченное дерево P6 держит `ExitSchemaMismatch = 13` (`ingest/exit.go:68`) и отдельную причину `ReasonSchemaMismatch` (`books/parse.go:76,300-304`) — ожидающую, загрузку не удаляющую. Движковый контракт совпал: exit 13 в полосе 10–19, класс `schema_mismatch`, токен `schema_mismatch found=N expected=M` на stderr. Сверять больше нечего — только ратифицировать (см. п. «е»). Это ровно то, чего ждёт их PD-201 (самолечение вместо стоп-мира). (б) **Направление важно**: `found < expected` — чинится `migrate`; `found > expected` — `migrate` тоже вернёт 13 и НЕ соврёт успехом, чинится обновлением бинаря. (в) **`deploy/README.md:134-148` их зоны: шаг 2 гонит `migrate` ДО установки нового бинаря** — старый бинарь уже на своей голове схемы, значит это no-op и деадлок остаётся; порядок обязан быть «дренаж → новый бинарь на место → `migrate` ИМ по книгам из `--migratable` → прогоны». Их гейт `Migratable() = !Live && !Resumable && !Unsettled` (`pgstore/books.go:396`) с движковой стороны подтверждаю: миграция уводит файл выше запиненного бинаря попытки, поэтому сметать можно только книги без открытых попыток — это записано и в шапке `cmd/tmctl/migrate.go`. (г) **Их же деплой-док цитирует мёртвую строку**: `deploy/README.md:127` приводит старый текст ошибки («schema vN … expects vM»), которого движок больше не печатает — теперь `schema_mismatch found=N expected=M`. (д) **Дыра неверного порядка — тихая**: no-op-миграция выходит с 0, поэтому сметание СТАРЫМ бинарём даёт полностью зелёный прогон при сохранившемся деадлоке; числом «мигрировал» и «уже был на голове» не различаются — это честная цена отказа от `--json` (см. §6). (е) **Ратификация**: полоса отказов в `05-decisions-log.md` (D39.131 п.2а), в CURRENT-STATE `PROGRESS.md:233` и в `15-money-path.md` перечислена как 10 · 11 · 12 · 19 — exit 13 сейчас ЕДЕТ НЕРАТИФИЦИРОВАННЫМ в обеих зонах сразу; нужна нота или эррата оркестратора, плюс закрытие строки 174 и ближней половины 175. (ж) **Откат движка после сметания стал ручным**: read-only и write-пути отказывают БД новее бинаря, а `tmctl restore` не существует и restore point никто не подчищает — откат на старую сборку требует ручного `cp` бэкапа по каждой книге. Назвать в рантбуке зоны; чинить — отдельной строкой, если владелец сочтёт нужным.
|
||
|
||
**§6. Чего НЕ делал (осознанно).** Строку 49а не чинил (не мой скоуп; применение шага и так атомарно — доказано тестом). Секундную метку `backupStamp` (строка 173) не менял — свою половину вывел из-под неё именем, коллизия `translate`↔`translate` остаётся как была. `--json` у `migrate` не делал: решение платформы читается ЧИСЛОМ (0 / 12 / 13), а человеческая строка уже несёт переход — **но у этого довода есть названная дыра** (критик второго захода): нулём «мигрировал» и «уже был на голове» не различить, а это ровно то, что производит неверный порядок деплоя (сметание старым бинарём даёт зелёный прогон при живом деадлоке). Если платформа захочет различать программно — это машинная поверхность на одну строку, решение владельца/оркестратора. Замороженную usage-строку `invocation.go` не трогал (её пинит тест; `backup`/`seed-lint` в ней тоже нет — вопрос оркестратору, чинить ли разом). `store.SchemaVersion` завёл и УБРАЛ, когда шов сделал его беспотребительским (мёртвую ссылку на него в комментарии теста критик поймал — вычищена). **Унаследованное, назвать и не чинить молча:** `config.LoadBook` по-прежнему статит `source_file`/`glossary_seed`/`mined_*`, поэтому книгу с заархивированным исходником не мигрировать (exit 10), хотя деньги её БД целы — гейт на ТЕКСТ на схемной операции, преexisting; `dbExists` в `migrateCmd` определяется ДО флока (TOCTOU самоограничен: созданная в окне БД уже на голове, шов не выстрелит; удалённая — exit 1 и ничего не применено). Дерево НЕ коммитил.
|
||
|
||
*(Закрытая хроника пакетов №0–№4 (04–10.07) перенесена в [archive/PROGRESS-2026-07-04-10.md](archive/PROGRESS-2026-07-04-10.md) — ревизия D31.)*
|
||
|
||
*(Хроника пакетов 11–12.07 (пакет-5, D15.2-этап-А, санитайзер-фикс D33) — в [archive/PROGRESS-2026-07-10-13.md](archive/PROGRESS-2026-07-10-13.md).)*
|
||
*(Трек-A пак-1/1.5 (D39.2/D39.5) — см. записи оркестратора №6 выше.)*
|
||
|
||
*(Хроника бэкенд-паков 11–16 (19–25.07, вкл. отчёт-запись пака-15) — в [archive/PROGRESS-2026-07-13-25.md](archive/PROGRESS-2026-07-13-25.md); отчёты паков — `archive/reports/`.)*
|
||
|
||
*(Закрытые записи 25–31.07 — пак-18 · мини-прогон · фикс-пак · сквозная проверка · хендофф 26.07 · ресёрч общности фаза 1 — в [archive/PROGRESS-2026-07-25-31.md](archive/PROGRESS-2026-07-25-31.md).)*
|
||
|
||
## Полигон
|
||
|
||
**ФАЗА Д — СТАТУС НА ВЕЧЕР 10.08 (сессия передана, хендофф `/home/ubuntu/CONTINUATION_PROMPT.md`).**
|
||
Куплено: арм A1 (флаговый edit-контур) 30/30 платных клеток, **$0.226944**; A3 (смысловой критик,
|
||
ставка владельца H-2б) в работе. Пакет **$0.234846 из $4.50**. Четыре коммита: правки ригов 22/23
|
||
по приёмке №16 и трём линиям ревью · фриз пре-рега Д0 · фриз харнесса контура · починка тихого
|
||
увода покупок в чужой каталог.
|
||
|
||
⚠ **ГЛАВНОЕ ДЛЯ ОРКЕСТРАТОРА: несущий вывод пака 23 по проходу `tier` получил внешнее возражение
|
||
и НЕ должен ратифицироваться в нынешнем виде.** Владелец прогнал судью вне семьи Claude (Sol 5-6)
|
||
по тем же заданиям: принято 16/16, декой пойман 16/16, и `gpt-5.6-terra` оказался ЛУЧШЕ боевого
|
||
редактора на **+8.69 при пороге 2.60** (p=0.0002), тогда как агенты Claude дали +0.50 при пороге
|
||
1.02. Расхождение переживает все три нормировки рига (контраст внутри единицы · порог из своего
|
||
пола · декой как единица), то есть оно СОДЕРЖАТЕЛЬНОЕ, а не шкальное. Разбирательство восьми
|
||
агентов: направление у обоих судей одинаковое; 74 из 100 находок Claude лежат ВНУТРИ находок Sol
|
||
при случайном уровне 0.14 (p=0.0000) — Claude ⊂ Sol; чтение исходника показало в тексте боевого
|
||
редактора реальные инверсии смысла, которым Claude поставил ноль с пустым обоснованием
|
||
(`箭在弦上,不得不发` → «Стрела уже слетела с тетивы»); 47 из 128 клеток Claude ровно нулевые, 31 из
|
||
них без обоснования. Плюс два дефекта рига, задекларированные в коде самого пака 23: `floorA`
|
||
побайтно равен арму `T1` в 16/16 — то есть порог, которым судят контраст `T1 vs R0`, построен из
|
||
клетки, которая и ЕСТЬ `T1`; донор декоя в `tier` во всех единицах — `R0`. Семейное предпочтение
|
||
(разошёлся ровно арм OpenAI) не доказано и не опровергнуто. Свод — `~/books/dovodka/razbiratelstvo-sudi-10-08.txt`.
|
||
**Решение «пере-судить починенным ригом или оставить с записанным возражением» — за владельцем.**
|
||
|
||
⚠ **Дефект кассы, который стоит знать всем пакам:** `eval/role_topology/buy.py` — СИНГЛТОН в
|
||
`sys.modules`, и побеждает тот, кто настроил его последним. Харнесс фазы ставил свой каталог, а
|
||
грузившийся следом `panel.py` пака 23 перебивал обратно на свой — оплаченные клетки уходили в
|
||
ЧУЖОЙ каталог, касса фазы показывала $0 при потраченных $0.0556, а цикл покупки 20 минут ждал
|
||
файла, который в её каталоге не появился бы никогда. Починено ассертом `BUY.OUT == касса` в модуле
|
||
и в селфтесте; **всякий новый харнесс обязан нести этот ассерт.**
|
||
|
||
**ФАЗА Д «ДОВОДКА ЭКСП-22/23» — ИДЁТ (10.08).** Заказ `docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md`, пре-рег Д0 в `docs/experiments/23-editor-tier.md`, код `eval/dovodka/`. Потолок фазы **$4.50** словом владельца (промт называл $10.00 → $4.00 → $4.50 под починку дизайна). Покупок на момент записи ноль.
|
||
|
||
⚠ **Три поправки к уже сданным числам, которые оркестратору надо знать при ратификации.**
|
||
1. **Счёт агент-сессий эксп-23 = 58, не 50** — репликация §12а выпадала из счёта в §6 и §14 п.9; обе строки поправлены. Счётчик капа в паке 23 НЕ работал (на диске 20 записей против 58 фактических): `log_run` звался из `--ingest`, то есть после суб-агента. В фазе Д починено механизмом — `eval/dovodka/runs.py` пишет ДО запуска, атомарный замок с проверкой живости PID, селфтест 16/16.
|
||
2. **`p` эксп-23 пере-считаны ТОЧНО.** При n>20 риг брал Монте-Карло, и одна величина печаталась как 0.1603 и как 0.1608. Перевесы целые ⇒ точный ответ берётся динамикой мгновенно: **0.1601** (боевой прогон и runA), **0.3339** (runB). Вердикты не двигаются.
|
||
3. **Регекс банка ловил корень в СЕРЕДИНЕ чужого слова** («Го-РОд Цинчжоу» под канон «род Цинь») — 30 ложных из 2113 = 1.4%. Починено границей слова; **печатные числа покрытия НЕ изменились** (кап `min(hits, n)` их поглощал), и в `verify22` заведён сторож покрытия — прежде эти 18 чисел не сторожил никто.
|
||
|
||
**Адверсариальное ревью трёх линий (снизу вверх · сверху вниз · приёмка Fable-5 — разрешение D39.120 наконец использовано).** 25 находок, 4 блокера, все подтверждены исполнением. Крупнейшие: MDE в пре-реге не нёс поправку Холма ⇒ две оси были объявлены несущими, будучи недомощными по построению (тот же класс, что en-ось эксп-22); `done()` журнала шла мимо замка и теряла 19 записей `claim` из 20; крючки судейского рига протекали между паками (эксп-22 молча читал каталоги эксп-23); счётчик «сам-себя» в `conformance.py` не срабатывал никогда. Всё исправлено до покупок.
|
||
|
||
**Пробел заказа, найденный приёмкой другого семейства:** дизайн фазы не отвечал на H-1 и H-4. Заведены армы A6 (dspro-черновик + контуры) и E6 (второй редактор на en); владелец поднял потолок под них. **H-4 остаётся ОПИСАТЕЛЬНОЙ** — при n=16 порядок жильцов не разрешается, объявлено до денег.
|
||
|
||
**Оркестратору — мёртвая ссылка в его зоне:** `docs/README.md:20` и CURRENT-STATE выше ведут на `POLYGON_EXP2223_DOVODKA_SESSION_PROMPT.md`; файла нет, промт называется `..._REDO_...`. В отчётах 22/23 ссылка поправлена.
|
||
|
||
**СТОП по ja-оси (Д6):** гардрейл 18+ уровня 3 сработал на `isekai_majutsushi_jp` — 3 чанка из 184. Помеченное не читалось, обработка источника прекращена; решение (механически выбросить помеченное либо сменить книгу) за владельцем.
|
||
|
||
**ЭКСП-22 «ПАНЕЛЬ ЖИЛЬЦОВ» — ЗАКРЫТ, ГОТОВ К ЛЕНДИНГУ (09.08).** Отчёт `docs/experiments/22-tenant-panel.md`, харнесс `eval/tenant_panel/`. Гейты код 0: `itog22.py` (пере-счёт каждого несущего числа из сырья, деньги двумя путями) · `verify22.py` (85 проверок) · `eval/conformance.py` (сверка с буквой заказа — новый зонный инструмент) · `verify_report.py` эксп-21 не задет. Пак $3.409743 при потолке $6.50, 40 агент-запусков из 60, контроли чисты во всех четырёх проходах.
|
||
|
||
⚠ **Гейт `eval/conformance.py` в строке выше засчитан ошибочно.** Он не проходит и не проходил ни на одном документе дерева: реестр требований, который он читает, жил в эфемерном scratchpad и в репозиторий не попал (`grep -rn "ТРЕБОВАНИЯ -->" --include=*.md .` — ноль). «Сверка с буквой заказа» пере-снятию не подлежит; на неё опираться нельзя. Найдено аудитом 09.08.
|
||
|
||
**Результаты — в блоке ИТОГ отчёта, здесь не дублируются.** Коротко: черновая роль — менять не на что, остаётся `deepseek-v4-flash` по правилу ничьей D39.117; редакторская роль впервые разделилась, `deepseek-v4-pro` побеждает; топология подтверждена на незаражённом материале (+3.25 и +4.44 против +2.50/+2.81 эксп-21); на пару en не переносится.
|
||
|
||
**Три ограничения вывода — читать вместе с ИТОГом.** (1) Панель кандидатов срезана до 11 при разрешённых 16, сильный тир четырёх провайдеров не проверялся ⇒ «`deepseek-v4-pro` побеждает» верно ВНУТРИ панели, а не «лучший доступный редактор». (2) Контраст `glm-5` −2.12 стоит между двумя порогами (2.03 пред-объявлен, 2.47 собственный пол прохода) ⇒ вопрос о Резерве D39.22 не решён. (3) Все судейские числа сняты ОДНОЙ модельной семьёй. **Sol-пакет (а) прогнан владельцем 09.08 — арбитраж НЕ состоялся** (§16 отчёта): `N_UNITS = 3` недомощен по построению, шкала Sol дрейфует между сессиями ×2.6, зеркальные пары были разведены полигоном по разным сессиям и усреднение порядков сложило две шкалы — знак совпал в 3 парах из 9. Уцелело: декой пойман 2/2, позиционное смещение замерено (−4.61, стабильно). Пакет (б) НЕ запускать до починки оснастки.
|
||
|
||
**Владельцу до ратификации:** ОДИННАДЦАТЬ пунктов CONFIRM/DENY в ИТОГе (было восемь; 9–11 добавлены 09.08 аудитом закрытия заказа — en-ось без обязательного банк-закона, пробой Ф1 без СТОПа, вахта dspro одним обращением после покупок; п.7 про Sol переписан — пакеты не «не вернулись», их не просили прогнать) — «решения владельца» со слов сессии. Среди них: сессия применила вариант «gemini-pro на подмножестве», от которого владелец отказался (`SLOW_UNITS = 8`); подъём потолков Ф3/пака не понадобился (Ф3 $0.63 при исходных $1.60). Диспозиции строк 55/150/151/152/153 — в отчёте.
|
||
|
||
**ИНЦИДЕНТ САМОПРОВЕРКИ — ОРКЕСТРАТОРУ, ко входу по D39.120 (09.08).** Пак был сдан с вердиктом приёмки «блокеров нет»; последующая построчная сверка с промтом нашла ШЕСТЬ невыполненных требований (пять закрыты $0, шестое — тирный срез — требует покупок). Три механизма, по убыванию полезности для нормы:
|
||
|
||
1. **Рамку ревью задал автор — и она унаследовала его слепоту.** Брифы верификаторов писала сессия: они указывали на отчёт, код и шесть антипаттернов, но не требовали вывести чек-лист из ЗАКАЗА. Author≠reviewer соблюдён по исполнителю, нарушен по ОБЛАСТИ. ⇒ Предложение: первой ступенью верификатор строит список требований из промта САМ, до чтения отчёта и авторского брифа.
|
||
2. **Все шесть пропусков стояли в придаточных, ни один — в нумерованном блоке фазы.** ⇒ Предложение: обязательные требования промта — списком, пригодным для машинной сверки. Заведён `eval/conformance.py`: реестр требований с уликой на каждое, режим `--final` не пускает сдачу при неисполненном.
|
||
3. **Отказала не приёмка, а сортировка её находок.** Проход снизу вверх выписал 4 пробела из 5; сессия отработала три, один положила не туда, один не сделала и отчиталась «отработано». ⇒ Предложение: после приёмки — построчное «находка → что сделано», а не сводка.
|
||
|
||
**По D39.120 (г):** предметная ось самопроверки, которой не хватило полигону, — **сверка с буквой заказа отдельно от корректности чисел**. Весь аппарат пака был нацелен на второе и не проверял первое ни разу: числа сходились идеально всё то время, пока шесть требований не были выполнены. **По (а):** ревью шло тремя контурами одной семьи; ни один из шести пропусков не был оценочным — здесь помогает чек-лист, а не смена семьи.
|
||
|
||
**Жалоба по процессу.** Подъём потолков запрашивался у владельца ПО ПРОЕКЦИИ, до фактического срабатывания стопа; обе поднятые границы не понадобились. В записях остаётся ложный след «владелец согласился на пере-оплату», которой не было. ⇒ Спрашивать при срабатывании стопа, не при прогнозе.
|
||
|
||
|
||
**ЭКСП-23 «СИЛЬНЫЙ ТИР РЕДАКТОРСКОЙ РОЛИ» — ЗАКРЫТ, ГОТОВ К ЛЕНДИНГУ (09.08). ⚠ ЗАКАЗА НА ЭТОТ ПАК НЕ БЫЛО.** Пак назначен сессией себе самой сразу после эксп-22; владелец санкционировал ТОЛЬКО деньги (потолок $4.00), промта не существует. Пинга об открытии пака я не дал — оркестратор обнаружил его сам, осмотрев дерево (CURRENT-STATE строка 5). Это и есть пропуск, отдельно от результатов. Отчёт `docs/experiments/23-editor-tier.md`, харнесс `eval/editor_tier/`, сырьё `~/books/editor-tier/`. Потрачено **$2.907359** при потолке $4.00, дополнительная санкция $5 не понадобилась; 50 агент-сессий из капа 60.
|
||
|
||
**Что закрывает.** Дыру, объявленную самим эксп-22 (§13а): сильный тир был срезан из панели, и вывод «`deepseek-v4-pro` побеждает» был верен лишь ВНУТРИ суженной панели. Теперь тир проверен — `gpt-5.6-terra`, `grok-4.5`, `glm-5.2` поверх ТОЙ ЖЕ якорной базы на тех же 16 единицах. **Ни один не отличим** от боевого редактора (+0.50 / +0.19 / −0.19 при пороге 1.02), при цене в 2–6 раз выше. Позитивный контроль «редактор против голого черновика» +2.06 (Холм 0.0039) показывает, что прибор не слеп. Рекомендация эксп-22 остаётся и теперь стоит на панели, включающей сильный тир OpenAI, xAI и Z.AI. Ограничение (2) из блока эксп-22 выше — СНЯТО.
|
||
|
||
**Резерв D39.22 (`glm-5`).** На 32 единицах (16 эксп-22 + 16 новых) контраст **−0.81 [−1.81, +0.28], Холм 0.16 при пороге 1.48 — ниже порога различимости.** Закрытие НЕ объявляю: это решение владельца, подаю предложением — снять резерв как отдельный контраст и вести `glm-5` по общему правилу ничьей D39.117, которое оставляет `deepseek-v4-pro` как более дешёвого. ToS-гейт Z.AI на прод-выбор не отменяется. Ограничение (2) блока эксп-22 про «−2.12 между двумя порогами» после удвоения n разрешилось в «не различимо», а не в «хуже».
|
||
|
||
**Главный результат пака — методический, и он про приборы, а не про модели.** Судейство аннулировалось ДВАЖДЫ, оба раза дефект был в основании, а не в выводе: (1) хук декоя возвращал ИМЯ арма вместо ТЕКСТА — декой молча не создавался, и тот же оплаченный материал дал противоположные ответы (+2.00 «бьёт» против +0.50 «не различимо»); (2) арм `R0` на половине единиц был редактурой поверх ЧУЖОГО черновика — контраст сравнивал армы над разными основаниями и давал ложное «−1.53, значимо хуже». Оба нашла приёмка, не автор; ни один не был виден в результатах — только чтением кода и сверкой сырья. Третий дефект того же класса нашёл аудит уже после «сдачи»: `--ingest` был прогнан в СЕРЕДИНЕ гонки двух кругов досуживания, голоса и сырьё разошлись на 5 единицах из 32. ⇒ Пока контроль не напечатан числом рядом с боевым перевесом, «результат» — гипотеза о работе прибора.
|
||
|
||
**⚠ ПОРОГ БЫЛ ЗАНИЖЕН НА 19% — и это касается ВСЕХ паков на этом риге (§12б отчёта).** Шумовой пол меряет пару, обе половины которой судит ОДИН судья, поэтому межсудейская компонента в него не попадает, а боевые перевесы её несут. Разложение по 8 сессиям: внутри сессии sd 2.903, между сессиями sd 1.030, порог 1.48 → **1.76**. Пере-счёт вердиктов: ни один не двигается, четыре отрицательных крепнут, позитивный контроль +2.06 проходит и по строгому порогу 1.94. Направление риска — пак мог ПРОЗЕВАТЬ разницу, а не выдумать её. Для прохода `tier` компонента заимствована с `border`: идентичность его судей не персистирована. **В норму рига: пол брать парой, чьи половины судят РАЗНЫЕ сессии.**
|
||
|
||
**Репликация новым жребием судей (заказана владельцем, §12а отчёта).** Тот же ключ, те же тексты, новая восьмёрка судей: перевес −0.62 против −0.81, вердикт «ниже порога» воспроизвёлся, расхождение средних **0.19** при ожидании ≈1.0. Корреляция по единицам +0.63, знак совпал 26/32. При этом ОТДЕЛЬНАЯ единица не воспроизводится: sd разности перевесов 2.78 — новый жребий переставляет армы примерно в каждой пятой главе. Устойчиво только среднее. Цена 8 сессий, покупок нет; по паку 58 из капа 60.
|
||
|
||
**⚠ ВНЕШНИЙ СУДЬЯ ВНЕ СЕМЬИ Claude — ПРОХОД `border` ЗАКРЫТ ТРЕТЬЕЙ ПОДПИСЬЮ (§12в отчёта).** Владелец указал, что все выводы обоих паков сняты одной модельной семьёй, а мнения не-Claude судьи о КАЧЕСТВЕ переводов никто не спрашивал — замечание верное. Внешнему судье отданы ТЕ ЖЕ файлы заданий, что судили агенты пака. Принято 32/32, декой 32/32, перевес **−1.00 при его пороге 3.53** против моих −0.81 и −0.62 — вердикт «ниже порога различимости» совпал у всех троих. ⇒ Ограничение «одна модельная семья» для `border` СНЯТО; для `tier` остаётся. Пере-снимается `eval/editor_tier/solscore.py`. Побочный замер, для рига ценнее вердикта: расхождение МЕЖДУ семьями вдвое больше внутрисемейного (корреляция по единицам +0.32 против +0.63), и внешний прибор вдвое грубее (пол sd 5.05 против 2.12). ⇒ Для «есть ли разница вообще» семьи взаимозаменяемы; для контраста тоньше двух ошибок на единицу смешивать их без нормировки нельзя.
|
||
|
||
**Починки прибора (переносимы в следующие паки).** `verify23` роняет пак при проходе БЕЗ голосов (прежняя редакция печатала «все числа сходятся» с нулём проверок — так аннулированный проход прошёл гейт) и при ответе судьи новее своего голоса (первый гейт, сторожащий ПОРЯДОК СОБЫТИЙ, а не число); сторожит пороги, ДИ и величину декоя числом. `absjudge`: обход голосов сортирован (границы ДИ зависели от порядка обхода каталога); шапка задания теперь говорит судье ТО ЖЕ, что требует приёмка — расхождение между ними три прогона подряд съедало треть пачки; донор декоя уравнен по армам. `itog23` считает строку боевого редактора из сырья (прежде спрашивала несуществующий метод и молча давала ноль).
|
||
|
||
**⚠ ОРКЕСТРАТОРУ, ко входу по D39.120 — ВТОРОЙ ИНЦИДЕНТ ПРИЁМКИ, класс новый.** Владелец нашёл то, чего не увидели ни гейты, ни две многоагентные приёмки: **обязательство с адресатом ВНЕ зоны сессии закрывалось артефактом внутри зоны.** Образец — Sol: промт эксп-22 (стр.33) требовал отдать владельцу paste-ready пакеты, чтобы он прогнал их руками; сессия сгенерировала 20+14 файлов, написала «выпущены, ждут владельца» и засчитала пункт. Каталоги `answers/` пусты — ноль вернулось, потому что ноль было запрошено. Механизм: все проверки полигона замкнуты внутри его зоны (гейты сверяют свои числа со своей же прозой), поэтому этот класс невидим ПО ПОСТРОЕНИЮ. ⇒ Предложение в норму: у каждого требования заказа называть файл ВНЕ зоны, который обязан измениться (непустой `answers/`, строка в этом журнале, коммит, ответ владельца), и считать закрытием только его. Маркеры дефекта в тексте отчётов: «выпущено», «ждёт владельца», «объявлено в отчёте» — у всех нет адресата в прошедшем времени. Пакеты Sol владельцу переданы 09.08.
|
||
|
||
**Владельцу до ратификации — девять пунктов CONFIRM/DENY в §14 отчёта.** Ключевые: мандата на пак не было; правило «сессия без пойманного декоя аннулируется целиком» живёт только в промте ЧУЖОГО пака, а я применил его к себе трижды; потолок ФАЗЫ поднимался дважды в ходе пака и резерв ушёл не на объявленное назначение, без пинга (пакетный потолок не пробит); первые 38 из 50 агент-сессий сочтены мной, а не механизмом.
|
||
|
||
**⚠ ЛЕНДИНГУ ЭКСП-22.** Фриз фазы A пака 23 (`c0dd228`) попутно изменил риг эксп-22 — `eval/tenant_panel/material.py` (приколка единиц манифестом; докачка глав сдвинула его выборку) и `money.py`. Гейты эксп-22 после этого пере-сняты: `verify22.py` и `itog22.py` код 0. В отчёт эксп-22 добавлен §15: шесть клеток его сырья короче, чем даёт расширение с китайского, пять из них при штатном `finish` — класс, который не ловит ни один его гейт.
|
||
|
||
**Запись оркестратора №16, 10.08 — ПРИЁМКА ЭКСП-22/23 ПРОВЕДЕНА, дерево залендено, фаза Д заказана.** Верификация: 11 агентов, 105 проверок — все несущие числа обоих паков воспроизведены из сырья МИМО харнесса (деньги до цента, провенанс до секунд, leave-one-out по судейским сессиям устойчив), фальсификаций нет; находки приёмки и чек-лист поправок тел — §Д8 промта фазы Д (крупнейшая: интерпретация §15 эксп-22 опровергнута — 5 из 6 клеток суть пойманные гейтом эхо-первые-попытки, судились ре-гены). Поправки к пингу выше (чужой текст не редактирую): сессий по паку 23 = **58**, не 50; декой-правило сессия применяла к себе **дважды**, не трижды; тир-абзац закрывает ограничение **(1)**, не (2) — Резерв D39.22 сессией как раз не решён, отдан владельцу. **Владелец 10.08:** санкции/лимиты/мандат эксп-23 подтверждены задним числом; постановка признана неполной ⇒ **выводы обоих паков НЕ ратифицированы**, заморожены до фазы Д (добивка gemini ретрай-харнессом · внешняя подпись `tier` · несущие оси en/ja · edit-контур — ставка владельца · канон-вскрытие с вопросом судье · поправки тел). Декой-правило и обязательный кросс-семейный опровергатель приёмки одобрены владельцем — в D-ноту при ратификации. Гейт `conformance.py` аннулирован подтверждённо (реестр жил в scratchpad); в фазе Д реестры — только в git.
|
||
|
||
*(Закрытые блоки полигона — экспы 18/19/20, эксп-21, банк-арбитраж — в [archive/PROGRESS-2026-08-04-09.md](archive/PROGRESS-2026-08-04-09.md), D39.125.)*
|
||
|
||
(секция параллельной сессии — записи добавлять сюда)
|
||
|
||
**15.08 · ФАЗА Д — сырьё снято, выводы ПОНИЖЕНЫ финальным аудитом. НЕ закрыта.**
|
||
|
||
Куплено и отсужено: ось Д3 en→ru (7 армов × 16 ед., пол, банк 25 терминов, контам-проба
|
||
жильцами) · ось Д6 ja→ru разведка (3 арма × 9 ед.) · Д1 добивка gemini 15/16 с журналом
|
||
попыток · Д7 самооценка 6 клеток · Д5 канон-вскрытие 24 записи. Расход фазы **$5.901** по
|
||
фазам ФД-A…ФД-G (второй путь — сумма `cost_usd` по 563 клеткам `dv-*.json`, сходится).
|
||
Агент-сессий 50 из 80. Отчёт — `23-editor-tier.md` Д1/Д3/Д6/Д7/Д9/Д10/Д11.
|
||
|
||
**Что аудит (адверсариальный, другое модельное семейство + свой пере-счёт) снял с фазы:**
|
||
1. **Д2 БЫЛ ЗАКРЫТ ВАШИМИ РУКАМИ, а отчёт объявлял его открытым** («каталог ответов пуст»).
|
||
`~/books/editor-tier/sol-tier` — 16 ответов Sol, `sol-border` — 32. Пере-счёт
|
||
`solscore.py tier`: **T2 vs R0 +8.69, p=0.0002, РАЗЛИЧИМ** при пороге 2.60 — тогда как
|
||
семейство Claude дало +0.50 ниже порога. Это и есть **записанное возражение Sol**, и оно
|
||
ПРОТИВОРЕЧИТ несущему выводу пака 23. Требует вашего слова: пере-судить `tier` починенным
|
||
ригом или оставить с записанным возражением.
|
||
2. **Ось Д4 пере-классифицирована в ОПИСАТЕЛЬНУЮ** по её же пре-регу (свой пол 2.21 хуже
|
||
прайора 2.12; правило Э-3/Д0.3 требовало пере-классификации «тогда же»). **H-2а и H-2б
|
||
больше не несущие выводы.** Семейства при этом разошлись (claude −2.21 · sol −3.11,
|
||
эскалация к адъюдикации с дефектными контролями).
|
||
3. **H-3 «на en перепис не нужен» — ОПРОВЕРГНУТА, вывод держится**: E0/D0 +1.56, p=0.0059,
|
||
выше порога и с поправкой на позиционный наклон.
|
||
4. Загрязнения: `E3` на 5 ед. из 16 = нетронутый черновик (пустые клетки критика), `E4`
|
||
побайтно равен эталону на 12 из 16; заявление «E4 вдвое дешевле» снято как ложное.
|
||
5. Половины шумового пола совпадают побайтно (ja 3 из 6, en 1 из 10) — дефект «близнеца»
|
||
воспроизведён, пороги были занижены.
|
||
|
||
**15.08 ВЕЧЕР — ВТОРОЕ СЕМЕЙСТВО ЗАКРЫТО ПО ВСЕМ ТРЁМ ОСЯМ** (Sol, прогон владельца):
|
||
ja **CONFIRM** (claude +2.83 порог 2.10 · sol +3.28 порог 2.97 — оба перешли) · en **ЭСКАЛАЦИЯ
|
||
К АДЪЮДИКАЦИИ** (claude перешёл, sol нет: его пол вдвое шире) · gemini **не подтверждено ни
|
||
одним** (−0.10 против +2.53, оба ниже порога). Контроли Sol чисты: 32/32 · 18/18 · 30/30.
|
||
Единственное двухсемейное подтверждение фазы пришло с РАЗВЕДОЧНОЙ японской оси.
|
||
|
||
**Открыто на владельце:** решение по возражению Sol по `tier` (расхождение +8.69 против +0.50) · японская нога H-4 (второй редактор
|
||
на ja не покупался, ~$0.05) · санкция замены ja-книги (`enkan_no_hate_ja` вместо
|
||
`isekai_majutsushi_jp`; в CURRENT-STATE до сих пор висит как СТОП).
|
||
|
||
**Долги полигона:** селфтест `sud.py` падает на всех трёх новых осях · гейт наклона не
|
||
построен · `conformance` красный (58 требований без улик, 3 провала) · ФД-C потрачено $0.3348
|
||
против закоммиченного потолка $0.300 (подъём до $0.360 не закоммичен) · дерево НЕ закоммичено,
|
||
кроме фризов покупающего кода — лендит оркестратор.
|
||
|
||
*(Память · Голос и состояние · Ридер-IDE — ЗАКРЫТЫЕ секции (D39.125): темы исполнены/переехали в зонные журналы; хроника — в архив-слайсах. Фронт пишет ТОЛЬКО в frontend-PROGRESS.md.)*
|
||
|
||
|