Pelatih lari AI saya adalah sebuah repo Git dan satu agen Claude

Saya selesai berlari, jam tangan saya menyinkron, dan tiga menit kemudian analisisnya sudah tertulis di repositori saya, program pekan ini sudah disesuaikan, dan pelatih saya sudah meninggalkan komentar di bawah aktivitas Strava. Tanpa aplikasi yang dibangun, tanpa server yang ditulis, tanpa tagihan API per token: satu langganan Claude, AgentsRoom, dan berkas Markdown. Ini rakitan lengkapnya, bisa Anda tiru.

Saya menyelesaikan sesi latihan. Jam tangan saya menyinkron sendiri ke Strava, seperti biasa. Saya pergi mandi.

Begitu saya keluar, tiga hal sudah terjadi tanpa saya menyentuh apa pun. Analisis sesi itu sudah tertulis di repositori latihan saya. Program pekan ini sudah disesuaikan, dengan alasan perubahannya dicatat di sebelahnya. Dan di bawah aktivitas Strava ada komentar dari pelatih saya, yang memberi tahu berapa nilai sesi itu dan apa dampaknya untuk hari Jumat.

Pelatih itu bukan aplikasi yang saya bangun. Ia sebuah repositori Git berisi berkas Markdown, satu langganan Claude, dan AgentsRoom yang menyatukan semuanya. Tidak ada server yang ditulis, tidak ada tagihan per token, kira-kira satu akhir pekan untuk merakitnya.

Semuanya diterbitkan sebagai templat: github.com/AgentsRoomDev/running-performance-coach. Anda bisa mengklonanya dan menjadikannya milik Anda dengan mengisi bagian-bagian yang dikosongkan. Artikel ini menjelaskan cara kerjanya, sepotong demi sepotong, dengan asumsi Anda pernah mendengar kata "API" tapi belum pernah menulis webhook.

Sekadar konteks: saya sudah lama berlari, 2:47 di marathon, 1:13:59 di half marathon, 33:45 di 10 km. Target siklus latihan yang sedang berjalan adalah kembali menembus di bawah 34 menit untuk 10 km. Itu penting untuk bagian selanjutnya: pelatih generik yang menjelaskan ulang apa itu sesi threshold sama sekali tidak berguna buat saya, dan justru itulah masalah yang dipecahkan rakitan ini.

Yang terjadi antara akhir lari saya dan komentar itu

Rantai lengkapnya terdiri dari enam langkah:

  1. Jam tangan saya mengirim aktivitasnya ke Strava. Bagian itu sudah berjalan untuk semua orang.
  2. Tiap 15 menit, sebuah skrip Python kecil menanyai Strava apakah ada yang baru.
  3. Ketika ia menemukan sesi baru, ia membuat lembar sesi Markdown di repositori saya: lap, split, volume, detak jantung. Hanya data terukur.
  4. Ia juga menulis ulang judul dan deskripsi aktivitasnya di Strava, supaya beranda saya berhenti menampilkan "Lari Sore".
  5. Lalu ia mengirim pesan bertanda tangan ke AgentsRoom, yang membuka satu agen Claude dengan sesi itu sudah ada di tangannya.
  6. Agen itulah yang mengerjakan pekerjaan pelatih: ia membaca, ia membandingkan, ia menulis analisisnya, ia menyesuaikan pekannya, ia commit, ia push, ia berkomentar di Strava, ia mengirimi saya laporan panjang lewat email.

Lima langkah pertama hanyalah perpipaan. Yang keenam adalah pokok artikel ini.

Catatan latihan itu repositori Git, bukan basis data

Inilah keputusan yang mengubah segalanya, dan ini juga yang paling mengejutkan orang.

Satu sesi = satu berkas, journal/2026/2026-09-03.md. Satu pekan = satu berkas, plan/weeks/2026-W36.md. Satu perubahan program = satu commit, dengan alasannya di dalam pesan commit. Tidak ada basis data, tidak ada skema, tidak ada migrasi, tidak ada antarmuka.

Tiga akibatnya, berurutan menurut kepentingan:

