Commit Tanpa Diff: Menghapus Integrasi Pihak Ketiga
Commit penghapusan integrasi berakhir tanpa satu baris kode berubah. Di sinilah letak asimetri antara memasang dan membongkar layanan pihak ketiga.
Ringkasan
Commit hapus integrasi Plane tuh unik banget, nggak ada satu baris kode pun yang diubah. Soalnya bersihin integration tuh bukan cuma urusan kode: kredensial dicabut di dasbor vendor, cache mcp-remote dibersihin, entitlement billing dicek, sisa config dibenerin biar circuit breaker nggak error mulu. Jadi mulai sekarang, rencana copot integration harus disiapin sejak mau pasang, ya.
Commit dengan pesan "remove plane-gate integration (Plane no longer used)" muncul di repositori sebuah proyek portal bernama KotaPortal. Statistik diff-nya menunjukkan angka yang tidak biasa: 0 additions, 0 deletions, 0 files changed. Tidak ada satu baris pun kode yang disentuh, tetapi integrasinya dinyatakan sudah tidak dipakai. Pembersihan yang sesungguhnya ternyata tidak terjadi di dalam commit itu.
Asumsi yang keliru
Asumsi paling umum saat membaca commit seperti ini: menghapus integrasi pihak ketiga cukup dengan membuang modul atau paket terkait dari basis kode. Begitu modulnya hilang, sistem dianggap bersih dan pekerjaan selesai.
Kenyataannya, kredensial, cache, dasbor, dan dokumentasi sering bertahan lebih lama daripada kode itu sendiri. Memutus integrasi secara bersih adalah proses instalasi terbalik dengan daftar periksa yang berbeda. Kode hanya ujung dari ekosistem yang lebih luas, sementara jejak operasionalnya tersebar di beberapa lapisan infrastruktur.
Mekanisme di balik layar
Doktrin backing-services dari 12-Factor menjelaskan mengapa hal ini bisa terjadi [1]. Kode seharusnya tidak membedakan layanan lokal dan layanan pihak ketiga; keduanya diperlakukan sebagai sumber daya terlampir yang diakses lewat URL atau kredensial yang disimpan di konfigurasi. Konsekuensinya, sumber daya itu memang dirancang bisa dilepas kapan saja. Hanya saja bagian yang dilepas bukan cuma kode: locator dan kredensialnya tertinggal di konfigurasi, dan penyedia layanan menyimpan status akses di sisinya.
Di sisi vendor Plane, pelepasan akses punya mekanisme sendiri. Autentikasi API memakai header X-API-Key untuk personal access token, dan kunci yang tidak valid atau kedaluwarsa langsung mengembalikan kegagalan autentikasi [2]. Permukaan alat Plane MCP juga sering berubah: versi 0.2.x punya 177 alat per operasi, versi 0.3.0 menyusut menjadi 28 alat sumber daya (169 di antaranya dipertahankan sebagai alias tersembunyi, 7 lainnya mengembalikan pesan pengganti), sampai versi 0.3.3 menjadi 30 alat dengan 207 tindakan. Panduan header-nya pun berganti dari x-api-key menjadi header Authorization dengan skema Bearer [3]. Dokumen yang sama menuliskan sisi offboarding: cabut akses dengan memutus konektor di klien, hapus PAT di pengaturan Plane, atau bersihkan cache mcp-remote. Kode 401 berarti token salah atau sudah dicabut; 402 berarti fiturnya tidak termasuk paket langganan.
Di tingkat runtime, konfigurasi lama yang tertinggal bisa memicu mekanisme pertahanan milik sendiri. Circuit breaker bekerja sebagai state machine dengan tiga keadaan utama: CLOSED, OPEN, dan HALF_OPEN. Saat tingkat kegagalan menyentuh ambang, misalnya 50 persen, breaker berpindah ke keadaan OPEN dan menolak panggilan berikutnya dengan CallNotPermittedException [4]. Integrasi yang sudah dihapus tetapi masih dipanggil oleh sisa konfigurasi akan membusukkan jendela kegagalan itu terus-menerus; penjaga yang semula melindungi sistem berubah menjadi sumber error rutin.
Cache klien adalah residu yang paling mudah terlewat karena tidak pernah muncul di repositori mana pun. Dokumentasi Plane MCP mencatat satu kasus konkret: kredensial OAuth yang tersimpan di cache mcp-remote bertahan meski sisi server sudah berubah, dan menghapusnya berarti menghapus satu direktori cache yang dipakai bersama semua server mcp-remote kecuali dipisah lewat variabel khusus [3]. Halaman yang sama juga menyarankan memeriksa audit log ruang kerja untuk peristiwa terkait token API. Dua lokasi ini sama sekali tidak tersentuh oleh commit mana pun di repositori.
Diagnosis saat pembongkaran pun punya kamusnya sendiri. 401 dengan token yang semula valid biasanya berarti token sudah dicabut, sedangkan 402 menunjukkan fitur yang dicari tidak termasuk paket langganan saat itu [3]. Kedua kode ini justru berguna sebagai alat verifikasi: setelah semua kredensial dicabut, panggilan tersisa dari sistem yang lupa dibersihkan akan berhenti dengan 401, bukan dengan error yang mengarah ke bug lain.
Lapisan penagihan pun punya residunya masing-masing. Sebuah entitlement merepresentasikan akses pelanggan terhadap sebuah fitur, dan penyedia seperti Stripe mengirim notifikasi untuk provisioning maupun de-provisioning akses mengikuti status langganan [5]. Status yang tidak disinkronkan berarti akses yang masih terbuka tanpa pengawasan, atau fitur yang masih dihitung pada paket yang sebenarnya sudah ditinggalkan.
Asimetri pemasangan dan pembongkaran
Arah pemasangan dan pembongkaran tidak simetris. Tabel berikut meringkas di mana letak perbedaannya.
| Aspek | Saat pemasangan | Saat pembongkaran |
|---|---|---|
| Kredensial | Dibuat lalu disimpan di konfigurasi | Dicabut secara manual di dasbor vendor |
| Konfigurasi | Ditambahkan ke variabel lingkungan | Dihapus dari repositori dan lingkungan |
| Penjaga runtime | Diatur untuk mengizinkan lalu lintas | Harus dinonaktifkan agar tidak memicu error |
| Cache | Terisi untuk mempercepat respons | Harus dibersihkan secara paksa |
| Dokumentasi | Diperbarui dengan endpoint baru | Harus diarsipkan atau dihapus |
Pola yang terlihat jelas: pekerjaan pembongkaran justru menumpuk di luar repositori. Kredensial dicabut di dasbor vendor, cache dibersihkan di sisi klien, entitlement diverifikasi di sisi penagihan, dan commit tanpa diff itu hanya penanda bahwa semuanya sudah selesai. Keputusan yang diambil dari kasus ini sederhana pada penulisan tetapi mahal pada pelaksanaan: sebuah integrasi baru hanya dianggap terpasang jika rencana pembongkarannya sudah tertulis sejak awal, lengkap dengan daftar sisi vendor yang harus disentuh saat tiba waktunya melepas.