Role created on the Sase.tr standalone Postgres with SELECT-only privileges on schema public + ALTER DEFAULT PRIVILEGES so future tables inherit the grant. Panel-web DATABASE_URL_SASE_RO switched to this role; panel redeployed; UPDATE/INSERT/DELETE rejected with 'permission denied' as expected; SELECT count(*) FROM users still works. Process: temporarily exposed sase-postgres on port 54320, ran the SQL via psql, then closed the public port. Password generated with openssl rand -hex 24 (lives only in Coolify env). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
140 lines
7.1 KiB
Markdown
140 lines
7.1 KiB
Markdown
# Teknik Borç
|
||
|
||
Süper Panel'in shipped'i takip etmediği açık iş listesi. Her item'ın **ne zaman/neden** yapılması gerekiyor not'lu.
|
||
|
||
---
|
||
|
||
## Süper Panel Phase 7 (User Management) — DONE
|
||
|
||
Phase 7a–7c (foundation + tüm A–F mutation faz'ları) **shipped** (2026-05-18):
|
||
|
||
- Adım 1: User listesi sayfası
|
||
- Adım 2: User detay 360° (header + 5 sekme)
|
||
- Adım 3: Read-only impersonation (Sase.tr + panel, signed cookie + readonly guard)
|
||
- Phase A: Founder notes (panel-only)
|
||
- Phase B: Suspend / Reactivate / Ban (users.status + session kill)
|
||
- Phase C: Trial extend + manual activate
|
||
- Phase D: Plan change + cancel/resume
|
||
- Phase E: Refund (Stripe) + bonus süre extension
|
||
- Phase F: Brand reassignment (per-plan brandCount validate)
|
||
|
||
**Henüz yok (PRD §6.5, §9.2-5):**
|
||
- Support actions: password reset link, email verify (resend + manuel), 2FA reset
|
||
- KVKK export + erase (right-to-erasure)
|
||
- Active session yönetimi (revoke individual / revoke all)
|
||
- API key + webhook yönetimi (Sase.tr'de tablo yok, defer)
|
||
- Bulk operations (segment + bulk email/quota/plan)
|
||
- Automation rules (auto-suspend, churn alert, trial-end handling)
|
||
|
||
---
|
||
|
||
## Süper Panel Phase 8 (VIN Decode Observability) — DONE
|
||
|
||
Faz 1–4 + regression alert **shipped** (2026-05-18):
|
||
|
||
- Faz 1: Operational health + provider performans dashboard
|
||
- Faz 2a: Error fingerprint drill-down
|
||
- Faz 2b: Deploy regression analizi (Coolify deploys + ±30dk window)
|
||
- Faz 2c: BIP insight integration (provider_quality + keyword filter)
|
||
- Faz 3: Business impact dashboard (8 metric, quota'sız model)
|
||
- Faz 4: Trends (90g volume, peak heatmap, cache, efficiency) + provider drill-down
|
||
- Regression Telegram alert (per-deploy 24h dedupe)
|
||
- VIN anomaly detection + Telegram (success drop, latency spike, volume drop/spike, timeout dominance)
|
||
|
||
**Henüz yok (Phase 8 defer):**
|
||
- Alert threshold config UI — eşikleri panel'den ayarla (şimdi hardcoded)
|
||
- Anomali kayıt persistance — `vin_anomaly_log` tablosu yok; sadece Redis dedupe + Telegram
|
||
- Documentation / runbook (bu commit'te [RUNBOOK.md](./RUNBOOK.md) eklendi)
|
||
|
||
---
|
||
|
||
## PRD ↔ Sase.tr gerçeği gap'leri
|
||
|
||
`super-panel-user-management-prd-v1.md` ve `super-panel-vin-decode-observability-prd-v1.md` Sase.tr için bazı yapıları varsayıyor; gerçek Drizzle şeması daha sade:
|
||
|
||
- **EFT akışı kaldırıldı** — Stripe Migration sonrası (May 2026) EFT alınmıyor; `payments.method='eft'` historical. PRD §7.1 işlevsiz.
|
||
- **B2B / company / multi-seat yok** — PRD §8 (Grup 4) ve company görünümleri uygulanamaz.
|
||
- **API key + webhook yönetimi yok** — Sase.tr'de tablolar yok, defer.
|
||
- **Quota tablosu yok** — `queryLogs` + `plans.brandCount` üzerinden türetiliyor; observability Faz 3 quota-bağımsız tasarlandı.
|
||
- **WhatsApp chatbot conversation entegrasyonu** — sistem bilinmiyor, defer.
|
||
- **ML decoder events emit edilmiyor** — `vin_decode_succeeded.ml_decoder_used/ml_confidence` Sase.tr backend'inde set edilmiyor (Sase.tr VAG ML pipeline kod akışında değil).
|
||
|
||
---
|
||
|
||
## Defansif teknik borç
|
||
|
||
### ~~super_panel_reader DB rolü~~ — DONE (2026-05-18)
|
||
|
||
Panel `DATABASE_URL_SASE_RO` env'i artık `super_panel_reader` rolüyle bağlanıyor. Smoke test doğrulandı: SELECT çalışıyor, UPDATE/INSERT/DELETE → `permission denied for table`. Rol Coolify standalone postgres'te `GRANT SELECT ON ALL TABLES IN SCHEMA public` + `ALTER DEFAULT PRIVILEGES` ile kuruldu (geçici public port üzerinden psql ile, sonra port kapatıldı).
|
||
|
||
### `prisma db push` multi-replica güvensizliği
|
||
|
||
`apps/web/package.json` `start` scripti: `prisma db push --skip-generate && next start`. Tek replica'da OK; multi-replica olursa race condition. İlerideki bir Coolify pre-deployment hook'una taşı veya proper migrations'a geç.
|
||
|
||
### Sase.tr `apps/web` pre-existing typecheck error'ları
|
||
|
||
`FULL_PLAN_BRAND_LIMIT` eksik, `@radix-ui/react-accordion` types eksik. Phase 7/8 patch'lerimiz etkilemedi ama temizlik borç.
|
||
|
||
---
|
||
|
||
## Sase.tr-side (Süper Panel için)
|
||
|
||
### Faz 0 + Faz 1 PostHog event taxonomy
|
||
|
||
`sase-posthog-events-prd.md` referansı. BIP'in 15 tag rule'unun yaklaşık 9'u henüz fire etmiyor:
|
||
|
||
| Tag | Beklediği event |
|
||
|---|---|
|
||
| `payment_ui_silent_failure` (P0) | `payment_succeeded` + `payment_success_ui` (dual-capture rename) |
|
||
| `payment_friction` (P1) | `payment_initiated` |
|
||
| `vin_decode_fail_pattern` (P1) | `vin_decode_failed` (mevcut alias çalışıyor) |
|
||
| `provider_reliability_issue` (P2) | `provider_fallback_triggered` |
|
||
| `provider_mismatch` (P2) | `provider_fallback_triggered` + `vin_decode_succeeded` |
|
||
| `compatibility_quality_gap` (P2) | `compatibility_check_completed` |
|
||
| `parts_export_abandoned` (P3) | `parts_export_initiated` |
|
||
| `search_validation_friction` (P3) | `search_input_validation_failed` |
|
||
| `at_risk_active_session` (P2) | identify() ile `subscription_status` + `total_vin_queries_last_30d` |
|
||
|
||
**Etki:** Pipeline %30-40 → tam kapasite. LLM analizleri çok daha specific olur.
|
||
|
||
Faz 0 (2 gün): identify schema + group + alias + data-private audit + 5 parts/compat event.
|
||
Faz 1 (5-7 gün): VIN decode + provider + search + feature discovery + API key/webhook + subscription funnel + payment dual-capture.
|
||
|
||
**Not:** VIN decode backend telemetry'sini PR #32'de eklemiştik, **PR #33 ile revert ettik** (`query_logs` zaten her şeyi tutuyor, PostHog hop gereksiz). Frontend UX event'leri için bu Faz 0+1 hala değerli.
|
||
|
||
---
|
||
|
||
## BIP (Behavioral Insight Pipeline) açık işler
|
||
|
||
### 1. Pilot'un bulduğu P1 bug'ı fix et (highest ROI)
|
||
|
||
**Insight ID:** `cmp4oipcr000amsdsu2t8qnyi` · `/insights/i/cmp4oipcr000amsdsu2t8qnyi`
|
||
|
||
Başarılı VIN decode sonrası frontend `/api/vehicles/undefined` ve `/api/categories/tree/undefined` çağırıyor → 500. ~30-60 dk Sase.tr fix. Loop kapanışı: Fix → Gitea issue kapat → `github-sync` 10dk içinde `shipped` → `validation` cron 14d sonra `validated`.
|
||
|
||
### 2. Eval golden set
|
||
|
||
Şu an sadece `bug_triage` 2-case. 6 prompt için 0 case. Her aktif prompt için 15-20 gerçek session'dan elle ground truth. ~yarım gün (per prompt ~30dk).
|
||
|
||
### 3. Pattern bundle gerçek veri ile validate
|
||
|
||
`pattern_bundle` prompt deploy ama ≥3 same-fingerprint senaryo gelmedi (volume düşük). Sase.tr Faz 0+1 sonrası 1 hafta bekle veya aylık session ≥1000 olunca.
|
||
|
||
### 4. Embedding-based cross-fingerprint similarity
|
||
|
||
PRD Phase 6e içinde defer edilmiş. Pattern aggregation şu an string match. 50+ insight birikince pgvector + sentence-transformers/MiniLM.
|
||
|
||
### 5. Multi-project routing
|
||
|
||
`INSIGHT_PROJECT_KEY=sase` hardcoded. Spokes (`catvicer`, `kokpit`, `otoyedekparca`, `eryaman`, `doner312`) `status='planned'`. İlk spoke canlandığında: per-project PostHog polling + per-spoke budget alloc + `GITEA_REPO_<KEY>` (env mapping zaten supportluyor).
|
||
|
||
---
|
||
|
||
## Minor / Düşük öncelik
|
||
|
||
- **`pattern_bundle` UI surface** — `/insights/patterns` ayrı başlık
|
||
- **Cost dashboard chartlar** — şu an tablo; recharts ile daily trend
|
||
- **POST /api/webhooks/gitea** — receiver yazıldı, polling primary; webhook real-time gerekirse Cloudflare/Tailscale çözümü gerekli
|
||
- **github-sync job rename** — `issue-sync`'e taşı (BullMQ state cleanup gerekir)
|
||
- **Audit log retention** — şu an pruning yok, aylık partition + 90gün retention eklenebilir
|