Pelatihnya bisa membaca ulang riwayatnya sendiri. Ia tahu apa yang ia resepkan tiga pekan lalu, dan ia bisa mengecek apakah itu berhasil. Chatbot yang Anda ceritai sesi latihan Anda memulai dari nol di tiap percakapan. Agen yang punya repositori punya ingatan, dan ingatan itu bisa dibaca manusia.

Saya membaca program saya di ponsel, di aplikasi GitHub. Berkas README.md repositori itu bukan halaman perkenalan: itu dasbor saya. Kontrak yang tertulis di CLAUDE.md tegas soal ini, tidak ada perencanaan yang selesai sampai README mencerminkannya. Hasilnya: saya tidak punya antarmuka yang harus dirawat, tapi tetap punya layar yang memberi tahu apa yang saya lakukan hari ini.

Tidak ada yang tak bisa dibatalkan. Semua yang ditulis agennya adalah commit. Saya bisa membacanya, membantahnya, mengembalikannya. Itu sangat berbeda dari aplikasi yang memutuskan sendiri.

Langkah 1: Strava membangunkan sebuah skrip kecil

Strava membuka sebuah API: cara bagi sebuah program untuk meminta "berikan aktivitas terbaru atlet ini". Skrip strava_sync.py melakukan persis itu, lalu mengubah jawabannya jadi lembar sesi.

Bagian yang menarik bukan panggilan jaringannya, melainkan rekonstruksinya. Jam tangan merekam lap mentah. Skripnya harus menyimpulkan sesi apa itu tadi:

Lap 1  : 4.40 km in 26'07 (5:56/km)   ← pemanasan
Lap 2  : 1.00 km in 3'41  (3:41/km)   ← repetisi 1
Lap 3  : 0.20 km in 1'59  (9:55/km)   ← pemulihan
...                                     → "5 x 1000m r' 2'"

Ia mencoba semua pembagian berbentuk "k lap tercepat adalah repetisinya" dan menyimpan yang paling masuk akal. Kedengarannya sepele, padahal tidak: pengelompokan naif berdasarkan kecepatan langsung terjebak begitu ada pemanasan yang lebih cepat daripada pemulihan.

Yang terpenting, bentuk sesinya direkonstruksi dari jam tangan, tidak pernah dari program. Godaannya besar untuk melakukan sebaliknya (programnya bilang 5 x 1000m, ya tulis saja itu) dan itu justru kesalahannya: seluruh gunanya adalah mendeteksi hari-hari ketika saya melakukan sesuatu yang lain. Ketika keduanya berbeda, perbedaan itulah temuannya, dan pelatihnya melihat itu:

Rencana 3 x 8' → dilari nonstop

Dua peringatan sebelum Anda mulai.

API Strava mensyaratkan langganan pengembang berbayar sejak Juni 2026. Tanpa itu, tiap panggilan dijawab 403 Application Status Inactive. Jalan mundurnya ada dan sudah disiapkan di templat: ekspor berkas TCX dari jam tangan Anda lalu serahkan ke import_tcx.py. Semua yang ada di hilir impor bekerja persis sama.

Kuotanya longgar, tapi nyata. Di aplikasi saya, 300 permintaan tiap 15 menit dan 3.000 sehari untuk pembacaan. Skripnya memakai satu per lintasan dalam keadaan normal, jadi 96 sehari. Itu jauh dari batas atas, tapi ini jenis hal yang dicek sebelum, bukan sesudah.

Halaman pengaturan sebuah aplikasi API Strava: tingkat pengembang standar, ID klien, rahasia klien yang disamarkan, token akses dan token penyegar dalam cakupan baca, serta batas kuota yang ditampilkan, 600 permintaan tiap 15 menit dan 6.000 per hari secara keseluruhan, 300 tiap 15 menit dan 3.000 per hari untuk pembacaan.

Langkah 2: skripnya membangunkan agennya, dengan tanda tangan

Di sinilah bagian yang menarik.

Sebuah webhook adalah kebalikan dari sebuah pertanyaan. Alih-alih bertanya tiap lima menit apakah ada yang baru, Anda menyerahkan sebuah alamat web ke sebuah program, dan program itulah yang mengirimi Anda pesan saat kejadiannya terjadi. Anda tidak membayar apa pun selama tidak ada yang terjadi.

