> Owner review 29.10.2026 — REVISIONS REQUIRED, not approved. > Navigation on desktop: Back and page headers share the same left content rail across all pages, including login methods (#19). Narrow form controls may retain a readable width, but must not recenter navigation. > Existing game feed design is retained; v1 proposed feed redesign is REJECTED. Keep Details and Share. Desktop venue covers are square, never portrait; mobile composition stays existing and must not stretch a landscape photo into portrait. > Keep floating map CTA over feed; sidebar map preview itself is interactive. Remove duplicate CTA below map. > These explicit Owner corrections supersede conflicting v1 descriptions below; other proposals remain pending approval. # Покрытие шаблонов GoBadminton · v1.0 **PROPOSED_NOT_OWNER_APPROVED · 29.10.2026** Scope: consumer templates immutable source SHA `954601f3b9da8dddc471ab2ffbe855ced7cde3c0`. Source только прочитан; `.git` не создан. Не выполнялись app/source/Git/runtime/auth/queue/PROD изменения, запросы к приватным данным, subagents или другие model calls. Галерея — собственный статический артефакт. ## Как читать доказательства - **LIVE-CAPTURED** — визуально открыт уже предоставленный anonymous PNG. Я не посещал DEV и не выполнял новую авторизованную сессию. - **OWNER-CAPTURED** — пять исходных изображений, просмотренных визуально в prompt. Они являются приватными входами, не включены в результаты. - **SOURCE-INSPECTED** — состав, ветвления и условия прочитаны в выбранном source. Это не доказательство поведения live. - **PROPOSED** — нарисованная нейтральная композиция; все значения примеры, неизвестные данные явно неизвестны. - **NOT_TESTED** — browser layout/render текущей галереи, touch/gestures/focus/history, продуктовый runtime, независимая QA и Owner UAT. Самопроверка JS/HTML не заменяет их. Все 33 семейства галереи доступны в desktop и mobile container layout; у некоторых несколько состояний. 1024 — дополнительный обзор ширины для принятой overlay системы. Это не утверждение о прогоне всех состояний в браузере. Источники ниже относительны к `apps/web/src/`; `C/` означает `components/consumer/`. ## Матрица actual consumer families | Семейство / реальные пути | Основной source | Галерея D / M | Основание / значимые состояния | |---|---|---|---| | Shell / navigation / footer | `app/layout.tsx`, `C/{ConsumerShell,RootNav,DesktopFooter,NavIcon}.tsx`, `C/nav-items.ts`, `styles/{consumer,foundation,mobile-controls}.css` | Все 01–33; navigation/footer в полных страницах, отдельный map shell | LIVE-CAPTURED все публичные refs; SOURCE. Header 84/72, bottom nav, active routes, reading mode. Галерея footer в mobile развёрнут для обзора; runtime reading/footer selection остаётся caller-owned | | `/` → `/games`; `/games?view=list` | `C/pages/GamesDiscoveryPage.tsx`, `C/discovery/{DiscoveryComposition,DiscoveryGameCard,DiscoveryCityProvider}.tsx`, `C/games/GamesViewAction.tsx` | 04; ready/loading/empty/error/stale | Owner04 + refs00/01 D/M. Create banner, city/date/activity, count/refresh, cards, pagination, map preview, floating map | | `/games?view=map`, внутренние venue/game/create состояния | `C/games/{GamesMapView,GamesMapViewport,GamesVenueMap,DesktopMapInspector,DesktopInspectorGame,VenuePopup,VenueSheet,VenueScheduleCard,VenueGameActions,GamesMapBackButton}.tsx` | 08; selected venue, game, trainer, create placement | SOURCE; anonymous Radar map refs03 даёт map shell, не открытые authenticated overlays. Approved Spacious40 и compact #370 не пересогласуются | | `/players/radar`, Radar layer / controls / list | `C/radar/{RadarPage,GeographicRadarMap,RadarControls,RadarNearbyList,RadarSessionProvider,RadarComposition,UnifiedPlayerCard}.tsx` | 08; off, list, popover, consent, denied | LIVE-CAPTURED refs03 D/M (карта без доказательства active private Radar); SOURCE. Другие lifecycle ветки — тот же статусный контракт, без утверждения всех runtime вариантов | | Radar выбранный игрок | `C/radar/{UnifiedPlayerPreview,RadarContact}.tsx`, `C/players/{PublicPlayerProfile,PlayerProfileContent}.tsx` | 08 player; 01/05/06 common domain | SOURCE. Approximate distance только в Radar, privacy fence, contact result binding, unavailable не выводит старого игрока | | `/games/[gameId]` regular/trainer | `C/pages/GameDetailPage.tsx`, `C/games/{GameDetailComposition,GameActionBar,GameShare,GameRecommendationButton,GameVenueContacts}.tsx` | 02 regular/trainer/guest/pending/full/cancelled/unreadable; 03 confirmed/chat | OWNER02/03 + SOURCE. Status/participation, separate share and recommend, conditions, organizer/trainer, actual chat gate | | `/games/[gameId]/review?intent=withdraw|refuse` | `C/pages/ParticipationReviewPage.tsx` | 28 | SOURCE. Контекст игры, текущий статус, confirmation, error/unknown по общему контракту. Не меняется на новую модалку | | `/venues/[venueId]` | `C/venues/{VenuePage,VenuePublicProfile,VenueCover,VenueCoverCredit}.tsx`, `C/games/{VenueSheet,GamesMapView}.tsx` | 09 + 08 venue | SOURCE. Header/back context, cover/credit, public facts, contacts, allowed cover-only gallery, embedded schedule/map. В gallery иллюстрация, не реальная фотография; photo credit не выдуман | | `/players` | `C/pages/{PlayersDirectoryPage,PlayersGatedPage}.tsx`, `C/players/ProfileComposition.tsx`, `C/radar/UnifiedPlayerCard.tsx` | 07 ready/guest/empty | LIVE-CAPTURED refs02 D/M + SOURCE. Public list, city/name/area/looking/trainer filters, Radar auth affordance, empty/error/loading | | `/players/[publicPlayerId]` | `C/pages/PublicPlayerProfilePage.tsx`, `C/players/{PublicPlayerProfile,PlayerProfileContent,ContactAction}.tsx`, `C/friends/ProfileFriendship.tsx` | 01/05/06; contact states, trainer, long name | OWNER01/05 + SOURCE. Fields/unknowns, first contact, friendship отдельно, unavailable upcoming, safety. Public trainer — вариант того же профиля | | `/my-games?tab=created&view=history`, `?rec=sent` | `C/pages/MyGamesPage.tsx`, `C/games/GameRecommendationsSection.tsx`, статусы в `lib/game-presentation.ts` | 10 upcoming/managed/history/sent/guest | LIVE-CAPTURED refs04 — только auth gate; private SOURCE. Никакой явки/оплаты из истории не выводится | | `/my-games/[gameId]` | `C/pages/OwnedGameSummaryPage.tsx`, `C/games/{ManagerApplicants,GameCoverEditor,GamePhotoSelection}.tsx` | 11 ready/denied/unknown | SOURCE. Counts, existing applicant confirm/reject/remove + reason, photo management, draft publish. Полный editor, cancel/capacity editing не присутствуют как доступная функция | | `/friends` | `C/pages/FriendsPage.tsx`, `C/friends/{FriendActions,ProfileFriendship}.tsx`, `lib/friendships.ts` | 12 friends/incoming/outgoing/none/unavailable/unknown/empty/guest | LIVE-CAPTURED refs06 — auth gate; SOURCE. Capability-authorized actions, privacy expiration, confirmation удаления | | `/messages` + `to`, `conversation`, `game`, invitation selection | `C/messages/{MessagesPage,NewContact,DirectConversation,GameConversation,InvitationDetail,InvitationChooser,MessageComposition,ConversationSafety,inboxSelection}.tsx` | 13–15; gate, first/incoming/outgoing/accepted, blocked, unknown, chat active/closed, invitation choose/pending/full/accepted | LIVE-CAPTURED refs05 — auth gate; private SOURCE. Declined/expired/closed direct requests → restricted composer; invitation declined/expired/revoked/cancelled_by_game → terminal card. Эти terminal permutations отдельно не перерисовывались | | `/games/create` + embedded create + preview-back | `C/pages/CreateGamePage.tsx`, `C/games/{VenuePickerDialog,GamePhotoSelection}.tsx` | 16 regular/trainer/new venue/preview/unknown/guest; 08 create placement; 24 picker | LIVE-CAPTURED refs09 — auth gate; private SOURCE. Название, место, дата/время/длительность, capacity/format/levels/visibility, public contact/save preference, regular terms / trainer description+fee, image, check/publish/recovery | | `/profile` own view / edit | `C/pages/ProfilePage.tsx`, `C/players/{AvatarEditor,CoverEditor,OwnUpcomingGames,GameContactPreference}.tsx` | 17 own, 22 edit/looking/cover; 18 contact setting | LIVE-CAPTURED refs07 — auth gate; private SOURCE. Public fields, intent, Radar, visibility, requests policy, trainer, account, upcoming | | `/profile/settings` | `C/pages/SettingsPage.tsx`, `C/players/GameContactPreference.tsx` | 18 ready/guest | LIVE-CAPTURED refs08 — auth gate plus public navigation rows; private SOURCE. Contact preference, login/sessions, help/legal, logout, disabled deletion | | `/profile/settings/login-methods` | `C/pages/LoginMethodsPage.tsx`, `C/players/EmailCodeForm.tsx` | 19 methods; 23 shared email code layout | SOURCE. Provider connect/disconnect, email link/change_current/change/unlink; distinct confirmation guards remain. Gallery не рисует полный wizard каждого email purpose | | `/profile/settings/sessions` | `C/pages/ActiveSessionsPage.tsx` | 19 sessions | SOURCE. Current/other session rows, revoke, errors; no actual identifiers | | `/profile/setup` | `C/pages/ProfileSetupPage.tsx` | 20 | SOURCE. City, auth/error/ready, save returnTo intent; no new onboarding steps | | `/profile/trainer` | `C/pages/TrainerProfileEditPage.tsx` | 21 | SOURCE. Name/bio/save/disable, preserve management rights | | `/location` | `C/pages/LocationSelectPage.tsx`, `C/discovery/DiscoveryCityProvider.tsx` | 29 | SOURCE. Поддерживаемые города/оставить текущий, loading/error/empty; не новый search feature | | `/about`, `/help`, `/account/help` | `C/content/ContentPages.tsx` | 30/31 | LIVE-CAPTURED refs10/11 D/M; SOURCE. Editorial hero, participation, communication, safety, no fabricated support contact | | `/legal`, `/legal/{terms,privacy,rules}` | `C/content/ContentPages.tsx`, `app/legal/[document]/page.tsx` | 32 index + 3 docs | LIVE-CAPTURED refs12 D/M — индекс; SOURCE — документы. Availability, TOC, operator not published, invalid key calls notFound | | Common empty/error/loading/denied/busy/UNKNOWN | `C/players/ProfileComposition.tsx`, `C/messages/MessageComposition.tsx`, per-page branches | 33 + state selectors relevant families | SOURCE, discovery skeleton LIVE-CAPTURED. Unknown not failed/noncommitted. Dedicated branded not-found/error route не найден; не создаётся как действующая функция | ## Реестр всех consumer page routes Полный автоматический список файлов и imports записан ниже в конце документа. Это инвентаризация шаблонов, не перечень всех dynamic IDs. `/account/*` в основном redirect aliases, не новый самостоятельный кабинет. `app/health/route.ts`, `manifest.ts` — служебные endpoints, не consumer compositions. ## Формы, диалоги и transient UI | Реальный элемент | Source `C/…` | Обзор / граница | |---|---|---| | AuthChooser + EmailCodeForm | `players/{ProfileComposition,EmailCodeForm}.tsx` | 23 chooser/code/error; 8 цифр, one-time, resend timer, delivery status, busy/uncertain не исполняются | | Добавить/изменить/отключить email; provider connect/disconnect | `pages/LoginMethodsPage.tsx` | 19 + shared 23; точные purpose transitions и current-email proof только SOURCE, не объявлены проверенными | | Игровой профиль | `pages/ProfilePage.tsx` | 22; avatar, name/city/level/area/bio, required/max length contracts сохраняются | | Аватар / обложка / crop | `players/{AvatarEditor,CoverEditor}.tsx` | 22 cover и вход в avatar edit. Реальная обработка файлов/crop/upload/preview aspect ratio NOT_TESTED; не копировать декоративную картинку как фото пользователя | | «Ищу игру» | `pages/ProfilePage.tsx` | 22 looking; area + TTL, city prerequisite, expires state | | Trainer form | `pages/TrainerProfileEditPage.tsx` | 21; displayName/bio; не certification | | Contact preference | `players/GameContactPreference.tsx` | 18; save/clear/unknown; public per-game contact не приватный контакт профиля | | NewContact / RadarContact first message | `messages/NewContact.tsx`, `radar/RadarContact.tsx` | 13 first; Radar dialog inherits 560/40; one first message. Отдельный Radar first-message screenshot не создавался | | DM и game composer | `messages/{DirectConversation,GameConversation}.tsx` | 13/14; text only, disabled/restricted, first unread/history remain source behavior | | Invitation chooser | `messages/InvitationChooser.tsx` | 15 choose; managed eligible games, optional preferred game, create-new return; received detail — другой state | | Recommendation picker | `games/GameRecommendationButton.tsx` | 26 ready/empty/unknown; one accepted friend, pagination не показана без nextCursor | | Friendship remove confirmation | `friends/FriendActions.tsx` | 27 remove; keep/remove actions, locked mutation | | Player report/block/unblock | `players/PublicPlayerProfile.tsx` | 01 safety + 27 report/unknown. Profile block immediate caller не заменяется invented confirmation | | Conversation safety overflow + block/report confirmation | `messages/ConversationSafety.tsx` | 13 safety entry + 27 report; block confirmation имеет тот же modal grammar, отдельный рисунок не добавлен. Menu keyboard/caller guards сохраняются | | Game members | `messages/GameConversation.tsx` | 27 members; per-member safety, no leaking member list before authorization | | Native share + fallback/copy_failed | `games/GameShare.tsx` | 27 share — только fallback. Native OS sheet не переоформляется. В галерее clipboard не используется | | Radar consent / duration / popover / owned_elsewhere | `radar/RadarSessionProvider.tsx`, `RadarControls.tsx` | 08 list/popover/permission/denied. Popover 280/18, list 360, consent normal. Lease, transfer, renew, fresh location и неизвестный stop не симулируются | | Player preview / embedded profile | `radar/UnifiedPlayerPreview.tsx` | 08 player; host/body distinctions, lifecycle privacy fences intact | | Map layer filter sheet | `games/MapLayerFilters.tsx` | 25; all/with_games + showPlayersNearby, apply/reset/cancel; не фильтр произвольных дат/уровней | | Venue picker search/dialog | `games/VenuePickerDialog.tsx` | 24 results/empty; header+search вне list scroll; fullscreen mobile, keyboard trap/focus return NOT_TESTED | | Create form / preview / success / unknown / conflict | `pages/CreateGamePage.tsx` | 16 full form/preview/unknown, 08 embedded placement; published/conflict текстовые варианты в source, не подменены новым editor | | Game photo selection/editor | `games/{GamePhotoSelection,GameCoverEditor}.tsx` | 16 photo group, 11 photo management. PUT/DELETE/reconcile semantics неизменны | | Venue cover editor | `venues/VenueCoverEditor.tsx` | SOURCE-INSPECTED; privileged cover editor не включён в публичную страницу всем пользователям, отдельного edit-venue маршрута нет; отдельный mock не требуется | | Manager applicant reason/actions | `games/ManagerApplicants.tsx` | 11; text reason + confirm/reject/remove; source ограничения по времени, статусу, вместимости | | Participation review | `pages/ParticipationReviewPage.tsx` | 28 withdraw/refuse; существующая отдельная страница | | City selector / profile setup | `pages/{LocationSelectPage,ProfileSetupPage}.tsx` | 29/20; различаются сохранение discovery city и profile city | ## Визуально просмотренные исходные изображения Owner 01: Back слишком близко к герою; массивный двухцветный профиль и разрозненные нижние блоки. Owner 02: рекомендация вне структуры героя; share отдельно в верхней строке. Owner 03: чат без самостоятельной секции после условий; confirmed participation отдельно в rail. Owner 04: map CTA только внутри rail на desktop; правый map preview выглядит пассивным. Owner 05: outgoing status и CTA разной вертикальной привязки; повтор статуса в lavender note. Все пять просмотрены индивидуально как native images. Реальные имена/email/аватары не перенесены. | Extra refs, каждый PNG открыт через view_image | Что действительно видно | |---|---| | `00-home-desktop.png`, `00-home-mobile.png`, `01-games-desktop.png`, `01-games-mobile.png` | `/` редирект на `/games`; desktop intro/search/sidebar + loading skeleton; mobile реальная карточка и плавающий вход над bottom nav | | `02-players-desktop.png`, `02-players-mobile.png` | Public catalog и фильтры, auth CTA для Radar. Receipt auth_gate=true не означает отсутствие public directory | | `03-players-radar-desktop.png`, `03-players-radar-mobile.png` | Anonymous map, markers/clusters, back/filters/Radar affordance. Не authenticated private player selection | | `04-my-games-desktop.png`, `04-my-games-mobile.png` | Header/tabs и auth gate; также текст ошибки проверки входа. Частный список не виден | | `05-messages-desktop.png`, `05-messages-mobile.png` | Desktop двухколоночный пустой shell и повтор login; mobile gate + переполняющая строка tabs. Переписка не видна | | `06-friends-desktop.png`, `06-friends-mobile.png` | Tabs + auth gate; на mobile разрывы слов tabs. Friends data не видны | | `07-profile-desktop.png`, `07-profile-mobile.png` | Большой guest hero/login; private own profile не виден | | `08-profile-settings-desktop.png`, `08-profile-settings-mobile.png` | Auth gate, login/session/help/legal rows, disabled delete | | `09-games-create-desktop.png`, `09-games-create-mobile.png` | Back + auth gate; actual authenticated form не видна | | `10-about-desktop.png`, `10-about-mobile.png` | Editorial hero/image; mobile начало основного контента | | `11-help-desktop.png`, `11-help-mobile.png` | Editorial hero/image; mobile начало help blocks | | `12-legal-desktop.png`, `12-legal-mobile.png` | Not published, TOC, availability note, начало operator section | Receipt подтверждает 1440×1000 и 390×844, anonymous capture, blocked mutations count 0. Это входной receipt; текущая работа не выполняла браузерные мутации и не заявляет новую live-capture validation. Реальные PNG не публикуются в output. В `handoff.json` зафиксированы индивидуальные 5+26 прочтения и provenance. ## Границы, пробелы, что не заявлено 1. Browser pixel/render review текущей галереи не выполнен в доступном tool/path scope. Все переключатели проверены через JS VM, разметка — parser; CSS responsive/sticky/focus/zoom требуют браузера. Нельзя объявлять gallery visual QA PASS. 2. Onest bytes не встроены; Arial fallback явно обозначен. Фотографии — существующие брендовые assets, подписаны как иллюстрации, не новые реальные venue/profile media. 3. Authenticated pages SOURCE-INSPECTED; только Owner 01/02/03/05 дают реальные authenticated examples. Private runtime не открывался. 4. Gallery раскрывает overlays на всю высоту документа для чтения; не воспроизводит max-height и единственный body-scroll в настоящем viewport. Согласовывается композиция страницы, approved overlay implementation не переписывается по этому canvas. 5. Gallery game actions inline; рабочий mobile GameActionBar со своим измеряемым reserve должен сохраняться при реализации. Нет доказательства keyboard/focus/gesture/history интеграции. 6. Native share, file crop/upload, email proofs/resend, pagination/loading races, notification mutation, permission dialogs ОС, expired privacy snapshots и UNKNOWN reconciliation не эмулируются. 7. Полный edit-game route, edit-venue page, contact/support route, отдельные branded 404/error/loading pages не найдены. Есть page-local состояния, legal notFound, photo editors и preview-back. Новые функции не изготовлены. 8. #386 venue-assisted create-game остаётся независимым approved inflight feature. Галерея не объявляет его deployed и не служит условием его выпуска. Нет новых требований postgame #372. 9. THIRD-PARTY/OPS/admin не инвентаризировались и не редизайнились. Нет вмешательства в pipeline, queues, DEV/PROD или C5. 10. Исходный snapshot не содержит package manifest/dependencies; app build и Product CI в этой read-only design задаче не запускались. ## Минимальная реализация после согласования | Шаг | Ограниченный предметный scope | Адресная проверка | |---|---|---| | A | Обычные page header / back / SectionHeader / content rhythm; profile shared body + contact/friendship action rows | Owner01/05, long name, no-bio, guest/outgoing/accepted, narrow viewport; privacy unchanged | | B | Full game contextual actions + permission-gated interaction section | Owner02/03, regular/trainer, pending/confirmed/no-chat, recommendation vs share; preserve GameActionBar single DOM and reserve | | C | `GamesViewAction` desktop + clickable `DiscoverySidebar` preview | Owner04, same view/filter/city destination, back restoration, last row/pagination/focus clear, mobile nav and keyboard reserve | | D | Применить те же primitives к каталогам, my-games, friends/messages, forms/settings и editorial; исправления по месту | Один представитель каждого изменённого layout, соответствующие CI/security/DEV smoke. Existing overlay contract regression only where shared styles touched | Это карта применения, не новый backlog/program/scheduler. Один source writer по отдельному допуску; независимый reviewer обычного процесса; CI/QA/DEV release выполняются trusted process. Текущая работа не выполняет merge/deploy и не присваивает продуктовый DONE. Owner review — следующее требуемое решение, а не отдельные approvals по пикселям. ## Точный реестр `app/**/page.tsx` | Файл | Импорт/редирект | |---|---| | `app/about/page.tsx` | `EditorialPage` | | `app/account/deletion/page.tsx` | redirect → `/profile/settings` | | `app/account/demo/page.tsx` | redirect → `/profile` | | `app/account/edit/page.tsx` | redirect → `/profile` | | `app/account/find/page.tsx` | redirect → `/games` | | `app/account/games/page.tsx` | redirect → `/my-games` | | `app/account/help/page.tsx` | `EditorialPage` | | `app/account/organizer/page.tsx` | redirect → `/my-games?tab=created` | | `app/account/page.tsx` | redirect → `/profile` | | `app/account/providers/page.tsx` | redirect → `/profile/settings` | | `app/account/sessions/page.tsx` | redirect → `/profile/settings` | | `app/friends/page.tsx` | `FriendsPage` | | `app/games/[gameId]/page.tsx` | `GameDetailPage` | | `app/games/[gameId]/review/page.tsx` | `ParticipationReviewPage` | | `app/games/create/page.tsx` | `CreateGamePage` | | `app/games/page.tsx` | `GamesDiscoveryPage` | | `app/help/page.tsx` | `EditorialPage` | | `app/legal/[document]/page.tsx` | `documents, LegalPage` | | `app/legal/page.tsx` | `LegalPage` | | `app/location/page.tsx` | `LocationSelectPage` | | `app/messages/page.tsx` | `MessagesPage` | | `app/my-games/[gameId]/page.tsx` | `OwnedGameSummaryPage` | | `app/my-games/page.tsx` | `MyGamesPage` | | `app/page.tsx` | redirect → `/games` | | `app/players/[publicPlayerId]/page.tsx` | `PublicPlayerProfilePage` | | `app/players/page.tsx` | `PlayersDirectoryPage` | | `app/players/radar/page.tsx` | `RadarPage` | | `app/profile/page.tsx` | `ProfilePage` | | `app/profile/settings/login-methods/page.tsx` | `LoginMethodsPage` | | `app/profile/settings/page.tsx` | `SettingsPage` | | `app/profile/settings/sessions/page.tsx` | `ActiveSessionsPage` | | `app/profile/setup/page.tsx` | `ProfileSetupPage` | | `app/profile/trainer/page.tsx` | `TrainerProfileEditPage` | | `app/venues/[venueId]/page.tsx` | `VenuePage` | Всего: 34 page route files. Root `/` и account aliases не считаются новыми отдельными visual families.