diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 2ca1d489..88e8eda9 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,9 +1,9 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-10, голова D39.128; хендофф №15→№16 — D39.124/125, приёмка фронта S3.6 — D39.127, промты эмиттера и P5 — D39.128). Оркестраторов ДВА (решение владельца 07.08): этот — движок/платформа/фронт/доки; параллельный (РОЛЬЮ, без номера — счётчик один, D39.112 п.6) — приёмка полигона. Одновременно не запускаются; CURRENT-STATE ведут оба, чужие строки не трогают. Норма изоляции панелей после инцидента отката чужих файлов — D39.113, гардрейлы в CLAUDE.md. +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-10, голова D39.129; хендофф №15→№16 — D39.124/125, приёмки фронта S3.6/S3.7 — D39.127/129, промты эмиттера и P5 — D39.128). Оркестраторов ДВА (решение владельца 07.08): этот — движок/платформа/фронт/доки; параллельный (РОЛЬЮ, без номера — счётчик один, D39.112 п.6) — приёмка полигона. Одновременно не запускаются; CURRENT-STATE ведут оба, чужие строки не трогают. Норма изоляции панелей после инцидента отката чужих файлов — D39.113, гардрейлы в CLAUDE.md. > - **Эра №15 закрыта — семь приёмок, все ПРИНЯТЫ и залендены**; лента, коммиты и разборы — D39.109–123 (D-лог) и реестр нот `architecture/05-decisions-index.md`; снимок прежних бюллетеней этой шапки — архив-слайс `-08-02-04`. -> - **ЖИВОЕ:** полигон эксп-22/23 — дерево ЗАЛЕНДЕНО 10.08 с ревью-шапками приёмки №16 (числа подтверждены независимым пересчётом; **выводы НЕ ратифицированы** — владелец 10.08 признал постановку неполной), **фаза Д заказана**: промт `docs/POLYGON_EXP2223_DOVODKA_SESSION_PROMPT.md`, запуск по слову владельца (санкция потолка $10.00 при запуске) · фронт: S3.5+S3.6 (24 замечания + второй круг) ИСПОЛНЕНЫ, приёмка D39.127, дерево залендено `57e6bd1` — промт S3.7 «долги слоя данных» ВЫДАН (`frontend/docs/S37_SESSION_PROMPT.md`), запуск по слову владельца; S4 после приёмки S3.7 · промты бэкенда/платформы ВЫДАНЫ 10.08 (D39.128, после полного пере-чтения корпуса по заказу владельца): **эмиттер** (`docs/BACKEND_EMITTER_SESSION_PROMPT.md` — строки 103+135+165, закрывает PD-113; вход = `16-events-emitter.md` целиком) · **платформа P5** (`platform/docs/PLATFORM_P5_SESSION_PROMPT.md` — П-9 `POST /books`+PD-72 · стоп/резюм PD-140 · наблюдаемость П-11+PD-114); запуск обоих — по слову владельца, параллельность легальна; эскроу (136) — следующим денежным промтом. -> - **Открыто на владельце:** запуск фазы Д полигона (слово + санкция потолка $10.00) · Приложение А контракта (148: реконструкция с баннером или заново) · продуктовое слово «остановлена: лимиты» (В-3) · К-13/Ф-31 (paused_reason один — «свой потолок» и «нет кредита» неразличимы) · В-4/Ф-30 (глава без заголовка) · фри-тир PD-104 (ноль на бете против автогранта $5 с суточным потолком) · порог 116 · мини-проба флора 44 (одобрена, промт не выдан) · подпись денежного шага 46 · лист В-3+К-6 · авто-резюм paused (вопрос платформы) · запуск S3.7/эмиттера/следующего платформенного пака · фронт-вопросы зонного журнала: В-7 (плотность интерфейса) · В-8 (слово состояния в дереве) · Ф-38 (вкладка «Замечания») · граница ПТ-33 для добавочных полей `BankTerm` (черновик S3.5/S3.6, D39.127 п.2б). +> - **ЖИВОЕ:** полигон эксп-22/23 — дерево ЗАЛЕНДЕНО 10.08 с ревью-шапками приёмки №16 (числа подтверждены независимым пересчётом; **выводы НЕ ратифицированы** — владелец 10.08 признал постановку неполной), **фаза Д заказана**: промт `docs/POLYGON_EXP2223_DOVODKA_SESSION_PROMPT.md`, запуск по слову владельца (санкция потолка $10.00 при запуске) · фронт: S3.5–S3.7 ИСПОЛНЕНЫ и ПРИНЯТЫ (D39.127/D39.129, лендинги `57e6bd1`/`3e465bd`), контракт **0.2.2** в каноне, i18n-механизм построен (ПТ-36 🔶) — **S4 следующий, промт выдаёт оркестратор ПОСЛЕ приёмки P5** (экран загрузки стоит на `POST /books`) · промты бэкенда/платформы ВЫДАНЫ 10.08 (D39.128, после полного пере-чтения корпуса по заказу владельца): **эмиттер** (`docs/BACKEND_EMITTER_SESSION_PROMPT.md` — строки 103+135+165, закрывает PD-113; вход = `16-events-emitter.md` целиком) · **платформа P5** (`platform/docs/PLATFORM_P5_SESSION_PROMPT.md` — П-9 `POST /books`+PD-72 · стоп/резюм PD-140 · наблюдаемость П-11+PD-114); запуск обоих — по слову владельца, параллельность легальна; эскроу (136) — следующим денежным промтом. +> - **Открыто на владельце:** запуск фазы Д полигона (слово + санкция потолка $10.00) · Приложение А контракта (148: реконструкция с баннером или заново) · продуктовое слово «остановлена: лимиты» (В-3) · К-13/Ф-31 (paused_reason один — «свой потолок» и «нет кредита» неразличимы) · В-4/Ф-30 (глава без заголовка) · фри-тир PD-104 (ноль на бете против автогранта $5 с суточным потолком) · порог 116 · мини-проба флора 44 (одобрена, промт не выдан) · подпись денежного шага 46 · лист В-3+К-6 · авто-резюм paused (вопрос платформы) · запуск S3.7/эмиттера/следующего платформенного пака · фронт-вопросы зонного журнала: В-7 (плотность интерфейса; держит и Ф-54 — обрезку центра на зуме) · В-8 (слово состояния в дереве) · **В-9 (какие языки интерфейса обещает продукт — механизм готов, ПТ-36)** · Ф-38 (вкладка «Замечания») · граница ПТ-33 для добавочных полей `BankTerm` (черновик S3.5/S3.6, D39.127 п.2б). > - **Сделано (сводно)** — снимок ленты закрытых эр в [archive/PROGRESS-2026-08-04-09.md](archive/PROGRESS-2026-08-04-09.md); детали — D-лог и слайсы. > - **Курс:** ОБЩНОСТЬ ✅ → КАЧЕСТВО БАНКА ✅ → ПАКЕТ-ЧЕКЕРОВ ✅ (D39.59–78) → **ФРОНТ-ЭРА** (D39.81–100: зоны живые, контракт API ратифицирован) → **шов/платформа/движковые блокеры построены** (D39.106–123). Хвосты курса живут строками: 16 (edit-волна не гонялась НИ РАЗУ — держит и оси голоса 13б/24) · 46 (дизайн заморожен D39.92/93, промт ждёт выдачи) · coldrun-b фаза C заморожена чекпойнтом легитимно (D39.86; эталон денег/поведения — coldrun-a, read-only); развилка 0731 решена и исполнена (D39.87/91, код `553f1a3`). > - **Горизонт (D39.62/67, освежён D39.95):** **ДОБОР ИДЕАЛА** (первым прогоном: оси голоса 24 · авто-режим · цена 16; жильцы ролей решаются ДО прогона эксп-22 — строка 149 · веса K1–K12 13а · вне-претрейн чекпоинт 55; остаток арбитража банка = рецензент спорных кластеров при ре-пробе 74 — D39.102) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 62–68, 85) → Ф3 ридер-IDE (69–71). **Стоячие:** ToS-триггер 25.10 · Ш-2 до go1.27 (⚠ + x/text Unicode 17 тем же тулчейном — строка 119, реестр §Б-108 справочника якорей) · платные прогоны разблокированы (проба провода — D39.97, конфиги 112 залендены). diff --git a/docs/architecture/05-decisions-index.md b/docs/architecture/05-decisions-index.md index b40d014a..fb8db3fb 100644 --- a/docs/architecture/05-decisions-index.md +++ b/docs/architecture/05-decisions-index.md @@ -181,3 +181,4 @@ | D39.126 | 09.08 | Докс-пак 167 исполнен: реестр всех нот (этот файл) · counts --check полнота реестра + --lint якорей · разгрузка топ-10 строк бэклога · топикальные входы 15-money-path/16-events-emitter/STACK · К-статусы компаньона сведены | ЖИВОЕ | жив | процесс | | D39.127 | 10.08 | Приёмка фронта S3.6 принята и залендена (57e6bd1): гейты пере-прогнаны исполнением, 12 находок ревью → промт S3.7; Ф-47 ратифицирован (sense обязателен, спека 0.2.2); строка 169 — экспорт банка | ЖИВОЕ: S3.7 выдан (запуск по слову владельца), S4 после его приёмки; канон sense — диффом при лендинге S3.7 | жив | фронт контракт | | D39.128 | 10.08 | Полное пере-чтение корпуса по заказу владельца; выданы промты: бэкенд-эмиттер (103+135+165, PD-113) и платформа P5 (П-9/PD-72 + PD-140 + П-11/PD-114) | ЖИВОЕ: запуск обоих по слову владельца; развилка book.yaml при интейке гейчена ратификацией | жив | шов деньги платформа процесс | +| D39.129 | 10.08 | Приёмка фронта S3.7 принята и залендена (3e465bd): канон контракта 0.2.2, i18n-механизм построен (ПТ-36 🔶); арбитраж 8.1 — HIGH приёмки S3.6 снята как ложноположительная, урок «браузерный вердикт только живым прогоном» | ЖИВОЕ: находки приёмки → блок S4-промта; S4 после приёмки P5; В-9 (языки интерфейса) на владельце | жив | фронт контракт процесс | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 526b8984..e84b04ac 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.128 (живой файл: карта · эрраты · живые тела · голова D39.106+; тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) +# Журнал решений оркестратора — контракт D1–D39.129 (живой файл: карта · эрраты · живые тела · голова D39.106+; тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто: > ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 живёт ниже в этом файле (голова D39.106+). @@ -475,3 +475,11 @@ **2. Промты (запуск обоих — по слову владельца; параллельность легальна, зоны не пересекаются; фронт S3.7 живёт в `frontend/` параллельно).** (а) **Бэкенд-эмиттер** `docs/BACKEND_EMITTER_SESSION_PROMPT.md`: строка 103 (журнал `events.jsonl` по форме D39.106; словарь — ответ ДИФФОМ на предложение платформы `events.go`; сквозная проба своим журналом через настоящий декодер платформы в копии зоны) + 135 (гейт потолка пер-вызов) + 165 (различимые exit-коды — PD-113) + 102 опционально; $0; дизайн-развилки нормдока §5 отданы сессии с записью решений; голден/снапшот-нейтральность — обязательное доказательство. (б) **Платформа P5** `platform/docs/PLATFORM_P5_SESSION_PROMPT.md`: П-9 `POST /books` (+PD-72; ⚠ развилка «кто пишет `book.yaml` при интейке» ГЕЙЧЕНА ратификацией — вопрос в зонный журнал до стройки той половины) + стоп/резюм PD-140 (кандидат-дизайн: намерение стопа своей стороной до SIGTERM — дискриминатор против PD-152) + наблюдаемость П-11 + печать конфигурации PD-114 + DEFECT_REGISTER секциями (остаток 167). **3. Хвост чужого дерева (повтор D39.127 п.4):** строка «активные промты» `docs/README.md` отстаёт (S3.5→S3.7, эмиттер/P5 не назван) и несёт чужой застейдженный полигонный hunk — актуализирует полигонный лендинг (10.08.2026, оркестратор №16). ✅ + +## D39.129 — ПРИЁМКА ФРОНТА S3.7 ПРИНЯТА И ЗАЛЕНДЕНА (`3e465bd`); канон контракта — 0.2.2; арбитраж 8.1: HIGH приёмки S3.6 снята как ложноположительная (10.08). ✅ + +**1. Приёмка (оркестратор №16; воркфлоу 11 агентов: 6 линз + скептики, отдельная арбитражная линза по спорной 8.1).** Гейты исполнением: `check:full` EXIT=0 · vitest **279** · 9 сценариев / 88 проверок. **12 находок CONFIRMED (1 high: запись ложно клеймит импорт `fill.ts` сценами — дубль подстановки в `scenes.mjs` жив и добавлен самой сессией), 0 опровергнуто, 16 minor**; блокеров лендинга нет. Носитель находок — блок «находки приёмки S3.7» следующего фронт-промта (S4); нарратив — приёмочная запись зонного журнала. + +**2. Арбитраж 8.1 (спор моей приёмки S3.6 с сессией): ПРАВА СЕССИЯ.** В Chromium геометрический запрос форсит расчёт раскладки и под `content-visibility: hidden` — замер таблицы в скрытой keep-alive вкладке даёт ширины эталона (живой прогон сцены `hidden` при этой приёмке). HIGH из D39.127 п.1 снята как ложноположительная; сессия не поверила приёмке, замерила и сняла свой же готовый механизм — образцовое поведение. **Урок в норму приёмки (дописан в память оркестратора): браузерное поведение не подтверждается рассуждением от кода — вердикт без живого прогона = PLAUSIBLE, не CONFIRMED.** + +**3. Ратификации и закрытия.** (а) Канон `14-api-contract/` догнал **0.2.2** байт-копией зонной спеки (`sense` → required, пустая строка = «различителя нет» — исполнение D39.127 п.2а); зеркало байт-равно. (б) Строки зоны Ф-47/Ф-49/Ф-50/Ф-51/Ф-40 закрыты; Ф-25/Ф-35 закрыты код-половиной; заведены Ф-52…Ф-55 и вопрос **В-9** (какие языки интерфейса обещает продукт — владелец). (в) **ПТ-36 → 🔶**: механизм i18n построен (каталог 157 ключей · гейт «текст местом» · стор языка · ``), содержимое — только ru; список языков — 🔒 владелец. (г) Остатки слоя данных из ревью (глушащие отметки reread · `asked` при resync · дырка гейта вычисленных литералов · вакуумные пассы perf/zoom-сторожей) — фронт-зона, в блок находок S4-промта. **S4 — следующий этап; промт после приёмки P5** (экран загрузки стоит на `POST /books`) (10.08.2026, оркестратор №16). ✅ diff --git a/docs/architecture/14-api-contract/openapi.yaml b/docs/architecture/14-api-contract/openapi.yaml index 35cfea16..59d51735 100644 --- a/docs/architecture/14-api-contract/openapi.yaml +++ b/docs/architecture/14-api-contract/openapi.yaml @@ -2,7 +2,7 @@ openapi: 3.1.0 info: title: TextMachine API - version: 0.2.1 + version: 0.2.2 summary: Ratified contract between the frontend and the TextMachine platform (D39.99). description: | **RATIFIED contract (D39.99, 04.08.2026).** The canonical copy lives in @@ -988,7 +988,7 @@ components: ⚠ **The name `source` is deliberately unused here.** In the engine that column means PROVENANCE; this contract calls provenance `origin` and the term's surfaces `src`/`dst`. Naming the term's text `source` would create a false friend between the two schemas. - required: [id, src, dst, kind, status, origin, since_chapter, until_chapter] + required: [id, src, dst, kind, status, origin, sense, since_chapter, until_chapter] properties: id: { $ref: '#/components/schemas/Id' } src: @@ -1009,7 +1009,13 @@ components: origin: { $ref: '#/components/schemas/TermOrigin' } sense: type: string - description: Polysemy disambiguator; part of the uniqueness key. + description: | + Polysemy disambiguator; part of the uniqueness key. + + **Required, and the EMPTY STRING means "no disambiguator" (0.2.2).** It was optional + while being named as part of the key: a client then could not tell "this term has no + disambiguator" from "the field was not sent", although that is exactly the field by + which two legal rows of the same surface differ. since_chapter: type: integer minimum: 0 diff --git a/docs/product-requirements.md b/docs/product-requirements.md index 98187c10..2d7c7144 100644 --- a/docs/product-requirements.md +++ b/docs/product-requirements.md @@ -60,7 +60,7 @@ | ПТ-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 закрыт, спека несёт `paused`/`paused_reason` (0.2.0+, D39.115); ручки /v0 — платформа-раннер P4 (D39.123); остаток: страница лимитов на фронте (S4+) · точное продуктовое слово — В-3 на владельце · К-13 (`paused_reason` не различает свой потолок и нет кредита, D39.115 п.6б) | -| ПТ-36 | Интерфейс МУЛЬТИЯЗЫЧНЫЙ, русский не хардкодится в разметке (слово владельца 10.08; язык интерфейса — отдельная ось от языков перевода). ⚠ До 10.08 требование в реестре отсутствовало — пропуск поймал владелец (D39.127 п.2г) | ⭕ | механизм (словарь строк · линт-гейт против кириллических литералов · хранилище выбора) = промт S3.7 задача 9 + строка Ф-35 фронта; локаль примитивов уже сведена (`frontend/src/ui/Locale.tsx`); продуктовый список языков — 🔒 владелец | +| ПТ-36 | Интерфейс МУЛЬТИЯЗЫЧНЫЙ, русский не хардкодится в разметке (слово владельца 10.08; язык интерфейса — отдельная ось от языков перевода). ⚠ До 10.08 требование в реестре отсутствовало — пропуск поймал владелец (D39.127 п.2г) | 🔶 | ПОСТРОЕНО S3.7 (принят D39.129): каталог `frontend/src/i18n/ru.ts` (157 ключей) · механизм `@internationalized/string` · ESLint-гейт «текст местом» · стор языка с персистом · `` следует выбору; содержимое — только ru; продуктовый список языков — 🔒 владелец (В-9 зоны фронта) | ## Качество процесса и самоулучшение