AgentsRoom menyediakan persis itu: sebuah pemicu webhook. Anda membuat pemicu di aplikasinya, ia mengembalikan sebuah URL dan sebuah rahasia. Siapa pun yang mengirim pesan JSON ke URL itu membuka sebuah agen, dengan prompt yang Anda tulis dan isi pesannya sudah disuntikkan ke dalamnya.

Pemilih alat AgentsRoom, dengan tooltip pada ikon Triggers yang berbunyi "Agent runs on a schedule or a webhook".

Pesan yang dikirim skrip saya sengaja dibuat sangat kecil:

{
  "type": "created",
  "title": "03/09 · 5 x 1000m r' 2'",
  "body": "Sesi 03/09/2026 diimpor dari Strava.\n\nSesi kualitas: 5 x 1000m r' 2'\nSplit: 3'41 - 3'40 - 3'38 - 3'40 - 3'35\n\nVolume total: 12.51 km dalam 1h07'42 (5:25/km), elevasi+ 56 m\nSesi yang direncanakan: RP10-5x1000\n\nLembar sesi: journal/2026/2026-09-03.md\nLembar pekan: plan/weeks/2026-W36.md"
}

Perhatikan apa yang tidak ada di sana: teks programnya. Webhook-nya membawa kode sesi yang direncanakan dan jalur ke lembar-lembarnya, tidak pernah isinya. Agen yang punya repositorinya akan pergi membacanya sendiri; agen yang tidak punya sama sekali tidak berhak menerima instruksi internal saya. Aturannya sama dengan deskripsi yang diterbitkan di Strava.

Tanda tangan, dan jebakan yang menyertainya

URL publik yang membuka sebuah agen tidak boleh tetap terbuka bagi siapa saja yang menemukannya. Maka pemicunya ditandatangani: skripnya menghitung sidik jari pesannya dengan rahasia bersama (sebuah HMAC-SHA256, kalau istilah itu berarti sesuatu bagi Anda) dan mengirimkannya di header X-AgentsRoom-Signature. Servernya menghitung ulang sidik jari yang sama di sisinya; kalau tidak cocok, ia menolak.

Tanpa tanda tangan, jawabannya tegas:

{"error":"REJECTED","message":"Signature missing."}

Dan inilah jebakannya, yang menghabiskan satu malam saya. Tanda tangan itu mencakup byte persis yang dikirim ke jaringan, bukan objek di memori. Kalau Anda menandatangani berkas seperti apa adanya di disk, lalu membiarkan lapisan lain menserialkan ulang objeknya (satu spasi tambahan, urutan kunci yang berbeda, aksen yang di-escape dengan cara lain), Anda mendapat tanda tangan yang sempurna sahnya untuk pesan yang tidak akan pernah diterima server. Penolakannya tidak bisa di-debug: semuanya kelihatan benar di kedua sisi.

Perbaikannya muat dalam satu kalimat: serialkan dan tandatangani di tempat yang sama. Di templatnya, fungsi post_json melakukan keduanya, dan tidak ada hal lain yang boleh menyentuh badan pesannya.

Langkah 3: tiga lapisan memberi tahu pelatihnya siapa dia, bagaimana aturan main di sini, dan apa yang harus dilakukan sekarang

Agen yang melatih bukan satu prompt raksasa. Ia tiga teks terpisah, dan pemisahan itu penting.

Lapisan 1, personanya: siapa dia

Sebuah prompt sistem yang dilekatkan ke agennya di AgentsRoom. Ia membawa filosofi latihannya, dan ia sengaja dibuat generik untuk semua olahraga: ia bisa melatih siapa saja.

Tugas Anda bukan sekadar menghasilkan program latihan. Anda melatih atletnya secara berkelanjutan dengan menganalisis latihannya, memahami kebugarannya saat ini, menyesuaikan sesi-sesi berikutnya. […] Bicaralah seperti pelatih berpengalaman, bukan seperti chatbot motivasi.

