Версия 3.0 · 08.09.2026 · один автор и владелец документа — исполняющий агент; заказчик решений — владелец продукта.
Заменяет FIGMA_PARITY_SPEC.md v2.5 как порядок работы и критерии приёмки. Раздел 6 старой спеки (описания экранов) остаётся справочником, но подчинён ноде: где проза и нода расходятся, верна нода (см. К-1).
Документ живой: меняется после каждой фазы, каждое изменение — запись в разделе 12. Замороженная спека хуже отсутствующей: ей верят.
Ты обязан абсолютно строго и со всей важностью подойти к этому вопросу. Тебе строго запрещается доверять такую работу агентам, субагентам или выполнять её через код. Ты обязан проверять всё руками: буквально брать каждый экран нашего приложения, смотреть его каждое состояние и сверять его с Figma. Задачу нельзя сужать до чего-то меньшего — выполнять в полном объёме. Всегда сам себя перепроверять. Задавать себе множество вопросов «как, почему, зачем, откуда, для чего» и идти выяснять ответы. Время и токены не ограничены. Важен результат, и результат должен быть абсолютным: в точности как в Figma.
Всё ниже — развёртка этого мандата в проверяемые правила.
Правила К-1…К-12 действуют на каждом шаге каждой фазы. Каждое сопровождается причиной (почему оно есть) и способом проверки (как узнать, что оно соблюдено). Нарушение любого — задача не закрыта, независимо от результата.
Правило. Единственный источник размеров, координат, цветов, текстов, порядка слоёв, видимости и вариантов — дерево ноды в файле .fig. Иерархия доказательств, по убыванию:
1. дерево ноды из .fig (/root/figma/podushe-2026-09-08.fig);
2. настоящий рендер кадра из Figma (docs/figma/export/screens/, docs/figma/reference/, съёмка ×3);
3. docs/figma/redlines.md (выдержка из дерева, может быть обрезана по глубине);
4. проза FIGMA_PARITY_SPEC.md раздела 6 и PROGRESS.md.
Каждое число в коде обязано иметь адрес ноды (guid = «sessionID:localID», совпадает с id из URL Figma). Число без адреса — выдумка.
Почему. Сверка 08.09 нашла не меньше десяти мест, где проза спеки противоречила ноде (карточка города A5, экраны A6/A7, шапка B7, панели CTA B10, шторка жалобы, дата в строке B6). Все они попали в код, потому что агент верил прозе.
Проверка. У каждого элемента в карточке сверки (раздел 7) есть колонка «нода → значение». Пустая колонка = нарушение.
Правило. Всю работу выполняет сам агент: чтение дерева, вёрстка, съёмка, сравнение, вердикт. Субагенты, фоновые агенты и делегирование не используются ни для чего. Скрипты допустимы как инструмент измерения и рутины (разбор .fig, нарезка картинок, подсчёт пикселей, экспорт ассетов) при трёх условиях: агент прочитал код скрипта целиком, проверил его выход на одном примере вручную (открыл картинку, посчитал число сам) и записал эту проверку в карточку. Вердикт «совпадает / не совпадает» выносит только агент, посмотрев на кадр и на цифры.
Почему. Субагент и скрипт могут ошибаться и не знают, что ошибаются; ответственность не делегируется. Скриншотный тест на JVM в этом проекте уже давал ложные результаты (Coil, тени, шрифт).
Проверка. В журнале каждой задачи есть фраза «проверил вручную: …» с конкретным примером. Вердикт написан от первого лица с описанием того, что агент увидел.
Правило. Задача — это все состояния всех кадров экрана, перечисленные в индексе (раздел 8), а не «основное состояние». Закрыть задачу можно только когда каждое состояние прошло ритуал раздела 7. Если часть невозможна (нет решения владельца, нет устройства), агент доводит всё остальное до конца, а невозможное записывает как блокер с доказательством невозможности и точной формулировкой того, что нужно от владельца. Почему. Прошлые вехи закрывались по «основному» состоянию: у B1 сняты 1 из 5 состояний блока «Куда иду», у B10 — 8 из 19 нод. Заказчик прямо запретил сужение. Проверка. В карточке экрана перечислены все guid кадров экрана из индекса, у каждого — статус. Нет строки «остальные аналогично».
Правило. Перед вёрсткой каждого экрана и после неё агент письменно задаёт себе и отвечает на вопросы. Обязательный минимум — раздел 7.3 (22 вопроса). Ответ «не знаю» допустим только с планом выяснения и результатом выяснения ниже. Ответ «очевидно» запрещён: очевидное записывается словами. Почему. Все найденные структурные ошибки предотвращались одним вопросом: «откуда это число?», «есть ли этот слой в ноде?», «почему в ноде кнопка справа, а у меня слева?». Вопрос, который не задан, не имеет ответа. Проверка. Карточка сверки содержит заполненный протокол. Пустой пункт = задача не закрыта.
Правило. Каждая задача проверяется дважды. Первый раз — сразу после реализации, по ритуалу. Второй раз — после того, как агент закрыл файлы экрана, заново открыл дерево ноды и рендер и прошёл карточку с чистого листа, как чужую работу. Цель второго прохода — найти хотя бы одну ошибку. Если не найдена, агент записывает, какие именно проверки сделал повторно и почему уверен. Почему. Первый проход видит то, что ожидает увидеть. Автор сверки 08.09 нашёл перевёрнутую карточку города только при втором взгляде на дерево. Проверка. Две датированные записи в карточке: «проход 1», «проход 2» с находками.
Правило. Если в ноде нет данных (текста, цвета, размера, состояния) или макет противоречит сам себе, агент не выбирает «разумный вариант». Он пишет маркер [ТРЕБУЕТ РЕШЕНИЯ: <точный вопрос с guid и двумя вариантами>] в раздел 4 и в карточку, продолжает всё, что от решения не зависит, и останавливает только зависимую часть.
Почему. Каждая догадка — это отклонение, которое потом ищут часами. Заказчик: «нельзя угадывать на авось».
Проверка. Все FIGMA-CHECK в коде имеют пару в разделе 4. В коде нет значений с комментарием «примерно», «похоже», «на глаз».
Правило. Доказательство соответствия — только сравнение картинок: скриншот экрана приложения с устройства/эмулятора в ×3 против рендера ноды в ×3, выровненные по верхнему инсету, с числовым результатом (раздел 6). Допуск «±2 dp» отменён. Пока сравнение красное, задача открыта. «Совпало визуально» без цифр не принимается. Почему. Снимки Paparazzi 462×1000 и оценка «в допуске» пропустили сдвиги в 20–96 dp (A4, B6, B7). Проверка. В карточке лежат три файла: скриншот, рендер, diff, и число расхождения.
Правило. После каждой задачи — запись в docs/figma/PROGRESS.md по шаблону раздела 9 и карточка сверки в docs/figma/cards/<guid>.md. Запись содержит только факты, которые можно перепроверить: guid, файлы, числа, команды. Слова «готово», «совпадает», «исправлено» без файла-доказательства запрещены.
Почему. Журнал v2 содержал «совпали с нодами» для экранов, которые с нодами не совпадали.
Проверка. Каждое утверждение в записи имеет ссылку на файл или guid.
Правило. Изменения только внутри android-events/. Строки — только res/values/strings.xml, дословно из ноды (включая «ё», пробелы и многоточия). Цвета — только токены PodusheColors, значения из ноды. Типографика — PodusheType, стили из ноды (вес, кегль, интерлиньяж, трекинг). Ассеты — только из .fig. Нет ручки на бэке — Fake*Repository с // BACKEND-GAP: <что нужно>. backend/, ios/, web-* не трогать. Токены и ключи не коммитить.
Почему. Унаследовано из v2.5, раздел 2 и 3; проверено, работает.
Проверка. grep -rn '"[А-Яа-яЁё]' app/src/main/java/ru/podushe/app/ui пуст; git diff --stat не выходит за android-events/.
Правило. Перед каждым коммитом: ./gradlew :app:assembleDushaDebug, :app:lintDushaDebug, :app:testDushaDebugUnitTest — все зелёные. Один коммит — одна задача, сообщение по формату репозитория, в теле — guid нод и ссылка на карточку.
Проверка. Вывод команд в записи журнала.
Правило. Агент не ускоряется за счёт глубины. Если проверка требует открыть 40 нод — открыть 40 нод. Если ритуал нужно повторить пять раз — повторить пять раз. Единственный критерий остановки — раздел 2. Почему. Заказчик: «мне всё равно, сколько времени и токенов; важен абсолютный результат».
Правило. Перед началом каждой задачи агент перечитывает разделы 1, 6 и 7 целиком и раздел 4 (открытые решения). Перед началом каждой фазы — весь документ. Проверка. Первая строка записи журнала задачи: «Перечитал К-1…К-12, разделы 6, 7, 4 в версии <номер>».
Цель. Каждый кадр каждого рабочего раздела макета присутствует в приложении и неотличим от макета при сравнении по правилам раздела 6.
Рабочие разделы и объём (по дереву .fig, кадры шириной 390):
| Страница | guid страницы | Кадров |
|---|---|---|
| Авторизация и регистрация | 112:160 | 62 |
| Афиша | 579:52323 | 117 |
| Создание и управление событием | 579:52328 | 99 |
| Взаимодействие участников с событием | 792:36278 | 80 |
| Свайпы событий | 579:52324 | 17 |
| Уведомления | 579:52326 | 6 |
| Избранные | 579:52327 | 9 |
| Профиль | 579:52329 | 54 |
| Чаты и другие пользователи | 579:52330 | 23 |
| Настройки | 634:54612 | 23 |
| Итого | 490 |
Страницы «Прототип» (270 копий), «Архив» (81), «Дизайн концепт» (7), «Cover», «Internal Only Canvas» — не объём работы; секции с пометкой «NEW … от 25 авг 2026» имеют приоритет над старыми версиями тех же экранов (решение владельца из v2.5 сохраняется).
Готово (DoD) — все пункты для каждого из 490 кадров:
| # | Критерий | Метод проверки |
|---|---|---|
| Г-1 | Каждый видимый слой ноды имеет соответствие в приложении: тот же тип (текст, картинка, фигура), та же вложенность, тот же порядок отрисовки. Скрытые слои (visible=false) отсутствуют. |
Инспекция дерева против дерева Compose, карточка 7.4 |
| Г-2 | Геометрия: положение и размер каждого элемента совпадают с нодой с отклонением не больше 0,5 dp (1,5 px при ×3). | Измерение по скриншоту ×3, раздел 6.3 |
| Г-3 | Цвета и прозрачности совпадают точно (hex и alpha из ноды), включая заливки, обводки, тени, градиенты, материал стекла. | Инспекция токенов + пипетка по скриншоту в трёх точках на элемент |
| Г-4 | Тексты совпадают побайтно с characters ноды, стиль совпадает (семейство, начертание, кегль, интерлиньяж, трекинг, регистр, выравнивание, перенос). |
Сравнение строк + измерение блока текста |
| Г-5 | Ассеты (иконки, 3D, фото, тайлы карт) взяты из .fig, а не заменены похожими. |
Список ассетов экрана с sha1 источника |
| Г-6 | Состояние воспроизведено на устройстве с теми же данными, что в ноде (раздел 5.4). | Скриншот |
| Г-7 | Сравнение скриншота с рендером ноды по правилам раздела 6 зелёное. | Число diff в карточке |
| Г-8 | Переходы из ноды (коннекторы .fig, flows.md) работают, либо стоят BACKEND-GAP с указанием ручки. |
Список переходов в карточке |
| Г-9 | В коде экрана нет FIGMA-ASSET, FIGMA-CHECK, CONTENT-GAP, legacy_*. |
grep |
Готовность проекта: все 490 кадров с Г-1…Г-9, все [ТРЕБУЕТ РЕШЕНИЯ] закрыты владельцем, финальный REPORT.md (раздел 9.3) собран, полный повторный проход раздела 6 по всем кадрам зелёный.
Не-цели (без изменений с v2.5): серверная логика, пуши/FCM, платежи, распознавание лица, геокодер, ios/, web-*, backend/. Живая карта MapLibre не сравнивается с картинкой карты в макете попиксельно (раздел 6.4, исключения).
/root/figma/podushe-2026-09-08.fig — экспорт файла «Podushe | Mobile-app» от 08.09.2026 08:03 UTC. Zip: canvas.fig (kiwi, 67 580 нод, 19 страниц), images/ (632 файла: 625 PNG, 7 JPEG — фото, 3D, карты), meta.json, thumbnail.png.pip install fig2sketch cairosvg; from figformat import decodefig; fig = decodefig.decode(path)[0]; nodes = fig['nodeChanges']. guid ноды — кортеж (sessionID, localID), равен id из URL Figma (158:9505 → (158, 9505); проверено на шести нодах). Дети — по parentIndex.guid, порядок — parentIndex.position.vectorData.vectorNetworkBlob → figformat.vector_network.decode(fig, blob_id, {'x':1,'y':1}, {}); координаты уже в единицах ноды; касательные относительны своей вершины; сегменты петли ориентировать по соседу. Прототип экстрактора: /root/figma/fig_icons.py (даёт SVG; проверен на 10 иконках, /root/figma/fig_icons_sample/).fillPaints[].image.hash → файл images/<sha1>..fig нет: отрисовок кадров (только thumbnail.png) и файлов шрифтов (у текстов только имена: SF Pro Medium/Semibold/Condensed Semibold/Regular/Bold, SF Compact)..fig; агент сравнивает деревья (раздел 5.1, шаг 8) и обновляет индекс..fig)docs/FIGMA_PARITY_SPEC.md v2.5 — архитектура (3.1–3.7 остаются в силе), маршруты (5), описания экранов (6), контракт API (Приложение D).docs/figma/redlines.md, components.md, strings.md, flows.md, screens.json — выдержки из API-дампа 06.09; могут быть обрезаны по глубине.docs/figma/export/screens/* (210 рендеров ×2), docs/figma/reference/* (49 ×2), docs/figma/local/* (58 локальных отрисовок — не доказательство), docs/figma/export/assets/ (169 растровых заливок), docs/figma/export/pages/*.json (деревья 10 страниц из API).docs/figma/PROGRESS.md — журнал v2; docs/figma/parity-audit-2026-09-08.html не хранится в репо, отчёт сверки — https://salam0nn.ru/artifacts/podushe-figma-parity-audit.html (реестр расхождений, раздел 8.2 ниже повторяет его).app/src/main/java/ru/podushe/app/ui/**, снимки app/src/test/snapshots/images/.Сравнение раздела 6 требует экрана 390×844 dp при плотности 3× (1170×2532 px). Варианты: AVD с такими параметрами на машине с KVM; физический телефон с последующим приведением к 390 dp (только если ширина экрана в dp ровно 390, иначе масштаб искажает 1 px линии). Текущий сервер без KVM — это блокер Б-1, снимается владельцем (раздел 4).
Формат: [ТРЕБУЕТ РЕШЕНИЯ] · вопрос · варианты · что блокирует · дата. Агент дописывает сюда каждый новый вопрос (К-6) и не двигает зависимую часть, пока строка не закрыта.
| ID | Вопрос | Варианты | Что блокирует |
|---|---|---|---|
| Р-3 | Шрифт. Макет набран SF Pro; на Android его лицензионно ставить нельзя; без него текст не совпадёт по форме букв никогда. | а) дизайнер переводит макет на шрифт, разрешённый для APK, присылает новый .fig; б) остаётся Inter, критерий Г-4/Г-7 для текста меняется на «ширина и высота блока ±1 px, форма букв не сравнивается»; в) иное |
Г-4, Г-7 для всех кадров |
| Р-4 | Верхний инсет. Кадр макета — iPhone со статус-баром 54 dp. | а) фиксированный отступ 54 dp на любом Android (совпадение с макетом гарантировано); б) системный инсет (на большинстве устройств контент выше макета на 6–30 dp) | Г-2 для всех кадров с шапкой |
| Р-5 | Стекло. Liquid Glass с размытием требует RenderEffect (Android 12+). |
а) minSdk 31; б) ниже 31 — плоское стекло, кадры на таких устройствах из сравнения исключаются |
Г-3 для стеклянных элементов |
| Р-6 | Порог diff (раздел 6.3). Предложение: ≤ 0,3 % пикселей кадра с ΔE > 6 вне области живой карты и, при Р-3-б, вне ограничивающих прямоугольников текста. | принять / изменить числа | Г-7 |
| Р-7 | Карта. Живая MapLibre не совпадёт с картинкой карты макета. | а) исключить область карты из diff (предложение); б) статичная подложка из .fig для превью в A5/B3/B10 |
Г-5, Г-7 для карт |
| Р-8 | Устройство. Нет KVM на сервере. | а) машина с KVM; б) телефон 390 dp шириной по adb | Б-1, все Г-7 |
| Р-9 | Противоречия макета (передать дизайнеру): поле номера 44 (261:25228, 582:52876, 579:52473) или 46 (260:24430); короткий юридический текст в 261:25228; полоса шагов на «Шаг 2» (291:25219 — половина у второго сегмента, первый пуст) против правила остальных шагов; подписи дней недели в 194:27047 сдвинуты («Сб Вс Пн…»); базовое состояние фильтров 194:24494 с выбранным районом и одной кнопкой; карточка рельса 300×228 (610:75563) против 300×262 (NEW-ноды); кнопка «назад» на A2 (слот пустой во всех четырёх нодах). | ответ по каждому пункту | Соответствующие кадры |
| Р-10 | Формат рендеров. Съёмка кадров ×3: экспорт из интерфейса Figma владельцем (по страницам: выделить кадры → PNG 3x → Export) или досъёмка tools/figma_shots.py с device_scale_factor=3 (нужна живая сессия Figma в браузере). |
а / б | Ф0 шаг 6 |
Решения v2.5 остаются в силе: Р-1 (сжатие 0,72 для весов 650/760 — действует, пока не решён Р-3), Р-2 (Paparazzi допустим только как черновая проверка, доказательством не является).
Фазы строго последовательны. Фаза закрыта, когда выполнен её критерий завершения и запись о закрытии есть в PROGRESS.md. Внутри фазы задачи идут по ритуалу раздела 7.
.fig (3.1). Критерий: скрипт tools/fig_dump.py пишет docs/figma/fig/<page-guid>.json (полное дерево страницы) для 10 рабочих страниц и docs/figma/fig/index.md — таблица всех 490 кадров: guid, страница, секция, имя, размер, число видимых слоёв, есть ли рендер. Агент открывает пять случайных строк индекса и сверяет с деревом вручную (К-2).icon-* из .fig → SVG → res/drawable/ic_<name>.xml (VectorDrawable). Критерий: для каждой иконки — растр ×8 из SVG рядом с растром той же иконки из настоящего рендера кадра, где она встречается; агент смотрит каждую пару глазами и записывает вердикт в docs/figma/fig/icons.md. AppIcons.kt переключён на ресурсы; Icons.Outlined/Filled в ui/ больше не импортируются.3D-icon-* → PNG из images/ (исходный размер) → drawable-xxxhdpi (×4 при необходимости, без апскейла), -xxhdpi (×3), -xhdpi (×2). Критерий: Icon3d получает ресурсы, пустых слотов не остаётся; docs/figma/fig/3d.md с таблицей имя → sha1 → размеры.images/. Коллаж A1 собирается из слоёв по дереву, welcome_collage.png удаляется. Критерий: docs/figma/fig/rasters.md — какая картинка где используется, с guid.characters текстовых нод собрать data/mock/DesignFixture.kt — события, люди, чаты, счётчики, даты ровно как в нодах (например, событие «WATT Conf 2026: AI продукты», «14 марта, 10:00 - 18:00», «66 Идёт», «Данил Колбасенко, Андро и ещё 64»). Критерий: каждая строка фикстуры имеет guid текстовой ноды в комментарии.docs/figma/fig/renders/<guid>.png, 1170×N; индекс отмечает наличие; кадров без рендера — ноль, либо перечень с причиной и [ТРЕБУЕТ РЕШЕНИЯ].tools/shoot.py: по имени состояния поднимает экран с фикстурой и сохраняет docs/figma/shots/<guid>.png. Критерий: снимок A1 сделан и совпадает по размеру с рендером.tools/diff.py по разделу 6: вход — два PNG и маска исключений, выход — число, тепловая карта, список прямоугольников расхождений. Критерий: агент проверил инструмент на трёх заведомых парах: одинаковые кадры (0), кадр со сдвигом на 1 px (число и прямоугольник видны), кадр с другим цветом кнопки (найдено). Результаты в docs/figma/fig/diff-selftest.md.Критерий завершения Ф0: пункты 1–8 закрыты с доказательствами; запись «Ф0 закрыта» с перечнем файлов.
Объём: все экраны, отмеченные в v2.5 как собранные (A1–A12, B1–B7, B9–B14), по всем кадрам этих экранов из индекса, а не по 55 снимкам. Это 62 кадра раздела A и все кадры раздела B соответствующих экранов.
docs/figma/fig/ledger.md (формат 9.2).[ТРЕБУЕТ РЕШЕНИЯ]), и заменить в FIGMA_PARITY_SPEC.md разделе 6 каждую фразу, противоречащую ноде, на значение из ноды с guid (правки перечислить в 12).Критерий завершения Ф1: у каждого кадра ревизуемых экранов есть карточка с числом diff и списком расхождений; реестр полон; спека обновлена; запись «Ф1 закрыта» с количеством кадров, расхождений по классам (структура / геометрия / цвет / текст / ассет / поведение).
FilterChip без галочки, EventRow без даты и с ценой из скрытого слоя, обложка r8 вместо r12, PodusheActionSheet вместо алерта 300) правятся в компоненте и затем перепроверяются на всех экранах, где компонент используется — список берётся grep-ом и записывается в карточку.Критерий завершения Ф2: реестр Ф1 пуст или содержит только строки с закрытым [ТРЕБУЕТ РЕШЕНИЯ], у каждого кадра ревизуемых экранов Г-1…Г-9 зелёные.
Порядок (по зависимостям v2.5): M3 (B10 остаток: 232:26455, D3 регистрация с вопросами; B11 остаток; I4 личный чат; I1 список чатов) → M4 (C1–C13, D4–D5 — секция NEW от 25 авг) → M5 (H1–H9, I2–I5, J1–J5) → M6 (E1–E6, F1–F2, G1–G2). Для каждого экрана: 1. Составить из индекса список всех его кадров (состояний). Список — часть карточки. 2. Прочитать дерево каждого кадра целиком, выписать структуру слоёв (7.2). 3. Сверстать, снять, сравнить, править до зелёного — ритуал 7.1. 4. Старый экран удаляется только после того, как новый прошёл все кадры; маршрут не остаётся пустым.
Критерий завершения Ф3: все 490 кадров с Г-1…Г-9.
FIGMA-ASSET, FIGMA-CHECK, CONTENT-GAP, ключи legacy_*, мёртвый код старых экранов.docs/figma/REPORT.md (9.3).Критерий завершения Ф4: отчёт собран, в нём 490 строк с зелёным diff, [ТРЕБУЕТ РЕШЕНИЯ] нет.
Рендер ноды из Figma ×3 (1170 px шириной). Локальная отрисовка по дереву (docs/figma/local/) эталоном не является. Рендер ×2 допускается только временно, с пометкой «предварительно», до Ф0-6.
Скриншот приложения на устройстве 390×844 dp ×3 с фикстурой макета (Ф0-5), в состоянии кадра. Снимок делается после завершения всех анимаций и загрузок; Coil получает картинки из .fig локально, без сети.
ui/ пуст.[ТРЕБУЕТ РЕШЕНИЯ].Для каждого слоя: guid · тип · имя · видимость · x, y, w, h относительно кадра · auto-layout (направление, паддинги, gap, выравнивание, fill/hug/fixed) · скругления · заливки (тип, цвет, alpha, blend) · обводки (цвет, толщина, положение) · эффекты (тень, blur, background blur) · для текста: characters, шрифт, кегль, интерлиньяж, трекинг, выравнивание, перенос, максимум строк · для инстансов: мастер-компонент и переопределения (overrides) · для картинок: sha1 · для векторов: наличие vectorNetwork. Особое внимание: слои с opacity < 1 и слои Liquid Glass Material (стекло) — их материал воспроизводится, а не заменяется белой заливкой.
.fig, все ли они в моём списке? Чем я доказал, что не пропустил ни одного?PodusheType?docs/figma/cards/<guid>.md# <guid> · <страница> · <секция> · <имя кадра>
Экран: <код экрана из v2.5> Состояние: <описание> Рендер: <путь> Снимок: <путь> Diff: <путь>, <число>, порог <число>, маска <что исключено>
## Структура (7.2)
| guid | слой | видим | x y w h | стиль | значение в коде (файл:строка) | статус |
## Протокол вопросов до / после (7.3)
1. … 22. …
## Расхождения
| # | слой | нода | приложение | класс | правка / [ТРЕБУЕТ РЕШЕНИЯ] |
## Проход 1 (дата) · Проход 2 (дата)
## Переходы
## Вердикт: зелёный / красный — что именно измерено
| Экран | Кадры (guid, основные) | Статус | Куда |
|---|---|---|---|
| A1, A2, A3, A8, A9, A10, A11, A12 | 158:9505; 260:24430 261:25228 582:52876 579:52473; 261:26902; 291:25219 292:25695 292:25797 + 16 кадров состояний; 284:25333 284:25738; 284:26282 286:26404 287:26637; 287:26990 287:27445 287:27198 732:79437; 287:27892 | по нодам, отличия только шрифт и ассеты | Ф1 → Ф2 (ассеты) |
| A4 | 261:26987 261:27203 261:27297 592:5040 261:27386 | расхождения: 6 ячеек, подзаголовок 1 строка (сдвиг 20 dp), стёртые цифры при лимите | Ф2 |
| A5, A6, A7 | 597:55329 597:56595 730:75312 + 7; 597:56057 + 4; 609:74123 609:74208 | структурные расхождения (8.2) | Ф2 |
| B1, B12 | 180:8884 181:9778 693:70691…73689 + 6 | карточка «Куда иду» не стекло; 4 состояния не сняты | Ф1 → Ф2 |
| B2, B5, B9, B13 | 180:9724; 194:27047 194:27117 229:16403 229:16598; 194:36070 229:14429 229:14668 229:14863; 693:76501 693:74315 | по нодам | Ф1 |
| B3, B4, B6, B7 | 194:24494 + 11; 604:65659 605:67468 605:67692; 192:19379 + 4; 610:75563 + 10 | расхождения (8.2) | Ф2 |
| B10, B11 | 230:19369 + 18; 232:22272 + 22 | расхождения (8.2), не все кадры сделаны | Ф2 → Ф3 |
| B14 | 794:161851 794:161397 804:77055 | не сверено (нет рендера) | Ф1 |
| C0–C13, D1–D2, E1–E5, F1–F2, G1, H1, H2, H8, I1, I5, J1–J4 | по индексу | старая вёрстка, не по нодам | Ф3 |
| C2, C4, C6, C8, C9, C11, C12, D3–D5, E3, E6, G2, H3–H7, H9, I2–I4, J5 | по индексу | экрана нет | Ф3 |
button-delete «Отменить» 116×48 на (24, 772) + button-secondary «Перейти в чат» 218×48 на (148, 772) с иконкой чата; snackbar 342×50 r20 на (24, 706) «Вы участвуете в событии» / «Вам одобрили участие». В коде — «Перейти в чат» + «✓ Вы идёте» / подпись + «✓ Заявка одобрена»; в навигации onOpenChat = null.icon-user-group). В коде нет.button-brand-large). В коде текста нет.icon-map-pin-fill, «Москва», «Определили по геопозиции», «Изменить») над картой 358×140 r20. В коде порядок обратный, плитки нет. icon-Buildings в чипе «Весь город». Галочка у выбранного чипа.Frame 2147225420 visible=false); чипы категорий 3 + 2. В коде шаг 109, даты нет, цена есть, чипы 2 + 2 + 1.icon-calendar, справа icon-magnifying-glass, «Москва» с icon-chevron-down, «Алтуфьевский» без шеврона; «Афиша города» на y=132. В коде: «назад» / календарь, шеврон у района, заголовок на y=156.Upcoming Events Card — Liquid Glass Material (r24, слой Fill+Shadow r34). В коде белая непрозрачная r20.chunked(2), без галочки, плашка с пином.onMenu не передаётся, r8, часов нет, пустое состояние под карточкой.welcome_collage.png содержит iOS-статус-бар; слои коллажа не собраны.FilterChip без галочки в активном состоянии; EventRow (см. 11 и 19); PodusheActionSheet (см. 8); стекло liquidGlass не проверено на устройстве.visible=false) в дереве: рисовать нельзя (цена в EventRow), но их размер может влиять на auto-layout родителя (карточка 114 против 108).Liquid Glass Material — не белая заливка.docs/figma/local/ рисуют Inter и не рисуют иконки и стекло — не эталон.SF Pro Condensed; пока Р-3 не решён, ширина строк сходится, форма букв нет.PROGRESS.md после каждой задачи### <дата> · <экран> · кадры: <guid, …>
Перечитал К-1…К-12, разделы 4, 6, 7 в версии <x.y>.
Кадров всего/зелёных: N/N. Diff по кадрам: <guid>: <число> …
Проверил вручную: <что именно, на каком примере>.
Расхождения найдены/закрыты: <ссылки на ledger>.
[ТРЕБУЕТ РЕШЕНИЯ]: <новые строки раздела 4 или «нет»>.
Команды: assemble ✓ lint ✓ test N ✓. Коммит <hash>.
Карточки: docs/figma/cards/<guid>.md …
docs/figma/fig/ledger.mdОдна строка — одно расхождение: id · guid кадра · guid слоя · класс (структура / геометрия / цвет / текст / ассет / поведение / материал) · нода → приложение · вес (1 — не тот элемент или порядок; 2 — сдвиг ≥ 4 dp или не тот размер; 3 — цвет, материал, ассет; 4 — до 4 dp, трекинг, перенос) · статус · карточка.
docs/figma/REPORT.mdТаблица 490 строк: guid · экран · рендер · снимок · diff · число · вердикт · карточка. Плюс: список решений владельца с ответами; список исключений масок; список BACKEND-GAP; список удалённого кода.
Требования пишутся по EARS: «<система> ДОЛЖНА <ответ>» (постоянные), «КОГДА <событие>, … ДОЛЖНА …», «ПОКА <состояние>, …», «ЕСЛИ <нежелательное>, ТО …». Одно требование — одно условие; у каждого — способ проверки и адрес ноды. Слова «примерно», «похоже», «как правило», «по возможности» в требованиях запрещены; неясность помечается [ТРЕБУЕТ РЕШЕНИЯ] и не реализуется.
Кадр — фрейм шириной 390 на рабочей странице, одно состояние экрана. Экран — код из v2.5 (A1…K5), объединяющий кадры. Нода — узел дерева .fig с guid. Рендер — картинка кадра из Figma. Снимок — скриншот приложения. Diff — результат сравнения по разделу 6. Карточка — файл сверки кадра (7.4). Реестр — ledger расхождений (9.2). Зелёный/красный — вердикт diff по порогу Р-6.
.fig. Источники метода: NASA SE Handbook, Appendix C «How to Write a Good Requirement» (shall-формулировки, верифицируемость, обоснование при каждом требовании, запрет расплывчатых слов); EARS (шаблоны требований); GitHub Spec Kit spec-driven.md (конституция, маркеры неясности [NEEDS CLARIFICATION], чек-листы как ворота фаз); Joel Spolsky «Painless Functional Specifications» (один автор, не-цели, открытые вопросы, живой документ); практика визуальной регрессии (сравнение в одной среде, числовой порог, маски исключений, человек выносит вердикт).