diff --git a/apps/web/src/pages/plan.astro b/apps/web/src/pages/plan.astro index e879617..7f7a932 100644 --- a/apps/web/src/pages/plan.astro +++ b/apps/web/src/pages/plan.astro @@ -2,9 +2,10 @@ import Layout from "../layouts/Layout.astro"; --- -
Локально на этом устройстве

Мой план
рыбалки.

Соберите до пяти точек, сравните их перед выездом и распечатайте список. Данные не отправляются на сервер.

+
Локально на этом устройстве

Мой план
рыбалки.

Соберите до пяти точек, сравните их перед выездом и распечатайте список. План хранится на устройстве; ссылка содержит только snapshot для передачи.

0 из 5 точек

План пока пуст

Сохраните точку на её detail-странице — она появится здесь.

Посмотреть горячие точки
+

Импортировать план?

diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index bbfe61e..8de57b0 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -28,7 +28,7 @@ R-пункты уточняют критерии существующих B/G/U/ - [x] **R03 · P1 · Идемпотентная отправка улова.** Единый replay-контракт теперь сверяет payload hash и TTL также после `IntegrityError`; старый уникальный ключ получает `409`, а завершённый screenshot больше не ломает повтор исходной отправки. Spot/Bait создаются через savepoint и повторный select после unique-конфликта, поэтому ожидаемые гонки не дают необработанный `500`. Regression покрывает одинаковый повтор, изменённый payload, завершённый upload и просроченный ключ. - [x] **R04 · P1 · Восстановление загрузки скриншота.** Retry endpoint теперь сохраняет recovery-состояние даже после timeout: форма повторной загрузки остаётся доступной, а повтор безопасен при уже принятом upload. После успешного восстановления удаляются upload- и idempotency-cookie; backend не создаёт второй объект при повторе. Полный browser/network failure drill остаётся отдельной приёмкой. - [x] **R05 · P1 · Полноценный каталог снастей (G06/G09).** Предметы и сборки получили независимые offsets и пагинаторы (`items_offset`/`rigs_offset`), один сбой endpoint больше не скрывает второй, 422 фильтров отделён от 503, пустой поиск отделён от незаполненного каталога. Карточки стали article-блоками с отдельной ссылкой названия и валидным source-link внутри паспорта без вложенных ссылок. `astro check` и production build проходят; browser/keyboard acceptance наполненного каталога остаётся частью G06/G09. -- [ ] **R06 · P1 · Надёжный перенос плана (U05).** Preview, объединение/замена с восстановлением, однократный импорт, storage errors, вычисляемая свежесть и точное описание передачи share-данных. Критерий: ссылка не стирает план без выбора, reload не возвращает удалённое, старые данные отмечены. +- [x] **R06 · P1 · Надёжный перенос плана (U05).** Share-ссылка показывает preview и явно предлагает объединить, заменить или отменить импорт; `plan` удаляется из URL после чтения, поэтому reload не возвращает удалённые точки. Запись в storage защищена обработкой ошибок, freshness пересчитывается по timestamp, а описание точно говорит о локальном хранении и snapshot в ссылке. - [ ] **R07 · P1 · Схема координат по водоёмам (U04).** Разделить системы координат, показать точность и водоём, обработать совпадения/обрезку. Критерий: все точки достижимы на 320 px и с клавиатуры, включая одинаковые координаты и длинные названия. - [x] **R08 · P1 · Достоверная аналитика снастей (G07).** Публичные пороги закреплены минимум на 3 наблюдениях и 2 игроках независимо от URL-параметров; окно и freshness используют время улова с fallback на время импорта, ответ ограничен `limit`, а canonical ID назначается только при полном однозначном покрытии компонентных наблюдений. `1/1` нельзя превратить в рекомендацию, unresolved не получает ложную привязку. - [x] **R09 · P1 · Полное удаление личных данных.** Retention и admin-delete загружают дочерние компоненты, очищают их `source_url/raw_payload` вместе с родительским report и сбрасывают upload-token; retention теперь обнаруживает старые reports даже при уже очищенных родительских полях, если provenance осталась в component. Повторная очистка остаётся безопасной; S3/БД failure drill — отдельный эксплуатационный gate.