Ia juga menyebut apa yang tidak ia lakukan: tidak menilai sebuah sesi semata-mata dari apakah pace targetnya tercapai, terus terang soal ketidakpastian sebuah prediksi waktu lomba, dan tidak menyetujui sebuah target hanya karena atletnya menginginkannya. Baris terakhir itulah yang membuat pelatihnya berguna.

Anda tidak perlu menulisnya sendiri: persona ini diterbitkan di katalog agen AgentsRoom dengan nama Running Performance Coach. Satu klik memasangnya, siap dipakai.

Lapisan 2, CLAUDE.md: bagaimana aturan main di sini

Ini kontraknya, dibaca di awal tiap sesi. Ia memuat susunan berkasnya, aturan yang menjaganya tetap konsisten, prinsip latihan yang membatasi setiap usulan, dan yang terpenting ritualnya: urutan persis yang harus dijalankan ketika sebuah sesi dilaporkan.

Satu kutipan, karena ia menunjukkan tingkat presisinya:

Urutan pengorbanan ketika pekannya berantakan: pertama menit tambahan di lari ringan, lalu latihan kekuatan, lalu panjang lari panjangnya, lalu satu sesi kualitas. Jangan pernah seluruh pekannya.

Di sinilah pelatihnya berhenti jadi chatbot. Ia tidak mengarang alur kerja tiap kali, ia mengikuti alur yang saya tulis satu kali. Kalau Anda cuma mau membaca satu berkas dari repositori templat itu, bacalah yang itu.

Lapisan 3, prompt pemicunya: apa yang harus dilakukan sekarang

Ini pesan yang diserahkan ke agennya ketika sebuah sesi mendarat. Ia menerima aktivitasnya lewat variabel templat: {{event.title}}, {{event.body}}, {{event.url}}. Jadi agennya mulai dengan sesi itu sudah di tangan, bukan pergi mencarinya dulu.

Editor pemicu AgentsRoom, dengan nama "Coach · {{event.title}}" dan prompt pelatihnya, yang dibuka dengan "New session imported from Strava" lalu variabel event-nya, instruksi untuk membaca CLAUDE.md lebih dulu, peringatan bahwa ia berjalan tanpa pengawasan, dan langkah pertama ritualnya.

Ini kerangkanya, sebagaimana adanya di pemicu itu:

Sesi baru diimpor dari Strava.

**{{event.title}}** · aktivitas {{event.id}}
{{event.url}}

{{event.body}}

---

Kamu berada di repositori `training-plan`. Baca `CLAUDE.md` lebih dulu: itu
hukumnya. Kamu menulis dalam bahasa saya dan menyapa saya langsung di
sepanjang teks (§3).

Ritual §6 berlaku, tapi **langkah 1-nya sudah selesai**: `strava_publish.py`
sudah membuat lembar sesinya dan sudah meng-commit-nya. Kamu lanjut dari
langkah 2 sampai tuntas. Tiga keluaran, dalam urutan ini: **analisis di
repositori**, **komentar di bawah aktivitas Strava**, **email**.

⚠️ **Kamu berjalan tanpa pengawasan: tidak ada yang akan membaca pertanyaan.**
Jangan pernah minta keputusan: kamu yang memutuskan, kamu yang bertindak, dan
kamu sebutkan di laporanmu apa yang kamu putuskan dan kenapa.

## 1 · Analisis dan sesuaikan programnya (ritual §6, langkah 2 sampai 6)

1. `git pull --rebase` lebih dulu: lembarnya mungkin datang dari server.
2. Baca, dalam urutan ini: lembar hari ini, lembar pekannya,
   `athlete/zones-and-paces.md`, dan **3 lembar sesi terakhir**:
   sebuah sesi tidak pernah dinilai sendirian.
3. Tulis bagian `## Analysis`: **vonisnya dulu**, lalu sinyal-sinyal yang
   menopangnya, lalu apa yang berubah karenanya.
   ⛔ Kalau `## Analysis` sudah terisi, jangan ditulis ulang.
4. Perbarui lembar pekannya dan catat **setiap** perubahan program di bawah
   `## Adjustments`, beserta alasannya.
