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