Черга задач (STATE)
project: expat-community
version: "0.1.0"
phase: "Phase 2 — Distribution & Content (V1 launch-ready)"
launch_target: 2026-06-15 # public launch anchor
updated: 2026-06-05
last_merge: 2026-06-05 # merged: #156 OpenRouter AI (/api/chat=200), #153/#154/#155 QA epic, #157/#158/#159 content guides, #160 thrift-протокол, #162 DIR-003 CSV import. Phase 1 hardening DONE, AI live.
notes: |
Реконсиляция STATE через /product-manager 2026-05-30. КРУПНЫЙ дрифт устранён:
ВСЕ production_blockers Phase 1 закрыты в коде, но висели todo в трекере.
Закрыто/подтверждено: SEC-001 (#127 merged), SEC-002 CSRF (#71), REL-001
error-boundaries (#74), ARCH-001 shared utils (#75), SEC-003 CSP (#96),
SEC-004 PII-mask (#95), UX-POLISH (#85-88), I18N (#89/90, #91 named scope #138),
perf #97/#98 (#99 re-opened в tech_debt после round-5: mock data top-level).
=> Phase 1 (production hardening) ЗАВЕРШЁН: V1-функционал shipped, security/
reliability/i18n/SEO закрыты, SEC-001b (FormData type-guards) merged #152.
Новый gate перед onboarding бизнесов — QA-001 (cross-platform verification),
см. CURRENT. E2E 404 оказался test-harness флаком, не продуктовым багом.
Узкое горло (как и в STRATEGY §0) — distribution + наполнение каталога, НЕ код.
Открытый backlog = 7 P2/P3 tech-debt issues (#91, #92, #93, #94, #99, #100, #128), ни один не блокирует launch.
ВНИМАНИЕ: GH #99 закрыт COMPLETED 2026-05-30, но код-условие НЕ исправлено
(MOCK_* всё ещё на module-load: directory.ts:32/:43, forum.ts:49) — закрыт
ошибочно, нужен re-open. Держим в tech_debt чтобы долг не потерялся.
SEC-001b (server-action FormData type-guards) закрыт в #152 — больше НЕ в CURRENT.
Инфра-апдейт 2026-05-30: заведён авто-тест-слой (Vitest + Playwright, PR #147),
autonomous tooling (secret-hook, tdd/launch-readiness/manual-qa skills, PR #148).
CI был заблокирован GitHub-биллингом → починен, оба PR green, ждут Codex 👍.
## CURRENT (Phase 2 — путь к public launch 2026-06-15)
current:
- id: GROWTH-001
title: "Outreach: 5 каналов distribution (TG, FB, Reddit, Casa de Ucrania, личный)"
status: in-progress
priority: P0-critical
refs: ["STRATEGY §7 — Первые 100 пользователей", "docs/growth/ (#163 merged)"]
note: "Кит готов (#163): docs/growth/outreach-playbook.md + message-templates.md (RU/UK/ES). Сам аутрич — за основателем (не code)."
- id: DIR-003
title: "50-100 реальных listings (ручной outreach к бизнесам)"
status: in-progress
priority: P1-high
refs: ["STRATEGY Риск 1 — Cold Start", "scripts/import-listings.ts (#162 merged)"]
note: "Тул готов (#162): data/listings.csv → npm run import:listings -- --commit. Сбор данных (50-100 бизнесов) — за основателем."
- id: CONTENT-003
title: "Новые гиды Phase 2 — done для launch (3/3 релизных)"
status: done
priority: P2-medium
refs: ["PRD §8 — Phase 2 Content & Growth"]
note: |
3 релизных гида shipped: водительские права #157, DN visa #158,
школы #159 (все ru/uk/es/en). Налоги/страховка из PRD §8 — CUT из
launch-scope (founder ратифицировал 2026-06-08, низкий launch-leverage)
→ post-launch backlog.
- id: CONTENT-004
title: "Перевод 5 существующих гидов на UK/ES/EN"
status: deferred
priority: P3-low
note: "Defer post-launch (founder 2026-06-08) — не блокер 15.06."
- id: QA-001
title: "Pre-onboarding verification — full cross-platform manual QA + reliable e2e"
status: in-progress
priority: P0-critical
note: |
Gate перед onboarding реальных бизнесов (user готов привести поставщиков).
Подзадачи:
QA-001a [done] E2E 404 диагностика — НЕ продуктовый баг. Smoke-routes
(6 routes × 4 локали = 24 проверки в e2e/smoke.spec.ts: "", /guides,
/directory, /community, /docs, /assistant) отдают 200 на чистом
prod-сервере (next start). Провалы Playwright = test-harness флак:
reuseExistingServer:true + Next dev on-demand компиляция под
fullyParallel нагрузкой. NB: pricing/auth/legal/category пока вне
smoke-покрытия — расширить в QA-001b.
QA-001b [partial] e2e harness против prod build — DONE (#154). НЕ done:
расширить smoke на pricing/auth/legal/category (e2e/smoke.spec.ts:7
PATHS пока 6 routes) — остаётся TODO до gate.
QA-001c [todo] /manual-qa — viewport×locale матрица через Chrome DevTools
MCP: landing→signup→assistant→directory→listing→community→Stripe.
Нужен live staging (vercel.app) + реальный backend для signup/Stripe/AI.
QA-001d [todo] Lighthouse perf/a11y/SEO на ключевых routes (≥90/95/95).
QA-001e [done-tooling] One-command Vercel env setup + launch checklist
(#155 merged). Сам прогон env-setup — на основателе (см. ниже).
Узкое горло (founder-gated, НЕ код): основатель должен выставить в Vercel
prod Resend (+DNS expato.eu) и 4×Stripe ключа. OPENROUTER_API_KEY уже set,
AI live (#156). Supabase set. Без Resend/Stripe — signup-email и платежи
мертвы → QA-001c/d сквозные flow заблокированы.
## TECH-DEBT BACKLOG (post-launch, не блокирует)
tech_debt:
- reason: "Code-quality рефактор — не блокер production, низкий ROI до пользователей"
items:
- issue: 91
title: "Remove unused locale keys (named 19 shipped #138; broader dead-key audit остаётся)"
priority: P2-medium
- issue: 92
title: "Extract mock data from directory.ts/forum.ts"
priority: P2-medium
- issue: 99
title: "Lazy-load mock data only when Supabase not configured (top-level MOCK_* prod-bundle hit)"
priority: P2-medium
note: "GH issue закрыт COMPLETED 2026-05-30 БЕЗ код-фикса — закрыт ошибочно. Условие живо: MOCK_CATEGORIES/MOCK_LISTINGS на module load (src/lib/directory.ts:32/:43, src/lib/forum.ts:49) грузятся даже когда Supabase сконфигурирован. Нужен re-open."
- issue: 93
title: "Replace require() with dynamic import() for optional packages"
priority: P2-medium
note: "Осторожно — current lazy-require намеренный; конверсия в await import() трогает async-цепочки. Низкий приоритет."
- issue: 94
title: "Auto-generate Supabase types (нужен supabase CLI db:gen-types)"
priority: P2-medium
- issue: 100
title: "updated_at Postgres trigger (lazy env в pricing.ts уже done)"
priority: P2-medium
note: "Через supabase-migrate skill. DB-correctness, не блокер."
- reason: "Breaking-change major bumps — ждут отдельного цикла"
items:
- issue: 128
title: "Dependabot defer major version bumps + tracker"
priority: P3-low
- prs: [119, 120, 121, 122]
title: "lucide 1.x / TS 6.x / stripe 22.x / @types/node 25.x"
## DONE — Phase 1 (production hardening) ЗАВЕРШЁН
done_phase1:
- id: SEC-001
title: "/api/chat Zod-валидация + streaming payload cap"
completed: 2026-05-18
refs: ["PR #127"]
note: "Scope narrowed: only /api/chat hardened here. Server-action type-safe validation (SEC-001b) shipped separately в #152."
- id: SEC-002
title: "CSRF protection на POST API routes"
completed: 2026-05-18
refs: ["#71"]
- id: SEC-003
title: "Content-Security-Policy header (+ Vercel Analytics #130)"
completed: 2026-05-18
refs: ["#96", "#130"]
- id: SEC-004
title: "Mask PII (email) в server logs"
completed: 2026-05-18
refs: ["#95", "src/lib/email.ts:95"]
- id: REL-001
title: "error.tsx + loading.tsx + not-found.tsx на всех routes"
completed: 2026-05-18
refs: ["#74"]
- id: ARCH-001
title: "Shared utilities (safeLocale, formatDate, safeHostname, isSupabaseConfigured)"
completed: 2026-05-18
refs: ["#75"]
- id: I18N-FIX
title: "ES diacritics + localized server-action errors + unused keys (named scope)"
completed: 2026-05-18
refs: ["#89", "#90", "#91 (#138)"]
- id: UX-POLISH
title: "Markdown в чате + aria-label hero + emoji a11y + i18n nav в guides"
completed: 2026-05-18
refs: ["#85", "#86", "#87", "#88"]
- id: PERF-001
title: "Hero next/image (#97), N+1 устранены агрегацией in-memory (#98)"
completed: 2026-05-18
refs: ["#97", "#98"]
note: "#99 (lazy mock data) НЕ done — MOCK_CATEGORIES/MOCK_LISTINGS объявлены на module top level в src/lib/directory.ts + src/lib/forum.ts. Перенесено в tech_debt."
- id: I18N-03
title: "Hreflang alternate links для всех 4 локалей"
completed: 2026-04-19
refs: ["src/lib/seo.ts:getAlternates"]
## DONE (V1 surface — на staging)
done:
- id: INIT-001
title: "Next.js 15 + TS + Tailwind v4 + shadcn/ui + next-intl"
completed: 2026-03-18
- id: INIT-002
title: "Supabase setup + RLS на всех таблицах"
completed: 2026-03-18
- id: INIT-003
title: "Landing page (RU/UK/ES/EN) + email signup (Resend)"
completed: 2026-03-18
- id: CONTENT-001
title: "NIE guide (RU/UA)"
completed: 2026-03-18
- id: CONTENT-002
title: "Pet relocation guide Spain (RU/UA)"
completed: 2026-03-18
- id: CONTENT-005
title: "Гиды: empadronamiento, банки, жильё, здоровье (RU)"
completed: 2026-04-19
- id: DIR-001
title: "Directory: базовые листинги (CRUD, категории, поиск)"
completed: 2026-04-19
notes: "Замок via dashboard, mock-данные для запуска"
- id: DIR-002
title: "Directory: Stripe premium (basic/pro/premium €29/79/199)"
completed: 2026-04-19
- id: COMM-001
title: "Community forum: категории, посты, ответы (auth-gated)"
completed: 2026-04-19
- id: AI-001
title: "Relocation AI Assistant (RAG через Claude API)"
completed: 2026-04-19
notes: "RAG на гидах, чат-интерфейс, стриминг, ответы на языке вопроса."
- id: AUTH-001
title: "Magic-link auth через Supabase + middleware redirect"
completed: 2026-04-19
- id: LEGAL-001
title: "Legal pages + cookie banner + RU/UK переводы (#114, #125)"
completed: 2026-04-19
- id: SEO-CORE
title: "OG /api/og dynamic + hreflang + canonical + JSON-LD + sitemap расширен"
completed: 2026-04-19
refs: ["PR #129, #131, #132, #133", "src/lib/seo.ts"]
- id: UX-ANALYTICS
title: "Consent-gated Vercel Analytics + error/not-found polish — #126"
completed: 2026-04-19
- id: STRATEGY-001
title: "Market research & strategy document"
completed: 2026-03-18
output: "STRATEGY.md"
- id: PRD-001
title: "PRD document"
completed: 2026-03-19
output: "PRD.md"
- id: ANALYST-BRIEF-001
title: "Бриф для аналитика + staging-ссылки"
completed: 2026-04-18
output: "ANALYST-BRIEF.md"