From 105dd6da088491fc5ec24eadfe2eda241b139205 Mon Sep 17 00:00:00 2001 From: heaven Date: Fri, 14 Aug 2026 03:45:36 +0300 Subject: [PATCH] Archive frontend S3.5 and S3.7 prompts and the polygon tenant-panel prompt with outcome banners under docs/archive/prompts --- .../FRONTEND_S35_SESSION_PROMPT_2026-08-09.md | 245 ++++++++++++++++++ .../FRONTEND_S37_SESSION_PROMPT_2026-08-10.md | 241 +++++++++++++++++ ...TENANT_PANEL_SESSION_PROMPT_2026-08-08.md} | 6 + 3 files changed, 492 insertions(+) create mode 100644 docs/archive/prompts/FRONTEND_S35_SESSION_PROMPT_2026-08-09.md create mode 100644 docs/archive/prompts/FRONTEND_S37_SESSION_PROMPT_2026-08-10.md rename docs/{POLYGON_TENANT_PANEL_SESSION_PROMPT.md => archive/prompts/POLYGON_TENANT_PANEL_SESSION_PROMPT_2026-08-08.md} (97%) diff --git a/docs/archive/prompts/FRONTEND_S35_SESSION_PROMPT_2026-08-09.md b/docs/archive/prompts/FRONTEND_S35_SESSION_PROMPT_2026-08-09.md new file mode 100644 index 00000000..cf33688f --- /dev/null +++ b/docs/archive/prompts/FRONTEND_S35_SESSION_PROMPT_2026-08-09.md @@ -0,0 +1,245 @@ +> ⚠⚠ **ПРОМТ ОТРАБОТАН — исторический, НЕ задание.** Исполнен шестой фронт-сессией (S3.5, 09–10.08), +> **ПРИНЯТ и заленден вместе с S3.6 (D39.127, `57e6bd1`)**: 24 замечания владельца закрыты, оболочка +> перерисована по референсам. Живое состояние зоны — `frontend-PROGRESS.md`; хвосты — `BACKLOG.md`. + +# Промт: фронт-сессия S3.5 — фикс-пак оболочки (гейт S4) + +Ты — фронтенд-сессия TextMachine, шестая по счёту. Зона записи — **только `frontend/`**; сессия +НЕ коммитит — дерево готовит и передаёт на лендинг оркестратору. Протокол зоны — стоящий промт +`FRONTEND_SESSION_PROMPT.md` §«Зона и git», он в силе целиком; итоги, пинги и вопросы владельцу — +ТОЛЬКО зонный журнал `frontend-PROGRESS.md` (в `docs/PROGRESS.md` фронт не пишет). В дереве живут +незакоммиченные файлы ДРУГИХ зон (полигон: `eval/*`, `docs/experiments/22*|23*`) — не трогать +и не «прибирать». + +> Промт написан оркестратором №16 (09.08.2026) из **24 замечаний владельца**, снятых с живого +> прогона витрины. Замечания пронумерованы номерами владельца — **(1)…(24)**, номера локальны +> этому промту (как Q-номера паков). В отчёте пройтись по ВСЕМ 24: сделано (кадр ДО/ПОСЛЕ) / +> диспозиция с обоснованием / вопрос В-строкой. Молча пропустить номер нельзя. + +## Зачем эта сессия (рамка) + +Владельцу НЕ нравится текущее качество оболочки, и **S4 гейчен до её починки** (D39.119 п.4). +Скоуп S3.5 зафиксирован там же: **вкладки по VS Code-модели + Ф-19 + полный список владельца** — +список ниже и есть. Это фикс-пак ОБОЛОЧКИ И ВИТРИНЫ: настоящие экраны S4–S7 (загрузка книги, +механизм подписи банка, содержимое настроек, экспорт) НЕ строить. Общее замечание владельца, +рамка всего пака: модель до сих пор «не понимает связанность между элементами, их визуальную +ценность и не видит картину целиком» — каждый пункт чинить не изолированной заплаткой, +а глядя на весь экран. + +## Обязательное чтение до кода (порядок) + +1. `FRONTEND_SESSION_PROMPT.md` — стоящий промт: сценарий, жёсткие ограничения, зона и git. +2. Шапка `frontend-PROGRESS.md` + `BACKLOG.md` — пак прямо касается Ф-7, Ф-11, Ф-19, Ф-20, Ф-21, + Ф-30, Ф-32; их диспозиции не переизобретать. +3. `FRONTEND_PLAN.md` §5 — гейты, замеры, скриншот-цикл (что уже стоит и как расширять). +4. Референсы `frontend/references/`: **fleet.png — главный** (пропорции, зазоры, верхняя полоса, + статус-полоса) · **antigravity_add_folder.png** — модал добавления (свежий, докинут владельцем + 09.08) · antigravity_chat.png · antigravity_main.png. +5. `docs/product-requirements.md` — продуктовые требования (из реестра, не из памяти). +6. Контракт: зонная копия `frontend/docs/api-contract/openapi.yaml` — формы данных берутся оттуда. + +## Инструментальная рамка (обязательна) + +- **Скриншот-цикл стоит и остаётся законом:** `npm run shot`, «смотреть на снимок — обязательная + часть цикла» (`scripts/shot.mjs` шапка). Для этого пака статики МАЛО: половина замечаний — про + ИНТЕРАКЦИЮ (клики по вкладкам, драг ручки, модалы, ховеры). Playwright уже в зависимостях + (`playwright` 1.62.1) — писать сценарии интеракций (клик → кадр → проверка состояния) и гонять + их частью самопроверки; долгоживущие — в `scripts/`, replayable, не в /tmp. Вердикт «сделано» + без кадра ДО/ПОСЛЕ не принимается. +- **Сверка с референсом:** `npm run shot --size 1280x764` — вьюпорт fleet.png для прямого + наложения. Замечание (1) дополнительно требует кадра **2560×1440** — владелец смотрит + на 27" 2K, и дефолтные масштабы не понравились именно там. +- Если в окружении установлен плагин **frontend-design** (официальный Anthropic) — он активируется + на фронт-задачах сам; его гайды по типографике/палитре применять, но пины `STACK_DECISIONS.md` + и токен-гейты (одно место для цвета и размера) первичны. +- **Мандат самопроверки:** ревью ИСПОЛНЕНИЕМ своего кода и своих кадров + адверсариальное ревью + диффа (author≠reviewer) в конце — как в S2/S3. `npm run check` и `npm run check:full` зелёные + на сдаче; гейт доступности axe зелёный (⚠ при смене фонов пересчитывать контраст — Ф-11 уже + на пороге WCAG). + +## Замечания владельца + +### Вкладки — модель VS Code (2, 3; сюда же Ф-19) + +**(2) Спам вкладками.** Любой клик по главе плодит вкладку по центру. Сделать ровно модель +VS Code для текстовых файлов: +- одиночный клик по главе → **preview-вкладка** (одна на панель, заголовок курсивом); +- одиночный клик по другой главе **замещает содержимое** preview-вкладки — новая не создаётся; +- **пин** (превращение в постоянную): двойной клик по главе, двойной клик по самой вкладке, + либо содержательное взаимодействие с открытым содержимым (в VS Code — правка; что считать + содержательным у нас — реши и запиши в отчёт; простая прокрутка пинить не должна); +- закрытие — как сейчас (крестик/Delete, Ф-17 в силе). + +**Ф-19 чинится здесь же:** переключение вкладки размонтирует панель и теряет прокрутку +(`react-aria-components` не рендерит невыбранную TabPanel), пересборка 2284 узлов стоит +70–140 мс. Строка откладывала лекарство «до решения об устройстве оболочки» — это решение +принимается СЕЙЧАС, под задачу: keep-alive панелей или запоминание офсета на вкладку — выбрать +по замеру и записать почему. + +Приёмка playwright-сценарием: пять одиночных кликов по разным главам → в ряду ровно ОДНА +preview-вкладка; двойной клик → пин, следующий одиночный клик открывает НОВУЮ preview рядом; +на `/scale` прокрутка дерева до 9000 → уход на другую вкладку → возврат → офсет жив. + +**(3) Вид вкладок.** Слишком мелкие, «не отделимы для глаза», слиты с панелью. Вписать вкладки +в панель аккуратнее: активная читается мгновенно (фон/подчёрк/контраст), высота и отступы — +по референсу, а не меньше. Это не «скопировать Fleet ещё точнее», а передать аккуратнее — см. (14). + +### Геометрия, масштабы, зазоры (1, 5) + +**(1) Дефолтные масштабы великоваты**, особенно на 27" 2K (на 24" терпимее). Ориентир — пропорции +fleet.png ОТНОСИТЕЛЬНО кадра: доли панелей, высоты строк дерева/списков, плотность элементов +внутри панелей («элементы как будто не тот масштаб имеют»). Работать ЗАМЕРОМ — наложение кадра +1280×764 на референс, измеренные доли/пиксели в `FRONTEND_PLAN.md` §5, — не на глаз. Все размеры +через `tokens.css` (токен-гейт Ф-4 стоит и обязателен). + +**(5) Выравнивание панелей, зазоров и статус-полосы.** «Особенно заметно по тексту снизу» — +нижняя статус-полоса: базовые линии, вертикальные центры, отступы от краёв — сверить с Fleet +попиксельно; у них аккуратнее. + +### Кнопки, иконки, настройки (4, 17, 19, 11) + +**(4) Две кнопки поиска, делают одно и то же, лупа в непонятном месте.** У Fleet роли РАЗНЫЕ: +вкладка «Search» в левой панели — полнотекстовый поиск по проекту; лупа в правом верхнем углу — +глобальная палитра «Goto / Search everywhere». Развести роли осмысленно для читалки (поиск по +книге ≠ быстрый переход к главе/термину) либо оставить одну кнопку; кнопка без действия +запрещена (норма Ф-7/Ф-16). + +**(17) Иконки «шакальные»** — особенно тогглы левой/правой панели. Разобраться с причиной, +а не перерисовать вслепую: размер сетки иконки vs размер отрисовки, выравнивание на пиксельную +сетку, толщина штриха на тёмном фоне, `shape-rendering`. Туда же — «текст рендерится странновато, +особенно внизу»: проверить сглаживание, вес и размер шрифта статус-полосы (дробные px после +масштабирования дают мыло). Показать кадрами ДО/ПОСЛЕ с зумом. + +**(19)+(11) Настройки.** Шестерёнку — в правый верхний угол (как у Fleet), из нижней части +убрать. Открываются НЕ вкладкой — **модальным окном поверх оболочки** (по примеру Claude Code / +ChatGPT). Внутри — честный каркас разделов без содержимого (содержимое — S7), включая два +будущих пункта из (15): светлая тема, язык интерфейса. + +### Драг панелей (18; сюда же половина 14) + +**(18а) Баг:** фиолетовая полоска ресайза ЗАЛИПАЕТ после отпускания драга. **(18б) Форма:** +полоску сделать тонкой и вписанной ВНУТРИ гепа между окнами — она не должна перекрывать чёрный +геп (владелец: «чёрный фон между окнами не трогать, он идеален» — (14)). + +Референс-реализация по слову владельца — проект vojo, скопировать ПОДХОД оттуда: +- `/home/ubuntu/projects/vojo/src/app/components/page/style.css.ts:11-70` — ручка: невидимая + зона захвата 7px поверх зазора; индикатор — пилюля 2×36px по центру, `opacity: 0` в покое, + ховер 0.25, драг — подсветка акцентом и рост до 48px; на упоре min сплющивается, на упоре + max вытягивается («лимит чувствуется тактильно»); переходы 140ms. +- `/home/ubuntu/projects/vojo/src/app/components/page/Page.tsx:191-300` — механика: pointer + capture на ручке; живая ширина в состоянии компонента, персист одним махом на pointerup + (не на каждый move); cleanup-эффект снимает `cursor`/`user-select` с body при unmount + посреди драга — ЭТО и есть лекарство от залипания (Alt-Tab, смена маршрута, pointerup мимо). +- Правый край — та же схема в `ThreadDrawer.tsx:209-241`. + +Копируется подход, не файл: у vojo vanilla-extract и folds, у нас токены и CSS-модули. + +### Читалка (9, 10, 24) + +**(9) Оригинал/перевод разделить мягко визуально.** Сейчас колонки различимы слабо. Очень +деликатно: фон на полтона, тонкий разделитель, отступ — один приём, не три сразу. (Приглушение +колонки оригинала — отдельный хвост Ф-7 на S6, здесь не решать, но не противоречить.) + +**(10) Серо-синяя линия вдоль текста** — владелец не смог её прочитать. Это полоска ЗАМЕЧАНИЯ +(`src/ui/Callout.tsx:13`, `Callout.module.css`: синяя `attention` / серая `glance` — выноска +по образцу antigravity_chat). Непрочитываемость подтверждает Ф-21 живым владельцем: смысл +различается только цветом. Переделать так, чтобы значение читалось без объяснения — связью +с замечанием (иконка/счётчик у блока, ховер подсвечивает пару «полоска ↔ текст замечания»), +НО продуктовое слово ступени не выдумывать — словарь на владельце (В-3/Ф-21). + +**(24) Пометка черновика.** Пока глава переводится/черновая — мягкая пометка (иконка/ворнинг +с тултипом): «черновой вариант, может быть перегенерирован» — чтобы человек не пугался смены +названий и числа глав (research/27: пере-нарезка легальна). Форму брать из данных контракта +(статусы главы/прогона по спеке); поля не выдумывать — класс ошибки «фикстура выдумала форму» +уже ловился четырежды (Ф-14). + +### Вкладка «Замечания» (8) + +Владелец: непонятно зачем — всё рисуется в тексте, статусы есть в дереве; «лишнее. Если хочешь +защитить этот дизайн — обоснуй». Два легальных исхода: (а) снять вкладку; (б) защитить — +обоснованием И кадром сценария, который без неё не живёт (кандидат: сводный список по книге, +Ф-32 — пер-книжное чтение замечаний уже есть в памяти клиента). Решение — диспозицией в отчёте, +финальное слово — владельцу. + +### Банк памяти (7, 13, 20) + +**(7)+(13) Представление банка перепридумать.** Текущее «прям совсем не годится: не +репрезентативно, непонятно, нечитаемо». Больше информации на термин и читаемо для верификации: +оригинал · перевод · тип · род/пол · описание/обоснование · варианты · статус решения · откуда +термин (глава появления); сведения, раскрывающие БУДУЩИЕ события книги, — под спойлер. Поля +брать из контракта (`BankEntry`: `type`/`sense`/`since_ch`/`source`, трёхзначный статус); чего +в контракте нет (пол/род? варианты? спойлер-граница?) — не выдумывать в фикстуре молча, +а ПРЕДЛОЖИТЬ черновиком правки спеки с пометкой «предложено» (право и обязанность зоны — +D39.99 п.4; ратифицирует оркестратор). + +**(20) «Подписать банк» и «подписано 10 из 60» непонятны:** что подписываем — банк или термины? +зачем счётчик? кнопка открывает вкладку-заглушку. Механизм подписи = S5, здесь НЕ строить. +В S3.5 — честная витрина: непонятные кнопки-заглушки снять (кнопка без действия запрещена) +либо заменить читаемым состоянием («ждут решения: 50»), формулировки — по словарю подписи +контракта (auto/draft/approved), без выдуманных глаголов. + +### Библиотека и метаданные (6, 12, 21, 22, 23) + +**(6) «О книге» — метаданных больше, но подходы охранять.** Вытащить больше информации о книге, +при этом НИЧЕГО, что раскрывает принципы/логику работы бэкенда: деньги на экран не выносим +(§4.8 стоящего промта), модели/routing/внутренности пайплайна закрыты разрешающим списком +контракта — это осознанная защита подходов, не пробел. Легально из контракта: язык пары, объём, +главы/юниты, прогресс пофазно, статус, даты, замечания счётчиком. + +**(12) Добавление книги — модальным окном**, по antigravity_add_folder.png (сейчас зачем-то +открывается новая вкладка): модал «добавить книгу» → выбор файла/папки → **поле названия: +автор вводит руками ЛИБО скипает — тогда название даёт авто-парсер** (различать эти два +источника) → слоты будущих пер-книжных настроек (каркасом). Сам аплоад (`POST /books`, +multipart, прогресс) строит S4 — здесь модал, его форма и мок-поведение. + +**(21) Цветной статус книги — на ИКОНКЕ книги**, не точкой рядом с надписью. + +**(23) Наложение системных надписей на название книги/главы** («готово», «нужна подпись» +перекрывают текст) — «исполнение кривое и некрасивое», сама идея бейджа не отвергнута. +Переделать: бейдж/иконка НЕ поверх названия (справа в ряд, отдельным слоем с гарантией +непересечения — эллипсис названию, фикс-место бейджу). + +**(22) — вопрос владельца, ответ вписан оркестратором, сессии тут делать нечего:** «где +генерится оригинал названия главы?» Сейчас — фикстуры мока (`src/mock/book.ts:87-131`, +`src/mock/scale.ts:49-51`). В реальном пайплайне заголовок ПЕРЕВОДА движок рендерит +детерминистически из шаблона пары (`configs/langpacks/zh-ru/heading.txt`: «Глава {n}») и вклеивает +в финальный текст первого юнита, а исходный маркер остаётся телом оригинала; метка в дереве +по контракту — из ДАННЫХ (`heading`/`number`, К-3); чем подписывать главу без заголовка — +открытый В-4 на владельце (Ф-30). + +### Цвет и тема (14, 15, 16) + +**(14) «Слишком точная копия Fleet».** Подразбить цветовую схему чуть оригинальнее — акценты, +выделения, второстепенные поверхности; **чёрный фон между окнами НЕ трогать** («он идеален»). +Это доводка индивидуальности, не редизайн. + +**(16) Фон главных окон «серо-неприятный».** Изучить (websearch) рекомендации по тёмным фонам, +приятным глазу: не чистый нейтральный серый — слегка тонированные тёмные (тёплый или холодный +подтон), не абсолютно чёрное полотно под текстом, контраст текста не на максимум. Предложить +2–3 варианта КАДРАМИ, выбрать лучший, показать владельцу оставшиеся как альтернативы. Токены — +в `tokens.css`; контраст пересчитать (Ф-11 у порога; axe-гейт остаётся зелёным). + +**(15) Светлой темы нет, выбора языка интерфейса нет.** Оба живут в настройках (каркас — п. (11)). +Строить в S3.5 только если дёшево поверх токенов (палитра уже одно место — оценить честно); +иначе — ЧЕСТНАЯ диспозиция: цена, план, строки Ф-N в `BACKLOG.md`. Молчание нелегально. + +## Что НЕ делать + +- Не строить экраны S4–S7: загрузка книги, механизм подписи банка, содержимое настроек, экспорт. +- Не править канон контракта; правки спеки — черновиком «предложено», ратифицирует оркестратор. +- Не трогать чужие зоны и чужие незакоммиченные файлы (полигон жив). +- Продуктовые слова не выдумывать: ступень замечания (В-3), фраза паузы (В-6), подпись главы + без заголовка (В-4) — на владельце. +- Тесты и гейты не подгонять под зелень (D39.121): красный гейт — вопрос оркестратору + через журнал, не правка гейта. +- Никакого `git add -A`/`git commit` — дерево передаётся на лендинг как есть. + +## Отчёт и приёмка + +- Таблица по всем 24 номерам: номер → что сделано → кадр/замер (ДО/ПОСЛЕ) → либо диспозиция / + В-строка. Прогон по номерам — в зонный журнал `frontend-PROGRESS.md`, хвосты — `BACKLOG.md` + строками Ф-N, вопросы владельцу — В-строками. +- `npm run check` и `npm run check:full` зелёные; кадры в `.shots/`; наложение 1280×764 + на fleet.png и кадр 2560×1440 — приложены. +- Адверсариальное ревью диффа (author≠reviewer) исполнено, находки с диспозициями — в отчёт. +- Промт S4 не писать — его выдаёт оркестратор после приёмки этого пака. diff --git a/docs/archive/prompts/FRONTEND_S37_SESSION_PROMPT_2026-08-10.md b/docs/archive/prompts/FRONTEND_S37_SESSION_PROMPT_2026-08-10.md new file mode 100644 index 00000000..f3026fa6 --- /dev/null +++ b/docs/archive/prompts/FRONTEND_S37_SESSION_PROMPT_2026-08-10.md @@ -0,0 +1,241 @@ +> ⚠⚠ **ПРОМТ ОТРАБОТАН — исторический, НЕ задание.** Исполнен восьмой фронт-сессией (S3.7, 10–12.08), +> **ПРИНЯТ и заленден D39.129** (`3e465bd` + доукомплектация `b3405ff`): контракт **0.2.2** в каноне +> (Ф-47 sense-required), i18n-механизм построен (задача 9, ПТ-36), комментарии кода переведены на +> английский; спорная находка 8.1 разрешена браузерным замером в пользу сессии. Живое состояние +> зоны — `frontend-PROGRESS.md`; находки приёмки S3.7 — вход S4-промта. + +# Промт: фронт-сессия S3.7 — долги слоя данных и мелкие хвосты (до S4) + +Ты — фронтенд-сессия TextMachine, восьмая по счёту. Зона записи — **только `frontend/`**; сессия +НЕ коммитит — дерево готовит и передаёт на лендинг оркестратору. Протокол зоны — стоящий промт +`FRONTEND_SESSION_PROMPT.md` §«Зона и git», он в силе целиком; итоги, пинги и вопросы владельцу — +ТОЛЬКО зонный журнал `frontend-PROGRESS.md` (в `docs/PROGRESS.md` фронт не пишет). В дереве живут +незакоммиченные файлы ДРУГИХ зон (полигон: `eval/*`, `docs/*`) — не трогать и не «прибирать»; +у полигона прямо сейчас идёт ЖИВОЙ платный прогон — ничего в `eval/` и `~/books/` не запускать, +не читать замки, не убивать процессы. + +> Промт написан оркестратором (10.08.2026) по приёмке S3.6. Контекст холодному исполнителю: +> оболочка и витрина построены сессиями S0–S3.6 и приняты владельцем (три круга замечаний); +> слой данных стоит с S3 — `src/api/` разговаривает настоящим HTTP через MSW-мок сети, +> живой поток идёт по SSE (`src/showcase/useRunStream.ts`), чтения — TanStack Query +> (`src/api/queries.ts`), контракт — зонная копия `frontend/docs/api-contract/openapi.yaml` +> (0.2.1), типы генерятся из неё. Эта сессия НЕ строит новых экранов: она закрывает названный +> техдолг слоя данных (Ф-49…Ф-51), одну ратифицированную правку контракта (Ф-47), +> интернационализацию строк интерфейса (Ф-35: словарь + гейт, без хардкода русского) +> и мелкие хвосты. S4 стартует после неё отдельным промтом. +> По всем задачам — прогон в отчёте; +> **молча пропустить задачу нельзя**: сделано / диспозиция с обоснованием / вопрос В-строкой. + +## Обязательное чтение до кода (порядок) + +1. `FRONTEND_SESSION_PROMPT.md` — стоящий промт: зона, git, жёсткие ограничения. +2. `frontend-PROGRESS.md`: шапка «Текущее состояние», затем **приёмочная запись оркестратора + 10.08 (первая в хронике)** — в записи S3.6 есть число-дрейф против финального дерева, + и поправки перечислены именно там; затем сама запись S3.6 (⚠ её разделы 12–15 стоят + в ОБРАТНОМ порядке после §11). `BACKLOG.md` строки Ф-40, Ф-47, Ф-49, Ф-50, Ф-51 — + формулировки не переизобретать, но и не принимать на веру: КАЖДУЮ проверить по коду + до правки. +3. Контракт: зонная копия `frontend/docs/api-contract/openapi.yaml` — §`Unit`, + `EventEnvelope`, `Revision`, `resync_required`, `BankTerm`; поведение ревизий и правило + `>= R` — норматив. +4. `FRONTEND_PLAN.md` §5 — гейты и замеры: что уже стоит и как расширять. + +## Задачи + +### 1. Ф-49 — текст открытой главы не подписан ни на один сигнал изменения + +`keys.units` не инвалидируется нигде: `useRunStream.ts` по кадрам инвалидирует notes/bank/book, +кадр `chapter` патчит лишь СПИСОК глав, а открытые главы живут на keep-alive вкладках и не размонтируются — +читатель, не уводивший фокус из окна, нового текста не увидит вообще. Контракт прямо предписывает +обратное (`openapi.yaml`, `Unit`: «the live "something changed" signal arrives as an event; the +text arrives with a read after the boundary»). + +Сделать: инвалидация чтений юнитов открытой главы на кадре `chapter` этой главы И на смене +`status` книги (границы стадий — за всю черновую волну кадр `chapter` может не прийти ни разу, +пока К-10 открыт). Безопасная сторона: лишняя инвалидация дешевле невидимого текста, но +НЕ инвалидировать все главы на каждый кадр — скоуп по ключу главы из кадра. + +### 2. Ф-50 — кадр потока, пришедший до появления чтения в кэше, теряется молча + +`useRunStream.ts`: обработчики делают `list === undefined ? list : {...}` — в пустой кэш кадр +не пишется, а `acceptFrame` уже сдвинул отметку ревизии; `freshest(undefined, next)` затем +принимает снимок, сделанный ДО кадра. Окно — старт экрана и resync. Рядом второе того же класса: +многостраничное чтение штампует «рваный» список ревизией ПОСЛЕДНЕЙ страницы (`queries.ts`), +хотя контракт предупреждает, что ревизия движется во время пагинации. + +Сделать: кадр, не нашедший кэша, обязан оставить след — либо инвалидация ключа, либо отметка +ревизии не сдвигается до успешной записи; для пагинации — ревизия списка не выше МИНИМАЛЬНОЙ +из страниц либо перечитывание при сдвиге ревизии между страницами. Выбор решения обосновать +в журнале ЗАМЕРОМ/тестом, не рассуждением. + +### 3. Ф-51 — `resync` сбрасывает один гард из двух + +На `resync_required` зовётся `invalidateQueries()` без ключа: данные сохраняются, гард +`dropStaleReads` продолжает сравнивать новый снапшот со СТАРОЙ отметкой — а по контракту resync +выдаётся именно после полной замены, где монотонность ревизии не обещана. Вторым слоем: вызов +без ключа бьёт по чужим скоупам (библиотека, usage, run-options, другие книги). + +Сделать: `resetQueries`/`removeQueries` по скоупу КНИГИ + сброс отметок ревизий этой книги +(стриминговая сторона уже сбрасывает — довести симметрию до кэша). Чужие скоупы не трогать. + +### 4. Ф-47 — правка контракта: `sense` становится обязательным (РАТИФИЦИРОВАНО) + +Решение оркестратора (автор контракта), исполняется этой сессией в зонной копии: +`BankTerm.sense` — в `required`; пустая строка = «различителя нет». Дифф в канон +`docs/architecture/14-api-contract/` переносит оркестратор при лендинге — канон сам не трогать. + +Сделать: правка `frontend/docs/api-contract/openapi.yaml` (в `required` + описание правила пустого), +бамп `info.version` 0.2.1 → 0.2.2, `npm run contract` зелёный, `npm run contract:types` — +перегенерить `src/api/schema.ts`, убрать костыли `?? ''` по `sense` (проверить грепом ВСЕ места, +не по счёту из строки бэклога — он там завышен), фикстуры мока привести (каждый терм несёт +`sense`, хотя бы пустой строкой). + +### 5. Ф-40 — общий модуль стилей поля ввода + +`src/ui/TextField.module.css` и `src/ui/FilterField.module.css` держат байт-одинаковые `.input`, +`::placeholder`, `:focus`; отличие — цвет границы в покое. Роли примитивов разные, сливать +примитивы нельзя — общий CSS-модуль поля на оба, отличия остаются у ролей. + +### 6. Ф-25 — свод языка комментариев (конвенция владельца 04.08) + +Комментарии S1/S2 в ~40 файлах (`api/index.ts`, `showcase/*`, `ui/*`, `tokens/*`, `scripts/*`) +остались русскими; приёмка нашла русские комментарии и в **~14 НОВЫХ файлах S3.6** (например, +`src/showcase/About.tsx`) — вопреки конвенции и уточнению владельца по ходу самой S3.6. +Перевести на английский ОДНИМ механическим проходом, покрыв ОБА множества. Граница жёсткая: +переводятся комментарии, имена тестов и служебные строки; **UI-текст и фикстурная проза остаются +русскими — это продукт, а не код.** Смыслы не менять; комментарий, который при переводе оказался +враньём против кода, — чинить по коду и назвать в журнале. + +### 7. Сторожа на то, что мерилось руками + +Из таблицы долгов S3.6: зум 125/150/200% и узкая панель замерены руками, сторожа нет. Дёшево +и без новых механизмов: в существующие сценарии добавить прогон одной-двух ключевых проверок +на втором вьюпорте/зуме (выбор — по замеру, что реально ловит регресс раскладки). Если дёшево +не выходит — честная диспозиция в журнале, не молчание. + +Отдельно: референс fleet_2.png, на котором стоит палитра S3.6 и категория `toned` в +`src/tokens/tokens.test.ts`, докинут владельцем в `frontend/references/` при приёмке 10.08 +(быструю пиксельную пробу якорей оркестратор сделал — совпало; запись в журнале). Прогнать +полный `measure.py` по палитре и вкладкам, записать числа в `FRONTEND_PLAN.md` §5 — замер +становится воспроизводимым; ⚠ PIL для `measure.py` не запинен (см. 8.5) — решается тем же +пунктом. + +### 8. Находки приёмки S3.6 (закрыть здесь же) + +Приёмочное ревью оркестратора (12 агентов: шесть линз + скептики-верификаторы, author≠reviewer) +подтвердило 12 находок. Ниже те, что закрывает эта сессия; каждая грунтована `file:line` — +проверяй по коду, не по списку (строки могли съехать). + +**8.1 (HIGH) Замер ширин таблицы банка молча проваливается в скрытой keep-alive вкладке +и не повторяется при показе.** `src/ui/Table.tsx:232` — зависимости эффекта замера +`[frame, named, sample, marks, hasRows]` не знают о видимости вкладки; под +`content-visibility: hidden` (`src/ui/Tabs.module.css`) геометрия нулевая, `read()` не набирает столбцов, +10 кадров ретрая и молчаливый `return`. Сценарий: открыть книгу, уйти с вкладки «Банк» ДО прихода +`/bank`, вернуться — столбцы падают в `1fr` без потолков (ровно «баг 4» владельца, объявленный +починенным). Лечение выбрать по замеру (триггер на возврат видимости: +`contentvisibilityautostatechange` / ResizeObserver / зависимость от выбранной вкладки); +приёмка — playwright-сценарий, воспроизводящий уход-возврат, и падающий на до-фиксном коде тест. + +**8.2 Вторичный текст и индикаторы теряют контраст на новом синем `--color-selected`.** +Выбранная строка дерева — ПОСТОЯННОЕ состояние (открытый раздел всегда выбран), а содержимое +не перекрашивается: на #1c4478 лежат текст 12px #9b9b9b (3.52:1 при пороге 4.5), иконка #707070 +(1.98:1), дорожка прогресса #262626 (1.55:1) — `src/ui/Tree.module.css:46` красит только фон, +`src/showcase/Library.module.css` содержимое не трогает. Починить пары на selected-фоне, не уезжая от +референса; axe этого НЕ ловит (non-text не проверяет, выбранную строку со счётчиком не видел) — +добавить сторож в сцену. + +**8.3 Путь из «Замечаний» не загарден: `open` по id, отсутствующему в `chapters`.** +`src/showcase/Showcase.tsx:186` + `src/showcase/Notes.tsx:53-54` — строка сводки с определённым, но отсутствующим id +рисуется кликабельной; `Tabs` контролируемый (авто-фолбэка react-stately на первую вкладку НЕТ), +итог — пустой центр без empty-состояния. Гардить как Library-путь (`positionOf`), сироту +помечать и в строке сводки (сейчас `data-orphan` только при `chapter_id === undefined`). + +**8.4 Съёмка нестабильна — два источника гонки, лечить оба.** +(а) `src/showcase/useScreenshotFlag.ts:22` — на первом рендере `useIsFetching() === 0` и экран +объявляется `ready` ДО старта первого запроса (нотификация батчится в отдельную задачу); гейт +`scripts/shot.mjs` ждёт ровно `dataset.screen`. (б) Поймано исполнением на приёмке: axe стартует во время 220мс-анимации +карточки ожидания — один прогон `npm run shot` напечатал «контраст: 4 узла» на `/loading`, +два повторных — ноль. Стабилизировать цикл: убрать транзиент `ready`, дожидаться устаканивания +анимаций до прогона axe. + +**8.5 Минорные — одним проходом** (правки на строки, не механизмы): +- `src/ui/Table.tsx:257` — кэш канвас-замера не инвалидируется, если шрифт так и не загрузился + (отравление ширинами fallback); +- `src/showcase/Document.tsx:33` — пин вкладки срабатывает на ЛЮБОЙ `mouseup` при непустом + глобальном выделении (правый клик, выделение в соседней панели); +- `src/showcase/Showcase.tsx:59` — `awaiting()` на tracked-результатах + `useIsFetching` даёт + полный ре-рендер экрана на каждом префетче; чинить ТОЛЬКО с замером до/после, иначе не трогать; +- `src/api/vocabulary.ts:112` — `termStatus.label` («предложен»/«черновик»/«подписан») не + рендерится ни одним экраном: снять либо применить; продуктовые слова не выдумывать; +- `src/tokens/tokens.css:27` — в комментарии `--color-text-muted` число 3.9:1, фактически 3.58:1; + `tokens.css:33` — `--color-note` 2.98:1 на панели при пороге 3:1 для non-text (добрать); + `tokens.css:68` — комментарий `--row-height-term` ссылается на удалённый двухстрочный список; +- `src/showcase/Status.module.css:8` — `.paused`/`.offline` стали no-op (цвет совпал с базой): + вернуть отличие либо снять классы; +- `src/ui/Button.module.css:36` — подпись disabled-кнопки ТЕКСТОМ `--color-text-muted` против + контракта токена «non-text only» (WCAG disabled освобождает — противоречие контракту токена, + привести одно к другому); +- `scripts/scenes.mjs:170` — сторож обрезки вкладок молча зеленеет, если заголовок вкладки + перестанет быть `span`; +- `scripts/measure.py:13` — PIL нигде не запинен: манифест окружения для `scripts/` либо честная + шапка «чем ставить». + +**8.6 Доки зоны — привести к коду** (правится СВОЁ; записи журнала S3.6 не переписывать — +поправки к ним уже аннотированы приёмочной записью оркестратора в журнале): +- `FRONTEND_PLAN.md` §5.6 описывает СНЯТУЮ модель вкладок (вырез в хроме) как текущую — в коде + пилюля по fleet.png (возврат разделом 13 записи S3.6); §4 говорит «сценариев пять» — их семь; +- `frontend/README.md` — вписать S3.6 (и эту сессию) в карту сессий; +- `BACKLOG.md` Ф-47 — «`?? ''` в трёх местах» завышено: вхождение одно + (`src/showcase/Bank.tsx:166`); поправить при закрытии строки. + +### 9. Ф-35 — строки интерфейса без хардкода: словарь + гейт + +Сегодня ~90 русских литералов живут прямо в разметке (Ф-35); локаль примитивов уже сведена +в одно место (`src/ui/Locale.tsx`, `interfaceLocale`). Сделать интерфейс переводимым +МЕХАНИЗМОМ, не переводом: + +- все строки интерфейса уезжают в КАТАЛОГ сообщений, механизм — ОТРАСЛЕВОЙ i18n-инструмент, + не самописная поделка: компонент берёт строку по ключу, локаль = данные, новый язык + добавляется файлом перевода без захода в компоненты. Кандидатов сравнить и выбор обосновать + в журнале (у react-aria уже есть свой слой `@internationalized/string`; react-intl / lingui — + альтернативы); новая зависимость — с точным пином и записью в `STACK_DECISIONS.md` §3, + как того требует политика пинов; цену бандла замерить; +- **гейт против нового хардкода:** кириллический литерал в JSX/разметке = ошибка линта + (исключения — модуль словаря и фикстуры); гейт проверить ЖИВЫМ нарушением, как Ф-4/Ф-9; +- хранилище выбора языка подключить к словарю; каркасный пункт настроек «язык интерфейса» + уже есть — честное состояние «сейчас интерфейс только русский» остаётся, пока локаль + содержимого одна (ru); +- границы прежние: фикстурная проза (тексты мок-книг, названия глав, термины банка) — ДАННЫЕ, + не интерфейс, в словарь не уезжает; продуктовый список языков — решение владельца (если + нужен ответ сейчас — В-строкой); переводы строк на другие языки НЕ выдумывать. + +Приёмка: гейт ловит подсунутый литерал (показать нарушением); кадры семи маршрутов +не изменились — это переезд строк, не перевод. + +## Что НЕ делать + +- Не строить экраны S4–S7 (загрузка книги, механизм подписи, содержимое настроек, экспорт). +- Не трогать канон контракта `docs/architecture/14-api-contract/` — только зонную копию (задача 4). +- Поля банка из черновика S3.5/S3.6 (`note`, `gender`, `contexts`…) НЕ заводить ни в спеку, + ни в фикстуры — черновик ждёт ратификации (граница ПТ-33 — на владельце). +- Продуктовые слова не выдумывать: В-3 (ступень замечания), В-4 (глава без заголовка), + В-6 (фраза паузы), В-8 (слово состояния в дереве) — на владельце. +- Тесты и гейты не подгонять под зелень (D39.121): красный гейт — вопрос оркестратору + через журнал, не правка гейта. +- Никакого `git add`/`git commit` — дерево передаётся на лендинг как есть. +- Ф-48: если по ходу покажется, что пора вернуть ресайз столбцов — НЕ возвращать; строка + требует свежего замера от новой базы, это не задача пака. + +## Отчёт и приёмка + +- Каждая задача 1–3: ТЕСТ, падающий на до-фиксном коде (vitest поверх MSW; поток мокается + событиями), и зелёный после; в журнал — что именно ловит тест и как воспроизводился дефект. +- `npm run check` и `npm run check:full` зелёные на сдаче; счётчик тестов вырос, ни одна + существующая проверка не ослаблена. +- **Мандат самопроверки:** ревью ИСПОЛНЕНИЕМ своего кода, своих кадров и своих сценариев + + адверсариальное ревью диффа (author≠reviewer) в конце; находки с диспозициями — в журнал. +- Прогон по всем задачам таблицей в `frontend-PROGRESS.md`: задача → что сделано → тест/замер → + либо диспозиция. Хвосты — строками Ф-N в `BACKLOG.md` (Ф-49/50/51/40/47 закрыть или + переформулировать честно; Ф-35 и Ф-25 закрываются в своей код-половине, продуктовая половина + Ф-35 «какие языки» остаётся на владельце), вопросы владельцу — В-строками. +- Промт S4 не писать — его выдаёт оркестратор после приёмки этого пака. diff --git a/docs/POLYGON_TENANT_PANEL_SESSION_PROMPT.md b/docs/archive/prompts/POLYGON_TENANT_PANEL_SESSION_PROMPT_2026-08-08.md similarity index 97% rename from docs/POLYGON_TENANT_PANEL_SESSION_PROMPT.md rename to docs/archive/prompts/POLYGON_TENANT_PANEL_SESSION_PROMPT_2026-08-08.md index adbe25d2..6da6ae33 100644 --- a/docs/POLYGON_TENANT_PANEL_SESSION_PROMPT.md +++ b/docs/archive/prompts/POLYGON_TENANT_PANEL_SESSION_PROMPT_2026-08-08.md @@ -1,3 +1,9 @@ +> ⚠⚠ **ПРОМТ ОТРАБОТАН — исторический, НЕ задание.** Эксп-22 исполнен и закрыт 09.08 (отчёт +> `docs/experiments/22-tenant-panel.md`, харнесс `eval/tenant_panel/`), дерево залендено приёмкой +> оркестратора №16 10.08 с ревью-шапками. **Выводы НЕ ратифицированы** — владелец 10.08 признал +> постановку неполной; вместе с эксп-23 заморожены до фазы Д (`POLYGON_EXP2223_REDO_SESSION_PROMPT.md`). +> Строка 149 единого бэклога закрывается при ратификации фазы Д. + # Промт: ПОЛИГОН — эксп-22 «панель жильцов: черновик-слот и редакторы» Санкция владельца 08.08 (параллельный оркестратор, D39.117). Зона: `eval/` (весь каталог — твоя зона; новый код — в `eval/tenant_panel/`, точечные починки списка Ф0.3 — в `eval/role_topology/`; риг НЕ пере-изобретать — absjudge/battery/касса переиспользуются) + `docs/experiments/22-tenant-panel.md` + пинг в PROGRESS «Полигон» (только append своей секции, CURRENT-STATE не касаться). «Строка N» ниже = строка ЕДИНОГО БЭКЛОГА `docs/PROGRESS.md`; «§0.1» = канон общности `docs/architecture/12-go-style-notes.md`.