Final documentation pass in the frontend zone: keep what a session needs to work, drop the account of how we got there, and correct the stale claims about code

This commit is contained in:
heaven 2026-09-02 19:39:05 +03:00
parent eae664f6b4
commit 9f97a9305e
6 changed files with 45 additions and 108 deletions

View file

@ -16,16 +16,12 @@
**Тело черновика снято 02.09** и здесь не воспроизводится. Причина не в объёме: канон несёт те же **Тело черновика снято 02.09** и здесь не воспроизводится. Причина не в объёме: канон несёт те же
разделы под ТЕМИ ЖЕ номерами (§0 пометки провенанса · §1 почему YAML · §2.12.13 решения и их разделы под ТЕМИ ЖЕ номерами (§0 пометки провенанса · §1 почему YAML · §2.12.13 решения и их
происхождение · §3 зависимости · §4 К-вопросы · §5 ревью-вопрос · приложение А), и с тех пор он происхождение · §3 зависимости · §4 К-вопросы · §5 ревью-вопрос · приложение А; греп
ушёл вперёд на редакции 0.3.0…0.9.0 — то есть ссылка вида «§2.7 спутника» резолвится в каноне `### 2.1. Язык — код``### 2.13. ПТ-34`), и с тех пор ушёл вперёд на редакции 0.3.0…0.9.0 — то
и отдаёт ДЕЙСТВУЮЩУЮ редакцию, а не редакцию 0.2.x. есть ссылка вида «§2.7 спутника» резолвится в каноне и отдаёт ДЕЙСТВУЮЩУЮ редакцию, а не 0.2.x.
⚠ Держать тело рядом было не просто дублем, а активной ловушкой: канон прямо объявляет прежний ⚠ Держать тело рядом было не просто дублем, а активной ловушкой: канон прямо объявляет прежний
ответ §5 **опровергнутым исполнением** (research/28 Б-0, разбор — D39.138) и не сохраняет его ответ §5 **опровергнутым исполнением** (research/28 Б-0, разбор — D39.138) и не сохраняет его
даже как историю, «потому что он учил зону неправде»; §2.5 (прогресс), §2.6 (`finalizing`), даже как историю, «потому что он учил зону неправде»; §2.5 (прогресс), §2.6 (`finalizing`),
§2.8 (слова банка) и §2.11 (канал потока) с тех пор пере-решены. Черновик 0.2.x отвечал бы на эти §2.8 (слова банка) и §2.11 (канал потока) с тех пор пере-решены. Черновик 0.2.x отвечал бы на эти
вопросы устаревшим способом молча. вопросы устаревшим способом молча.
Тело исполнено в каноне `docs/architecture/14-api-contract/README.md` §2.12.13 — те же номера
(греп `### 2.1. Язык — код``### 2.13. ПТ-34`). ⚠ Отсылка «в истории git этого файла» снята
02.09: git АДРЕСОМ не является — по нему нельзя ни грепнуть, ни проверить утверждение.

View file

