Summary
Two compact /plan ratifications back-to-back same session: ADR 0011 Email sender architecture (Resend Stage 1 ESP + 2 own domains audience split — offplan.online customer-facing primary / offplanonline.com buyer-facing reserved-dormant; D1 verify-both-now phasing; Decision #2 Tier 2+ white-label deferred к Phase 1.7.10 follow-up ADR) and ADR 0014 MCP wrapper auth + sanitisation + RBAC + OAuth 2.1 PKCE (Iter 1 read-only fully ratified Stage 1 + Iter 2 interface stub; defense-in-depth sanitisation = envelopes + content tags + system-prompt-hardening mandatory + output moderation API deferred Stage 2 escalation; Owner-controlled RBAC с External SA opt-in external_actor: true audit marker, Free Guest + Buyer hard block; tiered rate-limit proposed numbers TBD by ops). Both ADRs flipped к accepted; workstream onboarding-trial-implementation.md blocked_by shrunk 4→2 (only legal-entity-lock + phase-1-3-implementation remaining); HTML sweep applied к 6 Stage 1 fragments + master HTML regenerated locally via scripts/build-launch-plan-master.py. Memory entry feedback_recognize_planning_done.md created (recurring overplanning trap pattern).
What I Did
- ADR 0011 ratification (
ab0103b) —/plancompact format ~30 min; Q1 scope lock (Decision #1 only) → Q2 Resend vendor confirm → Q3 sender domain architecture (offplan.online + offplanonline.com audience split) → Q4 verify-both-now D1 phasing → Q5 success criteria. Statusshell-pending-architecture→accepted. Task card T1-T7 в ADR body. - ADR 0014 ratification (
ab0103b) — second/plancompact same session; Q1 scope Option C (Iter 1 fully + Iter 2 interface stub) → Q2 sanitisation Option A defense-in-depth (envelopes + tags + system prompt + moderation deferred) → Q3 RBAC (Owner controls grants, External SA opt-in + audit marker, Free Guest+Buyer hard block) → Q4 OAuth 2.1 PKCE only (no static tokens production, reuse Phase 1.3 §1.4 stack). Statusplaceholder→accepted. Task card T1-T8. - Workstream
onboarding-trial-implementation.md(ab0103b) —blocked_by4→2 (removedadr-0011-email-sender+adr-0014-mcp-wrapper-auth); session log CONV-39 entry appended с parallel-session collision note; What's Next pivoted к T1 DNS work parallel + Roma engineering ready. - HTML fragments sweep (
368f764) — 6 fragments updated к CONV-39 ratification status:00-overview.html+04-phase-1-2.html(Phase 1.2 pre-launch blockers callout flip) +05-phase-1-3.html(ADR 0014 list entry update) +07-phase-1-5.html(Phase 1.5 implementation gate red→green callout с full key locks summary) +09-phase-1-7.html(Phase 1.7.10 open questions Q1/Q3 resolved + task-deps update) +14-open-questions.html(Tech Q4 resolved + Q10 resolved + lead text 3/7→4/7). Master HTML regenerated viascripts/build-launch-plan-master.py(541KB + 730KB). - Memory —
~/.claude/projects/-Users-diver-code-offplan-online-os/memory/feedback_recognize_planning_done.mdwritten (recognize when planning is done — recurring overplanning trap pattern; trigger phrases «не пытаемся ли перепланировать?» etc.).
Decisions Made
- Compact 30-min ADR ratification format (used twice CONV-39) — works для ADRs с pre-drafted shell + low controversy choices + clear scope narrowing. Alternative considered: full ~2-3h /plan with Business review (Step 4.4). Compact format viable для pure ADR ratification (no customer-facing UI change, <3 implementation steps в plan body).
- ADR 0011 scope = Decision #1 only. Decision #2 (Tier 2+ white-label per-Org client-domain sending) deferred к Phase 1.7.10 follow-up ADR. Alternative: ratify both in same session (rejected — 3h cost vs unclear payoff Stage 1 since Phase 1.2 launch only needs customer-facing transactional).
- ADR 0014 Iter 2 = interface requirements only (must support per-call auth + destructive op confirmation + rollback). Alternative: ratify Iter 2 implementation now (rejected — 1-2h additional, Iter 2 may roll к Stage 2 anyway per Phase 1.5 estimate).
- HTML edits = fragments only, not rendered master — per user directive «делай правки не прямо в мастер туда все должно приходить автоматом». Auto-build pipeline (
scripts/build-launch-plan-master.py+.github/workflows/build-launch-plan-master.yml) regenerates master fromdocs/rendered/stage-1-parts/*.html. Future sessions: edit fragments, run build locally for sync OR let CI rebuild on push. - CONV-39 collision fix via amend — original commit message + ADR content said CONV-38, but parallel session already used CONV-38 для admin-panel handoff (
a52d505). Mechanical sed CONV-38 → CONV-39 across 3 files (25 references), commit amended. Local CONV-N format is legacy; new format =SK-YYMMDD-NNperscripts/session.py claim.
For Future Me
Главное что чуть не потерялось — parallel claude sessions race condition. Когда сегодня 14:00-15:25 я делал first attempt of CONV-39 ratifications, 2 другие claude sessions (admin-panel work — Roman's RT-260511-* + кто-то ещё) активно git pull --no-rebase'или каждые ~3 минуты. Их pulls автоматически реверчили мои uncommitted writes к ADR 0011, ADR 0014, и workstream. Tool calls возвращали success, но через 2 минуты состояние файлов откатывалось. Diagnostic: ps -ax | grep claude показал 3 active processes. Solution: user /exit'ил 2 из 3 → after that single-process state → мои writes persisted, я immediately committed (ab0103b) и далее уже не реверчилось.
Lesson learnt: запускай только одну claude session одновременно на проекте с auto-merge git workflow. Если параллельный workflow неизбежен — каждая сессия должна commit immediately после Write (не batch writes до /handoff). Кроме того: file mtime + git status periodically (например Bash stat -f "%Sm" file && git status --short every few minutes) даёт early signal что revert происходит.
Также важно — HTML rendered files (master Stage 1 plan) теперь auto-generated. Commit 2555182 (CONV-37) split master HTML в 15 fragments + добавил scripts/build-launch-plan-master.py. Edit fragments в docs/rendered/stage-1-parts/*.html; rendered HTML rebuilds через CI или locally. Это explicit user directive («делай правки не прямо в мастер»).
Learnings
- Parallel-claude-sessions race condition — when multiple claude processes run на same repo с auto-merge git pull workflow, uncommitted local writes from one session get silently reverted by another's pulls. Diagnose via
ps -ax | grep claude+ checkgit reflogforpull --no-rebaseentries during your session. Mitigation: commit immediately after Write, OR ensure single session at a time. - Compact ADR /plan format works для ratification with pre-drafted shell — 30-min vs 3h gain when (a) shell ADR exists с pre-listed alternatives, (b) scope can be narrowed к single decision, (c) <3 implementation steps in plan body so Step 4.4 Business review skipped. CONV-39 used twice this pattern (ADR 0011 + 0014).
- Rendered HTML auto-generated from fragments post-CONV-37 — split via
scripts/build-launch-plan-master.py. Direct edits todocs/rendered/launch-plan-stage-1.htmlare overwritten on next build. Edit fragments вdocs/rendered/stage-1-parts/*.html.
Open Questions
- [OPEN] Roman pricing input для
pricing-config.ts— multi-session carry-over; not blocker для launch path но blocks Plan & Billing UI tier numbers rendering - [OPEN] Legal entity Abu Dhabi structure pick (ADGM / Mainland / DMCC / IFZA / etc.) — Sergei consultation pending; unblocks Sub-plan 3 (legal-multi-party-framework) + UAE-specific tax research
- [OPEN] Notion data-source query MCP plumbing —
invalid_request_urlerror encountered Step 2.5 ratification sweep CONV-39 attempt; query against Learnings data_source ID failed. Workaround used post-search instead. Worth dedicated investigation - [RESOLVED via CONV-39] ADR 0011 email sender architecture — Resend + 2 own domains + audience split + D1
- [RESOLVED via CONV-39] ADR 0014 MCP wrapper auth — OAuth 2.1 PKCE + per-call auth + RBAC + defense-in-depth sanitisation + tiered rate-limit
- [OPEN, deferred] Decision #2 (Tier 2+ white-label per-Org client-domain sending) — trigger Phase 1.7.10 ratification approaches
- [OPEN, deferred] ADR 0014 Iter 2 (read+write MCP) — trigger Phase 1.5 estimate resolves OR Studios demand write capability sustained
Resume Prompt
Continue post-ADR 0011/0014 ratification path — Phase 1.2 launch planning is done, next moves are operations + Roma implementation, NOT more /plan. (Next 3-5: push +2 ahead commits to origin/main —
git pushclean fast-forward; T1 Resend DNS work Roman+Sergei ~30 min one-time bothoffplan.online+offplanonline.comverify; Roman pricing input дляpricing-config.ts; Ilya designer brief — 7 React Email components T-7…T+29 trial cascade per Sub-plan 2 Step 8 + ADR 0011 T5 task card; legal entity Abu Dhabi consultation — unblocks Sub-plan 3 + UAE tax research.) Watch out for: parallel claude sessions race-condition trap (CONV-36/37/38 admin session reverted my writes viagit pullmerges — keep ONE claude active at a time on same files); auto-build pipeline regenerates rendered HTML fromdocs/rendered/stage-1-parts/*.htmlfragments on push, edit fragments not master; Decision #2 Tier 2+ white-label per-Org client-domain sending parked, trigger = Phase 1.7.10 ratification approaches; Iter 2 write MCP ops require follow-up ADR before destructive tools ship; memory filefeedback_recognize_planning_done.mdguides next session toward/buildnot more/plan. Confidence: H.
See Also
- ADR 0011 Email sender architecture (ratified CONV-39)
- ADR 0014 MCP wrapper auth + RBAC + OAuth 2.1 PKCE (ratified CONV-39)
- Sub-plan 2 — Onboarding + Trial mode (CONV-35 ratified, consumes ADR 0011 + 0014)
- Workstream — onboarding-trial-implementation (blocked_by shrunk CONV-39)
- Workstream — stage1-roman-integration (canonical Stage 1 tracker)
- Memory — feedback_recognize_planning_done.md
- Previous session CONV-35
- Parallel session CONV-38 admin-panel handoff