# SQVL-MESH

Индивидуальная навигация и командная координация на одной карте в реальном времени

## Кратко о проекте

- **Проблема:** Полевой команде нужна единая актуальная картина, но позиции, состояние участников, локальные карты и управление доступом обычно распределены между отдельными инструментами и нестабильными каналами.
- **Система:** Клиент-серверная платформа на React Native объединяет фоновый GPS, тактическую карту, локальные KMZ-слои, типизированные сетевые контракты и серверно авторизованные командные комнаты за транспортно-независимой коммуникационной границей.
- **Входные данные:** Клиенты Android и iOS передают GPS-измерения, ревизии профиля и жизненного состояния, членство в комнатах и сетевые события, а выбранные пользователем KMZ-файлы обрабатываются локально на устройстве.
- **Результат:** Общая карта команды с контролем свежести позиций, MGRS-навигацией, тактической идентификацией, локальными картами местности, изолированным состоянием комнат, восстановлением соединения и безопасной диагностикой.
- **Подтверждения:** Версия 0.12.11 содержит 483 успешно пройденных автоматических проверки. Усиленный жизненный цикл Android V3 Lobby прошёл полную физическую проверку на Pixel и Sony с изолированным review relay, а общая карта и фоновое позиционирование остаются принятыми на Android и iOS.
- **Статус:** Рабочая alpha и кандидат для тестирования сообществом. Team Lobby остаётся только на Android, protocol V3 не заменил публичный relay, проверки безопасности и длительной нагрузки 128 клиентов ещё открыты, а Meshtastic BLE не интегрирован.

- **Полная история:** /ru/projects/sqvl-mesh/story/
- **История изменений:** /ru/projects/sqvl-mesh/changelog/

## Полная история

SQVL-MESH начался с одной GPS-точки на телефоне. В версии 0.12.11 это client-server alpha для полевой координации с приложениями Android и iOS, постоянным локальным состоянием, нативными картографическими модулями, собственным сетевым протоколом и изолированными командными комнатами.

Система дает группе одну операционную карту для позиций, ролей, жизненного состояния, тактических символов, локальных планов местности и управления видимостью между командами. Интернет выбран основным транспортом как наиболее доступный в текущих условиях. Meshtastic и LoRa остаются будущим резервным каналом для компактных критических данных при отсутствии интернета.

## Единая операционная картина

Полевая координация обычно зависит от нескольких несвязанных инструментов: голосовой рации, телефона с GPS, нестабильного мобильного интернета, отдельных трекеров и локальных или бумажных карт. Каждый инструмент хранит часть обстановки, но ни один не поддерживает полное актуальное состояние группы.

SQVL-MESH объединяет основное состояние координации в одной мобильной системе:

- актуальные и устаревшие позиции участников;
- постоянную идентичность, роль и жизненное состояние;
- координаты MGRS, азимут, расстояние и ETA;
- генерируемые тактические символы;
- приватные KMZ-карты, обрабатываемые на устройстве;
- фоновую синхронизацию на Android и iOS;
- публичные и приватные командные комнаты на Android;
- транспортную границу для будущего mesh-канала.

Продукт строится вокруг непрерывности. Полезная операционная картина должна переживать блокировку экрана, обрыв сети, задержанные пакеты, перезапуск приложения, различия платформ и смену транспорта.

## От GPS-прототипа к community candidate

Первая сборка только открывала карту и показывала позицию телефона. Следующий вертикальный срез связал два устройства через WebSocket relay. Локальное SQLite-хранилище сделало принятое состояние долговечным, а типизированные контракты и правила ревизий не позволили дубликатам и задержанным пакетам заменить более новые данные.

Проект развивался внутри той же архитектуры: профили участников, фоновый GPS, поддержка iOS, восстановление соединения, MGRS-навигация, таймеры состояний, Tactical Symbol Engine, локальный импорт KMZ, компас с истинным азимутом, сохранение камеры и, наконец, protocol v3 с изолированными командными комнатами.

Это изменило категорию продукта. SQVL-MESH больше не является демонстрацией GPS-трекинга. Он становится платформой для участников, геоданных и управляемой видимости между командами.