@ -36,7 +36,7 @@
| Ф-32 | **Замечания читаются пер-КНИЖНО, а показываются пер-главно.** Контракт даёт `GET /books/{id}/notes` и не даёт пер-главной ручки; панель контекста фильтровала по открытой главе на клиенте — **с S3.5 фильтр снят, сводка пер-книжная (замечание владельца 8, строка Ф-38), то есть пер-книжное чтение теперь и показывается пер-книжно**. Пока это дёшево — дефолт страницы 500, а на книге с сотнями замечаний клиент тянет весь список ради трёх строк, и с курсором дотянет ВЕСЬ. Ф-12 обосновывал отказ от виртуализации замечаний тем, что список пер-главный и мал; после этой правки он пер-главный на ЭКРАНЕ, но пер-книжный в ПАМЯТИ. Решать не фронту: либо пер-главная ручка (вопрос автору контракта), либо явный потолок с честным «показаны не все». | S6 (читалка) либо раньше, если появится книга с тысячами замечаний | второй проход ревью S3 | | Ф-32 | **Замечания читаются пер-КНИЖНО, а показываются пер-главно.** Контракт даёт `GET /books/{id}/notes` и не даёт пер-главной ручки; панель контекста фильтровала по открытой главе на клиенте — **с S3.5 фильтр снят, сводка пер-книжная (замечание владельца 8, строка Ф-38), то есть пер-книжное чтение теперь и показывается пер-книжно**. Пока это дёшево — дефолт страницы 500, а на книге с сотнями замечаний клиент тянет весь список ради трёх строк, и с курсором дотянет ВЕСЬ. Ф-12 обосновывал отказ от виртуализации замечаний тем, что список пер-главный и мал; после этой правки он пер-главный на ЭКРАНЕ, но пер-книжный в ПАМЯТИ. Решать не фронту: либо пер-главная ручка (вопрос автору контракта), либо явный потолок с честным «показаны не все». | S6 (читалка) либо раньше, если появится книга с тысячами замечаний | второй проход ревью S3 |
| Ф-5 | **Tauri 2.x вторым шагом** — по явным триггерам (трей · глобальные горячие клавиши · распространяемый .exe · офлайн · хранилище учёток ОС); до того — установимое PWA, только браузерные API | триггеры названы | STACK_DECISIONS §6, D39.84 | | Ф-5 | **Tauri 2.x вторым шагом** — по явным триггерам (трей · глобальные горячие клавиши · распространяемый .exe · офлайн · хранилище учёток ОС); до того — установимое PWA, только браузерные API | триггеры названы | STACK_DECISIONS §6, D39.84 |
| Ф-6 | **`@tanstack/react-virtual`** — в резерве, подключать только по замеру (дефолт виртуализации — RAC Virtualizer). **Замер сделан 04.08 (S2) и триггер НЕ наступил:** RAC `Virtualizer` держит и дерево, и банк на настоящем масштабе (числа — Ф-12), то есть вторая библиотека виртуализации была бы платой без выигрыша; пересматривать — если появится список с переменной высотой строки (читалка S6) и `estimatedRowSize` не справится | по замеру; замер 04.08 отрицательный | STACK_DECISIONS §2 | | Ф-6 | **`@tanstack/react-virtual`** — в резерве, подключать только по замеру (дефолт виртуализации — RAC Virtualizer). **Замер сделан 04.08 (S2) и триггер НЕ наступил:** RAC `Virtualizer` держит и дерево, и банк на настоящем масштабе (числа — Ф-12), то есть вторая библиотека виртуализации была бы платой без выигрыша; пересматривать — если появится список с переменной высотой строки (читалка S6) и `estimatedRowSize` не справится | по замеру; замер 04.08 отрицательный | STACK_DECISIONS §2 |
| Ф-33 | **Поиска по ТЕКСТУ книги в контракте нет вовсе.** Замечание владельца 4 («две кнопки поиска, делают одно и то же») разведено так: лупа в правом верхнем углу стала настоящей палитрой быстрого перехода к разделу или термину, а вкладка-заглушка «Поиск» из левой панели СНЯТА. Снята потому, что построить её нечем: у контракта пятнадцать ручек и ни одной поисковой (`GET /books/{id}/…` даёт списки, не запросы), то есть вкладка была обещанием без адресата. Вопрос не фронта: полнотекстовый поиск по книге — это либо ручка платформы, либо индекс на клиенте поверх выгрузки, и то и другое решает автор контракта. До ответа поиск по книге живёт как хвост читалки | S6 либо ручка контракта | S3.5, замечание 4 | | Ф-33 | **Поиска по ТЕКСТУ книги в контракте нет вовсе.** Замечание владельца 4 («две кнопки поиска, делают одно и то же») разведено так: лупа в правом верхнем углу стала настоящей палитрой быстрого перехода к разделу или термину, а вкладка-заглушка «Поиск» из левой панели СНЯТА. Снята потому, что построить её нечем: у контракта ни одной поисковой ручки (сверено по канону 0.9.0 02.09: 20 операций, `GET /books/{id}/…` даёт списки, не запросы; греп `operationId:` по `docs/architecture/14-api-contract/openapi.yaml` — ни одной поисковой), то есть вкладка была обещанием без адресата. Вопрос не фронта: полнотекстовый поиск по книге — это либо ручка платформы, либо индекс на клиенте поверх выгрузки, и то и другое решает автор контракта. До ответа поиск по книге живёт как хвост читалки | S6 либо ручка контракта | S3.5, замечание 4 |
| Ф-34 | **Светлая тема: цена честно замерена, дёшево не выходит.** Проверено по коду, а не на глаз. Дёшево — только половина: значения цвета лежат в одном месте (`tokens.css`), второй набор под `:root[data-theme='light']` механичен. Дорого — вторая половина: подпись оболочки, снятая с Fleet, это «карточки на почти чёрном фоне», и она не инвертируется значениями — в светлой теме отношения поверхностей приходится ПЕРЕПРИДУМАТЬ (что светлее, панель или геп; чем отделять карточку без теней; что делать с вырезом активной вкладки, который держится на паре «хром ↔ полотно»). Плюс переключатель и его персист, плюс пере-прогон axe по семи маршрутам на второй теме, плюс замок токенов на второй набор. Оценка: отдельный проход масштаба S7, а не хвост фикс-пака. Пункт назван в каркасе настроек честно: «сейчас доступна только тёмная» | S7 либо отдельный пакет | S3.5, замечание 15 | | Ф-34 | **Светлая тема: цена честно замерена, дёшево не выходит.** Проверено по коду, а не на глаз. Дёшево — только половина: значения цвета лежат в одном месте (`tokens.css`), второй набор под `:root[data-theme='light']` механичен. Дорого — вторая половина: подпись оболочки, снятая с Fleet, это «карточки на почти чёрном фоне», и она не инвертируется значениями — в светлой теме отношения поверхностей приходится ПЕРЕПРИДУМАТЬ (что светлее, панель или геп; чем отделять карточку без теней; что делать с вырезом активной вкладки, который держится на паре «хром ↔ полотно»). Плюс переключатель и его персист, плюс пере-прогон axe по семи маршрутам на второй теме, плюс замок токенов на второй набор. Оценка: отдельный проход масштаба S7, а не хвост фикс-пака. Пункт назван в каркасе настроек честно: «сейчас доступна только тёмная» | S7 либо отдельный пакет | S3.5, замечание 15 |
| Ф-35 | **Язык интерфейса: код-половина ЗАКРЫТА 10.08 в S3.7, продуктовая — на владельце.** Сделано: словарь строк `src/i18n/ru.ts` — единственный дом слов интерфейса; механизм отраслевой, не самописка — `@internationalized/string` 3.2.10 (i18n-слой Adobe, на котором react-aria отдаёт свои строки; сравнение с react-intl и lingui — `STACK_DECISIONS.md` §1); ключ типизирован ИЗ каталога, поэтому опечатка роняет `tsc`; выбор языка — стор `src/i18n/language.ts` с персистом, от него же берут локаль `I18nProvider` и весь `Intl` (`showcase/format.ts`); второй язык = второй файл того же вида плюс строка в `language.ts`, ни один компонент не трогается. Гейт против нового хардкода стоит и проверен живым нарушением ДВАЖДЫ: ESLint запрещает текст в разметке по МЕСТУ (ловит и `title="Настройки"`, и `title="Settings"` — алфавит ни при чём), `catalogue.test.ts` держит «код зоны английский» по комментариям, CSS, python и корневым конфигам. ⚠ **Числа — ЗАМЕР 14.08 (S4), арбитраж двух носителей:** до пака каталог **157** ключей (прогон `node -e` по живому `ru.ts`), главный чанк **724130 байт** (`npx vite build`); ходившие рядом «147» и «723102» ошибочны. После пака S4: каталог **202 ключа**, главный чанк **800 219 байт**, 243 446 gzip (+76 089 к до-пакному — новые примитивы формы, интейк, фикстура мира и сам текст). **Осталось владельцу:** какие языки продукт обещает, и переводы на них — их фронт не выдумывает | решение владельца: список языков | S3.5 → S3.7 10.08 → числа сверены S4 14.08 | | Ф-35 | **Язык интерфейса: код-половина ЗАКРЫТА 10.08 в S3.7, продуктовая — на владельце.** Сделано: словарь строк `src/i18n/ru.ts` — единственный дом слов интерфейса; механизм отраслевой, не самописка — `@internationalized/string` 3.2.10 (i18n-слой Adobe, на котором react-aria отдаёт свои строки; сравнение с react-intl и lingui — `STACK_DECISIONS.md` §1); ключ типизирован ИЗ каталога, поэтому опечатка роняет `tsc`; выбор языка — стор `src/i18n/language.ts` с персистом, от него же берут локаль `I18nProvider` и весь `Intl` (`showcase/format.ts`); второй язык = второй файл того же вида плюс строка в `language.ts`, ни один компонент не трогается. Гейт против нового хардкода стоит и проверен живым нарушением ДВАЖДЫ: ESLint запрещает текст в разметке по МЕСТУ (ловит и `title="Настройки"`, и `title="Settings"` — алфавит ни при чём), `catalogue.test.ts` держит «код зоны английский» по комментариям, CSS, python и корневым конфигам. ⚠ **Числа — ЗАМЕР 14.08 (S4), арбитраж двух носителей:** до пака каталог **157** ключей (прогон `node -e` по живому `ru.ts`), главный чанк **724130 байт** (`npx vite build`); ходившие рядом «147» и «723102» ошибочны. После пака S4: каталог **202 ключа**, главный чанк **800 219 байт**, 243 446 gzip (+76 089 к до-пакному — новые примитивы формы, интейк, фикстура мира и сам текст). **Осталось владельцу:** какие языки продукт обещает, и переводы на них — их фронт не выдумывает | решение владельца: список языков | S3.5 → S3.7 10.08 → числа сверены S4 14.08 |
| Ф-36 | **Физический масштаб интерфейса на мониторе — ручки нет.** Замечание владельца 1 говорит «великоваты, особенно на 27″ 2K». Замер при вьюпорте референса 1280×764 расхождения не подтвердил: промежутки, ширины панелей, шаг строки и высота вкладки совпадают с Fleet (FRONTEND_PLAN §5.5). Значит речь про ФИЗИЧЕСКИЙ размер на конкретном экране, а он зависит от масштабирования ОС, и лечится он не сдвигом токенов вслепую (это разъедет витрину с референсом), а ручкой «плотность интерфейса» в настройках. Цена ручки названа честно: все размеры сегодня в px, для одного множителя их надо перевести в rem и задать `font-size` на корне — механически, но трогает КАЖДЫЙ размерный токен и все замеренные числа, поэтому отдельным проходом с пере-замером. ⚠ **Дополнено 10.08:** предел меры набора (`--reader-width`), заведённый S3.5 «пока нет ручки», владелец отверг словами «жёстко приклеен к центру, до этого было намного лучше» — токен удалён, набор снова во всю ширину панели. Значит длина строки на 2K остаётся открытой ровно до ручки плотности, и подпирать её геометрией больше нельзя | владелец (В-7) + отдельный проход | S3.5, замечание 1 | | Ф-36 | **Физический масштаб интерфейса на мониторе — ручки нет.** Замечание владельца 1 говорит «великоваты, особенно на 27″ 2K». Замер при вьюпорте референса 1280×764 расхождения не подтвердил: промежутки, ширины панелей, шаг строки и высота вкладки совпадают с Fleet (FRONTEND_PLAN §5.5). Значит речь про ФИЗИЧЕСКИЙ размер на конкретном экране, а он зависит от масштабирования ОС, и лечится он не сдвигом токенов вслепую (это разъедет витрину с референсом), а ручкой «плотность интерфейса» в настройках. Цена ручки названа честно: все размеры сегодня в px, для одного множителя их надо перевести в rem и задать `font-size` на корне — механически, но трогает КАЖДЫЙ размерный токен и все замеренные числа, поэтому отдельным проходом с пере-замером. ⚠ **Дополнено 10.08:** предел меры набора (`--reader-width`), заведённый S3.5 «пока нет ручки», владелец отверг словами «жёстко приклеен к центру, до этого было намного лучше» — токен удалён, набор снова во всю ширину панели. Значит длина строки на 2K остаётся открытой ровно до ручки плотности, и подпирать её геометрией больше нельзя | владелец (В-7) + отдельный проход | S3.5, замечание 1 |

View file

@ -256,10 +256,12 @@ SSE-соединение открытым ПО ПОСТРОЕНИЮ — сеть
- `npm run scenes` — сценарии ИНТЕРАКЦИЙ (`scripts/scenes.mjs`): клик → кадр → проверка состояния. - `npm run scenes` — сценарии ИНТЕРАКЦИЙ (`scripts/scenes.mjs`): клик → кадр → проверка состояния.
Статичный кадр не принимает вкладки, драг ручки, модалы и спойлеры — они существуют только Статичный кадр не принимает вкладки, драг ручки, модалы и спойлеры — они существуют только
в движении. Падение сценария роняет команду; кадры ложатся в `.shots/scenes/`. Сегодня их в движении. Падение сценария роняет команду; кадры ложатся в `.shots/scenes/`. Сегодня их
**девять**: `tabs` (модель VS Code + контраст выбранной строки), `scroll` (keep-alive, Ф-19), **одиннадцать** (сверено 02.09 по `scripts/scenes.mjs`, объект `scenes`; прежняя редакция писала
`drag` (залипание полоски), `context` (сводка замечаний), `bank` (таблица, спойлер, ширины), «девять» — два сценария S4 в неё не попали): `tabs` (модель VS Code + контраст выбранной строки),
`hidden` (таблица, смонтированная в скрытой вкладке), `zoom` (раскладка при 125/150/200%), `scroll` (keep-alive, Ф-19), `drag` (залипание полоски), `context` (сводка замечаний),
`perf` (кадры прокрутки, поиска и драга на 1200 терминах), `overlays` (модальные окна). `bank` (таблица, спойлер, ширины), `hidden` (таблица, смонтированная в скрытой вкладке),
`zoom` (раскладка при 125/150/200%), `perf` (кадры прокрутки, поиска и драга на 1200 терминах),
`intake` (добавление книги), `refusals` (отказы формы), `overlays` (модальные окна).
**Стенд без root.** `.tooling/` собирается один раз и в репозиторий не едет (вместе с `.shots/` **Стенд без root.** `.tooling/` собирается один раз и в репозиторий не едет (вместе с `.shots/`
он в `.gitignore`). Chromium не стартует, пока не найдёт `libnss3`, `libnssutil3`, `libnspr4`, он в `.gitignore`). Chromium не стартует, пока не найдёт `libnss3`, `libnssutil3`, `libnspr4`,

