İçeriğe geç

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:

Trial yönetimi ETP admin panelinde üç ayrı sayfaya dağılmış durumda:

SayfaVeri kaynağıAmaç
/admin/trialsContactSubmission (trial=true)Yeni gelen trial başvuruları (lead yönetimi)
/admin/portalsPortalInstallationTrial portal lifecycle (kurulum, suspend, purge)
/admin/customers/[id]/trialsTrialCredential (per customer)Müşteri başına trial credential listesi
  1. 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?”
  2. 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)
  3. State drift: TrialStatus tipi lib/services/trial-lifecycle.ts + components/admin/trials/TrialsTable.tsx 2 yerde duplicate — refactor riski
  4. Konstant drift: TRIAL_DURATION_DAYS = 7 hardcoded app/[locale]/trial/credentials/[token]/page.tsx ve i18n string’lerde "... in 7 days" literal — sabit değiştiğinde 24 dil manuel update gerekir
  5. i18n drift: Yeni TrialHub namespace 24 dilde elle çevrilmek zorunda; parity test yok → bir dilde eksik key kullanıcı raw key görür
SeçenekArtıEksi
A: UI Hub konsolidasyonu (paralel sayfa)Eski endpoint’ler bozulmaz, kademeli geçiş, deploy düşük riskGeç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ğrulukYüksek deploy riski, admin workflow disruption
D: Status quo (3 sayfa)Sıfır riskCSM ticket’ları artmaya devam

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.

  1. Single source types: types/trial.tsTrialStatus, TrialAuditAction, TrialActorContext (Prisma’dan re-export)
  2. Single source constants: lib/constants/trial.tsTRIAL_DURATION_DAYS, GRACE_PERIOD_DAYS, vb.
  3. Backward-compat re-export: lib/services/trial-lifecycle.ts eski tip/sabit isimlerini export {...} ile geri verir (import yolu sabit)
  4. i18n placeholder pattern: {days} placeholder + TRIAL_DURATION_DAYS argument → 24 dilde hardcoded 7 YASAK (parity test ile garanti)
  5. 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.
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 view

lib/i18n/admin-trials-key-parity.test.ts:

  • TrialHub namespace 28 key × 24 dil = 672 string coverage
  • AdminCustomer banner 3 key × 24 dil = 72 string
  • Placeholder token koruma: {submissions}/{portals}/{credentials}/{orphans}/{days}/{date}
  • Hardcoded 7 prohibition ((?<!\{)\b7\b(?!\}))

node --import tsx --test lib/i18n/admin-trials-key-parity.test.ts → 9/9 zorunlu.

  • 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)
  • 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)
  • 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*Button bileşenlerinde router.refresh() pattern denetimi (DeleteDevRequestButton eksik tespit edildi, ayrı commit ile düzeltildi)
  • Multi-agent commit lock: Paralel autonomous agent ile race condition pattern — advisory scripts/git-multi-agent-lock.sh helper eklendi (ayrı commit), kullanım ~/.claude/rules/multi-agent-strategy.md > Race Condition Pattern
  • Bu konsolidasyon kararı, ETP git log 2026-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)