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

This commit is contained in:
Claude (backend session) 2026-08-09 21:33:37 +03:00
parent d418d31ad9
commit 085dbb9d1a
16 changed files with 598 additions and 59 deletions

View file

@ -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` V0V5 + находок H6H18; статусы сверены кодом, актуализирует оркестратор при лендингах). Новые V-идеи владельца разбираются сюда, не остаются невидимыми.

File diff suppressed because one or more lines are too long

View file

@ -9,13 +9,14 @@
- [glossary.md](glossary.md) — жаргон и сокращения (D-номер, паки, банк, голден, K/DC/H/L…) одним экраном.
- [product-requirements.md](product-requirements.md) — реестр «что продукт обязан уметь»: START_PROMT V0V5 + находки H6H18, статусы сверены кодом.
- `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; остальные 0121 — отчёты ЗАКРЫТЫХ экспериментов (21 принят D39.117); ⚠ 22/23 — ЖИВАЯ сессия полигона, не ратифицированы (судьба — в баннерах/D-логе; 1820 — с ревью-шапками приёмки D39.108, шапка первична).
- `research/` — фактура ресёрчей 0127; у принятых — ревью-шапки, часть тел под ⚠ 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/) — веб-интерфейс: промт фронт-сессий S0S7 + [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`. Инструкции оттуда не исполнять.

22
docs/STACK.md Normal file
View file

@ -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` можно.

View file

@ -0,0 +1,181 @@
# Реестр D-нот — карта актуальности v2 (D1D39.126; строка 167)
> Одна строка на КАЖДУЮ ноту журнала решений: № · дата · суть · статус · где тело · темы. Ведёт оркестратор при лендингах: новая нота = новая строка ТЕМ ЖЕ коммитом (полноту сторожит `docs/scripts/counts.py --check`). Суть и статус здесь — НАВИГАЦИЯ, не контракт: при конфликте побеждает ТЕЛО ноты (живой [`05-decisions-log.md`](05-decisions-log.md) → слайсы `../archive/architecture/05-decisions-*.md`). Несущие эрраты к фактам старых нот живут в шапке живого D-лога — их читать ОБЯЗАТЕЛЬНО, реестр их не дублирует. Темы (для грепа оси «какой закон по X»): деньги · шов · банк · промпт · судья · гейты · контракт · платформа · фронт · полигон · ToS · общность · процесс · нарезка · голос · инфра · модели.
> Родословная: прозаическая карта D1D39.28 (ревизии D31D38.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 только с гетерогенными кандидатами, панель судей 23 семейства/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 гейтится замером | частично: п.13/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 в контракт немедленно, ранжирование открытых вопросов Q1Q7 | частично: 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 +1525% (~$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 экспами 1922; §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-код в логические папки exp1214b (импорты сохранены), статус-доки и .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-спека чанкера, когезия механизмом, волновая архитектура W0W3, пре-рег эмпирики Q0Q5 | закрыт (нарратив приёмки) | слайс 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 придержан под фикс-лист F1F9 | закрыт (нарратив приёмки) | слайс arch-reset | гейты процесс |
| D39.5 | 17.07 | Пак-1.5 + F1F9 залендены одним пакетом: 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 инвариант общности P1P6; §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 — резидуал R1R5 | закрыт (нарратив приёмки) | слайс 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 тупика; вердикт «P1P5 в предъявленном виде не строятся» подтверждён (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.0690.103; ограничивает эмиссия); посылка «культивация = общепринятое» не подтверждена; смета терминолога = единицы долларов, не центы | закрыт (нарратив приёмки) | слайс 20-58 | банк полигон деньги |
| D39.44 | 26.07 | Решения владельца по Z-развилкам пакета-7: рубрика K1K12 ратифицирована (Q1Q6 закрыты); 修炼 — V0 до добора; смета фазы B $1.202.60 санкционирована; $0-добор улик перед фазой B | частично: рубрика K1K12 (живёт строкой бэклога 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 с условным фолдом; ты/вы-флаггер AC + 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 файлов, пять вёдер AE; 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, новые строки 8086; норма — каждое «отложено» в 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 санкционированы (специфика — данными/модулями), Q1Q7 делегированы инженерно; КАНОН ЦЕЛЕЙ проекта (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 не пишется; строки 9597, курс не пере-упорядочен | ЖИВОЕ: несущее (цитируется кодом платформы) | жив | платформа фронт контракт |
| 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, строки 99102, зонные бэклоги | ЖИВОЕ: самый цитируемый узел эры (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; дыры трекера → строки 106113 | закрыт (нарратив приёмки): содержимое разведено в строки 106116 и 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⟧); строки 128132 заведены | частично: ратификация «закрыто классом» несущая; фикс-пак 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 «топология ролей» — промт выдан; строки 135144 | частично: закрытия 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 исправлена; строки 146148 заведены | закрыт (исполнен); строки 146148 заведены | жив | процесс |
| D39.117 | 08.08 | Эксп-21 принят: строка 65 закрыта (dspro/glm неразличимы — жилец = цена/конфиг), починка = пре-гейт перед редактором; опровергнут вывод D39.108; курс — эксп-22 «панель жильцов» + Sol-арбитраж | ЖИВОЕ: диспозиции 142/65/106/55; правило ничьей эксп-22 ратифицировано; строки 149153 заведены | жив | полигон судья модели |
| D39.118 | 08.08 | Фикс-пак банка (128+129+130-минимум) принят: семьи термов со-батчатся юнитами, bankdata-плоскость с BankDataVersion, сдвиг edit-волны bank-only, инверсия ранжирования семей; строки 154159 | закрыт (нарратив приёмки); живое = ратификации (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 принят фактурой (строки 160162) | ЖИВОЕ: формы артефактов для потребителей; формула аргумента потолка поправлена 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.109123); докс-диета — хроники в архив-слайсы, зонный журнал платформы 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 · К-статусы компаньона сведены | ЖИВОЕ | жив | процесс |

File diff suppressed because one or more lines are too long

View file

@ -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.4145/47/5053)** |
> | 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 |

File diff suppressed because one or more lines are too long

View file

@ -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ж) | владелец (продуктовое) |
---

View file

@ -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 +1525% → округление ВВЕРХ (низкая ставка опаснее высокой — прогон встанет на потолке посреди книги; `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 |

View file

@ -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 в `<jobdir>/events.ndjson`, платформа тейлит его с чекпойнтом смещения в Postgres». Пункт (б) уже ОТВЕЧЕН ратифицированной формой (журнал файлом, D39.106); пункт (а) — живое требование к эмиттеру. ⚠ Имя `<jobdir>/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/<seq>.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-лог/слайсы).

View file

@ -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; проверено по первоисточникам).

View file

@ -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** — нижний якорь шкалы судьи; **Холм** — поправка Холма на множественные сравнения; **порог различимости** — минимальная дельта, отличимая от шума риге.

View file

@ -1,6 +1,6 @@
# Реестр продуктовых требований — «что продукт обязан уметь»
> Единый список требований владельца к продукту. Источники: `../START_PROMT.MD` (ЖИВОЙ бриф, идеи V0V5) + владельческие находки H6H18 (`architecture/09-target-architecture.md` §3). Статусы сверены кодом и D-логом при D39.80 (02.08.2026), освежены свипом D39.101 (04.08.2026). **При конфликте с D-логом побеждает D-лог.** Правила: новую V-секцию владельца разбирает сюда оркестратор при первом касании; статус правится при лендинге пака, который его меняет; требование без носителя не оставлять.
> Единый список требований владельца к продукту. Источники: `../START_PROMT.MD` (ЖИВОЙ бриф, идеи V0V5) + владельческие находки H6H18 (`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-п.78; Выводы-п.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.4153), KWIC-контексты, подписной цикл. **Вход владельца 02.08 (D39.89):** банк = центральная ценность, арбитраж перевода термов должен быть консилиумом со скорами уверенности, но не ломать связность системы термов ⇒ качество МЕХАНИЗМА проверено полигоном: заход исполнен 04.08 (промт архивирован), артефакты ждут адверсариальной приёмки №13 (строка 5); статус ПТ-9 «построено» не меняется — под вопросом не наличие, а алгоритм |
| ПТ-9 | Глоссарий автосборкой: модель переводит термины с контекстом/жанром (V4-п.4, H15) | ✅ | терминолог пака-20 (D39.4153), 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); строки 6971; F3-brief — D29 п.3. Ф3 ОТКРЫТА 02.08 (D39.81): фронт-сессия живёт на моках (`frontend/`, S0S2 + контракт исполнены); контракт API ратифицирован (D39.99), платформа = П-1 (P0 исполнен 04.08, D39.100/101 — ждёт приёмки №13) |
| ПТ-20 | Ридер-IDE: VS Code-подобный фронт агентного перевода (V0-п.20/23) | ⭕ | research/16 принят (D29); строки 6971; F3-brief — D29 п.3. Ф3 ОТКРЫТА 02.08 (D39.81): фронт-сессия живёт на моках (`frontend/`, S0S2 + контракт исполнены); контракт API ратифицирован (D39.99, живой 0.2.1); платформа построена до раннера P4: вход/кредиты/квоты (P0P3, 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; Выводы) | ✅ | методология полигона (exp0116, labels, судья, пре-рег); держится нормами D39.46/47 |
| ПТ-25 | Валидация влияния каждого решения на качество, вкл. пагубное (V1-п.3, V3-п.1; Выводы) | ✅ | методология полигона (exp0121 приняты, 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 — весь детерминированный слой |

View file

@ -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. На 510 реальных главах измерить повторяемость решений, 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 на 2030 дальних зависимостях. 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% не подтверждён | 100150 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; 1020 глав для preflight rebill estimate | **CONFIRMED, уже принято.** `docs/architecture/05-decisions-log.md:184-190,265-266`. |
| После 510 реальных глав | **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`. |
| После 510 реальных глав | **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 + 3050 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 ~1020 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 | 2030 дальних зависимостей, несколько 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`).
---

View file

@ -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['максимум по номеру']}, "