Этап 1b: сайт

- Страницы обоих брендов из блоков Payload (D-029): главная, цены,
  локации, поддержка, 4 юридические, 404 и 500. Коллекции pages
  (черновики и версии) и faq с местами показа, 12 типов блоков; поля
  sites — почта и Telegram поддержки, часы работы, SEO по умолчанию.
- Карта и глобус рисуются на сервере (d3-geo), контуры во внешнем
  SVG через <use>; выбор локации синхронизирован между картой и сеткой.
- Тексты сайта и юридические черновики на 5 языках: de, fr, es —
  перевод с глоссарием; seed создаёт страницы и FAQ, только если их
  нет, SEED_CONTENT=reset пересоздаёт.
- SEO: title и описания, canonical, hreflang с x-default,
  sitemap.xml и robots.txt на каждый домен, картинки для соцсетей.
- Статическая сборка и пересборка через revalidatePath из хуков
  Payload (D-030); /svc/internal/revalidate для проверки.
- 404 — статичная страница со статусом 404 через proxy; на сайте
  только опубликованные страницы.
- Производительность: Client Hints темы Payload только в админке,
  предзагрузка 2 файлов шрифтов вместо 6; Lighthouse mobile 97–99.
- Контраст --ink-3 по WCAG AA, радиокнопки вместо div role=button.
- Документация: итоги 1b, глоссарий de/fr/es, трактовки юридических
  черновиков подтверждены, переносимые вопросы — в этапах 3e–3h.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
andreypr207andClaude Opus 5.5 committed 2026-10-22 04:53:15 +02:00
1 parent 515acfb69d
commit 20491d1ba4
134 files changed
+11232 -212

No files matched your search

