Versi Sama, Isi Beda: Rebase Skill Claude Code yang Drift
File skill lokal dan upstream sama-sama tertulis 2.2.1, tapi isinya sudah berbeda jauh. Pelajaran cara me-rebase skill tanpa mewarisi drift.
Ringkasan
Dugaan saya salah banget: versi sama di frontmatter ternyata nggak jamin isinya sama, salinan lokal SKILL.md udah ditulis ulang sampai doktrin keamanannya kebalik. Jadi filenya direbase biar identik sama upstream, terus semua aturan lokal dipindah ke references dan script wrapper. Pelajarannya, jangan percaya angka versi, selalu byte-compare, dan taruh tambahan di lapisan atas.
Versi sama, isinya beda
Pagi itu saya buka skills/autonomous-ai-agents/claude-code/SKILL.md di repo konfigurasi Hermes saya. Yang saya cari adalah doktrin delegasi yang biasa saya tempel di sana; yang saya temukan justru kebalikannya. Di file lokal itu, flag --dangerously-skip-permissions dibawakan seperti opsi biasa yang layak dipakai kapan saja. Padahal di upstream, flag ini dicadangkan khusus untuk lingkungan terisolasi, dan dialog peringatannya sengaja dibuat default ke "No, exit" [1]. Doktrin keamanannya terbalik, di instalasi produksi sendiri.
Saya periksa frontmatter. Tertulis versi 2.2.1. Versi di upstream juga 2.2.1. Nalar pertama saya waktu itu sederhana: kalau nomor versinya sama, berarti isinya sama, mungkin cuma selisih format kecil. Perbandingan byte-per-byte terhadap file mentah upstream membuktikan sebaliknya. Salinan lokal sudah ditulis ulang cukup jauh, sementara SKILL.md upstream punya sekitar 754 baris. Angka versi di frontmatter ternyata bukan indikator keaslian isi. Siapa pun yang menyalin lalu mengedit file itu bisa saja lupa memperbarui angkanya, dan tidak ada mekanisme apa pun yang membunyikan alarm. Angka itu juga hidup di namespace sendiri: versi rilis Hermes, versi frontmatter skill, dan versi CLI Claude Code adalah tiga hal yang berbeda, dan menyamakan salah satunya dengan keaslian isi adalah jebakan yang hampir memakan saya.
Kenapa edit langsung itu jebakan
Format skill modern memang dirancang supaya tidak perlu ada yang diedit paksa. Satu skill adalah folder berisi SKILL.md minimal dengan nama dan deskripsi, ditambah folder opsional seperti references/, scripts/, atau assets/ [3]. Agen memuatnya lewat progressive disclosure: tahap discovery hanya membaca nama dan deskripsi, tahap activation baru menarik isi instruksi saat tugasnya relevan, tahap execution menjalankan script atau membaca berkas pendamping seperlunya. Claude Code mengikuti standar terbuka yang sama [2]. Artinya, doktrin lokal punya tempat alami di lapisan pendamping, tanpa perlu menyentuh inti skill sama sekali.
Dari sanalah rebase kali ini dijalankan. SKILL.md dikembalikan byte-identik dengan file upstream. Semua doktrin delegasi proyek dipindahkan ke references/delegation-workflow.md: gerbang penajaman prompt, whitelist tool per tugas, larangan permanen untuk git commit dan push. Jalur eksekusinya lewat scripts/cc-delegate.sh, wrapper yang memanggil CLI dalam print mode -p sekali jalan tanpa dialog interaktif [4]. Tidak ada flag bypass di wrapper itu, sesuai postur upstream yang ketat soal izin.
Hermes sendiri sebenarnya sudah antisipasi masalah fork seperti punya saya dulu. Saat sinkronisasi skill bawaan, Hermes mencatat origin hash tiap skill di .bundled_manifest. Pada pembaruan berikutnya, salinan lokal yang isinya berubah dianggap milik pengguna dan dilewati selamanya supaya editan tidak ditimpa senyap [5]. Proteksi ini bagus untuk menjaga editan, tapi buruk kalau editannya memang seharusnya tidak ada. Selama SKILL.md lokal berbeda dari upstream, setiap pembaruan upstream harus diperiksa manual satu per satu, dan justru di situ drift keamanan seperti inversi doktrin bypass bisa bertahan lama tanpa terlihat.
Layering di atas upstream
Rebase ini berhasil mulus justru karena tidak ada yang perlu di-merge. Inti skill kembali murni seperti maksud pembuatnya, doktrin lokal naik ke lapisan atas dengan status yang jelas sebagai tambahan lokal. Konsekuensinya terasa di siklus pembaruan berikutnya: diff terhadap upstream tinggal ditarik, tidak ada konflik yang harus diadili baris demi baris. Bandingkan dengan skenario fork: setiap rilis upstream memaksa kita membaca ulang ratusan baris untuk memutuskan mana yang layak dipertahankan, dan biasanya yang menyerah duluan adalah pemeriksaan keamanannya.
Polanya gampang direplikasi. Aturan spesifik proyek masuk ke references/ sebagai dokumen pendamping. Automasi yang butuh eksekusi masuk ke scripts/ sebagai wrapper yang memanggil antarmuka standar upstream, bukan menimpanya. Yang perlu dijaga cuma satu disiplin: kalau harus menyentuh SKILL.md, berarti ada yang salah dengan desain layering-nya, bukan dengan skill-nya.
Pelajaran yang saya bawa pulang cukup satu. Kalau menemukan nomor versi yang sama di file lokal dan upstream, jangan langsung percaya; lakukan byte-compare terhadap file mentah, selalu. Dan kalau butuh menambah aturan, taruh di lapisan atas lewat references/ atau wrapper script. Inti upstream tetap utuh, pembaruan berikutnya tinggal ditarik tanpa drama, dan doktrin keamanan tidak bisa diam-diam terbalik tanpa ada yang sadar.