Skip to content

Cron yok, sadece damga

· English

Bazı işler her hafta geri geliyor. Yazılacak bir rapor, bir standup güncellemesi, kontrol edilecek bir servis. Claude Code hepsini gayet güzel yapıyor, her biri için bir skill’im var. Sürekli aksayan kısım, işin zamanının geldiğini benim hatırlamamdı.

E, cron o zaman. Mac olduğu için aslında launchd. Bir plist yazıyorsun, saati seçiyorsun, olay bu kadar olacak sözde.

Ama pazartesi sabah 9’da benim laptopumun kapağı kapalı oluyor. Bazen uçaktayım, bazen cuma izin günüydü ve daha dönmemişimdir. launchd’nin StartCalendarInterval’ı var, makine uyandıktan sonra kaçırdığını telafi etmesi gerekiyor; ama oturup bunu yapmadığını izledim. Daha kötüsü, kimse sana haber vermiyor. İş çalışmadı, kimse bir şey demedi, perşembe günü biri sorunca öğreniyorsun.

Bariz olanı yüksek sesle söylemem biraz zaman aldı. Bir zamanlayıcı yalnızca tetiklenip tetiklenmediğini bilir. İşin gerçekten yapılıp yapılmadığından haberi yoktur. Bunlar iki ayrı gerçek. Çoğu hafta birbirini tuttukları için de ikisini ayırmak hiç gerekmemişti.

Damga

Ben de hiçbir şeyi zamanlamayı bıraktım. Artık tek bir soru var, tekrar tekrar soruluyor.

Bir iş bittiğinde kendi adını taşıyan bir dosyaya tek bir string yazıyor: az önce tamamladığı dönem.

2026-W35

Sistemdeki bütün state bu. Bu haftanın hâlâ borç olup olmadığını anlamak için hangi haftada olduğunu hesaplayıp iki string’i karşılaştırıyorsun.

period_key() {
  case "$1" in
    weekly)  date -v-7d +%G-W%V ;;
    monthly) date -v-1m +%Y-%m ;;
    daily)   date -v-1d +%Y-%m-%d ;;
  esac
}

Karşılaştırma tek satır:

[[ "$dn" == "$per" ]]

$dn damga dosyasının içindeki, $per ise şu an bulunduğumuz yer. Eşleşiyorsa iş yapılmış, eşleşmiyorsa borç.

Hiçbir şey tetiklenmeyi kaçıramaz, çünkü tetiklenen bir şey yok. Makineyi yeniden başlatabilirsin, kapağı bir hafta kapalı tutabilirsin, tatile gidebilirsin. Döndüğünde damga hâlâ geçen haftayı söylüyor ve satır hâlâ sarı. Senkronu bozulacak bir şey de yok; tek state o string, gerisi her bakışta takvimden hesaplanıyor.

date -v-7d kısmı gözünden kaçabilir. %G-W%V sana ISO haftasını veriyor; önce yedi gün geri gitmek ise içinde durduğun haftayı değil, yeni kapanan haftayı sorman demek. Henüz bitmemiş bir hafta için rapor borçlu olamazsın.

Bunları çalıştıran bir şey de yok. SwiftBar sadece bir shell script’inin çıktısını menü çubuğuna basıyor; script’e birsey.2m.sh gibi bir isim verirsen iki dakikada bir yeniden çalıştırıyor. Yani soru günde 720 kez soruluyor ve hiçbir maliyeti yok.

Neden bir Terminal penceresi açıyor

Baktığım bütün yapay zekâ zamanlayıcıları headless çalışıyordu. Benim için mesele orada bitti, kendiminkini yazdım.

Skill’lerimden biri bir şey yapmadan önce bana sorular soruyor. Bir taslak gösterip bekliyor. Bunu claude -p ile çalıştırınca ilk soruda takılıyor; daha kötüsü, hiçbir şey yapmadan sıfırla çıkıyor. Bu da dönemi “yapıldı” diye damgalayıp haftanın geri kalanında otomatik tetiklemeyi sessizce kapatıyor.

Bu yüzden her iş hangi modu istediğini kendi söylüyor. Headless, arka planda ve açık bir --allowedTools listesiyle çalışan claude -p demek. Interactive ise Terminal’de gerçek bir oturum açıyor; dönem gelince eklenti o pencereyi benim için açıyor. Birkaç soruyu cevaplıyorum, sıfırla çıkıyor, satır yeşile dönüyor.

Uymayan kadans

Bir kadans daha var, interval, health check’ler için. N dakikada bir çalış. Dönemi yok, dolayısıyla damgası da yok; yani az önce anlattıklarımın hiçbiri ona uymuyor. Onun yerine bir .lastrun zaman damgası verip devam ettim.

Sonra hata. .lastrun’ı yalnızca otomatik tetikleme yazıyordu. Bir interval işini menüden elle çalıştırdığımda kaydeden olmuyor, iki dakika sonraki yenileme eski zaman damgasını görüp aynı işi tekrar başlatıyordu — hem de tam benim elle başlattığım çalışma biterken.

Düzeltmesi birkaç satır sürdü. Aklımda kalan şu oldu: modelin dışına sonradan iliştirdiğim tek kadans, bugüne kadar bozulan tek kadans oldu. Geri kalanı state’ini tek bir dosyadaki tek bir string’de tutuyor ve o günden beri onları düşünmek zorunda kalmadım.

GitHub’da, MIT, yaklaşık 600 satır shell. Açık konuşayım, çok bir şey yok içinde — bütün fikir o damga dosyası, gerisi menü tesisatı.

← Tüm yazılar