# Журнал зоны «Фронт» > Зонный журнал: сессии фронта пишут сюда сами, работают независимо, в `docs/PROGRESS.md` > оркестратора не пишут (решение владельца 02.08). Хвосты — `BACKLOG.md`, план и замеры — > `FRONTEND_PLAN.md`, ратифицированные пины — `STACK_DECISIONS.md`. > Сверху — текущее состояние, ниже — хроника по сессиям. ## Текущее состояние - **Пройдено:** S0 (план) и S1 (инструменты, скриншот-цикл, `tokens.css`, витрина). - **Дальше:** S2 — оболочка трёх панелей и слой `src/ui/`. - **Ждёт владельца:** решений нет, все вопросы закрыты (см. хронику 02.08). - **Ждёт движка:** ничего до S4. Затем — манифест глав и пофазный прогресс (строки 99–100 единого бэклога), к S5 — машиночитаемая таблица подписи банка (строка 101). - `npm run check` зелёный (5 шагов, 27 тестов), `npm run check:full` зелёный. ## Решения владельца по продукту Записываю здесь, потому что они меняют раскладку из §2 промта, а промт правит не фронт-сессия. ### 02.08 — раскладка: банк памяти переезжает в правую панель Владелец, глядя на витрину: **«банк памяти перенёс бы в правую вкладку, чтоб можно было параллельно вертикально смотреть и оригинал, и главу, и банк памяти, а не горизонтально»**. Плюс три дефекта структуры в той же реплике: две кнопки настроек, банк продублирован (вкладка слева + отдельная карточка внизу), окно главы слишком мало. Что из этого следует и сделано: | Было | Стало | Почему | |---|---|---| | Настройки в верхней полосе И внизу левой панели | только внизу левой панели | промт §3.12: настройки — отдельный раздел из низа левой панели, второй вход лишний | | Банк во вкладке слева И карточкой в центре снизу | одна вкладка в правой панели | одна вещь — одно место; слева осталась только навигация | | Центр разрезан на две карточки | одна панель во всю высоту | нижняя карточка была скопирована с терминала Fleet и не несла задачи | | Кнопки сворачивания трёх панелей | двух | кнопка есть у той панели, которая существует | **Вертикальный параллелизм — суть решения:** рабочий цикл читателя это «читаю перевод → спотыкаюсь о термин → проверяю его в банке». Все три вещи обязаны быть видны одновременно, поэтому колонки: навигация · оригинал+перевод · справочное о читаемой главе. Правая панель становится панелью контекста, и её вкладки — `О книге · Замечания · Банк`. **Что при этом надо развести (иначе §3.5 ломается):** у банка две разные работы. Справочная — «что это за термин», ей хватает 320px правой панели. Подписная — сотни терминов подряд, клавиатура важнее мыши, массовые действия — в 320px не помещается. Поэтому подписной экран открывается **вкладкой в центре**, как документ, а правая панель ведёт в него действием «Подписать банк». В витрине эта связка показана. ### 02.08 — данные: моки берут форму от движка Владелец: **«всё на диске лежит, и главы, и банки памяти»**. Разбор бэкенда подтвердил: моя первая фикстура выдумывала поля (`kind: 'имя'`, `state: 'подписан'`), а промт прямо запрещает изобретать API. Формы переписаны по настоящим: - банк — таблица `glossary` (`backend/internal/store/migrate.go:176`): `src · dst · type · sense · status · source · since_ch/until_ch`. Типы: `name|term|title|place|org|nickname|fullname`, статусы подписи ровно три: `auto|draft|approved`, провенанс `seed|ruby|auto|mined`; - пары — `ChunkExport` из `tmctl export --pairs` (`backend/internal/pipeline/export.go:25`): `chapter · chunk_idx · disposition · flag_reason · detail · final_text · source`; - причины замечаний — enum из `backend/internal/pipeline/disposition.go:56-104`. **Следствие для интерфейса, которое из этого выросло:** движок говорит своим языком — `sanitizer_stripped`, «CJK leak in the ru output: 第一节». Промт §4.1 запрещает показывать это пользователю. Значит между движком и экраном обязан стоять **слой перевода вердиктов в продуктовые понятия**, и он заведён одной картой в данных: причина → человеческая фраза; поле `detail` не показывается никогда. Это же ПТ-33 реестра требований. ## Открытые вопросы к владельцу | # | Вопрос | Почему это его вопрос | |---|---|---| | В-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:20-29`: библиотека книг, хранение исходников и экспортов), но платформы ещё нет ни строки. Фронт от этого не зависит (работает на моках), но **вопрос на движок/платформу, а не на фронт** | скоуп-решение и порядок работ | | В-2 | **Авторское право на текст фикстур.** Витрина использует короткую выдержку из настоящего прогона (蛊真人). Правило проекта уже есть: `eval/.gitignore:4` держит копирайтные тексты вне git. Сейчас взят объём под проверку плотности и не больше; нужно ли убрать совсем и заменить синтетикой — решать владельцу | юридика | ## Хроника ### 02.08 — сессия S0+S1 (первая фронт-сессия) **Заленжено:** `e9a6bb2` план S0 · `b98afb5` весь код S1 · `d8437d6` закрытие дыр после ревью. **Построено:** каркас Vite 8.2.0 + React 19.2.8 + TS 6.0.3 точными пинами (22 из 23 совпали с latest на 02.08; TS 6 при latest 7.0.2 — намеренно, у TS 7 нет программного API); `npm run check` из пяти шагов; скриншот-цикл на Playwright без sudo, с локальными системными библиотеками и шрифтом CJK в `.tooling/`; `tokens.css` по замерам референса; витрина. **Поправка к замерам промта §1.1:** роль `#353739` там смешана. В кадре это разные вещи — вкладка открытого документа залита `#142f4c`, вкладка панели `#27292b`, а `#353739` лежит только под строкой дерева и клавишами-чипами. В токенах роли разведены. **Сведение с референсом:** промежутки, верхний край панелей, радиус, шаг строки 26px, подложка выделения 24px и нижняя полоса сошлись с `fleet.png` до пикселя (перемерено тем же кодом). Расхождения названы в `FRONTEND_PLAN.md` §5.2, вид принят владельцем. **Адверсариальное агентское ревью диффа** (6 ревьюеров по дименсиям + по 2 опровергателя на находку; 30 находок, 18 выживших). Пять дефектов были в самих гейтах — то есть в главной поставке S1 — и соло-самопроверка их не видела: голое `/* stylelint-disable */` снимало гейт цвета молча; опечатка в имени токена не ловилась ничем; `shot.mjs` проглатывал первый маршрут; запрет инлайнового стиля ловил 3 формы из 11; `check` был зелёным при warning. Всё починено и перепроверено живыми нарушениями, перечень форм — `FRONTEND_PLAN.md` §5.4. **Урок, вписанный в §5.4:** формулировка «проверено живым нарушением» без перечня форм — ловушка. Она звучит как машинная гарантия, а покрывает ровно те входы, которые придумал автор. **Ф-8 закрыт технически, решение владельца не потребовалось.** Вопрос был «запрещать ли `/* eslint-disable */` в TSX». Отраслевая практика — не бинарный `noInlineConfig`, а `@eslint-community/eslint-plugin-eslint-comments` 4.7.2: `no-unlimited-disable` требует называть правило, `require-description` — писать причину, `disable-enable-pair` — закрывать область. Легитимное точечное подавление `react-hooks/exhaustive-deps` с причиной проходит, голое отключение падает тремя ошибками. Симметрично `reportUnscopedDisables` на стороне CSS. **Git-инцидент:** два первых коммита (`e9a6bb2`, `b98afb5`) сделаны голым `git commit` и унесли застейдженные файлы оркестратора. Содержимое цело, потеряна атрибуция; историю не переписывали. Норма ратифицирована владельцем как D39.88 — коммит только pathspec-формой с явным списком путей.