View file

@ -71,22 +71,12 @@ OpenAPI 3.1, типы генерятся из спеки), и слой данн
(`#746deb`) и греп `--color-danger` (`#bd2f47`, ПОДНЯТ против замера `#b82e45` ради контраста, (`#746deb`) и греп `--color-danger` (`#bd2f47`, ПОДНЯТ против замера `#b82e45` ради контраста,
`FRONTEND_PLAN.md` §5.1). Второго носителя у этих чисел быть не должно. `FRONTEND_PLAN.md` §5.1). Второго носителя у этих чисел быть не должно.
**Геометрия Fleet:** **Числа замеров здесь не дублируются — носитель один, `FRONTEND_PLAN.md` §5.1:** геометрия Fleet
(промежуток панелей 8px по четырём срезам без исключений, радиус 6px, ни рамок, ни теней —
- **Промежуток между панелями — ровно 8px**, одинаковый везде: слева, между всеми панелями, справа (замер среза: четыре промежутка по 16 физических пикселей, без единого исключения). отделение только промежутком и разницей заливки `--color-shell``--color-panel`) и шесть
- **Радиус скругления панели — 6px** (край выходит на прямую за ~11 физических пикселей). поверхностей Antigravity для пустого состояния и настроек (чистый нейтральный серый, без холодного
- Панели не имеют ни рамок, ни теней: отделение только промежутком и разницей заливки оболочки и полотна (`--color-shell``--color-panel`). оттенка Fleet) стоят там таблицами со способом их повторить — греп `Палитра Antigravity`.
Второй экземпляр этих чисел разошёлся бы первым.
**Antigravity — для пустого состояния и настроек** (чистый нейтральный серый, без холодного оттенка, в отличие от Fleet):
| Роль | Значение |
|---|---|
| Фон | `#101010` |
| Боковая панель | `#161616` |
| Приподнятая карточка (поле ввода) | `#1c1c1c` |
| Заливка кнопки основного действия | `#252525` |
| Разделитель / граница | `#323232` |
| Текст | `#cecece` |
**Что НЕ замерено и требует проверки скриншот-циклом:** размеры шрифтов, высота строк, внутренние отступы панелей. Их снимай сам сравнением своей витрины с `fleet.png`. **Что НЕ замерено и требует проверки скриншот-циклом:** размеры шрифтов, высота строк, внутренние отступы панелей. Их снимай сам сравнением своей витрины с `fleet.png`.

View file

