Tugas Terjadwal Claude Code: Loop, Cron, dan Routine

Scheduler menambahkan offset jitter deterministik supaya sesi tidak semuanya menghantam API pada saat jam dinding yang sama. Tugas berulang menyala sampai 30 menit setelah waktu terjadwal, atau sampai separuh interval untuk tugas di bawah satu jam. Offset-nya berasal dari ID tugas, jadi konsisten — jadwalkan pada menit yang bukan awal atau tengah jam untuk menghindarinya.
Tugas berulang yang tercakup sesi kedaluwarsa tujuh hari setelah dibuat: tugasnya menyala satu kali terakhir, lalu menghapus dirinya. Ini membatasi berapa lama loop yang terlupakan boleh berjalan. Untuk penjadwalan tahan lama yang melampaui satu sesi, pakai routine cloud, Desktop scheduled task, atau pemicu schedule di CI.
Dengan interval, prompt Anda berjalan pada jadwal cron tetap. Tanpa interval, Claude memilih sendiri tiap jeda — antara satu menit dan satu jam — berdasarkan apa yang diamati iterasi terakhir, dan mencetak jeda beserta alasannya setiap kali. Tanpa interval maupun prompt, ia menjalankan prompt pemeliharaan bawaan, atau loop.md Anda kalau ada.
Tidak. Tugas yang tercakup sesi hanya menyala selama Claude Code berjalan dan sedang idle, jadi menutup terminal menghentikannya. Memindahkan sesi ke latar belakang membawa tugas loop-nya ke sesi background yang terus berjalan tanpa terminal. Untuk penjadwalan yang bertahan sendiri, pakai routine atau Desktop scheduled task.
Tidak. Kalau waktu terjadwal sebuah tugas terlewat saat Claude sibuk pada request yang berjalan lama, ia menyala sekali ketika Claude jadi idle, bukan sekali per interval yang terlewat. Polling lima menit yang beririsan dengan giliran dua puluh menit menghasilkan satu penyalaan, dan itu biasanya memang yang Anda inginkan tetapi tetap layak diketahui.

