112 lines
12 KiB
Markdown
112 lines
12 KiB
Markdown
# Журнал зоны «Фронт»
|
||
|
||
> Зонный журнал: сессии фронта пишут сюда сами, работают независимо, в `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-формой с явным списком путей.
|