Free

Saya minta Claude perbaiki lint, dia kembalikan CI yang setengah mati

Saya minta perbaikan lint dari Claude. Dia kembali dengan CI yang sudah lama mati dan satu CVE dipatch sambil lalu — efek samping mengalahkan tugasnya.


Di repo how2claude saya mau menggarap satu set kecil suntingan, dan langkah awal adalah lolosin rubocop lint. Saya screenshot CI merah di GitHub Actions dan kirim ke Claude.

Kalimat pertamanya:

CI rusak. Saya cek penyebabnya.

Saya pikir dia akan jalanin rubocop, lihat error, dan perbaiki. Bukan begitu.

Beberapa menit kemudian dia balik dengan ini:

CI sudah lama rusak (run sebelumnya tanggal 12 April juga gagal). Dua kelas masalah:

Yang baru saja saya bawa masuk: 2 RuboCop violation di file migration

Yang memang sudah rusak dari sebelumnya:

  • CI tidak punya postgres service yang dikonfigurasi, jadi test/system-test bahkan tidak mulai (masalah infra, sudah seperti ini 2 minggu)
  • 61 RuboCop violation pre-existing (di file yang tidak saya sentuh)

Saya mulai dari 2 yang saya bawa masuk.

Paragraf ini layak dijeda satu detik.

Yang saya minta cuma "perbaiki rubocop." Sambil periksa history CI, dia melakukan sesuatu yang tidak saya minta — dia menyortir "kenapa ini rusak" ke dua keranjang: yang saya bawa kali ini vs yang sudah lama dipikul repo.

Klasifikasi itu tidak saya pesan. Dia tetap melakukannya.

Tiga minggu di merah

Dari dua keranjang itu, yang kedua adalah inti:

  • Workflow CI tidak punya postgres service yang dikonfigurasi, jadi db:test:prepare setiap kali kena connection refused
  • Job system-test mewarisi crash yang sama
  • Plus 61 RuboCop violation tersebar di file yang belum pernah saya sentuh

Dengan kata-katanya:

Run sebelumnya tanggal 12 April juga gagal.

CI sudah merah tiga minggu. Saya push tiap hari. Tiap push menampilkan CI merah, tapi karena saya biasanya commit langsung ke master dan jalanin spec lokal, saya melatih mata untuk memperlakukan merah itu sebagai bunyi latar.

Pas saya minta Claude perbaiki satu lint saja, dia menarik history dan menyodorkan ke wajah saya: "ini bukan dimulai dari perubahan kamu."

Sambil itu, satu CVE dilibas

Dia mengelar semuanya dalam satu jalan:

✓ 63 RuboCop violation → 0 (autocorrect whitespace di 17 file)
✓ MCP gem CVE-2026-33946 → bundle update mcp, 0.9.0 → 0.14.0
✓ test/system-test tanpa postgres service → ditambahkan postgres:17 service container
✓ Seluruh 241 test masih lolos di lokal
✓ bundler-audit: No vulnerabilities found

Lihat baris kedua. Dia bump versi mcp gem atas inisiatif sendiri karena tahu versi baru menutup CVE. Saya tidak minta. Dia hanya melihat warning saat menjalankan bundler-audit dan ikut bawa.

Baris ketiga adalah yang benar-benar memperbaiki CI: postgres:17 sebagai service container di workflow, dengan health check dan DATABASE_URL.

Lalu dia tanya soal granularitas commit:

Dua commit atau satu?

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

Atau satu: fix(ci): make CI green again?

Saya jawab satu kata — commit — artinya: pakai dua terpisah. Dia push.

Empat hijau, satu merah

CI jalan ulang. Saya minta dia pantau.

4 hijau, system-test masih merah. Lagi cek.

Setelah beberapa probe, dia balik dengan:

Direktori test/system/ bahkan tidak ada — job ini menjalankan test:system tanpa satupun system test. Hapus saja jobnya.

Saya beberapa detik menatap baris itu.

test/system/ adalah direktori default Rails untuk system test. Saya tidak pernah menulis system test di proyek ini, sekali pun, sejak hari saya init. Tapi ci.yml punya job system-test yang jalan tiap push dan gagal tiap kali, karena bundle exec rails test:system tidak menemukan direktorinya.

Job itu bukan rusak gara-gara Claude tambah postgres. Dia rusak sejak hari 1 proyek. Saya menduga dengan postgres dia akan jadi hijau — ternyata bukan, postgres bukan masalahnya. Masalahnya adalah job ini harus dihapus.

Commit ketiganya:

e1d91d1 chore(ci): drop system-test job

CI hijau.

Efek samping bernilai lebih dari tugasnya

Kalau menengok jalannya kerja:

  • Saya minta 1 hal: perbaiki rubocop
  • Dia secara nyata melakukan 4: perbaiki lint / patch CVE mcp / tambah postgres service / hapus job system-test yang berputar kosong

Kalau saya kerjakan sendiri, saya cuma akan ngerjain yang 1 — karena saya sudah lihat CI merah selama tiga minggu, mata saya mati rasa, dan saya akan bilang "perbaiki lint, lanjut." Otak saya sudah dilatih memperlakukan merah itu sebagai latar.

Claude tidak bawa kebiasaan itu. Dia tidak punya memori "ini memang dari dulu begini" tentang repo ini. Setiap kali dia lihat CI, dia lihatnya dengan mata segar. Justru di situ keunggulannya — yang bagi saya sudah jadi "rusak default sejak lama," bagi dia kelihatan.

Saat kamu kasih Claude tugas kecil, efek samping yang paling bernilai sering bukan tugas itu sendiri — tapi medical check-up sambil lalu. Kalau dia bilang "sambil ngerjain X, saya juga lihat Y dan Z sudah lama rusak," jangan anggap itu derau. Itu diagnosa.

Yang jadi kebiasaan

Beberapa penyesuaian kecil yang saya pakai:

Sebelum tugas kecil, suruh dia scan dulu sekitarnya. Suruh lihat history CI sebelum jalanin lint. Suruh lihat kapan terakhir schema disentuh sebelum nulis migration. Suruh grep test coverage sebuah controller sebelum mengeditnya. "Selintas pandang sebelum mulai" hampir nol biaya, dan cukup sering memuntahkan "tunggu, di sini ada sesuatu."

Saat dia bilang "dua kelas masalah" atau "dua jenis penyebab," itu dia sedang menyusun sesuatu yang tidak kamu pesan. Berhenti dan baca paragraf itu sampai habis. Jangan lewatkan.

Jangan lewati merah jangka panjang. Saya bilang ke diri sendiri "ini known issue, lihat nanti" tiap push. "Nanti" bisa berarti tiga tahun lagi. Biarkan Claude membersihkannya sambil lewat, mumpung dia di dekat situ — itu jauh lebih realistis daripada menyisihkan slot khusus "pergi memperbaiki CI."

Ketiga commit itu, sekali lagi:

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

Yang pertama adalah yang saya minta. Yang kedua dan ketiga adalah yang dia bawa sendiri. Yang dua di belakang nilainya jauh melampaui yang pertama.