Goal
Закрыть deferred-from-CONV-24 deep rewrite Phase 1.7 «Платёжная инфраструктура + Sales Page». Absorb 10 накопленных callout-bullets (v4.3 + v4.4) → actual task body, добавить 4 новых tasks из callout content, почистить stale resolved Q's, убрать дубли с Foundational (Stock allocation в §4.4, Public Visibility detail в §5/§5.1). Phase 1.7 после rewrite = clean «что строить и в каких файлах» без accumulated cruft.
Locked Decisions (CONV-27 interview)
| # | Тема | Решение |
|---|---|---|
| 1 | Approach | Approach C — Hybrid surgical structure changes. Sub-plan plans/landing-pages-by-audience.md (status: stub) владеет 4-audience детальной спекой; Phase 1.7 task = pointer-only. 3 новых tasks (Custom domain + Subdomain + Public Visibility UI). Cleanup stale Q's и dedup с Foundational. ~80-100 lines diff. |
| 2 | 1.7.1 Landing pages | Остаётся ONE task «Landing pages» с pointer'ом на plans/landing-pages-by-audience.md (sub-plan owns 4-audience spec: general / studio / agency / developer). Demo iframe pattern (1.7.Y из v4.3) — sub-bullet. Anonymous viewer flow (1.7.CC из v4.4) — частично здесь как rendering note, остальное в новой 1.7.12. |
| 3 | Stock allocation toggle (1.7.EE из v4.4) | DROP from Phase 1.7 — переехало в Foundational §4.4 (Closed pool / Open pool). Phase 1.7 keeps только cross-link в desc «Project Settings UI surfaces stock allocation mode toggle per §4.4». Дубль удаляется. |
| 4 | Public Visibility (1.7.BB из v4.4) | Spec живёт в Foundational §5 + §5.1 PIN. Phase 1.7 получает новый task 1.7.12 — lightweight «config UI + anonymous render», который реализует §5/§5.1 spec. Не дублирует саму спеку. |
| 5 | Custom domain + DKIM (1.7.AA из v4.3+v4.4) | Новый task 1.7.10 — Custom domain self-serve flow + DKIM setup. Marked Tier 2+ feature, Stage 1 implementation скоупится только до architecture/scaffolding (full UI можно отложить на Stage 2 если ресурс ограничен — пометка в task). |
| 6 | Subdomain pattern (1.7.DD + URL structure 1.7.EE из v4.4) | Новый task 1.7.9 — Subdomain selection в signup flow + namespaced project URL structure ({slug}.offplan.online/projects/{project-slug}). Reserved subdomain blacklist (staff / app / api / admin / etc). |
| 7 | Free tier billing (1.7.Z из v4.3) | Новый task 1.7.11 — Free tier billing tracking (no-charge tier с metrics для conversion analytics). Marked «awaiting ADR 0008» — детальный scope (limits, expiry, conversion triggers) откладывается до ADR 0008 написания в Chunk 8. |
| 8 | Demo iframe (1.7.Y из v4.3) | Sub-bullet 1.7.1 Landing pages (часть landing спеки, не отдельный task). Detailed pattern в sub-plan'е landing-pages-by-audience.md. |
| 9 | Stale resolved Q's в 1.7.5 | 2 stale Q's «Без карты vs с картой» + «Block vs read-only по истечении» — DROP (resolved в Foundational §3 Trial period via CONV-24). Task desc уже ссылается на §3 — Q's просто удаляются. |
| 10 | Stale resolved Q's в 1.7.7 | Refund policy ✅ + currency ✅ помечены resolved в bullets — clean up Open Questions block (drop ✅-prefixed entries; оставить «chargeback auto-freeze» → cross-link на ADR 0006 + tax engine как live Q). |
| 11 | v4.3 + v4.4 callouts | DROP entirely после absorbing content в tasks. История in Git + Workstream Session Log. |
| 12 | v4.11 callout | Single new callout в Phase 1.7 кратко описывающий «deep rewrite in CONV-27/Chunk 7: v4.3 + v4.4 callouts absorbed; new tasks 1.7.9-1.7.12 added; stock allocation dupe removed». |
Approach
Approach C — Hybrid surgical structure changes. Из 3 предложенных вариантов в Step 3:
- A (Conservative) — слишком пассивный, оставляет дубли + не добавляет недостающие tasks
- B (Restructure) — overengineers (4 audience landings внутри Phase 1.7 vs sub-plan'а — sub-plan уже владеет этим scope'ом)
- C — middle ground: убрать дубли, добавить недостающие, не дублировать sub-plan'ы
Diff scope: ~80-100 lines в Phase 1.7 (drop 2 callouts ~30 lines / add 4 new tasks ~60 lines / amend 4 existing tasks ~10 lines / add 1 new callout ~10 lines).
Steps
A. Drop v4.3 + v4.4 callouts (Phase 1.7)
A1. Delete v4.3 callout (lines 2226-2235): «📌 v4.3 — CONV-15 (Roman call) additions» div + 4 bullets + footer p.
A2. Delete v4.4 callout (lines 2237-2248): «📌 v4.4 — CONV-17 (permission-and-tenancy ratification) additions» div + 6 bullets + footer p.
B. Phase 1.7 desc update (cross-link Stock allocation to §4.4)
B1. Update phase-desc paragraph (line 2217) — добавить short note про Public Visibility + Stock allocation references:
Existing: <p class="phase-desc">Студия проходит signup → trial → подписка полностью сама. Плюс публичная страница, которая продаёт. <strong>Помимо месячной подписки</strong> — flat-fee tier (оплата за настройку проекта + SLA на новые проекты), см. 1.7.8.</p>
New: <p class="phase-desc">Студия проходит signup → trial → подписка полностью сама. Плюс публичная страница, которая продаёт. <strong>Помимо месячной подписки</strong> — flat-fee tier (оплата за настройку проекта + SLA на новые проекты), см. 1.7.8. <strong>Public Visibility</strong> + <strong>Stock allocation</strong> presets — спец живёт в <a href="#fd-visibility">Foundational §5</a> + <a href="#fd-access">§4.4</a>; Phase 1.7 строит config UI и rendering layer (см. 1.7.12).</p>
C. New v4.11 callout (replace v4.3 + v4.4)
C1. Insert single small callout where v4.3 + v4.4 were (after phase-files block, before 1.7.1 task):
<div class="callout" style="background: rgba(184,149,90,0.08); border-left: 4px solid var(--gold); padding: 16px 20px; margin: 16px 0;">
<strong>📌 v4.11 — CONV-27 (Chunk 7 deep rewrite):</strong>
<ul style="margin: 8px 0 0 20px; font-size: 13.5px; color: var(--text-mid);">
<li>v4.3 (CONV-15 Roman call) + v4.4 (CONV-17 permission-and-tenancy) callouts <strong>absorbed</strong> в task body — 4 новых tasks (1.7.9 / 1.7.10 / 1.7.11 / 1.7.12) и updates в 1.7.1.</li>
<li><strong>Stock allocation toggle</strong> (was 1.7.EE in v4.4) — moved to <a href="#fd-access">Foundational §4.4</a>; cross-link в phase desc, отдельная task'а нет.</li>
<li><strong>Public Visibility detail</strong> (was 1.7.BB in v4.4) — spec живёт в <a href="#fd-visibility">§5</a> + <a href="#fd-visibility-pin">§5.1</a>; Phase 1.7 keeps только config UI task (1.7.12).</li>
<li>Stale resolved Q's в 1.7.5 + 1.7.7 — cleaned (resolved per §3 Trial / payments-research).</li>
</ul>
<p style="margin-top: 10px; font-size: 12px; color: var(--text-mid); font-style: italic;">Sub-plan: <code>plans/landing-pages-by-audience.md</code> владеет 4-audience landing спекой. Plan: <code>plans/stage1-chunk-7-phase17-rewrite.md</code>.</p>
</div>
D. Update 1.7.1 Landing pages (audience pointer + demo iframe + anonymous flow note)
D1. Update task title + desc + sub-bullets (lines 2250-2268):
Existing task title: <span class="task-name">Landing page</span> New: <span class="task-name">Landing pages (4 audiences)</span>
Existing task-desc: <p class="task-desc">Публичная страница offplan.online, которая конвертирует посетителя в trial signup.</p>
New task-desc:
<p class="task-desc">Публичные landing pages на <code>app.offplan.online</code> которые конвертируют посетителя в trial signup. <strong>4 audience-specific landings</strong> (general / studio / agency / developer) — каждой свой messaging и features. <strong>Детальная 4-audience спека</strong> — sub-plan <code>plans/landing-pages-by-audience.md</code> (status: stub, отдельная /plan-сессия).</p>
Update existing 9 sub-bullets — add 2 new + keep existing:
After «Hero: главный месседж + CTA «Start your 14-day trial — no card required»...» (existing bullet 1), insert:
<li><strong>Demo iframe embed pattern</strong> (CONV-15 Roman call: «нахрен убьёт конкурентов») — живой проект iframe'ом на странице, чтобы visitor сразу видел работающий продукт. Per audience: general → showcase project, studio → их собственный demo project (template), agency → multi-project view, developer → builder UX preview.</li>
After «Footer с Legal links (ToS, Privacy, DPA)» (existing last bullet), insert:
<li><strong>Anonymous viewer rendering on per-Organisation sales page</strong> (`{slug}.offplan.online` root) — Hero + branding + projects list (или скрыто per Public Visibility preset). «Request access» CTA для anonymous → отправка inquiry в Organisation-админку. Heart / «Связаться со мной» actions всегда hidden для anonymous (требуют buyer-token). Spec — <a href="#fd-visibility">§5</a>.</li>
E. Cleanup 1.7.5 stale Open Questions
E1. Replace «Открытые вопросы (2)» block (lines 2351-2354):
Existing:
<details>
<summary class="task-label">Открытые вопросы <span class="count">(2)</span></summary>
<ul><li>❓ Без карты vs с картой</li><li>❓ Block vs read-only по истечении</li></ul>
</details>
New:
<details>
<summary class="task-label">Открытые вопросы <span class="count">(0)</span></summary>
<ul><li>✅ Все Q's resolved через <a href="#fd-billing-trial">§3 Trial period</a> (CONV-24): trial без карты, 14 дней T1, auto-downgrade к Free Guest read-only по истечении.</li></ul>
</details>
F. Cleanup 1.7.7 stale Open Questions
F1. Replace «Открытые вопросы (2)» block (lines 2395-2403):
Existing block has 4 bullets total (2 marked ✅ resolved with strikethrough, 2 still open). Clean up: drop strikethrough bullets, keep 2 live Q's, add cross-link на ADR 0006 для chargeback.
New:
<details>
<summary class="task-label">Открытые вопросы <span class="count">(2)</span></summary>
<ul>
<li>❓ Chargeback handling — auto-freeze on dispute (per <a href="../decisions/0006-chargeback-auto-freeze.md">ADR 0006</a>) или wait-and-see? <strong>Tentative:</strong> ADR 0006 default (auto-freeze) — accept unless reverted.</li>
<li>❓ Tax engine — Stripe Tax (built-in, US/EU/UK/AU coverage) / Avalara (mature, expensive) / Paddle handles (если provider Paddle)?</li>
</ul>
</details>
G. New task 1.7.9 — Subdomain selection + Project URL structure
G1. Insert новый task div после 1.7.8 (line 2442), перед <!-- Фаза 1.8 --> (line 2444):
<div class="task">
<div class="task-title"><span class="task-id">1.7.9</span><span class="task-name">Subdomain selection + Project URL structure</span></div>
<div class="markers"><span class="marker m-critical">Критично</span><span class="marker m-dept">Tech+Design</span><span class="marker m-time">⏱</span></div>
<p class="task-desc">При создании Organisation Owner выбирает subdomain (default <code>{slug}.offplan.online</code>). Validation: уникальность + reserved blacklist (<code>app</code> / <code>api</code> / <code>admin</code> / <code>staff</code> / <code>www</code> / <code>blog</code> / <code>docs</code> / <code>help</code> / <code>support</code> / <code>status</code> / <code>auth</code> / <code>login</code> / etc). Project URL — namespaced path: <code>{slug}.offplan.online/projects/{project-slug}</code>. Безопасно для будущих system pages (<code>/login</code>, <code>/settings</code>, etc.) которые не будут конфликтовать с project URLs.</p>
<details>
<summary class="task-label">Что конкретно нужно сделать <span class="count">(6)</span></summary>
<ul>
<li>Subdomain input в Organisation creation form: real-time validation (availability check + reserved blacklist warning + format rules a-z/0-9/dash, 3-32 chars).</li>
<li>Reserved blacklist в config (не хардкод) — расширяемо без релиза.</li>
<li>Subdomain change UI в Organisation Settings (Owner / Admin) — после change: 30-day soft redirect от старого subdomain'а на новый, потом hard 410.</li>
<li>Project slug input в Project creation form: validation (unique within Organisation + format rules) + auto-suggest from project name.</li>
<li>Project URL pattern enforced на routing layer: <code>{slug}.offplan.online/projects/{project-slug}</code> + system pages под <code>app.offplan.online</code> или namespaced под Organisation root но с reserved prefixes.</li>
<li>Custom domain (Tier 2+) overrides default subdomain — см. 1.7.10.</li>
</ul>
</details>
<details>
<summary class="task-label">Открытые вопросы <span class="count">(2)</span></summary>
<ul>
<li>❓ Subdomain change frequency limit (предотвратить abuse): hard cap «1 change / 90 days» или soft warning?</li>
<li>❓ После custom domain (1.7.10) — старый subdomain продолжает работать как fallback или disabled?</li>
</ul>
</details>
<div class="task-deps">Зависит от: 1.3 (Tenancy) · Блокирует: 1.7.10, 1.10</div>
</div>
H. New task 1.7.10 — Custom domain + DKIM (Tier 2+)
H1. Insert после 1.7.9:
<div class="task">
<div class="task-title"><span class="task-id">1.7.10</span><span class="task-name">Custom domain self-serve flow + DKIM (Tier 2+)</span></div>
<div class="markers"><span class="marker m-high">Высокий</span><span class="marker m-dept">Tech+Ops</span><span class="marker m-time">⏱</span></div>
<p class="task-desc">Tier 2+ feature — Organisation Owner подключает собственный domain (<code>presentations.developer-x.com</code>) вместо subdomain'а <code>{slug}.offplan.online</code>. Self-serve flow: wizard в Settings → Domain — Owner прописывает CNAME + DKIM записи в DNS своего регистратора, мы автоматически верифицируем. После activation: Sales App страницы рендерятся под custom domain; transactional emails (buyer presentations) уходят от <code>{custom-domain}</code>.</p>
<details>
<summary class="task-label">Что конкретно нужно сделать <span class="count">(7)</span></summary>
<ul>
<li>Settings → Domain page (Owner / Admin only) — current domain status + «Connect custom domain» CTA.</li>
<li>Domain wizard: 3 steps — (1) Owner вводит domain + paste запись «Add CNAME → ...» в clipboard; (2) Owner добавляет в DNS своего registrar'а; (3) Owner жмёт «Verify» — мы DNS-резолвим CNAME через 5 retry с exponential backoff.</li>
<li>DKIM setup как часть wizard'а — auto-generate DKIM keypair, public key показываем Owner'у для копирования в DNS как TXT record.</li>
<li>SSL/TLS provisioning automatic через Let's Encrypt (Cloudflare-fronted: API call → certificate within 5 min).</li>
<li>Email sending updated — все transactional emails (presentation links, password resets) routes through Organisation's custom domain если configured (с fallback на default domain при failure).</li>
<li>Domain change / removal flow — soft redirect (30d) от старого custom domain на default subdomain.</li>
<li>Tier-gating — feature available только для Tier 2+ subscriptions; Tier 1 / Free Guest получают upgrade modal при попытке connect.</li>
</ul>
</details>
<details>
<summary class="task-label">Открытые вопросы <span class="count">(3)</span></summary>
<ul>
<li>❓ Email sender architecture — single-domain (offplanonline.com отправляет от имени всех clients) vs per-org domain (каждая Org свой DKIM)? Решение → <strong>ADR 0011</strong> (placeholder, write в Chunk 8).</li>
<li>❓ Multiple custom domains per Organisation (apex + www + presentations.x.com) или single?</li>
<li>❓ Two-domain setup для нашего team-side (<code>offplan.online</code> для team-коммуникаций + <code>offplanonline.com</code> для system / transactional emails) — это в Phase 1.8, не 1.7.</li>
</ul>
</details>
<div class="task-deps">Зависит от: 1.7.9 (Subdomain), 1.8.6 (Transactional email), <a href="../decisions/">ADR 0011</a> (Email sender architecture, pending) · Блокирует: —</div>
</div>
I. New task 1.7.11 — Free tier billing tracking (awaiting ADR 0008)
I1. Insert после 1.7.10:
<div class="task">
<div class="task-title"><span class="task-id">1.7.11</span><span class="task-name">Free tier billing tracking</span></div>
<div class="markers"><span class="marker m-high">Высокий</span><span class="marker m-dept">Product+Tech</span><span class="marker m-q">❓</span></div>
<p class="task-desc">No-charge tier для guest organisations (<a href="#fd-roles">§1 Free Guest</a>) — billing запись не выставляет invoice'ы, но всё равно tracked в billing system для metrics + conversion analytics («N Free Guest Orgs converted to paid в этом месяце»). <strong>Detailed scope (limits / expiry / conversion triggers) — awaiting <a href="../decisions/">ADR 0008</a> (Free tier scope, pending Chunk 8).</strong></p>
<details>
<summary class="task-label">Что конкретно нужно сделать (after ADR 0008) <span class="count">(4)</span></summary>
<ul>
<li>Billing system schema — tier <code>free_guest</code> вместе со <code>starter</code> / <code>tier_1</code> / <code>tier_2</code> / <code>tier_3_enterprise</code>.</li>
<li>Conversion funnel tracking — events «free_guest_signup» / «free_guest_to_paid» / «free_guest_churned».</li>
<li>Free tier limits enforcement (лимиты на проекты / units / seats — exact numbers per ADR 0008).</li>
<li>Upgrade modal — trigger conditions per ADR 0008 (e.g., «trying to create 2-й project as Free Guest»).</li>
</ul>
</details>
<details>
<summary class="task-label">Открытые вопросы <span class="count">(1)</span></summary>
<ul>
<li>❓ <strong>ADR 0008 placeholder</strong> — Free tier limits (projects / units / seats), expiry policy (do Free Guest accounts expire?), conversion triggers (lazy «attempt to upgrade» или active «trial expired»?). Will be written в Chunk 8.</li>
</ul>
</details>
<div class="task-deps">Зависит от: 1.7.3 (Payment integration), <a href="../decisions/">ADR 0008</a> (pending) · Блокирует: Free Guest tier shipping</div>
</div>
J. New task 1.7.12 — Public Visibility config UI + anonymous render
J1. Insert после 1.7.11:
<div class="task">
<div class="task-title"><span class="task-id">1.7.12</span><span class="task-name">Public Visibility — config UI + anonymous render</span></div>
<div class="markers"><span class="marker m-critical">Критично</span><span class="marker m-dept">Tech+Design</span><span class="marker m-time">⏱</span></div>
<p class="task-desc">Реализация <a href="#fd-visibility">Foundational §5 Visibility presets</a> (Private / Discovery / Full sales / PIN-protected) + <a href="#fd-visibility-pin">§5.1 PIN-protected detailed spec</a>. <strong>Spec живёт в Foundational</strong> — этот task = build против фиксированного спека. Two parts: (1) <strong>config UI</strong> для Owner / Admin (set preset per-project в Project Settings + Object Builder), (2) <strong>anonymous render</strong> на sales-page (<code>{slug}.offplan.online/projects/{project-slug}</code>) согласно selected preset.</p>
<details>
<summary class="task-label">Config UI (admin side) <span class="count">(4)</span></summary>
<ul>
<li>Project Settings → Public Visibility section — radio с 4 presets (Private / Discovery / Full sales / PIN-protected) + preview text для каждого.</li>
<li>PIN-protected — раскрываются 4 conditional fields (PIN required min 4 char, After-PIN view Discovery|Full sales, Contact email required, Contact phone optional) — см. <a href="#fd-visibility-pin">§5.1</a>.</li>
<li>Same UI surface в Object Builder при создании проекта (default Discovery; Owner может сразу выбрать).</li>
<li>Audit log entry на каждое изменение Public Visibility (audit visible to Owner / Admin / SM per <a href="#fd-access">§4.2</a>).</li>
</ul>
</details>
<details>
<summary class="task-label">Anonymous render (sales-page side) <span class="count">(5)</span></summary>
<ul>
<li>Routing middleware: anonymous request → check Public Visibility preset:
<ul>
<li><strong>Private</strong> → 404 (project не существует для анонимных)</li>
<li><strong>Discovery</strong> → renders Hero + branding + projects list (без цен), heart / inquiry CTAs hidden</li>
<li><strong>Full sales</strong> → full content (renders + 360° + цены); inquiry CTA visible но требует buyer-token для submit</li>
<li><strong>PIN-protected</strong> → blur + PIN entry overlay (см. <a href="#fd-visibility-pin">§5.1</a> routing sequence)</li>
</ul>
</li>
<li>«Request access» CTA для Discovery — отправка inquiry в Organisation-админку (creates lead).</li>
<li>Buyer-token bypass'ит Visibility preset (per <a href="#fd-edges">§7.4 Visibility flip с active tokens</a>).</li>
<li>Visibility flip с active tokens — existing tokens работают по своему правилу до 90d expiry, anonymous получают новый preset (см. §7.4 D).</li>
<li>Heart / «Связаться со мной» actions — всегда hidden для anonymous, require valid buyer-token.</li>
</ul>
</details>
<details>
<summary class="task-label">Открытые вопросы <span class="count">(2)</span></summary>
<ul>
<li>❓ «Request access» в Discovery preset — куда ведёт inquiry? Generic Organisation contact email или per-project contact (как в PIN-protected)? Скорее всего Owner email (как PIN-protected default).</li>
<li>❓ Stage 2 — granular per-field overrides (показать прайс но скрыть availability, etc) — сейчас deferred per <a href="#fd-visibility">§5</a>.</li>
</ul>
</details>
<div class="task-deps">Зависит от: 1.3 (Tenancy), 1.10 (Sales App routing), Foundational §5 + §5.1 (ratified) · Блокирует: —</div>
</div>
K. Changelog v4.11 entry
K1. Insert v4.11 entry поверх v4.10 в launch-plan-changelog.html (insert after <div class="wrap"> opening, перед v4.10 <div>):
Structure:
- Date: 2026-05-08
- Source: CONV-27 / Wave 2 Chunk 7
- Summary: Phase 1.7 deep rewrite — v4.3 + v4.4 callouts absorbed → 4 new tasks + 1.7.1 update + Q's cleanup + dedup with Foundational
- Sections: Removed (v4.3, v4.4 callouts, stock allocation dupe), Added (4 new tasks, v4.11 single callout, phase desc cross-links), Updated (1.7.1, 1.7.5 Q's, 1.7.7 Q's), Не закрыто (ADR 0008 / 0011 placeholders + sub-plan landing-pages-by-audience.md activation + other Phase callouts deep rewrite в Chunk 7.5/8)
L. Workstream update
L1. В workstreams/stage1-roman-integration.md:
- Append CONV-27 entry в Session Log (separate from /plan ratification)
- Update What's Next → Chunk 7.5 (Phase 1.4 + 1.10 callouts cleanup) или Chunk 8 (ADRs) — пользователь выбирает
M. Preview repo sync
M1. Sync 2 файла в ~/code/offplan-online/preview/plan/: launch-plan-stage-1.html + launch-plan-changelog.html. Commit + push.
Files
- Primary:
docs/rendered/launch-plan-stage-1.html(~80-100 lines net change — drop 30 + add 90 + amend 10) - Secondary:
docs/rendered/launch-plan-changelog.html(v4.11 entry, ~50 lines) - Workstream:
workstreams/stage1-roman-integration.md - Sync:
~/code/offplan-online/preview/plan/
Dependencies
- Blocked by: nothing (Chunks 1-6 closed + committed + synced)
- Blocks: ADR 0008 (Free tier) + ADR 0011 (Email sender) — referenced as pending в new tasks 1.7.10 + 1.7.11; Chunk 8 ADRs unblock those tasks fully
Testing
- Visual sanity check — открыть
launch-plan-stage-1.html:- Phase 1.7 desc обновлён (cross-link на §4.4 + §5)
- v4.3 + v4.4 callouts удалены; new v4.11 callout видна
- Tasks 1.7.1 (updated title + 2 new sub-bullets), 1.7.2 (без изменений), 1.7.3 (без изменений), 1.7.5 (cleaned Q's), 1.7.6 (без изменений), 1.7.7 (cleaned Q's), 1.7.8 (без изменений)
- Tasks 1.7.9 / 1.7.10 / 1.7.11 / 1.7.12 — рендерятся как новые tasks с правильным styling
- Cross-link sanity — все anchors valid:
#fd-visibility(§5) ✓#fd-visibility-pin(§5.1) ✓#fd-access(§4.4) ✓#fd-billing-trial(§3) ✓#fd-roles(§1 Free Guest) ✓#fd-edges(§7.4) ✓
- Diff sanity:
git diff --stat docs/rendered/launch-plan-stage-1.html≈ 80-100 net lines added. - Cross-doc consistency: grep «1.7.BB|1.7.CC|1.7.DD|1.7.EE|1.7.X|1.7.Y|1.7.Z|1.7.AA» — должно быть 0 mentions после rewrite (все absorbed).
- Preview sync — после push проверить
https://offplan-online.github.io/preview/plan/launch-plan-stage-1.html.
Risks
- External cross-links на 1.7.BB / 1.7.CC / 1.7.DD / 1.7.EE могут существовать в других файлах (changelog, sub-plans, workstream). Mitigate: grep весь репо перед commit'ом — если найдены, обновить на новые task IDs (1.7.9-1.7.12).
- DKIM Tier 2+ scope может быть amplified — task 1.7.10 имеет 7 sub-bullets с большим objem'ом работы. Stage 1 implementation может потребовать split на «scaffolding only» vs «full UI». Mitigate: task маркером «Tier 2+, Stage 1 = scaffolding» который можно сужать в build phase.
- Free tier task 1.7.11 без ADR 0008 — incomplete spec. Mitigate: explicitly помечен «awaiting ADR 0008» в task desc + open Q; Chunk 8 ADR работа разблокирует.
- Public Visibility task 1.7.12 объединяет config UI + anonymous render — different layers (admin + sales-app). Может быть split нужен на 1.7.12.a + 1.7.12.b. Mitigate: оставляем как один task с clear sub-blocks; split возможен в build phase если разработчики решат разделить deliverables.
- «Request access» Q в 1.7.12 не resolved — Discovery preset CTA destination. Mitigate: tentative «Owner email default per PIN-protected pattern» — не block'ит chunk; Chunk 7.5 / 8 могут finalize.
Workstreams
Updates workstreams/stage1-roman-integration.md:
- Session Log entry CONV-27 (Phase 1.7 rewrite executed)
- What's Next → next decision (Chunk 7.5 Phase 1.4 + 1.10 callouts cleanup, или Chunk 8 ADR placeholders, или sales-app mockup screens)
Не создаём новый workstream — pattern Chunks 3-6.
Evaluation
Done when:
- v4.3 + v4.4 callouts removed
- v4.11 callout added (single, summarising rewrite)
- Phase 1.7 desc updated с Foundational cross-links
- 1.7.1 updated (audience pointer + demo iframe + anonymous flow)
- 1.7.5 Q's cleaned (resolved → §3)
- 1.7.7 Q's cleaned (resolved + ADR 0006 link)
- 4 new tasks added (1.7.9 / 1.7.10 / 1.7.11 / 1.7.12)
- Stock allocation toggle dupe removed (только cross-link в desc)
- Changelog v4.11 entry added
- Workstream Session Log + What's Next updated
- Cross-link sanity passed
- Preview synced + pushed
Definition of NOT done (deferred):
- ADR 0008 (Free tier scope) — Chunk 8
- ADR 0011 (Email sender architecture) — Chunk 8
- Sub-plan
plans/landing-pages-by-audience.mdactivation — отдельная /plan-сессия после Wave 2 close - Phase 1.4 + 1.10 callouts cleanup (5 callouts each) — Chunk 7.5 (отдельный)
- Phase 1.2 / 1.3 / 1.5 / 1.8 / 1.9 / 1.11 callouts cleanup — Chunk 7.5 (отдельный)
- Cyprus jurisdiction confirmation — clarify в /handoff'е
Open Questions
Q1 — Other Phase callouts cleanup (Chunk 7.5 vs combined)
Phase 1.4 + 1.10 имеют по 5 v-callouts; Phase 1.2 / 1.3 / 1.5 / 1.8 / 1.9 / 1.11 имеют меньше но всё равно accumulated. Resolve в next session: делать ли Chunk 7.5 (только 1.4 + 1.10 sweep) и Chunk 8 (ADRs) параллельно, или combine.
Q2 — Subdomain change frequency limit
Hard cap «1 / 90 days» или soft warning? Anti-abuse vs UX flexibility. Defer to build phase или quick decision сейчас.
Q3 — Email sender architecture (single-domain vs per-org)
Critical для 1.7.10 (Custom domain task) — какой default. Решение → ADR 0011 (Chunk 8).
Q4 — «Request access» CTA destination в Discovery preset
Owner email default vs per-project contact (как в PIN-protected). Tentative Owner email; final decision можно отложить.