## Карта, которая сохраняет состояние

У позиционирования есть три явных режима: `Off`, `While open` и `Background`. Пользователь может прекратить публикацию своей позиции, продолжая получать состояние команды. В фоновом режиме координаты обновляются, когда приложение скрыто или экран заблокирован.

Карта учитывает возраст координаты и не делает повторно полученный пакет свежим. Она восстанавливает центр, масштаб, наклон и поворот после перезапуска, поддерживает обзор группы, возврат к своей позиции, центральный прицел, копирование MGRS, расстояние, истинный азимут и ETA на основе скорости.

Профиль участника отделяет медленно меняющуюся идентичность от частых событий позиции. Изменение роли или состояния имеет собственную ревизию и временную метку. Другие устройства вычисляют длительность `WOUNDED`, `DEAD` и `STALE` локально, поэтому сеть не передает новый таймер каждую секунду.

Компас использует нативные данные платформы: rotation-vector sensor с поправкой магнитного склонения на Android и Core Location true heading на iOS. Он физически принят на Android и исправном iPhone 15. Проблема старого iPhone 12 изолирована как неисправность устройства или системного сервиса, поскольку встроенный Apple Compass на нем также не менял направление.

## Тактические данные остаются семантическими

Tactical Symbol Engine генерирует детерминированные SVG-символы из ограниченных семантических параметров: принадлежности, набора символов, статуса и роли. Один рендерер используется в маркерах участников, настройках профиля, предпросмотрах и Symbol Configurator.

Изображения, произвольные SVG и XML не передаются по сети. Клиенты обмениваются компактными идентификаторами и локально собирают одинаковое изображение. Каталог символов может развиваться без жесткой связи с профилями, пакетами и транспортом.

KMZ-слои следуют той же границе приватности. Выбранный файл проверяется, извлекается, преобразуется в локальную Web Mercator XYZ-пирамиду из 512-пиксельных тайлов, регистрируется в SQLite и отображается через MapLibre. Исходные файлы, координаты, имена и созданные тайлы не покидают устройство.

Каталог поддерживает до 24 локальных слоев с прогрессом, восстановлением, видимостью, порядком, переходом к границам и удалением. Kotlin- и Swift-модули обрабатывают растры, не передавая большие изображения через React Native bridge.

## Team Lobby и protocol v3

Главное обновление последних версий связано с серверно авторизованным разделением команд. Android-клиент поддерживает четыре состояния доступа:

- `No room` для локального использования без команды;
- `Public` для общей публичной комнаты;
- приватные команды с паролем;
- защищенный read-only наблюдатель `Admin`.

Участники получают только профили и позиции, разрешенные их комнатой. Создатель может переименовать команду, сменить пароль, удалить участника или полностью удалить комнату. Пароли не сохраняются на телефоне. После аутентификации сервер выдает отзываемую непрозрачную сессию, которая хранится в защищенном хранилище устройства.

Выход или смена комнаты создают новую generation boundary. Старые профили, позиции и маркеры очищаются до активации новой комнаты, поэтому состояние одной команды не может попасть в другую.

Admin объединяет Public и приватные команды на одной карте, но не публикует собственную позицию, не меняет комнаты и не использует действия создателя. В этом режиме маркеры показывают команду-источник.

Protocol v3 работает на отдельном review relay. Текущий публичный маршрут protocol v2 не изменен, поэтому тестирование комнат не дестабилизирует прежний рабочий контур. Team Lobby физически принят на Android; iOS-клиент пока использует предыдущую модель членства.

## Архитектура с явной ответственностью

SQVL-MESH организован как TypeScript monorepo с общим React Native-приложением, сервером Fastify и WebSocket, типизированными контрактами и нативными Kotlin- и Swift-пакетами для KMZ и определения направления.

Мобильная архитектура разделяет владельцев состояния:

