Skip to content

Feat/m8 retention - #5

Merged
Denisergocmen924 merged 2 commits into
masterfrom
feat/m8-retention
Aug 27, 2026
Merged

Feat/m8 retention#5
Denisergocmen924 merged 2 commits into
masterfrom
feat/m8-retention

Conversation

@Denisergocmen924

Copy link
Copy Markdown
Owner

M8'in kod tarafı: db/retention.sql (pg_cron job'ı) + 25 statik sözleşme testi.

Kapsam:

  • Her gece 00:00 UTC'de metrics / logs / crash_snapshots / commands temizlenir.
  • Yaş sınırı satırın sahibinin accounts.retention_days değerinden gelir (varsayılan 10).
  • Ölçüt sunucunun yazdığı damgadır: metrics/logs/crash için received_at,
    commands için created_at. measured_at hiçbir yerde ölçüt değil — onu cihaz
    doldurur, yani silinip silinmeyeceğine verinin sahibi karar verirdi.
  • commands'ta yalnızca status='applied' satırlar silinir. pending bir satır
    teslim edilmemiş emirdir; yaşa göre silinseydi komut sessizce kaybolurdu.

Şema değişmediği için migration yok — dosya yeni bir nesne (cron job) kuruyor,
mevcut bir nesneyi değiştirmiyor. cron.schedule ada göre upsert eder, dosya
tekrar çalıştırılabilir.

Testler SQL'i çalıştırmadan sözleşmeyi doğruluyor (install.sh deseni): yorum
satırları ayıklanıp yalnızca kodun kendisi sınanıyor.

Canlı doğrulama (Supabase'de pg_cron etkinleştirme + dosyayı çalıştırma) merge'den
önce yapılacak.

db/retention.sql eklendi: her gece 00:00 UTC'de çalışan, hesabın
retention_days politikasından daha eski satırları silen pg_cron işi.

Silinen dört tablo ve ölçütleri:

  metrics, logs, crash_snapshots  → received_at
  commands                        → created_at + status = 'applied'

Ölçüt her zaman SUNUCUNUN yazdığı damgadır. measured_at'i agent koyar;
oraya bakılsaydı bir satırın silinip silinmeyeceğine veriyi gönderen
cihaz karar verirdi ve damgayı geleceğe yazan bir cihazın verisi hiç
eskimezdi.

commands tablosu listeye M8'de dahil edildi. Komut satırı bir telemetri
artığı değil, kullanıcının makineyi yönettiğinin kaydıdır — "ne zaman
durdurdum, ne zaman yeniden başlattım". Metrik ve logla aynı soruya
cevap verdiği için aynı ömre tabi tutuldu.

status = 'applied' süzgeci zorunlu: 'pending' satır teslim EDİLMEMİŞ
bir emirdir. Süzgeç olmasaydı, çevrimdışı bir cihaza verilen delete
komutu cihaz geri dönmeden silinirdi; cihaz açılır, bekleyen komut
bulamaz, kendini silmez ve hiçbir yerde hata üretilmez. Bekleyen
satırlar zaten birikmez — çalışan cihaz komutu saniyeler içinde alır,
hiç dönmezse satır devices kaydıyla CASCADE üzerinden gider.

commands için ayrı bir received_at sütunu gerekmedi: satırı agent değil
dashboard yazar ve created_at zaten default now() ile veritabanı
saatinden dolar. db/rls.sql INSERT yetkisini kolon düzeyinde
(device_id, account_id, type) daraltıyor, yani istemci o sütuna değer
veremiyor. Şema değişmedi — migration yok.

tests/test_retention_sql.py: 25 sözleşme testi. SQL bir birim testinde
çalıştırılamıyor (pg_cron + canlı Postgres ister), bu yüzden install.sh
için kullanılan yöntem uygulandı — dosyanın sözleşmesi statik olarak
korunuyor. Testler SQL yorumlarını ayıklıyor; aksi halde iddialar
koddan silinse bile yorum metniyle tatmin olurdu.

24 sabotajın tamamı yakalandı: her tablonun listeden düşürülmesi,
ölçütün measured_at'e kaydırılması, applied süzgecinin silinmesi, bir
DELETE'in $$ bloğunun dışına taşınması, sürenin sabitlenmesi ve
zamanlamanın günlükten aylığa kaydırılması.

Suite 385 → 410.
Dokümantasyon ayrı bir private repo'da (md/) duruyor; kod repo'sundan
oraya atıf yapılmaz. Okuyucunun açamayacağı bir yola işaret eden
referans bilgi vermez, eksik bırakır. Kural gereği gerekçe yorumun
İÇİNE yazılır, atıf atılır.

M6 sırasında iki dosyaya sızmıştı:

  collector/supabase_client.py — DEVICE_WRITABLE_COLUMNS listesinin
    üstündeki "logging_enabled neden eklendi" notu
  db/migrations/0003_drop_pending_delete.sql — başlıktaki TARİH
    satırının sonu

İkisinde de gerekçe zaten yorumun içinde tam olarak yazılıydı; yalnızca
dışarı açılan kapı duruyordu. Bilgi kaybı yok.
@Denisergocmen924
Denisergocmen924 merged commit e6db72f into master Aug 27, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant