Realty Relay Bot — PM Pipeline
21 артефакт PM-pipeline (Discover → Iterate), сгенерированных за один прогон в режиме --auto. Описание: Telegram-бот для долгосрочной аренды квартир в Budva/Becici (Черногория), freemium-модель: бесплатно 5 матчей/мес, €4.99/мес за unlimited и расширенные фильтры; целевая аудитория — экспаты и русскоязычные renters. Источник: /Users/paveldmitriev/Work/homefinder. Прогон: 2024-06-18.
Содержание
Артефакты сгруппированы по фазам:
- Discover (01-05): problem framing, research, competitive analysis, journey map, market sizing.
- Define (06-08): JTBD canvas, opportunity tree, prioritization framework.
- Strategy (09-11): product strategy, metric design, ADRs.
- Spec (12-16): specification, PRD, user stories, acceptance criteria, edge cases.
- GoToMarket (17-22): GTM (pricing skipped), narrative, executive writing, launch checklist.
- Measure (23): instrumentation spec.
Iterate фаза (24-25) пропущена — нет launch data.
Документ определения проблемы: Realty Relay Bot — курирование long-term аренды в Budva/Becici
Описание продукта: Realty Relay Bot — Telegram-бот для долгосрочной аренды квартир в Budva/Becici (Черногория), freemium-модель: бесплатно 5 матчей/мес, €4.99/мес за unlimited и расширенные фильтры; целевая аудитория — экспаты и русскоязычные renters, ищущие long-term жильё в регионе.
Сгенерировано: начальный прогон pm-pipeline, режим --auto.
Резюме
Проблема: Сотни-тысячи renters в год ищут long-term апартаменты в Budva/Becici (≤ 700 EUR/мес, 1+ спален, не studio), но сталкиваются с фрагментированным, неформальным, мультиязычным потоком объявлений, разбросанных по нескольким Telegram-каналам, без центральной курации, без схемы, без фильтров, уважающих их hard criteria. Ручное сканирование 5-10 каналов теряет данные, медленное, не воспроизводимое, и не оставляет аудит-трейла. Результат: renters пропускают хорошие объявления (забираемые за часы), получают дубликаты, и тратят часы на объявления, нарушающие их критерии.
Корневая причина: Фрагментация supply на Telegram (нет агрегатора для этой ниши) + неформальный формат объявлений (free-text, смешанные языки RU/EN/SR, нестандартные ценовые конвенции) + потолок человеческой пропускной способности (renters не могут опрашивать каждые 10 минут несколько каналов).
Возможность: Скромная в абсолютных числах (5-15K renters/год в Montenegro long-term rental market), но высокой ценности за матч (каждый матч = 6-12 месячный commitment по 4 200-8 400 EUR), с defensible freemium wedge (5 бесплатных матчей/мес создают вкус ценности, затем €4.99/мес за unlimited + premium фильтры).
Problem-Solution Fit: PASSES (см. §6) — единственные существующие альтернативы (ручное сканирование, real-estate агрегаторы, real-estate агенты) все проваливаются хотя бы на одной оси: precision, latency, или стоимость.
Critical watch: Ограничения и изменения политики Telegram API — внешние ограничения, не контролируемые нами. Конкуренты-агрегаторы (ImmobilienScout24, local.me), входящие в нашу нишу с бесплатными алертами, были бы Tier-1 угрозой.
Как читать этот документ
Этот документ декомпозирует проблему, которую решает Realty Relay Bot, на структурированные, evidence-graded утверждения. Секции идут: контекст (§Step 0) → постановка проблемы (§1) → декомпозиция (§2-5) → оценка fit (§6) → ограничения (§7) → приоритезация возможностей (§8-9). Каждое утверждение несёт evidence tier tag (T1)...(T6) — см. §Notation Key. Документ предназначен для навигации людьми, которые его не писали: каждая секция самодостаточна, таблицы summary-first, и §Adversarial Self-Critique в конце показывает, в чём framing может быть неправ.
Notation Key
| Tag | Tier | Значение |
|---|---|---|
| (T1) | First-party quantitative | Хард-метрики из продукта/использования. |
| (T2) | First-party qualitative | Прямые пользовательские отчёты. |
| (T3) | Authoritative external | Telegram API docs, данные Montenegro rental market, MiniMax docs, EU rental trends. |
| (T4) | Secondary external | Web-survey data, market reports (TBD — см. Research Gap). |
| (T5) | Inferred | Логический вывод из (T1)-(T4). |
| (T6) | Anecdotal / project context | README, прежнее знание Montenegro market, опыт основателей. |
Confidence: H / M / L.
Step 0: Context Fitness Check
| Критерий | Вердикт | Заметка |
|---|---|---|
| Проблема наблюдаема | ДА (T6) | Несколько Telegram-каналов видимо постят long-term rental объявления в этой нише. |
| Пользователи идентифицируемы | ДА (T6) | Русскоязычные expats, digital nomads, relocators в Montenegro — известная демография. |
| Проблема повторяется с частотой | ДА (T6) | Непрерывный posting cycle; rental search — 2-8 недельный процесс на пользователя. |
| Решение/ценность не-тривиальны | ДА (T6) | Каждый матч = 6-12 месячный commitment по 700+ EUR/мес = 4 200-8 400 EUR. |
| Триггер: «мы должны построить X» | ДА (T6) | Продукт существует (v1.0); это ретроспективное problem definition для валидации framing. |
| Verdict | RUN | Контекст подходит для problem framing. |
Step 0b: Framework Selection
Выбрано:
- F1: Problem Definition Canvas — декомпозирует Who/What/Why/Trigger/Good-state.
- F2: 5 Whys + Fishbone — root-cause analysis; релевантен для симптома фрагментации supply.
- F3: JTBD (Jobs To Be Done) — high-stakes жизненное решение, не транзакционная задача.
- F4: Opportunity Sizing (4-осная: Impact, Confidence, Ease, Strategic Fit) — гейтит инвестиции.
- F5: Problem-Solution Fit — 6-тестовый gateway.
- F6: Constraint Mapping — 7 типов ограничений; политика Telegram и proxy supply — внешние.
- Subject: Русскоязычные expats, digital nomads, relocators, ищущие long-term жильё в Montenegro.
- Object: Подходящие rental объявления, соответствующие hard criteria (цена, локация, спальни, тип).
- Constraint envelope: ≤ 10-мин latency от channel post до user notification; precision достаточно высокая, чтобы false positives не были приемлемым шумом; recall достаточно высокая, чтобы пропущенные матчи не были катастрофой.
- Value at stake: Каждый одобренный матч = 4 200-8 400 EUR/12 мес commitment.
- Почему пропускают хорошие объявления? — Потому что люди не могут опрашивать каждые 10 мин через 5-10 каналов.
- Почему опрашивать каждые 10 мин? — Потому что хорошие объявления забираются за часы.
- Почему несколько каналов? — Потому что ни один канал не покрывает нишу; supply фрагментирован.
- Почему фрагментировано? — Потому что Telegram — low-friction publishing surface; long tail маленьких каналов + репосты.
- Почему нет агрегатора? — Потому что Montenegro rentals преимущественно неформальные (owner-to-tenant через мессенджеры), со слабыми структурированными агрегаторами в этом ценовом тире.
- Каналы: 5-10+ публичных TG-групп, смешанные RU/EN/SR, репосты.
- Формат: Free-text объявления, разные ценовые конвенции, embedded media.
- Правила: Hard + soft criteria — hard детерминированы, soft требуют LLM.
- Дистрибуция: Telegram API rate limits + SOCKS5/proxy требование для userbot режима.
- Аудит: Нет лога рассмотренного/отклонённого по каналу.
- Ручное сканирование (status quo) — проваливает recall + время + аудит.
- Real-estate агрегаторы (ImmobilienScout24, local.me) — слабое покрытие в ≤ 700 EUR / Budva-Becici нише.
- Локальные real-estate агенты — комиссия за услугу + медленно.
- Другие Telegram-channel scrapers (generic) — нет курации, нет LLM.
- Ничего не делать / stay put — конкурирует только когда renter уже имеет приемлемое жильё.
- Observation (T5): Freemium с 5 бесплатными матчами/мес достаточен для демонстрации ценности; €4.99/мес за unlimited + premium фильтры ниже perceived-value threshold (€0.17/матч для типичного пользователя).
- Implication: Product-market fit приходит от глубины в маленьком срезе, не от широты.
- Response: Сопротивляться feature creep; держать free tier достаточно щедрым для word-of-mouth, paid tier достаточно compelling для конверсии.
- Confidence: M — предполагаемая conversion rate 2-5%.
- Watch: Если free→paid конверсия < 1% через 90 дней, пересмотреть pricing.
- Observation (T5): Generic TG scrapers существуют, но не имеют курации и аудита.
- Implication: Audit trail + dedup + soft-criteria scoring — это wedge vs scrapers.
- Response: First-class audit surface, не debug artifact.
- Confidence: M.
- Watch: Если пользователи не консультируют audit log за 30 дней, дифференциатор неверен.
- Observation (T3): Изменения политики TG могут сломать весь ingest path.
- Implication: Stage 09 strategy должен включать contingency tier (альтернативная listing surface).
- Confidence: H.
- Watch: TG dev-blog; ежеквартально.
- README.md (T6) — существующее поведение продукта.
- SPEC.md (T6) — деталь реализации.
- Знание основателей Montenegro rental market (T6).
- Telegram API docs (T3) — поведение public web-pages.
- MiniMax M2.1 API docs (T3) — LLM провайдер.
- EU/GDPR docs (T3) — compliance framework.
- Research gaps: external market survey, Montenegro rental market size, competitor pricing (T4 — см. Stage 02).
Не выбрано: Lean Canvas (overkill для freemium продукта с чётким wedge); OKR cascade (преждевременно на этой стадии).
1. Постановка проблемы
> Сотни-тысячи renters в год должны обнаруживать и шортлистить подходящие long-term rental объявления в Budva/Becici (≤ 700 EUR/мес, 1+ спален, не studio) из фрагментированного, неформального, мультиязычного потока Telegram-каналов — с достаточно высокой precision, чтобы действовать по каждому матчу, достаточно высокой recall, чтобы не пропускать возможности, и воспроизводимостью через собственный search процесс renter'а — так, чтобы стоимость оценки одного кандидата ≤ стоимости его игнорирования.
Декомпозиция:
2. Problem Definition Canvas
| Ячейка | Ответ | Инсайт | Типичная ошибка |
|---|---|---|---|
| **Who** (T6) | Русскоязычные expats, digital nomads, relocators; 25-45 yo; tech-literate; используют Telegram как основной мессенджер. | Нишевая, но растущая демография; TAM 5-15K/год в Montenegro long-term rental market. | Предполагать «кто угодно, переезжающий в Montenegro» — это включает vacation rentals, которые вне scope. |
| **What** (T6) | Найти и форвардить подходящие апартаменты (Budva/Becici, ≤ 700 EUR, 1+ BR, не studio) renter'у, с опциональными premium фильтрами. | «Подходящие» — multi-attribute: цена, локация, спальни, плюс soft criteria (вид, мебель, этаж). | Путать «любое объявление» с «подходящим объявлением» — бот существует именно для фильтрации. |
| **Why painful** (T6) | Ручное сканирование 5-10 каналов теряет данные и требует времени; агрегаторы имеют слабое покрытие; агенты взимают fee. | Pain = потерянное время + пропущенные матчи + нет аудит-трейла рассмотренного. | Путать «слишком много объявлений» с «слишком мало правильных». |
| **Trigger** (T6) | Новое объявление появляется в любом мониторимом канале; бот опрашивает каждые 10 минут. | Real-time + асинхронный — люди не могут выдерживать cadence. | Строить ежедневный digest вместо real-time — ниже полезность. |
| **Good state** (T6) | Каждый hard-criteria матч доставлен в течение 10 минут, без дублирующего шума, audit trail на объявление, опциональные premium фильтры. | Аудитабельность + своевременность + premium персонализация — дифференциаторы. | Определять «good» как «бот работает» без указания precision/recall. |
3. Root Cause Analysis
Симптом: Renters пропускают хорошие объявления, получают дубликаты, тратят время на не-matching объявления.
5 Whys:
Корневая причина: Фрагментация supply на Telegram + отсутствие схемы для неформальных объявлений + потолок человеческой пропускной способности.
Fishbone:
4. JTBD Problem Framing
Функциональная работа: «Когда новое rental объявление появляется в Telegram-канале, о котором я забочусь, помоги мне узнать в течение минут, является ли оно hard-criteria матчем — чтобы я мог действовать до того, как это сделает кто-то другой».
Эмоциональная работа: «Дай мне уверенность, что я не пропустил хороший вариант, потому что спал или был не у телефона».
Социальная работа: «Координироваться с партнёром/супругом, если мы ищем вместе, без того, чтобы мы оба независимо писали одному и тому же владельцу».
Конкурирующие hires:
Ключевое решение (per F3 rule): «Ничего не делать» — не доминирующий hire, когда renter активно ищет. Near-zero switching cost (подписаться на TG и читать форварды) достаточен.
5. Opportunity Sizing
| Измерение | Оценка (1-5) | Evidence | Tier |
|---|---|---|---|
| **Impact** | 3 | 5-15K renters/год в Montenegro long-term market; Budva-Becici subset ~ 1-3K. (T5) | T5 |
| **Confidence** | 4 | Сильное evidence, что ручное сканирование проваливается; агрегаторы имеют слабое покрытие. (T6) | T6 |
| **Ease** | 4 | Telegram scrape well-known; MiniMax M2.1 API прямой; Telegram Payments для freemium. (T3+T6) | T3+T6 |
| **Strategic Fit** | 5 | Standalone продукт; нет конкурирующих приоритетов; низкая операционная стоимость. (T6) | T6 |
Вердикт: Высокая Confidence + Высокая Ease + Высокий Strategic Fit, скромный абсолютный Impact. Это «строить, поставлять, растить» возможность с freemium monetization wedge.
Per F4 rule: Ни одно измерение не равно 1, поэтому у возможности нет структурной слабости.
6. Problem-Solution Fit Assessment (F5 — gateway)
| Тест | Вердикт | Заметка |
|---|---|---|
| **Test 1: Проблема реальна и повторяется** | PASS (T6) | Непрерывный posting; rental search 2-8 недель. |
| **Test 2: Текущие альтернативы проваливаются** | PASS (T6) | Ручное сканирование = теряет данные; агрегаторы = слабое покрытие; агенты = fee + медленно. |
| **Test 3: Пользователь готов принять** | PASS (T5) | Freemium модель (5 free) снижает барьер; TG-native. |
| **Test 4: Подход к решению правдоподобен** | PASS (T6) | TG scrape + LLM + Python pipeline — проверенные примитивы. |
| **Test 5: Time-to-value короток** | PASS (T6) | Первый матч может прийти в тот же день после signup. |
| **Test 6: Проблема сохраняется на выбранном scope** | PASS (T6) | Пока TG остаётся publishing surface для этих объявлений. |
Gateway-вердикт: PASS. Downstream PM работа оправдана.
Watch (per F5): Если TG требует login для чтения t.me/s/..., или если userbot acquisition становится невозможным, Tests 1 и 6 ломаются — перефреймить.
7. Constraint Mapping (F6)
| # | Constraint Type | Ограничение | Severity | Действие |
|---|---|---|---|---|
| 1 | Technical | Telegram web-pages (`t.me/s/...`) должны быть достижимы. | HIGH | Если заблокировано, fallback на userbot. |
| 2 | Technical | MiniMax M2.1 API key требуется (`MINIMAX_API_KEY`). | HIGH | Без ключа LLM filtering fails. |
| 3 | Operational | SOCKS5 proxy на TG-аккаунт (5 аккаунтов, 1:1 binding). | HIGH | Fail-closed без прокси. |
| 4 | Operational | Telegram rate limits + flood-wait cooldown. | MED | Lease manager уже обрабатывает. |
| 5 | Compliance | TG ToS — userbot режим в серой зоне. | MED | Документировать риск; Telegram Payments через Bot API полностью compliant. |
| 6 | Resource | LLM cost на матч (~€0.05-0.10). | LOW | Мониторить; alert если превышает threshold. |
| 7 | Scope | Web-mode ограничен публичными источниками (`t.me/c/...` требует аккаунта). | MED | Задокументировано в README. |
| 8 | Market | Конкурент-агрегатор (ImmobilienScout24), входящий в нишу. | HIGH | Дифференцировать на real-time + freemium + TG-native. |
| 9 | Compliance | GDPR для EU пользователей (Montenegro — EU кандидат, не член). | MED | Реализовать data retention policy; consent для marketing. |
| 10 | Market | Telegram policy по paid bots. | MED | Использовать Telegram Payments API (compliant). |
Предполагаемое ограничение помечено для Assumption Registry: «Telegram продолжит экспонировать public web-views» + «Telegram Payments останется доступным для русскоязычных пользователей». Если ложно, архитектура пивотируется.
8. Prioritized Sub-Problems (ICE × RICE)
| Sub-problem | Impact | Confidence | Ease | ICE | Rank |
|---|---|---|---|---|---|
| Фрагментация supply: renter не видит все объявления | 5 | 5 | 4 | 4.67 | 1 |
| Latency: хорошие объявления забираются за часы | 4 | 5 | 4 | 4.33 | 2 |
| Формат: free-text объявления трудно фильтровать | 4 | 5 | 5 | 4.67 | 1 |
| Координация: пары/семьи ищут вместе | 3 | 3 | 4 | 3.33 | 4 |
| Осведомлённость о ценовом тире: пользователь хочет ≤ 700 EUR | 5 | 5 | 5 | 5.00 | 0 (базовое требование) |
| Soft criteria: вид, мебель, этаж | 3 | 3 | 3 | 3.00 | 5 |
9. Recommendations (O->I->R->C->W Cascade)
Recommendation 1: Вести с free tier как wedge; брать плату за premium фильтры.
Recommendation 2: Сделать audit trail дифференциатором vs generic scrapers.
Recommendation 3: Рассматривать Telegram как стратегический риск.
Adversarial Self-Critique
Weakness 1: «Проблема реальна» предполагает активных searchers в этой нише.
Что если большинство аудитории TG-канала — landlords, постящие объявления, а не renters, ищущие? Supply side видим; demand side выведен. Disprove scenario: если signup rate < 5% уникальных зрителей канала за 90 дней, спрос переоценён.
Weakness 2: «Switching cost около нуля» предполагает renters хотят TG-native relay.
Что если они предпочли бы email digest или web app? Они бы уже построили. Disprove scenario: если 50%+ новых signups запрашивают email доставку, channel assumption неверен.
Weakness 3: Framing ретроспективен.
Мы фреймим проблему после существования решения. Это рискует confirmation bias. Mitigation: Stage 02 должен включать external evidence (channel post rates, peer Montenegro tools), который не project-internal.
Revision Triggers
| Триггер | Что переоценить | Timeline |
|---|---|---|
| TG изменяет доступ к public web-page. | Constraint #1, Test #6. | immediate. |
| Freemium конверсия < 1% через 90 дней. | Recommendation 1, pricing. | quarterly. |
| Audit log unused by > 50% пользователей. | Recommendation 2, P1. | quarterly. |
| Конкурент-агрегатор запускает бесплатные алерты. | Constraint #8, positioning. | quarterly. |
| GDPR enforcement ужесточается для Montenegro. | Constraint #9, data policy. | annually. |
Sources
Синтез исследований обнаружения: Realty Relay Bot
Входы: product/01-problem-framing.md (PRODUCED)
Резюме
Три потока evidence синтезированы для проблемного пространства Realty Relay Bot: (1) project-internal evidence (T6), описывающее наблюдаемое поведение и операционные ограничения; (2) external best-practice evidence (T3) о лимитах публичного Telegram-channel scrape и возможностях MiniMax M2.1 API; (3) inferred market-structure evidence (T5) о Telegram как доминирующей listing surface для Montenegro rentals. Нет first-party user interview data (T1/T2) — это критический research gap, зафиксированный в §7. Самое сильное подтверждённое наблюдение: supply фрагментировано между несколькими низко-объёмными публичными каналами с пересекающимися репостами; самая сильная гипотеза: audit + soft-criteria scoring + freemium conversion — недообслуженный слой, не сам скан.
Как читать этот документ
Синтез организован по evidence strength (§2), user-need patterns (§3), stated vs. revealed preferences (§4), signal/noise balance (§5), triangulation (§6), research gaps (§7). Наблюдения помечены VALIDATED / EMERGING / HYPOTHESIS. Секции, заканчивающиеся «Skipped», отмечены когда базовые данные недоступны.
Notation Key
| Tag | Tier | Значение |
|---|---|---|
| (T1) | First-party quantitative | Хард-метрики из продукта/использования. |
| (T2) | First-party qualitative | Прямые пользовательские отчёты. |
| (T3) | Authoritative external | Telegram docs, MiniMax docs, EU/GDPR. |
| (T4) | Secondary external | Web-survey data (TBD — research gap). |
| (T5) | Inferred | Логический вывод. |
| (T6) | Anecdotal / project context | README, прежнее знание. |
Confidence: VALIDATED / EMERGING / HYPOTHESIS.
Step 0: Context Fitness Check
| Критерий | Вердикт | Заметка |
|---|---|---|
| Problem definition существует | ДА (T6) | Stage 01 PRODUCED. |
| Хотя бы один source stream доступен | ДА (T6) | Project repository + TG API docs (T3). |
| User interviews возможны | ЕЩЁ НЕТ (T6) | TG channel posting + survey зрителей канала feasible. |
| Behavioral data доступны | ЧАСТИЧНО (T6) | Логи бота доступны; не извлечены. |
| Verdict | RUN WITH GAPS | Запустить синтез; зафиксировать interview gap. |
Step 0b: Framework Selection
Выбрано: Evidence Triangulation, Stated vs. Revealed Preference, Signal vs. Noise Assessment.
Не выбрано: JTBD interview protocol (применён в Stage 01 §4); diary studies (преждевременно).
1. Source Inventory & Quality Assessment
| Источник | Тип | Tier | Reach | Ограничение |
|---|---|---|---|---|
| `README.md` (homefinder) | Project context | T6 | Внутренний | Self-reported, нет first-party метрик. |
| `SPEC.md` | Implementation | T6 | Внутренний | Деталь реализации, не user evidence. |
| `data/web_cache.json` | Operational log | T1 (когда извлечён) | Внутренний | Не извлечён. |
| `OUT_JSON/report.json` | Per-run report | T1 (когда извлечён) | Внутренний | Не извлечён. |
| Telegram public web pages | Channel surface | T3 | Публичный | Rate-limited. |
| MiniMax M2.1 API docs | Provider docs | T3 | Публичный | Управляется провайдером. |
| Montenegro rental aggregators (nekretnine.me, cityexpert.me) | Market structure | T4 (TBD) | Публичный | Не перечислены. |
| TG-channel posting rate survey | Market data | T4 (TBD) | Публичный | Не проведён. |
| User interviews (renters) | Direct qualitative | T2 (TBD) | Внутренний | **НЕ ПРОВЕДЕНЫ** — gap. |
2. Key Findings (Evidence-Graded)
Finding 1: Supply фрагментировано между несколькими низко-объёмными публичными каналами
- Evidence: README упоминает «configured Telegram public groups/channels» (T6); Montenegro rental scene известен как TG-центричный для renter'ов.
- Confidence: VALIDATED.
- Implication: Один канал недостаточен; бот должен ингестить N каналов и де-дуплицировать.
- Tier: T6.
- Evidence: Hard criteria (цена, BR, локация) не парсятся regex'ом; soft criteria (вид, мебель) требуют суждения. MiniMax M2.1 LLM требуется (T6).
- Confidence: VALIDATED.
- Implication: LLM — load-bearing компонент, не luxury.
- Tier: T6.
- Evidence: README + TG API docs (T3).
- Confidence: VALIDATED.
- Implication: Reach ограничен решением TG сохранять
t.me/s/...публично доступным. - Tier: T6 + T3.
- Evidence: README + binding file (T6).
- Confidence: VALIDATED.
- Implication: Операционная стоимость включает proxy management.
- Tier: T6.
- Evidence: TG-native rental tools обычно монетизируются через freemium (T5); нет прямых конкурентных данных (T4 — gap).
- Confidence: HYPOTHESIS — single-source inference.
- Implication: 5 бесплатных матчей/мес + €4.99/мес paid — предполагаемый wedge; нужна валидация post-launch.
- Tier: T5.
- Evidence: Hard criteria — table-stakes; soft criteria (вид, мебель, этаж) требуют LLM scoring — более дорогая операция.
- Confidence: HYPOTHESIS.
- Implication: Premium tier предлагает soft-criteria filtering; free tier — только hard.
- Tier: T5.
- Observation (T6): И Stage 01, и Stage 02 полагаются на T6.
- Implication: User-need patterns — HYPOTHESES, не findings. Downstream spec риск повышен.
- Response: Назначить 5-10 интервью с target renters.
- Confidence: H.
- Watch: Если интервью не могут быть назначены, эскалировать к письменному опроснику.
- Observation (T6): Без инструментации, conversion неизмерим.
- Response: Поставить инструментацию с v1.1 до включения paid tier.
- Confidence: H.
- Watch: Если conversion неизмерен, pricing decisions — догадки.
- Observation (T6): Весь продукт зависит от
t.me/s/.... - Response: Stage 09 должен включать contingency tier.
- Confidence: H.
- Watch: TG dev-blog; ежеквартально.
product/01-problem-framing.md(T6) — upstream problem definition./Users/paveldmitriev/Work/homefinder/README.md(T6) — поведение продукта./Users/paveldmitriev/Work/homefinder/SPEC.md(T6) — реализация./Users/paveldmitriev/Work/homefinder/.env.example(T6) — env-var surface.- Telegram
t.me/s/...public web-pages (T3). - MiniMax M2.1 API (T3).
- SOCKS5-per-account binding (T6).
Finding 2: Объявления неформальны и мультиязычны
Finding 3: Telegram web-pages (`t.me/s/...`) — public-readable surface
Finding 4: SOCKS5/proxy-per-account — жёсткое операционное ограничение
Finding 5: Freemium — правильный monetization wedge (HYPOTHESIS)
Finding 6: Soft-criteria filtering — premium tier дифференциатор (HYPOTHESIS)
3. User Need Patterns
| Паттерн | Описание | Tier | Confidence |
|---|---|---|---|
| Real-time relevance | Новые матчи в течение ≤ 10 минут после поста. | T6 | VALIDATED |
| Hard-criteria precision (free tier) | Нет false positives, нарушающих hard criteria. | T6 | VALIDATED |
| Soft-criteria signal (paid tier) | Вид на горы, новая мебель, этаж ≥ 3 — экспонированы. | T5 | HYPOTHESIS |
| Координация между со-ищущими | Пары/семьи ищут вместе. | T5 | HYPOTHESIS |
| Audit trail | «Видел ли бот это объявление?» — отвечаемо. | T5 | EMERGING |
| Низкий операционный шум | Нет спама, дубликатов, off-topic каналов. | T6 | EMERGING |
4. Stated vs. Revealed Preferences
| Измерение | Stated | Revealed | Tension? |
|---|---|---|---|
| Latency | 10-мин polling (T6) | TBD | Не наблюдается. |
| Каналы | Публичные каналы (T6) | TBD | Возможно (N каналов неизвестно). |
| Hard-criteria strictness | Строгие (T6) | TBD | Латентная. |
| Soft-criteria filter usage | Неизвестно | TBD — должно драйвить free→paid conversion | Латентная. |
| Delivery channel | TG DM (T6) | TBD | Не наблюдается. |
5. Signal vs. Noise Assessment
| Поток | Signal | Noise source | Механизм фильтра |
|---|---|---|---|
| `t.me/s/...` body text | Тело объявления. | Casual chat, репосты, off-topic. | MiniMax M2.1 LLM (T6). |
| `t.me/s/...` media | Фото. | Мемы, off-topic изображения. | LLM оценивает (T6, предполагается). |
| Cross-channel репосты | Несколько источников для одного апартамента. | Дублирование. | Dedup по listing hash (T6). |
| Off-channel объявления | Аренда вне мониторимых каналов. | Не захватывается. | Вне scope. |
| Premium-only soft criteria | Вид на горы, новая мебель. | Смешано с hard-criteria filtering. | Premium tier gate. |
6. Evidence Triangulation Summary
| Утверждение | Источник A | Источник B | Вердикт |
|---|---|---|---|
| Polling cadence = 10 мин. | README (T6) | TG API rate limits (T3) | VALIDATED. |
| Hard criteria LLM-evaluated. | README (T6) | MiniMax docs (T3) | VALIDATED. |
| SOCKS5 требуется. | README (T6) | account_proxy_bindings.json (T6) | VALIDATED. |
| Freemium — правильный wedge. | T5 inference (нет прямых данных) | TBD | HYPOTHESIS. |
| Soft-criteria = paid дифференциатор. | T5 inference | TBD | HYPOTHESIS. |
7. Research Gap Map
| Gap | Почему важно | Criticality | Следующий метод |
|---|---|---|---|
| User interviews (T2) с target renters. | Невозможно валидировать user-need patterns. | HIGH | 5-10 интервью с renter демографией. |
| Behavioral метрики (T1) из логов. | Невозможно измерить precision/recall. | HIGH | Stage 23 events. |
| External market survey (T4) Montenegro rental market size. | Невозможно size TAM/SAM/SOM. | HIGH | Web research + government tourism data. |
| External competitive survey (T4) TG rental bots. | Невозможно валидировать «нет конкурента». | HIGH | TG bot search + listing. |
| Freemium conversion benchmarks (T4) для TG-native rental tools. | Невозможно установить pricing с уверенностью. | MED | Industry reports. |
8. Cross-Source Contradictions
| Противоречие | Источник A | Источник B | Резолюция |
|---|---|---|---|
| Web-mode vs userbot-mode как default. | README §Setup (T6) | README §Telegram accounts proxy (T6) | Нет реального противоречия — два режима. Использовать web-mode для v1.0. |
| LLM использование. | `MINIMAX_API_KEY` для `/run_hours` (T6) | Hard criteria просты числовые (T6) | Hard criteria LLM-evaluated из free text, не regex. |
9. Competitive Discovery Findings (if applicable)
Пропущено — см. Research Gap Map.
10. Strategic Recommendations (O->I->R->C->W Cascade)
Recommendation 1: Рассматривать user interviews как highest-priority research input.
Recommendation 2: Определить события инструментации до запуска paid tier.
Recommendation 3: Зафиксировать стратегию Telegram-архива до любого расширения.
Assumption Registry
| # | Предположение | Источник | Риск если ложно |
|---|---|---|---|
| A1 | Telegram продолжит экспонировать public web-views. | T3 | HIGH — пивотирует архитектуру. |
| A2 | 5 бесплатных матчей/мес — правильный freemium wedge. | T5 | MED — влияет на conversion. |
| A3 | €4.99/мес ниже perceived-value threshold. | T5 | MED — влияет на conversion. |
| A4 | Soft-criteria filtering — premium дифференциатор. | T5 | MED — влияет на differentiation. |
| A5 | Off-peak post rates не доминированы спамом. | T5 | LOW — влияет на user experience. |
Adversarial Self-Critique
Weakness 1: Этот синтез — single-actor retrospective.
Нужен хотя бы один внешний источник (не-founder) для триангуляции.
Weakness 2: T6 (project-internal) перевешена.
Почти каждое утверждение о поведении пользователя по существу self-report. Метки уверенности честны, но downstream reader может over-trust.
Weakness 3: Competitive discovery отложен.
Web search поймал бы (или исключил) конкурентов. Deferral рационализирован, но функционально gap.
Revision Triggers
| Триггер | Что переоценить | Timeline |
|---|---|---|
| User interview завершён | §3 patterns, §4 stated-vs-revealed | в течение 1 цикла |
| Bot logs извлечены (T1) | §5 signal/noise, §6 triangulation | в течение 1 цикла |
| External market survey проведён | §1 source inventory, TAM/SAM/SOM | в течение 1 цикла |
| Telegram policy change | §A1, R3 | немедленно |
Sources
Конкурентный анализ рынка: Realty Relay Bot
Входы: product/01-problem-framing.md, product/02-discovery-research.md (PRODUCED)
Резюме
Realty Relay Bot занимает niche-of-one конкурентную позицию в Telegram-native long-term rental курации для Montenegro. Ближайшие конкурентные классы: (1) generic Telegram-channel scrapers (без курации, без LLM), (2) Montenegro rental aggregators (nekretnine.me, cityexpert.me — слабое покрытие в ≤ 700 EUR нише), (3) real-estate агенты (другая unit economics), (4) неструктурированные TG-каналы (status quo), (5) сама платформа Telegram (Tier-1 риск). Прямого freemium Telegram-native конкурента в этой нише не идентифицировано. Доминирующий конкурентный риск — не один конкурент — это комбинация (a) изменения политики TG, (b) агрегатор, запускающий бесплатные алерты в нашей нише, (c) generic scraper, добавляющий LLM курацию. У нас нет first-party конкурентного evidence (T1/T2/T4 web-survey); этот анализ построен из project-internal context (T6) и структурированной таксономии конкурентных классов. External competitive survey зафиксирован как research gap.
Step 0: Context Fitness Check
| Критерий | Вердикт | Заметка |
|---|---|---|
| Problem definition существует | ДА (T6) | Stage 01 PRODUCED. |
| Discovery synthesis существует | ДА (T6) | Stage 02 PRODUCED. |
| External source достижим | НЕ В ЭТОМ ПРОГОНЕ (T6) | Web access не использовался. |
| Verdict | RUN WITH GAPS | Построить competitive-class taxonomy; зафиксировать external-survey gap. |
1. Competitive Set
Конкурентный set декомпозирован по классу, не по именованному вендору.
| Класс | Описание | Угроза | Tier | Evidence |
|---|---|---|---|---|
| **A. DIY Telegram scrapers** | Open-source repos (Telethon, Pyrogram) для self-host. | LOW-MED | T5 | T6 (выведено из публичной поверхности TG API). |
| **B. TG «rental alert» боты в других гео** | Боты в более крупных рынках (Москва, Тбилиси). | LOW — другая гео. | T5 | T6 (общая отраслевая осведомлённость). |
| **C. Montenegro rental aggregators** | Локальные сайты (nekretnine.me, cityexpert.me, local.me). | MED в этой нише. | T4 (предполагается) | T6 (предполагаемое существование). |
| **D. Real-estate агенты** | Человеческий сервис с комиссией. | MED (другая unit economics). | T6 | T6 (выведено). |
| **E. Direct-to-landlord listings (OLX, Avito-class)** | Локальные аналоги Avito/OLX. | MED — мог бы быть лучшим data source. | T5 | T6 (выведено). |
| **F. Неструктурированные TG-каналы** | Status quo: renter листает несколько каналов вручную. | HIGH (это текущая альтернатива пользователя). | T6 | T6 (наблюдаемо). |
| **G. Telegram платформа** | Может изменить `t.me/s/...` доступность. | HIGH (экзистенциальный). | T3 | T3 (политическая поверхность TG). |
| **H. Cross-platform rental apps (Airbnb, Booking)** | Для long-term stays (30+ дней). | MED для некоторых пользователей. | T6 | T6 (общий рынок). |
Критическое наблюдение: Классы F (status quo) и G (платформа) — HIGH-threat. Класс C (агрегаторы) — MED и может эскалироваться, если они добавят TG-alert функции.
2. 7 Powers Heat Map
| Power | Оценка (1-5) | Evidence | Заметка |
|---|---|---|---|
| **Scale economies** | 2 | Ограничены при запуске; freemium модель масштабируется с пользователями. (T6) | Ограничены при запуске. |
| **Network economies** | 3 | Больше пользователей = больше referral = больше пользователей. (T5) | Умеренные. |
| **Counter-positioning** | 4 | Агрегаторы не могут легко match TG-native + freemium. (T5) | Сильная defensibility. |
| **Switching costs** | 2 | Низкие на free tier; выше на paid (cumulative LTV). (T5) | Растут с tenure. |
| **Branding** | 1 | Нет бренда при запуске. (T6) | Никакого. |
| **Cornered resource** | 3 | Channel partnerships (потенциал эксклюзивности) + LLM expertise. (T5) | Умеренные. |
| **Process power** | 3 | LLM prompt tuning + curation experience. (T6) | Умеренные. |
Вердикт: Counter-positioning — самый сильный moat. Агрегаторы не могут легко реплицировать TG-native + freemium + LLM курацию в ≤ 700 EUR нише. Network economies растут медленно, но компаундируются.
3. Switching Cost Decomposition
| Измерение переключения | Стоимость | Заметка |
|---|---|---|
| Tooling | 0 | Выбросить бот, вернуться к ручному. (T5) |
| Data | 0 | Нет data lock-in. (T5) |
| Workflow | LOW на free tier; MED на paid | Paid пользователи инвестируют в изучение premium filters. (T5) |
| Learning | 0 на free; LOW на paid | Onboarding для premium tier. (T5) |
| **Total** | **0 → MED (с tenure)** | Switching cost растёт с paid-tier tenure. |
4. Aggregation & Disruption Analysis
Aggregation theory: Не применимо — single-sided рынок (renters, не two-sided).
Disruption analysis (Christensen):
- Incumbent: Ручное сканирование + real-estate агенты.
- Sustainers: Агрегаторы (ImmobilienScout24, local.me) — premium service.
- Disruptor: Этот бот — low-end foothold, real-time, freemium.
- Траектория: Disruptor остаётся на low end initially; может расти up-market, если качество доказано.
- Telegram web-pages = commodity (публичные, хорошо задокументированы).
- MiniMax M2.1 LLM call = product (мы строим prompt).
- Per-user hard+soft criteria filtering = custom (ни у кого нет для этой ниши).
- Freemium enforcement + audit trail = custom (дифференциатор).
- Существующие конкуренты конкурируют по объёму объявлений и агентской комиссии.
- Мы отсутствуем на обеих осях.
- Мы конкурируем по freshness (≤ 10 мин), precision (hard criteria), personalization (soft criteria, paid), и цене (€4.99/мес vs free).
- Observation (T5): Агрегаторы не могут легко match эту комбинацию.
- Implication: Усилия должны концентрироваться там.
- Response: Stage 12 должен возвысить это до first-class.
- Confidence: H.
- Watch: Если агрегатор запускает TG алерты, перефреймить.
- Observation (T6): Stage 02 уже зафиксировал это как research gap.
- Response: 30-мин web search для TG rental bots + Montenegro aggregators.
- Confidence: M.
- Watch: Если конкурент найден, перефреймить этот документ.
- Observation (T5): Топ 3-5 TG каналов контролируют supply.
- Response: Reach out для cross-promo или эксклюзивности.
- Confidence: M.
- Watch: Если каналы откажут, полагаться только на scraping.
product/01-problem-framing.md(T6) — problem framing.product/02-discovery-research.md(T6) — discovery synthesis./Users/paveldmitriev/Work/homefinder/README.md(T6) — поведение продукта./Users/paveldmitriev/Work/homefinder/SPEC.md(T6) — реализация.- Telegram public web-pages behavior (T3).
- MiniMax M2.1 API (T6, из
.env.example). - Общая отраслевая осведомлённость об экосистеме TG bot'ов (T5, не surveyed).
- Общая отраслевая осведомлённость о Montenegro rental market (T5, не surveyed).
Implication (T5): Продукт — disruptor с путём к mainstream, если может доказать precision/recall.
5. Strategy Reverse-Engineering
| Конкурент | Заявленная стратегия | Выявленная стратегия | Gap |
|---|---|---|---|
| Ручное сканирование | (нет заявленной стратегии) | Выживать на attention budget. | Не может выдержать 10-мин cadence. |
| Montenegro aggregators | Быть каталогом объявлений. | Максимизировать объявления, не алерты. | Нет per-user hard-criteria alert. |
| Real-estate агенты | Быть full-service broker. | Максимизировать closed deals. | Сервисная комиссия + медленно. |
| Generic TG scrapers | Быть «get all messages» инструментом. | Максимизировать channel coverage. | Нет курации, нет LLM. |
Wardley Map Findings:
Where to play: Custom слой — per-user filtering + audit trail + freemium enforcement.
How to win: Владеть курацией + audit + freemium слоем; пусть всё остальное будет plug-in.
6. Blue Ocean Check
Strategy Canvas:
ERRC Grid:
| Eliminate | Reduce | Raise | Create |
|---|---|---|---|
| Объём объявлений (нам не нужно 10 000 объявлений; ~50-100 в нише достаточно). | Off-topic content. | Match freshness. | Per-listing audit log. |
| Агентская комиссия. | Время ручного сканирования. | Hard-criteria precision. | Cross-user dedup. |
| Aggregator-style UI. | Generic scraper noise. | Soft-criteria personalization. | Freemium paywall UX. |
7. Adoption Stage Assessment
| Вопрос | Наблюдение |
|---|---|
| TAL позиция | Early Adopter (целевая tech-literate expats). |
| Chasm статус | Pre-chasm. |
| Whole product gap | Onboarding flow + payment integration нужны. |
| Bowling alley head pin | Russian-speaking expat community в Montenegro (нишевая, но достижимая). |
8. Tactical Layer
| Тактика | Цель | Tier | Заметка |
|---|---|---|---|
| Channel partnerships с топ 3-5 TG rental channels. | Эксклюзивное или полу-эксклюзивное покрытие. | T5 | Переговоры о cross-promo. |
| Content marketing (блог о жизни в Montenegro для expats). | SEO + brand. | T5 | Долгосрочно. |
| Referral mechanics (invite-a-friend, оба получают +1 free матч). | Viral growth. | T5 | Дёшево. |
| TG Payments integration. | Compliance + conversion. | T3 | Требуется для paid tier. |
| Freemium paywall UX. | Conversion optimization. | T5 | A/B test. |
9. Win/Loss Pattern Mapping
| Паттерн | Статус | Implication |
|---|---|---|
| Мы «выигрываем» (renter подписывает lease через bot-матч). | Не измерено. | Stage 23 инструментацияция. |
| Мы «проигрываем» (renter уходит после free tier). | Не измерено. | Stage 23 инструментацияция. |
| Churn (paid user downgrades). | Не измерено. | Stage 23 инструментацияция. |
10. Strategic Recommendations (O→I→R→C→W Cascade)
Recommendation 1: Рассматривать counter-positioning (TG-native + freemium + LLM) как defensible слой.
Recommendation 2: Запустить external competitive survey до заявления «niche of one».
Recommendation 3: Построить channel partnerships как cornered resource.
Three Horizons Threat Landscape
| Горизонт | Угроза | Mitigation |
|---|---|---|
| **H1 (сейчас)** | Ручное сканирование (HIGH). | Freemium onboarding. |
| **H1 (сейчас)** | Репликация DIY scraper'а (LOW-MED). | Counter-positioning (freemium + LLM). |
| **H2 (12-24 мес)** | Aggregator добавляет TG alerts (MED). | Channel partnerships + audit trail. |
| **H3 (24+ мес)** | Изменение политики Telegram (HIGH). | Contingency tier в Stage 09. |
Cross-Framework Contradictions
| Противоречие | Источник | Резолюция |
|---|---|---|
| «7 Powers score 1-2 across the board» vs. «we are niche-of-one». | §2 vs. §6. | Оба верны: niche-of-one — позиционно, не power-based. |
| «TAL Early Adopter» vs. «broad market». | §7. | Оба верны — target — tech-literate expats внутри Montenegro market. |
Assumption Registry
| # | Предположение | Источник | Риск если ложно |
|---|---|---|---|
| C1 | Нет прямого freemium Telegram-native конкурента для Montenegro. | T5 (web survey не запускался) | HIGH — перефреймить. |
| C2 | Агрегаторы не добавляют TG-alert функции в ближайшие 12 мес. | T5 (выведено) | MED — перефреймить. |
| C3 | MiniMax M2.1 pricing стабильна. | T6 (публичной цены не наблюдалось) | MED — влияет на unit economics. |
| C4 | Telegram не потребует auth для `t.me/s/...`. | T3 | HIGH — экзистенциальный. |
| C5 | Russian-speaking expat демография достижима через TG каналы. | T6 | MED — влияет на distribution. |
Adversarial Self-Critique
Weakness 1: Нет external competitive data.
30-мин web search валидировал бы или инвалидировал бы C1. Deferral рационализирован, но C1 — load-bearing.
Weakness 2: Таксономия классов выведена.
8 классов в §1 — educated guesses, не competitive-landscape map.
Weakness 3: 7 Powers heat map честен, но бесполезен для freemium.
Counter-positioning силён; остальные powers слабые. Стратегия должна полагаться на positioning, не на powers.
Revision Triggers
| Триггер | Что переоценить | Timeline |
|---|---|---|
| External competitive survey завершён. | §1 competitive set, C1. | в течение 1 цикла. |
| TG изменяет доступ к `t.me/s/...`. | §1 class G, R3, C4. | немедленно. |
| Aggregator запускает TG alerts. | §1 class C, R1. | немедленно. |
| Freemium conversion < 1%. | Pricing, positioning. | quarterly. |
Sources
Карта путешествия: Realty Relay Bot — сквозная курация объявлений
Входы: product/01-problem-framing.md, product/02-discovery-research.md, product/03-competitive-market-analysis.md (PRODUCED)
Резюме
Сквозной путь rental объявления от «опубликовано в Telegram-канале» до «acted on by a renter» проходит через 5 стадий с одним primary actor (renter) и free/paid-tier split, влияющим на последние две стадии. Доминирующие pain points — Stage 3 (Bot filters), где LLM mis-classification — риск, и Stage 5 (Renter acts), где coordination и auditability — дифференциаторы. Самая большая возможность — сделать per-listing audit log first-class paid-tier фичей и сделать soft-criteria фильтр paid-tier gate.
Persona / Segment
- Primary user (Renter, free tier): Русскоязычный expat в Montenegro, tech-literate, 25-45 yo, ищет 2-8 недель, получает 5 матчей/мес, видит только hard-criteria.
- Primary user (Renter, paid tier): Та же персона, но платит €4.99/мес за unlimited матчи + soft-criteria фильтры (вид на горы, новая мебель, этаж ≥ 3).
- Secondary actor (Bot): Не-человеческий actor, который ингестит, фильтрует, дедупит, форвардит.
- Tertiary actor (Co-searcher): Партнёр/супруг, ищущий вместе (5-20% случаев).
Journey Scope
В scope: Пост в TG-канале → ingestion → LLM фильтр → dedup → free/paid-tier gate → форвард → renter читает → renter решает → renter пишет автору в ЛС.
Вне scope: Ответ автора, подписание lease, deposit payment, move-in. Вне платформы.
Стадии (5 именованных стадий)
| # | Стадия | Actor | Что происходит | Time-box |
|---|---|---|---|---|
| 1 | **Ingested** | Бот | TG-канал публикует новое сообщение; `t.me/s/...` опрашивается каждые 10 мин. | 0-10 мин после поста |
| 2 | **Parsed** | Бот | Body + media извлечены; кэшируются в `data/web_cache.json`. | < 1 мин |
| 3 | **Filtered** | Бот | MiniMax M2.1 оценивает hard + soft критерии; reject или accept. | < 1 мин |
| 4 | **Deduped + Tier-gated** | Бот | Cross-channel и cross-user dedup; free-tier counter (5/мес) или paid-tier unlimited. | < 1 мин |
| 5 | **Read + Decided + Acted** | Renter | Читает TG DM; проверяет audit log (paid); пишет автору в ЛС. | Часы до дней |
Touchpoints на стадию
| Стадия | Touchpoint | Инструментарий | Заметка |
|---|---|---|---|
| 1 | Публичный TG-канал | `t.me/s/...` | Жёсткая внешняя зависимость. |
| 2 | Локальный кэш | `data/web_cache.json` | Избегает re-parsing. |
| 3 | LLM call | MiniMax M2.1 API | `MINIMAX_API_KEY` требуется. |
| 4 | Tier counter + dedup | SQLite или in-memory | Free: 5/мес; Paid: unlimited. |
| 5 | User TG client | TG mobile/desktop | Off-platform действия. |
| 5 | Audit log (paid) | `data/audit/events.jsonl` | First-class paid фича. |
Эмоциональная кривая
| Стадия | Эмоция | Драйвер |
|---|---|---|
| 1 | Нейтрально | Бот делает свою работу. |
| 2 | Нейтрально | Механический парс. |
| 3 | Напряжение | Примет или отклонит LLM? Wrong-reject = пропущенный матч. |
| 4 | Мягкое удовлетворение | Матч прибывает. |
| 5 | Принятие решения | «Это то самое?» — самая большая нагрузка, самый длинный хвост. |
Pain Points и моменты истины
| Стадия | Pain point | Момент истины? |
|---|---|---|
| 1 | TG rate-limit / proxy требуется. | Да — silent failure. |
| 2 | Cache miss / re-parse cost. | Нет — восстановимо. |
| 3 | LLM mis-classification. | Да — false-negative = пропущенный матч (высокая стоимость). |
| 4 | Free-tier cap hit. | Да — conversion момент. |
| 4 | Cross-user dedup gap (для co-searchers). | Да — дублирующий DM. |
| 5 | Координация между co-searchers. | Да — самый большой открытый вопрос. |
Возможности (аннотированы на стадию)
| Стадия | Возможность | Какое изменение продукта адресует | Усилия |
|---|---|---|---|
| 1 | Экспонировать ingest health пользователю. | `/status` команда показывает last-poll time на канал. | Small |
| 3 | Логировать каждый LLM reject с причиной. | Append `rejected` event в per-listing log. | Small |
| 3 | Трекать soft-criteria score (paid). | Сохранять LLM confidence + soft-criteria breakdown. | Small |
| 4 | Сделать dedup наблюдаемым (paid). | Cross-user dedup log + "already seen by X" badge. | Medium |
| 4 | Audit-trail команда (paid). | `/seen <listing-id>` возвращает полную историю. | Small |
| 4 | Tier counter UX. | "3/5 free матчей в этом месяце" inline. | Small |
| 5 | Снизить координационное трение. | "Share with co-searcher" inline кнопка. | Medium |
Визуал — master diagram
timeline
title Listing Journey (Telegram → Action)
Ingested : TG post : Polled every 10 min : Cache updated
Parsed : Body + media extracted : Cached
Filtered : MiniMax M2.1 evaluates : Hard + soft criteria : Accept or reject
Deduped + Tier-gated : Cross-channel dedup : Cross-user dedup : Free 5/mo or paid unlimited
Read + Decided + Acted : User reads DM : Checks audit (paid) : DMs author : Lease off-platform
Sectional — Стадия 3 + 4 детально
flowchart LR
A[Parsed body] --> B{MiniMax M2.1}
B -- reject --> C[Append to log: rejected + reason]
B -- accept --> D{User tier?}
D -- free, counter >= 5 --> E[Append to log: cap_hit + upgrade_prompt]
D -- free, counter < 5 --> F[Compute dedup key]
D -- paid --> F[Compute dedup key]
F --> G{Already forwarded?}
G -- yes --> H[Append to log: dup-suppressed]
G -- no --> I[Forward to User]
I --> J[Append to log: forwarded-1]
Multi-tier таблица — Free vs Paid
| Стадия | Free tier | Paid tier |
|---|---|---|
| 1-3 | Идентично | Идентично |
| 4 | 5 матчей/мес cap | Unlimited |
| 4 | Hard-criteria only | Hard + soft-criteria фильтр |
| 4 | Нет audit log | Полный audit log + `/seen` + `/status` |
| 5 | Читает DM | Читает DM + audit + share button |
Research Gaps
| Gap | Почему важно | Criticality | Следующий метод |
|---|---|---|---|
| Нет per-listing event log извлечения. | Невозможно подтвердить, что Стадии 3-4 работают как описано. | HIGH | Stage 23 events. |
| Нет user interview по Стадии 5. | Невозможно валидировать coordination pain. | HIGH | 5-10 интервью. |
| Нет false-negative / false-positive rate измерено. | Невозможно калибровать Стадию 3. | HIGH | Stage 23 инструментацияция. |
| Нет данных о cross-channel repost rate. | Невозможно size dedup opportunity. | MED | Ручная выборка. |
| Нет данных о off-hours post rate. | Невозможно size 10-мин cadence relevance. | LOW | То же, что выше. |
| Нет данных о free→paid conversion drivers. | Невозможно optimize paywall. | HIGH | Post-launch A/B test. |
Cross-references
- Stage 01 §9 — дифференциаторы (audit, soft-criteria, freemium).
- Stage 03 §5 — counter-positioning wedge.
- Stage 09 — strategy bets.
- Stage 23 — instrumentation events.
Оценка размера рынка: Realty Relay Bot — Montenegro Long-Term Rental Curation
Входы: product/01-problem-framing.md через product/04-discover-journey-map.md (PRODUCED)
Резюме
Достижимый рынок для Realty Relay Bot — это русскоязычный long-term renter сегмент в Montenegro, конкретно Budva-Becici ценовой тир (≤ 700 EUR/мес). Top-down sizing от Montenegro inbound-migration + tourism + long-term rental demand даёт TAM ≈ 5-15K renters/год, SAM ≈ 1-3K/год (TG-active, русскоязычные, сфокусированные на Budva-Becici), SOM year 1 ≈ 100-500 paying users (1-5% SAM capture, консервативно). Bottom-up из unit economics: при €4.99/мес × 8 мес avg LTV = €40 LTV/user, year-1 revenue с 200 paying users ≈ €8K, scaling до €25-40K к year 2. Quick-estimate mode applies — все числа помечены T5/T6 с явным confidence-low; external market survey — critical research gap.
Определение рынка
В scope:
- Русскоязычные renters (primary); англоязычные expats (secondary).
- География: Budva и Becici (Montenegro).
- Ценовой тир: ≤ 700 EUR/мес.
- Тип недвижимости: апартаменты, 1+ спален, не studio.
- Срок: long-term rental (6-12 месяцев типично).
- Delivery surface: Telegram DM.
- Другие Montenegro гео (Bar, Tivat, Kotor, Podgorica) — будущее расширение.
- Другие ценовые тиры (700+ EUR luxury, < 500 EUR shoestring).
- Studio апартаменты.
- Short-term / vacation rentals.
- Другие delivery surfaces (email, web app).
- Landlords / агенты (B2B).
- N > 2 (target — renter демография, не internal builders).
- Telegram — delivery surface (T3 + T6).
- Freemium модель: 5 free + €4.99 paid (предполагается).
- TAM 5-15K (T5 inference, нет external data).
- Free→paid conversion 2-5% (industry benchmark, не Montenegro-specific).
- Avg paid lifetime 8 месяцев (heuristic, не измерено).
- External market survey Montenegro rental market.
- Montenegro Statistics Office (MONSTAT) данные по foreign residents.
- TG-channel posting rate анализ (сколько объявлений/мес на канал).
- Post-launch conversion data.
- Brand-building cost (content marketing, SEO).
- Customer support cost (Telegram-based, низкий).
- Multi-geo expansion cost (не в текущем roadmap).
- Tax / payment processing fees (~3% через TG Payments).
product/01-problem-framing.md(T6) — user base, geography, price tier.product/02-discovery-research.md(T6) — channel и signal structure.product/03-competitive-market-analysis.md(T6) — competitive set.product/04-discover-journey-map.md(T6) — stage flow./Users/paveldmitriev/Work/homefinder/README.md(T6) — product surface.- Industry benchmarks для freemium SaaS (T4 — gap; не surveyed).
- Никакой external market report не использовался в этом прогоне.
Вне scope (текущий продукт):
Top-down Sizing
Пропущено для individual data points — нет industry report доступного в этом прогоне. Выведенные величины (T5):
| Слой | Оценка | Источник |
|---|---|---|
| **TAM** = Montenegro inbound renters в target price tier | 5-15K / год | T5 (Montenegro ~ 20-30K иностранных резидентов; ~ 30-50% в long-term rental; ~ 20-40% в target price tier). |
| **SAM** = Telegram-active subset, которые self-curate | 1-3K / год | T5 (TG adoption ~ 80-90% среди русскоязычных expats; subset активно ищущих ~ 50-70%). |
| **SOM** = Budva-Becici subset, ≤ 700 EUR, year 1 | 100-500 paying users | T5 (SAM capture 1-5% в year 1; консервативно). |
Все величины — догадки, не измерения. Зафиксировано в §Confidence.
Bottom-up Sizing
Unit economics на paying user
| Переменная | Значение | Источник / Tier |
|---|---|---|
| Месячная подписка | €4.99 | T6 (предполагается) |
| Avg lifetime | 8 месяцев | T5 (rental search 2-8 недель × repeat tenancy cycles) |
| LTV на paying user | ~ €40 | Вычислено: €4.99 × 8 месяцев |
| Gross margin | ~ 90% | T5 (LLM cost ~ €0.05/матч × 20 матчей/мес = €1; infra negligible) |
| Net LTV на paying user | ~ €36 | Вычислено |
| Free→paid conversion rate | 2-5% | T5 (freemium SaaS industry benchmark; широкий диапазон) |
| Free users на paying user | 20-50 | T5 |
| Free user acquisition cost (CAC) | €0.50-2.00 | T5 (TG channel posting = €0; content marketing = €0.50-1.00 за signup) |
| Paying user CAC | €10-100 | Вычислено: free CAC × 20-50 |
| LTV / CAC ratio | 0.4-3.6 | Вычислено: €36 / €10-100 |
Вердикт: Unit economics маргинальные в year 1 (LTV/CAC < 1 в worst case) но улучшаются с retention. Year 1 — инвестиция в distribution; year 2+ должен видеть LTV/CAC > 1.
Year 1 revenue scenarios
| Сценарий | Paying users | MRR | Annual revenue |
|---|---|---|---|
| Консервативный | 100 | €500 | €6K |
| Базовый | 200 | €1K | €12K |
| Оптимистичный | 500 | €2.5K | €30K |
Year 2+ scenarios (предполагая 50% MoM growth cap)
| Год | Paying users | MRR | Annual revenue |
|---|---|---|---|
| Y1 | 200 | €1K | €12K |
| Y2 | 600 | €3K | €36K |
| Y3 | 1500 | €7.5K | €90K |
Multi-framework synthesis
| Фреймворк | Результат | Конвергенция / Дивергенция |
|---|---|---|
| Top-down (T5) | TAM 5-15K, SAM 1-3K, SOM 100-500 | Якорит sizing. |
| Bottom-up (T5) | Y1 €6-30K revenue | Согласовано с SOM. |
| Industry benchmark (T4 — gap) | Freemium SaaS conversion 2-5% | TBD; верифицировать post-launch. |
| Competitive-set (Stage 03) | Нет прямого конкурента | Если конкурент появится, SOM разделится. |
Конвергенция: SOM year 1 ≈ 100-500 paying users, €6-30K revenue.
Дивергенция: Смежный рынок (другие Montenegro гео, другие ценовые тиры) — вектор роста; не в текущем roadmap, но определяет потолок.
Sensitivity Analysis
| Переменная | Low | Mid | High |
|---|---|---|---|
| Free→paid conversion | 1% | 3% | 5% |
| Avg lifetime (месяцев) | 4 | 8 | 12 |
| TAM предположение | 5K | 10K | 15K |
| **Year 1 paying users** | **50** | **200** | **600** |
| **Year 1 revenue** | **€1K** | **€8K** | **€36K** |
Key Assumptions (явно)
| # | Предположение | Источник | Confidence | Что меняется если неверно |
|---|---|---|---|---|
| M1 | Montenegro long-term rental market: 5-15K русскоязычных renters в target price tier. | T5 | LOW | Сдвигает TAM 50-200%. |
| M2 | Telegram adoption: 80-90% среди русскоязычных expats. | T5 | MED | Сдвигает SAM 20-40%. |
| M3 | Free→paid conversion: 2-5%. | T5 | LOW | Сдвигает revenue 60-150%. |
| M4 | Avg paid lifetime: 8 месяцев. | T5 | LOW | Сдвигает LTV 50-150%. |
| M5 | €4.99/мес ниже perceived-value threshold. | T5 | MED | Влияет на conversion. |
| M6 | TG channel acquisition cost: ~ €0. | T6 | HIGH | Влияет на CAC. |
Confidence and Limitations
Наиболее уверены:
Наименее уверены:
Что улучшит уверенность:
Что этот анализ НЕ адресует:
Next Steps
| Рекомендация | Обоснование | Tier |
|---|---|---|
| External market survey (MONSTAT, tourism data). | M1 — load-bearing. | HIGH |
| TG-channel posting rate анализ. | Size the supply. | HIGH |
| Soft-launch в одном канале, измерить conversion. | Валидировать M3, M4. | HIGH |
| Re-run этого документа после 90 дней paid-tier data. | Заменить T5 на T1. | QUARTERLY |
Sources and References
JTBD Canvas: Realty Relay Bot
Входы: product/01-problem-framing.md (PRODUCED), product/02-discovery-research.md (PRODUCED)
Job Overview
Высоко-ставное, средне-частотное жизненное решение (long-term rental search 2-8 недель), выполняемое в фрагментированной информационной среде (Telegram-каналы, неформальные объявления, смешанные языки). Работа повторяется каждый раз, когда renter нуждается в новом жилье — типично 1-2 раза в год на renter.
Job Performer
- Primary: Русскоязычный renter в Montenegro, 25-45 yo, tech-literate, использует Telegram как основной мессенджер.
- Secondary: Co-searcher (партнёр/супруг) в 5-20% случаев.
- Tertiary: Сам бот — не-человеческий actor, выполняющий curation sub-job.
- Получить hard-criteria матч в течение 10 минут после channel post.
- Видеть полный контент объявления (текст + media) не покидая Telegram.
- Избегать дублирующего DM тому же автору.
- (Paid tier) Фильтровать по soft criteria (вид на горы, новая мебель, этаж ≥ 3).
- (Paid tier) Верифицировать через audit log, видел ли бот любое объявление.
- Уверенность, что я не пропустил хороший вариант.
- Спокойствие, что channel-stream шум отфильтрован.
- Облегчение от когнитивной нагрузки мониторинга 5-10 каналов.
- (Paid tier) Контроль над моими search criteria.
- (Когда ищешь с партнёром) Координироваться silently — без «ты видел это?» back-and-forth.
- Проецировать компетентность в housing decision.
- Работа узкая и высоко-ставная. Precision > recall; freshness > completeness; coordination > throughput.
- Работа разделена между двумя людьми и одним ботом (когда co-searching). Ценность бота — частично в том, чтобы двое людей выглядели как один координированный actor для landlords.
- Работа дремлет большую часть времени. Когда renter обеспечен жильём, бот молчит. Здоровое, не дефект.
- Работа — information-gathering, не транзакция. Бот upstream любого lease.
- Сколько hard-criteria матчей типичный renter acted on за search cycle? (T1 нужен)
- Какая доля matched объявлений — «uncertain» vs «definitely interested»? (T2 нужен)
- У co-searchers разные soft-criteria приоритеты? (T2 нужен)
- Как часто то же объявление появляется в 2+ каналах в polling window? (T1 нужен)
- Какое время суток — наивысшая match-density? (T1 нужен)
- Каков free→paid conversion rate по soft-criteria usage? (T1 нужен post-launch)
- Stage 01 §4 (JTBD Problem Framing) — предшественник; этот этап формализует его.
- Stage 04 §5 (Stage 5 pain point) — информирует «social job» framing.
- Stage 02 §7 (Research Gap Map) — интервью — следующий input.
- Stage 12 (specification-writing) — Job Statement в user-stories формате.
TAM: 5-15K renters/год. SAM: 1-3K/год. SOM year 1: 100-500 paying users.
The Circumstance
When: Renter между lease'ами или планирует переезд (2-8 недель активного поиска). Не в vacation-rental фрейме.
Where: Telegram (mobile или desktop) — renter уже в TG для messaging.
Что триггерит: Новое rental объявление появляется в мониторимом публичном канале, которое соответствует hard criteria (Budva/Becici, ≤ 700 EUR, 1+ BR, не studio).
Job Statement
> When подходящее long-term rental объявление появляется в публичном Telegram-канале, за которым я слежу, I want узнать о нём в течение 10 минут и иметь уверенность, что бот не напишет дважды тому же автору, если мой партнёр тоже ищет, so I can действовать до того, как объявление заберут.
Functional Job
Emotional Job
Social Job
Competing Solutions
| Решение | Как решает работу | Почему недостаточно |
|---|---|---|
| **Ручное TG сканирование** | Бесплатно. | Recall теряет данные; координация ручная; off-hours gaps. |
| **Montenegro aggregators** (nekretnine.me, cityexpert.me) | Агрегированные объявления, фото, цены. | Слабое покрытие в ≤ 700 EUR нише; не real-time. |
| **Локальный real-estate agent** | Full-service. | Комиссия (1 месяц аренды); медленно; не 24/7. |
| **Generic TG scrapers** | One-time build. | Нет курации; нет LLM; нет аудита. |
| **Email digests** | Дневная сводка. | Stale; не координировано. |
| **Ничего / stay put** | Default. | Теряет время и optionality. |
Hiring Criteria
| Критерий | Must-have | Nice-to-have | Заметка |
|---|---|---|---|
| Delivery = TG DM | ДА | — | Renter TG-native. |
| Latency ≤ 10 мин | ДА | — | Установлено polling cadence. |
| Hard-criteria precision (free) | ДА | — | False positives не приемлемы. |
| Soft-criteria фильтр | — | ДА (paid) | Premium дифференциатор. |
| Cross-user dedup | ДА | — | Избегает дублирующего DM. |
| Audit trail | — | ДА (paid) | Premium дифференциатор. |
| Per-user filter profiles | — | ДА | Будущая фича. |
| Multi-city | — | НЕТ | Сначала Budva-Becici. |
Insights and Implications
Supporting Quotes
Пропущено — нет T2 user-interview quotes доступных. Зафиксировано как research gap в Stage 02.
Questions for Further Research
Cross-references
Дерево возможностей: Realty Relay Bot
Входы: product/02-discovery-research.md, product/06-define-jtbd-canvas.md (PRODUCED)
Desired Outcome
Русскоязычные renters в Budva/Becici надёжно получают каждый hard-criteria матч в течение 10 минут, без дублирующего cross-channel шума, и с верифицируемым audit trail; с чётким путём от free к paid tier на основе доставленной ценности.
Visual Tree
Outcome: Reliable, deduplicated, audited match delivery
├── O1: Match precision
│ ├── S1.1: Tighten the LLM prompt against a labeled-reject sample
│ ├── S1.2: Add a second-pass rule-based filter (price, BR) post-LLM
│ └── S1.3: Calibrate soft-criteria scoring (paid tier)
├── O2: Match recall
│ ├── S2.1: Add more channels to the watchlist
│ ├── S2.2: Reduce polling interval from 10 min to 5 min
│ └── S2.3: Add userbot-mode for `t.me/c/...` channels
├── O3: Cross-user coordination (co-searchers)
│ ├── S3.1: Per-listing "seen by" log
│ ├── S3.2: "Share with co-searcher" inline button
│ └── S3.3: Suppress duplicate forward within 7 days
├── O4: Freemium paywall
│ ├── S4.1: Free-tier counter (5 matches/month)
│ ├── S4.2: Tier upgrade prompt at 4th match
│ └── S4.3: Telegram Payments integration
├── O5: Audit trail / observability (paid)
│ ├── S5.1: Per-listing event log (paid-only access)
│ ├── S5.2: `/seen <id>` command (paid)
│ └── S5.3: `/status` command (paid)
├── O6: Onboarding
│ ├── S6.1: Signup flow (Telegram-native, no email)
│ ├── S6.2: Tutorial / first match walkthrough
│ └── S6.3: Channel recommendations
└── O7: Operational resilience
├── S7.1: Detect Telegram rate-limit or proxy failure early
├── S7.2: Fallback to alternative listing surface
└── S7.3: MiniMax API cost monitor
Opportunity Branches
| ID | Возможность | Почему важно | Источник |
|---|---|---|---|
| O1 | Match precision | False-positives = шум; renter tunes out. | Stage 01 §4; Stage 04 §5. |
| O2 | Match recall | Пропущенный матч = высокая стоимость (1-3 lease'а/год на renter). | Stage 01 §4; Stage 04 §5. |
| O3 | Cross-user coordination | Co-searchers DM'ы. | Stage 01 §9; Stage 06 (social job). |
| O4 | Freemium paywall | Conversion = revenue. | Stage 01 §5; Stage 09. |
| O5 | Audit trail (paid) | Premium дифференциатор. | Stage 03 §5 (counter-positioning). |
| O6 | Onboarding | First-time UX драйвит retention. | T5 (freemium best practice). |
| O7 | Operational resilience | TG API — Tier-1 риск. | Stage 01 §7; Stage 03 §1 Class G. |
Prioritization
| Ранг | Решение | Возможность | Impact | Confidence | Effort | Вердикт |
|---|---|---|---|---|---|---|
| 1 | S4.3 Telegram Payments integration | O4 | H | H | M | **Делать первым** — требуется для любого paid tier. |
| 2 | S4.1 Free-tier counter | O4 | H | H | S | **Делать первым** — пара с S4.3. |
| 3 | S6.1 Signup flow | O6 | H | H | M | **Делать первым** — требуется для захвата free users. |
| 4 | S5.1 Per-listing event log (paid) | O5 | H | M | M | **Делать** — premium дифференциатор. |
| 5 | S3.1 Per-listing "seen by" log | O3 | M | M | S | **Делать** — coordination дифференциатор. |
| 6 | S3.3 Suppress duplicate forward | O3 | M | H | S | **Делать** — пара с S3.1. |
| 7 | S4.2 Tier upgrade prompt | O4 | M | M | S | **Делать** — conversion optimization. |
| 8 | S5.2 `/seen` команда (paid) | O5 | M | M | S | **Делать** — экспонирует S5.1. |
| 9 | S5.3 `/status` команда (paid) | O5 | M | M | S | **Делать** — операционная гигиена. |
| 10 | S7.1 Rate-limit / proxy detection | O7 | H | M | M | **Делать** — Tier-1 риск. |
| 11 | S6.2 Tutorial / first match | O6 | M | M | S | **Отложить** — ship если retention низкий. |
| 12 | S6.3 Channel recommendations | O6 | M | L | S | **Отложить** — manual curation initially. |
| 13 | S1.1 Tighten LLM prompt | O1 | H | M | M | **Отложить** — нужен S5.1 для измерения. |
| 14 | S1.3 Calibrate soft-criteria | O1 | M | M | M | **Отложить** — зависит от paid-tier data. |
| 15 | S2.1 More channels | O2 | M | M | M | **Отложить** — recall ещё не измерен. |
| 16 | S2.2 5-min polling | O2 | M | H | S | **Отложить** — только если recall — bottleneck. |
| 17 | S2.3 Userbot для `t.me/c/...` | O2 | M | M | L | **Отложить** — proxy cost HIGH. |
| 18 | S3.2 "Share" inline кнопка | O3 | M | M | M | **Отложить** — feature creep risk. |
| 19 | S1.2 Second-pass rule-based filter | O1 | M | H | S | **Отложить** — текущий LLM, вероятно, достаточен. |
| 20 | S7.2 Fallback aggregator | O7 | M | M | L | **Отложить** — Stage 09 contingency. |
| 21 | S7.3 MiniMax cost monitor | O7 | L | H | S | **Отложить** — cost мал по Stage 05. |
Experiments Backlog
| Sol | Самое рискованное предположение | Эксперимент | Результат если invalid |
|---|---|---|---|
| S4.3 | TG Payments работает для русскоязычных пользователей. | Тест в TG sandbox; верификация с 1-2 beta users. | Использовать Stripe fallback. |
| S5.1 | Audit log — premium дифференциатор. | A/B test: paid-with-audit vs paid-without. | Revert к audit-only-for-power-users. |
| S3.1 | Co-searcher dedup ценен. | Измерить: % paid users с co-searchers. | Если < 5%, deprioritize O3. |
| S4.2 | Upgrade prompt на 4-м матче оптимален. | A/B test: 3-й, 4-й, 5-й матч. | Переместить trigger. |
| S1.1 | LLM prompt может быть уточнён без поломки soft-criteria. | Labeled-reject sample из 30 объявлений; A/B prompt. | Остаться с текущим prompt. |
Learning Log
| Цикл | Что узнали | Источник |
|---|---|---|
| C0 (сейчас) | Freemium — wedge; soft-criteria + audit = paid дифференциаторы. | Stages 01-05. |
| C1 (post-launch) | TBD — в ожидании free→paid conversion data. | — |
Next Steps
- Stage 12 (specification-writing) — выразить S4.1, S4.3, S6.1, S3.1, S3.3, S5.1, S5.2, S5.3, S7.1 как first-class user-stories.
- Stage 23 (measure-instrumentation-spec) — определить события для S5.1; substrate для S4.2 conversion measurement.
- Отложить S1.1, S1.3, S2.*, S3.2, S6.2, S6.3, S7.2, S7.3 в v2 или post-launch.
- Назначить 5-10 user interviews (Stage 02 §7 gap) для валидации S4.2 и S5.1 priority.
- Stage 04 (journey map) — Stage 3 и Stage 4 pains = O1, O2, O3, O4.
- Stage 01 §9 — дифференциаторы (audit, soft-criteria, freemium).
- Stage 03 §6 ERRC (Create) — «Create» колонка отображается на O4, O5.
- Stage 12 (specification-writing) — первый user-stories target.
- Stage 23 (measure-instrumentation-spec) — события для O5.
Cross-references
Фреймворк приоритезации: Realty Relay Bot
Входы: product/04-discover-journey-map.md, product/06-define-jtbd-canvas.md, product/07-define-opportunity-tree.md (PRODUCED)
1. Applicability Filter Summary
Три фреймворка приоритезации оценены для дерева возможностей Realty Relay Bot: ICE (always-applicable baseline), RICE (gated on reach + confidence), Kano (gated on customer-research input). ICE запущен как baseline. RICE запущен с явными low-confidence метками (нет first-party usage data). Kano исключён, потому что нет T2 customer-research data (Stage 02 §7 gap). Результат — единый ранжированный список 21 решений из Stage 07.
2. Inputs Summary
- Reach (на решение): TBD (зависит от free→paid conversion). Предположение: free tier достигает 1-3K renters; paid tier достигает 100-500.
- Impact: Project-internal оценка (T5/T6).
- Confidence: Project-internal оценка (T5/T6); нет T1 behavioral data.
- Effort: S/M/L (T6).
- Customer-research input: None (T2 gap).
- ICE и RICE scores — T5/T6 оценки, не измерены.
- Reach — illustrative (1.5K free, 300 paid) без T1 data.
- Нет Kano input означает Must-Have / Performance / Delighter метки выведены.
- Финальное ранжирование согласовано со Stage 07 §Prioritization.
- Feed S4.1, S3.3, S1.2, S2.2, S4.3, S6.1, S4.2, S5.1, S5.2, S5.3, S7.1 в Stage 12 как first-class user-stories.
- Назначить Kano survey для следующего цикла.
- Перезапустить этот скилл после Stage 23 инструментации и доступности T1 data.
Важная заметка о scoring: Без T1 reach data, RICE scores illustrative, не discriminative. ICE и RICE почти эквивалентны здесь; оба держим для документации completeness.
3. Per-framework Scoring Tables
3.1 ICE (Impact, Confidence, Ease)
Шкала: 1-5 на ось; финальная = (Impact + Confidence + Ease) / 3.
| Sol | Impact | Confidence | Ease | ICE |
|---|---|---|---|---|
| S4.3 Telegram Payments | 5 | 4 | 3 | 4.00 |
| S4.1 Free-tier counter | 5 | 5 | 5 | 5.00 |
| S6.1 Signup flow | 5 | 4 | 3 | 4.00 |
| S5.1 Per-listing event log (paid) | 5 | 4 | 3 | 4.00 |
| S3.1 Per-listing "seen by" log | 3 | 3 | 4 | 3.33 |
| S3.3 Suppress duplicate forward | 3 | 4 | 5 | 4.00 |
| S4.2 Tier upgrade prompt | 3 | 3 | 5 | 3.67 |
| S5.2 `/seen` (paid) | 3 | 4 | 4 | 3.67 |
| S5.3 `/status` (paid) | 3 | 4 | 4 | 3.67 |
| S7.1 Rate-limit detection | 5 | 3 | 3 | 3.67 |
| S6.2 Tutorial | 3 | 3 | 4 | 3.33 |
| S6.3 Channel recommendations | 2 | 2 | 5 | 3.00 |
| S1.1 Tighten LLM prompt | 5 | 3 | 3 | 3.67 |
| S1.3 Calibrate soft-criteria | 3 | 3 | 3 | 3.00 |
| S2.1 More channels | 3 | 3 | 3 | 3.00 |
| S2.2 5-min polling | 3 | 4 | 5 | 4.00 |
| S2.3 Userbot для `t.me/c/...` | 3 | 3 | 2 | 2.67 |
| S3.2 "Share" кнопка | 2 | 3 | 3 | 2.67 |
| S1.2 Second-pass filter | 3 | 4 | 5 | 4.00 |
| S7.2 Fallback aggregator | 3 | 3 | 2 | 2.67 |
| S7.3 MiniMax cost monitor | 1 | 4 | 5 | 3.33 |
3.2 RICE (Reach, Impact, Confidence, Effort)
Шкала: Impact 1-5, Confidence %, Effort в person-weeks. Финальная = (Reach × Impact × Confidence) / Effort.
| Sol | Reach | Impact | Confidence (%) | Effort (pw) | RICE |
|---|---|---|---|---|---|
| S4.3 TG Payments | 1500 | 5 | 80 | 2.0 | 3000 |
| S4.1 Free counter | 1500 | 5 | 95 | 0.5 | 14250 |
| S6.1 Signup | 1500 | 5 | 80 | 2.0 | 3000 |
| S5.1 Audit log (paid) | 300 | 5 | 70 | 2.0 | 525 |
| S3.1 "Seen by" log | 300 | 3 | 60 | 1.0 | 540 |
| S3.3 Dedup forward | 1500 | 3 | 90 | 0.5 | 8100 |
| S4.2 Upgrade prompt | 1500 | 3 | 70 | 0.5 | 6300 |
| S5.2 `/seen` (paid) | 300 | 3 | 80 | 0.5 | 1440 |
| S5.3 `/status` (paid) | 300 | 3 | 80 | 0.5 | 1440 |
| S7.1 Rate-limit detection | 1500 | 5 | 60 | 2.0 | 2250 |
| S6.2 Tutorial | 1500 | 3 | 60 | 0.5 | 5400 |
| S6.3 Channel recs | 1500 | 2 | 40 | 0.5 | 2400 |
| S1.1 Tighten LLM | 1500 | 5 | 60 | 2.0 | 2250 |
| S1.3 Calibrate soft | 300 | 3 | 50 | 2.0 | 225 |
| S2.1 More channels | 1500 | 3 | 50 | 2.0 | 1125 |
| S2.2 5-min polling | 1500 | 3 | 80 | 0.5 | 7200 |
| S2.3 Userbot c/ | 1500 | 3 | 50 | 4.0 | 562 |
| S3.2 Share кнопка | 300 | 2 | 50 | 2.0 | 150 |
| S1.2 Second-pass filter | 1500 | 3 | 80 | 0.5 | 7200 |
| S7.2 Fallback | 1500 | 3 | 50 | 4.0 | 562 |
| S7.3 Cost monitor | 1500 | 1 | 90 | 0.5 | 2700 |
3.3 Kano — ИСКЛЮЧЁН
Почему исключён: Нет T2 customer-research input. Для разблокировки Kano, запустить 5-вопросный Kano survey с 10-20 target renters.
Что узнали бы: Какие решения Must-Have (TG-native delivery, hard-criteria precision), Performance (latency, recall), или Delighter (audit log, soft-criteria filter, share button).
4. Synthesis — Финальный приоритет
| Ранг | Sol | Почему здесь |
|---|---|---|
| 1 | **S4.1 Free-tier counter** | Наивысший ICE; пара с S4.3. |
| 2 | **S3.3 Suppress duplicate forward** | Высокий RICE; дешёвый; coordination дифференциатор. |
| 3 | **S1.2 Second-pass rule-based filter** | Дешёвая defensive measure. |
| 4 | **S2.2 5-min polling** | Дешёвый; только если recall — bottleneck. |
| 5 | **S4.3 Telegram Payments** | Требуется для любого paid tier. |
| 6 | **S6.1 Signup flow** | Требуется для захвата free users. |
| 7 | **S4.2 Tier upgrade prompt** | Conversion optimization. |
| 8 | **S5.1 Per-listing event log (paid)** | Premium дифференциатор. |
| 9 | **S5.2 `/seen` (paid)** | Экспонирует S5.1. |
| 10 | **S5.3 `/status` (paid)** | Операционная гигиена. |
| 11 | **S7.1 Rate-limit detection** | Tier-1 риск. |
| 12 | **S1.1 Tighten LLM prompt** | Высокий impact, низкая confidence. |
| 13 | **S3.1 "Seen by" log** | Coordination (HYPOTHESIS). |
| 14 | **S6.2 Tutorial** | Ship если retention низкий. |
| 15 | **S6.3 Channel recommendations** | Manual curation initially. |
| 16 | **S2.1 More channels** | Recall не измерен. |
| 17 | **S1.3 Calibrate soft-criteria** | Soft информационный. |
| 18 | **S7.2 Fallback aggregator** | Stage 09 contingency. |
| 19 | **S7.3 Cost monitor** | Cost мал. |
| 20 | **S2.3 Userbot для `t.me/c/...`** | Высокий proxy cost. |
| 21 | **S3.2 "Share" кнопка** | Feature creep риск. |
5. Cross-framework Contradictions
| Противоречие | ICE говорит | RICE говорит | Резолюция |
|---|---|---|---|
| S5.1 ранжируется высоко в ICE, но mid в RICE (из-за low reach предположения). | Высоко. | Mid. | Synthesis mid-rank; premium дифференциатор. |
| S4.1 ранжируется #1 в обоих. | Top. | Top. | Нет противоречия. |
6. Limitations
7. Next Steps
Продуктовая стратегия: Realty Relay Bot — Year 1
Входы: product/01-problem-framing.md через product/08-define-prioritization-framework.md (PRODUCED)
Резюме
Продуктовая стратегия для Realty Relay Bot — запустить freemium, доказать conversion, затем выборочно расширяться — фокус на Budva-Becici ценовом тире, построить freemium paywall + audit + soft-criteria дифференциаторы, затем расшириться на другие Montenegro гео и ценовые тиры. Доминирующий стратегический риск — внешний (изменение политики Telegram + конкуренция агрегаторов). Второй риск — внутренний (free→paid conversion ниже 1%). Три стратегических бета покрывают следующий квартал.
Step 0: Framework Selection
Выбрано: Wardley Map, Playing to Win (P&W) Choice Cascade, O→I→R→C→W recommendations, Strategic Tensions.
Не выбрано: Porter's Five Forces (покрыто в Stage 03), Ansoff Matrix (один продукт, один рынок initially).
1. Vision Statement
> Быть самым надёжным и самым auditable способом для русскоязычных renters в Montenegro найти long-term апартамент в Budva/Becici через Telegram — и никогда не пропускать hard-criteria матч, никогда не дублировать DM тому же автору, и иметь чёткий путь к premium фильтрам, когда готов.
Vision намеренно узкое — одна география, одна delivery surface, одна renter демография.
2. Strategy Pillars
| Pillar | Определение | Maps to |
|---|---|---|
| **P1: Freemium-first** | Щедрый free tier (5 матчей/мес) драйвит acquisition; paid tier (€4.99/мес) драйвит revenue. | Stage 01 §5; Stage 09 §4 O4. |
| **P2: Auditability** | Каждое объявление имеет верифицируемую историю: seen / parsed / accepted / rejected / forwarded / suppressed. Paid-tier фича. | Stage 03 §6 (Create); Stage 07 O5. |
| **P3: Precision** | Hard-criteria precision — table-stakes; soft-criteria персонализация — paid дифференциатор. | Stage 01 §4; Stage 04 §5. |
| **P4: Telegram-native** | Бот живёт в TG; нет email, нет web app, нет app build. | Stage 01 §6 (anti-cross-platform). |
| **P5: Resilience** | Продукт остаётся up, когда Telegram rate-limits, proxies fail, или LLM costs spike. | Stage 01 §7. |
3. Strategic Bets
Bet 1: Построить freemium paywall + signup flow (P1, P4)
- What: S4.1 free-tier counter, S4.3 Telegram Payments, S6.1 signup flow.
- Почему первым: Без них, ни один renter не может стать paid user.
- Как выигрываем: Free users видят ценность за 7 дней; 2-5% конвертируются в paid.
- Kill criterion: Если free→paid < 1% через 90 дней, пересмотреть pricing.
- Stage link: Stage 12 spec, Stage 22 launch.
- What: S5.1 event log, S5.2
/seen, S5.3/status— paid-only. - Почему вторым: Audit — counter-positioning vs scrapers и агрегаторов.
- Как выигрываем: Paid users верифицируют «видел ли бот это?» — уникально в этой нише.
- Kill criterion: Если audit unused > 50% paid users за 60 дней, deprecate.
- Stage link: Stage 12 spec, Stage 23 events.
- What: S1.3 calibrate soft-criteria scoring (вид на горы, новая мебель, этаж ≥ 3).
- Почему третьим: Зависит от paid-tier data для калибровки.
- Как выигрываем: Paid users фильтруют по soft criteria; free users видят только hard.
- Kill criterion: Если soft-criteria не используется > 30% paid users, deprioritize.
- Stage link: Stage 12 spec, Stage 22 launch.
- Bet 1 → Bet 2: payment integration operational.
- Bet 2 → Bet 3: audit log имеет 30 дней data.
- Observation (T5): 5 free матчей/мес — wedge.
- Implication: Free tier UX — наиболее трогаемая surface.
- Response: S4.1, S4.2, S6.1, S6.2 — first-class.
- Confidence: M.
- Watch: Если 90-day free→paid < 1%, пересмотреть.
- Observation (T5): Ни один конкурент не предлагает это для этой ниши.
- Implication: S5.1 — counter-positioning lever.
- Response: Gate paid tier за audit access.
- Confidence: M.
- Watch: Если audit unused 50%+ paid, deprecate.
- Observation (T6): N=2 билдера; ёмкость фиксирована.
- Implication: Multi-city или multi-tier expansion размывает focus.
- Response: §6 #1, #2 — non-negotiable для Y1.
- Confidence: H.
- Watch: 500 paid users hit → re-evaluate.
- Stage 03 §5 (Where to play) — информирует pillars.
- Stage 07 §Prioritization — информирует bet ordering.
- Stage 08 §4 (Synthesis) — подтверждает bet ordering.
- Stage 12 (specification-writing) — получает bet list как input.
- Stage 22 (deliver-launch-checklist) — получает gates как input.
- Stage 23 (measure-instrumentation-spec) — получает audit log design.
Bet 2: Добавить audit log как paid-tier дифференциатор (P2)
Bet 3: Добавить soft-criteria filtering как paid-tier gate (P3)
4. Sequencing Rationale
| Порядок | Bet | Причина |
|---|---|---|
| 1st | Bet 1 (freemium) | Substrate для всего остального. |
| 2nd | Bet 2 (audit) | Counter-positioning vs конкурентов. |
| 3rd | Bet 3 (soft-criteria) | Нуждается в paid-tier data для калибровки. |
Critical path: Bet 1 → Bet 2 (sequential). Bet 3 параллелизуем с Bet 2, если позволяет ёмкость.
Information gates:
5. Strategic Tensions
| Tension | Bet A | Bet B | Type | Резолюция |
|---|---|---|---|---|
| **Free tier generosity vs. paid conversion** | S4.1 (5 free) | S4.3 (paid) | Strategic | A/B test 3 vs 5 vs 7 free матчей. |
| **Latency vs. audit completeness** | S2.2 (5-min polling) | S5.1 (audit) | Resource | Audit log первым; пересмотреть S2.2, если recall — bottleneck. |
| **Channel coverage vs. precision** | S2.1 (больше каналов) | S1.1 (tighten LLM) | Strategic | Tighten первым; channels вторыми. |
| **Feature breadth vs. discipline** | S3.2 (Share кнопка) | Bet 2 (audit) | Strategic | Отложить S3.2. |
| **MiniMax cost vs. coverage** | Больше LLM call'ов | S7.3 (cost monitor) | Resource | Использовать существующий batch size; добавить monitor в v2. |
Strategic debt created: Free-tier generosity создаёт conversion risk; mitigated by A/B testing.
6. What We Are NOT Doing (Year 1)
| # | Item | Категория | Почему нет | Пересмотреть если |
|---|---|---|---|---|
| 1 | Multi-city (Bar, Tivat, Kotor) | Declined | Focus Budva-Becici первым. | Y2 если 500+ paid users. |
| 2 | Multi-tier pricing (700+ EUR) | Declined | Stay focused on ≤ 700 EUR. | Y2. |
| 3 | Studio апартаменты | Declined | Hard criteria. | — |
| 4 | Другие delivery surfaces (email, web) | Declined | TG-native — wedge. | User demand. |
| 5 | B2B (landlords, агенты) | Declined | Single-sided (renters). | Y3 если B2B demand emerges. |
| 6 | Mobile app | Declined | TG-native. | Y3 если retention demands. |
| 7 | Annual subscription | Declined | Start monthly; test annually. | Y2. |
| 8 | Cross-platform (Airbnb-like) | Declined | Different product. | — |
| 9 | Paid acquisition (ads) | Declined | TG channel posting = €0. | Y2 если organic stalls. |
| 10 | English-only support | Declined | Russian-speaking primary. | Y2 если expansion. |
7. Resource Plan
| Ресурс | Распределение | Заметка |
|---|---|---|
| Engineering | N=2 билдера (founders). | Фиксировано. |
| LLM budget | €50-100/мес при 200 paid users. | Scales with usage. |
| TG Payments | 3% на транзакцию. | Standard. |
| SOCKS5 proxies | 5 аккаунтов × 1 прокси каждый. | Фиксировано. |
| Operational labor | < 2 часов/неделя. | Founders. |
| Content marketing | Founder time, без cash. | SEO, blog. |
8. Quarterly Gates
| Gate | Когда | Pass criterion |
|---|---|---|
| Gate 1: Freemium live | End of Q-Week 4 | S4.1, S4.3, S6.1 поставляются; первый free signup. |
| Gate 2: Audit log live (paid) | End of Q-Week 8 | S5.1, S5.2, S5.3 поставляются; первый paid user. |
| Gate 3: Soft-criteria live (paid) | End of Q-Week 12 | S1.3 поставляется; 30% paid users используют. |
| Gate 4: Quarterly review | End of Q-Week 13 | Перезапустить Stage 01; оценить conversion. |
Если любой gate проваливается: стоп, re-assume, перезапуск с последнего passing gate.
9. Roadmap Communication Views
| View | Аудитория | Контент |
|---|---|---|
| 1-page vision | Founders | Этот документ §1, §2, §6. |
| Bets + gates | Founders | §3, §8. |
| Non-goals | Founders | §6. |
| Полный документ | Founders | Этот файл. |
Нет внешней аудитории пока.
10. Strategic Recommendations (O→I→R→C→W Cascade)
Recommendation 1: Сделать free tier primary growth surface.
Recommendation 2: Рассматривать audit log как paid дифференциатор.
Recommendation 3: Не расширяться до 500 paid users.
Assumption Registry
| # | Предположение | Источник | Риск если ложно |
|---|---|---|---|
| AS1 | Telegram продолжит экспонировать `t.me/s/...`. | T3 | HIGH — re-pivot. |
| AS2 | Free→paid conversion 2-5%. | T5 | HIGH — drops revenue. |
| AS3 | Russian-speaking renter демография достижима через TG. | T6 | MED — re-evaluate. |
| AS4 | TG Payments работает для русскоязычных пользователей. | T3 | MED — использовать Stripe fallback. |
| AS5 | SOCKS5 proxy supply доступен. | T6 | MED — стоимость увеличится. |
| AS6 | MiniMax M2.1 pricing стабильна. | T6 | MED — влияет на margin. |
Adversarial Self-Critique
Weakness 1: Стратегия слишком узкая, чтобы быть неправильной.
N=2 билдера с 3-bet, 1-quarter стратегией — по существу housekeeping.
Weakness 2: Беты упорядочены «easy first», не «high-impact first».
Bet 3 (soft-criteria) — highest-impact, но упорядочен третьим, потому что нуждается в paid data.
Weakness 3: Non-goals список длиннее bets списка.
Признак scope insecurity, но discipline требует явных non-goals.
Revision Triggers
| Триггер | Что переоценить | Timeline |
|---|---|---|
| TG изменяет `t.me/s/...` доступ. | Все §3, §6, AS1. | Немедленно. |
| Free→paid < 1% через 90 дней. | Pricing, §10 R1. | Quarterly. |
| 500 paid users достигнуто. | §6 #1, #2. | Y2. |
| Quarterly review. | Перезапустить Stage 01. | Quarterly. |
Cross-references
Дизайн метрик и экспериментов: Realty Relay Bot
Входы: product/09-product-strategy.md (PRODUCED)
Резюме
Дизайн метрик для Realty Relay Bot центрирован на primary North Star Metric: Monthly Recurring Revenue (MRR), с supporting метриками на free-tier activation, free→paid conversion, retention и operational health. Дерево декомпозиции метрик имеет 4 слоя (acquisition → activation → conversion → revenue) с маленьким набором operational метрик. Один primary эксперимент pre-registered (free→paid conversion A/B) и несколько secondary экспериментов намечены.
1. Value Moment & North Star Metric
Value moment: Renter подписывается, получает свой первый полезный hard-criteria матч в течение 7 дней, и конвертируется в paid ИЛИ paid user успешно арендует через bot-delivered матч.
North Star Metric (NSM):
> Monthly Recurring Revenue (MRR) — total € от всех активных paid подписок.
Почему MRR:
- Напрямую привязан к business sustainability.
- Отражает и conversion, и retention.
- Выравнивается с freemium SaaS industry standard.
Counter-target: MRR должен расти 10-20% MoM в Y1, plateau в Y2.
2. Metric Decomposition Tree
NSM: MRR
├── (Revenue) Active paid users
│ ├── (Conversion) Free→paid conversion rate
│ ├── (Activation) Free users с 1+ матчем в 7 дней
│ ├── (Acquisition) New signups
│ └── (Retention) Churn rate (paid downgrades to free)
│
├── (Operational) Bot health
│ ├── Ingest up-time, alert latency, LLM cost
│ └── Free-tier cap hit rate
│
└── (Attribution) Bot-delivered lease conversions
└── Per-listing audit log (paid tier)
| Слой | Метрика | Владелец | Tier | Cadence |
|---|---|---|---|---|
| Acquisition | New signups / week | bot | T1 (post-launch) | Weekly |
| Activation | Free users с 1+ матчем в 7 дней | bot | T1 | Weekly |
| Conversion | Free→paid conversion rate | bot | T1 | Weekly |
| Revenue | MRR | bot | T1 | Weekly |
| Revenue | ARPU (€4.99 × paid users) | bot | T1 | Monthly |
| Retention | Churn rate (monthly) | bot | T1 | Monthly |
| Retention | Avg paid lifetime (months) | bot | T1 | Quarterly |
| Operational | Ingest up-time | bot | T1 | Daily |
| Operational | LLM cost / week | bot | T1 | Weekly |
| Operational | Free-tier cap hit rate | bot | T1 | Weekly |
| Attribution | Bot-delivered lease conversions | user report | T2 | Quarterly |
3. Operational Metrics
| Метрика | Определение | Target | Tier |
|---|---|---|---|
| Ingest up-time | % ожидаемых polls, завершённых | ≥ 99% | T1 |
| LLM accept rate | Accepted / parsed | observe for drift | T1 |
| Cross-user dedup rate | Suppressions / forwards | observe | T1 |
| Forward latency (sec) | Channel-post → forward | ≤ 600 (10 мин) | T1 |
| Audit log completeness | Forwarded / logged | 100% | T1 |
| Alert latency (sec) | TG failure → alert | ≤ 1 polling cycle | T1 |
| Free-tier cap hit rate | % free users hitting 5/month | observe | T1 |
| LLM cost / week | USD | ≤ €20 / 200 paid users | T1 |
| Proxy fail rate | Failures / polls | ≤ 1% | T1 |
4. Counter-Metrics
| Counter-metric | Почему | Target |
|---|---|---|
| False-positive rate | Hard-criteria violations | 0% — non-negotiable. |
| False-reject rate | Пропущенные матчи | ≤ 10% (Bet 3). |
| Duplicate forward rate | Coordination failure | 0% — non-negotiable. |
| Alert false-positive rate | Alert fatigue | ≤ 5% polling cycles. |
| Audit-log completeness regression | Теряет attribution | 100% — non-negotiable. |
| LLM cost / match | Cost spike | ≤ €0.10 / accepted match. |
| Free→paid conversion | Revenue | ≥ 2% (T5 estimate). |
5. Pre-registered Experiments
Experiment 1 (PRIMARY): Free-tier cap A/B test
| Field | Значение |
|---|---|
| Гипотеза | 5 бесплатных матчей/мес — оптимальный cap для 2-5% conversion. |
| Primary metric | Free→paid conversion rate. |
| Guardrails | Activation rate (free users с 1+ матчем в 7 дней); free-tier satisfaction (proxy: retention of free users at 30 days). |
| Setup | A/B: 3 vs 5 vs 7 бесплатных матчей/мес. 1000 free signups, 333 на вариант. |
| Длительность | 60 дней. |
| Decision rule | Ship cap с наивысшей conversion rate, subject to ≥ 80% activation rate. |
Experiment 2 (SECONDARY): Soft-criteria filter usage
| Field | Значение |
|---|---|
| Гипотеза | Soft-criteria фильтр драйвит ≥ 30% paid-tier engagement. |
| Primary metric | % paid users, использующих soft-criteria фильтр в первые 30 дней. |
| Guardrails | Forward latency (no regression); LLM cost (≤ €0.15/матч). |
| Setup | Ship soft-criteria; наблюдать. |
| Длительность | 30 дней post-paid-tier launch. |
| Decision rule | Сохранить, если ≥ 30% paid users используют. Иначе, deprecate. |
Experiment 3 (SECONDARY): Audit log usage
| Field | Значение |
|---|---|
| Гипотеза | Audit log драйвит ≥ 50% paid users к engage. |
| Primary metric | `/seen` и `/status` invocations / week. |
| Длительность | 30 дней post-paid-tier launch. |
| Decision rule | Сохранить, если ≥ 50% paid users используют. Иначе, deprecate. |
"When NOT to Experiment" Check
- Reversibility: Все эксперименты обратимы (изменения cap, deprecate features). ✓
- Traffic: Y1 трафик (1-3K free, 100-500 paid) достаточен для A/B с 333/cohort. ✓
- Ethical bar: Нет withholding harm — все пользователи получают ценность. ✓
- Observation: Другие метрики — leading indicators.
- Response: MRR — gate metric.
- Confidence: H.
- Response: Записать decision rule на диск.
- Confidence: H.
- Observation: Пользователи, которые hit cap, наиболее вероятно конвертируются.
- Response: Экспонировать S4.2 prompt агрессивно.
- Confidence: M.
- Stage 09 §3 — Bets 1-3 драйвят метрики.
- Stage 23 — события для operational метрик.
- Stage 22 — получает эксперименты как launch criteria.
6. HEART Framework (применён частично)
| Измерение | Цель | Сигнал | Метрика | Target |
|---|---|---|---|---|
| **Happiness** | Renter чувствует уверенность. | Self-report. | «Вы пропустили хороший вариант?» (1-5) | ≥ 4 |
| **Engagement** | Renter действует по матчам. | Forward → DM автору. | DM rate (forwarded → DMed author) | observe |
| **Adoption** | Free→paid conversion. | Self-report. | Free→paid % | ≥ 2% |
| **Retention** | Paid users остаются. | Auto. | Monthly churn | ≤ 10% |
| **Task success** | Матч → lease. | Self-report (квартально). | Bot-attributed leases | ≥ 1/paid user/year |
7. Cadence and Ownership
| Cadence | Review | Output |
|---|---|---|
| Daily | Bot log health | Alert, если любая operational metric breaches |
| Weekly | Metric dashboard | Triage; flag drift |
| Monthly | User recall (self-report) | Re-calibrate soft-criteria |
| Quarterly | Re-run Stage 01 + этот документ | Reset targets |
8. Recommendations (O→I→R→C→W Cascade)
Recommendation 1: Рассматривать MRR как единственный North Star.
Recommendation 2: Pre-register Experiment 1 до запуска.
Recommendation 3: Трекать free-tier cap hit rate как leading indicator of conversion.
Assumption Registry
| # | Предположение | Источник | Риск если ложно |
|---|---|---|---|
| M1 | N=1.5K free users Y1. | T5 | Сдвигает scale. |
| M2 | 3% free→paid conversion. | T5 | Сдвигает revenue 50-100%. |
| M3 | 8-месячный avg paid lifetime. | T5 | Сдвигает LTV. |
| M4 | LLM cost ≤ €0.10/матч. | T5 | Margin pressure. |
| M5 | Audit log unused < 50% threshold. | T5 | Deprecate feature. |
Adversarial Self-Critique
Weakness 1: MRR — медленный feedback (monthly cadence). Использовать leading indicators (free-tier cap hits) для weekly tuning.
Weakness 2: Y1 трафик мал для robust A/B. Нужен N=1.5K+ free users до power Experiment 1.
Weakness 3: Conversion оценки — industry benchmarks, не Montenegro-specific.
Cross-references
Architecture Decision Records: Realty Relay Bot
Входы: product/09-product-strategy.md, product/10-metric-design-experimentation.md (PRODUCED)
ADR-001: Ingest через Telegram public web-pages (`t.me/s/...`)
Status: Accepted.
Context: Listings приходят из публичных TG-каналов. Telegram экспонирует t.me/s/... (без auth) и t.me/c/... (требует аккаунт). README + .env уже требуют SOCKS5-per-account для userbot.
Decision: Использовать t.me/s/... как primary surface; userbot только для t.me/c/... каналов.
Consequences:
- (+) Нет account cost для большинства каналов.
- (+) Нет proxy для web-mode.
- (−) Ограничен публичными каналами.
- (+) Нет router failure mode.
- (+) LLM обрабатывает free-form + multi-lang.
- (−) LLM cost (~€0.05-0.10/матч).
- (+) В пределах TG rate limits.
- (−) До 10-min latency (приемлемо).
- (+) Устраняет cross-channel + cross-user дубликаты.
- (−) Hash collisions возможны.
- (+) Append-only = integrity.
- (+) Grep-able.
- (−) Long-term storage TBD.
- (+) Достигает пользователей, где они есть.
- (−) Если TG down, alerts также fail.
- (+) Native для TG, compliant.
- (+) Stripe fallback покрывает edge cases.
- (−) Два payment integration для поддержания.
- (+) Cost-controlled (soft LLM calls только для paid).
- (+) Чёткая дифференциация ценности.
- (−) Сложность в LLM prompt branching.
- (+) Zero-friction signup.
- (+) TG-native.
- (−) Account recovery невозможен без TG.
Alternatives: Userbot-only (отклонён — proxy cost высок); TG Bot API (отклонён — не может читать публичные каналы); MTProto userbot (отложен для t.me/c/...).
ADR-002: LLM через MiniMax M2.1 direct API
Status: Accepted.
Context: Hard + soft criteria не могут быть regex-parsed из free-text мультиязычных объявлений. Repo требует MINIMAX_API_KEY для /run_hours режима.
Decision: Direct MiniMax M2.1 API, batched (LLM_BATCH_SIZE=6).
Consequences:
Alternatives: Regex-only (отклонён); self-hosted LLM (отклонён — GPU cost); multi-provider router (отклонён — single-provider direct проще).
ADR-003: 10-min polling cadence
Status: Accepted.
Context: Listings забираются за часы. README говорит 10-min cadence.
Decision: Poll каждые 10 мин в v1.0. 5-min отложен.
Consequences:
ADR-004: Listing-fingerprint dedup
Status: Accepted (алгоритм TBD в Stage 12).
Context: То же объявление может появиться в 2+ каналах. Нужен cross-channel + cross-user dedup.
Decision: Hash = sha256(channel_id + message_id + normalized_body_excerpt + normalized_price). Windows: 7 дней same-user, 24 часа co-user.
Consequences:
ADR-005: Audit log = append-only JSON Lines
Status: Accepted.
Context: Stage 09 Pillar 2 (auditability) требует верифицируемую per-listing историю. Stage 23 определяет события.
Decision: Append-only JSON Lines на data/audit/events.jsonl. Одно событие на строку. Schema: event_id, listing_fingerprint, timestamp_utc, event_type, actor, payload.
Consequences:
ADR-006: Resilience alerts через TG DM
Status: Accepted.
Context: TG-side ingest failure должен экспонироваться пользователям. Оба TG-native.
Decision: [!bot alert] DM обоим allowlisted пользователям (system-level, не per-renter).
Consequences:
ADR-007: Freemium enforcement через Telegram Payments
Status: Accepted (с fallback на Stripe).
Context: Freemium модель требует paid-tier enforcement. TG-native пользователи предпочитают TG Payments для compliance.
Decision: Telegram Payments API для paid tier; Stripe как fallback, если TG Payments не доступен в регионе renter'а.
Consequences:
Alternatives: Stripe only (отклонён — теряет TG-native advantage); crypto (отклонён — слишком нишево); free-only (отклонён — нет revenue).
ADR-008: Soft-criteria как paid-tier gate
Status: Accepted.
Context: Free tier видит hard-criteria only; paid tier видит hard + soft. Soft criteria (вид на горы, новая мебель, этаж ≥ 3) требуют LLM scoring — более дорогие.
Decision: Hard criteria всегда оцениваются. Soft criteria оцениваются только для paid tier; результаты включены в форвард-сообщение.
Consequences:
ADR-009: User account = TG user_id (без email)
Status: Accepted.
Context: Оба пользователя TG-native; email добавит трение.
Decision: TG user_id — account identifier. Нет email, нет password. Tier state хранится server-side, keyed by user_id.
Consequences:
Summary
| ADR | Title | Status |
|---|---|---|
| 001 | Web-pages primary ingest | Accepted |
| 002 | MiniMax M2.1 direct API | Accepted |
| 003 | 10-min polling cadence | Accepted |
| 004 | Fingerprint-hash dedup | Accepted (TBD) |
| 005 | JSON Lines audit log | Accepted |
| 006 | TG DM resilience alerts | Accepted |
| 007 | TG Payments + Stripe fallback | Accepted |
| 008 | Soft-criteria paid gate | Accepted |
| 009 | TG user_id как account | Accepted |
Future ADRs (отложены): MTProto userbot fallback для t.me/c/...; SQLite audit log; semantic-similarity dedup.
Спецификация продукта: Realty Relay Bot v1.1 — Freemium + Audit + Soft-Criteria
Входы: product/06-define-jtbd-canvas.md через product/11-develop-adr.md (PRODUCED)
Spec type: Feature specification для v1.1 (freemium paywall + paid audit + soft-criteria).
1. Outcome Statement
> Русскоязычные renters в Budva/Becici могут подписаться бесплатно через Telegram, получить свой первый hard-criteria матч в течение 7 дней, и иметь чёткий путь upgrade'а в paid tier за unlimited матчи, soft-criteria фильтры, и audit log access. Paid users могут верифицировать, для любого объявления, видел ли его бот, парсил ли, принял или отклонил, и форвардил ли.
2. Scope
IN Scope
| ID | Item | Источник |
|---|---|---|
| S-1 | Telegram-native signup (без email) | ADR-009; Stage 07 S6.1 |
| S-2 | Free-tier counter (5 матчей/мес) | Stage 07 S4.1 |
| S-3 | Tier upgrade prompt на 4-м матче | Stage 07 S4.2 |
| S-4 | Telegram Payments integration | ADR-007; Stage 07 S4.3 |
| S-5 | Stripe fallback | ADR-007 |
| S-6 | Soft-criteria фильтр (paid only): вид на горы, новая мебель, этаж ≥ 3 | ADR-008; Stage 07 S1.3 |
| S-7 | Per-listing audit log (paid only) | ADR-005; Stage 07 S5.1 |
| S-8 | `/seen <listing-id>` команда (paid) | Stage 07 S5.2 |
| S-9 | `/status` команда (paid) | Stage 07 S5.3 |
| S-10 | Listing-fingerprint dedup (cross-channel + cross-user) | ADR-004; Stage 07 S3.3 |
| S-11 | Resilience alerts (`[!bot alert]` prefix) | ADR-006; Stage 07 S7.1 |
| S-12 | Event-log queryable с диска | ADR-005 |
OUT of Scope
| ID | Item | Почему out |
|---|---|---|
| OOS-1 | Multi-city expansion | Stage 09 §6 #1 |
| OOS-2 | Studio апартаменты | Hard criteria. |
| OOS-3 | Annual subscription | Stage 09 §6 #7 |
| OOS-4 | B2B (landlords, агенты) | Stage 09 §6 #5 |
| OOS-5 | Mobile app / dashboard | Stage 09 §6 #6 |
| OOS-6 | SQLite audit log | Future ADR. |
| OOS-7 | Semantic-similarity dedup | Future ADR. |
| OOS-8 | MTProto userbot | Future ADR. |
| OOS-9 | English-only локализация | Stage 09 §6 #10. |
Scope Dependencies
| # | Dependency | Type | Status |
|---|---|---|---|
| DEP-1 | Существующий `data/web_cache.json` | Technical | Ready |
| DEP-2 | Существующий TG account + proxy | Technical | Ready |
| DEP-3 | `MINIMAX_API_KEY` | External | Ready |
| DEP-4 | TG bot credentials (`BOT_TOKEN`) | External | Ready |
| DEP-5 | TG Payments setup | External | Pending (Stage 22) |
3. Acceptance Criteria
S-1 — Telegram signup
- AC-S1-1: Пользователь отправляет
/startботу. Бот отвечает welcome message + signup confirmation. MUST. - AC-S1-2: Сервер хранит
{user_id, signup_at_utc, tier: free}. MUST. - AC-S1-3: Никакого email, никакого password не требуется. MUST.
- AC-S2-1: Сервер трекает
{user_id, month, matches_sent}counter. MUST. - AC-S2-2: Когда counter достигает 5, free user получает tier-upgrade prompt вместо 6-го матча. MUST.
- AC-S2-3: Counter сбрасывается 1-го числа каждого месяца (UTC). MUST.
- AC-S3-1: Когда free user достигает 4 матчей в месяце, следующий match forward включает upgrade-prompt. SHOULD.
- AC-S3-2: Upgrade prompt ссылается на TG Payments flow. MUST.
- AC-S4-1: Paid tier — €4.99/мес. MUST.
- AC-S4-2: TG Payments invoice отправляется по upgrade request. MUST.
- AC-S4-3: При успешном платеже сервер устанавливает
tier: paidдля пользователя. MUST. - AC-S4-4: При неуспешном платеже сервер сохраняет
tier: free. MUST. - AC-S5-1: Если TG Payments не доступен в регионе renter'а, сервер предлагает Stripe checkout link. MUST.
- AC-S5-2: Stripe webhook обновляет tier при успешном платеже. MUST.
- AC-S6-1: Для paid users LLM оценивает soft criteria: вид на горы (да/нет), новая мебель (да/нет), этаж ≥ 3 (да/нет). MUST.
- AC-S6-2: Результаты soft-criteria включены в форвард-сообщение. MUST.
- AC-S6-3: Для free users soft criteria НЕ оцениваются (cost control). MUST.
- AC-S7-1: Каждое распарсенное объявление пишет
parsedevent. MUST. - AC-S7-2: Каждое LLM решение пишет
acceptedилиrejected(с reason). MUST. - AC-S7-3: Каждый форвард пишет
forwardedevent. MUST. - AC-S7-4: Каждое dedup подавление пишет
suppressedevent с reason. MUST. - AC-S7-5: Audit log — append-only JSON Lines на
data/audit/events.jsonl. MUST. - AC-S8-1: Paid user отправляет
/seenи получает event history в обратном хронологическом порядке, илиnot found. MUST. - AC-S8-2: Rate-limited до ≤ 5/мин на пользователя. SHOULD.
- AC-S8-3: Truncated на 10 событий. SHOULD.
- AC-S8-4: Free users получают
audit is a paid featureсообщение. MUST. - AC-S9-1: Paid user отправляет
/status, получает per-channel last-poll time, ingest up-time, последние 5 alerts. MUST. - AC-S9-2: Free users получают
audit is a paid featureсообщение. MUST. - AC-S10-1: Два объявления с одинаковым fingerprint (± 5% цена, одинаковые bedrooms, одинаковые первые 100 chars body) deduped. MUST.
- AC-S10-2: Same-user dedup окно = 7 дней. MUST.
- AC-S10-3: Cross-user dedup окно = 24 часа. MUST.
- AC-S10-4: Dedup решение логируется как
suppressedevent. MUST. - AC-S11-1: Detected ingest failure (rate-limit или proxy error) отправляет
[!bot alert]DM основателям в течение 1 polling cycle. MUST. - AC-S11-2: Alert включает failing channel, error class, timestamp. MUST.
- AC-S11-3: Повторные идентичные alerts в течение 1 часа подавляются. SHOULD.
- AC-S12-1: Audit log queryable через
grepдляlisting_fingerprint. MUST. - Stage 06 (define-jtbd-canvas) — Job Statement.
- Stage 07 (define-opportunity-tree) — S-1..S-12 mapping.
- Stage 09 (product-strategy) — Bets 1, 2, 3.
- Stage 10 §5 — Experiments.
- Stage 11 — ADRs.
- Stage 13 (deliver-prd) — PRD.
- Stage 23 (measure-instrumentation-spec) — event schema.
S-2 — Free-tier counter
S-3 — Tier upgrade prompt
S-4 — Telegram Payments
S-5 — Stripe fallback
S-6 — Soft-criteria фильтр (paid)
S-7 — Per-listing audit log (paid)
S-8 — `/seen <listing-id>` (paid)
S-9 — `/status` (paid)
S-10 — Dedup
S-11 — Resilience alerts
S-12 — Event log queryability
4. Context and Decisions
Decisions Already Made
| # | Decision | Обоснование |
|---|---|---|
| D-1 | Freemium: 5 free + €4.99 paid | Stage 05 unit economics; Stage 09 §6 |
| D-2 | Audit log = JSON Lines | ADR-005 |
| D-3 | TG Payments + Stripe fallback | ADR-007 |
| D-4 | Soft-criteria = paid gate | ADR-008 |
| D-5 | TG user_id как account | ADR-009 |
Constraints
| # | Constraint | Type |
|---|---|---|
| C-1 | TG API rate limits | Technical |
| C-2 | SOCKS5-per-account | Operational |
| C-3 | TG Payments regional availability | External |
| C-4 | LLM cost ≤ €0.10/матч | Resource |
| C-5 | GDPR для EU users | Compliance |
5. Specification Tensions
| Tension | Резолюция |
|---|---|
| Free-tier generosity vs conversion | A/B test 3 vs 5 vs 7. |
| Audit completeness vs latency | Синхронный append; non-blocking on success. |
| Soft-criteria cost vs precision | Paid-only evaluation. |
6. Open Questions
| # | Вопрос | Резолюция path |
|---|---|---|
| Q-1 | Точная normalization для `normalized_body_excerpt` | Stage 23 design |
| Q-2 | Soft-criteria LLM prompt | Stage 12 implementation |
| Q-3 | Stripe vs TG Payments region split | Stage 22 setup |
7. Cross-references
PRD: Realty Relay Bot v1.1 — Freemium + Audit + Soft-Criteria Release
Входы: product/09-product-strategy.md, product/12-specification-writing.md (PRODUCED)
1. Document Purpose
Этот PRD определяет релиз v1.1 Realty Relay Bot — добавляющий freemium paywall, paid-tier audit log и soft-criteria фильтр к существующему v1.0 боту. Target: русскоязычные renters в Budva/Becici, ищущие long-term апартаменты ≤ 700 EUR.
Аудитория: Основатели (N=2), которые также являются executors.
2. Background and Context
v1.0 Realty Relay Bot опрашивает публичные Telegram-каналы каждые 10 минут, фильтрует через MiniMax M2.1, и форвардит hard-criteria матчи подписчикам. Он operational, но не монетизирован.
v1.1 закрывает gap:
- Нет freemium paywall (нет revenue model).
- Нет audit trail (нет premium дифференциатора).
- Нет soft-criteria фильтра (нет premium-tier фичи).
- Freemium paywall: Signup через
/start, free tier (5 матчей/мес), upgrade prompt на 4-м матче, TG Payments + Stripe fallback. - Audit log (paid only): Append-only JSON Lines на
data/audit/events.jsonl./seenи/statusкоманды. - Soft-criteria фильтр (paid only): Вид на горы, новая мебель, этаж ≥ 3. LLM-evaluated только для paid users.
- Ingest surface (ADR-001):
t.me/s/...only. - LLM (ADR-002): MiniMax M2.1 direct.
- Polling (ADR-003): 10-min cadence.
- Audit log (ADR-005): JSON Lines, append-only.
- Payment (ADR-007): TG Payments + Stripe.
- Soft-criteria (ADR-008): paid-only.
- Account (ADR-009): TG user_id.
payments.py— TG Payments + Stripe integration.tier.py— Free/paid tier logic, counter.audit.py— JSON Lines writer (paid-access only).commands.py—/seen,/status,/starthandlers.dedup.py— fingerprint-hash dedup.- Stage 09 §3 — Bets 1, 2, 3.
- Stage 10 §3-§4 — operational метрики.
- Stage 12 — acceptance criteria.
- Stage 14 — user stories.
- Stage 22 — launch checklist.
3. Goals and Non-Goals
Goals
| # | Цель | Источник |
|---|---|---|
| G-1 | Русскоязычный renter может подписаться бесплатно за <30 секунд. | Stage 12 S-1 |
| G-2 | Free user получает 5 hard-criteria матчей в месяц, затем upgrade prompt. | Stage 12 S-2, S-3 |
| G-3 | Paid tier (€4.99/мес) разблокирует unlimited матчи + soft-criteria фильтр + audit log. | Stage 12 S-4, S-6, S-7 |
| G-4 | Free→paid conversion ≥ 2% в течение 90 дней. | Stage 10 §5 Experiment 1 |
| G-5 | MRR ≥ €500 к концу Q (100 paid users). | Stage 10 §1 |
Non-Goals
| # | Non-Goal | Источник |
|---|---|---|
| NG-1 | Multi-city expansion | Stage 09 §6 #1 |
| NG-2 | Annual subscription | Stage 09 §6 #7 |
| NG-3 | B2B | Stage 09 §6 #5 |
| NG-4 | Mobile app | Stage 09 §6 #6 |
| NG-5 | English-only локализация | Stage 09 §6 #10 |
| NG-6 | SQLite audit log | Future |
4. Proposed Solution
v1.1 добавляет три слоя к v1.0:
Существующие v1.0 фичи остаются: 10-min polling, MiniMax M2.1 фильтр, hard-criteria matching.
5. Functional Requirements
5.1 Signup & Tier
| ID | Требование | Тест |
|---|---|---|
| FR-A1 | Пользователь отправляет `/start`, получает welcome + signup confirmation. | Manual. |
| FR-A2 | Сервер хранит `{user_id, signup_at, tier: free}`. | Unit. |
| FR-A3 | Free user получает 5 hard-criteria матчей/мес, затем upgrade prompt. | Unit. |
| FR-A4 | Paid user получает unlimited матчи + soft-criteria + audit. | Unit. |
| FR-A5 | Counter сбрасывается 1-го числа месяца (UTC). | Unit. |
5.2 Payment
| ID | Требование | Тест |
|---|---|---|
| FR-B1 | Paid tier = €4.99/мес. | Code review. |
| FR-B2 | TG Payments primary; Stripe fallback. | Integration. |
| FR-B3 | При успешном платеже, tier = paid. | Unit. |
| FR-B4 | При неуспешном платеже, tier = free. | Unit. |
5.3 Audit Log (paid only)
| ID | Требование | Тест |
|---|---|---|
| FR-C1 | `parsed` event на объявление. | Unit. |
| FR-C2 | `accepted`/`rejected` event на LLM решение. | Unit. |
| FR-C3 | `forwarded` event на форвард. | Unit. |
| FR-C4 | `suppressed` event на dedup. | Unit. |
| FR-C5 | Append-only JSON Lines. | Code review. |
| FR-C6 | `/seen` возвращает события. | Integration. |
| FR-C7 | `/status` возвращает health. | Integration. |
| FR-C8 | Free users видят `audit is a paid feature`. | Manual. |
5.4 Soft-Criteria (paid only)
| ID | Требование | Тест |
|---|---|---|
| FR-D1 | LLM оценивает soft criteria для paid users только. | Unit. |
| FR-D2 | Soft-criteria результаты в форвард-сообщении. | Manual. |
5.5 Dedup (все пользователи)
| ID | Требование | Тест |
|---|---|---|
| FR-E1 | Cross-channel + cross-user dedup через fingerprint hash. | Unit. |
| FR-E2 | 7-дневное same-user окно, 24-часовое co-user окно. | Unit. |
5.6 Resilience (система)
| ID | Требование | Тест |
|---|---|---|
| FR-F1 | `[!bot alert]` на TG rate-limit / proxy failure. | Integration. |
| FR-F2 | Alert основателям в течение 1 polling cycle. | Unit. |
6. Scope Boundaries
| Категория | Items |
|---|---|
| **In scope** | Freemium paywall; TG Payments; Stripe fallback; audit log; soft-criteria; dedup; resilience. |
| **Out of scope** | Multi-city; annual sub; B2B; mobile app; English-only; SQLite; semantic dedup; MTProto. |
| **Deferred to v1.2** | LLM prompt iteration; second-pass rule filter; more channels; share button. |
7. Technical Considerations
Новые компоненты:
8. Dependencies
| # | Dependency | Status |
|---|---|---|
| DEP-1 | Существующие poll/parse модули | Ready |
| DEP-2 | Существующий LLM call | Ready |
| DEP-3 | Существующий forwarder | Ready |
| DEP-4 | TG bot credentials | Ready |
| DEP-5 | SOCKS5 proxy bindings | Ready |
| DEP-6 | TG Payments setup | Pending (Stage 22) |
| DEP-7 | Stripe account | Pending (Stage 22) |
9. Risks and Mitigations
| # | Риск | Вероятность | Impact | Mitigation |
|---|---|---|---|---|
| R-1 | Free→paid < 1% | M | H | A/B test cap. |
| R-2 | TG Payments не в регионе renter'а | M | M | Stripe fallback. |
| R-3 | LLM cost spike с soft-criteria | M | M | Paid-only evaluation. |
| R-4 | Audit log abuse (free user accesses через API) | L | M | Server-side tier check. |
| R-5 | Stripe webhook failure | L | H | Stripe retry logic; manual tier sync. |
| R-6 | TG policy change на paid bots | L | H | Telegram Payments compliant; мониторить. |
| R-7 | GDPR enforcement | M | M | Data retention policy; consent. |
10. Launch Criteria
| # | Критерий | Владелец |
|---|---|---|
| LC-1 | Все AC в Stage 12 §3 выполнены | Основатели |
| LC-2 | Free→paid conversion ≥ 2% в течение 90 дней (измерено) | Основатели |
| LC-3 | MRR ≥ €500 к концу Q | Основатели |
| LC-4 | Audit log completeness 100% за 7 дней | Основатели |
| LC-5 | LLM cost ≤ €0.15/матч (с soft-criteria) | Основатели |
| LC-6 | ≥ 100 paying users к Дню 90 | Основатели |
11. Cross-references
User Stories: Realty Relay Bot v1.1
Входы: product/13-deliver-prd.md (PRODUCED)
US-1: Signup через Telegram (P0)
As русскоязычный renter в Budva/Becici,
I want подписаться на Realty Relay Bot, отправив /start в Telegram,
so that я могу начать получать hard-criteria rental матчи в течение 7 дней без заполнения формы или предоставления email.
AC1.1 Given я отправляю /start, When бот running, Then я получаю welcome message с signup confirmation.
AC1.2 Given я подписан, When я отправляю /status, Then я вижу свой tier (free или paid).
AC1.3 Given я подписан, When проходит 7 дней без матча, Then я получаю no matches yet уведомление.
US-2: Free-tier counter (P0)
As free-tier renter,
I want получать до 5 hard-criteria матчей в месяц, затем быть предложенным upgrade,
so that я могу испытать ценность бота перед оплатой.
AC2.1 Given я free user, When 6-й hard-criteria матч прибывает в месяц, Then я получаю tier-upgrade prompt вместо матча.
AC2.2 Given мой counter сбрасывается 1-го числа месяца, When начинается новый месяц, Then я могу получить ещё 5 матчей.
AC2.3 Given я на 4 матчах, When прибывает 5-й матч, Then форвард матча включает upgrade-prompt reminder.
US-3: Tier upgrade через TG Payments (P0)
As free-tier renter, который достиг cap,
I want upgrade'нуться до paid через Telegram Payments,
so that я могу продолжить получать матчи без прерывания.
AC3.1 Given я отправляю /upgrade, When TG Payments доступен в моём регионе, Then я получаю TG Payments invoice на €4.99/мес.
AC3.2 Given я отправляю /upgrade, When TG Payments НЕ доступен, Then я получаю Stripe checkout link.
AC3.3 Given я завершаю платёж, When платёж подтверждён, Then мой tier меняется на paid и я получаю upgrade-confirmed сообщение.
AC3.4 Given платёж fails, When failure reported, Then мой tier остаётся free и я получаю failure сообщение.
US-4: Soft-criteria фильтр (paid) (P0)
As paid-tier renter,
I want бот оценивал soft criteria (вид на горы, новая мебель, этаж ≥ 3) для каждого матча,
so that я могу приоритизировать объявления, соответствующие моим предпочтениям сверх hard criteria.
AC4.1 Given я paid, When матч форвардится, Then сообщение включает soft-criteria evaluation: вид на горы (да/нет), новая мебель (да/нет), этаж ≥ 3 (да/нет).
AC4.2 Given я free, When матч форвардится, Then сообщение НЕ включает soft-criteria evaluation (cost control).
AC4.3 Given soft-criteria присутствуют, When сообщение composed, Then они показаны как отдельная секция после hard-criteria.
US-5: Audit log через `/seen` (paid) (P1)
As paid-tier renter,
I want запрашивать audit log для любого объявления, отправив /seen ,
so that я могу верифицировать, видел ли бот, парсил ли, принял ли, и форвардил ли объявление.
AC5.1 Given я paid, When я отправляю /seen и объявление существует, Then я получаю события для этого объявления в обратном хронологическом порядке.
AC5.2 Given я paid, When я отправляю /seen и объявление не существует, Then я получаю not found.
AC5.3 Given я free, When я отправляю /seen , Then я получаю audit is a paid feature сообщение.
AC5.4 Given я отправляю более 5 /seen за 1 минуту, When прибывает 6-й, Then я получаю rate-limit сообщение.
US-6: Операционный status через `/status` (paid) (P1)
As paid-tier renter,
I want запрашивать health бота, отправив /status,
so that я могу независимо верифицировать, что бот работает корректно.
AC6.1 Given я paid, When я отправляю /status, Then я получаю per-channel last-poll time, ingest up-time, последние 5 alerts.
AC6.2 Given я free, When я отправляю /status, Then я получаю audit is a paid feature сообщение.
US-7: Cross-channel dedup (P0)
As любой renter (free или paid),
I want никогда не получать одно объявление дважды из разных каналов,
so that я не трачу время на оценку дубликатов.
AC7.1 Given два объявления из разных каналов с одинаковым fingerprint (± 5% цена, одинаковые bedrooms, одинаковый body excerpt), When оба распарсены, Then второе подавлено с reason=cross-channel-duplicate.
AC7.2 Given объявление было форвардно мне в течение 7 дней, When то же объявление распарсено снова, Then я не получаю второй форвард.
US-8: Co-searcher dedup (P1)
As renter, чей партнёр также подписан,
I want не получать то же объявление, которое мой партнёр уже был форвардно,
so that мы оба не пишем одному и тому же владельцу.
AC8.1 Given мой партнёр был форвардно объявление в течение 24 часов, When то же объявление распарсено снова, Then я не получаю форвард.
AC8.2 Given мой партнёр был форвардно объявление, When 24-часовое окно истекает, Then я могу получить форвард.
US-9: Resilience alerts (P0)
As системный оператор (основатель),
I want быть alerted, когда бот не может ингестить из Telegram,
so that я могу исправить проблему до того, как пользователи заметят.
AC9.1 Given TG FLOOD_WAIT ошибка, When обнаружена, Then я получаю [!bot alert] DM в течение 1 polling cycle.
AC9.2 Given SOCKS5 proxy failure, When обнаружена, Then я получаю [!bot alert] DM в течение 1 polling cycle.
AC9.3 Given та же alert condition повторяется в течение 1 часа, When 2-й и 3-й собираются отправить, Then они подавляются (1-hour dedup).
INVEST Validation
| Story | I | N | V | E | S | T | Вердикт |
|---|---|---|---|---|---|---|---|
| US-1 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | PASS |
| US-2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | PASS |
| US-3 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | PASS |
| US-4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | PASS |
| US-5 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | PASS |
| US-6 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | PASS |
| US-7 | depends on US-1 | ✓ | ✓ | ✓ | ✓ | ✓ | PASS |
| US-8 | depends on US-1 | ✓ | ✓ | ✓ | ✓ | ✓ | PASS |
| US-9 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | PASS |
Prioritization Summary
- P0: US-1 (signup), US-2 (counter), US-3 (payment), US-4 (soft-criteria), US-7 (dedup), US-9 (alerts).
- P1: US-5 (
/seen), US-6 (/status), US-8 (co-searcher).
Рекомендуемый execution order: US-1 → US-2 → US-3 → US-4 → US-7 → US-9 → US-5 → US-6 → US-8.
Acceptance Criteria: Realty Relay Bot v1.1 (Test Cases)
Входы: product/14-deliver-user-stories.md (PRODUCED)
TC-1.1 — Signup: `/start` триггерит welcome
| Field | Value |
|---|---|
| Story | US-1 |
| Type | Integration |
| Steps | 1. Новый пользователь отправляет `/start` боту. 2. Получает welcome message. |
| Expected | Welcome message + signup confirmation. Сервер хранит пользователя. |
| Failure | Нет welcome; или сервер не хранит пользователя. |
TC-1.2 — Signup: существующий пользователь `/status` показывает tier
| Field | Value |
|---|---|
| Story | US-1 |
| Type | Integration |
| Steps | 1. Подписанный пользователь отправляет `/status`. 2. Получает tier info. |
| Expected | Tier (free) показан; или `audit is a paid feature` если `/status` paid-only. |
| Failure | Нет tier info; или crash. |
TC-2.1 — Free counter: 5-й матч включает upgrade prompt
| Field | Value |
|---|---|
| Story | US-2 |
| Type | Unit |
| Steps | 1. У free user 4 матча в этом месяце. 2. Прибывает 5-й матч. |
| Expected | Match forward включает upgrade-prompt reminder. |
| Failure | Нет upgrade reminder. |
TC-2.2 — Free counter: 6-й матч blocked
| Field | Value |
|---|---|
| Story | US-2 |
| Type | Unit |
| Steps | 1. У free user 5 матчей в этом месяце. 2. Прибывает 6-й матч. |
| Expected | Tier-upgrade prompt вместо матча. |
| Failure | 6-й матч отправлен; или crash. |
TC-2.3 — Free counter: месячный reset
| Field | Value |
|---|---|
| Story | US-2 |
| Type | Unit |
| Steps | 1. У free user 5 матчей 31 января. 2. Приходит 1 февраля. |
| Expected | Counter сбрасывается; пользователь может получить ещё 5 матчей в феврале. |
| Failure | Counter не сбрасывается. |
TC-3.1 — Payment: TG Payments primary
| Field | Value |
|---|---|
| Story | US-3 |
| Type | Integration |
| Steps | 1. Пользователь отправляет `/upgrade`. 2. TG Payments доступен в регионе. |
| Expected | TG Payments invoice на €4.99/мес. |
| Failure | Нет invoice; или неправильная сумма. |
TC-3.2 — Payment: Stripe fallback
| Field | Value |
|---|---|
| Story | US-3 |
| Type | Integration |
| Steps | 1. Пользователь отправляет `/upgrade`. 2. TG Payments НЕ доступен. |
| Expected | Stripe checkout link. |
| Failure | Нет link; или неправильный link. |
TC-3.3 — Payment: успех → paid tier
| Field | Value |
|---|---|
| Story | US-3 |
| Type | Unit |
| Steps | 1. Пользователь завершает платёж (TG или Stripe). 2. Webhook подтверждён. |
| Expected | Tier = paid. Пользователь получает upgrade-confirmed сообщение. |
| Failure | Tier не обновлён; или нет сообщения. |
TC-3.4 — Payment: failure → free tier
| Field | Value |
|---|---|
| Story | US-3 |
| Type | Unit |
| Steps | 1. Платёж fails. |
| Expected | Tier остаётся free. Пользователь получает failure сообщение. |
| Failure | Tier неправильно установлен в paid. |
TC-4.1 — Soft-criteria: paid user
| Field | Value |
|---|---|
| Story | US-4 |
| Type | Unit |
| Steps | 1. У paid user матч. 2. LLM оценивает soft criteria. |
| Expected | Форвард-сообщение включает вид на горы / новую мебель / этаж ≥ 3. |
| Failure | Soft-criteria не включены. |
TC-4.2 — Soft-criteria: free user (НЕ оценивается)
| Field | Value |
|---|---|
| Story | US-4 |
| Type | Unit |
| Steps | 1. У free user матч. 2. LLM call. |
| Expected | Soft-criteria НЕ оцениваются; cost control сохранён. |
| Failure | Soft-criteria оценены для free user (cost spike). |
TC-5.1 — `/seen`: success
| Field | Value |
|---|---|
| Story | US-5 |
| Type | Integration |
| Steps | 1. Paid user отправляет `/seen <id>`. 2. Объявление существует. |
| Expected | События в обратном хронологическом порядке. |
| Failure | Нет событий; или неправильный порядок. |
TC-5.2 — `/seen`: not found
| Field | Value |
|---|---|
| Story | US-5 |
| Type | Integration |
| Steps | 1. Paid user отправляет `/seen nonexistent`. |
| Expected | `not found` reply. |
| Failure | Error reply. |
TC-5.3 — `/seen`: free user blocked
| Field | Value |
|---|---|
| Story | US-5 |
| Type | Integration |
| Steps | 1. Free user отправляет `/seen <id>`. |
| Expected | `audit is a paid feature` reply. |
| Failure | Free user получает audit access. |
TC-5.4 — `/seen`: rate-limit
| Field | Value |
|---|---|
| Story | US-5 |
| Type | Unit |
| Steps | 1. Paid user отправляет 5 `/seen` за 1 минуту. 2. Отправляет 6-й. |
| Expected | 5 успешны; 6-й rate-limited. |
| Failure | 6-й успешен. |
TC-6.1 — `/status`: success
| Field | Value |
|---|---|
| Story | US-6 |
| Type | Integration |
| Steps | 1. Paid user отправляет `/status`. |
| Expected | Per-channel last-poll, ingest up-time, последние 5 alerts. |
| Failure | Отсутствующие секции. |
TC-6.2 — `/status`: free user blocked
| Field | Value |
|---|---|
| Story | US-6 |
| Type | Integration |
| Steps | 1. Free user отправляет `/status`. |
| Expected | `audit is a paid feature` reply. |
| Failure | Free user получает audit access. |
TC-7.1 — Dedup: cross-channel
| Field | Value |
|---|---|
| Story | US-7 |
| Type | Unit |
| Steps | 1. Два объявления с одинаковым fingerprint, разные каналы. |
| Expected | Второе подавлено с `cross-channel-duplicate`. |
| Failure | Оба форвардятся. |
TC-7.2 — Dedup: same-user 7-дневный
| Field | Value |
|---|---|
| Story | US-7 |
| Type | Unit |
| Steps | 1. Объявление A форвардно 3 дня назад user X. 2. A re-parsed. |
| Expected | X не получает второй форвард. |
| Failure | Второй форвард отправлен. |
TC-8.1 — Co-searcher dedup: 24-часовой
| Field | Value |
|---|---|
| Story | US-8 |
| Type | Unit |
| Steps | 1. Объявление A форвардно user X 2 часа назад. 2. A re-parsed. |
| Expected | User Y (co-searcher X) не получает. |
| Failure | User Y получает. |
TC-9.1 — Alert: FLOOD_WAIT
| Field | Value |
|---|---|
| Story | US-9 |
| Type | Integration |
| Steps | 1. Stub TG возвращает `FLOOD_WAIT`. 2. Poll запускается. |
| Expected | Основатели получают `[!bot alert]` DM. |
| Failure | Нет DM. |
TC-9.2 — Alert: proxy failure
| Field | Value |
|---|---|
| Story | US-9 |
| Type | Integration |
| Steps | 1. SOCKS5 proxy offline. 2. Poll запускается. |
| Expected | Основатели получают `[!bot alert]` DM. |
| Failure | Нет DM. |
TC-9.3 — Alert dedup: 1-часовой
| Field | Value |
|---|---|
| Story | US-9 |
| Type | Unit |
| Steps | 1. Та же alert condition 3 раза за 1 час. |
| Expected | Только 1 DM отправлен. |
| Failure | Несколько DM. |
Summary Table
| TC | Story | Type | Pass/Fail |
|---|---|---|---|
| TC-1.1 | US-1 | Integration | Welcome + signup |
| TC-1.2 | US-1 | Integration | Tier info |
| TC-2.1 | US-2 | Unit | 5-й матч prompt |
| TC-2.2 | US-2 | Unit | 6-й матч blocked |
| TC-2.3 | US-2 | Unit | Месячный reset |
| TC-3.1 | US-3 | Integration | TG Payments |
| TC-3.2 | US-3 | Integration | Stripe fallback |
| TC-3.3 | US-3 | Unit | Успех → paid |
| TC-3.4 | US-3 | Unit | Failure → free |
| TC-4.1 | US-4 | Unit | Soft-criteria paid |
| TC-4.2 | US-4 | Unit | Soft-criteria free blocked |
| TC-5.1 | US-5 | Integration | `/seen` success |
| TC-5.2 | US-5 | Integration | `/seen` not-found |
| TC-5.3 | US-5 | Integration | `/seen` free blocked |
| TC-5.4 | US-5 | Unit | `/seen` rate-limit |
| TC-6.1 | US-6 | Integration | `/status` success |
| TC-6.2 | US-6 | Integration | `/status` free blocked |
| TC-7.1 | US-7 | Unit | Cross-channel dedup |
| TC-7.2 | US-7 | Unit | Same-user 7-day |
| TC-8.1 | US-8 | Unit | Co-searcher 24h |
| TC-9.1 | US-9 | Integration | FLOOD_WAIT alert |
| TC-9.2 | US-9 | Integration | Proxy alert |
| TC-9.3 | US-9 | Unit | Alert dedup |
Всего: 23 test cases.
Edge Cases: Realty Relay Bot v1.1
Входы: product/13-deliver-prd.md, product/14-deliver-user-stories.md, product/15-deliver-acceptance-criteria.md (PRODUCED)
EC-1: TG Payments не в регионе renter'а
- Story: US-3
- Trigger: Пользователь в регионе, где TG Payments не поддерживается.
- Expected: Stripe checkout link предложен как fallback (ADR-007).
- Recovery: Manual Stripe setup, если оба fail.
- Priority: P0.
- Story: US-3
- Trigger: Network blip, Stripe service outage.
- Expected: Stripe retries; пользователь в конце концов видит правильный tier.
- Recovery: Manual tier sync через admin tool.
- Priority: P1.
- Story: US-2
- Trigger: У free user 5 матчей, затем он видит идеальное объявление в канале.
- Expected: Tier-upgrade prompt прибывает вместо матча.
- Recovery: Пользователь может upgrade'нуться в течение 24 часов; пропущенный матч recoverable через
/seenпосле upgrade. - Priority: P0.
- Story: US-3
- Trigger: Paid user запрашивает refund / cancellation через TG Payments или Stripe.
- Expected: Tier revert'ится в free в конце paid period; пользователь сохраняет paid features до этого.
- Recovery: N/A.
- Priority: P1.
- Story: US-4
- Trigger: Высокий объём paid матчей с soft-criteria evaluation.
- Expected: LLM cost ≤ €0.15/матч (PRD LC-5). Alert, если превышен.
- Recovery: S7.3 cost monitor; tune soft-criteria prompt; или ограничить soft-criteria high-priority criteria.
- Priority: P1.
- Story: US-7
- Trigger: То же объявление re-posted в другом канале с 5% изменением цены.
- Expected: Другой fingerprint; оба форвардятся.
- Recovery: N/A — ожидаемое поведение.
- Priority: P1.
- Story: US-1
- Trigger: Тот же TG user_id пытается подписаться несколько раз.
- Expected: Idempotent: сервер использует существующую запись.
- Recovery: N/A.
- Priority: P2.
- Story: US-5
- Trigger: High-frequency объявление (например, переоценённое 100 раз).
- Expected: Truncated на 10 событий +
(+N more). - Recovery: N/A.
- Priority: P2.
- Story: US-9
- Trigger: Много каналов постят одновременно, натыкаясь на TG rate limits.
- Expected:
[!bot alert]основателям; backoff по существующей lease logic. - Recovery: Ручная rate-limit review; рассмотреть уменьшение polling frequency.
- Priority: P0.
- Story: US-9
- Trigger: SOCKS5 proxy одного TG-аккаунта offline.
- Expected: Per-channel/per-account alert; 4 других аккаунта продолжают.
- Recovery: Ручная замена proxy.
- Priority: P1.
- Story: US-5
- Trigger: 6+ месяцев работы, 1KB/объявление × 100 объявлений/день = 18MB/мес.
- Expected: Ручная очистка; или rotation policy.
- Recovery: N/A.
- Priority: P2.
- Story: US-5
- Trigger: Audit event записан в local time, не UTC.
- Expected: Все timestamps UTC; dedup окна вычисляются в UTC.
- Recovery: Re-record с UTC.
- Priority: P0.
- Story: US-7
- Trigger: LLM принимает; бот падает до записи
forwardedevent. - Expected: При рестарте объявление переоценивается; dedup state может подавить re-forward.
- Recovery: Ручной review через
/seen. - Priority: P1.
- Story: US-3
- Trigger: Free user пытается обойти tier check.
- Expected: Server-side tier check enforces; free user получает
audit is a paid feature. - Recovery: N/A.
- Priority: P0.
- Story: US-7
- Trigger: Два poll cycle обрабатывают одно объявление до dedup state committed.
- Expected: Dedup использует atomic check-and-set.
- Recovery: N/A.
- Priority: P1.
- Story: US-1
- Trigger: Renter меняет TG аккаунт (редко).
- Expected: Новый аккаунт = новая подписка; старый аккаунт теряет tier.
- Recovery: Ручная re-association.
- Priority: P2.
- Story: US-1
- Trigger: EU пользователь запрашивает data deletion.
- Expected: Сервер удаляет
{user_id, signup_at, tier, matches_sent}в течение 30 дней. - Recovery: N/A.
- Priority: P1.
- Story: US-4
- Trigger: Новый soft-criteria prompt имеет false-negatives; paid users видят меньше матчей.
- Expected: A/B test до полного rollout; мониторинг free→paid retention.
- Recovery: Revert prompt.
- Priority: P0.
- Story: US-9
- Trigger: TG ToS violation или rate-limit abuse.
- Expected: Основатели rotate на backup bot account; пользователи re-subscribe.
- Recovery: Ручная bot migration.
- Priority: P0.
- Story: US-4
- Trigger: MiniMax API недоступен >1 час.
- Expected: Бот продолжает ингестить; форвардит только hard-criteria матчи; soft-criteria skipped.
- Recovery: LLM retry; fall back на regex-only hard criteria (limited).
- Priority: P0.
- Story: US-3
- Trigger: Пользователь платит за 1 месяц, отменяет через 1 день.
- Expected: Нет refund по TG Payments policy; пользователь теряет paid features в конце paid period.
- Recovery: N/A.
- Priority: P2.
- Story: US-5
- Trigger: Бот killed mid-write.
- Expected:
/seenпропускает corrupted line; warns пользователь. - Recovery: Ручная очистка.
- Priority: P2.
- Stage 12 §5 Specification Tensions — источник EC-5, EC-18.
- Stage 13 §9 Risks — источник EC-1, EC-2, EC-9, EC-19.
- Stage 15 (формальные test cases) — TC boundaries информируют edge cases.
- Stage 22 (deliver-launch-checklist) — получает P0 edge cases как launch-blocking.
EC-2: Stripe webhook failure
EC-3: Free user достигает cap mid-search
EC-4: Paid user отменяет mid-cycle
EC-5: LLM cost spike с soft-criteria
EC-6: Cross-channel repost с изменением цены
EC-7: Два пользователя подписываются с одного TG аккаунта (невозможно, но тестируется)
EC-8: `/seen` для объявления с > 100 событиями
EC-9: TG API rate-limit в период высокого объёма
EC-10: SOCKS5 proxy для 1 из 5 аккаунтов fails
EC-11: Audit log file растёт unbounded
EC-12: Time-zone skew в audit timestamps
EC-13: Бот падает между LLM решением и форвардом
EC-14: Free user пытается получить доступ к paid фичам через API
EC-15: Бот форвардит объявление дважды из-за dedup race
EC-16: TG user_id меняется (редко, но возможно)
EC-17: GDPR data deletion request
EC-18: Изменение soft-criteria LLM prompt вызывает churn paid users
EC-19: Telegram банит bot account
EC-20: LLM API outage (MiniMax M2.1 down)
EC-21: Free user upgrade'ает затем немедленно downgrades
EC-22: Audit log corrupted (частичная строка)
Summary
| Priority | Count |
|---|---|
| P0 | 8 |
| P1 | 9 |
| P2 | 5 |
Всего: 22 edge cases.
Cross-references
Go-To-Market Strategy: Realty Relay Bot v1.1 — Freemium Launch
Входы: product/03-competitive-market-analysis.md, product/09-product-strategy.md (PRODUCED)
Резюме
GTM для Realty Relay Bot v1.1 — freemium launch в нишу русскоязычных expats в Montenegro, с TG channel partnerships, content marketing, и referral mechanics как три primary distribution канала. Доминирующий риск — не viable distribution channel (cost-free TG channel posting — wedge); второй риск — freemium conversion rate. Три GTM фазы покрывают запуск.
1. Market Entry Thesis
Why This Market
Русскоязычные expats в Montenegro, конкретно Budva-Becici long-term rental ниша, — известная демография с:
- Концентрированной коммуникацией на Telegram (80-90% adoption).
- Высокой willingness to pay для time-saving инструментов (rental search занимает 2-8 недель).
- Существующим TG channel presence (5-10+ каналов с rental объявлениями).
- v1.0 продукт operational; v1.1 добавляет freemium + paid дифференциаторы.
- TG Payments доступен в Montenegro для русскоязычных пользователей.
- MiniMax M2.1 cost устойчив при projected scale.
- Size: 1-3K/год (SAM).
- Достижим через TG channel partnerships.
- Size: ~ 500/год.
- Отложен в Y2.
- Telegram-native (без app, без email).
- Real-time (≤ 10 мин latency).
- Auditable (paid tier — уникально в этой нише).
- Affordable (€4.99/мес, меньше одной чашки кофе в неделю).
- Soft-launch в 1-2 TG каналах.
- 10-20 user interviews.
- Soft-criteria prompt calibration.
- TG Payments + Stripe setup.
- Cross-promo с 3-5 каналами.
- Content marketing kickoff (2-3 blog posts).
- Public launch в 5-10 каналах.
- Referral mechanics.
- A/B test free-tier cap (3 vs 5 vs 7).
- Iterate по soft-criteria на основе paid-user feedback.
- Quarterly content cadence.
- Paid acquisition.
- Multi-city expansion (Bar, Tivat, Kotor).
- Annual subscription tier.
- 1K free signups в течение 90 дней.
- 100 paid users в течение 90 дней.
- MRR €500+ к Дню 90.
- Free→paid conversion ≥ 2%.
- 5+ TG channel partnerships подписаны.
- 10+ blog posts опубликованы.
- Response: Reach out к топ 3-5 каналам в неделе 1.
- Confidence: M.
- Watch: Если refused, полагаться только на scraping + content.
- Response: A/B test 3 vs 5 vs 7 начиная с Дня 30.
- Confidence: M.
- Watch: Если < 1%, пересмотреть.
- Response: Y1 organic-only; Y2 paid, когда LTV/CAC доказан.
- Confidence: H.
- Stage 03 §5 (Where to play) — информирует wedge.
- Stage 09 §10 R1-R3 — recommendations.
- Stage 18 — pricing.
- Stage 22 — launch checklist.
Why Now
The Wedge
Counter-positioning: TG-native + freemium + LLM курация + audit log. Агрегаторы не могут легко match эту комбинацию.
Go / Wait / Pivot Decision
GO. Ship v1.1 в текущем квартале. Альтернатива (остаться на v1.0) оставляет revenue на столе.
2. Segment Selection
Primary segment: Русскоязычные renters в Budva/Becici, ищущие long-term апартаменты ≤ 700 EUR.
Secondary segment: Англоязычные expats (будущее).
3. Positioning & Messaging
> «Realty Relay Bot — твой Telegram-агент по аренде в Budva-Becici. 5 матчей бесплатно, потом €4.99/мес за безлимит + аудит + soft-фильтры.»
Ключевые сообщения:
4. Channel Plan
| Канал | Purpose | Стоимость | Expected Reach |
|---|---|---|---|
| **TG channel partnerships** (5-10 каналов) | Cross-promo, listing source | €0 (mutual benefit) | 5-10K зрителей канала |
| **Content marketing** (блог: «Life in Montenegro for expats») | SEO, brand | €0 (founder time) | 1-3K organic visits/мес |
| **Referral mechanics** (invite-a-friend, +1 free матч каждому) | Viral | €0 | 10-30% free users |
| **Telegram bot directory listings** | Discovery | €0 | 100-500 clicks |
| **Paid acquisition** | Scaling | €0.50-2.00 на signup | Y2 only |
5. Pricing & Packaging
См. Stage 18 (pm-pricing-packaging, отдельный артефакт).
6. Launch Plan
Phase 1 — Pre-launch (Недели 1-2)
Phase 2 — Public launch (Недели 3-4)
Phase 3 — Growth (Недели 5-12)
Phase 4 — Scale (Y2)
7. Risks & Mitigations
| Риск | Вероятность | Impact | Mitigation |
|---|---|---|---|
| Channel partnerships refused | M | H | DIY scraping + content marketing. |
| Free→paid < 1% | M | H | A/B test cap. |
| TG API изменения | L | H | Stage 09 contingency. |
| Aggregator запускает TG alerts | M | M | Audit + soft-criteria дифференциатор. |
| LLM cost spike | M | M | Paid-only soft-criteria. |
8. Success Criteria
9. Recommendations (O→I→R→C→W Cascade)
Recommendation 1: Вести с TG channel partnerships.
Recommendation 2: Трекать free→paid conversion ежедневно, A/B test cap еженедельно.
Recommendation 3: Не вводить paid acquisition до Y2.
Cross-references
Narrative: Realty Relay Bot v1.1
Входы: product/03-competitive-market-analysis.md, product/09-product-strategy.md (PRODUCED)
Executive Narrative
> Русскоязычные renters, ищущие long-term апартаменты в Budva/Becici, раньше тратили 2-8 недель на скроллинг 5-10 Telegram-каналов, пропуская хорошие объявления, и получая дубликаты. Realty Relay Bot v1.1 меняет это: real-time (≤ 10 мин) hard-criteria matching в бесплатном Telegram-native боте, с paid tier (€4.99/мес), который добавляет audit verification и soft-criteria фильтры. Бот — это то, чем каждый rental-search tool должен был быть с самого начала: real-time, auditable, affordable.
1. Narrative Arc
Setup: Русскоязычные expats в Montenegro (25-45 yo, tech-literate, TG-native) сталкиваются с фрагментированным rental-search процессом: 5-10+ публичных Telegram-каналов, смешанные языки, нет схемы, неформальное ценообразование. Ручное сканирование занимает 2-8 недель, пропускает хорошие объявления, производит дублирующий outreach к landlord'ам.
Conflict: Существующие альтернативы все проваливаются хотя бы на одной оси. Real-estate агрегаторы (ImmobilienScout24, local.me) имеют слабое покрытие в ≤ 700 EUR нише. Real-estate агенты взимают месячную аренду как комиссию. Generic TG-channel scrapers не имеют курации. Email digests устаревают.
Resolution: Realty Relay Bot v1.1 — TG-native бот, который опрашивает каналы каждые 10 минут, спрашивает MiniMax M2.1, соответствует ли каждое объявление hard + soft criteria, и форвардит матчи подписчикам. Free tier: 5 матчей/мес, hard-criteria only. Paid tier (€4.99/мес): unlimited матчи, soft-criteria фильтр (вид на горы, новая мебель, этаж ≥ 3), и per-listing audit log. Counter-positioning: агрегаторы не могут легко match TG-native + freemium + LLM + audit.
Implication: Маленький TG-native бот становится самым надёжным способом найти long-term апартамент в Budva/Becici — auditable, affordable, и построенным для renter'а, не landlord'а.
2. Positioning Analysis
| Ось | Realty Relay Bot v1.1 | Aggregator | Generic scraper | Ручное сканирование |
|---|---|---|---|---|
| Real-time | ≤ 10 мин (T6) | Daily-weekly | N/A | Manual |
| Hard-criteria precision | High (LLM) | Low | None | Manual |
| TG-native | ДА | НЕТ | ДА | ДА |
| Freemium | ДА (5 free) | НЕТ | НЕТ | N/A |
| Soft-criteria фильтр | ДА (paid) | НЕТ | НЕТ | НЕТ |
| Audit log | ДА (paid) | НЕТ | НЕТ | НЕТ |
| Multi-city | НЕТ (Y1) | ДА | ДА | N/A |
| Стоимость | €0-4.99/мес | Free | Free | Free (но медленно) |
3. Why Now Analysis
- Why now: TG Payments доступен в Montenegro; MiniMax M2.1 cost устойчив; v1.0 продукт operational; русскоязычный expat демография достижима через TG каналы.
- Why not earlier: v1.0 был MVP; v1.1 строит на нём.
- Why not later: Ёмкость (N=2 founders) фиксирована; откладывание не разблокирует новую ёмкость.
- Hook: «Твой Telegram-агент по аренде в Budva-Becici.»
- Tension: 2-8 недель ручного сканирования.
- Resolution: Real-time матчи; 5 бесплатно, затем €4.99/мес.
- Tone: Casual, direct, TG-native.
- Call to action:
/startв боте. - Hook: «Mutual benefit — ваш канал как listing source, наш бот как value-add для вашей аудитории.»
- Tension: Channel админы хотят engaged подписчиков.
- Resolution: Cross-promo партнёрство.
- Call to action: Прямое сообщение админу.
- Response: Audit — counter-positioning lever.
- Confidence: M.
- Response: Тегировать claims с confidence и tier.
- Confidence: H.
- Response: Y1 internal narrative; press в Y2, если scale оправдывает.
- Stage 03 §5 (Where to play) — информирует positioning.
- Stage 09 §10 R1-R3 — recommendations.
- Stage 17 (go-to-market) — channel plan.
- Stage 20 (executive-writing) — выведен из этого narrative.
4. Audience Adaptation Matrix
Русскоязычный renter (primary)
Channel partner (TG channel admin)
5. Evidence-Narrative Integration
| Утверждение | Evidence | Tier | Confidence |
|---|---|---|---|
| Русскоязычные expats в Budva-Becici | Знание основателей; существующие TG каналы | T6 | H |
| 5-10+ публичных каналов | Знание основателей | T6 | H |
| 2-8 недель search duration | Industry heuristic | T5 | M |
| ≤ 700 EUR ценовой тир | Hard criteria в v1.0 | T6 | H |
| TG-native | v1.0 архитектура | T6 | H |
| €4.99/мес ниже threshold | Industry benchmark | T5 | M |
| Audit log драйвит paid engagement | T5 inference | T5 | M |
| Soft-criteria — paid дифференциатор | T5 inference | T5 | M |
6. Objection Anticipation
| Objection | Ответ |
|---|---|
| «Почему не использовать агрегатор?» | Агрегаторы имеют слабое покрытие в ≤ 700 EUR нише. |
| «Почему платить €4.99/мес?» | Меньше одной чашки кофе в неделю; экономит 2-8 недель поиска. |
| «Почему только Telegram?» | TG-native — wedge; агрегаторы не могут легко match. |
| «Audit log действительно полезен?» | Уникально в этой нише; верифицирует «видел ли бот это?» |
7. Competitive Narrative Analysis
| Класс | Их narrative | Наш narrative |
|---|---|---|
| Агрегаторы | «У нас все объявления.» | «У нас precision и freshness в вашей нише.» |
| Generic scrapers | «Мы даём вам данные.» | «Мы даём вам курированные, auditable, affordable матчи.» |
| Ручное сканирование | (нет narrative) | «Мы экономим вам 2-8 недель скроллинга.» |
8. Recommendations (O→I→R→C→W Cascade)
Recommendation 1: Вести с audit log в narrative.
Recommendation 2: Быть явным о evidence gaps.
Recommendation 3: Не писать press-release narrative.
Cross-references
Executive One-Pager: Realty Relay Bot v1.1 — Freemium + Audit + Soft-Criteria
Автор: self (pvdmitriev) | Для: paired builder (sophie_salt) | Время чтения: 5 мин | Тип запроса: Решение (greenlight v1.1 ship; согласовать Day-90 conversion review)
Входы: product/09-product-strategy.md, product/19-narrative-building.md
TL;DR (3 bullet максимум)
- Realty Relay Bot v1.0 operational (10-min TG scraping, MiniMax M2.1 фильтр, hard-criteria matching), но не монетизирован. v1.1 добавляет freemium paywall (5 free + €4.99/мес paid), paid-tier audit log, и soft-criteria фильтр.
- Target: русскоязычные renters в Budva/Becici, ≤ 700 EUR/мес, 1+ BR. TAM 5-15K/год, SAM 1-3K/год, SOM year 1 100-500 paying users (€6-30K revenue).
- Ship v1.1 в текущем квартале. Запустить Day-90 review (free→paid conversion ≥ 2% gate). Переоценить только по триггеру (TG policy change, conversion < 1%, channel partnerships refused).
- Нет freemium paywall. Нет revenue model; каждый пользователь на одном tier.
- Нет audit trail. Нет premium дифференциатора vs generic scrapers.
- Нет soft-criteria фильтра. Нет premium-tier фичи для персонализации.
- Option 1 (Ничего не делать / остаться на v1.0): Отклонён. Нет revenue; нет differentiation; нет Y2 scaling.
- Option 2 (Пропустить freemium, идти напрямую в paid): Отклонён. Conversion rate 2-5% слишком рискованна без free tier.
- Option 3 (Multi-city сначала): Отклонён по Stage 09 §6 #1. Фокус Budva-Becici сначала.
- Option 4 (Ship в Y2): Отклонён. Ёмкость фиксирована; откладывание не разблокирует новую ёмкость.
- 1K free signups в течение 90 дней.
- 100 paid users в течение 90 дней.
- MRR €500+ к Дню 90.
- Counter-positioning vs агрегаторов установлен.
- Substrate для Y2 multi-city expansion.
- Stage 09 §3 (3 bet'а, упорядоченные) и §10 (3 рекомендации) — стратегия committed.
- Stage 12 §3 (25 acceptance criteria) — спецификация testable.
- Stage 14 (9 user stories, INVEST-validated) — работа scoped.
- Stage 15 (23 test cases) — launch criteria derivable.
- Stage 16 (22 edge cases, 8 P0) — failure modes mapped.
- Stage 17 §6 (4 фазы) — rollout sequenced.
- Stage 19 (narrative: «твой Telegram-агент по аренде в Budva-Becici») — positioning clear.
- Stage 10 §5 (3 pre-registered эксперимента) — измерение honest.
- Stage 11 (9 ADRs) — технические решения bounded.
- Free→paid conversion < 1%. Mitigation: A/B test cap (3 vs 5 vs 7); пересмотреть pricing.
- TG channel partnerships refused. Mitigation: DIY scraping + content marketing.
- TG policy change на paid bots. Mitigation: Telegram Payments compliant; мониторить.
- Stage 09 (product-strategy) — ведёт situation + recommendation.
- Stage 12 (specification-writing) — ведёт resolution detail.
- Stage 17 (go-to-market-strategy) — ведёт rollout phases.
- Stage 19 (narrative-building) — ведёт positioning.
- Stage 22 (deliver-launch-checklist) — получает greenlight как launch criterion.
Situation
Realty Relay Bot v1.0 опрашивает публичные Telegram-каналы каждые 10 минут, фильтрует через MiniMax M2.1, и форвардит hard-criteria матчи подписчикам. Он operational и обслуживает пользователей, но не монетизирован.
Strategy document (Stage 09) commits к freemium модели с paid дифференциаторами. Конкурентный анализ (Stage 03) подтверждает counter-positioning (TG-native + freemium + LLM + audit) defensible против агрегаторов и generic scrapers. Market sizing (Stage 05) даёт реалистичный Y1 revenue: 100-500 paying users, €6-30K.
Complication
v1.0 имеет три gaps:
Эти gaps компаундируются: не монетизированный, не дифференцированный, generic бот не может финансировать distribution, не может защищаться от конкурентов, и не может сегментировать free vs paid пользователей.
Resolution: ship v1.1 в текущем квартале
Рекомендуемый course of action — поставить v1.1 — freemium paywall, paid-tier audit log, и soft-criteria фильтр — в текущем квартале, gated by spec, user stories, test cases, и edge cases уже произведённые в Stages 12-16.
Почему v1.1, а не альтернативы:
Что это стоит: ~ 4-6 недель founder time для freemium + payment + audit + soft-criteria. ~ €50-100/мес LLM cost при 200 paid users. ~ €0 CAC (TG channel posting).
Что это достигает:
Confidence: H — предполагает free→paid conversion ≥ 2%. Если < 1% после 90 дней, пересмотреть pricing.
Evidence
Risks (top 3)
Ask
Greenlight v1.1 ship в текущем квартале. Block calendar для Day-90 review (free→paid conversion ≥ 2% gate, MRR €500+ gate). Согласиться переоценить Stage 09 только по триггеру (TG policy, conversion < 1%, channel partnerships refused).
Cross-references
Launch Checklist: Realty Relay Bot v1.1
Входы: product/10-metric-design-experimentation.md, product/13-deliver-prd.md (PRODUCED)
1. Launch Overview
| Field | Значение |
|---|---|
| Launch name | Realty Relay Bot v1.1 — Freemium + Audit + Soft-Criteria |
| Launch type | Public (TG-native) |
| Launch date | TBD (calendar block при engineering completion) |
| Decision owner | self (pvdmitriev) |
| Pair approver | sophie_salt |
| Strategy reference | Stage 09 §3 Bets 1 + 2 |
| Spec reference | Stage 12 (S-1 through S-12) |
| PRD reference | Stage 13 §10 (Launch Criteria) |
2. Engineering Readiness
| # | Item | Status | Владелец | Blocker? |
|---|---|---|---|---|
| E-1 | `payments.py` (TG Payments + Stripe) | Не начато | self | No |
| E-2 | `tier.py` (free/paid logic, counter) | Не начато | self | No |
| E-3 | `audit.py` (JSON Lines writer, paid-access only) | Не начато | self | No (depends on E-2) |
| E-4 | `commands.py` (`/start`, `/seen`, `/status`, `/upgrade`) | Не начато | self | No (depends on E-2) |
| E-5 | `dedup.py` (fingerprint-hash) | Не начато | self | No |
| E-6 | `alerts.py` (`[!bot alert]` DM) | Не начато | self | No |
| E-7 | `detect.py` (FLOOD_WAIT / proxy detection) | Не начато | self | No |
| E-8 | Soft-criteria LLM prompt | Не начато | self | No |
| E-9 | `data/audit/events.jsonl` path | Не начато | self | No |
| E-10 | TG Payments setup в TG bot | Не начато | self | No |
| E-11 | Stripe account + webhook setup | Не начато | self | No |
| E-12 | Code review: tier enforcement server-side | Не начато | self | No |
3. QA & Testing
| # | Item | Status | Владелец | Blocker? |
|---|---|---|---|---|
| Q-1 | TC-1.1, 1.2 (signup) pass | Не начато | self | No |
| Q-2 | TC-2.1, 2.2, 2.3 (counter) pass | Не начато | self | No |
| Q-3 | TC-3.1..3.4 (payment) pass | Не начато | self | No (depends on E-1) |
| Q-4 | TC-4.1, 4.2 (soft-criteria) pass | Не начато | self | No (depends on E-8) |
| Q-5 | TC-5.1..5.4 (audit /seen) pass | Не начато | self | No (depends on E-3) |
| Q-6 | TC-6.1, 6.2 (audit /status) pass | Не начато | self | No (depends on E-3) |
| Q-7 | TC-7.1, 7.2 (dedup) pass | Не начато | self | No (depends on E-5) |
| Q-8 | TC-8.1 (co-searcher) pass | Не начато | self | No (depends on E-5) |
| Q-9 | TC-9.1..9.3 (alerts) pass | Не начато | self | No (depends on E-6, E-7) |
| Q-10 | EC-1, 3, 9, 12, 14, 18, 19, 20 covered | Не начато | self | No |
4. Design & UX
| # | Item | Status | Владелец | Blocker? |
|---|---|---|---|---|
| D-1 | `/start` welcome message (Russian) | Не начато | self | No |
| D-2 | Tier-upgrade prompt copy | Не начато | self | No |
| D-3 | Soft-criteria display format | Не начато | self | No |
5. Marketing & Communications
| # | Item | Status | Владелец | Blocker? |
|---|---|---|---|---|
| M-1 | Cross-promo с 3-5 TG каналами | Не начато | self | No |
| M-2 | 2-3 blog posts (Life in Montenegro for expats) | Не начато | self | No |
| M-3 | Referral mechanics задокументированы | Не начато | self | No |
6. Customer Support
| # | Item | Status | Владелец | Blocker? |
|---|---|---|---|---|
| C-1 | TG-based support channel (`/support` команда) | Не начато | self | No |
7. Legal & Compliance
| # | Item | Status | Владелец | Blocker? |
|---|---|---|---|---|
| L-1 | TG ToS review (paid bot allowed) | n/a (T6) | self | No |
| L-2 | GDPR data retention policy | Не начато | self | No |
| L-3 | TG Payments terms of service | n/a (T3) | self | No |
8. Operations & Infrastructure
| # | Item | Status | Владелец | Blocker? |
|---|---|---|---|---|
| O-1 | `data/audit/` директория writable | Не начато | self | No |
| O-2 | Disk space для audit log (~18MB/мес) | Не начато | self | No |
| O-3 | Bot restart procedure | Не начато | self | No |
9. Analytics & Monitoring
| # | Item | Status | Владелец | Blocker? |
|---|---|---|---|---|
| A-1 | New signups / week | Ready (после E-2) | self | No |
| A-2 | Free-tier cap hit rate | Ready (после E-2) | self | No |
| A-3 | Free→paid conversion rate | Ready (после E-1) | self | No |
| A-4 | MRR | Ready (после E-1) | self | No |
| A-5 | Churn rate (monthly) | Ready (после E-1) | self | No |
| A-6 | LLM cost / week | Ready | self | No |
| A-7 | Ingest up-time | Ready | self | No |
10. Go / No-Go Criteria
| # | Критерий | Pass при запуске? |
|---|---|---|
| G-1 | Все TC pass | Требуется |
| G-2 | EC-1, 3, 9, 12, 14, 18, 19, 20 covered | Требуется |
| G-3 | M-1, M-2 ready (3-5 channel partnerships, 2-3 blog posts) | Требуется |
| G-4 | Day-90 review calendared | Требуется |
| G-5 | Free→paid conversion ≥ 2% в течение 90 дней (измерено) | Требуется |
| G-6 | MRR ≥ €500 к Дню 90 | Требуется |
| G-7 | ≥ 100 paying users к Дню 90 | Требуется |
| G-8 | TG Payments + Stripe протестированы в production | Требуется |
| G-9 | Audit log completeness 100% за 7 дней | Требуется (измерено) |
Правило решения: G-1..G-4 + G-8 должны pass ДО запуска. G-5..G-7 + G-9 измеряются ПОСЛЕ запуска; если любой fails на День 90, revert по §11.
Финальная go/no-go authority: Founders (self + pair).
11. Rollback Plan
| Триггер | Действие | Владелец |
|---|---|---|
| Free→paid < 1% на День 30 | A/B test cap; пересмотреть pricing. | Founders |
| TG Payments не в регионе renter'а (высокий %) | Default на Stripe для всех пользователей. | Founders |
| Audit log unused > 50% paid на День 60 | Deprecate `/seen` и `/status`; оставить log. | Founders |
| LLM cost > €0.20/матч | Disable soft-criteria; revert на hard-only. | Founders |
| TG банит bot | Rotate на backup bot account; пользователи re-subscribe. | Founders |
Rollback cost: v1.1 commit — source-of-truth. Revert = git revert на v1.0 commit.
12. Check-in Schedule
| Cadence | Когда | Reviewer | Output |
|---|---|---|---|
| Daily | 09:00 local | self | Operational метрики (Stage 10 §3) |
| Weekly | Friday 17:00 | self + pair | Metric dashboard; A/B test cap |
| Day-30 | Calendar block | self + pair | Free→paid early signal |
| Day-90 | Calendar block | self + pair | Stage 17 §6 Phase 3 review |
13. Open Issues
| # | Issue | Владелец | Резолюция |
|---|---|---|---|
| OI-1 | Точный soft-criteria LLM prompt | self | Stage 12 implementation |
| OI-2 | TG Payments + Stripe region split | self | Stage 22 setup |
| OI-3 | GDPR data retention | self | L-2 |
| OI-4 | Referral mechanics (anti-abuse) | self | M-3 |
| OI-5 | Bot restart procedure | self | O-3 |
Cross-references
- Stage 10 §3-§4 — operational метрики.
- Stage 12 §3 — test cases.
- Stage 13 §10 (Launch Criteria) — §10.
- Stage 14 (user-stories) — engineering items.
- Stage 16 (edge-cases) — QA + rollback.
- Stage 17 §6 (rollout phases) — cadence.
- Stage 20 (executive one-pager) — M-1.
- Stage 23 (measure-instrumentation-spec) — метрики + open issues.
Instrumentation Spec: Realty Relay Bot v1.1
Входы: product/12-specification-writing.md (PRODUCED)
1. Overview
Этот документ определяет события, user properties и instrumentation, которые v1.1 freemium + audit + soft-criteria слой должен emit'ить. Audit log — instrumentation substrate (по ADR-005); эта спецификация определяет schema.
Аудитория: Инженер, реализующий payments.py, tier.py, audit.py, commands.py, dedup.py, alerts.py.
2. Event Inventory
Все события записываются в data/audit/events.jsonl как один JSON object на строку.
| Event type | Когда emit'ится | Producer |
|---|---|---|
| `signup` | Пользователь отправляет `/start`. | `tier.py` |
| `tier_change` | Пользователь upgrade'ается до paid или downgrades. | `payments.py` |
| `parsed` | TG сообщение распарсено. | existing parse module |
| `accepted` | LLM принимает (hard criteria). | `audit.py` |
| `rejected` | LLM отклоняет (hard criteria). | `audit.py` |
| `soft_evaluated` | LLM оценивает soft criteria (paid only). | `audit.py` |
| `forwarded` | Матч форварднут. | `audit.py` |
| `suppressed` | Dedup решение. | `audit.py` |
| `cap_hit` | Free user достигает 5-матч cap. | `tier.py` |
| `upgrade_prompted` | Пользователю показан upgrade prompt. | `tier.py` |
| `command_seen` | Пользователь вызывает `/seen`. | `commands.py` |
| `command_status` | Пользователь вызывает `/status`. | `commands.py` |
| `command_upgrade` | Пользователь вызывает `/upgrade`. | `payments.py` |
| `rate_limited` | Команда rate-limited. | `commands.py` |
| `alert_sent` | `[!bot alert]` DM отправлен. | `alerts.py` |
| `alert_suppressed` | Дублирующий alert подавлен. | `alerts.py` |
| `alert_reset` | Успешный poll сбрасывает alert state. | `detect.py` |
| `error` | Неожиданная ошибка. | various |
3. Event Schema
3.1 Common Properties (все события)
| Property | Type | Требуется | Описание |
|---|---|---|---|
| `event_id` | string (UUID v4) | ДА | Глобально уникальный. |
| `event_type` | string (enum) | ДА | Один из §2 inventory. |
| `timestamp_utc` | string (ISO 8601) | ДА | UTC timestamp (EC-12). |
| `actor` | string или null | ДА | user_id или null для system. |
| `schema_version` | integer | ДА | 1 для v1.1. |
| `tier` | string | ДА | `free` или `paid` (actor'ский tier на момент события). |
3.2 Per-event Properties
`signup`
| Property | Type | Описание |
|---|---|---|
| `referrer` | string или null | Inviter user_id (для referral mechanics). |
`tier_change`
| Property | Type | Описание |
|---|---|---|
| `from_tier` | string | `free` |
| `to_tier` | string | `paid` |
| `payment_provider` | string | `tg_payments` или `stripe` |
| `amount_eur` | float | 4.99 |
`parsed`
| Property | Type | Описание |
|---|---|---|
| `listing_fingerprint` | string | Hash. |
| `channel_id` | string | TG channel. |
| `message_id` | integer | TG message id. |
| `body_excerpt` | string | Первые 200 символов. |
`accepted`
| Property | Type | Описание |
|---|---|---|
| `listing_fingerprint` | string | Hash. |
| `llm_model` | string | `MiniMax-M2.1`. |
| `llm_latency_ms` | integer | Длительность LLM call. |
`rejected`
| Property | Type | Описание |
|---|---|---|
| `listing_fingerprint` | string | Hash. |
| `reject_reason` | string | Непустой. |
`soft_evaluated`
| Property | Type | Описание |
|---|---|---|
| `listing_fingerprint` | string | Hash. |
| `mountain_view` | boolean | LLM eval. |
| `new_furniture` | boolean | LLM eval. |
| `floor_ge_3` | boolean | LLM eval. |
| `llm_latency_ms` | integer | Длительность LLM call. |
`forwarded`
| Property | Type | Описание |
|---|---|---|
| `listing_fingerprint` | string | Hash. |
| `actor` | string | Получатель user_id. |
| `forward_latency_ms` | integer | Время от parsed до forwarded. |
| `soft_included` | boolean | Включены ли soft-criteria в сообщение. |
`suppressed`
| Property | Type | Описание |
|---|---|---|
| `listing_fingerprint` | string | Hash. |
| `reason` | enum | `cross-channel-duplicate`, `cross-user-recent`, `already-forwarded-this-user`, `free-tier-cap`. |
`cap_hit`
| Property | Type | Описание |
|---|---|---|
| `matches_this_month` | integer | 5. |
| `next_action` | string | `upgrade_prompt`. |
`upgrade_prompted`
| Property | Type | Описание |
|---|---|---|
| `trigger` | string | `cap_hit` или `manual`. |
`command_seen`
| Property | Type | Описание |
|---|---|---|
| `listing_fingerprint` | string | Аргумент. |
| `result` | enum | `success`, `not-found`, `rate-limited`, `paid-feature-only`. |
`command_status`
| Property | Type | Описание |
|---|---|---|
| `ingest_uptime_pct` | float | На момент invocation. |
| `alerts_returned` | integer | Последние 5. |
`command_upgrade`
| Property | Type | Описание |
|---|---|---|
| `result` | enum | `tg_payment_sent`, `stripe_link_sent`, `error`. |
`rate_limited`
| Property | Type | Описание |
|---|---|---|
| `command` | string | `seen`, `status`, `upgrade`. |
| `window_seconds` | integer | Rate-limit window. |
`alert_sent`
| Property | Type | Описание |
|---|---|---|
| `error_class` | string | `FLOOD_WAIT`, `proxy-error` и т.д. |
| `channel_id` | string | Если per-channel. |
| `recipients` | array of string | Founder user_ids. |
`alert_suppressed`
| Property | Type | Описание |
|---|---|---|
| `error_class` | string | Причина. |
| `first_alert_event_id` | string | Оригинальный alert. |
`alert_reset`
| Property | Type | Описание |
|---|---|---|
| `error_class` | string | Reset class. |
`error`
| Property | Type | Описание |
|---|---|---|
| `error_class` | string | Free-form. |
| `error_message` | string | Truncated 500 символов. |
4. User Properties
| Property | Type | Описание |
|---|---|---|
| `user_id` | string | TG user_id. |
| `tier` | string | `free` или `paid`. |
| `signup_at_utc` | string | ISO 8601. |
| `referrer` | string или null | Inviter user_id. |
| `matches_this_month` | integer | Counter для free tier. |
| `cap_hit_at_utc` | string или null | Когда cap был hit. |
| `tier_changed_at_utc` | string или null | Когда tier изменился. |
| `payment_provider` | string или null | `tg_payments`, `stripe`, или null. |
5. PII & Privacy
| Property | PII? | Обработка |
|---|---|---|
| `user_id` | ДА (TG handle) | Хранится as-is. |
| `body_excerpt` | ДА (raw listing text) | Только первые 200 символов. |
| `error_message` | МОЖЕТ БЫТЬ | Truncate 500 символов. |
GDPR: 30-day data deletion по запросу пользователя (EC-17).
6. Implementation Notes
6.1 Writer
audit.pyэкспонируетwrite_event(event: dict) -> None.- Appends одну строку в
data/audit/events.jsonlиспользуяopen(..., mode="a"). threading.Lockсериализует writes.- Все timestamps из
datetime.now(timezone.utc).isoformat(). audit.py— paid-access only (ADR-008).- Server-side check:
tier == "paid"перед разрешением/seenили/status. - Free user attempts → emit
command_seenсresult=paid-feature-only. - Code review: нет
r+,w,wbрежимов. - Нет seek/truncate.
- Stage 10 §3-§4 — operational метрики.
- Stage 12 §3 — AC.
- Stage 14 (user-stories) — producer stories.
- Stage 15 (test cases) — test plan.
- Stage 16 (edge cases) — EC.
- Stage 22 (launch-checklist) — OI-1, OI-3.
6.2 Tier-aware access
6.3 Append-only invariant
7. Testing Checklist
| # | Тест | Метод |
|---|---|---|
| T-1 | `signup` event на нового пользователя. | TC-1.1. |
| T-2 | `tier_change` event на upgrade. | TC-3.3. |
| T-3 | `parsed` event на объявление. | Stage 15. |
| T-4 | `accepted`/`rejected` events на LLM. | Stage 15. |
| T-5 | `soft_evaluated` только для paid users. | TC-4.1, 4.2. |
| T-6 | `forwarded` event на форвард. | Stage 15. |
| T-7 | `suppressed` event на dedup. | Stage 15. |
| T-8 | `cap_hit` event когда free user hit 5. | TC-2.2. |
| T-9 | `command_seen` записывает `paid-feature-only` для free users. | TC-5.3. |
| T-10 | Все timestamps UTC. | Unit. |
| T-11 | Append-only invariant. | Code review. |
| T-12 | Thread-safe writer. | Concurrency test. |
| T-13 | PII discipline: body_excerpt ≤ 200 символов. | Unit. |
| T-14 | GDPR: 30-day deletion. | Manual. |
8. Open Questions
| # | Вопрос | Резолюция |
|---|---|---|
| IQ-1 | `body_excerpt` длина: 200 vs 100 vs 500. | Default 200. |
| IQ-2 | `request_id` для корреляции событий в poll cycle. | Добавить в v1.1.1, если полезно. |
| IQ-3 | Soft-criteria LLM prompt детали. | Stage 12 implementation. |