{
  "schema_version": 1,
  "issue": 522,
  "artifact": "GoBadminton mobile onboarding design + executable native plan",
  "created_at_utc": "2026-11-08T21:31:56.982226+00:00",
  "language": "ru",
  "recommended_concept": "A — Сначала свой город",
  "alternatives": [
    "B — Содержание сразу",
    "C — От намерения"
  ],
  "entry": "index.html",
  "editable_sources": [
    "index.html",
    "prototype.css",
    "prototype.js"
  ],
  "status": {
    "design_artifacts": "READY_FOR_OWNER_DECISION",
    "DESIGN_APPROVED": "PENDING",
    "independent_ux_product_review": "PASS",
    "final_flow_engineering_review": "PASS",
    "native_SOURCE_READY": "NOT_IMPLEMENTED",
    "BUILD_READY": {
      "ios": "NOT_BUILT",
      "android": "NOT_BUILT"
    },
    "DEVICE_TESTED": {
      "ios": "NOT_TESTED",
      "android": "NOT_TESTED"
    },
    "STORE_READY": "NOT_READY",
    "Owner_UAT": "NOT_TESTED",
    "published": false
  },
  "provenance": {
    "model": "gpt-6-astra",
    "effort": "xhigh",
    "model_basis": "Actual native gpt-6-astra/xhigh turn.completed; original hashes and terminal receipt retained privately",
    "trusted_short_rules_sha256": "d9b2c3e5995e27b0742e2d240d673ed005f50786cf350705e079cb2abdedc400",
    "owner_request_expected_sha256": "88e511c26a242ffff6d806bb8a2dbb4a7d176ed6d7b653dd145810acb3da809c",
    "owner_request_actual_sha256": "88e511c26a242ffff6d806bb8a2dbb4a7d176ed6d7b653dd145810acb3da809c",
    "source_local_HEAD": "1e4d4cb52a305a384fe925c51855b5db8828e361",
    "source_local_tree": "ca63d3708ed21aaaab41263c0d6ed7daefaca208",
    "accepted_dev_sha": "360e308199da1fd58afda631cef9e432c427ff07",
    "accepted_dev_tree": "ca63d3708ed21aaaab41263c0d6ed7daefaca208",
    "source_alias": "byte-exact tree equivalence, not identical commits",
    "accepted_application_version": "0.1.0-alpha.59",
    "accepted_api_version": "0.40.0",
    "accepted_release_id": "r42521707427-a1",
    "research": "Primary official pages browsed by input collector 2026-11-08; this run offline synthesis/read-only targeted source",
    "mobile_web_observation": "Provided Chromium 390x844 screenshots, no native/PWA installation proof",
    "source_writes": false,
    "installs_or_builds": false,
    "network_calls_this_run": false,
    "new_paid_services": false,
    "extra_agents_or_provider_requests": false,
    "native_usage": {
      "input_tokens": 1739892,
      "cached_input_tokens": 1581440,
      "cache_write_input_tokens": 0,
      "output_tokens": 56399,
      "reasoning_output_tokens": 8742
    },
    "post_native_artifact_repairs": [
      "location renderer renamed to avoid window.location collision",
      "long email wraps at 200% text",
      "standalone screenshot fixture disclosure",
      "publication review/status navigation metadata"
    ]
  },
  "input_hashes": [
    {
      "path": "inputs/owner-full-request.txt",
      "sha256": "88e511c26a242ffff6d806bb8a2dbb4a7d176ed6d7b653dd145810acb3da809c",
      "bytes": 32946,
      "publish": false
    },
    {
      "path": "inputs/research-observations.md",
      "sha256": "4cbef7a70e5a0154ad40d4dae7d22ee48f9807574614c2eb9f9eaf55c758e58b",
      "bytes": 7644,
      "publish": false
    },
    {
      "path": "inputs/engineer-READINESS.md",
      "sha256": "91b255f0cc60fddebbfc57e9eb9970af8f968841b24fca03bdbd15083d8017ee",
      "bytes": 18511,
      "publish": false
    },
    {
      "path": "inputs/expo-registry-proof.json",
      "sha256": "b5279329116fd66a4876b4488685288986262ab585fda0029e3447df5e1d7b68",
      "bytes": 777,
      "publish": false
    },
    {
      "path": "inputs/source-alias-proof.json",
      "sha256": "b13b6002b07d025add715ac2a94a7268eef690c669f55b9df4499123015c1598",
      "bytes": 494,
      "publish": false
    },
    {
      "path": "inputs/accepted-alpha59-receipt.json",
      "sha256": "2e4ad7ec8e512191472fcd72f5ce19dc7762fd573293b46f971729ed743bbb2a",
      "bytes": 2161,
      "publish": false
    },
    {
      "path": "inputs/input-materials.json",
      "sha256": "c9d9d3a6ddeff90260473c7eb8fb3118e7da5d737b6328093c84b8f773793072",
      "bytes": 740,
      "publish": false
    },
    {
      "path": "inputs/live-observation.json",
      "sha256": "cdfa919f790f7ebde16c798cd9cf7e14fb17ede521c4bd1754dae92f90d01519",
      "bytes": 332,
      "publish": false
    },
    {
      "path": "inputs/live59-games-viewport-390.png",
      "sha256": "b4aa5cc35ca31c0b55ee3041dff928bd5d66d4bcbd78cf20c43fc875196bb4cd",
      "bytes": 73710,
      "publish": false
    },
    {
      "path": "inputs/live59-login-viewport-390.png",
      "sha256": "a9460a2f996dcd6ade4f40eea9c3cc999bd11e906356b43d0334d4cad1ea4a42",
      "bytes": 60778,
      "publish": false
    },
    {
      "path": "inputs/live59-location-390.png",
      "sha256": "4f3109e037917e8b73fe7c147030e27ddc4a8b2538946f2eebfefd95974f7c89",
      "bytes": 88073,
      "publish": false
    },
    {
      "path": "model-availability.json",
      "sha256": "cfb29490063ddca13c7615fad2f844c503a219522090b78a46068f0d4eb81f8f",
      "bytes": 1383,
      "publish": false
    }
  ],
  "source_evidence_hashes": [
    {
      "path": "AGENTS.md",
      "sha256": "d9b2c3e5995e27b0742e2d240d673ed005f50786cf350705e079cb2abdedc400"
    },
    {
      "path": "apps/web/AGENTS.md",
      "sha256": "abbe312a07c24b6253dddd610fa71d61f039a1a8ea29810dea9ad07b2cb732f7"
    },
    {
      "path": "docs/platforms/IOS_ANDROID.md",
      "sha256": "7f266379e728c03c889a70688b35b38e66a806ae8dd9f23c45436ee6855dc63b"
    },
    {
      "path": "apps/mobile/README.md",
      "sha256": "086858940b00f70210383876fb62a9ddc97c679f39885eb0c35dde53cf574524"
    },
    {
      "path": "docs/integrations/AUTH.md",
      "sha256": "7caf7e7ac18202b7df63b6752f22d5f003064f8fa417a3ed4d16a41d1f547048"
    },
    {
      "path": "docs/integrations/GEO_MEDIA_NOTIFICATIONS.md",
      "sha256": "a230084a215715445da9ee4575ec7571bc2e37c61a66570c151d22d65146871f"
    },
    {
      "path": "docs/decisions/OWNER_DECISION_FRONTEND_STYLE_GUIDE_FIRST_V001.md",
      "sha256": "356ae002c82d4d660ad39912c1422371e0fd68ca88cd0ece6af5417af266d3e3"
    },
    {
      "path": "apps/web/src/styles/consumer-tokens.css",
      "sha256": "7faf5173e24a0899277f98b6095cd530320a53b5f4fa70d5390851d2f6dfe915"
    },
    {
      "path": "apps/web/src/styles/tokens.css",
      "sha256": "2d75f3d94810e003651600b6ce3b1d42af93ed7f9a4f110aa9df1acdbfbf44ca"
    },
    {
      "path": "apps/web/src/components/consumer/pages/ProfileSetupPage.tsx",
      "sha256": "95db1f39bbd3a5551fdf6ff502652acf10c2d067b88489d1a9e73f4a20bd4b40"
    },
    {
      "path": "apps/web/src/components/consumer/players/ProfileComposition.tsx",
      "sha256": "8a62802d7beb6af19ce19e27c21e2fa857a4f68f7f04a9461177066652cace76"
    },
    {
      "path": "apps/web/src/components/consumer/LevelGuide.tsx",
      "sha256": "c710a3daa3b2e9a2f5db67e12f044189c036b96e588e3ef1c2151ac188889b78"
    },
    {
      "path": "apps/web/src/lib/level-guide.ts",
      "sha256": "48c9fbd54466151755ba1c7c929060fc96ef9f78c275c54ddbce5b6bc2bb1eb3"
    },
    {
      "path": "apps/api/src/profiles/social-profile-defaults.ts",
      "sha256": "ae875058a2df869ff1c999667743d4cdb30c373cdac569ed9c7866882d954a6a"
    },
    {
      "path": "apps/web/src/components/consumer/content/ContentPages.tsx",
      "sha256": "dbd2aa60af5723050eaf548dc64daf985183828e89cb2bd6576d5103bf485dd5"
    },
    {
      "path": "apps/web/public/brand/go-badminton.svg",
      "sha256": "b168aeb3545164eb173b694b2caa5d0eff98d864d4482233af9bec1bb65c8827"
    },
    {
      "path": "apps/web/public/discovery/badminton-courts.jpg",
      "sha256": "1acea73ecbe6c322bede0c066f533422e17e90635463cafedfc8a630dd7771cd"
    }
  ],
  "viewports": [
    {
      "id": "ios-compact",
      "platform": "iOS",
      "width": 375,
      "height": 667,
      "safe_top": 20,
      "safe_bottom": 0,
      "targets_min": 44
    },
    {
      "id": "ios-normal",
      "platform": "iOS",
      "width": 390,
      "height": 844,
      "safe_top": 47,
      "safe_bottom": 34,
      "targets_min": 44
    },
    {
      "id": "android-compact",
      "platform": "Android",
      "width": 360,
      "height": 740,
      "safe_top": 24,
      "safe_bottom": 24,
      "targets_min": 48
    },
    {
      "id": "android-normal",
      "platform": "Android",
      "width": 412,
      "height": 915,
      "safe_top": 24,
      "safe_bottom": 24,
      "targets_min": 48
    }
  ],
  "coverage": {
    "scenarios": [
      {
        "id": "first",
        "label": "01 · Первый запуск / A",
        "note": "Приветствие → ручной город → публичный каталог. Вход предложен рядом с гостевым действием.",
        "initial_screen": "welcome"
      },
      {
        "id": "catalog-first",
        "label": "02 · Каталог сразу / B",
        "note": "Альтернатива: структура каталога появляется до выбора города. Без выдуманного списка и запасной Москвы.",
        "initial_screen": "games"
      },
      {
        "id": "intent-first",
        "label": "03 · От намерения / C",
        "note": "Альтернатива: выбрать игру, площадку или людей, затем город. Результат учитывает исходную цель.",
        "initial_screen": "intent"
      },
      {
        "id": "returning-guest",
        "label": "04 · Возвращение гостя",
        "note": "Сохраняется явно выбранный город и фильтр. Приветствие не повторяется.",
        "initial_screen": "games"
      },
      {
        "id": "returning-auth",
        "label": "05 · Возвращение с аккаунтом",
        "note": "Сразу «Мои игры». Сохранённые настройки приватности не переопределяются.",
        "initial_screen": "mygames"
      },
      {
        "id": "session-expired",
        "label": "06 · Истёкшая сессия",
        "note": "Открытая игра остаётся доступной. Вход нужен для продолжения заявки; повторной отправки нет.",
        "initial_screen": "expired"
      },
      {
        "id": "cold-game-link",
        "label": "07 · Холодная ссылка на игру",
        "note": "Конкретная игра сразу, без общего приветствия. Город ссылки не переписывает сохранённый город каталога.",
        "initial_screen": "game"
      },
      {
        "id": "warm-game-link",
        "label": "08 · Тёплая ссылка на игру",
        "note": "Открывается игра внутри текущего приложения. Возврат ведёт к прежнему каталогу и фильтрам.",
        "initial_screen": "game"
      },
      {
        "id": "notification",
        "label": "09 · Переход из уведомления",
        "note": "После проверки аккаунта и прав загружается актуальный статус. Текст push не источник истины.",
        "initial_screen": "participation"
      },
      {
        "id": "notification-expired",
        "label": "10 · Уведомление / сессия истекла",
        "note": "Приватный статус скрыт до входа. После входа перечитывается назначение; чужой аккаунт не получает старое содержимое.",
        "initial_screen": "expired"
      },
      {
        "id": "restart-auth",
        "label": "11 · Прерванный вход / перезапуск",
        "note": "Сохранилась безопасная цель, но не код и не незавершённая операция. Новая попытка входа, без replay.",
        "initial_screen": "recovery"
      },
      {
        "id": "update",
        "label": "12 · Обновление приложения",
        "note": "Обновление не сбрасывает город и не запускает рекламное знакомство. При несовместимом контракте — отдельное требование обновить.",
        "initial_screen": "games"
      },
      {
        "id": "slow",
        "label": "13 · Медленная загрузка",
        "note": "Скелетон и спокойное пояснение. Можно остаться в каталоге или повторить чтение; мутирующих retries нет.",
        "initial_screen": "loading"
      },
      {
        "id": "network-error",
        "label": "14 · Сеть недоступна",
        "note": "Город сохранён. Повторить чтение можно явно; отправить заявку офлайн нельзя.",
        "initial_screen": "games"
      },
      {
        "id": "empty",
        "label": "15 · Нет подходящих игр",
        "note": "Поддерживаемый город, пустой результат. Снять фильтр, посмотреть площадки или выбрать город.",
        "initial_screen": "games"
      },
      {
        "id": "unsupported-city",
        "label": "16 · Город ещё не поддерживается",
        "note": "Псков — сценарный пример ответа «нет в каталоге», не факт текущего DEV. Не заменяем город Москвой.",
        "initial_screen": "unsupported"
      },
      {
        "id": "wrong-code",
        "label": "17 · Неверный код",
        "note": "Код примера 123456. Ошибка связана с полем. Адрес и цель входа сохраняются.",
        "initial_screen": "code"
      },
      {
        "id": "expired-code",
        "label": "18 · Просроченный код",
        "note": "Получить новый код — отдельное действие. В production срок/повтор берутся из ответа сервера.",
        "initial_screen": "code"
      },
      {
        "id": "oauth-cancel",
        "label": "19 · Отмена OAuth",
        "note": "Отмена возвращает выбор способа; выйти обратно в игру можно без потери цели.",
        "initial_screen": "auth"
      },
      {
        "id": "provider-error",
        "label": "20 · Ошибка провайдера",
        "note": "Другой способ или возврат к игре. Не связывать аккаунты по одинаковому email.",
        "initial_screen": "auth"
      },
      {
        "id": "location-denied",
        "label": "21 · Геопозиция / отказ",
        "note": "После отказа выбираем город вручную. Нет повторного системного prompt при каждом запуске.",
        "initial_screen": "location"
      },
      {
        "id": "location-restricted",
        "label": "22 · Геопозиция / ограничена",
        "note": "Системные ограничения отличаются от обычного отказа. Доступная альтернатива — ручной город.",
        "initial_screen": "location"
      },
      {
        "id": "location-approximate",
        "label": "23 · Неточная геопозиция",
        "note": "Предлагается подтвердить определённый город. Точного расстояния до зала не обещаем.",
        "initial_screen": "location"
      },
      {
        "id": "location-services-off",
        "label": "24 · Службы геолокации выключены",
        "note": "Отдельное объяснение и путь к системным настройкам, с сохранённым ручным выбором.",
        "initial_screen": "location"
      },
      {
        "id": "photo-limited",
        "label": "25 · Фото / выбранные изображения",
        "note": "Системный picker даёт выбранный файл. Внешняя панель показывает ограниченный выбор, без доступа ко всей медиатеке.",
        "initial_screen": "photo"
      },
      {
        "id": "push-binding-error",
        "label": "26 · Push / устройство не привязано",
        "note": "ОС разрешила показ, но серверная привязка не подтверждена. Не показывать «уведомления включены».",
        "initial_screen": "notifications"
      },
      {
        "id": "push-messages-only",
        "label": "27 · Push / только сообщения",
        "note": "Согласие на сообщения не включает события игр. Три независимые оси: ОС, устройство, типы.",
        "initial_screen": "notifications"
      },
      {
        "id": "push-denied",
        "label": "28 · Push / отказ ОС",
        "note": "Внутренние статусы работают. Повторный запрос не навязывается; доступен явный переход к настройкам.",
        "initial_screen": "notifications"
      },
      {
        "id": "radar",
        "label": "29 · Radar / отдельное согласие",
        "note": "Разрешённая геопозиция не делает игрока видимым. Включение только явным действием после объяснения.",
        "initial_screen": "radar"
      },
      {
        "id": "minimal-profile",
        "label": "30 · Новый минимальный профиль",
        "note": "Игрок, каталог включён, запросы на общение. Город, фото и уровень не блокируют первую заявку.",
        "initial_screen": "profile"
      },
      {
        "id": "conditions-changed",
        "label": "31 · Условия изменились после входа",
        "note": "Перечитано время и вместимость. Отдельное подтверждение на новой версии; автоматической заявки нет.",
        "initial_screen": "confirm"
      },
      {
        "id": "full-game",
        "label": "32 · Мест больше нет",
        "note": "Свежий ответ сервера отменяет возможность заявки. Другие игры доступны; место не обещается.",
        "initial_screen": "confirm"
      },
      {
        "id": "unavailable-game",
        "label": "33 · Закрытая / недоступная ссылка",
        "note": "Не раскрывать приватную карточку и не ослаблять доступ. Публичный каталог остаётся доступным.",
        "initial_screen": "unavailable"
      },
      {
        "id": "unknown-submit",
        "label": "34 · Ответ заявки потерян",
        "note": "Сначала перечитать серверный статус. Не создавать вторую заявку при неизвестном исходе.",
        "initial_screen": "request-check"
      },
      {
        "id": "account-switch",
        "label": "35 · Выход и смена аккаунта",
        "note": "Выход очищает приватные данные и push binding. Общедоступный город можно оставить.",
        "initial_screen": "profile"
      },
      {
        "id": "splash",
        "label": "36 · Системный launch / отдельно",
        "note": "Системный статичный launch без рекламного таймера. Переход из внешней панели, а не кнопка в splash.",
        "initial_screen": "splash"
      },
      {
        "id": "profile-link",
        "label": "37a · Ссылка на публичный профиль",
        "note": "Публичный профиль сразу, без onboarding. Написать — через вход и отдельное подтверждение.",
        "initial_screen": "publicprofile"
      },
      {
        "id": "notification-wrong-account",
        "label": "37b · Уведомление другого аккаунта",
        "note": "Старая привязка не раскрывает private содержимое. После проверки прав — нейтральная недоступность.",
        "initial_screen": "unavailable"
      },
      {
        "id": "message-intent",
        "label": "37 · Написать после входа",
        "note": "Черновик сохраняется в текущем процессе. Вход возвращает к запросу на общение, отправка только отдельно.",
        "initial_screen": "publicprofile"
      },
      {
        "id": "create-intent",
        "label": "38 · Создать игру после входа",
        "note": "Организаторские поля собираются в форме игры, не в общей анкете. Здесь только первый шаг, без фиктивной публикации.",
        "initial_screen": "create"
      }
    ],
    "rendering": "All scenarios use one shared responsive renderer at all four viewport presets",
    "text_scales": [
      1,
      2
    ],
    "keyboard_reserved_height": 244,
    "reduced_motion": true,
    "configured_coverage_is_not_test_evidence": true,
    "browser_validation_status": "172 geometry checks passed;9 operator and8 independent actual browser checks. Native devices remain NOT_TESTED.",
    "suggested_bounded_review": {
      "all_four_viewports": [
        "first",
        "catalog-first",
        "intent-first",
        "cold-game-link",
        "conditions-changed",
        "wrong-code",
        "location-denied",
        "push-binding-error"
      ],
      "compact_200_percent_keyboard": [
        "wrong-code",
        "message-intent"
      ],
      "journeys": [
        "guest city -> games/venues/public profiles",
        "game -> auth email/OAuth -> fresh conditions -> explicit confirmation",
        "permission denial -> manual city",
        "restart/cancel auth -> preserved public destination",
        "logout/account switch -> no private cache/device binding"
      ]
    }
  },
  "simulation_boundaries": {
    "all_entity_data": "Local fixtures, not live DEV schedule or real personal data",
    "native_browser_and_os_dialogs": "External labelled simulation panel; no actual grants or provider calls",
    "legal_documents": "Current routes unavailable; no invented legal acceptance",
    "full_create_form_map_postgame": "Outside onboarding prototype, bounded native-plan slices"
  },
  "asset_provenance": {
    "assets/go-badminton.svg": "Existing production logo; bytes match apps/web/public/brand/go-badminton.svg",
    "assets/onest.ttf": "Provided local Onest TTF, reused, no external font request",
    "assets/badminton-courts.jpg": "Existing apps/web/public/discovery/badminton-courts.jpg; branded illustration, not depicted fixture venue",
    "assets/icons": "Provided existing games/players/my-games/profile SVG assets; no new logo or generated image"
  },
  "public_engineer_copy": "Corrected engineer source copy; automatic public name Игрок, private provider/account name distinct.",
  "checks": {
    "checked_at_utc": "2026-11-08T21:31:56.982226+00:00",
    "scope": "AUTHOR deterministic checks; not independent QA",
    "javascript_syntax": "PASS (existing absolute Node 24.21.0 executable)",
    "state_checks": {
      "passed": 15,
      "total": 15,
      "evidence": "checks/state-checks.json",
      "method": "VM with minimal DOM stubs; not browser execution"
    },
    "template_smoke": {
      "rendered": 40,
      "total": 40,
      "camera_recovery": "PASS",
      "evidence": "checks/render-checks.json",
      "method": "VM template rendering, not layout"
    },
    "scenario_count": 40,
    "local_links_and_assets": "PASS",
    "runtime_network_calls": 0,
    "browser_persistent_storage_calls": 0,
    "contrast_pairs": [
      {
        "foreground": "#13221a",
        "background": "#ffffff",
        "ratio": 16.52
      },
      {
        "foreground": "#536159",
        "background": "#ffffff",
        "ratio": 6.52
      },
      {
        "foreground": "#536159",
        "background": "#f5f6f2",
        "ratio": 6.0
      },
      {
        "foreground": "#13221a",
        "background": "#a7f447",
        "ratio": 12.33
      },
      {
        "foreground": "#7945de",
        "background": "#ffffff",
        "ratio": 5.65
      },
      {
        "foreground": "#a13c32",
        "background": "#fff0ed",
        "ratio": 5.9
      },
      {
        "foreground": "#13221a",
        "background": "#eee6ff",
        "ratio": 13.68
      }
    ],
    "all_contrast_pairs_4_5_or_higher": true,
    "browser_layout_screenshots": "PASS —172 geometry checks,9 actual click/keyboard checks;25 PNG",
    "physical_native_devices": "NOT_TESTED",
    "voiceover_talkback": "NOT_TESTED",
    "independent_ux_review": "PASS —8 independent browser checks; independent-review.json",
    "final_engineering_review": "PASS — targeted feasibility, independent-review.json"
  },
  "publish": {
    "mechanism": "Existing files.anpavel.ru mechanism by trusted parent after review",
    "mode": "EXPLICIT_FILES_ONLY",
    "whitelist": [
      "index.html",
      "prototype.css",
      "prototype.js",
      "README.md",
      "research.md",
      "flows.md",
      "permissions.md",
      "implementation-spec.md",
      "native-plan.md",
      "engineer-READINESS.md",
      "expo-registry-proof.json",
      "design-manifest.json",
      "checks/author-checks.json",
      "checks/state-checks.json",
      "checks/render-checks.json",
      "assets/badminton-courts.jpg",
      "assets/games.svg",
      "assets/go-badminton.svg",
      "assets/my-games.svg",
      "assets/onest.ttf",
      "assets/players.svg",
      "assets/profile.svg",
      "screenshots.html",
      "browser-review.md",
      "browser-geometry-summary.json",
      "browser-interactions.json",
      "independent-review.md",
      "independent-review.json",
      "independent-browser-result.json",
      "screenshots/auth-ios-normal.png",
      "screenshots/catalog-first-ios-normal.png",
      "screenshots/cold-game-link-android-normal.png",
      "screenshots/conditions-changed-android-normal.png",
      "screenshots/confirm-ios-normal.png",
      "screenshots/empty-android-compact.png",
      "screenshots/first-android-compact.png",
      "screenshots/first-android-normal.png",
      "screenshots/first-ios-compact.png",
      "screenshots/first-ios-normal.png",
      "screenshots/gallery-desktop.png",
      "screenshots/games-ios-normal.png",
      "screenshots/intent-first-ios-normal.png",
      "screenshots/keyboard-200-android-compact.png",
      "screenshots/keyboard-200-ios-compact.png",
      "screenshots/location-denied-android-compact.png",
      "screenshots/minimal-profile-android-normal.png",
      "screenshots/notification-expired-ios-normal.png",
      "screenshots/participation-ios-normal.png",
      "screenshots/photo-limited-android-normal.png",
      "screenshots/push-binding-error-android-normal.png",
      "screenshots/radar-ios-normal.png",
      "screenshots/returning-guest-ios-normal.png",
      "screenshots/session-expired-ios-compact.png",
      "screenshots/wrong-code-ios-compact.png"
    ],
    "exclude": [
      "inputs/**",
      "events.jsonl",
      "stderr",
      "prompt.md",
      "task.md",
      "launch*",
      "capture-live-*",
      "model-availability.json",
      "input-materials.json",
      ".git/**",
      ".codex/**",
      ".agents/**",
      ".aws/**",
      "checks/check-state.cjs",
      "checks/validate-artifacts.py",
      "any unlisted file"
    ],
    "raw_apple_pages_publish": false,
    "ready_after_independent_review": true,
    "target_url": "https://files.anpavel.ru/projects/gobadminton/design/style-guide/mobile-onboarding/20261108-astra-xhigh-v1/index.html",
    "frozen_at": "2026-11-08T21:38:20.971507+00:00"
  },
  "artifact_hashes": [
    {
      "path": "index.html",
      "sha256": "a8ab550f61c318515475b74631e7a6a5763d66bd983285a07ca351c38e03581a",
      "bytes": 8595
    },
    {
      "path": "prototype.css",
      "sha256": "c75d3ae5d01c09bde69a29b2f23f7b1e36fcc8a64b323cdad869d89e9913c62d",
      "bytes": 16688
    },
    {
      "path": "prototype.js",
      "sha256": "0d9703d04358dea1ce664ac69a477970bc241b4c43d7bab3112df099a519c288",
      "bytes": 71353
    },
    {
      "path": "README.md",
      "sha256": "027d68966899854db612ba1faa63ea2e95f09bd675ef7be2ad99bfd1e8e7fc36",
      "bytes": 10690
    },
    {
      "path": "research.md",
      "sha256": "f79150bdc54fbf4e4ff44aafbae1ac748b0d7930234e76030cecc0e1f70f6882",
      "bytes": 15447
    },
    {
      "path": "flows.md",
      "sha256": "954cb1d59449e1432df4f674e2bf36f35863c6419dbe21cfcb7a59c532fb6c79",
      "bytes": 12138
    },
    {
      "path": "permissions.md",
      "sha256": "61686cea4ce4a0b082ff47f3b7ace516663f714a0a2508572f214d5729e62513",
      "bytes": 12274
    },
    {
      "path": "implementation-spec.md",
      "sha256": "f067688501b565ae14bf5be79f429be08be94237647cc7efd2bef1ffcd4ab46f",
      "bytes": 15412
    },
    {
      "path": "native-plan.md",
      "sha256": "4a9a57e9c411f542e10aa2eb1b14a523c837fc138ebfd0c1e82964e3ea9ae8d1",
      "bytes": 24842
    },
    {
      "path": "engineer-READINESS.md",
      "sha256": "ff8988bfe7fea17f650ffb37b23adaca8d333c5a6afe8605f0163cdba3d58dcb",
      "bytes": 19057
    },
    {
      "path": "expo-registry-proof.json",
      "sha256": "b5279329116fd66a4876b4488685288986262ab585fda0029e3447df5e1d7b68",
      "bytes": 777
    },
    {
      "path": "checks/author-checks.json",
      "sha256": "b37a8605f41f2b9cab6c5236bd6b4fc583565c20e97704051e978b9e189c61f9",
      "bytes": 1662
    },
    {
      "path": "checks/state-checks.json",
      "sha256": "b7b8970b8bc10aab1cdadabdcad6852e35d37f124bb96a0f77d08b5c4be39478",
      "bytes": 1747
    },
    {
      "path": "checks/render-checks.json",
      "sha256": "be50ff138b79fd25196c27070e59445576733026cabbb6e693c23a02d85e7905",
      "bytes": 2740
    },
    {
      "path": "assets/badminton-courts.jpg",
      "sha256": "1acea73ecbe6c322bede0c066f533422e17e90635463cafedfc8a630dd7771cd",
      "bytes": 161732
    },
    {
      "path": "assets/games.svg",
      "sha256": "7d6b85ae3a494e35819ff9a2f93eaa9eb10aadc0492791476ccae4de816ec676",
      "bytes": 390
    },
    {
      "path": "assets/go-badminton.svg",
      "sha256": "b168aeb3545164eb173b694b2caa5d0eff98d864d4482233af9bec1bb65c8827",
      "bytes": 204851
    },
    {
      "path": "assets/my-games.svg",
      "sha256": "85a47834a58cf27541ffbaa104e0429b8e2e67a08be2bf65c6fef90a67a5ba0f",
      "bytes": 403
    },
    {
      "path": "assets/onest.ttf",
      "sha256": "3faa4b905661849b2332e394b42f91b5bf5575e553c516caa81811e868a4d589",
      "bytes": 124376
    },
    {
      "path": "assets/players.svg",
      "sha256": "b1edfd33133e6caa988a0759da4fbf33d4270c9f0860a3ad9e2318da55984ec8",
      "bytes": 1327
    },
    {
      "path": "assets/profile.svg",
      "sha256": "8812d0d90924af5f006a7c7cbd3dfbf11583c044925d4792dbed87a3712535aa",
      "bytes": 858
    },
    {
      "path": "screenshots.html",
      "sha256": "0a23879442444a6963c556d5dc0e7277dce284d55a39a148a7e2031344a1267e",
      "bytes": 5976
    },
    {
      "path": "browser-review.md",
      "sha256": "915987366a694dc168144c5c202b6d8881e5725acc8b26f6cef91541b6d021d6",
      "bytes": 1919
    },
    {
      "path": "browser-geometry-summary.json",
      "sha256": "0645aca3e5b1ceff61c7cfd35f4ed636bf0b026649990cc684d8f336a6af25f9",
      "bytes": 57868
    },
    {
      "path": "browser-interactions.json",
      "sha256": "ea43b9272d955df7524920f4b8242f323eb8e3d9fa690e8f04f6c471d96729be",
      "bytes": 1211
    },
    {
      "path": "independent-review.md",
      "sha256": "14622927a07bc39e2a1c58f27e214c7fff37a969e550f4f44e4610aaf0601d1d",
      "bytes": 2984
    },
    {
      "path": "independent-review.json",
      "sha256": "65b04edd64140a410bfffdf11b92d68d7ed3e56eff205965cc2c9f77b8ce9dec",
      "bytes": 3119
    },
    {
      "path": "independent-browser-result.json",
      "sha256": "86f51885f029cda70e8687acb272d98a089911d8f517107ab0ca651da68e82dd",
      "bytes": 768
    },
    {
      "path": "screenshots/auth-ios-normal.png",
      "sha256": "ae1421e6ae13e7999cc103e346c0d6984e33310fefa6c6e096a508802415fc01",
      "bytes": 66946
    },
    {
      "path": "screenshots/catalog-first-ios-normal.png",
      "sha256": "a9e265101206bde7ea977c371347bab11d3fd567d47a92b29252469db91e4a68",
      "bytes": 69037
    },
    {
      "path": "screenshots/cold-game-link-android-normal.png",
      "sha256": "2f66bbcd251199c4fca34765b6ca13339a2b0195e87e5bba80adc7504757e126",
      "bytes": 81009
    },
    {
      "path": "screenshots/conditions-changed-android-normal.png",
      "sha256": "f902430b9d237477893c0a0541c7d5b0afd1288fdb9cd11bed79220cdee0febe",
      "bytes": 83494
    },
    {
      "path": "screenshots/confirm-ios-normal.png",
      "sha256": "a6c6e2fc8359e8452653c1c4e6403757cff2fe6c846b5a390a0168db100d56f9",
      "bytes": 74582
    },
    {
      "path": "screenshots/empty-android-compact.png",
      "sha256": "cceab2f45ad68f17e7e972d5a5d4b2a1dbfb1df9c042d1ec7e25be493346db34",
      "bytes": 63485
    },
    {
      "path": "screenshots/first-android-compact.png",
      "sha256": "5b08ef88d207d1d9fa423057cd896512ef75ddfa478a66b0c8ae6b47cd8e86f5",
      "bytes": 121145
    },
    {
      "path": "screenshots/first-android-normal.png",
      "sha256": "385cb9efa4f3531601adcf006c3fdbca5447ff784b3d9172be234b3490e08e94",
      "bytes": 136076
    },
    {
      "path": "screenshots/first-ios-compact.png",
      "sha256": "1d6b644128b557a02ba5a427383626d03c625b24e0a8b43839fad8aae6d959a3",
      "bytes": 108539
    },
    {
      "path": "screenshots/first-ios-normal.png",
      "sha256": "2a36e896f60fd94e48552a9962d91e3f9ec837983d903747a8e0f1a64a151882",
      "bytes": 127248
    },
    {
      "path": "screenshots/gallery-desktop.png",
      "sha256": "128d1add61ec838ff5bef7fc863fc13fc57e80e843793314639d8ac2494dcf12",
      "bytes": 447772
    },
    {
      "path": "screenshots/games-ios-normal.png",
      "sha256": "b328a9c5106b443245611a6f4e9ed8c00212030eca4e05de641d6dcc94bfd508",
      "bytes": 72562
    },
    {
      "path": "screenshots/intent-first-ios-normal.png",
      "sha256": "0536910637f4af59fe47f7923064daf765786e9361f27db692424a52157a4955",
      "bytes": 59509
    },
    {
      "path": "screenshots/keyboard-200-android-compact.png",
      "sha256": "18c3e6910fc8bca6f9dfdafc086a0a319ec245dd22847c8abf47a33f54da6136",
      "bytes": 56450
    },
    {
      "path": "screenshots/keyboard-200-ios-compact.png",
      "sha256": "707525fab8879630fcb9ded91ac6b2bce249af3d5af8819169ffe4263b740e6a",
      "bytes": 52308
    },
    {
      "path": "screenshots/location-denied-android-compact.png",
      "sha256": "35e0251dbe22b5ef516f0af08a02a59d94d273a547e58feebbcdca6c1a7bf10c",
      "bytes": 54978
    },
    {
      "path": "screenshots/minimal-profile-android-normal.png",
      "sha256": "f794d8f8cbbad3c77fe42077b11f1f23a3d8640f55c00a0f24d411b600e72c02",
      "bytes": 75612
    },
    {
      "path": "screenshots/notification-expired-ios-normal.png",
      "sha256": "ad594d21380cef7e8b3f217d107e2edabc80396083386735a77024ef0c4a7364",
      "bytes": 46973
    },
    {
      "path": "screenshots/participation-ios-normal.png",
      "sha256": "5b3bb589bc72337c48adf20077d66c0983dbe5df524434f66492d683e6e41aef",
      "bytes": 56796
    },
    {
      "path": "screenshots/photo-limited-android-normal.png",
      "sha256": "96b6bdb639291bf964980875df86d34d5e1e51c24b18a359db774b3a6abbb885",
      "bytes": 50254
    },
    {
      "path": "screenshots/push-binding-error-android-normal.png",
      "sha256": "f3b0f911ab7323788c676fcb90b159e7b742a068d1c075487784946b8c6ae921",
      "bytes": 76588
    },
    {
      "path": "screenshots/radar-ios-normal.png",
      "sha256": "5456f6bd3b6461845b82e0e80becadaddbbe3cbfd255816a24964c1bfc12e9ce",
      "bytes": 65166
    },
    {
      "path": "screenshots/returning-guest-ios-normal.png",
      "sha256": "bdb7a8fd192a3c3f4994017d90be75d5e9aea15a4df4341eca387a53b4b0fa98",
      "bytes": 68642
    },
    {
      "path": "screenshots/session-expired-ios-compact.png",
      "sha256": "1a2c66be631fc01c2f4183d8a63cdadf08f3b57c7d50ecf6705e0736cce561b7",
      "bytes": 44688
    },
    {
      "path": "screenshots/wrong-code-ios-compact.png",
      "sha256": "3be47edfe55870dd0ee7a89ee7f40c801cc3ffcf6922dc5f785d9ca01f500c2b",
      "bytes": 51234
    }
  ],
  "manifest_self_hash": "Excluded to avoid recursive hash; parent may hash final manifest for publication receipt"
}