Ringkasan Utama
Claude Code menawarkan tiga cara menjadwalkan pekerjaan: loop dalam sesi yang butuh sesi tetap terbuka, Desktop scheduled task yang butuh mesin Anda menyala, dan routine di cloud yang tidak butuh keduanya. Tugas dalam sesi hidup di percakapan saat itu, kedaluwarsa tujuh hari setelah dibuat, dan menyala di sela giliran alih-alih memotong satu giliran.
Saya meminta sebuah sesi memeriksa deployment setiap lima menit lalu kembali satu jam kemudian dan menemukan ia memeriksa sembilan kali, bukan dua belas. Tidak ada yang gagal. Scheduler-nya memang menambahkan offset deterministik pada setiap waktu penyalaan dengan sengaja, dan saya membaca jam yang memang tidak akan pernah cocok.
Penjadwalan di Claude Code lebih berpendirian daripada kelihatannya, dan pendiriannya sebagian besar bagus begitu Anda tahu ia ada. Tulisan ini membahas tiga mekanismenya dan kapan masing-masing tepat, bentuk-bentuk yang bisa diambil sebuah loop, dialek cron yang didukung dan bagian yang tidak, serta dua perilaku — jitter dan kedaluwarsa tujuh hari — yang ada untuk mencegah pekerjaan terjadwal berubah menjadi masalah.
Pertanyaan yang membedakannya bukan seberapa sering sesuatu berjalan, melainkan apa yang harus benar supaya ia berjalan sama sekali. Loop dalam sesi butuh sesi terbuka. Tugas Desktop butuh mesin menyala. Routine di cloud tidak butuh keduanya, dengan imbalan clone segar alih-alih file lokal Anda.
Apa yang dibutuhkan dan dikorbankan masing-masing:
| Properti | Routine cloud | Tugas Desktop | Loop sesi |
|---|---|---|---|
| Butuh mesin menyala | Tidak | Ya | Ya |
| Butuh sesi terbuka | Tidak | Tidak | Ya |
| Akses ke file lokal | Tidak — clone segar | Ya | Ya |
| Interval minimum | Satu jam | Satu menit | Satu menit |
Baik interval maupun prompt bersifat opsional, dan mana yang Anda sertakan mengubah perilakunya sepenuhnya, bukan sekadar kadensinya.
# Three forms, and what you supply decides the behaviour.
/loop 5m check if the deployment finished and tell me what happened
# -> fixed cron schedule. Seconds round UP to the nearest minute.
# 7m and 90m round to the nearest clean cron step, and Claude
# tells you what it picked.
/loop check whether CI passed and address any review comments
# -> Claude picks each delay itself, between one minute and one
# hour, based on what it just observed. It prints the delay
# and the reason at the end of every iteration.
/loop
# -> the built-in maintenance prompt, at a self-chosen interval:
# finish unfinished work, tend the branch's PR (review
# comments, failed CI, merge conflicts), then cleanup passes.
/loop 20m /review-pr 1234
# -> a skill as the prompt. Only skills Claude is allowed to
# invoke on its own actually run; built-in commands such as
# /permissions or /model arrive as PLAIN TEXT instead.
# Esc clears the pending wakeup while a loop is waiting.Bentuk yang mengatur laju sendiri adalah yang paling sering saya pakai. Tanpa interval, Claude memilih tiap jeda antara satu menit dan satu jam berdasarkan apa yang baru saja ia amati — jeda pendek selama build hampir selesai, jeda panjang begitu sebuah PR menyepi — dan mencetak jeda beserta alasannya di akhir tiap iterasi. Itu mengubah interval dari tebakan yang Anda buat di muka menjadi keputusan yang diberi tahu oleh hasil terakhir.
Ketika Anda meminta loop yang mengatur laju sendiri, Claude bisa jadi memakai tool Monitor. Monitor menjalankan script di latar belakang dan mengalirkan tiap baris keluarannya kembali, yang sama sekali menghindari polling — ia lebih hemat token sekaligus lebih responsif daripada menjalankan ulang prompt pada pengatur waktu. Kalau yang Anda tunggu memang menghasilkan baris keluaran, itulah mekanisme yang lebih baik, dan layak Anda sebut namanya.
Loop tanpa argumen menjalankan prompt pemeliharaan bawaan: melanjutkan pekerjaan yang belum selesai, mengurus pull request branch saat itu, lalu menjalankan pembersihan ketika tidak ada lagi yang tertunda. Claude sengaja tidak memulai inisiatif baru di luar cakupan itu, dan aksi tak terbalikkan seperti push hanya dijalankan bila ia melanjutkan sesuatu yang sudah diizinkan transkrip. File loop.md menggantikan prompt itu dengan milik Anda — ia mendefinisikan satu default, bukan daftar tugas, dan sepenuhnya diabaikan kapan pun Anda menyertakan prompt di baris perintah.
# .claude/loop.md — replaces the built-in maintenance prompt
# for a bare /loop. Project-level wins over ~/.claude/loop.md.
# Plain Markdown, no required structure. Keep it under 25,000
# bytes; beyond that it is truncated.
Check the release/next PR. If CI is red, pull the failing job log,
diagnose, and push a minimal fix. If new review comments have
arrived, address each one and resolve the thread. If everything is
green and quiet, say so in one line.
# Edits take effect on the NEXT iteration, so you can refine the
# instructions while the loop is still running.Di balik layar Claude memakai tiga tool yang tidak pernah Anda panggil langsung — satu untuk membuat tugas, satu untuk mendaftarnya beserta ID dan jadwalnya, dan satu untuk membatalkan lewat ID. Tiap tugas mendapat ID delapan karakter, dan satu sesi menampung sampai 50 sekaligus. Ekspresinya cron lima field standar, dengan dua perilaku yang layak dipahami sebelum Anda menulis satu pun.
# CronCreate takes a standard 5-field expression:
# minute hour day-of-month month day-of-week
*/5 * * * * every 5 minutes
0 * * * * every hour on the hour
7 * * * * every hour at 7 minutes past
0 9 * * * every day at 9am LOCAL — not UTC
0 9 * * 1-5 weekdays at 9am local
30 14 15 3 * March 15 at 2:30pm local
# Day-of-week is 0 or 7 for Sunday through 6 for Saturday.
# Extended syntax — L, W, ? and aliases like MON or JAN — is
# NOT supported.
#
# When both day-of-month and day-of-week are constrained, a date
# matches if EITHER field matches. Standard vixie-cron semantics,
# and a reliable source of surprise.
CLAUDE_CODE_DISABLE_CRON=1 # kill the scheduler entirelySupaya tidak semua sesi di dunia menghantam API pada saat jam dinding yang sama, scheduler menambahkan offset deterministik pada waktu penyalaan. Offset itu diturunkan dari ID tugas, jadi tugas yang sama selalu mendapat offset yang sama — ia bukan acak tiap penyalaan, melainkan pergeseran tetap yang bisa Anda siasati:
Kalau ketepatan waktu memang penting, pilih menit yang bukan awal maupun tengah jam. Menjadwalkan pada menit ketujuh alih-alih tepat di jam melewatkan jitter sekali-jalan sepenuhnya, dan itu perubahan satu karakter pada ekspresinya. Ini hal paling berguna yang perlu diketahui tentang scheduler dan paling mudah terlewat.
Tugas berulang dalam sesi kedaluwarsa tujuh hari setelah dibuat. Tugasnya menyala satu kali terakhir, lalu menghapus dirinya. Ini batas yang disengaja atas berapa lama sebuah loop yang terlupakan boleh berjalan, dan itu default yang tepat — loop polling yang tak seorang pun ingat pernah dibuat adalah kebocoran token dan perhatian yang berjalan pelan. Kalau Anda butuh sesuatu yang tahan lama, itulah gunanya routine, tugas Desktop, dan pemicu terjadwal di CI.
Tugas hanya menyala selama Claude Code berjalan dan sedang idle. Menutup terminal menghentikannya. Tidak ada pula penyusulan: kalau waktu terjadwal terlewat saat Claude sibuk pada request panjang, tugasnya menyala sekali ketika Claude jadi idle, bukan sekali per interval yang terlewat. Polling lima menit yang beririsan dengan giliran dua puluh menit menghasilkan satu penyalaan, bukan empat.
Cakupan per sesi adalah keseluruhan desainnya, jadi aturan resume-nya mengikuti dari situ:
Aturan yang akhirnya saya pakai adalah mencocokkan mekanismenya dengan apa yang harus benar supaya pekerjaan itu berarti. Memeriksa sesuatu selagi saya memang sedang duduk di sana adalah loop sesi. Sesuatu yang harus terjadi entah saya di meja atau tidak adalah routine atau jadwal CI. Dan ketika yang saya tunggu memancarkan baris keluaran alih-alih menuntut pemeriksaan ulang, jawabannya sama sekali bukan penjadwalan — melainkan monitor, yang memberi tahu saya begitu sesuatu terjadi alih-alih bertanya tiap lima menit apakah sudah terjadi.
Sumber & bacaan lanjutan