5. **Bangun ulang `README.md`**: itu layar yang saya baca di ponsel.
6. Commit dan push, jalur eksplisit, ⛔ jangan pernah `git add -A`.

## 2 · Kudos dan komentar di Strava
   ⛔ Komentar Strava itu PUBLIK: tanpa target detak jantung, tanpa keluhan
   kecil, tanpa pertimbangan internal, tanpa prediksi waktu finis.

## 3 · Laporan lengkap lewat email

Baris yang bekerja paling keras adalah yang di tengah: "tidak ada yang akan membaca pertanyaan". Agen yang berjalan tanpa siapa pun di depan layar lalu meminta keputusan bukan sedang berbuat salah, ia cuma berhenti, dan Anda baru tahu keesokan harinya.

Model mana, dan kenapa satu juta token bukan gaya-gayaan

PengaturanNilai
ModelClaude Opus, konteks 1M
Tingkat penalaranTinggi
Mode izinOtonom
Akses perambanAktif

Daftar pemicu AgentsRoom, dengan baris "Coach · {{event.title}}", label webhook, sumber "Any service (JSON)", proyek Running Performance Coach, dan pengaturan agennya: model Opus, penalaran tinggi, mode otonom, peramban aktif.

Konteks panjangnya bukan hiasan. Untuk menilai satu sesi dengan benar, pelatihnya membaca lembar hari ini, lembar pekannya, tabel pace acuan, dan tiga sesi sebelumnya. Sebuah sesi tidak pernah dinilai sendirian: beban yang menumpuk, urutan harinya, dan hal-hal yang sedang dipantau mengubah vonisnya sama sekali. Tiga repetisi di 3:38 sehari setelah lari panjang dua jam tidak bercerita hal yang sama dengan 3:38 yang sama setelah hari istirahat.

Mode otonom bukan kelalaian, itu konsekuensi: eksekusi tanpa siapa pun di depan layar tidak punya siapa pun untuk menyetujui sebuah git push. Dan akses peramban adalah yang memungkinkan agennya pergi berkomentar di Strava dan mengirim emailnya, dua hal yang di sini tidak punya API yang praktis.

Apa yang diotomatiskan, dan apa yang sengaja tidak

Ini keputusan desain yang paling saya senangi, dan gampang terlewat.

Pekerjaan impor itu mencatat dan menerbitkan, ia tidak pernah menilai.

Yang dilakukan skripnyaYang tidak ia lakukan
Mengambil aktivitas baruMengisi bagian Analysis
Membuat lembar sesinyaMenyentuh lembar pekannya
Menulis judul dan deskripsi di StravaMenyentuh pace acuannya
Meng-commit lembar yang ia buatMemberi pendapat apa pun

Skrip yang mulai menilai akan menghasilkan vonis tanpa konteks, dengan logika yang membeku di dalam kode yang tidak dibaca ulang siapa pun. Menilai berarti memegang bersama-sama beban pekannya, kondisi saat ini, dan apa yang dikatakan terakhir kali: itu pekerjaan pelatih, dan agennyalah yang mengerjakannya, dengan seluruh berkasnya di depan mata.

Manfaat praktisnya langsung terasa: ketika agennya tidak berjalan (mesin mati, API tumbang), lembarnya tetap ada. Tidak ada yang hilang, hanya komentarnya yang belum ada, dan satu pemutaran ulang sudah cukup.

Ada pilihan lain yang searah: skripnya tidak menyimpan berkas status untuk tahu apa yang sudah ia tangani. Deskripsi di Strava-lah yang jadi sumber kebenaran. Kalau kosong, ia menulis; kalau membawa tanda tangannya, ia lewat; kalau tidak kosong dan tanpa tanda tangan, berarti Anda yang menulisnya dan ia tidak menyentuhnya. Berkas status lokal tidak akan bisa mengatakan apa pun tentang apa yang sudah dikerjakan mesin lain; dengan cara ini, dua mesin bisa berjalan paralel tanpa saling menginjak.