- **Position** отвечает за разрешения, GPS, фоновые процессы и восстановление.
- **Membership** отвечает за комнаты, сессии и текущую область доступа.
- **Local State** отвечает за SQLite, историю событий, проекции и настройки.
- **Participants** объединяет идентичность, профиль, состояние и принятую позицию.
- **Map** отображает подготовленное состояние и управляет камерой.
- **Communication** координирует пакеты и транспорт.
- **Relay** владеет авторизацией, маршрутизацией и серверными полномочиями.

Protocol v3 добавляет постоянные комнаты и членство, роли member, creator и observer, отзываемые сессии, ограниченные snapshots, идемпотентные операции, лимит пакета 16 КиБ, rate limiting, backpressure, изоляцию по комнате и поколению состояния, восстановление после перезапуска и fail-closed поведение хранилища.

Relay работает в изолированном Docker-контейнере через Cloudflare Tunnel. Релизы используют неизменяемые директории, атомарное продвижение, сохраненную предыдущую версию и rollback. Тестовая граница подтверждает 128 одновременных соединений и безопасное отклонение 129-го; длительная нагрузка на этой границе еще требует проверки.

## Доказательства до заявлений

Текущий автоматический контур содержит 483 успешно пройденные проверки мобильного приложения, сервера и общих контрактов. Принятый Android-кандидат остаётся версией 0.12.10 (53), а 0.12.11 фиксирует завершённую физическую приёмку и финализацию истории проекта, не выдавая её за новый устанавливаемый артефакт.

Физические проверки охватывают Pixel, Sony, iPhone 12, iPhone 15, позиционирование при заблокированном экране, потерю сети и переподключение, публичные и приватные комнаты, Admin-наблюдение, удаление участника и комнаты, а также сценарии изоляции на двух и трех устройствах. Карта и фоновое позиционирование также прошли недельную полевую эксплуатацию с Android/iOS-контрольными точками примерно через каждые 100 метров.

Два Wio Tracker L1 Pro были протестированы отдельно. Двусторонние сообщения прошли примерно на 400 метрах и на 550 метрах, когда оба участника находились на возвышенностях. Связь не прошла примерно на 600 и 630 метрах при перекрытии рельефом. Эти результаты показывают зависимость LoRa от высоты и препятствий, но не являются обещанием рабочего радиуса.

## Текущая граница

SQVL-MESH находится на стадии рабочей alpha и Android community-test candidate. Физически приняты общая карта, фоновый GPS, профили, жизненные состояния, символы, MGRS, компас, локальные KMZ-слои, сохранение камеры, Android Team Lobby, изоляция комнат, восстановление сессий и review relay protocol v3.

Это еще не production-система. Team Lobby отсутствует на iOS, protocol V3 не заменил публичный relay, а pre-public adversarial security review, длительный тест 128 клиентов и контролируемый multi-team pilot остаются открытыми. Среди ограничений карт остаются давление памяти на iOS при больших KMZ, неполная нативная отмена, порядок составных слоев, поддержка JPEG и повернутых GroundOverlay, а также отсутствие полной офлайн-подложки.

Meshtastic BLE не интегрирован. Текущие радиотесты подтверждают только аппаратную гипотезу, но не доставку событий приложения через mesh.

## Следующий переход

Ближайший шаг — pre-public adversarial security review, затем ограниченное Android-тестирование с сообществом и исправление блокирующих полевых проблем. Следующая инженерная последовательность включает перенос Team Lobby на iOS, длительное нагрузочное тестирование, мониторинг и контролируемое продвижение protocol V3 на публичный relay.

Также необходимо закрыть критические KMZ-дефекты и временный Android DNS workaround. Только после стабилизации интернет-продукта и его операционных границ существующий транспортный интерфейс будет подключен к Meshtastic BLE.

## Моя роль

Я отвечаю за продуктовую концепцию, требования, мобильный UX, системную архитектуру, разработку Android и iOS, backend и сетевой протокол, нативные Kotlin- и Swift-модули, картографический конвейер, серверную инфраструктуру, автоматические и физические проверки, backlog, историю решений и границы приватности.

Проект показывает полный путь от неопределенных полевых требований до проверенной системы: общий мобильный продукт, типизированный протокол, локальное операционное состояние, серверные полномочия, нативная обработка геоданных и честная история доказательств того, что уже работает и что еще нет.
