From 085dbb9d1a3c59e3adb561f8229088565039593c Mon Sep 17 00:00:00 2001 From: "Claude (backend session)" Date: Sun, 9 Aug 2026 21:33:37 +0300 Subject: [PATCH] Land docs pack 167 as D39.126: full note registry with counts completeness check and anchors lint, slimmed backlog rows, topical entries for money, emitter, and stack --- CLAUDE.md | 2 +- docs/PROGRESS.md | 40 ++-- docs/README.md | 7 +- docs/STACK.md | 22 +++ docs/architecture/05-decisions-index.md | 181 ++++++++++++++++++ docs/architecture/05-decisions-log.md | 21 +- docs/architecture/09-target-architecture.md | 4 +- docs/architecture/13-tech-debt-anchors.md | 44 +++++ docs/architecture/14-api-contract/README.md | 24 ++- docs/architecture/15-money-path.md | 61 ++++++ docs/architecture/16-events-emitter.md | 128 +++++++++++++ .../architecture/05-decisions-D1-D38.md | 6 + docs/glossary.md | 2 +- docs/product-requirements.md | 12 +- docs/research/17-external-critique.md | 14 +- docs/scripts/counts.py | 89 ++++++++- 16 files changed, 598 insertions(+), 59 deletions(-) create mode 100644 docs/STACK.md create mode 100644 docs/architecture/05-decisions-index.md create mode 100644 docs/architecture/15-money-path.md create mode 100644 docs/architecture/16-events-emitter.md diff --git a/CLAUDE.md b/CLAUDE.md index 7a6bdbce..b3a67d2c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -25,7 +25,7 @@ Go-бэкенд издательского художественного пер ## Источники истины (по убыванию) -1. **`docs/architecture/05-decisions-log.md`** — ратифицированный контракт; при конфликте с любым другим доком побеждает он; сверху файла — карта актуальности (что чем superseded), свежая голова — С ХВОСТА файла. **Правило чтения (диета D39.125): живой файл = карта + эрраты + живые тела + голова D39.106+; тела закрытых эр — слайсы `docs/archive/architecture/05-decisions-*.md`. Греп номера: сначала живой файл, затем слайсы; тело ноты — строка `^## D<номер>`, прочие хиты = упоминания; целиком НЕ читать.** +1. **`docs/architecture/05-decisions-log.md`** — ратифицированный контракт; при конфликте с любым другим доком побеждает он; сверху файла — карта актуальности (что чем superseded), свежая голова — С ХВОСТА файла. **Правило чтения (диета D39.125): живой файл = карта + эрраты + живые тела + голова D39.106+; тела закрытых эр — слайсы `docs/archive/architecture/05-decisions-*.md`. Греп номера: сначала живой файл, затем слайсы; тело ноты — строка `^## D<номер>`, прочие хиты = упоминания; целиком НЕ читать. Статус/тело любого номера одним хопом — реестр `docs/architecture/05-decisions-index.md` (D39.126).** 2. `docs/experiments/00-provider-quirks.md` — wire-квирки провайдеров (читать ПЕРЕД правкой адаптеров/вызовами провайдеров). 3. `docs/architecture/09-target-architecture.md` (7 слоёв; статус стройки — шапка-таблица) · `12-go-style-notes.md` (норматив общности §0) · `10-prompt-architecture.md` (промпт-тема) · `14-api-contract/` — **ратифицированный контракт API v0 фронт↔платформа** (OpenAPI 3.1 + компаньон, D39.99). 3а. `docs/product-requirements.md` — реестр «что продукт обязан уметь» (производный от ЖИВОГО брифа владельца `START_PROMT.MD` V0–V5 + находок H6–H18; статусы сверены кодом, актуализирует оркестратор при лендингах). Новые V-идеи владельца разбираются сюда, не остаются невидимыми. diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 6293fbca..48928066 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,19 +1,19 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-09, голова D39.125; хендофф №15→№16 — D39.124/125). Оркестраторов ДВА (решение владельца 07.08): этот — движок/платформа/фронт/доки; параллельный (РОЛЬЮ, без номера — счётчик один, D39.112 п.6) — приёмка полигона. Одновременно не запускаются; CURRENT-STATE ведут оба, чужие строки не трогают. Норма изоляции панелей после инцидента отката чужих файлов — D39.113, гардрейлы в CLAUDE.md. -> - **Эра №15 закрыта — семь приёмок, все ПРИНЯТЫ и залендены; числа и разборы ТОЛЬКО в D-логе (сюда не дублируются):** платформа P1+P2 `fcdab81` (D39.109, эррата D39.112) · фикс-пак P3 `99f049c` (D39.114) · фронт S3 `60595f6` (D39.115, контракт 0.2.0) · бэкенд фикс-пак банка `bccf2d8` (D39.118) · бэкенд «блокеры контракта» `0e69bc1` (D39.122 + research/27 фактурой + строки 160–164) · платформа-раннер P4 `d29e30c` (D39.123, контракт 0.2.1, формула потолка ПОПРАВЛЕНА — PD-158) · эксп-21 (D39.117, параллельный оркестратор). Снимок прежних бюллетеней этой шапки — в архив-слайсе `-08-02-04`. +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-09, голова D39.126; хендофф №15→№16 — D39.124/125, докс-пак 167 исполнен — D39.126). Оркестраторов ДВА (решение владельца 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 «панель жильцов» — ЗАКРЫТ 09.08, ЖДЁТ ЛЕНДИНГА (8 CONFIRM/DENY на владельце; секция «Полигон» ниже; в дереве замечен незаявленный эксп-23 editor_tier — спросить при лендинге) · фронт: S4 ГЕЙЧЕН словом владельца об оболочке → сначала «S3.5 фикс-пак» (D39.119 п.4) · активных промтов бэкенда/платформы НЕТ — следующие по слову владельца: **эмиттер** (103 + деньги шва; сессии перед стартом читать PD-95/105/79/99/107/60/61 + D39.106 + строку 165) · **платформа**: стоп/резюм-ручки + эскроу (136). > - **Открыто на владельце:** прогон Sol-пакетов руками (150) · кредиты xAI (арбитр grok + судья 18+) · Приложение А контракта (148: реконструкция с баннером или заново) · продуктовое слово «остановлена: лимиты» (В-3) · К-13/Ф-31 (paused_reason один — «свой потолок» и «нет кредита» неразличимы) · В-4/Ф-30 (глава без заголовка) · фри-тир PD-104 (ноль на бете против автогранта $5 с суточным потолком) · порог 116 · мини-проба флора 44 (одобрена, промт не выдан) · подпись денежного шага 46 · лист В-3+К-6 · авто-резюм paused (вопрос платформы) · запуск S3.5/эмиттера/следующего платформенного пака. > - **Сделано (сводно)** — снимок ленты закрытых эр в [archive/PROGRESS-2026-08-04-09.md](archive/PROGRESS-2026-08-04-09.md); детали — D-лог и слайсы. -> - **Курс:** ОБЩНОСТЬ ✅ → КАЧЕСТВО БАНКА ✅ → ПАКЕТ-ЧЕКЕРОВ ✅ (D39.59–78) → **ФРОНТ-ЭРА открыта** (D39.81–100: зоны `frontend/`+`platform/` живые, контракт API ратифицирован). Развилка блокера 0731 решена вариантом (б) и ИСПОЛНЕНА (D39.87/91: `reasoning_effort:"low"` черновику + ручка эффорта бэнк-ролям, код `553f1a3`); отладочный прогон C не стартовал ⇒ **строка 16 жива и оси голоса 13б без данных**; пак экрана 46 — дизайн заморожен (D39.92 п.1 + D39.93), промт ждёт выдачи; coldrun-b фаза C заморожена чекпойнтом — легитимный исход (D39.86); эталон денег/поведения — coldrun-a (read-only). Числа и хроника закрытых паков — D-лог D39.79–97, сюда НЕ дублируются. -> - **Горизонт (D39.62/67, освежён D39.95):** ре-проба flash ИСПОЛНЕНА и строка 74 закрыта (D39.86/91; порог 6/6 → пере-ратификация выборочным, строка 116; проба Q2 ИСПОЛНЕНА — research/24, D39.102: семейства не окупаются, остаток = рецензент спорных кластеров при ре-пробе 74; эмиссия Q7 — по слову) → **ДОБОР ИДЕАЛА** (первым прогоном: оси голоса 24 · авто-режим · цена 16; жильцы ролей решаются ДО прогона отдельным эксп-22 — строка 149 · веса K1–K12 13а · вне-претрейн чекпоинт 55) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 62–68, 85) → Ф3 ридер-IDE (69–71). **Стоячие:** ToS-триггер 25.10 · Ш-2 до go1.27 (⚠ + x/text-таблицы Unicode 17 тем же тулчейном — строка 119/реестр 108) · проба провода исполнена и 117 закрыта (D39.97), конфиги 112 залендены — платные прогоны разблокированы. -> - **Стек:** draft deepseek-v4-flash thinking-ON (банкнота: ⚠ канал в shipping-c1 НЕ включён — жив ран-локальным конфигом книги, строка 140) **⚠0731** → терминолог (та же модель, батчи, экран `target_script`) → editor deepseek-v4-pro БИЛИНГВ ИНТЕРИМ (⚠ эксп-21/D39.117: топология ПОДТВЕРЖДЕНА — второй проход покупает +2.5 ошибки/ед. при неразличимости жильцов dspro/glm-5, прежний вывод exp20 «на dspro отрицателен» опровергнут; закон-блок ОБЯЗАТЕЛЕН — строка 134; величины предварительны до чистого zh-среза; ⚠ вендор АНОНСИРОВАЛ смену маппинга эффорта pro «early August 2026» — вахта в реестре 108; glm-5 резерв) → судья gemini (Ф2, полигон); канал B Mistral+grok; ~$0.85/ранобэ (D30.4) — 112 залендена (D39.97), пере-калибровка цены при следующем платном прогоне. -> - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 09.08 (D39.123: строки 138·139 закрыты лендингом раннера, заведены 165·166; ранее D39.122: 99·100·101·125·145 закрыты, 160–164 заведены; скриптом по таблице; обновлять при каждом лендинге):** всего **132** строки (D39.125: +167 докс-пак) · зона бэкенд **67** строго (ячейка ровно «бэкенд») / **89** широко (ячейка содержит «бэкенд»; ⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0**, платные прогоны разблокированы · «скоро» **32** (2·4·18·46·49·55·103·108·109·113·114·116·118·119·120·121·126·134·135·136·140·**142**·143·148·**149·150**·154·157·**160·161**·165·167) · гейт-строки эксп-22: 55·153 (плюс 150 — руки владельца); строка 5 — остаток гейчен ре-пробой 74 (D39.102 п.2); остальное «когда-нибудь». ⚠ **Счёт — НИЖНЯЯ граница долга, а не потолок:** трекер содержит только замеченное, и 02.08 дважды за $0 свежие глаза вытащили из кода дефекты, которых в нём не было (релей фронта → строки 99/100/102; приёмочное ревью → третий шов `repair.go:384` в 104 и честность `quality.go:436` в 105). Лента ✅ выше — про ЗАКРЫТЫЕ паки, читать её как «долга нет» неверно (разбор — вопрос владельца 02.08, D39.89). +> - **Курс:** ОБЩНОСТЬ ✅ → КАЧЕСТВО БАНКА ✅ → ПАКЕТ-ЧЕКЕРОВ ✅ (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, пере-калибровка при следующем платном прогоне). ⚠ **ВЕСЬ банковый контур (банкнота+терминолог+классификатор) в shipping-c1 НЕ включён** — жив ран-локальным конфигом книги (строка 140; сверка STACK.md 09.08 — факт шире прежней декларации «одна банкнота»); эскалация в shipping за `budget_usd: 0` (STACK.md §примечания). +> - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 09.08 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **132** строки · зона бэкенд **67** строго / **89** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0**, платные прогоны разблокированы · «скоро» **32** (перечень — грепом по таблице, рукописный список снят 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 касания · «когда-нибудь» = записано, не потеряно. Длинная строка начинается жирным лидом — таблица сканируется по лидам. **Зонные бэклоги (решение владельца 02.08, D39.84):** фронт и платформа ведут СВОИ бэклоги (`frontend/docs/BACKLOG.md` · `platform/BACKLOG.md`) — их строки сюда НЕ заходят; здесь движок/полигон/доки, включая движковые стыки фронта (зона «бэкенд», как 99–102); строки 96/97 переехали в платформенный (П-1/П-2), надгробия-указатели сохранены. +Закрытые строки здесь НЕ хранятся — они уходят в 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 | Хвост (одной фразой) | Зона | Вес | Чем закрывается | Источник | |---|---|---|---|---|---| @@ -30,7 +30,7 @@ | 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 НЕ шипить до замера голос-флаггера на холодном прогоне** (данные для недоказанного детектора = инерция; вывод обсуждения 31.07): оси пустые → файл не нужен, оси ловят → решение владельца о шипе (байты двигают `LangpackVersion`). ⚠ **Замера ВСЁ ЕЩЁ НЕТ (D39.86):** поверхность вывода построена (строка `VOICE` в `tmctl report`), и живое чтение coldrun-a даёт `flags=0 over attributed=0 of replies=0` — но это НЕ «оси пустые»: флаггер живёт на ФИНАЛЬНОЙ волне (`waverun.go:392,512`), а редакторская волна там не гонялась ⇒ оси не считались НИ РАЗУ. ⚠ И поле `rules=` в новой строке говорит «гейт СКОНФИГУРИРОВАН» (читается из конфига ВРЕМЕНИ ОТЧЁТА, `quality.go:436`), а не «гейт отработал» — честный дискриминатор это ЗНАМЕНАТЕЛИ (`replies=`); читать так до фикса (строка 105) | владелец | отложено-до-замера | первый прогон добора идеала С РЕДАКТОРСКОЙ ВОЛНОЙ (оси голоса, строка 24) → отдельное решение | D39.56, PACK19_BUILD §7.2, чат 31.07, D39.86 | +| 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 владельца) —** | | | | | | @@ -69,9 +69,9 @@ | 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 | **Флор — калиброванная константа без модели «thinking в completion»: МОДЕЛЬ ПОЛУЧЕНА замером (D39.86), сама строка сужена до выбора числа.** Замер боевой формы: при вендор-дефолте `high` размышление на плотном хане потолком НЕ ограничивается (8496 → 0/9 пригодных, 16992 → 1/5; вендорская норма вывода для `high` = 384K) ⇒ **флор не является рычагом против неограниченного думания — рычаг это `reasoning_effort`**; при `low` размышление 170–313 ток. и флор 8000 избыточен. Остаток строки: какое число ставить ПОСЛЕ развилки 74 (и помнить, что у `deepseek-v4-pro` эффорт не настраивается — вендор-маппинг `low→high`, quirks п.3а). ⚠ **РАСХОЖДЕНИЕ ТРЕКЕРА СНЯТО (D39.90):** строка 74 объявляла 44 «закрытой этим замером» — это верно только для ПОЛОВИНЫ «поднять флор» (фальсифицирована). Живой остаток — обратный: **опустить/пере-калибровать число по числам пробы `bank-low`**, где стена на `low` не исчезла, а разредилась (упавший батч: `content=""`, `finish=length`, `completion=7999`, `reasoning=7999` — тот же тяжёлый хвост, 1/5 вместо 4/5, и это стохастика вызова: батч не самый большой по входу). ⚠ **Флор при `low` НЕ варьировался ни разу** — упавший батч умер ровно на потолке 8000, так что «сколько ставить» остаётся незамеренным вопросом, а не выводом | бэкенд | когда-нибудь (триггер «приёмка 104» НАСТУПИЛ — D39.91, ручка заленжена; «сколько ставить» остаётся НЕзамеренным — нужен вариационный замер флора при `low`) | отдельное решение | D39.37(10), D39.86, **D39.90** | +| 44 | **Флор — выбор числа ПОСЛЕ ре-пробы 74; модель «thinking в completion» ПОЛУЧЕНА замером (D39.86): рычаг против неограниченного думания = `reasoning_effort`, флор не рычаг.** Мини-проба флора одобрена владельцем, промт не выдан; у dspro эффорт не настраивается (quirks 3а). Расхождение трекера с 74 снято D39.90. Археология дословно — `architecture/13-tech-debt-anchors.md` §Б-44 | бэкенд | когда-нибудь (триггер «приёмка 104» НАСТУПИЛ — D39.91, ручка заленжена; «сколько ставить» остаётся НЕзамеренным — нужен вариационный замер флора при `low`) | отдельное решение | D39.37(10), D39.86, **D39.90** | | 45 | `max_tokens`-упоры (две единицы) — вернутся на en-книге ; halve-chunk-on-retry (research/22 §2 №7) ОТКЛОНЁН D39.74 — вернуться сюда же при живых упорах | бэкенд | когда-нибудь | отдельное решение (с en) | D39.37(11) | -| 46 | **Экран целевого языка на выходе НЕ-ПОСЛЕДНЕЙ стадии — ЖИВОЙ НОСИТЕЛЬ ПОЛУЧЕН, класс поднят (D39.86).** Было: 38/40 дефектов латиницы живут в черновиках вне охвата гейтов (`waverun.go:486`). Стало: на ре-пробе 74 при `effort:low` **1 черновик из 18 пришёл ПОЛНЫМ связным переводом НА АНГЛИЙСКИЙ** и прошёл как `disposition=ok` — `classify` экранирует ИСХОДНУЮ письменность, пустоту, обрыв и отказ, а «не исходный и не целевой» не ловит ни один предикат (частично ловится лишь третий язык, ДЕЛЯЩИЙ письменность с источником, и ловится под ЛОЖНОЙ причиной `cjk_artifact`). ⚠ Последний рубеж УСЛОВЕН тройкой `isFinal && Gates.Sanitizer.Enabled && checkers.TargetActive()` (`chunkrun.go:52`), и **дыра на оси ЦЕЛИ двусторонняя**: (i) без данных цели слой 7 инертен ПО ОТСУТСТВИЮ (осознанный дизайн, `disposition.go:302-305`) ⇒ для не-русской цели рубежа нет вовсе; (ii) а с данными будущей ЛАТИНОПИСЬМЕННОЙ цели `detectLatinInsertion` (`checks/sanitizer.go:228`) сработает на ЧИСТОЙ целевой прозе и дропнет 100% чанков — внутри санитайзера он НЕ обусловлен `TargetScriptNonLatin()`, хотя доккоммент это объявляет (реальный гард только на репэйре — `quality.go:215`, `repair.go:208`), а частичный файл цели невозможен (`CompileCheckers` паникует). ⇒ **ревью-вопрос «заработает ли пара, которой в репо нет, без правки Go?» для →en/→de отвечается НЕТ**; кандидат фикса — тот же шов, что уже применён к репэйру. *(Контрпример «pipeline-c2.yaml — легальная сборка без санитайзера» проверен и СНЯТ: c2 неисполняем `CheckRunnable`, его санитайзер забукован строкой 33.)* Даже при включённом санитайзере худший исход — не потеря юнита, а ТИХО ОТГРУЖЕННЫЙ релейный перевод zh→en→ru, если билингв-редактор отрендерит русский с английского черновика. Область фикса — «выход любой НЕ-последней стадии», не «черновик» (`isFinal` позиционный, `stagerun.go:145`). ⚠ **ДИЗАЙН ПОДАН, КОДА НЕТ — СТОИТ НА РЕШЕНИИ ВЛАДЕЛЬЦА (D39.90).** Три поправки сессии к посылке, все замером: **(1) боевой гейт уже ловит 18 из 20** off-target событий (`sourceScriptShare > 0.15`, `disposition.go:224,275`; 0 ложных на 1055 здоровых, запас 13×) ⇒ остаточная дыра **2 чанка из ~1100 = 0.18%**, оба английские, японский ловится долей ханьцзы; **(2) второй рубеж существует, но стоит не там** — санитайзер поймал бы те самые байты («Latin insertion»), но `chunkrun.go:52` требует `isFinal`, а в двухстадийной топологии черновик НИКОГДА не финальный; тот же `isFinal` глушит на черновике латинный линт, флаггер голоса и глоссарный пост-чек; **(3)** здоровый минимум на тексте, который РЕАЛЬНО видит гейт (после среза банкноты), = 0.9767 при n=1055. **Развилка владельцу:** (а) предикат внутри `classify()` + бамп `classifierVersion` — двигает снапшот у всех книг, голден пере-захват один раз, на свежем стенде $0; (б) отдельный опциональный гейт вне `classify()` — снапшот не двигает, но это второй способ сказать «ответ непригоден», и он выключен по умолчанию; (в) языковой детектор. **Выбор сессии — (а).** Носитель данных — `lang.LangScripts(Book.TargetLang)`, НОВЫЙ go:embed-файл не заводить (`EmbeddedVersion` фолдится безусловно = перекупка всех книг всех пар); порог 0.50 не калиброван, а поставлен в середину пустого интервала. Три мины наивной реализации названы: новый флаг провалился бы мимо `escalatable()`/`retryable()` (⇒ переиспользовать `FlagCJKArtifact`), классификатор ложно флагался бы 16/16, экран слеп к ПОДМНОЖЕСТВАМ письменности (чисто китайский выход для →ja наберёт 1.000). Вторая половина дыры (`detectLatinInsertion` без `TargetScriptNonLatin()`) — чинить тем же диффом, для ru вердикты не двигаются. **Константы и хвосты дизайна, без которых подпись неполна:** порог **abstain 200 букв** (ниже экран воздерживается; самое короткое off-target событие 346 букв, ниже 200 падают лишь 5 из 1055 здоровых, все со счётом 1.0000) · ⚠ **опубликованная база «~1.5% off-target» НЕВЕРНА по знаменателю** — он пулит черновики с редакторскими выходами, а редактор такой отказ произвести не может; на ЧЕРНОВОЙ вызов база **3.02%**, то есть вдвое хуже · ⚠ **не проверено, что делает РЕДАКТОР с английским черновиком** — вытащит обратно в русский или отредактирует как английский; именно этот неизвестный решает, чем является остаточные 0.18%: потерей юнита или тихо отгруженным релейным zh→en→ru · английских черновика найдено ДВА (`fb51e135a395`, `4080ee8287af`), плюс японский в exp15 · **`cultivation` чинить в СИДЕ, а не порогом:** 86 из 1055 здоровых несут голое английское `cultivation` внутри беглого русского, и все 32 абзаца ниже 0.90 содержат именно его, ни один — ханьцзы; правка пар-данных двигает `LangpackVersion` с `omitempty` ⇒ перекупка ограничена книгами ЭТОЙ пары (чинить на плане, где перекупка уже) · Hunspell и GlotScript-эмбед — **не строить** · база замера = строка **113** · **02.08 вечер (D39.92): владелец пере-поставил задачу closed-set** («вернуло НЕ тот язык, что просили»; полноценный LID — только запасной флаггер вне пути вердикта; проверку изолировать отдельным слоем) — ресёрч §5.1–5.3 отвечает постановке, форма (а)+изолированный модуль подтверждена, слой-0 владельца (полоса len(out)/len(in)) добавить замером на фикстуре 113 | владелец → бэкенд | **скоро (порядок §5.4: сначала 113, шаг 6 — под подпись)** | правка Go по плану §5.4 | D39.39(д), D39.86, **D39.90** | +| 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 З-а | @@ -85,7 +85,7 @@ | 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 канал НЕ несёт при декларации «+банкнота» в CURRENT-STATE** — канал жив только ран-локальным конфигом книги (ратифицированный путь D39.42 п.4; coldrun 56/128); решить: включить в c1 (двигает промпт драфта → RequestHash — цену назвать) либо поправить декларацию; родня 36г | владелец → бэкенд | скоро | СТОП-решение | D39.108, exp20 §6 | +| 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 | @@ -105,14 +105,14 @@ | 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-расширением · слой пользовательских правок отдельным сайдкаром | бэкенд | скоро (кандидат в ближайший бэкенд-пак; Р6 — приоритет пачки) | пак | research/27 §6 Этап 0 | +| 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 | | 165 | **Различимые exit-коды tmctl: потолочная остановка и graceful-stop** (сегодня оба = exit 1 ⇒ платформа отдаёт `failed` и на штатный стоп, и на исчерпание потолка — PD-113 платформы; после поправки формулы потолка (D39.123, PD-158) стоп по потолку = ровно исчерпание холда, цена неразличимости выросла; вскрыто приёмкой раннера на РЕАЛЬНОМ tmctl — фейк пробы умирал от сигнала) | бэкенд | скоро (вместе с эмиттером 103) | бэкенд-пак эмиттера | D39.123 | | 166 | **Движковая поверхность оценки $/глава** (ставка-константа платформы $0.03 из exp08 v2 — временная мера беты, П-10 зоны платформы; честная оценка по книге/паре — движковая) | бэкенд | когда-нибудь | отдельный пак | D39.123 | -| 167 | **Докс-пак по аудиту D39.125** (worksheet: `archive/reports/DOC_AUDIT_INVENTORY_2026-08-09.md`): карта D-лога → реестр-таблица на ВСЕ ноты (сейчас покрывает D1–D39.28 = 14% веса) · разгрузка жирных строк бэклога (топ-15 = 37% таблицы; «диспозиция сверху, археология вниз») · топикальные входы: 15-money-path · нормативный док эмиттера (СО строкой 103) · STACK.md роль→модель→где · статус-баннеры экспов (полигон) · DEFECT_REGISTER из таблицы в секции (П-строкой зоне) · противоречие статусов К-1/К-3/К-5/К-8 внутри компаньона контракта (:14 «открыты» vs :27 «закрыты» vs таблица) · механический чек свежести file:line-якорей (расширение counts.py: линтер формы, не сверка копий) · перекрёстные ссылки зонных половинок тем (160↔Ф-30/В-4) · вычистка форм эрраты (б)/(в) до единой навигационной + «мульти-носители → указатели» · шапка 09-target (отстала на эру, D39.117+ отсутствуют) · актуализация product-requirements (замерла на D39.101; ПТ-19 ссылается на закрытую строку 99) | доки | скоро | докс-пак оркестратора №16 | D39.125 | +| 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 (полигон — пинг при лендинге эксп-22) · DEFECT_REGISTER секциями (зона платформы, пинг отправлен 09.08) | доки/полигон/платформа | скоро (остаток — лендинг эксп-22) | пинги зонам | D39.125, **D39.126** | | 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) | @@ -143,23 +143,23 @@ | 97 | **→ переехала в `platform/BACKLOG.md` П-2** (глобальный брокер рейт-лимитов; гейт «до второго параллельного пользователя» зафиксирован там же) | платформа | — | зонный бэклог | D39.81, D39.84 | | 102 | **Приём внешнего trace-контекста в tmctl**: TraceID минтится заново каждым вызовом (`main.go:67-70`; внутри вызова трасса цельная, `request_log.trace_id` есть) — прогон, запущенный платформой, должен быть одной трассой | бэкенд | когда-нибудь (Ф3, с 96) | малое касание | релей фронта 02.08, D39.84 | | 103 | **NDJSON-эмиттер прогонных событий со стабильным словарём** (машинный канал живого статуса для платформы, `research/23` §2): NDJSON-логи уже есть (`LOG_FORMAT=json`, авто-оси trace/book/chapter/stage/role — `obs/logging.go:15-54`), но сообщения прозой, version-хендшейка нет, а **событие потолка отсутствует вовсе** (деньги только в тексте ошибки `stagerun.go:472-494`); нужен словарь-enum + version-хендшейк первой строкой (образец terraform -json: минор = ignore-unknown, мажор = reject) + событие потолка; все границы — единичные call-sites в pipeline рядом с готовыми slog; человеческие логи уже на stderr — stdout-дисциплина соблюдена. **Форма ратифицирована D39.106 (research/25 §эмиттер):** `events.jsonl` каталога книги = outbox-проекция коммитов SQLite (та же транзакция, что чекпойнт) · fsync/seq/hello-версия · события денег и потолка · развилка формата (JSONL против пофайловых/CRC-фрейминга) — решить дизайном · `status --json` отдельным каналом (ремонт, тот же flock) | бэкенд | скоро (промт бэкенду — по команде владельца, D39.107 п.3) | стройка по D39.106 + research/25 | research/23, D39.85, **D39.106** | -| 126 | **Потолок прогона — УПРАВЛЯЕМЫЙ, решение владельца 07.08: настройка в интерфейсе фронта, шкала от минимума (ноль выбрать НЕЛЬЗЯ, подсвечен серым) до максимума баланса аккаунта.** Форма снимает конфликт с Р7 бесплатно: максимум = баланс ⇒ движок всегда получает положительное число и состояния «выключено» не существует, валидатор `book.go:250` не правится. **Три следствия, ратифицированы формой (D39.110):** (а) **единица — НЕ доллары**, а главы (или % баланса): тогда минимум объясняет себя сам («одна глава»), а D39.84 цел — читатель не видит структуру расходов; доллары на пользовательском экране = осознанный амендмент D39.84, не побочный эффект виджета; (б) это потолок ПРОГОНА ⇒ в `book.yaml` он не пишется, движку нужен приём потолка на прогон — строка 145; (в) **максимум шкалы = ДОСТУПНЫЙ ОСТАТОК, то есть `Balance` как есть** — ⚠ испр. 08.08 (D39.115): формулировка «баланс минус открытые холды» была ОШИБКОЙ приёмки, вычитанием дважды. Холд — это дебет в момент взятия (`credits.go:179`), поэтому баланс уже без него; замерено: $10 грант + $1 холд = `Balance` 9, `Reserved` 1, «минус Reserved» дало бы 8. Спека несёт верную форму: `max_chapters` приходит УЖЕ подрезанным и по остатку, и по непереведённому хвосту книги, клиенту подрезать второй раз ЗАПРЕЩЕНО. **НОСИТЕЛЬ ПЕРЕСЧЁТА НАЗВАН (добор после верификации 07.08):** «сколько глав влезает в доступный остаток» считает ПЛАТФОРМА (по оценке движка) и отдаёт фронту ГРАНИЦЫ шкалы и выбранное значение в главах; сама формула наружу не выходит. Ручки под это в контракте НЕТ — сегодняшний `GET /v0/usage` несёт только процент, поэтому поверхность объявляется при правке спеки вместе с созданием прогона (работа П-1 + S3), и до её объявления фронт максимум шкалы взять неоткуда. Прежнее тело строки (механизм поднятия потолка для resume после ceiling-стопа: движок продолжает «once the ceiling is raised», `stagerun.go:488-489`) — половина этой же работы. Продуктовое слово стопа — К-8 у владельца | платформа/фронт/бэкенд | скоро (форма решена, стройка — промтами) | дизайн-вход П-1 + правка спеки + строка 145 | ревью контракта 04.08, D39.99, **D39.110** | +| 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` мис-вердиктится как эхо + честность двух новых строк наблюдаемости (D39.86).** (а) `classifyOutput` даёт поблажку `SourceEchoExpected` только `roleTerminologist` (`chunkrun.go:37`), а ответ классификатора по формату состоит из исходных ханьских термов ⇒ доля исходного письма 0.20–0.29 > порога 0.15 на каждом батче: живой артефакт пробы 6/6 несёт `verdict=cjk_artifact` при `bad_lines=0`. Ущерб узкий — `runBankRoleBatches` кладёт `run.texts[i] = att.text` без проверки диспозиции (`terminologist.go:603`), посчитанные эхо-ставки (`quality.go:313-321`) берутся из `chunk_status`, куда бэнк-путь не пишет ⇒ портятся только строки `tmctl report`/лога; **латентно** (`classify_types` выключен во всех шиппинг-конфигах). ⚠ Цена дисциплинированного фикса, которую надо знать заранее: бамп `classifierVersion` (литерал, сам не двигается) меняет payload снапшота → snapshot id → `RequestHash` ⇒ промах ВСЕХ чекпойнтов книги, то есть `--resnapshot` + пере-покупка. (б) тем же касанием — честность поверхностей: строка `VOICE` берёт `rules=` из конфига ВРЕМЕНИ ОТЧЁТА (`quality.go:436`), поэтому включение `gates.voice` после прогона печатает «измерено, чисто» для неизмеренной книги (воспроизведено); и она печатается при выключенном гейте, если `SpoilerLeaks>0` (дизъюнкция — поведение верное, формулировка отчёта/коммента неверна); знаменатель `BANKNOTE` = `len(states)` включая призрачные строки `retrieval_state`, тогда как соседний агрегатор их фильтрует (`quality.go:259-260`) ⇒ после пере-чанковки покрытие занижается | бэкенд | когда-нибудь (ближайшее касание банка/наблюдаемости; (б) — дешёвая часть, вердиктов не двигает) | малое касание + вердикт-двигающая половина (а) через СТОП-решение | D39.86 | -| 106 | **Слой 3 НЕ достроен: контракт редактора = full-regen, а целевой — узкие мандаты + ДИФФЫ.** `09-target-architecture.md:121-126` дословно: «research/07 предписывает узкие мандаты + диффы, а не полную перегенерацию — сейчас ровно наоборот (4 мандата, full-regen), что и породило хвост инверсий»; целевой контракт — редактор правит anchored search/replace-спанами с детерминированным Go-apply (ограниченный blast-radius, дешевле, аудируемо, структурно omission-safe). Пак-16 построил петлю РЕМОНТА (починка флагнутого спана постфактум), а не diff-контракт роли ⇒ это разные вещи. **Строки не было ни одной** — дыра учёта, найденная сверкой 02.08 (грепы `diff`/`мандат`/`span` по бэклогу = 0). Смежное: арм Q4b «diff-fidelity+style редактор» (`exp15:108`) не прогонялся НИ РАЗУ, хотя трек B объявлен завершённым. **ЭМПИРИКА ПОЛУЧЕНА (D39.108, экспы 19/20):** дифф-контракт механически исправен (комплаенс 0.966 на боевой единице, аппликатор 15/15), но по замороженному гейту Q4b диффы ОТЛОЖЕНЫ (fidelity-trap 11/12; дороже full-regen на dspro×ru ×2.5–2.9 при невскрытой причине; D21.4/D21.10 закрыты явно). **Эксп-21 (D39.117):** полный regen выигрывает у точечного ремонта (`C2/A_law` −3.75 Holm 0.0006) — довод против диффов, НЕ опровержение: чинил дешёвый фиксер по предложению, а не сильный редактор узким мандатом; гейт «перепроверить до стройки» в силе, приоритет понижен | владелец → бэкенд | когда-нибудь (пере-проверка «сильный редактор × узкий мандат» — перед стройкой слоя 3) | замер → решение владельца | 09 §Слой 3, D39.90, D39.108, **D39.117** | +| 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 | **Реестр ЗАГЕЙЧЕННЫХ ТРИГГЕРОВ + норма закрытия «по нужности».** ⚠ Первый жилец реестра, найденный тем же лендингом: **сиблинг-угроза экрана целевого языка** — выход на языке, БЛИЗКОМ к целевому (украинский/болгарский для ru): ни одного события не наблюдалось, но если появится, дискриминатор — плотность РУССКО-ЭКСКЛЮЗИВНЫХ букв (ы/э/ё) НИЖЕ ожидания, а НЕ замыкание алфавита (`EFFORT_HANDLE §5.4` шаг 8). Шесть остальных реопенов живут только в телах D-нот и не имеют места, где их поднимут: **МАСШТАБ** (uniformity-пасс D12 · эмбеддинг A7/D2 «реопен = измеренный recall-разрыв, только batch-time лейн» · STITCH «бюджет ИЛИ измеренный эффект размера инъекции» · канон-пин серий) · **вторая пара живьём** (C-триггер softsign-decl · автономная Decl-эмиссия) · **вторая книга того же жанра** (жанровый shared-слой) · **первая traditional-книга** (probe-литералы 时辰/千万/数十万 цельным дата-батчем) · **появление Go-кода платформы** (`go.work` — ⚠ `platform/go.mod` УЖЕ заведён, триггер наступил) · **перед стройкой fix-8** (ёлочный экстрактор атрибуции + корпус-замер). **+Два жильца приёмки D39.91:** Д5 — enum эффорта провайдер-слеп (`medium` на DeepSeek не определён, `max`/`xhigh` недостижимы; пер-модельную таблицу решено НЕ строить — механизм без носителя качества/денег, misconfig ограничен бюджетами и назван в доккомменте `ValidReasoningEffort`; триггер: первый живой инцидент кривого поведения уровня на проводе) · Д9 — аддитивные провайдеры отказываются бэнк/repair-гейтам, блок не несёт `reasoning_max_tokens` (fail-closed в лоадере; триггер: первая потребность гейта в аддитивной модели). **+Вахта D39.92:** вендор анонсировал смену МАППИНГА эффорта `deepseek-v4-pro` «early August 2026» ⇒ квирк 3а («low→high, эффорт не настраивается») может устареть (триггер: аномалия редакторского арма ИЛИ дата > 05.08 ⇒ пере-проба маппинга + сверка changelog; абсорбция в `00-provider-quirks.md` — полигоном). Норма D39.66 «каждое отложено обязано ТЕМ ЖЕ лендингом получить строку или явное закрытие» нарушена ≥6 раз ПОСЛЕ собственной ратификации, и класс потерь узкий — теряются именно ЗАГЕЙЧЕННЫЕ РЕОПЕНЫ. Лечение: короткий реестр триггер→что вернётся→источник, сверяемый на каждом переходе горизонта (горизонт расписан до Ф3, точки сверки известны заранее) · **(D39.96)** тулчейн go1.27 переключит x/text на таблицы Unicode 17.0.0 МОЛЧА (`xTextVersion` пинит go.mod-строку, не таблицы) — триггер: любое движение тулчейна к 1.27 ⇒ строка 119 ПЕРВОЙ · **(D39.96)** CI-воркфлоу Forgejo (удалёнка 10.0.3, раннер не подтверждён; решение владельца 03.08 — не писать) — триггер: появление раннера ⇒ файл workflow; до того точка входа `make battery` | оркестратор | скоро ($0, гигиена трекера) | завести реестр + сверку в норму лендинга | D39.66, D39.90 | -| 109 | **Продуктовые требования БЕЗ строки-носителя (сверка 02.08):** **ПТ-6** структурные традиции целевого языка (короткие zh-абзацы → читаемые ru-структуры) — держится только редакторскими мандатами в пар-промптах, поверхности измерения нет, в составе Ф2-гейтов (52) структуры абзацев нет · **ПТ-7** «слабый оригинал: подправлять художественно или быть верным» — вопрос владельца, не заведён даже в блоке «висит на владельце»; после ответа: режим параметром запуска (данные, не ветка Go) + мандат в промпте + гейт «улучшение vs отсебятина» · **ПТ-22** продуктовый ИНТЕЙК настроек (сегодня = рукописный `book.yaml`; частично покрыт 67 в части «версия исходника») · **ПТ-10** сам механизм веб-фетча (tool-calling, провенанс/кэш добытого, инжект под правилом «книга = недоверенные данные») — есть только гейт безопасности 70. Гигиена реестра тем же касанием: ПТ-24 не проставлена 101, ПТ-1/ПТ-11 не проставлена 105, ПТ-2 не проставлены 46 и 34а | оркестратор/владелец | скоро ($0 — расписать носители) | завести строки/вопросы → диспозиции | D39.90, product-requirements | +| 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 (посадки приёмки D39.96 + §7-12/13 + §7-9). ⚠ Пункты (0а)/(0б) — РЕГРЕССИЯ против снесённого байт-гарда; дофикс ИСПОЛНЕН и принят D39.97 — (0а)/(0б)/(а) ЗАКРЫТЫ, плюс блокер type-param, ось имени и ложное срабатывание сверх промта; остаток строки — (б)/(в)/(г)/(д).** (0а) egressseam пропускает пакетную `llm.Complete(...)`: nil-`Selections` → молчаливый выход (`archguard.go:240-242`; фикс — fallback на `Uses`); (0б) пропускает интерфейс с llm-типами внутри композита (`Complete(ctx, []llm.LLMRequest)…` — `touchesPkg` не рекурсивен, `:79-82`); старый регекс `.Complete(` ловил обе формы; комменты «cannot be hidden» (`:250-253` и фикстура) фальсифицированы — переписать честно; (а) `runRequestSeam` обходит ТОЛЬКО `*ast.CompositeLit` (`archguard.go:197`): `var r pipeline.Request`+присваивание и `new(pipeline.Request)` проходят МОЛЧА — подтверждено на реконструкции: дыра ОБЩАЯ со старым гардом (не регрессия); фикс ~10 строк: симметрия ValueSpec/CallExpr со stage-сеамом + негативная фикстура, документирующая осознанные пропуски; (б) класс «встраивание · make+присваивание · дженерик-ноль» закрывается не свитчем, а ТИПОМ (нулевое значение `config.Stage` непригодно вне пакета); (в) политика build-тегов vet (сегодня default+live; чужой тег невидим — других в репо нет); (г) кандидат 4-й анализатор границы импортов — `backend/README.md:3` заявляет «проверяет `go list -deps`», что не автоматизировано ничем; (д) семь осознанных пропусков после дофикса 03.08 (принят D39.97; фикстуры БЕЗ want — покраснеют, когда начнут ловиться): llm.Ask-класс · пара внутри named-обёртки · встраивание/make/generic-zero · `internal/llm` исключён целиком (второй провод внутри адаптеров ловится только ревью) · внешние тест-пакеты · рефлексия (статикой не закрывается) · файлы за третьим сборочным тегом — всё, что закрываемо, закрывается типовым швом (б), не свитчем | бэкенд | скоро (остаток: (б) тип вместо свитча · (в) build-теги · (г) 4-й анализатор · (д) семь пропусков) | правка анализатора + посадки | D39.96 п.2/п.6, отчёт §7-9/12/13 | -| 122 | **Гигиена пака стандартов (не-блокеры приёмки).** `TestCheckerLabelsCandidates` — ни одного ассерта (дизайн-REPL в одежде теста) · сообщение `TestMemoryVersionPinsTheUnverifiedRenderRevision` не различает «изменился рендер»/«изменилась нормализация» · Makefile: regex GO_MIN_VERSION пропускает go1.26.0–1.26.3 (патч-уровень не проверяется) · включить `unconvert` (1) и `wastedassign` (2) — дешевле уже включённых по собственному правилу конфига · `.skips.log` не в gitignore (прерванная battery оставляет мусор в дереве) · Fprint-исключение errcheck скоупить на `cmd/` (сейчас весь модуль — будущий писатель файла экспорта получит молча съеденную ошибку) · `w\.Write`-исключение ключуется ИМЕНЕМ receiver-а вопреки собственному принципу конфига · miningstop-исключение глушит текстом весь файл — якорить на функцию · provenance-числа конфига дрейфуют от дерева (293/31/93 против 294/33/91; контрпример «все прод-Close — читатели»: `chunktest/epub.go:51`) · коммент c1 «echo mine unarmed» поправлен дофиксом 03.08 (снят) · инвариант-коммент `httpllm.go:77` «zero wire bytes» — верен для полей пинга, неверен для бампа x/net, который их привёз (находка-4 D39.96) — переписать честно | бэкенд | когда-нибудь | мелкие правки | D39.96 п.6, отчёт §7-6/7, §9 хвост | +| 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 | diff --git a/docs/README.md b/docs/README.md index bba1367f..7506753f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -9,13 +9,14 @@ - [glossary.md](glossary.md) — жаргон и сокращения (D-номер, паки, банк, голден, K/DC/H/L…) одним экраном. - [product-requirements.md](product-requirements.md) — реестр «что продукт обязан уметь»: START_PROMT V0–V5 + находки H6–H18, статусы сверены кодом. - `architecture/` — синтез и контракты: - - [05-decisions-log.md](architecture/05-decisions-log.md) — **источник истины по решениям**. Живой файл после диеты D39.125: карта + эрраты + живые тела + голова D39.106+; тела закрытых эр — слайсы `archive/architecture/05-decisions-*.md`. Грепай номер сначала в живом, затем в слайсах (тело ноты = строка `^## D<номер>`, прочие хиты — упоминания); целиком не читать. - - [09-target-architecture.md](architecture/09-target-architecture.md) — целевая 7-слойная архитектура (статус стройки — шапка-таблица; §3 — карта находок H/L) · [10-prompt-architecture.md](architecture/10-prompt-architecture.md) — промпт-слой · [12-go-style-notes.md](architecture/12-go-style-notes.md) — норматив общности §0 · [13-tech-debt-anchors.md](architecture/13-tech-debt-anchors.md) — якоря техдолга (справочник к бэклогу, НЕ трекер) · [14-api-contract/](architecture/14-api-contract/) — **контракт API v0 фронт↔платформа (D39.99)**: нормативная спека OpenAPI 3.1 (типы фронта генерятся из неё) + компаньон-README (провенанс ✓/◆/○, К-вопросы; зонная копия `frontend/docs/api-contract/` — байт-зеркало, сверять при лендинге). + - [05-decisions-log.md](architecture/05-decisions-log.md) — **источник истины по решениям**. Живой файл после диеты D39.125: карта + эрраты + живые тела + голова D39.106+; тела закрытых эр — слайсы `archive/architecture/05-decisions-*.md`. Грепай номер сначала в живом, затем в слайсах (тело ноты = строка `^## D<номер>`, прочие хиты — упоминания); целиком не читать. **Статус/суть/тело ЛЮБОГО номера одним хопом — реестр [05-decisions-index.md](architecture/05-decisions-index.md)** (все ноты, колонка тем для грепа «какой закон по X»; D39.126). + - [09-target-architecture.md](architecture/09-target-architecture.md) — целевая 7-слойная архитектура (статус стройки — шапка-таблица; §3 — карта находок H/L) · [10-prompt-architecture.md](architecture/10-prompt-architecture.md) — промпт-слой · [12-go-style-notes.md](architecture/12-go-style-notes.md) — норматив общности §0 · [13-tech-debt-anchors.md](architecture/13-tech-debt-anchors.md) — якоря техдолга + археология выселенных строк бэклога §Б-* (справочник к бэклогу, НЕ трекер) · [14-api-contract/](architecture/14-api-contract/) — **контракт API v0 фронт↔платформа (D39.99)**: нормативная спека OpenAPI 3.1 (типы фронта генерятся из неё) + компаньон-README (провенанс ✓/◆/○, К-вопросы; зонная копия `frontend/docs/api-contract/` — байт-зеркало, сверять при лендинге). + - Топикальные входы (D39.126; НЕ источники истины, при конфликте побеждает D-лог): [15-money-path.md](architecture/15-money-path.md) — деньги от гранта до settle одним маршрутом · [16-events-emitter.md](architecture/16-events-emitter.md) — сборка-норматив эмиттера шва (обязательное пре-чтение сессии строки 103) · [STACK.md](STACK.md) — карта «роль → модель → конфиг → квирки». - Исторические, читать через ⚠-баннеры: [01-decisions.md](architecture/01-decisions.md) (Р1–Р10) · [02-mvp-plan.md](architecture/02-mvp-plan.md) · [03-implementation-notes.md](architecture/03-implementation-notes.md) · [04-unhappy-paths.md](architecture/04-unhappy-paths.md) · [06-memory-risk-registry.md](architecture/06-memory-risk-registry.md). - `experiments/` — эмпирика полигона: [00-provider-quirks.md](experiments/00-provider-quirks.md) — **читать перед любым вызовом провайдера**; [08-cost-model-v2.md](experiments/08-cost-model-v2.md) — денежная модель; [09-pilot-protocol.md](experiments/09-pilot-protocol.md) — пилот Ф2.5; остальные 01–21 — отчёты ЗАКРЫТЫХ экспериментов (21 принят D39.117); ⚠ 22/23 — ЖИВАЯ сессия полигона, не ратифицированы (судьба — в баннерах/D-логе; 18–20 — с ревью-шапками приёмки D39.108, шапка первична). - `research/` — фактура ресёрчей 01–27; у принятых — ревью-шапки, часть тел под ⚠ superseded: **читай баннер прежде содержимого**. Ключевые для навигации: 15 голос · 16 ридер-IDE · 17 внешняя критика · 18 рычаги качества · 19 нарезка · 20 банк-майнинг · 21 обзор транспорта · 22 доменные харнессы · 23 шов движок↔платформа (транспорт superseded D39.106) · 25 холодное ревью шва — форма D39.106, отвергнутые альтернативы, требования к эмиттеру (читать перед любым кодом стыка) · 24 арбитраж банка (ПРИНЯТ D39.102: консилиум закрыт классом, вход фикс-пака банка — §G) · 26 официальные практики Anthropic (D39.121: записка-план, сниппеты хендоффов, карта «уже делаем/перенять»). - [PROGRESS.md](PROGRESS.md) — журнал: CURRENT-STATE + **ЕДИНЫЙ БЭКЛОГ** (единственный трекер) + живой хвост хроники. НЕ источник решений. -- `scripts/counts.py` — **производные числа доков считаются им, а не руками** (голова по трём носителям · счёт очереди и зон · вес открытых строк регистра платформы); `--check` даёт ненулевой код на расхождении. Его же зовёт зонный хук `scripts/githooks/pre-commit` при коммите, задевающем D-лог или PROGRESS — предупреждает, не блокирует. Заведено по D39.112 п.5б: голова отставала трижды у трёх разных оркестраторов. +- `scripts/counts.py` — **производные числа доков считаются им, а не руками** (голова по трём носителям · счёт очереди и зон · вес открытых строк регистра платформы · полнота реестра нот); `--check` даёт ненулевой код на расхождении; `--lint` — линтер file:line-якорей живых доков (D39.126). Его же зовёт зонный хук `scripts/githooks/pre-commit` при коммите, задевающем D-лог или PROGRESS — предупреждает, не блокирует. Заведено по D39.112 п.5б: голова отставала трижды у трёх разных оркестраторов. - Активные хендофф-промты сессий (состав обновляется при каждом лендинге — норма D39.80): [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) (роль/нормы; состояния не дублирует) · **Полигон: [POLYGON_TENANT_PANEL_SESSION_PROMPT.md](POLYGON_TENANT_PANEL_SESSION_PROMPT.md)** (эксп-22 ЗАКРЫТ 09.08, ждёт лендинга — сессия жива до слова владельца) · [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md) (отложен). Активных промтов бэкенда/платформы/фронта НЕТ; **S4 фронта ГЕЙЧЕН** (сначала «S3.5 фикс-пак оболочки», D39.119 п.4). Все ОТРАБОТАННЫЕ промты — в `archive/prompts/`, отчёты с ревью-шапками — в `archive/reports/`; статусы паков — CURRENT-STATE и D-лог, здесь не дублируются. Зонные журналы фронта/платформы — `frontend-PROGRESS.md` / `platform-PROGRESS.md` в их зонах (прогресс зон только там, D39.100). - Зоны фронта (чужие, читать при касании стыка; каждая ведёт СВОЙ зонный бэклог — единый бэклог их строк не принимает, D39.84): [../frontend/](../frontend/) — веб-интерфейс: промт фронт-сессий S0–S7 + [STACK_DECISIONS.md](../frontend/docs/STACK_DECISIONS.md) (пины версий точными числами и ловушки, сверены с вебом 02.08) + [BACKLOG.md](../frontend/docs/BACKLOG.md) · [../platform/](../platform/) — SaaS control plane: README + [BACKLOG.md](../platform/BACKLOG.md) (П-1..П-11) + `docs/` (промт P0 · зонный журнал `platform-PROGRESS.md`). - `archive/` — история ([правила архива](archive/README.md)): закрытые промты (`prompts/`) · отчёты с ревью-шапками (`reports/` — на них ссылаются приёмки) · исполненные арх-доки (`architecture/`) · слайсы хроники `PROGRESS-*.md`. Инструкции оттуда не исполнять. diff --git a/docs/STACK.md b/docs/STACK.md new file mode 100644 index 00000000..a0261526 --- /dev/null +++ b/docs/STACK.md @@ -0,0 +1,22 @@ +# Стек моделей — карта «роль → модель → конфиг → квирки» + +> **Топикальный вход, НЕ источник истины.** При конфликте побеждают D-лог (`architecture/05-decisions-log.md`) и shipping-конфиги `backend/configs/`. Слаги менять ТОЛЬКО с live-фактчеком `/models` + пробный вызов (правило двух направлений, quirks-шапка); ⚠ «слаг живой» ≠ «модель та же» — DeepSeek 31.07 сменил веса flash под слагом (D39.61, quirks §0731). Квирки: `docs/experiments/00-provider-quirks.md` (далее quirks). + +| Роль | Модель (слаг) | thinking / effort | Носитель конфига | Статус | Квирки | +|---|---|---|---|---|---| +| **draft** (translator) | `deepseek-v4-flash` | thinking ON, `reasoning:"low"` явно (D39.87/91 «вариант б») | `configs/pipeline-c1.yaml:36-60` | боевой ИНТЕРИМ (exp13; флип решает бейк-офф — эксп-22 ждёт лендинга) | quirks §0731 п.1 (дефолт-эффорт пробивает флор 8000), п.3а (не слать эффорт = ехать на `high`), п.4 (`low` пере-вооружает эхо), п.6 (эхо стохастично по вызову; ре-ген дешевле эскалации ×7.6). Thinking-OFF — НИКОГДА (эхо-мина, `echoMineViolation`) | +| **+ банкнота** (WHAT-канал драфта) | та же flash, промпт `translator-banknote.md` | как draft | ⚠ НЕ в shipping-c1 — ран-локальный конфиг книги: `~/books/gu-zhenren/coldrun-b/pipeline.yaml` (`gates.banknote` + `prompt_override`) | ⚠0731; включение в c1 = СТОП-решение владельца (строка 140: двигает RequestHash) | те же | +| **терминолог** | `deepseek-v4-flash` | thinking ON, `gates.terminology.reasoning:"low"` (одна ручка на обе бэнк-роли) | ран-локальный `~/books/gu-zhenren/coldrun-b/reprobe/bank-low/pipeline.yaml:68-78`; схема — `internal/config/pipeline.go:298` (TerminologyGate); в shipping-c1 гейта НЕТ (opt-in OFF) | боевой по факту прогонов; носитель — конфиг книги | quirks §0731 п.3а: пустой `reasoning` = вендор-`high` → 4/5 `length` с пустым телом; экран `target_script: Cyrillic` обязателен при гейте ON | +| **классификатор** (типы кандидатов) | flash (`classify_model` пуст ⇒ = model) | та же ручка | там же: `classify_types: true` + `classify_budget_usd` | проба/полигон; в shipping выключен ВЕЗДЕ | латентный мис-вердикт `cjk_artifact` — `13-tech-debt-anchors.md` §Б-105 | +| **editor** | `deepseek-v4-pro` **БИЛИНГВ** | thinking ON; `reasoning:"off"` = осознанный NO-OP (ReasoningNone); ручки эффорта у pro НЕТ (`low`→`high`) | `configs/pipeline-c1.yaml:61-85`; floor 16000 — `models.yaml:178` | боевой ИНТЕРИМ (D30.1/D39.22); D39.117: топология 2-прохода ПОДТВЕРЖДЕНА (`A/F3` +2.50 Holm 0.0004), жильцы dspro/glm-5 неразличимы ⇒ выбор = цена; закон-блок ОБЯЗАТЕЛЕН (строка 134) | quirks §0731 п.3а (маппинг pro), п.3б (замер `low` на pro ОТОЗВАН — НЕ УСТАНОВЛЕНО); вахта смены маппинга «early August 2026» — §Б-108 | +| **editor-резерв** | `glm-5` | thinking OFF ЯВНО (`extra_body {thinking:{type:disabled}}`, иначе таймауты ×3) | `configs/pipeline-arm-glm.yaml:42` + `models.yaml:184-195` | резерв; флип = один арм-конфиг. mistral-арм есть, но mistral ИСКЛЮЧЁН как редактор (D39.20) | quirks thinking-таблица (glm-5); эхо-экспозиция билингва при thinking-OFF НЕ измерена (`sourceEchoExposure`) | +| **судья Ф2** | Gemini (нативный адаптер — Ф2, строка 33); в C2-скелете провизорно `glm-5` | Gemini: thinking mandatory | `models.yaml:95-108,240-255`; `pipeline-c2.yaml:33-44` (select; «DO NOT FLIP») | Ф2/полигон — в движке НЕ построен; C2 неисполняем | quirks: `thinking_budget:0` → HTTP 400; учёт `additive_total`; судья ЭРОТИКИ непригоден (PROHIBITED_CONTENT неконфигурируем, D22.6) → первичный судья 18+ = grok | +| **канал B (18+)** | `mistral-large-2512` (переводчик-дефолт, D19.1) + `grok-4.3` (эскалация reasoning-ON + судья 18+) | mistral: не-reasoning; grok: OFF только явным `reasoning_effort:"none"` | `models.yaml:118-131,257-273` (accepts_labels, rate_limit) · `:63-87,221-238` · c1 `chains.adult:[grok-4.3]` | данные заведены; полный wiring — Ф2; `content_policy` пуст во всех shipping (сознательно) | quirks §Транспорт: mistral rate-limiter (~48% retry-fails → `max_concurrency:2`); grok: вложенная форма эффорта молча глотается; additive-биллинг (think-ON только за резервом D6.2) | +| **эскалация (канал A)** | draft single-hop → `deepseek-v4-pro`; цепочка `[deepseek-v4-pro, glm-5.1, gemini-3.1-pro-preview]` | наследует политику мишени; апекс mandatory-thinking | `configs/pipeline-c1.yaml:118-135` | заведена, но ⚠ `budget_usd: 0` в shipping ⇒ НЕ исполняется (ран-локальные: 0.10 / 0.015) | слаг ИМЕННО `-preview` (без него 404); C2-цепочка `[kimi-k2.6]` = интерим-заглушка, НЕ контракт | +| **арбитр** | Sol (ChatGPT, внешний контур, руки владельца) · grok-агентские роли полигона | — | строка 150 бэклога + `eval/tenant_panel/sol.py`; кредиты xAI — лист владельца (PROGRESS строка 6) | полигон, ждёт владельца | Sol = LLM: «издательское качество» им не доказывается, человеческий контур — пилот Ф2.5 (D39.117 п.5б) | + +## Примечания +- **⚠0731 (D39.61):** flash пере-обучен под тем же слагом; `/models` молчал. Развилка решена вариантом (б): явный `reasoning_effort:"low"` черновику + ручка эффорта бэнк-ролям (код `553f1a3`). Версию модели проверять ПОВЕДЕНИЕМ. +- **Вахта эффорта pro:** реестр загейченных триггеров — `architecture/13-tech-debt-anchors.md` §Б-108; статус ручки `low` на pro = НЕ УСТАНОВЛЕНО (quirks §3б). +- **Цена:** ~$0.85/ранобэ (D30.4; тело — `archive/architecture/05-decisions-D1-D38.md`, карта — шапка D-лога); пере-калибровка при следующем платном прогоне (112 залендена, D39.97). Edit-волна не гонялась НИ РАЗУ (строка 16); ставка платформы $0.03/глава (D39.123 п.2г). Цены слагов — `models.yaml` (`prices_checked: 2026-07-10`; катовер 0731 цен не менял). +- **Ключи API:** список env-ключей — `docs/README.md` §«Доступные ключи» (7 шт.); резолв per-провайдер — `models.yaml api_key_env`. **`.env` НЕ читать** (гардрейл CLAUDE.md), `.env.example` можно. diff --git a/docs/architecture/05-decisions-index.md b/docs/architecture/05-decisions-index.md new file mode 100644 index 00000000..eea2701c --- /dev/null +++ b/docs/architecture/05-decisions-index.md @@ -0,0 +1,181 @@ +# Реестр D-нот — карта актуальности v2 (D1–D39.126; строка 167) + +> Одна строка на КАЖДУЮ ноту журнала решений: № · дата · суть · статус · где тело · темы. Ведёт оркестратор при лендингах: новая нота = новая строка ТЕМ ЖЕ коммитом (полноту сторожит `docs/scripts/counts.py --check`). Суть и статус здесь — НАВИГАЦИЯ, не контракт: при конфликте побеждает ТЕЛО ноты (живой [`05-decisions-log.md`](05-decisions-log.md) → слайсы `../archive/architecture/05-decisions-*.md`). Несущие эрраты к фактам старых нот живут в шапке живого D-лога — их читать ОБЯЗАТЕЛЬНО, реестр их не дублирует. Темы (для грепа оси «какой закон по X»): деньги · шов · банк · промпт · судья · гейты · контракт · платформа · фронт · полигон · ToS · общность · процесс · нарезка · голос · инфра · модели. +> Родословная: прозаическая карта D1–D39.28 (ревизии D31–D38.2) пересобрана в реестр докс-паком 167 (09.08.2026, №16): извлечение 6+6 агентов по worksheet `../archive/reports/DOC_AUDIT_INVENTORY_2026-08-09.md`, полнота сверена скриптом против заголовков всех шести файлов. «тело: жив» = живой D-лог; «слайс N» = `../archive/architecture/05-decisions-N.md`. + +| № | дата | суть | статус | тело | темы | +|---|---|---|---|---|---| +| D1 | | Редактор C1 — монолингвальный: видит только черновик + approved-глоссарий, без исходника; {{text}} убрать из editor.md, поднять edit prompt_version | SUPERSEDED → D17 → D30.1 (редактор БИЛИНГВ) | слайс D1-D38 | модели промпт | +| D2 | | Диспозиция плохого чанка — skip+flag+continue: length→ретрай до капа, refusal/пустой→флаг, флагнутый не коммитит мусор в TM; flag_reason тегировать, edit max_tokens от черновика | ЖИВОЕ: ядро; + новый гейт-класс D30.3 | слайс D1-D38 | гейты инфра | +| D3 | 04.07 | Эскалация: канал A DeepSeek→GLM-5.1→апекс Gemini (слаг -preview); канал B Grok-основной; дефолт-редактор = grok-4.3 (бейк-офф exp04); capability-слой per-model в models.yaml | частично: цепочки живы с амендментами D14.1/D19.1/D22.4/D30.6; editor grok-4.3 SUPERSEDED → D30.1 | слайс D1-D38 | модели деньги | +| D4 | | Provider-fallback для облачных draft/edit НЕ добавлять: провайдер лёг → durable pause → resume; local→cloud только для local-ролей, channel-aware типом | ЖИВОЕ: усилено D39.26 (failover.go удалён) | слайс D1-D38 | инфра модели | +| D5 | | Онгоинг Analyst — инкрементально: brief заморожен, новые термины append, approved не ревизуются молча; проактивный gender=hidden; snapshotID покрыть память до инъекции Ф1 | ЖИВОЕ: D5.1 механизм hidden реализован; D5.2 снапшот покрыт | слайс D1-D38 | банк | +| D6 | 04.07 | Think-режим — не глобальный дефолт: reasoning_effort per-роль, дефолт off/minimal для draft/edit (операционные причины); think-ON пилотить на переводчике; xAI исключён до reasoning-буфера | частично: живы per-роль принцип и D6.2-буфер; «off/minimal» эродирован (draft ON, editor-off снят D30.1, эффорт D39.87) | слайс D1-D38 | модели деньги | +| D7 | | Схема банка памяти v1: база Р3 + alias-граф + gender=hidden + translit_policy + first_person + series-bible-lite (ты/вы = журнал событий); ranked-set/словари → v1.1 | ЖИВОЕ: схема реализована; speech deprecated D39.55 | слайс D1-D38 | банк | +| D8 | 04.07 | memory-компонент snapshotID = content-hash материализации инъектируемой памяти (не version-counter): drift-proof против тихой переоплаты; правит §3.2 | ЖИВОЕ | слайс D1-D38 | банк инфра | +| D9 | 04.07 | Приёмочная книга Фазы 1 = ja→ru ранобэ (~150k токенов); ruby/фуригана форсированы на критический путь импорта | SUPERSEDED → D18 (蛊真人 zh→ru; ja — второй прогон) | слайс D1-D38 | процесс | +| D10 | 04.07 | Знаменатель глоссарной консистентности = ВСЕ approved-термины (имена + выдуманные термины/титулы); names-only — под-метрика; порог 98% на детерминированном слое | частично: механизм жив; +D24.2 alias-слепое пятно, истинная консистентность ≈99.5% | слайс D1-D38 | банк гейты | +| D11 | 04.07 | Премиум-микс — конфиг-потолок budget_usd, не гейт приёмки; оба cost-числа ($0.6/$5) устарели, жёсткий гейт снят, sanity ~$0.69/ранобэ (exp08) | частично: принцип конфиг-потолка жив; числа SUPERSEDED → exp08 → D30.4 | слайс D1-D38 | деньги | +| D12 | 04.07 | Модель устойчивости к отказам: таксономия 3 классов отказа, single-hop эскалация контент-провалов, at-most-once cap для F3 (idempotency=request_hash), tmctl status read-only + манифест/паспорт | ЖИВОЕ: таксономия отказов и at-most-once-cap несут прод-поведение; амендменты D24.3/D29.1в | слайс D1-D38 | инфра деньги гейты | +| D13 | 09.07 | Пилот Ф2.5 — поправки протокола: арм «моно vs билингв редактор», C2 только с гетерогенными кандидатами, панель судей 2–3 семейства/11+ повторов со свапом, пре-регистрация расширена | ЖИВОЕ: гейт Ф2.5; D13.1 демотирован до подтверждающего (D30.1), D13.3 амендирован D25.3 | слайс D1-D38 | полигон судья процесс | +| D14 | 09.07 | Канал B (18+) — ревизия состава: DeepSeek выведен из explicit (ToS §3.4(5)), Mistral — кандидат-фолбэк, опора = AUP xAI; 18+ эмпирика — обязательная рука exp02/пилота | частично: п.1 жив с эрратой D39.29 п.3 (ToS-цитата не в том документе); D14.2 закрыт D19.1/D22.4, D14.4 — D22.1 | слайс D1-D38 | ToS модели | +| D15 | 09.07 | Resume-экономика: all-or-nothing resnapshot приемлем для статичной книги Ф1; онгоинг гейтится content-addressed reuse или селективным redrive (спека D15.2) | ЖИВОЕ: спека D15.2 v2→v3.1 (D22.2), отдельный док backend/docs; этапы Б+В в бэклоге (строка 49); D15.3 исполнен | слайс D1-D38 | деньги инфра | +| D16 | 09.07 | Банк памяти — 4 фикса границ доверия: полисемия same-src fail-loud, sticky наследует disposition, source-граница фонетических ключей ≥4, ruby-чтения как алиасы | ЖИВОЕ: D16.3 ратифицирована как дивергенция; D16.4 → строка 81 бэклога | слайс D1-D38 | банк гейты | +| D17 | 09.07 | D1 (моно-редактор) понижен до «дефолт Ф1, оспорен внешним замером» (−2.2…−5.6 MQM у monolingual-рефайнмента); решает пилот-арм D13.1 | SUPERSEDED → D30.1 (билингв) | слайс D1-D38 | модели | +| D18 | 09.07 | Приёмочная книга Ф1 = 蛊真人 (Reverend Insanity, zh→ru, вебновелла владельца); ja→ru понижен до второго прогона (амендмент D9) | ЖИВОЕ: историческое, книга та же | слайс D1-D38 | процесс полигон | +| D19 | 09.07 | Канал B v2: переводчик-дефолт Mistral, эскалация grok reasoning-ON, судьи 18+ Grok+Gemini; эхо-класс «reasoning-off+CJK» обобщён, echo-гейт навсегда; сид-развязки (гу-имена, 白凝冰 gender=hidden) | ЖИВОЕ: D19.1 эхо-класс (+регистр-оговорка D22.5), D19.2 echo-гейт навсегда, D19.3 gender=hidden | слайс D1-D38 | модели ToS банк | +| D20 | 09.07 | Приёмка бэкенд-пакета №2 + ратификация D15.2 v2: Q1 пер-стадийная гранулярность wireSnapshotID, Q2 порог + --accept-rebill, Q3 Adult wire-нейтрален; glm-5-редактор допустим для приёмки Ф1 | частично: живы Q1/Q2/Q3 (пер-стадийный wireSnapshot, --accept-rebill, Adult нейтрален); остальное нарратив | слайс D1-D38 | деньги инфра | +| D21 | 09.07 | Приёмка research/15 «Голос и состояние»: ратифицированы Ф2-механизмы — voice-профиль, address_pair (материализация ты/вы), reveal-окна, скоуп Annotator; анти-эхо принято, wiring гейтится замером | частично: п.1–3/5 Ф2-механизмы (частично построены паком-19, D39.55/56); D21.4/D21.10 закрыты D39.108; п.6 закрыт D39.61 | слайс D1-D38 | голос банк промпт | +| D22 | 10.07 | Приёмка «бэкенд №3» и «полигон-erotica»: D14.4 закрыт (18+ эмпирика полна), спека D15.2 v3.1, деньги Gemini additive_total, grok — первичный судья эротики, L3-скрин ратифицирован задачей | частично: D22.5 регистр-оговорка эха · D22.6 grok — судья эротики · D22.7 L3-скрин (неснятое предусловие, строка 8); остальное — фикс-листы | жив | судья ToS деньги | +| D23 | 10.07 | Приёмка рефакторинг-пакета №4: golden-гард — постоянный инвариант №8 бэкенда; OpenReadOnly санкционирован (status/report без flock, работают при живом прогоне) | ЖИВОЕ: D23.1 golden = инвариант №8; D23.3 append-only-дисциплина (на неё опираются все эрраты) | слайс D1-D38 | гейты инфра процесс | +| D24 | 11.07 | Приёмка Ф1 этапа A с оговорками: per-model floor min_max_tokens ратифицирован, post-check dstFormPresent (union базовой формы), alias-слепое пятно зафиксировано; порядок — фиксы до этапа B | частично: D24.2 и D24.4 (+D28.1) живы; D24.3 флор фальсифицирован для high (D39.86), остаток — строка 44 | слайс D1-D38 | гейты банк деньги | +| D25 | 11.07 | Приёмка research/17 (внешняя критика «восхождение»): release-state лестница с гейтом, fidelity-каскад shadow, trust boundary в контракт немедленно, ранжирование открытых вопросов Q1–Q7 | частично: D25.1 release-state (стр.49) · D25.2 (стр.85) · D25.5 trust boundary (стр.70) · D25.9-Q1 билингв-якорь (стр.62) · D25.10 анти-анкоринг = норма | жив | контракт судья процесс | +| D26 | 11.07 | Качество-первым: этап B (~300 глав) заморожен до читаемого конфига на 25 главах; диагностика exp12 — приоритет №1 полигона | SUPERSEDED → D39.33 (заморозка поглощена «МАСШТАБ последним») | слайс D1-D38 | процесс полигон | +| D27 | 11.07 | xAI-ключи: единый ключ с data-sharing для всех тестов и пилота Ф2.5, отключение data-sharing перед продом; «чистый ключ» снят из блокеров пилота | частично: отключение data-sharing перед продом живо (строка 67 бэклога) | слайс D1-D38 | ToS модели процесс | +| D28 | 11.07 | Приёмка бэкенд-пакета №5 (floor + postcheck-union): все оси ACCEPT, 0 critical; D24.4 амендирован — честный precision/recall-трейдофф, hard-gate требует пере-замера recall | закрыт (нарратив приёмки); живое D28.1 вписано в тело D24.4 | слайс D1-D38 | гейты процесс | +| D29 | 12.07 | Приёмка research/16 «Ридер-IDE»: чанк = несущий якорь, tmctl export + annotations annot-v1, политика красных fail-closed, цвет-мап+GREY, human_override LOCK | частично: D29.1а-г export-контракт = строка 49 бэклога; arity-полоса паспорта — дописка 55 | жив | фронт контракт | +| D30 | 12.07 | Приёмка exp12: флип D1 — редактор БИЛИНГВ (supersede D17), reflow-вёрстка, output-санитайзер новым гейт-классом, COGS +15–25% (~$0.85), exp13 бейк-офф переводчиков, трек дешёвых моделей | ЖИВОЕ: D30.1 билингв-редактор · D30.2 reflow · D30.3 санитайзер-гейт · D30.4 COGS ~$0.85 · D30.7 дешёвый трек; самый цитируемый узел (82 носителя) | жив | модели гейты деньги | +| D31 | 12.07 | Тотальная ревизия документации: PROGRESS разделён 393→63KB (архив-слайс), карта актуальности в шапке D-лога, баннеры/пометки живых доков, промты переписаны | закрыт (исполнен) | слайс D1-D38 | процесс | +| D32 | 12.07 | Приёмка exp13: смена переводчика flash→pro ОТКЛОНЕНА по данным (сфабрикованная сходимость), черновик = deepseek-v4-flash; сид v2 принят под подпись владельца; методика бейк-оффов | частично: живы D32.1 (переводчик = flash) и D32.4 (методика бейк-оффов = норма) | слайс D1-D38 | модели полигон судья | +| D33 | 12.07 | Приёмка пакета D15.2 этап А (билингв-редактор {{text}} + reflow + санитайзер + golden): принят; 2 обязательных фикса санитайзера до пере-прогона; editor glm-5 подтверждён | закрыт (нарратив приёмки) | слайс D1-D38 | промпт гейты | +| D33.1 | 12.07 | 2 обязательных фикса санитайзера залендены: хвостовой класс ловит «Основные правки для справки» (gemini-утечка), класс «битые словоформы» снят; блокер пере-прогона снят | закрыт (исполнен) | слайс D1-D38 | гейты | +| D34 | 12.07 | Сид v2 подписан владельцем (Жэнь Цзу, Монах Цветочного Вина, гу Жизни, первобытный камень, род «гу» муж.); гейт repoint рассинхронённого приёмочного конфига; fidelity re-gate независимым судьёй | частично: п.1 формы владельца → CANON-NOTES.md вне git (D39.21); п.3 fidelity re-gate = норма | слайс D1-D38 | банк процесс судья | +| D35 | 12.07 | Пивот: цикл приёмочных прогонов закрыт (инфра OK / читаемость нет = не провал); планка = 2 претензии владельца (интерим); курс «мерить→строить»; ключевой рычаг — нарезка×промпт | частично: планка «2 претензии» жива как интерим-мерило; остальное — разбор пере-прогона | слайс D1-D38 | процесс нарезка промпт | +| D36 | 12.07 | Приёмка research/18 (два независимых отчёта рычагов качества, Claude+ChatGPT): Ван Цуй-техники в дискурс-промпт, «тройная сходимость» калибрована; выдан промт полигон-эмпирики exp14 | закрыт (нарратив приёмки) | слайс D1-D38 | полигон промпт процесс | +| D36.1 | 12.07 | Док-гигиена: 5 спент-промтов заархивированы, PACKAGE4-residual оставлен активным (пилот-трек); бюджеты ключей подтверждены владельцем (по ~$9, Gemini €2.6) | закрыт (исполнен); бюджеты ключей устарели | слайс D1-D38 | процесс деньги | +| D37 | 12.07 | Приёмка exp14: претензия-1 (абзацы/конвенции РЯ) = рычаг промпта, не модель; A-2pass отклонён; схема разрядов «класс А/Б/В/Г»; «13 катастроф» завышено; нога-2 (эскалация на gpt-5.4) — холд | частично: §2а (претензия-1 = рычаг промпта) жив, величины superseded экспами 19–22; §2г inversion-гард → D38.4 | слайс D1-D38 | промпт полигон нарезка | +| D38 | 12.07 | Приёмка exp14b: «только gpt-5.4 чинит смысл» ОПРОВЕРГНУТО (mistral/deepseek-pro чинят), фронтир в дефолт не нужен; корень терм-дрейфа = статус-draft сида; холд смены дешёвого редактора | частично: §3 корень терм-дрейфа (статус draft) жив; §5 кандидат смены редактора закрыт эксп-22 | слайс D1-D38 | полигон модели банк | +| D38.1 | 12.07 | Слепой h2h P1a↔F-disc: ChatGPT/Claude расходятся, согласие — дефекты = ИНФРА; разворот «мерить→строить»: инфра-пак + reseed вместо бейк-оффа; смена редактора = арм пере-прогона | закрыт (исполнен) | слайс D1-D38 | процесс полигон инфра | +| D38.2 | 12.07 | Консолидация репозитория и доков: eval-код в логические папки exp12–14b (импорты сохранены), статус-доки и .puml актуализированы до D38.1, ссылки починены | закрыт (исполнен) | слайс D1-D38 | процесс | +| D38.3 | 12.07 | Инфра-пак читаемости залендён: экспорт флагнутых чанков через stripCosmetic (не пусто), класс cjk_leak, число/omission-гард opt-in; 3 дизайн-вопроса владельцу | закрыт (нарратив приёмки) | слайс D1-D38 | гейты инфра | +| D38.4 | 12.07 | Аудит полноты exp14/14b: чэнъюй-атом дописан в дискурс-промпт; inversion-гард не построен → editor-swap = near-term защита; b1 частично; нарезка-арм; RegressionGuard включить при resnapshot | закрыт (исполнен); п.5 (флип RegressionGuard) исполнен D39.37 | слайс D1-D38 | процесс промпт гейты | +| D38.5 | 12.07 | Компоненты единого resnapshot залендены: reseed-сид (5 промоутов А/Б/В/Г + 四代族长) + дискурс-editor v3 (Ван Цуй + чэнъюй + few_shot-тумблер); следующий шаг — resnapshot + пере-прогон | закрыт (исполнен); пере-прогон ПРИОСТАНОВЛЕН D39 (арх-ресет, гейтится треком B) | слайс D1-D38 | промпт банк процесс | +| D39 | 13.07 | Арх-ресет: синк-аудит «сломанного телефона» (65 находок, 0 refuted) + целевая 7-слойная архитектура + фазовый план (трек A build-now ∥ трек B ресёрч); фантомный D35.7 формализован как цель слоя 1 | частично: 7 слоёв живут в 09-target-architecture, ледджер — архив 08-sync-audit; формализация D35.7 как цели слоя 1 в силе | слайс arch-reset | процесс инфра нарезка | +| D39.1 | 16.07 | research/19 (нарезка+когезия) залендён: конфликт exp14↔research/18 разрешён (эмиссия≠окно≠связность), Go-спека чанкера, когезия механизмом, волновая архитектура W0–W3, пре-рег эмпирики Q0–Q5 | закрыт (нарратив приёмки) | слайс arch-reset | нарезка инфра полигон | +| D39.2 | 16.07 | Трек A пак-1 залендён: trust-gated suppressor памяти + exportNormalize/export-contract + pair-keyed промпт-сеам + реестры + quality-report; адверсариал-долг за API-529 | частично: trust-gate памяти + exportNormalize живы (цитируются кодом); остальное — нарратив | слайс arch-reset | банк гейты общность | +| D39.3 | 16.07 | Пакет «банк-майнинг W1.5» ратифицирован (диспозиция H15/V4-п4); промт research/20 выдан с HOLD-гейтом до фриза exp15; гипотеза №1 владельца «код сам разметит» — проверяемая, не пресуппозиция | закрыт (исполнен) | слайс arch-reset | банк полигон | +| D39.4 | 17.07 | Адверсариал-долг D39.2 погашен (8 осей: 0 CRIT / 1 HIGH / 6 MED; HIGH = обход санитайзера полноширинными сигнатурами); лендинг пака-1.5 придержан под фикс-лист F1–F9 | закрыт (нарратив приёмки) | слайс arch-reset | гейты процесс | +| D39.5 | 17.07 | Пак-1.5 + F1–F9 залендены одним пакетом: tmctl export с manifest/drift-гардами · fold-first санитайзер v6 · bounded глосс-whitelist · пример zh→ru; экстракция полигона впредь через tmctl export | закрыт (нарратив приёмки) | слайс arch-reset | гейты полигон инфра | +| D39.6 | 17.07 | research/20 (банк-майнинг W1.5) залендён: детектор-лестница V-A/B/C, алиас-ярусы, banknote-v1 с 12 гейт-точками, §B5 инвариант общности P1–P6; §D-эмпирика гейтится exp15 | закрыт (нарратив приёмки) | слайс arch-reset | банк общность полигон | +| D39.7 | 18.07 | exp15 залендён в REV.2: «граница вредит» отозван как артефакт судейского окна; все когезия-эффекты под floor 0.126; «sequential нигде не лучше» LOO-stable; фертильность est_out=1.20·cjk+0.39·other | частично: риг-стандарт floor-относительного судьи + фертильность est_out=1.20·cjk+0.39·other живы в коде | слайс arch-reset | нарезка судья полигон | +| D39.8 | 18.07 | Слепое чтение exp15: планка ≤2 претензий не пройдена ни одним армом, дефекты распределены — читатель подтвердил метрический null; битва качества → дефект-классы (时辰-юниты, числа, гендер) | закрыт (нарратив приёмки) | слайс arch-reset | полигон гейты нарезка | +| D39.9 | 18.07 | Q4a «сильный переводчик»: верность НЕ покупается на translate-стадии (flash уже верен, pro ×3.67 не ратифицирован); смысл-катастрофы рождает glm-РЕДАКТОР → свап-арм приоритетен; DET-пол 0.261 | закрыт (нарратив приёмки) | слайс arch-reset | модели полигон судья | +| D39.10 | 19.07 | exp16: гипотеза №1 расщеплена — детектор V-C находит сущности ($0, recall 0.97), но канон-dst доставляет БАНКНОТА+Палладий, не ко-оккуренция; Z1-адъюдикация в облако; ре-аудит exp14b чист | частично: жив вывод «dst-канал = банкнота, не ко-оккуренция» (вход бэкенд-дизайна слоя 4) | слайс arch-reset | банк полигон модели | +| D39.11 | 19.07 | Директива владельца: стройке предшествует дизайн-синтез сессия с верифицированными алгоритмами; хендофф оркестратора №5, сессия №6 закрыта | закрыт (исполнен) | слайс arch-reset | процесс | +| D39.12 | 19.07 | План 11-implementation-plan ратифицирован (три рубежа): пер-волновой снапшот + инвариант секвенирования («переоплата ОДНА»), EditCeilingOut=3200, лемматизатор дефолт B; бэкенд-пак единой сессией | частично: пер-волновой снапшот + инвариант секвенирования + EditCeilingOut=3200 живы; сам план заархивирован | слайс arch-reset | инфра деньги нарезка | +| D39.13 | 19.07 | Приёмка пака-11 Block A: WS2 целиком (бюджет в выходных токенах, edit-единицы, src→dst-блок редактора = закрытие D30.1) + WS1a/b/c-инфра + WS4-ядро; волновой исполнитель и WS3/WS5 — резидуал R1–R5 | закрыт (нарратив приёмки) | слайс arch-reset | инфра нарезка банк | +| D39.14 | 19.07 | Приёмка пака-11 continuation: R2 Go-майнер (паритет EXACT) · R3 банкнота 12 точек · R4 DC-чекеры + export --pairs · R5 арм-конфиги · R1-аддитив; долг рубежа-2 погашен, 3 MINOR-фикса → R1 | закрыт (нарратив приёмки) | слайс arch-reset | банк гейты инфра | +| D39.15 | 19.07 | Директива владельца: изоляция языковых данных из pipeline/ — данные-файлами в internal/lang + configs/langpacks; архитектурный проход ПЕРЕД R1; промт 5-фазной сессии выдан | закрыт (исполнен) | слайс arch-reset | общность процесс | +| D39.16 | 19.07 | Приёмка арх-прохода: язык-данные майнера вынесены в internal/lang + configs/langpacks (парити EXACT); ратифицированы 3 дивергенции: language.Tag ОТВЕРГНУТ, DC-чекеры/pack.Version-фолд DEFER | частично: три ратифицированные дивергенции живы (language.Tag ОТВЕРГНУТ по CLDR-инстабильности — архитектурное решение) | слайс arch-reset | общность инфра | +| D39.17 | 19.07 | Приёмка R1 драйвер-свитч: волновой исполнитель (черновик∥→майнинг-стоп→редактура∥), редактор НИКОГДА не пере-рендерит draft; 3 MINOR-фикса → пере-прогон-преп; пак-11 завершён | частично: инвариант «редактор НИКОГДА не пере-рендерит draft» жив; остальное — нарратив приёмки пака-11 | слайс arch-reset | инфра банк деньги | +| D39.17-errata | 19.07 | MEDIUM-HIGH баг runWave (parent-cancellation → nil-deref/ложный exit 0), пропущенный рубежом-2 оркестратора, пойман 2-й ревью-сессией; фикс залендён, clean bill D39.17 признан неполным | закрыт (исполнен) | слайс arch-reset | процесс инфра | +| D39.18 | 19.07 | Blast-radius edit-единицы: ратифицирован и залендён c-lite — редактура чистого остатка при флагнутом члене (fallback экспорт сырых); + 4 read-модель-фикса пост-лендинг-ревью | частично: c-lite blast-radius (редактура чистого остатка) — живое решение; остальное — нарратив приёмки | слайс arch-reset | нарезка инфра | +| D39.19 | 19.07 | Пере-прогон-преп: 6 фиксов (R1-FL-A exit-3 · R1-FL-B reject-set · R1-FL-C x/text-пин · echo-сплит · read-model naming · ниты), §8-манифест полон, golden version-only, gender-signoff закрыт | закрыт (нарратив приёмки) | слайс arch-reset | инфра банк гейты | +| D39.20 | 23.07 | Пере-прогон исполнен и прочитан: планка ≤2 не пройдена, mistral исключён как несущий редактор, dspro-vs-glm не ратифицирован — итерация №2 после механизации дефект-классов, дёшево | частично: анти-корреляция «гладкость↔верность» и исключение mistral живы; остальное — нарратив пере-прогона | слайс 20-58 | модели судья полигон | +| D39.21 | 23.07 | Стайл-решения владельца пост-чтения (меры/род «гу»/стихи/资质) + директива аудита банк-инъекции; тело вынесено 26.07: книго-каноны → данные книги/пары | закрыт (исполнен) | слайс 20-58 | банк общность | +| D39.22 | 23.07 | Эксперимент пере-прогона закрыт, итерация №2 отложена; редактор = deepseek-v4-pro (интерим), glm-5 резерв, mistral вон; курс — разработка бэкенда | ЖИВОЕ: редактор deepseek-v4-pro; интерим-статус снят эксп-22 (D39.117: dspro побеждает — выбор подтверждён) | слайс 20-58 | модели процесс | +| D39.23 | 24.07 | Пак-15 «структура+форма» ратифицирован: сплит internal/pipeline по измеренной связности (text → miner/checks/membank/chunk), поправка §1 норматива, конфиг-слой пары | частично: сплит по измеренной связности + амендмент §1 12-go-style-notes | слайс 20-58 | инфра общность | +| D39.24 | 25.07 | Дизайн пака-16 «слой-3 diff-редактор» ратифицирован с перестановкой §15.1: всё $0-е строим, платная машинерия за enabled:false; включение платного пути = решение владельца по замеру остатка | частично: петля ремонта построена за enabled:false; ru-target-долг §15.3 амендирован D39.62 Q1 | слайс 20-58 | гейты деньги | +| D39.25 | 25.07 | Директива владельца: в движке НЕТ понятия «18+» — generic content-labels × provider-capabilities, refusal-обработка причино-агностична; «adult» = значение данных | ЖИВОЕ: норматив (12-go-style-notes §0 п.6) | жив | общность ToS | +| D39.26 | 25.07 | Дизайн пака-17 «generic content-labels × provider-capabilities» ратифицирован в редакции §14: лейблы вне хешей, резолв до валидации, один хоп; вокабуляр и редактор — владельцу | частично: 10 ратифицированных пунктов формы данных; остальное — нарратив, пак-17 закрыт D39.28 | слайс 20-58 | ToS контракт гейты | +| D39.27 | 25.07 | Пак-17 фаза 2 принят: форма добора B = гейт над резолвнутой моделью независимо от reasoning-off; вокабуляр владельца = пара violence/sexually-explicit → дельта: третье значение action | частично: форма 2 эхо-гейта + вокабуляр пары violence/sexually-explicit | слайс 20-58 | ToS гейты модели | +| D39.28 | 25.07 | Дельта пака-17 принята: третье действие allow (assert-only) — ратифицированная пара лейблов выразима данными; пак-17 закрыт целиком | частично: тройка route·allow·terminal с единым инвариантом; accepts_labels пусты = верное fail-closed | слайс 20-58 | ToS контракт | +| D39.29 | 25.07 | Пакет-5 полигона принят: право по ToS/AUP добыто первоисточниками (8 вендоров × 2 лейбла); по violence права нет ни у кого — развилка владельцу; две строки данных ждут подписи | частично: errata к D14 п.1; факты ToS живут в experiments/00-provider-quirks.md | слайс 20-58 | ToS полигон | +| D39.30 | 25.07 | Лейбл violence НЕ заводится (письменная интерпретация: художественное насилие ≠ пропаганда), риск Z.AI принят сознательно, accepts_labels xai/mistral подписаны и применены | ЖИВОЕ: юр-аудит-след; пересмотр риска Z.AI — при публикации/чужом контенте/смене политики (чек 25.10.2026) | жив | ToS модели | +| D39.31 | 25.07 | Пак-18 «долги контракта» принят: --accept-rebill построен, семантика escalation_model исправлена (санкционированный пере-капчер, новый baseline), два нита общности отложены по замеру | частично: формула порога --accept-rebill min($0.50, 5%×Projected) | слайс 20-58 | деньги контракт | +| D39.32 | 25.07 | Ответы владельца по остатку ToS: local = «политик нет, переводим всё»; Gemini-оговорка читается сужением (FORBIDDEN→UNCLEAR); ре-чек политик — правило; причина пустоты в конфиг не выносится | частично: правило ре-чека политик перед платными прогонами; local = переводим всё | слайс 20-58 | ToS процесс | +| D39.33 | 25.07 | Директива владельца: МАСШТАБ — последним, после достройки алгоритмического идеала; мини-прогоны ~10 глав = штатный инструмент доказательства; пак-19 распаркован | ЖИВОЕ: курс; 4 вопроса границы идеала = строка 2 | жив | процесс деньги | +| D39.34 | 25.07 | Сплошной аудит корпуса: 23 ратифицированные позиции без диспозиции; подтверждён неисполненный флип RegressionGuard; очередь и скоуп пака-19 исправлены; аудит — периодическая процедура | закрыт (исполнен) | слайс 20-58 | процесс гейты | +| D39.35 | 25.07 | Замер: $0-резюм драфта на стенде уже мёртв (снапшот разошёлся по трём осям) — аргумент «гнать, пока жив» отменён; ниты и обязательный флип берём до прогона | закрыт (исполнен) | слайс 20-58 | деньги процесс | +| D39.36 | 25.07 | Дефект шва: канал WHAT (банкнота) парсится и выбрасывается — владелец подписывает термины без предложенного перевода; майнинг-стоп жёсткий там, где замышлялся выбор | закрыт (исполнен) | слайс 20-58 | шов банк | +| D39.37 | 26.07 | Мини-прогон + фикс-пак + сквозная проверка приняты: операционка подтверждена живьём до цента, шов банкноты замкнут (не запинён — фикс-лист), остаток 0 в трёх классах петли | закрыт (нарратив приёмки) | слайс 20-58 | банк шов деньги | +| D39.38 | 26.07 | Санкции владельца: флаговый майнинг-стоп строим (пак-20, перед паком-19); петля ремонта не включается; полигону — размеченный набор чекеров; бэкенд-промтам — обязательный синк-шаг | закрыт (исполнен) | слайс 20-58 | банк процесс полигон | +| D39.39 | 26.07 | Пакет-6 принят: чекеры впервые измерены против человеческой разметки (3015 позиций, $0) — precision высок, recall низок, K5c инвертирован; «остаток=0» = ноль в охвате узких детекторов | частично: размеченный корпус labels/ = постоянный измерительный стенд чекеров | слайс 20-58 | гейты полигон | +| D39.40 | 26.07 | Владелец: фикс-пак чекеров = пак-21; перед ним — мини-прогон ~10 глав на полностью построенном бэкенде (после паков 20 и 19); очередь D39.38 амендирована | закрыт (исполнен) | слайс 20-58 | процесс гейты | +| D39.41 | 26.07 | Пак-20 фаза 1 принята: синк вскрыл 18 расхождений «доктрина↔код» и 4 тупика; вердикт «P1–P5 в предъявленном виде не строятся» подтверждён (39 CONFIRMED / 0 REFUTED); фаза 2 ждёт развилок владельца | закрыт (нарратив приёмки) | слайс 20-58 | банк процесс | +| D39.42 | 26.07 | Роль ТЕРМИНОЛОГ — переводит смердженный банк по контекстам после черновой волны; аппрув опционален; авто-режим ест неподписанное с пометкой; смена банка = точечная ре-редактура со сметой | ЖИВОЕ: контракт роли (34 носителя); амендменты — жанровый словарь отменён D39.47, маркер/двухсекционка на проводе → доктрина D39.104 | жив | банк | +| D39.43 | 26.07 | Пакет-7 фаза A принята: recall WHICH-канала впервые измерен (0.069–0.103; ограничивает эмиссия); посылка «культивация = общепринятое» не подтверждена; смета терминолога = единицы долларов, не центы | закрыт (нарратив приёмки) | слайс 20-58 | банк полигон деньги | +| D39.44 | 26.07 | Решения владельца по Z-развилкам пакета-7: рубрика K1–K12 ратифицирована (Q1–Q6 закрыты); 修炼 — V0 до добора; смета фазы B $1.20–2.60 санкционирована; $0-добор улик перед фазой B | частично: рубрика K1–K12 (живёт строкой бэклога 13а) | слайс 20-58 | банк полигон деньги | +| D39.45 | 26.07 | Пак-20 фаза 2 принята: терминолог (роль пар-пака) + флаговый стоп --verify-bank (дефолт авто) + авто-провод неподписанного + точечная ре-редактура с $0-пере-пином + банкнота отдельным файлом | закрыт (нарратив приёмки) | слайс 20-58 | банк деньги | +| D39.46 | 26.07 | Пакет-7 закрыт целиком: «контексты — главный рычаг терминолога» ратифицировано как измеренное; слепой LLM-судья = катастроф-экран, не ранжировщик; жанровый словарь инертен до расширения эмиссии | частично: три процессных правила полигона (арм-без-фактора · декой · критик полноты) — в промте оркестратора | слайс 20-58 | банк судья полигон | +| D39.47 | 26.07 | Жанровый словарь ОТМЕНЁН КАК КЛАСС — решение о переводе принадлежит подписи владельца на банк книги; амендмент D39.42 п.1/D39.44/D39.46; открытый вопрос — расширение эмиссии на класс term | ЖИВОЕ (+процессное правило №4: замер, подрывающий посылку задачи, обязывает остановиться) | жив | банк процесс | +| D39.48 | 26.07 | Дельта пака-20 принята (размотка словаря чиста, golden без пере-капчера); ось переформулирована: «что банкуется без подписи ≠ что кладётся на подпись»; перед дизайном — три пре-замера (~$0.14) | закрыт (исполнен) | слайс 20-58 | банк деньги | +| D39.49 | 26.07 | Владелец: три пре-замера D39.48 санкционированы (~$0.14, потолок $0.30), исполнитель — полигон; выдан пакет-8 | закрыт (исполнен) | слайс 20-58 | полигон деньги | +| D39.50 | 26.07 | Пакет-8 принят (8/8 CONFIRMED, $0.11): посылка «расширить эмиссию майнера» закрыта отрицательно — механизмом; дизайн: дисциплина банкноты + дыра языка ответа + allow_short + kwic_width в пар-данные | частично: эмиссия не расширяется (закрыто отрицательно); en/ja-детектора нет — строка бэклога 35 | слайс 20-58 | банк полигон | +| D39.51 | 26.07 | Дизайн «дисциплина банкноты + дыра языка ответа» ратифицирован: языковой экран на выходе + OffLanguage + кавычки/агрегация в свёртке; судья отложен; мини-прогон — холодный | закрыт (исполнен) | слайс 20-58 | банк гейты | +| D39.52 | 26.07 | Замеры D39.51 закрыты: строка примера формата чинит срыв языка (22/120→0/120) — в промпт роли данными; P1 consistency не разделяет — права на порядок подачи нет, пере-замер на холодном прогоне | закрыт (исполнен) | слайс 20-58 | банк промпт полигон | +| D39.53 | 26.07 | Стройка «дисциплина банкноты + языковой экран» принята: экран на выходе роли и черновой стороне, кавычки в свёртке, агрегация из чекпойнтов, kwic_width в пар-данные; снапшоты не двигаются | закрыт (нарратив приёмки) | слайс 20-58 | банк гейты | +| D39.54 | 30.07 | Малая пачка 14а+14б принята: ingest грязных епабов на x/net/html; комментарии промпт-файлов вырезаются с провода, SHA по канонической форме; chunkerVersion не поднят ратифицированно | частично: осознанная девиация chunkerVersion (не поднят) | слайс 20-58 | инфра промпт нарезка | +| D39.55 | 30.07 | Дизайн пака-19 «голос/состояние» ратифицирован: три сущности = типы записей банка с условным фолдом в memory_version; флаггер = гейт gates.voice без фолда; reveal сокращён до спойлер-флаггера | частично: условный фолд в memory_version + запреты (д)/(и) | слайс 20-58 | голос банк | +| D39.56 | 31.07 | Стройка пака-19 принята, пак-19 закрыт целиком: голос/обращения = таблицы v13/v14 с условным фолдом; ты/вы-флаггер A–C + D-индикатор в gates.voice; спойлер-флаггер; атрибуция целевая | частично: условный фолд + запреты (д)/(и); механизмы построены | слайс 20-58 | голос банк гейты | +| D39.57 | 31.07 | ToS-ре-чек по первому триггеру исполнен: дельта по оси violence/sexually-explicit пуста, вердикты не двигаются; Google-мониторинг перевешен на цепочку договора; правило «двух путей» амендировано | частично: правило ре-чека + следующие триггеры (25.10.2026 · первая лейблованная книга · правка accepts_labels) | слайс 20-58 | ToS судья полигон | +| D39.58 | 31.07 | Холодный мини-прогон принят ($0.126): recall банка майнер∪банкнота 0.918/0.980, банкнота-парсер v2 пар-слепой, разделение версий канала (slice/parse), эхо-мина жива при thinking-ON | ЖИВОЕ: числа-эталон; «echo 0» D39.20 — свойство выборки, не гарантия | жив | банк полигон модели | +| D39.59 | 31.07 | Курс амендирован владельцем: общность вперёд (ресёрч языковой привязки, пак-21 отложен), банк — курс на автономность (подпись опциональна), полигону — пакет Р6 «язык промптов» + fidelity P4 | частично: курс (общность вперёд · банк без обязательной подписи) жив; термин «автономность банка» переименован D39.67 в «качество банка» | слайс 59-90 | общность банк полигон | +| D39.60 | 31.07 | Ресёрч общности фаза 1 принят: карта долга 149 сайтов/45 файлов, пять вёдер A–E; ja→ru безопасно, en→ru нет; правило условного фолда; баг ko/Hangul, дыра эмбед-плоскости; 5 вопросов у владельца | закрыт (нарратив приёмки): карта живёт отчётом GENERALITY_RESEARCH_2026-07-31, вёдра разведены по строкам 14/35/79 | слайс 59-90 | общность гейты банк | +| D39.61 | 01.08 | Полигон Р6+P4 принят: DeepSeek 31.07 сменил веса под слагом — боевая форма покупает пустое, развилка 74; Р6 закрыт отрицательно (промпты русские); эхо стохастично; префилл — кандидат | частично: живы «слаг живой ≠ модель та же» (CLAUDE.md) и «языковые констрейнты — никогда без per-model замера»; wire-квирк 0731 абсорбирован в 00-provider-quirks | слайс 59-90 | полигон модели промпт | +| D39.62 | 01.08 | Ответы владельца по §12 общности: П1 цель-шов санкционирован, пак-21 растворён по карте D39.60, расщепление хеша не делаем; норма мандата самопроверки; горизонт до Ф3 достроен | ЖИВОЕ: норма самопроверки в промт-нормах; заморозка D39.24 §15.3 амендирована; Р2/Р4 закрыты D39.63 | жив | общность процесс | +| D39.63 | 01.08 | Р2 = ЗНАЧЕНИЕ (флаг только за неверное значение; неконвертированная форма = линт), Р4 = потолок полноты правила; «один общий resnapshot» вырожден в дисциплину секвенирования | ЖИВОЕ: контракт Р2 в коде чекеров; Р4 — норма потолков recall; платных замеров до лендинга фазы-2 не покупать | жив | гейты общность | +| D39.64 | 01.08 | Общность фаза 2 принята ($0): П0 EmbeddedVersion-фолд, П1 цель-шов данными (isRuTarget удалён), П2 скрипт-шов источника (Hangul-баг закрыт), П3 главы/сокращения данными, П4 табличные опц-файлы; строки 26/32/72/75-77 закрыты | ЖИВОЕ: П0–П4; критерий «пара без правки Go» держится; дыра — явный embed-список (строка 115); 9 флагов §5 = очередь владельца (строка 14) | жив | общность | +| D39.65 | 01.08 | Полигон «$0-сырьё арки банка» + пробы фиксов приняты: строки 21/22 закрыты (нестабильность 43.3%, консолидатор = терминолог по KWIC), 36а промерен (фикс чинит 6/6), 36в подтверждён живьём | закрыт (нарратив приёмки): живое (36а/36в переведены в статус «дизайн») исполнено D39.69 | слайс 59-90 | банк полигон | +| D39.66 | 01.08 | Свип полноты «потерянных тех-работ» исполнен: 77 находок, корзина II пака-21 возвращена в строку 25, новые строки 80–86; норма — каждое «отложено» в D-ноте получает строку тем же лендингом | частично: жива норма «каждое отложено получает строку тем же лендингом»; находки разведены по бэклогу и 13-tech-debt-anchors | слайс 59-90 | процесс | +| D39.66-пост-сверка | 01.08 | Находки свипа перепроверены адверсариально против кода: 20 CONFIRMED · 0 «передумали» · 3 RESCOPE вправлены (строки 81/73/49 сужены); полные якоря — 13-tech-debt-anchors.md | закрыт (нарратив приёмки): полные якоря живут в docs/architecture/13-tech-debt-anchors.md | слайс 59-90 | процесс гейты | +| D39.67 | 01.08 | Переименование курса: «автономность банка» → «качество банка»; «свежий мини-прогон» растворён в добор идеала; очередь — стройка банка ∥ пакет-чекеров; пост-сверка → 13-tech-debt-anchors.md | частично: живы термин «качество банка» и статус 13-tech-debt-anchors как справочника (не трекера); хирургия очереди исполнена | слайс 59-90 | банк процесс | +| D39.68 | 01.08 | Хендофф качества банка и пакета-чекеров бэкенд-сессиям: два промта (двухфазный банк-ресёрч со СТОП; стройка чекеров сразу); оба несут «глобальный критерий» и «мандат ревизии посылок» | закрыт (исполнен): промты отработаны (D39.69/75/78); два обязательных блока промтов — в промте оркестратора | слайс 59-90 | процесс банк гейты | +| D39.69 | 02.08 | Качество банка: серия-батчинг HEAD-AWARE (36в), тип-классификатор первичным (36а), Decl-шов из ru-данных decl_suffix (27/84); эмбеддинг/STITCH/ranked-set закрыты по нужности | ЖИВОЕ: три примитива в коде; закрытия «по нужности» ратифицированы; фикс-лист = строка 87; Q8 санкционирован D39.70 | жив | банк | +| D39.70 | 02.08 | Ответы §9: книжные примеры в classifier.md санкционированы (специфика — данными/модулями), Q1–Q7 делегированы инженерно; КАНОН ЦЕЛЕЙ проекта (6 пунктов) вписан в CLAUDE.md | ЖИВОЕ: канон целей = CLAUDE.md «Цели и мерило»; норма «специфика можно — данными/модулями» | жив | общность процесс банк | +| D39.71 | 02.08 | Фикс-пак банка выдан: 9 пунктов (а–и) одной короткой сессией; очерёдность явно — фикс-пак первым, пакет-чекеров после лендинга; Q6/Q8 закрыты, Q1/Q4 «не строить», Q2/Q7 — полигон-слоты | закрыт (исполнен): фикс-пак исполнен и принят D39.75, строка 87 закрыта | слайс 59-90 | банк процесс | +| D39.72 | 02.08 | Остатки карты общности D39.60 получают носителя: пропущенное ведро D («удалить», 12 сайтов) → строка 89 (аудит-чистка + сверка ведра B); носитель = пакет-чекеров | закрыт (исполнен): ведро D получило строку 89; остальные вёдра карты уже имели носителей | жив | общность процесс | +| D39.73 | 02.08 | Реконсиляция триажа: машинная сверка всех находок свипа D39.66 против носителей — решения сессий целы; 5 уроненных рекомендаций получили носителей (строка 90, дописки 52/55/74) | закрыт (исполнен); живое = норма «триаж завершать машинной сверкой» (промт оркестратора) | жив | процесс | +| D39.74 | 02.08 | Аудит ресёрчей соседних харнессов (research/21 транспорт · 22 домен): утерянного нет, взятое построено; Mistral-strip гейт → дописка в строку 59, halve-chunk-on-retry отклонён явно | закрыт (нарратив приёмки): вердикт «утерянного нет» ратифицирован; хвосты разведены в строки 59/45 | слайс 59-90 | инфра процесс | +| D39.75 | 02.08 | Фикс-пак банка принят: head-finality в данных, fail-loud classify_types, фикстура BANK-FULL, консолидация токенизации (щель U+0301); пункт (а) «ь» откачен самопроверкой; finding-1 → строка 91 | закрыт (нарратив приёмки): открытый finding-1 закрыт через строку 91 (D39.76/77) | слайс 59-90 | банк общность | +| D39.76 | 02.08 | Softsign-decl замер принят: разрыв мал и локализован, наивное «ь» отвергнуто окончательно, anchor-gated (C) сломан адверсариалом; решения: стопгэп A (сид-формы), C — в загейченный триггер второй пары | частично: жив C-триггер строки 91 (реопен ядра только при кросс-парном замере ≥2 пар); стопгэп A заленден D39.77 | слайс 59-90 | банк общность | +| D39.77 | 02.08 | Стопгэп A заленден, строка 91 закрыта; политика подписи уточнена: подпись банка опциональна, детерминированная морфология сида подписи владельца не требует — только вкусовые поля сида | частично: жива политика подписи (сид ≠ банк; морфология сида без подписи владельца); остальное нарратив приёмки | слайс 59-90 | банк процесс | +| D39.78 | 02.08 | Пакет-чекеров принят: харнесс labels в git (metrics.json побайтно 12/12), демоция Han-миссов, атрибуция ёлочки, caps-латиница, Р2 hard/soft split; CheapGateVersion v7; строка 25 закрыта | частично: живы Р2 hard/soft split и потолки recall в контракте правил; остальное нарратив приёмки | слайс 59-90 | гейты общность | +| D39.79 | 02.08 | Мелкая пачка хвостов санкционирована, решения §6 приняты: канон грейда «класс X», DC7 вслепую не строить, PercentScale SOFT, register_neg → книжный слой; ревью-вопрос расширен «второй книгой» | частично: живы register_neg в книжном слое, «жанровый shared-слой не строим», ревью-вопрос «вторая книга той же пары без правки Go» | слайс 59-90 | гейты общность процесс | +| D39.80 | 02.08 | Онбординг-оверхол доков: один носитель состояния (PROGRESS CURRENT-STATE), норма лендинга README, реестр product-requirements, глоссарий, стабильные ID строк бэклога, зонный сдвиг PUML, роль «Фронт» | ЖИВОЕ: нормы (один носитель состояния · README тем же коммитом · ПТ-реестр · стабильный ID строки) продублированы в CLAUDE.md/README | слайс 59-90 | процесс | +| D39.81 | 02.08 | Фронт открыт: продукт = SaaS, инвариант непротекания конвейера, процессная модель — движок = процесс-на-прогон, сервер в backend не пишется; строки 95–97, курс не пере-упорядочен | ЖИВОЕ: несущее (цитируется кодом платформы) | жив | платформа фронт контракт | +| D39.82 | 02.08 | Мелкая пачка хвостов принята: ведро D добито, tmctl backup + pre-flight (F4), register_neg → book.yaml; DC7 пере-гейчен сид-покрытием, канон грейда — книжный конфиг; строки 89/53/83 закрыты | закрыт (нарратив приёмки): DC7-канон в book.yaml, стройка только по остатку девиаций (строка 98) | слайс 59-90 | гейты инфра банк | +| D39.83 | 02.08 | Ре-проба flash и отладочный холодный прогон coldrun-b с автобанком санкционированы: трёхфазный промт A/B/C со СТОП-точками, потолки $0.15/$5, дисциплина «фикс = мультиязычный + тест» | закрыт (исполнен): фазы A/B исполнены D39.86, фаза C переиздана после развилки 74 | слайс 59-90 | модели деньги процесс | +| D39.84 | 02.08 | Стек фронта/платформы запинен; восемь решений владельца (денег в UI нет · PWA · сессия кукой/Bearer), ПТ-34 перевод не индексируется, якорь чтения = edit-unit, строки 99–102, зонные бэклоги | ЖИВОЕ: самый цитируемый узел эры (35 носителей); п.8 право самокоммита ОТОЗВАНО D39.98 | жив | фронт платформа | +| D39.85 | 02.08 | Шов движок↔платформа — индустриальный стандарт: NDJSON-поток событий → материализация в Postgres → SSE; артефакты границ стадий; запрет чтения живого SQLite; sibling-модули (research/23) | частично: §1 транспорт (stdout-пайп, платформа-родитель) SUPERSEDED → D39.106; остальное в силе | жив | шов платформа | +| D39.86 | 02.08 | coldrun-b принят: флор-16000 фальсифицирован, эхо-мина подтверждена на живых весах, вендор-факты в quirks (default high, pro low→high); дыра оси цели двусторонняя; развилка 74 у владельца | закрыт (нарратив приёмки): развилка решена D39.87, исполнена D39.91; вендор-факты живут в 00-provider-quirks | слайс 59-90 | модели деньги гейты | +| D39.87 | 02.08 | Развилка 74 решена владельцем: вариант (б) — явный reasoning_effort low + ручка эффорта ролям без неё (строка 104) + экран целевого языка (46); мандат «элегантно и чисто» = приёмочный критерий | частично: живы четыре приёмочных вопроса «элегантности»; решение (б) исполнено D39.91 | слайс 59-90 | модели процесс | +| D39.88 | 02.08 | Git-протокол мультисессий переведён в механику: коммитит оркестратор, pathspec-коммит `git commit -- <пути>`, никаких add -A/commit -a, чужую зону не трогает никто | SUPERSEDED → D39.98 (право самокоммита фронта/платформы отозвано, тело переписано на месте; протокол живёт в CLAUDE.md) | слайс 59-90 | процесс | +| D39.89 | 02.08 | Гипотеза владельца о консилиуме и уверенности моделей принята к проверке как расширение Q2 (строка 5/36б); промт банк-арбитража выдан ($2.00); дизайн обязан оперировать кластером термов | закрыт (исполнен): заход принят D39.102, приоры вошли в research/24 | слайс 59-90 | банк полигон | +| D39.90 | 02.08 | Закрытие сессии оркестратора №10: пак ручки эффорта отработан, ждёт приёмки (код незакоммичен); проба банка на low зелёная ($0.045); банк-ресёрч подрезан до $1.20; дыры трекера → строки 106–113 | закрыт (нарратив приёмки): содержимое разведено в строки 106–116 и D39.91 | слайс 59-90 | процесс модели банк | +| D39.91 | 02.08 | Приёмка бэкенд-пака 104/46/16: принят, обе девиации ратифицированы (repair-ключ свой; ThinksOnWire), две находки приёмки, отложки Д4–Д9 разнесены по носителям, строка 104 закрыта | закрыт (нарратив приёмки) | слайс 91-105 | шов гейты деньги | +| D39.92 | 02.08 | Решения владельца 02.08: строка 46 пере-поставлена closed-set «не тот язык, что просили», 107 (CI+линтер+бампы) и 112 (low на черновиках) санкционированы, вендор-сверка DeepSeek исполнена | частично: постановка строки 46 (closed-set) несущая; санкции 107/112 закрыты D39.97 | слайс 91-105 | гейты процесс модели | +| D39.93 | 02.08 | Дизайн-ввод по строке 46: проверки выхода — изолированным модулем чистых функций с именованными причинами; реюз FlagCJKArtifact снят в пользу именованного флага; экран пар-слепой | ЖИВОЕ: гейт незакрытой строки 46 | жив | гейты общность | +| D39.94 | 02.08 | Закрытие сессии оркестратора №11: состояние передачи — приёмка 104 исполнена, промт стандартов выдан, промт экрана 46 ждёт выдачи преемником, открытые вопросы владельцу зафиксированы | закрыт (исполнен) | слайс 91-105 | процесс | +| D39.95 | 02.08 | Пост-клоуз гигиена по речеку владельца: строка 74 закрыта, промт эффорта заархивирован, CURRENT-STATE освежён; урок — закрытие строки обязано триггерить греп по её номеру во всех живых доках | закрыт (исполнен) | слайс 91-105 | процесс | +| D39.96 | 03.08 | Приёмка пака «стандарты репо» (107·112·Д7) двумя пассами: принят по коду условно, лендинг гейчен тремя решениями владельца; регрессия egress-паритета; урок приёмки — шесть анти-паттернов | закрыт (нарратив приёмки) | слайс 91-105 | инфра шов процесс | +| D39.97 | 04.08 | Приёмка дофикса archguard + живой пробы: принят, пак стандартов заленден семью pathspec-коммитами, строки 107/112/117 закрыты; tools/go.mod строить отдельным модулем; разбор снапшота → строка 124 | закрыт (нарратив приёмки) | слайс 91-105 | инфра шов деньги | +| D39.98 | 04.08 | Ревью и лендинг фронта S2 + дофикса (3 дефекта: пар-слепой --font-cjk, изобретённый kind org, ключ рядов банка); git-канон v2 — коммитит ТОЛЬКО оркестратор — разнесён по носителям | частично: git-канон v2 жив (носитель CLAUDE.md, supersede D39.88/84 п.8); содержит признание нарушения D23.3 (тела переписаны на месте) | слайс 91-105 | фронт процесс | +| D39.99 | 04.08 | Контракт API v0 ратифицирован: форма = OpenAPI 3.1, дом канона 14-api-contract/, типы фронта генерятся; строка 95 закрыта, 19/19 находок вправлены; пост-мортем промт-ревью в канон | ЖИВОЕ: несущее (форма OpenAPI · дом канона · нормы пост-мортема; пинг-канал зон = зонный журнал) | жив | контракт фронт процесс | +| D39.100 | 04.08 | Решения владельца 04.08: К-1 десять статусов · К-8 лимиты «как Claude Code» (ПТ-35, paused) · К-5 ETA · К-3 метка главы из данных; платформа открыта промтом P0; зонные журналы = name-PROGRESS | ЖИВОЕ: несущее | жив | контракт платформа процесс | +| D39.101 | 04.08 | Закрытие сессии №12 и передача №13: доки актуализированы и подрезаны, банк-промт заархивирован, полный док-свип (~60 правок по 15 файлам); первая задача №13 — приёмка банк-арбитража | закрыт (исполнен) | слайс 91-105 | процесс | +| D39.102 | 04.08 | Приёмка банк-арбитража: research/24 принят, все числа чисты пере-раном; консилиум закрыт классом (кросс-модельные веса · self-consistency · селекция · ⟦TM-NO-DST⟧); строки 128–132 заведены | частично: ратификация «закрыто классом» несущая; фикс-пак 128 исполнен D39.118; «Гуюэ» закрыт D39.104 | жив | банк полигон | +| D39.103 | 04.08 | Решения владельца 04.08: фикс-пак банка 128 санкционирован, проба редакторского провода санкционирована (≤$0.30), фронтир-«go» дан (≤$0.50), мини-голд алиасов отложен; два промта выданы | закрыт (исполнен) | слайс 91-105 | банк модели промпт | +| D39.104 | 04.08 | Доктрина инжекта: банк на проводе = ЗАКОН для всех ролей; право «перевести иначе» упразднено, свобода — по области употребления; маркер ⟨проверить⟩ с провода снят; «Гуюэ» не чинить | ЖИВОЕ: несущее; внесение в движок — строка 134 после пробы | жив | банк промпт | +| D39.105 | 04.08 | Закрытие сессии №13 и передача №14: приёмка банк-арбитража исполнена, доктрина инжекта ратифицирована (D39.104), два промта выданы, полный док-свип; первым у №14 — приёмка P0 платформы | закрыт (исполнен) | слайс 91-105 | процесс банк | +| D39.106 | 05.08 | Шов: движок = транзиентный systemd-юнит на прогон, события = events.jsonl каталога книги (outbox-проекция коммитов SQLite), тейл с курсором (run_id, seq); платформа НЕ родитель движка | ЖИВОЕ: несущее; заменяет транспорт D39.85 §1; PD-59 superseded, пайп supervisor.go = дев-режим | жив | шов платформа инфра | +| D39.107 | 06.08 | Закрытие сессии №14, передача №15: P0 платформы принят и заленден, пул доработок P1 выдан (приёмка дерева = №15), D39.106 ратифицирован пятью верификациями; дельта норм №14 | закрыт (нарратив приёмки); живое = дельта норм №14 (5 уроков) в промте оркестратора | жив | процесс платформа | +| D39.108 | 06.08 | Приёмка экспов 18/19/20: приняты и залендены; закон-блок 21/21, вытеснение неверной строки банка 5/6; D21.4/D21.10 закрыты; эксп-21 «топология ролей» — промт выдан; строки 135–144 | частично: закрытия D21.4/D21.10 живы; вывод «2-й проход на dspro отрицателен» (§5.2 со слов) ОПРОВЕРГНУТ D39.117 п.4 | жив | полигон банк | +| D39.109 | 07.08 | Приёмка платформы P1+P2: приняты одним коммитом; регистр до PD-107, одна major (PD-80 DoS входа); ратифицировано 6/6 (30 суток сессии · iss RFC 9207 · MemoryMax 80%); два вопроса владельцу | закрыт (нарратив приёмки); п.1/3/4 читать через эрраты шапки (D39.112 п.2 · D39.106 п.3); регистр PD — DEFECT_REGISTER.md | жив | платформа процесс | +| D39.110 | 07.08 | Потолок прогона управляемый: шкала от минимума (ноль нельзя) до баланса; единица — главы, не доллары; потолок = аргумент прогона, не book.yaml (строка 145); фри-тир — предложение «ноль на бете» | ЖИВОЕ: п.2(в) «баланс МИНУС холды» исправлен D39.115 — максимум = Balance как есть; п.1 читать как пересказ | жив | деньги платформа | +| D39.111 | 07.08 | Промт S3 дописан приёмкой платформы (управляемый потолок + запрет кросс-origin); фикс-пак платформы (PD-79/80/83-85/91/95/100/106) передан запиской | закрыт (исполнен D39.114/D39.115); п.1 несёт ошибочную формулу «баланс минус холды» — эррата шапки, исправлена D39.115 | жив | платформа фронт | +| D39.112 | 07.08 | Верификация записей №15 независимым агентом: поправки к D39.109 (30 суток = SHOULD NIST, наш выбор строже; DoS входа ЕСТЬ — PD-80) и D39.110 (пересказ); восемь пробелов закрыты | частично: поправки к D39.109/110 несущие (продублированы в карте шапки); остальное — гигиена | жив | процесс | +| D39.113 | 08.08 | Инцидент: агент панели откатил незакоммиченные правки двух параллельных сессий (git reset/checkout в реальном дереве); один файл восстановлен, шесть потеряны; норма изоляции панелей ужесточена | ЖИВОЕ: норма изоляции панелей (промт + deny); таблицу потерь читать через D39.117 п.7; Приложение А — строка 148 | жив | процесс инфра | +| D39.114 | 08.08 | Фикс-пак платформы P3 принят и заленден: PD-79/80/83/84/85/91/95/100/106 закрыты, 8/8 посадок поймано, PD-80 и PD-91 пере-проверены исполнением; PD-104 оставлен открытым правильно | закрыт (нарратив приёмки) | жив | платформа | +| D39.115 | 08.08 | S3 «слой данных» принят: контракт 0.2.0 в каноне; потолок = run-options/CeilingBounds отдельным ресурсом; правило версий 0.x; три ошибки оркестратора поймала сессия (баланс-минус-холды) | ЖИВОЕ: CeilingBounds · правило версий 0.x · чтение чужой зоны для сверки — можно; контракт далее 0.2.1 (D39.123) | жив | фронт контракт деньги | +| D39.116 | 08.08 | Актуализация доков: 78 находок свипа по 107 живым докам; отработанные промты S3/P0 в архив с баннером-исходом; ошибка счёта counts.py исправлена; строки 146–148 заведены | закрыт (исполнен); строки 146–148 заведены | жив | процесс | +| D39.117 | 08.08 | Эксп-21 принят: строка 65 закрыта (dspro/glm неразличимы — жилец = цена/конфиг), починка = пре-гейт перед редактором; опровергнут вывод D39.108; курс — эксп-22 «панель жильцов» + Sol-арбитраж | ЖИВОЕ: диспозиции 142/65/106/55; правило ничьей эксп-22 ратифицировано; строки 149–153 заведены | жив | полигон судья модели | +| D39.118 | 08.08 | Фикс-пак банка (128+129+130-минимум) принят: семьи термов со-батчатся юнитами, bankdata-плоскость с BankDataVersion, сдвиг edit-волны bank-only, инверсия ранжирования семей; строки 154–159 | закрыт (нарратив приёмки); живое = ратификации (bankdata-плоскость · сдвиг edit-волны · лог эвиктнутых без миграции); 128/129 закрыты | жив | банк | +| D39.119 | 08.08 | Курс 08.08: эмиттер отложен; выданы два промта (бэкенд «блокеры контракта» · платформа «раннер»); S4 гейчен списком владельца (VS Code-вкладки); PD-105: дубль seq = норма, декодер идемпотентен | ЖИВОЕ: промты исполнены D39.122/D39.123; гейт S4 в силе до списка владельца | жив | процесс платформа фронт | +| D39.120 | 08.08 | Кросс-модельные контуры ревью: опровергатель другой моделью в панелях, независимый ревьюер тяжёлых ратификаций, предметные оси самопроверки в кодовых промтах; направление, не буква | ЖИВОЕ: норма-направление (носитель — промт оркестратора) | жив | процесс | +| D39.121 | 09.08 | Записка-план после тяжёлого ревью (ID→статус→улика, движение по записке) + официальные практики Anthropic абсорбированы направлением; research/26 — дайджест 86 рекомендаций | ЖИВОЕ: норма-направление; носители — промт оркестратора + CLAUDE.md (компакция, запрет подгонки тестов) | жив | процесс | +| D39.122 | 09.08 | Пак «блокеры контракта» принят: строки 99·100·101·125·145 закрыты; unit.id с тегом разреза, манифест tm-manifest-v2, --ceiling-usd = книжный потолок; research/27 принят фактурой (строки 160–162) | ЖИВОЕ: формы артефактов для потребителей; формула аргумента потолка поправлена D39.123 (PD-158); дизайн глав НЕ ратифицирован | жив | контракт нарезка деньги | +| D39.123 | 09.08 | Пак платформы P4 «раннер» принят: транзиентные юниты, холд-до-спавна, реконсилятор; формула потолка = committed+прирост×ставка без reserved (PD-158); ставка $0.03/глава; контракт 0.2.1 (503) | ЖИВОЕ: строки 138·139 закрыты; PD-113 — единственный открытый major до эмиттера; строки 165/166 движку | жив | платформа деньги шов | +| D39.124 | 09.08 | Закрытие сессии №15, передача №16: семь приёмок эры закрыты (D39.109–123); докс-диета — хроники в архив-слайсы, зонный журнал платформы 1856→630 строк, CURRENT-STATE пересобран | закрыт (исполнен); очередь №16 дополнена D39.125 п.4 (докс-пак 167 первой задачей) | жив | процесс | +| D39.125 | 09.08 | Докс-диета по аудиту: D-лог слайсирован в 5 архив-слайсов (961→323 КБ), PROGRESS −42%, факты-против-кода исправлены (эррата D39.111); нормы формы доков; остаток аудита = строка 167 | ЖИВОЕ: правило чтения D-лога (карта+эрраты+живые тела+голова D39.106+, греп живой файл → слайсы) + нормы формы | жив | процесс | +| D39.126 | 09.08 | Докс-пак 167 исполнен: реестр всех нот (этот файл) · counts --check полнота реестра + --lint якорей · разгрузка топ-10 строк бэклога · топикальные входы 15-money-path/16-events-emitter/STACK · К-статусы компаньона сведены | ЖИВОЕ | жив | процесс | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 2960eff8..4b5d14bb 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.125 (живой файл: карта · эрраты · живые тела · голова D39.106+; тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже) +# Журнал решений оркестратора — контракт D1–D39.126 (живой файл: карта · эрраты · живые тела · голова D39.106+; тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто: > ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 живёт ниже в этом файле (голова D39.106+). @@ -18,19 +18,14 @@ > (его HEAD — финальная версия); чьи модификации были в дереве — достоверно неизвестно. > ⚠ **Навигация (актуализация 04.08):** два supersede-указателя эры D39.9x: **D39.88/D39.84 п.8 (право самокоммита фронта/платформы) → отозвано, коммитит ТОЛЬКО оркестратор** (D39.98 п.3; тела переписаны на месте с санкцией владельца, pre-rewrite — git `2b166b7`) · **норма 30.07 «короткая приёмка» → амендирована владельцем 03.08: приёмка всегда адверсариальная** (носитель — промт оркестратора §Анти-паттерны + D39.101 п.1) — упоминания «короткой приёмки» в телах читать через эту пометку · **двухсекционная редакторская инъекция и смягчающая роль маркера ⟨проверить⟩ → доктрина инжекта D39.104**: банк на проводе = ЗАКОН для всех ролей независимо от статуса строки, право «перевести иначе» упразднено, блок редактора — ЕДИНЫЙ, маркер с провода снимается (статусы строк и подписная таблица не меняются; внесение в движок — строка 134 после пробы 18) — упоминания двухсекционки/смягчения в телах читать через это. -> ⚠ **Навигация (актуализация 01.08):** карта ниже детально покрывает D1–D39.28; решения D39.29+ живут хронологически в теле файла, **свежая голова — С ХВОСТА** (новые ноты аппендятся вниз). Сводка текущей головы и очередь — CURRENT-STATE в `../PROGRESS.md`. -> - **Полностью superseded:** **D1 (моно-редактор) → D17 → D30.1 (редактор БИЛИНГВ)** · D9 (ja-приёмка) → D18 (蛊真人 zh→ru; ja — второй прогон) · D17 → D30.1 · скобка D19.4 «ключ без data-sharing» и D20.3 «чистый ключ = блокер пилота» → **D27** (единый ключ С data-sharing, отключение перед продом) · exp04-дефолт «editor grok-4.3» (D3) → D30.1 (grok reasoning-off из редакторских ролей СНЯТ — no-op; кандидат glm-5-билингв; gemini — премиум-эскалация только за санитайзером D30.3). · **Транспорт шва D39.85 §1 (stdout-пайп, платформа-родитель) → D39.106** (журнал в каталоге книги + systemd-юнит-на-прогон); остальное D39.85 в силе. -> - **Частично амендировано:** D3 (канал B → D14.1/D19.1 + оговорки D22.5/D22.6; апекс-слаг `-preview` — D22.4; draft под вопросом exp13 — D30.6) · D6 («off/minimal для draft/edit» эродирован: draft thinking-ON принудительно, editor-off снят D30.1; живы per-роль принцип и D6.2-буфер) · D10 (+D24.2 alias-слепое пятно, истинная консистентность ≈99.5%) · D11-числа → exp08 → **D30.4** (флип D1 = +15–25%, ~$0.85/ранобэ; «$1.5–2» = неподписанная опция Б) · D12 (+D24.3 флоры max_tokens; +D29.1в rollup — амендмент вердикт-правила) · D13.1-арм из решающего → ПОДТВЕРЖДАЮЩИЙ (D30.1); +D25.3 prefix-анализ судьи · D14.2 закрыт D19.1/D22.4; D14.4 закрыт D22.1 · D15.3 исполнен; спека D15.2: v2→v3→v3.1 (D22.2), реализация = текущий пакет (D30.9) · D24.4 +D28.1 (precision/recall-трейдофф; hard-gate требует пере-замера) · порядок D24.5 отложен D26.1 (этап B — после читаемых 25 глав). -> - **Живое ядро без изменений:** D2 (+новый гейт-класс D30.3), D4, D5, D7, D8, D10-механизм, D12-таксономия отказов, D16, D18, D19.1–19.2, D21 (Ф2-механизмы voice/address/reveal), D22.5–22.7, D23 (golden = инвариант №8), D24–D39.28 — действующая голова контракта (**D39.28 = ПАК-17 ЗАКРЫТ ЦЕЛИКОМ: третье действие `allow` (assert-only) построено ⇒ ратифицированная ПАРА `violence`/`sexually-explicit` выразима ДАННЫМИ; тройка `route|allow|terminal` несёт ОДИН инвариант и различается остальным; `accepts_labels` пусты = верное fail-closed до ФАКТОВ ToS по первоисточникам (пер-лейблу, зона полигона)**; **D39.27 = пак-17 фаза 2 ПРИНЯТ и залендён [механизм построен по всем 15 «ровно так»; golden байт-в-байт, парити EXACT, `-race`, ценз 433→451 диффом имён; мои три мутации пойманы именованными тестами]; форма добора B = гейт над резолвнутой моделью НЕЗАВИСИМО от `off` + generic-предупреждение `sourceEchoExposure`; **вокабуляр владельца = ПАРА `violence`/`sexually-explicit`** (сохраняет D14 п.1 и dspro-редактора) ⇒ обязательная дельта: третье значение `action` assert-only; Q2 редактор ОТЛОЖЕН с записью (связывает только explicit-книги); новая петля: лейбл НЕ доезжает до промпта — промпт-слой решается отдельно**; **D39.26 = дизайн пака-17 «generic content-labels × provider-capabilities» ратифицирован В РЕДАКЦИИ §14 отчёта [лейблы НЕ входят ни в один хеш — назначенный слой D20.2-Q3 = резолвнутая модель стадии пер-стадийно/пер-волново · резолв ДО валидации, «достижимое» лейбл-зависимо · один хоп `chain[0]`, `len>1` громко, `budget_usd>0` обязателен · Q1 = книга по аргументу ГАРАНТИИ · вокабуляр `content_labels`(книга)/`accepts_labels`(модель, `*[]string` только сужает) · `permissive`+`Stage.Channel`+enum+блок D4.1 отставляются ОДНИМ диффом · `failover.go` удаляется · отказы за `forWrite`, резолв всегда]; добор оркестратора: единый лейбл «adult» схлопывает violence-развязку D14 п.1 → вокабуляр владельцу · `reasoning:"off"` — тихий выход из аддитивного И эхо-гейта на xai (обобщение D19.1 п.2 в данные не доехало) · рейт-гард деградирует молча; НА ВЛАДЕЛЬЦЕ: вокабуляр лейблов + Q2 редактор; D22.7 паком НЕ снимается**; **D39.25 = в движке НЕТ понятия 18+ [generic content-labels × provider-capabilities, refusal причино-агностичен, «adult» = значение данных; §0 п.6]**; **D39.24 = дизайн пака-16 diff-редактора ратифицирован с перестановкой: $0-части (позиционная детекция · read-only скан · фиксы ru_hours_re/半个时辰) строим, платная машинерия §D3–D5+§15.2 под enabled:false, включение = решение владельца по замеру остатка пост-профилактики; поправки §15.2 (позитивный ре-гейт+анти-удаление · счётчики из role='repair' без миграции · отбрасывание пересечений · reserve-деградация · classify-гард); ru-target-долг = ограничение**; **D39.23 = пак-15 «структура+форма» ратифицирован [хойст text/value-базы → сплит miner/checks/membank/chunk по ИЗМЕРЕННОЙ связности (прил. A пака-14 с поправкой ревью-шапки) · форм-фиксы Export/RequestHash/resolveChunkState · конфиг-слой пары (пар-калибровки из ран-конфигов, промпт-резолв конвенцией) · overlay-хвосты, unionStringMap-коллизия = громкая ошибка; §1 12-go-style амендирован; байт-точность+парити EXACT; crush-масштаб НЕ эмулируем]**; **D39.22 = эксп пере-прогона ЗАКРЫТ решением владельца; итерация №2 ОТЛОЖЕНА [её вопросы — довесок следующего платного прогона]; редактор = deepseek-v4-pro ИНТЕРИМ [судья №1 · проза/глоссарий · дефекты чинибельны · ×2 дешевле], glm-резерв, дефолт-конфиг при лендинге пака-13; курс = разработка бэкенда [масштаб книги · канал B · Ф2-механизмы · ja→ru §B5]**; **D39.21 = стайл-решения владельца: меры → единицы языка читателя [时辰=2ч] · generic-«гу» СРЕДНИЙ род, именные — по-термово из банка · стихи СМЫСЛОМ · 资质=«талант»; + директива аудита полноты банк-инъекции**; **D39.20 = ПЕРЕ-ПРОГОН исполнен+прочитан [операционка вся живьём: $0-резюм драфта ×3 арма · echo 0 · $6.63<$15; судья dspro 0.679>glm 0.589>>mistral 0.232 при floor-шуме 0; слепые чтения ×2: сводные выборы разошлись, чисто-художественные ИДЕНТИЧНЫ = mistral 4/5 → анти-корреляция гладкость↔верность доказана трижды]; планка ≤2 НЕ пройдена → пилот не открыт; mistral ИСКЛЮЧЁН как несущий редактор [критические смысловые вне гейтов; голос = north-star промпта]; dspro-vs-glm НЕ ратифицирован [зазор ~шум] → итерация №2 после механизации [драфт $0]; дефект-классы→механика: 时辰-юнит-чекер · число-масштабы · broken-word/latin · заголовок-шаблон · банк-дельта 元/资质/赤城 · mined_delta-крэш-фикс [пак-13]; решения владельца: род «гу»/меры/стихи/春秋蝉; полигон: авто-QA ключевать слепыми метками**; **D39.19 = пере-прогон-преп ЗАЛЕНДЕН [6 фиксов: R1-FL-A CLI-exit-3 · R1-FL-B reject-set-livelock-закрыт · R1-FL-C x/text-в-Ш-2 · echo-сплит · read-model-naming · ниты]; golden version-only [masked=0]; парити EXACT; §8-манифест полон; gender-signoff закрыт; бэкенд готов к пере-прогону**; **D39.18 = blast-radius edit-единицы: c-lite (редактура чистого остатка вместо бланка всей единицы; вариант владельца (c)+fallback (b)) залендён `488c8d4`, no-flag путь байт-идентичен; + 4 read-модель-фикса пост-лендинг-ревью [quality-echo/status-first-flagged/export-pairs/detail], открытое решение владельцу = echo-метрика семантика; R1-FL-A/B/C deferred в пере-прогон-преп**; **D39.17-errata = runWave parent-cancellation баг [мой рубеж-2 пропустил, 2-я сессия поймала], фикс `5fc4860`**; **D39.17 = R1 драйвер-свитч ЗАЛЕНДЕН [волновой исполнитель черновик∥→банк-майнинг-стоп→редактура∥; редактор не пере-рендерит draft; Ш-1/Ш-2; golden-рерайт; read-модели per-unit]; полный рубеж-2 [5 линз вкл. синк-с-ресёрчем] = clean bill по несущим осям, 3 MINOR/NOTE-фикса (R1-FL-A CLI-exit-код · R1-FL-B mining-стоп-reject · R1-FL-C x/text-версия) в стенд-only mining-пути → пере-прогон-преп; ПАК-11 ЗАВЕРШЁН**; **D39.16 = арх-проход ЗАЛЕНДЕН: майнер-данные (百家姓/Палладий/частицы/суффиксы) вынесены в `internal/lang`+`configs/langpacks/` [граница компиль-enforced, байт-точно — парити EXACT, golden байт-идентичен]; FL-1/2/3+тест-путь; РАТИФИЦИРОВАНЫ 3 дивергенции: language.Tag ОТВЕРГНУТ [CLDR-инстабильность в вердиктах], DC-чекеры+снапшот-фолд DEFER [майнер offline/нейтральность]; общность структурно доказана; промт отработан→архив**; **D39.15 = директива владельца: изоляция языковых данных из `pipeline/` [движок общий · `internal/lang/`+`configs/langpacks/` данными-файлами · `x/text/language.Tag` вместо `isRuTarget` · снапшот-folded как промпты · алгоритмы не трогать]; архитектурный проход ПЕРЕД R1 [ре-секвенс]; поведенчески нейтрально zh→ru [golden байт-стабилен]; не минор-хант/не rewrite-ради-rewrite; промт `BACKEND_ARCH_CLEANUP_SESSION_PROMPT.md` 5-фазный [ресёрч→синтез→фикс-лист→исполнение→ревью]; ja→ru = тест общности §B5 позже**; **D39.14 = пак-11 continuation ПРИНЯТ и залендён [R2 майнер паритет-EXACT · R3 банкнота 12-точек · R4 DC-чекеры+export--pairs · R5 арм-конфиги · R1-аддитив; рубеж-2 D39.13-долга погашен: 3 MINOR/PARTIAL-находки [FL-1 bankTokenBudget-фолд · FL-2 banknote-телеметрия-резюм · FL-3 emission-top-N-кап], все латентны → R1-продолжение; R1 драйвер-свитч резидуал; clean bill по деньгам/wire/порту]**; **D39.13 = пак-11 Block A ПРИНЯТ и залендён [WS2 целиком (вкл. src→dst-блок редактора = закрытие D30.1) + WS1a/b/c-инфра + WS4-ядро; 2 девиации ратифицированы; резидуал R1–R5 в PACK11_REPORT; промт остаётся активным; рубеж-2 приёмки — долг]**; **D39.12 = план `architecture/11-implementation-plan.md` РАТИФИЦИРОВАН [три рубежа: ревью-2 F1–F11 → 7-агентный адверсариал → подтверждающий пас; пер-волновой снапшот + инвариант секвенирования = «переоплата ОДНА»; EditCeilingOut=3200; лемматизатор дефолт B; 4 гейтнутых арма]; бэкенд-пак ЕДИНОЙ сессией — `BACKEND_PLAN11_SESSION_PROMPT.md`**; **D39.11 = директива владельца: стройка ТОЛЬКО после дизайн-синтез сессии с верифицированными алгоритмами; хендофф №5**; **D39.10 = exp16: WHICH подтверждена [V-C recall 0.97, $0] / WHAT→банкнота+Палладий [canon-recovery <70%], 9B-споттер не нужен, Z1→облако, ре-аудит exp14b чист [errata не требуется]; исследовательская программа ЗАВЕРШЕНА → бэкенд-пак слоёв 1+4**; **D39.9 = Q4a: верность НЕ на translate-стадии [flash уже верен, pro ×3.67 не ратифицирован], смысл ломает glm-РЕДАКТОР [свап-арм приоритетен], DET-пол 0.261; exp14b-правила дефектны → $0-ре-аудит в exp16**; **D39.8 = слепое чтение: планка не пройдена никем, дефекты распределены [читатель подтвердил floor-null], битва качества → дефект-классы [时辰-юниты, числа, gender-enforce, стих, регистр]**; **D39.7 = exp15 залендён REV.2: «граница вредит» отозван [артефакт окна судьи], все когезия-эффекты под floor 0.126, «sequential нигде не лучше» LOO-stable [не ратифицированный зелёный свет], фертильность 1.20/0.39, $12.79/$15; гейт = слепое чтение владельца**; **D39.6 = research/20 банк-майнинг залендён [детектор-лестница V-A/B/C, алиас-ярусы, banknote-v1 с 12 гейт-точками, §B5 плагины P1–P6, §D-пре-рег]; полигон-стадия после exp15**; **D39.5 = пак-1.5+F1–F9 залендены [tmctl export с manifest/drift-гардами · fold-first санитайзер · bounded глосс · пример zh-ru]; экстракция полигона впредь через tmctl export**; **D39.4 = адверсариал-долг ПОГАШЕН [8 осей: 0 CRIT/1 HIGH/6 MED], пак-1.5 придержан под фикс-лист F1–F9 в §T4**; **D39.3 = пакет банк-майнинга W1.5 [диспозиция H15/V4-п4] ратифицирован, research/20-промт с HOLD до фриза exp15**; **D39.2 = трек-A пак-1 залендён `d3f6b34`: trust-gated suppressor [терм-дрейф закрыт в КОДЕ] + export-contract нормализация + pair-сеам + реестры + quality-report; адверсариал-долг за 529**; **D39.1 = research/19 залендён: конфликт exp14↔research/18 разрешён [эмиссия≠окно≠связность], Go-спека чанкера+когезии, волновая архитектура W0–W3 [вводная владельца: параллелизм], пре-рег эмпирики Q0–Q5; оркестратор-ревью снято владельцем**; **D39 = АРХ-РЕСЕТ: синк-аудит сломанного телефона [65 находок, 0 refuted, `08-sync-audit-ledger.md`] + целевая 7-слойная архитектура [`09-target-architecture.md`] + фазовый план [трек A build-now ∥ трек B ресёрч, пере-прогон после]; формализует фантомный «D35.7» как цель слоя 1; терм-дрейф код-корень жив [сид-воркэраунд]; редактор 4-мандата-full-regen = причина инверсий**; D35 = пивот качество-первым; D36 = приёмка research/18; D37 = приёмка exp14: претензия-1=промпт-рычаг; D38 = приёмка exp14b: «только gpt-5.4» ОПРОВЕРГНУТО [mistral/deepseek-pro чинят], фронтир в дефолт НЕ нужен, корень терм-дрейфа = статус-draft сида; **D38.1 = слепой h2h P1a↔F-disc залендён [ChatGPT «фронтир сильнее» / Claude «near-parity» расходятся, СХОДЯТСЯ: дефекты = инфра] → РАЗВОРОТ «мерить→строить», выдан BACKEND_INFRA_PACK; D38.2 = консолидация/док-гигиена: спент exp-скрипты в `eval/exp12|13|14|14b/`, статус-доки+.puml актуализированы; D38.3 = инфра-пак читаемости залендён (санитайзер-классы strip+export + число/omission-гард), верифицирован исполнением [build/vet/test зелёные, 3 span-дефекта запинены]; D38.4 = аудит полноты exp14/14b: чэнъюй-рычаг забыт near-term→дописан в дискурс-промпт; inversion-гард D37 §2г не строился (число/omission ≠ полярность)→editor-swap = защита от инверсий (приоритет↑); нарезка = re-run-арм; гард-тумблер вкл. при resnapshot; D38.5 = компоненты resnapshot залендены+верифицированы [reseed-сид eb409f2 · дискурс+чэнъюй editor v3 0ac5f7a с few_shot-тумблером] → следующий шаг единый resnapshot + пере-прогон**). +> ⚠ **РЕЕСТР ВСЕХ НОТ (карта актуальности v2) — [`05-decisions-index.md`](05-decisions-index.md):** одна строка на ноту (№ · дата · суть · статус жив/частично/superseded→кем · где тело), покрытие D1–D39.125 целиком; полноту сторожит `docs/scripts/counts.py --check`. Прозаические списки прежних ревизий («полностью superseded» · «частично амендировано» · «живое ядро» — покрывали только D1–D39.28) пересобраны туда ПОСТРОЧНО докс-паком 167 (09.08, оркестратор №16); тела нот не тронуты — они дословно здесь и в слайсах. Новые ноты аппендятся В ХВОСТ живого файла (**свежая голова — С ХВОСТА**); сводка головы и очередь — CURRENT-STATE в `../PROGRESS.md`. +> ⚠ **Форма эрраты впредь — ОДНА: навигационная пометка в этой шапке** (D39.125 п.3; правка тел задним числом — против D23.3). Прижизненные правки-на-месте остаются с маркерами по месту и новыми не множатся: D39.110 п.2(в) («⚠ ИСПРАВЛЕНО 08.08» → D39.115) · D39.112 п.2(а) (поправка к поправке тем же днём) · D39.98 п.3 (тела D39.84 п.8/D39.88 переписаны с санкцией владельца, pre-rewrite `2b166b7`). -Ответ на вопросы бэкенд-сессии (PROGRESS §«Вопросы от бэкенда», §«[НУЖНО РЕШЕНИЕ] перед Фазой 1» — с ревизии D31 в `archive/PROGRESS-2026-07-04-10.md`) и полигона (think-режим). Каждое решение прошло адверсариальную панель из 3 критиков (research / экономика / исполнимость в коде Фазы 0); ни одно не отклонено, все уточнены. Это **контракт Фазы 1** — бэкенд исполняет отсюда; при конфликте с буквой 01-decisions/02-mvp-plan — источник истины здесь (потом сольём в основные доки). - -Статусы: ✅ принято · ✅+ принято с уточнением панели. --- -> **⟶ ТЕЛА ЗАКРЫТЫХ НОТ — В СЛАЙСАХ `docs/archive/architecture/05-decisions-*.md` (D39.125):** `D1-D38` · `D39-arch-reset` (D39–D39.19) · `D39-20-58` · `D39-59-90` · `D39-91-105`. Грепай номер СНАЧАЛА здесь (живые тела + карта + эрраты), затем в слайсах. В живом файле телом остались: D22 · D25 · D29 · D30 · D39.25 · 30 · 33 · 42 · 47 · 58 · 62 · 63 · 64 · 69 · 70 · 81 · 84 · 85 · 93 · 99 · 100 · 102 · 104 и вся голова D39.106+. +> **⟶ ТЕЛА ЗАКРЫТЫХ НОТ — В СЛАЙСАХ `docs/archive/architecture/05-decisions-*.md` (D39.125):** `D1-D38` · `D39-arch-reset` (D39–D39.19) · `D39-20-58` · `D39-59-90` · `D39-91-105`. Грепай номер СНАЧАЛА здесь (живые тела + карта + эрраты), затем в слайсах. В живом файле телом остались: D22 · D25 · D29 · D30 · D39.25 · 30 · 33 · 42 · 47 · 58 · 62 · 63 · 64 · 69 · 70 · 81 · 84 · 85 · 93 · 99 · 100 · 102 · 104 и вся голова D39.106+. **Статус/суть КАЖДОГО номера — реестр [`05-decisions-index.md`](05-decisions-index.md).** ## D22. Приёмка пакетов «бэкенд №3» и «полигон-erotica» + развязки 18+/эха/L3 (10.07, оркестратор). ✅ @@ -454,3 +449,11 @@ **4. Хендофф №16.** Очередь: докс-пак 167 ПЕРВОЙ задачей (worksheet готов) · лендинг эксп-22 (+вопрос про эксп-23) · промт эмиттера (входное чтение — D39.123 п.4 + нормативный док шва из 167) · платформенный промт по слову. Урок сессии — в промт оркестратора: двухфайловая правка одним скриптом БЕЗ транзакционной проверки потеряла блок (восстановлен из git за минуту; правки читающих>1 файла — сначала все чтения, потом все записи, затем сверка). Незакоммиченного за №15 нет; в дереве — живой полигон (09.08.2026, оркестратор №15). ✅ +## D39.126 — ДОКС-ПАК СТРОКИ 167 ИСПОЛНЕН: реестр всех нот + линтер формы + разгрузка бэклога + топикальные входы (деньги · эмиттер · стек); строка 167 пере-скоуплена в остаток (09.08). ✅ + +**1. Исполнено** (состав заказа — worksheet `../archive/reports/DOC_AUDIT_INVENTORY_2026-08-09.md`; механика — дифф лендинга, здесь не пересказывается): (а) **реестр всех нот** — [`05-decisions-index.md`](05-decisions-index.md) (№·дата·суть·статус·тело·темы; извлечение 6+6 агентов воркфлоу, полнота против заголовков шести файлов сверена скриптом, единственная находка верификатора — титул D39.64 — вправлена); прозаическая карта шапки (17-КБ строка, покрытие 14% веса) заменена указателем на реестр, вводный текст Фазы 1 перенесён ДОСЛОВНО в слайс D1-D38; (б) **counts.py**: `--check` += полнота реестра (нота без строки реестра = расхождение), новый `--lint` = file:line-якоря живых доков (файл существует · строка ≤ длины файла; обзоры чужого кода research/21/26 вне линта); линт доведён до нуля — 8 путей research/17 на заархивированные файлы поправлены; (в) **разгрузка топ-10 жирных строк бэклога** (46·108·126·121·105·106·44·122·109·13б): тела ячеек ДОСЛОВНО → `13-tech-debt-anchors.md` §Б-*, в таблице — диспозиция+указатель («диспозиция сверху, археология вниз», D39.125 п.3); PROGRESS −24.5 КБ; (г) **топикальные входы**: [`15-money-path.md`](15-money-path.md) (деньги от гранта до settle; якоря сверены кодом) · [`16-events-emitter.md`](16-events-emitter.md) (сборка-норматив эмиттера, обязательное пре-чтение сессии строки 103; разрешённое расхождение «карантин прогона → карантин ПРОЕКЦИИ» показано, побеждает D39.123 п.2в) · [`../STACK.md`](../STACK.md) (роль→модель→конфиг→квирки); (д) **К-статусы компаньона контракта** сведены: шапка `:14` противоречила блоку пост-ратификации и таблице §4 — К-1/К-3/К-5/К-8 аннотированы ЗАКРЫТЫМИ (D39.100), К-13 заведён строкой таблицы (его там не было вовсе); (е) шапка 09-target дотянута до пост-D39.125 · product-requirements освежён (ПТ-9/19/20/25/35) · CURRENT-STATE сжат (лента-дубль и рукописный скоро-список сняты, курс/горизонт/стек — короче с указателями) · форма эрраты впредь — ТОЛЬКО навигационная в шапке (три прижизненных правки-на-месте поименованы там же). + +**2. Находки пака, получившие носителей:** (а) ⚠ **ВЕСЬ банковый контур (банкнота+терминолог+классификатор) жив только ран-локальным конфигом книги** — шире заявленного строкой 140 («банкнота»); сверено грепом shipping-c1 (`gates.terminology`/`gates.banknote` = 0 вхождений), дописано в строку 140 и STACK.md; (б) эскалация в shipping мертва `budget_usd: 0` — STACK.md §примечания; (в) шапка-таблица эндпоинтов quirks датирована 04.07 и отстала — полигону при лендинге эксп-22 (вместе со статус-баннерами экспов); (г) кросс-ссылка 160↔Ф-30/В-4 поставлена (строка 160 + пинг в журнал фронта); пинг платформе о форме DEFECT_REGISTER секциями отправлен (П-строку заводит зона). + +**3. Строка 167 пере-скоуплена в остаток:** статус-баннеры экспов + шапка эндпоинтов quirks (полигон, при лендинге эксп-22) · DEFECT_REGISTER секциями (зона платформы, пинг отправлен). Счёт очереди не меняется (09.08.2026, оркестратор №16). ✅ + diff --git a/docs/architecture/09-target-architecture.md b/docs/architecture/09-target-architecture.md index 3f988faa..5a273092 100644 --- a/docs/architecture/09-target-architecture.md +++ b/docs/architecture/09-target-architecture.md @@ -7,12 +7,12 @@ > > Это карта «куда и почему», а не пошаговая спека. Спеки — в хендофф-промтах сессий; контракт — в D-логе. -> **⟶ СТАТУС СТРОЙКИ (освежён 04.08, пост-D39.105: слои 4/5 добраны паками банка/чекеров D39.69/78/82; репо на стандартах — `make battery`, tmvet/archguard, D39.96/97; поверх слоёв движка: контракт API v0 = `14-api-contract/` (D39.99), платформа = зона `platform/`, открыта D39.100. Ранее 2026-08-01, пост-D39.63; баннер — не переписывание, тело ниже = замысел арх-ресета 13.07).** Карта «слой → статус → пак/D»: +> **⟶ СТАТУС СТРОЙКИ (освежён 09.08 оркестратором №16, пост-D39.125: шов движок↔платформа ратифицирован — транзиентный systemd-юнит на прогон + `events.jsonl`-outbox в каталоге книги, платформа НЕ родитель (D39.106); платформа достроена до раннера P4 (D39.109/114/123 — River-очередь, холд-до-спавна, реконсилятор; дефекты — `platform/docs/DEFECT_REGISTER.md`); фронт — слой данных S3, контракт 0.2.0→0.2.1 (D39.115/123); движок отдал блокеры контракта — `tm-manifest-v2`, `unit.id` с тегом разреза, пофазные счётчики на главу, `--ceiling-usd` (D39.122); слой 4 добит фикс-паком банка — семьи термов со-батчатся юнитами, bankdata-плоскость (D39.118). Ранее 04.08, пост-D39.105: слои 4/5 добраны паками банка/чекеров D39.69/78/82; репо на стандартах — `make battery`, tmvet/archguard, D39.96/97; контракт API v0 = `14-api-contract/` (D39.99), платформа = зона `platform/`, открыта D39.100. Баннер — не переписывание, тело ниже = замысел арх-ресета 13.07).** Карта «слой → статус → пак/D»: > | Слой | Статус | Пак / D | > |---|---|---| > | 1 Сегментация | ✅ ПОСТРОЕН: бюджет в выходных токенах снапшот-folded (`chunk.SegBudget`), edit-единицы декаплены; когезия/carryover — НЕ строится (D39.7/8: эффекты под floor 0.126; кнобы `STMDepth`/`OverlapTokens` УДАЛЕНЫ, WS2 §2а), граница `logical` — не рычаг (exp15), greedy остался | пак-11 (D39.13 WS2 · D39.17 волны · D39.18 c-lite) | > | 2 Пары | ✅ СЕАМ ПОСТРОЕН: `internal/lang`+langpacks (embedded · книго-overlay `langpack_extend`) · пар-агностичные чекеры · `configs/pairs/` · промпт-конвенция `prompts/<пара>/<роль>.md`; открыто: извлечение дискурс-норм/few-shot из ТЕЛА промтов (форсинг = ja→ru) | D39.16 · пак-14 · пак-15 (D39.23г) | -> | 3 Контракт t/e | ✅ ПОСТРОЕН ЗА `enabled:false`: `checks.RepairCandidates` (позиционная детекция) · read-only скан остатка · машинерия ремонта §15.2; **включение платного пути = решение владельца по замеру остатка**; ⚠ эмпирика контракта — экспы 19/20 (D39.108): гейт Q4b — диффы ОТЛОЖЕНЫ (D21.4/D21.10 закрыты), full-regen канон до эксп-21 «топология ролей» | пак-16 (D39.24), **D39.108** | +> | 3 Контракт t/e | ✅ ПОСТРОЕН ЗА `enabled:false`: `checks.RepairCandidates` (позиционная детекция) · read-only скан остатка · машинерия ремонта §15.2; **включение платного пути = решение владельца по замеру остатка**; ⚠ эмпирика контракта — экспы 19/20 (D39.108): гейт Q4b — диффы ОТЛОЖЕНЫ (D21.4/D21.10 закрыты); итог эксп-21 (D39.117): full-regen ПОДТВЕРЖДЁН (точечная починка как замена редактора отклонена; принята формой «механический пре-гейт ПЕРЕД редактором» — строка 142; строка 106 понижена) | пак-16 (D39.24), **D39.108**, **D39.117** | > | 4 Память | ✅ ПОСТРОЕН + ДОСТРОЕН паком-20: disposition-gated suppressor · **ТЕРМИНОЛОГ** (роль пар-пака: смердженный банк + KWIC → консолидированный dst, durable-деньги) · флаговый стоп `--verify-bank` (дефолт=авто) · ДВУХСЕКЦИОННАЯ редакторская инъекция (CONFIRMED + ⟨проверить⟩; все строки фолдятся в версию; ⚠ D39.104: схлопывается в ЕДИНЫЙ закон-блок, маркер с провода снимается — внесение = строка 134 ПОСЛЕ пробы 18) · точечная ре-редактура (bank-only → пере-пин $0) · банкнота отдельным шиппинг-файлом · языковой экран `target_script` · дисциплина банкноты (кавычки/агрегация); жанровый словарь ОТМЕНЁН (D39.47) | пак-1 · пак-11 · **пак-20 (D39.41–45/47/50–53)** | > | 5 Качество | ✅ детерм. часть: `QualityReport` · число/omission-гард · DC/пак-13-чекеры · repair-остаток; семантический span-судья/полярность — НЕ строился (защита = editor-swap, D38.4) | D39.2 · D38.3 · пак-13 (`2f91b04`) · пак-16 | > | 6 Export | ✅ ПОСТРОЕН: `checks.ExportNormalize` на каждом финале; санитайзер-классы strip+export | D39.2 · D38.3 | diff --git a/docs/architecture/13-tech-debt-anchors.md b/docs/architecture/13-tech-debt-anchors.md index b7875ee0..077251ad 100644 --- a/docs/architecture/13-tech-debt-anchors.md +++ b/docs/architecture/13-tech-debt-anchors.md @@ -206,3 +206,47 @@ backend/prompts/zh-ru/editor.md:6 — «Правь стиль: убирай ка **Фикс/скоуп:** Пере-формулировать дописку в строке 49: тех-механизм «until_ch-апдейт → селективная пере-оплата затронутых юнитов + смета» УЖЕ построен (repin.go/rebill.go, D39.42 п.5, D39.45) — слова «селективный redrive» убрать (redrive — инструмент флагнутых чанков, не носитель). Остаток дописки — только операторский ПРОТОКОЛ-документ релиза D5.1 (последовательность: выставить until_ch у gender=hidden-терма → tmctl translate → согласие на rebill-смету; + курация 白凝冰 из строки 24), либо закрыть дописку явной ссылкой на D39.45. **Сводка среза:** Адверсариальная проверка среза (строка 86 + дописки 79/41/24/74/49) свипа D39.66: 6 из 7 пунктов подтверждены как корректно занесённые (CONFIRMED_LOST) с file:line-доказательствами отсутствия в коде: (1) pre-c-lite echo-семантика реально сохранена (quality.go:216-218,295-318), альтернатива не построена; (2) magnitude-кап CJK-утечки отсутствует — только strip+flag (sanitizer.go:770, disposition.go:96-104; пороги 0.15/0.25 — другие классы); (3) lintNumberMagnitude гейтится только цель-данными magnitude_stem (cheapgates.go:414-416), sourceScripts не читает; (4) capture.golden — 0 voice-вхождений, гейт в фикстуре выключен; (5) инъекция голоса построена условным фолдом (memory.go:248-252,448-465), но InjectVoice захардкожен false без ручки (seeding.go:130-133), флаггер off (voicerun.go:46); (6) 8 несудимых P4-пар — сырьё на месте (research15-probes/probes/raw: 100 файлов, judge_p4/votes.jsonl = ровно 16 судимых комбо из 24). Пункт (7) — RESCOPE: посылка «селективного by-until_ch пути нет» опровергнута — точечная ре-редактура по изменению банка со сметой и $0-пере-пином построена и живьём проверена (repin.go:14-35, stagerun.go:87, rebill.go; D39.42 п.5, D39.45); tmctl redrive действительно не имеет until_ch-селектора, но носитель — translate-резюм+repin. Предложена правка дописки строки 49: оставить только операторский протокол-документ релиза D5.1 или закрыть ссылкой на D39.45. Ничего не менялось, не коммитилось, $0. + +## Архео-хвосты жирных строк бэклога (выселение докс-паком строки 167, 09.08.2026) + +> Тела ячеек «Хвост» перенесены сюда ДОСЛОВНО на момент выселения (норма D39.125 п.3: «диспозиция сверху, археология вниз»; ячейка >800 байт — не трекер). Живая диспозиция каждой строки — ТОЛЬКО таблица бэклога `../PROGRESS.md`; здесь справочная археология. Закрытия помечать по месту стрелкой «→ Dxx», не удалять. + +### Б-13б — тело строки 13б на 09.08.2026 + +**`speech-cue.txt` zh НЕ шипить до замера голос-флаггера на холодном прогоне** (данные для недоказанного детектора = инерция; вывод обсуждения 31.07): оси пустые → файл не нужен, оси ловят → решение владельца о шипе (байты двигают `LangpackVersion`). ⚠ **Замера ВСЁ ЕЩЁ НЕТ (D39.86):** поверхность вывода построена (строка `VOICE` в `tmctl report`), и живое чтение coldrun-a даёт `flags=0 over attributed=0 of replies=0` — но это НЕ «оси пустые»: флаггер живёт на ФИНАЛЬНОЙ волне (`waverun.go:392,512`), а редакторская волна там не гонялась ⇒ оси не считались НИ РАЗУ. ⚠ И поле `rules=` в новой строке говорит «гейт СКОНФИГУРИРОВАН» (читается из конфига ВРЕМЕНИ ОТЧЁТА, `quality.go:436`), а не «гейт отработал» — честный дискриминатор это ЗНАМЕНАТЕЛИ (`replies=`); читать так до фикса (строка 105) + +### Б-44 — тело строки 44 на 09.08.2026 + +**Флор — калиброванная константа без модели «thinking в completion»: МОДЕЛЬ ПОЛУЧЕНА замером (D39.86), сама строка сужена до выбора числа.** Замер боевой формы: при вендор-дефолте `high` размышление на плотном хане потолком НЕ ограничивается (8496 → 0/9 пригодных, 16992 → 1/5; вендорская норма вывода для `high` = 384K) ⇒ **флор не является рычагом против неограниченного думания — рычаг это `reasoning_effort`**; при `low` размышление 170–313 ток. и флор 8000 избыточен. Остаток строки: какое число ставить ПОСЛЕ развилки 74 (и помнить, что у `deepseek-v4-pro` эффорт не настраивается — вендор-маппинг `low→high`, quirks п.3а). ⚠ **РАСХОЖДЕНИЕ ТРЕКЕРА СНЯТО (D39.90):** строка 74 объявляла 44 «закрытой этим замером» — это верно только для ПОЛОВИНЫ «поднять флор» (фальсифицирована). Живой остаток — обратный: **опустить/пере-калибровать число по числам пробы `bank-low`**, где стена на `low` не исчезла, а разредилась (упавший батч: `content=""`, `finish=length`, `completion=7999`, `reasoning=7999` — тот же тяжёлый хвост, 1/5 вместо 4/5, и это стохастика вызова: батч не самый большой по входу). ⚠ **Флор при `low` НЕ варьировался ни разу** — упавший батч умер ровно на потолке 8000, так что «сколько ставить» остаётся незамеренным вопросом, а не выводом + +### Б-46 — тело строки 46 на 09.08.2026 + +**Экран целевого языка на выходе НЕ-ПОСЛЕДНЕЙ стадии — ЖИВОЙ НОСИТЕЛЬ ПОЛУЧЕН, класс поднят (D39.86).** Было: 38/40 дефектов латиницы живут в черновиках вне охвата гейтов (`waverun.go:486`). Стало: на ре-пробе 74 при `effort:low` **1 черновик из 18 пришёл ПОЛНЫМ связным переводом НА АНГЛИЙСКИЙ** и прошёл как `disposition=ok` — `classify` экранирует ИСХОДНУЮ письменность, пустоту, обрыв и отказ, а «не исходный и не целевой» не ловит ни один предикат (частично ловится лишь третий язык, ДЕЛЯЩИЙ письменность с источником, и ловится под ЛОЖНОЙ причиной `cjk_artifact`). ⚠ Последний рубеж УСЛОВЕН тройкой `isFinal && Gates.Sanitizer.Enabled && checkers.TargetActive()` (`chunkrun.go:52`), и **дыра на оси ЦЕЛИ двусторонняя**: (i) без данных цели слой 7 инертен ПО ОТСУТСТВИЮ (осознанный дизайн, `disposition.go:302-305`) ⇒ для не-русской цели рубежа нет вовсе; (ii) а с данными будущей ЛАТИНОПИСЬМЕННОЙ цели `detectLatinInsertion` (`checks/sanitizer.go:228`) сработает на ЧИСТОЙ целевой прозе и дропнет 100% чанков — внутри санитайзера он НЕ обусловлен `TargetScriptNonLatin()`, хотя доккоммент это объявляет (реальный гард только на репэйре — `quality.go:215`, `repair.go:208`), а частичный файл цели невозможен (`CompileCheckers` паникует). ⇒ **ревью-вопрос «заработает ли пара, которой в репо нет, без правки Go?» для →en/→de отвечается НЕТ**; кандидат фикса — тот же шов, что уже применён к репэйру. *(Контрпример «pipeline-c2.yaml — легальная сборка без санитайзера» проверен и СНЯТ: c2 неисполняем `CheckRunnable`, его санитайзер забукован строкой 33.)* Даже при включённом санитайзере худший исход — не потеря юнита, а ТИХО ОТГРУЖЕННЫЙ релейный перевод zh→en→ru, если билингв-редактор отрендерит русский с английского черновика. Область фикса — «выход любой НЕ-последней стадии», не «черновик» (`isFinal` позиционный, `stagerun.go:145`). ⚠ **ДИЗАЙН ПОДАН, КОДА НЕТ — СТОИТ НА РЕШЕНИИ ВЛАДЕЛЬЦА (D39.90).** Три поправки сессии к посылке, все замером: **(1) боевой гейт уже ловит 18 из 20** off-target событий (`sourceScriptShare > 0.15`, `disposition.go:224,275`; 0 ложных на 1055 здоровых, запас 13×) ⇒ остаточная дыра **2 чанка из ~1100 = 0.18%**, оба английские, японский ловится долей ханьцзы; **(2) второй рубеж существует, но стоит не там** — санитайзер поймал бы те самые байты («Latin insertion»), но `chunkrun.go:52` требует `isFinal`, а в двухстадийной топологии черновик НИКОГДА не финальный; тот же `isFinal` глушит на черновике латинный линт, флаггер голоса и глоссарный пост-чек; **(3)** здоровый минимум на тексте, который РЕАЛЬНО видит гейт (после среза банкноты), = 0.9767 при n=1055. **Развилка владельцу:** (а) предикат внутри `classify()` + бамп `classifierVersion` — двигает снапшот у всех книг, голден пере-захват один раз, на свежем стенде $0; (б) отдельный опциональный гейт вне `classify()` — снапшот не двигает, но это второй способ сказать «ответ непригоден», и он выключен по умолчанию; (в) языковой детектор. **Выбор сессии — (а).** Носитель данных — `lang.LangScripts(Book.TargetLang)`, НОВЫЙ go:embed-файл не заводить (`EmbeddedVersion` фолдится безусловно = перекупка всех книг всех пар); порог 0.50 не калиброван, а поставлен в середину пустого интервала. Три мины наивной реализации названы: новый флаг провалился бы мимо `escalatable()`/`retryable()` (⇒ переиспользовать `FlagCJKArtifact`), классификатор ложно флагался бы 16/16, экран слеп к ПОДМНОЖЕСТВАМ письменности (чисто китайский выход для →ja наберёт 1.000). Вторая половина дыры (`detectLatinInsertion` без `TargetScriptNonLatin()`) — чинить тем же диффом, для ru вердикты не двигаются. **Константы и хвосты дизайна, без которых подпись неполна:** порог **abstain 200 букв** (ниже экран воздерживается; самое короткое off-target событие 346 букв, ниже 200 падают лишь 5 из 1055 здоровых, все со счётом 1.0000) · ⚠ **опубликованная база «~1.5% off-target» НЕВЕРНА по знаменателю** — он пулит черновики с редакторскими выходами, а редактор такой отказ произвести не может; на ЧЕРНОВОЙ вызов база **3.02%**, то есть вдвое хуже · ⚠ **не проверено, что делает РЕДАКТОР с английским черновиком** — вытащит обратно в русский или отредактирует как английский; именно этот неизвестный решает, чем является остаточные 0.18%: потерей юнита или тихо отгруженным релейным zh→en→ru · английских черновика найдено ДВА (`fb51e135a395`, `4080ee8287af`), плюс японский в exp15 · **`cultivation` чинить в СИДЕ, а не порогом:** 86 из 1055 здоровых несут голое английское `cultivation` внутри беглого русского, и все 32 абзаца ниже 0.90 содержат именно его, ни один — ханьцзы; правка пар-данных двигает `LangpackVersion` с `omitempty` ⇒ перекупка ограничена книгами ЭТОЙ пары (чинить на плане, где перекупка уже) · Hunspell и GlotScript-эмбед — **не строить** · база замера = строка **113** · **02.08 вечер (D39.92): владелец пере-поставил задачу closed-set** («вернуло НЕ тот язык, что просили»; полноценный LID — только запасной флаггер вне пути вердикта; проверку изолировать отдельным слоем) — ресёрч §5.1–5.3 отвечает постановке, форма (а)+изолированный модуль подтверждена, слой-0 владельца (полоса len(out)/len(in)) добавить замером на фикстуре 113 + +### Б-105 — тело строки 105 на 09.08.2026 + +**Роль `classifier` мис-вердиктится как эхо + честность двух новых строк наблюдаемости (D39.86).** (а) `classifyOutput` даёт поблажку `SourceEchoExpected` только `roleTerminologist` (`chunkrun.go:37`), а ответ классификатора по формату состоит из исходных ханьских термов ⇒ доля исходного письма 0.20–0.29 > порога 0.15 на каждом батче: живой артефакт пробы 6/6 несёт `verdict=cjk_artifact` при `bad_lines=0`. Ущерб узкий — `runBankRoleBatches` кладёт `run.texts[i] = att.text` без проверки диспозиции (`terminologist.go:603`), посчитанные эхо-ставки (`quality.go:313-321`) берутся из `chunk_status`, куда бэнк-путь не пишет ⇒ портятся только строки `tmctl report`/лога; **латентно** (`classify_types` выключен во всех шиппинг-конфигах). ⚠ Цена дисциплинированного фикса, которую надо знать заранее: бамп `classifierVersion` (литерал, сам не двигается) меняет payload снапшота → snapshot id → `RequestHash` ⇒ промах ВСЕХ чекпойнтов книги, то есть `--resnapshot` + пере-покупка. (б) тем же касанием — честность поверхностей: строка `VOICE` берёт `rules=` из конфига ВРЕМЕНИ ОТЧЁТА (`quality.go:436`), поэтому включение `gates.voice` после прогона печатает «измерено, чисто» для неизмеренной книги (воспроизведено); и она печатается при выключенном гейте, если `SpoilerLeaks>0` (дизъюнкция — поведение верное, формулировка отчёта/коммента неверна); знаменатель `BANKNOTE` = `len(states)` включая призрачные строки `retrieval_state`, тогда как соседний агрегатор их фильтрует (`quality.go:259-260`) ⇒ после пере-чанковки покрытие занижается + +### Б-106 — тело строки 106 на 09.08.2026 + +**Слой 3 НЕ достроен: контракт редактора = full-regen, а целевой — узкие мандаты + ДИФФЫ.** `09-target-architecture.md:121-126` дословно: «research/07 предписывает узкие мандаты + диффы, а не полную перегенерацию — сейчас ровно наоборот (4 мандата, full-regen), что и породило хвост инверсий»; целевой контракт — редактор правит anchored search/replace-спанами с детерминированным Go-apply (ограниченный blast-radius, дешевле, аудируемо, структурно omission-safe). Пак-16 построил петлю РЕМОНТА (починка флагнутого спана постфактум), а не diff-контракт роли ⇒ это разные вещи. **Строки не было ни одной** — дыра учёта, найденная сверкой 02.08 (грепы `diff`/`мандат`/`span` по бэклогу = 0). Смежное: арм Q4b «diff-fidelity+style редактор» (`exp15:108`) не прогонялся НИ РАЗУ, хотя трек B объявлен завершённым. **ЭМПИРИКА ПОЛУЧЕНА (D39.108, экспы 19/20):** дифф-контракт механически исправен (комплаенс 0.966 на боевой единице, аппликатор 15/15), но по замороженному гейту Q4b диффы ОТЛОЖЕНЫ (fidelity-trap 11/12; дороже full-regen на dspro×ru ×2.5–2.9 при невскрытой причине; D21.4/D21.10 закрыты явно). **Эксп-21 (D39.117):** полный regen выигрывает у точечного ремонта (`C2/A_law` −3.75 Holm 0.0006) — довод против диффов, НЕ опровержение: чинил дешёвый фиксер по предложению, а не сильный редактор узким мандатом; гейт «перепроверить до стройки» в силе, приоритет понижен + +### Б-108 — тело строки 108 на 09.08.2026 + +**Реестр ЗАГЕЙЧЕННЫХ ТРИГГЕРОВ + норма закрытия «по нужности».** ⚠ Первый жилец реестра, найденный тем же лендингом: **сиблинг-угроза экрана целевого языка** — выход на языке, БЛИЗКОМ к целевому (украинский/болгарский для ru): ни одного события не наблюдалось, но если появится, дискриминатор — плотность РУССКО-ЭКСКЛЮЗИВНЫХ букв (ы/э/ё) НИЖЕ ожидания, а НЕ замыкание алфавита (`EFFORT_HANDLE §5.4` шаг 8). Шесть остальных реопенов живут только в телах D-нот и не имеют места, где их поднимут: **МАСШТАБ** (uniformity-пасс D12 · эмбеддинг A7/D2 «реопен = измеренный recall-разрыв, только batch-time лейн» · STITCH «бюджет ИЛИ измеренный эффект размера инъекции» · канон-пин серий) · **вторая пара живьём** (C-триггер softsign-decl · автономная Decl-эмиссия) · **вторая книга того же жанра** (жанровый shared-слой) · **первая traditional-книга** (probe-литералы 时辰/千万/数十万 цельным дата-батчем) · **появление Go-кода платформы** (`go.work` — ⚠ `platform/go.mod` УЖЕ заведён, триггер наступил) · **перед стройкой fix-8** (ёлочный экстрактор атрибуции + корпус-замер). **+Два жильца приёмки D39.91:** Д5 — enum эффорта провайдер-слеп (`medium` на DeepSeek не определён, `max`/`xhigh` недостижимы; пер-модельную таблицу решено НЕ строить — механизм без носителя качества/денег, misconfig ограничен бюджетами и назван в доккомменте `ValidReasoningEffort`; триггер: первый живой инцидент кривого поведения уровня на проводе) · Д9 — аддитивные провайдеры отказываются бэнк/repair-гейтам, блок не несёт `reasoning_max_tokens` (fail-closed в лоадере; триггер: первая потребность гейта в аддитивной модели). **+Вахта D39.92:** вендор анонсировал смену МАППИНГА эффорта `deepseek-v4-pro` «early August 2026» ⇒ квирк 3а («low→high, эффорт не настраивается») может устареть (триггер: аномалия редакторского арма ИЛИ дата > 05.08 ⇒ пере-проба маппинга + сверка changelog; абсорбция в `00-provider-quirks.md` — полигоном). Норма D39.66 «каждое отложено обязано ТЕМ ЖЕ лендингом получить строку или явное закрытие» нарушена ≥6 раз ПОСЛЕ собственной ратификации, и класс потерь узкий — теряются именно ЗАГЕЙЧЕННЫЕ РЕОПЕНЫ. Лечение: короткий реестр триггер→что вернётся→источник, сверяемый на каждом переходе горизонта (горизонт расписан до Ф3, точки сверки известны заранее) · **(D39.96)** тулчейн go1.27 переключит x/text на таблицы Unicode 17.0.0 МОЛЧА (`xTextVersion` пинит go.mod-строку, не таблицы) — триггер: любое движение тулчейна к 1.27 ⇒ строка 119 ПЕРВОЙ · **(D39.96)** CI-воркфлоу Forgejo (удалёнка 10.0.3, раннер не подтверждён; решение владельца 03.08 — не писать) — триггер: появление раннера ⇒ файл workflow; до того точка входа `make battery` + +### Б-109 — тело строки 109 на 09.08.2026 + +**Продуктовые требования БЕЗ строки-носителя (сверка 02.08):** **ПТ-6** структурные традиции целевого языка (короткие zh-абзацы → читаемые ru-структуры) — держится только редакторскими мандатами в пар-промптах, поверхности измерения нет, в составе Ф2-гейтов (52) структуры абзацев нет · **ПТ-7** «слабый оригинал: подправлять художественно или быть верным» — вопрос владельца, не заведён даже в блоке «висит на владельце»; после ответа: режим параметром запуска (данные, не ветка Go) + мандат в промпте + гейт «улучшение vs отсебятина» · **ПТ-22** продуктовый ИНТЕЙК настроек (сегодня = рукописный `book.yaml`; частично покрыт 67 в части «версия исходника») · **ПТ-10** сам механизм веб-фетча (tool-calling, провенанс/кэш добытого, инжект под правилом «книга = недоверенные данные») — есть только гейт безопасности 70. Гигиена реестра тем же касанием: ПТ-24 не проставлена 101, ПТ-1/ПТ-11 не проставлена 105, ПТ-2 не проставлены 46 и 34а + +### Б-121 — тело строки 121 на 09.08.2026 + +**archguard v2 (посадки приёмки D39.96 + §7-12/13 + §7-9). ⚠ Пункты (0а)/(0б) — РЕГРЕССИЯ против снесённого байт-гарда; дофикс ИСПОЛНЕН и принят D39.97 — (0а)/(0б)/(а) ЗАКРЫТЫ, плюс блокер type-param, ось имени и ложное срабатывание сверх промта; остаток строки — (б)/(в)/(г)/(д).** (0а) egressseam пропускает пакетную `llm.Complete(...)`: nil-`Selections` → молчаливый выход (`archguard.go:240-242`; фикс — fallback на `Uses`); (0б) пропускает интерфейс с llm-типами внутри композита (`Complete(ctx, []llm.LLMRequest)…` — `touchesPkg` не рекурсивен, `:79-82`); старый регекс `.Complete(` ловил обе формы; комменты «cannot be hidden» (`:250-253` и фикстура) фальсифицированы — переписать честно; (а) `runRequestSeam` обходит ТОЛЬКО `*ast.CompositeLit` (`archguard.go:197`): `var r pipeline.Request`+присваивание и `new(pipeline.Request)` проходят МОЛЧА — подтверждено на реконструкции: дыра ОБЩАЯ со старым гардом (не регрессия); фикс ~10 строк: симметрия ValueSpec/CallExpr со stage-сеамом + негативная фикстура, документирующая осознанные пропуски; (б) класс «встраивание · make+присваивание · дженерик-ноль» закрывается не свитчем, а ТИПОМ (нулевое значение `config.Stage` непригодно вне пакета); (в) политика build-тегов vet (сегодня default+live; чужой тег невидим — других в репо нет); (г) кандидат 4-й анализатор границы импортов — `backend/README.md:3` заявляет «проверяет `go list -deps`», что не автоматизировано ничем; (д) семь осознанных пропусков после дофикса 03.08 (принят D39.97; фикстуры БЕЗ want — покраснеют, когда начнут ловиться): llm.Ask-класс · пара внутри named-обёртки · встраивание/make/generic-zero · `internal/llm` исключён целиком (второй провод внутри адаптеров ловится только ревью) · внешние тест-пакеты · рефлексия (статикой не закрывается) · файлы за третьим сборочным тегом — всё, что закрываемо, закрывается типовым швом (б), не свитчем + +### Б-122 — тело строки 122 на 09.08.2026 + +**Гигиена пака стандартов (не-блокеры приёмки).** `TestCheckerLabelsCandidates` — ни одного ассерта (дизайн-REPL в одежде теста) · сообщение `TestMemoryVersionPinsTheUnverifiedRenderRevision` не различает «изменился рендер»/«изменилась нормализация» · Makefile: regex GO_MIN_VERSION пропускает go1.26.0–1.26.3 (патч-уровень не проверяется) · включить `unconvert` (1) и `wastedassign` (2) — дешевле уже включённых по собственному правилу конфига · `.skips.log` не в gitignore (прерванная battery оставляет мусор в дереве) · Fprint-исключение errcheck скоупить на `cmd/` (сейчас весь модуль — будущий писатель файла экспорта получит молча съеденную ошибку) · `w\.Write`-исключение ключуется ИМЕНЕМ receiver-а вопреки собственному принципу конфига · miningstop-исключение глушит текстом весь файл — якорить на функцию · provenance-числа конфига дрейфуют от дерева (293/31/93 против 294/33/91; контрпример «все прод-Close — читатели»: `chunktest/epub.go:51`) · коммент c1 «echo mine unarmed» поправлен дофиксом 03.08 (снят) · инвариант-коммент `httpllm.go:77` «zero wire bytes» — верен для полей пинга, неверен для бампа x/net, который их привёз (находка-4 D39.96) — переписать честно + +### Б-126 — тело строки 126 на 09.08.2026 + +**Потолок прогона — УПРАВЛЯЕМЫЙ, решение владельца 07.08: настройка в интерфейсе фронта, шкала от минимума (ноль выбрать НЕЛЬЗЯ, подсвечен серым) до максимума баланса аккаунта.** Форма снимает конфликт с Р7 бесплатно: максимум = баланс ⇒ движок всегда получает положительное число и состояния «выключено» не существует, валидатор `book.go:250` не правится. **Три следствия, ратифицированы формой (D39.110):** (а) **единица — НЕ доллары**, а главы (или % баланса): тогда минимум объясняет себя сам («одна глава»), а D39.84 цел — читатель не видит структуру расходов; доллары на пользовательском экране = осознанный амендмент D39.84, не побочный эффект виджета; (б) это потолок ПРОГОНА ⇒ в `book.yaml` он не пишется, движку нужен приём потолка на прогон — строка 145; (в) **максимум шкалы = ДОСТУПНЫЙ ОСТАТОК, то есть `Balance` как есть** — ⚠ испр. 08.08 (D39.115): формулировка «баланс минус открытые холды» была ОШИБКОЙ приёмки, вычитанием дважды. Холд — это дебет в момент взятия (`credits.go:179`), поэтому баланс уже без него; замерено: $10 грант + $1 холд = `Balance` 9, `Reserved` 1, «минус Reserved» дало бы 8. Спека несёт верную форму: `max_chapters` приходит УЖЕ подрезанным и по остатку, и по непереведённому хвосту книги, клиенту подрезать второй раз ЗАПРЕЩЕНО. **НОСИТЕЛЬ ПЕРЕСЧЁТА НАЗВАН (добор после верификации 07.08):** «сколько глав влезает в доступный остаток» считает ПЛАТФОРМА (по оценке движка) и отдаёт фронту ГРАНИЦЫ шкалы и выбранное значение в главах; сама формула наружу не выходит. Ручки под это в контракте НЕТ — сегодняшний `GET /v0/usage` несёт только процент, поэтому поверхность объявляется при правке спеки вместе с созданием прогона (работа П-1 + S3), и до её объявления фронт максимум шкалы взять неоткуда. Прежнее тело строки (механизм поднятия потолка для resume после ceiling-стопа: движок продолжает «once the ceiling is raised», `stagerun.go:488-489`) — половина этой же работы. Продуктовое слово стопа — К-8 у владельца diff --git a/docs/architecture/14-api-contract/README.md b/docs/architecture/14-api-contract/README.md index 75ad7e74..2c183b55 100644 --- a/docs/architecture/14-api-contract/README.md +++ b/docs/architecture/14-api-contract/README.md @@ -11,9 +11,12 @@ openapi.yaml РЯДОМ (байт-копия зонной frontend/docs/api-cont контракт-шагом (spectral + дрифт-тест генерённых типов) зелёная исполнением. Провенанс-классы ✓/◆/○ ниже выборочно перепроверены кодом движка — легенда честная. -ОТКРЫТЫ (см. §4): продуктовые К-1/К-3/К-5/К-6/К-8 — владелец; К-4/К-7/К-12 — -платформа — ОТВЕЧЕНЫ P0 и ратифицированы приёмкой 04.08 с поправками (носитель — зонный журнал -`platform/docs/platform-PROGRESS.md`, раздел «Ратификация приёмкой»); К-2/К-9/К-10/К-11 — автор контракта/бэкенд. +ОТКРЫТЫ (см. §4; статусы сведены оркестратором №16 по строке 167 — прежде эта строка +противоречила блоку ПОСТ-РАТИФИКАЦИЯ ниже): продуктовые К-6 (принцип принят, карта ступеней — +с В-3) и К-13 (paused_reason, D39.115 п.6б) — владелец; К-2/К-9/К-10/К-11 — автор контракта/бэкенд. +ЗАКРЫТЫ: К-1/К-3/К-5/К-8 — D39.100 (блок ПОСТ-РАТИФИКАЦИЯ ниже, аннотации в таблице §4); +К-4/К-7/К-12 — ОТВЕЧЕНЫ P0 и ратифицированы приёмкой 04.08 с поправками (носитель — зонный журнал +`platform/docs/platform-PROGRESS.md`, раздел «Ратификация приёмкой»). Зависимости §3 покрыты строками единого бэклога: 99/100/101/103 (перевешены в БЛОКЕРЫ контракта) + новые 125 (банк-экспорт) · 126 (поднятие потолка) · 127 (DDL-коммент). Приложение А — заготовка: фразы и ступени заполняет владелец (В-3). @@ -285,20 +288,23 @@ is promoted or rejected» (`pipeline/mining.go:201`). Отсюда: решени ## 4. Открытые вопросы +Статусы «✅ ЗАКРЫТ» аннотированы оркестратором №16 (строка 167; авторские формулировки вопросов сохранены под аннотацией). + | # | Вопрос | Кому | |---|---|---| -| К-1 | Десять статусов (§2.6) — принять или поправить? Три контракт выводит, а не получает | владелец / автор контракта | -| К-2 | Титул главы: отдать полем `heading` (предложено) — или оставить вклейку в текст, и фронт отрезает строкой? | автор контракта + бэкенд | -| К-3 | Метка главы в дереве: титул это ровно «Глава N», узлов 2284 — дерево одинаковых по форме строк | владелец (продуктовое) | +| К-1 | **✅ ЗАКРЫТ D39.100** (десять статусов приняты). Было: десять статусов (§2.6) — принять или поправить? Три контракт выводит, а не получает | владелец / автор контракта | +| К-2 | Титул главы: отдать полем `heading` (предложено) — или оставить вклейку в текст, и фронт отрезает строкой? ⚠ Контекст 09.08: `heading` манифеста движка = ВРЕМЕННЫЙ рендер (D39.122 п.2д), настоящие заголовки — строка 160 (titleRaw) | автор контракта + бэкенд | +| К-3 | **✅ ЗАКРЫТ D39.100** (метка главы — из ДАННЫХ книги; зашитой формы «Глава N» не существует, легальна книга без номеров; глава без заголовка на экране — вопрос В-4/Ф-30). Было: титул это ровно «Глава N», узлов 2284 — дерево одинаковых по форме строк | владелец (продуктовое) | | К-4 | Ревизия: одна сквозная на прогон или своя на ресурс? И несут ли её чтения вообще (§2.10) | платформа | -| К-5 | Показывать ли оценку времени. **ПТ-19 существует** (`docs/product-requirements.md:49`: «видимый прогресс/ETA — из Ф3-видения ридер-IDE»), то есть посылка «не запрошено» неверна; вопрос в том, показываем ли в MVP | владелец (продуктовое) | -| К-6 | Ступени замечания: сколько их и где граница. Сегодняшние две — проекция ОПЕРАТОРСКОЙ лестницы рангов, а она не обязана совпадать с продуктовой осью | владелец (продуктовое) | +| К-5 | **✅ ЗАКРЫТ D39.100** (ETA показывать: `eta_seconds` в спеку). Было: показывать ли оценку времени. **ПТ-19 существует** (`docs/product-requirements.md`: «видимый прогресс/ETA»), посылка «не запрошено» неверна | владелец (продуктовое) | +| К-6 | Ступени замечания: сколько их и где граница. Сегодняшние две — проекция ОПЕРАТОРСКОЙ лестницы рангов, а она не обязана совпадать с продуктовой осью. Статус D39.100: принцип принят (две ступени по читательскому эффекту), карта — с В-3 | владелец (продуктовое) | | К-7 | Пагинация: 2284 главы и 1200 терминов одним ответом или курсором? Фронт виртуализует, ему годится любой | платформа | -| К-8 | Стоп по потолку: каким статусом и каким словом? В `failed` мапить нельзя — стоп резюмируемый | владелец (продуктовое) | +| К-8 | **✅ ЗАКРЫТ D39.100** (BookStatus получает 11-е значение `paused` + оповещение «лимиты исчерпаны» — ПТ-35; точное продуктовое слово — В-3 на владельце). Было: стоп по потолку — каким статусом и словом? В `failed` мапить нельзя — стоп резюмируемый | владелец (продуктовое) | | К-9 | **Отказ прескрина не выразим ни одним из десяти статусов.** Абьюз/misuse-прескрин до трат токенов и UI-контракт отказа — строка 94 (ПТ-16); книга, отклонённая прескрином, это не `rejected` (тот про неразобранный файл) и не `failed` | владелец + автор контракта | | К-10 | **Выполнение главы — тот самый несплитованный счётчик, который §2.5 объявляет негодным.** `Chapter.units_done` не разведён по фазам, значит дерево глав показывает ноль всю черновую волну — ровно то, из-за чего прогресс книги сделан пофазным. Развести и тут (цена — пофазные счётчики НА ГЛАВУ в строке 99) или показывать в дереве другое | автор контракта + бэкенд | | К-11 | **Условная обязательность полей — выражена у банка, не выражена у чтений.** У `BankDecision` констрейнт поставлен (`if action=promote → dst` непустой), и вот что это стоило, измерено: spectral его валидирует, а **openapi-typescript его игнорирует** — в генерённых типах `dst?: string` как был. То есть 3.1-условие защищает сервер, но не экран; клиентское сужение (юнион `promote`-с-`dst` ↔ `decline`) — работа подписного экрана S5, писать его до экрана не на чем проверить. Остаётся решить то же для чтений: `Note` не требует ни `chapter_id`, ни `unit_id`, `Unit.target` не обязателен при `translated`; обе схемы служат и вложенно, и отдельно, поэтому простое `required` соврало бы | автор контракта | | К-12 | **Завершение выгрузки: опрос или событие?** Чтение `GET /books/{id}/exports/{id}` заведено — без него создающий вызов был тупиком (`ready:false` и ни слова дальше). Но пушить ли завершение ещё и кадром потока, чтобы не опрашивать, решает платформа: у неё воркер и её цена | платформа | +| К-13 | **`paused_reason` не различает две разные беды** (заведён D39.115 п.6б = Ф-31): единственное значение `credit_exhausted`, а упор в СВОЙ потолок прогона и исчерпание кредита — разные состояния с разным следующим действием; первому из двух фраза врёт. После PD-158 цена выросла: консервативный потолок останавливает ровно на исчерпании холда (D39.123 п.2ж) | владелец (продуктовое) | --- diff --git a/docs/architecture/15-money-path.md b/docs/architecture/15-money-path.md new file mode 100644 index 00000000..52279ba0 --- /dev/null +++ b/docs/architecture/15-money-path.md @@ -0,0 +1,61 @@ +# Путь денег — от гранта до settle (топикальный вход, строка 167) + +> **Статус: топикальный ВХОД, НЕ источник истины.** Док собирает денежную тему, размазанную по D-нотам, реестру дефектов платформы, глоссарию и бэклогу, в один маршрут чтения. При конфликте с чем угодно побеждает `docs/architecture/05-decisions-log.md` (правило чтения — диета D39.125: живой файл + слайсы). Каждое утверждение здесь снабжено указателем на первичный носитель; формулы — дословно оттуда. Словарь терминов (холд · прирост · аргумент потолка · baseline · settle · leftover-reserved · SpendBound) — `docs/glossary.md` §«Деньги платформы» (`glossary.md:50`). + +## 1. Канон одним абзацем + +Деньги видимы с первого вызова: телеметрия, потолки, явное согласие на пере-оплату (CLAUDE.md, цель 5). Леджер без потолка запрещён — Р7: книга обязана нести хотя бы один из `book_usd`/`day_usd` (`backend/internal/config/book.go:250-251`, текст валидатора: «a ledger with no ceiling is forbidden, Р7»). Суммы на пользовательский экран НЕ выходят — запрет D39.84, подтверждён D39.100/К-8 («страница лимитов = СТАТУС, не суммы», D-лог `:201`) и держится в контракте (`14-api-contract/openapi.yaml:1152`: «No window, no `resets_at`, no sums»). Защита от перерасхода двойная и не зависит от событий: холд платформы делает кредит недоступным следующему прогону, а движок сам останавливается на потолке — «an overspend is impossible even while the platform is blind. The event stream is freshness only» (док-коммент `Hold`, `platform/internal/pgstore/credits.go:148-151`). + +## 2. Деньги ДВИЖКА (зона `backend/`) + +- **Леджер SQLite.** Таблица `spend`, две фигуры: `committed_usd` (потрачено, с сырым ответом провайдера) и `reserved_usd` (зарезервировано под летящий вызов). `Reserve` перед каждым платным вызовом сверяет `SUM(committed_usd + reserved_usd)` книги и дня с потолками (`backend/internal/store/ledger.go:44,58,63`; Р7 — коммент `:12`); `Settle` конвертирует резервацию в committed и персистит ответ (`ledger.go:162,199-210`). Суммарно по книге — `SpentUSD` (`ledger.go:314-320`). +- **Гейт потолка сегодня — на границе юнита работы,** не на каждый платный вызов; ужесточение — строка 135 бэклога (промтом эмиттера, research/25 «Деньги»). +- **leftover-reserved зануляется write-open.** `store.Open` (путь записи, каждый `translate`) выполняет `recoverReservations` (`backend/internal/store/store.go:88`, функция `:218`: `UPDATE spend SET reserved_usd = 0 WHERE reserved_usd > 0`) — файл владеется одним процессом, значит любой reserved на открытии принадлежит несеттлённому прогону. `OpenReadOnly` этого прохода намеренно НЕ делает (`store.go:95-104`) ⇒ **reserved из read-only `status` — всегда остаток мёртвого процесса** (несущий факт формулы PD-158, см. §3). +- **`--ceiling-usd` — КНИЖНЫЙ потолок, не бюджет прогона.** Дословно из флага: «the book USD ceiling in force for THIS RUN ONLY — it OVERRIDES book.yaml `ceilings.book_usd` and is never written back. It caps the book's CUMULATIVE committed+reserved spend, not this run's increment» (`backend/cmd/tmctl/invocation.go:114`; ⚠-коммент `main.go:110`). Ратификация — D39.122 п.2(в): пересчёт «пользовательский прирост → абсолют» — обязанность ПЛАТФОРМЫ, вторая денежная ось не заводится. День-потолок флаг НЕ перекрывает (PD-157). Проводка внутри: `Ceilings.BookUSD` в `Reserve` и именование сработавшего потолка в ошибке — `backend/internal/pipeline/stagerun.go:479-480,505-511` (стоп = `errReserveCeiling`). +- **Потолки — wiring, не семантика:** `Ceilings` намеренно исключены из `BriefHash` («Wiring fields (paths, ceilings, db) deliberately excluded», `book.go:262-265`, канон `:267+`) ⇒ смена потолка не двигает ни снапшот, ни ре-билл (D39.110 п.2б). +- **`status --json` отдаёт фигуры платформе:** `committed_usd`, `reserved_usd`, `book_ceiling_usd`, `ceiling_pct` = 100·(committed+reserved)/book_ceiling (`backend/internal/pipeline/status.go:155-158`). Дневной фигуры в status нет (PD-157). +- **Леджер = НИЖНЯЯ граница** (строка 78 бэклога, `docs/PROGRESS.md:41`): «2xx body decode failed (call IS billed)» — провайдер списал, попытка в `request_log` не попадает; живой замер D39.86 — 3 вызова из 14, неизвестность $0.015111 при леджере $0.114378; движок сеттлит оценку и печатает `estimated-cost rows: 3`. Канал виден, фикс — money-паком (дизайн GENERALITY_PHASE2 §5.6). + +## 3. Деньги ПЛАТФОРМЫ по шагам (зона `platform/`) + +1. **Грант.** `Grant` — строка леджера `kind='grant'`, идемпотентная по `(аккаунт, source, source_id)`: `on conflict (user_id, source, source_id) do nothing` (`platform/internal/pgstore/credits.go:38-49,357-362`). Фри-тир — тот же механизм в ТОЙ ЖЕ транзакции, что создание аккаунта (`pgstore/identity.go:86-88,153-155`; дефолт `SignupGrantMicroUSD: 5 * 1_000_000` — `config/config.go:114`, проведён `tmplatformd/main.go:99` → `login.go:305`). ⚠ Продуктовая половина PD-104 открыта: предложение «на бете дефолт в НОЛЬ» (D39.110 п.3) ждёт слова владельца. +2. **Выбор потолка — шкала в ГЛАВАХ** (D39.110: от 1 до максимума, ноль не выбираем; потолок принадлежит ПРОГОНУ, в `book.yaml` не пишется). **Максимум = Balance КАК ЕСТЬ** (D39.115 п.2а; эррата в шапке D-лога `:4`): `Hold` — дебет в момент взятия, баланс уже не содержит открытых холдов, повторное вычитание вдвое укорачивает шкалу. Реализация: `pricing.Model.Scale` — `affordable = balance / PerChapter`, кламп по остатку глав, дефолт = верх шкалы (ратифицировано D39.123 п.2е; компромисс «весь баланс под одну книгу» принят осознанно) — `platform/internal/pricing/pricing.go:75-98`. +3. **Ставка $0.03/глава — конфиг-константа платформы:** `DefaultPerChapter = 30_000` micro-USD (`pricing.go:33`), переопределяется `PerChapterMicroUSD` (`config.go:90-93,194,229`). Провенанс сверен D39.123 п.2(г): exp08 v2 $0.0219/глава → ревизия D30.4 +15–25% → округление ВВЕРХ (низкая ставка опаснее высокой — прогон встанет на потолке посреди книги; `pricing.go:19-33`). Временная мера беты — честная оценка движковая (строка 166). +4. **Холд прироста ДО спавна.** `holdTx` пишет отрицательную строку `('hold', -amount)` и тем же знаком двигает кэш баланса (`credits.go:163-206,375-385`); нехватка — `ErrInsufficientCredit`. Холд + прогон + попытка + очередь — одна транзакция (`pgstore/runs.go:104` StartRun, `:338` рестарт; форма D39.123 п.2д). +5. **Аргумент движку: `bookCap = committed + прирост×ставка`, БЕЗ reserved — PD-158, дословно из кода: `return m.committed + increment`** (`platform/internal/runs/spawn.go:195-196`). Обе фигуры читаются ОДНИМ вызовом `status --json` перед стартом (`bookMeter`, `spawn.go:206-223`); отсутствие любой из них = отказ спавна («absent is not zero», PD-40). Почему без reserved: write-open движка занулит leftover до первой резервации, значит цифра из read-only status к моменту сравнения уже мертва; ратифицированная ранее формула с reserved переплачивала запасом ровно на leftover сверх холда — исполнено обеими формулами против гейта (D39.123 п.2б, поправка к D39.122(в)). Аргумент ≠ холд: он больше холда на committed (глоссарий `:50`). Фактически ушедшее значение хранится в `run_attempts.ceiling_arg_micro_usd` (PD-144, миграция 00011); потолок уходит argv-шаблоном `{{usd}}` (`config.go` `CeilingArg`, `spawn.go:132-150`); строка 145 закрыта D39.122. +6. **Baseline и списание.** `baseline = committed` книги на старте попытки (`spawn.go:74`); списание попытки = разница счётчика с baseline; счётчик ниже baseline = подменённая БД, сеттлится в ноль с WARN — сами цифры в лог не идут (D39.84; `reconcile.go:308-316`). +7. **Settle по фигуре движка.** `reconcile.settle` (`platform/internal/runs/reconcile.go:277+`) читает committed из status; `credits.Settle` одной транзакцией закрывает резервацию, возвращает холд и списывает spent; **spent > холда — капится холдом** с явной пометкой «capped at the hold; the engine reported …» (`credits.go:214-234`), перерасход движка счётом не абсорбируется. +8. **SpendBound (PD-159).** Отложенный settle читает пожизненный счётчик КНИГИ и без границы оплатил бы работу прогона-преемника (замер: $2.10 за прогон ценой $0.10, и преемник платил снова). Граница = наименьший baseline попыток той же книги, стартовавших ПОЗЖЕ: `committed = min(счётчик сейчас, SpendBound)` (`reconcile.go:293-307`; `pgstore/runs.go:268`). +9. **Открытое — эскроу/intent (строка 136, `docs/PROGRESS.md:85`):** write-ahead intent + состояние `uncertain`-эскроу + `closing`; холд НЕ освобождается по выходу юнита (сигнал обгоняет денежные события); spend не постится без свидетельства провайдера; расход сверх холда — полной суммой, превышение явной строкой убытка. Стройка по research/25, «скоро». До эмиттера (строка 103) платформа между спавном и settle слепа — защита держится холдом и потолком движка (§1). + +## 4. Фронт (зона `frontend/`) + +Максимум шкалы — `Balance` КАК ЕСТЬ (D39.115 п.2а); `Reserved` — справочная величина, `ReadAccount` отдаёт обе раздельно (`pgstore/credits.go:99`). Шкала — в ГЛАВАХ: `CeilingBounds` — «in CHAPTERS. The chapters → money conversion lives on the platform and is not exposed here in any form»; клиенту запрещено клампить повторно; `max_chapters: 0` = состояние «исчерпано» вместо шкалы (`openapi.yaml:1116-1147`). Суммы на экран не идут: `Usage` = `state` (ok/low/exhausted) + `remaining_percent`, без окон и сумм (`openapi.yaml:1149-1165`); продуктовый носитель — ПТ-35 (`docs/product-requirements.md:62`): стоп по потолку = `paused` + оповещение «перевод остановлен: лимиты исчерпаны»; остаток — страница лимитов (S4+), слово владельца В-3, К-13 (`paused_reason` не различает «свой потолок» и «нет кредита»). + +## 5. Открытые дыры и их носители + +| Дыра | Носитель | +|---|---| +| **PD-113 (major, единственный открытый)** — стоп по потолку неотличим от аварии: движок отдаёт потолок ошибкой (`errReserveCeiling`), exitCode мапит всё в 1; платформа ставит `failed`, где контракт требует `paused`. После PD-158 цена выросла: консервативный потолок останавливает ровно на исчерпании холда (D39.123 п.2ж). Закрывается эмиттером (строка 103) | `platform/docs/DEFECT_REGISTER.md:124` | +| **Строка 165** — различимые exit-коды tmctl (потолок vs graceful-stop; сегодня оба = 1), «скоро, вместе с эмиттером» | `docs/PROGRESS.md:113` | +| **Строка 166** — движковая поверхность оценки $/глава; $0.03 — временная мера беты (П-10 зоны) | `docs/PROGRESS.md:114` | +| **PD-104** — фри-тир: док↔код закрыто, продуктовая половина (ноль на бете · агрегатный потолок · счётчик) на владельце | `DEFECT_REGISTER.md:115`, D39.110 п.3 | +| **Строка 78** — леджер = нижняя граница (биллящийся decode-fail мимо request_log, ≤13% захода на ре-пробе) | `docs/PROGRESS.md:41` | +| **Строка 136** — эскроу/intent (см. §3 п.9) | `docs/PROGRESS.md:85` | +| *(добавка сборщика)* **PD-157 (minor)** — `day_usd` книги флагом не перекрывается, платформой не виден и не задаётся; в `status --json` дневной фигуры нет | `DEFECT_REGISTER.md:168` | + +## 6. Карта носителей темы + +| Вопрос | Где живёт | +|---|---| +| Словарь терминов | `docs/glossary.md:50` §«Деньги платформы» | +| Управляемый потолок: решение и форма | D39.110 (+поправка D39.112 п.3: п.1 — пересказ, не цитата) | +| Максимум шкалы = Balance как есть | D39.115 п.2а; эррата — шапка D-лога `:4` | +| Семантика `--ceiling-usd` | D39.122 п.2в; `tmctl/invocation.go:114`, `main.go:110` | +| Формула аргумента потолка (без reserved) · ставка · settle-формы | D39.123 п.2б/г/д; PD-158/PD-159/PD-144 в реестре | +| Код денег платформы | `platform/internal/pgstore/credits.go` · `pgstore/runs.go` · `runs/spawn.go` · `runs/reconcile.go` · `pricing/pricing.go` | +| Код денег движка | `backend/internal/store/ledger.go` · `store/store.go` · `pipeline/stagerun.go` · `pipeline/status.go` · `config/book.go` | +| Дефекты денег | `platform/docs/DEFECT_REGISTER.md` (PD-104·113·144·157·158·159) | +| Бэклог-строки | `docs/PROGRESS.md` строки 78 · 135 · 136 · 137 · 165 · 166 | +| Контракт наружу | `14-api-contract/openapi.yaml` (`CeilingBounds`, `Usage`); ПТ-35 | +| Запрет денег на экране | D39.84; D39.100/К-8; ПТ-35 | diff --git a/docs/architecture/16-events-emitter.md b/docs/architecture/16-events-emitter.md new file mode 100644 index 00000000..bcdb2843 --- /dev/null +++ b/docs/architecture/16-events-emitter.md @@ -0,0 +1,128 @@ +# Эмиттер прогонных событий (шов движок→платформа) — сборка-норматив (строки 103+165, докс-пак 167) + +> **Статус: СБОРКА-НОРМАТИВ.** Этот док ничего не решает сам — он собирает в одно место уже ратифицированные решения об эмиттере `events.jsonl` (строка 103 бэклога), разбросанные по D-нотам, `research/25`, реестру дефектов платформы и коду зоны ingest. **Источники первичны; при любом конфликте этого дока с `05-decisions-log.md` побеждает D-лог.** Каждое утверждение несёт указатель; дословные цитаты — в кавычках-ёлочках или блоках. +> +> **Для кого:** обязательное пре-чтение бэкенд-сессии эмиттера (строка 103 + деньги шва) — до промта и до первой строчки кода. Вторичный читатель — оркестратор при приёмке пака. + +## 1. Что строим и зачем + +**Что.** Строка 103 бэклога (`docs/PROGRESS.md:145`), дословно ядро ячейки: + +> «**NDJSON-эмиттер прогонных событий со стабильным словарём** (машинный канал живого статуса для платформы, `research/23` §2): NDJSON-логи уже есть (`LOG_FORMAT=json`, авто-оси trace/book/chapter/stage/role — `obs/logging.go:15-54`), но сообщения прозой, version-хендшейка нет, а **событие потолка отсутствует вовсе** (деньги только в тексте ошибки `stagerun.go:472-494`); нужен словарь-enum + version-хендшейк первой строкой (образец terraform -json: минор = ignore-unknown, мажор = reject) + событие потолка; все границы — единичные call-sites в pipeline рядом с готовыми slog; человеческие логи уже на stderr — stdout-дисциплина соблюдена. **Форма ратифицирована D39.106 (research/25 §эмиттер):** `events.jsonl` каталога книги = outbox-проекция коммитов SQLite (та же транзакция, что чекпойнт) · fsync/seq/hello-версия · события денег и потолка · развилка формата (JSONL против пофайловых/CRC-фрейминга) — решить дизайном · `status --json` отдельным каналом (ремонт, тот же flock)». + +**Зачем (две ноги).** (а) *Свежесть статуса*: по слову владельца 08.08 «эмиттер нужен СВЕЖЕСТИ статуса и деньгам шва, не первым экранам — резерв на это время = периодический `status --json`-резюнк (построен в P1)» (D39.119 п.1, `05-decisions-log.md:395`). (б) *Деньги шва*: пока события нет, «экран покажет „ошибка“ там, где верно „остановлено: лимиты“» (PD-113, `DEFECT_REGISTER.md:124`), причём после PD-158 «PD-113 остаётся ЕДИНСТВЕННЫМ открытым major до эмиттера; … консервативный потолок останавливает ровно на исчерпании холда, и „деньги кончились“ неотличимо от „инфраструктура упала“» (D39.123 п.2(ж), `05-decisions-log.md:433`). + +**Что уже есть со стороны движка.** NDJSON-инфраструктура логов: `obs.NewLogger` пишет slog в **stderr**, `LOG_FORMAT=json` даёт JSONHandler, UTC-время (`backend/internal/obs/logging.go:15-31`); оси trace_id/book/chapter/chunk/stage/role навешиваются из контекста автоматически (`logging.go:41-54`). Деньги при стопе по потолку существуют только в тексте ошибки: `" (committed=$%.6f reserved=$%.6f, denied estimate=$%.6f, ch%d/chunk%d/%s)"` и `"pipeline: book USD ceiling reached ($%g)%s — %s or stop: %w"` / `"pipeline: daily USD ceiling reached ($%g)%s: %w"` с сентинелом `errReserveCeiling` (`backend/internal/pipeline/stagerun.go:501-513`, сентинел — `escalation.go:49`). Trace id чеканится на каждый вызов в `cmd/tmctl/main.go:67-70` — это сегодняшний кандидат в `engine_run_id` (так и записано платформой, `platform/internal/ingest/events.go:75`). + +**Что эмиттер НЕ решает** (не тащить в пак): реконсилятор и свип — построены платформой, строки 138·139 закрыты (D39.123 п.3, `05-decisions-log.md:435`) · write-ahead intent / `uncertain`-эскроу / `closing` — отдельная строка 136 (`docs/PROGRESS.md:85`) · пиннинг версии бинаря на прогон — «исполняется и резюмом — PD-143/134 закрыты» (D39.123 п.3) · движковая оценка $/глава — строка 166 (`docs/PROGRESS.md:114`) · тейлер/декодер платформы — уже построены (пакет `platform/internal/ingest/`), эмиттер пишет ПОД их контракт. + +## 2. Ратифицированная форма (D39.106 · research/25) + +Канон — D39.106 п.2 (`05-decisions-log.md:233`), дословно: + +> «**2. Форма (заменяет ТРАНСПОРТ D39.85 §1; остальное D39.85 в силе):** движок = транзиентный systemd-юнит на прогон (`Restart=no`, SIGTERM); события = `events.jsonl` каталога книги как проекция коммитов SQLite движка (outbox, та же транзакция, что чекпойнт); платформа тейлит, курсор `(engine_run_id, seq)` коммитится с эффектом в одной Postgres-транзакции; `status --json` — ремонт по остановленному прогону. Формат NDJSON/hello/seq, деньги (холд+потолок = защита, события = свежесть, D39.84/D39.100) и запрет на живой SQLite — без изменений.» + +Разворачивание по `research/25` (`docs/research/25-seam-cold-review.md`): + +- **Журнал = outbox, не вторая запись**: «События — **`events.jsonl` в каталоге книги**, append-only, как **проекция** уже закоммиченных строк SQLite движка (та же транзакция, что чекпойнт chunk×stage; outbox, не вторая запись)» (`25:21-22`). Следствие для эмиттера: строка события рождается в той же SQLite-транзакции, что чекпойнт, — не «после», не «параллельно». +- **Тейл с курсором**: «Платформа **тейлит** журнал; запись курсора — `(engine_run_id, seq)`, байтовое смещение — хинт; курсор коммитится в той же Postgres-транзакции, что эффект события» (`25:23-24`). Смещение — хинт и может быть отброшено; решает курсор (`platform/internal/ingest/tail.go:31-35`). +- **events ≠ status**: «`events` (fsync, seq, деньги) ≠ `status` (atomic rename, косметика, не для биллинга)» (`25:73`). `status --json` — ремонт-канал по остановленному прогону, «берёт тот же flock — проверка „остановлен“ не есть взаимоисключение (GPT)» (`25:79`). +- **Файл — пер-КНИГА, поток — пер-процесс**: имя журнала ратифицировано кодом платформы: `const JournalFile = "events.jsonl"` — «the engine's event journal, in the BOOK's directory (D39.106 §2)» (`tail.go:16-17`). `Seq` — «per PROCESS and starts at 1»; ключ идемпотентности — `(Hello.EngineRunID, seq)`, НЕ прогон платформы: «a resumed run is a new process whose seq restarts» (`events.go:62-70`). Резюм дописывает в тот же файл новый hello; тейлер пропускает строки чужого `engine_run_id` (`tail.go:58-60`). +- **Сброс буфера на всех путях выхода**: «сброс буфера на всех путях выхода (`os.Exit` пропускает defer — теряются финальные события)» (`25:82`); то же PD-61(а) — см. §4. +- **Живость**: «живость = растущий `seq`, не удерживаемый лок; политика обратного давления выбирается явно» (`25:83`). + +**Отвергнутые альтернативы** (`25:33-44`; повторены в доккомменте зоны, «so that none of them comes back as a fresh idea» — `events.go:21-23`): платформа-родитель + пайп stdout/fd — **0 из 15** («время жизни движка — подмножество платформы: деплой/рестарт убивает или осиротляет прогон», `25:38`) · выделенный fd 3 — **0** (`25:43`) · stdout/journald как источник событий — **0** («journald молча роняет под всплеском и ротирует сам; людям — да, контракту — нет», `25:44`) · gRPC/HTTP поверх движка — 0 (`25:39`) · push в платформу — 2→0 (`25:40`) · брокер — 0 (`25:41`) · монолит — 0 из ~18 (`25:37`). Пайп-путь `supervisor.go` — ДЕВ-режим и только (D39.106 п.3 `05-decisions-log.md:235`; `events.go:23`). + +**Словарь событий — ПРЕДЛОЖЕНИЕ платформы, записанное кодом**: «The vocabulary below is therefore the platform's PROPOSAL, written as code so the engine zone can answer it with a diff» (`events.go:5-6`). Состав (`events.go:37-147`): `StreamVersion = "1.0"` · типы `hello` / `progress` / `unit_done` / `bank_stop` / `ceiling` / `spend` / `finished` · конверт `{seq, type, time, data}` · `Hello{stream_version, engine_run_id, book_id, chunker_version}` · `Progress` — пофазные счётчики draft/edit + `eta_seconds` (семантика `done` = «разрешено волной», ok/flagged/skipped — D39.122 п.2(б), `05-decisions-log.md:421`) · `UnitDone{chapter, unit, wave, shipped, flagged, reason}` · `BankStop{terms_proposed}` (полная таблица — артефактом, не потоком: `events.go:117-118`) · `Ceiling{halted}` · `Spend{committed_micro_usd}` · `Finished{outcome: clean|flagged|bank_stop|failed}`. + +## 3. Контракт декодера и дублей (PD-105 · D39.123 п.2(в)) + +Ратификация — D39.119 п.3 (`05-decisions-log.md:399`), дословно: + +> «доставка событий шва = at-least-once; ДУБЛЬ `seq` — норма повторного чтения, декодер обязан принимать идемпотентно без фатала; тот же `seq` с ДРУГИМ payload = карантин прогона (research/25)». + +⚠ **Расхождение, разрешённое позже**: «карантин прогона» (D39.119 п.3 и `research/25:77-78` «тот же seq с другим payload = карантин прогона, не тихий no-op») уточнён D39.123 п.2(в) (`05-decisions-log.md:433`): «**PD-105-реализация: карантин ПРОЕКЦИИ (попытки), не прогона** — уточнение D39.119; деньги прогона сеттлятся ремонт-каналом». Побеждает D39.123 как более свежая нота. + +Фактическое поведение читателя (текущий текст PD-105, `platform/docs/DEFECT_REGISTER.md:116` — закрыт ратификацией и реализацией): + +> «Транспорт — тейл `events.jsonl` с курсором, поэтому повторное чтение строк НОРМА: `ingest.Tail` пропускает `seq <= last_seq` идемпотентно и не возвращает ошибку, а `pgstore.RunSink.Apply` пере-проверяет тот же high-water mark ВНУТРИ транзакции эффекта. Тот же `seq` с ДРУГИМ payload = `ErrPayloadConflict` → карантин ПОПЫТКИ, то есть её проекции: материализация останавливается, а жизненный цикл прогона продолжается — движок тратит зарезервированные деньги, и наша неспособность прочитать журнал не повод их выбросить (`pgstore.Quarantine` пишет только `run_attempts.quarantine_reason`, свежесть переходит на ре-синк). Сверка по sha256 строки (`run_attempts.last_line_sha256`). Пропасть (`seq > last+1`) осталась ошибкой — строки потеряны, читать дальше нечего. … Фатальный `ErrStreamGap` на дубле в `decoder.go` остаётся только на ДЕВ-пути пайпа, где передоставки нет». + +Что это значит для эмиттера, по коду читателя: + +- **hello — всегда первая строка потока, seq=1** (`decoder.go:64`: «hello carries seq 1, want 1»); версия — правило terraform, ратифицировано D39.85: «a MINOR bump adds fields and event types — unknown ones are ignored; a MAJOR bump is refused» (`events.go:34-37`); мажор-несовпадение = `ErrUnsupportedVersion` (`events.go:150-163`). +- **Дубль строки безопасен, значит строка обязана быть повторимой байт-в-байт** — сверка дублей идёт по sha256 сырой строки (`tail.go:44-49`); тот же seq с другим payload = `ErrPayloadConflict` (`tail.go:20-24, 181`). Эмиттер не должен пере-генерировать уже записанную строку иначе (например, с другим timestamp при реплее). +- **Пропуск seq фатален для чтения** (`tail.go:190`, `ErrStreamGap`) — нумерация плотная, без дыр. +- **Недописанная последняя строка — не ошибка**: тейлер «deliberately left alone» строку без `\n` — это строка в процессе записи (`tail.go:51-55`). Это смягчает, но не снимает формат-развилку §5 (битая запись С валидным `\n` остаётся слепым пятном JSONL — `research/25:74-75`). +- **Ключ — engine_run_id из hello**, не прогон платформы; чужие run id в том же файле тейлер пропускает (`events.go:63-65`, `tail.go:58-60`). + +## 4. Деньги и потолок + +**Роль событий денег — свежесть, НЕ защита.** Канон D39.106 п.2: «деньги (холд+потолок = защита, события = свежесть, D39.84/D39.100)». Доккоммент `Spend` прямо запрещает обратное: «Building enforcement on this event is forbidden — the stream is at-least-once and a crash truncates it» (`events.go:129-132`). Форма `Spend`: «CUMULATIVE, not a delta: a redelivered or duplicated line is then harmless … Integer micro-USD: money never travels as a float, and the engine's ledger is a lower bound, so the conversion at the seam rounds up» (`events.go:134-137`); это внутренний канал в приватную таблицу — D39.84 правит провод/экран/INFO ПОЛЬЗОВАТЕЛЯ, их это не касается (`events.go:137-138`). + +**Событие потолка — факт без цифр.** `Ceiling{halted}`: «It carries the FACT and nothing else: money never reaches the platform's wire or its INFO logs (D39.84), and the stop is resumable, so it is not a failure» (`events.go:123-127`). + +**PD-113 (открытый major, закрывается этим паком)** — текущий текст `DEFECT_REGISTER.md:124`: + +> «**Стоп по потолку сегодня НЕразличим от инфраструктурного отказа, и контракт при этом запрещает называть его `failed`.** Движок возвращает потолок ошибкой (`errReserveCeiling`, сверено в HEAD), а `exitCode` мапит всё нераспознанное в 1 — значит по коду выхода „деньги кончились“ и „упало“ это одно и то же число; события потолка не существует (строка 103). Платформа честно ставит `failed`, хотя `BookStatus` требует `paused` и „никогда не `failed`“, потому что стоп резюмируем. Единственный путь, которым платформа СЕГОДНЯ узнаёт о потолке, — событие потока, которого нет; ветка под него построена и запинена (`TestACeilingHaltPausesTheRunWithItsReason`, `TestWhatTheUnitDidBecomesTheProductStatus`, случай „a ceiling halt survives any exit“). Закрывается приходом эмиттера (строка 103); ⚠ до тех пор экран покажет „ошибка“ там, где верно „остановлено: лимиты“». + +**Строка 165 — различимые exit-коды, идёт ВМЕСТЕ с эмиттером** (`docs/PROGRESS.md:113`): + +> «**Различимые exit-коды tmctl: потолочная остановка и graceful-stop** (сегодня оба = exit 1 ⇒ платформа отдаёт `failed` и на штатный стоп, и на исчерпание потолка — PD-113 платформы; после поправки формулы потолка (D39.123, PD-158) стоп по потолку = ровно исчерпание холда, цена неразличимости выросла; вскрыто приёмкой раннера на РЕАЛЬНОМ tmctl — фейк пробы умирал от сигнала)». + +Действующий exit-контракт движка, чтобы новый код не столкнулся с занятыми: 0 clean · 2 completed-with-flags (`*pipeline.CompletedWithFlags`) · 3 signature-stop банка (`*pipeline.WaveSignatureStop`) · 1 — infra failure и всё прочее (`backend/cmd/tmctl/main.go:30-52`). + +**Семантика `--ceiling-usd`** (эмиттер-сессия трогает потолочную окрестность — знать обязана). D39.122 п.2(в) (`05-decisions-log.md:421`): + +> «**`--ceiling-usd` = КНИЖНЫЙ потолок в силе, не бюджет прогона**: леджер сравнивает с накопленным committed+reserved книги; пересчёт „пользовательский прирост → абсолют“ — обязанность ПЛАТФОРМЫ, данные уже отдаются (`committed_usd`/`reserved_usd` в `status --json`); вторая денежная ось НЕ заводится». + +Поправлено D39.123 п.2(б) (`05-decisions-log.md:433`) для стороны платформы: + +> «**ПОПРАВКА к D39.122(в)/пингу: формула аргумента потолка = `committed + прирост×ставка`, БЕЗ reserved (PD-158)** — `store.Open` движка зануляет утёкший reserved до первой судимой резервации, read-only `status` этого не делает ⇒ reserved из status всегда leftover». + +Следствие: платформа выставляет потолок впритык к холду, стоп по потолку = ровно исчерпание холда — потому событие потолка и различимый exit-код перестали быть «косметикой» (D39.123 п.2(ж)). + +**PD-79 (закрыт; вход для денежной дисциплины шва)** — `DEFECT_REGISTER.md:90`: «**Строковый `"null"` читается как НОЛЬ денег.** … **закрыто:** литерал `null` судится ДО раскавычивания и оставляет значение нетронутым; кавычки снимает `encoding/json`, а не `strings.Trim` — слово `null`, пустая строка и экранированная цифра выходят тем, чем являются». Урок для эмиттера: денежные поля шва — целые micro-USD (`events.go:139-141`), без строковых форм и float. + +**PD-60 (открыт; пере-постановка «что делает движок, когда журнал не пишется»)** — `DEFECT_REGISTER.md:71`: «⚠ **ПЕРЕ-ДИСПОЗИЦИЯ (эррата №15, 07.08): постановка строки устарела.** Она рассуждает про 64 КиБ пайпа, а ратифицированный транспорт (D39.106 п.2) — тейл `events.jsonl` с курсором: у файла обратного давления в этом смысле нет вовсе, зато появляются свои свойства (fsync-политика, ротация, отставание тейлера, поведение при заполненном диске). Строка живёт, но переформулируется вместе со строкой 103 — не „блокировать движок или ронять события“, а „что делает движок, когда журнал не пишется“». Политика выбирается ЯВНО, «молчаливой третьей нет» (там же); ср. `research/25:83`. + +**PD-61 (открыт; два свойства ДО постройки)** — `DEFECT_REGISTER.md:72`: «**(а) Сброс буфера на выходе:** `bufio.Writer` вокруг потока плюс `os.Exit`/`log.Fatal` пропускает `defer` и теряет последние события — ровно те, что сообщают об окончании прогона. **(б) Хвост при падении платформы:** … ответ — НЕ сокет …, а журнал файлом: движок дописывает NDJSON в `/events.ndjson`, платформа тейлит его с чекпойнтом смещения в Postgres». Пункт (б) уже ОТВЕЧЕН ратифицированной формой (журнал файлом, D39.106); пункт (а) — живое требование к эмиттеру. ⚠ Имя `/events.ndjson` в PD-61 — до-ратификационное; канон — `events.jsonl` каталога книги (D39.106 п.2, `tail.go:17`). + +**PD-99 (закрыт; дисциплина логов вокруг спавна)** — `DEFECT_REGISTER.md:110`: «INFO-строка старта несёт имя команды и НЕ несёт argv …, поэтому ни id книги, ни потолок в долларах в поток INFO не попадают». Для эмиттер-сессии это норма-зеркало: деньги и book id не текут в INFO и на провод (D39.84); в журнале событий деньги едут только внутри `spend` (приватная таблица). + +**PD-107 (открыт; гейт, смежный с деньгами шва)** — `DEFECT_REGISTER.md:118`: «**Удаление аккаунта обходит защиту PD-25** … прогон, идущий против этого холда, останется без того, кто его закроет. Кода удаления аккаунта в дереве нет вовсе (грепнуто) ⇒ строка = гейт перед появлением такой операции». Прямых обязанностей эмиттеру не назначает; в чек-листе — потому что входит в ратифицированный список пре-чтения (D39.123 п.4). + +## 5. Открытые развилки дизайна — отданы эмиттер-сессии + +1. **Формат журнала** — главная развилка, «решить дизайном» (строка 103). `research/25:74-76` (GPT): «**формат — развилка строки 103 (GPT):** одиночный JSONL с ftruncate-ремонтом имеет гонку живого читателя и слеп к битой записи с валидным `\n`; альтернативы — пофайловые события (`events/.json`, temp+rename) либо CRC-фрейминг; побайтовая идентичность не требуется». ⚠ Учесть: тейлер и декодер платформы УЖЕ построены под одиночный `events.jsonl` (`tail.go:17`); выбор пофайловой/CRC-формы = согласованное изменение обеих сторон, пингом через оркестратора. +2. **Политика «журнал не пишется»** (PD-60): fsync-политика · ротация · отставание тейлера · заполненный диск; блокировать или деградировать — выбрать и записать явно, «обе позиции законны, молчаливой третьей нет» (`DEFECT_REGISTER.md:71`). Смежное: «диск ограничить (`ENOSPC` на ФС леджера ломает денежные инварианты…)» (`research/25:87-88`) — опс-слой, но поведение эмиттера при ENOSPC — его дизайн. +3. **fsync каталога** — NOTE без строки при приёмке D39.122: «NOTE без строк: … fsync каталога» (`05-decisions-log.md:423`); решить в дизайне записи (durability rename/append на ext4). +4. **Значение нового exit-кода** для потолка/graceful-stop (строка 165): 0/2/3 заняты (`main.go:30-52`) — выбрать и внести в shell-контракт. +5. **Словарь событий**: форма `events.go` — предложение платформы, «so the engine zone can answer it with a diff» (`events.go:5-6`); движок вправе ответить диффом (состав полей `progress`/`unit_done`, `eta_seconds`, `chunker_version` и т.д.), расхождения — пингом, не молча. + +## 6. Чек-лист входного чтения эмиттер-сессии + +Ратифицированный список — D39.123 п.4 (`05-decisions-log.md:437`): «промт эмиттера (103 + деньги шва; читать PD-95/105/79/99/107/60/61 + D39.106 + новые 165)»; продублирован в CURRENT-STATE (`docs/PROGRESS.md:5`). + +| # | Что | Где | Зачем | +|---|---|---|---| +| 1 | Этот док | `docs/architecture/16-events-emitter.md` | сборка всего ниже | +| 2 | D39.106 (форма шва) | `docs/architecture/05-decisions-log.md:229-235` | канон транспорта | +| 3 | D39.119 п.3 · D39.122 п.2(в) · D39.123 п.2(б,в), п.3 | там же `:399`, `:421`, `:433`, `:435` | at-least-once · семантика `--ceiling-usd` · формула PD-158 · карантин проекции | +| 4 | research/25 | `docs/research/25-seam-cold-review.md` §Форма (:16-31) · §эмиттер (:72-83) · отвергнутое (:33-44) | механизмы + чтобы отвергнутое не вернулось | +| 5 | PD-95 | `platform/docs/DEFECT_REGISTER.md:106` | история двух устаревших транспортных текстов зоны; что НЕ строить | +| 6 | PD-105 | там же `:116` | контракт дублей/пропасти/sha256 | +| 7 | PD-79 | `:90` | денежная дисциплина шва (null/строки) | +| 8 | PD-99 | `:110` | argv/деньги не в INFO | +| 9 | PD-107 | `:118` | гейт удаления аккаунта против холда | +| 10 | PD-60 · PD-61 | `:71-72` | «журнал не пишется» + сброс буфера на выходе | +| 11 | PD-113 | `:124` | major, который пак обязан закрыть | +| 12 | Строки 103 · 165 бэклога | `docs/PROGRESS.md:145`, `:113` | сам заказ + exit-коды | +| 13 | Код читателя | `platform/internal/ingest/events.go` (словарь) · `decoder.go` · `tail.go` | писать ПОД существующий контракт чтения | +| 14 | Своя сторона | `backend/internal/obs/logging.go:15-54` · `backend/internal/pipeline/stagerun.go:494-513` · `backend/cmd/tmctl/main.go:30-52` | готовые call-sites, текст потолка, exit-контракт | + +## 7. Оговорки сборки (снять при постройке) + +1. **research/23 §2 (событийная секция) со словарём `events.go` НЕ сверялся** — строка 103 на него ссылается; расхождение словарей снять при дизайне, диффом к `events.go`, не молча. +2. **«Строка события в той же SQLite-транзакции, что чекпойнт» — ратифицированная ФОРМУЛА (D39.106 п.2), не факт кода:** как она ложится на текущие транзакции `backend/internal/store` — первая проектная работа сессии. +3. Знаменатели голосов панелей research/25 различаются между вариантами (0/15 · 0/~18) — это разные плечи панелей, не усреднять. +4. Тела D39.84/D39.85/D39.100 в сборку вошли через цитаты D39.106 и доккомменты `events.go` — при сомнении открыть первоисточники (живой D-лог/слайсы). diff --git a/docs/archive/architecture/05-decisions-D1-D38.md b/docs/archive/architecture/05-decisions-D1-D38.md index 07d1ede1..f69df316 100644 --- a/docs/archive/architecture/05-decisions-D1-D38.md +++ b/docs/archive/architecture/05-decisions-D1-D38.md @@ -4,6 +4,12 @@ > Номера остаются контрактом: карта актуальности и эрраты — в живом D-логе (при конфликте он побеждает). > Инструкции отсюда НЕ исполнять; часть решений superseded — сверяй карту и эрраты живого файла. +> **Вводный текст Фазы 1 (перенесён из шапки живого файла докс-паком 167, 09.08.2026 — дословно):** +> +> Ответ на вопросы бэкенд-сессии (PROGRESS §«Вопросы от бэкенда», §«[НУЖНО РЕШЕНИЕ] перед Фазой 1» — с ревизии D31 в `archive/PROGRESS-2026-07-04-10.md`) и полигона (think-режим). Каждое решение прошло адверсариальную панель из 3 критиков (research / экономика / исполнимость в коде Фазы 0); ни одно не отклонено, все уточнены. Это **контракт Фазы 1** — бэкенд исполняет отсюда; при конфликте с буквой 01-decisions/02-mvp-plan — источник истины здесь (потом сольём в основные доки). +> +> Статусы: ✅ принято · ✅+ принято с уточнением панели. + ## D12. Модель устойчивости к отказам (веха coverage-гейта, 04.07) — заземлена на durable-execution prior-art 4 вопроса бэкенда + большой вопрос владельца «падать ли / фолбечиться / как не терять книгу». Заземлено ресёрчем (Temporal / Step Functions / Airflow / River / Stripe idempotency / OpenRouter/LiteLLM fallback; проверено по первоисточникам). diff --git a/docs/glossary.md b/docs/glossary.md index a4a1e16f..06e78607 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -47,5 +47,5 @@ ### Неймспейсы номеров (полная легенда — испр. D39.125 по докс-аудиту) - **PD-N** — регистр дефектов ПЛАТФОРМЫ (`platform/docs/DEFECT_REGISTER.md`; счёт — `counts.py`); **П-N** — зонный бэклог платформы (`platform/BACKLOG.md`); **Ф-N** — зонный бэклог фронта (`frontend/docs/BACKLOG.md`); **В-N** — вопрос ВЛАДЕЛЬЦУ от фронта (журнал `frontend-PROGRESS.md`); **К-N** — вопрос контракта API (`14-api-contract/README.md`). «Строка N» без префикса = ЕДИНЫЙ бэклог `docs/PROGRESS.md` (НЕ номер строки файла). - **Глава** — единица структуры книги: детект `chunk/ingest.go` (txt: CJK-шапки/form-feed; epub: документ spine), нумерация плотная позиционная + титульная политика `chunk/chunker.go` (`stripHeading`/`ApplyHeading` по `langpacks/*/heading.txt`), идентичность = контент-хеш в манифесте (`pipeline/manifest.go`), деньги ключуются ПОЗИЦИЕЙ (сдвиг границы = перекупка хвоста). Дизайн будущего — `research/27`. -- **Деньги платформы:** **холд** — резервация суммы прироста на счёте ДО спавна; **прирост** — купленные главы × ставка ($0.03, `pricing.go`); **аргумент потолка** — что уходит движку в `--ceiling-usd` = committed книги + прирост (PD-158; ЭТО НЕ ХОЛД — он больше холда на committed); **baseline** — счётчик книги на старте попытки, списание = разница; **settle/расчёт** — закрытие холда по фигуре движка; **leftover-reserved** — висячий reserved движка после краша (зануляется его write-open); **SpendBound** — верхняя граница отложенного расчёта по baseline следующей попытки (PD-159). +- **Деньги платформы:** **холд** — резервация суммы прироста на счёте ДО спавна; **прирост** — купленные главы × ставка ($0.03, `platform/internal/pricing/pricing.go`); **аргумент потолка** — что уходит движку в `--ceiling-usd` = committed книги + прирост (PD-158; ЭТО НЕ ХОЛД — он больше холда на committed); **baseline** — счётчик книги на старте попытки, списание = разница; **settle/расчёт** — закрытие холда по фигуре движка; **leftover-reserved** — висячий reserved движка после краша (зануляется его write-open); **SpendBound** — верхняя граница отложенного расчёта по baseline следующей попытки (PD-159). - **Лексикон экспериментов:** **жилец** — модель на роли; **арм** — вариант в бейк-оффе; **однопроходка/второй проход** — топологии редактуры; **закон-блок** = доктрина инжекта (D39.104); **пол/floor** — нижний якорь шкалы судьи; **Холм** — поправка Холма на множественные сравнения; **порог различимости** — минимальная дельта, отличимая от шума риге. diff --git a/docs/product-requirements.md b/docs/product-requirements.md index a9de59f6..2cc17aae 100644 --- a/docs/product-requirements.md +++ b/docs/product-requirements.md @@ -1,6 +1,6 @@ # Реестр продуктовых требований — «что продукт обязан уметь» -> Единый список требований владельца к продукту. Источники: `../START_PROMT.MD` (ЖИВОЙ бриф, идеи V0–V5) + владельческие находки H6–H18 (`architecture/09-target-architecture.md` §3). Статусы сверены кодом и D-логом при D39.80 (02.08.2026), освежены свипом D39.101 (04.08.2026). **При конфликте с D-логом побеждает D-лог.** Правила: новую V-секцию владельца разбирает сюда оркестратор при первом касании; статус правится при лендинге пака, который его меняет; требование без носителя не оставлять. +> Единый список требований владельца к продукту. Источники: `../START_PROMT.MD` (ЖИВОЙ бриф, идеи V0–V5) + владельческие находки H6–H18 (`architecture/09-target-architecture.md` §3). Статусы сверены кодом и D-логом при D39.80 (02.08.2026), освежены свипом D39.101 (04.08.2026) и докс-паком №16 (09.08.2026, строка 167 — ПТ-9/19/20/25/35). **При конфликте с D-логом побеждает D-лог.** Правила: новую V-секцию владельца разбирает сюда оркестратор при первом касании; статус правится при лендинге пака, который его меняет; требование без носителя не оставлять. > > Статусы: ✅ построено · 🔶 частично · ⭕ не построено · ❌ снято (отменено владельцем ИЛИ закрыто отрицательным замером — с D-ссылкой) · 🔒 открытый вопрос владельца. @@ -21,7 +21,7 @@ | ID | Требование (источник) | Статус | Носитель / доказательство | |---|---|---|---| | ПТ-8 | Банк памяти на всю книгу, «крайне точный» (V0-п.7–8; Выводы-п.1) | ✅ | D39.69/75/77/78; recall банка 0.918/0.980 на холодном прогоне (D39.58). Смежный остаток H6 (running-summary): carryover закрыт замером (D39.7/8), проза-суммарайзер закрыт (D39.69), нарратив-состояние = строка 80 (гейт пилота Ф2.5) | -| ПТ-9 | Глоссарий автосборкой: модель переводит термины с контекстом/жанром (V4-п.4, H15) | ✅ | терминолог пака-20 (D39.41–53), KWIC-контексты, подписной цикл. **Вход владельца 02.08 (D39.89):** банк = центральная ценность, арбитраж перевода термов должен быть консилиумом со скорами уверенности, но не ломать связность системы термов ⇒ качество МЕХАНИЗМА проверено полигоном: заход исполнен 04.08 (промт архивирован), артефакты ждут адверсариальной приёмки №13 (строка 5); статус ПТ-9 «построено» не меняется — под вопросом не наличие, а алгоритм | +| ПТ-9 | Глоссарий автосборкой: модель переводит термины с контекстом/жанром (V4-п.4, H15) | ✅ | терминолог пака-20 (D39.41–53), KWIC-контексты, подписной цикл. **Вход владельца 02.08 (D39.89):** банк = центральная ценность, арбитраж перевода термов должен быть консилиумом со скорами уверенности, но не ломать связность системы термов ⇒ качество МЕХАНИЗМА проверено полигоном: заход исполнен и ПРИНЯТ приёмкой №13 (research/24, D39.102): консилиум закрыт КЛАССОМ (равноправный совет · кросс-модельные веса · self-consistency · селекция не окупаются), остаток строки 5 (рецензент спорных кластеров) гейчен ре-пробой 74; статус ПТ-9 «построено» не меняется | | ПТ-10 | Веб-фетч для терминов без культурного контекста (V0-п.16, V4-п.4) | ⭕ | гейт action-security = строка 70 (Ф3); до него — сид/бриф | | ПТ-11 | Голоса персонажей консистентны на книгу (V1-п.2; канон §1) | 🔶 | схема голосов построена (пак-19, D39.55/56); оси не подписаны — замер добора (строки 24 · 13б) | @@ -46,26 +46,26 @@ | ПТ-16 | Абьюз/misuse-прескрин: дёшево, точно, до трат токенов, минимум false positive (V2-п.1, H8) | ⭕ | строка 94; UI-контракт отказа — проект-решение D39.80 к Ф3-брифу (вывод оркестратора, не цитата брифа); статус отказа в API — открытый К-9 контракта 14 (D39.99) | | ПТ-17 | Лимит размера входа настройкой (V2-п.3, H7) | ⭕ | строка 94 | | ПТ-18 | Стоп и продолжение пайплайна; абьюзивный прогон НЕ продолжать (V2-п.2, H10) | 🔶 | graceful stop по сигналу (`cmd/tmctl/main.go` NotifyContext) + чекпойнты/redrive; продукт-кнопки и связка с прескрином = строка 94; API-форма в контракте 14 (D39.99: stop/resume; статус отказа прескрина — открытый К-9) | -| ПТ-19 | Скорость: «очень быстрый перевод книги — киллерфича» (V4-п.1, H9); видимый прогресс/ETA — из Ф3-видения ридер-IDE (цветная полоса статуса), не из V4 | 🔶 | волны параллельны по чанкам; замер скорости и ETA на целой книге = строка 54 (МАСШТАБ); пофазный индикатор draft/edit = строка 99 (БЛОКЕР контракта, D39.99); ETA ПОКАЗЫВАТЬ — решение владельца 04.08 (D39.100/К-5), `eta_seconds` в спеку правкой S3 | +| ПТ-19 | Скорость: «очень быстрый перевод книги — киллерфича» (V4-п.1, H9); видимый прогресс/ETA — из Ф3-видения ридер-IDE (цветная полоса статуса), не из V4 | 🔶 | волны параллельны по чанкам; замер скорости и ETA на целой книге = строка 54 (МАСШТАБ); пофазные счётчики draft/edit НА ГЛАВУ построены движком (D39.122 — строка 99 ЗАКРЫТА); ETA ПОКАЗЫВАТЬ — решение владельца 04.08 (D39.100/К-5), `eta_seconds` в спеке (0.2.0+, D39.115); оценка $/глава движком = строка 166 | ## Фронт (Ф3) | ID | Требование (источник) | Статус | Носитель / доказательство | |---|---|---|---| -| ПТ-20 | Ридер-IDE: VS Code-подобный фронт агентного перевода (V0-п.20/23) | ⭕ | research/16 принят (D29); строки 69–71; F3-brief — D29 п.3. Ф3 ОТКРЫТА 02.08 (D39.81): фронт-сессия живёт на моках (`frontend/`, S0–S2 + контракт исполнены); контракт API ратифицирован (D39.99), платформа = П-1 (P0 исполнен 04.08, D39.100/101 — ждёт приёмки №13) | +| ПТ-20 | Ридер-IDE: VS Code-подобный фронт агентного перевода (V0-п.20/23) | ⭕ | research/16 принят (D29); строки 69–71; F3-brief — D29 п.3. Ф3 ОТКРЫТА 02.08 (D39.81): фронт-сессия живёт на моках (`frontend/`, S0–S2 + контракт исполнены); контракт API ратифицирован (D39.99, живой 0.2.1); платформа построена до раннера P4: вход/кредиты/квоты (P0–P3, D39.107/109/114) + River-очередь · транзиентные systemd-юниты · холд-до-спавна · реконсилятор (D39.123); фронт S3 — слой данных на 0.2.0 (D39.115); S4 гейчен «S3.5 фикс-паком оболочки» (D39.119 п.4) | | ПТ-21 | Параллельное чтение двух текстов с выравниванием по смыслам (V0-п.21); выравнивание грубое, по единицам экспорта — принято владельцем 02.08, спаны внутри текста не строятся | 🔶 | механизм готов: `tmctl export --pairs` выравнивает пары побайтно по единицам редактуры (`internal/pipeline/export.go:89-93`); якорь = **edit-unit**, НЕ чанк (переформулировано D39.84 — финальный текст существует только на уровне юнита, ~1.9 юнита/главу, местами глава = один блок; читалка обязана это выдерживать); UI-читалка = Ф3 (этап S6) | | ПТ-22 | Настройки от человека: 18+, жанр и т.п. (V0-п.22) | 🔶 | `book.yaml` (labels/жанр) данными; UI = Ф3 | | ПТ-23 | Веб-ПЕРВЫЙ фронт; SEO/ранжирование Google — куки, страницы-сироты, актуальные алгоритмы (V5-п.2); продукт = **SaaS**, не локальное приложение (решение владельца 02.08, D39.81 — натив-прицел V0-п.26 СНЯТ этим решением, вернуть только новым словом владельца); SEO только под Google, Яндекс снят; рынок глобальный; десктоп = PWA первым шагом, Tauri по явным триггерам (решения владельца 02.08, D39.84) | ⭕ | строка 71 (Ф3-бриф); SEO вошёл в стек-дизайн ДО выбора (D39.84, требование исполнено): двухконтурный деплой — SPA `app.<домен>` целиком под noindex + статический публичный контур ≤3 кликов от главной (лечение страниц-сирот), `frontend/docs/STACK_DECISIONS.md` §4; SSR-вопрос закрыт этим решением | | ПТ-24 | Цикл согласования глоссария с профпереводчиком/редактором (V0-п.23) | 🔶 | подписной цикл терминолога в бэкенде есть; UI = Ф3 | | ПТ-33 | Интерфейс НЕ раскрывает конвейер: ни моделей, ни стадий, ни внутренней терминологии — пользователь видит «загрузка → разбор → перевод → подпись банка → финал → готово» (решение владельца 02.08) | ⭕ | инвариант D39.81; контракт API v0 РАТИФИЦИРОВАН (D39.99, `architecture/14-api-contract/`): словарь десяти статусов принят владельцем 04.08 (D39.100/К-1); карта «вердикт → фраза» — приложение А компаньона, слова заполняет владелец (В-3); ревью-вопрос «сменится стадия — править ли фронт?» отвечен таблицей §5 компаньона | | ПТ-34 | Пользовательский перевод НИКОГДА не попадает на публично индексируемый URL — ни витрин примеров, ни «поделиться главой», ни публичных ссылок чтения (жёсткий продуктовый запрет, решение владельца 02.08; авторское право на исходники + политика Google по масштабируемому машин-контенту действуют на весь домен) | ⭕ | инвариант D39.84; носители: двухконтурный деплой `frontend/docs/STACK_DECISIONS.md` §4 (SPA под `X-Robots-Tag: noindex` на каждом HTML-ответе; публичный контур без контента переводов) + контракт 14 (`architecture/14-api-contract/`, D39.99) + платформенный бэклог П-1 | -| ПТ-35 | Лимиты «как в Claude Code» (решение владельца 04.08, D39.100): страница лимитов/использования в настройках (статус, НЕ суммы — запрет денег на экране в силе); стоп по потолку = статус `paused` + оповещение «перевод остановлен: лимиты исчерпаны» | ⭕ | контракт К-8 закрыт; API — П-5 (платформа), статус в спеке — правка S3 | +| ПТ-35 | Лимиты «как в Claude Code» (решение владельца 04.08, D39.100): страница лимитов/использования в настройках (статус, НЕ суммы — запрет денег на экране в силе); стоп по потолку = статус `paused` + оповещение «перевод остановлен: лимиты исчерпаны» | 🔶 | контракт К-8 закрыт, спека несёт `paused`/`paused_reason` (0.2.0+, D39.115); ручки /v0 — платформа-раннер P4 (D39.123); остаток: страница лимитов на фронте (S4+) · точное продуктовое слово — В-3 на владельце · К-13 (`paused_reason` не различает свой потолок и нет кредита, D39.115 п.6б) | ## Качество процесса и самоулучшение | ID | Требование (источник) | Статус | Носитель / доказательство | |---|---|---|---| -| ПТ-25 | Валидация влияния каждого решения на качество, вкл. пагубное (V1-п.3, V3-п.1; Выводы) | ✅ | методология полигона (exp01–16, labels, судья, пре-рег); держится нормами D39.46/47 | +| ПТ-25 | Валидация влияния каждого решения на качество, вкл. пагубное (V1-п.3, V3-п.1; Выводы) | ✅ | методология полигона (exp01–21 приняты, 22/23 живые; labels, судья, пре-рег); держится нормами D39.46/47 | | ПТ-25а | Онлайн- и оффлайн-замер КАЧЕСТВА прогона (V0-п.31, H5 in-loop signal) | 🔶 | детерминированный $0-слой в петле построен (гейты/чекеры, телеметрия качества — слой 5 в 09); семантический in-loop сигнал = Ф2 (судья, строки 33 · 13а · 90-метрики) | | ПТ-26 | Самоулучшение пайплайна по данным больших прогонов (V3-п.2, H16) | ⭕ | строка 90 (дизайн петли по данным судьи — при пилот-препе Ф2.5); AB-способность бэкенда — дальний хвост V1 (двойное хеджирование владельца), тем же дизайном | | ПТ-27 | Без-LLM анализ книги в помощь переводу/валидации (V1-п.1/п.9) | ✅ | майнер, $0-гейты/чекеры, экраны, KWIC — весь детерминированный слой | diff --git a/docs/research/17-external-critique.md b/docs/research/17-external-critique.md index 4622d01d..2b015f5b 100644 --- a/docs/research/17-external-critique.md +++ b/docs/research/17-external-critique.md @@ -250,19 +250,19 @@ API alias может сменить snapshot; популярные книги м #### B1.2. «Флаг → человек» признан, но не спроектирован как система производства -**CONFIRMED.** Реестр честно называет человеческую ёмкость недоказанной петлёй и не имеет flag-rate×throughput (`docs/architecture/06-memory-risk-registry.md:77-82`); стратегический обзор отмечает отсутствие реализованной очереди (`docs/architecture/07-strategic-review.md:120-128`). Но продуктовый слот не отсутствует полностью: активный Reader-IDE мандат уже проектирует annotations, красные чанки и `human_override` (`docs/READER_IDE_RESEARCH_SESSION_PROMPT.md:11-15,35-36`). Не ратифицирован именно persistent state/ownership contract. +**CONFIRMED.** Реестр честно называет человеческую ёмкость недоказанной петлёй и не имеет flag-rate×throughput (`docs/architecture/06-memory-risk-registry.md:77-82`); стратегический обзор отмечает отсутствие реализованной очереди (`docs/archive/architecture/07-strategic-review.md:120-128`). Но продуктовый слот не отсутствует полностью: активный Reader-IDE мандат уже проектирует annotations, красные чанки и `human_override` (`docs/archive/prompts/READER_IDE_RESEARCH_SESSION_PROMPT.md:11-15,35-36`). Не ратифицирован именно persistent state/ownership contract. **PLAUSIBLE.** Начать следует не с нового домена `ReviewTask`, а с минимального экспортируемого review bundle поверх flags/disposition: reason, evidence, typed resolution, seconds, reviewer. На 5–10 реальных главах измерить повторяемость решений, backlog и multi-reviewer contention; полноценный persistent domain вводить только если данные его оправдывают. #### B1.3. Prompt injection и trust boundary книги отсутствуют -**CONFIRMED.** Стартовый бриф ставит анти-абьюз, но стратегический обзор фиксирует отсутствие механизма (`docs/architecture/07-strategic-review.md:34-39`). Сейчас translator tool-less, а webfetch/tools запланированы на Ф3 (`docs/architecture/02-mvp-plan.md:60`), поэтому текущий риск — прежде всего task drift/токены; action-security gate становится обязательным перед Ф3. OWASP описывает прямые/косвенные инъекции через документы, least privilege и action approval; **mutable security guidance**, проверено 2026-07-10, https://cheatsheetseries.owasp.org/cheatsheets/LLM_Prompt_Injection_Prevention_Cheat_Sheet.html. +**CONFIRMED.** Стартовый бриф ставит анти-абьюз, но стратегический обзор фиксирует отсутствие механизма (`docs/archive/architecture/07-strategic-review.md:34-39`). Сейчас translator tool-less, а webfetch/tools запланированы на Ф3 (`docs/architecture/02-mvp-plan.md:60`), поэтому текущий риск — прежде всего task drift/токены; action-security gate становится обязательным перед Ф3. OWASP описывает прямые/косвенные инъекции через документы, least privilege и action approval; **mutable security guidance**, проверено 2026-07-10, https://cheatsheetseries.owasp.org/cheatsheets/LLM_Prompt_Injection_Prevention_Cheat_Sheet.html. **PLAUSIBLE.** Для текущего переводчика без tools основной ущерб — task drift и сжигание токенов; после webfetch/agent tools риск станет security boundary. Фальсификация: adversarial EPUB/TXT с plain, Unicode-obfuscated, quoted-fiction и false-positive инструкциями; измерить task-drift, false-positive и отсутствие внешних действий. #### B1.4. Rights/data manifest слабее инженерного provenance -**CONFIRMED.** Проект дисциплинированно держит корпуса вне git, различает data-sharing аккаунты и уже формулирует warranty/confidentiality/zero-retention политику (`docs/research/08-legal.md:145-152`), но стратегический обзор оставляет EU-hosting и warranty-chain открытыми (`docs/architecture/07-strategic-review.md:169-177`). Gap — не отсутствие политики, а отсутствие per-book machine-readable enforcement manifest для обработки, референса, хранения, внешнего API, обучения и публикации. +**CONFIRMED.** Проект дисциплинированно держит корпуса вне git, различает data-sharing аккаунты и уже формулирует warranty/confidentiality/zero-retention политику (`docs/research/08-legal.md:145-152`), но стратегический обзор оставляет EU-hosting и warranty-chain открытыми (`docs/archive/architecture/07-strategic-review.md:169-177`). Gap — не отсутствие политики, а отсутствие per-book machine-readable enforcement manifest для обработки, референса, хранения, внешнего API, обучения и публикации. **PLAUSIBLE.** Для B2B этот manifest станет обязательным раньше fine-tuning. Фальсификация: legal review двух целевых юрисдикций + 10 интервью издателей; go/no-go поля определяются не архитектурной фантазией, а требованиями договоров. @@ -274,7 +274,7 @@ API alias может сменить snapshot; популярные книги м #### B1.6. Для будущего резюме нет claim-level provenance contract -**CONFIRMED.** Резюме ещё не реализовано (`docs/architecture/07-strategic-review.md:28,44`), а план Ф2 уже связывает его с fact gate (`docs/architecture/02-mvp-plan.md:47`). Реестр правильно называет propagation ошибки первоклассным риском (`docs/architecture/06-memory-risk-registry.md:50-57`). Незакрыта спецификация provenance/conflicts и acceptance criterion fact gate; утверждать, что сегодня существует авторитетный канал, было ошибкой первой версии отчёта. +**CONFIRMED.** Резюме ещё не реализовано (`docs/archive/architecture/07-strategic-review.md:28,44`), а план Ф2 уже связывает его с fact gate (`docs/architecture/02-mvp-plan.md:47`). Реестр правильно называет propagation ошибки первоклассным риском (`docs/architecture/06-memory-risk-registry.md:50-57`). Незакрыта спецификация provenance/conflicts и acceptance criterion fact gate; утверждать, что сегодня существует авторитетный канал, было ошибкой первой версии отчёта. **PLAUSIBLE.** До постройки typed claim store сравнить более дешёвые варианты: source/local retrieval, prose summary с цитатами и typed claims на 20–30 дальних зависимостях. Source span не гарантирует entailment; если summary не даёт lift по downstream correctness/human-minutes, отдельный store не строить. @@ -351,14 +351,14 @@ API alias может сменить snapshot; популярные книги м | До reader-export | **Release state contract:** `run_complete` / `structurally_complete` / `quality_reviewed` / `publishable`; hard block structural/policy holes, audited waiver для semantic flags | Существующие disposition/status/report + export gate | `$0` API; engineering не оценён | Contract table `disposition × severity × waiver`; source manifest стабилен, output version меняется после redrive | **CONFIRMED gap; PLAUSIBLE mechanism.** D2: `docs/architecture/05-decisions-log.md:77-86`; HalOmi подтверждает severity, не gate: https://aclanthology.org/2023.emnlp-main.42/. | | После статичной приёмки, shadow | **Fidelity evidence cascade:** alignment/atoms → narrow bilingual questions; обязательная случайная выборка unflagged | Расширяет уже запланированные Judge/sidecar/fidelity suite; новый artifact `coverage_evidence` | `$0` внешнего API для local alignment, но compute/engineering есть; judge-цена определяется измеренным хвостом. Planning assumption 10% не подтверждён | 100–150 pairs; corrected recall/precision, upper CI miss-rate, review-minutes/error. Gate только после доказанного utility | **PLAUSIBLE.** Источники мотивируют signals/calibration, не каскад: https://aclanthology.org/2023.emnlp-main.42/, https://aclanthology.org/2024.emnlp-main.188/. | | До первой ongoing-книги | **D15.2 v3.1:** conservative declared dependency closure + rebill consent | Существующая snapshot/request-hash machinery | Marginal token overhead может быть `$0`; engineering/stale risk существенны | 2×2 stage/chunk property+mutation tests; 10–20 глав для preflight rebill estimate | **CONFIRMED, уже принято.** `docs/architecture/05-decisions-log.md:184-190,265-266`. | -| После 5–10 реальных глав | **Minimal review bundle:** flag, evidence, typed resolution, seconds, reviewer, reuse marker; persistent domain — только по данным | Flags/disposition + Reader-IDE annotations; новый domain пока не обязателен | `$0` API; human minutes — главная метрика | flags/chapter, precision, minutes/flag, repeats, backlog. Эскалировать дизайн при multi-reviewer/reuse/росте backlog | **CONFIRMED capacity gap; PLAUSIBLE workflow.** `docs/architecture/06-memory-risk-registry.md:82`; Reader-IDE slot: `docs/READER_IDE_RESEARCH_SESSION_PROMPT.md:11-15,35-36`. | +| После 5–10 реальных глав | **Minimal review bundle:** flag, evidence, typed resolution, seconds, reviewer, reuse marker; persistent domain — только по данным | Flags/disposition + Reader-IDE annotations; новый domain пока не обязателен | `$0` API; human minutes — главная метрика | flags/chapter, precision, minutes/flag, repeats, backlog. Эскалировать дизайн при multi-reviewer/reuse/росте backlog | **CONFIRMED capacity gap; PLAUSIBLE workflow.** `docs/architecture/06-memory-risk-registry.md:82`; Reader-IDE slot: `docs/archive/prompts/READER_IDE_RESEARCH_SESSION_PROMPT.md:11-15,35-36`. | | До первой adult-production книги | **Усилить ратифицированный D22.7:** versioned policy + book/entity context + `adult/prohibited/uncertain`, terminal uncertainty, human-confirm first books | Принятый ingest pre-screen + escalation guard | Local API marginal `$0`; classifier compute и full human confirmation первых книг не оценены | Отдельно cross-chunk age, alias, negation, quotation/backstory; upper FN CI. ~300 positive cases для демонстрации ≈99% sensitivity при 0 misses | **CONFIRMED gap, PLAUSIBLE extension.** D22.7: `docs/architecture/05-decisions-log.md:270-271`. NIST поддерживает lifecycle testing, не схему: **voluntary government risk profile**, 2024-07, https://doi.org/10.6028/NIST.AI.600-1. | | Текущий контур | **Echo gate calibration:** source overlap + CJK share + loop/entropy; prompt mitigation только экономит fallback | Расширение disposition/re-gate | `$0` API на чистом; local compute + fallback flagged | Existing failures + 30–50 clean outputs/язык + synthetic partial/tail echo; threshold при fixed FP budget | **CONFIRMED need.** `docs/architecture/05-decisions-log.md:229,269`; причинная модель регистра не нужна для gate. | | Пилот Ф2.5 | **Judge sequential-repeat experiment:** 1/3/5/11, expand-on-disagreement, human subset | Существующий pilot harness | Цена измеряется, а не предполагается; production-контракта нет | Cluster bootstrap by item; changed decisions and cost/corrected decision | **CONFIRMED limitation; PLAUSIBLE optimization.** Kim подтверждает bias, не repeat protocol: https://aclanthology.org/2025.acl-industry.12/. | | Ф2 experiments | **Раздельные address/reveal/voice arms** на eligible cases; voice дополнить fidelity/over-stylization | D21 reserved slots + Annotator | Address ~10–20 tokens/active pair; остальные цены измерить | Три challenge sets: ambiguous T/V, real pre-reveal, speaker-rich dialogue | **PLAUSIBLE.** Direct prior art по voice: WMT 2025 En→Ja speaker embeddings, https://aclanthology.org/2025.wmt-1.10/. Конкретный stateless mechanism не доказан. | | Ф2 decision gate | **Summary baseline comparison:** source retrieval vs prose+citation vs typed claims; не делать summary authoritative по умолчанию | Будущий summary/fact gate | Не оценено; typed store создаёт extraction/coreference/conflict/human costs | 20–30 дальних зависимостей, несколько planted error classes; downstream correctness + human minutes | **PLAUSIBLE.** Gap: `docs/architecture/06-memory-risk-registry.md:56`; long-context источник лишь мотивирует риск: https://aclanthology.org/2024.tacl-1.9/. | | Сейчас policy; hard gate до Ф3 tools | **Trust boundary:** translator физически без tools/secrets/outbound actions; web retrieval изолирован; action guard появляется вместе с tools | Render/security policy сейчас; tool gateway в Ф3 | Engineering, не `$0` | Task-drift на literary/Unicode injections; capability test физического отсутствия actions | **CONFIRMED risk class; PLAUSIBLE architecture.** OWASP, проверено 2026-07-10: https://cheatsheetseries.owasp.org/cheatsheets/LLM_Prompt_Injection_Prevention_Cheat_Sheet.html. | -| До B2B | **Machine-readable rights/data manifest + all-in COGS** поверх существующей legal policy | Per-book metadata + human-event telemetry | Engineering/legal/human costs не оценены | Contract completeness; API-only vs all-in margin; accepted words/hour | **PLAUSIBLE product blocker.** `docs/architecture/07-strategic-review.md:176`; существующая policy: `docs/research/08-legal.md:145-152`. | +| До B2B | **Machine-readable rights/data manifest + all-in COGS** поверх существующей legal policy | Per-book metadata + human-event telemetry | Engineering/legal/human costs не оценены | Contract completeness; API-only vs all-in margin; accepted words/hour | **PLAUSIBLE product blocker.** `docs/archive/architecture/07-strategic-review.md:176`; существующая policy: `docs/research/08-legal.md:145-152`. | ### C1. Исправленный порядок работ @@ -388,7 +388,7 @@ API alias может сменить snapshot; популярные книги м 5. **Кто владеет L3 policy и апелляцией `uncertain`,** и какая sensitivity/FN bound требуется до первой adult-production книги? 6. **Какова схема provenance/conflicts и acceptance criterion future summary fact gate?** Source citation сама по себе не доказывает entailment. 7. **Когда и кем будет закрыта G1-автопопуляция глоссария, B6 Палладий/Поливанов и gender-leak morph gate?** Эти признанные оси (`docs/architecture/06-memory-risk-registry.md:39,47,77-82`) могут дать больший fidelity lift, чем новые agent roles. -8. **Кто владеет устранением doc drift?** `02-mvp-plan` всё ещё содержит следы старой ja-приёмки, хотя D18 сменил книгу на zh; в doc-driven multi-session проекте это самостоятельный regression risk (`docs/architecture/07-strategic-review.md:130-132`). +8. **Кто владеет устранением doc drift?** `02-mvp-plan` всё ещё содержит следы старой ja-приёмки, хотя D18 сменил книгу на zh; в doc-driven multi-session проекте это самостоятельный regression risk (`docs/archive/architecture/07-strategic-review.md:130-132`). --- diff --git a/docs/scripts/counts.py b/docs/scripts/counts.py index e345c80d..6dadcfbf 100644 --- a/docs/scripts/counts.py +++ b/docs/scripts/counts.py @@ -12,6 +12,11 @@ python3 docs/scripts/counts.py --check сверяет литералы доков с пере-счётом; код 1 = расхождение python3 docs/scripts/counts.py --check --from-index то же, но по СОДЕРЖИМОМУ КОММИТА (индекс для застейдженного файла, HEAD для остальных) + python3 docs/scripts/counts.py --lint линтер формы (строка 167): file:line-якоря живых доков + (файл существует? строка в пределах файла?); код 1 = мёртвые якоря + +--check также сторожит ПОЛНОТУ реестра нот (05-decisions-index.md): каждый заголовок `## D…`/`### D…` +живого D-лога и слайсов обязан иметь строку реестра, и наоборот (новая нота = новая строка ТЕМ ЖЕ коммитом). ⚠ Про `--from-index`: без него скрипт читает рабочее дерево, и при ЧАСТИЧНОМ стейдже (техника «застейджить только свою правку в общем файле») он честно ругается на то, что в коммит не поедет. @@ -33,6 +38,15 @@ ROOT = Path(__file__).resolve().parents[2] PROGRESS = "docs/PROGRESS.md" DLOG = "docs/architecture/05-decisions-log.md" REGISTER = "platform/docs/DEFECT_REGISTER.md" +NOTE_INDEX = "docs/architecture/05-decisions-index.md" + + +def dlog_slices() -> list[str]: + """Архив-слайсы D-лога (docs/archive/architecture/05-decisions-*.md), rel-путями.""" + return sorted( + str(p.relative_to(ROOT)) + for p in (ROOT / "docs/archive/architecture").glob("05-decisions-*.md") + ) BACKLOG_ROW = re.compile(r"^\| (\d+[а-яё]?) \|") REGISTER_ROW = re.compile(r"^\| (PD-\d+) \|") @@ -166,6 +180,72 @@ LITERALS = [ ] +NOTE_HEADING = re.compile(r"^#{2,3} (D\d\S*)") +INDEX_ROW = re.compile(r"^\| (D\d\S*) \|") + + +def note_token(tok: str) -> str: + return tok.rstrip(".,:") + + +def index_completeness() -> list[str]: + """Каждый заголовок ноты (живой D-лог + слайсы) ↔ строка реестра 05-decisions-index.md.""" + headings: set[str] = set() + for rel in [DLOG, *dlog_slices()]: + for line in read(rel).splitlines(): + if m := NOTE_HEADING.match(line): + headings.add(note_token(m.group(1))) + rows = {note_token(m.group(1)) for l in read(NOTE_INDEX).splitlines() if (m := INDEX_ROW.match(l))} + bad = [] + if missing := sorted(headings - rows): + bad.append(f"реестр нот: НЕТ строк для {missing} — новая нота обязана получить строку тем же коммитом") + if orphan := sorted(rows - headings): + bad.append(f"реестр нот: строки без заголовка в файлах: {orphan}") + return bad + + +# --lint: file:line-якоря живых доков. Проверяется СУЩЕСТВОВАНИЕ файла и что строка ≤ длины файла — +# это ловит переименованные/удалённые файлы и грубое протухание; содержание строки механически +# не проверить. Голые имена без «/» (miner.go:123) не резолвятся и не проверяются. +ANCHOR = re.compile(r"([~A-Za-z0-9_\-./]+\.(?:go|py|md|ya?ml|txt|puml|json|sql|js|ts)):(\d+)") +LINT_PREFIXES = [ + "", "backend/", "backend/internal/", "backend/cmd/", "backend/configs/", "backend/internal/chunk/", + "platform/", "platform/internal/", "platform/cmd/", "platform/docs/", + "frontend/", "frontend/docs/", "docs/", "docs/architecture/", "eval/", +] +# Обзоры ЧУЖОГО кода: их якоря указывают в сторонние репо (litellm/crush/openai-go…) и в нашем +# дереве не резолвятся по построению — не линтим. +LINT_SKIP_DOCS = { + "docs/research/21-llm-transport-survey.md", + "docs/research/26-anthropic-guidance-digest.md", +} + + +def lint_anchors() -> list[str]: + bad = [] + targets = [ROOT / "CLAUDE.md"] + [ + p for p in (ROOT / "docs").rglob("*.md") + if "archive" not in p.parts and str(p.relative_to(ROOT)) not in LINT_SKIP_DOCS + ] + line_counts: dict[Path, int] = {} + for doc in sorted(targets): + for n, line in enumerate(doc.read_text(encoding="utf-8").splitlines(), 1): + for m in ANCHOR.finditer(line): + rel, lineno = m.group(1).lstrip("/"), int(m.group(2)) + if "~" in rel or "/" not in rel or "..." in rel: + continue # ран-локальные пути, голые имена и «…»-сокращения не судим + hit = next((ROOT / pre / rel for pre in LINT_PREFIXES if (ROOT / pre / rel).is_file()), None) + where = f"{doc.relative_to(ROOT)}:{n}" + if hit is None: + bad.append(f"{where}: якорь `{m.group(0)}` — файла нет ни под одним из префиксов {LINT_PREFIXES}") + continue + if hit not in line_counts: + line_counts[hit] = len(hit.read_text(encoding="utf-8", errors="replace").splitlines()) + if lineno > line_counts[hit]: + bad.append(f"{where}: якорь `{m.group(0)}` — в {hit.relative_to(ROOT)} всего {line_counts[hit]} строк") + return bad + + def region(text: str, name: str) -> str: """current-state = шапка PROGRESS до таблицы бэклога; там и живут сводные числа.""" if name != "current-state": @@ -175,6 +255,13 @@ def region(text: str, name: str) -> str: def main() -> int: + if "--lint" in sys.argv: + problems = lint_anchors() + for p in problems: + print(" ✗ " + p) + print(f"\n--lint: {len(problems)} мёртвых/переросших file:line-якорей в живых доках") + return 1 if problems else 0 + dlog, prog, reg = read(DLOG), read(PROGRESS), read(REGISTER) b, r, h = backlog(prog), register(reg), head(dlog, prog) check = "--check" in sys.argv @@ -194,7 +281,7 @@ def main() -> int: if not check: return 0 - bad = [] + bad = index_completeness() if not h["сходится"]: bad.append( f"голова разошлась: максимум по номеру {h['максимум по номеру']}, "