@ -260,7 +260,7 @@ CSRF только на cookie-пути: `Sec-Fetch-Site` → фолбэк на `
нет ни одного байтового смещения, только счётчики, а подсветка на уровне блока признана достаточной. нет ни одного байтового смещения, только счётчики, а подсветка на уровне блока признана достаточной.
**Выравнивание колонок достраивать не нужно** — `tmctl export --pairs` уже отдаёт колонку **Выравнивание колонок достраивать не нужно** — `tmctl export --pairs` уже отдаёт колонку
исходника, выровненную по единицам редактора (`export.go:189`). Гранулярность грубая и владельцем исходника, выровненную по единицам редактора (`backend/internal/pipeline/export.go:176`=`pend.Source = u.sourceText()`). Гранулярность грубая и владельцем
принята. принята.
**Подпись термина — это НЕ UPDATE строки.** Банк пересобирается из файлов на каждом прогоне **Подпись термина — это НЕ UPDATE строки.** Банк пересобирается из файлов на каждом прогоне

View file

@ -116,10 +116,7 @@
### 02.08 — шов данных заведён: моки выкидываются одной папкой ### 02.08 — шов данных заведён: моки выкидываются одной папкой
Владелец: **«все моки рано или поздно придётся выкинуть; нужна минимальность моков, Владелец: **«все моки рано или поздно придётся выкинуть; нужна минимальность моков,
минимальная инвазивность в код и изолированность»**. На вопрос «соблюдаешь ли» честный ответ минимальная инвазивность в код и изолированность»**.
был «нет»: правило «данные только через `src/api/`» стояло в плане, а в коде компонент
импортировал фикстуру напрямую — шва не было вовсе. Радиус поражения был мал (один экран),
но образец для S2S7 задавался неправильный.
Заведено: `src/api/` — типы и функции, единственный вход; `src/mock/` — фикстура, которую Заведено: `src/api/` — типы и функции, единственный вход; `src/mock/` — фикстура, которую
видит только `api/`. Правило теперь машинное, а не на совести ревьюера: `no-restricted-imports` видит только `api/`. Правило теперь машинное, а не на совести ревьюера: `no-restricted-imports`
@ -127,9 +124,6 @@
### 02.08 — что дал разбор канона: фронт мокает не тот контракт ### 02.08 — что дал разбор канона: фронт мокает не тот контракт
`docs/README.md` прямо требует читать `research/23` перед любым кодом стыка. Не читал, и это стоило
двух ошибок сразу — формы моков и способа связи.
**D39.85 (`research/23` §0): фронт читает ТОЛЬКО read-модель платформы в Postgres, материализованную **D39.85 (`research/23` §0): фронт читает ТОЛЬКО read-модель платформы в Postgres, материализованную
из NDJSON-потока событий; движок не опрашивается никогда, чтение живого SQLite движка — запрещённый из NDJSON-потока событий; движок не опрашивается никогда, чтение живого SQLite движка — запрещённый
анти-паттерн.** Значит движковые формы (таблица `glossary`, `ChunkExport`) — словарь предметной анти-паттерн.** Значит движковые формы (таблица `glossary`, `ChunkExport`) — словарь предметной
@ -139,35 +133,35 @@
словарю машинных кодов (карта — приложение А компаньона контракта). словарю машинных кодов (карта — приложение А компаньона контракта).
**Ответ на вопрос владельца о способе связи:** NDJSON — это шов ДВИЖОК↔ПЛАТФОРМА (D39.85), а фронту **Ответ на вопрос владельца о способе связи:** NDJSON — это шов ДВИЖОК↔ПЛАТФОРМА (D39.85), а фронту
принадлежит JSON поверх HTTP плюс SSE от платформы (D39.84). Разведено в `FRONTEND_PLAN.md` §0.2, принадлежит JSON поверх HTTP плюс SSE от платформы (D39.84). Разведено в `FRONTEND_PLAN.md` §0.2.
потому что путал их я сам.
**⛔ ПИНГ ОРКЕСТРАТОРА №19 — 23.08, при разморозке зоны (сейчас действий не требует).** **⛔ ПИНГ ОРКЕСТРАТОРА №19 — 23.08, при разморозке зоны (сейчас действий не требует).**
Аудит доков нашёл два расхождения внутри зоны; рукой не лезу, зона заморожена. Аудит доков нашёл два расхождения внутри зоны; рукой не лезу, зона заморожена.
1. **Восемь оставшихся вопросов листа — сверить каждый против D-лога прежде, чем нести владельцу 1. **Семь оставшихся вопросов листа — сверить каждый против D-лога прежде, чем нести владельцу
повторно.** Три из одиннадцати каноном уже отвечены и сняты 02.09: В-3 (D39.176 п.4), В-6 повторно.** Четыре из одиннадцати каноном уже отвечены и с листа сняты: В-3 (D39.176 п.4), В-6
(D39.132 п.2а), В-10 (D39.138 п.2к). (D39.132 п.2а), В-10 (D39.138 п.2к), В-5 «показывать ли ETA» (D39.100 п.1: К-5 закрыт
«показывать», `eta_seconds` — обязательное поле канонической спеки).
2а. **Ключ `prepare` вашего `package.json` — единственный бутстрап РЕПО-ШИРОКОГО гейта доков (дописано 24.08; см. буллет «Гейты стоят и на коммите» в «Текущем состоянии»).** 2а. **Ключ `prepare` вашего `package.json` — единственный бутстрап РЕПО-ШИРОКОГО гейта доков (дописано 24.08; см. буллет «Гейты стоят и на коммите» в «Текущем состоянии»).**
`frontend/scripts/githooks/install.mjs` — единственный в дереве установщик диспетчера `.git/hooks/pre-commit`, а тот `frontend/scripts/githooks/install.mjs` — единственный в дереве установщик диспетчера `.git/hooks/pre-commit`, а тот
судит `CLAUDE.md` и доки трёх зон, не только ваши. Следствие проверено исполнением: на свежем клоне без `npm install` судит `CLAUDE.md` и доки трёх зон, не только ваши. Следствие проверено исполнением: на свежем клоне без `npm install`
гейт молча выключен. Просьба при разморозке: перевести `prepare` на зоно-нейтральный установщик, который заведут в гейт молча выключен. Просьба при разморозке: перевести `prepare` на зоно-нейтральный установщик, который заведут в
`docs/scripts/githooks/`, чтобы единственным писателем диспетчера был он. Сам ваш ФРАГМЕНТ хука менять не надо. `docs/scripts/githooks/`, чтобы единственным писателем диспетчера был он. Сам ваш ФРАГМЕНТ хука менять не надо.
2. **Пространство номеров «В-N» разъехалось** между этим журналом и `docs/research/28-contract-review.md`: 2. **Пространство номеров «В-N» разъехалось** между этим журналом и `docs/research/28-contract-review.md`:
доклад ссылается на В-1/В-2/В-5/В-6/В-7 как на ДРУГИЕ вопросы, чем одноимённые строки здесь. доклад ссылается на В-1/В-2/В-5/В-6/В-7 как на ДРУГИЕ вопросы, чем одноимённые строки здесь
Пока номера двусмысленны, ссылка «см. В-6» указывает в два разных места. (В-5 и В-6 с листа уже сняты, но их номера в докладе живы). Пока номера двусмысленны, ссылка
«см. В-6» указывает в два разных места.
## Открытые вопросы к владельцу ## Открытые вопросы к владельцу
| # | Вопрос | Почему это его вопрос | | # | Вопрос | Почему это его вопрос |
|---|---|---| |---|---|---|
| В-1 | **Данные привязаны к одной машине.** Вся фактура — прогоны, экспорты, банки — лежит в `/home/ubuntu/books/gu-zhenren/` вне git; оба `backend/example/sample-*.db` пустые (только схема); пути стенда зашиты в тесты (`miner_parity_test.go:33-35`, `labelharness_test.go:43`) и в `book.yaml` абсолютными путями. Владелец сказал: «мне не нравится, что это живёт конкретно на моём диске». Лечение — платформа (`platform/README.md`, раздел библиотеки книг: хранение исходников и экспортов); она с тех пор построена и принята (D39.109), поэтому половина вопроса снята фактом — пинг №20 п.3. Фронт от этого не зависит (работает на моках), но **вопрос на движок/платформу, а не на фронт** | скоуп-решение и порядок работ | | В-1 | **Данные привязаны к одной машине.** Вся фактура — прогоны, экспорты, банки — лежит вне внешнего git. ⚠ Грунт строки пере-сверен деревом 02.09 и наполовину протух: книги с 24.08 живут в `<репозиторий>/books` под СВОИМ origin (D39.157 п.2), образцовых БД в `backend/example/` нет вовсе, а жёсткие пути стенда из тестов сняты — они берутся из окружения и тест пропускается при отсутствии (`backend/internal/miner/miner_parity_test.go:37`=`All three stay overridable`). Владелец сказал: «мне не нравится, что это живёт конкретно на моём диске». Лечение — платформа (`platform/README.md`, раздел библиотеки книг: хранение исходников и экспортов); она с тех пор построена и принята (D39.109), поэтому половина вопроса снята фактом — пинг №20 п.3. Фронт от этого не зависит (работает на моках), но **вопрос на движок/платформу, а не на фронт** | скоуп-решение и порядок работ |
| В-8 | **Какое слово о состоянии книги стоит в дереве.** Замечание 23 потребовало бейджу ФИКС-место, и оно сделано; но две метки словаря в него не помещаются и усекаются с тултипом — «остановлена: лимиты» (19 знаков) и ветка неизвестного «неизвестное состояние» (21). Укоротить их сессия НЕ вправе: фраза паузы зарезервирована за владельцем (прежний В-6 снят с листа 02.09 как ЗАКРЫТЫЙ; носитель — `docs/architecture/14-api-contract/README.md:972`=`не различает две беды`, закрыт D39.132 п.2а), и первый заход S3.5 её укоротил и был откачен собственным ревью. Варианты: (а) оставить усечение с тултипом, (б) владелец даёт короткое слово для дерева, а полная фраза остаётся в статус-полосе, (в) расширить колонку бейджа за счёт названия книги | продуктовая формулировка, которую видит пользователь | | В-8 | **Какое слово о состоянии книги стоит в дереве.** Замечание 23 потребовало бейджу ФИКС-место, и оно сделано; но две метки словаря в него не помещаются и усекаются с тултипом — «остановлена: лимиты» (19 знаков) и ветка неизвестного «неизвестное состояние» (21). Укоротить их сессия НЕ вправе: фраза паузы зарезервирована за владельцем (прежний В-6 снят с листа 02.09 как ЗАКРЫТЫЙ; носитель — `docs/architecture/14-api-contract/README.md:972`=`не различает две беды`, закрыт D39.132 п.2а), и первый заход S3.5 её укоротил и был откачен собственным ревью. Варианты: (а) оставить усечение с тултипом, (б) владелец даёт короткое слово для дерева, а полная фраза остаётся в статус-полосе, (в) расширить колонку бейджа за счёт названия книги. ⚠ Сверить с D39.176 п.4 (30.08): фразы, которые видит пользователь, ДЕЛЕГИРОВАНЫ проекту — вопрос к владельцу может сузиться до раскладки (а)/(в) | продуктовая формулировка, которую видит пользователь |
| В-7 | **Физический масштаб интерфейса на мониторе.** Замечание 1 говорит «масштабы великоваты, особенно на 27″ 2K, на 24″ терпимее». Замер при вьюпорте референса расхождения с Fleet не нашёл (§5.5 плана): промежутки, ширины панелей, шаг строки и высота вкладки совпадают. Значит речь про физический размер на конкретном экране, а он зависит от масштабирования ОС, и «просто уменьшить токены» означало бы уехать от референса, который владелец принял. Правильное лекарство — ручка «плотность интерфейса» в настройках (3 ступени), но она требует перевода ВСЕХ размерных токенов в rem и пере-замера, то есть отдельного прохода (Ф-36). Вопрос: нужна ли ручка, и какой масштаб ОС стоит на 27″ 2K — по нему видно, во сколько раз расходится физика | продуктовое решение и цена отдельного пакета | | В-7 | **Физический масштаб интерфейса на мониторе.** Замечание 1 говорит «масштабы великоваты, особенно на 27″ 2K, на 24″ терпимее». Замер при вьюпорте референса расхождения с Fleet не нашёл (§5.5 плана): промежутки, ширины панелей, шаг строки и высота вкладки совпадают. Значит речь про физический размер на конкретном экране, а он зависит от масштабирования ОС, и «просто уменьшить токены» означало бы уехать от референса, который владелец принял. Правильное лекарство — ручка «плотность интерфейса» в настройках (3 ступени), но она требует перевода ВСЕХ размерных токенов в rem и пере-замера, то есть отдельного прохода (Ф-36). Вопрос: нужна ли ручка, и какой масштаб ОС стоит на 27″ 2K — по нему видно, во сколько раз расходится физика | продуктовое решение и цена отдельного пакета |
| В-9 | **Какие языки интерфейса продукт обещает.** Механизм переводимости построен (S3.7, Ф-35): слова интерфейса живут в каталоге `src/i18n/ru.ts`, второй язык — второй файл того же вида плюс строка в `src/i18n/language.ts`, ни один компонент при этом не трогается. Чего фронт сделать не может и не должен: решить, какие языки продукт обещает, и выдумать сами переводы. Пока список из одного значения (`ru`), и каркасный пункт настроек честно говорит «сейчас интерфейс только русский» | продуктовое решение и обещание пользователю | | В-9 | **Какие языки интерфейса продукт обещает.** Механизм переводимости построен (S3.7; устройство и границы — `STACK_DECISIONS.md` §1, числа — строка Ф-35). Чего фронт сделать не может и не должен: решить, какие языки продукт обещает, и выдумать сами переводы. Пока список из одного значения (`ru`), и каркасный пункт настроек честно говорит «сейчас интерфейс только русский» | продуктовое решение и обещание пользователю |
| В-11 | **Фразы отказа книги (PD-173) — на утверждение.** Контракт 0.2.3 несёт машинную причину (`source_unreadable` · `not_configured` · `parser_unavailable`), а слова пишет клиент — их сочинила эта сессия по слову владельца 14.08 и они ждут его «да»: «Файл не удалось разобрать на разделы» / «Проверьте файл — возможно, это не текст книги — и добавьте её заново»; «Сервис пока не готов принять эту книгу» / «Файл здесь ни при чём: повторная загрузка поможет не раньше, чем мы это наладим»; «Не удалось обработать файл на нашей стороне» / «Файл здесь ни при чём: попробуйте добавить книгу позже»; неизвестная причина — «Книгу не удалось принять» / «Причина не названа. Попробуйте добавить книгу заново или позже» | продуктовая формулировка, которую видит пользователь | | В-11 | **Фразы отказа книги (PD-173) — на утверждение.** Машинную причину несёт контракт, слова пишет клиент. ⚠ **Словарь с тех пор сменился, фразы ниже собраны на 0.2.3 и при разморозке пере-собираются:** канон даёт ЧЕТЫРЕ причины — `parser_unavailable` переименован в `processing_failed`, добавлен `content_refused` (`docs/architecture/14-api-contract/openapi.yaml:1492`=`enum: [source_unreadable, not_configured, processing_failed, content_refused]`), а карта «код → фраза» живёт приложением А компаньона. Фразы сочинила сессия S4 по слову владельца 14.08 и они ждут его «да»: «Файл не удалось разобрать на разделы» / «Проверьте файл — возможно, это не текст книги — и добавьте её заново»; «Сервис пока не готов принять эту книгу» / «Файл здесь ни при чём: повторная загрузка поможет не раньше, чем мы это наладим»; «Не удалось обработать файл на нашей стороне» / «Файл здесь ни при чём: попробуйте добавить книгу позже»; неизвестная причина — «Книгу не удалось принять» / «Причина не названа. Попробуйте добавить книгу заново или позже» | продуктовая формулировка, которую видит пользователь |
| В-2 | **Авторское право на текст фикстур.** Витрина использует короткую выдержку из настоящего прогона (蛊真人). Правило проекта уже есть: `eval/.gitignore:4` держит копирайтные тексты вне git. Сейчас взят объём под проверку плотности и не больше; нужно ли убрать совсем и заменить синтетикой — решать владельцу | юридика | | В-2 | **Авторское право на текст фикстур.** Витрина использует короткую выдержку из настоящего прогона (蛊真人). Правило проекта уже есть: `eval/.gitignore:4` держит копирайтные тексты вне git. Сейчас взят объём под проверку плотности и не больше; нужно ли убрать совсем и заменить синтетикой — решать владельцу | юридика |
| В-4 | **Чем подписывать главу в дереве, если заголовок — ровно «Глава N».** Титул движок рендерит детерминистически из шаблона пары (`configs/langpacks/zh-ru/heading.txt`: `template Глава {n}`), а подзаголовок остаётся телом текста и названием НЕ является. На 2284 разделах это дерево из 2284 одинаковых по форме строк. Оставить так, показывать номер иначе или просить у контракта что-то ещё — продуктовое решение. Артефакт §1.4 и К-3 | продуктовая формулировка, которую видит пользователь | | В-4 | **Чем подписывать главу в дереве, если заголовок — ровно «Глава N».** Титул движок рендерит детерминистически из шаблона пары (`configs/langpacks/zh-ru/heading.txt`: `template Глава {n}`), а подзаголовок остаётся телом текста и названием НЕ является. На 2284 разделах это дерево из 2284 одинаковых по форме строк. Оставить так, показывать номер иначе или просить у контракта что-то ещё — продуктовое решение. Артефакт §1.4 и К-3 | продуктовая формулировка, которую видит пользователь |
| В-5 | **Показывать ли оценку времени до конца прогона.** У движка поле есть (`status.go` `eta_seconds`, «secondary: mean fresh-call throughput × remaining»), запретом §4.8 оно не покрыто (это не деньги), но и не запрошено ни одним разделом промта. Решать ДО формы прогресса, иначе поле придётся вводить задним числом в уже нарисованную полосу. Артефакт К-6, резерв строки 54 единого бэклога | продуктовое: обещание срока пользователю |
## Хроника ## Хроника
@ -175,31 +169,27 @@
Панель 5 линз в изолированных копиях (слепой вердикт по заказу+диффу · охота вне карты · пере-ран гейтов · линза истинности спеки против кода платформы · кросс-модельный текст-аудит Opus). Пере-ран: `check` 335/335 · `check:full` EXIT=0 (8 маршрутов, 11 сценариев, axe 0 блокирующих) · spectral/типы/дрейф зелёные · до-пакные 157 ключей и чанк 724130 подтверждены обратным применением диффа байт-в-байт · живые нарушения гейтов — красные. Ратификации и confirm-лист владельцу — D39.135. Панель 5 линз в изолированных копиях (слепой вердикт по заказу+диффу · охота вне карты · пере-ран гейтов · линза истинности спеки против кода платформы · кросс-модельный текст-аудит Opus). Пере-ран: `check` 335/335 · `check:full` EXIT=0 (8 маршрутов, 11 сценариев, axe 0 блокирующих) · spectral/типы/дрейф зелёные · до-пакные 157 ключей и чанк 724130 подтверждены обратным применением диффа байт-в-байт · живые нарушения гейтов — красные. Ратификации и confirm-лист владельцу — D39.135.
**Фикс-лист ФС (носитель состава — эта запись; вход промта S5):** ФС-1 (major, мир intake) прогон над загруженной книгой стартует с `begin(0)` — общий прогресс 0/0 весь прогон, ETA = NaN (лечение: begin суммой units_total глав); путь заказа §4 «книга из формы переводится» в мок-мире добить · ФС-2 showcase: принятый старт прогона не меняет мир — следующее чтение отдаёт прежнее состояние, «Перевести» выглядит как ничего · ФС-3 мир intake: повторный старт переиспользует id прогона — поток не переподписывается, translating вечно (verify_bank тем же кластером: наблюдаемого эффекта в моках нет, awaiting_bank недостижим) · ФС-4 `BookIntake.title` maxLength 200 не держит никто на клиенте (TextField без лимита — собственная спека нарушаема своим клиентом) · ФС-5 докблок `upload.ts` несёт СНЯТОЕ правило «field after file → 400» (неверно для необязательного) · ФС-6 два дока «spectral шестым шагом» (`STACK_DECISIONS.md:116`, `FRONTEND_PLAN.md:124`) — spectral четвёртый из шести · ФС-7 мок считает части формы по ВСЕЙ форме (платформа — до файла) и меряет 413 по file.size (платформа — по всему телу) — мок строже провода · ФС-8 флейк сцены refusals: closeModal не дождался закрытия за 5000 мс (1 из 3 на тихой машине) · ФС-9 `role="status"` оборачивает байтовый прогресс отправки — на живом XHR скринридер зачитывает каждое обновление (в регионе — только смены состояний) · ФС-10 группа из одного раздела подписывается «разделы 201201» · ФС-11 интейк-мир: ПЕРВОЕ нажатие «Перевести» всегда 409 (счётчик; кандидат — маркер) · ФС-12 после-пакные числа Ф-35 слегка отстают от дерева (пересборка: 800293 / 246670 gzip против записанных 800219 / 243446). **Фикс-лист ФС (носитель состава — эта запись; вход промта S5):** ФС-1 (major, мир intake) прогон над загруженной книгой стартует с `begin(0)` — общий прогресс 0/0 весь прогон, ETA = NaN (лечение: begin суммой units_total глав); путь заказа §4 «книга из формы переводится» в мок-мире добить · ФС-2 showcase: принятый старт прогона не меняет мир — следующее чтение отдаёт прежнее состояние, «Перевести» выглядит как ничего · ФС-3 мир intake: повторный старт переиспользует id прогона — поток не переподписывается, translating вечно (verify_bank тем же кластером: наблюдаемого эффекта в моках нет, awaiting_bank недостижим) · ФС-4 `BookIntake.title` maxLength 200 не держит никто на клиенте (TextField без лимита — собственная спека нарушаема своим клиентом) · ФС-5 докблок `upload.ts` несёт СНЯТОЕ правило «field after file → 400» (неверно для необязательного) · ФС-6 ИСПОЛНЕНО 02.09: порядковый номер шага spectral убран из обоих доков (греп `шестым шагом` по зоне пуст; состав шагов сверяется по `package.json`, `STACK_DECISIONS.md` §3) · ФС-7 мок считает части формы по ВСЕЙ форме (платформа — до файла) и меряет 413 по file.size (платформа — по всему телу) — мок строже провода · ФС-8 флейк сцены refusals: closeModal не дождался закрытия за 5000 мс (1 из 3 на тихой машине) · ФС-9 `role="status"` оборачивает байтовый прогресс отправки — на живом XHR скринридер зачитывает каждое обновление (в регионе — только смены состояний) · ФС-10 группа из одного раздела подписывается «разделы 201201» · ФС-11 интейк-мир: ПЕРВОЕ нажатие «Перевести» всегда 409 (счётчик; кандидат — маркер) · ФС-12 после-пакные числа Ф-35 слегка отстают от дерева (пересборка: 800293 / 246670 gzip против записанных 800219 / 243446).
**Поправки к записи S4** (сама запись — в [archive/frontend-PROGRESS-S0-S4.md](archive/frontend-PROGRESS-S0-S4.md); чужой текст не редактирую): «словарь платформы — четыре значения» → в коде ПЯТЬ (пропущен `schema_mismatch`) · «одна из трёх фраз сегодня недостижима» → недостижимы ВСЕ ТРИ: платформа `reject_reason` вообще не проецирует (`v0.go:497` «never projected») — доезжает только ветка неизвестного · §1/§2 записи несут снятое правило PD-172 «поле после файла = 400», которое сама же §9а опровергла (код и спека исправлены, текст записи — нет) · «136 проверок» = 134 (наивный греп ловил 2 строки vite) · «31 строка DOM / 59 618px» — замер S2 04.08, не этого пака · «46 находок → 6 выжило» = 5 различных (одна — дубль) · три поправки к записи S3.7 из заказа §6: разобрана только цена бандла; «дрейф ширин hidden» и «счёт 106 из 119» остались на записи оркестратора 14.08 (носитель там, дефекта сессии нет — фиксирую для полноты). **Поправки к записи S4** (сама запись — в [archive/frontend-PROGRESS-S0-S4.md](archive/frontend-PROGRESS-S0-S4.md); чужой текст не редактирую): «словарь платформы — четыре значения» → в коде ПЯТЬ (пропущен `schema_mismatch`) · «одна из трёх фраз сегодня недостижима» → на 15.08 недостижимы были ВСЕ ТРИ: платформа `reject_reason` не проецировала, доезжала только ветка неизвестного. ⚠ Пере-сверено 02.09: с тех пор проекция ПОСТРОЕНА — пять внутренних причин сводятся к трём проводным (`platform/internal/ingest/vocabulary.go:59`=`func ContractRejectReason`), то есть фразы В-11 стали достижимы и поправка касается только архивной записи · §1/§2 записи несут снятое правило PD-172 «поле после файла = 400», которое сама же §9а опровергла (код и спека исправлены, текст записи — нет) · «136 проверок» = 134 (наивный греп ловил 2 строки vite) · «31 строка DOM / 59 618px» — замер S2 04.08, не этого пака · «46 находок → 6 выжило» = 5 различных (одна — дубль) · три поправки к записи S3.7 из заказа §6: разобрана только цена бандла; «дрейф ширин hidden» и «счёт 106 из 119» остались на записи оркестратора 14.08 (носитель там, дефекта сессии нет — фиксирую для полноты).
*(Запись приёмки S4 с фикс-листом ФС — ВЫШЕ, она живая; всё остальное по S0S4 вынесено в архив, см. шапку.)* *(Запись приёмки S4 с фикс-листом ФС — ВЫШЕ, она живая; всё остальное по S0S4 вынесено в архив, см. шапку.)*
## Пинг оркестратора №17 — 16.08.2026 (зона во фризе; контракт-ревью принято D39.138 — четыре ваших вопроса ОТВЕЧЕНЫ, входы разморозки) ## Пинг оркестратора №17 — 16.08.2026 (зона во фризе; контракт-ревью принято D39.138 — четыре ваших вопроса ОТВЕЧЕНЫ, входы разморозки)
Контракт-ревью API v0 отработало отдельной сессией и ПРИНЯТО (отчёт — `docs/research/28-contract-review.md`; решения владельца — его §8, ратификация D39.138). Заказан ЛОМАЮЩИЙ батч 0.3.0 (строка 183 единого бэклога) — типы перегенерируются после его лендинга; до него нормативной остаётся 0.2.3. ⚠ Читать ОРИГИНАЛ отчёта, не пересказ. По вашим строкам: Контракт-ревью API v0 отработало отдельной сессией и ПРИНЯТО (отчёт — `docs/research/28-contract-review.md`; решения владельца — его §8, ратификация D39.138). Заказан ЛОМАЮЩИЙ батч 0.3.0 (строка 183 единого бэклога) — типы перегенерируются после его лендинга; до него нормативной остаётся 0.2.3. ⚠ Читать ОРИГИНАЛ отчёта, не пересказ. По вашим строкам:
16. **Ф-56 · Ф-57 · Ф-61 · Ф-62 · Ф-43 · К-6 — ответы ревью, и все они с тех пор ВОШЛИ в канон** (батч 0.3.0 и далее до 0.9.0; 20 операций). Пересказ здесь не держу: пять строк несут свой ответ сами — ячейки **Ф-56 · Ф-57 · Ф-61 · Ф-62 · Ф-43** бэклога переписаны по канону, и при разморозке читаются они, а не этот пинг. Своей строки нет только у **К-6** (п.6, §8 п.11): замечания показывать ВСЕ, в тексте сворачивать и раскрывать кнопкой, словарь ступеней заранее НЕ проектировать — зарегистрировать зонной строкой при разморозке. 16. **Ф-56 · Ф-57 · Ф-61 · Ф-62 · Ф-43 — ответы ревью, вошедшие в канон** (0.3.0…0.9.0): ячейки бэклога переписаны по нему, при разморозке читаются они, а не этот пинг. **К-6** (§8 п.11 отчёта): замечания показывать ВСЕ, в тексте сворачивать и раскрывать кнопкой, словарь ступеней заранее НЕ проектировать — хвост зоны Ф-21.
7. **Мок-находки §9 (чинить при разморозке):** отказ интейка триггерится маркером в ИМЕНИ файла (`mock/intake.ts:238`) — переключатель без аналога на сервере; стоп игнорирует `runId` (`mock/handlers.ts:190`); мир `scale`: чтения на ревизии 4102, кадры с 1841 — расходятся по построению (`mock/worlds.ts:136`); в `loading` любой POST уходит МИМО мока в реальную сеть (`handlers.ts:59`); переполнение обхода страниц = статус 0 = неотличимо от «сервер недоступен» (`client.ts:114``Loaded.tsx:65`); мок интейка считает ВСЕ части формы, платформа — только до файла (`intake.ts:212` против `v0.go:337-360`). 7. **Мок-находки §9 (чинить при разморозке):** отказ интейка триггерится маркером в ИМЕНИ файла (`mock/intake.ts:238`) — переключатель без аналога на сервере; стоп игнорирует `runId` (`mock/handlers.ts:190`); мир `scale`: чтения на ревизии 4102, кадры с 1841 — расходятся по построению (`mock/worlds.ts:136`); в `loading` любой POST уходит МИМО мока в реальную сеть (`handlers.ts:59`); переполнение обхода страниц = статус 0 = неотличимо от «сервер недоступен» (`client.ts:114``Loaded.tsx:65`); мок интейка считает ВСЕ части формы, платформа — только до файла (`intake.ts:212` против `v0.go:337-360`).
8. **Перф-входы S5 (§5б/Б-11а):** снять `refetchOnWindowFocus` для тяжёлых коллекций (замер: самый частый трафик порождает переключение вкладок, не пайплайн — 12 вкладок = 562 КБ на фокус) и поднять `staleTime` после появления ETag/304 у платформы; ErrorBoundary в зоне нет ни одного (Б-0: TypeError рендера при смене словаря волн) — завести при разморозке; 401 сегодня тупик без ссылки на вход (§4 №27) — зонная строка. Вопросы — через владельца. 8. **Перф-входы S5 (§5б/Б-11а):** снять `refetchOnWindowFocus` для тяжёлых коллекций (замер: самый частый трафик порождает переключение вкладок, не пайплайн — 12 вкладок = 562 КБ на фокус) и поднять `staleTime` после появления ETag/304 у платформы; ErrorBoundary в зоне нет ни одного (Б-0: TypeError рендера при смене словаря волн) — завести при разморозке; 401 сегодня тупик без ссылки на вход (§4 №27) — зонная строка. Вопросы — через владельца.
**Аддендум к пингу №17 (16.08, свип планировочных доков D39.139):** (1) Три носителя зоны учат ПОФАЗНОМУ прогрессу «draft N/M ∥ edit N/M» — `FRONTEND_SESSION_PROMPT.md` §9 п.1, `FRONTEND_PLAN.md` §6 п.1, `STACK_DECISIONS.md` §8 п.1; батч 0.3.0 ЗАЛЕНДЕН, и это устарело (Б-0/D39.138: на проводе ОДИН счётчик до ближайшей остановки, знаменатель — купленный объём) — при разморозке обновить все три, не только код. (2) `STACK_DECISIONS.md` §8 протух целиком: все четыре пункта «достроить в движке» ПОСТРОЕНЫ (пофазные счётчики и манифест — D39.122; JSON таблицы подписи — был `bank-stop.json` (D39.122), СНЕСЁН вместе с писателем D39.158, см. пинг №22; TM_TRACE_ID — P6/D39.132). (3) Диспозиции строк: **Ф-59**В-10 закрыт владельцем 16.08 «вежливость» (D39.138 п.2к: всё правильно, цена названа — строку закрыть); **Ф-37**К-10 отвечен «НЕ строить» (поправка приёмки ревью: фазы уходят с провода и у главы — пометка черновика остаётся книжной, хвост пере-диспозиционировать); **Ф-39** — закрыта ещё словом владельца 15.08 (D39.136 п.4б: полей BankTerm не заводить, sense хватает; его калибровка — строка 178 единого). Вопросы — через владельца. **Дописка к пингу №17 (16.08):** гейт на утечку конвейера в провод — «на проводе нет имён стадий/волн и движковых словарей», машинный тест по образцу `generality.test.ts` — назначен вашей зоне (D39.138 п.2а; спек-сессия батча запишет правило в компаньон контракта). Строить при первом касании зоны вместе с синком зеркала и перегенерацией типов.
**Дописка к аддендуму (16.08):** гейт на утечку конвейера в провод — «на проводе нет имён стадий/волн и движковых словарей», машинный тест по образцу `generality.test.ts` — назначен вашей зоне (D39.138 п.2а; спек-сессия батча запишет правило в компаньон контракта). Строить при первом касании зоны вместе с синком зеркала и перегенерацией типов.
**Пинг оркестратора №17 — 16.08 (модель подписи банка, слово владельца; читать ПЕРЕД S5):** модель целиком — **D39.144** (подписывается ВЕСЬ банк одним ОК; пер-термная масс-подпись сотен строк НЕ строится; 409-гейт полноты убран из канона, `pending_decisions`/`complete` информационные). Зоне отсюда два следствия. Строки Ф-44/Ф-45/Ф-46 при разморозке читать через эту модель: «действие подписи» = один ОК + опциональные точечные правки, НЕ проход по строкам. ⚠ Экранов под пост-ридинговые правки банка («поправить/добавить термин → пере-генерация по вхождениям») НЕ строить до отдельного слова: механика не спроектирована нигде, полигон работает над точечным редактором (D39.144 п.1). Вопросы — через владельца. **Пинг оркестратора №17 — 16.08 (модель подписи банка, слово владельца; читать ПЕРЕД S5):** модель целиком — **D39.144** (подписывается ВЕСЬ банк одним ОК; пер-термная масс-подпись сотен строк НЕ строится; 409-гейт полноты убран из канона, `pending_decisions`/`complete` информационные). Зоне отсюда два следствия. Строки Ф-44/Ф-45/Ф-46 при разморозке читать через эту модель: «действие подписи» = один ОК + опциональные точечные правки, НЕ проход по строкам. ⚠ Экранов под пост-ридинговые правки банка («поправить/добавить термин → пере-генерация по вхождениям») НЕ строить до отдельного слова: механика не спроектирована нигде, полигон работает над точечным редактором (D39.144 п.1). Вопросы — через владельца.
**Дописка к пингам №17 (16.08, по аудиту готовности зоны — ЧЕТЫРЕ нормы зоны сменили знак, читать ДО всего остального):** (1) **Ваше зеркало `docs/api-contract/` остаётся на 0.2.3 РАТИФИЦИРОВАННО** (D39.142 п.5, на время фриза) — «зеркало = байт-копия» временно НЕ действует, нормативен только канон `docs/architecture/14-api-contract/` (сегодня 0.9.0 — пинг №20 п.4); синк + перегенерация типов = первое касание зоны. (2) **Запрет клиентской метки «Глава {n}» СНЯТ каноном 0.3.0** — клиент теперь ОБЯЗАН сам рисовать порядковый в локали интерфейса, когда `heading`/`number` = null (строка Ф-30 и снятый пинг №16 «на экране ничего не менять» устарели; движковая строка 160 остаётся про НАСТОЯЩИЕ названия). (3) **Ф-31/В-6 закрыты D39.132 п.2а** (`null` на проводе ратифицирован; кадр `EventCeiling`, на который они опирались, снят каноном 0.3.0 целиком) — исполнено 02.09. (4) **В-11 (фразы) пере-собрать на словарь 0.3.0**: карта «код → фраза» — приложение А компаньона; `parser_unavailable` переименован в `processing_failed`, добавлен `content_refused`. Плюс: **дев-стенд платформы СУЩЕСТВУЕТ с P6** (`tmplatformctl seed` + дев-вход, D39.132) — Ф-29 (снос моков) и Ф-18 (вес бандла) читать через него; статус зоны: ФРИЗ (D39.136 п.2; ⚠ условие «снятие = лендинг P7» отменено пингом №18 от 17.08 — разморозка отдельным словом владельца). Вопросы — через владельца.
**Пинг оркестратора №18 — 17.08.2026: ФРИЗ ПРОДЛЁН, разморозка отвязана от P7 (слово владельца, D39.147).** Прежнее условие «разморозка = лендинг P7 + гейт S5» БОЛЬШЕ НЕ ДЕЙСТВУЕТ: владелец 17.08 сказал морозить зону дальше — сначала движок и платформа доводятся до состояния «работают и отдают результат», и только потом фронт накручивается на готовую функциональность. Практически: **лендинг P7 зону не размораживает, промт S5 не выдаётся**, разморозка — отдельным словом владельца. Всё, что было записано как первое касание зоны (синк зеркала контракта 0.3.0 · перегенерация типов · моки · гейт утечки конвейера · фикс-лист ФС-1..12 · Ф-63/Ф-28 · пере-сборка фраз В-11 по словарю кодов), НЕ отменено — оно ждёт разморозки, а не P7. Направление, которое стоит знать заранее: моки при разморозке уступают реальному источнику — дев-стенд платформы существует с P6 (`tmplatformctl seed` + дев-вход), а форму «держать моки на уровне бэкендов или отдельно» владелец назвал направлением, но механику проектировать пока не просил. Живой smoke против дев-стенда остаётся легитимным и во фризе. Вопросы — через владельца. **Пинг оркестратора №18 — 17.08.2026: ФРИЗ ПРОДЛЁН, разморозка отвязана от P7 (слово владельца, D39.147).** Прежнее условие «разморозка = лендинг P7 + гейт S5» БОЛЬШЕ НЕ ДЕЙСТВУЕТ: владелец 17.08 сказал морозить зону дальше — сначала движок и платформа доводятся до состояния «работают и отдают результат», и только потом фронт накручивается на готовую функциональность. Практически: **лендинг P7 зону не размораживает, промт S5 не выдаётся**, разморозка — отдельным словом владельца. Всё, что было записано как первое касание зоны (синк зеркала контракта 0.3.0 · перегенерация типов · моки · гейт утечки конвейера · фикс-лист ФС-1..12 · Ф-63/Ф-28 · пере-сборка фраз В-11 по словарю кодов), НЕ отменено — оно ждёт разморозки, а не P7. Направление, которое стоит знать заранее: моки при разморозке уступают реальному источнику — дев-стенд платформы существует с P6 (`tmplatformctl seed` + дев-вход), а форму «держать моки на уровне бэкендов или отдельно» владелец назвал направлением, но механику проектировать пока не просил. Живой smoke против дев-стенда остаётся легитимным и во фризе. Вопросы — через владельца.
**Пинг оркестратора №18 (второй) — 20.08.2026: фриз в силе, но зоне прилетели ДВЕ вещи из лендинга P7 и одно предложение по норме.** **Пинг оркестратора №18 (второй) — 20.08.2026: фриз в силе, но зоне прилетели ДВЕ вещи из лендинга P7 и одно предложение по норме.**
1. **Контракт API — канон 0.4.0 РАТИФИЦИРОВАН** (D39.152). Зеркало зоны отстаёт ратифицированно и остаётся на 0.2.3 до разморозки; при первом касании — синк зеркала БАЙТ-В-БАЙТ (`cmp`) и перегенерация типов, как и было в перечне. Ломающее против 0.3.0: обязательное `Run.stop_requested` (плюс три поведенческих расхождения, тела — D39.152 п.5). Что это даёт экрану: кнопка «стоп» перестаёт врать — прогон помнит, что его просили остановить, и переживает перезагрузку страницы, поэтому «остановлено — работа на подписи банка, продолжить дёшево» рисуется по признаку, а не по догадке. И `resume` теперь отвечает двумя РАЗНЫМИ причинами: «прогон закончен, купите новый» против «пополните счёт» — фразы В-3 по словарю кодов пишутся уже под это. 1. **Контракт API — зеркало зоны синкается ОДНОЙ перегенерацией на ТЕКУЩИЙ канон** (пинг №20 п.4), а не по минорам; тела ломающих правок лежат в своих нотах (0.4.0 — D39.152 п.5). Что из них видно ЭКРАНУ: `Run.stop_requested` обязателен — прогон помнит, что его просили остановить, и переживает перезагрузку, поэтому «остановлено — работа на подписи банка, продолжить дёшево» рисуется по признаку, а не по догадке; `resume` отвечает двумя РАЗНЫМИ причинами — «прогон закончен, купите новый» против «пополните счёт» (фразы — В-11 по словарю кодов, приложение А компаньона).
2. **Читающая поверхность ПОСТРОЕНА и заленджена** (P7, D39.153): главы, юниты, замечания, проекция банка, поток событий SSE, модель ошибок с машинным `code`, условные чтения и сжатие, `Idempotency-Key`, `structure_version`. То есть триггер Ф-29 («полный снос `frontend/src/mock/`») по данным наступил — но РАЗМОРОЗКА ОТДЕЛЬНЫМ СЛОВОМ владельца, пинг №18 от 17.08 в силе, S5 не выдаётся. ⚠ Живой дев-стенд платформы существует и работает — при разморозке моки уступают ему, а не наоборот. 2. **Читающая поверхность ПОСТРОЕНА и заленджена** (P7, D39.153): главы, юниты, замечания, проекция банка, поток событий SSE, модель ошибок с машинным `code`, условные чтения и сжатие, `Idempotency-Key`, `structure_version`. То есть триггер Ф-29 («полный снос `frontend/src/mock/`») по данным наступил — но РАЗМОРОЗКА ОТДЕЛЬНЫМ СЛОВОМ владельца, пинг №18 от 17.08 в силе, S5 не выдаётся. ⚠ Живой дев-стенд платформы существует и работает — при разморозке моки уступают ему, а не наоборот.
3. **Предложение по норме pre-commit хука (владелец не отвечал, поэтому это ПРЕДЛОЖЕНИЕ, а не решение).** В док-фрагмент хука 17.08 внесена строка «жалобы на хук — писать ВЛАДЕЛЬЦУ, а не тихо деградировать на воркэраунд или хак» (D39.148). Во фронтовом фрагменте хука такой строки нет. Смысл нормы: сессия, которой гейт мешает, обязана эскалировать, а не обходить — тихий обход выглядит как зелёный прогон и не виден ничем. Внести при первом касании зоны, если владелец не скажет иначе. ⚠ Записано здесь потому, что обязательство к ЧУЖОЙ зоне, живущее только в моей прозе, гейтами не видно по построению — поймано ревьюером полноты выгрузки на лендинге P7. 3. **Предложение по норме pre-commit хука (владелец не отвечал, поэтому это ПРЕДЛОЖЕНИЕ, а не решение).** В док-фрагмент хука 17.08 внесена строка «жалобы на хук — писать ВЛАДЕЛЬЦУ, а не тихо деградировать на воркэраунд или хак» (D39.148). Во фронтовом фрагменте хука такой строки нет. Смысл нормы: сессия, которой гейт мешает, обязана эскалировать, а не обходить — тихий обход выглядит как зелёный прогон и не виден ничем. Внести при первом касании зоны, если владелец не скажет иначе. ⚠ Записано здесь потому, что обязательство к ЧУЖОЙ зоне, живущее только в моей прозе, гейтами не видно по построению — поймано ревьюером полноты выгрузки на лендинге P7.
@ -207,57 +197,16 @@
## Записи оркестратора ## Записи оркестратора
### Правка оркестратора №22 — 01.09.2026 (ревизия доков, батч Б0 «канон 0.9.0») ### Правки доков ИЗВНЕ зоны — 0102.09.2026 (прямая санкция владельца 01.09 на документацию всех зон)
**Оркестратор правил ДВА файла вашей зоны** — по прямой санкции владельца 01.09 на документацию **Правила НЕ фронт-сессия:** ревизия оркестратора №22 (01.09) и проходы реза доков (02.09)
всех зон: `frontend/README.md` (дописана ⚠-оговорка к буллету о байт-зеркале) и шапку этого журнала трогали `frontend/README.md` и `frontend/docs/*.md`. Зона остаётся ЗАМОРОЖЕННОЙ (D39.147), нового
(«канон 0.8.0 … шесть миноров» → **0.9.0, СЕМЬ**; перечень первого касания планировался на неверное заказа здесь нет. Находки ревизии — реестр `docs/DOC_REVISION_FINDINGS.md`.
число перегенераций). Кода зоны, зеркала `api-contract/openapi.yaml`, `src/api/schema.ts` и
`src/mock/handlers.ts` не трогал. Числа проверены его исполнением: канон
`docs/architecture/14-api-contract/openapi.yaml` = `0.9.0`, зеркало = `0.2.3`, операций 20 против 16,
миноров между ними семь (0.3.0…0.9.0). Находки ревизии — реестр `docs/DOC_REVISION_FINDINGS.md`.
### Пинг оркестратора №22 — 02.09.2026 (ревизия доков, находка N018) **Не тронуто ни одним проходом:** `frontend/src/**` (код зоны), `frontend/docs/api-contract/**`
(зеркало 0.2.3 — ратифицированное отставание, D39.142 п.5), `frontend/docs/API_CONTRACT_INPUT.md`
(⚠ его строки НЕ сдвигать — причина в дописке к пингу №18-второму) и `frontend/docs/archive/**`.
**`.bank-stop.json` БОЛЬШЕ НЕ СУЩЕСТВУЕТ**, а ваш живой док описывал его как существующий. **Факт, купленный проверкой исполнением:** носители В-3/К-6 в докладе
`docs/research/28-contract-review.md`**§6 и §8**, а НЕ §5 (§5 это «Предложение состава батча
Файл снесён вместе с писателем и четырьмя тестами при постройке входной двери шва (**D39.158**). 0.3.0» и материала вопроса не несёт). Наряд дофикса указывал §5; ссылки в журнале стоят на §6/§8.
Проверено моей командой: `grep -rc 'bank-stop.json' backend/ --include='*.go'`**ни одного вхождения**;
холодный прогон 31.08 подтвердил это на диске. Свой носитель (`docs/PROGRESS.md`, строка 157) я поправил.
**Ваш носитель ПОЧИЩЕН 02.09** чисткой этого журнала: ни пинг №17, ни аддендум к нему больше не
называют `.bank-stop.json` живым сайдкаром. Остаток первого касания — строка Ф-43 бэклога: она
протухла обеими половинами (пинг №20 п.2).
**Что править НЕ надо** (проверено, это законная история в прошедшем времени, а не дрейф):
`docs/architecture/18-bank-ontology.md`, `backend/docs/SEAM_FIX3_PLAN.md`,
`backend/docs/SEAM_PACK_FINDINGS.md` — там файл назван как УРОК о снесённом механизме.
Кода не трогаю; правка за зоной.
### Дофикс реза доков — 02.09.2026 (агент-исполнитель, зона фронта тронута ИЗВНЕ)
⚠ **Правил не фронт-сессия, а агент дофикса пакета `bd2077b..HEAD`, по прямой санкции владельца
01.09 на документацию всех зон.** Зона остаётся ЗАМОРОЖЕННОЙ (D39.147); нового реза здесь нет —
только возврат снятого и починка того, что рез сломал.
**Тронуто (четыре файла, только доки):**
- `frontend-PROGRESS.md` — (а) возвращена реплика владельца **«всё на диске лежит, и главы, и банки
памяти»** с первой фразой разбора бэкенда (раздел «02.08 — данные: моки берут форму от движка»);
перечень форм не пересказан, дан адрес каноном; (б) висячая ссылка «(В-6)» в строке В-8 переведена
на живой носитель `К-13`; (в) пинг №20 п.1 получил носители снятой строки В-3.
- `FRONTEND_PLAN.md` — мёртвый указатель «держится в §1.1 промта как отменённый» (блок «ОТВЕРГНУТО»
§5.1): в промте таблицы поверхностей уже нет, теперь так и написано.
- `FRONTEND_SESSION_PROMPT.md` — заголовок §1.1 больше не обещает «брать эти значения» над
предупреждением «таблицы нет / все три отменены»; плюс адрес токенов вместо снятых «тон 243°,
насыщенность 0.76» и «тон 350°».
- `API_CONTRACT_DRAFT.md` — «Исходное тело — в истории git этого файла» заменено адресом канона:
git АДРЕСОМ не является.
**НЕ тронуто:** `frontend/src/**` (код зоны), `frontend/docs/api-contract/**` (зеркало 0.2.3 —
ратифицированное отставание, D39.142 п.5), `BACKLOG.md`, `API_CONTRACT_INPUT.md`,
`STACK_DECISIONS.md`, `frontend/docs/archive/**`.
**Отступление от наряда, объявляю:** наряд просил указать носителем В-3 раздел §5 доклада
`docs/research/28-contract-review.md`. Проверено командой — §5 это «Предложение состава батча 0.3.0»
и материала В-3/К-6 не несёт; настоящие носители — §6 и §8 того же доклада, они и вписаны.