Dua aturan pemisahan lagi, terpahat di repositorinya dan tidak boleh diakali:

  • deskripsi yang diterbitkan di Strava tidak pernah menyalin teks programnya: lembar pekan saya memuat target detak jantung dan pertimbangan yang sama sekali tidak pantas ada di aktivitas publik;
  • deskripsi yang ditulis tangan tidak pernah ditimpa.

Komentar yang mendarat di bawah aktivitasnya

Intinya bukan memuji diri sendiri. Intinya adalah vonis pelatihnya bisa dibaca dari ponsel saya, di bawah aktivitasnya, tanpa membuka repositorinya, dan vonis itu menetap di sana, melekat pada sesinya, selamanya.

Maka komentarnya sengaja dibuat sempit: satu emoji vonis, angka yang menopangnya, dan apa yang berubah untuk sesi berikutnya. Sekitar 250 karakter.

✅ Lima repetisi rata-rata 3'39 untuk target 3'38-3'44, dan detak jantung datar sepanjang blok. Tabel pace-nya masih valid. Jumat tetap ringan: margin pekan ini sudah kamu pakai.

Versi panjangnya, yang berisi detak jantung, hal yang saya tandai untuk dipantau, dan pertimbangan soal volume pekan depan, masuk ke repositori dan ke email. Dua kanal, dua khalayak, dan promptlah yang menjaga batas itu.

Tiga hal yang baru rusak di lapangan

Tiap baris ini ada karena ada sesuatu yang rusak tanpanya. Semuanya lebih instruktif daripada sisa artikel ini.

1. Kunci peramban mana yang dipakai. Saya punya dua ekstensi Claude yang terhubung di Chrome. Tidak ada yang menjamin yang mana yang didapat agennya, dan hanya satu yang memegang sesi Strava. Hasilnya: kira-kira satu dari dua kali jalan, agennya berakhir di peramban yang salah, dalam keadaan keluar akun, tidak bisa mengomentari apa pun. Pemilihan peramban lewat ID perangkat tidak bertahan dari satu sesi ke sesi berikutnya: jadi tempatnya di prompt, dengan larangan tegas untuk bertanya kepada pengguna harus pilih yang mana. Saat berjalan tanpa pengawasan, sebuah pertanyaan adalah kebuntuan.

2. Kolom komentar Strava tidak punya maxlength. Tidak ada apa pun di peramban yang mencegah Anda menulis terlalu panjang: server-lah yang menolak saat kirim. Agen yang menyusun paragraf indah sepanjang 600 karakter akan mengetik semuanya, mengklik "Post", lalu mendapat kegagalan yang tidak ia mengerti. Jadi promptnya harus memaksakan keringkasan sebelum menulis, dan menyiapkan skenarionya: kalau pengirimannya gagal, perpendek dan kirim ulang, jangan pernah dipecah jadi dua komentar.

3. Satu komentar pelatih per aktivitas. Ketika Anda memutar ulang sebuah kejadian untuk menguji (dan di awal Anda banyak melakukannya), tanpa aturan ini agennya akan menumpuk komentar di aktivitas yang sudah ditangani. Jadi promptnya menyuruhnya membaca tab "Comments" sebelum menulis, dan melewatkan gilirannya kalau ia sudah ada di sana. Logika yang sama di sisi repositorinya: kalau bagian ## Analysis sudah terisi, ia tidak ditulis ulang.

Berapa biayanya

BagianDi manaBiaya
Agen pelatihnyaMesin saya, lewat AgentsRoomlangganan Claude saya
Polling 15 menitSatu mesin Linux kecil yang selalu menyala~5 €/bulan, atau nol di Raspberry Pi
CatatannyaSatu repositori Git privatgratis
API StravaStrava Developer Programlihat harga dari Strava

Di rakitan ini tidak ada kunci API yang ditagih per token. Itu poin yang menurut saya paling diremehkan: hal yang sama, kalau dibangun di atas API berbayar per pemakaian, akan punya argometer yang berjalan di tiap sesi, dan mungkin saya sudah tidak memakainya lagi sekarang.

Rakit akhir pekan ini

Langkah-langkahnya, berurutan. Siapkan satu malam kalau Anda sudah punya akun Strava dan langganan Claude.

1. Klona templatnya dan jadikan milik Anda.

