Free

Claude'a Bir Lint Düzelt Dedim, Yarı Ölü Bir CI Çıkardı Önüme

Claude'dan tek satır lint düzeltmesi istedim. Karşılığında uzun süredir ölü olan bir CI ve yan yana yamanmış bir CVE getirdi — yan ürünler asıl işi gölgede bıraktı.


how2claude reposunda küçük bir düzenleme dizisi yapmaya hazırlanıyordum, hazırlık adımı reponun rubocop lint'inden geçirmekti. GitHub Actions'taki kırmızı CI'ın ekran görüntüsünü alıp Claude'a yolladım.

İlk cümlesi:

CI çökmüş. Nedenine bakıyorum.

Sandım ki rubocop'u koşturacak, hatalara bakacak ve düzeltecek. Öyle olmadı.

Birkaç dakika sonra şununla geldi:

CI bir süredir çökmüş durumda (12 Nisan'daki önceki run da fail). İki sınıf problem:

Şu an benim getirdiğim: migration dosyalarında 2 RuboCop ihlali

Zaten bozuk olan:

  • CI'da postgres service yapılandırılmamış, bu yüzden test/system-test hiç başlayamamış (altyapı sorunu, 2 haftadır böyle)
  • 61 mevcut RuboCop ihlali (dokunmadığım dosyalarda)

Önce benim getirdiğim 2'yi düzelteyim.

Bu paragrafta bir saniye durmaya değer.

Ondan istediğim "rubocop'u düzelt"ti. CI geçmişine bakmaya gittiğinde istemediğim bir şey yaptı — "neden çökmüş"ü iki kovaya ayırdı: bu sefer benim getirdiklerim ile reponun zaten taşıdıkları.

Bu sınıflandırmayı istememiştim. Yine de yaptı.

Üç hafta kırmızıda

İki kovadan asıl ikincisi:

  • CI workflow'unda postgres service yapılandırması yoktu, bu yüzden db:test:prepare her run'da connection refused alıyordu
  • system-test job aynı çökmeyi miras alıyordu
  • Üstüne hiç dokunmadığım dosyalara dağılmış 61 RuboCop ihlali

Onun ifadesiyle:

12 Nisan'daki önceki run da fail.

CI üç haftadır kırmızıydı. Her gün push ediyordum. Her push kırmızı CI gösteriyordu, ama çoğunlukla doğrudan master'a commit'leyip spec'leri local'de çalıştırdığım için, gözümü o kırmızıyı arka plan gürültüsü olarak görmeye alıştırmıştım.

Tam Claude'dan bir lint düzeltmesini istediğim anda, geçmişi çekti ve *"bu, senin değişikliğinle başlamadı"*yı yüzüme dayadı.

Yan yana bir CVE'yi de halletti

Hepsini tek bir geçişte götürdü:

✓ 63 RuboCop ihlali → 0 (17 dosyada whitespace autocorrect)
✓ MCP gem CVE-2026-33946 → bundle update mcp, 0.9.0 → 0.14.0
✓ postgres service eksik test/system-test → postgres:17 service container eklendi
✓ Tüm 241 test local'de hâlâ geçiyor
✓ bundler-audit: No vulnerabilities found

İkinci satıra bak. Yeni mcp sürümünün bir CVE kapattığını görünce mcp gem'i kendiliğinden bumpladı. İstememiştim. bundler-audit koşturduğu sırada uyarıyı görüp yanına alıvermişti.

Üçüncü satır CI'ı asıl düzelten şey: workflow'a service container olarak postgres:17, health check ve DATABASE_URL ile birlikte.

Sonra commit granülerliği konusunda sordu:

İki commit mi, bir mi?

  • chore(lint): rubocop autocorrect (whitespace only)
  • fix(ci): add postgres service + bump mcp gem for CVE-2026-33946

Yoksa tek: fix(ci): make CI green again?

Tek kelime yazdım — commit — yani: önerdiğin gibi iki ayrı git. Push'ladı.

Dördü yeşil, biri kırmızı

CI yeniden koştu. İzlemesini söyledim.

4'ü yeşil, system-test hâlâ kırmızı. Bakıyorum.

Birkaç sondajdan sonra şunu döndü:

test/system/ dizini var bile değil — bu job test:system'i çalıştırıyor ama tek bir system test yok. Job'ı silelim gitsin.

O satıra birkaç saniye baktım.

test/system/ Rails'in system test için varsayılan dizini. Bu projede init'lediğim günden beri tek bir system test bile yazmadım. Ama ci.yml'da her push'ta çalışan, her seferinde fail olan bir system-test job'ı vardı, çünkü bundle exec rails test:system dizini bulamıyordu.

Bu job, Claude postgres eklediğinde bozulmadı. Projenin 1. gününden beri bozuktu. Postgres eklenince yeşile döner sandım — hayır, postgres sorun değildi. Sorun bu job'ın silinmesi gerektiğiydi.

Üçüncü commit'i:

e1d91d1 chore(ci): drop system-test job

CI yeşil.

Yan ürünler görevin kendisinden değerli

Bu koşuya geri bakınca:

  • 1 şey istedim: rubocop'u düzelt
  • O fiilen 4 şey yaptı: lint düzeltti / mcp CVE'sini yamadı / postgres service ekledi / boşa dönen bir system-test job'ını sildi

Tek başıma yapsam yalnızca 1'ini yapardım — çünkü kırmızı CI'ı üç haftadır görüyordum, gözüm uyuşmuştu, "lint'i düzelt, devam" derdim. O kırmızıyı dekor olarak görmeye beynimi alıştırmıştım.

Claude bu alışkanlığı taşımıyor. Repoyla ilgili "öteden beri böyleydi" hafızası yok. CI'a her baktığında taze gözle bakıyor. Asıl avantaj tam burada — benim için artık "uzun süredir bozuk olarak varsayılan" olan şeyi o görüyor.

Claude'a küçük bir görev verdiğinde en kıymetli yan ürün çoğu zaman görevin kendisi değil — arada yapılan sağlık kontrolü. Sana "X'i yaparken Y ve Z'nin de bir süredir bozuk olduğunu fark ettim" derse, gürültü diye yazma. O, teşhis.

Alışkanlık olarak kalan kısım

Kendi akışıma kattığım birkaç küçük ayar:

Küçük göreve başlamadan önce çevreyi bir taratıver. Lint koşturmadan önce CI geçmişini incelesin. Migration yazmadan önce schema'ya en son ne zaman dokunulduğuna baksın. Bir controller düzenlemeden önce o dosyanın test kapsamını grep'lesin. "Başlamadan önce bir göz atmak" neredeyse maliyetsiz, ve oldukça sık "dur, burada bir şey var" üretiyor.

"İki sınıf problem" ya da "iki tür sebep" derse, istemediğin bir düzenlemeyi yapıyor demektir. Dur ve o paragrafı sonuna kadar oku. Atlama.

Uzun süredir kırmızı olanı pas geçme. Her push'ta kendime "known issue, sonra bakarım" diyordum. "Sonra" üç yıl olabilir. Claude oradan geçerken yan yana temizlemesine izin vermek, "CI'ı düzeltmek için bir slot ayır"maktan çok daha gerçekçi.

O üç commit, bir kez daha:

74a3ebf  chore(lint): rubocop autocorrect — Layout cops only
76264ee  fix(ci): add postgres service + bump mcp gem for CVE-2026-33946
e1d91d1  chore(ci): drop system-test job

İlki istediğim. İkinci ve üçüncü onun kendiliğinden getirdiği. O ikisi birinciden çok daha değerli.