ADR 0002 — Trial Hub Konsolidasyonu (Paralel UI, Decision Deferral)
Derin- Status: Accepted
- Date: 2026-05-16
- Decision-makers: hello@ygtlabs.ai (Yiğit), Claude (assistant)
- Supersedes: —
- Superseded-by: —
Bağlam (Context)
Bölüm başlığı “Bağlam (Context)”Trial yönetimi ETP admin panelinde üç ayrı sayfaya dağılmış durumda:
| Sayfa | Veri kaynağı | Amaç |
|---|---|---|
/admin/trials | ContactSubmission (trial=true) | Yeni gelen trial başvuruları (lead yönetimi) |
/admin/portals | PortalInstallation | Trial portal lifecycle (kurulum, suspend, purge) |
/admin/customers/[id]/trials | TrialCredential (per customer) | Müşteri başına trial credential listesi |
Tespit edilen problemler
Bölüm başlığı “Tespit edilen problemler”- UI dağınıklık: Admin “tüm trial’lar bir bakışta görünsün” istediğinde 3 sekme arası geçmek zorunda → CSM ticket: “trial’larımı nerede görüyorum?”
- Cross-customer credential görünmüyor: Tek customer detay sayfasından çıkmadan tüm credential’ları görmek imkansız (orphan = customer FK null olan credential’lar kaybolur)
- State drift:
TrialStatustipilib/services/trial-lifecycle.ts+components/admin/trials/TrialsTable.tsx2 yerde duplicate — refactor riski - Konstant drift:
TRIAL_DURATION_DAYS = 7hardcodedapp/[locale]/trial/credentials/[token]/page.tsxve i18n string’lerde"... in 7 days"literal — sabit değiştiğinde 24 dil manuel update gerekir - i18n drift: Yeni TrialHub namespace 24 dilde elle çevrilmek zorunda; parity test yok → bir dilde eksik key kullanıcı raw key görür
Alternatifler değerlendirildi
Bölüm başlığı “Alternatifler değerlendirildi”| Seçenek | Artı | Eksi |
|---|---|---|
| A: UI Hub konsolidasyonu (paralel sayfa) | Eski endpoint’ler bozulmaz, kademeli geçiş, deploy düşük risk | Geçici duplicate UI (eski + yeni), Faz 7’de cleanup gerek |
B: Unified REST tree (/api/admin/trial/* proxy) | Tek API kontratı | Mevcut endpoint’leri proxy’ye sarmak DOA — Faz 3’te terk edildi |
| C: Tam migration (eski sayfaları kaldır) | Temiz tek-doğruluk | Yüksek deploy riski, admin workflow disruption |
| D: Status quo (3 sayfa) | Sıfır risk | CSM ticket’ları artmaya devam |
Karar (Decision)
Bölüm başlığı “Karar (Decision)”Seçenek A — UI Hub konsolidasyonu, eski sayfalar paralel açık. Yeni /admin/trial-hub sayfası 3 sekme aggregator (submissions + portals + credentials) olarak deploy edilir; eski 3 sayfa dokunulmaz.
Mimari prensipler
Bölüm başlığı “Mimari prensipler”- Single source types:
types/trial.ts—TrialStatus,TrialAuditAction,TrialActorContext(Prisma’dan re-export) - Single source constants:
lib/constants/trial.ts—TRIAL_DURATION_DAYS,GRACE_PERIOD_DAYS, vb. - Backward-compat re-export:
lib/services/trial-lifecycle.tseski tip/sabit isimleriniexport {...}ile geri verir (import yolu sabit) - i18n placeholder pattern:
{days}placeholder +TRIAL_DURATION_DAYSargument → 24 dilde hardcoded7YASAK (parity test ile garanti) - Decision deferral (Faz 3 atlandı): Unified REST tree (proxy endpoint’ler) DOA — mevcut
/api/admin/trials/*ve/api/admin/installation/*endpoint’leri tek tüketici (admin UI) tarafından kullanılıyor, proxy ek katman gereksiz. Pat’lese 1-2 endpoint çağrı yolu değişir.
Bileşen haritası
Bölüm başlığı “Bileşen haritası”app/[locale]/admin/(panel)/trial-hub/├── page.tsx Server component, 3-sekme aggregator├── loading.tsx i18n-bound (TrialHub.loading_label)└── error.tsx i18n-bound (TrialHub.error_label)
components/admin/trial-hub/├── TrialHubTabContainer.tsx Client, URL state sync 3-tab switcher└── TrialCredentialsSection.tsx Server, cross-customer credentials viewi18n parity test sözleşmesi
Bölüm başlığı “i18n parity test sözleşmesi”lib/i18n/admin-trials-key-parity.test.ts:
TrialHubnamespace 28 key × 24 dil = 672 string coverageAdminCustomerbanner 3 key × 24 dil = 72 string- Placeholder token koruma:
{submissions}/{portals}/{credentials}/{orphans}/{days}/{date} - Hardcoded
7prohibition ((?<!\{)\b7\b(?!\}))
node --import tsx --test lib/i18n/admin-trials-key-parity.test.ts → 9/9 zorunlu.
Sonuçlar (Consequences)
Bölüm başlığı “Sonuçlar (Consequences)”Olumlu
Bölüm başlığı “Olumlu”- Admin tek panelden 3 trial işini görür → CSM support burden düşer
- Sabit (
TRIAL_DURATION_DAYS) değiştiğinde 24 dil otomatik uyumlu ({days}placeholder) - Type duplicate kaldırıldı → refactor risk düştü
- Eski endpoint’ler korundu → deploy regression riski 0 (smoke: 4/4 endpoint 307/200)
Olumsuz / Trade-off
Bölüm başlığı “Olumsuz / Trade-off”- Geçici duplicate UI (yeni hub + eski 3 sayfa); Faz 7’de cleanup ADR’ı gerek
- Cross-customer credentials view yeni Prisma query (customer join) — query budget kontrolü gerek (şu an N≤200 credentials için OK)
- Browser MCP audit production deploy sonrası ayrı tetikleyici (Chrome debug açık değil — kullanıcı aksiyonu bekliyor)
Takip eden çalışmalar
Bölüm başlığı “Takip eden çalışmalar”- Faz 7 (gelecek ADR): Eski 3 sayfanın kullanım metriği toplandıktan sonra (~30 gün) sunset kararı
- Lens 7 CSM önerisi: Diğer
Delete*Buttonbileşenlerinderouter.refresh()pattern denetimi (DeleteDevRequestButtoneksik tespit edildi, ayrı commit ile düzeltildi) - Multi-agent commit lock: Paralel autonomous agent ile race condition pattern — advisory
scripts/git-multi-agent-lock.shhelper eklendi (ayrı commit), kullanım~/.claude/rules/multi-agent-strategy.md > Race Condition Pattern
Atıflar
Bölüm başlığı “Atıflar”- Bu konsolidasyon kararı, ETP
git log2026-05-16 commits 4b701fd..ff6858a (5 atomic commit) ile uygulandı - Customer 404 fix (
fd2aeca) bu kapsamda out-of-scope olarak tespit edildi (DeleteCustomerButton success’te yönlendirme yapmıyordu, hub konsolidasyonu sırasında deploy edildi)