git clone https://github.com/AgentsRoomDev/running-performance-coach.git my-coach
cd my-coach
rm -rf .git && git init

Jadikan salinan Anda privat. Catatan latihan memuat data kesehatan: detak jantung, tidur, cedera. Templatnya publik, salinan Anda sebaiknya tidak.

Lalu isi, dalam urutan ini: athlete/profile.md (siapa Anda sebagai pelari), athlete/records.md (rekor pribadi Anda), athlete/constraints.md (slot waktu yang benar-benar Anda punya), athlete/zones-and-paces.md (pace acuan Anda), plan/objective.md (lombanya dan targetnya), lalu CLAUDE.md, tempat Anda mengganti setiap penanda {{...}}.

Terakhir, buka repositorinya dengan agen Claude Anda dan katakan: "baca CLAUDE.md dan athlete/, lalu susunkan pekan pertama saya."

2. Hubungkan Strava.

cp .env.example .env && chmod 600 .env
python3 scripts/strava_oauth.py     # satu klik di peramban, sekali saja
python3 scripts/strava_sync.py --dry-run

Opsi --dry-run mencetak apa yang akan ditulis tanpa menulis apa pun. Itulah saatnya mengecek apakah rekonstruksi sesinya sudah cocok buat Anda.

3. Buat pemicunya di AgentsRoom. Di bawah Triggers, New trigger:

KolomNilai
JenisWebhook, sumber generic
Promptisi dari docs/trigger-prompt.md
Peran / personadocs/coach-persona.md
Mode izinOtonom
Akses perambanAktif

AgentsRoom mencetak sebuah URL dan sebuah rahasia penandatanganan. Taruh keduanya di .env Anda:

WEBHOOK_URL=https://agentsroom.dev/api/triggers/t_xxxxxxxxxxxx
WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxxxxxxxx

4. Uji dulu sebelum mempercayainya.

python3 scripts/webhook_replay.py scripts/examples/webhook-session.json --dry-run
python3 scripts/webhook_replay.py scripts/examples/webhook-session.json

Ini memutar ulang sebuah sesi ke pemicunya tanpa menunggu lari Anda berikutnya dan tanpa mengganggu status pekerjaan otomatisnya. Anda semestinya melihat ✅ HTTP 202, dan sebuah tab agen semestinya terbuka di AgentsRoom.

5. Jalankan tiap 15 menit.

bash scripts/systemd/install.sh          # di server Linux

Sebuah unit oneshot plus sebuah timer: tidak ada proses yang menetap di memori, dan lintasan yang terlewat saat mesinnya mati akan disusul pada boot berikutnya.

Kalau Anda tidak punya mesin yang selalu menyala, lewati langkah ini: jalankan strava_sync.py secara manual kapan pun Anda mau, atau cukup ceritakan sesi Anda ke agennya lewat percakapan. Ritual di CLAUDE.md bekerja persis sama. Yang hilang otomatisasinya, bukan pelatihnya.

Yang saya ambil dari sini, di luar urusan lari

Tidak ada satu pun bagian dari rakitan ini yang khusus untuk lari. Yang ia tunjukkan adalah pola yang bisa dipakai ulang untuk hampir semua bidang tempat Anda menumpuk data pribadi dan ingin ada pendapat yang kompeten atasnya.

Tiga bagian, itu saja. Sebuah repositori Git berisi berkas Markdown sebagai ingatan yang bisa dibaca mesin maupun Anda sendiri. Sebuah kejadian yang membangunkan agen alih-alih agen yang menanyai terus-menerus dalam lingkaran dan membakar token percuma. Tiga lapisan konfigurasi yang memisahkan dengan rapi siapa agennya, bagaimana ia bekerja di tempat Anda, dan apa yang harus ia lakukan sekarang.

Ganti "sesi lari" dengan "rekening koran", "sesi coding", "hasil gula darah" atau "catatan bacaan": mekanismenya tidak berubah.

Pertanyaan yang sering diajukan

Apakah saya harus bisa coding untuk membuat pelatih lari AI?

