Feat/m8 retention - #5
Merged
Merged
Conversation
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
M8'in kod tarafı:
db/retention.sql(pg_cron job'ı) + 25 statik sözleşme testi.Kapsam:
accounts.retention_daysdeğerinden gelir (varsayılan 10).received_at,commands için
created_at.measured_athiçbir yerde ölçüt değil — onu cihazdoldurur, yani silinip silinmeyeceğine verinin sahibi karar verirdi.
commands'ta yalnızcastatus='applied'satırlar silinir.pendingbir satırteslim 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.scheduleada göre upsert eder, dosyatekrar çalıştırılabilir.
Testler SQL'i çalıştırmadan sözleşmeyi doğruluyor (
install.shdeseni): yorumsatırları ayıklanıp yalnızca kodun kendisi sınanıyor.
Canlı doğrulama (Supabase'de
pg_cronetkinleştirme + dosyayı çalıştırma) merge'denönce yapılacak.