+1 -1
View File
@@ -32,7 +32,7 @@
| Этап | Содержание | Статус |
|---|---|---|
| [1a](stages/stage-1a-foundation.md) | Фундамент: Next + Payload, сайты, домены, языки, валюты, темы | готово |
| [1b](stages/stage-1b-marketing.md) | Сайт: страницы обоих брендов из блоков Payload, FAQ, юридические черновики, SEO; формы — только интерфейс | в работе |
| [1b](stages/stage-1b-marketing.md) | Сайт: страницы обоих брендов из блоков Payload, FAQ, юридические черновики, SEO; формы — только интерфейс | готово |
| [1c](stages/stage-1c-auth.md) | Вход по коду, сессии; письма — в журнал | не начат |
| [1d](stages/stage-1d-keys.md) | Ключи и подключения: ручное создание в админке, ключи в кабинете | не начат |
| [1e](stages/stage-1e-billing.md) | Счёт и оплата: заказы, баланс, демо-оплата, оформление заказа | не начат |
+10 -5
View File
@@ -44,23 +44,28 @@ src/
payload-types.ts — типы Payload (pnpm generate:types)
app/
(payload)/ — админка и REST API Payload (стандартные файлы)
(front)/m/[host]/[locale]/[currency]/(site)/… — маркетинговые сайты
(front)/m/[host]/[locale]/[currency]/(site)/… — маркетинговые сайты; site-page.tsx — страница из блоков
(front)/c/[host]/[locale]/(shell)/… — кабинет с навигацией
(front)/c/[host]/[locale]/(plain)/… — вход и оформление заказа
(front)/t/[host]/… — MiniApp (этап 2a)
(front)/context.ts — домен, язык и валюта страницы, данные оболочек
svc/… — свои эндпоинты: health, internal/domains; дальше ALTCHA, вебхуки
svc/… — свои эндпоинты: health, internal/domains и internal/revalidate (по токену),
seo/{хост}/robots.txt и sitemap.xml, og/… (картинки для соцсетей),
geo/… (контуры карты); дальше ALTCHA, вебхуки
payload/
collections/ access/ fields/ hooks/ components/
collections/ blocks/ access/ fields/ hooks/ components/
core/ — бизнес-логика без привязки к UI
sites.ts domains/ routing/ currencies/ payments/ — этап 1a
pages.ts content/ seo/ — этап 1b: страницы, данные сайта, sitemap
billing/ keys/ provisioning/ auth/ referral/ email/ geo/ — следующие этапы
brands/
dedicated/ mass/ — различия брендов; страницы и компоненты — с этапа 1b
ui/ — общие компоненты: оболочки сайта и кабинета, переключатели, тема, логотип, иконки
ui/ — общие компоненты: оболочки сайта и кабинета, переключатели, тема, логотип, иконки;
marketing/blocks/ — блоки страниц сайта, marketing/geo.ts — карта и глобус
i18n/ — языки, конфиг next-intl и messages/{en,ru,de,fr,es}.json
styles/ — Tailwind, токены брендов
seed/ — начальные данные (pnpm seed)
seed/ — начальные данные (pnpm seed): content/{язык}.json — тексты страниц и FAQ,
legal/{язык}/*.md — юридические черновики
ops/systemd/ — юниты systemd
scripts/ — служебные скрипты (очистка dev-базы)
```
+17 -2
View File
@@ -68,7 +68,7 @@ erDiagram
| provisioningMode | select `manual` \| `demo` \| `api` | режим выдачи ключей ([D-028](decisions/D-028-provisioning-adapter.md)): `demo` — с этапа 1f, `api` — с 3g |
| seo | group: titleTemplate (L), description (L), ogImage | значения по умолчанию |
На этапе 1a сделаны `code` (после создания не меняется), `name`, `orderPrefix` и `locales`. Остальные поля добавляют этапы, которые ими пользуются: SEO, контакты и часы поддержки — 1b, отправитель писем — 1c, порог «Истекает» — 1d, пресеты пополнения — 1e, режим выдачи — 1f, сроки продлений и напоминаний — 1g, рефералы — 1h, основной бот — 2a.
На этапе 1a сделаны `code` (после создания не меняется), `name`, `orderPrefix` и `locales`, на этапе 1b — `supportEmail`, `supportBot`, `supportHours` и `seo`. Остальные поля добавляют этапы, которые ими пользуются: SEO, контакты и часы поддержки — 1b, отправитель писем — 1c, порог «Истекает» — 1d, пресеты пополнения — 1e, режим выдачи — 1f, сроки продлений и напоминаний — 1g, рефералы — 1h, основной бот — 2a.
### 3.2 `domains` — Домены (сайт)
@@ -343,7 +343,22 @@ QR-коды строятся на лету из `payload`, не хранятся
### 7.1 `pages` — Страницы (сайт)
Страницы сайта из блоков ([D-029](decisions/D-029-pages-blocks.md)): `slug` (уникальное в сайте: `home`, `pricing`, `locations`, `support`, `terms`, `privacy`, `refund`, `cookies`), `title` (L), `layout` (блоки, поля блоков локализованы), `seo` (title (L), description (L), image). Черновики и версии Payload включены. Набор блоков — в `src/payload/blocks/`, описание — по итогам этапа 1b.
Страницы сайта из блоков ([D-029](decisions/D-029-pages-blocks.md)): `slug` (уникальное в сайте: `home`, `pricing`, `locations`, `support`, `terms`, `privacy`, `refund`, `cookies`), `title` (L), `layout` (блоки, поля блоков локализованы), `seo` (title (L), description (L), image). Черновики и версии Payload включены. Блоки (`src/payload/blocks/`), поля блоков локализованы, в текстах — подстановки `{priceFirst}`, `{priceRenewal}`, `{priceMonth}`, `{priceYear}`, `{pricePerMonth}`, `{savings}`, `{countries}`, `{devices}`:
| Блок | Секция макета |
|---|---|
| `hero` | первый экран главной: плашки, H1, две кнопки, плашка под глобусом |
| `advantages` | «Что это даёт на практике»: большая карточка, малые карточки, карточка маршрутов |
| `pricing` | цены на главной: у dedicated — выбор локации и заявка, у mass — планы «Месяц» и «Год» |
| `crossLink` | ссылка на сайт другого бренда |
| `faq` | вопросы из мест показа: одно место — список, несколько — вкладки |
| `pricingHero` | верх страницы цен: крупная цена, «Что входит» |
| `locationGrid` | сетка локаций: у dedicated с ценами и «Купить», у mass — со статусами |
| `cards` | карточки внизу страниц: текст, ссылка на другой бренд, заявка |
| `mapHero` | верх страницы локаций: H1, карта, легенда |
| `contacts` | верх поддержки: H1, Telegram и почта из настроек сайта, часы |
| `contactForm` | «Написать нам» с темами обращения |
| `richText` | текст: юридические страницы |
### 7.2 `faq` — Вопросы и ответы (сайт)
+32 -19
View File
@@ -36,10 +36,13 @@
## 5. SEO
1. `hreflang` на все включённые языки и `x-default` на английскую версию.
2. `canonical` на основной домен.
3. `sitemap.xml` для каждого маркетингового домена с вариантами всех языков.
2. `canonical` на основной домен, в том числе с зеркал.
3. `sitemap.xml` для каждого маркетингового домена с вариантами всех языков. `robots.txt` — на каждый домен: индексация разрешена только маркетинговым доменам с флагом `indexable`, остальным закрыто всё. Оба файла proxy переписывает на `/svc/seo/{домен}/…`.
4. Кабинет и MiniApp не индексируются (`noindex`).
5. Атрибут `lang` у `<html>` соответствует языку страницы.
6. `<title>`: у главной — свой заголовок целиком, у остальных страниц — по шаблону сайта `sites.seo.titleTemplate` («%s · Вейликс»). Описание — из `pages.seo`, иначе описание сайта. Плейсхолдеры цен и числа стран в них заполняются.
7. Картинка для соцсетей: своя у страницы (`pages.seo.image`) или сайта (`sites.seo.ogImage`), иначе создаётся `/svc/og/{сайт}/{язык}/{страница}` — 1200×630, заголовок страницы в цветах бренда.
8. 404 отдаётся со статусом 404 и `noindex`.
## 6. Валюта
@@ -59,21 +62,31 @@
## 8. Глоссарий
| RU | EN | Примечание |
|---|---|---|
| Вейликс / ВейликсВПН | Veilix / VeilixVPN | не переводится |
| ключ | key | купленная единица доступа |
| локация | location | |
| тариф | plan | |
| подключение | connection | |
| устройство | device | |
| индивидуальный IP | dedicated IP | |
| RU-адрес | RU address | |
| баланс, счёт | balance | |
| пополнить | top up | |
| продление, автопродление | renewal, auto-renewal | |
| льготный период | grace period | |
| реферальная программа | referral program | |
| установим за 24 часа | ready within 24 hours | статус локации dedicated |
| RU | EN | DE | FR | ES | Примечание |
|---|---|---|---|---|---|
| Вейликс / ВейликсВПН | Veilix / VeilixVPN | Veilix / VeilixVPN | Veilix / VeilixVPN | Veilix / VeilixVPN | не переводится |
| ключ | key | Schlüssel | clé | clave | купленная единица доступа |
| локация | location | Standort | emplacement | ubicación | |
| тариф | plan | Tarif | forfait | plan | |
| подписка | subscription | Abonnement | abonnement | suscripción | у mass на сайте |
| подключение | connection | Verbindung | connexion | conexión | |
| устройство | device | Gerät | appareil | dispositivo | |
| индивидуальный IP | dedicated IP | dedizierte IP-Adresse | IP dédiée | IP dedicada | |
| RU-адрес, российский адрес | RU address, Russian address | RU-Adresse, russische Adresse | adresse RU, adresse russe | dirección RU, dirección rusa | |
| кабинет | account | Kundenkonto | espace client | área de cliente | |
| баланс, счёт | balance | Guthaben | solde | saldo | |
| пополнить | top up | aufladen | recharger | recargar | |
| продление, автопродление | renewal, auto-renewal | Verlängerung, automatische Verlängerung | renouvellement, renouvellement automatique | renovación, renovación automática | |
| льготный период | grace period | Kulanzfrist | délai de grâce | período de gracia | |
| реферальная программа | referral program | Empfehlungsprogramm | programme de parrainage | programa de referidos | |
| серверы в наличии | servers available | Server verfügbar | serveurs disponibles | servidores disponibles | статус локации dedicated |
| установим за 24 часа | ready within 24 hours | in 24 Stunden bereit | prêt sous 24 heures | listo en 24 horas | статус локации dedicated |
| включено | included | inklusive | inclus | incluido | статус локации mass |
| скоро | coming soon | in Kürze | bientôt | próximamente | статус локации mass |
| цены | pricing | Preise | Tarifs | Precios | пункт меню и страница; тариф как продукт — по строке «тариф» |
| поддержка | support | Support | Assistance | Soporte | |
| войти | log in | Anmelden | Se connecter | Entrar | кнопка в шапке шириной 78 px |
| счёт и платежи | billing | Guthaben & Zahlungen | Facturation | Saldo y pagos | раздел кабинета |
| документы | legal | Rechtliches | Informations légales | Legal | раздел подвала; во Франции «Mentions légales» — отдельная обязательная страница |
Колонки для de, fr, es добавляются на этапе 1b.
Обращение к пользователю: de — «Sie», fr — «vous», es — «tú» (как принято у потребительских сервисов в Испании и Латинской Америке). Типографика: de — кавычки „…“ и короткое тире « – »; fr — « … » и неразрывный пробел перед `: ; ? !`; es — «…», ¿…? и ¡…!. Длинные немецкие слова в узких местах — с мягким переносом (U+00AD). Названия протоколов и приложений (WireGuard, AmneziaWG, Xray, VLESS, Hysteria2, XHTTP, Happ) не переводятся.
+12 -3
View File
@@ -50,7 +50,7 @@
| `--surface-2` | 97.5% .01 296 | 24% .03 296 | 98.4% .003 215 | 30% .03 210 |
| `--ink` | 24% .04 296 (#211b30) | 96% .01 296 | 24% .04 204 | 96% .012 196 |
| `--ink-2` | 45% .03 296 | 79% .02 296 | 45% .03 204 | 80% .02 196 |
| `--ink-3` | 60% .025 296 | 63% .025 296 | 60% .025 204 | 65% .025 196 |
| `--ink-3` | 53% .025 296 | 66% .025 296 | 53% .025 204 | 69% .025 196 |
| `--border` | 92% .014 296 | 31% .032 296 | 92% .014 200 | 36% .04 204 |
| `--accent` | 45% .17 296 (#6137a6) | 74% .15 296 (#b495fe) | 48% .105 178 (#00705e) | 76% .105 190 (#52c6c0) |
| `--accent-hover` | 38% .17 296 | 80% .13 296 | 41% .1 178 | 83% .09 190 |
@@ -65,7 +65,7 @@
## 5. Шрифты, иконки, логотип
1. Commissioner 300–600 — весь текст; Unbounded 600 — только надпись логотипа. Подключение через `next/font`: файлы скачиваются при сборке и отдаются с нашего домена, без запросов к Google Fonts. Наборы символов: latin, latin-ext, cyrillic.
1. Commissioner 300–600 — весь текст; Unbounded 600 — только надпись логотипа. Подключение через `next/font`: файлы скачиваются при сборке и отдаются с нашего домена, без запросов к Google Fonts. Предзагружаются только latin и cyrillic у Commissioner; остальные наборы (latin-ext с «₽») и Unbounded браузер скачивает по `unicode-range`, когда встречает их символы.
2. Иконки, флаги и логотип в макете нарисованы CSS-фигурами. Переносим их React-компонентами, сохраняя вид.
3. Логотип — вариант «Слои». Фавиконы — `favicon.svg` и `favicon-mass.svg` из макета.
@@ -93,13 +93,21 @@
13. В подвале четыре документа: добавлена «Политика cookies». Плашек способов оплаты нет, пока нет видимых пользователю платёжных систем (пункт 9).
14. Кабинет mass: подписи навигации те же, что у dedicated («Список ключей», «Купить ключ», «Ключи»). Подписи макета MassApp («Подключения», «Выбрать страну», «Подписка») не используем (пункт 4).
15. Ширина надписи логотипа — по содержимому: в макете она подогнана под русское название.
16. 404. При `notFound()` Next 16 отдаёт пустую оболочку (`<html id="__next_error__">`), а страница 404 в оформлении бренда отрисовывается в браузере; статус ответа — 404. Серверную отрисовку 404 и 500 решаем на этапе 1b вместе с их оформлением: вариант — `global-not-found.js`.
16. 404 и 500 (решено на этапе 1b):
a. `notFound()` в Next 16 отдаёт пустую оболочку (`<html id="__next_error__">`) и рисует 404 в браузере: клиентская граница при серверной отрисовке не срабатывает. Поэтому proxy ведёт неизвестные адреса сайта на внутреннюю статичную страницу `page-not-found` со статусом 404 (`NextResponse.rewrite` с `status`, `decide.ts`). Она отрисована на сервере, в шапке и подвале бренда, на языке из адреса;
b. `notFound()` остаётся для внутренних путей и удалённых в админке страниц — там 404 по-прежнему рисуется в браузере;
c. 500: `error.tsx` сайта (шапка и подвал на месте, кнопка «Обновить страницу») и `global-error.tsx` на случай, когда не отрисовался корневой layout (бренд — по домену, язык — по префиксу адреса). Ошибки Next по устройству рисует в браузере.
17. Реферальная программа (1h): бонус — дни срока ключа, а не деньги ([D-025](decisions/D-025-referral-days.md)). Текст под ссылкой «Месяц начисляется вам и другу… и применяется к ближайшему списанию» заменяем на условия в днях. В истории платежей строка «Реферальный бонус» показывает «+30 дней» вместо «+2 499 ₽». Счётчик «Месяцев начислено» и статусы приглашённых остаются.
18. Тексты описывают работающий продукт, а не ограничения текущего этапа: «сразу после оплаты», оплата картой, автопродление, смена страны — как в макетах ([D-026](decisions/D-026-stage-order.md)).
19. Тексты страниц — в Payload, страницы собираются из блоков ([D-029](decisions/D-029-pages-blocks.md)).
20. Вейликс — «индивидуальный IP»: выделенный адрес на общем сервере. Формулировки «персональный сервер», «без соседей по серверу», «персональные VPN-серверы» не используем.
21. ВейликсВПН: RU-адрес входит в ключ, но страной не считается ([D-031](decisions/D-031-mass-ru-address.md)); число стран — из данных, только «Включено»; протоколы — Xray и WireGuard.
22. Поддержка: сроки ответа не обещаем, часы — «с 10 до 20 по московскому времени в рабочие дни». Telegram — `@veilix_support` у обоих брендов, пока нет ботов поддержки (этап 3e).
23. Контраст: `--ink-3` подобран до 4,5:1 (WCAG AA) на всех фонах темы, включая выделенные карточки; в макетах было 3,5–4,3:1 (таблица в разделе 4).
24. Карта локаций: точки расположены как в макете, клик выбирает ближайшую точку (в Европе точки перекрываются); выбор синхронизирован с сеткой карточек и отмечен кольцом на карте; всплывающая карточка — HTML поверх карты, со статусом. Контуры стран и глобуса — внешний SVG `/svc/geo/…` с версией в адресе: в HTML они попали бы дважды (разметка и данные React).
25. Межстрочный интервал в секциях страниц — `normal`, как в макетах (там он нигде не задан); у текстов с заданным интервалом — их значения. Шапка и подвал из 1a не менялись.
26. Текущий раздел в шапке выделен цветом текста, как в макетах: CSS по атрибуту `data-page` страницы, без JavaScript.
27. Под формами — строка о согласии с политикой конфиденциальности со ссылкой; формы до этапов 3d и 3e только проверяют поля и показывают «отправлено».
## 8. Состояния, которых нет в макетах
@@ -117,3 +125,4 @@
2. JavaScript в браузере — только интерактивные островки: переключатели языка, валюты и темы, FAQ, выбор локации, формы, карта.
3. Сторонние скрипты при первой загрузке — только Umami (асинхронно). ALTCHA подгружается только на формах.
4. Доступность — WCAG 2.1 AA: контраст, видимый фокус, работа с клавиатуры для выпадающих списков, аккордеонов и шитов, области нажатия ≥ 44 px.
5. Заголовки Client Hints темы (`Accept-CH`, `Critical-CH`, `Vary`), которые `withPayload` ставит на все адреса, оставлены только админке (`next.config.ts`): на сайте `Critical-CH` заставлял Chrome повторять первый запрос страницы, Lighthouse оценивал это в 0,7 с.
+1 -1
View File
@@ -18,7 +18,7 @@
3. Блокировка после 5 неудачных попыток входа.
4. Денежные операции, выдача и блокировка ключей, объединение аккаунтов пишутся в журнал действий. Журнал нельзя изменить.
5. GraphQL Payload выключен. Телеметрия Next.js и Payload выключена.
6. Служебный эндпоинт `/svc/internal/domains` отвечает только с токеном `INTERNAL_TOKEN` из `.env`, иначе 404. Cookie администратора — только по HTTPS.
6. Служебные эндпоинты `/svc/internal/domains` (домены для proxy) и `/svc/internal/revalidate` (пересборка маркетинговых страниц) отвечают только с токеном `INTERNAL_TOKEN` из `.env`, иначе 404. Cookie администратора — только по HTTPS.
## 4. Пользователи
+15 -1
View File
@@ -1,6 +1,6 @@
# Этап 1b. Сайт
Статус: в работе.
Статус: готово.
## 1. Цель
@@ -46,3 +46,17 @@ Root: R-19 — сделано.
3. Lighthouse mobile ≥ 90 на главной и странице цен обоих брендов.
4. Формы проверяют поля и показывают состояние «отправлено».
5. `sitemap.xml` и `hreflang` проходят проверку.
## 7. Итоги (22.10.2026)
1. Сделано всё из раздела 2. Страницы обоих брендов собраны из 12 типов блоков ([03-data-model.md](../03-data-model.md)), тексты сайта и юридические черновики — на 5 языках.
2. Проверки:
a. Сверка с макетами по скриншотам: 1280 и 375 px, светлая и тёмная темы. На 320 и 375 px на всех языках нет горизонтальной прокрутки и вылезающего текста.
b. Lighthouse mobile на production-сборке через nginx, главная и цены обоих брендов: производительность 97–99, доступность 100, best practices 100, LCP 2,1–2,6 с, CLS 0. SEO на dev-доменах — 66 только из-за `noindex`.
c. Пересборка: после правки цены в базе и вызова `revalidatePath` новая цена отдаётся с первого же запроса (0,2 с). Связка «хук Payload → `revalidatePath`» покрыта модульными тестами.
d. `sitemap.xml` — 40 адресов на домен (8 страниц × 5 языков), у каждого 5 языковых вариантов и `x-default`.
3. Тексты макетов, где говорилось о личном сервере, переписаны про индивидуальный IP на общем сервере (решение 2.2 сверки): «Индивидуальный IP, не общий», «Здесь IP общий» на mass.
4. Перенесено:
a. Проверка юристом и данные юрлица — 3h, список трактовок — в [stage-3h-launch.md](stage-3h-launch.md), раздел 5.
b. Хранение IP в Chatwoot — 3e; ссылка «Настройки cookies» и срок `cw_*` — 3f; журналы Xray для лимита устройств — 3g.
c. Вычитка de, fr, es — 3h.
+4
View File
@@ -20,3 +20,7 @@ Root: R-12 — Chatwoot на VPS, ключи API, боты поддержки в
## 4. Готово, когда
Сообщения из виджетов, ботов поддержки, почты и формы приходят в Chatwoot с указанием бренда; вошедший пользователь опознан.
## 5. Учесть из 1b
1. Chatwoot хранит IP-адреса и данные браузера контактов. Политика конфиденциальности (`src/seed/legal/*/privacy.md`) должна это упоминать, как и страну VPS Chatwoot и Twenty, если она отличается от страны основного сервера.
+5
View File
@@ -18,3 +18,8 @@ Root: R-10 — nginx и сертификат для `umi.veilix.cc`, прокс
## 4. Готово, когда
Посещения видны в Umami; без согласия виджет Chatwoot не загружается.
## 5. Учесть из 1b
1. Политика cookies обещает ссылку «Настройки cookies» в подвале: она открывает баннер повторно.
2. В политике cookies у `cw_*` (Chatwoot) вместо срока хранения заглушка — заполнить по фактической настройке виджета.
+4
View File
@@ -12,3 +12,7 @@
## 2. Обсудить при старте
Источник серверов и подключений, способ интеграции, как получать WG-конфиги mass по странам, обработка ошибок выдачи.
## 3. Учесть из 1b
1. Если ограничение числа устройств в Xray потребует журналов доступа, это расходится с обещанием «VPN-серверы не ведут журналов» в политике конфиденциальности. Решаем до выбора способа ограничения.
+15
View File
@@ -24,3 +24,18 @@ Root: R-11, по желанию R-15 и R-16. Решения: Q-13 (юрлицо
1. Основные домены работают по HTTPS, dev и prod разделены.
2. Выкладка и откат отрепетированы.
3. Восстановление из бэкапа проверено.
## 5. Учесть из 1b
1. Трактовки в юридических черновиках. Владелец подтвердил их 22.10.2026, юрист проверяет формулировки:
a. 7 дней на возврат считаются с момента выдачи ключа;
b. «вы передумали» — возвращаем неиспользованный остаток пропорционально дням от всей суммы за период; у dedicated в неё входит надбавка первого месяца за подготовку адреса;
c. после возврата ключ отключается;
d. за заблокированный за нарушения ключ возврата нет;
e. бонусные дни и дни компенсации не возвращаются деньгами;
f. об изменении цены продления предупреждаем заранее;
g. ответственность ограничена оплаченным периодом ключа;
h. «по нашей вине» описано только примерами;
i. `vx_ref` отнесён к обязательным cookies.
2. Темы, которых в черновиках нет: вывод баланса, налоги, закрытие локации, рассылки, удаление аккаунта.
3. Переводы de, fr, es сделаны без носителей: проверить формулировки, в которых переводчики сомневались (юридические термины GDPR, «as is», место разрешения споров).