Anda cukup bisa menjalankan satu perintah di terminal dan menyunting berkas teks. Repositori templatnya siap diklona, skrip Python-nya hanya memakai pustaka standar (tanpa pip install), dan bagian coaching-nya dikonfigurasi dengan menulis prosa biasa di berkas Markdown. Pekerjaan yang sesungguhnya bukan urusan teknis: yaitu menggambarkan dengan jujur siapa Anda sebagai pelari dan apa yang Anda tuju.

Berapa biayanya per bulan?

Agennya berjalan di langganan Claude yang sudah Anda punya (Pro atau Max): tidak ada kunci API yang ditagih per token. Di luar itu Anda mungkin ingin satu mesin kecil yang selalu menyala untuk menanyai Strava tiap 15 menit, sekitar 5 euro sebulan di VPS, atau nol rupiah di Raspberry Pi. Repositori Git privatnya gratis. Sisanya tinggal API Strava, yang sejak Juni 2026 mensyaratkan langganan pengembang berbayar.

Kenapa repositori Git, bukan basis data?

Karena riwayatnya jadi bisa dibaca, oleh pelatihnya maupun oleh Anda. Setiap sesi adalah berkas Markdown, setiap perubahan program adalah commit beserta alasannya. Agennya bisa membaca ulang apa yang ia resepkan tiga pekan lalu dan mengecek apakah itu berhasil, dan Anda membaca program Anda di ponsel lewat aplikasi GitHub, tanpa menulis satu baris antarmuka pun.

Apa itu webhook, dengan bahasa sederhana?

Webhook adalah layanan yang menelepon Anda, bukan Anda yang meneleponnya. Alih-alih bertanya tiap lima menit apakah ada yang baru, Anda menyerahkan sebuah alamat web ke sebuah program, dan program itu mengirimi Anda pesan saat kejadiannya terjadi. Di sini, skrip yang mengimpor sesi mengirim pesan itu ke AgentsRoom, yang membuka satu agen Claude dalam hitungan detik. Itu juga yang membuat rakitan ini murah: agen yang menanyai terus-menerus dalam lingkaran membakar token di tiap giliran, sementara pemicu webhook tidak memakan biaya sampai ada sesuatu yang terjadi.

Apakah ini bisa dipakai untuk olahraga selain lari?

Bisa. Impornya merekonstruksi lap dari jam tangan, dan bersepeda serta berenang juga merekam lap. Yang berubah adalah berkas strategi dan katalog sesinya, dan itu semua teks yang Anda tulis ulang. Mekanismenya (impor, webhook, agen, repositori) tidak bergeser.

Bisakah agennya salah dan merusak program latihan saya?

Ia bisa salah, tapi tidak bisa merusak banyak: semua yang ia tulis adalah commit Git yang bisa Anda baca, bantah, dan kembalikan. Berkas CLAUDE.md secara eksplisit melarangnya menulis ulang riwayat, mengarang data yang tidak Anda berikan, mengubah program tanpa mencatat alasannya, dan memberi nasihat medis. Kalau ada nyeri yang mencurigakan, ia mengarahkan Anda ke tenaga profesional.


Repositori templatnya ada di sini: AgentsRoomDev/running-performance-coach. Klona, isi pace Anda, dan pelatih Anda siap. Kalau Anda ingin melihat bagian yang membangunkan agennya, itu dijelaskan di halaman pemicu webhook, dan AgentsRoom bisa diunduh di sini.

Unduh AgentsRoom

Jalankan semua agen AI Anda, di semua proyek Anda, dari satu jendela.

GratisUnduh AgentsRoom

Aplikasi pendamping: pantau agen Anda saat bepergian

Gunakan Claude, Codex, Antigravity CLI, atau penyedia AI lainnya.

Dapatkan ekstensi
Chrome Web Store

Kirim bug dan permintaan langsung ke backlog publik Anda.

Sekilas AgentsRoom dalam aksi.

Beberapa proyek
Multi-penyedia
Beberapa agen
Status langsung
File diff & commit
Pendamping mobile
Pratinjau langsung
Tim agen
Otomatisasi browser
Dev berbasis backlog
Pustaka prompt
Pustaka skill
Lihat semua fitur

Lanjutkan membaca