<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>changeloop blog</title><description>Praktik catatan rilis, dan changelog sebagai artefak build.</description><link>https://changeloop.dev/</link><language>id-ID</language><item><title>Release notes perbaikan bug: cara menulis entri yang berguna</title><link>https://changeloop.dev/blog/id/bug-fix-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/bug-fix-release-notes/</guid><description>Release notes perbaikan bug berhasil bila tiap entri menyebut gejala, siapa yang terkena, dan langkah berikutnya. Ada contoh sebelum dan sesudah.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Release notes perbaikan bug yang baik menjelaskan apa yang dilihat pengguna salah, bukan apa yang salah di kode. Setiap entri menyebut siapa yang terdampak, sejak kapan, apakah perbaikannya tuntas, dan apakah pembaca perlu melakukan sesuatu, meskipun itu hanya &amp;quot;tidak ada tindakan yang diperlukan&amp;quot;.&lt;/p&gt;
&lt;p&gt;Kebanyakan tim menyalin satu baris dari pesan commit. Tabel di bawah menunjukkan enam penulisan ulang, dan bagian sesudahnya menjelaskan aturannya.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sebelum (pesan commit)&lt;/th&gt;
&lt;th&gt;Sesudah (gejala)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Fixed null pointer in export handler&lt;/td&gt;
&lt;td&gt;Ekspor tidak lagi gagal dengan &amp;quot;Terjadi kesalahan&amp;quot; ketika proyek tidak punya tag. Jalankan ulang ekspor yang gagal sejak 3 September.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolved race condition in sync worker&lt;/td&gt;
&lt;td&gt;Edit di dua perangkat dalam selang beberapa detik tidak lagi saling menimpa. Tidak ada yang perlu dilakukan.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fix timezone bug&lt;/td&gt;
&lt;td&gt;Laporan terjadwal kini berjalan pada waktu yang Anda atur. Akun di timur UTC melihat laporan datang hingga sehari lebih awal sejak 12 Agustus. Tidak perlu perubahan.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Patched XSS in comment renderer&lt;/td&gt;
&lt;td&gt;Perbaikan keamanan: komentar yang dirancang khusus bisa menjalankan skrip di browser pengguna lain. Upgrade ke 4.2.1 hari ini. Kami tidak melihat eksploitasi di log kami.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed regression from 4.1.0&lt;/td&gt;
&lt;td&gt;Pencarian berfungsi lagi untuk kueri yang mengandung tanda hubung. Rusak di 4.1.0 dan diperbaiki di 4.1.1.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bug fixes and performance improvements&lt;/td&gt;
&lt;td&gt;Sebutkan yang mana. Lihat bagian terakhir.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Bagaimana menulis entri perbaikan bug di release notes?&lt;/h2&gt;
&lt;p&gt;Mulai dengan gejala dalam kata-kata pengguna, lalu siapa yang terdampak dan sejak kapan, lalu
status perbaikannya, lalu tindakannya. Satu atau dua kalimat biasanya cukup. Penyebab di kode
milik pull request, tempat engineer akan mencarinya.&lt;/p&gt;
&lt;p&gt;Pembaca memindai satu hal: &amp;quot;apakah ini saya?&amp;quot; Empat bagian mencakup hampir setiap entri:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Gejalanya.&lt;/strong&gt; Apa yang muncul di layar, di respons API, atau di invoice. Kutip teks error jika
ada, karena orang mencarinya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cakupannya.&lt;/strong&gt; Paket, platform, versi API, atau bentuk data mana. &amp;quot;Akun dengan lebih dari
50.000 baris&amp;quot; bisa dicek. &amp;quot;Sebagian pengguna&amp;quot; tidak.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rentang waktunya.&lt;/strong&gt; Sejak rilis atau tanggal berapa, agar pembaca bisa menilai apakah hasil
aneh kemarin adalah bug itu.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tindakannya.&lt;/strong&gt; Jalankan ulang, sinkronkan ulang, upgrade, hapus workaround, atau tidak sama
sekali.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jika pengguna membuat workaround, baris tindakan adalah tempat Anda memberi tahu bahwa mereka bisa
menghapusnya.&lt;/p&gt;
&lt;h2&gt;Apa perbedaan antara release note dan changelog?&lt;/h2&gt;
&lt;p&gt;Changelog adalah catatan lengkap dan berkelanjutan tentang perubahan. Release notes adalah pesan
terpilih yang ditulis ulang tentang satu rilis untuk orang yang sedang menentukan apakah mereka
peduli. Untuk perbaikan bug, changelog mendaftar setiap perbaikan dan catatan memimpin dengan yang
mungkin disadari pembaca.&lt;/p&gt;
&lt;p&gt;Salah ketik di tooltip hanya masuk changelog. Tarif pajak yang salah di invoice masuk keduanya.
Pembagian lengkapnya ada di &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-vs-release-notes/&quot;&gt;changelog vs release notes&lt;/a&gt;, dan
bentuk catatan yang baik ada di &lt;a href=&quot;https://changeloop.dev/blog/id/how-to-write-release-notes/&quot;&gt;cara menulis release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt; adalah konvensi yang praktis untuk sisi
pencatatan. Ia menyediakan &amp;quot;Fixed&amp;quot; untuk perbaikan bug dan judul &amp;quot;Security&amp;quot; tersendiri untuk
kerentanan, pembagian yang sama dengan yang dibuat artikel ini untuk pembaca.&lt;/p&gt;
&lt;h2&gt;Apakah perbaikan bug termasuk update?&lt;/h2&gt;
&lt;p&gt;Ya. Perbaikan bug mengubah produk, jadi merilisnya adalah sebuah update. Menurut
&lt;a href=&quot;https://semver.org/&quot;&gt;semantic versioning&lt;/a&gt;, perbaikan yang kompatibel ke belakang adalah rilis
patch, misalnya 4.2.0 ke 4.2.1.&lt;/p&gt;
&lt;p&gt;Apakah pembaca harus melakukan sesuatu adalah pertanyaan terpisah, dan catatan harus menjawabnya.
Perbaikan yang mengubah apa yang diamati pemanggil yang benar sudah mendekati breaking change, dan
&lt;a href=&quot;https://changeloop.dev/blog/id/breaking-changes/&quot;&gt;breaking changes&lt;/a&gt; menjelaskan di mana batasnya.&lt;/p&gt;
&lt;h2&gt;Kapan perbaikan mendapat entri sendiri, dan kapan menjadi perbaikan kecil?&lt;/h2&gt;
&lt;p&gt;Beri perbaikan entri sendiri ketika pengguna bisa saja menyadari bug itu, kehilangan waktu atau
data karenanya, atau membuat workaround. Kelompokkan di bawah daftar singkat &amp;quot;Perbaikan kecil&amp;quot;
ketika tidak ada orang di luar tim Anda yang bisa melihatnya. Nilai dari pengalaman pembaca, bukan
ukuran diff.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mendapat entri sendiri&lt;/th&gt;
&lt;th&gt;Masuk daftar perbaikan kecil&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Dilaporkan pelanggan atau dialami banyak orang&lt;/td&gt;
&lt;td&gt;Cacat kosmetik di layar yang jarang dibuka&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menyebabkan output salah, job gagal, atau pekerjaan hilang&lt;/td&gt;
&lt;td&gt;Salah ketik, spasi, ikon yang tidak sejajar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Butuh tindakan dari pembaca&lt;/td&gt;
&lt;td&gt;Perbaikan di alat internal atau halaman admin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regresi dari rilis terbaru&lt;/td&gt;
&lt;td&gt;Kegagalan yang hanya terlihat di lingkungan tes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menyentuh penagihan, izin, atau data&lt;/td&gt;
&lt;td&gt;Teks log, bump dependensi tanpa efek bagi pengguna&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Setiap baris dalam kelompok itu tetap harus mengatakan sesuatu: &amp;quot;Memperbaiki beberapa masalah UI&amp;quot;
hanyalah placeholder.&lt;/p&gt;
&lt;h2&gt;Bagaimana menulis tentang regresi?&lt;/h2&gt;
&lt;p&gt;Sebutkan rilis yang memperkenalkannya, sebut itu regresi, dan beri rilis yang memperbaikinya. Orang
yang terkena bug itu sudah tahu ada yang rusak, jadi pengakuan singkat dan langsung lebih berguna
bagi mereka daripada kata-kata yang samar.&lt;/p&gt;
&lt;p&gt;Misalnya: &amp;quot;Hasil pencarian untuk kueri yang mengandung tanda hubung kosong di 4.1.0. Ini sudah
diperbaiki di 4.1.1. Jika Anda mengubah kueri untuk menghindari tanda hubung, Anda bisa
mengembalikannya.&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;Meningkatkan keandalan pencarian&amp;quot; terbaca sebagai berkelit bagi siapa pun yang kehilangan satu
sore karena bug itu. Jika penyebabnya masih dikonfirmasi, katakan, seperti yang dinyatakan panduan
&lt;a href=&quot;https://changeloop.dev/blog/id/emergency-release-notes/&quot;&gt;release notes darurat&lt;/a&gt;: jangan biarkan catatan terdengar lebih
yakin daripada tim.&lt;/p&gt;
&lt;h2&gt;Bagaimana mengumumkan perbaikan keamanan?&lt;/h2&gt;
&lt;p&gt;Nyatakan tingkat keparahan dengan jelas, sebut versi yang terdampak dan versi yang memperbaikinya,
katakan seberapa mendesak upgrade-nya, dan sertakan pengenal CVE jika ada. Terbitkan detail hanya
setelah pengguna bisa bertindak atas perbaikan, mengikuti proses pengungkapan terkoordinasi ketika
ada pelapor.&lt;/p&gt;
&lt;p&gt;Urutannya penting: pelapor memberi tahu Anda secara privat, Anda merilis perbaikan, dan catatan
publik terbit ketika pengguna bisa melindungi diri. &lt;a href=&quot;https://www.cisa.gov/coordinated-vulnerability-disclosure-process&quot;&gt;Proses pengungkapan kerentanan terkoordinasi
CISA&lt;/a&gt; mengoordinasikan pelaporan,
analisis, dan pengungkapan publik kerentanan. &lt;a href=&quot;https://www.cve.org/ResourcesSupport/AllResources/CNARules&quot;&gt;Aturan CVE Numbering
Authority&lt;/a&gt; mengatur bagaimana catatan
CVE diberikan dan diterbitkan, dan di GitHub
&lt;a href=&quot;https://docs.github.com/en/code-security/security-advisories/working-with-repository-security-advisories/about-repository-security-advisories&quot;&gt;repository security advisory&lt;/a&gt;
memungkinkan Anda menyusun advisory secara privat dan meminta pengenal.&lt;/p&gt;
&lt;p&gt;Entri keamanan biasanya memuat empat fakta:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apa yang bisa dilakukan penyerang, dalam satu kalimat dan tanpa proof of concept.&lt;/li&gt;
&lt;li&gt;Versi yang terdampak, dan versi yang memperbaikinya.&lt;/li&gt;
&lt;li&gt;Seberapa mendesak: &amp;quot;upgrade hari ini&amp;quot; atau &amp;quot;upgrade pada rilis Anda berikutnya&amp;quot;.&lt;/li&gt;
&lt;li&gt;Apakah Anda pernah melihat eksploitasi, dan kredit untuk pelapor jika mereka setuju.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jangan sertakan langkah eksploit.&lt;/p&gt;
&lt;h2&gt;Apa yang harus dikatakan catatan tentang perbaikan kehilangan data?&lt;/h2&gt;
&lt;p&gt;Sebutkan data apa yang terdampak, cara mengetahui apakah data Anda terkena, dan apakah bisa
dipulihkan. &amp;quot;Tidak ada tindakan yang diperlukan&amp;quot; jarang benar di sini, dan pertanyaan pertama
pembaca adalah &amp;quot;apakah data saya hilang&amp;quot;.&lt;/p&gt;
&lt;p&gt;Entri yang berguna memberi kondisi yang menghilangkan data (&amp;quot;menghapus folder saat sinkronisasi
berjalan&amp;quot;), rentang waktu saat itu mungkin terjadi, cara memeriksa (&amp;quot;buka Sampah dan cari item
bertanggal 3 sampai 9 September&amp;quot;), dan jalur pemulihan. Jika data tidak bisa dipulihkan, katakan.
Hubungi pelanggan yang terdampak secara langsung juga, karena release note tidak boleh menjadi
satu-satunya tempat seseorang mengetahui datanya terkena.&lt;/p&gt;
&lt;h2&gt;Mengapa &amp;quot;Perbaikan bug dan peningkatan performa&amp;quot; adalah catatan yang buruk?&lt;/h2&gt;
&lt;p&gt;Kalimat itu tidak memberi pembaca apa pun untuk ditindaklanjuti dan menyembunyikan perbaikan yang
sedang ditunggu seseorang. Pelanggan yang melaporkan crash tidak tahu apakah sudah diperbaiki, dan
pelanggan dengan workaround tidak tahu apakah harus menghapusnya.&lt;/p&gt;
&lt;p&gt;Ada dua alternatif yang jujur. Jika sebuah rilis tidak punya apa pun yang bisa disadari pembaca,
jangan terbitkan catatan dan biarkan changelog menyimpan catatannya. Jika ada perbaikan, daftarkan
dengan bahasa pembaca:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Sebelum:
  Perbaikan bug dan peningkatan performa.

Sesudah:
  Diperbaiki: ekspor CSV gagal untuk proyek tanpa tag.
  Diperbaiki: mode gelap menyembunyikan kursor di kotak komentar.
  Lebih cepat: dasbor terbuka lebih cepat untuk workspace
  dengan lebih dari 100 proyek.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Dari mana asal catatan perbaikan bug?&lt;/h2&gt;
&lt;p&gt;Asalnya dari pull request yang memperbaiki bug dan laporan yang memicunya. Jika kata-kata pelapor
ikut bersama perbaikannya, separuh gejalanya sudah tertulis.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-vs-bug-report/&quot;&gt;Permintaan fitur vs bug&lt;/a&gt; menjelaskan mengapa melabeli laporan
dengan benar menentukan siapa pemiliknya. Di Changeloop, bug yang dilaporkan lewat widget menjadi
GitHub issue berlabel &lt;code&gt;bug&lt;/code&gt;, dan entri changelog disusun dari pull request yang di-merge lalu
ditahan agar seseorang menyetujuinya sebelum terbit. &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;Template release notes&lt;/a&gt;
memberi bentuk entri yang sama untuk menulis manual: gejala, cakupan, rentang waktu, tindakan.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apa yang harus dimuat release notes perbaikan bug?&lt;/strong&gt;
Setiap entri harus menyebut gejala yang dilihat pengguna, siapa yang terdampak, sejak rilis atau
tanggal berapa, apakah perbaikannya tuntas, dan apa yang perlu dilakukan pembaca, termasuk &amp;quot;tidak
ada&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah setiap perbaikan bug dicantumkan di release notes?&lt;/strong&gt;
Tidak. Cantumkan yang bisa disadari pengguna, yang membuang waktu mereka, atau yang mereka
akali, dan kelompokkan perbaikan kosmetik atau internal di bawah daftar singkat &amp;quot;Perbaikan kecil&amp;quot;.
Changelog menyimpan setiap perbaikan untuk siapa pun yang perlu mencarinya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana menulis release notes untuk bug yang Anda perkenalkan sendiri?&lt;/strong&gt;
Katakan itu regresi, sebut rilis yang memperkenalkannya dan rilis yang memperbaikinya, dan beri
tahu pembaca apakah mereka boleh menghapus workaround. Pernyataan yang lugas terbaca lebih baik
daripada kata-kata yang dihaluskan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana memeriksa release notes produk yang Anda pakai?&lt;/strong&gt;
Cari halaman changelog atau release notes yang ditautkan dari menu bantuan, footer, atau
dokumentasi produk, atau di tab releases repositori untuk proyek open source.&lt;/p&gt;
</content:encoded></item><item><title>Cara meminta umpan balik pelanggan di produk software</title><link>https://changeloop.dev/blog/id/how-to-ask-for-customer-feedback/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/how-to-ask-for-customer-feedback/</guid><description>Ajukan satu pertanyaan spesifik tepat setelah pengguna melakukan sesuatu, di tempat mereka bekerja. Kalimat siap pakai per momen dan contoh yang buruk.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Untuk meminta umpan balik pelanggan di produk software, ajukan satu pertanyaan spesifik tentang sesuatu yang baru saja dilakukan pengguna, di tempat mereka melakukannya. &amp;quot;Bagaimana hasil mengekspor laporan tadi?&amp;quot; tepat setelah ekspor akan dijawab. &amp;quot;Beri tahu kami pendapat Anda tentang produk kami&amp;quot; di footer hanya mendapat kesunyian. Sisa halaman ini berisi momen, kanal, dan kalimat persisnya.&lt;/p&gt;
&lt;p&gt;Kebanyakan saran soal topik ini ditulis untuk toko dan meja layanan. Tim software tahu persis apa yang dilakukan pengguna sedetik lalu, jadi pertanyaannya bisa tentang hal itu.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Momen&lt;/th&gt;
&lt;th&gt;Tempat bertanya&lt;/th&gt;
&lt;th&gt;Kalimat siap pakai&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tepat setelah tugas selesai&lt;/td&gt;
&lt;td&gt;Di aplikasi, di samping hasilnya&lt;/td&gt;
&lt;td&gt;&amp;quot;Apakah ekspor itu sesuai kebutuhan Anda?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setelah pemakaian pertama fitur baru&lt;/td&gt;
&lt;td&gt;Di aplikasi, sekali saja&lt;/td&gt;
&lt;td&gt;&amp;quot;Apa yang ingin Anda capai dengan Bulk Edit?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setelah tiket support selesai&lt;/td&gt;
&lt;td&gt;Di thread support&lt;/td&gt;
&lt;td&gt;&amp;quot;Apakah itu menyelesaikannya, atau masih ada yang janggal?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setelah pengguna berhenti atau keluar dari sebuah alur&lt;/td&gt;
&lt;td&gt;Email, sehari kemudian&lt;/td&gt;
&lt;td&gt;&amp;quot;Anda berhenti di langkah 3 setup. Apa yang menghalangi?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setelah 30 hari pemakaian rutin&lt;/td&gt;
&lt;td&gt;Email dari orang yang disebut namanya&lt;/td&gt;
&lt;td&gt;&amp;quot;Satu hal apa yang akan Anda ubah?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saat pengguna berhenti berlangganan&lt;/td&gt;
&lt;td&gt;Di alur pembatalan&lt;/td&gt;
&lt;td&gt;&amp;quot;Apa yang membuat Anda memutuskan pergi hari ini?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setelah Anda merilis sesuatu yang mereka minta&lt;/td&gt;
&lt;td&gt;Di tempat mereka memintanya&lt;/td&gt;
&lt;td&gt;&amp;quot;Anda meminta impor CSV. Sudah live. Apakah cocok dengan kasus Anda?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Kapan waktu yang tepat untuk meminta umpan balik?&lt;/h2&gt;
&lt;p&gt;Waktu yang tepat adalah tepat setelah pengguna menyelesaikan sesuatu, selagi detailnya masih ada di
kepala mereka. Pertanyaan yang mengikuti sebuah tindakan mendapat jawaban tentang tindakan itu.
Pertanyaan yang muncul tiba-tiba mendapat jawaban tentang suasana hati orang itu saat itu, atau
tidak dijawab sama sekali.&lt;/p&gt;
&lt;p&gt;Jangan bertanya saat pendaftaran, karena belum ada yang dipakai. Jangan bertanya di tengah tugas,
karena Anda mengganggu hal yang ingin Anda pelajari. Setelah seseorang menjawab, biarkan mereka
sampai Anda punya sesuatu untuk dilaporkan kembali.&lt;/p&gt;
&lt;h2&gt;Di mana sebaiknya Anda meminta umpan balik pelanggan?&lt;/h2&gt;
&lt;p&gt;Bertanyalah di tempat pengalaman itu terjadi. Prompt di dalam aplikasi cocok untuk pertanyaan
tentang sebuah layar. Thread support cocok untuk pertanyaan tentang sebuah perbaikan. Email cocok
untuk pertanyaan tentang seminggu pemakaian, atau tentang alur yang ditinggalkan orang. Panggilan
cocok untuk pertanyaan yang tidak bisa Anda duga.&lt;/p&gt;
&lt;p&gt;Setiap kanal menghasilkan jenis jawaban yang berbeda:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Di aplikasi:&lt;/strong&gt; singkat, langsung, dan spesifik, tetapi hanya dari orang yang sedang hadir. Anda
tidak mendengar apa pun dari pengguna yang sudah pergi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thread support:&lt;/strong&gt; dari orang yang sudah cukup kesal untuk menulis. Bagus untuk menemukan hal
yang rusak, kurang baik untuk menilai sisa produk.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Email:&lt;/strong&gt; jawaban lebih panjang dari lebih sedikit orang, dan satu-satunya cara menjangkau
pengguna yang sudah diam. Tulis sebagai catatan singkat dari orang yang disebut namanya, dengan satu pertanyaan di dalamnya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wawancara:&lt;/strong&gt; cara untuk mempelajari mengapa orang melakukan sesuatu. Minta mereka menunjukkan
cara kerja mereka, dan diamlah selagi mereka melakukannya.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/blog/id/feedback-signal-quality/&quot;&gt;Kualitas sinyal umpan balik&lt;/a&gt; membahas cara menimbang apa yang
dikatakan setiap kanal.&lt;/p&gt;
&lt;h2&gt;Bagaimana cara meminta umpan balik secara profesional?&lt;/h2&gt;
&lt;p&gt;Spesifik soal hal yang ditanyakan, jelaskan mengapa Anda bertanya, dan buat jawabannya memakan
waktu kurang dari semenit. Permintaan yang profesional menyebut momennya, menegaskan bahwa seorang
manusia akan membaca jawabannya, dan tidak meminta maaf karena mengganggu.&lt;/p&gt;
&lt;p&gt;Sebut tindakan persisnya (&amp;quot;ekspor yang baru Anda jalankan&amp;quot;), minta satu hal, pakai kotak teks
bebas tanpa kolom wajib, dan tanda tangani dengan nama depan.&lt;/p&gt;
&lt;h2&gt;Apa kalimat yang baik untuk meminta umpan balik?&lt;/h2&gt;
&lt;p&gt;Kalimat yang baik adalah pertanyaan tentang momen tertentu yang bisa dijawab dalam beberapa kata.
Bandingkan dua kolom di bawah ini. Yang kiri bisa dijawab dengan angkat bahu. Yang kanan
mengharuskan orang mengingat sesuatu yang nyata.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pertanyaan lemah&lt;/th&gt;
&lt;th&gt;Pertanyaan lebih kuat&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&amp;quot;Ada masukan?&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Apa bagian tersulit saat menyiapkan ini?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;Bagaimana pendapat Anda tentang produk kami?&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Untuk apa Anda memakai ini minggu lalu?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;Nilai pengalaman Anda dari 1 sampai 10.&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Apakah Anda menyelesaikan yang ingin Anda lakukan hari ini?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;Beri tahu kami cara memperbaiki.&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Apa satu hal yang memperlambat Anda minggu ini?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;Maukah Anda merekomendasikan kami?&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Kepada siapa terakhir kali Anda menunjukkan ini, dan apa yang Anda katakan?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Satu lagi yang cocok hampir di mana saja: &amp;quot;Apa yang Anda pakai sebagai gantinya ketika ini tidak
berhasil untuk Anda?&amp;quot; Pertanyaan ini memunculkan pesaing yang sebenarnya, yang sering kali berupa
spreadsheet.&lt;/p&gt;
&lt;h2&gt;Apa cara terburuk untuk meminta umpan balik?&lt;/h2&gt;
&lt;p&gt;Permintaan terburuk itu terlalu luas, terlalu dini, terlalu panjang, atau menggiring. Semuanya
punya masalah yang sama: orang tidak bisa menjawab tanpa melakukan pemikiran yang seharusnya
Anda lakukan.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;Mohon isi survei 20 pertanyaan kami.&amp;quot;&lt;/strong&gt; Yang menyelesaikannya adalah orang dengan waktu
luang paling banyak atau pendapat paling kuat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Popup di halaman pertama setelah login.&lt;/strong&gt; Pengguna datang untuk melakukan sesuatu dan Anda
menghalanginya. Menutupnya adalah satu-satunya jawaban yang masuk akal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;Kami sangat menantikan masukan Anda!&amp;quot; tanpa pertanyaan.&lt;/strong&gt; Ini meminta pengguna mengarang
topiknya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pertanyaan menggiring: &amp;quot;Seberapa suka Anda dengan dasbor baru?&amp;quot;&lt;/strong&gt; Anda mendapat persetujuan
dan tidak belajar apa-apa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Penilaian tanpa tindak lanjut.&lt;/strong&gt; Angka 6 dari 10 memberi tahu suasana hati. Ia tidak
memberi tahu apa yang harus diubah.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bertanya, lalu diam.&lt;/strong&gt; Ini merugikan putaran berikutnya, yang dibahas di bawah.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Apa sebutan untuk umpan balik pelanggan tentang produk?&lt;/h2&gt;
&lt;p&gt;Umpan balik tentang produk biasanya disebut umpan balik produk, dan terbagi menjadi dua jenis.
Laporan bug menyatakan sesuatu tidak berfungsi sebagaimana mestinya. Permintaan fitur menyatakan
ada yang kurang. Pembedaan ini menentukan siapa yang melihatnya lebih dulu, dan
&lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-vs-bug-report/&quot;&gt;permintaan fitur vs bug&lt;/a&gt; menarik garisnya. Jenis ketiga, pujian,
layak disimpan dan dikutip dengan izin.&lt;/p&gt;
&lt;p&gt;Formulir umpan balik yang menawarkan &amp;quot;Bug&amp;quot; dan &amp;quot;Permintaan fitur&amp;quot; sebagai pilihan pertama sudah melakukan
penyortiran awal itu untuk Anda.&lt;/p&gt;
&lt;h2&gt;Apa yang dilakukan dengan jawabannya?&lt;/h2&gt;
&lt;p&gt;Taruh setiap jawaban di tempat tim sudah bekerja, dengan kata-kata orang itu tetap utuh. Satu
baris kutipan lebih baik daripada ringkasan Anda. Beri tag menurut jenis dan perkiraan
urgensi, gabungkan yang berulang, lalu putuskan: bangun, tunda, atau tolak.&lt;/p&gt;
&lt;p&gt;Menolak juga merupakan jawaban. &amp;quot;Kami tidak akan membangun ini, dan inilah alasannya&amp;quot; mengakhiri
penantian, dan &lt;a href=&quot;https://changeloop.dev/blog/id/declining-feature-requests/&quot;&gt;menolak permintaan fitur&lt;/a&gt; punya contoh kalimatnya.
Untuk saluran pipanya, &lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-tracking/&quot;&gt;melacak permintaan fitur&lt;/a&gt; menjelaskan cara
membawa permintaan dari lima kanal ke satu daftar. Jika Anda menerima permintaan secara tertulis,
&lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-template/&quot;&gt;template permintaan fitur&lt;/a&gt; menjaga agar permintaan bisa dibandingkan.&lt;/p&gt;
&lt;p&gt;Widget Changeloop menyimpan setiap kiriman sebagai GitHub issue, sehingga umpan balik mendarat di
samping kode yang akan memperbaikinya. Dengan alat apa pun aturannya sama: satu daftar, satu
pemilik, tidak ada jawaban yang tertinggal di kotak masuk seseorang.&lt;/p&gt;
&lt;h2&gt;Mengapa memberi tahu orang apa yang dirilis?&lt;/h2&gt;
&lt;p&gt;Itu menunjukkan kepada orang tersebut bahwa menjawab ada gunanya. Pengguna yang pernah memberi
tahu Anda sesuatu lalu mendengar &amp;quot;ini sudah dirilis, terima kasih&amp;quot; punya alasan untuk menjawab
lagi. Yang tidak mendengar apa-apa menyimpulkan bahwa kotak itu tidak dibaca.&lt;/p&gt;
&lt;p&gt;Jadi langkah terakhir dalam meminta adalah membalas. Beri tahu setiap orang yang meminta kapan
permintaannya dirilis, dengan bahasa mereka, lewat kanal yang mereka pakai.
&lt;a href=&quot;https://changeloop.dev/blog/id/customer-feedback-loop/&quot;&gt;Menutup lingkaran umpan balik pelanggan&lt;/a&gt; menjelaskan mekanismenya:
entri changelog yang diterbitkan adalah pemicu pesan, sehingga peminta baru diberi tahu setelah
perubahan itu live. Di Changeloop, ketika umpan balik widget menjadi issue GitHub dan pull request yang digabung menutupnya, menyetujui entri akan memposting komentar &amp;quot;Shipped&amp;quot; di issue itu dan
menampilkan entri itu ke pengirim di widget; issue yang dibuat manual, serta repositori GitLab atau Bitbucket, tidak mendapat komentar. Dokumentasi kami mencantumkan
&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;pengaturan widget dan feed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Balasan bisa singkat: &amp;quot;Anda meminta impor CSV pada bulan Maret. Hari ini sudah live, dan begini
cara kerjanya.&amp;quot; Itu juga memberi Anda pertanyaan berikutnya yang terbaik, yaitu apakah fitur itu
mencakup yang mereka butuhkan.&lt;/p&gt;
&lt;h2&gt;Rencana awal&lt;/h2&gt;
&lt;p&gt;Pilih satu momen dari tabel di atas, yaitu saat pengguna paling sering berhasil atau menyerah.
Tulis satu pertanyaan untuknya, taruh di satu kanal, dan baca setiap jawaban selama dua minggu
sebelum menambah prompt kedua. Balas siapa pun yang memberi sesuatu yang konkret.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Seberapa sering Anda sebaiknya meminta umpan balik pelanggan?&lt;/strong&gt;
Kaitkan permintaan dengan peristiwa, bukan kalender. Pengguna sebaiknya melihat paling banyak satu
prompt seminggu, dan tidak ada tepat setelah menjawab satu. Pesan berikutnya setelah umpan balik
sebaiknya berupa balasan tentang apa yang terjadi padanya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana meminta umpan balik tanpa mengganggu pengguna?&lt;/strong&gt;
Bertanyalah setelah tugas, bukan di tengahnya, batasi pada satu pertanyaan, dan buat mudah
ditutup. Hormati penutupan itu selama beberapa minggu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah menawarkan insentif untuk umpan balik?&lt;/strong&gt;
Biasanya tidak perlu. Pertanyaan yang spesifik dan balasan yang terlihat lebih berbobot daripada
voucher, dan insentif menarik orang yang mengejar hadiahnya. Simpan untuk wawancara, ketika Anda
meminta 20 menit waktu seseorang.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana jika tidak ada yang menjawab?&lt;/strong&gt;
Persempit pertanyaannya dan dekatkan ke momennya, misalnya satu layar, ditanyakan tepat setelah
dipakai. Jika tetap sepi, kirim email langsung ke beberapa pengguna dan pakai percakapan itu untuk
menulis prompt yang lebih baik.&lt;/p&gt;
</content:encoded></item><item><title>Contoh roadmap produk: enam format dan cara gagalnya</title><link>https://changeloop.dev/blog/id/product-roadmap-examples/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/product-roadmap-examples/</guid><description>Enam contoh roadmap produk dengan item realistis: Now/Next/Later, kuartalan, tema, hasil, publik, dan rilis. Cocok untuk siapa dan bagaimana gagalnya.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Contoh roadmap produk yang layak ditiru terbagi menjadi enam format: Now/Next/Later, linimasa
kuartalan, roadmap tema, roadmap berbasis hasil, roadmap publik, dan roadmap rilis internal. Masing-masing
menjawab pertanyaan yang berbeda untuk pembaca yang berbeda, jadi contoh yang tepat adalah yang
cocok dengan siapa yang akan membaca roadmap Anda. Tata letak adalah hal terakhir yang diputuskan.&lt;/p&gt;
&lt;p&gt;Setiap contoh di bawah ini untuk produk rekaan, sebuah aplikasi tugas tim kecil, dan semua itemnya
karangan. Yang penting adalah bentuknya: apa yang masuk ke setiap slot, seperti apa entri yang
nyata, dan apa yang membuat format itu rusak setelah satu kuartal.&lt;/p&gt;
&lt;h2&gt;Apa saja contoh roadmap produk yang baik?&lt;/h2&gt;
&lt;p&gt;Contoh roadmap yang baik itu singkat, menyebut pembacanya, dan membuat satu jenis janji. Pilih
format berdasarkan janji yang sanggup Anda tepati: arah, tanggal, tema pekerjaan, hasil, komitmen
publik, atau jadwal pengiriman.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Dibuat untuk&lt;/th&gt;
&lt;th&gt;Berhasil bila&lt;/th&gt;
&lt;th&gt;Gagal bila&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Now/Next/Later&lt;/td&gt;
&lt;td&gt;Seluruh perusahaan&lt;/td&gt;
&lt;td&gt;Rencana sering berubah&lt;/td&gt;
&lt;td&gt;&amp;quot;Next&amp;quot; penuh dan berubah menjadi antrean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linimasa kuartalan&lt;/td&gt;
&lt;td&gt;Sales, support, eksekutif&lt;/td&gt;
&lt;td&gt;Tanggal memang kendala nyata&lt;/td&gt;
&lt;td&gt;Tanggal mundur dan tidak ada yang memperbarui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Berbasis tema&lt;/td&gt;
&lt;td&gt;Pimpinan, karyawan baru&lt;/td&gt;
&lt;td&gt;Anda ingin menjelaskan alasannya&lt;/td&gt;
&lt;td&gt;Tema terlalu luas sehingga item apa pun cocok&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Berbasis hasil&lt;/td&gt;
&lt;td&gt;Produk dan engineering&lt;/td&gt;
&lt;td&gt;Tujuannya bisa diukur&lt;/td&gt;
&lt;td&gt;Metriknya tidak punya pemilik atau data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publik&lt;/td&gt;
&lt;td&gt;Pelanggan&lt;/td&gt;
&lt;td&gt;Anda bisa menjaganya tetap kecil&lt;/td&gt;
&lt;td&gt;Berubah menjadi tumpukan backlog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rilis internal&lt;/td&gt;
&lt;td&gt;Engineering, QA, support&lt;/td&gt;
&lt;td&gt;Beberapa tim merilis bersama&lt;/td&gt;
&lt;td&gt;Disangka strategi&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Seperti apa tiap contoh roadmap produk?&lt;/h2&gt;
&lt;p&gt;Setiap format di bawah ini ditampilkan dengan entri yang realistis, diikuti siapa yang cocok
memakainya, kapan ia bertahan, dan bagaimana biasanya ia gagal.&lt;/p&gt;
&lt;h3&gt;Now/Next/Later&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;NOW (sedang dibangun bulan ini)
  Tampilan tersimpan di inbox
  Ekspor CSV yang berfungsi untuk akun besar
NEXT (sudah diputuskan, urutan belum pasti)
  SSO untuk paket Team
  Notifikasi Slack
LATER (arah, belum ada komitmen)
  Aplikasi mobile
  Log audit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Format ini cocok untuk perusahaan yang tidak ingin menjanjikan tanggal, seperti banyak tim tahap
awal. Ia bertahan karena tiga kolomnya menggambarkan seberapa pasti Anda: &amp;quot;now&amp;quot; sedang dikerjakan,
&amp;quot;next&amp;quot; sudah diputuskan, &amp;quot;later&amp;quot; masih harapan. Ia gagal ketika &amp;quot;later&amp;quot; menjadi tempat parkir
semua ide yang tidak mau ditolak siapa pun, dan ketika &amp;quot;next&amp;quot; diam-diam mendapat urutan dan
tanggal tanpa ada yang menyebutnya linimasa.&lt;/p&gt;
&lt;h3&gt;Linimasa atau roadmap kuartalan&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Q4 2026
  Okt   Tampilan tersimpan di inbox
  Nov   SSO beta dengan lima mitra desain
  Des   SSO tersedia umum
Q1 2027
  Jan   Notifikasi Slack
  Mar   Log audit (hanya ekspor)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Format ini cocok untuk sales, support, dan keuangan, yang perlu merencanakan sesuatu. Ia berhasil
ketika tanggal adalah kendala nyata, seperti kontrak, konferensi, atau tenggat kepatuhan. Ia gagal
ketika tanggal hanyalah tebakan, karena satu bulan di roadmap bisa berubah menjadi janji di deck
penjualan dalam hitungan minggu. Jika memakai format ini, tandai setiap kuartal sebagai
komitmen atau perkiraan, dan buat kuartal kedua terlihat jelas lebih longgar daripada yang pertama.&lt;/p&gt;
&lt;h3&gt;Roadmap berbasis tema&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TEMA: Pengalaman minggu pertama
  Impor dari CSV dan Trello
  Template awal
TEMA: Siap untuk tim yang lebih besar
  SSO
  Log audit
  Izin berbasis peran
TEMA: Lebih sedikit langkah manual
  Notifikasi Slack
  Tugas berulang
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Format ini cocok untuk pembaruan ke pimpinan dan karyawan baru, karena ia menjelaskan mengapa
pekerjaan itu ada sebelum mendaftar pekerjaannya. Ia bertahan ketika setiap tema berkaitan dengan
alasan yang dipedulikan pelanggan. Ia gagal ketika temanya terlalu lebar (&amp;quot;Pertumbuhan&amp;quot;,
&amp;quot;Kualitas&amp;quot;) sehingga setiap item cocok di bawah tema mana pun, dan pengelompokan itu tidak
menjelaskan apa-apa lagi.&lt;/p&gt;
&lt;h3&gt;Roadmap berbasis hasil&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TUJUAN: Lebih banyak tim baru menyelesaikan setup
  Metrik: setup selesai dalam 7 hari, 40% menjadi 55%
  Taruhan: impor CSV, template awal
TUJUAN: Lebih sedikit tiket support soal ekspor
  Metrik: tiket ekspor per minggu, 30 menjadi 10
  Taruhan: perbaikan ekspor akun besar, halaman status ekspor
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Angkanya hanya ilustrasi, dan tata letaknyalah intinya: satu tujuan, satu metrik dengan titik awal
dan target, serta taruhan yang akan Anda coba. Format ini cocok untuk tim produk dan engineering
yang dipercaya memilih solusinya sendiri. Ia berhasil ketika metriknya ada dan seseorang
memilikinya. Ia gagal ketika tujuannya tidak terukur, atau ketika &amp;quot;taruhan&amp;quot; itu sama saja dengan
daftar fitur sebelumnya yang ditempeli kalimat hasil di atasnya.&lt;/p&gt;
&lt;h3&gt;Roadmap publik untuk pelanggan&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;DIRENCANAKAN
  Tampilan tersimpan di inbox
SEDANG DIBANGUN
  Notifikasi Slack
DIRILIS
  Ekspor CSV untuk akun besar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ini format terkecil, dan janjinya paling kuat. Ia cocok untuk pelanggan, yang ingin tahu apakah
permintaan mereka didengar. Ia bertahan dengan sangat sedikit item, tanpa tanggal, dan judul yang
ditulis dengan kata-kata pelanggan. Ia gagal sebagai tempat pembuangan backlog: setiap
&amp;quot;mungkin&amp;quot; yang Anda cantumkan adalah janji yang kelak akan ditagih seseorang. Cara menjalankannya
dari issue tracker Anda ada di &lt;a href=&quot;https://changeloop.dev/blog/id/public-roadmap/&quot;&gt;roadmap publik dalam tiga kolom&lt;/a&gt;, jadi tidak
diulang di sini.&lt;/p&gt;
&lt;h3&gt;Roadmap rilis internal&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rilis&lt;/th&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;Pemilik&lt;/th&gt;
&lt;th&gt;Bergantung pada&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;5.2&lt;/td&gt;
&lt;td&gt;14 Okt&lt;/td&gt;
&lt;td&gt;Platform&lt;/td&gt;
&lt;td&gt;Upgrade layanan auth&lt;/td&gt;
&lt;td&gt;Kode selesai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.3&lt;/td&gt;
&lt;td&gt;11 Nov&lt;/td&gt;
&lt;td&gt;Inbox&lt;/td&gt;
&lt;td&gt;API tampilan tersimpan&lt;/td&gt;
&lt;td&gt;Sedang berjalan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.4&lt;/td&gt;
&lt;td&gt;9 Des&lt;/td&gt;
&lt;td&gt;Platform&lt;/td&gt;
&lt;td&gt;Kontrak vendor SSO&lt;/td&gt;
&lt;td&gt;Terblokir&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Format ini cocok untuk engineering, QA, dan support, yang perlu tahu apa yang dirilis bersamaan
dan apa yang menghambat apa. Ia berhasil ketika akurat sampai ke minggunya dan setiap baris punya
pemilik. Ia gagal ketika seseorang mengira ini strategi: jadwal pengiriman menyebut apa yang akan
keluar dan kapan, dan tidak mengatakan apa-apa tentang apakah rilis-rilis itu taruhan yang tepat.&lt;/p&gt;
&lt;h2&gt;Format roadmap produk mana yang harus dipilih?&lt;/h2&gt;
&lt;p&gt;Pilih berdasarkan pembaca dulu, lalu berdasarkan seberapa pasti Anda sebenarnya. Jika Anda tidak
bisa menyebut siapa yang membaca roadmap dan keputusan apa yang dibantu olehnya, tidak ada contoh
di atas yang bisa menyelamatkannya.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pelanggan yang bertanya &amp;quot;apakah kalian mendengar saya?&amp;quot;&lt;/strong&gt; Pakai format publik, dan batasi pada
beberapa item.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sales dan support yang bertanya &amp;quot;bisakah saya memberi tahu pelanggan tanggalnya?&amp;quot;&lt;/strong&gt; Pakai
linimasa kuartalan, dengan komitmen dan perkiraan dipisahkan jelas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pimpinan yang bertanya &amp;quot;mengapa pekerjaan ini?&amp;quot;&lt;/strong&gt; Pakai tema, atau hasil jika Anda punya
datanya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tim yang berubah arah tiap bulan.&lt;/strong&gt; Pakai Now/Next/Later dan tahan godaan untuk memberinya tanggal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engineer yang bertanya &amp;quot;apa yang dirilis kapan?&amp;quot;&lt;/strong&gt; Pakai roadmap rilis, dan pisahkan dari yang
strategis.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kebanyakan tim akhirnya punya dua: roadmap strategis dalam salah satu dari empat bentuk pertama, dan
jadwal rilis di bawahnya. Roadmap publik lalu menjadi tampilan tersaring dari yang strategis,
hanya menampilkan apa yang siap Anda pertanggungjawabkan.&lt;/p&gt;
&lt;h2&gt;Bagaimana cara menulis roadmap produk?&lt;/h2&gt;
&lt;p&gt;Tulis roadmap dengan menyebut pembacanya, memilih format yang sesuai dengan pertanyaan mereka,
mendaftar hanya item yang akan Anda pertahankan dalam rapat, dan memberi setiap item status serta
pemilik. Lalu putuskan seberapa sering roadmap itu ditinjau sebelum Anda menerbitkannya.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Sebutkan pembaca dan keputusannya.&lt;/strong&gt; &amp;quot;Support memutuskan apa yang dikatakan ke pelanggan
soal SSO&amp;quot; adalah alasan. &amp;quot;Semua orang harus melihat roadmap&amp;quot; tidak memberi apa pun untuk
dirancang.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mulai dari yang sudah Anda ketahui.&lt;/strong&gt; Permintaan yang terbuka,
&lt;a href=&quot;https://changeloop.dev/blog/id/prioritizing-feature-requests/&quot;&gt;diurutkan dengan aturan yang bisa Anda jelaskan&lt;/a&gt;, adalah bahan
mentah yang lebih baik daripada brainstorming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tulis setiap item sebagai hasil bagi pelanggan.&lt;/strong&gt; &amp;quot;Simpan filter yang sering Anda pakai&amp;quot;
lebih enak dibaca daripada &amp;quot;Implementasi persistensi tampilan tersimpan&amp;quot;, dan memberi tahu
pelanggan apakah itu masalah mereka.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Putuskan apa yang tidak akan ada di roadmap.&lt;/strong&gt; Tanggal, estimasi, dan backlog ide adalah tiga
pengecualian yang umum.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tetapkan tanggal tinjauan.&lt;/strong&gt; Roadmap tanpa tinjauan terjadwal punya pemakaman yang tidak
terjadwal.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Bagaimana menjaga roadmap produk tetap mutakhir?&lt;/h2&gt;
&lt;p&gt;Jaga roadmap tetap mutakhir dengan memindahkan item saat pekerjaan bergerak, dari tempat yang sama
dengan tempat pekerjaan dilacak, dan dengan mencatat apa yang terjadi saat item dirilis atau
dibatalkan. Roadmap yang diperbarui manual di alat terpisah menjadi usang karena itu bukan
pekerjaan harian siapa pun.&lt;/p&gt;
&lt;p&gt;Sumber kebenaran termurah adalah issue tracker. Jika setiap kolom roadmap sesuai dengan sebuah
label di issue, roadmap berubah ketika labelnya berubah, dan tidak ada yang diketik ulang. Versi
Changeloop memakai label &lt;code&gt;roadmap:planned&lt;/code&gt;, &lt;code&gt;roadmap:building&lt;/code&gt;, dan &lt;code&gt;roadmap:shipped&lt;/code&gt;, dan ketika
sebuah issue membawa dua label, yang paling maju yang menang. Memindahkan kartu ke shipped tetap
merupakan perubahan label tersendiri, jadi jadikan itu bagian dari tinjauan tempat Anda menyetujui
entri changelog.&lt;/p&gt;
&lt;p&gt;Entri itu adalah separuh lainnya. Ketika item dirilis, changelog menyebutkan apa yang berubah
dalam bahasa pelanggan, dan peminta yang menginginkannya bisa diberi tahu. Menutup lingkaran itu
adalah inti dari &lt;a href=&quot;https://changeloop.dev/blog/id/customer-feedback-loop/&quot;&gt;lingkaran umpan balik pelanggan&lt;/a&gt;, dan roadmap
adalah bagian lingkaran itu yang bisa dilihat pelanggan sebelum apa pun dirilis. Jika Anda membatalkan sebuah item, katakan; &amp;quot;tidak&amp;quot;
secara publik juga menutup permintaan itu, dan
&lt;a href=&quot;https://changeloop.dev/blog/id/declining-feature-requests/&quot;&gt;menolak permintaan fitur&lt;/a&gt; membahas cara menyusun kalimatnya. Tim yang
ingin melihat seperti apa entri jadi bisa menjelajahi &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;contoh changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apa format roadmap produk yang paling sederhana?&lt;/strong&gt;
Now/Next/Later. Formatnya hanya tiga kolom, tidak butuh tanggal, dan mengelompokkan item
berdasarkan kepastian. Untuk tim kecil yang sering berubah arah, ini juga format yang paling sulit
dibuat salah secara memalukan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Berapa banyak item yang sebaiknya ada di roadmap produk?&lt;/strong&gt;
Lebih sedikit dari yang Anda kira. Kurang dari sepuluh item di
semua kolom sudah cukup untuk roadmap publik, dan roadmap strategis internal jarang butuh lebih dari selusin. Lebih dari itu, ia
hanya backlog dengan judul yang lebih bagus.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah roadmap produk mencantumkan tanggal?&lt;/strong&gt;
Hanya jika tanggalnya memang kendala nyata, dan hanya untuk kuartal terdekat. Setelah itu, pakai
kolom atau tema. Tanggal di roadmap menjadi komitmen dalam percakapan penjualan, entah Anda
bermaksud begitu atau tidak.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa perbedaan antara roadmap produk dan rencana rilis?&lt;/strong&gt;
Roadmap menyatakan apa yang ingin Anda bangun dan mengapa. Rencana rilis menyatakan build mana
yang dirilis pada tanggal berapa dan siapa pemiliknya. Roadmap berubah ketika strategi Anda
berubah, dan rencana rilis berubah ketika pekerjaannya berubah.&lt;/p&gt;
</content:encoded></item><item><title>Proses manajemen rilis untuk tim yang sering merilis</title><link>https://changeloop.dev/blog/id/release-management-process/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/release-management-process/</guid><description>Proses manajemen rilis untuk tim software dalam tujuh langkah, dengan pemilik dan kriteria selesai tiap langkah, plus metrik DORA dan satu KPI tambahan.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Proses manajemen rilis adalah rangkaian langkah yang membawa sebuah perubahan dari &amp;quot;sudah di-merge&amp;quot; ke &amp;quot;berjalan di produksi dan dijelaskan kepada orang yang terdampak&amp;quot;. Untuk tim yang sering merilis, prosesnya terdiri dari tujuh langkah: merencanakan cakupan, mengisolasi perubahan, build dan tes, persetujuan, deploy dan verifikasi, komunikasi, dan tinjauan. Setiap langkah butuh satu pemilik bernama dan satu kriteria selesai, atau langkah itu diam-diam berhenti dilakukan.&lt;/p&gt;
&lt;p&gt;Panduan ini mengasumsikan tim berisi 5 sampai 50 engineer yang deploy mingguan atau harian dan ingin prosesnya tidak menghalangi.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Langkah&lt;/th&gt;
&lt;th&gt;Pemilik&lt;/th&gt;
&lt;th&gt;Kriteria selesai&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1. Merencanakan cakupan&lt;/td&gt;
&lt;td&gt;Product atau tech lead&lt;/td&gt;
&lt;td&gt;Daftar perubahan di rilis ini tertulis, dan yang berisiko ditandai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Branch atau flag&lt;/td&gt;
&lt;td&gt;Engineer pemilik perubahan&lt;/td&gt;
&lt;td&gt;Pekerjaan ada di branch berumur pendek atau di balik flag, sehingga main tetap siap rilis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Build dan tes&lt;/td&gt;
&lt;td&gt;CI, dengan penulis siaga untuk kegagalan&lt;/td&gt;
&lt;td&gt;Pipeline hijau pada commit persis yang akan dirilis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Persetujuan&lt;/td&gt;
&lt;td&gt;Reviewer, plus release manager untuk perubahan berisiko&lt;/td&gt;
&lt;td&gt;Review selesai, jalur rollback disebut, keputusan go atau no-go dicatat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Deploy dan verifikasi&lt;/td&gt;
&lt;td&gt;Release manager atau engineer on-call&lt;/td&gt;
&lt;td&gt;Ter-deploy, smoke check lulus, error rate dan latensi sesuai baseline sebelum rilis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Komunikasi&lt;/td&gt;
&lt;td&gt;Orang yang memahami perubahan, disunting orang yang tidak&lt;/td&gt;
&lt;td&gt;Release notes terbit di tempat pengguna membaca, support dan sales diberi tahu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Tinjauan&lt;/td&gt;
&lt;td&gt;Release manager&lt;/td&gt;
&lt;td&gt;Metrik dibaca, apa pun yang salah punya pemilik dan perbaikan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apa itu proses manajemen rilis?&lt;/h2&gt;
&lt;p&gt;Itu adalah jalur berulang yang diikuti sebuah perubahan untuk sampai ke pengguna: cakupan, build,
tes, persetujuan, deploy, verifikasi, pengumuman, dan meninjau kembali. Gunanya menuliskannya
adalah agar setiap rilis mengikuti jalur yang sama, sehingga orang yang sedang cuti, karyawan baru,
atau engineer on-call pukul 2 pagi bisa menjalankannya tanpa bertanya kepada siapa pun cara
kerjanya.&lt;/p&gt;
&lt;h2&gt;Apa saja jenis manajemen rilis?&lt;/h2&gt;
&lt;p&gt;Ada tiga jenis yang praktis: continuous deployment, rilis terjadwal, dan manajemen perubahan yang
diatur regulasi. Ketiganya berbeda dalam seberapa banyak yang terjadi sebelum rilis dan seberapa
banyak yang diotomatisasi. Continuous deployment merilis setiap perubahan yang di-merge, rilis
terjadwal mengelompokkan perubahan dalam satu kereta, dan manajemen perubahan terregulasi
menambahkan persetujuan formal dan jejak audit.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Continuous deployment&lt;/th&gt;
&lt;th&gt;Rilis terjadwal&lt;/th&gt;
&lt;th&gt;Manajemen perubahan terregulasi atau ITIL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Unit rilis&lt;/td&gt;
&lt;td&gt;Satu pull request yang di-merge&lt;/td&gt;
&lt;td&gt;Satu batch, mingguan atau dua mingguan&lt;/td&gt;
&lt;td&gt;Satu permintaan perubahan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Langkah cakupan&lt;/td&gt;
&lt;td&gt;Implisit, merge adalah cakupannya&lt;/td&gt;
&lt;td&gt;Rapat perencanaan rilis&lt;/td&gt;
&lt;td&gt;Catatan perubahan dengan peringkat risiko&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persetujuan&lt;/td&gt;
&lt;td&gt;Code review plus pemeriksaan otomatis&lt;/td&gt;
&lt;td&gt;Release manager mengesahkan batch&lt;/td&gt;
&lt;td&gt;Change advisory board atau penyetuju yang didelegasikan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kontrol risiko&lt;/td&gt;
&lt;td&gt;Feature flag, canary, rollback cepat&lt;/td&gt;
&lt;td&gt;Staging soak, release candidate&lt;/td&gt;
&lt;td&gt;Rencana backout terdokumentasi, jendela pemeliharaan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kadens umum&lt;/td&gt;
&lt;td&gt;Banyak per hari&lt;/td&gt;
&lt;td&gt;Mingguan sampai bulanan&lt;/td&gt;
&lt;td&gt;Ditetapkan kalender perubahan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Titik lemah&lt;/td&gt;
&lt;td&gt;Tidak ada yang memberi tahu pengguna apa yang berubah&lt;/td&gt;
&lt;td&gt;Batch besar menyembunyikan perubahan yang merusak&lt;/td&gt;
&lt;td&gt;Waktu proses melampaui perubahannya sendiri&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Kebanyakan tim adalah campuran. Produk SaaS bisa deploy secara kontinu sementara aplikasi
mobile-nya keluar dalam kereta mingguan, dan satu layanan pembayaran yang diperhatikan auditor
mengikuti catatan perubahan formal. Pilih jenisnya per layanan, bukan per perusahaan. Ketika
perubahan hanya diekspos bertahap, rilis dan pengumuman menjadi dua peristiwa terpisah, kasus yang
dibahas di &lt;a href=&quot;https://changeloop.dev/blog/id/feature-flags-feature-requests/&quot;&gt;release notes feature flag&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Apa tanggung jawab seorang release manager?&lt;/h2&gt;
&lt;p&gt;Release manager memiliki jalur yang ditempuh perubahan menuju produksi. Mereka memegang kalender
rilis, memutuskan apakah perubahan sudah siap, menjalankan atau mengawasi deploy, mengambil
keputusan rollback, memastikan pengguna diberi tahu, dan menjalankan tinjauan sesudahnya.&lt;/p&gt;
&lt;p&gt;Sebelum rilis, mereka memastikan cakupan dan memeriksa bahwa setiap perubahan berisiko punya jalur
rollback. Selama rilis, mereka menjalankan checklist deploy, mengamati menit-menit pertama metrik
produksi, dan memutuskan rollback lebih awal. Sesudahnya mereka memastikan catatan sudah keluar dan
mencatat apa yang harus diperbaiki di proses.&lt;/p&gt;
&lt;p&gt;Di tim kecil, putar perannya tiap minggu dan tulis checklist agar tidak ada yang butuh pengetahuan
lisan. &lt;a href=&quot;https://changeloop.dev/blog/id/monorepo-changelogs/&quot;&gt;Monorepo&lt;/a&gt; dengan banyak paket yang dirilis mandiri biasanya
butuh satu pemilik rilis per paket, atau perannya berubah menjadi hambatan.&lt;/p&gt;
&lt;h2&gt;Apa saja KPI utama untuk manajemen rilis?&lt;/h2&gt;
&lt;p&gt;Lacak metrik pengiriman software DORA, dan tambahkan satu milik Anda sendiri: berapa lama sampai
pengguna diberi tahu. Riset DORA mengidentifikasi lima metrik, dibagi menjadi throughput (change
lead time, deployment frequency, failed deployment recovery time) dan instabilitas (change fail
rate, deployment rework rate).&lt;/p&gt;
&lt;p&gt;Panduan DORA mendefinisikannya dengan istilah sederhana
(&lt;a href=&quot;https://dora.dev/guides/dora-metrics/&quot;&gt;dora.dev, software delivery metrics&lt;/a&gt;):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;KPI&lt;/th&gt;
&lt;th&gt;Yang diukur&lt;/th&gt;
&lt;th&gt;Yang perlu diperhatikan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Change lead time&lt;/td&gt;
&lt;td&gt;Waktu dari commit di version control sampai ter-deploy di produksi&lt;/td&gt;
&lt;td&gt;Angka yang naik biasanya berarti antrean di review atau persetujuan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment frequency&lt;/td&gt;
&lt;td&gt;Seberapa sering Anda deploy, atau jeda antar deployment&lt;/td&gt;
&lt;td&gt;Frekuensi yang turun berarti batch membesar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failed deployment recovery time&lt;/td&gt;
&lt;td&gt;Waktu pulih dari deployment yang butuh intervensi segera&lt;/td&gt;
&lt;td&gt;Masalah rollback dan alerting terlihat di sini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change fail rate&lt;/td&gt;
&lt;td&gt;Porsi deployment yang butuh rollback atau hotfix&lt;/td&gt;
&lt;td&gt;Naik ketika batch terlalu besar atau tes tipis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment rework rate&lt;/td&gt;
&lt;td&gt;Porsi deployment yang tidak direncanakan dan disebabkan insiden produksi&lt;/td&gt;
&lt;td&gt;Tanda bahwa perbaikan dirilis lebih cepat daripada pelajarannya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Waktu sampai pengguna diberi tahu&lt;/td&gt;
&lt;td&gt;Menit dari deploy produksi sampai catatan yang menghadap pengguna terbit&lt;/td&gt;
&lt;td&gt;Ukur sendiri, tidak ada kerangka yang menyediakannya&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Materi lama mendaftar empat metrik kunci dan menyebut pemulihan sebagai &amp;quot;time to restore&amp;quot;. Panduan
saat ini memakai lima di atas.&lt;/p&gt;
&lt;p&gt;Panduan yang sama memperingatkan agar metrik ini tidak diperlakukan sebagai target. Menetapkan
tujuan seperti &amp;quot;semua deploy beberapa kali sehari pada akhir tahun&amp;quot; mengundang tim untuk
mengakali angkanya, dan metrik dimaksudkan dibaca per aplikasi atau layanan, bukan dicampur di
seluruh perusahaan. Saran praktisnya untuk memperbaiki semuanya adalah mengecilkan ukuran setiap
perubahan, karena perubahan yang lebih kecil lebih mudah ditinjau, dilewatkan di pipeline, dan
dipulihkan.&lt;/p&gt;
&lt;h2&gt;Bagaimana komunikasi rilis masuk ke proses manajemen rilis?&lt;/h2&gt;
&lt;p&gt;Ini langkah keenam, dan punya pemilik serta kriteria selesai seperti setiap langkah lain: catatan
terbit di tempat pengguna membaca, dan tim internal diberi tahu. Tim paling sering melewatkannya,
karena perkakas deployment melaporkan sukses begitu kode live.&lt;/p&gt;
&lt;p&gt;Cara termurah menjaga langkah ini tepat jadwal adalah menulis entri saat perubahan di-merge, bukan
saat rilis keluar. Pull request sudah memuat judul, penulis, issue yang tertaut, dan konteksnya.
Draf yang dibangun darinya disunting, bukan ditulis dari ingatan seminggu kemudian. Itulah gagasan
di balik &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-automation/&quot;&gt;otomatisasi changelog&lt;/a&gt;: turunkan draf saat merge, tahan
untuk disetujui manusia, lalu terbitkan di mana-mana dari satu sumber. Changeloop bekerja seperti
ini, membuat draf entri dari pull request yang di-merge dengan AI dan menahannya untuk persetujuan
sebelum apa pun diterbitkan.&lt;/p&gt;
&lt;p&gt;Dua variasi layak direncanakan sebelumnya. Support dan sales butuh catatan yang berbeda dari
pelanggan, yang menjadi fungsi &lt;a href=&quot;https://changeloop.dev/blog/id/internal-release-notes/&quot;&gt;release notes internal&lt;/a&gt;. Rilis
yang dipicu insiden tidak punya waktu untuk siklus penyusunan normal, jadi siapkan template singkat,
seperti dijelaskan di &lt;a href=&quot;https://changeloop.dev/blog/id/emergency-release-notes/&quot;&gt;release notes darurat&lt;/a&gt;.
&lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;Template release notes&lt;/a&gt; memberi bentuk awal untuk versi yang menghadap
pelanggan.&lt;/p&gt;
&lt;h2&gt;Bagaimana menjaga proses tetap ringan?&lt;/h2&gt;
&lt;p&gt;Otomatisasi setiap kriteria selesai yang bisa diperiksa mesin, dan sisakan manusia untuk penilaian.
Pipeline hijau, penanda deploy di dasbor, dan draf entri changelog per pull request yang di-merge
bisa diperiksa. Apakah rencana rollback meyakinkan, atau catatan masuk akal bagi pelanggan,
membutuhkan manusia.&lt;/p&gt;
&lt;p&gt;Untuk menguji proses, pilih satu rilis bulan lalu dan tanyakan apakah orang di luar tim bisa
mengetahui, dari catatan tertulis saja, apa yang dirilis, siapa yang menyetujui, bagaimana
diverifikasi, dan kapan pengguna diberi tahu. Celah apa pun adalah perbaikan Anda berikutnya.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apa perbedaan antara manajemen rilis dan manajemen perubahan?&lt;/strong&gt;
Manajemen rilis membuat sekumpulan perubahan di-build, dites, di-deploy, dan diumumkan. Manajemen perubahan, dalam pengertian ITIL, adalah proses persetujuan dan risiko di sekitar setiap perubahan. Tim yang sering merilis melebur persetujuan ke dalam code review dan pemeriksaan otomatis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Seberapa sering kita sebaiknya merilis?&lt;/strong&gt;
Sesering yang diizinkan tes dan jalur rollback Anda, yang bagi banyak tim web berarti harian atau lebih. Panduan DORA adalah mengecilkan ukuran setiap perubahan, karena perubahan kecil lebih mudah ditinjau dan dipulihkan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah tim kecil butuh release manager?&lt;/strong&gt;
Mereka butuh tanggung jawabnya, tetapi belum tentu jabatannya. Putar peran itu di antara engineer, beri orang yang bertugas checklist tertulis, dan pastikan seseorang memiliki masing-masing dari tujuh langkah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa yang harus ada di checklist rilis?&lt;/strong&gt;
Cakupan dikonfirmasi, pipeline hijau pada commit yang dirilis, jalur rollback disebut, persetujuan dicatat, smoke check setelah deploy, metrik dibandingkan dengan baseline, release notes terbit, support diberi tahu, dan tinjauan dijadwalkan. Jaga tetap satu halaman.&lt;/p&gt;
</content:encoded></item><item><title>Contoh release notes untuk setiap jenis perubahan</title><link>https://changeloop.dev/blog/id/release-notes-examples/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/release-notes-examples/</guid><description>Contoh release notes untuk fitur, perbaikan, breaking change, perbaikan keamanan, deprecation, catatan app store, dan catatan internal, beserta alasannya.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Contoh release notes terbaik itu singkat, menyebut siapa yang terdampak, dan menjelaskan apa yang
harus dilakukan berikutnya. Di bawah ini ada satu contoh untuk setiap jenis perubahan yang akan
Anda rilis, beserta alasan mengapa contoh itu berhasil, sehingga Anda bisa menyalin bentuknya dan
mengganti faktanya dengan milik Anda.&lt;/p&gt;
&lt;p&gt;Semua contoh adalah rekaan, untuk aplikasi invoice fiktif bernama Tidepool.&lt;/p&gt;
&lt;h2&gt;Apa kesamaan contoh release notes yang baik?&lt;/h2&gt;
&lt;p&gt;Semuanya memberi tahu pengguna apa yang berubah dan apa yang harus dilakukan, jika ada, dengan
bahasa pengguna. Setiap jenis perubahan punya tugas berbeda, jadi bentuknya bergeser di antara
mereka.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Jenis perubahan&lt;/th&gt;
&lt;th&gt;Entri harus menyebut&lt;/th&gt;
&lt;th&gt;Letaknya&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Fitur baru&lt;/td&gt;
&lt;td&gt;Apa yang sekarang bisa dilakukan pembaca, dan siapa yang mendapatkannya&lt;/td&gt;
&lt;td&gt;Paling atas catatan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peningkatan&lt;/td&gt;
&lt;td&gt;Apa yang jadi lebih cepat atau mudah, dengan angka jika ada&lt;/td&gt;
&lt;td&gt;Setelah fitur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perbaikan bug&lt;/td&gt;
&lt;td&gt;Gejala yang dilihat pembaca, dan bahwa itu sudah diperbaiki&lt;/td&gt;
&lt;td&gt;Setelah peningkatan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Breaking change&lt;/td&gt;
&lt;td&gt;Siapa yang terdampak, tanggalnya, migrasinya&lt;/td&gt;
&lt;td&gt;Pertama, selalu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perbaikan keamanan&lt;/td&gt;
&lt;td&gt;Apa yang terekspos, apakah dieksploitasi, apa yang harus dilakukan&lt;/td&gt;
&lt;td&gt;Pertama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deprecation&lt;/td&gt;
&lt;td&gt;Apa yang akan hilang, tanggal berakhirnya, penggantinya&lt;/td&gt;
&lt;td&gt;Dekat bagian atas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Catatan app store&lt;/td&gt;
&lt;td&gt;Satu kalimat sederhana per perubahan, dalam batas karakter&lt;/td&gt;
&lt;td&gt;Listing store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Catatan internal&lt;/td&gt;
&lt;td&gt;Apa yang berubah dan apa yang disampaikan ke pelanggan&lt;/td&gt;
&lt;td&gt;Kanal support dan sales&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Seperti apa catatan fitur baru yang baik?&lt;/h2&gt;
&lt;p&gt;Catatan fitur yang baik dibuka dengan apa yang sekarang bisa dilakukan pembaca dan menyebut paket
atau peran yang mendapatkannya. Ia melewatkan detail implementasi.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Kirim invoice dalam bahasa pelanggan.&lt;/strong&gt;
Sekarang Anda bisa memilih bahasa untuk setiap pelanggan, dan invoice, pengingat, serta halaman
pembayaran mereka mengikutinya. Bahasa Prancis, Jerman, Spanyol, dan Portugis tersedia di semua
paket. Atur di halaman pelanggan, di bawah Preferensi penagihan.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Judulnya adalah frasa yang akan diucapkan pembaca dengan lantang, dan isinya memberi cakupan dan
lokasi. Pembaca yang hanya memindai baris tebal tetap tahu apa yang dirilis. Metode yang lebih luas
ada di &lt;a href=&quot;https://changeloop.dev/blog/id/how-to-write-release-notes/&quot;&gt;cara menulis release notes&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Seperti apa catatan peningkatan yang baik?&lt;/h2&gt;
&lt;p&gt;Catatan peningkatan menjelaskan perubahan yang akan dirasakan pembaca, dan menaruh angka terukur
jika ada. Tanpa angka, sebutkan apa yang tidak perlu lagi dilakukan pembaca.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Daftar invoice dimuat sekitar tiga kali lebih cepat.&lt;/strong&gt;
Akun dengan lebih dari 5.000 invoice dulu menunggu sekitar sembilan detik untuk daftarnya. Sekarang
terbuka dalam sekitar tiga detik. Tidak ada tindakan yang diperlukan.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;quot;Peningkatan performa&amp;quot; tidak memberi tahu pembaca apa-apa, sedangkan sembilan detik lawan tiga
adalah klaim yang bisa mereka cek Senin pagi. Penutup &amp;quot;Tidak ada tindakan yang diperlukan&amp;quot;
menjawab pertanyaan yang dimiliki setiap pembaca.&lt;/p&gt;
&lt;h2&gt;Seperti apa catatan perbaikan bug yang baik?&lt;/h2&gt;
&lt;p&gt;Catatan perbaikan bug menjelaskan gejala yang dilihat pengguna, bukan penyebab di kode, dan
menyebut apakah mereka perlu mengulang sesuatu. Perbaikan yang tidak disadari siapa pun bisa masuk
ke daftar di bagian bawah.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Diperbaiki: email pengingat terkirim dua kali pada tanggal jatuh tempo.&lt;/strong&gt;
Sebagian pelanggan menerima dua pengingat identik jika invoice mereka jatuh tempo pada hari
terakhir bulan. Ini sudah diperbaiki. Pengingat yang sudah terkirim tidak terpengaruh, dan tidak
ada yang perlu mengirim ulang apa pun.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Judulnya diawali &amp;quot;Diperbaiki&amp;quot; sehingga pemindai bisa memilahnya sekilas, dan kondisi sebenarnya
(hari terakhir bulan) langsung mengikuti.&lt;/p&gt;
&lt;h2&gt;Bagaimana menulis release notes untuk breaking change?&lt;/h2&gt;
&lt;p&gt;Catatan breaking change dibuka dengan tanggal dan kelompok yang terdampak, lalu memberi migrasi
dalam entri yang sama. Letakkan paling pertama dalam release notes, karena ini satu-satunya entri
yang tidak boleh terlewat pembaca.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tanda tangan webhook menjadi wajib pada 1 Desember 2026.&lt;/strong&gt;
Mulai tanggal itu Tidepool berhenti mengirim payload webhook tanpa tanda tangan. Ini berdampak
pada siapa pun yang menerima webhook tanpa memeriksa header &lt;code&gt;Tidepool-Signature&lt;/code&gt;. Untuk
bermigrasi, verifikasi header dengan secret di Pengaturan, Developer. Jika Anda sudah
memverifikasi tanda tangan, tidak ada tindakan yang diperlukan.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tanggalnya ada di judul, sehingga bertahan saat dipindai. Kelompok yang terdampak disebut menurut
apa yang mereka lakukan, dan kalimat terakhir membebaskan orang yang sudah aman, yang mengurangi
beban support. Panduan tentang &lt;a href=&quot;https://changeloop.dev/blog/id/breaking-changes/&quot;&gt;breaking changes&lt;/a&gt; membahas cara
memutuskan apakah suatu perubahan termasuk.&lt;/p&gt;
&lt;h2&gt;Seperti apa catatan perbaikan keamanan?&lt;/h2&gt;
&lt;p&gt;Catatan keamanan menyebut apa yang terekspos, apakah ada yang mengeksploitasinya, siapa yang
terdampak, dan apa yang harus mereka lakukan. Tetap faktual dan tenang.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Keamanan: tautan reset password bisa dipakai ulang.&lt;/strong&gt;
Antara 3 dan 17 September 2026, tautan reset password tetap valid setelah dipakai sekali. Kami
tidak menemukan tanda bahwa ini dieksploitasi. Sudah diperbaiki, dan semua tautan reset yang
belum terpakai telah dibatalkan. Jika Anda meminta reset dalam rentang itu, minta tautan baru.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rentang waktu yang tepat membuat pembaca bisa menilai paparan mereka sendiri, dan kalimat tentang
eksploitasi menjawab pertanyaan pertama yang diajukan siapa pun. &amp;quot;Potensi masalah&amp;quot; terdengar
seperti menutup-nutupi, jadi nyatakan apa yang Anda ketahui.&lt;/p&gt;
&lt;h2&gt;Bagaimana menulis pemberitahuan deprecation?&lt;/h2&gt;
&lt;p&gt;Pemberitahuan deprecation menyebut apa yang akan dihapus, memberi tanggal akhir yang tegas, dan
menunjuk ke penggantinya.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Endpoint invoice v1 di-deprecate dan berakhir pada 1 Maret 2027.&lt;/strong&gt;
&lt;code&gt;GET /v1/invoices&lt;/code&gt; tetap berfungsi hingga 1 Maret 2027, lalu mengembalikan &lt;code&gt;410 Gone&lt;/code&gt;. Gunakan
&lt;code&gt;GET /v2/invoices&lt;/code&gt;, yang mengembalikan field yang sama plus &lt;code&gt;currency&lt;/code&gt;. Respons dari v1 kini
menyertakan header &lt;code&gt;Sunset&lt;/code&gt; dengan tanggal akhirnya. Panduan migrasi berdampingan ada di
dokumentasi.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nama endpoint ada di judul, karena orang yang terdampak mencarinya, dan penggantinya diletakkan di
samping penghapusan. Header &lt;code&gt;Sunset&lt;/code&gt; memberi tahu developer panggilan mana yang masih memakai
versi lama. Pembahasan yang lebih panjang ada di &lt;a href=&quot;https://changeloop.dev/blog/id/api-deprecation/&quot;&gt;mendeprecate API&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Seperti apa catatan rilis app store?&lt;/h2&gt;
&lt;p&gt;Catatan app store terdiri dari dua atau tiga kalimat sederhana, karena kebanyakan orang hanya
membaca baris pertama. Mulai dengan perubahan yang akan disadari pengguna.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pindai struk kertas dan Tidepool mengisi jumlah, tanggal, dan vendor. Mode gelap kini mengikuti
pengaturan ponsel Anda. Kami juga memperbaiki crash saat membuka invoice dari notifikasi.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Perubahan yang paling berguna ada di depan, dan perbaikannya menyebut situasi yang menyebabkan
crash. Tidak ada nomor versi dan tidak ada &amp;quot;perbaikan bug dan peningkatan&amp;quot;.
&lt;a href=&quot;https://changeloop.dev/blog/id/mobile-app-release-notes/&quot;&gt;Release notes untuk aplikasi mobile&lt;/a&gt; membahas aturan khusus
store.&lt;/p&gt;
&lt;h2&gt;Apa yang harus ada di catatan rilis internal?&lt;/h2&gt;
&lt;p&gt;Catatan internal adalah versi untuk support dan sales. Ia menambahkan apa yang dilewatkan catatan
publik: apa yang harus dikatakan, dan apa yang jangan dijanjikan.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Invoice multibahasa dirilis hari ini (semua paket).&lt;/strong&gt;
Support: pelanggan mengatur bahasa di Preferensi penagihan, dan invoice yang sudah ada tetap
memakai bahasa aslinya. Bahasa Italia belum tersedia. Sales: ini terbuka untuk setiap paket,
jadi jangan memosisikannya sebagai upgrade.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Setiap audiens mendapat baris berlabelnya sendiri, dan catatan itu menarik batasnya (&amp;quot;Bahasa
Italia belum tersedia&amp;quot;) sebelum pelanggan bertanya. Artikel
&lt;a href=&quot;https://changeloop.dev/blog/id/internal-release-notes/&quot;&gt;release notes internal&lt;/a&gt; membahas format dan kanalnya.&lt;/p&gt;
&lt;h2&gt;Seperti apa release note yang buruk, setelah ditulis ulang?&lt;/h2&gt;
&lt;p&gt;Release note yang buruk mendaftar apa yang dilakukan tim, bukan apa yang didapat pembaca.
Perbaiki dengan memindahkan hasilnya ke depan dan menghapus istilah internal.&lt;/p&gt;
&lt;p&gt;Sebelum:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;v3.8.1&lt;/strong&gt; Merefaktor scheduler pengingat. Memperbaiki race condition di &lt;code&gt;ReminderJob&lt;/code&gt;.
Memperbarui &lt;code&gt;bull&lt;/code&gt; ke 4.12. Peningkatan lain-lain.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sesudah:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Email pengingat tidak lagi terkirim dua kali.&lt;/strong&gt;
Pelanggan dengan invoice yang jatuh tempo pada hari terakhir bulan bisa menerima dua pengingat.
Itu sudah diperbaiki, dan pengingat yang sudah terkirim tidak perlu dikirim ulang. Tidak ada
tindakan yang diperlukan.&lt;/p&gt;
&lt;p&gt;Juga di 3.8.1: &lt;code&gt;bull&lt;/code&gt; diperbarui ke 4.12.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pembaruan dependensi turun menjadi baris catatan kaki, dan race condition berubah menjadi gejala
yang akan dikenali pelanggan.&lt;/p&gt;
&lt;h2&gt;Bagaimana menjaga release notes tetap konsisten antar rilis?&lt;/h2&gt;
&lt;p&gt;Susun draf setiap entri saat perubahan di-merge, dan minta seseorang menyetujuinya sebelum rilis.&lt;/p&gt;
&lt;p&gt;Changeloop bekerja dengan cara ini: ia membuat draf entri dari setiap pull request yang di-merge
dengan AI dan menahannya sampai disetujui manusia. Langkah persetujuan itulah tempat editor
menerapkan aturan di atas. Untuk menetapkan formatnya lebih dulu, mulailah dari
&lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;template release notes&lt;/a&gt;, dan lihat
&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;contoh changelog&lt;/a&gt; untuk melihat seperti apa halaman yang sudah jadi.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apa itu release notes baru?&lt;/strong&gt;
Release notes baru adalah pesan yang diterbitkan bersama rilis terbaru sebuah produk, yang
menjelaskan apa yang berubah dan apa yang perlu dilakukan pengguna. Isinya mencakup fitur,
peningkatan, perbaikan, dan breaking change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa perbedaan antara release note dan changelog?&lt;/strong&gt;
Changelog menyimpan semuanya, untuk siapa pun yang menginginkan riwayat penuh. Release note memilih
dari sana: satu rilis, ditulis untuk pembaca yang sedang menentukan apakah rilis itu penting bagi
mereka. Perbandingan lengkapnya ada di
&lt;a href=&quot;https://changeloop.dev/blog/id/changelog-vs-release-notes/&quot;&gt;changelog vs release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa arti release notes?&lt;/strong&gt;
Release notes memberi tahu pengguna apa yang berubah dalam sebuah rilis. Istilah ini mencakup apa
pun yang menjelaskan apa yang dirilis, dari teks &amp;quot;What&amp;#39;s New&amp;quot; di app store sampai halaman di situs
perusahaan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Seberapa panjang setiap entri release note?&lt;/strong&gt;
Dua sampai empat kalimat cukup untuk kebanyakan entri: hasilnya, siapa yang terdampak, dan apa
yang harus dilakukan. Breaking change atau perbaikan keamanan bisa lebih panjang karena butuh
tanggal atau migrasi.&lt;/p&gt;
</content:encoded></item><item><title>Versioning API Stripe: cara kerjanya dan apa yang ditiru</title><link>https://changeloop.dev/blog/id/stripe-api-versioning/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/stripe-api-versioning/</guid><description>Versioning API Stripe mengunci tiap akun ke versi bertanggal dan membolehkan setiap request menimpanya. Cara kerja, biaya, dan yang bisa ditiru API kecil.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Versioning API Stripe bekerja berdasarkan tanggal. Setiap akun dikunci ke versi API yang dinamai menurut tanggal rilis, dan satu request mana pun bisa menimpa kunci itu dengan header &lt;code&gt;Stripe-Version&lt;/code&gt;. Saat artikel ini ditulis (Oktober 2026), versi terkini di dokumentasi Stripe adalah &lt;code&gt;2026-09-30.endive&lt;/code&gt;, dan skema yang sama bisa ditiru API yang jauh lebih kecil dalam satu akhir pekan.&lt;/p&gt;
&lt;p&gt;Setiap fakta tentang Stripe di bawah berasal dari halaman Stripe sendiri, ditautkan di tempat dipakai.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mekanisme&lt;/th&gt;
&lt;th&gt;Yang dilakukan Stripe&lt;/th&gt;
&lt;th&gt;Sumber&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Nama versi&lt;/td&gt;
&lt;td&gt;Tanggal, plus nama rilis sejak 2024 (&lt;code&gt;2026-09-30.endive&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;Versioning&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versi default&lt;/td&gt;
&lt;td&gt;Dikunci di akun, diubah di Workbench&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;Versioning&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Override per request&lt;/td&gt;
&lt;td&gt;Header &lt;code&gt;Stripe-Version&lt;/code&gt;, atau opsi SDK&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/upgrades&quot;&gt;Upgrades&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webhook&lt;/td&gt;
&lt;td&gt;Dirender dalam versi yang diatur di endpoint&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/upgrades&quot;&gt;Upgrades&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kadens&lt;/td&gt;
&lt;td&gt;Rilis bulanan tanpa breaking change, rilis mayor dua kali setahun&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;Versioning&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versi lama&lt;/td&gt;
&lt;td&gt;Tetap berfungsi lewat modul perubahan versi internal&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://stripe.com/blog/api-versioning&quot;&gt;Engineering post&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Bagaimana versioning API Stripe bekerja?&lt;/h2&gt;
&lt;p&gt;Stripe memberi setiap akun versi API default, dan setiap request yang tidak menyebut versi memakai
versi itu. Pemanggil memilih kapan berpindah, dengan mengubah default atau mengatur versi pada
request tertentu.&lt;/p&gt;
&lt;p&gt;Engineering post Stripe menyatakan akun dikunci saat pertama kali membuat request API: akun itu
&amp;quot;automatically pinned to the most recent version available&amp;quot;, dan sejak itu setiap panggilan
secara implisit diberi versi tersebut.&lt;/p&gt;
&lt;p&gt;String versinya adalah tanggal. Sejak rilis &lt;code&gt;2024-09-30.acacia&lt;/code&gt;, string itu juga membawa nama,
seperti &lt;code&gt;2026-09-30.endive&lt;/code&gt;. Tanggal mengurutkan versi, dan nama memberi tahu keluarga rilis mayor
mana yang dimiliki sebuah versi.&lt;/p&gt;
&lt;h2&gt;Bagaimana memilih versi per request?&lt;/h2&gt;
&lt;p&gt;Kirim header &lt;code&gt;Stripe-Version&lt;/code&gt; pada request, atau atur versi di SDK. Panduan upgrade Stripe
menunjukkan bentuk header, dan panggilan yang sama berfungsi di lingkungan live maupun test.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;curl https://api.stripe.com/v1/charges \
  -u &amp;quot;$STRIPE_SECRET_KEY:&amp;quot; \
  -H &amp;quot;Stripe-Version: 2026-09-30.endive&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Panduan Stripe mencatat bahwa ketika Anda mengatur versi secara global atau per request di SDK,
objek respons kembali dalam versi itu.&lt;/p&gt;
&lt;p&gt;Stripe juga menyarankan agar tidak bersandar pada default akun. Dengan kata-katanya, tentukan
versi untuk setiap request, dengan header atau SDK yang dikunci, agar kode Anda yang memutuskan
versinya dan bukan pengaturan di dasbor.&lt;/p&gt;
&lt;p&gt;SDK mengunci dengan cara berbeda per bahasa. Dokumentasi menyatakan versi terbaru dari pustaka
berbahasa dinamis memakai versi API yang paling baru saat rilis SDK itu terbit, sedangkan yang
bertipe kuat (Java, Go, dan .NET) terkunci padanya. Memasang versi pustaka pada dasarnya adalah
memilih versi API.&lt;/p&gt;
&lt;h2&gt;Apa yang terjadi pada webhook ketika versi berubah?&lt;/h2&gt;
&lt;p&gt;Event webhook dirender dalam versi API yang melekat pada endpoint-nya, bukan versi yang dipakai
kode server Anda. Dokumentasi Stripe menyatakan event memakai versi yang diatur saat endpoint
dibuat, dan selain itu default akun. Mengubah versi SDK tidak mengubah apa yang diterima handler
webhook Anda.&lt;/p&gt;
&lt;p&gt;Jalur request dan jalur event Anda karena itu bisa berada pada dua versi berbeda. Untuk event
destination, Anda mengatur &lt;code&gt;snapshot_api_version&lt;/code&gt; hanya saat membuat destination, jadi versi yang
berbeda berarti destination baru.&lt;/p&gt;
&lt;p&gt;Jalur upgrade Stripe untuk ini adalah menjalankan secara paralel. Buat endpoint baru pada versi
target, kirim event yang sama ke keduanya, ajari handler memproses satu dan mengabaikan yang lain,
lalu beralih dan nonaktifkan endpoint lama. Karena setiap event tiba dua kali selama tumpang
tindih, handler harus idempoten. Itu pola yang bagus untuk ditiru bagi API apa pun yang memancarkan
event, dan &lt;a href=&quot;https://changeloop.dev/blog/id/webhook-changelog/&quot;&gt;changelog webhook&lt;/a&gt; adalah tempat Anda mengumumkan perubahan
payload yang membuatnya diperlukan.&lt;/p&gt;
&lt;h2&gt;Apa itu rilis bulanan dan rilis mayor?&lt;/h2&gt;
&lt;p&gt;Sejak rilis &lt;code&gt;2024-09-30.acacia&lt;/code&gt;, Stripe merilis versi API baru setiap bulan tanpa breaking change,
dan menerbitkan rilis mayor baru dua kali setahun yang dimulai dengan versi berisi breaking change.
Halaman versioning-nya menyatakan Anda bisa upgrade ke rilis bulanan mana pun tanpa memperbarui
kode, sedangkan rilis mayor bisa membutuhkan perubahan.&lt;/p&gt;
&lt;p&gt;Rilis mayor punya nama. Halaman versioning memberi Basil sebagai contoh, dan pengumuman proses
dari Stripe menyatakan nama-namanya berasal dari tumbuhan, dimulai dengan Acacia, dan rilis bulanan
mempertahankan nama rilis mayor sebelumnya agar namanya menandakan aman untuk di-upgrade.
&lt;a href=&quot;https://docs.stripe.com/changelog&quot;&gt;Changelog&lt;/a&gt; Stripe mendaftar nama yang dipakai, dan saat artikel
ini ditulis entri terbarunya adalah &lt;code&gt;2026-09-30.endive&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Jadi tanggal menjawab &amp;quot;seberapa baru&amp;quot;, dan nama menjawab &amp;quot;apakah ini batas breaking&amp;quot;. Pengumuman
Stripe juga menyisakan ruang untuk pengecualian: Stripe berhak merilis breaking change di luar
siklus jika sebuah integrasi akan sangat terdampak tanpanya. Pengumumannya ada di
&lt;a href=&quot;https://stripe.com/blog/introducing-stripes-new-api-release-process&quot;&gt;proses rilis API baru Stripe&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Apa versi terbaru API Stripe?&lt;/h2&gt;
&lt;p&gt;Saat artikel ini ditulis (Oktober 2026), halaman versioning Stripe menyatakan versi terkini adalah
&lt;code&gt;2026-09-30.endive&lt;/code&gt;, dan changelog-nya mencantumkan versi yang sama sebagai yang terbaru. Stripe
menerbitkan versi baru setiap bulan, jadi string apa pun yang tercetak di artikel cepat usang.
Baca changelog langsung sebelum mengunci apa pun, dan kunci versi yang Anda uji.&lt;/p&gt;
&lt;h2&gt;Bagaimana Stripe menjaga versi lama tetap berfungsi?&lt;/h2&gt;
&lt;p&gt;Stripe menjaga versi lama tetap hidup dengan menulis setiap breaking change sebagai modul perubahan
versi yang berdiri sendiri dan menerapkan modul-modul itu mundur dari bentuk data terbaru.
&lt;a href=&quot;https://stripe.com/blog/api-versioning&quot;&gt;Engineering post tentang versioning API&lt;/a&gt; menjelaskan
mekanismenya.&lt;/p&gt;
&lt;p&gt;Setiap modul menyatakan apa yang diubahnya, mendokumentasikan perubahan itu, dan menyertakan
fungsi transformasi. Post itu memberi contoh sebuah field yang berubah dari string menjadi hash.
Untuk membangun respons, sistem menentukan versi target, lalu berjalan mundur dalam waktu dan
menerapkan setiap modul yang ditemuinya sampai mencapai versi itu.&lt;/p&gt;
&lt;p&gt;Dua efek samping mengikuti dari desain itu, dan post tersebut menyebut keduanya. Karena modul
menyatakan field dan resource yang disentuhnya, Stripe bisa menghasilkan changelog API-nya dari
modul saat deployment. Dan karena versi akun diketahui, dokumentasi bisa menyesuaikan diri dengan
versi itu dan memperingatkan perubahan yang tidak kompatibel ke belakang sejak versi tersebut.&lt;/p&gt;
&lt;h2&gt;Berapa biayanya, dan apa yang sebaiknya ditiru API yang lebih kecil?&lt;/h2&gt;
&lt;p&gt;Versioning membutuhkan perhatian engineering, dan Stripe mengatakannya. Engineering post
mengakui adanya beban pemeliharaan dan menyatakan tujuan bahwa makin sedikit pemikiran yang
dibutuhkan untuk perilaku lama saat menulis kode baru, makin baik. Post itu juga menjelaskan
tinjauan API ringan sebelum rilis, agar perubahan versi tidak perlu dilakukan sama sekali.&lt;/p&gt;
&lt;p&gt;API kecil tidak sanggup membiayai rantai modul untuk setiap versi lama, dan tidak membutuhkannya.
Tiru bagian yang membawa nilai:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Versi bertanggal.&lt;/strong&gt; Tanggal tidak membutuhkan penilaian tentang apa yang dihitung &amp;quot;mayor&amp;quot;, dan
pemanggil bisa membacanya. Artikel &lt;a href=&quot;https://changeloop.dev/blog/id/api-versioning-best-practices/&quot;&gt;praktik terbaik versioning&lt;/a&gt;
membandingkannya dengan skema URL dan header.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Default yang dikunci.&lt;/strong&gt; Kunci akun atau key ke versi saat pemakaian pertama, agar API tidak
bergeser di bawah integrasi yang sudah berjalan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Override per request.&lt;/strong&gt; Header yang memungkinkan pemanggil menguji versi baru pada satu
panggilan, di produksi, sebelum berkomitmen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Versi pada endpoint webhook.&lt;/strong&gt; Payload event adalah tempat pemanggil paling sering terkejut.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Satu entri changelog per versi.&lt;/strong&gt; Buat entri itu menyebut versi, tanggal, siapa yang terdampak,
dan apa yang harus dilakukan. &lt;a href=&quot;https://changeloop.dev/blog/id/breaking-changes/&quot;&gt;Apa yang dihitung breaking&lt;/a&gt; adalah ujian
untuk apa yang pantas masuk versi baru, dan artikel &lt;a href=&quot;https://changeloop.dev/blog/id/api-changelog/&quot;&gt;changelog API&lt;/a&gt;
membahas entrinya sendiri.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Lewati rantai modul sampai jumlah versi yang didukung memaksanya. Dua atau tiga versi aktif bisa
ditangani dengan beberapa cabang dan tanggal sunset, yang dibahas
&lt;a href=&quot;https://changeloop.dev/blog/id/sunsetting-api-version/&quot;&gt;menutup versi API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Jika Anda menerbitkan changelog bertanggal, riwayat versi hanya sebaik entri-entrinya. Di
&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;Changeloop&lt;/a&gt;, draf entri dibuat dari setiap pull request yang di-merge dan ditahan agar
manusia menyetujuinya sebelum diterbitkan ke halaman dan feed changelog. Di situlah entri per
versi ditulis, dan satu gerbang manusia adalah tinjauan yang menyatakan apa yang harus dilakukan
pemanggil.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apa versi terbaru API Stripe?&lt;/strong&gt;
Saat artikel ini ditulis (Oktober 2026), halaman versioning Stripe menyatakan versi terkini adalah &lt;code&gt;2026-09-30.endive&lt;/code&gt;. Stripe menerbitkan versi baru setiap bulan, jadi periksa changelog-nya sebelum mengunci, dan tulis versinya di kode Anda alih-alih bersandar pada default akun.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana mengatur versi API Stripe pada sebuah request?&lt;/strong&gt;
Kirim header &lt;code&gt;Stripe-Version&lt;/code&gt;, misalnya &lt;code&gt;Stripe-Version: 2026-09-30.endive&lt;/code&gt;, atau atur versi di SDK sisi server Anda secara global atau per request. Tanpa keduanya, request memakai versi default akun Anda, yang Anda atur di Workbench.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah webhook memakai versi API Stripe yang sama dengan request saya?&lt;/strong&gt;
Belum tentu. Event webhook memakai versi yang diatur saat endpoint dibuat, dan default akun jika tidak ada yang diatur. Meng-upgrade SDK tidak mengubah payload yang diterima handler webhook Anda, jadi upgrade endpoint secara terpisah dan uji secara paralel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah versioning bertanggal ala Stripe cocok untuk API kecil?&lt;/strong&gt;
Versi bertanggal, default yang dikunci, header per request, dan satu entri changelog per versi itu murah dan layak ditiru. Rantai modul perubahan versi internal tidak, sampai Anda mendukung banyak versi lama sekaligus. Mulailah dengan dua versi aktif dan tanggal sunset untuk yang lebih tua.&lt;/p&gt;
</content:encoded></item><item><title>Siapa yang menulis changelog, dan siapa yang seharusnya</title><link>https://changeloop.dev/blog/id/changelog-entry-ownership/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/changelog-entry-ownership/</guid><description>Siapa yang menulis changelog? Penulis PR tahu apa yang berubah, PM tahu kenapa itu penting. Sendirian, keduanya tidak menulis entri yang berguna.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Tanyakan pada tim siapa yang menulis changelog dan jawaban jujurnya biasanya &amp;quot;siapa pun yang
ingat&amp;quot;, yang merupakan mode kegagalan yang sama yang coba diperbaiki &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-ci-enforcement/&quot;&gt;mewajibkan entri changelog
di CI&lt;/a&gt; di tingkat mekanis. Tapi memaksa entri ada tidak
memutuskan siapa yang memenuhi syarat untuk menulis yang baik, dan tim yang melewati pertanyaan
itu cenderung default ke siapa pun yang paling mudah diwajibkan, biasanya penulis PR, tanpa
memeriksa apakah itu benar-benar orang yang bisa menulisnya dengan baik.&lt;/p&gt;
&lt;h2&gt;Mengapa penulis PR tidak otomatis menjadi penulis changelog terbaik?&lt;/h2&gt;
&lt;p&gt;Karena dia tahu implementasinya, belum tentu dampaknya, dan itu jenis pengetahuan yang berbeda.
&lt;a href=&quot;https://changeloop.dev/blog/id/conventional-commits-changelog/&quot;&gt;Di mana conventional commits berhenti&lt;/a&gt; membahas
kesenjangan ini dari sisi pesan commit: &lt;code&gt;fix(auth): reject expired refresh tokens&lt;/code&gt; benar dan tidak
memberi tahu apa pun kepada pelanggan, dan orang yang menulis perbaikan itu sering kali orang yang
paling tidak siap menerjemahkannya, karena dia sudah berpikir dalam istilah bug itu selama
berjam-jam dan kehilangan pandangan luar tentang apa yang sebenarnya dialami pengguna. Ini alasan
yang sama mengapa penulis teknis ada sebagai profesi: menerjemahkan implementasi menjadi dampak
adalah keterampilan tersendiri, berbeda dari membangun sesuatu itu sendiri, dan itu butuh latihan
tak peduli seberapa bagus developer itu dalam kodenya sendiri.&lt;/p&gt;
&lt;h2&gt;Apakah itu berarti produk atau dukungan seharusnya menulis setiap entri sebagai gantinya?&lt;/h2&gt;
&lt;p&gt;Tidak, karena mereka punya kesenjangan yang berlawanan: mereka tahu apa yang penting bagi
pengguna tapi tidak selalu tahu apa yang sebenarnya dirilis, yang menghasilkan entri yang mudah
dibaca tapi kadang salah dalam cakupan, klaim &amp;quot;sekarang mendukung X&amp;quot; untuk fitur yang masih di
belakang flag, atau perbaikan yang digambarkan lengkap padahal hanya mencakup satu dari tiga
kasus. Mode kegagalan entri yang ditulis developer adalah sulit-dibaca-tapi-akurat; mode kegagalan
entri yang ditulis PM adalah mudah-dibaca-tapi-belum-terverifikasi. Tidak ada peran yang memiliki
kedua paruh dari apa yang dibutuhkan entri yang baik.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Peran&lt;/th&gt;
&lt;th&gt;Biasanya benar&lt;/th&gt;
&lt;th&gt;Biasanya salah&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Developer yang menulis kode&lt;/td&gt;
&lt;td&gt;Cakupan pasti dari apa yang berubah&lt;/td&gt;
&lt;td&gt;Membingkainya untuk seseorang yang tidak membangunnya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PM atau pemimpin dukungan&lt;/td&gt;
&lt;td&gt;Mengapa itu penting bagi pengguna&lt;/td&gt;
&lt;td&gt;Batasan pasti dari apa yang sebenarnya dirilis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pemilik changelog khusus&lt;/td&gt;
&lt;td&gt;Suara konsisten, memeriksa silang cakupan&lt;/td&gt;
&lt;td&gt;Butuh keduanya di atas untuk diperiksa silang&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Seperti apa sebenarnya model kepemilikan yang berhasil?&lt;/h2&gt;
&lt;p&gt;Draf dari siapa pun yang paling dekat dengan perubahan, ditinjau oleh siapa pun yang paling dekat
dengan pengguna, dengan satu orang bernama bertanggung jawab atas kata-kata akhir alih-alih semua
orang berasumsi orang lain akan menangkap masalah. Draf itu perlu ada dan akurat lebih daripada perlu bagus;
kalimat kasar yang ditulis developer yang dengan benar mengatakan apa yang berubah adalah
titik awal yang lebih baik daripada yang dipoles tapi belum diverifikasi, karena menulis ulang
untuk kejelasan lebih mudah daripada menulis ulang untuk kebenaran. Langkah tinjauan adalah di
mana PM atau pemimpin dukungan membaca draf dan mengajukan satu pertanyaan yang menangkap
kesenjangan keterbacaan: apakah saya akan memahami ini jika saya tidak melihat kodenya.&lt;/p&gt;
&lt;h2&gt;Haruskah orang yang sama selalu menjadi yang bertanggung jawab, atau bergilir?&lt;/h2&gt;
&lt;p&gt;Bernama dan stabil mengalahkan bergilir, setidaknya untuk persetujuan akhir. Pemilik bergilir
berarti setiap entri ditinjau oleh seseorang yang menurunkan ulang konvensi tim dari awal, yang
persis bagaimana suaranya melenceng dari entri ke entri dan pembaca mulai menyadari changelog
ditulis oleh komite. Satu orang, atau kelompok stabil yang sangat kecil, mengumpulkan
penilaian dari waktu ke waktu, kapan mengatakan &amp;quot;ditingkatkan&amp;quot; versus menyebutkan angka spesifik,
kapan perbaikan butuh entrinya sendiri versus dilipat ke dalam batch, dan penilaian itu lebih
berharga daripada mendistribusikan pekerjaan secara merata.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Draf (developer, dari PR):
&amp;quot;Fixed pagination cursor not respecting the `sort` param
in some edge cases.&amp;quot;

Ditinjau (pemilik changelog, diperiksa terhadap PR nyata):
&amp;quot;Diperbaiki: ekspor yang diurutkan berdasarkan tanggal
bisa mengembalikan hasil di luar urutan melewati halaman
pertama. Sekarang konsisten di semua halaman.&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Apakah tim kecil butuh proses sebanyak ini untuk satu baris teks?&lt;/h2&gt;
&lt;p&gt;Bukan peran sebagai orang terpisah, tapi dua langkahnya masih penting bahkan sendirian. Tim satu
orang adalah baik developer maupun peninjau, dan disiplin yang bertahan di skala itu adalah
melakukan tinjauan sebagai langkah mental terpisah, bukan langsung melompat dari menulis perbaikan
ke menerbitkan deskripsinya dalam satu tarikan napas. Jebakan di skala kecil adalah melewatkan
langkah kedua sepenuhnya, bukan kurangnya orang kedua, karena tidak ada yang eksternal
memaksanya, dan kesenjangan akurasi yang ada untuk ditangkap langkah itu tidak hilang hanya karena orang yang sama
secara teoretis bisa menyadari titik butanya sendiri.&lt;/p&gt;
&lt;h2&gt;Apa yang terjadi ketika tidak ada yang bertanggung jawab atas entri akhir?&lt;/h2&gt;
&lt;p&gt;Changelog memburuk secara tidak merata alih-alih gagal secara terbuka, yang lebih buruk karena
tidak ada yang menyadarinya sampai pembaca menunjukkannya. Beberapa entri tetap tajam karena siapa
pun yang menulisnya peduli; yang lain menjadi samar, &amp;quot;berbagai peningkatan dan perbaikan bug&amp;quot;,
karena siapa pun yang menulisnya bergerak cepat dan tidak ada yang menangkapnya sebelum
diterbitkan. Batasan format &lt;a href=&quot;https://changeloop.dev/blog/id/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt; menangkap
penyimpangan struktural, tanggal yang hilang, kategori yang salah, tapi tidak ada dalam template
yang menangkap entri samar yang secara teknis diformat dengan baik, yang persis kesenjangan yang
ada untuk ditutup pemilik bernama.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Haruskah pemilik changelog berupa peran engineering atau produk?&lt;/strong&gt;
Keduanya bisa berhasil jika orang tersebut punya kelancaran teknis untuk memverifikasi cakupan
sekaligus cukup jarak dari implementasi untuk menulis bagi pembaca luar; gelarnya kurang penting
daripada apakah dia bisa melakukan kedua paruh, atau tahu kepada siapa harus bertanya untuk paruh
yang tidak bisa dia lakukan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah jadwal bergilir gaya siaga pernah cocok untuk kepemilikan changelog?&lt;/strong&gt;
Untuk volume, kadang, jika tim terlalu kecil bagi satu orang untuk meninjau semuanya; untuk suara
dan penilaian, tidak, karena itu persis yang dikikis rotasi. Rotasi yang berbagi beban menulis
draf sambil mempertahankan satu peninjau stabil mendapat manfaatnya tanpa penyimpangannya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa tanda tercepat ada yang salah dengan susunan kepemilikan saat ini?&lt;/strong&gt;
Entri yang akurat tapi sulit dibaca, atau mudah dibaca tapi salah dalam cakupan, dalam pola yang
mengikuti siapa yang menulisnya. Jika kualitas berkorelasi dengan penulis alih-alih tetap
konsisten, kepemilikan adalah kesenjangannya, bukan keterampilan menulis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah otomasi mengurangi seberapa penting kepemilikan?&lt;/strong&gt;
Itu mengurangi seberapa banyak penulisan yang dibutuhkan, bukan seberapa banyak penilaian yang
dibutuhkan. &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-automation/&quot;&gt;Otomasi changelog&lt;/a&gt; membahas apa yang bisa dihasilkan
pipeline dengan aman, pemformatan, penerbitan, cross-posting; kata-kata, pengelompokan, dan apa
yang dianggap layak disebutkan tetap menjadi keputusan manusia tidak peduli seberapa banyak
pipeline yang diotomasi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana jika penulis PR dan peninjau tidak setuju soal kata-katanya?&lt;/strong&gt;
Keputusan peninjau yang menang, karena pertanyaan yang mereka jawab, apakah pembaca luar akan
memahami ini, adalah yang menjadi alasan peran itu ada. Itu tidak membuat pandangan developer tidak
berharga: jika ketidaksepakatannya soal akurasi alih-alih pemilihan kata, peninjau yang mengalah,
karena cakupan adalah bagian yang harus benar dari penulis. Memisahkan dua jenis ketidaksepakatan
ini, kata-kata versus akurasi, menghentikan sebagian besar sebelum berubah jadi kebuntuan.&lt;/p&gt;
</content:encoded></item><item><title>Release notes darurat: menulis di bawah tekanan waktu nyata</title><link>https://changeloop.dev/blog/id/emergency-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/emergency-release-notes/</guid><description>Rilis yang dipicu insiden butuh catatan yang ditulis dalam hitungan menit, bukan hari. Proses penulisan biasa mengasumsikan waktu yang tidak Anda miliki.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kebanyakan release notes ditulis setelah kode selesai, ditinjau dengan santai, dan diterbitkan
sesuai jadwal yang tidak ada hubungannya dengan seberapa mendesak seseorang perlu membacanya.
Rilis darurat, patch keamanan, bug kehilangan data, perbaikan gangguan, membalikkan semua kondisi
itu sekaligus: catatan harus ada sebelum kebanyakan orang biasanya akan mulai menulisnya, hampir
tidak mendapat tinjauan, dan dibaca orang yang cemas alih-alih santai. &lt;a href=&quot;https://changeloop.dev/blog/id/how-to-write-release-notes/&quot;&gt;Cara menulis release
notes&lt;/a&gt; membahas proses normal; ini tentang apa yang berubah
saat tidak ada waktu tersisa untuk mengikutinya.&lt;/p&gt;
&lt;h2&gt;Apa satu hal yang harus benar dilakukan catatan rilis darurat jika tidak ada hal lain?&lt;/h2&gt;
&lt;p&gt;Apakah pembaca perlu melakukan sesuatu, dinyatakan di kalimat pertama, tanpa framing apa pun
sebelumnya. Pembaca yang menemukan catatan rilis yang dipicu insiden sering kali sudah khawatir,
karena mendengar tentang masalah dari halaman status, thread dukungan, atau penggunanya sendiri,
dan catatan yang dibuka dengan konteks sebelum item tindakan terbaca sebagai menahan informasi
tepat dalam keadaan di mana menahan terbaca paling buruk. &amp;quot;Tidak perlu tindakan, ini menambal
kerentanan yang tidak memerlukan data pengguna untuk dieksploitasi&amp;quot; dan &amp;quot;Perbarui segera: rilis
ini memperbaiki bug yang bisa menampilkan data satu akun ke akun lain&amp;quot; keduanya satu kalimat, dan
keduanya melakukan seluruh pekerjaan yang dibutuhkan pembaca yang panik sebelum membaca hal lain
apa pun.&lt;/p&gt;
&lt;h2&gt;Apakah pengeditan biasa masih berlaku saat tidak ada waktu untuk melakukannya?&lt;/h2&gt;
&lt;p&gt;Naluri untuk memampatkan bertahan bahkan saat proses banyak draf yang biasanya menghasilkannya
tidak bertahan. &lt;a href=&quot;https://changeloop.dev/blog/id/how-to-write-release-notes/&quot;&gt;Penulisan ulang&lt;/a&gt; menjelaskan memangkas
draf pertama yang bertele-tele menjadi kalimat esensialnya; di bawah tekanan waktu sering kali
tidak ada draf pertama untuk dipangkas, yang berarti disiplinnya harus berjalan di kepala Anda
saat menulis alih-alih sebagai langkah terpisah setelahnya. Cara tercepat untuk mendekatinya:
tulis kalimat yang akan Anda katakan dengan lantang kepada seseorang yang bertanya &amp;quot;apa yang perlu
saya ketahui&amp;quot;, lalu berhenti, karena kalimat itu biasanya baik yang tercepat diproduksi maupun
satu-satunya yang benar-benar akan diproses pembaca dalam keadaan itu.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Release note normal&lt;/th&gt;
&lt;th&gt;Release note darurat&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Ditulis setelah tinjauan kode, sebelum publikasi&lt;/td&gt;
&lt;td&gt;Sering ditulis bersamaan dengan perbaikan, sebelum tinjauan lengkap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dioptimalkan untuk kemudahan pindai di banyak entri&lt;/td&gt;
&lt;td&gt;Dioptimalkan agar satu entri dibaca terisolasi, di bawah stres&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bisa menunda detail ke changelog yang ditautkan&lt;/td&gt;
&lt;td&gt;Harus mendahulukan satu fakta yang paling penting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Framing dan konteks disambut baik&lt;/td&gt;
&lt;td&gt;Framing sebelum item tindakan terbaca sebagai penundaan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apakah pernah tidak apa-apa menerbitkan catatan sebelum benar-benar yakin apa penyebab masalahnya?&lt;/h2&gt;
&lt;p&gt;Ya, jika catatannya jujur tentang ketidakpastian itu alih-alih menyiratkan keyakinan yang tidak
Anda miliki. &amp;quot;Kami telah menyebarkan perbaikan untuk tingkat error yang meningkat di checkout;
kami masih mengonfirmasi akar penyebabnya dan akan memperbarui catatan ini&amp;quot; bisa dipertahankan dan
membeli waktu dengan benar; catatan yang menyatakan penyebab spesifik yang sebenarnya belum Anda
konfirmasi adalah jenis tebakan yang menjadi hal yang dikutip kembali orang kepada Anda nanti jika
ternyata salah. Disiplin yang penting di sini bukan kecepatan diagnosis, tapi tidak pernah
membiarkan keyakinan catatan melebihi keyakinan tim yang sebenarnya, karena klaim teknis yang
salah dalam catatan darurat merusak kepercayaan lebih daripada ketidaktahuan yang diakui.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Terlalu yakin, belum diverifikasi:
&amp;quot;Fixed: a race condition in the payment webhook handler
caused duplicate charges.&amp;quot;

Jujur di bawah tekanan waktu:
&amp;quot;Diperbaiki: beberapa pelanggan dikenakan biaya dua kali
untuk satu pesanan. Kami telah menghentikan kejadian baru
dan mengembalikan dana akun yang terdampak dalam 24 jam.
Menyelidiki akar penyebab.&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Apakah catatan darurat harus menyebutkan penyebab masalahnya, atau hanya bahwa itu sudah diperbaiki?&lt;/h2&gt;
&lt;p&gt;Katakan apa yang diperbaiki dan apa yang harus dilakukan pembaca; simpan akar penyebab untuk
tindak lanjut begitu benar-benar diketahui, bukan diperkirakan. Pembaca di tengah insiden ingin
tepat dua fakta, apakah ini sudah teratasi dan apakah ini memengaruhi saya, dan penjelasan akar
penyebab, bahkan yang akurat, bersaing dengan dua fakta itu untuk perhatian pada momen terburuk
untuk kehilangannya. Postmortem, diterbitkan terpisah begitu investigasi selesai, adalah tempat
akar penyebab seharusnya berada; mencampur kedua dokumen di bawah tekanan waktu menghasilkan
catatan yang lebih lambat ditulis dan lebih lambat dibaca, kebalikan dari yang dibutuhkan
keadaan darurat.&lt;/p&gt;
&lt;h2&gt;Apakah masalah pembaruan paksa dari aplikasi mobile juga berlaku di sini?&lt;/h2&gt;
&lt;p&gt;Prinsip yang sama, lebih dipampatkan lagi. &lt;a href=&quot;https://changeloop.dev/blog/id/mobile-app-release-notes/&quot;&gt;Release notes untuk aplikasi mobile&lt;/a&gt;
membahas pembaruan paksa, di mana catatan harus menyatakan alasan dan tenggat waktu sebelum apa
pun karena pembaca sudah kesal karena tidak punya pilihan; release note darurat web biasanya
opt-in bagi pembaca dalam artian mereka memilih apakah akan bertindak berdasarkan itu, tapi naluri
&amp;quot;nyatakan batasan lebih dulu&amp;quot; yang sama berlaku, hanya karena alasan berbeda: bukan kekesalan,
kemendesakan.&lt;/p&gt;
&lt;h2&gt;Bagaimana menghindari catatan darurat terbaca sebagai pengakuan kesalahan padahal seharusnya tidak?&lt;/h2&gt;
&lt;p&gt;Jelaskan perbaikannya dan efeknya, bukan kesalahannya, dan tahan dorongan untuk meminta maaf
berlebihan, yang terbaca sebagai pengisi bagi pembaca yang menginginkan dua fakta di atas. &amp;quot;Kami
menemukan dan memperbaiki bug yang memengaruhi beberapa ekspor&amp;quot; menyatakan apa yang terjadi tanpa
menambahkan drama padanya; &amp;quot;Kami sangat menyesal atas masalah serius ini yang berdampak pada
pelanggan kami yang berharga&amp;quot; menunda informasi yang berguna satu kalimat penuh untuk menyampaikan
momen emosional yang tidak diminta pembaca. Catatan yang singkat dan faktual tidak dingin, itu
menghormati keadaan pembaca yang sebenarnya, yang di bawah tekanan nyata adalah ketidaksabaran,
bukan kebutuhan akan ketenangan.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Haruskah release note darurat melalui proses tinjauan yang sama dengan yang normal?&lt;/strong&gt;
Yang lebih ringan, bukan tanpa sama sekali: satu peninjau cepat yang memeriksa bahwa catatan
tidak melebih-lebihkan kepastian sepadan dengan beberapa menit yang dibutuhkannya, karena risiko
klaim teknis yang tidak ditinjau menjadi salah lebih tinggi justru karena ditulis dengan cepat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah tidak apa-apa menerbitkan catatan darurat tanpa tautan ke detail lebih lanjut?&lt;/strong&gt;
Hanya sebentar. Catatan tanpa tautan berfungsi sebagai hal pertama yang diterbitkan; tambahkan
satu ke halaman status atau tindak lanjut begitu salah satunya ada, karena pembaca yang
menginginkan lebih dari satu kalimat yang Anda berikan butuh tempat untuk pergi, meskipun tempat
itu mengatakan &amp;quot;detail lebih lanjut segera&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah catatan darurat pernah dilewati sepenuhnya, membiarkan perbaikan dirilis secara diam-diam?&lt;/strong&gt;
Hanya untuk masalah yang tidak bisa disadari atau terdampak oleh pembaca mana pun; jika ada
kemungkinan pembaca mengalami masalahnya, catatan adalah yang memberi tahu mereka bahwa itu sudah
berakhir, dan keheningan terbaca seolah masalahnya mungkin masih aktif.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Berapa lama catatan darurat harus tetap disematkan atau menonjol setelah insiden teratasi?&lt;/strong&gt;
Sampai jendela kecemasan langsung menutup, biasanya satu atau dua hari, lalu bisa melipat ke
dalam changelog normal seperti entri lainnya; catatan yang tetap disematkan selama berminggu-minggu
mulai terbaca sebagai kekhawatiran yang belum teratasi alih-alih yang sudah teratasi.&lt;/p&gt;
</content:encoded></item><item><title>Protobuf breaking changes: apa yang bertahan di wire</title><link>https://changeloop.dev/blog/id/grpc-protobuf-api-changes/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/grpc-protobuf-api-changes/</guid><description>Protobuf breaking changes terjadi di wire, bukan di URL. Sebagian perubahan field gRPC gratis, sebagian merusak setiap client diam-diam, dan tampak sama.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;API REST berubah saat bentuk JSON berubah, dan sebagian besar bentuk itu terlihat di respons yang
bisa Anda baca di browser. API gRPC berubah saat berkas &lt;code&gt;.proto&lt;/code&gt; berubah, dan format biner wire
milik Protocol Buffers punya aturan sendiri tentang apa yang bisa ditoleransi client yang tidak
ada hubungannya dengan apa yang dikatakan nama field. Dua penyuntingan yang terlihat sama kecilnya
di diff, menomori ulang sebuah field versus menambahkannya, jatuh di sisi berlawanan dari garis
yang &lt;a href=&quot;https://changeloop.dev/blog/id/breaking-changes/&quot;&gt;breaking changes&lt;/a&gt; gambar secara umum: satu tidak terlihat bagi
setiap client yang ada, yang lain merusak semuanya sekaligus. Membedakan protobuf breaking changes
dari yang aman berarti membaca aturan format wire itu sendiri, bukan menebak dari bagaimana
perubahan itu terbaca di diff &lt;code&gt;.proto&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Mengapa penomoran field lebih penting daripada nama field dalam Protobuf?&lt;/h2&gt;
&lt;p&gt;Karena format wire mengkodekan field berdasarkan nomor, bukan nama. Kode yang dihasilkan dalam
setiap bahasa membaca dan menulis nomor-nomor itu; nama field &lt;code&gt;email&lt;/code&gt; di berkas &lt;code&gt;.proto&lt;/code&gt; Anda
adalah kemudahan bagi manusia yang tidak pernah menyentuh byte biner yang dikirim lewat
jaringan. Mengganti nama field, &lt;code&gt;email&lt;/code&gt; menjadi &lt;code&gt;email_address&lt;/code&gt;, aman di wire biner selama
nomornya tetap sama, yang mengejutkan insinyur yang terbiasa dengan REST, di mana key JSON yang
diganti namanya adalah persis jenis perubahan yang merusak client. Pengecualiannya adalah kasus REST yang sama:
&lt;a href=&quot;https://protobuf.dev/programming-guides/json/&quot;&gt;format ProtoJSON dan text&lt;/a&gt; menserialisasi nama, jadi
mengganti nama merusak transcoding JSON (grpc-gateway, misalnya), berkas text-format dan field
mask. Menomori ulang field yang sama,
mempertahankan nama tapi mengubah &lt;code&gt;1&lt;/code&gt; menjadi &lt;code&gt;7&lt;/code&gt;, adalah kebalikannya persis: tidak terlihat
dalam review kode yang hanya menampilkan nama, dan itu merusak setiap pesan yang dikirim atau
diterima client sejak titik itu.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Perubahan&lt;/th&gt;
&lt;th&gt;Aman di wire&lt;/th&gt;
&lt;th&gt;Mengapa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Mengganti nama field, mempertahankan nomornya&lt;/td&gt;
&lt;td&gt;Biner ya, JSON dan text tidak&lt;/td&gt;
&lt;td&gt;Pengkodean biner menggunakan nomor; ProtoJSON dan format text menggunakan nama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mengubah nomor sebuah field&lt;/td&gt;
&lt;td&gt;Tidak&lt;/td&gt;
&lt;td&gt;Setiap pesan yang ada sekarang dibaca sebagai field yang salah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menambah field baru dengan nomor baru&lt;/td&gt;
&lt;td&gt;Ya&lt;/td&gt;
&lt;td&gt;Client lama mengabaikan field yang tidak mereka kenali&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menghapus field, menggunakan ulang nomor lamanya untuk hal lain&lt;/td&gt;
&lt;td&gt;Tidak&lt;/td&gt;
&lt;td&gt;Data lama diterjemahkan ke field baru yang salah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mengubah tipe field secara tidak kompatibel (mis. &lt;code&gt;int32&lt;/code&gt; ke &lt;code&gt;string&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Tidak&lt;/td&gt;
&lt;td&gt;Pengkodean wire berbeda per tipe&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apa yang membuat menghapus field berbeda dari melakukannya dalam respons JSON REST?&lt;/h2&gt;
&lt;p&gt;Nomornya menjadi radioaktif. &lt;a href=&quot;https://protobuf.dev/programming-guides/proto3/&quot;&gt;Panduan resmi Protobuf&lt;/a&gt;
merekomendasikan menandai nomor field yang dihapus sebagai &lt;code&gt;reserved&lt;/code&gt; alih-alih membiarkannya digunakan ulang, karena penggunaan ulang
adalah di mana kerusakan sebenarnya terjadi: client yang masih menjalankan kode yang dihasilkan
bulan lalu mengirim pesan menggunakan nomor lama field itu untuk makna lama, dan server, yang
sekarang mengharapkan nomor itu berarti sesuatu yang lain, salah menafsirkan data secara diam-diam
alih-alih menolaknya secara langsung. REST tidak punya jebakan setara, karena key JSON yang
dihapus hanya berhenti muncul; tidak ada cara bagi permintaan client lama untuk diam-diam
ditafsirkan ulang sebagai sesuatu yang lain. Berkas &lt;code&gt;.proto&lt;/code&gt; dengan &lt;code&gt;reserved 4, 9, 12;&lt;/code&gt; di atas
sebuah message adalah bekas luka permanen, dan itulah maksudnya: itu menghentikan nomor tersebut
diberikan ke field baru oleh seseorang yang tidak tahu sejarahnya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-protobuf&quot;&gt;message Invoice {
  reserved 4; // dulu `legacy_customer_id`, dihapus 2026-06-01
  reserved &amp;quot;legacy_customer_id&amp;quot;; // namanya juga, untuk JSON/text
  string customer_id = 5;
  string status = 6;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Apakah menambah field pernah membutuhkan entri changelog sama sekali?&lt;/h2&gt;
&lt;p&gt;Biasanya bukan entri breaking change, tapi sering kali entri biasa, karena &amp;quot;aman di wire&amp;quot; dan
&amp;quot;tidak terlihat bagi pembaca yang peduli&amp;quot; adalah dua klaim berbeda. Menambah field ke pesan
respons tidak membebani apa pun secara struktural, client lama menerjemahkan pesan dan
mengabaikan field baru secara otomatis. Tapi seseorang yang membangun integrasi baru terhadap
layanan itu tidak punya cara mengetahui field itu ada kecuali seseorang memberi tahunya, karena
tidak ada yang di build sukses atau tes yang lolos membuat field opsional baru terlihat. &lt;a href=&quot;https://changeloop.dev/blog/id/api-changelog/&quot;&gt;Changelog
API&lt;/a&gt; membahas secara umum apa yang dihutangi entri aditif kepada pembaca;
alasan khusus gRPC untuk tetap menulis satu adalah tidak ada padanan untuk menjelajahi respons
REST di debugger untuk menyadari bahwa key baru muncul.&lt;/p&gt;
&lt;h2&gt;Bagaimana ini berbeda dari apa yang dihadapi pemanggil GraphQL?&lt;/h2&gt;
&lt;p&gt;Aturan untuk penambahan sama, tapi eksposurnya berbeda. &lt;a href=&quot;https://changeloop.dev/blog/id/graphql-schema-deprecation/&quot;&gt;Deprecation skema GraphQL&lt;/a&gt;
membahas model di mana client hanya menerima field yang secara eksplisit dimintanya, yang membuat
perubahan aditif pada dasarnya tanpa risiko dan penghapusan menjadi satu-satunya bahaya nyata.
Client gRPC, sebaliknya, menerima apa pun yang dikirim server dan menerjemahkan semuanya terhadap
salinan skema hasil kompilasi mereka sendiri; paparan client tidak dibatasi oleh apa yang
dimintanya, hanya oleh apa yang bisa dibaca kode yang dihasilkannya. Perbedaan itu penting untuk
menulis changelog: entri GraphQL bisa secara wajar mengasumsikan bahwa client terlindungi dari
field yang tidak mereka minta, dan entri gRPC sama sekali tidak bisa mengasumsikan itu.&lt;/p&gt;
&lt;h2&gt;Apakah memversikan layanan gRPC bekerja sama seperti &lt;code&gt;/v1/&lt;/code&gt;, &lt;code&gt;/v2/&lt;/code&gt; REST?&lt;/h2&gt;
&lt;p&gt;Mekanismenya berbeda bahkan saat niatnya sama. &lt;a href=&quot;https://changeloop.dev/blog/id/api-versioning-best-practices/&quot;&gt;Apa itu v1 dan v2 dalam API
REST&lt;/a&gt; membahas versi sebagai jalur URL paralel yang
melayani kontrak berbeda; layanan gRPC biasanya memversikan lewat nama paket di berkas &lt;code&gt;.proto&lt;/code&gt;
itu sendiri, &lt;code&gt;payments.v1.InvoiceService&lt;/code&gt; menjadi &lt;code&gt;payments.v2.InvoiceService&lt;/code&gt;, yang mengubah nama
layanan yang sepenuhnya memenuhi syarat yang dipanggil client alih-alih segmen URL yang
dimintanya. Kedua pendekatan menyelesaikan masalah yang sama, membiarkan kontrak lama tetap
berfungsi sementara yang baru ada, tapi tim yang berasal dari latar belakang REST sering mencari
nomor versi di tempat yang salah dan melewatkan bahwa deklarasi paket sedang melakukan pekerjaan
itu.&lt;/p&gt;
&lt;h2&gt;Apa yang seharusnya benar-benar disebutkan entri changelog gRPC?&lt;/h2&gt;
&lt;p&gt;Pesannya, nomor field-nya, dan apakah itu aditif atau penghapusan yang membutuhkan migrasi, dalam
urutan kepentingan itu bagi pembaca yang memutuskan apakah harus bertindak. &amp;quot;Menambahkan
&lt;code&gt;shipping_address&lt;/code&gt; (field 8) ke &lt;code&gt;Order&lt;/code&gt;&amp;quot; memberi tahu integrator semua yang diperlukan untuk
memperbarui kode yang dihasilkan dan mulai menggunakannya. &amp;quot;Mencadangkan field 4 pada &lt;code&gt;Invoice&lt;/code&gt;,
&lt;code&gt;legacy_customer_id&lt;/code&gt; hilang&amp;quot; memberi tahunya untuk memeriksa apakah ada sesuatu di kode basisnya
yang masih membaca field itu, sesuatu yang tidak dikomunikasikan catatan gaya REST &amp;quot;menghapus
field dari respons&amp;quot; dengan urgensi yang sama, karena penghapusan REST hanya mengembalikan lebih
sedikit data sementara penggunaan ulang field Protobuf secara aktif merusaknya.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Bisakah tipe field pernah diubah tanpa merusak format wire?&lt;/strong&gt;
Hanya dalam grup kompatibel spesifik yang didokumentasikan Protobuf, seperti memperlebar &lt;code&gt;int32&lt;/code&gt;
ke &lt;code&gt;int64&lt;/code&gt; dalam beberapa kasus. Perlakukan perubahan tipe apa pun sebagai breaking kecuali Anda
sudah memeriksanya terhadap tabel kompatibilitas Protobuf sendiri; mengasumsikan kompatibilitas
melalui analogi dengan sistem tipe suatu bahasa adalah bagaimana ini menjadi salah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah mendepresiasi field dalam Protobuf bekerja seperti direktif &lt;code&gt;@deprecated&lt;/code&gt; GraphQL?&lt;/strong&gt;
Mirip: Protobuf mendukung opsi field &lt;code&gt;[deprecated = true]&lt;/code&gt; yang bisa ditampilkan tooling. Keduanya
tidak ditegakkan: server GraphQL tetap menjawab query untuk field yang di-deprecate, dan client
protobuf tetap mengkodekannya. Keduanya bersifat penasihat dan membutuhkan dukungan changelog yang sama.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah menomori ulang pernah aman jika Anda mengontrol setiap client?&lt;/strong&gt;
Dalam sistem yang sepenuhnya tertutup, pada prinsipnya, tapi itu menghilangkan seluruh properti
keamanan yang menjadi alasan keberadaan nomor field, dan &amp;quot;kami mengontrol setiap client&amp;quot; adalah
klaim yang berhenti benar begitu build di-cache, deploy tertunda, atau client ditambahkan yang
tidak ada yang ingat. Cadangkan nomornya alih-alih menggunakannya ulang, bahkan secara internal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah layanan gRPC membutuhkan halaman changelog seperti API REST publik?&lt;/strong&gt;
Hanya jika tim eksternal mengonsumsinya tanpa membaca diff &lt;code&gt;.proto&lt;/code&gt; secara langsung, tes &amp;quot;siapa
yang ada di sisi lain&amp;quot; yang sama yang diterapkan &lt;a href=&quot;https://changeloop.dev/blog/id/internal-api-changelog/&quot;&gt;changelog API internal&lt;/a&gt;
secara umum. Layanan gRPC yang hanya dikonsumsi layanan lain dari tim yang sama sering bisa
melewati changelog formal demi riwayat commit, karena siapa pun yang membacanya sudah membuka
skemanya.&lt;/p&gt;
</content:encoded></item><item><title>Format berkas changelog: JSON, YAML, atau cukup Markdown</title><link>https://changeloop.dev/blog/id/changelog-file-formats/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/changelog-file-formats/</guid><description>Format berkas changelog menentukan apakah ia bisa memasok halaman dan widget, atau hanya dibaca manusia. Markdown, JSON, dan YAML punya biaya yang berbeda.</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Sebagian besar tim memulai changelog sebagai berkas Markdown karena itu jalur dengan resistansi
paling kecil: bisa dibaca dalam diff pull request, bisa dibaca di GitHub tanpa merender apa pun,
dan familiar bagi siapa pun yang pernah menulis README. Pilihan itu berjalan baik sampai sesuatu
selain manusia perlu membaca berkas itu, halaman, widget, ringkasan email, dan saat itu format
berhenti gratis. &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-automation/&quot;&gt;Otomasi changelog&lt;/a&gt; membahas kebutuhan struktural
secara umum, tipe, tanggal, badan, dan tautan; ini membahas format berkas mana yang benar-benar
memberikan struktur itu dan berapa biaya untuk mencapainya di masing-masing format.&lt;/p&gt;
&lt;h2&gt;Apa yang salah dengan changelog Markdown biasa?&lt;/h2&gt;
&lt;p&gt;Tidak ada, sampai sesuatu perlu mem-parsingnya kembali ke dalam field. Judul, tanggal, dan daftar
berpoin di bawahnya remeh dibaca bagi manusia dan sungguh sulit di-parsing dengan andal, karena
Markdown tidak punya skema: tanggal bisa ada di judul, tebal di baris pertama, atau sama sekali
tidak ada di entri lama, dan setiap variasi itu adalah Markdown valid yang dibaca benar oleh
manusia dan tidak oleh parser. Tim yang mengotomasi changelog Markdown biasanya berakhir menulis
parser regex khusus yang rusak begitu format sebuah entri sedikit saja melenceng, yang sering
terjadi, karena tidak ada yang memaksa konsistensi saat menulis.&lt;/p&gt;
&lt;h2&gt;Apa yang sebenarnya didapat dari format terstruktur?&lt;/h2&gt;
&lt;p&gt;Jaminan bahwa setiap entri punya bentuk yang sama, diperiksa saat entri ditulis alih-alih ditebak
saat dibaca. Berkas JSON atau YAML dengan skema yang ditentukan, tipe, tanggal, versi, audiens,
badan, tautan, gagal dengan berisik jika field wajib hilang, sama seperti respons API yang ketat;
berkas Markdown hanya merender apa pun yang ada, benar atau tidak. Perbedaan itu tak terlihat
sampai hari sebuah skrip butuh tanggal setiap entri untuk mengurutkan feed, dan separuh entri
menyimpannya di tempat berbeda.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# CHANGELOG.yml
- date: 2026-09-05
  type: breaking
  version: v2
  audience: api
  body: &amp;quot;POST /invoices now rejects a currency mismatch instead of silently converting.&amp;quot;
  link: /blog/api-changelog/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Apakah itu berarti berkas yang bisa dibaca manusia harus hilang?&lt;/h2&gt;
&lt;p&gt;Tidak, dan mencoba membuat berkas YAML atau JSON berperan ganda sebagai apa yang dibaca manusia
dalam pull request biasanya kesalahan ke arah sebaliknya: meninjau diff JSON bersarang lebih buruk
daripada meninjau kalimat prosa, dan peninjau yang harus mem-parsing struktur data secara mental
untuk menangkap kesalahan kata-kata adalah peninjau yang akhirnya berhenti menangkap kesalahan
kata-kata. Kedua format bisa berdampingan: data terstruktur adalah sumber kebenaran yang dibaca
pipeline otomasi, dan rendering Markdown atau HTML yang dihasilkan adalah yang benar-benar
ditinjau dan dibaca manusia, diproduksi dari berkas terstruktur alih-alih dirawat manual di
sampingnya.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Bisa dibaca manusia apa adanya&lt;/th&gt;
&lt;th&gt;Bisa di-parsing mesin tanpa kode khusus&lt;/th&gt;
&lt;th&gt;Mode kegagalan umum&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;td&gt;Ya&lt;/td&gt;
&lt;td&gt;Tidak&lt;/td&gt;
&lt;td&gt;Bentuk entri tidak konsisten merusak parser naif&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;Buruk&lt;/td&gt;
&lt;td&gt;Ya&lt;/td&gt;
&lt;td&gt;Bertele-tele; mudah salah edit manual jadi JSON tidak valid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YAML&lt;/td&gt;
&lt;td&gt;Cukup&lt;/td&gt;
&lt;td&gt;Ya&lt;/td&gt;
&lt;td&gt;Sensitif spasi; indentasi salah adalah kesalahan parsing diam, bukan berisik&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Format terstruktur mana yang sebenarnya lebih mudah diedit manual, JSON atau YAML?&lt;/h2&gt;
&lt;p&gt;YAML, bagi siapa pun yang menulis entri secara manual alih-alih lewat generator, karena ia
menghilangkan penguncian kutip dan pencocokan kurung yang dituntut JSON untuk setiap string dan
objek bersarang. Trade-off-nya adalah sensitivitas spasi YAML gagal secara diam dengan cara yang
biasanya tidak dilakukan ketidakcocokan kurung JSON: parser JSON langsung menolak input yang cacat,
sementara parser YAML bisa menerima berkas yang salah indentasi dan begitu saja mem-parsingnya ke
struktur yang salah, yang merupakan kegagalan lebih buruk karena tidak ada yang memberi tahu Anda
itu terjadi. Jika entri selalu hanya ditulis oleh skrip, trade-off ini sebagian besar hilang dan
parsing JSON yang lebih ketat menjadi pilihan default yang lebih aman.&lt;/p&gt;
&lt;h2&gt;Apakah halaman changelog butuh format terstruktur sendiri, terpisah dari berkas yang memasoknya?&lt;/h2&gt;
&lt;p&gt;Bukan yang terpisah, yang sama dirender berbeda. &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-page/&quot;&gt;Halaman changelog&lt;/a&gt;
membahas cara membuat halaman itu sendiri bisa dibaca mesin lewat feed JSON dan markup schema.org;
feed itu adalah output yang dihasilkan, bukan sumber kebenaran kedua yang harus disinkronkan
dengan berkas yang mendasarinya. Merawat data terstruktur secara manual di dua tempat, berkas
sumber dan feed halaman, adalah cara keduanya akhirnya melenceng, jadi keputusan format berkas
yang diambil di sini seharusnya menjadi satu-satunya hal yang darinya semua yang hilir, halaman,
widget, email, dihasilkan, tidak pernah disalin manual.&lt;/p&gt;
&lt;h2&gt;Apakah biaya migrasi mengubah changelog Markdown yang ada ke format terstruktur sepadan?&lt;/h2&gt;
&lt;p&gt;Biasanya hanya begitu otomasi menjadi tujuan sebenarnya, bukan sebelumnya. Proyek satu orang yang
menerbitkan berkas Markdown di README GitHub tidak punya kebutuhan otomasi nyata, dan mengubahnya
ke YAML tidak membeli apa pun selain seremoni. Konversi itu membayar dirinya sendiri saat lebih
dari satu konsumen hilir, halaman, email ringkasan, feed publik, butuh membaca data yang sama,
karena itu persis titik di mana ketidakkonsistenan parser Markdown mulai menghasilkan output yang
terlihat salah alih-alih hanya menjengkelkan untuk dirawat.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Bisakah changelog Markdown dibuat bisa di-parsing tanpa mengubah format sepenuhnya?&lt;/strong&gt;
Sebagian, dengan frontmatter: blok YAML kecil di atas setiap entri (tanggal, tipe, versi) di
samping badan Markdown untuk prosa. Ini mendapatkan field terstruktur yang dibutuhkan parser tanpa
memaksa seluruh entri ke JSON atau YAML, dan ini titik tengah yang masuk akal bagi tim yang belum
siap untuk migrasi penuh.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah format berkas penting untuk SEO atau untuk bagaimana halaman changelog peringkat?&lt;/strong&gt;
Tidak secara langsung. Mesin pencari membaca halaman yang dirender, bukan berkas sumber, jadi
format berkas tidak terlihat bagi mereka; yang penting bagi halaman itu sendiri adalah apakah ia
bisa dibaca mesin dengan haknya sendiri, yang merupakan urusan terpisah dari apa yang
menghasilkannya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah setiap entri changelog melalui berkas yang sama, atau bisakah tipe dipisah ke beberapa berkas?&lt;/strong&gt;
Satu berkas lebih sederhana sampai volume entri membuatnya sulit di-diff atau ditinjau; memisah
berdasarkan tahun atau kategori adalah katup pelepas yang masuk akal begitu diff satu berkas
menjadi terlalu besar untuk ditinjau dengan wajar, tapi itu menambah langkah penggabungan sebelum
apa pun di hilir bisa membaca &amp;quot;semua entri&amp;quot; sebagai satu daftar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah ada format berkas changelog standar, seperti ada standar untuk RSS?&lt;/strong&gt;
Tidak ada yang diadopsi secara luas. Keep a Changelog mengusulkan konvensi Markdown, dan beberapa
alat punya format sendiri; sebuah &lt;a href=&quot;https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md&quot;&gt;changeset&lt;/a&gt;
adalah berkas Markdown dengan frontmatter YAML yang menyebut paket dan kenaikan versinya, yaitu pola
frontmatter yang dijelaskan di atas. Tidak satu pun dari
ini adalah format yang dibaca alat lain langsung dari awal seperti pembaca RSS memahami RSS secara
universal.&lt;/p&gt;
</content:encoded></item><item><title>Permintaan fitur duplikat: menggabung tanpa kehilangan suara</title><link>https://changeloop.dev/blog/id/duplicate-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/duplicate-feature-requests/</guid><description>Mengelompokkan permintaan duplikat melindungi hitungan. Menggabung sembarangan menghilangkan kata-kata pembuat satunya berguna, kerugian yang lebih kecil.</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Tiga pelanggan meminta kapabilitas yang sama dalam tiga minggu berbeda, diungkapkan dengan tiga
cara berbeda, dan proses triase yang dibangun untuk menangkap duplikat melakukan tugasnya: ia
mengelompokkan mereka, menghitungnya sebagai satu permintaan dengan tiga suara, dan backlog tetap
bersih. Itu bagian mudahnya. &lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-tracking/&quot;&gt;Label mana yang layak dipakai&lt;/a&gt;
membahas mengelompokkan berdasarkan kapabilitas mendasar sebelum triase berdasarkan kata-kata
sebagai perbaikan mekanis untuk duplikat; yang tidak dibahas adalah apa yang terjadi pada
kata-kata itu sendiri begitu tiga permintaan menjadi satu baris, dan kerugian itu biasanya lebih
besar daripada masalah penghitungan duplikat yang diselesaikannya.&lt;/p&gt;
&lt;h2&gt;Apa yang sebenarnya hilang saat duplikat digabung?&lt;/h2&gt;
&lt;p&gt;Kata-kata spesifik yang digunakan setiap pemohon, yang sering lebih informatif daripada hitungan
suara tempat ia menyusut. Satu pelanggan mungkin meminta &amp;quot;cara mengekspor hasil yang difilter&amp;quot;,
yang lain &amp;quot;ekspor CSV yang menghormati filter tersimpan saya&amp;quot;, dan yang ketiga &amp;quot;ekspor yang tidak
menyertakan kolom tersembunyi&amp;quot;. Ketiganya adalah permintaan mendasar yang sama, dikelompokkan
dengan benar, tapi setiap kata-kata membawa penekanan sedikit berbeda tentang apa yang penting
bagi orang itu, dan penggabungan yang hanya menyimpan kata-kata dari pengiriman pertama membuang
sepenuhnya dua lainnya. Hitungan bertahan; tekstur yang akan membantu seseorang membangun versi
fitur yang tepat, tidak.&lt;/p&gt;
&lt;h2&gt;Mengapa tekstur penting jika hitungan suara sudah mengatakan permintaan itu ada?&lt;/h2&gt;
&lt;p&gt;Karena permintaan dan desain adalah pertanyaan berbeda, dan hanya kata-kata spesifik yang
menjawab yang kedua. Sepuluh suara pada &amp;quot;ekspor&amp;quot; memberi tahu tim bahwa fitur itu layak dibangun;
tidak mengatakan apa pun tentang apakah &amp;quot;ekspor&amp;quot; berarti CSV, PDF, email terjadwal, atau endpoint
API, dan penggabungan yang membuang sembilan dari sepuluh pengiriman asli demi kata-kata yang
pertama bisa diam-diam mempersempit spesifikasi ke apa pun yang kebetulan diminta pemohon pertama
itu, meskipun sembilan lainnya menginginkan sesuatu yang sedikit berbeda. &lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-tracking/&quot;&gt;Apa yang sebenarnya
harus dicatat permintaan fitur&lt;/a&gt; membahas celah yang sama persis
dari sisi asupan; menggabung duplikat adalah tempat itu muncul kembali setelah asupan, tepat pada
titik di mana tim paling membutuhkan rentang dari apa yang sebenarnya diminta.&lt;/p&gt;
&lt;h2&gt;Seperti apa proses penggabungan yang menyimpan kata-kata alih-alih membuangnya?&lt;/h2&gt;
&lt;p&gt;Menambahkan alih-alih mengganti. Item kanonik menyimpan satu judul untuk tampilan backlog, tapi
kata-kata asli dari setiap pengiriman yang digabung tetap melekat padanya, entah sebagai daftar
kutipan atau sebagai tiket sumber yang ditautkan, sehingga siapa pun yang meninjau item itu
kemudian bisa melihat rentang nyata dari apa yang diminta orang alih-alih ringkasan satu anggota
tim. Ini hampir tidak berbiaya untuk dibangun, satu field pada tiket alih-alih sistem baru, dan
ini perbedaan antara penggabungan yang memampatkan informasi dan yang hanya memampatkan
tampilannya.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Fitur: Ekspor CSV yang difilter
Suara: 12
Permintaan yang digabung:
  - &amp;quot;cara mengekspor hasil yang difilter&amp;quot; (acct_4421)
  - &amp;quot;ekspor CSV yang menghormati filter tersimpan saya&amp;quot; (acct_8832)
  - &amp;quot;ekspor yang tidak menyertakan kolom tersembunyi&amp;quot; (acct_1097)
  ...
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Apakah setiap duplikat layak digabung, atau ada kecocokan yang salah?&lt;/h2&gt;
&lt;p&gt;Beberapa adalah kecocokan yang salah, dan memperlakukan &amp;quot;terdengar mirip&amp;quot; sebagai &amp;quot;adalah
permintaan yang sama&amp;quot; adalah mode kegagalannya sendiri. &amp;quot;Biarkan saya mengekspor data saya&amp;quot; dan
&amp;quot;biarkan saya mengekspor hanya tampilan yang difilter&amp;quot; bisa dikelompokkan oleh kecocokan kata
kunci pada &amp;quot;ekspor&amp;quot; padahal sebenarnya menggambarkan dua cakupan berbeda dari kapabilitas umum
yang sama; menggabungnya entah menggembungkan hitungan suara untuk hal yang salah atau, lebih
buruk, merilis versi yang lebih sempit karena kebetulan tiba lebih dulu. Tinjauan manusia atas
pengelompokan, bahkan yang cepat, menangkap ini sebelum menumpuk; kecocokan kemiripan otomatis
saja akan menggabung berlebihan berdasarkan kosakata dan menggabung kurang berdasarkan niat.&lt;/p&gt;
&lt;h2&gt;Kapan sebenarnya pengecekan duplikat harus berjalan, saat asupan atau belakangan?&lt;/h2&gt;
&lt;p&gt;Keduanya, untuk alasan berbeda. Pengecekan saat asupan menangkap kasus yang jelas, permintaan baru
yang menyatakan ulang sesuatu yang sudah terbuka, sebelum itu sempat menjadi baris item terlacak
tersendiri; pencarian kemiripan terhadap permintaan terbuka saat pengiriman menangani kebanyakan
kasus ini tanpa melibatkan manusia. Tinjauan kedua belakangan, pada kadensi yang lebih lambat,
menangkap kasus yang terlewat asupan: dua permintaan yang memakai bahasa cukup berbeda untuk lolos
dari kecocokan kata kunci atau embedding saat itu, tapi ternyata, begitu tim sudah melihat selusin
variasi, menggambarkan kapabilitas mendasar yang sama. Melewatkan tinjauan kedua membiarkan
hampir-duplikat tersebar di bawah judul terpisah tanpa batas waktu, masing-masing dengan hitungan
suara kecilnya sendiri yang tidak pernah bertambah ke angka yang seharusnya membuatnya dibangun.&lt;/p&gt;
&lt;h2&gt;Haruskah pemohon tahu pengirimannya digabung ke item yang sudah ada?&lt;/h2&gt;
&lt;p&gt;Ya, dan ini disiplin yang sama dengan &lt;a href=&quot;https://changeloop.dev/blog/id/customer-feedback-loop/&quot;&gt;menutup lingkaran umpan balik pelanggan&lt;/a&gt;
diterapkan satu langkah lebih awal dari biasanya: pemohon yang mengirim sesuatu dan tidak pernah
mendengar kabar lagi menyimpulkan permintaannya tidak ke mana-mana, meskipun digabung dengan benar
ke item dengan sebelas suara lain yang akhirnya dirilis. Konfirmasi singkat, &amp;quot;kami telah
menggabungkan ini dengan permintaan yang sudah ada yang juga dibuat orang lain&amp;quot;, berbiaya satu
pesan dan mencegah pelanggan mengirim ulang permintaan yang sama setiap beberapa bulan karena
tidak punya visibilitas apakah itu pernah benar-benar dilacak.&lt;/p&gt;
&lt;h2&gt;Apakah menggabung mengubah siapa yang mendapat kredit saat fitur dirilis?&lt;/h2&gt;
&lt;p&gt;Seharusnya menyertakan semua orang, bukan hanya yang mengirim pertama. &lt;a href=&quot;https://changeloop.dev/blog/id/customer-feedback-loop/&quot;&gt;Menutup lingkaran umpan
balik&lt;/a&gt; membahas memberi tahu pemohon saat permintaan mereka
dirilis; untuk item yang digabung itu berarti setiap akun yang melekat pada penggabungan, bukan
hanya yang kata-katanya menjadi judul kanonik, karena dari sudut pandang setiap pemohon dia
meminta ini dan itu dirilis, tanpa peduli kata-kata siapa yang kebetulan disimpan proses triase. Dengan Changeloop itu
berarti pull request menyebut setiap issue yang tertaut (&lt;code&gt;Fixes #142, fixes #187&lt;/code&gt;); issue yang tidak
disebutnya tidak mendapat komentar.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Berapa banyak kata-kata yang layak disimpan per permintaan yang digabung, kutipan atau tautan tiket lengkap?&lt;/strong&gt;
Kutipan singkat biasanya cukup untuk kasus umum, karena tujuannya membiarkan peninjau melihat
rentang kata-kata sekilas; simpan juga tautan tiket lengkap ketika yang asli punya konteks
tambahan signifikan, seperti tangkapan layar atau deskripsi alur kerja rinci yang akan diratakan
kutipan satu baris.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah menyimpan kata-kata setiap duplikat membuat backlog lebih sulit dipindai?&lt;/strong&gt;
Tidak, jika dilipat secara default. Judul kanonik adalah yang dilihat peninjau yang memindai
cepat; kata-kata yang digabung berjarak satu klik atau satu perluasan, hadir bagi yang melakukan
riset lebih dalam tapi tanpa memenuhi tampilan bagi yang hanya menghitung suara.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana jika dua permintaan terlihat identik tapi ternyata menginginkan hal berbeda setelah dibangun?&lt;/strong&gt;
Pisahkan lagi begitu itu menjadi jelas, dan perlakukan penggabungan asli sebagai keputusan masuk
akal yang dibuat dengan informasi yang tersedia saat itu, bukan sebagai kesalahan yang harus
dihindari diulangi. Sistem pengelompokan yang tidak pernah membatalkan penggabungan apa pun
akhirnya akan punya beberapa penggabungan salah yang tertanam permanen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah ada ambang suara di mana permintaan yang digabung harus mendapat tinjauan manusia atas kata-kata mendasarnya?&lt;/strong&gt;
Bukan angka tetap, tapi permintaan apa pun yang mendekati keputusan pembangunan layak mendapatkan
itu tanpa peduli hitungan suara, karena itu titik di mana perbedaan antara &amp;quot;ekspor&amp;quot; dan &amp;quot;ekspor
sebagai CSV dengan filter tersimpan&amp;quot; berhenti menjadi nuansa dan mulai menjadi spesifikasi.&lt;/p&gt;
</content:encoded></item><item><title>Deprecation GraphQL tanpa nomor versi</title><link>https://changeloop.dev/blog/id/graphql-schema-deprecation/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/graphql-schema-deprecation/</guid><description>GraphQL tidak punya v1 atau v2 di URL. Field di-deprecate satu per satu dengan directive, pada satu skema bersama, yang mengubah kewajiban changelog.</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;API REST bisa merilis &lt;code&gt;/v2/&lt;/code&gt; berdampingan dengan &lt;code&gt;/v1/&lt;/code&gt; dan membiarkan pemanggil berpindah sesuai
kecepatan mereka sendiri. GraphQL punya satu skema di satu endpoint, dan setiap client, aplikasi
mobile dengan build tahun lalu dan dashboard internal yang dirilis pagi ini, mengkueri graph yang
sama. Tidak ada URL untuk di-fork. Men-deprecate sebuah field berarti menandainya sebagai
deprecated di tempat, dalam skema yang sudah menjadi tumpuan semua orang, yang membuat disiplinnya
berbeda dari REST meskipun masalah dasarnya, memberi tahu pemanggil bahwa sesuatu akan hilang,
sama dengan yang dibahas &lt;a href=&quot;https://changeloop.dev/blog/id/api-deprecation/&quot;&gt;deprecation API&lt;/a&gt; secara umum.&lt;/p&gt;
&lt;h2&gt;Bagaimana GraphQL menandai field sebagai deprecated, jika tidak ada versi untuk dinaikkan?&lt;/h2&gt;
&lt;p&gt;Dengan &lt;a href=&quot;https://spec.graphql.org/October2021/#sec--deprecated&quot;&gt;directive &lt;code&gt;@deprecated&lt;/code&gt;&lt;/a&gt;, diterapkan langsung pada field:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-graphql&quot;&gt;type Product {
  price: Float @deprecated(reason: &amp;quot;Use priceV2 for multi-currency support.&amp;quot;)
  priceV2: Money
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Field tetap bisa dikueri. Ia tidak hilang, tidak mengembalikan 404, tidak mengubah perilaku; ia
hanya membawa catatan yang bisa dibaca mesin yang akan ditampilkan sebagian besar alat GraphQL,
GraphiQL, Apollo Studio, linter skema, kepada siapa pun yang menelusuri skema atau menulis kueri
terhadapnya. Ini seluruh mekanismenya. Tidak ada endpoint deprecation terpisah, tidak ada header,
tidak ada dokumen pendamping yang diwajibkan spec, yang menjadi baik daya tariknya maupun
jebakannya: directive mudah ditambahkan dan mudah diabaikan, karena tidak ada yang memaksa client
untuk melihatnya.&lt;/p&gt;
&lt;h2&gt;Apakah ada yang benar-benar melihat alasan deprecation?&lt;/h2&gt;
&lt;p&gt;Hanya yang menggunakan skema secara langsung, lewat introspection atau editor yang sadar skema,
dan itu audiens yang lebih kecil daripada pembaca biasa changelog API. Aplikasi mobile yang
dibangun terhadap sebuah kueri enam bulan lalu sudah memanggang kueri itu ke dalam binary-nya; ia
akan terus meminta &lt;code&gt;price&lt;/code&gt; dan terus mendapat jawaban, deprecated atau tidak, sampai seseorang
membangun ulang aplikasi dengan field baru dan merilis pembaruan. Directive memberi tahu developer
yang menulis kode baru untuk tidak menggunakan field lama. Ia tidak melakukan apa pun untuk client
yang sudah dirilis dan berjalan.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mekanisme&lt;/th&gt;
&lt;th&gt;Siapa yang terjangkau&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Directive &lt;code&gt;@deprecated&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Developer yang menelusuri skema atau menulis kueri baru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kegagalan CI dari linter skema&lt;/td&gt;
&lt;td&gt;Tim pemilik basis kode client, jika mereka menjalankan satu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entri changelog&lt;/td&gt;
&lt;td&gt;Siapa pun yang membacanya, termasuk tim client tanpa linter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tidak ada (field tetap berfungsi)&lt;/td&gt;
&lt;td&gt;Client yang sudah dibangun yang menggunakan field lama&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apakah field yang deprecated tetap harus mendapat entri changelog?&lt;/h2&gt;
&lt;p&gt;Ya, dan itu melakukan lebih banyak pekerjaan daripada directive saja, karena changelog menjangkau
orang yang tidak bisa dijangkau directive: tim mitra yang mengonsumsi graph tanpa menelusuri
skemanya, client yang dibangun terhadap salinan skema yang di-cache berbulan-bulan lalu, siapa pun
yang hanya akan menyadarinya dengan membaca prosa. &lt;a href=&quot;https://changeloop.dev/blog/id/api-changelog/&quot;&gt;Changelog API&lt;/a&gt;
membahas secara umum apa yang menjadi kewajiban entri kepada pemanggil; entri GraphQL berutang
satu hal yang jarang harus dijelaskan REST, karena pemanggil REST menyimpulkannya dari nomor
versi: apakah field lama masih berfungsi hari ini, masih berfungsi dengan peringatan, atau
benar-benar berhenti mengembalikan data. Directive saja tidak menjawab semua itu untuk pembaca
yang tidak pernah membuka skema.&lt;/p&gt;
&lt;h2&gt;Kapan sebenarnya aman menghapus field dari skema?&lt;/h2&gt;
&lt;p&gt;Hanya setelah log kueri menunjukkan tidak ada yang memintanya lagi, yang merupakan pertanyaan
penggunaan, bukan pertanyaan kalender. Sebuah field bisa membawa &lt;code&gt;@deprecated&lt;/code&gt; selama setahun dan
tetap menjadi penopang bagi satu client yang tidak pernah dibangun ulang; menghapusnya pada
jadwal tetap, seperti yang sering dilakukan &lt;code&gt;Sunset&lt;/code&gt; REST, merusak client itu tanpa peringatan
yang bisa ditindaklanjuti, karena GraphQL tidak memberinya apa pun untuk ditindaklanjuti selain
directive yang tidak pernah dibacanya. Catat penggunaan tingkat field sebelum berkomitmen pada
tanggal penghapusan, dan perlakukan hitungan kueri bukan nol sebagai jeda, bukan hitung mundur.&lt;/p&gt;
&lt;h2&gt;Apakah menambah field membawa risiko yang sama seperti di API REST?&lt;/h2&gt;
&lt;p&gt;Lebih rendah, untuk field baru, karena client GraphQL hanya menerima field yang diminta secara
eksplisit. Menambah &lt;code&gt;priceV2&lt;/code&gt; di samping &lt;code&gt;price&lt;/code&gt; tidak bisa merusak kueri yang ada dengan cara
menambah field ke respons JSON REST bisa merusak deserializer yang ketat, karena tidak ada yang
memaksa client meminta field baru. Menambah nilai ke enum yang sudah ada adalah pengecualian yang
layak disebutkan dalam napas yang sama: client yang men-switch pada setiap nilai enum secara
ekshaustif, sesuatu yang didorong bahasa dengan tipe kuat, rusak begitu nilai baru muncul, terlepas
apakah ada kueri yang memintanya atau tidak. Keamanan ini hanya berlaku untuk field dan anggota
union yang dipilih sendiri oleh client; tidak berlaku untuk himpunan tertutup yang dienumerasi
tangan oleh kode client.&lt;/p&gt;
&lt;h2&gt;Apa yang dibutuhkan entri changelog GraphQL yang tidak dibutuhkan entri REST?&lt;/h2&gt;
&lt;p&gt;Bentuk kueri, bukan hanya nama field, karena &amp;quot;field &lt;code&gt;price&lt;/code&gt; deprecated&amp;quot; kehilangan bagian yang
benar-benar dibutuhkan pemanggil: tipe mana dan kueri mana yang menyentuhnya. Entri yang berguna
menyebutkan tipe, field, field pengganti, dan, jika bisa dibuat, kueri aktual di produksi yang
masih meminta bentuk lama. Bagian terakhir itu, mengaitkan pemberitahuan deprecation dengan
penggunaan nyata, adalah yang didapat gratis oleh pemanggil REST dari log server pada sebuah URL
dan tidak didapat pemanggil GraphQL, karena setiap kueri mengenai endpoint yang sama apa pun yang
dimintanya.&lt;/p&gt;
&lt;h2&gt;Adakah selain field yang bisa membawa directive &lt;code&gt;@deprecated&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;Nilai enum, menggunakan directive yang sama di definisi nilai itu sendiri, bukan di field:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-graphql&quot;&gt;enum ShippingMethod {
  STANDARD
  EXPRESS
  OVERNIGHT @deprecated(reason: &amp;quot;Use EXPRESS with priority: true instead.&amp;quot;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Spec mendefinisikan &lt;code&gt;@deprecated&lt;/code&gt; untuk tepat dua lokasi, definisi field atau nilai enum, dan tidak
ada yang lain per rilis stabilnya; deprecation tingkat argumen dan input-field hanya ada dalam
bahasa draft yang lebih baru, bukan dalam apa yang diimplementasikan kebanyakan server hari ini.
Nilai enum yang ditandai dengan cara ini tetap menjadi nilai sah yang masih bisa dikembalikan atau
diterima server, janji tidak-breaking yang sama seperti yang dibuat field yang deprecated, yang
membuatnya aman dirilis sebelum benar-benar menghapus nilai itu.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apakah GraphQL mendukung sesuatu seperti header Sunset untuk seluruh endpoint?&lt;/strong&gt;
Tidak, karena biasanya hanya ada satu endpoint. Waktu deprecation hidup di tingkat field, dalam
teks alasan directive &lt;code&gt;@deprecated&lt;/code&gt; dan dalam changelog atau panduan migrasi apa pun yang
diterbitkan tim di sampingnya, bukan dalam header respons yang bisa dibaca client secara
programatik.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bisakah field yang deprecated dihapus lalu ditambahkan kembali nanti dengan tipe berbeda?&lt;/strong&gt;
Hanya sebagai nama field baru. Memperkenalkan kembali nama field yang sama dengan tipe yang
berubah adalah persis breaking change yang ingin dihindari siklus deprecation; beri pengganti
namanya sendiri, seperti yang dilakukan &lt;code&gt;priceV2&lt;/code&gt;, dan biarkan yang lama benar-benar punah
sebelum namanya bebas untuk digunakan lagi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah teks alasan &lt;code&gt;@deprecated&lt;/code&gt; menautkan ke entri changelog?&lt;/strong&gt;
Ya, ketika tooling skema mendukungnya. Field alasan menerima string biasa, dan URL di dalam
string itu adalah jalan terpendek dari developer yang menatap output introspection ke penjelasan
lebih lengkap yang bisa diberikan entri changelog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah perubahan skema GraphQL pernah backward compatible dengan cara yang tidak dimiliki REST?&lt;/strong&gt;
Perubahan field aditif, ya, karena alasan di atas: client hanya mendapat apa yang mereka minta.
Nilai enum baru adalah pengecualiannya, karena client yang mengenumerasi himpunan tertutup bisa
rusak pada nilai yang tidak diperkirakannya. Penghapusan dan perubahan tipe persis sama
breaking-nya dengan padanan RESTnya.&lt;/p&gt;
</content:encoded></item><item><title>Cara menulis panduan migrasi API</title><link>https://changeloop.dev/blog/id/api-migration-guide/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/api-migration-guide/</guid><description>Panduan migrasi API mengubah perubahan tak kompatibel menjadi checklist, bukan gangguan. Apa yang dibutuhkan, dan mengapa entri changelog saja tak cukup.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Panduan migrasi API adalah dokumen yang mengubah perubahan tak kompatibel menjadi checklist,
bukan gangguan: apa yang berubah, apa yang harus dilakukan, dan sampai kapan. Entri changelog bisa
menyebutkan perubahan tak kompatibel dalam dua kalimat; panduan migrasi adalah yang benar-benar
dibuka pemanggil ketika dua kalimat itu berkata &amp;quot;ini merusak Anda&amp;quot; dan mereka perlu tahu persis
apa yang harus diedit. Mempublikasikan entri tanpa panduan adalah cara pemanggil mengetahui
perubahan tak kompatibel dari tiket dukungan alih-alih dari dokumen yang ditulis untuk
mencegahnya.&lt;/p&gt;
&lt;h2&gt;Apa itu panduan migrasi API?&lt;/h2&gt;
&lt;p&gt;Dokumen langkah demi langkah yang membawa pemanggil dari bentuk lama API ke yang baru, ditulis
untuk seseorang dengan kode yang harus diubah, bukan seseorang yang masih memutuskan apakah akan
mengadopsi API. Perbedaan itu penting: panduan migrasi mengasumsikan integrasi yang sudah ada dan
lalu lintas produksi yang sudah ada, jadi harus mencakup rollback, migrasi parsial, dan cara
mengetahui apakah migrasi berhasil, semua yang tidak dibutuhkan panduan integrasi pertama.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dokumen&lt;/th&gt;
&lt;th&gt;Mengasumsikan&lt;/th&gt;
&lt;th&gt;Menjawab&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Panduan migrasi&lt;/td&gt;
&lt;td&gt;Integrasi yang sudah ada&lt;/td&gt;
&lt;td&gt;Bagaimana saya pindah dari bentuk lama ke baru?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entri changelog&lt;/td&gt;
&lt;td&gt;Tidak ada, hanya pembaca yang mengecek&lt;/td&gt;
&lt;td&gt;Apa yang berubah, dan kapan?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Referensi API&lt;/td&gt;
&lt;td&gt;Tidak ada, atau integrasi pertama&lt;/td&gt;
&lt;td&gt;Apa fungsi endpoint ini?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pemberitahuan deprecation&lt;/td&gt;
&lt;td&gt;Integrasi yang memakai yang lama&lt;/td&gt;
&lt;td&gt;Kapan ini berhenti berfungsi?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Panduan migrasi biasanya berada di antara dua yang terakhir: pemberitahuan deprecation memulai
jam, dan panduan migrasi adalah yang diikuti pemanggil sebelum jam itu habis.&lt;/p&gt;
&lt;h2&gt;Kapan sebuah perubahan butuh panduan migrasi, bukan hanya entri changelog?&lt;/h2&gt;
&lt;p&gt;Ketika ada lebih dari satu langkah antara perilaku lama dan baru, atau ketika perubahan
menyentuh cukup banyak titik pemanggilan sehingga pemanggil lebih diuntungkan oleh contoh yang
dikerjakan daripada deskripsi. &lt;a href=&quot;https://changeloop.dev/blog/id/breaking-changes/&quot;&gt;Apa itu perubahan tak kompatibel, dan cara merilisnya&lt;/a&gt;
membahas uji apakah perubahan itu tak kompatibel; jika jawabannya ya, pertanyaan kedua adalah
apakah perbaikannya adalah edit satu baris atau migrasi sungguhan. Kolom yang diganti nama bisa
ditangani pemanggil hanya dengan entri changelog. Perubahan pada autentikasi, paginasi, atau
penanganan error hampir selalu pantas mendapat panduan, karena kode pengganti yang benar tidak
jelas dari deskripsi satu kalimat.&lt;/p&gt;
&lt;h2&gt;Apa yang harus dimuat panduan migrasi?&lt;/h2&gt;
&lt;p&gt;Lima hal, dan melewatkan salah satunya adalah cara panduan berubah menjadi halaman yang dibaca
pemanggil sekali lalu kembali ke coba-coba. Kode lama, ditampilkan seperti yang sebenarnya muncul
dalam proyek. Kode baru, ditampilkan dengan cara yang sama, bukan sebagai deskripsi abstrak
perbedaannya. Apa yang rusak jika tak ada yang diubah, dikatakan dengan jelas, karena &amp;quot;tidak ada&amp;quot;
adalah jawaban yang valid dan umum yang tetap perlu didengar pemanggil secara eksplisit. Cara
memverifikasi migrasi berhasil, seperti kolom respons atau kode status untuk dicek. Dan jadwal:
kapan perilaku lama berhenti berfungsi, dan apakah kedua bentuk tersedia sementara itu.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## Migrasi kolom mata uang dari float ke integer (v3.0.0)

Sebelum:
  { &amp;quot;amount&amp;quot;: 19.99 }

Sesudah:
  { &amp;quot;amount&amp;quot;: 1999 }  // unit mata uang terkecil (sen)

Yang berubah: `amount` sekarang adalah bilangan bulat dalam unit
terkecil mata uang akun. Kode yang membaca `amount` sebagai float
akan membaca nilai 100x terlalu besar mulai 1 Oktober 2026.

Verifikasi: setelah migrasi, tagihan $19.99 harus terbaca sebagai
`amount: 1999`, bukan `amount: 19.99`.

Jadwal: v2 tetap mengembalikan float sampai 15 Januari 2027. v3
mengembalikan bilangan bulat sejak peluncuran. Kedua versi aktif
sekarang.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Setiap dari lima hal itu menjawab pertanyaan yang jika tidak, harus ditebak atau ditanyakan
pemanggil ke dukungan, dan itulah biaya sesungguhnya yang dihemat panduan migrasi.&lt;/p&gt;
&lt;h2&gt;Siapa yang harus menulisnya, dan kapan?&lt;/h2&gt;
&lt;p&gt;Siapa pun yang merancang perubahan, pada saat yang sama ketika dirilis, bukan tim dukungan yang
merekonstruksinya dari tiket belakangan. Yang membuat keputusan tahu bagian mana dari perilaku
lama yang seharusnya tidak diandalkan siapa pun dan mana yang merupakan kontrak tak sengaja;
panduan yang ditulis belakangan oleh seseorang tanpa konteks itu cenderung terlalu menjelaskan
yang jelas atau melewatkan satu kasus tepi yang benar-benar merusak orang. Panduan dan entri
changelog yang mengumumkan perubahan tak kompatibel sebaiknya dirilis bersamaan, dengan entri
menautkan ke panduan alih-alih mengulanginya.&lt;/p&gt;
&lt;h2&gt;Bagaimana ini berkaitan dengan versioning dan changelog API?&lt;/h2&gt;
&lt;p&gt;Secara langsung: panduan migrasi adalah versi rinci dari yang hanya diringkas dalam satu kalimat
oleh entri MAJOR di &lt;a href=&quot;https://changeloop.dev/blog/id/semantic-versioning-changelog/&quot;&gt;semantic versioning dan changelog Anda&lt;/a&gt;.
Entri changelog mengatakan perubahan tak kompatibel dan garis besar apa yang berubah; panduan
migrasi adalah tautan yang seharusnya dibawa entri itu. &lt;a href=&quot;https://changeloop.dev/blog/id/api-changelog/&quot;&gt;Changelog API: apa yang dipublikasikan dan siapa yang membacanya&lt;/a&gt;
mencantumkan panduan migrasi sebagai salah satu dari lima dokumen yang dipelihara API, masing-masing
menjawab pertanyaan berbeda; ini adalah yang menjawab &amp;quot;bagaimana saya benar-benar pindah dari A ke
B&amp;quot;, dan pantas mendapat halamannya sendiri justru karena jawaban itu biasanya terlalu panjang
untuk entri changelog.&lt;/p&gt;
&lt;h2&gt;Berapa lama panduan migrasi harus tetap dipublikasikan?&lt;/h2&gt;
&lt;p&gt;Setidaknya selama perilaku lama masih bisa dijangkau, dan idealnya juga setelahnya. Pemanggil
yang bermigrasi terlambat delapan belas bulan, setelah mengabaikan tiga pemberitahuan deprecation,
masih membutuhkan panduan, dan menghapusnya pada hari perilaku lama dimatikan hanya menjamin
pemanggil yang paling membutuhkannya tidak menemukannya. Simpan di URL yang stabil dan perbarui
bagian jadwal alih-alih menarik halaman. &lt;a href=&quot;https://docs.stripe.com/upgrades&quot;&gt;Panduan peningkatan&lt;/a&gt;
milik Stripe sendiri adalah contoh publik dari pola ini: satu halaman yang tetap terkini dari rilis
ke rilis, bukan dokumen baru per versi yang basi begitu versi berikutnya rilis. Panduan Anda
sendiri layak mendapat tempat yang sama mudah ditemukannya, di samping &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;dokumentasi&lt;/a&gt; yang
sudah dibaca pemanggil, alih-alih terkubur di arsip blog.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apakah setiap perubahan tak kompatibel butuh panduan migrasi?&lt;/strong&gt;
Tidak. Perubahan yang bisa ditangani pemanggil hanya dengan entri changelog, seperti satu kolom
yang diganti nama dengan pengganti yang jelas, tidak butuh panduan terpisah. Perubahan yang
menyentuh beberapa titik pemanggilan atau butuh contoh yang dikerjakan, ya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah panduan migrasi berada bersama dokumentasi API atau di changelog?&lt;/strong&gt;
Bersama dokumentasi, ditautkan dari entri changelog. Entri adalah yang dilihat pelanggan lebih
dulu; panduan adalah yang dibutuhkan begitu mereka memutuskan untuk bertindak, dan tempatnya di
sebelah materi referensi yang sudah dipakai pemanggil.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa bedanya panduan migrasi dengan pemberitahuan deprecation?&lt;/strong&gt;
Pemberitahuan deprecation menyatakan sesuatu akan hilang dan sampai kapan. Panduan migrasi adalah
instruksi apa yang harus dilakukan soal itu. Pemberitahuan deprecation tanpa panduan migrasi yang
ditautkan memberi pemanggil tenggat tanpa memberitahu cara memenuhinya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah perilaku lama dan baru sama-sama didokumentasikan selama jendela migrasi?&lt;/strong&gt;
Ya, di halaman yang sama jika memungkinkan, sehingga pemanggil melihat persis apa yang berubah
alih-alih menyusunnya dari dua dokumen terpisah yang ditulis pada waktu berbeda.&lt;/p&gt;
</content:encoded></item><item><title>Check changelog untuk GitHub Actions</title><link>https://changeloop.dev/blog/id/changelog-ci-enforcement/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/changelog-ci-enforcement/</guid><description>Check changelog di GitHub Actions menolak merge tanpa entri, karena langkah yang bergantung pada ingatan akan gagal. Plus apa yang dirusak oleh check itu.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Setiap tim yang menjaga changelog secara manual pernah mengalami percakapan yang sama setelah
insiden yang sama: sebuah rilis keluar tanpa entri, seseorang bertanya kenapa, dan jawaban
jujurnya adalah orang yang seharusnya menulisnya sedang bergerak cepat dan langkah changelog itu
hanya hidup dalam ingatan. &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-automation/&quot;&gt;Otomasi changelog&lt;/a&gt; membahas apa yang
bisa diotomatisasi pipeline dengan aman dan apa yang masih butuh manusia; check changelog di CI
adalah separuh lain dari masalah ini, karena mengotomatisasi penulisan tidak membantu jika tidak
ada yang wajib memicunya sejak awal. GitHub Actions adalah tempat kebanyakan tim sudah menjalankan
check pull request mereka, jadi di situlah check ini hidup juga.&lt;/p&gt;
&lt;h2&gt;Mengapa &amp;quot;kami minta orang menambahkan entri&amp;quot; gagal dengan pola yang bisa diprediksi?&lt;/h2&gt;
&lt;p&gt;Karena itu bersaing untuk mendapat perhatian dengan segala hal lain di pull request, dan itu satu-satunya
bagian tanpa konsekuensi langsung jika dilewatkan. Test gagal dengan keras dan memblokir merge.
Entri changelog yang hilang tidak memblokir apa pun, jadi ia kalah begitu seseorang terburu-buru,
yang dalam praktiknya adalah kebanyakan waktu. Kebijakan yang ditegakkan oleh ingatan merosot
persis pada kecepatan yang diharapkan: baik-baik saja untuk beberapa minggu pertama setelah
semua orang setuju, lalu diam-diam ditinggalkan begitu orang yang peduli pergi berlibur atau
pindah tim.&lt;/p&gt;
&lt;h2&gt;Apa yang sebenarnya diverifikasi check CI untuk entri changelog?&lt;/h2&gt;
&lt;p&gt;Bukan kualitas tulisannya, hanya bahwa entri itu ada dan berbentuk benar, yang merupakan cakupan
tepat untuk check changelog yang berjalan di CI, bukan di kepala seseorang.
Bentuk umum: check itu melihat diff PR dan mensyaratkan entah berkas baru di
direktori changeset (pola yang digunakan
&lt;a href=&quot;https://github.com/changesets/changesets&quot;&gt;Changesets&lt;/a&gt; dan alat serupa) atau baris yang diubah
di berkas changelog, dan menggagalkan build jika tidak ada satu pun. Peninjauan tentang apa yang
sebenarnya dikatakan entri itu tetap terjadi di tempat yang selalu terjadi, di code review,
karena penilaian itu bukan urusan skrip.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Apa yang diverifikasi check CI&lt;/th&gt;
&lt;th&gt;Apa yang tidak diverifikasi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Ada changeset atau baris changelog di diff&lt;/td&gt;
&lt;td&gt;Apakah kalimatnya jelas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entri merujuk paket yang benar, dalam monorepo&lt;/td&gt;
&lt;td&gt;Apakah perubahan itu benar-benar layak dapat entri&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Berkas valid secara sintaksis (front matter, bentuk JSON)&lt;/td&gt;
&lt;td&gt;Apakah entri jujur tentang dampaknya&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apakah setiap PR butuh itu, atau ada perubahan yang dikecualikan?&lt;/h2&gt;
&lt;p&gt;Beberapa dikecualikan, dan daftar pengecualian itulah tempat sistem seperti ini benar-benar
dibangun atau ditinggalkan. Kenaikan dependency tanpa efek terlihat, perubahan hanya test,
refactor internal tanpa perubahan perilaku: tak satu pun dari ini seharusnya memaksa kontributor
mengarang entri changelog untuk sesuatu yang tidak dipedulikan siapa pun yang membaca changelog.
Pola yang berhasil adalah label atau flag yang bisa diterapkan kontributor
(&lt;code&gt;no-changelog-needed&lt;/code&gt;) dan memenuhi check CI tanpa berkas, ditinjau oleh siapa pun yang
menyetujui PR, sehingga pengecualian itu sendiri melewati pengawasan yang sama seperti entri.&lt;/p&gt;
&lt;h2&gt;Apa yang terjadi pada pengecualian sah, seperti hotfix mendesak?&lt;/h2&gt;
&lt;p&gt;Gate itu berada pada merge, bukan pada deploy: hotfix di bawah
tekanan waktu nyata bisa merge dengan entri placeholder atau tiket lanjutan, asalkan check CI
terpenuhi oleh niat alih-alih hanya paragraf yang selesai; beberapa tim menerima stub satu baris
yang dihaluskan maintainer sebelum potongan rilis berikutnya. Yang seharusnya tidak pernah
diizinkan gate adalah melewati langkah itu diam-diam, karena stub yang terlupakan adalah
kegagalan lebih kecil daripada entri yang tidak pernah ada, dan stub setidaknya meninggalkan jejak
yang bisa ditemukan seseorang nanti.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# .github/workflows/changelog-check.yml
on:
  pull_request:
    types: [opened, synchronize, reopened, labeled, unlabeled]
jobs:
  changelog:
    if: &amp;gt;-
      !contains(github.event.pull_request.labels.*.name,
      &amp;#39;no-changelog-needed&amp;#39;)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # diff membutuhkan branch dasar
      - name: Require changelog entry
        run: |
          base=&amp;quot;origin/${{ github.base_ref }}&amp;quot;
          if ! git diff --name-only &amp;quot;$base&amp;quot;...HEAD \
              | grep -q &amp;#39;^\.changeset/&amp;#39;; then
            echo &amp;quot;No changeset. Add one, or have a maintainer&amp;quot;
            echo &amp;quot;apply the no-changelog-needed label.&amp;quot;
            exit 1
          fi
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Bagaimana Anda tahu check itu sendiri sudah benar sebelum mulai memblokir PR sungguhan?&lt;/h2&gt;
&lt;p&gt;Buka dulu pull request percobaan terhadap branch sekali pakai: satu dengan changeset, satu tanpa,
dan satu lagi membawa label pengecualian, dan pastikan ketiganya mendapat hasil yang Anda harapkan
sebelum check itu berlaku bagi pekerjaan orang lain. Check changelog yang fail open, meloloskan
setiap PR karena sebuah kondisi ditulis terbalik, lebih buruk daripada tidak punya check sama
sekali, karena itu terlihat seperti cakupan yang sebenarnya tidak ada. &lt;code&gt;workflow_dispatch&lt;/code&gt; pada
berkas yang sama, dijalankan manual terhadap beberapa PR yang baru-baru ini di-merge, menangkap
kebanyakan kesalahan semacam ini tanpa perlu pull request sungguhan sama sekali.&lt;/p&gt;
&lt;h2&gt;Apakah ide yang sama berlaku di luar GitHub Actions?&lt;/h2&gt;
&lt;p&gt;Bentuknya tetap sama, hanya sintaksnya yang berubah. GitLab CI mengekspresikan aturan yang sama
sebagai blok &lt;code&gt;rules&lt;/code&gt; job yang memeriksa &lt;code&gt;$CI_MERGE_REQUEST_LABELS&lt;/code&gt;, bukan &lt;code&gt;if&lt;/code&gt; ala GitHub Actions,
dan persetujuan merge request yang diwajibkan bisa menggantikan langkah peninjauan pengecualian.
Check yang dibahas artikel ini memakai GitHub Actions karena itu platform yang sudah dipakai
kebanyakan pembacanya, tapi kebutuhan yang mendasarinya, gate yang diperiksa mesin alih-alih
konvensi yang sekadar diminta, sama saja di mana pun CI berjalan sebelum merge.&lt;/p&gt;
&lt;h2&gt;Apakah ini bekerja sama di monorepo?&lt;/h2&gt;
&lt;p&gt;Butuh satu bagian lagi: paket mana entri itu untuk. &lt;a href=&quot;https://changeloop.dev/blog/id/monorepo-changelogs/&quot;&gt;Changelog monorepo&lt;/a&gt;
membahas mengapa satu berkas untuk seluruh repo berhenti bekerja begitu paket dirilis secara
independen; check CI mewarisi persyaratan yang sama; changeset yang tidak menyebutkan paket bukan
bukti berguna bahwa changelog yang tepat akan diperbarui, hanya bahwa suatu berkas berubah di
suatu tempat dalam diff. Alat yang dibangun untuk ini (Changesets adalah yang umum di ekosistem
JavaScript) meminta kontributor memilih paket yang terpengaruh dan kenaikan semver pada saat yang
sama changeset dibuat, sehingga check CI mendapat kedua bagian itu gratis alih-alih menyimpulkannya
belakangan.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Haruskah check CI memblokir merge, atau hanya memperingatkan?&lt;/strong&gt;
Memblokir. Peringatan secara fungsional identik dengan meminta dengan sopan, yang justru sudah
gagal. Label pengecualian ada tepatnya agar kasus hanya-peringatan yang sah tetap punya jalur sah
melalui gate ketat yang sama.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Siapa yang meninjau apakah label pengecualian diterapkan dengan benar?&lt;/strong&gt;
Siapa pun yang menyetujui pull request, sebagai bagian dari peninjauan yang sudah dilakukannya.
Label seharusnya tidak pernah diterapkan sendiri tanpa peninjauan, atau ia menjadi jalan pintas
diam-diam yang sama yang seharusnya ditutup gate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah mewajibkan ini di CI menggantikan kebutuhan pipeline otomasi changelog?&lt;/strong&gt;
Tidak, ia memberi makan pipeline itu. &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-automation/&quot;&gt;Otomasi changelog&lt;/a&gt;
membahas mengubah entri terstruktur menjadi halaman, feed, dan email; check CI adalah yang
menjamin entri terstruktur itu ada untuk diotomatisasi sejak awal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa versi terkecil dari ini yang layak dibangun lebih dulu?&lt;/strong&gt;
Satu check yang gagal jika tidak ada berkas berubah di bawah direktori changelog yang ditentukan,
dengan satu label pengecualian. Perutean per paket dan penyimpulan semver untuk monorepo bisa
datang belakangan; kebiasaan intinya, entri ada atau seseorang secara eksplisit bilang itu tidak
diperlukan, adalah yang layak dimiliki sejak hari pertama.&lt;/p&gt;
</content:encoded></item><item><title>Cara menolak permintaan fitur tanpa kehilangan pelanggan</title><link>https://changeloop.dev/blog/id/declining-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/declining-feature-requests/</guid><description>Menolak permintaan fitur adalah separuh sulit dari menutup lingkaran. Cara bilang tidak tanpa merusak hubungan dengan pelanggan, setelah yang mudah.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Menutup lingkaran biasanya berarti memberi tahu seseorang bahwa permintaan mereka sudah dirilis.
Separuh yang sulit, yang tidak dimiliki proses oleh kebanyakan sistem pelacakan sama sekali,
adalah bilang tidak. Kebanyakan permintaan fitur tidak pernah dirilis, yang berarti sebagian
besar penutupan lingkaran yang sebenarnya dihutangi produk kepada penggunanya adalah penolakan,
bukan pengumuman, dan penolakan yang ditangani buruk lebih mahal biayanya untuk niat baik
daripada yang akan dikeluarkan keheningan. Ditangani dengan baik, biayanya bisa hampir tidak ada,
karena yang paling diinginkan yang meminta, kebanyakan waktu, adalah tahu bahwa mereka didengar,
bukan fiturnya sendiri.&lt;/p&gt;
&lt;h2&gt;Mengapa menolak dengan baik sama pentingnya dengan merilis dengan baik?&lt;/h2&gt;
&lt;p&gt;Karena keheningan terbaca sebagai penolakan tanpa penjelasan, dan tidak yang dijelaskan terbaca
sebagai perhatian. Yang tidak mendengar apa-apa berasumsi permintaannya diabaikan atau hilang, dan
kedua kesimpulan itu mengajarinya berhenti repot-repot bertanya, yang merupakan hasil yang sama
yang didapat produk dari penolakan sungguhan, hanya dicapai lebih lambat dan dengan lebih banyak
kekesalan di sepanjang jalan. Balasan yang bilang tidak, dengan jelas dan dengan alasan, menutup
lingkaran sama lengkapnya dengan fitur yang dirilis, dan melakukannya lebih cepat.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Balasan&lt;/th&gt;
&lt;th&gt;Yang dipelajari yang meminta&lt;/th&gt;
&lt;th&gt;Biaya untuk hubungan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Keheningan&lt;/td&gt;
&lt;td&gt;Tak ada yang membaca, atau tak ada yang peduli&lt;/td&gt;
&lt;td&gt;Tinggi, dan bertambah di setiap permintaan mendatang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balasan otomatis tanpa alasan&lt;/td&gt;
&lt;td&gt;Ada di antrean entah di mana, tanpa batas waktu&lt;/td&gt;
&lt;td&gt;Sedang; membeli waktu tapi bukan kepercayaan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Penolakan dengan alasan&lt;/td&gt;
&lt;td&gt;Sudah dibaca, dipertimbangkan, dan dijawab&lt;/td&gt;
&lt;td&gt;Rendah, jika alasannya jujur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Penolakan dengan alternatif&lt;/td&gt;
&lt;td&gt;Kebutuhan sebenarnya benar-benar didengar&lt;/td&gt;
&lt;td&gt;Terendah; sering membangun kepercayaan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apa yang membuat penolakan mendarat dengan buruk?&lt;/h2&gt;
&lt;p&gt;Hampir selalu tiga hal, dikombinasikan. Keumuman: &amp;quot;terima kasih atas masukan Anda&amp;quot; yang siap saji
yang tidak merujuk pada apa yang sebenarnya diminta terbaca seolah tidak dibaca sama sekali,
meski sebenarnya dibaca. Penundaan: penolakan yang datang enam bulan setelah permintaan, saat
yang meminta sudah lupa pernah bertanya, terasa lebih buruk dari tidak yang cepat, karena
menyiratkan permintaan itu dibiarkan tak tersentuh alih-alih dipertimbangkan dan ditolak. Dan
alasan yang tidak kuat: &amp;quot;tidak ada di roadmap kami&amp;quot; tidak menjawab apa pun, sementara &amp;quot;ini akan
memerlukan merancang ulang cara kerja izin, yang tidak kami rencanakan untuk disentuh tahun ini&amp;quot;
memberi yang meminta sesuatu yang benar-benar bisa mereka evaluasi dan, jika cukup penting,
diesk­alasi atau dihindari.&lt;/p&gt;
&lt;h2&gt;Apa yang seharusnya benar-benar dikatakan penolakan yang baik?&lt;/h2&gt;
&lt;p&gt;Empat hal, dalam urutan ini: pengakuan yang menyebutkan permintaan spesifik, bukan parafrase
umum; alasan sebenarnya, dinyatakan dengan jujur bahkan ketika alasan jujurnya adalah &amp;quot;ini tidak
cocok dengan arah produk&amp;quot; alih-alih alasan yang lebih halus; apakah pintunya tertutup atau hanya
belum terbuka sekarang, karena itu butuh nada yang sangat berbeda; dan, ketika ada, alternatif
yang menjawab kebutuhan mendasar meski bukan fitur yang diminta secara harfiah.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Hai Jamie,

Terima kasih atas permintaan menambahkan impor CSV massal untuk
undangan tim. Kami sudah meninjaunya, dan kami tidak akan
membangunnya: alur undangan kami dibangun di sekitar peninjauan
individual setiap anggota baru demi keamanan, dan impor massal akan
bertentangan dengan itu by design, bukan karena kelalaian.

Jika masalah sebenarnya adalah mengundang tim besar dengan cepat, API
mendukung undangan individual berbasis skrip, yang memberi Anda
hampir semua kecepatan tanpa melewati peninjauan: [tautan]. Beri tahu
saya jika Anda ingin bantuan menyiapkannya.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Perhatikan yang dilakukan ini yang tidak bisa dilakukan template: menyebut fitur sebenarnya,
memberi alasan yang terkait dengan keputusan desain sungguhan alih-alih kebijakan samar, dan
menawarkan jalan yang menyelesaikan masalah mendasar alih-alih hanya menutup tiket.&lt;/p&gt;
&lt;h2&gt;Apa bedanya ini dengan menutup lingkaran pada fitur yang dirilis?&lt;/h2&gt;
&lt;p&gt;Mekanismenya mirip, nadanya tidak. &lt;a href=&quot;https://changeloop.dev/blog/id/customer-feedback-loop/&quot;&gt;Menutup lingkaran umpan balik dengan pelanggan&lt;/a&gt;
membahas kasus yang dirilis, di mana pesannya adalah kabar baik dan risiko utamanya adalah lupa
mengirimnya. Penolakan adalah kabar buruk, atau setidaknya kabar yang tidak diinginkan, dan
butuh lebih banyak perhatian pada alasan yang diberikan dan lebih sedikit otomatisasi dalam
penyampaian: notifikasi fitur yang dirilis bisa berupa komentar siap saji yang dipicu perubahan
status, tapi penolakan yang terbaca siap saji justru adalah mode kegagalan yang ingin dihindari
seluruh pendekatan ini. Keduanya tetap berbagi satu syarat: permintaan asli harus tetap terhubung
dengan yang mengajukannya, disiplin pelacakan yang sama yang dibahas &lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-tracking/&quot;&gt;pelacakan permintaan fitur&lt;/a&gt;,
kalau tidak tak ada cara mengirim salah satu pesan itu secara individual.&lt;/p&gt;
&lt;h2&gt;Haruskah penolakan bersifat publik, seperti status di roadmap publik?&lt;/h2&gt;
&lt;p&gt;Biasanya bukan alasan spesifiknya, meski statusnya bisa. &lt;a href=&quot;https://changeloop.dev/blog/id/public-roadmap/&quot;&gt;Roadmap publik&lt;/a&gt;
membahas label status yang bisa dicek yang meminta tanpa bertanya lagi, dan status &amp;quot;ditolak&amp;quot; atau
&amp;quot;tidak direncanakan&amp;quot; bisa jadi bagian dari sistem itu. Tapi alasan rinci, terutama saat menyentuh
prioritas internal atau konteks yang kurang menyenangkan, biasanya lebih bernilai di balasan
individual daripada di halaman status publik, di mana formulasi yang sama harus berfungsi untuk
setiap pembaca alih-alih untuk satu orang yang benar-benar bertanya.&lt;/p&gt;
&lt;h2&gt;Apakah setiap permintaan yang ditolak pantas mendapat balasan individual?&lt;/h2&gt;
&lt;p&gt;Setiap permintaan dari orang yang disebutkan namanya dan bisa dihubungi, ya, setidaknya yang
singkat. Permintaan bervolume tinggi, duplikat, atau anonim adalah pengecualian: mengelompokkan
permintaan serupa dan membalas sekali per kelompok, atau memperbarui label status bersama, masuk
akal ketika balasan individual sungguh tidak bisa diskalakan. Batas yang harus dijaga adalah
&amp;quot;kami tidak bisa membalas semua orang secara individual&amp;quot; seharusnya menjadi batasan operasional
sungguhan, dicek terhadap volume sebenarnya, bukan alasan default untuk melewatkan balasan yang
hanya butuh dua menit.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Lebih baik menolak cepat dengan alasan lemah, atau meluangkan waktu untuk yang baik?&lt;/strong&gt;
Cepat, dengan alasan jujur, mengalahkan keduanya jika terpisah. Balasan cepat dengan alasan
sungguhan, meski singkat, mengungguli balasan lambat dengan yang dipoles; penundaannya sendiri
adalah bagian dari yang merusak kepercayaan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah penolakan pernah menjanjikan meninjau kembali permintaan nanti?&lt;/strong&gt;
Hanya jika itu sungguh mungkin dan ada mekanisme untuk benar-benar meninjaunya kembali, seperti
label yang memunculkannya lagi di siklus perencanaan. &amp;quot;Akan kami pertimbangkan&amp;quot; yang samar tanpa
mekanisme itu secara fungsional sama dengan keheningan, hanya dirumuskan lebih ramah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana jika alasan jujurnya adalah sesuatu yang tidak bisa dibagikan perusahaan, seperti kekhawatiran kompetitif?&lt;/strong&gt;
Katakan itu langsung alih-alih mengarang alasan yang lebih halus. &amp;quot;Kami tidak bisa membagikan
alasan spesifiknya di sini, tapi ini bukan sesuatu yang kami rencanakan untuk dibangun&amp;quot; lebih
jujur, dan lebih dihormati, daripada penjelasan karangan yang runtuh di pertanyaan lanjutan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah menolak permintaan berarti harus dihapus dari pelacakan?&lt;/strong&gt;
Tidak. Simpan, berlabel ditolak dengan alasannya, sehingga jadi bagian dari pola yang dijadikan
acuan pengelompokan permintaan serupa berikutnya, dan sehingga konteks yang berubah nanti
(integrasi baru, prioritas tim baru) bisa memunculkannya lagi alih-alih memulai evaluasi dari nol.&lt;/p&gt;
</content:encoded></item><item><title>Release notes feature flag: apa yang disampaikan, dan kapan</title><link>https://changeloop.dev/blog/id/feature-flags-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/feature-flags-feature-requests/</guid><description>Release notes feature flag harus membedakan merge dan rilis, yang tak lagi sama saat ada flag. Menutup lingkaran terlalu dini mengumumkan fitur gaib.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Menutup lingkaran pada permintaan fitur mengasumsikan ada momen bersih saat sesuatu itu dirilis.
Feature flag menghilangkan momen itu, dan itulah yang membuat waktu release notes feature flag sulit ditentukan. Kode di-merge, flag ada, dan selama berhari-hari atau
berminggu-minggu setelahnya fitur itu sekaligus live di produksi dan tidak terlihat bagi hampir
semua orang yang mungkin ingin menggunakannya, sering termasuk orang yang awalnya memintanya.
Memberi tahu terlalu cepat membuatnya menemui fitur yang belum ada. Memberi tahu terlalu lambat
membuat lingkaran yang seharusnya membangun kepercayaan malah terbaca sebagai terlupakan.&lt;/p&gt;
&lt;h2&gt;Kenapa flag merusak urutan biasa &amp;quot;rilis, beri tahu&amp;quot;?&lt;/h2&gt;
&lt;p&gt;Karena itu memecah satu peristiwa jadi setidaknya dua: kode yang menjadi live, dan flag yang
dinyalakan untuk akun tertentu. Setiap proses menutup lingkaran umpan balik mengasumsikan
keduanya terjadi bersamaan, yang benar untuk kebanyakan rilis dan salah untuk apa pun di balik
flag yang dipakai untuk rollout bertahap, penargetan, atau sebagai tombol darurat.
&lt;a href=&quot;https://changeloop.dev/blog/id/customer-feedback-loop/&quot;&gt;Menutup lingkaran umpan balik pelanggan&lt;/a&gt; menjelaskan memberi
tahu peminta persis pada saat entri changelog disetujui dan dipublikasikan; langkah itu ditulis
untuk kasus di mana mempublikasikan entri dan fitur menjadi bisa dipakai adalah momen yang sama,
dan flag justru kasus di mana keduanya tidak sama.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Momen&lt;/th&gt;
&lt;th&gt;Apa yang benar&lt;/th&gt;
&lt;th&gt;Sudah harus diberi tahu peminta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Kode di-merge, flag mati di mana-mana&lt;/td&gt;
&lt;td&gt;Fitur ada, tidak ada yang bisa memakainya&lt;/td&gt;
&lt;td&gt;Tidak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flag menyala untuk akun peminta&lt;/td&gt;
&lt;td&gt;Fitur ada, orang itu spesifik bisa memakainya&lt;/td&gt;
&lt;td&gt;Ya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flag menyala untuk persentase rollout yang mengecualikannya&lt;/td&gt;
&lt;td&gt;Fitur ada, orang itu masih belum bisa memakainya&lt;/td&gt;
&lt;td&gt;Tidak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flag sepenuhnya dihapus, fitur begitu saja menyala&lt;/td&gt;
&lt;td&gt;Fitur ada untuk semua orang&lt;/td&gt;
&lt;td&gt;Ya, jika belum diberi tahu&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apa aturan sebenarnya untuk kapan memberi tahu seseorang?&lt;/h2&gt;
&lt;p&gt;Beri tahu saat flag menyala untuk akun mereka, bukan saat kode di-merge dan bukan saat flag
dibuat. Satu aturan ini mencakup setiap baris tabel di atas, karena mengaitkan notifikasi dengan
satu-satunya fakta yang benar-benar penting bagi peminta: apakah mereka, saat ini juga, bisa pergi
memakai sesuatu itu. Notifikasi yang dikaitkan dengan merge atau pembuatan flag sebenarnya adalah
laporan kemajuan rekayasa, dan orang yang meminta fitur tidak mau laporan kemajuan, mereka mau tahu
kapan harus memeriksa.&lt;/p&gt;
&lt;h2&gt;Apakah itu berarti peminta butuh akses awal atau khusus?&lt;/h2&gt;
&lt;p&gt;Belum tentu, dan memaksakannya menciptakan masalah sendiri. Jika flag digulirkan bertahap karena
alasan beban atau stabilitas, memindahkan satu akun ke depan antrean hanya untuk menutup lingkaran
lebih cepat merusak alasan mengapa rollout itu dibuat bertahap sejak awal. Pilihan yang jujur
adalah: menunggu akun peminta mencapai rollout secara alami dan memberi tahu mereka saat itu, atau,
jika urgensinya membenarkan, dengan sengaja menyalakan flag lebih awal untuk mereka, sebagai
keputusan nyata dari siapa pun yang memiliki rollout, bukan sebagai efek samping dari keinginan
mengirim notifikasi.&lt;/p&gt;
&lt;h2&gt;Bagaimana jika flag itu tombol darurat, bukan mekanisme rollout?&lt;/h2&gt;
&lt;p&gt;Maka asumsi amannya terbalik. Flag yang dibuat agar bisa cepat mematikan fitur, alih-alih
membertahapkan rilisnya, biasanya berarti fitur itu dimaksudkan sepenuhnya live begitu dibuat, dan
flag ada demi keamanan alih-alih urutan. Dalam kasus itu, memberi tahu peminta saat waktu deploy
sudah benar, sama seperti rilis mana pun tanpa flag; keberadaan flag adalah detail operasional yang
seharusnya tidak mengubah kapan lingkaran ditutup. Perbedaan yang penting adalah untuk apa flag
itu, bukan apakah ada satu.&lt;/p&gt;
&lt;h2&gt;Apakah flag mengubah apa yang seharusnya dikatakan release notes feature flag?&lt;/h2&gt;
&lt;p&gt;Itu mengubah kapan entri dipublikasikan, bukan apa isinya. Entri yang dipublikasikan persis pada
saat flag menyala untuk 100% akun terbaca persis seperti entri changelog normal, dan memang
seharusnya begitu; pembaca yang menemukannya nanti tidak punya alasan untuk tahu bahwa flag pernah
terlibat. Yang seharusnya tidak dilakukan adalah dipublikasikan saat flag hanya menyala untuk
persentase rollout kecil, karena entri changelog publik mengirim semua orang yang membacanya,
termasuk akun tanpa flag, untuk mencari fitur yang tidak akan mereka temukan, yang merupakan
versi lebih buruk dari masalah yang sama, dalam skala seluruh produk alih-alih skala satu peminta.
Aturan waktu itulah seluruh perbedaan antara release notes feature flag dan entri biasa: isinya
sama, hanya tanggal publikasinya yang bergeser. &lt;a href=&quot;https://changeloop.dev/blog/id/how-to-write-release-notes/&quot;&gt;Cara menulis release notes&lt;/a&gt; membahas disiplin &amp;quot;tidak perlu
tindakan&amp;quot; yang juga berlaku di sini: pembaca harus tahu apakah ini berlaku bagi mereka, bukan
hanya bahwa itu ada di suatu tempat.&lt;/p&gt;
&lt;h2&gt;Haruskah email pembaruan produk memperlakukan fitur berflag secara berbeda?&lt;/h2&gt;
&lt;p&gt;Ya, terutama dengan menunda alih-alih menulis ulang. &lt;a href=&quot;https://changeloop.dev/blog/id/product-update-email/&quot;&gt;Template email pembaruan produk&lt;/a&gt;
membahas notifikasi bertarget versus digest luas; fitur berflag adalah kasus di mana waktu
notifikasi bertarget harus diperiksa terhadap status flag penerima itu sendiri sebelum dikirim,
sesuatu yang tidak bisa dilakukan digest luas dengan mudah sama sekali, yang jadi alasan tambahan
kenapa digest adalah kanal yang salah untuk apa pun yang masih di tengah rollout.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Haruskah memberi tahu peminta bahwa fiturnya &amp;quot;segera hadir&amp;quot; begitu flag ada tapi belum menyala untuk mereka?&lt;/strong&gt;
Hanya jika ada tanggal nyata dan dekat, dan bahkan begitu, secukupnya saja. &amp;quot;Segera hadir&amp;quot; tanpa
tanggal terbaca, setelah cukup waktu berlalu, sama saja dengan diam, dan menciptakan janji kedua
yang juga harus dilacak dan ditepati.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Siapa yang memutuskan kapan flag sudah cukup jauh untuk menutup lingkaran?&lt;/strong&gt;
Siapa pun yang memiliki rollout, bukan siapa pun yang memiliki notifikasi. Pemilik rollout tahu
apakah &amp;quot;100% akun&amp;quot; sudah dekat atau masih berminggu-minggu lagi; mengaitkan langkah penutupan
lingkaran dengan status mereka, alih-alih tanggal kalender tetap, menjaga notifikasi tetap jujur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah fitur di balik flag permanen (tidak pernah sepenuhnya dihapus) pernah mendapat entri changelog publik?&lt;/strong&gt;
Ya, begitu mencapai apa pun yang dimaksud &amp;quot;ketersediaan umum&amp;quot; bagi produk itu, meski flag itu
sendiri tetap ada di kode selamanya karena alasan operasional. Entri changelog membicarakan
ketersediaan bagi pembaca, bukan detail implementasi tentang bagaimana ketersediaan itu terwujud.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana jika flag dihapus dan fitur dimatikan alih-alih dirilis?&lt;/strong&gt;
Itu adalah penolakan, bukan notifikasi rilis, dan pantas mendapat kehati-hatian yang sama seperti
penolakan lainnya. &lt;a href=&quot;https://changeloop.dev/blog/id/declining-feature-requests/&quot;&gt;Cara menolak permintaan fitur&lt;/a&gt; membahas
apa yang seharusnya dikatakan pesan itu; menutup lingkaran dengan jujur kadang berarti menutupnya
dengan penolakan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah release notes feature flag butuh template terpisah dari entri normal?&lt;/strong&gt;
Tidak ada perubahan template, hanya satu langkah gating sebelum publikasi: periksa status flag
untuk akun yang meminta, bukan hanya bahwa kodenya sudah di-merge, dan tahan entrinya sampai
pemeriksaan itu lolos. Semua hal lain tentang entrinya, kata-katanya, panjangnya, disiplin FAQ-nya,
tetap sama seperti release notes lainnya.&lt;/p&gt;
</content:encoded></item><item><title>Cara melacak permintaan fitur tanpa kehilangannya</title><link>https://changeloop.dev/blog/id/feature-request-tracking/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/feature-request-tracking/</guid><description>Pelacakan permintaan fitur biasanya gagal dua cara: tidak sampai ke mana pun, atau sampai tempat yang tak pernah dilihat lagi. Sistem yang tahan keduanya.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Pelacakan permintaan fitur hampir selalu gagal dengan salah satu dari dua cara. Entah permintaan
tidak punya tempat tujuan, sehingga hidup di kotak masuk dan thread Slack di mana dilupakan satu
per satu, atau punya tempat tujuan yang tak pernah dilihat lagi, sehingga dilupakan bersamaan.
Sistem yang berfungsi harus tahan terhadap kedua kegagalan itu: butuh satu tempat di mana setiap
permintaan mendarat, dan alasan untuk membuka tempat itu lagi bulan depan.&lt;/p&gt;
&lt;h2&gt;Dari mana sebenarnya permintaan fitur berasal?&lt;/h2&gt;
&lt;p&gt;Dari lebih banyak kanal dari yang diperhitungkan kebanyakan sistem pelacakan. Tiket dukungan yang
menyertakan &amp;quot;akan bagus kalau&amp;quot;. Komentar di roadmap publik. Panggilan penjualan di mana calon
pelanggan menyebutkan satu hal yang menghalangi kesepakatan. Widget di dalam produk. Setiap kanal
punya pemiliknya sendiri dan alatnya sendiri, dan justru karena itulah permintaan tersebar: antrean
tiket dukungan dan backlog tim produk jarang menjadi sistem yang sama, dan permintaan yang hanya
mencapai salah satunya, dalam praktiknya, hanya mencapai satu departemen.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sumber&lt;/th&gt;
&lt;th&gt;Pemilik umum&lt;/th&gt;
&lt;th&gt;Di mana biasanya hilang&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tiket dukungan&lt;/td&gt;
&lt;td&gt;Tim dukungan&lt;/td&gt;
&lt;td&gt;Ditutup sebagai selesai, tak pernah dilihat lagi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Panggilan penjualan&lt;/td&gt;
&lt;td&gt;Penjualan / manajemen akun&lt;/td&gt;
&lt;td&gt;Kolom CRM yang tak dibaca siapa pun di produk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Widget di produk&lt;/td&gt;
&lt;td&gt;Produk&lt;/td&gt;
&lt;td&gt;Kiriman formulir tanpa tindak lanjut&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Komentar roadmap&lt;/td&gt;
&lt;td&gt;Siapa pun yang membangun roadmap&lt;/td&gt;
&lt;td&gt;Thread komentar itu sendiri&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Media sosial / ulasan&lt;/td&gt;
&lt;td&gt;Pemasaran atau tidak ada&lt;/td&gt;
&lt;td&gt;Ditangkap layar sekali, lalu hilang&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Satu formulir intake untuk setiap kanal tidak berhasil, karena tidak ada yang mengadopsinya.
Yang berhasil adalah satu tujuan yang menjadi muara setiap kanal, meskipun perutean pada awalnya
lima menit salin-tempel per hari sampai diotomatisasi.&lt;/p&gt;
&lt;h2&gt;Apa yang sebenarnya merusak pelacakan permintaan fitur?&lt;/h2&gt;
&lt;p&gt;Hampir selalu dua hal. Pertama, tujuan yang tidak ada: permintaan dijawab di kanal tempat
kedatangannya dan tak pernah tercatat secara permanen di mana pun, sehingga permintaan yang sama
dari tiga pelanggan berbeda terlihat seperti tiga jawaban terpisah yang tak berhubungan alih-alih
satu sinyal. Kedua, lebih sering terjadi, tujuan yang penuh dan berhenti dibaca. Spreadsheet
dengan 400 baris tanpa penyaringan bukan lagi sistem pelacakan; itu arsip yang kebetulan bisa
ditulis.&lt;/p&gt;
&lt;p&gt;Kegagalan kedua lebih berbahaya, karena terlihat seolah pelacakan berfungsi. Permintaan tercatat.
Tidak ada yang terlihat rusak sampai seseorang bertanya &amp;quot;berapa banyak orang yang meminta X&amp;quot; dan
jawaban jujurnya adalah &amp;quot;kami harus membaca semua 400 baris untuk mengetahuinya&amp;quot;.&lt;/p&gt;
&lt;h2&gt;Apa yang sebenarnya harus dicatat permintaan fitur?&lt;/h2&gt;
&lt;p&gt;Cukup untuk menjawab tiga pertanyaan nanti tanpa membaca ulang pesan asli: apa yang diminta,
sedapat mungkin dengan kata-kata sendiri dari yang meminta; siapa yang meminta, dan cara
menghubunginya jika jawabannya akhirnya &amp;quot;kami sudah membangunnya&amp;quot;; dan apa yang dibutuhkan untuk
mengetahui apakah ini permintaan umum atau kasus satu kali. Kutipan langsung lebih berharga
daripada parafrasa, karena parafrasa yang ditulis oleh siapa pun yang melakukan triase permintaan
sudah membawa pembacaannya sendiri, dan justru pembacaan itulah yang tak bisa diperiksa orang
kedua enam bulan kemudian.&lt;/p&gt;
&lt;h2&gt;Label mana yang layak dipakai?&lt;/h2&gt;
&lt;p&gt;Dua, dan menjawab pertanyaan berbeda. Label &lt;strong&gt;jenis&lt;/strong&gt; memisahkan permintaan fitur dari laporan
bug, karena keduanya butuh pemilik dan lini masa berbeda, dan mencampurnya dalam satu antrean
membiarkan keluhan paling keras menggeser permintaan. Label &lt;strong&gt;prioritas&lt;/strong&gt;, dijaga tetap pada set
kecil seperti low, medium, dan high, memisahkan &amp;quot;menghalangi seseorang memakai produk&amp;quot; dari &amp;quot;akan
bagus&amp;quot;, karena keduanya pantas mendapat waktu respons yang sangat berbeda dan tak satu pun
seharusnya mewarisi ritme yang lain. Menerapkan
label &lt;strong&gt;jenis&lt;/strong&gt; dengan benar mengasumsikan permintaan itu adalah seperti yang diklaimnya;
&lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-vs-bug-report/&quot;&gt;ketika permintaan fitur sebenarnya adalah laporan bug&lt;/a&gt;
membahas kasus di mana kata-kata pelanggan sendiri mengarahkan label itu ke arah yang salah.&lt;/p&gt;
&lt;p&gt;Triase otomatis bisa menerapkan keduanya saat permintaan tiba. Di changeloop, kiriman widget
mendapat label &lt;code&gt;feature-request&lt;/code&gt; atau &lt;code&gt;bug&lt;/code&gt; dan label &lt;code&gt;priority:low|medium|high&lt;/code&gt; dalam langkah
yang sama, ditambah tag &lt;code&gt;from-widget&lt;/code&gt; sehingga sumbernya terlihat tanpa membuka itemnya. Itu
cukup untuk menyaring backlog dalam semenit alih-alih semalam: tunjukkan setiap permintaan fitur
berprioritas tinggi dari widget bulan ini.&lt;/p&gt;
&lt;p&gt;Label ketiga layak dipakai begitu ada roadmap publik: status yang bisa dicek sendiri oleh yang
meminta. &lt;a href=&quot;https://changeloop.dev/blog/id/public-roadmap/&quot;&gt;Roadmap publik&lt;/a&gt; membahas status planned, building, dan shipped
secara lengkap; singkatnya, label itu mengubah antrean privat menjadi sesuatu yang bisa dicek
yang meminta tanpa bertanya lagi.&lt;/p&gt;
&lt;h2&gt;Bagaimana memutuskan apa yang dibangun selanjutnya?&lt;/h2&gt;
&lt;p&gt;Kelompokkan sebelum menghitung. Sepuluh permintaan yang diformulasikan berbeda untuk kapabilitas
mendasar yang sama terbaca sebagai sepuluh baris tersebar di spreadsheet, dan sebagai sinyal kuat
begitu dikelompokkan, dan pengelompokan itu biasanya langkah yang hilang, bukan penghitungannya.
Hitungan mentah tanpa pengelompokan cenderung menghargai fitur dengan nama paling menarik, bukan
yang punya permintaan nyata terbanyak di baliknya.&lt;/p&gt;
&lt;p&gt;Timbang berdasarkan siapa yang meminta, bukan hanya berapa banyak yang meminta. Permintaan dari
akun yang mendekati perpanjangan membawa urgensi berbeda dari permintaan yang sama dari
pendaftaran uji coba, dan sistem pelacakan yang membuang konteks itu demi hitungan telanjang
mengoptimalkan angka yang paling mudah dihitung, bukan yang paling berguna.&lt;/p&gt;
&lt;p&gt;Setiap keputusan di sini juga menghasilkan permintaan yang kalah, dan itu juga pantas mendapat
balasan; &lt;a href=&quot;https://changeloop.dev/blog/id/declining-feature-requests/&quot;&gt;cara menolak permintaan fitur&lt;/a&gt; membahas apa yang
harus dikatakan pada yang permintaannya tidak lolos. Mengelompokkan dan menimbang hanya separuh
dari &amp;quot;apa yang dibangun selanjutnya&amp;quot;; &lt;a href=&quot;https://changeloop.dev/blog/id/prioritizing-feature-requests/&quot;&gt;memprioritaskan permintaan fitur&lt;/a&gt;
membahas kerangka sesungguhnya, RICE, penimbangan pendapatan, dan hitungan mentah, serta di mana
masing-masing gagal.&lt;/p&gt;
&lt;h2&gt;Bagaimana menutup lingkaran setelah sesuatu dirilis?&lt;/h2&gt;
&lt;p&gt;Ini langkah yang paling sering dilewatkan sistem pelacakan, dan yang benar-benar disadari yang
meminta. &lt;a href=&quot;https://changeloop.dev/blog/id/customer-feedback-loop/&quot;&gt;Menutup lingkaran umpan balik dengan pelanggan&lt;/a&gt; membahas
mekanismenya secara lengkap; yang relevan di sini adalah menutup lingkaran hanya berfungsi jika
permintaan asli tetap terhubung dengan yang memintanya. Templat permintaan fitur yang dibangun
dari issue GitHub, dengan identitas yang meminta melekat pada issue alih-alih terkubur dalam
komentar, adalah yang membuat notifikasi &amp;quot;dirilis&amp;quot; otomatis mungkin terjadi alih-alih yang harus
diingat seseorang untuk dikirim. &lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-template/&quot;&gt;Templat permintaan fitur&lt;/a&gt;
menunjukkan templat konkretnya dan untuk apa setiap kolom.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Alat apa yang harus saya pakai untuk melacak permintaan fitur?&lt;/strong&gt;
Apa yang sudah dicek tim setiap hari mengalahkan alat khusus apa pun yang tak dibuka siapa pun.
Pelacak issue GitHub bekerja baik jika engineering sudah hidup di sana; papan ringan bekerja baik
jika produk hidup di sana. Alatnya kurang penting dibanding apakah dibuka lagi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana mencegah permintaan fitur terduplikasi?&lt;/strong&gt;
Kelompokkan berdasarkan kapabilitas mendasar sebelum melakukan triase berdasarkan kata-kata.
Pencarian di antara permintaan yang ada sebelum membuat yang baru menangkap sebagian besar
duplikat; sesi pengelompokan bulanan menangkap sisanya.
&lt;a href=&quot;https://changeloop.dev/blog/id/duplicate-feature-requests/&quot;&gt;Menggabung duplikat tanpa kehilangan suara asli&lt;/a&gt; membahas
apa yang harus dilakukan dengan kata-kata itu begitu pengelompokan sendiri selesai, sehingga
penggabungan tidak diam-diam mempersempit permintaan ke pengiriman mana pun yang tiba lebih dulu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah setiap permintaan fitur mendapat balasan?&lt;/strong&gt;
Setiap permintaan harus mendapat konfirmasi, walau singkat, tapi tidak setiap permintaan butuh
keputusan segera. Status yang terlihat, seperti label roadmap yang bisa dicek sendiri oleh yang
meminta, menggantikan sebagian besar balasan individu yang seharusnya menjadi kewajiban tim.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa bedanya pelacakan permintaan dengan roadmap publik?&lt;/strong&gt;
Pelacakan adalah catatan internal dari setiap permintaan, termasuk yang tak akan pernah dirilis.
Roadmap publik adalah subset yang secara publik dikomitmenkan tim, dengan status yang bisa
dilihat yang meminta tanpa bertanya lagi.&lt;/p&gt;
</content:encoded></item><item><title>Ketika permintaan fitur sebenarnya adalah laporan bug</title><link>https://changeloop.dev/blog/id/feature-request-vs-bug-report/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/feature-request-vs-bug-report/</guid><description>Tiket dukungan yang meminta pengaturan baru bisa jadi cara mengakali bug tersembunyi. Label yang salah mengirimnya ke pemilik dan antrean yang salah.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;quot;Bisakah Anda menambahkan pengaturan untuk menaikkan batas ekspor?&amp;quot; terbaca seperti permintaan
fitur, dan kebanyakan sistem triase melabelinya begitu di tempat. Kadang memang begitu. Kadang
ekspor gagal pada angka di bawah batas yang didokumentasikan karena sebuah bug, dan pelanggan,
yang tidak bisa melihat kode, sudah mengarang solusi paling masuk akal yang bisa dia jelaskan:
beri saya angka lebih besar dan mungkin akan berfungsi. &lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-tracking/&quot;&gt;Label mana yang layak
dipakai&lt;/a&gt; membahas label jenis yang membagi backlog menjadi
permintaan fitur dan bug; ini adalah kasus di mana kata-kata pelanggan sendiri mengarahkan label
ke arah yang salah, dan biaya kesalahannya adalah pergeseran lambat menuju backlog penuh
permintaan yang tak benar-benar diinginkan siapa pun begitu dilihat lebih dalam.&lt;/p&gt;
&lt;h2&gt;Seperti apa permintaan fitur yang sebenarnya adalah bug?&lt;/h2&gt;
&lt;p&gt;Menyebutkan cara mengakali alih-alih masalahnya. Permintaan fitur yang sungguhan biasanya
menjelaskan hasil yang sama sekali tidak didukung produk: &amp;quot;biarkan saya menjadwalkan ini untuk
nanti&amp;quot;, &amp;quot;tambahkan mode gelap&amp;quot;. Bug yang salah diklasifikasikan menjelaskan angka, ambang batas,
atau perilaku spesifik yang terdengar seperti pengaturan yang hilang tapi sebenarnya adalah
gejala: &amp;quot;naikkan timeout&amp;quot;, &amp;quot;tambahkan opsi retry&amp;quot;, &amp;quot;biarkan saya mengekspor lebih banyak baris
sekaligus&amp;quot;. Tandanya adalah peminta mengusulkan implementasi, pengaturan, sakelar, override, alih-alih
menjelaskan tujuan, karena dia sudah mencoba fitur seperti yang didokumentasikan dan itu tidak
melakukan apa yang dikatakan dokumentasi seharusnya dilakukan.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sinyal&lt;/th&gt;
&lt;th&gt;Permintaan fitur&lt;/th&gt;
&lt;th&gt;Bug menyamar sebagai permintaan fitur&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Apa yang dijelaskan peminta&lt;/td&gt;
&lt;td&gt;Hasil yang tidak bisa dilakukan produk&lt;/td&gt;
&lt;td&gt;Parameter yang ingin diubahnya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apakah perilaku terdokumentasi sudah mencakup ini&lt;/td&gt;
&lt;td&gt;Tidak, benar-benar hilang&lt;/td&gt;
&lt;td&gt;Ya, tapi tidak berfungsi seperti didokumentasikan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apakah upaya lebih membuat permintaan hilang&lt;/td&gt;
&lt;td&gt;Tidak&lt;/td&gt;
&lt;td&gt;Kadang, jika bug bergantung ambang batas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ke mana seharusnya dirutekan&lt;/td&gt;
&lt;td&gt;Backlog produk&lt;/td&gt;
&lt;td&gt;Antrean bug&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Mengapa ini lebih penting dari kedengarannya?&lt;/h2&gt;
&lt;p&gt;Karena kedua antrean punya pemilik, lini masa, dan kriteria sukses berbeda, dan bug yang
diarsipkan sebagai permintaan fitur diprioritaskan melawan permintaan fitur, bersaing untuk
perhatian dengan celah produk sungguhan alih-alih diperbaiki sesuai lini masa yang layak diterima
bug. &lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-tracking/&quot;&gt;Cara melacak permintaan fitur&lt;/a&gt; membahas mengapa
mencampur bug dan fitur dalam satu antrean membiarkan keluhan paling keras menggeser permintaan
sungguhan; permintaan fitur yang diam-diam adalah bug melakukan kerusakan sebaliknya, tetap di
backlog produk mengumpulkan suara untuk &amp;quot;fitur&amp;quot; yang akan hilang begitu bug yang mendasarinya
diperbaiki, yang membuang sinyal prioritas untuk siapa pun yang membaca backlog itu.&lt;/p&gt;
&lt;h2&gt;Bagaimana membedakannya ketika kata-kata pelanggan sendiri mengarah ke arah yang salah?&lt;/h2&gt;
&lt;p&gt;Tanyakan apa yang dia harapkan terjadi, bukan apa yang dia ingin Anda tambahkan. &amp;quot;Ekspornya
terhenti di 500 baris dan saya butuh 2.000, bisakah Anda menaikkan batasnya&amp;quot; terdengar seperti
permintaan fitur kenaikan batas sampai pertanyaan lanjutan, &amp;quot;apakah 500 batas yang
didokumentasikan,&amp;quot; mengungkap bahwa angka yang didokumentasikan adalah 5.000 dan ekspor gagal
lebih awal. Satu pertanyaan itu saja, apa yang diharapkan versus apa yang terjadi, melakukan
sebagian besar pekerjaan penyortiran, karena permintaan fitur sungguhan tidak punya perilaku
terdokumentasi yang tidak dipenuhinya; tidak ada yang bisa diharapkan karena kemampuannya belum
ada.&lt;/p&gt;
&lt;h2&gt;Haruskah agen dukungan atau engineer yang memutuskan ini?&lt;/h2&gt;
&lt;p&gt;Agen dukungan melakukan pemeriksaan pertama, karena mereka melihat tiket lebih dulu, tapi
labelnya seharusnya mudah diubah dan murah untuk salah, bukan keputusan sekali jadi yang
mengunci item itu di antrean salah selamanya. Pemeriksaan kedua yang ringan, seorang engineer
yang menyisir label &amp;quot;permintaan fitur&amp;quot; baru setiap minggu untuk apa pun yang berbau bug
tersamar, menangkap yang tidak bisa dikenali agen dukungan tanpa konteks basis kode. Ini tidak
perlu formal; lebih seperti pandangan lima menit daripada proses peninjauan.&lt;/p&gt;
&lt;h2&gt;Apakah menutup lingkaran berubah setelah bug sungguhan ditemukan?&lt;/h2&gt;
&lt;p&gt;Ya, dan itu memperbaiki pesan yang bisa Anda kirim. &lt;a href=&quot;https://changeloop.dev/blog/id/customer-feedback-loop/&quot;&gt;Menutup lingkaran umpan balik
pelanggan&lt;/a&gt; membahas memberi tahu peminta saat permintaannya
dirilis; bug yang diklasifikasikan ulang mendapat versi lebih baik dari pesan itu, karena &amp;quot;kami
menemukan dan memperbaiki bug di balik ini&amp;quot; terdengar seperti kompetensi, sementara &amp;quot;kami
membangun fitur yang Anda minta&amp;quot; hanya akan benar secara kebetulan, karena permintaan fitur
sungguhan, batas ekspor yang benar-benar lebih tinggi, mungkin tidak pernah dibangun begitu bug
hilang dan batas asli 5.000 baris sudah cukup.&lt;/p&gt;
&lt;h2&gt;Apa yang terjadi jika kesalahan klasifikasi tidak pernah tertangkap?&lt;/h2&gt;
&lt;p&gt;Backlog terisi permintaan yang terlihat seperti permintaan sungguhan tapi bukan, dan keputusan
prioritas yang diambil melawan backlog itu mewarisi distorsinya. &amp;quot;Fitur&amp;quot; dengan empat puluh
suara bisa jadi sebenarnya empat puluh orang yang mengalami bug yang sama, dan membangun
permintaan literalnya, pengaturan untuk menaikkan batas yang sebenarnya tak pernah jadi
kendalanya, memberikan kompleksitas yang tidak memperbaiki apa pun, sementara bug yang mendasari
terus menghasilkan &amp;quot;permintaan fitur&amp;quot; baru dari pelanggan yang belum menemukan thread ini.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apakah layak menambahkan langkah formal untuk memeriksa setiap permintaan fitur terhadap bug yang diketahui?&lt;/strong&gt;
Bukan langkah formal, lebih ke kebiasaan: siapa pun yang mentriase permintaan fitur baru
seharusnya bertanya &amp;quot;apakah perilaku terdokumentasi sudah mengklaim melakukan ini&amp;quot; sebelum
menerapkan label, karena satu pertanyaan itu saja menangkap sebagian besar kesalahan klasifikasi
tanpa menambah beban proses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana jika pelanggan tetap bersikeras itu permintaan fitur bahkan setelah bug ditemukan?&lt;/strong&gt;
Jelaskan apa yang Anda temukan dan mengapa pengaturan yang diusulkannya tidak akan diperlukan
lagi begitu bug diperbaiki. Kebanyakan pelanggan meminta cara mengakali karena mereka berasumsi
perbaikan sungguhan tidak tersedia, bukan karena mereka secara khusus menginginkan pengaturan
itu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah item yang diklasifikasikan ulang kehilangan suara atau komentar yang dikumpulkannya sebagai permintaan fitur?&lt;/strong&gt;
Seharusnya tetap disimpan, terlihat, karena suara itu adalah bukti yang membawa penemuan bug
sejak awal, dan menyembunyikan jejak itu membuat kesalahan klasifikasi yang sama lebih sulit
tertangkap lain kali, pada tiket berbeda.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bisakah ini terjadi sebaliknya, laporan bug yang sebenarnya adalah permintaan fitur?&lt;/strong&gt;
Lebih jarang, tapi bisa: &amp;quot;ini rusak&amp;quot; kadang berarti &amp;quot;ini tidak melakukan apa yang saya asumsikan
akan dilakukannya,&amp;quot; yang merupakan kemampuan yang hilang, bukan cacat. Pertanyaan yang sama, apa
yang diharapkan versus apa yang didokumentasikan, juga menyortir ke arah ini.&lt;/p&gt;
</content:encoded></item><item><title>Tiket dukungan vs. permintaan fitur: mana yang Anda percaya?</title><link>https://changeloop.dev/blog/id/feedback-signal-quality/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/feedback-signal-quality/</guid><description>Tiket dukungan dan papan permintaan fitur mengukur hal berbeda, dan memperlakukan lonjakan di satu setara yang lain menghasilkan prioritas yang salah.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Papan permintaan fitur menangkap apa yang diminta pengguna saat mereka punya waktu untuk duduk dan
menjelaskan apa yang mereka inginkan. Tiket dukungan menangkap di mana pengguna terjebak sekarang,
sering jengkel, sering tanpa kosakata untuk menjelaskan dengan rapi permintaan yang mendasarinya.
Keduanya adalah sinyal nyata, dan tim yang hanya melihat salah satunya akhirnya menyelesaikan
masalah yang salah dengan percaya diri, karena setiap kanal secara sistematis terlalu
mewakili jenis pengguna yang berbeda dan jenis kebutuhan yang berbeda. &lt;a href=&quot;https://changeloop.dev/blog/id/prioritizing-feature-requests/&quot;&gt;Memprioritaskan permintaan
fitur&lt;/a&gt; membahas peringkat apa yang sudah ada di papan; ini
tentang kesenjangan antara apa yang sampai ke papan sama sekali dan apa yang hanya pernah muncul
sebagai tiket dukungan.&lt;/p&gt;
&lt;h2&gt;Mengapa masalah yang mendasari sama bisa muncul di satu kanal dan tidak di kanal lain?&lt;/h2&gt;
&lt;p&gt;Karena kedua kanal punya biaya aktivasi berbeda, dan besarnya biaya itu menentukan siapa yang
melewatinya. Mengajukan permintaan fitur butuh inisiatif: pengguna harus percaya bahwa permintaan
itu layak diungkapkan, menemukan papannya, dan menulis sesuatu yang koheren, yang menyeleksi
pengguna yang terlibat dan sabar yang sudah berinvestasi dalam produk. Mengajukan tiket dukungan
hampir tidak butuh inisiatif dibandingkan itu, sering hanya klik &amp;quot;bantuan&amp;quot; di tengah tugas, yang
berarti itu menangkap pengguna yang frustrasi saat itu, termasuk mereka yang tidak akan pernah
repot dengan papan permintaan fitur sama sekali. Kesenjangan nyata dalam produk bisa tidak
terlihat di papan fitur dan ribut di dukungan hanya karena pengguna yang mengalaminya adalah yang
paling kecil kemungkinannya mengajukan permintaan formal.&lt;/p&gt;
&lt;h2&gt;Apakah volume tiket untuk fitur yang hilang berarti sama dengan jumlah suara untuk itu?&lt;/h2&gt;
&lt;p&gt;Tidak, karena keduanya mengukur populasi berbeda dalam kondisi berbeda. Permintaan fitur dengan
seratus suara mewakili seratus orang yang meluangkan waktu untuk menemukan dan mendukung
permintaan yang sudah ada, yang merupakan sinyal kuat permintaan yang bertahan dan
dipertimbangkan. Seratus tiket dukungan tentang kesenjangan yang mendasari sama, diajukan dalam
periode yang sama, kemungkinan mewakili pengguna yang menabrak tembok saat itu, beberapa di
antaranya akan sepenuhnya lupa begitu gesekan langsungnya berlalu. Memperlakukan keduanya sebagai
sinyal setara &amp;quot;seratus orang menginginkan ini&amp;quot; terlalu membobot volume tiket, karena tiket murah
untuk dihasilkan dan suara tidak.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Papan permintaan fitur&lt;/th&gt;
&lt;th&gt;Tiket dukungan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Butuh inisiatif untuk mengajukan&lt;/td&gt;
&lt;td&gt;Hampir tidak butuh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menangkap permintaan yang dipertimbangkan dan bertahan&lt;/td&gt;
&lt;td&gt;Menangkap frustrasi saat itu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Condong ke pengguna yang terlibat dan sabar&lt;/td&gt;
&lt;td&gt;Menangkap pengguna yang tidak akan pernah pakai papan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jumlah suara adalah sinyal komitmen nyata&lt;/td&gt;
&lt;td&gt;Jumlah tiket mencerminkan gesekan, tidak selalu keinginan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apa artinya jika sebuah fitur punya tiket dukungan tapi hampir tidak ada suara di papan?&lt;/h2&gt;
&lt;p&gt;Sering kali, permintaan itu ada tapi pengguna yang mengalaminya tidak tahu papan itu ada, tidak
percaya voting akan mengubah apa pun, atau menghadapi masalah itu terlalu jarang untuk repot
berpindah kanal demi mendaftarkannya secara formal. Ini persis populasi yang secara struktural
terlewat oleh papan permintaan, dan jumlah suara yang rendah di sini adalah bukti kesenjangan
pengukuran, bukan bukti permintaan rendah. Perlakukan kelompok tiket dukungan seputar fitur yang
hilang sebagai sinyalnya sendiri yang layak Anda daftarkan sendiri ke papan, atas nama pengguna,
alih-alih tidak percaya pada tiket itu, agar tidak tetap tidak terlihat bagi siapa pun
yang memprioritaskan hanya dari jumlah suara.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Papan terbaca sebagai prioritas rendah:
&amp;quot;Export to CSV&amp;quot;: 4 suara dalam 6 bulan

Dukungan menceritakan kisah berbeda:
&amp;quot;Export to CSV&amp;quot;: 31 tiket dalam periode yang sama, masing-
masing dari akun berbeda, masing-masing ditutup dengan
&amp;quot;belum didukung saat ini, akan meneruskan masukan&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Apakah lonjakan tiket dukungan selalu berarti masalah yang mendasari adalah fitur yang hilang?&lt;/h2&gt;
&lt;p&gt;Tidak, dan di sinilah kedua kanal bisa menyesatkan ke arah yang berlawanan. Lonjakan tiket sama
seringnya disebabkan oleh antarmuka yang membingungkan seputar fitur yang sudah ada, bug, atau
perubahan yang keluar tanpa penjelasan memadai, yang tidak satu pun terselesaikan dengan membangun
sesuatu yang baru. Membaca setiap lonjakan tiket sebagai &amp;quot;pengguna menginginkan fitur yang tidak
kami miliki&amp;quot; menghasilkan roadmap penuh hal-hal yang sebenarnya adalah kesenjangan dokumentasi atau
masalah kegunaan yang menyamar. Tiket dukungan memberi tahu Anda di mana gesekannya; itu sendiri
tidak memberi tahu Anda apakah solusinya fitur baru, perubahan antarmuka, atau artikel bantuan yang
lebih baik, dan mencampuradukkan itu membuang waktu rekayasa untuk solusi yang salah.&lt;/p&gt;
&lt;h2&gt;Bagaimana kedua sinyal itu seharusnya benar-benar digabungkan saat memutuskan apa yang dibangun?&lt;/h2&gt;
&lt;p&gt;Gunakan tiket untuk menemukan di mana gesekannya, dan gunakan papan permintaan, ditambah jangkauan
langsung di mana papannya tipis, untuk mengonfirmasi seperti apa hasil yang sebenarnya diinginkan.
Kelompok tiket mengidentifikasi masalah nyata yang dirasakan; jarang menentukan solusi cukup
presisi untuk dibangun, karena pengguna yang frustrasi dalam percakapan dukungan menjelaskan gejala,
bukan spesifikasi. Papan permintaan, ketika punya cukup suara pada masalah yang mendasari sama,
cenderung membawa lebih banyak detail &amp;quot;apa yang benar-benar akan memuaskan ini&amp;quot;, karena menulis
permintaan sudah merupakan tindakan menentukan apa yang diinginkan, bukan sekadar melaporkan apa
yang salah.&lt;/p&gt;
&lt;h2&gt;Haruskah agen dukungan mencatat tiket sebagai permintaan fitur sendiri?&lt;/h2&gt;
&lt;p&gt;Ya, dan ini perbaikan berdaya ungkit tertinggi untuk kesenjangan antara kedua kanal. Agen yang
mengenali tiket sebagai permintaan fitur yang menyamar, alih-alih hanya menyelesaikannya dan
melanjutkan, bisa mencatatnya ke papan atas nama pelanggan, yang langsung menutup kesenjangan
pengukuran alih-alih mengharuskan pelanggan menemukan dan menggunakan kanal kedua. Ini hanya
berhasil jika mencatat memakan waktu detik bagi agen, bukan menit, sehingga gesekan melakukannya
lebih rendah daripada gesekan hanya menutup tiket dan pindah ke berikutnya.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Haruskah suara permintaan fitur pernah didiskon jika semuanya berasal dari satu akun atau tim?&lt;/strong&gt;
Ya, timbang berdasarkan akun atau organisasi yang berbeda alih-alih jumlah suara mentah, karena
lima suara dari lima orang di perusahaan yang sama mewakili prioritas satu pelanggan, bukan lima
konfirmasi independen permintaan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah layak membangun fitur yang banyak muncul di tiket tapi hampir tidak ada suara?&lt;/strong&gt;
Sering ya, asalkan volume tiket benar-benar berasal dari akun berbeda dan kebutuhan yang mendasari
dikonfirmasi bukan diasumsikan; perlakukan jumlah suara yang rendah sebagai artefak pengukuran
biaya aktivasi papan, bukan bukti bahwa permintaannya tidak nyata.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana cara membedakan sekilas tiket kebingungan UI dari tiket fitur hilang yang genuine?&lt;/strong&gt;
Lihat apakah resolusinya melibatkan menjelaskan kemampuan yang sudah ada atau meminta maaf atas
yang hilang. Pola resolusi &amp;quot;oh, sebenarnya ada di sana&amp;quot; menunjuk masalah antarmuka atau
kemudahan penemuan; pola &amp;quot;kami belum mendukung itu&amp;quot; menunjuk kesenjangan nyata.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah perbedaan ini sama pentingnya dengan volume dukungan yang sangat kecil?&lt;/strong&gt;
Secara mekanis kurang penting, karena segelintir tiket mudah dibaca satu per satu tanpa perlu
analisis agregat, tapi bias yang mendasarinya, tiket terlalu mewakili pengguna frustrasi dan kurang
mewakili yang sabar, hadir di skala mana pun dan layak diingat bahkan saat Anda membaca setiap
tiket sendiri.&lt;/p&gt;
</content:encoded></item><item><title>Tag git, rilis, dan changelog Anda</title><link>https://changeloop.dev/blog/id/git-tags-releases-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/git-tags-releases-changelog/</guid><description>Tag git, rilis, dan entri changelog adalah tiga catatan dari satu peristiwa. Mencampuradukkannya membuat changelog melenceng. Cara ketiganya selaras.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Tag git, rilis, dan entri changelog adalah tiga catatan berbeda dari peristiwa yang sama, dan
mencampuradukkannya membuat changelog diam-diam melenceng dari apa yang sebenarnya dirilis. Tag
menandai commit. Rilis mengemas tag itu dengan artefak dan deskripsi. Entri changelog menjelaskan,
dengan istilah yang bisa dipakai pembaca di luar repositori, apa yang berubah. Biasanya terjadi
berdekatan waktunya, dan justru karena itu mudah memperlakukannya sebagai satu langkah alih-alih
tiga, dan justru karena itu jaraknya baru terlihat berbulan-bulan kemudian, saat seseorang bertanya
&amp;quot;apa yang dirilis di v2.4&amp;quot; dan jawaban jujurnya butuh penggalian sungguhan.&lt;/p&gt;
&lt;h2&gt;Apa sebenarnya perbedaan di antara ketiganya?&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Catatan&lt;/th&gt;
&lt;th&gt;Hidup di&lt;/th&gt;
&lt;th&gt;Ditulis untuk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tag git&lt;/td&gt;
&lt;td&gt;Repositori, sebagai referensi&lt;/td&gt;
&lt;td&gt;Siapa pun yang checkout commit persis itu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rilis&lt;/td&gt;
&lt;td&gt;Host kode (GitHub, GitLab)&lt;/td&gt;
&lt;td&gt;Siapa pun yang mengunduh build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entri changelog&lt;/td&gt;
&lt;td&gt;Changelog produk itu sendiri&lt;/td&gt;
&lt;td&gt;Siapa pun yang memakai produk, bukan hanya repo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Tag adalah yang paling mekanis dari ketiganya: &lt;code&gt;git tag v2.4.0&lt;/code&gt; dan selesai, tanpa syarat apa pun
yang harus menjelaskan isinya. Rilis menambahkan deskripsi dan biasanya artefak yang bisa
diunduh, dan audiensnya tetap developer yang tahu apa itu halaman rilis. Entri changelog adalah
satu-satunya dari ketiganya yang ditulis untuk pembaca yang mungkin tidak pernah membuka
repositori, itu sebabnya ini yang butuh perhatian editorial paling banyak dan paling mungkin
dilewati di bawah tekanan tenggat.&lt;/p&gt;
&lt;h2&gt;Apakah setiap tag git butuh entri changelog?&lt;/h2&gt;
&lt;p&gt;Tidak, dan memperlakukannya satu-lawan-satu adalah kesalahan umum. Tag bisa menandai tonggak
internal, release candidate, atau hotfix yang tidak pernah menjangkau kebanyakan pengguna; tak
satu pun dari itu harus punya entri publik. Ujinya sama dengan yang menentukan apakah sesuatu
layak masuk changelog sama sekali: apakah pengguna atau pemanggil akan menyadari atau
mempedulikannya. Kebanyakan tag lolos uji itu. Beberapa, seperti tag yang dibuat hanya untuk
memicu pipeline CI, tidak pernah.&lt;/p&gt;
&lt;h2&gt;Apakah setiap entri changelog butuh tag sendiri?&lt;/h2&gt;
&lt;p&gt;Tidak selalu, dan di sinilah tim yang deploy berkelanjutan berbeda dari tim yang merilis paket
berversi. Produk SaaS yang deploy beberapa kali sehari bisa mengelompokkan beberapa deploy di
bawah satu entri changelog bertanggal tanpa tag 1:1 per deploy; pustaka yang dipublikasikan di
registri paket biasanya butuh satu tag per versi yang dipublikasikan. Go modules dan Swift
Package Manager me-resolve versi dari tag itu sendiri; di npm atau PyPI registri menyimpan versi
yang dipublikasikan, dan tag adalah cara siapa pun memetakan versi itu kembali ke sumbernya. Repositori dengan
beberapa paket yang diversi secara independen harus memutuskan ini per paket, bukan sekali untuk
seluruh repo; &lt;a href=&quot;https://changeloop.dev/blog/id/monorepo-changelogs/&quot;&gt;changelog monorepo&lt;/a&gt; membahas bagaimana prefiks tag
dan cakupan changelog seharusnya mengikuti batas paket, bukan batas folder.
&lt;a href=&quot;https://changeloop.dev/blog/id/semantic-versioning-changelog/&quot;&gt;Semantic versioning dan changelog Anda&lt;/a&gt;
membahas bagaimana nomor versi itu sendiri seharusnya memetakan ke kategori changelog; tag adalah
mekanisme yang membuat nomor versi bisa diverifikasi terhadap kode sebenarnya.&lt;/p&gt;
&lt;h2&gt;Bagaimana deskripsi rilis seharusnya berkaitan dengan entri changelog?&lt;/h2&gt;
&lt;p&gt;Keduanya bisa jadi teks yang sama, tapi hanya jika audiens keduanya benar-benar sama, yang lebih
jarang dari kelihatannya. Halaman rilis di host kode dibaca hampir seluruhnya oleh developer; jika
produk juga punya pengguna non-teknis yang membaca changelog, menduplikasi deskripsi rilis apa
adanya mengirim istilah internal dan formulasi berorientasi kode ke pembaca yang butuh versi
bahasa awam. Pola paling bersih: tulis entri changelog sebagai artefak utama yang berorientasi
pembaca, dan biarkan deskripsi rilis menautkannya atau menyimpan ringkasan yang lebih pendek dan
teknis untuk audiens yang sudah nyaman di sana.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Rilis v2.4.0 (GitHub, untuk developer)
Meningkatkan pipeline laporan ke mesin agregasi baru. Lihat changelog
untuk ringkasan berorientasi pelanggan:
https://example.com/changelog#v2.4.0

## 2026-09-07 (Changelog, berorientasi pelanggan)
### Added
- Laporan sekarang dimuat dalam kurang dari satu detik, bahkan untuk
  akun dengan lebih dari satu juta baris.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rilis yang sama, dua dokumen, masing-masing dengan formulasinya sendiri untuk pembacanya sendiri.&lt;/p&gt;
&lt;h2&gt;Dari mana sebenarnya entri changelog berasal?&lt;/h2&gt;
&lt;p&gt;Dari dua titik awal, dan kebanyakan pipeline nyata adalah campuran keduanya. Bisa dihasilkan dari
pesan commit pada saat tag, yang cepat dan tidak pernah melewatkan pull request yang digabung;
&lt;a href=&quot;https://changeloop.dev/blog/id/conventional-commits-changelog/&quot;&gt;dari conventional commits ke changelog&lt;/a&gt; membahas
pipeline itu secara lengkap. Atau bisa ditulis manual, terpisah dari tag sepenuhnya, disinkronkan
dengan saat fitur dianggap selesai alih-alih saat kode digabung. Entri yang dihasilkan konsisten
tapi mewarisi setiap pesan commit yang samar; entri yang ditulis manual lebih jelas tapi butuh
seseorang untuk benar-benar menulisnya. Kebanyakan tim yang mengotomatisasi tetap menjaga langkah
penyuntingan ringan pada teks yang dihasilkan sebelum menjadi entri publik, disiplin yang sama
yang direkomendasikan &lt;a href=&quot;https://changeloop.dev/blog/id/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog, dalam praktik&lt;/a&gt;,
terlepas dari dari mana teks mentahnya awalnya berasal.&lt;/p&gt;
&lt;h2&gt;Apa yang rusak ketika ketiganya tidak sinkron?&lt;/h2&gt;
&lt;p&gt;Kepercayaan pada yang dicek pembaca lebih dulu. Tag yang ada tanpa entri changelog yang sesuai
terlihat, dari sisi pembaca changelog, seolah tidak terjadi apa-apa minggu itu. Entri changelog
tanpa tag atau rilis yang sesuai membuat mustahil bagi seseorang yang men-debug masalah produksi
untuk checkout kode persis yang live saat entri dipublikasikan. Solusinya bukan otomatisasi
sempurna, tapi satu sumber kebenaran untuk pemetaan itu: satu tempat, meski hanya checklist proses
rilis itu sendiri, yang menyatakan perubahan yang bisa dirilis mendapat ketiganya, dalam commit
atau pull request yang sama yang memperkenalkannya.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Haruskah entri changelog dihasilkan otomatis dari tag git?&lt;/strong&gt;
Bisa jadi titik awal, tapi tag saja tidak membawa deskripsi berorientasi pembaca, hanya rentang
commit. Generasi otomatis harus membaca pesan commit dalam rentang itu, bukan hanya keberadaan
tag, untuk menghasilkan sesuatu yang bisa dipakai.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana jika kami tidak men-tag setiap rilis?&lt;/strong&gt;
Maka entri changelog menjadi catatan utama, dan tetap harus membawa tanggal dan, jika produk
punya, nomor versi, sehingga entri tetap jadi sesuatu yang bisa dirujuk pembaca nanti bahkan tanpa
tag yang sesuai.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah tag pra-rilis (seperti &lt;code&gt;v2.4.0-rc.1&lt;/code&gt;) punya entri changelog?&lt;/strong&gt;
Umumnya tidak. Release candidate untuk pengujian internal atau beta, dan entri changelog untuknya
melatih pembaca mengharapkan entri untuk versi yang mungkin tidak pernah dirilis persis seperti
dideskripsikan. Simpan entri untuk tag yang mencapai ketersediaan umum.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bisakah satu entri changelog mencakup beberapa tag git?&lt;/strong&gt;
Ya, dan sering kali seharusnya begitu untuk tim yang sering men-tag. Kelompokkan tag terkait di
bawah satu entri bertanggal yang mendeskripsikan perubahan bersih, alih-alih mempublikasikan
entri tipis per tag yang memecah satu fitur ke beberapa bacaan.&lt;/p&gt;
</content:encoded></item><item><title>Release notes internal: siapa lagi yang perlu tahu</title><link>https://changeloop.dev/blog/id/internal-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/internal-release-notes/</guid><description>Tim support dan sales biasanya tahu soal peluncuran dari pelanggan yang bingung. Release notes internal memperbaikinya, dengan bentuk yang berbeda.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Setiap artikel lain di hub ini mengasumsikan pembaca release note adalah pelanggan. Support,
sales, dan customer success juga membaca, atau mencoba, dan kebanyakan tahu apa yang dirilis
karena pelanggan bertanya lebih dulu. Urutan itu terbalik, dan itu juga default di kebanyakan
perusahaan, karena proses rilis berakhir pada saat catatan untuk pelanggan keluar, dan tidak ada
yang membangun langkah kedua yang lebih kecil untuk orang-orang yang harus menjawab pertanyaan
tentangnya satu jam kemudian.&lt;/p&gt;
&lt;h2&gt;Apa itu release note internal, dan bagaimana bedanya dari yang untuk pelanggan?&lt;/h2&gt;
&lt;p&gt;Ini dokumen yang lebih singkat, ditulis untuk orang yang sudah mengenal produk secara mendalam,
yang memberi tahu mereka apa yang berubah dan apa yang harus dilakukan soal itu dalam pekerjaan
konkret mereka. Agen support tidak butuh pembingkaian yang dipoles yang dipakai pengumuman untuk
pelanggan; mereka perlu tahu seperti apa perubahan itu di produk sekarang, apa pertanyaan yang
paling mungkin muncul soal itu, dan apakah tiket yang terbuka terdampak. Catatan untuk pelanggan
menjual perubahan. Catatan internal membekali seseorang untuk menanganinya.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Audiens&lt;/th&gt;
&lt;th&gt;Yang perlu mereka tahu&lt;/th&gt;
&lt;th&gt;Di mana mereka membutuhkannya&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;Apa yang berubah di UI, pertanyaan yang mungkin muncul, tiket terbuka yang terdampak&lt;/td&gt;
&lt;td&gt;Di mana mereka sudah mencari jawaban&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sales&lt;/td&gt;
&lt;td&gt;Apa yang dibuka untuk sebuah kesepakatan, apa yang belum bisa dilakukan&lt;/td&gt;
&lt;td&gt;Di mana mereka bersiap untuk panggilan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer success&lt;/td&gt;
&lt;td&gt;Apa yang harus dikatakan pada pelanggan yang ada, dan siapa yang memintanya&lt;/td&gt;
&lt;td&gt;Di mana mereka merencanakan outreach&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pimpinan&lt;/td&gt;
&lt;td&gt;Apa yang dirilis dibanding yang dijanjikan, dan kapan&lt;/td&gt;
&lt;td&gt;Ringkasan singkat dan berulang, bukan per rilis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Kenapa tim internal tahu peluncuran terlambat?&lt;/h2&gt;
&lt;p&gt;Karena proses rilis biasanya dibangun di sekitar satu artefak, catatan untuk pelanggan atau entri
changelog, dan semua yang internal diasumsikan mengikuti dari membaca dokumen tunggal itu. Itu
tidak benar. Agen support sibuk dengan tiket di depan mereka, bukan menelusuri changelog untuk
mencari konteks, dan catatan yang ditulis untuk pelanggan sering kali melewatkan justru detail
operasional yang dibutuhkan agen, seperti paket mana yang mendapat fitur itu atau seperti apa
pesan errornya saat gagal. Pada saat pelanggan bertanya, agen sedang membaca catatan publik yang
sama yang baru saja dibaca pelanggan, tanpa keunggulan apa pun.&lt;/p&gt;
&lt;h2&gt;Apa yang harus dikatakan release note internal yang tidak dikatakan catatan untuk pelanggan?&lt;/h2&gt;
&lt;p&gt;Detail operasional yang sengaja dihilangkan catatan untuk pelanggan. Paket atau akun mana yang
memilikinya. Seperti apa jika ada yang salah, dan apa yang harus dikatakan pada pelanggan yang
menemuinya. Apakah itu menutup permintaan atau tiket terbuka, dan yang mana, agar agen yang
menangani tiket terkait tahu harus memeriksanya. Siapa di tim yang bertanggung jawab jika
pertanyaan melampaui apa yang dicakup catatan itu. Tidak satu pun dari ini milik versi untuk
pelanggan, yang ditulis untuk dibaca sekali oleh seseorang di luar perusahaan; semua ini justru
yang dibutuhkan seseorang yang menjawab pertanyaan yang sama empat puluh kali seminggu.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Catatan internal: ekspor CSV massal (rilis 08-09-2026)

- Hanya untuk paket Team dan Enterprise. Free dan Pro tidak ada
  perubahan.
- Kegagalan umum: ekspor di atas 50rb baris timeout; masalah
  diketahui, perbaikan dilacak terpisah. Beri tahu pelanggan
  untuk menyaring berdasarkan rentang tanggal.
- Menutup 14 permintaan terbuka berlabel `bulk-export`. Template
  balasan ada di dokumen bersama.
- Penanggung jawab: tim platform, #platform-eng untuk apa pun
  di luar catatan ini.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Empat baris yang bisa langsung dipakai agen support, tidak satu pun akan masuk entri changelog
publik untuk fitur yang sama.&lt;/p&gt;
&lt;h2&gt;Siapa yang harus menulisnya, dan kapan?&lt;/h2&gt;
&lt;p&gt;Siapa pun yang menulis catatan untuk pelanggan biasanya orang yang tepat, karena mereka sudah
punya seluruh konteks, tapi ini harus jadi langkah singkat terpisah, bukan mencoba membuat satu
dokumen melayani kedua audiens. Menggabungkannya menghasilkan catatan untuk pelanggan yang penuh
detail internal, atau catatan internal yang terlalu dipoles hingga tidak lagi benar-benar
berguna, dan dalam praktiknya lebih cepat menulis dua dokumen singkat daripada bernegosiasi satu
dokumen untuk melayani dua audiens sekaligus. Waktu lebih penting daripada siapa penulisnya:
catatan internal harus keluar sebelum yang untuk pelanggan, bahkan hanya beberapa jam lebih awal,
agar support tidak pernah tahu perubahan dari tempat yang sama dengan pelanggan.&lt;/p&gt;
&lt;h2&gt;Di mana ia harus berada agar support benar-benar menemukannya saat ada tiket?&lt;/h2&gt;
&lt;p&gt;Di mana tim sudah mencari sesuatu saat tiket masuk, bukan di changelog terpisah yang tidak ada
alasan bagi siapa pun untuk membukanya sendiri. Tim support yang memakai basis pengetahuan bersama
butuh catatan itu di sana, ditautkan dari tempat tiket tentang bagian produk itu sudah dilabeli.
Tim yang hidup di kanal bersama butuh catatan itu diposting di sana, bisa dicari, pada saat
relevan, alih-alih terkubur dalam ringkasan harian yang mereka telusuri sekali. Pola untuk
pelanggan dari &lt;a href=&quot;https://changeloop.dev/blog/id/product-update-email/&quot;&gt;notifikasi bertarget versus digest&lt;/a&gt; juga berlaku
di sini: catatan internal tentang perubahan spesifik dan akan datang seharusnya menjangkau tim
langsung, bukan menunggu ringkasan mingguan yang tiba setelah tiket pertama sudah ada.&lt;/p&gt;
&lt;h2&gt;Apakah butuh ketelitian peninjauan yang sama dengan yang eksternal?&lt;/h2&gt;
&lt;p&gt;Lebih sedikit, dan itu disengaja. Catatan untuk pelanggan mewakili perusahaan secara publik dan
pantas mendapat langkah penyuntingan yang cermat; catatan internal ada untuk cepat dan konkret,
dan memegangnya pada standar polesan yang sama biasanya justru yang membuat tim berhenti
menulisnya sama sekali. Catatan internal yang cepat dan agak kasar yang keluar satu jam sebelum
peluncuran mengalahkan yang dipoles yang tiba keesokan harinya, saat tiket support pertama sudah
datang dengan kebingungan.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Haruskah release notes internal melalui proses persetujuan yang sama dengan yang untuk pelanggan?&lt;/strong&gt;
Tidak. Langkah yang lebih ringan dan cepat justru intinya. Mewajibkan peninjauan yang sama mengubah
catatan internal hari yang sama menjadi catatan minggu berikutnya, saat support sudah menjawab
pertanyaan tanpanya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Siapa yang bertanggung jawab atas release notes internal jika tidak ada peran khusus komunikasi internal?&lt;/strong&gt;
Siapa pun yang menulis catatan untuk pelanggan, sebagai langkah kedua yang singkat tepat setelahnya.
Tidak butuh penanggung jawab terpisah, hanya kebiasaan untuk tidak memperlakukan catatan untuk
pelanggan sebagai satu-satunya artefak yang dihasilkan sebuah rilis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah release notes internal butuh changelog atau arsip sendiri?&lt;/strong&gt;
Tempat yang bisa dicari mengalahkan arsip kronologis yang tidak pernah digulir siapa pun. Jika
support sudah punya basis pengetahuan, catatan itu miliknya di sana, dilabeli ke fitur, alih-alih
di changelog internal terpisah yang hanya membantu orang yang sudah tahu tanggal rilisnya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa risiko melewatkan release notes internal untuk perubahan kecil?&lt;/strong&gt;
Perubahan kecil justru yang membuat support mendapat pertanyaan tanpa peringatan, karena perubahan
kecil jarang mendapat pengumuman seluruh perusahaan. Ukuran release note harus mengikuti skala
ukuran perubahan; itu tidak boleh turun ke nol hanya karena perubahannya kecil.&lt;/p&gt;
</content:encoded></item><item><title>Changelog API internal: apa yang berubah bagi tim lain</title><link>https://changeloop.dev/blog/id/internal-api-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/internal-api-changelog/</guid><description>Changelog API publik punya audiens yang tidak bisa dihubungi langsung. Yang internal punya audiens dua lantai jauhnya, dan itu mengubah isinya.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Setiap artikel lain di hub ini mengasumsikan pemanggil sebuah API berada di luar perusahaan:
insinyur dari pelanggan, mitra, seseorang yang menemukan dokumentasi sendiri. Banyak API punya
jenis pemanggil yang sama sekali berbeda, tim di ruangan sebelah atau dua lantai berjarak, dan itu
mengubah perhitungan tentang apa yang harus disampaikan changelog kepada mereka, karena pesan
Slack bisa menjangkau mereka dan biasanya tidak pernah ada tiket support yang dibuka. Kebanyakan
tim menyimpulkan dari ini bahwa API internal tidak butuh changelog. Yang sebenarnya mereka
butuhkan adalah changelog yang berbeda.&lt;/p&gt;
&lt;h2&gt;Apa yang membuat changelog API internal berbeda dari yang publik?&lt;/h2&gt;
&lt;p&gt;Audiensnya bisa dijangkau langsung, yang menghilangkan alasan utama kebanyakan changelog API
publik ada: menyiarkan ke pemanggil yang tidak bisa dihubungi satu per satu. Tim pemilik API
internal biasanya tahu persis tim lain mana yang memanggilnya, kadang sampai ke service tertentu.
Itu membuat pesan bertarget, bukan feed publik, jadi pilihan default alami, dan itulah sebabnya
API internal begitu sering berakhir tanpa changelog sama sekali: tim pemilik memberi tahu dua atau
tiga tim yang diingatnya, dengan asumsi itu sudah mencakup semua orang.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Changelog API publik&lt;/th&gt;
&lt;th&gt;Changelog API internal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Siapa yang membaca&lt;/td&gt;
&lt;td&gt;Pemanggil eksternal mana pun, kebanyakan tidak bisa dihubungi langsung&lt;/td&gt;
&lt;td&gt;Sekumpulan kecil tim internal yang biasanya diketahui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kanal default&lt;/td&gt;
&lt;td&gt;Halaman dan feed&lt;/td&gt;
&lt;td&gt;Pesan ke tim pemanggil, idealnya juga halaman&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Risiko terbesar&lt;/td&gt;
&lt;td&gt;Pemanggil melewatkan entri sepenuhnya&lt;/td&gt;
&lt;td&gt;Tim pemilik lupa pemanggil yang tidak diingatnya ada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yang menggantikan &amp;quot;kami tidak tahu siapa yang memanggil kami&amp;quot;&lt;/td&gt;
&lt;td&gt;Tidak ada; publikasikan secara luas&lt;/td&gt;
&lt;td&gt;Registri pemanggil yang nyata dan terus diperbarui&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Kenapa &amp;quot;kami akan memberi tahu tim yang memanggil kami saja&amp;quot; gagal?&lt;/h2&gt;
&lt;p&gt;Karena kumpulan pemanggil tidak pernah sekecil atau sestatis yang diingat tim pemilik. Sebuah
service yang dibangun untuk satu konsumen mendapat pemanggil kedua enam bulan kemudian, lewat
integrasi yang tidak pernah diumumkan siapa pun, dan daftar mental &amp;quot;siapa yang memanggil kami&amp;quot;
milik tim pemilik sekarang salah tanpa disadari siapa pun. Kegagalan ini wajar dan umum, hasil
default dari mengandalkan ingatan alih-alih catatan, bukan tanda ada yang ceroboh.
&lt;a href=&quot;https://changeloop.dev/blog/id/breaking-changes/&quot;&gt;Apa itu breaking change&lt;/a&gt; membahas cara memutuskan apakah suatu
perubahan API dihitung sebagai breaking sejak awal; kasus internal menambahkan pertanyaan kedua
yang lebih sulit di atas itu, yaitu mengetahui siapa yang harus diberi tahu.&lt;/p&gt;
&lt;h2&gt;Apakah API internal tetap butuh halaman changelog bergaya publik?&lt;/h2&gt;
&lt;p&gt;Biasanya ya, meski kanal utamanya langsung. Halaman memberi pesan langsung sesuatu untuk ditautkan,
sehingga notifikasi bisa singkat (&amp;quot;breaking change di &lt;code&gt;/v2/accounts&lt;/code&gt;, detail di sini&amp;quot;) alih-alih
mencoba membawa seluruh penjelasan dalam pesan chat yang akan tergeser dan hilang. Halaman itu
juga jadi tempat yang bisa diperiksa tim baru, atau tim yang melewatkan pesan langsung, saat
integrasi mereka rusak dan mereka mencoba mencari tahu kenapa. Halaman itu tidak perlu dipoles
atau publik; halaman itu perlu bisa ditautkan dan bertahan lebih lama dari thread Slack yang
mengumumkannya.&lt;/p&gt;
&lt;h2&gt;Siapa yang sebenarnya memelihara daftar pemanggil?&lt;/h2&gt;
&lt;p&gt;Tim pemilik, dan ini harus diperlakukan sebagai artefak nyata, bukan pengetahuan lisan. Versi
termurah adalah file di repository API itu sendiri, daftar singkat service konsumen dengan
penanggung jawab per entri, diperbarui setiap kali integrasi baru dibangun, disiplin yang sama
seperti deklarasi dependensi apa pun. Alternatifnya, bertanya ke sana kemari sebelum setiap
breaking change, berhasil sampai suatu kali seseorang lupa bertanya pada orang yang tepat, dan
API internal yang rusak diam-diam bagi satu tim adalah insiden yang lebih kecil daripada yang
publik, tapi tetap insiden, biasanya ditemukan oleh on-call tim itu sendiri alih-alih oleh
pemilik API.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# consumers.yml
- service: billing-service
  owner: &amp;quot;#team-billing&amp;quot;
  since: 2026-03-01
- service: reporting-pipeline
  owner: &amp;quot;#team-analytics&amp;quot;
  since: 2026-06-14
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;File seperti ini mengubah &amp;quot;siapa yang perlu kita beri tahu&amp;quot; dari pertanyaan menjadi pencarian.
Tool yang dibangun persis untuk masalah ini, seperti &lt;a href=&quot;https://backstage.io/docs/features/software-catalog/system-model/&quot;&gt;service catalog
Backstage&lt;/a&gt;, memodelkan API
sebagai entitas kelas satu dengan konsumen yang dideklarasikan, untuk alasan yang sama: begitu
sebuah organisasi punya cukup banyak service internal, ingatan siapa pun tentang siapa memanggil
apa tidak lagi akurat dengan sendirinya, dan sesuatu harus menyimpan catatannya. &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;Dokumentasi&lt;/a&gt;
untuk tool apa pun yang sudah Anda jalankan secara internal biasanya tempat pertama yang tepat
untuk diperiksa sebelum membangun yang khusus sendiri.&lt;/p&gt;
&lt;h2&gt;Apa yang masuk entri changelog internal yang tidak dibutuhkan changelog publik?&lt;/h2&gt;
&lt;p&gt;Kekhususan operasional yang lebih banyak, karena pembaca adalah insinyur lain yang akan bertindak
atas ini dalam infrastruktur yang sama, bukan membacanya sebagai ringkasan. Di lingkungan mana
perubahan itu live dan kapan, karena service internal sering dipromosikan lewat tahap-tahap yang
tidak pernah dilihat pemanggil publik. Apakah perubahan itu memerlukan pembaruan konfigurasi atau
library klien di sisi konsumen, dirumuskan sebagai perintah jika ada. Dan, karena pemanggil
internal sering bisa mengoordinasikan perbaikan langsung dengan tim pemilik, kontak bernama alih-
alih kanal support: &amp;quot;beri tahu @maria kalau ini merusak sesuatu&amp;quot; adalah baris yang sepenuhnya
masuk akal dalam entri internal dan aneh dalam changelog API publik.&lt;/p&gt;
&lt;h2&gt;Apakah ini berlaku sama untuk changelog di dalam monorepo?&lt;/h2&gt;
&lt;p&gt;Ini mempertajam masalah yang sama alih-alih menggantikannya.
&lt;a href=&quot;https://changeloop.dev/blog/id/monorepo-changelogs/&quot;&gt;Changelog monorepo&lt;/a&gt; membahas kapan sebuah paket butuh changelog
sendiri; API internal yang menjadi salah satu dari beberapa paket dalam monorepo tetap butuh
konsumennya dilacak secara eksplisit, karena berbagi repository yang sama dengan pemanggilnya
tidak berarti mereka akan menyadari perubahan kecuali ada yang memberi tahu mereka untuk
memperhatikan. Kedekatan dalam repo bukan hal yang sama dengan kedekatan dalam perhatian.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apakah API yang hanya internal butuh changelog jika hanya punya satu pemanggil?&lt;/strong&gt;
Hampir tidak, dan pesan langsung ke tim tunggal itu biasanya cukup. Changelog jadi berharga begitu
ada lebih dari satu pemanggil, atau begitu daftar pemanggil pernah mengejutkan tim pemilik, karena
itu tandanya ingatan saja tidak lagi bisa diandalkan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah perubahan API internal melalui review yang sama seperti yang publik?&lt;/strong&gt;
Kata-katanya bisa lebih ringan, karena pembacanya kolega bukan pemanggil eksternal, tapi keputusan
apakah suatu perubahan bersifat breaking pantas mendapat kehati-hatian yang sama di kedua kasus.
Pemanggil internal tetap punya kode produksi yang bergantung pada perilaku lama.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana cara mengetahui siapa yang memanggil API internal jika itu tidak pernah dilacak?&lt;/strong&gt;
Log server atau data trafik dari service mesh adalah jawaban jujur jika registri konsumen tidak
pernah dipelihara; perlakukan penemuan itu sebagai saat untuk mulai memeliharanya, bukan sebagai
pembersihan satu kali.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah pesan Slack cukup, atau perubahan internal tetap butuh entri changelog formal?&lt;/strong&gt;
Keduanya, untuk apa pun yang bukan murni penambahan. Pesan adalah yang terbaca tepat waktu; entri
adalah yang bisa tetap ditemukan oleh tim yang menyelidiki masalah berminggu-minggu kemudian dan
tidak pernah melihat pesan itu.&lt;/p&gt;
</content:encoded></item><item><title>Release notes mobile: apa yang dipotong batasan</title><link>https://changeloop.dev/blog/id/mobile-app-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/mobile-app-release-notes/</guid><description>App Store dan Play Store memberi beberapa baris terlihat dan tanpa tautan. Yang berhasil di changelog web akan gagal dengan anggaran sesempit itu.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Semua yang dibahas hub ini tentang menulis release notes mengasumsikan halaman yang sepenuhnya
Anda kendalikan: panjang berapa pun, tautan yang berfungsi, format yang tampil. Release notes
aplikasi mobile hidup di dalam kotak milik orang lain. Apple memberi sekitar 4.000 karakter tapi
hanya menampilkan beberapa baris pertama sebelum &amp;quot;lainnya&amp;quot; disentuh; Google memberi ruang serupa
dengan masalah pratinjau efektif yang sama, dan kedua platform tidak menampilkan tautan yang bisa
diklik di dalam teks. Aturan dari &lt;a href=&quot;https://changeloop.dev/blog/id/how-to-write-release-notes/&quot;&gt;cara menulis release notes yang benar-benar dibaca orang&lt;/a&gt;
masih berlaku: katakan apa yang berubah dan apa yang harus dilakukan pembaca, tapi ruang untuk
melakukannya hanya sebagian kecil dari yang diizinkan halaman changelog, dan pemotongan harus
disengaja, bukan tidak sengaja.&lt;/p&gt;
&lt;h2&gt;Apa yang benar-benar muat dalam pratinjau yang terlihat?&lt;/h2&gt;
&lt;p&gt;Satu sampai dua baris pertama, sekitar 80 sampai 170 karakter tergantung perangkat dan ukuran
font, sebelum pembaca harus menyentuh untuk memperluas. Itu seluruh anggaran untuk bagian release
note yang menentukan apakah ada yang akan membaca sisanya, dan itu berarti kalimat paling penting
harus datang lebih dulu, bukan nomor versi, bukan sapaan, bukan judul kategori. Release note yang
dimulai dengan &amp;quot;Baru di versi ini:&amp;quot; sudah menghabiskan sepertiga ruang terlihatnya untuk empat
kata yang tidak memberi tahu apa pun kepada pembaca.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Batas total perkiraan&lt;/th&gt;
&lt;th&gt;Pratinjau efektif sebelum &amp;quot;lainnya&amp;quot;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;App Store (iOS)&lt;/td&gt;
&lt;td&gt;~4.000 karakter&lt;/td&gt;
&lt;td&gt;2-3 baris, sekitar 80-170 karakter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Play&lt;/td&gt;
&lt;td&gt;~500 karakter per bahasa, beberapa field lebih pendek&lt;/td&gt;
&lt;td&gt;2-3 baris, mirip iOS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keduanya&lt;/td&gt;
&lt;td&gt;Tidak ada tautan yang bisa diklik di field release notes&lt;/td&gt;
&lt;td&gt;T/A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apakah aturan &amp;quot;apa yang bisa dilakukan sekarang, apa yang harus disampaikan&amp;quot; masih berlaku di panjang ini?&lt;/h2&gt;
&lt;p&gt;Ya, dan jadi lebih ketat, bukan berbeda. Satu kalimat per entri, kata kerja lebih dulu, tanpa
basa-basi: &amp;quot;Ekspor data Anda sebagai CSV dari Pengaturan.&amp;quot; mengalahkan &amp;quot;Kami telah menambahkan
kemampuan bagi pengguna untuk sekarang mengekspor data mereka dalam format CSV&amp;quot; dengan
menggunakan sepertiga kata untuk mengatakan hal yang sama. Pada panjang halaman changelog, kalimat
yang agak bertele-tele merugikan pembaca setengah detik. Pada panjang release note mobile,
bertele-tele yang sama bisa mendorong seluruh kalimat keluar dari pratinjau yang terlihat, sehingga
pembaca tidak pernah melihat kata kerja yang akan memberi tahu apa yang berubah.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Buruk, memboroskan pratinjau untuk basa-basi:
&amp;quot;Kami senang menghadirkan pembaruan baru penuh
peningkatan! Baca terus untuk detailnya.&amp;quot;

Baik, semua nilai di baris pertama:
&amp;quot;Ekspor data sebagai CSV. Mode gelap sekarang mengikuti
pengaturan sistem. Perbaikan crash saat membuka tautan
yang dibagikan.&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Apa yang harus dipotong yang biasanya dipertahankan entri changelog web?&lt;/h2&gt;
&lt;p&gt;Tautan, pertama, karena kedua toko tidak menampilkannya sebagai bisa diklik, jadi URL di dalam
teks adalah beban mati yang harus diketik ulang pembaca. Jika entri butuh tujuan, katakan apa yang
harus disentuh di dalam aplikasi sebagai gantinya: &amp;quot;Lihat filter baru di bawah Pengaturan &amp;gt;
Pencarian&amp;quot; berhasil; &amp;quot;Baca lebih lanjut di example.com/blog/filter&amp;quot; tidak, di permukaan ini.
Kedua, apa pun yang bersyarat atau spesifik untuk audiens tertentu: changelog web bisa bilang
&amp;quot;jika Anda memakai API, ini memengaruhi Anda&amp;quot;, tapi daftar toko menjangkau setiap pengguna yang
terpasang sekaligus, jadi baris bersyarat terbaca sebagai kebisingan bagi 95% yang tidak
terpengaruh. Taruh detail bersyarat itu dalam pesan in-app sebagai gantinya, dipicu untuk akun
yang benar-benar terkait.&lt;/p&gt;
&lt;h2&gt;Haruskah setiap rilis punya catatannya sendiri, atau boleh saja memakai ulang &amp;quot;perbaikan bug dan peningkatan performa&amp;quot;?&lt;/h2&gt;
&lt;p&gt;Pakai ulang untuk rilis yang benar-benar seperti itu, tapi audit seberapa sering itu benar-benar
benar. &lt;a href=&quot;https://changeloop.dev/blog/id/how-to-write-release-notes/&quot;&gt;Cara menulis release notes&lt;/a&gt; sudah membahas kenapa
frasa itu mengkhianati catatan yang ditulis dari dalam alih-alih untuk pembaca; di mobile, ini
merusak dua kali lipat, karena release notes toko adalah salah satu dari sedikit tempat sebagian
pengguna melihat apa pun di antara pembaruan, dan rangkaian panjang &amp;quot;perbaikan bug dan peningkatan
performa&amp;quot; terbaca seolah aplikasi tidak berubah, yang jadi kesan lebih buruk daripada tidak ada
catatan sama sekali untuk periode itu.&lt;/p&gt;
&lt;h2&gt;Apakah release notes memengaruhi apakah orang memperbarui aplikasi sama sekali?&lt;/h2&gt;
&lt;p&gt;Secara tidak langsung, lewat visibilitas alih-alih persuasi. Kebanyakan pengguna memperbarui
otomatis dan tidak pernah membaca catatan sebelum memperbarui; catatan paling penting bagi
minoritas yang memeriksa pembaruan secara manual, dan bagi reviewer atau pers yang menyisir
riwayat daftar toko. Menulis untuk audiens yang lebih kecil itu tetap terbayar, karena daftar
dengan riwayat nyata entri spesifik dan bertanggal terbaca sebagai aplikasi yang aktif dirawat,
dan daftar dengan setahun &amp;quot;perbaikan bug dan peningkatan performa&amp;quot; tidak, terlepas dari seberapa
banyak yang sebenarnya dirilis dalam waktu itu.&lt;/p&gt;
&lt;h2&gt;Bagaimana dengan pembaruan paksa, di mana catatan harus menjelaskan kenapa pengguna tidak punya pilihan?&lt;/h2&gt;
&lt;p&gt;Nyatakan alasan dan tenggat waktu di baris pertama, sebelum yang lain, karena pembaruan paksa
adalah satu kasus di mana pembaca sudah kesal sebelum mulai membaca. &amp;quot;Pembaruan ini diperlukan
untuk terus menyinkronkan data Anda. Perbarui sebelum [tanggal] untuk menghindari gangguan.&amp;quot;
menyampaikan apa yang harus dilakukan dan kenapa dalam satu kalimat; mengubur alasan itu di bawah
tiga baris catatan fitur yang tidak terkait terbaca seolah aplikasi menyembunyikan bagian yang
tidak nyaman.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Haruskah release notes mobile cocok dengan changelog web untuk rilis yang sama?&lt;/strong&gt;
Mencakup perubahan mendasar yang sama, tapi bukan kata demi kata. Changelog web bisa memberi
penjelasan lengkap; catatan mobile butuh fakta yang sama dipadatkan jadi satu kalimat dengan kata
kerja lebih dulu, yang biasanya berarti itu tulisan ulang, bukan salinan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah sepadan melokalkan release notes mobile untuk setiap bahasa yang didukung?&lt;/strong&gt;
Ya, lebih daripada untuk changelog web, karena daftar toko sering jadi satu-satunya permukaan
terlokalkan yang dilihat sebagian pengguna di antara sesi, dan kedua platform mendukung release
notes per locale tanpa kerja rekayasa tambahan di luar terjemahan itu sendiri.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Seberapa panjang release note mobile seharusnya jika tidak ada batas yang memaksa keringkasan?&lt;/strong&gt;
Tetap pendek. Batas 4.000 karakter di iOS jarang jadi kendala sebenarnya; yang jadi kendala adalah
pratinjau 2-3 baris, dan menulis melebihi apa yang ditampilkan pratinjau itu hanya berarti lebih
sedikit orang membaca bagian yang penting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah release notes butuh nomor versi di teks yang terlihat?&lt;/strong&gt;
Tidak. Toko sudah menampilkan nomor versi di sebelah catatan. Mengulanginya di dalam teks
menghabiskan karakter terlihat untuk informasi yang sudah ada di depan pembaca.&lt;/p&gt;
</content:encoded></item><item><title>Changelog monorepo: satu saja, atau satu per paket?</title><link>https://changeloop.dev/blog/id/monorepo-changelogs/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/monorepo-changelogs/</guid><description>Monorepo bisa punya satu changelog untuk seluruh repo atau satu per paket. Salah pilih membuat rilis terlalu berisik dibaca atau terlalu tersebar dicari.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Monorepo menampung beberapa hal yang di-deploy terpisah dalam satu repositori, dan sebuah
changelog harus menjawab satu pertanyaan dulu: apakah pembaca peduli pada repo, atau peduli pada
satu paket tertentu di dalamnya? Kebanyakan tim tidak pernah memutuskan ini dengan sengaja. Mereka
mulai dengan satu changelog karena ada satu repo, menambahkan paket seiring waktu, dan berakhir
dengan log di mana pengguna CLI harus menggulir melewati empat puluh entri backend yang tidak
relevan untuk menemukan entri yang merilis perbaikannya. Yang menentukan bentuk yang tepat bukan
struktur repositori, tapi siapa yang membaca log dan apa yang sudah mereka tahu untuk dicari.&lt;/p&gt;
&lt;h2&gt;Apa yang membuat changelog monorepo berbeda dari repo tunggal?&lt;/h2&gt;
&lt;p&gt;Changelog repo tunggal punya audiens tersirat: semua orang yang memakai satu-satunya hal yang
dibangun repo itu. Audiens monorepo terbagi per paket, dan paket-paket dalam repo yang sama sering
dirilis dengan jadwal berbeda, ke konsumen berbeda, pada tingkat stabilitas berbeda. Pustaka yang
dipublikasikan di registri dan alat administrasi internal bisa hidup di monorepo yang sama dan
hampir tidak punya kesamaan bagi pembaca changelog.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bentuk repo&lt;/th&gt;
&lt;th&gt;Pembaca tipikal&lt;/th&gt;
&lt;th&gt;Changelog yang cocok&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Satu aplikasi yang di-deploy&lt;/td&gt;
&lt;td&gt;Semua orang yang memakai produk&lt;/td&gt;
&lt;td&gt;Satu log, untuk seluruh repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workspace pustaka (beberapa paket dipublikasikan)&lt;/td&gt;
&lt;td&gt;Yang bergantung pada paket tertentu&lt;/td&gt;
&lt;td&gt;Satu log per paket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aplikasi ditambah alat internal&lt;/td&gt;
&lt;td&gt;Dua audiens berbeda tanpa tumpang tindih&lt;/td&gt;
&lt;td&gt;Dibagi berdasarkan audiens, bukan folder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aplikasi ditambah SDK sendiri&lt;/td&gt;
&lt;td&gt;Pengguna produk, dan integrator SDK&lt;/td&gt;
&lt;td&gt;Dua log: khusus produk, khusus SDK&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apakah setiap paket butuh changelog sendiri?&lt;/h2&gt;
&lt;p&gt;Hanya yang punya audiens independen. Paket yang dipublikasikan di registri butuh log sendiri,
karena orang yang menginstalnya tidak punya alasan membaca hal lain di repo, dan alat rilis
monorepo seperti &lt;a href=&quot;https://lerna.js.org/&quot;&gt;Lerna&lt;/a&gt; dan Changesets menulis &lt;code&gt;CHANGELOG.md&lt;/code&gt; per paket, di
sebelah &lt;code&gt;package.json&lt;/code&gt;-nya. Utilitas internal dengan satu konsumen, aplikasi yang sudah hidup di
repo yang sama, tidak butuh log terpisah; memasukkan perubahannya ke entri aplikasi itu lebih
berguna daripada file kedua yang tidak dibuka siapa pun di luar tim.&lt;/p&gt;
&lt;p&gt;Ujinya sama dengan yang menentukan apakah suatu entri layak masuk changelog: apakah pembaca akan
memperhatikan atau peduli, dan bisakah mereka bertindak dengan mengetahuinya. Terapkan per paket,
bukan per folder, dan repo dengan dua belas paket bisa berakhir dengan dua changelog sungguhan dan
sepuluh paket yang memang tidak membutuhkannya.&lt;/p&gt;
&lt;h2&gt;Bagaimana cara tahu paket mana yang menyebabkan entri changelog mana?&lt;/h2&gt;
&lt;p&gt;Beri label setiap entri dengan paketnya pada saat entri itu ditulis, bukan belakangan dengan
memeriksa file mana yang tersentuh sebuah commit. Commit yang memperbaiki pustaka internal
bersama bisa menghasilkan entri changelog di setiap paket yang bergantung padanya, dan jalur file
saja tidak bisa mengatakan entri hilir mana yang benar-benar perlu dilihat pembaca; hanya orang
yang memutuskan &amp;quot;ini terlihat bagi pengguna paket A dan tidak bagi pengguna paket B&amp;quot; yang bisa.
&lt;a href=&quot;https://changeloop.dev/blog/id/conventional-commits-changelog/&quot;&gt;Conventional commits&lt;/a&gt; membantu di sini secara mekanis,
dengan menyebutkan paket di setiap commit, tapi scope tetap hanya menghasilkan draf. Aturan dua
lapis yang sama dari artikel itu berlaku per paket: draf dengan scope yang benar tetap butuh
sentuhan manusia sebelum diformulasikan untuk pembaca sesungguhnya paket itu.&lt;/p&gt;
&lt;h2&gt;Apa yang dibutuhkan changelog bersama yang tidak dibutuhkan changelog repo tunggal?&lt;/h2&gt;
&lt;p&gt;Label paket di setiap entri, paling depan, sebelum deskripsi, agar pembaca yang menyusuri log
bisa melewatkan semua yang bukan miliknya dalam satu kali baca. Tanpa label itu, log bersama
terbaca seperti feed acak, dan pembaca yang tertarik pada satu paket tidak punya cara
menyaringnya selain menghafal baris mana yang penting, yang tidak dilakukan siapa pun setelah
minggu pertama.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 2026-09-07

### [cli] Ditambahkan
- `acme push --dry-run` menampilkan apa yang akan dikirim
  tanpa benar-benar mengirimnya.

### [core] Diperbaiki
- Backoff percobaan ulang tidak lagi direset pada permintaan
  berhasil yang mengembalikan body kosong.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dua entri, dua audiens, sekali lihat untuk membedakannya. Alur kerja bergaya
&lt;a href=&quot;https://github.com/changesets/changesets/blob/main/docs/intro-to-using-changesets.md&quot;&gt;Changesets&lt;/a&gt;
membangun pelabelan ini langsung ke proses rilis: kontributor menulis catatan singkat, dengan
scope paket, di samping perubahannya, dan alat itu merakit changelog per paket dan lonjakan versi
dari catatan itu saat rilis, alih-alih mencoba merekonstruksi batas paket belakangan dari riwayat
commit yang sudah digabung.&lt;/p&gt;
&lt;h2&gt;Bagaimana versioning berkaitan dengan changelog monorepo?&lt;/h2&gt;
&lt;p&gt;Paket yang diversi secara independen butuh changelog sendiri karena punya nomor versi sendiri, dan
changelog bersama tidak bisa menyatakan &amp;quot;paket A naik dari 2.1 ke 2.2 sementara paket B tetap di
1.4&amp;quot; tanpa menjadi dua log dalam satu file. &lt;a href=&quot;https://changeloop.dev/blog/id/semantic-versioning-changelog/&quot;&gt;Semantic versioning dan changelog Anda&lt;/a&gt;
membahas bagaimana nomor versi seharusnya dipetakan ke kategori changelog; dalam monorepo,
pemetaan itu harus diterapkan per paket, karena breaking change di satu paket bukan breaking
change bagi paket saudara yang tidak bergantung padanya.&lt;/p&gt;
&lt;p&gt;Repo yang merilis satu produk sebagai satu unit yang di-deploy, meski dibangun dari banyak paket
internal, tidak punya masalah ini: paket-paket berbagi versi karena selalu dirilis bersama, dan
satu changelog sudah tepat.&lt;/p&gt;
&lt;h2&gt;Bagaimana tag git cocok dalam monorepo?&lt;/h2&gt;
&lt;p&gt;Aturan yang sama dari &lt;a href=&quot;https://changeloop.dev/blog/id/git-tags-releases-changelog/&quot;&gt;tag git, rilis, dan changelog Anda&lt;/a&gt;
berlaku, diterapkan per paket: paket dengan versi sendiri butuh prefiks tag sendiri, biasanya
&lt;code&gt;nama-paket@1.4.0&lt;/code&gt; alih-alih &lt;code&gt;v1.4.0&lt;/code&gt; polos yang tidak bisa menyebutkan paket mana yang
dimilikinya. Monorepo yang hanya diberi tag dengan nomor versi polos tidak bisa menjawab
belakangan &amp;quot;apa yang ada di &lt;code&gt;core&lt;/code&gt; saat &lt;code&gt;cli&lt;/code&gt; merilis 2.2&amp;quot;, karena tidak ada yang tercatat di
disk tentang paket mana yang sebenarnya dimiliki tag itu.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apakah saya butuh changelog terpisah untuk setiap paket dalam monorepo?&lt;/strong&gt;
Hanya untuk paket dengan audiens independen, biasanya apa pun yang dipublikasikan di registri.
Paket dengan satu konsumen internal yang sudah hidup di repo yang sama bisa masuk ke log konsumen
itu alih-alih memelihara log sendiri.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa yang melabeli entri changelog dengan paket yang benar?&lt;/strong&gt;
Orang yang menulis entri itu, pada saat menulisnya, bukan pemindaian otomatis jalur file yang
berubah. Perubahan pada pustaka bersama bisa menghasilkan entri berbeda di setiap paket yang
bergantung padanya, dan hanya manusia yang bisa memutuskan apa yang sebenarnya harus dikatakan
setiap entri hilir itu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah monorepo memakai satu nomor versi untuk semuanya?&lt;/strong&gt;
Hanya jika setiap paket selalu dirilis bersama yang lain. Jika paket pernah dipublikasikan secara
independen, mereka butuh versi independen, dan versi independen butuh changelog independen agar
masuk akal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah alat changelog monorepo menggantikan langkah penyuntingan manusia?&lt;/strong&gt;
Tidak. Alat seperti Changesets mengotomatiskan pengumpulan dan perakitan catatan per paket saat
rilis; catatan itu sendiri, ditulis dalam bahasa pembaca alih-alih bahasa kontributor, tetap
menjadi kerja seseorang, sama seperti pipeline changelog lainnya.&lt;/p&gt;
</content:encoded></item><item><title>Cara mengumumkan fitur baru (tanpa keheningan)</title><link>https://changeloop.dev/blog/id/new-feature-announcement/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/new-feature-announcement/</guid><description>Kebanyakan pengumuman fitur mati di kanal yang tak dibaca dua kali. Di mana mengumumkan, apa yang dikatakan lebih dulu, dan siapa yang harus dijangkau.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kebanyakan pengumuman fitur mati di kanal yang tak dibaca dua kali siapa pun: tweet yang lewat
tergulir, email hari rilis yang terkubur di bawah dua belas lainnya yang diterima pelanggan
minggu itu, pesan Slack di kanal yang dibisukan setengah tim berbulan-bulan lalu. Fiturnya sudah
dirilis. Hampir tak ada yang akan memakainya yang tahu. Memperbaiki itu lebih berkaitan dengan
memilih kanal yang tepat untuk pembaca yang tepat daripada menulis pengumuman yang lebih baik,
dan menjangkau langsung orang yang secara eksplisit memintanya alih-alih mengandalkan mereka
menyadari pesan umum.&lt;/p&gt;
&lt;h2&gt;Di mana sebenarnya fitur baru harus diumumkan?&lt;/h2&gt;
&lt;p&gt;Di lebih dari satu tempat, karena &amp;quot;semua orang membaca kanal yang sama&amp;quot; tak pernah benar. Entri
changelog atau feed melayani pembaca yang mengecek sesuai jadwalnya sendiri dan menginginkan
catatan permanen dan bertanggal. Notifikasi dalam aplikasi melayani pembaca yang sudah memakai
produk dan akan memakai fitur itu hari ini jika tahu keberadaannya. Email melayani pembaca yang
saat ini tak berada di produk tapi akan kembali untuk update yang tepat. Media sosial melayani
jangkauan di luar pengguna yang ada, dengan hampir tanpa penargetan.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kanal&lt;/th&gt;
&lt;th&gt;Terbaik untuk&lt;/th&gt;
&lt;th&gt;Kelemahan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Changelog / feed&lt;/td&gt;
&lt;td&gt;Catatan permanen; pembaca yang mengecek sesuai jadwal sendiri&lt;/td&gt;
&lt;td&gt;Pasif; tak berguna bagi yang tak pernah mengecek&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notifikasi dalam aplikasi&lt;/td&gt;
&lt;td&gt;Pengguna yang sudah ada dan akan bertindak hari ini&lt;/td&gt;
&lt;td&gt;Tak menjangkau siapa pun yang saat ini tak masuk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;Pengguna tak aktif yang akan kembali untuk ini&lt;/td&gt;
&lt;td&gt;Mudah terkubur di bawah surel lain; butuh subjek yang sungguhan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Media sosial&lt;/td&gt;
&lt;td&gt;Jangkauan di luar pengguna yang ada&lt;/td&gt;
&lt;td&gt;Hampir tanpa penargetan; umur pendek&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Tak satu pun dari keempatnya cukup sendirian. &lt;a href=&quot;https://changeloop.dev/blog/id/what-is-a-changelog/&quot;&gt;Changelog&lt;/a&gt; adalah satu-satunya dokumen yang
seharusnya membawa setiap rilis apa pun ukurannya, karena itu catatan yang menjadi rujukan
balik semua yang lain; tiga lainnya adalah amplifikasi yang ditambahkan di atasnya, dipilih
sesuai seberapa besar fitur itu sebenarnya.&lt;/p&gt;
&lt;h2&gt;Apa yang harus dikatakan pengumuman lebih dulu?&lt;/h2&gt;
&lt;p&gt;Hasilnya, bukan mekanismenya. &amp;quot;Kami menambahkan lapisan cache ke endpoint laporan&amp;quot;
menggambarkan apa yang dibangun tim. &amp;quot;Laporan sekarang dimuat dalam kurang dari satu detik&amp;quot;
menggambarkan apa yang berubah bagi pembaca, dan itulah kalimat yang mendapatkan klik, karena
menjawab &amp;quot;apa untungnya bagi saya&amp;quot; di klausa pertama alih-alih ketiga. Mekanismenya milik entri
changelog atau halaman detail, bukan judul.&lt;/p&gt;
&lt;p&gt;Hal konkret sebelum kata sifat. &amp;quot;Pengalaman laporan yang lebih cepat dan lebih kuat&amp;quot; tak
memberitahu pembaca apa pun yang bisa ditindaklanjuti; &amp;quot;laporan sekarang dimuat dalam kurang dari
satu detik dan bisa difilter berdasarkan status&amp;quot; memberitahu persis apa yang berubah dan apa yang
harus dicoba. Versi kedua juga terasa lebih kredibel, karena klaim yang samar terdengar persis
seperti bunyi teks pemasaran ketika tak ada yang konkret untuk dikatakan.&lt;/p&gt;
&lt;h2&gt;Apa bedanya dengan email update produk?&lt;/h2&gt;
&lt;p&gt;Tumpang tindih tapi tak identik. &lt;a href=&quot;https://changeloop.dev/blog/id/product-update-email/&quot;&gt;Email update produk&lt;/a&gt; membahas
kanal email secara spesifik, termasuk kadensi, subjek, dan kapan digest mengalahkan kiriman
tunggal. Pengumuman fitur baru adalah peristiwa yang mendasarinya; email adalah salah satu dari
empat kanal di atas yang bisa membawanya, dipilih ketika fitur cukup besar untuk membenarkan
kiriman khusus alih-alih ikut naik di digest berikutnya. Fitur kecil pantas mendapat entri
changelog dan mungkin notifikasi dalam aplikasi. Yang signifikan pantas mendapat keempat kanal,
diselaraskan waktunya.&lt;/p&gt;
&lt;h2&gt;Bagaimana menjangkau orang spesifik yang memintanya?&lt;/h2&gt;
&lt;p&gt;Ini pengumuman dengan imbal hasil terbaik, dan hampir semua tim melewatkannya. Jika sepuluh
pelanggan meminta fitur dengan nama, sepuluh orang itu pantas mendapat catatan langsung dan
personal saat dirilis, terlepas dari pengumuman lebih luas apa pun yang keluar. &lt;a href=&quot;https://changeloop.dev/blog/id/customer-feedback-loop/&quot;&gt;Menutup lingkaran umpan balik dengan pelanggan&lt;/a&gt;
membahas mekanismenya secara lengkap; ringkasannya di sini adalah ini hanya berfungsi jika
permintaan asli tetap terhubung dengan yang memintanya, yang lebih merupakan &lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-tracking/&quot;&gt;masalah pelacakan&lt;/a&gt;
daripada masalah pengumuman. Di changeloop, ketika masukan widget menjadi issue GitHub dan
pull request yang di-merge menutupnya (&lt;code&gt;fixes #142&lt;/code&gt;), menyetujui entri changelog memposting komentar
&amp;quot;Shipped — &lt;title&gt;&amp;quot; di issue itu, satu kali, yang tertaut kembali ke entri yang aktif, dan orang yang
mengirim masukan melihat entri yang dirilis di widget. Tidak ada yang perlu ingat untuk memberi tahu
mereka. Issue yang dibuat manual, serta repositori GitLab atau Bitbucket, tidak mendapat komentar itu.&lt;/p&gt;
&lt;h2&gt;Bagaimana menulis entri itu sendiri?&lt;/h2&gt;
&lt;p&gt;Disiplin yang sama seperti entri catatan rilis lainnya: mulai dengan apa yang bisa dilakukan
pembaca sekarang, lanjutkan dengan pengaturan yang diperlukan, lewati justifikasi internal.
&lt;a href=&quot;https://changeloop.dev/blog/id/how-to-write-release-notes/&quot;&gt;Cara menulis catatan rilis&lt;/a&gt; membahas metode lengkapnya;
pengumuman fitur baru adalah kasus dengan taruhan tertinggi, karena itu entri yang paling
mungkin ditangkap layar, diteruskan, dan dibaca seseorang yang belum pernah melihat changelog
produk.&lt;/p&gt;
&lt;h2&gt;Kapan sebaiknya tak mengumumkan secara luas?&lt;/h2&gt;
&lt;p&gt;Ketika fitur masih diluncurkan ke sebagian akun, benar-benar beta, atau berharga atau
terkunci sedemikian rupa sehingga sembilan dari sepuluh pembaca pengumuman luas belum bisa
memakainya. Pengumuman luas untuk fitur yang tak bisa dipakai sembilan dari sepuluh pembaca
terbaca seperti umpan, dan membakar kepercayaan pada pengumuman berikutnya lebih daripada
membangun antusiasme pada yang ini. Solusinya bukan keheningan, tapi cakupan: beri tahu akun
yang memenuhi syarat secara langsung, dan tahan kanal luas sampai ketersediaan menyusul
pengumuman.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apakah setiap fitur baru pantas mendapat pengumumannya sendiri?&lt;/strong&gt;
Setiap fitur pantas mendapat entri changelog. Hanya yang cukup signifikan untuk mengubah cara
seseorang memakai produk, atau yang diminta secara eksplisit dengan nama, yang pantas mendapat
kanal lebih luas seperti email atau media sosial.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa kanal terbaik untuk fitur kecil?&lt;/strong&gt;
Changelog saja, ditambah notifikasi dalam aplikasi jika fitur bisa ditemukan dalam alur yang
sudah dijalani pengguna. Email dan media sosial layak dipakai untuk fitur yang membenarkan
permintaan perhatian.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana mengumumkan fitur kepada orang yang secara spesifik memintanya?&lt;/strong&gt;
Jaga permintaan tetap terhubung dengan yang memintanya sejak saat dicatat, lalu beri tahu
secara individu saat dirilis, terpisah dari pengumuman lebih luas apa pun. Label status
bersama yang bisa dicek sendiri oleh yang meminta juga mengurangi berapa banyak pesan individu
yang dibutuhkan sejak awal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah pengumuman fitur butuh tangkapan layar?&lt;/strong&gt;
Untuk apa pun yang visual, ya; fitur yang dijelaskan tapi tak terlihat jauh lebih sering
dilewatkan daripada yang pembaca bisa lihat pratinjaunya. Untuk API atau kapabilitas backend,
contoh kode singkat melakukan pekerjaan yang sama seperti tangkapan layar untuk perubahan UI.&lt;/p&gt;
</content:encoded></item><item><title>Memprioritaskan permintaan fitur yang menumpuk</title><link>https://changeloop.dev/blog/id/prioritizing-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/prioritizing-feature-requests/</guid><description>Backlog yang terlacak masih menyisakan pertanyaan sulit: permintaan mana yang jalan dulu. Kerangka yang berguna, dan di mana masing-masing gagal.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Melacak permintaan fitur menyelesaikan soal di mana mereka hidup. Itu tidak menyelesaikan mana
yang jalan lebih dulu, dan pertanyaan kedua itulah yang benar-benar membuat tim tersendat. Backlog
tiga ratus permintaan, yang sudah dikelompokkan dan dilabeli, tetap butuh aturan keputusan, karena
&amp;quot;bangun yang paling banyak diminta&amp;quot; hanya berhasil sampai dua permintaan berdekatan dan yang
ketiga punya pendukung yang paling ribut, yang terjadi hampir setiap minggu. Kerangka di bawah ini
bukan jawaban yang saling bersaing untuk pertanyaan yang sama. Masing-masing cocok untuk jenis
permintaan berbeda, dan memakai satu saja untuk semuanya biasanya adalah kesalahan sebenarnya.&lt;/p&gt;
&lt;h2&gt;Apa yang membuat memprioritaskan permintaan fitur berbeda dari memprioritaskan roadmap?&lt;/h2&gt;
&lt;p&gt;Keputusan roadmap dimulai dari strategi dan bertanya apa yang harus dibangun. Keputusan permintaan
fitur dimulai dari permintaan yang sudah ada dan bertanya apakah perlu ditindaklanjuti, dan
keduanya cukup sering menarik ke arah berbeda sehingga sebuah permintaan bisa punya permintaan
tinggi dan tetap salah untuk dibangun, atau punya permintaan rendah dan tetap layak karena membuka
akun strategis. Memperlakukan setiap permintaan sebagai suara roadmap melewatkan pemeriksaan itu.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kerangka&lt;/th&gt;
&lt;th&gt;Yang ditimbang&lt;/th&gt;
&lt;th&gt;Di mana gagal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Hitungan permintaan mentah&lt;/td&gt;
&lt;td&gt;Berapa banyak yang meminta&lt;/td&gt;
&lt;td&gt;Menghargai nama yang mudah diingat, bukan permintaan nyata&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RICE&lt;/td&gt;
&lt;td&gt;Jangkauan, dampak, keyakinan, upaya&lt;/td&gt;
&lt;td&gt;Butuh estimasi yang tidak dimiliki siapa pun untuk permintaan baru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ditimbang pendapatan&lt;/td&gt;
&lt;td&gt;Siapa yang meminta, menurut nilai akun&lt;/td&gt;
&lt;td&gt;Mengabaikan permintaan dari akun yang belum bernilai besar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Suara publik&lt;/td&gt;
&lt;td&gt;Sinyal terlihat, upaya rendah&lt;/td&gt;
&lt;td&gt;Hanya menjangkau pengguna yang sudah tahu ke mana harus melihat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apa itu RICE, dan apakah berhasil untuk permintaan fitur?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.intercom.com/blog/rice-simple-prioritization-for-product-managers/&quot;&gt;RICE&lt;/a&gt; menilai
sebuah ide berdasarkan jangkauan, dampak, keyakinan, dan upaya, lalu membagi tiga yang pertama
dengan yang keempat untuk mendapatkan angka yang bisa dibandingkan. Ini dibuat untuk ide roadmap
yang sudah dipercaya tim, di mana bagian sulitnya adalah membandingkan taruhan yang berbeda satu
sama lain. Permintaan fitur sudah datang dengan angka jangkauan, hitungan orang yang meminta, yang
lebih konkret daripada jangkauan yang biasanya dimiliki ide roadmap yang baru. Di mana RICE
menjadi tegang dengan sebuah permintaan adalah keyakinan dan dampak: tim bisa yakin sebuah
permintaan itu nyata dan tetap tidak punya dasar seberapa besar itu akan menggerakkan metrik,
karena &amp;quot;dampak&amp;quot; untuk permintaan yang sudah punya nama dan jejak pengguna nyata adalah jenis
estimasi yang berbeda dari dampak untuk ide yang belum pernah dilihat siapa pun di luar ruangan.&lt;/p&gt;
&lt;p&gt;Gunakan RICE untuk permintaan yang benar-benar dipertimbangkan dan belum diputuskan. Jangan
terapkan pada setiap permintaan yang masuk; upaya penilaian hanya sepadan untuk yang cukup dekat
sehingga butuh pemecah seri.&lt;/p&gt;
&lt;h2&gt;Haruskah ditimbang berdasarkan pendapatan, atau berdasarkan siapa yang meminta?&lt;/h2&gt;
&lt;p&gt;Berdasarkan siapa yang meminta, tapi tidak hanya pendapatan. Akun yang mendekati perpanjangan,
akun yang sudah pernah eskalasi, dan akun yang permintaannya membuka kesepakatan yang sedang
berjalan membawa urgensi yang tidak ditangkap angka pendapatan datar saja, dan permintaan dari
pendaftaran uji coba tetap bisa penting jika itu memblokir keputusan yang segera menjadi
pendapatan. Penimbangan pendapatan adalah yang paling mudah dihitung dari semua ini, dan justru
karena itu paling mudah dipercaya berlebihan: ia dengan tepat menghilangkan bising dari akun
tanpa taruhan nyata, dan dengan mudah pula bisa menurunkan peringkat permintaan yang akan membawa
akun jauh lebih besar yang masih ada di pipeline.&lt;/p&gt;
&lt;h2&gt;Peran apa yang sebenarnya dimainkan suara?&lt;/h2&gt;
&lt;p&gt;Sinyal murah dan berkelanjutan untuk permintaan yang sudah ada, dan cara yang buruk untuk
menemukan permintaan mana yang seharusnya ada sejak awal. Hitungan suara hanya menjangkau
pengguna yang sudah menemukan permintaan itu dan menganggapnya layak diklik, yang berarti total
suara roadmap publik mencerminkan visibilitas sama besarnya dengan permintaan: permintaan lama di
dekat puncak daftar terus mengumpulkan suara sebagian karena mudah ditemukan, dan permintaan yang
lebih baru dan sama nyatanya mulai dari nol. Artikel &lt;a href=&quot;https://changeloop.dev/blog/id/public-roadmap/&quot;&gt;roadmap publik&lt;/a&gt;
berpendapat sebaiknya suara sama sekali tidak ditampilkan di roadmap. Perlakukan suara
sebagai sinyal yang perlu dikelompokkan dan ditimbang berdasarkan kebaruan, bukan sebagai
peringkat yang dibangun berurutan.
&lt;a href=&quot;https://changeloop.dev/blog/id/feedback-signal-quality/&quot;&gt;Tiket dukungan vs. permintaan fitur&lt;/a&gt; membahas titik buta lain
dalam jumlah suara: kesenjangan nyata bisa menghasilkan hampir tidak ada suara jika pengguna yang
mengalaminya tidak pernah menemukan papannya, sementara tetap muncul dengan ribut di dukungan.&lt;/p&gt;
&lt;h2&gt;Kapan pelanggan paling ribut menang, dan apakah itu masalah?&lt;/h2&gt;
&lt;p&gt;Kadang-kadang, dan itu masalah hanya kalau tidak ada yang menyadarinya. Pelanggan yang sering
eskalasi, menulis tiket rinci, atau punya jalur langsung ke seseorang di tim akan melihat
permintaannya diperiksa lebih cepat daripada pelanggan yang lebih pendiam dengan permintaan yang
sama validnya, dan proses prioritisasi yang tidak pernah memeriksanya akan secara sistematis
mengutamakan yang paling gigih, bukan yang punya kasus paling kuat. Pelanggan yang ribut bukan
masalah yang harus diperbaiki; permintaan mereka sering kali benar-benar penting. Perbaikannya
adalah kebiasaan: tinjau backlog berdasarkan sumber secara berkala dan periksa apakah segelintir
akun yang sama menjelaskan sebagian besar yang baru dirilis, dan tanyakan apakah itu sesuai dengan
di mana permintaan nyata sebenarnya berada.&lt;/p&gt;
&lt;h2&gt;Bagaimana keputusan prioritisasi berubah menjadi balasan?&lt;/h2&gt;
&lt;p&gt;Setiap keputusan di sini menghasilkan pemenang dan pecundang, dan keduanya pantas mendapat balasan
yang menyebutkan alasan sebenarnya, bukan sekadar perubahan status tanpa penjelasan.
&lt;a href=&quot;https://changeloop.dev/blog/id/declining-feature-requests/&quot;&gt;Cara menolak permintaan fitur&lt;/a&gt; membahas apa yang harus
dikatakan pada permintaan yang kalah, dengan cara yang menjaga hubungan tetap utuh alih-alih
terdengar seperti penolakan generik. Kerja pengelompokan dan pelabelan yang membuat semua ini
mungkin dibahas di &lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-tracking/&quot;&gt;melacak permintaan fitur&lt;/a&gt;; prioritisasi
hanya berhasil pada permintaan yang sudah tercatat dan dikelompokkan cukup baik untuk
dibandingkan.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apa kerangka terbaik untuk memprioritaskan permintaan fitur?&lt;/strong&gt;
Tidak ada yang berdiri sendiri. Gunakan hitungan mentah untuk menemukan sinyal paling ribut, RICE
untuk membandingkan daftar pendek kandidat serius, dan pemeriksaan pendapatan atau akun untuk
menangkap kasus di mana permintaan diam dari akun strategis lebih berat daripada kelompok yang
lebih ribut tapi kurang penting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah permintaan fitur diprioritaskan sama seperti ide roadmap?&lt;/strong&gt;
Tidak. Ide roadmap dimulai dari strategi; permintaan fitur dimulai dari permintaan yang sudah ada.
Menilai keduanya bersamaan membuat taruhan strategis yang beralasan baik tapi punya sedikit
permintaan yang ada terus-menerus kalah melawan permintaan yang sekadar punya lebih banyak orang
yang memintanya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah suara pada roadmap publik mencerminkan permintaan secara akurat?&lt;/strong&gt;
Hanya di antara orang yang sudah menemukan permintaan itu. Permintaan yang lebih lama dan lebih
terlihat mengumpulkan suara lebih cepat, terlepas dari seberapa besar permintaan nyata di balik
yang lebih baru, jadi perlakukan total suara sebagai sinyal, dikelompokkan dan ditimbang
berdasarkan kebaruan, bukan sebagai peringkat yang dibangun berurutan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Seberapa sering prioritas permintaan fitur harus dievaluasi ulang?&lt;/strong&gt;
Dalam siklus tetap, bukan hanya saat seseorang eskalasi. Peninjauan bulanan atau triwulanan yang
mengelompokkan ulang permintaan dan memeriksa ulang penimbangan menangkap pergeseran, seperti
segelintir akun yang mendominasi apa yang dirilis, yang tidak pernah muncul sendiri dari proses
yang murni reaktif.&lt;/p&gt;
</content:encoded></item><item><title>Release notes enterprise: apa yang berubah untuk satu akun</title><link>https://changeloop.dev/blog/id/private-release-notes-enterprise/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/private-release-notes-enterprise/</guid><description>Release notes enterprise untuk pelanggan di build privat harus sesuai instansnya. Salah menyesuaikan bisa membocorkan roadmap atau membingungkan support.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Produk SaaS publik mengirim release notes yang sama ke semua orang, karena semua orang berada di
versi yang sama. Pelanggan enterprise pada versi yang dipasang tetap, instans khusus, atau subset
produk dengan feature flag mematahkan asumsi itu: release notes yang menjelaskan apa yang berubah
untuknya tidak sama dengan yang ada di blog publik Anda, dan tetap mengirim yang publik akan
membingungkan pelanggan itu dengan perubahan yang belum dia miliki, atau, lebih buruk, memberi tahu
dia tentang fitur yang secara khusus diminta tim akun pelanggan enterprise lain untuk ditahan dari
milik mereka selama sebulan lagi. &lt;a href=&quot;https://changeloop.dev/blog/id/release-notes-best-practices/&quot;&gt;Praktik terbaik release notes&lt;/a&gt;
membahas kerajinan umumnya; ini tentang menulis release notes enterprise untuk masalah penyesuaian
yang muncul begitu Anda punya pelanggan yang tidak semuanya berada di build yang sama.&lt;/p&gt;
&lt;h2&gt;Mengapa pelanggan enterprise tidak bisa cukup membaca changelog publik?&lt;/h2&gt;
&lt;p&gt;Karena itu menjelaskan versi yang mungkin belum dia jalankan, fitur yang mungkin tidak dia akses,
dan jadwal yang tidak cocok dengan miliknya. Pelanggan yang terpaku pada siklus rilis kuartalan
yang membaca tentang fitur yang keluar untuk tingkat publik minggu lalu tidak punya cara untuk
tahu, hanya dari changelog publik, apakah fitur itu akan sampai padanya minggu depan atau kuartal
depan. Changelog publik menjawab &amp;quot;apa yang berubah di produk&amp;quot;; pertanyaan sebenarnya pelanggan
enterprise adalah &amp;quot;apa yang berubah di versi yang saya jalankan, dan kapan saya dapat sisanya&amp;quot;,
yang tidak pernah ditulis oleh changelog publik untuk dijawab.&lt;/p&gt;
&lt;h2&gt;Apa yang dibutuhkan release note privat yang tidak dibutuhkan yang publik?&lt;/h2&gt;
&lt;p&gt;Pengidentifikasi versi atau lingkungan yang bisa benar-benar diperiksa pelanggan, dan pernyataan
eksplisit tentang apa yang belum sampai padanya. &amp;quot;Rilis ini mencakup peningkatan ekspor massal dari
rilis publik 4.3 kami, tapi bukan model izin baru, yang akan datang di pembaruan terjadwal
berikutnya Anda&amp;quot; memberi tahu admin enterprise persis di mana posisi instansnya relatif terhadap
produk secara keseluruhan. Release note publik tidak pernah butuh kerangka ini karena hanya ada
satu instans untuk dijadikan acuan relatif; yang privat tidak berarti tanpa itu.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Release notes publik&lt;/th&gt;
&lt;th&gt;Release notes privat (enterprise)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Satu versi, satu audiens&lt;/td&gt;
&lt;td&gt;Banyak versi, audiens tersegmentasi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mengasumsikan pembaca punya setiap fitur yang dijelaskan&lt;/td&gt;
&lt;td&gt;Harus menyatakan apa yang dimiliki dan tidak dimiliki pembaca&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dijadwalkan sesuai rilis publik&lt;/td&gt;
&lt;td&gt;Dijadwalkan sesuai jendela pembaruan pelanggan sendiri&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bisa langsung dibuat sepenuhnya publik&lt;/td&gt;
&lt;td&gt;Mungkin perlu menahan item yang belum dimiliki pelanggan lain&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apakah pernah baik-baik saja untuk hanya menunda pengiriman release notes publik ke pelanggan enterprise alih-alih menulis yang terpisah?&lt;/h2&gt;
&lt;p&gt;Hanya jika versi mereka benar-benar cocok dengan yang publik pada saat itu, yang lebih jarang
daripada kedengarannya begitu Anda punya lebih dari beberapa akun enterprise dengan ritme berbeda.
Menunda catatan publik berfungsi sebagai solusi sementara untuk pelanggan yang tertinggal satu
versi dan hampir mengejar; itu runtuh pada saat dua pelanggan enterprise berada di versi berbeda
satu sama lain, karena saat itu tidak ada lagi satu &amp;quot;catatan&amp;quot; tunggal untuk ditunda, hanya matriks
apa yang dimiliki masing-masing. Pada titik itu, menyesuaikan catatan per akun, bahkan jika hanya
tampilan terfilter dari entri yang sama, berhenti menjadi opsional.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Catatan publik, dikirim ke akun enterprise yang belum
punya fiturnya:
&amp;quot;New: Bulk export now supports custom column ordering.&amp;quot;
(Membingungkan: adminnya mencoba dan fiturnya tidak ada.)

Catatan enterprise yang disesuaikan untuk akun yang sama:
&amp;quot;Available in your next update (scheduled for 2026-10-15):
bulk export with custom column ordering. Not yet available
on your current version (3.8).&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Siapa di dalam organisasi pelanggan yang benar-benar membacanya, dan apakah itu mengubah cara penulisan?&lt;/h2&gt;
&lt;p&gt;Biasanya admin TI atau kontak customer success alih-alih pengguna akhir, dan itu mengubah apa yang
dianggap berguna. Pengguna akhir ingin tahu apa yang terlihat berbeda di layarnya; admin enterprise
ingin tahu apa yang berubah dalam izin, penanganan data, konfigurasi SSO, atau apa pun yang
memengaruhi cara dia mengelola penerapan untuk penggunanya sendiri, karena dialah yang akan
menjawab pertanyaan internal. Release note privat yang terbaca seperti changelog konsumen, semua
tombol baru yang berkilau dan tanpa detail operasional, memaksa admin untuk menggali informasi
yang sebenarnya dia butuhkan.&lt;/p&gt;
&lt;h2&gt;Bagaimana ini berinteraksi dengan roadmap publik atau changelog publik yang sudah mencantumkan fitur yang sama?&lt;/h2&gt;
&lt;p&gt;Dengan hati-hati, karena pelanggan yang membaca keduanya akan memperhatikan ketidakkonsistenan
apa pun. Jika changelog publik Anda sudah mengumumkan fitur yang belum dimiliki akun enterprise
tertentu, release note privatnya perlu mengakui kesenjangan itu alih-alih berpura-pura entri
publiknya tidak ada; admin yang sudah melihat pengumuman publik dan mendapat catatan privat yang
mengabaikannya akan mengasumsikan bahwa Anda melupakannya, atau ada yang rusak. &lt;a href=&quot;https://changeloop.dev/blog/id/public-roadmap/&quot;&gt;Roadmap
publik&lt;/a&gt; membahas cara menjaga roadmap tetap jujur tentang apa yang
sudah dirilis versus direncanakan; versi enterprise dari kejujuran itu di release notes adalah
menyebutkan langsung kesenjangan antara apa yang publik dan apa yang menjadi miliknya.&lt;/p&gt;
&lt;h2&gt;Apakah perusahaan kecil dengan hanya satu atau dua pelanggan enterprise butuh struktur sebanyak ini?&lt;/h2&gt;
&lt;p&gt;Bukan sistem yang tersegmentasi penuh, tapi disiplin intinya, menyatakan dengan jelas versi apa
yang dijalankan pelanggan dan apa yang dimiliki dan tidak dimilikinya, penting pada skala berapa
pun begitu Anda punya bahkan satu pelanggan yang tidak berada di build terbaru Anda. Mode
kegagalan yang dicegah ini, admin yang bingung apakah pengumuman publik berlaku untuknya,
menghabiskan biaya satu tiket dukungan dan pukulan kepercayaan terlepas apakah Anda punya dua akun
enterprise atau dua ratus.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Haruskah release notes privat pernah menyebutkan fitur yang sudah dimiliki pelanggan lain tapi ini belum?&lt;/strong&gt;
Hanya jika relevan dengan jadwalnya sendiri, diungkapkan sebagai &amp;quot;akan datang di pembaruan
berikutnya Anda&amp;quot; alih-alih sebagai perbandingan dengan pelanggan lain. Menyebutkan apa yang
dimiliki pelanggan lain tertentu melintasi wilayah yang bukan hak Anda untuk diungkapkan;
menyebutkan apa yang akan datang khusus untuk pelanggan ini adalah persis informasi yang dia
butuhkan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bisakah entri changelog yang sama mendukung release notes publik dan privat sekaligus?&lt;/strong&gt;
Bisa, dan itu biasanya pendekatan yang lebih mudah dipelihara: beri label entri dengan versi atau
tingkatan mana yang berlaku, lalu filter per audiens saat penerbitan alih-alih menulis dua dokumen
yang sepenuhnya terpisah yang pasti akan menyimpang seiring waktu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana jika pelanggan enterprise secara eksplisit meminta berada di release notes publik alih-alih feed privat?&lt;/strong&gt;
Hormati, tapi konfirmasi dia paham bahwa catatan publik mengasumsikan versi publik, dan tandai
sendiri kesenjangannya secara tertulis jika versinya berbeda dari yang dijelaskan. Konfirmasi
tertulis itulah yang melindungi Anda nanti jika dia bertindak berdasarkan catatan publik yang
sebenarnya tidak berlaku untuk build-nya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Berapa jauh sebelumnya pelanggan enterprise harus diberi tahu tentang fitur yang akan diaksesnya di rilis berikutnya?&lt;/strong&gt;
Segera setelah tanggalnya dikonfirmasi, bukan hanya pada saat rilis, karena admin enterprise
sering perlu merencanakan komunikasi internal atau pelatihan mereka sendiri seputar fitur yang
akan datang, dan pemberitahuan di hari yang sama tidak memberi mereka ruang untuk itu.&lt;/p&gt;
</content:encoded></item><item><title>Semantic versioning dan changelog Anda</title><link>https://changeloop.dev/blog/id/semantic-versioning-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/semantic-versioning-changelog/</guid><description>Semantic versioning memberi tahu seberapa sakit sebuah rilis sebelum changelog dibaca. Apa yang dijanjikan tiap angka, dan tanggung jawab sebuah entri.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Semantic versioning memberi tahu pemanggil seberapa sakit sebuah rilis bisa dirasakannya sebelum
membaca satu entri changelog pun. Naik dari &lt;code&gt;2.4.1&lt;/code&gt; ke &lt;code&gt;2.5.0&lt;/code&gt; berarti: kapabilitas baru, tak ada
yang rusak. Naik dari &lt;code&gt;2.5.0&lt;/code&gt; ke &lt;code&gt;3.0.0&lt;/code&gt; berarti: baca entri ini sebelum update. Changelog dan
nomor versi seharusnya menyatakan hal yang sama dalam dua format, dan sebagian besar friksi
antara keduanya muncul justru saat keduanya tak sepakat, yang lebih sering terjadi dari yang
disarankan spesifikasinya.&lt;/p&gt;
&lt;h2&gt;Apa sebenarnya yang dijanjikan tiap angka dalam sebuah versi?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://semver.org/&quot;&gt;Semantic versioning&lt;/a&gt; mendefinisikan tiga angka, &lt;code&gt;MAJOR.MINOR.PATCH&lt;/code&gt;,
masing-masing dengan aturan ketat tentang apa yang memicunya. Lompatan MAJOR berarti perubahan
yang tak kompatibel: sesuatu yang bisa disadari integrasi yang benar dan sudah ada, dan karenanya
harus berubah. Lompatan MINOR berarti fungsionalitas baru yang kompatibel ke belakang: tak ada
yang lama rusak, sesuatu yang baru tersedia. Lompatan PATCH berarti perbaikan yang kompatibel ke
belakang: perilaku menjadi lebih dekat dengan yang didokumentasikan, dan siapa pun yang sengaja
bergantung pada perilaku lama seharusnya tak menyadari apa pun.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lompatan&lt;/th&gt;
&lt;th&gt;Arti&lt;/th&gt;
&lt;th&gt;Entri seharusnya terbaca seperti&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;MAJOR (&lt;code&gt;1.x.x&lt;/code&gt; -&amp;gt; &lt;code&gt;2.0.0&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Perubahan tak kompatibel&lt;/td&gt;
&lt;td&gt;&amp;quot;Perlu tindakan sebelum update&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MINOR (&lt;code&gt;1.2.x&lt;/code&gt; -&amp;gt; &lt;code&gt;1.3.0&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Kapabilitas baru yang kompatibel&lt;/td&gt;
&lt;td&gt;&amp;quot;Tersedia sekarang, tak ada lagi yang berubah&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PATCH (&lt;code&gt;1.2.3&lt;/code&gt; -&amp;gt; &lt;code&gt;1.2.4&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Perbaikan yang kompatibel&lt;/td&gt;
&lt;td&gt;&amp;quot;Sekarang berperilaku sesuai dokumentasi&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Tabel ini juga uji terbalik: jika sebuah entri tak terbaca seperti barisnya, entah nomor
versinya salah, atau entri itu terlalu kecil atau terlalu besar dalam menjual apa yang
sebenarnya terjadi.&lt;/p&gt;
&lt;h2&gt;Apa yang dihitung sebagai tak kompatibel untuk tujuan versioning?&lt;/h2&gt;
&lt;p&gt;Uji yang sama yang menentukan apakah sesuatu termasuk dalam changelog API: apakah pemanggil yang
benar, ditulis melawan perilaku lama dan tak tersentuh sejak itu, bisa berperilaku berbeda
karena perubahan ini. &lt;a href=&quot;https://changeloop.dev/blog/id/breaking-changes/&quot;&gt;Apa itu perubahan tak kompatibel, dan cara merilisnya&lt;/a&gt;
membahas keputusan itu secara lengkap, termasuk kasus yang terlihat tak kompatibel padahal
bukan, dan yang terlihat kecil padahal bukan. Singkatnya untuk tujuan versioning: jika
jawabannya ya, lompatannya MAJOR terlepas dari berapa banyak kode yang sebenarnya disentuh
perubahan itu secara internal. Nomor versi mengikuti konsekuensi bagi pemanggil, bukan usaha tim.&lt;/p&gt;
&lt;h2&gt;Bagaimana seharusnya entri changelog cocok dengan lompatan versi?&lt;/h2&gt;
&lt;p&gt;Satu entri, satu kategori lompatan, dinyatakan sejak awal. Pola dari tabel berlanjut langsung:
entri tak kompatibel berada di bawah versi yang memperkenalkannya, diformulasikan dulu sebagai
peringatan lalu sebagai deskripsi. Entri aditif berada di bawah versi MINOR-nya, diformulasikan
sebagai ketersediaan. Perbaikan berada di bawah versi PATCH-nya, diformulasikan sebagai koreksi.
Mencampur kategori dalam satu entri, seperti melipat perubahan tak kompatibel ke paragraf yang
sama dengan perbaikan yang tak berhubungan, adalah cara pembaca melewatkan justru satu hal yang
paling penting.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 3.0.0 (2026-09-07)

### Changed
- **BREAKING:** `GET /reports` sekarang mengembalikan jumlah sebagai
  integer dalam satuan mata uang terkecil (sen) alih-alih desimal.
  Perbarui kode yang membaca `amount` secara langsung.

## 2.9.0 (2026-09-01)

### Added
- Laporan sekarang bisa difilter berdasarkan `status`.

## 2.8.4 (2026-08-28)

### Fixed
- `GET /reports?status=` mengembalikan halaman kosong alih-alih 400
  untuk status yang tidak dikenal.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dibaca dari atas ke bawah, nomor versi dan label bagian mengatakan hal yang sama dua kali, dan
itulah tujuannya: pembaca yang hanya memindai judul mendapat pembacaan risiko yang benar
sebelum membuka satu baris pun.&lt;/p&gt;
&lt;h2&gt;Apakah aturan breaking change berlaku sama sebelum 1.0.0?&lt;/h2&gt;
&lt;p&gt;Tidak, dan di sinilah sebagian besar kebingungan tentang &amp;quot;apakah itu sungguh breaking&amp;quot; berasal.
SemVer eksplisit menyatakan versi mayor nol, &lt;code&gt;0.y.z&lt;/code&gt;, untuk pengembangan awal: apa pun bisa berubah
kapan saja, dan API publik tidak boleh dianggap stabil. Lompatan &lt;code&gt;0.4.0&lt;/code&gt; ke &lt;code&gt;0.5.0&lt;/code&gt; bisa membawa
breaking change tanpa melanggar spec, karena jaminan versi mayor baru berlaku begitu proyek
merilis &lt;code&gt;1.0.0&lt;/code&gt;. Entri changelog tetap berutang kejujuran yang sama tentang apa yang rusak; yang
berubah hanyalah nomor versi itu sendiri bukan sinyal yang bisa diandalkan sebelum 1.0.0 tiba.&lt;/p&gt;
&lt;h2&gt;Bagaimana jika produk Anda tak merilis versi diskrit?&lt;/h2&gt;
&lt;p&gt;Kebanyakan produk SaaS melakukan deploy berkelanjutan dan tak pernah menampilkan nomor versi ke
pemanggil, yang tak menghilangkan kebutuhan akan disiplin ini, hanya angka yang biasanya
membawanya. Entri changelog harus melakukan semua pekerjaan sendiri: menyatakan dengan jelas
apakah perubahan itu tak kompatibel, aditif, atau perbaikan, dengan tiga kata yang sama yang
dipakai semantic versioning, bahkan tanpa kolom versi untuk menempelkannya. Beberapa tim menjaga
versi yang murni internal hanya untuk menjangkarkan entri changelog ke sesuatu yang bisa ditautkan,
tanpa pernah menunjukkannya langsung ke pemanggil.&lt;/p&gt;
&lt;h2&gt;Bagaimana ini berlaku khusus untuk changelog API?&lt;/h2&gt;
&lt;p&gt;Lebih ketat daripada hampir di mana pun, karena pemanggil API adalah kode, bukan orang yang bisa
mengangkat bahu menghadapi perubahan tak terduga. &lt;a href=&quot;https://changeloop.dev/blog/id/api-changelog/&quot;&gt;Changelog API: apa yang dipublikasikan dan siapa yang membacanya&lt;/a&gt;
membahas bentuk lengkap dokumen itu; disiplin versioning di sini adalah yang menjaga kejujuran
bagian breaking dan aditifnya. API yang menawarkan beberapa versi sekaligus, seperti &lt;code&gt;v1&lt;/code&gt; dan
&lt;code&gt;v2&lt;/code&gt; disajikan bersamaan selama jendela migrasi, secara efektif menerapkan semantic versioning
pada skala seluruh antarmuka alih-alih satu paket, dan kosakata tiga kata yang sama masih
berlaku untuk setiap entri.&lt;/p&gt;
&lt;h2&gt;Apa yang dikatakan Keep a Changelog tentang versioning?&lt;/h2&gt;
&lt;p&gt;Ia terhubung langsung dengan nama ke semantic versioning dan merekomendasikan kosakata kategori
yang sama yang dipakai artikel ini: Added, Changed, Deprecated, Removed, Fixed, Security.
&lt;a href=&quot;https://changeloop.dev/blog/id/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog, dalam praktik&lt;/a&gt; membahas cara mengadopsi
spesifikasi itu, termasuk di mana tim biasanya menyimpang. Tumpang tindihnya bukan kebetulan:
kedua spesifikasi mencoba memecahkan masalah yang sama dari ujung yang berlawanan, satu
menstandarkan nomor versi dan yang lain entri yang menjelaskannya.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apakah setiap entri changelog butuh nomor versi?&lt;/strong&gt;
Jika produk merilis versi, ya, karena angka itu memungkinkan pembaca langsung melompat ke
&amp;quot;seberapa ini memengaruhi saya&amp;quot; tanpa membaca entrinya dulu. Jika produk deploy berkelanjutan
tanpa kolom versi, formulasi entri harus membawa sinyal itu sendiri.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa bedanya lompatan MAJOR dengan entri perubahan tak kompatibel?&lt;/strong&gt;
Keduanya seharusnya peristiwa yang sama dijelaskan dengan dua cara. Nomor versi adalah sinyal
yang bisa dibaca mesin (tooling pemanggil bisa bereaksi terhadapnya); entri changelog adalah
penjelasan yang bisa dibaca manusia tentang apa yang berubah secara konkret.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bisakah rilis PATCH bersifat tak kompatibel?&lt;/strong&gt;
Secara definisi seharusnya tidak. Jika ternyata tetap dirilis, jangan edit atau beri tag ulang
versi yang sudah dipublikasikan: &lt;a href=&quot;https://semver.org/#what-do-i-do-if-i-accidentally-release-a-backward-incompatible-change-as-a-minor-version&quot;&gt;SemVer FAQ&lt;/a&gt;
menyarankan merilis versi baru yang memulihkan kompatibilitas, atau MAJOR baru jika kerusakannya
tetap ada, dan mendokumentasikan versi bermasalah itu agar pengguna tahu harus melewatinya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah perubahan yang murni internal butuh lompatan versi?&lt;/strong&gt;
Tidak. Semantic versioning mengikuti antarmuka publik. Refactor tanpa efek yang bisa diamati bagi
pemanggil tak butuh lompatan atau entri changelog, meskipun secara internal itu pekerjaan
engineering yang signifikan.&lt;/p&gt;
</content:encoded></item><item><title>Changelog webhook: breaking change yang tak diminta</title><link>https://changeloop.dev/blog/id/webhook-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/webhook-changelog/</guid><description>Perubahan payload webhook rusak diam-diam, karena tak ada pemanggil yang bisa menolaknya. Apa yang membuat payload breaking, serta cara memberi versi.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Changelog API REST ada karena pemanggil bisa memilih menolak response yang tidak dia mengerti,
atau setidaknya mencatat error cukup keras hingga seseorang menyadarinya. Penerima webhook jarang
melakukan salah satu dari itu. Dia menerima POST, membaca field yang diharapkan, dan jika sebuah
field pindah, berubah tipe, atau hilang, endpoint itu diam-diam crash di dalam job latar belakang
yang tidak diawasi siapa pun atau, lebih buruk, terus berjalan dengan nilai salah yang tidak
pernah divalidasinya. &lt;a href=&quot;https://changeloop.dev/blog/id/breaking-changes/&quot;&gt;Apa itu breaking change&lt;/a&gt; membahas definisi
umum; payload webhook butuh jawabannya sendiri, karena mode kegagalannya berbeda dari endpoint
yang sengaja dipanggil seseorang.&lt;/p&gt;
&lt;h2&gt;Mengapa perubahan payload webhook rusak berbeda dari perubahan response API?&lt;/h2&gt;
&lt;p&gt;Karena arah requestnya terbalik. Pemanggil REST memulai panggilan dan bisa menambahkan header
versi, mencoba lagi saat 4xx, atau membaca pemberitahuan deprecation di response. Penerima
webhook tidak memulai satu pun dari itu: server Anda yang memutuskan mengirim, memutuskan kapan,
dan memutuskan bentuk apa yang akan dimiliki body itu. Satu-satunya pengungkit penerima adalah
validasi yang ditulisnya saat integrasi dibangun, dan sebagian besar integrasi dibangun sekali,
berfungsi, dan tidak pernah ditinjau ulang sampai rusak. Asimetri itulah seluruh alasan mengapa
perubahan payload webhook layak mendapat lebih banyak kehati-hatian daripada perubahan yang sama
pada body response yang secara aktif diminta pemanggil.&lt;/p&gt;
&lt;h2&gt;Apa yang sebenarnya dihitung sebagai breaking change dalam payload webhook?&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Perubahan&lt;/th&gt;
&lt;th&gt;Breaking bagi kebanyakan penerima&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Menambah field baru&lt;/td&gt;
&lt;td&gt;Tidak, jika penerima mengabaikan field yang tidak dikenal (verifikasi asumsi ini, jangan anggap begitu saja)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menghapus field&lt;/td&gt;
&lt;td&gt;Ya, jika ada yang membacanya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mengganti nama field&lt;/td&gt;
&lt;td&gt;Ya, secara fungsional identik dengan menghapus yang lama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mengubah tipe field (string ke object)&lt;/td&gt;
&lt;td&gt;Ya, hampir selalu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menyusun ulang field dalam body JSON&lt;/td&gt;
&lt;td&gt;Tidak, untuk penerima mana pun yang mengurai berdasarkan key, yang seharusnya semua&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mengubah nama atau tipe event&lt;/td&gt;
&lt;td&gt;Ya, jika penerima memfilter atau merutekan berdasarkan itu&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Baris &amp;quot;menambah field itu aman&amp;quot; adalah yang paling diandalkan tim dan yang paling layak
diverifikasi, bukan diasumsikan. Parser JSON yang permisif mengabaikan field tidak dikenal secara
default, tapi penerima yang deserialize ke skema ketat, beberapa bahasa bertipe melakukan ini
tanpa konfigurasi tambahan, bisa menolak seluruh payload begitu field yang tak terduga muncul.
Menambah field aman untuk webhook Anda hanya jika Anda tahu bagaimana penerima mengurai, bukan
karena JSON sendiri permisif.&lt;/p&gt;
&lt;h2&gt;Bagaimana cara memberi versi pada payload webhook?&lt;/h2&gt;
&lt;p&gt;Mirip dengan response API, dengan satu perbedaan: penerima tidak pernah mengirim request, jadi
tidak bisa meminta versi, dan pengirimlah yang harus menyatakannya. Versi itu bisa ada di body atau
di header request pada pengiriman itu sendiri; &lt;a href=&quot;https://docs.github.com/en/webhooks/webhook-events-and-payloads&quot;&gt;pengiriman GitHub&lt;/a&gt;
membawa &lt;code&gt;X-GitHub-Event&lt;/code&gt; dan &lt;code&gt;X-GitHub-Hook-ID&lt;/code&gt;, dan
&lt;a href=&quot;https://github.com/standard-webhooks/standard-webhooks/blob/main/spec/standard-webhooks.md&quot;&gt;spesifikasi Standard Webhooks&lt;/a&gt;
menaruh metadatanya di header &lt;code&gt;webhook-*&lt;/code&gt;. Field
versi dalam payload (&lt;code&gt;&amp;quot;payload_version&amp;quot;: 2&lt;/code&gt;) adalah opsi termurah dan berfungsi ketika penerima
bersedia bercabang berdasarkan itu. Tipe event bervers (&lt;code&gt;invoice.updated&lt;/code&gt; menjadi
&lt;code&gt;invoice.updated.v2&lt;/code&gt; sebagai event terpisah yang diikuti sukarela oleh penerima) butuh lebih
banyak kerja untuk dibangun tapi berarti bentuk lama terus mengalir ke siapa pun yang tidak pernah
migrasi, yang lebih penting di sini daripada di endpoint REST karena Anda tidak bisa menelepon
setiap penerima untuk memintanya update. Pengaturan per langganan, dipilih saat pendaftaran
endpoint webhook, memajukan keputusan alih-alih bercabang di setiap pengiriman, dan merupakan
pilihan tepat saat Anda sudah punya catatan langganan untuk melampirkannya.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST /endpoint-penerima
{
  &amp;quot;event&amp;quot;: &amp;quot;invoice.updated&amp;quot;,
  &amp;quot;payload_version&amp;quot;: 2,
  &amp;quot;data&amp;quot;: { &amp;quot;invoice_id&amp;quot;: &amp;quot;inv_123&amp;quot;, &amp;quot;status&amp;quot;: &amp;quot;paid&amp;quot; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Bagaimana Anda bahkan tahu siapa yang mendengarkan?&lt;/h2&gt;
&lt;p&gt;Lebih buruk dari versi setara masalah ini dalam changelog API, karena webhook tidak punya log
request masuk di sisi Anda yang menyebutkan pemanggil; Anda hanya punya log pengiriman keluar
Anda sendiri, yang memberi tahu bahwa endpoint menerima 200, bukan apa yang dilakukannya dengan
body itu. Lacak setidaknya dua hal: setiap endpoint terdaftar dengan pemiliknya, disiplin yang
sama yang direkomendasikan &lt;a href=&quot;https://changeloop.dev/blog/id/internal-api-changelog/&quot;&gt;changelog API internal&lt;/a&gt; untuk
konsumen internal, dan tingkat kegagalan pengiriman per endpoint Anda setelah perubahan payload.
Lonjakan response 4xx atau 5xx dari sebuah endpoint tepat setelah perubahan adalah hal terdekat
dengan stack trace yang akan Anda dapatkan, dan sering kali itu satu-satunya sinyal bahwa
penerima rusak, karena tim yang mengoperasikannya mungkin tidak menyadarinya selama berhari-hari.&lt;/p&gt;
&lt;h2&gt;Haruskah changelog webhook terpisah dari changelog API?&lt;/h2&gt;
&lt;p&gt;Bagian terpisah di halaman yang sama, bukan publikasi terpisah.
&lt;a href=&quot;https://changeloop.dev/blog/id/api-changelog/&quot;&gt;Changelog API&lt;/a&gt; sudah menetapkan siapa yang membacanya dan bagaimana
berlangganan; perubahan payload webhook termasuk dalam feed yang sama, dilabeli cukup jelas
sehingga developer di sisi penerima yang memindai &amp;quot;apakah ini memengaruhi integrasi saya&amp;quot; bisa
menyaringnya, karena konsumen webhook sering tidak punya alasan lain untuk memeriksa changelog
API umum dan hanya akan menemukannya jika seseorang mengarahkannya langsung ke sana.&lt;/p&gt;
&lt;h2&gt;Seperti apa jendela deprecation yang wajar untuk payload webhook?&lt;/h2&gt;
&lt;p&gt;Lebih panjang dari deprecation REST yang setara, karena migrasi di sisi penerima biasanya berarti
tim kedua, yang mungkin tidak Anda hubungi langsung, harus menyadarinya, menjadwalkannya, dan
merilisnya tanpa urgensi sendiri. Satu bulan adalah batas bawah yang wajar untuk field yang
mungkin masih diurai penerima dengan library yang permisif; tiga bulan atau lebih lebih aman
untuk penghapusan field yang akan ditolak sepenuhnya oleh skema ketat. Kirim bentuk lama dan baru
bersamaan selama jendela ketika memungkinkan (field lama &lt;code&gt;status&lt;/code&gt; dan penggantinya di versi 2
dalam payload yang sama), karena penerima yang membaca field lama terus berfungsi
tanpa menyentuh kodenya, dan yang sudah migrasi cukup mengabaikan field yang tidak dibutuhkannya
lagi.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apakah konsumen webhook perlu mengonfirmasi perubahan payload sebelum dirilis?&lt;/strong&gt;
Tidak ada mekanisme konfirmasi secara default, dan justru karena itu jendela deprecation lebih
penting di sini daripada di API REST: tidak ada yang mengonfirmasi kesiapan, jadi jendelanya harus
cukup panjang agar sebagian besar penerima migrasi dengan jadwal mereka sendiri sebelum bentuk
lama menghilang.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah pernah aman menambah field yang tidak dikenal tanpa pemberitahuan?&lt;/strong&gt;
Hanya setelah Anda memverifikasi, bukan mengasumsikan, bahwa penerima Anda mengurai secara
permisif. Entri changelog murah dan menghilangkan tebak-tebakan; menambah field diam-diam dengan
asumsi &amp;quot;parser JSON mengabaikan yang ekstra&amp;quot; merusak penerima mana pun dengan deserialisasi
ketat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa cara tercepat mendeteksi penerima webhook yang rusak setelah perubahan payload?&lt;/strong&gt;
Tingkat kegagalan pengiriman per endpoint, diamati dalam jam-jam segera setelah perubahan. Ini
tidak akan memberi tahu apa yang rusak, hanya bahwa sesuatu rusak, tapi itu sinyal paling awal dan
sering kali satu-satunya yang akan Anda dapatkan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah logika retry membantu penerima bertahan dari perubahan payload?&lt;/strong&gt;
Tidak. Retry mengirim ulang payload baru yang sama; ini tidak kembali ke bentuk yang bisa diurai
penerima. Perubahan payload merusak penerima pada pengiriman pertama dan setiap retry berikutnya
secara identik.&lt;/p&gt;
</content:encoded></item><item><title>Header sunset API, dan kapan mengirimkannya</title><link>https://changeloop.dev/blog/id/sunsetting-api-version/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/sunsetting-api-version/</guid><description>Header sunset API memberi tahu klien kapan versi berhenti merespons, beda dari notifikasi deprecation. Cakupan RFC 8594, dan manfaat brownout sebelumnya.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;Sunset&lt;/code&gt; adalah satu header respons tunggal, didefinisikan dalam &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc8594&quot;&gt;RFC 8594&lt;/a&gt;,
yang memberi tahu pemanggil kapan sebuah resource akan berhenti merespons.
&lt;a href=&quot;https://changeloop.dev/blog/id/api-deprecation/&quot;&gt;Deprecation API&lt;/a&gt; membahas seluruh linimasa
umumkan-ingatkan-brownout-pensiunkan beserta pemberitahuan yang menyertainya; ini tentang satu
sinyal yang bisa dibaca mesin dalam linimasa itu, apa sebenarnya yang dikatakannya, dan satu kasus
ketika RFC sendiri mengatakan untuk tidak mengirimkannya.&lt;/p&gt;
&lt;h2&gt;Apa yang dikatakan header Sunset, dan apa yang tidak dikatakannya?&lt;/h2&gt;
&lt;p&gt;Header ini membawa satu tanggal-HTTP, titik waktu ketika resource diperkirakan berhenti merespons:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Sunset: Sat, 31 Dec 2028 23:59:59 GMT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;RFC menyebutnya sebagai petunjuk, bukan jaminan: header ini tidak menjanjikan resource akan tetap
berfungsi persis sampai stempel waktu itu, dan tidak mengatakan apa pun tentang seperti apa
kegagalannya nanti. Pemanggil bisa mendapat 4xx, redirect, atau tidak ada respons sama sekali;
header tidak membedakannya. Stempel waktu yang sudah lewat berarti &amp;quot;sekarang, atau kapan saja&amp;quot;
alih-alih kesalahan pada nilainya. Tidak satu pun dari ini dipaksakan oleh protokol. Klien yang
tidak pernah membaca header ini berperilaku persis seperti biasanya, dan tetap mengetahui resource
sudah hilang dengan cara yang sama seperti yang akan terjadi tanpa header ini.&lt;/p&gt;
&lt;h2&gt;Kapan sebenarnya Anda harus mengirimkannya?&lt;/h2&gt;
&lt;p&gt;Hanya setelah resource benar-benar akan berhenti merespons, bukan ketika ia sekadar tidak lagi
jadi pilihan yang direkomendasikan. RFC secara eksplisit menyatakan deprecation terjadi dalam dua
tahap, dan field header Sunset hanya berlaku untuk tahap kedua: API tetap beroperasi penuh selama
tahap pertama, yaitu pengumuman bahwa suatu versi tidak lagi diutamakan, dan field header ini tidak
berlaku di sana. Ia berlaku begitu versi tersebut benar-benar dijadwalkan berhenti merespons.&lt;/p&gt;
&lt;p&gt;Itu berpadanan langsung dengan linimasa deprecation: header &lt;code&gt;Deprecation&lt;/code&gt; dikirim sejak hari
pertama, pada langkah pengumuman; &lt;code&gt;Sunset&lt;/code&gt; menjelaskan tanggal perilaku lama akan benar-benar
berhenti, yaitu tanggal yang sama yang disebut &lt;a href=&quot;https://changeloop.dev/blog/id/api-deprecation/&quot;&gt;linimasa empat langkah&lt;/a&gt;
sebagai pensiun. Mengirim &lt;code&gt;Sunset&lt;/code&gt; pada hari pertama tidak salah, karena tanggalnya sudah pasti
saat itu, tapi mengirimkannya tanpa juga mengumumkan deprecation, atau menetapkannya untuk versi
yang belum benar-benar Anda komit untuk dipensiunkan, memberi tahu pemanggil sesuatu yang belum
Anda putuskan.&lt;/p&gt;
&lt;h2&gt;Apakah ini berinteraksi dengan caching?&lt;/h2&gt;
&lt;p&gt;Tidak, dan RFC mengatakannya secara langsung: &lt;code&gt;Sunset&lt;/code&gt; dan HTTP caching menyelesaikan masalah yang
tidak berhubungan dan harus dibaca sebagai saling melengkapi, bukan tumpang tindih. Header caching
mengatakan kapan salinan cache aman digunakan ulang; &lt;code&gt;Sunset&lt;/code&gt; tidak mengatakan apa pun tentang
keadaan resource saat ini, hanya bahwa resource itu sendiri akan berhenti ada. Sebuah respons bisa
sepenuhnya bisa di-cache sampai persis saat ia sunset. Jangan gunakan salah satu untuk mendekati
yang lain, dan jangan asumsikan &lt;code&gt;max-age&lt;/code&gt; yang panjang meniadakan tanggal sunset yang mendekat,
atau sebaliknya.&lt;/p&gt;
&lt;h2&gt;Bisakah satu header men-sunset lebih dari satu endpoint?&lt;/h2&gt;
&lt;p&gt;Header ini berlaku untuk resource yang mengembalikannya, tapi RFC mengizinkan sebuah layanan
mendokumentasikan cakupan yang lebih luas: tanggal Sunset pada resource utama sebuah API bisa
didefinisikan berarti seluruh API akan hilang, bukan hanya satu URL itu. Jebakannya adalah ini
hanya berfungsi untuk pemanggil yang sudah tahu aturan cakupan Anda. Pemanggil yang membaca header
apa adanya hanya melihat sunset pada satu resource yang ia minta dan tidak ada yang lain, jadi
cakupan yang lebih luas harus dituliskan di suatu tempat yang bisa ditemukan pemanggil, bukan
tersirat.&lt;/p&gt;
&lt;h2&gt;Apa yang harus menyertai header ini?&lt;/h2&gt;
&lt;p&gt;Tautan ke tempat pensiun ini dijelaskan. RFC 8594 mendaftarkan relasi tautan &lt;code&gt;sunset&lt;/code&gt; miliknya
sendiri untuk keperluan ini: menunjuk ke resource yang menjelaskan kebijakan pensiun, tanggal yang
akan datang, atau cara bermigrasi, terpisah dari stempel waktu polos pada header.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP/1.1 200 OK
Sunset: Sat, 31 Dec 2028 23:59:59 GMT
Link: &amp;lt;https://example.com/docs/sunset-policy&amp;gt;; rel=&amp;quot;sunset&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mengarahkan tautan itu ke &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;contoh changelog&lt;/a&gt; Anda sendiri atau halaman
migrasi khusus mengubah header yang nyaris tidak diperiksa kode klien siapa pun menjadi sesuatu
yang langsung ditemukan manusia yang benar-benar mencarinya. Gabungkan dengan relasi
&lt;code&gt;successor-version&lt;/code&gt; dari &lt;a href=&quot;https://changeloop.dev/blog/id/api-deprecation/#which-headers-should-a-deprecated-endpoint-send&quot;&gt;header deprecation&lt;/a&gt;
dan pemanggil mendapat baik ke mana harus pergi maupun apa yang menggantikan ini, hanya dari
respons itu sendiri.&lt;/p&gt;
&lt;h2&gt;Seperti apa ini dari ujung ke ujung?&lt;/h2&gt;
&lt;p&gt;Misalkan &lt;code&gt;v1&lt;/code&gt; akan hilang pada 1 Maret 2027. Pengumuman deprecation pada hari pertama menambahkan
&lt;code&gt;Deprecation&lt;/code&gt; dan &lt;code&gt;Link: rel=&amp;quot;successor-version&amp;quot;&lt;/code&gt; ke setiap respons &lt;code&gt;v1&lt;/code&gt;, sesuai &lt;a href=&quot;https://changeloop.dev/blog/id/api-deprecation/&quot;&gt;header
deprecation&lt;/a&gt;, tapi menahan &lt;code&gt;Sunset&lt;/code&gt; sampai tanggal pensiun benar-benar
pasti, bukan sekadar placeholder. Begitu pasti, setiap respons &lt;code&gt;v1&lt;/code&gt; membawa:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP/1.1 200 OK
Deprecation: @1756425600
Sunset: Mon, 01 Mar 2027 00:00:00 GMT
Link: &amp;lt;https://api.example.com/v2/reports&amp;gt;; rel=&amp;quot;successor-version&amp;quot;
Link: &amp;lt;https://example.com/docs/sunset-policy&amp;gt;; rel=&amp;quot;sunset&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Gateway atau monitoring milik pemanggil bisa memicu peringatan pada salah satu header secara
independen: &lt;code&gt;Deprecation&lt;/code&gt; mengatakan versi yang lebih baru ada, &lt;code&gt;Sunset&lt;/code&gt; mengatakan yang ini punya
batas waktu. Tidak ada header yang wajib berubah sebelum 1 Maret; yang berubah adalah respons itu
sendiri, pada harinya, dan selama jendela brownout mana pun yang dijadwalkan sebelumnya.&lt;/p&gt;
&lt;h2&gt;Apakah brownout mengubah isi header?&lt;/h2&gt;
&lt;p&gt;Nilai header itu sendiri tidak perlu berubah untuk brownout yang dijadwalkan: tanggal sunset
tetaplah tanggal sunset, terlepas dari apakah resource sesekali gagal sebelum itu. Yang berubah
adalah respons, bukan headernya. Menjadwalkan jendela singkat &lt;code&gt;410 Gone&lt;/code&gt; di minggu-minggu sebelum
tanggal yang diumumkan, seperti dijelaskan &lt;a href=&quot;https://changeloop.dev/blog/id/api-deprecation/&quot;&gt;Deprecation API&lt;/a&gt;, adalah
yang mengubah kontak pertama pemanggil dengan kegagalan menjadi gladi bersih alih-alih kejadian
sungguhan pada hari tanggal header itu tiba.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apakah ada klien atau tool HTTP nyata yang benar-benar membaca header Sunset?&lt;/strong&gt;
Jarang, di sisi klien. Nilainya sebagian besar untuk siapa pun yang mengoperasikan infrastruktur
di antara Anda dan pemanggil: gateway API atau tool monitoring yang Anda konfigurasi untuk
memantau header ini bisa memperingatkan tim Anda sendiri, atau tim mitra, jauh sebelum kode
pemanggil menyadarinya. Perlakukan ini sebagai sinyal yang Anda bangun tooling-nya, bukan sesuatu
yang bisa Anda asumsikan sudah dimiliki pihak lain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah &lt;code&gt;Sunset&lt;/code&gt; sama dengan &lt;code&gt;Cache-Control: max-age&lt;/code&gt;?&lt;/strong&gt;
Tidak. &lt;code&gt;max-age&lt;/code&gt; mengatur berapa lama salinan cache tetap valid; &lt;code&gt;Sunset&lt;/code&gt; mengatur kapan resource
berhenti ada sama sekali. Sebuah respons bisa membawa &lt;code&gt;max-age&lt;/code&gt; yang pendek dan tanggal &lt;code&gt;Sunset&lt;/code&gt;
yang masih bertahun-tahun lagi, atau sebaliknya, dan tidak ada header yang membatasi yang lain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bisakah saya mengirim Sunset untuk satu field yang hilang, bukan seluruh endpoint?&lt;/strong&gt;
Tidak, header ini dicakup pada resource, artinya URL, bukan pada field di dalam isi responsnya.
Untuk field, parameter, atau nilai enum yang akan hilang sementara endpoint-nya sendiri tetap
aktif, gunakan header &lt;code&gt;Deprecation&lt;/code&gt; dan entri changelog sebagai gantinya;
&lt;a href=&quot;https://changeloop.dev/blog/id/api-deprecation/&quot;&gt;Deprecation API&lt;/a&gt; membahas cara mengumumkan perubahan semacam itu
persis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana jika tanggal sunset perlu digeser?&lt;/strong&gt;
Perbarui nilai headernya dan katakan itu di entri changelog yang pertama kali mengumumkannya;
mengubah tanggal yang sudah dipublikasikan secara diam-diam adalah cara pemanggil memutuskan
bahwa tidak satu pun tanggal Anda nyata. RFC membingkai nilai ini sebagai petunjuk justru karena
tanggal memang kadang bergeser, tapi tanggal yang digeser tanpa penjelasan membuat Anda kehilangan
kepercayaan untuk tanggal berikutnya juga.&lt;/p&gt;
</content:encoded></item><item><title>Apa itu changelog? Pengertian dan contohnya</title><link>https://changeloop.dev/blog/id/what-is-a-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/what-is-a-changelog/</guid><description>Changelog adalah catatan bertanggal tentang apa yang berubah pada sebuah produk. Contoh entri, bedanya dengan release notes, dan di mana sebaiknya ditaruh.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Changelog adalah catatan bertanggal tentang apa yang berubah dalam sebuah produk, ditulis untuk
orang-orang yang terdampak oleh perubahan itu, bukan untuk tim yang merilisnya. Setiap entri
menyebutkan satu perubahan, menyatakan kapan itu berlaku, dan menyatakan apa yang harus dilakukan
pembaca, yang pada kebanyakan entri adalah tidak ada apa-apa. Bagian terakhir itulah yang
membedakan changelog dari log commit: log commit adalah catatan untuk orang yang menulis kode,
changelog adalah catatan untuk orang yang memakainya.&lt;/p&gt;
&lt;h2&gt;Apa itu changelog, sebenarnya?&lt;/h2&gt;
&lt;p&gt;Daftar entri bertanggal, terbaru di atas, masing-masing menjelaskan satu perubahan dalam istilah
yang bisa diperiksa pembaca. Bukan apa yang dibangun tim, tapi apa yang sekarang berbeda.
&amp;quot;Merefaktor layanan billing&amp;quot; adalah pesan commit. &amp;quot;Faktur sekarang menampilkan pajak sebagai
baris terpisah&amp;quot; adalah entri changelog, karena memberi tahu pembaca sesuatu yang bisa mereka
periksa di akun mereka sendiri.&lt;/p&gt;
&lt;p&gt;Formatnya sudah lama ada dan sengaja dibuat sederhana: judul per rilis atau per hari, daftar
singkat di bawahnya, kadang label kategori. &lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt;
adalah spesifikasi yang paling banyak dikutip untuk bentuk ini, dan ada karena kebanyakan proyek
yang melewatkan spesifikasi berakhir dengan membuang riwayat commit sebagai gantinya, yang
menjawab pertanyaan berbeda dari yang dibawa pembaca.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dokumen&lt;/th&gt;
&lt;th&gt;Ditulis untuk&lt;/th&gt;
&lt;th&gt;Menjawab&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Changelog&lt;/td&gt;
&lt;td&gt;Siapa pun yang memakai produk&lt;/td&gt;
&lt;td&gt;Apa yang berubah, dan kapan?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Log commit&lt;/td&gt;
&lt;td&gt;Tim yang menulis kode&lt;/td&gt;
&lt;td&gt;Apa yang dikerjakan, dalam urutan apa?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Catatan rilis&lt;/td&gt;
&lt;td&gt;Pengguna yang memutuskan untuk update&lt;/td&gt;
&lt;td&gt;Apa yang bisa saya lakukan sekarang?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Catatan patch&lt;/td&gt;
&lt;td&gt;Pemain atau pengguna dari satu perbaikan tertentu&lt;/td&gt;
&lt;td&gt;Apa yang diperbaiki rilis ini?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Roadmap&lt;/td&gt;
&lt;td&gt;Siapa pun yang bertanya-tanya apa selanjutnya&lt;/td&gt;
&lt;td&gt;Apa yang direncanakan, dan sejauh mana?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Kelimanya tumpang tindih dalam praktiknya, tapi bukan dokumen yang sama, dan bedanya ada pada
siapa yang memegangnya saat membaca. Changelog adalah yang dibangun untuk dicari dan ditautkan
kembali nanti, sehingga entrinya lebih butuh tanggal dan URL stabil dibanding yang lain.&lt;/p&gt;
&lt;h2&gt;Apa sebenarnya isi entri changelog?&lt;/h2&gt;
&lt;p&gt;Empat hal, dalam urutan ini: apa yang berubah, dinyatakan dalam istilah yang akan disadari
pengguna atau pemanggil; kapan itu berlaku; termasuk kategori apa (added, fixed, changed, removed
adalah empat yang umum); dan, ketika penting, apa yang harus dilakukan pembaca. Tautan ke detail
lebih lanjut dipersilakan. Paragraf justifikasi internal tidak, karena pembaca tidak bertanya
mengapa, mereka bertanya apa.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 2026-09-07

### Added
- Faktur sekarang menampilkan pajak sebagai baris terpisah, dalam mata
  uang akun pelanggan.

### Fixed
- Mengekspor laporan sebagai CSV tidak lagi menghilangkan baris terakhir
  saat laporan melebihi 10.000 baris.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bentuk itu berskala dari update dua baris hingga seratus entri dalam satu rilis tanpa mengubah
struktur, dan itulah uji sebenarnya apakah sebuah format berfungsi: apakah terbaca sama pada
minggu yang sibuk maupun yang tenang.&lt;/p&gt;
&lt;h2&gt;Siapa yang menulis changelog, dan kapan?&lt;/h2&gt;
&lt;p&gt;Siapa pun yang membuat perubahan, pada saat dirilis, bukan penulis teknis yang merekonstruksinya
dari tiket seminggu kemudian. Yang menyentuh kode tahu apa yang benar-benar berubah bagi
pengguna; ringkasan yang ditulis belakangan cenderung menjelaskan tiketnya alih-alih apa yang
sebenarnya dirilis, dan itu biasanya lebih luas atau lebih sempit dari cakupan sebenarnya.
Beberapa tim menambahkan langkah review sebelum entri menjadi publik, terutama untuk menangkap
bahasa internal yang menyelip, dan review itu harus cukup cepat agar entri tetap rilis di hari
yang sama.&lt;/p&gt;
&lt;h2&gt;Di mana seharusnya changelog berada?&lt;/h2&gt;
&lt;p&gt;Di halaman sendiri, di URL yang stabil, disebarkan sebagai feed. Terkubur di menu pengaturan atau
tag rilis di host kode, hanya menjangkau orang yang sudah tahu ke mana harus mencari. Halaman
publik bisa ditautkan dari tiket dukungan, dikutip dalam ulasan, atau dilanggan. Feed sama
pentingnya dengan halamannya: pembaca yang mengecek changelog produk sebulan sekali itu jarang,
yang berlangganan tidak, dan hanya feed yang melayani kelompok kedua.&lt;/p&gt;
&lt;h2&gt;Apa bedanya dengan catatan rilis?&lt;/h2&gt;
&lt;p&gt;Keduanya terus-menerus tertukar, dan cukup berbeda sehingga mencampur keduanya menghasilkan
dokumen yang tidak melayani kedua pembaca dengan baik. &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-vs-release-notes/&quot;&gt;Changelog vs catatan rilis&lt;/a&gt;
membahas perbedaannya secara lengkap; singkatnya, changelog adalah catatan lengkap dan kronologis,
sementara catatan rilis adalah subset terkurasi, ditulis agar sebuah update terdengar layak untuk
dimiliki. Sebuah produk biasanya butuh keduanya, ditujukan untuk momen berbeda dalam hari
pembaca.&lt;/p&gt;
&lt;h2&gt;Apa yang membuat changelog layak dibaca?&lt;/h2&gt;
&lt;p&gt;Kekhususan dan kejujuran tentang cakupannya sendiri. &amp;quot;Berbagai perbaikan bug&amp;quot; adalah kalimat yang
mengajarkan pembaca untuk berhenti membuka halaman itu, karena tidak menjanjikan apa pun yang
bisa mereka periksa. Entri yang menyebutkan perilaku persis yang berubah, bahkan untuk perbaikan
kecil, adalah yang membuat langganan tetap hidup. Disiplin ini juga berlaku pada apa yang
dihilangkan: changelog yang hanya mengumumkan keberhasilan dan tidak pernah perbaikan untuk
sesuatu yang rusak terbaca seperti pemasaran yang menyamar sebagai changelog, dan pembaca
menyadarinya.&lt;/p&gt;
&lt;p&gt;Disiplin versioning juga penting. &lt;a href=&quot;https://changeloop.dev/blog/id/semantic-versioning-changelog/&quot;&gt;Semantic versioning dan changelog Anda&lt;/a&gt;
membahas bagaimana nomor versi dan entri seharusnya cocok, sehingga pembaca yang menelusuri
riwayat versi mendapat sinyal yang sama dua kali, bukan dua sinyal berbeda.&lt;/p&gt;
&lt;h2&gt;Bagaimana changelog dihasilkan?&lt;/h2&gt;
&lt;p&gt;Dengan dua cara, dan kebanyakan pengaturan nyata adalah campuran. Generasi otomatis membaca pesan
commit, biasanya dalam format &lt;a href=&quot;https://www.conventionalcommits.org/en/v1.0.0/&quot;&gt;Conventional Commits&lt;/a&gt;,
dan mengubahnya menjadi entri tanpa ada yang menyentuh hasilnya; &lt;a href=&quot;https://changeloop.dev/blog/id/conventional-commits-changelog/&quot;&gt;dari conventional commits ke changelog&lt;/a&gt;
membahas pipeline itu. Generasi terkurasi berarti seseorang menulis atau menyunting setiap entri
secara manual. Hasil otomatis lebih cepat dan tidak pernah melewatkan pull request yang digabung,
tapi mewarisi setiap pesan commit yang samar apa adanya, sehingga kebanyakan tim yang
mengotomatisasi tetap menyimpan langkah penyuntingan ringan sebelum publikasi alih-alih
menampilkan hasil mentah.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apakah setiap produk butuh changelog?&lt;/strong&gt;
Produk mana pun dengan pengguna yang terdampak oleh perubahan membutuhkannya, entah itu aplikasi
SaaS, alat internal, atau API publik. Bentuknya menyesuaikan (changelog API terbaca berbeda dari
aplikasi konsumen), kebutuhannya tidak.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa itu changelog dalam istilah software?&lt;/strong&gt;
Definisi yang sama seperti di atas: daftar bertanggal dan kronologis tentang apa yang berubah
dalam software, ditulis untuk yang memakainya, bukan yang membangunnya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bisakah changelog dihasilkan otomatis dari commit?&lt;/strong&gt;
Ya, dan banyak tim melakukan persis itu, biasanya dari pesan berformat Conventional Commits.
Kompromisnya, entri yang dihasilkan sejelas pesan commit asalnya, sehingga langkah review sebelum
publikasi menangkap yang perlu diformulasikan ulang.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah changelog sama dengan riwayat versi?&lt;/strong&gt;
Cukup mirip sehingga istilahnya dipakai bergantian. Riwayat versi kadang hanya daftar nomor versi
dan tanggal tanpa deskripsi; changelog selalu menyertakan apa yang berubah.&lt;/p&gt;
</content:encoded></item><item><title>Changelog API: apa yang dipublikasikan, siapa pembacanya</title><link>https://changeloop.dev/blog/id/api-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/api-changelog/</guid><description>Changelog API dibaca orang yang memutuskan apakah kodenya masih berfungsi bulan depan. Apa yang harus diberikan tiap entri, letaknya, dan cara langganan.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Changelog API adalah catatan bertanggal dari setiap perubahan yang mungkin diperhatikan oleh
pemanggil, ditulis untuk orang yang mengintegrasikan API tersebut, bukan untuk tim yang
merilisnya. Audiens ini membuatnya menjadi dokumen yang berbeda dari changelog produk: pembaca
sedang memutuskan apakah kodenya masih akan berfungsi bulan depan. Kebanyakan gagal dengan cara
yang sama, menjadi salinan tersaring dari feed rilis internal, sehingga sebuah field yang dihapus
berada di sebelah perbaikan teks dengan bobot yang sama, dan keduanya tidak dibaca.&lt;/p&gt;
&lt;h2&gt;Apa itu changelog API?&lt;/h2&gt;
&lt;p&gt;Ini adalah log publik dan bertanggal tentang perubahan pada antarmuka yang telah ditulis kodenya
oleh orang lain. Tes yang berguna untuk menentukan apakah sesuatu pantas masuk di dalamnya tidak
ada hubungannya dengan seberapa besar perubahan itu secara internal. Ia bertanya apakah pemanggil
yang benar, ditulis tahun lalu dan tidak pernah disentuh sejak itu, bisa berperilaku berbeda karena
itu. Tes ini menerima beberapa perubahan yang sangat kecil dan mengecualikan beberapa yang sangat
besar.&lt;/p&gt;
&lt;p&gt;Semua di bawah ini mengasumsikan pemanggil berada di luar perusahaan dan pada dasarnya tidak
terjangkau kecuali lewat dokumen ini. Saat pemanggilnya adalah tim lain di perusahaan yang sama,
perhitungannya berubah cukup banyak sehingga butuh perlakuan sendiri;
&lt;a href=&quot;https://changeloop.dev/blog/id/internal-api-changelog/&quot;&gt;changelog API internal&lt;/a&gt; membahas apa yang dibutuhkan audiens
itu sebagai gantinya.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dokumen&lt;/th&gt;
&lt;th&gt;Audiens&lt;/th&gt;
&lt;th&gt;Menjawab&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Changelog API&lt;/td&gt;
&lt;td&gt;Developer yang memanggil API&lt;/td&gt;
&lt;td&gt;Apakah integrasi saya masih berfungsi?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Release notes&lt;/td&gt;
&lt;td&gt;Pengguna produk&lt;/td&gt;
&lt;td&gt;Apa yang bisa saya lakukan sekarang yang tidak bisa sebelumnya?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pemberitahuan deprecation&lt;/td&gt;
&lt;td&gt;Pemanggil satu hal spesifik&lt;/td&gt;
&lt;td&gt;Kapan ini akan berhenti berfungsi?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Halaman status&lt;/td&gt;
&lt;td&gt;Siapa pun yang sedang terdampak&lt;/td&gt;
&lt;td&gt;Apakah sedang down sekarang?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Panduan migrasi&lt;/td&gt;
&lt;td&gt;Pemanggil yang sedang upgrade&lt;/td&gt;
&lt;td&gt;Bagaimana saya pindah dari A ke B?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/blog/id/api-migration-guide/&quot;&gt;Cara menulis panduan migrasi API&lt;/a&gt; membahas dokumen terakhir itu
secara lengkap; singkatnya, itulah yang seharusnya ditautkan entri perubahan tak kompatibel alih-alih
mencoba menggantikannya.&lt;/p&gt;
&lt;p&gt;Kelimanya adalah dokumen terpisah dengan siklus hidup terpisah. Pemberitahuan deprecation adalah
janji dengan tanggal, dan juga masuk ke changelog, tapi entri changelog ditulis sekali sementara
deprecation dilacak sampai sunset-nya. Menggabungkan keduanya adalah alasan mengapa sunset
terlewat.&lt;/p&gt;
&lt;h2&gt;Apa yang masuk dalam satu entri?&lt;/h2&gt;
&lt;p&gt;Enam hal, dan tiga yang pertama biasanya yang hilang. Perubahan itu sendiri, dinyatakan dalam
istilah request atau response, bukan komponen internal. Apakah itu merusak pemanggil yang benar.
Apa yang harus dilakukan pemanggil, termasuk &amp;quot;tidak ada&amp;quot;. Tanggal berlakunya. Versi atau
versi-versi yang terdampak. Tautan ke panduan migrasi jika ada.&lt;/p&gt;
&lt;p&gt;Entri yang mengatakan &amp;quot;endpoint accounts ditingkatkan&amp;quot; gagal pada keenamnya. Entri yang mengatakan
&amp;quot;field &lt;code&gt;accounts.type&lt;/code&gt; sekarang mengembalikan &lt;code&gt;individual&lt;/code&gt; di mana sebelumnya mengembalikan
&lt;code&gt;personal&lt;/code&gt;; nilai yang sudah ada tidak berubah untuk akun yang dibuat sebelum 2 September; tidak
perlu tindakan kecuali Anda membandingkan string&amp;quot; menjawab keenamnya dalam satu kalimat.&lt;/p&gt;
&lt;p&gt;Kategorikan entri berdasarkan konsekuensi, bukan departemen. Tiga label membawa hampir seluruh
nilainya: breaking, additive, dan fixed. &lt;a href=&quot;https://semver.org/&quot;&gt;Semantic Versioning&lt;/a&gt; sudah
mendefinisikan dua yang pertama secara tepat, dan meminjam definisinya alih-alih menciptakan yang
lokal berarti pembaca yang tahu semver tahu label Anda. &lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt;
menawarkan set yang lebih panjang jika Anda mau, dan aturan intinya berlaku di sini lebih kuat
daripada di tempat lain: log itu untuk manusia, dan tumpukan judul commit bukanlah itu.&lt;/p&gt;
&lt;h2&gt;Apa bedanya changelog API dengan release notes?&lt;/h2&gt;
&lt;p&gt;Release notes menjelaskan apa yang bisa dilakukan produk sekarang. Changelog API menjelaskan apa
kontraknya sekarang. Pekerjaan yang sama yang dirilis sering menghasilkan entri di keduanya,
dirumuskan berbeda, karena audiensnya butuh hal yang berbeda: format ekspor baru adalah fitur bagi
pengguna dan nilai enum baru bagi pemanggil yang bergantung pada field itu.&lt;/p&gt;
&lt;p&gt;Konsekuensi praktisnya adalah keduanya tidak bisa menjadi feed yang sama dengan gaya berbeda.
Pemanggil yang berlangganan segala yang Anda rilis akhirnya akan berhenti berlangganan, lalu
melewatkan breaking change. Jika Anda menerbitkan satu feed, saring; jika menerbitkan dua, buat
yang API lebih sempit dan jangan pernah biarkan entri marketing masuk ke dalamnya. Kami
membandingkan kedua bentuk berdampingan di &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-vs-release-notes/&quot;&gt;changelog vs release notes&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Di mana changelog API sebaiknya berada?&lt;/h2&gt;
&lt;p&gt;Di samping dokumentasi referensi, di URL yang stabil, dengan setiap entri dapat dialamatkan secara
individual lewat fragment atau path-nya sendiri. Pemanggil menautkan entri dalam tinjauan insiden
dan tiket internal, dan entri yang tidak bisa ditautkan akan ditempel sebagai screenshot sebagai
gantinya.&lt;/p&gt;
&lt;p&gt;Terbitkan juga sebagai output yang bisa dibaca mesin, selain sebagai halaman. Feed JSON yang
mengikuti &lt;a href=&quot;https://www.jsonfeed.org/version/1.1/&quot;&gt;spesifikasi JSON Feed&lt;/a&gt; atau
&lt;a href=&quot;https://www.rssboard.org/rss-specification&quot;&gt;feed RSS&lt;/a&gt; tidak memakan biaya apa pun begitu entri
menjadi data terstruktur, dan itulah yang memungkinkan pelanggan memasukkan perubahan Anda ke
proses rilis mereka sendiri. Ini juga bagian yang menentukan apakah ada yang membangun di atasnya.
GitHub mendokumentasikan &lt;a href=&quot;https://docs.github.com/en/rest/about-the-rest-api/api-versions&quot;&gt;versi REST API&lt;/a&gt;-nya
tepat di samping referensi dengan alasan yang sama: kebijakan versi adalah bagian dari antarmuka.&lt;/p&gt;
&lt;h2&gt;Seperti apa entri yang baik dalam praktiknya?&lt;/h2&gt;
&lt;p&gt;Tiga entri dari minggu yang sama, dalam bentuk yang dijelaskan di atas:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2026-09-02  Breaking  v2
  `POST /invoices` sekarang menolak `currency` yang tidak cocok dengan
  mata uang akun pelanggan, mengembalikan 422 alih-alih mengonversi
  secara diam-diam. Pemanggil yang mengandalkan konversi harus mengirim
  mata uang akun. Hanya memengaruhi v2; v1 tidak berubah hingga
  sunset-nya pada 2027-01-15.

2026-09-02  Additive  v1, v2
  `Invoice` mendapat timestamp `settled_at`, null hingga faktur
  dilunasi. Tidak perlu tindakan. Client yang menolak field tak
  dikenal sebaiknya diperbarui.

2026-08-31  Fixed  v2
  `GET /invoices?status=` mengembalikan halaman kosong alih-alih 400
  untuk status yang tidak dikenal. Sekarang mengembalikan 400 dengan
  nilai yang diterima. Pemanggil dengan salah ketik sebelumnya melihat
  nol hasil, sekarang melihat error.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yang ketiga adalah jenis yang paling sering dihilangkan, karena secara internal itu adalah
perbaikan bug. Bagi pemanggil yang membangun retry di sekitar halaman kosong itu, ini adalah
perubahan perilaku, dan entri itulah yang mencegah tiket support. Labelnya mengatakan fixed dan
isinya mengatakan apa yang mungkin diperhatikan pemanggil, yang merupakan pembeda yang menjaga log
tetap jujur tanpa menggembungkan setiap perbaikan menjadi breaking change.&lt;/p&gt;
&lt;h2&gt;Bagaimana pemanggil berlangganan?&lt;/h2&gt;
&lt;p&gt;Berikan mereka lebih dari satu kanal, karena tugas mereka berbeda. Feed untuk developer yang
menginginkan semuanya. Email untuk yang hanya menginginkan breaking change. Header response untuk
kode itu sendiri, satu-satunya pelanggan yang tidak pernah lupa memeriksa: &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8594&quot;&gt;header &lt;code&gt;Sunset&lt;/code&gt; yang
didefinisikan di RFC 8594&lt;/a&gt; menempatkan tanggal
pensiun di response, tempat library client bisa mencatatnya.&lt;/p&gt;
&lt;p&gt;Kanal yang paling sering dilewatkan kebanyakan tim adalah yang langsung. Jika seorang pemanggil
menggunakan field yang sedang Anda ubah minggu lalu, Anda tahu siapa dia, dan email ke akun-akun
itu lebih berharga daripada siaran sebanyak apa pun. Ini adalah disiplin yang sama dengan
&lt;a href=&quot;https://changeloop.dev/blog/id/customer-feedback-loop/&quot;&gt;menutup loop feedback pelanggan&lt;/a&gt;, diterapkan pada perubahan
yang tidak diminta siapa pun: orang yang terdampak diberi tahu satu per satu, dan semua yang lain
mendapat feed. Webhook
adalah kanal keempat dengan mode kegagalannya sendiri yang layak diketahui sebelum
mengandalkannya: &lt;a href=&quot;https://changeloop.dev/blog/id/webhook-changelog/&quot;&gt;changelog webhook&lt;/a&gt; membahas mengapa perubahan
payload di sana rusak diam-diam, tanpa pemanggil yang bisa menolak bentuk barunya.&lt;/p&gt;
&lt;h2&gt;Bagaimana cara menulis entri untuk breaking change?&lt;/h2&gt;
&lt;p&gt;Mulai dengan kerusakannya, bukan alasannya. Pemanggil yang memindai sepuluh entri perlu tahu di
klausa pertama apakah entri ini akan menghabiskan waktunya. Lalu tanggal, versi yang terdampak,
migrasi, dan tenggat waktu jika perilaku lama akan hilang alih-alih berubah.&lt;/p&gt;
&lt;p&gt;Masukkan konten yang sama ke pemberitahuan deprecation, header response, dan email langsung,
dirumuskan secara konsisten, dan beri keempatnya tanggal yang sama. Perbedaan di antara mereka
adalah kegagalan yang mengubah perubahan terencana menjadi insiden, karena pemanggil yang hanya
membaca satu darinya bertindak berdasarkan tanggal yang salah.
&lt;a href=&quot;https://changeloop.dev/blog/id/breaking-changes/&quot;&gt;Apa itu breaking change&lt;/a&gt; membahas keputusannya sendiri, dan
&lt;a href=&quot;https://changeloop.dev/blog/id/api-deprecation/&quot;&gt;cara men-deprecate API&lt;/a&gt; membahas jadwal yang mengikutinya.&lt;/p&gt;
&lt;p&gt;Di changeloop, perubahan API menjadi entri saat pull request digabungkan, seseorang mengedit dan
menyetujui draf, dan entri diterbitkan ke &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;feed dan widget&lt;/a&gt; pada saat yang sama pemanggil
yang masukan widget-nya menjadi issue GitHub yang ditutup oleh pull request itu diberi tahu di
issue tersebut. Langkah peninjauan adalah yang penting di sini: changelog API
adalah dokumen kontraktual, dan tidak ada draf yang boleh sampai ke pemanggil tanpa dibaca oleh
seseorang.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apakah setiap perubahan API perlu entri changelog?&lt;/strong&gt;
Setiap perubahan yang mungkin diperhatikan pemanggil yang benar, ya, termasuk yang Anda anggap
internal. Perubahan tanpa efek yang bisa diamati pada request atau response tidak, dan
menambahkannya melatih pembaca untuk hanya melirik.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sebaiknya changelog API berada di docs atau di situs marketing?&lt;/strong&gt;
Di docs, tepat di samping referensi. Pembaca biasanya sudah ada di sana, dan changelog di situs
marketing cenderung mendapat audiens yang bukan tujuan penulisannya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Seberapa jauh ke belakang seharusnya?&lt;/strong&gt;
Tanpa batas. Entri dikutip bertahun-tahun kemudian dalam tinjauan insiden, dan log yang dipotong
merusak tautan itu. Gunakan paginasi alih-alih memangkas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah saya perlu changelog terpisah per versi API?&lt;/strong&gt;
Tidak, satu log dengan field versi per entri lebih mudah dibaca dan dicari. Menyaring berdasarkan
versi adalah fitur halaman, bukan alasan untuk memisahkan dokumen.&lt;/p&gt;
</content:encoded></item><item><title>Cara membangun halaman changelog yang diikuti orang</title><link>https://changeloop.dev/blog/id/changelog-page/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/changelog-page/</guid><description>Halaman changelog layak dibangun ketika orang kembali lagi. Di mana letaknya, apa yang dibutuhkan tiap entri, feed dan markup, serta posisi widget.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Halaman changelog layak dibangun ketika seseorang akan kembali ke sana. Itu standar yang lebih
tinggi daripada sekadar memilikinya, dan itulah standar yang paling sering gagal dipenuhi: halaman
yang ada, ditautkan di footer, diperbarui secara sporadis, dan tidak dikunjungi siapa pun kecuali
saat insiden. Keputusan yang memisahkan keduanya dibuat sebelum apa pun ditulis, dan sebagian besar
tentang di mana halaman itu berada dan apa lagi yang dihasilkan dari konten yang sama.&lt;/p&gt;
&lt;h2&gt;Apa itu halaman changelog?&lt;/h2&gt;
&lt;p&gt;Ini adalah daftar publik dan bertanggal tentang apa yang berubah pada sebuah produk, di URL milik
Anda. Ini salah satu dari lima permukaan tempat entri yang sama bisa muncul, dan pertanyaan yang
berguna bukan mana yang dipilih, melainkan mana yang kanonik dan mana yang dihasilkan darinya.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Permukaan&lt;/th&gt;
&lt;th&gt;Terbaik untuk&lt;/th&gt;
&lt;th&gt;Biaya&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Halaman hosted&lt;/td&gt;
&lt;td&gt;Pencarian, penautan, catatan panjang&lt;/td&gt;
&lt;td&gt;Sebuah URL dan template&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Widget in-app&lt;/td&gt;
&lt;td&gt;Menjangkau pengguna yang tak pernah mengunjungi halaman&lt;/td&gt;
&lt;td&gt;Sebuah embed, dan kehati-hatian&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bagian docs&lt;/td&gt;
&lt;td&gt;Audiens API dan developer&lt;/td&gt;
&lt;td&gt;Menjaganya di samping referensi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feed JSON&lt;/td&gt;
&lt;td&gt;Pelanggan yang membangun di atas perubahan Anda&lt;/td&gt;
&lt;td&gt;Struktur yang sudah Anda miliki&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feed RSS&lt;/td&gt;
&lt;td&gt;Developer yang berlangganan sekali&lt;/td&gt;
&lt;td&gt;Hampir tidak ada apa-apa&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Pilih satu sumber kanonik, terbitkan sekali, dan hasilkan sisanya. Tim yang memelihara halaman dan
widget secara terpisah dengan tangan akan berakhir dengan dua teks yang tidak cocok, dan
ketidakcocokan itu ditemukan oleh pelanggan.&lt;/p&gt;
&lt;h2&gt;Di mana sebaiknya halaman changelog berada?&lt;/h2&gt;
&lt;p&gt;Di domain Anda sendiri, di path yang stabil, dengan setiap entri dapat dialamatkan secara
individual. Tiga lokasi umum adalah path di situs utama, subdomain, dan bagian dari dokumentasi.
Path di situs utama adalah pilihan default yang seharusnya diperdebatkan penolakannya, bukan
dukungannya: ia mewarisi otoritas situs, tidak butuh sertifikat atau DNS tambahan, dan menjaga
halaman dalam navigasi yang sama dengan yang lain.&lt;/p&gt;
&lt;p&gt;Subdomain adalah jawaban yang tepat ketika halaman dilayani oleh sistem yang berbeda dari situs
marketing dan Anda kalau tidak akan melakukan proxy. Biayanya adalah ia mengumpulkan otoritas
secara terpisah. Menempatkan changelog di docs itu tepat ketika audiensnya developer, dengan
alasan yang dibahas di &lt;a href=&quot;https://changeloop.dev/blog/id/api-changelog/&quot;&gt;changelog API&lt;/a&gt;: pembaca biasanya sudah ada di
sana.&lt;/p&gt;
&lt;p&gt;Yang lebih penting daripada pilihan itu adalah entri harus bisa ditautkan secara individual. Orang
menautkan entri dalam tinjauan insiden dan tiket internal, dan entri yang hanya bisa ditautkan
sebagai &amp;quot;changelog, scroll ke bawah&amp;quot; akan ditempel sebagai screenshot sebagai gantinya.&lt;/p&gt;
&lt;h2&gt;Apa yang dibutuhkan halaman changelog?&lt;/h2&gt;
&lt;p&gt;Lima hal, dan pada dua yang pertama sebagian besar halaman gagal. Entri bertanggal per perubahan,
yang terbaru dulu. Kategori atau label per entri agar bisa dipindai berdasarkan jenis yang
diminati. Permalink per entri. Jalur berlangganan. Pencarian atau filter setelah sekitar lima
puluh entri.&lt;/p&gt;
&lt;p&gt;Selebihnya opsional. Screenshot membantu dan memakan biaya pemeliharaan. Nama penulis membangun
kepercayaan di beberapa produk dan menjadi noise di produk lain. Nomor versi penting bagi pemanggil
sebuah API dan hampir tidak ada orang lain. &lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt;
adalah pilihan default yang masuk akal untuk label jika Anda tidak punya alasan menciptakan sendiri,
dan aturan intinya adalah yang layak dipertahankan bahkan jika Anda membuang sisanya: log ditulis
untuk manusia.&lt;/p&gt;
&lt;p&gt;Kelompokkan berdasarkan tanggal, bukan versi, ketika produk Anda merilis secara berkelanjutan.
Pembaca yang memindai &amp;quot;apakah ini sebelum atau sesudah insiden kami tanggal sembilan&amp;quot; mencari
tanggal, dan halaman yang diorganisasi berdasarkan nomor versi memaksanya menghitung.&lt;/p&gt;
&lt;h2&gt;Halaman atau widget in-app?&lt;/h2&gt;
&lt;p&gt;Keduanya, dari satu sumber. Halaman adalah tempat pencarian, tautan, dan catatan panjang berada.
Widget adalah cara Anda menjangkau mayoritas pengguna yang tidak akan pernah mengunjungi halaman,
dan ia berfungsi karena muncul di produk yang sudah mereka gunakan.&lt;/p&gt;
&lt;p&gt;Kegagalan widget adalah gangguan. Badge yang menuntut perhatian untuk setiap entri akan diabaikan
secara permanen dalam seminggu, yang membuat Anda kehilangan kanal untuk entri yang benar-benar
penting. Hitung yang belum dibaca sejak terakhir kali pembaca melihat, semai penghitung secara diam
pada kunjungan pertama agar tidak ada yang disambut badge riwayat satu tahun, dan biarkan pembaca
membukanya sendiri alih-alih Anda membukanya untuk mereka.&lt;/p&gt;
&lt;h2&gt;Bagaimana membuat halaman changelog bisa dibaca mesin?&lt;/h2&gt;
&lt;p&gt;Terbitkan entri yang sama sebagai feed. &lt;a href=&quot;https://www.jsonfeed.org/version/1.1/&quot;&gt;Feed JSON&lt;/a&gt; adalah
pilihan dengan gesekan paling rendah bagi apa pun yang mengonsumsinya lewat kode, dan
&lt;a href=&quot;https://www.rssboard.org/rss-specification&quot;&gt;feed RSS&lt;/a&gt; adalah yang diharapkan developer yang
berlangganan di reader. Keduanya murah begitu entri menjadi data terstruktur alih-alih HTML yang
ditulis tangan, yang merupakan alasan sebenarnya untuk menjaga salinan kanonik tetap terstruktur.&lt;/p&gt;
&lt;p&gt;Beri markup pada halaman juga. Entri adalah karya dengan tanggal dan judul, dan
&lt;a href=&quot;https://schema.org/CreativeWork&quot;&gt;schema.org&lt;/a&gt; menyediakan kosakatanya. Ini layak dilakukan dengan
alasan yang sama seperti permalink: membuat halaman bisa digunakan oleh hal-hal yang bukan
browser, termasuk proses rilis pelanggan sendiri. Tidak
satu pun ini berfungsi jika entri yang mendasarinya tidak pernah menjadi data terstruktur sejak
awal; &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-file-formats/&quot;&gt;format berkas changelog&lt;/a&gt; membahas berapa biaya masing-
masing dari Markdown, JSON, dan YAML sebagai sumber kebenaran tempat feed dan markup ini
sebenarnya dihasilkan.&lt;/p&gt;
&lt;h2&gt;Apakah halaman changelog membantu SEO?&lt;/h2&gt;
&lt;p&gt;Secara tidak langsung dan lambat. Entri individual jarang meranking, karena tidak menargetkan
query apa pun yang diketik orang. Halaman mendapatkan tempatnya lewat tautan: entri dikutip dalam
balasan support, forum, dan analisis insiden, dan tautan itu menumpuk di URL milik Anda. Halaman
yang diperbarui setiap minggu selama dua tahun juga menjadi sinyal kesegaran yang kredibel bagi
produk yang dimilikinya.&lt;/p&gt;
&lt;p&gt;Yang tidak berhasil adalah memperlakukan entri sebagai content marketing. Entri yang digelembungkan
menjadi tiga paragraf demi panjang lebih buruk dalam tugas sebenarnya, yaitu memberi tahu pembaca
dalam satu kalimat apakah sesuatu yang mereka gunakan berubah. Jika Anda ingin changelog mendukung
pencarian, tempatkan usaha pada permalink, feed, dan tautan internal ke sana, dan biarkan entri
tetap singkat. Halaman &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;contoh changelog&lt;/a&gt; kami sendiri mengumpulkan halaman
yang menangkap keseimbangan ini dengan tepat.&lt;/p&gt;
&lt;h2&gt;Bagaimana orang berlangganan?&lt;/h2&gt;
&lt;p&gt;Berikan mereka jalur yang sudah mereka gunakan: feed RSS atau JSON untuk developer, email untuk
yang hanya ingin mendengar hal penting, dan widget in-app untuk semua yang tidak akan pernah
melakukan keduanya. Tanyakan apa yang ingin mereka dengar alih-alih mengasumsikannya, karena
pembaca yang menginginkan breaking change dan menerima perbaikan teks akan berhenti berlangganan
dari keduanya.&lt;/p&gt;
&lt;p&gt;Jalur yang sebaiknya ditambahkan terakhir adalah yang menutup loop. Ketika sebuah entri
menyelesaikan apa yang diminta seseorang secara spesifik, beri tahu mereka langsung alih-alih
berharap mereka membaca halaman. Di changeloop, entri diterbitkan sekaligus di &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;halaman, feed, dan
widget&lt;/a&gt;, dan orang yang masukan widget-nya menjadi issue GitHub yang ditutup oleh pull request
diberi tahu di issue itu dengan tautan ke entri, dan melihat entri tersebut di widget. Mekanismenya
sama seperti langganan apa pun; bedanya, penerima sudah bertanya. Itulah argumen yang dijelaskan
di &lt;a href=&quot;https://changeloop.dev/blog/id/customer-feedback-loop/&quot;&gt;menutup loop feedback dari sisi changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sebaiknya halaman changelog di subdomain atau path?&lt;/strong&gt;
Secara default, path di situs utama, karena mewarisi otoritas situs dan tidak butuh infrastruktur
tambahan. Subdomain dibenarkan ketika sistem berbeda melayani halaman itu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Berapa banyak entri yang sebaiknya ditampilkan halaman sekaligus?&lt;/strong&gt;
Cukup untuk mengisi layar dan tidak lebih, dengan paginasi setelahnya. Memuat riwayat dua tahun ke
satu dokumen itu lambat dan membuat entri terbaru lebih sulit ditemukan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah entri lama pernah perlu dihapus?&lt;/strong&gt;
Tidak. Entri dikutip dari luar situs Anda dan tautan akan rusak. Perbaiki entri di tempatnya dengan
catatan, dan jaga URL tetap hidup.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah setiap perubahan harus muncul di halaman?&lt;/strong&gt;
Hanya yang mungkin diperhatikan pengguna. Halaman yang mencatat refactor internal melatih pembaca
untuk hanya melirik, dan halaman yang dilirik gagal pada hari ia membawa sesuatu yang mendesak.&lt;/p&gt;
</content:encoded></item><item><title>Template email update produk yang dibaca orang</title><link>https://changeloop.dev/blog/id/product-update-email/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/product-update-email/</guid><description>Email update produk yang dibaca dikirim ke orang yang memintanya. Sebuah template, empat jenis email, subjek yang efektif, segmentasi, dan persetujuan.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Email update produk yang dibaca adalah yang dikirim ke seseorang yang meminta persis apa yang
diumumkannya. Segalanya bersaing dengan sisa kotak masuk soal seberapa menarik, kompetisi yang
kalah dari pengumuman rilis di kebanyakan minggu. Fakta tunggal ini seharusnya menentukan bentuk
email sebelum kata apa pun dirumuskan: siapa yang menerimanya, dan apa yang dilakukan orang itu
hingga masuk daftar.&lt;/p&gt;
&lt;h2&gt;Apa itu email update produk?&lt;/h2&gt;
&lt;p&gt;Ini adalah pesan yang memberi tahu pengguna yang ada tentang apa yang berubah pada produk yang
sudah mereka gunakan. Ada empat jenis berbeda, dan memperlakukannya sebagai satu daftar adalah
alasan mengapa tingkat buka menurun. Masing-masing punya pemicu berbeda, audiens berbeda, dan
frekuensi yang bisa diterima berbeda.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Jenis&lt;/th&gt;
&lt;th&gt;Pemicu&lt;/th&gt;
&lt;th&gt;Audiens&lt;/th&gt;
&lt;th&gt;Frekuensi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Notifikasi bertarget&lt;/td&gt;
&lt;td&gt;Permintaan spesifik seseorang dirilis&lt;/td&gt;
&lt;td&gt;Satu orang&lt;/td&gt;
&lt;td&gt;Setiap kali terjadi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pemberitahuan breaking change&lt;/td&gt;
&lt;td&gt;Perubahan yang membebani pekerjaan pembaca&lt;/td&gt;
&lt;td&gt;Hanya akun terdampak&lt;/td&gt;
&lt;td&gt;Setiap kali terjadi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Digest&lt;/td&gt;
&lt;td&gt;Berlalunya waktu&lt;/td&gt;
&lt;td&gt;Pengguna opt-in&lt;/td&gt;
&lt;td&gt;Maksimal bulanan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pengumuman peluncuran&lt;/td&gt;
&lt;td&gt;Peluncuran yang layak menginterupsi&lt;/td&gt;
&lt;td&gt;Segmen atau semua&lt;/td&gt;
&lt;td&gt;Jarang, dan harus terasa jarang&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Kebanyakan tim hanya membangun yang ketiga, mengirim ke semua orang, lalu menyimpulkan bahwa email
update produk tidak berhasil. Dua yang pertama membawa hampir seluruh nilainya, karena pembaca
punya alasan sebelumnya untuk peduli, dan pesan tiba selagi alasan itu masih hidup.&lt;/p&gt;
&lt;p&gt;Keempat baris di sini semuanya ditulis untuk pelanggan. Sales, support, dan customer success juga
perlu tahu apa yang dirilis, biasanya dalam bentuk berbeda dari keempat ini;
&lt;a href=&quot;https://changeloop.dev/blog/id/internal-release-notes/&quot;&gt;release notes internal&lt;/a&gt; membahas apa yang seharusnya
dikatakan dokumen itu dan mengapa harus keluar sebelum catatan untuk pelanggan.&lt;/p&gt;
&lt;p&gt;Email adalah salah satu dari beberapa kanal yang bisa dipakai pengumuman peluncuran, bukan satu-satunya. &lt;a href=&quot;https://changeloop.dev/blog/id/new-feature-announcement/&quot;&gt;Cara mengumumkan fitur baru&lt;/a&gt; membahas yang lain, dan cara memilih di antaranya berdasarkan seberapa besar fitur itu sebenarnya.&lt;/p&gt;
&lt;h2&gt;Apa yang masuk template?&lt;/h2&gt;
&lt;p&gt;Enam blok, dalam urutan ini. Yang pertama biasanya yang paling sering hilang, dan itulah yang
melakukan pekerjaan.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Subjek:  &amp;lt;apa yang berubah, dengan kata-kata pembaca&amp;gt;

1. Mengapa Anda menerima ini
   &amp;quot;Anda meminta ekspor CSV bulan Maret.&amp;quot; atau
   &amp;quot;Integrasi Anda memanggil /v1/invoices, yang berubah 15 Januari.&amp;quot;

2. Apa yang berubah
   Satu kalimat. Apa yang sekarang mungkin, atau apa yang sekarang
   rusak.

3. Apa yang harus Anda lakukan
   Sering &amp;quot;tidak ada&amp;quot;. Katakan secara eksplisit, jangan biarkan
   tersirat.

4. Di mana melihatnya
   Tautan ke entri changelog, bukan ke homepage.

5. Kapan
   Tanggal rilis, atau sejak kapan berlaku.

6. Cara berhenti berlangganan
   Satu klik, dan langsung dihormati.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Blok 1 adalah perbedaan antara pesan dan siaran umum. Pembaca yang diberi tahu, di baris pertama,
bahwa ini adalah penyelesaian dari sesuatu yang secara pribadi ia minta, akan membaca sisanya.
Tanpa itu, blok 2 sampai 5 adalah newsletter, sebagus apa pun tulisannya.&lt;/p&gt;
&lt;p&gt;Jaga keseluruhannya di bawah sekitar 150 kata. Email adalah penunjuk ke entri changelog, dan
entrilah tempat detail berada. Email yang mereproduksi seluruh entri tidak memberi pembaca alasan
untuk klik, dan tidak memberi Anda sinyal apakah ada yang peduli.&lt;/p&gt;
&lt;h2&gt;Subjek apa yang berhasil?&lt;/h2&gt;
&lt;p&gt;Sebutkan perubahannya, bukan rilisnya. &amp;quot;Ekspor CSV sudah live&amp;quot; mengalahkan &amp;quot;update September&amp;quot;
karena yang pertama adalah fakta yang bisa dinilai pembaca dan yang kedua adalah wadah. Nomor
versi di subjek berguna bagi pemanggil sebuah API dan noise bagi semua orang lain, alasan lain
untuk memisahkan audiens.&lt;/p&gt;
&lt;p&gt;Hindari mengklaim manfaat yang belum disetujui pembaca. &amp;quot;Laporan Anda sekarang lebih cepat&amp;quot;
mengklaim sesuatu tentang pengalamannya; &amp;quot;Laporan di atas 10.000 baris sekarang dimuat dalam
kurang dari satu detik&amp;quot; melaporkan perubahan dan membiarkan dia memutuskan apakah itu penting.&lt;/p&gt;
&lt;h2&gt;Kapan mengirimnya, dan kepada siapa?&lt;/h2&gt;
&lt;p&gt;Kirim notifikasi bertarget pada saat hal itu dirilis, kepada orang-orang yang memintanya, secara
individual. Kirim pemberitahuan breaking change segera setelah tanggal pasti dan sekali lagi
mendekati tanggal itu, kepada akun yang benar-benar terdampak alih-alih seluruh daftar. Kirim
digest hanya jika Anda punya cukup perubahan hingga pembaca akan melewatkan sesuatu jika tidak,
dan biarkan orang mendaftar secara terpisah.&lt;/p&gt;
&lt;p&gt;Daftar yang hampir tidak pernah sebaiknya Anda gunakan adalah &amp;quot;semua pengguna&amp;quot;. Itu mengubah pesan
spesifik menjadi generik, dan melatih orang berhenti berlangganan. Segmentasikan berdasarkan
perilaku yang sudah Anda simpan: siapa yang memintanya, siapa yang menggunakan endpoint ini, siapa
yang ada di paket ini.&lt;/p&gt;
&lt;h2&gt;Apakah butuh persetujuan untuk mengirimnya?&lt;/h2&gt;
&lt;p&gt;Bagi pelanggan yang ada, update tentang layanan yang mereka gunakan biasanya adalah pertanyaan
hukum yang berbeda dari marketing ke calon pelanggan, dan jawabannya tergantung di mana mereka
berada dan apa yang Anda katakan saat pendaftaran. Di UE, pertanyaan relevannya adalah dasar hukum
mana dari &lt;a href=&quot;https://gdpr-info.eu/art-6-gdpr/&quot;&gt;Pasal 6 GDPR&lt;/a&gt; yang berlaku, dan di Amerika Serikat
pesan komersial membawa persyaratan spesifik yang ditetapkan dalam
&lt;a href=&quot;https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business&quot;&gt;panduan kepatuhan CAN-SPAM FTC&lt;/a&gt;.
Keduanya menuntut hal yang sama dalam praktik: katakan siapa Anda, perjelas tujuannya, dan biarkan
orang bisa berhenti.&lt;/p&gt;
&lt;p&gt;Apa pun dasarnya, jaga aliran transaksional dan marketing tetap terpisah di tingkat pengiriman.
Pemberitahuan breaking change yang berhenti dilanggan pelanggan karena berbagi daftar dengan digest
promosi adalah insiden support yang menunggu tanggalnya.&lt;/p&gt;
&lt;h2&gt;Seperti apa jika diisi?&lt;/h2&gt;
&lt;p&gt;Notifikasi bertarget, email update produk paling berharga dan yang paling jarang dibangun tim:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Subjek: Ekspor CSV sudah live

Hai Dana,

kamu meminta ekspor CSV bulan Maret.

Sudah live pagi ini. Laporan sekarang punya tombol Ekspor
yang menghasilkan CSV dari tampilan saat ini, termasuk
filter.

Tidak ada yang perlu kamu lakukan. Sudah aktif di akunmu.

  Detail: example.com/changelog#csv-export
  Dirilis: 2 September 2026

Kamu menerima ini karena memintanya. Berhenti berlangganan
update permintaan: &amp;lt;tautan&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sembilan puluh kata, dan pembaca tahu di baris pertama mengapa ini datang. Bandingkan dengan
perubahan yang sama dalam digest bulanan, di mana ia muncul sebagai satu dari sembilan poin dan
Dana tidak punya alasan menyadari permintaannya sendiri sudah keluar.&lt;/p&gt;
&lt;h2&gt;Apa yang harus diukur?&lt;/h2&gt;
&lt;p&gt;Bukan hanya tingkat buka. Untuk notifikasi bertarget, pertanyaannya adalah apakah orang yang
meminta kembali dan menggunakan hal itu, jadi angka yang perlu diamati adalah klik ke entri dan
apakah akun itu menggunakan fitur dalam seminggu. Untuk pemberitahuan breaking change, itu
cakupan: berapa persen akun terdampak yang membuka sebelum tanggal, dan dengan siapa Anda
menindaklanjuti secara individual.&lt;/p&gt;
&lt;p&gt;Digest adalah satu-satunya dari keempatnya di mana tingkat buka berarti banyak, dan bahkan di sana
lebih berguna sebagai tren terhadap riwayatnya sendiri daripada terhadap benchmark industri. Jenis
email update produk yang berbeda punya tugas yang berbeda, jadi angka yang dirata-rata di semuanya
tidak menggambarkan apa pun yang bisa ditindaklanjuti.&lt;/p&gt;
&lt;h2&gt;Apa bedanya dengan release notes?&lt;/h2&gt;
&lt;p&gt;Release notes adalah dokumen yang tetap tersedia. Email adalah mekanisme pengiriman yang terjadi
sekali. Perubahan yang sama menghasilkan keduanya, dan email sebaiknya lebih pendek daripada entri
yang ditunjuknya. &lt;a href=&quot;https://changeloop.dev/blog/id/release-notes-best-practices/&quot;&gt;Praktik terbaik release notes&lt;/a&gt; membahas
dokumennya, dan &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-vs-release-notes/&quot;&gt;changelog vs release notes&lt;/a&gt; membahas yang
mana yang sedang Anda tulis.&lt;/p&gt;
&lt;p&gt;Hubungan yang layak dibenarkan: entri changelog adalah teks kanonik dan email mengutipnya. Ketika
keduanya menyimpang, pembaca yang klik menemukan deskripsi berbeda tentang perubahan itu dan
berhenti mempercayai keduanya. Menerbitkan entri lebih dulu dan menghasilkan email darinya
menghilangkan penyimpangan itu secara konstruksi. changeloop bekerja dengan cara yang sama di sisinya: entri
ditinjau sekali dan diterbitkan di &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;halaman, feed, dan widget&lt;/a&gt;, dan orang yang memintanya
melalui widget diberi tahu di issue GitHub yang berasal dari masukannya, dan di widget itu sendiri.
changeloop tidak mengirim email; alat email Anda mengutip entri yang diterbitkan.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Seberapa sering email update produk sebaiknya keluar?&lt;/strong&gt;
Sesering ada sesuatu yang spesifik yang ingin diketahui penerima, yang untuk notifikasi bertarget
berarti setiap kali permintaannya dirilis, dan untuk digest maksimal bulanan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah email berisi seluruh entri changelog?&lt;/strong&gt;
Tidak. Satu kalimat dan satu tautan. Entri adalah versi kanonik, dan salinan lengkap di email
berarti dua teks yang harus dijaga tetap selaras.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tingkat buka berapa yang harus saya harapkan?&lt;/strong&gt;
Bandingkan setiap jenis dengan dirinya sendiri, bukan dengan benchmark. Notifikasi bertarget dan
digest bulanan adalah produk yang berbeda, dan merata-ratakannya menyembunyikan satu-satunya angka
yang layak diamati.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah saya perlu daftar terpisah untuk breaking change?&lt;/strong&gt;
Ya, dan itu sebaiknya daftar yang orang tidak bisa berhenti berlangganan begitu saja tanpa
memahami konsekuensinya, karena itulah daftar yang membuat mereka kehilangan layanan.&lt;/p&gt;
</content:encoded></item><item><title>Cara men-deprecate API tanpa kehilangan developer</title><link>https://changeloop.dev/blog/id/api-deprecation/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/api-deprecation/</guid><description>Deprecation adalah janji dengan tanggal. Jadwalnya, template pemberitahuan, header respons, dan langkah yang mencegah sunset menjadi insiden.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Men-deprecate API berarti mengumumkan bahwa sesuatu masih berfungsi hari ini dan akan berhenti
berfungsi pada tanggal yang dinyatakan, lalu menepati kedua bagian janji itu. Kebanyakan
deprecation gagal di bagian kedua: tanggalnya bergeser diam-diam, atau tiba dan pemanggil yang
tidak pernah melihat pemberitahuan mengetahuinya dari sebuah error. Deprecation selesai ketika
setiap pemanggil yang terdampak sudah bermigrasi atau diberi tahu, secara individu, bahwa mereka
belum.&lt;/p&gt;
&lt;h2&gt;Apa itu deprecation API?&lt;/h2&gt;
&lt;p&gt;Deprecation adalah periode antara mengumumkan bahwa endpoint, field atau versi akan menghilang dan
benar-benar menghapusnya. Selama periode itu perilaku lama tetap berfungsi, dokumentasi
mengatakan itu akan pergi, dan setiap respons membawa peringatan yang bisa dibaca mesin.
Penghapusan adalah peristiwa terpisah, lebih belakangan, sering disebut sunset. Keduanya
tercampur, dan pencampuran itu tempat kerusakan terjadi: &amp;quot;deprecated&amp;quot; mulai berarti &amp;quot;mungkin sudah
hilang&amp;quot;, dan pemanggil berhenti mempercayai kedua kata itu.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Istilah&lt;/th&gt;
&lt;th&gt;Arti&lt;/th&gt;
&lt;th&gt;Yang bisa diandalkan pemanggil&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Deprecated&lt;/td&gt;
&lt;td&gt;Diumumkan akan hilang, masih berfungsi&lt;/td&gt;
&lt;td&gt;Perilaku penuh sampai tanggal sunset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sunset&lt;/td&gt;
&lt;td&gt;Tanggal berhentinya berfungsi&lt;/td&gt;
&lt;td&gt;Tidak ada apa pun setelah tanggal ini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retired / dihapus&lt;/td&gt;
&lt;td&gt;Hilang; permintaan gagal&lt;/td&gt;
&lt;td&gt;Error, idealnya yang menyebutkan penggantinya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legacy&lt;/td&gt;
&lt;td&gt;Tidak jelas. Hindari kata ini&lt;/td&gt;
&lt;td&gt;Tidak ada apa pun, yang menjadi masalahnya&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Berapa lama periode deprecation seharusnya?&lt;/h2&gt;
&lt;p&gt;Cukup lama bagi pemanggil untuk mengetahuinya dan melakukan pekerjaan, diukur dari saat
pemberitahuan mencapai mereka, bukan dari saat Anda menulisnya. Sembilan puluh hari adalah batas
bawah umum untuk API web publik. Dua belas bulan itu normal untuk apa pun yang tertanam dalam
perangkat lunak yang diinstal pengguna akhir, karena perbaikannya juga harus melalui proses rilis
mereka. Panduan versioning Google,
&lt;a href=&quot;https://google.aip.dev/185&quot;&gt;AIP-185&lt;/a&gt;, meminta masa transisi yang wajar dan merekomendasikan 180 hari
bahkan sebelum menghapus fungsionalitas beta, dan Kubernetes mendokumentasikan
&lt;a href=&quot;https://kubernetes.io/docs/reference/using-api/deprecation-policy/&quot;&gt;kebijakan deprecation-nya&lt;/a&gt;
dalam jumlah rilis alih-alih bulan, yang merupakan satuan yang tepat ketika pemanggil Anda
memperbarui berdasarkan versi.&lt;/p&gt;
&lt;p&gt;Pilih satu periode, tuliskan sebagai kebijakan, dan berhenti memutuskannya per perubahan.
Kebijakan yang diterbitkan mengubah setiap deprecation dari negosiasi menjadi penerapan aturan.&lt;/p&gt;
&lt;p&gt;Menuliskan kebijakan deprecation mencakup awal jendela waktu; &lt;a href=&quot;https://changeloop.dev/blog/id/sunsetting-api-version/&quot;&gt;mengakhiri versi
API&lt;/a&gt; membahas pemberitahuan terpisah yang dibutuhkan di
akhir, saat periode itu benar-benar habis dan versi berhenti bekerja.&lt;/p&gt;
&lt;h2&gt;Jadwal deprecation&lt;/h2&gt;
&lt;p&gt;Empat tanggal, diumumkan bersama pada hari pertama. Masing-masing adalah entri changelog terpisah
saat tiba, jadi ceritanya diceritakan empat kali kepada siapa pun yang hanya membaca changelog.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Umumkan.&lt;/strong&gt; Entri menyatakan apa yang di-deprecate, mengapa, apa penggantinya, dan tanggal
sunset. Dokumentasi untuk hal lama mendapat banner yang menautkan ke migrasi. Respons mendapat
header yang dijelaskan di bawah.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ingatkan, di tengah jalan.&lt;/strong&gt; Entri kedua, dan pesan langsung ke setiap pemanggil yang masih
menggunakan perilaku lama. Ini langkah yang membutuhkan data penggunaan: jika Anda tidak bisa
mendaftar siapa yang masih memanggil endpoint yang di-deprecate, Anda tidak bisa melakukannya,
dan layak diperbaiki sebelum deprecation berikutnya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brownout, sesaat sebelum tanggalnya.&lt;/strong&gt; Kembalikan error untuk perilaku lama selama jendela
singkat, satu jam atau satu hari, lalu pulihkan. Pemanggil yang melewatkan setiap
pemberitahuan mengetahuinya sekarang, selagi masih ada waktu. GitHub menggunakan brownout
terjadwal sebelum &lt;a href=&quot;https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/&quot;&gt;mempensiunkan autentikasi kata sandi untuk API&lt;/a&gt;,
dan ini langkah tunggal paling efektif dalam daftar ini.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sunset.&lt;/strong&gt; Hapus. Error yang menggantikannya menyebutkan penggantinya dan menautkan panduan
migrasi. Pertahankan error itu di tempatnya untuk waktu yang lama; 404 tidak memberi tahu
pemanggil apa-apa.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Apa yang harus dikatakan pemberitahuan deprecation?&lt;/h2&gt;
&lt;p&gt;Pemberitahuan deprecation mengatakan apa yang akan hilang, kapan berhenti, apa yang digunakan
sebagai gantinya, dan siapa yang terdampak. Berikut bentuknya, terisi:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;GET /v1/reports/daily&lt;/code&gt; di-deprecate dan berhenti berfungsi pada 1 Maret 2027.&lt;/strong&gt;
Digantikan oleh &lt;code&gt;GET /v2/reports?granularity=day&lt;/code&gt;, yang mengembalikan data yang sama dengan
skema stabil dan penomoran halaman. Memengaruhi 214 integrasi yang memanggil endpoint v1 dalam
30 hari terakhir; jika milik Anda salah satunya, Anda juga akan menerima pemberitahuan ini
melalui email. Panduan migrasi: [tautan]. Tidak ada yang berubah hingga 1 Maret 2027. Sejak
tanggal itu endpoint v1 mengembalikan &lt;code&gt;410 Gone&lt;/code&gt; dengan tautan ke entri ini.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Setiap kalimat membawa sesuatu yang dibutuhkan pembaca. Jumlah integrasi yang terdampak memberi
tahu setiap pembaca apakah harus terus membaca. &amp;quot;Tidak ada yang berubah hingga&amp;quot; adalah kalimat
yang membiarkan yang tidak terdampak menutup tab-nya. Halaman &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;contoh changelog&lt;/a&gt;
mengumpulkan entri dari tim yang menulis bentuk ini secara konsisten, dan layak membaca tiga
sebelum menulis yang pertama sendiri.&lt;/p&gt;
&lt;h2&gt;Header apa yang harus dikirim endpoint yang di-deprecate?&lt;/h2&gt;
&lt;p&gt;Kirim &lt;code&gt;Deprecation&lt;/code&gt;, &lt;code&gt;Sunset&lt;/code&gt; dan &lt;code&gt;Link&lt;/code&gt; ke penggantinya, di setiap respons dari endpoint yang
di-deprecate, sejak hari pengumuman. &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc9745&quot;&gt;Header &lt;code&gt;Deprecation&lt;/code&gt;&lt;/a&gt;
membawa tanggal deprecation berlaku efektif; &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8594&quot;&gt;header &lt;code&gt;Sunset&lt;/code&gt;&lt;/a&gt;
membawa tanggal endpoint berhenti merespons; &lt;code&gt;Link: &amp;lt;url&amp;gt;; rel=&amp;quot;successor-version&amp;quot;&lt;/code&gt; menunjuk ke
apa yang digunakan sebagai gantinya.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP/1.1 200 OK
Deprecation: @1756425600
Sunset: Mon, 01 Mar 2027 00:00:00 GMT
Link: &amp;lt;https://api.example.com/v2/reports&amp;gt;; rel=&amp;quot;successor-version&amp;quot;
Link: &amp;lt;https://example.com/changelog/daily-reports&amp;gt;; rel=&amp;quot;deprecation&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kebanyakan pemanggil tidak akan pernah membaca header itu sendiri. Nilainya adalah bahwa klien
HTTP, gateway atau pemantauan milik pemanggil bisa, yang mengubah deprecation
Anda menjadi peringatan di sisi mereka alih-alih halaman di sisi Anda. SDK yang Anda kirimkan
seharusnya mencatat peringatan ketika melihat satu.&lt;/p&gt;
&lt;h2&gt;Siapa yang diberi tahu, dan bagaimana Anda tahu?&lt;/h2&gt;
&lt;p&gt;Ini langkah yang menentukan apakah sunset itu tenang atau menjadi insiden dukungan, dan ini yang
paling sulit dilakukan hanya dengan changelog. Entri changelog memberi tahu semua orang yang
membaca changelog. Deprecation harus mencapai orang-orang spesifik yang kodenya akan gagal, dan
cara biasa menemukan mereka adalah data penggunaan yang sama yang dibutuhkan pengingat di tengah
jalan: kunci API, aplikasi atau akun yang memanggil perilaku yang di-deprecate baru-baru ini.&lt;/p&gt;
&lt;p&gt;Lingkaran yang kami jalankan: entri disusun dari pull request yang menambahkan deprecation,
seseorang meninjau kata-kata dan tanggalnya, dan setelah diterbitkan entri itu sendiri adalah
notifikasinya. Siapa pun yang masukan widget-nya tentang masalah itu, atau permintaan
penggantinya, menjadi issue GitHub yang ditutup oleh pull request tersebut mendapat komentar di
issue itu yang mengatakan itu sudah dirilis, dengan tautan ke entrinya. &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;Feed dan widget&lt;/a&gt; melayani entri yang sama kepada semua orang lainnya, bersama setiap entri
lain di &lt;a href=&quot;https://changeloop.dev/blog/id/api-changelog/&quot;&gt;changelog API&lt;/a&gt;.
Yang tidak kami lakukan adalah membiarkan deprecation menjadi &amp;quot;dirilis&amp;quot; sebelum seseorang
menerbitkannya; pemberitahuan dengan tanggal yang salah lebih buruk daripada tidak ada
pemberitahuan.&lt;/p&gt;
&lt;p&gt;Apa pun alat Anda, pertanyaan yang harus bisa Anda jawab pada hari sunset adalah: pemanggil mana
yang masih menggunakan ini minggu lalu, dan yang mana dari mereka yang kami beri tahu langsung?
Jika jawabannya &amp;quot;kami memposting tentang itu&amp;quot;, sunset-nya belum siap.&lt;/p&gt;
&lt;h2&gt;Apa perbedaan antara men-deprecate dan memversikan?&lt;/h2&gt;
&lt;p&gt;Memversikan adalah bagaimana Anda menjaga perilaku lama tetap tersedia sementara yang baru ada;
deprecation adalah bagaimana Anda mempensiunkan yang lama. Versi API baru tanpa kebijakan
deprecation untuk yang sebelumnya adalah komitmen untuk menjalankan keduanya selamanya. Deprecation
tanpa versi adalah &lt;a href=&quot;https://changeloop.dev/blog/id/breaking-changes/&quot;&gt;breaking change&lt;/a&gt; dengan penundaan. Anda
membutuhkan keduanya, dan versi adalah bagian yang lebih mudah. GraphQL
adalah pengecualian yang layak disebut: biasanya tidak ada nomor versi sama sekali untuk
dinaikkan, dan &lt;a href=&quot;https://changeloop.dev/blog/id/graphql-schema-deprecation/&quot;&gt;deprecation skema GraphQL&lt;/a&gt; membahas
bagaimana satu skema bersama mempensiunkan field dengan directive sebagai gantinya.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Haruskah endpoint yang di-deprecate terus berfungsi persis seperti sebelumnya?&lt;/strong&gt;
Ya, hingga tanggal sunset. Satu-satunya perubahan yang diizinkan adalah header yang ditambahkan
dan, mendekati akhir, brownout terjadwal yang Anda umumkan sebelumnya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kode status apa yang harus dikembalikan endpoint yang dipensiunkan?&lt;/strong&gt;
&lt;code&gt;410 Gone&lt;/code&gt;, dengan badan dan header &lt;code&gt;Link&lt;/code&gt; yang menunjuk ke penggantinya dan entri changelog.
&lt;code&gt;404&lt;/code&gt; mengatakan URL-nya tidak pernah ada, yang salah dan tidak membantu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bisakah periode deprecation dipersingkat?&lt;/strong&gt;
Hanya untuk keamanan. Jika perilaku lama bisa dieksploitasi, katakan begitu, persingkat periodenya,
dan beri tahu setiap pemanggil yang terdampak secara langsung alih-alih mengandalkan changelog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Perlukah saya men-deprecate sebuah field, atau hanya seluruh endpoint?&lt;/strong&gt;
Field, parameter, nilai enum, default dan header semuanya membutuhkan perlakuan yang sama, karena
masing-masing bisa merusak pemanggil yang benar. Field yang dihapus adalah deprecation paling
umum dan paling sering dilewati.&lt;/p&gt;
</content:encoded></item><item><title>Praktik terbaik versi API, demi kepentingan pemanggil</title><link>https://changeloop.dev/blog/id/api-versioning-best-practices/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/api-versioning-best-practices/</guid><description>Versikan hanya yang merusak, taruh versinya di tempat yang terlihat pemanggil, dan jaga versi lama berjalan sampai tanggal tertentu. Empat skema.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Versi API adalah praktik menjaga kontrak lama tetap berfungsi setelah Anda mengubahnya, sehingga
pemanggil bisa maju sesuai jadwal mereka sendiri alih-alih jadwal Anda. Kalimat itu berisi dua
keputusan yang penting: apa yang terhitung sebagai mengubah kontraknya, dan berapa lama yang lama
tetap berfungsi. Di mana nomor versi berada, yang menjadi topik kebanyakan perdebatan versi,
adalah yang paling tidak penting dari ketiganya dan paling mudah dibenarkan.&lt;/p&gt;
&lt;h2&gt;Kapan sebuah API seharusnya diversikan?&lt;/h2&gt;
&lt;p&gt;Versikan API hanya ketika sebuah perubahan akan merusak pemanggil yang benar. Perubahan aditif,
field baru, endpoint baru, parameter opsional baru, tidak membutuhkan versi; pemanggil yang
ditulis terhadap kontrak lama tetap berfungsi dan kemampuan baru itu ada begitu saja. Sebuah
&lt;a href=&quot;https://changeloop.dev/blog/id/breaking-changes/&quot;&gt;breaking change&lt;/a&gt; membutuhkannya, karena alternatifnya adalah
pemanggil mengetahuinya dari error. Memversikan setiap rilis, termasuk yang aditif, mengajarkan
pemanggil bahwa versi adalah kebisingan, dan mereka berhenti membaca pemberitahuan yang penting.&lt;/p&gt;
&lt;p&gt;Tes praktisnya sama dengan artikel tentang breaking change: jika pemanggil yang hanya mengandalkan
perilaku terdokumentasi harus mengubah sesuatu untuk tetap berfungsi, perubahan itu membutuhkan
versi. Jika tidak, rilis di bawah versi saat ini dan tulis entri changelog.&lt;/p&gt;
&lt;h2&gt;Skema versi API mana yang seharusnya digunakan?&lt;/h2&gt;
&lt;p&gt;Gunakan skema yang paling mudah dilihat dan ditetapkan pemanggil Anda, yang untuk kebanyakan API
publik adalah versi di jalur URL atau header versi bertanggal. Empat skema umum berbeda lebih
sedikit dalam kemampuan daripada dalam apa yang mereka minta dari pemanggil, dan itu dasar yang
tepat untuk memilih.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skema&lt;/th&gt;
&lt;th&gt;Contoh&lt;/th&gt;
&lt;th&gt;Yang harus dilakukan pemanggil&lt;/th&gt;
&lt;th&gt;Siapa yang menggunakan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Jalur URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v2/invoices&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mengubah URL saat bermigrasi&lt;/td&gt;
&lt;td&gt;Kebanyakan API REST publik&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Header versi&lt;/td&gt;
&lt;td&gt;&lt;code&gt;X-GitHub-Api-Version: 2022-11-28&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mengirim header, atau menerima default&lt;/td&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versi akun bertanggal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Stripe-Version: 2026-08-26&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Menetapkan tanggal per permintaan atau per akun&lt;/td&gt;
&lt;td&gt;Stripe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parameter query&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/invoices?version=2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Menambahkan parameter&lt;/td&gt;
&lt;td&gt;API lama; sekarang jarang dipilih&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Media type&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Accept: application/vnd.example.v2+json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bernegosiasi jenis konten&lt;/td&gt;
&lt;td&gt;Purist; sedikit pemanggil bisa mengelola&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Jalur URL&lt;/strong&gt; paling terlihat dan paling tidak fleksibel. Setiap pemanggil bisa melihat versi
mereka dengan membaca baris log, dan lompatan versi adalah cari-dan-ganti. Biayanya: seluruh
permukaan bergerak sekaligus, Anda tidak bisa mengubah kontrak satu endpoint tanpa mencetak versi
baru untuk semuanya, jadi versi jalur cenderung jarang dan besar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Header versi&lt;/strong&gt; menjaga URL tetap stabil dan membiarkan server memilih default untuk pemanggil
yang tidak mengirim apa pun, seperti cara kerja
&lt;a href=&quot;https://docs.github.com/en/rest/about-the-rest-api/api-versions&quot;&gt;versi API REST GitHub&lt;/a&gt;:
versi bernama tanggal dalam &lt;code&gt;X-GitHub-Api-Version&lt;/code&gt;, dengan versi yang didukung tertua sebagai
default agar pemanggil tanpa versi tidak rusak. Biayanya: versinya tidak terlihat dalam URL dan
mudah dilupakan dalam klien baru.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Versi akun bertanggal&lt;/strong&gt; adalah skema header ditambah satu tambahan: versinya disimpan terhadap
akun, sehingga setiap permintaan mendapatkannya tanpa mengirim apa pun.
&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;Versi API Stripe&lt;/a&gt; menetapkan setiap akun ke versi saat
dibuat dan membiarkan permintaan menimpanya dengan &lt;code&gt;Stripe-Version&lt;/code&gt;. Ini skema paling ramah
pemanggil dan paling banyak pekerjaan untuk dijalankan, karena server harus menerjemahkan antara
setiap versi yang didukung dan yang saat ini. Skema Stripe adalah contoh paling terkenal dari
pendekatan tanggal, dan &lt;a href=&quot;https://changeloop.dev/blog/id/stripe-api-versioning/&quot;&gt;cara Stripe memberi versi pada API-nya&lt;/a&gt;
membahasnya langkah demi langkah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameter query&lt;/strong&gt; dan &lt;strong&gt;media type&lt;/strong&gt; keduanya berfungsi dan keduanya gagal dalam tes visibilitas
dengan cara berbeda: parameter query mudah hilang saat membangun URL, dan versi media type tidak
terlihat oleh hampir semua alat yang digunakan pemanggil untuk debug.&lt;/p&gt;
&lt;h2&gt;Bagaimana versi API dilakukan dalam praktik?&lt;/h2&gt;
&lt;p&gt;Dalam praktik versi adalah kumpulan perilaku bernama, dan server memetakan setiap permintaan ke
salah satunya. Langkah-langkahnya sama apa pun skema yang membawa namanya.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Namai versi berdasarkan tanggal atau bilangan bulat, bukan versi semantik.&lt;/strong&gt; API web bukan
paket. Pemanggil tidak bisa menetapkan versi minor dari URL, jadi &lt;code&gt;v2&lt;/code&gt; atau &lt;code&gt;2026-08-26&lt;/code&gt;
mengatakan semua yang dibutuhkan pemanggil, dan &lt;a href=&quot;https://semver.org/&quot;&gt;versi semantik&lt;/a&gt;
menyiratkan janji kompatibilitas yang tidak bisa dipenuhi skema tersebut.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jaga versinya di luar jalur kode yang tidak peduli.&lt;/strong&gt; Versi seharusnya memilih lapisan
terjemahan di tepi, bukan mencabangkan logika bisnis. Dua salinan penuh dari kode basis adalah
bagaimana versi berakhir tidak terpelihara.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Beri setiap versi default dan dokumen.&lt;/strong&gt; Pemanggil yang tidak mengirim versi mendapat yang
paling lama didukung, tidak pernah yang terbaru, sehingga klien yang tidak ditetapkan tidak
rusak pada hari rilis. Setiap versi punya halaman yang mengatakan apa yang berubah dari yang
sebelumnya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tetapkan jendela dukungan dan terbitkan.&lt;/strong&gt;
Panduan versioning Google,
&lt;a href=&quot;https://google.aip.dev/185&quot;&gt;AIP-185&lt;/a&gt;, meminta masa transisi yang wajar dan dikomunikasikan
dengan baik, serta merekomendasikan 180 hari bahkan untuk fungsionalitas beta. Pilih jendela, tulis, dan
terapkan tanpa negosiasi ulang per versi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pensiunkan versi seperti Anda mempensiunkan endpoint.&lt;/strong&gt; Versi yang melewati jendelanya
mendapat perlakuan yang sama dengan &lt;a href=&quot;https://changeloop.dev/blog/id/api-deprecation/&quot;&gt;API yang di-deprecate&lt;/a&gt;: sebuah
pengumuman, header &lt;code&gt;Sunset&lt;/code&gt; (&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8594&quot;&gt;RFC 8594&lt;/a&gt;) di
setiap respons, pengingat di tengah jalan kepada pemanggil yang tersisa, dan tanggal
penghapusan yang dipegang teguh.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Apa itu v1 dan v2 dalam API REST?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;v1&lt;/code&gt; dan &lt;code&gt;v2&lt;/code&gt; adalah nama untuk dua kontrak yang didukung server yang sama pada saat bersamaan.
&lt;code&gt;v2&lt;/code&gt; ada karena sesuatu di &lt;code&gt;v1&lt;/code&gt; tidak bisa diubah tanpa merusak pemanggilnya, jadi perubahannya
masuk ke kontrak baru dan yang lama tetap berfungsi. Angka-angka itu tidak menyiratkan bahwa &lt;code&gt;v2&lt;/code&gt;
lengkap atau &lt;code&gt;v1&lt;/code&gt; mati; keduanya hanya benar jika dokumentasi mengatakannya. &lt;code&gt;v3&lt;/code&gt; yang muncul
setiap kuartal adalah tanda bahwa perubahan aditif sedang diversikan, atau bahwa kontraknya tidak
pernah dirancang untuk menyerap perubahan. gRPC
menyelesaikan masalah yang sama secara berbeda: &lt;a href=&quot;https://changeloop.dev/blog/id/grpc-protobuf-api-changes/&quot;&gt;perubahan API gRPC dan Protobuf&lt;/a&gt;
membahas versi lewat nama paket dalam berkas &lt;code&gt;.proto&lt;/code&gt; alih-alih jalur URL, dan format wire di
mana mengganti nama field gratis tapi menomorinya ulang adalah breaking change yang tidak akan
dikenali pemanggil REST mana pun sebagai berisiko.&lt;/p&gt;
&lt;h2&gt;Apa yang harus diumumkan perubahan versi?&lt;/h2&gt;
&lt;p&gt;Perubahan versi harus mengumumkan apa yang rusak, siapa yang terdampak, cara bermigrasi, dan
berapa lama versi sebelumnya tetap berfungsi. Entrinya punya bentuk yang sama dengan entri
breaking change lainnya, ditambah satu baris menyatakan jendela dukungan. Berikut satu untuk API
yang diversikan dengan header:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Versi API 2026-11-01 tersedia. Versi 2025-06-15 didukung hingga 1 November 2027.&lt;/strong&gt;
Baru di 2026-11-01: &lt;code&gt;GET /invoices&lt;/code&gt; mengembalikan &lt;code&gt;amount&lt;/code&gt; dalam unit terkecil sebagai bilangan
bulat alih-alih string desimal, dan field yang di-deprecate &lt;code&gt;customer_name&lt;/code&gt; dihapus demi objek
&lt;code&gt;customer&lt;/code&gt;. Memengaruhi pemanggil di 2025-06-15 yang mengurai &lt;code&gt;amount&lt;/code&gt; sebagai string, yang
merupakan default untuk klien tidak ditetapkan yang dibuat sebelum Juni 2025. Migrasi: uraikan
&lt;code&gt;amount&lt;/code&gt; sebagai bilangan bulat dan baca namanya dari &lt;code&gt;customer.name&lt;/code&gt;. Tetapkan
&lt;code&gt;X-Api-Version: 2026-11-01&lt;/code&gt; saat Anda siap. Tidak ada yang berubah untuk pemanggil yang tidak
menetapkan versi.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kalimat terakhir itu yang memungkinkan kebanyakan pembaca berhenti membaca, dan itu milik setiap
pengumuman versi. Halaman &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;contoh changelog&lt;/a&gt; menyertakan entri dari API yang
memversikan seperti ini, dan perbedaan antara yang baik dan sisanya sebagian besar ada di kalimat
terakhir itu.&lt;/p&gt;
&lt;h2&gt;Siapa yang diberi tahu ketika versi berubah?&lt;/h2&gt;
&lt;p&gt;Semua orang di versi lama, secara individu, dan changelog untuk semua orang lainnya. Perubahan
versi adalah satu-satunya kasus di mana &amp;quot;kami memposting tentang itu&amp;quot; dijamin akan melewatkan
tepat pemanggil yang penting: mereka yang menetapkan versi dua tahun lalu dan belum membaca
catatan rilis sejak itu. Data penggunaan menjawab siapa mereka; pemberitahuannya harus mencapai
mereka di mana kode mereka berada, dalam header respons dan dalam pesan kepada pemilik akun.&lt;/p&gt;
&lt;p&gt;Dalam lingkaran yang kami jalankan, entri yang mengumumkan versi disusun dari pull request yang
merilisnya, ditinjau oleh seseorang, dan diterbitkan di &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;feed dan widget&lt;/a&gt;, tempat klien
berversi bisa membacanya sebagai JSON. Siapa pun yang masukan widget-nya meminta perubahan itu,
atau melaporkan bug yang diselesaikannya, dan menjadi issue GitHub yang ditutup oleh pull request,
diberi tahu di issue tersebut segera setelah entrinya live. Mekanismenya sama dengan entri mana pun; lompatan versi hanyalah entri dengan
taruhan tertinggi.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Haruskah setiap perubahan API mendapat versi baru?&lt;/strong&gt;
Tidak. Hanya breaking change. Perubahan aditif dirilis di bawah versi saat ini dengan entri
changelog. Memversikan perubahan aditif melatih pemanggil untuk mengabaikan versi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah versi URL lebih baik daripada versi header?&lt;/strong&gt;
Versi URL lebih mudah dilihat pemanggil dan lebih sulit bagi Anda untuk berkembang sedikit demi
sedikit; versi header sebaliknya. Untuk API publik dengan banyak klien kecil, versi URL gagal
lebih sedikit. Untuk API besar dengan lapisan terjemahan, versi bertanggal berbasis header
berskala lebih baik.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Berapa banyak versi yang seharusnya didukung sekaligus?&lt;/strong&gt;
Sesedikit yang diizinkan jendela dukungan Anda, dan tidak pernah jumlah tak terbatas. Dua atau
tiga versi bersamaan itu normal; lebih dari itu biasanya berarti versi tidak dipensiunkan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa yang seharusnya diterima permintaan tanpa versi?&lt;/strong&gt;
Versi yang paling lama didukung, sehingga klien yang ada dan tidak ditetapkan tetap berfungsi,
dengan header respons yang memberi tahu mereka versi mana yang mereka terima.&lt;/p&gt;
</content:encoded></item><item><title>Breaking change: apa yang terhitung dan cara merilisnya</title><link>https://changeloop.dev/blog/id/breaking-changes/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/breaking-changes/</guid><description>Breaking change adalah perubahan yang tidak bisa dilalui pemanggil yang benar. Apa yang terhitung, apa yang tidak, cara menangkapnya di CI, dan merilisnya.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Breaking change adalah perubahan yang tidak bisa dilalui pemanggil yang ditulis dengan benar.
Definisi ini penting karena kebanyakan perdebatan tentang apakah sesuatu &amp;quot;terhitung&amp;quot; sebenarnya
adalah perdebatan tentang siapa yang salah pegang. Jika pemanggil mengikuti dokumentasi Anda dan
perubahan Anda membuat kodenya berhenti bekerja, perubahan itu breaking. Apa yang Anda maksudkan
tidak ada hubungannya dengan itu.&lt;/p&gt;
&lt;p&gt;Itu seluruh tesnya. Sisa artikel ini adalah apa yang muncul darinya: apa yang gagal tes, apa yang
lolos, cara menangkap kegagalan sebelum di-merge, dan apa yang harus dilakukan begitu Anda tahu
sedang merilis satu.&lt;/p&gt;
&lt;h2&gt;Apa yang terhitung sebagai breaking change?&lt;/h2&gt;
&lt;p&gt;Terapkan tes ke pemanggil, bukan ke diff. Perubahan bersifat breaking ketika pemanggil yang hanya
mengandalkan perilaku terdokumentasi harus mengubah kode, konfigurasi atau datanya untuk tetap
berfungsi. Menghapus field, mengganti nama endpoint, memperketat validasi, mengubah default dan
mengubah jenis nilai semuanya memenuhi syarat. Menambahkan field opsional tidak. Memperbaiki bug
biasanya tidak, dengan satu pengecualian penting di bawah.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Perubahan&lt;/th&gt;
&lt;th&gt;Breaking?&lt;/th&gt;
&lt;th&gt;Mengapa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Menghapus atau mengganti nama field, endpoint, flag atau opsi&lt;/td&gt;
&lt;td&gt;Ya&lt;/td&gt;
&lt;td&gt;Pemanggil yang benar merujuknya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menambahkan field opsional atau endpoint baru&lt;/td&gt;
&lt;td&gt;Tidak&lt;/td&gt;
&lt;td&gt;Panggilan yang ada tidak berubah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Membuat input opsional menjadi wajib&lt;/td&gt;
&lt;td&gt;Ya&lt;/td&gt;
&lt;td&gt;Panggilan yang melewatkannya sekarang gagal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memperketat validasi yang sebelumnya diterima&lt;/td&gt;
&lt;td&gt;Ya&lt;/td&gt;
&lt;td&gt;Input yang berhasil sekarang ditolak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mengubah nilai default&lt;/td&gt;
&lt;td&gt;Ya&lt;/td&gt;
&lt;td&gt;Pemanggil yang tidak mengaturnya mendapat perilaku baru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mengubah jenis (string ke angka, nilai tunggal ke array)&lt;/td&gt;
&lt;td&gt;Ya&lt;/td&gt;
&lt;td&gt;Parser yang ditulis untuk jenis terdokumentasi gagal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mengurutkan ulang kunci sebuah objek&lt;/td&gt;
&lt;td&gt;Tidak&lt;/td&gt;
&lt;td&gt;Kecuali Anda mendokumentasikan urutannya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memperbaiki bug yang diandalkan pemanggil&lt;/td&gt;
&lt;td&gt;Praktiknya ya&lt;/td&gt;
&lt;td&gt;Lihat bagian tentang kontrak tak sengaja&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menaikkan batas laju atau batas ukuran&lt;/td&gt;
&lt;td&gt;Tidak&lt;/td&gt;
&lt;td&gt;Tidak ada yang berhasil berhenti berfungsi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menurunkan batas laju atau batas ukuran&lt;/td&gt;
&lt;td&gt;Ya&lt;/td&gt;
&lt;td&gt;Lalu lintas yang baik-baik saja sekarang dibatasi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mengubah kata-kata pesan error&lt;/td&gt;
&lt;td&gt;Tergantung&lt;/td&gt;
&lt;td&gt;Breaking jika Anda mendokumentasikannya atau pemanggil mencocokkan itu&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apa yang bukan breaking change?&lt;/h2&gt;
&lt;p&gt;Perubahan bersifat non-breaking ketika setiap panggilan yang berhasil sebelumnya tetap berhasil,
tanpa berubah, dan tetap bermakna sama. Menambahkan endpoint baru, menambahkan parameter permintaan
opsional, menambahkan field ke respons, membuat input wajib menjadi opsional, menaikkan batas dan
memperbaiki pesan error yang tidak dicocokkan siapa pun semuanya lolos tes. Perubahan aditif ini
bisa dirilis dalam rilis minor dengan entri changelog biasa.&lt;/p&gt;
&lt;p&gt;Perubahan aditif tetap bisa merusak pemanggil dalam tiga situasi. Klien yang deserializer-nya
menolak field tak dikenal gagal pada field respons baru pertama, jadi dokumentasikan sejak awal
bahwa pemanggil harus mengabaikan field yang tidak mereka kenali. Nilai enum baru merusak setiap
pemanggil dengan switch yang menyeluruh (lebih lanjut di bawah). Dan respons yang membesar bisa
mendorong pemanggil melewati batas ukuran, timeout atau lebar kolom yang tidak pernah harus mereka
pikirkan.&lt;/p&gt;
&lt;p&gt;Empat baris tabel layak dilihat lebih dekat, karena di situlah ketidaksepakatan terjadi.&lt;/p&gt;
&lt;h2&gt;Empat breaking change yang terlewat tim&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Kontrak tak sengaja.&lt;/strong&gt; Jika API Anda telah mengembalikan field yang sama, tidak
terdokumentasi, selama tiga tahun, seorang pemanggil telah membangun di atasnya.
&lt;a href=&quot;https://www.hyrumslaw.com/&quot;&gt;Hukum Hyrum&lt;/a&gt; adalah versi singkatnya: dengan cukup banyak pengguna,
setiap perilaku yang bisa diamati dari sistem Anda akan diandalkan seseorang. Itulah mengapa
&amp;quot;itu perbaikan bug&amp;quot; bukan pembelaan. Perbaikannya mungkin benar dan tetap saja breaking.
Rilis itu sebagai satu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Perubahan perilaku tanpa perubahan skema.&lt;/strong&gt; Field-nya masih ada, jenisnya sama, dan nilainya
sekarang berarti sesuatu yang berbeda. &lt;code&gt;status&lt;/code&gt; yang dulunya &lt;code&gt;active&lt;/code&gt; atau &lt;code&gt;inactive&lt;/code&gt; dan sekarang
juga mengembalikan &lt;code&gt;suspended&lt;/code&gt; merusak setiap pemanggil dengan switch yang menyeluruh. Timestamp
yang pindah dari waktu lokal ke UTC merusak siapa pun yang tidak membaca dokumen dua kali. Tidak
ada di diff berkas OpenAPI yang menunjukkan ini.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Validasi yang diperketat.&lt;/strong&gt; Anda mulai menolak email tanpa TLD, atau spasi di akhir, atau nama
lebih dari 80 karakter. Setiap pemanggil yang mengirim tepat itu sekarang mendapat 400 untuk
permintaan yang berhasil minggu lalu. Perubahan validasi adalah yang paling umum dirilis sebagai
perbaikan &amp;quot;pengerasan&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Default yang berubah.&lt;/strong&gt; Tidak ada yang menyetel nilai secara eksplisit yang menyadari apa pun.
Semua yang tidak melakukannya, yang merupakan kebanyakan pemanggil, mendapat perilaku baru tanpa
mengubah satu baris pun. Default yang berubah merusak mayoritas pengguna Anda tepatnya karena
mereka tidak pernah melihat pengaturannya.&lt;/p&gt;
&lt;h2&gt;Bagaimana cara mendeteksi breaking change sebelum dirilis?&lt;/h2&gt;
&lt;p&gt;Bandingkan kontrak pada pull request dengan kontrak pada branch utama, di CI, dan gagalkan build
jika ada perbedaan yang breaking. Alat diff skema tersedia untuk sebagian besar format antarmuka,
dan masing-masing tahu aturan breaking dari formatnya sendiri:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Antarmuka&lt;/th&gt;
&lt;th&gt;Alat&lt;/th&gt;
&lt;th&gt;Yang dibandingkan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;REST (OpenAPI)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/oasdiff/oasdiff&quot;&gt;oasdiff&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Dua spesifikasi OpenAPI, dengan laporan breaking change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gRPC (Protobuf)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://buf.build/docs/breaking/&quot;&gt;buf breaking&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Berkas &lt;code&gt;.proto&lt;/code&gt;, pada tingkat wire atau sumber&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GraphQL&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/kamilkisiela/graphql-inspector&quot;&gt;GraphQL Inspector&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Dua skema, menandai perubahan breaking dan berbahaya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crate Rust&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/obi1kenobi/cargo-semver-checks&quot;&gt;cargo-semver-checks&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;API publik terhadap versi terbitan terakhir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paket TypeScript&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://api-extractor.com/&quot;&gt;API Extractor&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Laporan API publik paket yang di-commit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Alat-alat ini menangkap field yang dihapus, operasi yang diganti nama dan jenis yang berubah
dengan andal. Mereka tidak bisa melihat dua jenis pertama dari empat di atas, kontrak tak sengaja
atau perubahan perilaku, karena keduanya tidak muncul di skema. Gunakan alatnya untuk menghentikan
yang jelas dan pertanyaan tinjauan &amp;quot;bisakah pemanggil yang benar menyadari ini?&amp;quot; untuk sisanya.
Job CI yang sama adalah tempat alami untuk mewajibkan entri changelog, seperti dijelaskan di
&lt;a href=&quot;https://changeloop.dev/blog/id/changelog-ci-enforcement/&quot;&gt;menegakkan entri changelog di CI&lt;/a&gt;, dan
&lt;a href=&quot;https://changeloop.dev/blog/id/grpc-protobuf-api-changes/&quot;&gt;perubahan API gRPC dan Protobuf&lt;/a&gt; membahas kasus tingkat
wire.&lt;/p&gt;
&lt;h2&gt;Bagaimana cara menandai breaking change di commit?&lt;/h2&gt;
&lt;p&gt;Dengan &lt;a href=&quot;https://www.conventionalcommits.org/en/v1.0.0/&quot;&gt;Conventional Commits&lt;/a&gt;, breaking change
ditandai dengan &lt;code&gt;!&lt;/code&gt; sebelum titik dua (&lt;code&gt;feat(api)!: remove the legacy export endpoint&lt;/code&gt;) atau dengan
footer yang diawali &lt;code&gt;BREAKING CHANGE:&lt;/code&gt; diikuti deskripsi. Keduanya dipetakan ke versi major. Tulis
footer sebagai draf pertama entri changelog, dengan menyebut siapa yang terdampak dan apa yang
harus mereka lakukan. &lt;a href=&quot;https://changeloop.dev/blog/id/conventional-commits-changelog/&quot;&gt;Conventional commits dan changelog&lt;/a&gt;
membahas sejauh mana konvensi itu membantu Anda.&lt;/p&gt;
&lt;p&gt;Aturan yang sama berlaku untuk pustaka. Fungsi publik yang dihapus, jenis parameter yang
dipersempit atau nilai kembalian yang berubah adalah versi major di bawah versi semantik. Pustaka
tidak selalu mengikutinya: sebuah
&lt;a href=&quot;https://arxiv.org/abs/2110.07889&quot;&gt;studi atas 119.879 peningkatan versi di Maven Central&lt;/a&gt;
menemukan 16,6% melanggar versi semantik, namun hanya 7,9% proyek klien yang terdampak, karena
sebagian besar perubahan itu menyentuh kode yang tidak dipanggil klien mana pun. Kerusakan diukur
di pemanggil.&lt;/p&gt;
&lt;h2&gt;Bagaimana cara merilis breaking change?&lt;/h2&gt;
&lt;p&gt;Anda merilisnya secara terbuka, dengan tanggal, dengan jalur. Langkah-langkah di bawah ini
berurutan, dan yang terakhir adalah yang paling sering dilewati tim: memberi tahu orang yang
terdampak bahwa hal yang mereka tunggu sekarang telah terjadi.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Putuskan apakah itu satu.&lt;/strong&gt; Gunakan tes di atas, bukan diff. Jika dua insinyur tidak
sepakat, itu breaking; ketidaksepakatan itu bukti bahwa pemanggil bisa saja secara wajar
mengandalkan perilaku lama.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Versikan.&lt;/strong&gt; Di bawah &lt;a href=&quot;https://semver.org/&quot;&gt;versi semantik&lt;/a&gt; breaking change adalah versi
major. Jika Anda menjalankan API bertanggal atau berversi, itu masuk ke versi baru dan yang
lama tetap berfungsi hingga tanggal yang dinyatakan. Jika Anda tidak bisa memversi, Anda tidak
merilis breaking change, Anda merilis gangguan dengan entri changelog. Skema mana yang membawa
versinya adalah subjek dari
&lt;a href=&quot;https://changeloop.dev/blog/id/api-versioning-best-practices/&quot;&gt;praktik terbaik versi API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tulis entri sebelum kode di-merge.&lt;/strong&gt; Entri punya bentuk tetap: apa yang berubah, siapa yang
terdampak, apa yang harus mereka lakukan, dan sampai kapan. Jika Anda tidak bisa mengisi
keempatnya, perubahan belum siap. &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;Template release notes&lt;/a&gt; meletakkan
entri ini pertama, dengan tanggal alih-alih nomor versi, tepatnya karena ini.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Berikan tenggat waktu, bukan nomor rilis.&lt;/strong&gt; &amp;quot;Dihapus di v5&amp;quot; tidak berarti apa-apa bagi yang
tidak melacak rilis Anda. &amp;quot;Berhenti berfungsi pada 1 November 2026&amp;quot; berarti hal yang sama
untuk semua orang.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sediakan migrasinya.&lt;/strong&gt; Contoh kode dari panggilan lama di samping yang baru. Jika
perubahannya adalah penggantian nama, sebutkan kedua nama di kalimat yang sama. Jika field yang
dihapus, katakan ke mana datanya pergi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Umumkan di mana pun perilaku lama didokumentasikan.&lt;/strong&gt; Changelog, halaman dokumen yang
menjelaskan endpoint, release notes SDK, dan header deprecation di respons jika Anda punya
satu.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tutup lingkarannya.&lt;/strong&gt; Jika pelanggan meminta perubahan, atau melaporkan bug yang
menyebabkannya, beri tahu mereka saat dirilis.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Seperti apa entri breaking change yang baik?&lt;/h2&gt;
&lt;p&gt;Entri yang baik menyebutkan pemanggil yang terdampak di baris pertama, menyatakan tanggalnya, dan
menyertakan perbaikannya. Berikut satu untuk kasus validasi yang diperketat, dalam bentuk yang
kami gunakan:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Alamat email tanpa domain ditolak mulai 1 November 2026.&lt;/strong&gt;
&lt;code&gt;POST /users&lt;/code&gt; dan &lt;code&gt;PATCH /users/:id&lt;/code&gt; saat ini menerima nilai &lt;code&gt;email&lt;/code&gt; seperti
&lt;code&gt;alice@localhost&lt;/code&gt;. Mulai 1 November, ini mengembalikan &lt;code&gt;400 invalid_email&lt;/code&gt;. Memengaruhi
integrasi mana pun yang membuat pengguna dari direktori internal. Migrasi: kirim alamat yang
sepenuhnya memenuhi syarat, atau lewatkan field-nya dan atur kemudian. Tidak perlu perubahan
jika alamat Anda sudah punya domain, yang berlaku untuk 99,4% akun yang dibuat tahun ini.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Di mana pemberitahuan ini seharusnya berada, dan apa lagi yang seharusnya menyertainya, dibahas di
&lt;a href=&quot;https://changeloop.dev/blog/id/api-changelog/&quot;&gt;changelog API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Persentase di akhir bukan hiasan. Itu memberi tahu pembaca apakah mereka harus khawatir, yang
merupakan pertanyaan saat mereka membuka entri.&lt;/p&gt;
&lt;h2&gt;Mengapa tidak menghindarinya saja?&lt;/h2&gt;
&lt;p&gt;Karena alternatifnya lebih buruk. API yang tidak pernah merusak apa pun menumpuk setiap kesalahan
yang pernah dibuatnya: field yang salah nama, default yang salah, timestamp dalam waktu lokal.
Masing-masing adalah pajak bagi setiap pemanggil baru selamanya, untuk melindungi pemanggil yang
bisa saja bermigrasi dalam satu sore. Tim dengan reputasi stabilitas terbaik merusak sesuatu
jarang, sesuai jadwal, dengan jalur migrasi dan peringatan yang mencapai orang-orang yang
dituju.&lt;/p&gt;
&lt;p&gt;Mekanisme peringatan itu dibahas di &lt;a href=&quot;https://changeloop.dev/blog/id/api-deprecation/&quot;&gt;men-deprecate API&lt;/a&gt;. Entri itu
sendiri disusun seperti entri lain mana pun di &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;feed changelog&lt;/a&gt;: dari pull request yang
di-merge, ditahan untuk manusia, lalu diterbitkan di tempat pemanggil yang terdampak sudah membaca.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apa perbedaan antara perubahan breaking dan non-breaking?&lt;/strong&gt;
Perubahan breaking memaksa pemanggil yang benar mengubah kode, konfigurasi atau datanya agar tetap
berfungsi. Perubahan non-breaking membiarkan setiap panggilan yang ada tetap berfungsi dengan makna
yang sama, itulah mengapa penambahan biasanya aman dan penghapusan, penggantian nama serta aturan
yang diperketat biasanya tidak.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah menambahkan field wajib terhitung?&lt;/strong&gt;
Ya. Setiap panggilan yang ada melewatkannya, jadi setiap panggilan yang ada sekarang gagal.
Tambahkan sebagai opsional dengan default yang masuk akal, atau versikan endpoint-nya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah perbaikan bug terhitung?&lt;/strong&gt;
Bisa jadi. Jika pemanggil mengandalkan perilaku yang bug, memperbaikinya merusak mereka, apa pun
yang dikatakan dokumentasi. Perlakukan perbaikan apa pun yang mengubah keluaran yang bisa diamati
sebagai breaking kecuali Anda bisa menunjukkan tidak ada yang mengandalkannya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah versi semantik berlaku untuk API web?&lt;/strong&gt;
Aturannya iya: breaking change mendapat versi major baru dan yang lama tetap berfungsi selama
periode yang dinyatakan. Nomornya sering berada di URL atau header tanggal alih-alih versi paket.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Berapa banyak pemberitahuan yang cukup?&lt;/strong&gt;
Cukup bagi pemanggil untuk menemukan pemberitahuan dan melakukan pekerjaannya. Sembilan puluh
hari adalah batas bawah umum untuk API publik; lebih lama untuk apa pun yang digunakan dalam kode
yang dikirim ke pengguna akhir dan tidak bisa diperbarui dari jarak jauh.&lt;/p&gt;
</content:encoded></item><item><title>Menutup lingkaran umpan balik dari sisi changelog</title><link>https://changeloop.dev/blog/id/customer-feedback-loop/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/customer-feedback-loop/</guid><description>Lingkaran umpan balik tertutup saat peminta tahu fiturnya sudah dirilis. Empat langkahnya, di mana ia putus, dan mengapa changelog tempat yang tepat.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Lingkaran umpan balik pelanggan tertutup ketika orang yang memberi umpan balik diberi tahu apa
yang terjadi padanya. Bukan saat itu dicatat. Bukan saat diprioritaskan. Bahkan bukan saat
dirilis. Saat diberi tahu kepadanya. Kebanyakan tim melakukan tiga langkah pertama dengan baik dan
langkah terakhir sama sekali tidak, lalu bertanya-tanya mengapa orang yang mengirim umpan balik
berhenti mengirimnya.&lt;/p&gt;
&lt;p&gt;Artikel ini membahas langkah terakhir itu, dan sebuah klaim konkret: changelog adalah tempat yang
tepat untuk menutup lingkaran, karena itu satu-satunya artefak yang sudah ada tepat di saat
lingkaran itu bisa ditutup.&lt;/p&gt;
&lt;h2&gt;Apa itu lingkaran umpan balik pelanggan?&lt;/h2&gt;
&lt;p&gt;Lingkaran umpan balik pelanggan adalah jalur dari pengguna yang memberi tahu Anda sesuatu hingga
pengguna itu mengetahui apa yang Anda lakukan tentang itu. Ada empat langkah: mengumpulkan umpan
balik, memutuskan apa yang harus dilakukan dengannya, merilis hasilnya, dan memberi tahu orang
yang meminta. Lingkarannya terbuka hingga langkah keempat terjadi. Tim yang mengumpulkan umpan
balik dan merilis perbaikan tapi tidak pernah memberi tahu siapa pun punya kotak masuk, bukan
lingkaran.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Langkah&lt;/th&gt;
&lt;th&gt;Apa yang terjadi&lt;/th&gt;
&lt;th&gt;Di mana biasanya rusak&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Mengumpulkan&lt;/td&gt;
&lt;td&gt;Umpan balik datang: widget, dukungan, penjualan, wawancara&lt;/td&gt;
&lt;td&gt;Tidak ada; setiap tim melakukan ini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memutuskan&lt;/td&gt;
&lt;td&gt;Ditriase, digabung dengan duplikat, diterima atau ditolak&lt;/td&gt;
&lt;td&gt;Penolakan tidak pernah dikomunikasikan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merilis&lt;/td&gt;
&lt;td&gt;Seseorang membangunnya dan menjadikannya live&lt;/td&gt;
&lt;td&gt;Tautan ke permintaan hilang saat merge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memberi tahu&lt;/td&gt;
&lt;td&gt;Peminta mengetahui itu sudah dirilis&lt;/td&gt;
&lt;td&gt;Dilewati, atau hanya dilakukan untuk peminta paling berisik&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Baris keempat itulah yang dibahas artikel ini. Rusak karena alasan struktural, bukan budaya: pada
saat sebuah fitur dirilis, permintaan yang menyebabkannya hidup di sistem yang berbeda dari hal
yang dirilis, dan menghubungkan keduanya bukan tugas siapa pun. Lingkaran itu dimulai lebih awal,
dengan cara permintaan diajukan sejak awal;
&lt;a href=&quot;https://changeloop.dev/blog/id/how-to-ask-for-customer-feedback/&quot;&gt;cara meminta umpan balik pelanggan&lt;/a&gt; membahas kalimat dan
waktunya.&lt;/p&gt;
&lt;h2&gt;Mengapa lingkaran umpan balik tetap terbuka?&lt;/h2&gt;
&lt;p&gt;Lingkaran umpan balik tetap terbuka karena permintaan dan perubahan yang dirilis hidup di tempat
yang berbeda dan tautan di antara keduanya dibuat secara manual, jika dibuat. Permintaan ada di
alat umpan balik, kotak dukungan atau spreadsheet. Perubahannya ada di pull request. Pengumumannya
ada di changelog atau email. Tiga sistem, tiga pemilik, dan tautan dari yang ketiga kembali ke
yang pertama adalah seseorang yang mengingat, berbulan-bulan kemudian, siapa yang meminta.&lt;/p&gt;
&lt;p&gt;Ada alasan kedua. Langkah memberi tahu biasanya dibingkai sebagai tugas pemasaran (&amp;quot;mengumumkan
fitur&amp;quot;) daripada tugas dukungan (&amp;quot;membalas orangnya&amp;quot;). Pengumuman pergi ke semua orang dan tidak
mencapai siapa pun secara khusus. Orang yang meminta fitur pada Maret membaca pengumumannya pada
Juni, jika mereka membacanya, sebagai berita, bukan sebagai balasan. Lingkarannya hanya tertutup
jika pesannya ditujukan kepada mereka.&lt;/p&gt;
&lt;h2&gt;Mengapa menutup lingkaran dari sisi changelog?&lt;/h2&gt;
&lt;p&gt;Karena entri changelog adalah satu-satunya artefak yang ada tepat pada momen yang benar,
mengandung kata-kata yang tepat, dan ditulis oleh orang yang tepat. Ada saat perubahan itu live
dan tidak sebelumnya. Mengatakan apa yang berubah dalam bahasa pembaca, yang merupakan pesan yang
dibutuhkan peminta. Dan ditulis oleh seseorang yang baru saja membaca pull request, yang merupakan
satu-satunya momen di mana tautan ke permintaan asli masih terlihat.&lt;/p&gt;
&lt;p&gt;Bandingkan alternatifnya. Menutup lingkaran dari alat umpan balik berarti alat umpan balik perlu
tahu kapan fitur dirilis, yang berarti seseorang memperbarui status secara manual. Menutupnya dari
pull request berarti memberi tahu pelanggan saat merge, sebelum perubahannya live, sebuah janji
yang rusak dengan stempel waktu segera setelah deployment tertunda. Menutupnya dari pengumuman
pemasaran berarti menunggu satu, dan kebanyakan perubahan yang dirilis tidak pernah mendapatkannya.&lt;/p&gt;
&lt;p&gt;Changelog berada di tengah: setelah merge, pada saat rilis, dengan formulasi sudah siap.&lt;/p&gt;
&lt;h2&gt;Bagaimana lingkarannya tertutup, langkah demi langkah&lt;/h2&gt;
&lt;p&gt;Ini mekanisme yang kami jalankan. Digambarkan di sini sebagai spesifikasi alih-alih tur produk,
karena setiap langkah bisa dilakukan secara manual atau dengan alat lain; yang penting adalah
urutannya.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Umpan balik menjadi issue di repositori yang akan memperbaikinya.&lt;/strong&gt; Pengiriman widget dicatat
sebagai issue GitHub berlabel (&lt;code&gt;feature-request&lt;/code&gt; atau &lt;code&gt;bug&lt;/code&gt;, satu prioritas, dan
&lt;code&gt;from-widget&lt;/code&gt;), dengan alamat email pengirim tidak dimasukkan ke badan issue. Issue-nya hidup
di sebelah kode, sehingga langkah tiga bisa menemukannya. Issue yang dibuat manual, misalnya dari
&lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-template/&quot;&gt;template permintaan fitur&lt;/a&gt;, berada di luar jalur ini:
langkah lima tidak mengomentarinya, jadi tutup lingkaran itu sendiri.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perbaikannya merujuk ke issue.&lt;/strong&gt; Pull request mengatakan &lt;code&gt;Fixes #142&lt;/code&gt;, kata kunci penutupan
milik GitHub sendiri. Tidak ada yang baru untuk dipelajari, dan itu kalimat yang sama yang
sudah ditulis developer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entri changelog disusun dari pull request yang di-merge dan membawa tautannya.&lt;/strong&gt; Saat merge,
draf dibuat dan &lt;code&gt;#142&lt;/code&gt; dibaca dari badan PR dan dilampirkan ke draf. Tautannya dibuat selagi
masih murah, oleh mesin, dari data yang sudah ada di sana.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seseorang meninjau entrinya.&lt;/strong&gt; Formulasi, audiens, apakah itu perlu diterbitkan sama sekali.
Draf yang dibuang tidak menutup apa-apa, yang benar: refactor internal yang kebetulan merujuk
issue bukanlah berita.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Saat disetujui, peminta diberi tahu.&lt;/strong&gt; Komentar diterbitkan di issue yang berasal dari umpan
baliknya, &amp;quot;Shipped —&amp;quot; diikuti judul entri dan tautan ke entri yang diterbitkan, dan widget
menampilkan entri rilis yang sama kepada pengirimnya. Sekali, tidak pernah dua kali, dan
hanya setelah seseorang menerbitkan entrinya. Entri yang sama keluar melalui
&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;feed dan widget&lt;/a&gt; ke semua orang yang tidak meminta.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Urutan di langkah lima itulah seluruh desainnya. Memberi tahu peminta saat merge akan lebih awal
dan lebih mudah, dan akan salah sekitar sesering deployment tertunda. Feature flag merusak bahkan
urutan ini, karena disetujui dan dipublikasikan bisa terjadi sementara fitur itu masih tidak
terlihat bagi akun peminta; &lt;a href=&quot;https://changeloop.dev/blog/id/feature-flags-feature-requests/&quot;&gt;feature flag dan permintaan fitur&lt;/a&gt;
membahas pemeriksaan tambahan yang dibutuhkan langkah ini begitu ada flag terlibat.&lt;/p&gt;
&lt;h2&gt;Seperti apa lingkaran tertutup bagi pelanggan?&lt;/h2&gt;
&lt;p&gt;Terlihat seperti balasan. Pelanggan mengirim permintaan melalui widget, dan suatu hari widget
menampilkannya sebagai sudah dirilis, dengan tautan ke entri yang menjelaskannya dalam bahasa
mereka; di GitHub, issue-nya menerima kabar yang sama sebagai komentar. Mereka tidak berlangganan newsletter, tidak
memeriksa roadmap, tidak mencari di changelog. Mereka diberi tahu.&lt;/p&gt;
&lt;p&gt;Itulah pengalaman yang membuat potongan umpan balik berikutnya terjadi. Orang mengirim umpan balik
ke produk yang membalas. Halaman &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;contoh changelog&lt;/a&gt; menyertakan entri dari
tim yang penggunanya terlihat terus kembali dengan permintaan, dan benang merahnya bukan alatnya;
itu karena entrinya terbaca seperti balasan.&lt;/p&gt;
&lt;h2&gt;Bagaimana cara mengukur lingkaran umpan balik?&lt;/h2&gt;
&lt;p&gt;Ukur fraksi perubahan yang dirilis yang memberi tahu setidaknya satu peminta, dan waktu dari
rilis hingga pemberitahuan. Dua angka, keduanya mudah begitu tautannya ada dan mustahil
sebelumnya.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tingkat penutupan&lt;/strong&gt;: dari entri changelog yang diterbitkan bulan ini, berapa banyak yang
menautkan setidaknya satu permintaan, dan dari itu, berapa banyak yang memberi tahu peminta.
Jika angka kedua jauh lebih rendah dari yang pertama, notifikasi gagal; jika yang pertama
rendah, permintaan tidak dirujuk dari pull request, dan perbaikannya adalah satu kalimat di
template PR.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Waktu dari rilis hingga pemberitahuan&lt;/strong&gt;: berapa lama antara entrinya menjadi live dan
pemberitahuan ke peminta. Dengan mekanisme di atas itu detik. Secara manual biasanya minggu,
atau tidak pernah, dan &amp;quot;tidak pernah&amp;quot; adalah angka yang penting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jangan mengukur lingkaran berdasarkan volume umpan balik yang dikumpulkan. Mengumpulkan adalah
langkah mudah, dan tim yang mengukurnya akan mengoptimalkannya, yang menghasilkan lebih banyak
lingkaran terbuka.&lt;/p&gt;
&lt;h2&gt;Di mana roadmap cocok?&lt;/h2&gt;
&lt;p&gt;Roadmap publik adalah cara menutup lingkaran lebih awal: memberi tahu peminta bahwa permintaan
mereka didengar, sebelum dirilis. Ini berguna, dan tidak menggantikan langkah terakhir.
&amp;quot;Direncanakan&amp;quot; adalah janji tentang masa depan; &amp;quot;Dirilis&amp;quot; adalah fakta tentang masa
kini. Jalankan &lt;a href=&quot;https://changeloop.dev/blog/id/public-roadmap/&quot;&gt;roadmap publik&lt;/a&gt; dari issue yang sama, dengan satu label
per kolom, sehingga permintaan yang sama bergerak dari direncanakan ke dirilis tanpa dimasukkan
ulang di mana pun. Perpindahan ke dirilis adalah perubahan label (&lt;code&gt;roadmap:shipped&lt;/code&gt;) yang tidak
dilakukan siapa pun untuk Anda saat entri disetujui, jadi lakukan di tinjauan yang sama.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apa saja empat langkah lingkaran umpan balik pelanggan?&lt;/strong&gt;
Mengumpulkan, memutuskan, merilis, memberi tahu. Lingkarannya terbuka hingga langkah keempat
terjadi. Kebanyakan kerangka kerja menambahkan langkah analisis dan prioritisasi di tengah; itu
adalah penyempurnaan dari &amp;quot;memutuskan&amp;quot;, dan tidak ada satu pun yang menutup apa pun.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah pelanggan diberi tahu ketika permintaan ditolak?&lt;/strong&gt;
Ya, dan itu pesan yang paling diabaikan dalam lingkaran. &amp;quot;Kami tidak akan melakukan ini, dan ini
alasannya&amp;quot; yang jelas mengakhiri penantian. Kesunyian membiarkan lingkaran terbuka selamanya dan
pelanggan terus memeriksa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana menutup lingkaran berbeda dari mengumumkan fitur?&lt;/strong&gt;
Pengumuman pergi ke semua orang. Menutup lingkaran adalah balasan kepada orang-orang yang
meminta, di kanal tempat mereka meminta. Lakukan keduanya; ini pesan yang berbeda untuk pembaca
yang berbeda.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana jika peminta tidak ada di GitHub?&lt;/strong&gt;
Kebanyakan memang tidak, dan itu tidak masalah. Widget terus menampilkan status dari apa yang
mereka kirim, termasuk entri yang dirilis dan tautannya, jadi mereka tidak butuh apa pun selain
halaman tempat mereka menulis. Komentar di issue ditujukan untuk orang yang bisa melihat repositori.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah loop ini bekerja di GitLab atau Bitbucket, bukan GitHub?&lt;/strong&gt;
Widget dan changelog bekerja; komentar otomatis di langkah lima belum, untuk saat ini. Tim di
GitLab atau Bitbucket tetap mendapat setiap pengiriman, tetap mencatatnya sebagai issue, dan tetap
menampilkan status ke peminta di widget, tapi menutup loop spesifik itu kembali ke issue itu
sendiri adalah langkah yang Anda lakukan secara manual sampai integrasi itu ada.&lt;/p&gt;
</content:encoded></item><item><title>Template permintaan fitur yang menjadi changelog</title><link>https://changeloop.dev/blog/id/feature-request-template/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/feature-request-template/</guid><description>Permintaan fitur hanya berguna jika bisa ditemukan lagi saat dirilis. Template, label yang mengarahkannya, dan kolom yang kemudian dibaca changelog.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Template permintaan fitur adalah formulir dengan empat pertanyaan: apa yang sedang dicoba
dilakukan orang tersebut, apa yang menghalanginya, apa yang dicobanya sebagai gantinya, dan
bagaimana dia ingin diberi tahu saat selesai. Semua yang lain yang biasanya muncul di formulir
tersebut, pemilih prioritas, estimasi usaha, skor nilai bisnis, ditujukan untuk tim yang menerima
permintaan, dan diisi dengan salah oleh yang mengirimnya.&lt;/p&gt;
&lt;p&gt;Permintaan yang rapi adalah tes yang salah untuk sebuah template. Yang benar: enam bulan
kemudian, saat fiturnya dirilis, bisakah seseorang menemukan permintaannya, memahaminya, dan
memberi tahu orang yang menulisnya? Kebanyakan template dirancang untuk penerimaan. Ini dirancang
untuk hari lingkarannya ditutup.&lt;/p&gt;
&lt;h2&gt;Apa yang harus dicakup template permintaan fitur?&lt;/h2&gt;
&lt;p&gt;Harus mencakup tujuan, penghalang, solusi sementara, dan cara kembali ke peminta. Empat kolom,
dalam urutan itu, masing-masing menjawab pertanyaan yang akan ditanyakan tim nanti.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kolom&lt;/th&gt;
&lt;th&gt;Pertanyaan yang dijawab nanti&lt;/th&gt;
&lt;th&gt;Mengapa ada di formulir&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Apa yang kamu coba lakukan?&lt;/td&gt;
&lt;td&gt;Apakah fitur yang dibangun itu yang dibutuhkan?&lt;/td&gt;
&lt;td&gt;Tujuan bertahan lebih lama dari proposal konkret mana pun&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apa yang menghalangimu hari ini?&lt;/td&gt;
&lt;td&gt;Seperti apa &amp;quot;selesai&amp;quot; itu?&lt;/td&gt;
&lt;td&gt;Menyebutkan celahnya tanpa menentukan perbaikannya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apa yang kamu lakukan sebagai gantinya?&lt;/td&gt;
&lt;td&gt;Seberapa mendesak ini sebenarnya?&lt;/td&gt;
&lt;td&gt;Solusi sementara yang menyakitkan adalah sinyal yang lebih kuat daripada pemilih prioritas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bagaimana kami harus memberitahumu?&lt;/td&gt;
&lt;td&gt;Siapa yang menerima pesan &amp;quot;dirilis&amp;quot;?&lt;/td&gt;
&lt;td&gt;Kolom yang paling sering dilewatkan template&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Yang dengan sengaja hilang: solusi yang diusulkan sebagai kolom wajib (diterima sebagai komentar,
salah sebagai kerangka), pemilih prioritas (semua yang mengirim memilih tinggi), dan estimasi
usaha atau nilai apa pun (tugas tim, setelah triase). Template yang meminta solusi mendapatkan
permintaan untuk tombol; template yang meminta tujuan mendapatkan permintaan untuk hasil, dan
tentang hasil itulah entri changelog ditulis.&lt;/p&gt;
&lt;h2&gt;Templatenya&lt;/h2&gt;
&lt;p&gt;Ini template issue GitHub yang kami gunakan, sebagai formulir. Tempel ke
&lt;code&gt;.github/ISSUE_TEMPLATE/feature_request.yml&lt;/code&gt; dan itu akan dirender sebagai formulir terstruktur
di halaman issue baru. Permintaan yang diajukan melaluinya mendarat sebagai issue dengan kolom
yang sama dengan yang diajukan dari widget umpan balik, yang penting untuk bagian berikutnya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;name: Feature request
description: What you are trying to do, and what stops you.
labels: [&amp;quot;feature-request&amp;quot;]
body:
  - type: textarea
    id: goal
    attributes:
      label: What are you trying to do?
      description: &amp;gt;-
        The outcome, not the button. &amp;quot;Export a month of invoices as one
        PDF&amp;quot; beats &amp;quot;add a PDF export&amp;quot;.
    validations:
      required: true
  - type: textarea
    id: blocker
    attributes:
      label: What stops you today?
      description: &amp;gt;-
        Where the product runs out. An error, a missing option, a limit.
    validations:
      required: true
  - type: textarea
    id: workaround
    attributes:
      label: What do you do instead?
      description: &amp;gt;-
        The spreadsheet, the script, the manual step. &amp;quot;Nothing, I gave
        up&amp;quot; is a valid answer.
  - type: input
    id: contact
    attributes:
      label: How should we tell you when it ships?
      description: &amp;gt;-
        An email address, or leave blank to be notified only on this
        issue.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dua detail melakukan pekerjaannya. &lt;code&gt;labels: [&amp;quot;feature-request&amp;quot;]&lt;/code&gt; berarti permintaan diklasifikasi
saat dibuat alih-alih menunggu seseorang mentriasenya. Dan kolom terakhir ada karena &amp;quot;kami akan
memberi tahumu&amp;quot; adalah janji, dan janji butuh alamat.&lt;/p&gt;
&lt;h2&gt;Label apa yang harus dibawa permintaan fitur?&lt;/h2&gt;
&lt;p&gt;Permintaan fitur harus membawa satu label untuk apa itu, satu untuk seberapa mendesak, dan satu
untuk dari mana asalnya. Tiga label, tiga sumbu, dan masing-masing dibaca oleh pembaca yang
berbeda.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;Nilai&lt;/th&gt;
&lt;th&gt;Siapa yang membacanya&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Jenis&lt;/td&gt;
&lt;td&gt;&lt;code&gt;feature-request&lt;/code&gt;, &lt;code&gt;bug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yang memutuskan antrean mana yang dimasukinya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prioritas&lt;/td&gt;
&lt;td&gt;&lt;code&gt;priority:low&lt;/code&gt;, &lt;code&gt;priority:medium&lt;/code&gt;, &lt;code&gt;priority:high&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yang merencanakan siklus berikutnya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sumber&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from-widget&lt;/code&gt;, &lt;code&gt;from-form&lt;/code&gt;, &lt;code&gt;from-support&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yang mengukur dari mana permintaan berasal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Widget menerapkan dua sumbu pertama dan &lt;code&gt;from-widget&lt;/code&gt; saat mengajukan pengiriman sebagai issue;
&lt;code&gt;from-form&lt;/code&gt; dan &lt;code&gt;from-support&lt;/code&gt; adalah saran untuk permintaan yang datang lewat jalur lain. Label
widget adalah: jenis (&lt;code&gt;bug&lt;/code&gt; atau &lt;code&gt;feature-request&lt;/code&gt;, diputuskan pengklasifikasi hanya dari pesannya),
prioritas (laporan kerusakan yang tenang dan spesifik adalah tinggi; duplikat dari sesuatu yang
sudah ditanyakan adalah rendah; apa pun yang bahkan mengisyaratkan masalah keamanan adalah &lt;code&gt;bug&lt;/code&gt;
dan tinggi, apa pun kata-katanya), dan &lt;code&gt;from-widget&lt;/code&gt;. Ketiga sumbu yang sama berlaku untuk
permintaan yang datang secara manual melalui template di atas, dan itulah intinya: permintaan
adalah permintaan, di mana pun ia masuk.&lt;/p&gt;
&lt;p&gt;Satu konvensi lagi: widget menghapus alamat email pengirim dari badan issue sebelum
mengajukannya, karena issue-nya hidup di repositori yang mungkin publik, dan menggantinya dengan
referensi pengiriman. Alamatnya tetap di luar issue; pengirim mengikuti hasilnya di widget itu sendiri. Lakukan hal yang sama
dengan kolom kontak jika tracker Anda terlihat oleh orang di luar tim.&lt;/p&gt;
&lt;h2&gt;Bagaimana permintaan fitur menjadi entri changelog?&lt;/h2&gt;
&lt;p&gt;Permintaan fitur menjadi entri changelog ketika pull request menutup issue-nya dan entri yang
disusun dari pull request itu menautkan kembali. Mekanismenya adalah kata kunci penutupan milik
GitHub sendiri: PR yang deskripsinya mengatakan &lt;code&gt;Fixes #142&lt;/code&gt; menutup issue 142 saat merge. Jika
entri changelog Anda disusun dari pull request yang di-merge, drafnya bisa membawa nomor
issue-nya, dan entrinya tahu siapa yang meminta.&lt;/p&gt;
&lt;p&gt;Itulah alasan mengapa template meminta tujuan alih-alih solusi. Saat entri ditulis, tujuan adalah
kalimat yang dibutuhkan penulis: &amp;quot;Sekarang Anda bisa mengekspor satu bulan faktur sebagai satu
PDF&amp;quot; adalah entri changelog. &amp;quot;Menambahkan ekspor PDF&amp;quot; adalah pesan commit.
&lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;Alat changelog&lt;/a&gt; yang menyusun dari pull request bisa melakukan pengumpulan dan
tautannya; formulasinya masih membutuhkan seseorang, dan orang itu membutuhkan tujuannya.&lt;/p&gt;
&lt;h2&gt;Apa yang terjadi saat dirilis?&lt;/h2&gt;
&lt;p&gt;Peminta diberi tahu, dengan tautan ke entri. Dalam setup kami itu otomatis untuk permintaan yang
masuk melalui widget: komentar yang mengatakan &amp;quot;Shipped — &lt;judul entri&gt;&amp;quot; dengan tautan ke entri
yang diterbitkan, diposting di issue begitu seseorang menyetujui entrinya, sementara widget
menampilkan entri yang sama kepada pengirimnya. Issue yang diajukan manual dari template ini tidak
mendapat komentar otomatis; tutup lingkaran itu sendiri, dengan aturan yang sama. Komentarnya sengaja diposting saat persetujuan
bukan saat merge: komentar yang mengatakan sesuatu itu live sebelum benar-benar live adalah janji
yang rusak dengan stempel waktu. Setiap permintaan diberi tahu paling banyak sekali; persetujuan
kedua dari entri yang sama tidak menghasilkan komentar kedua.&lt;/p&gt;
&lt;p&gt;Jika Anda melakukan ini secara manual, aturan yang sama berlaku. Jangan tutup lingkaran dari pull
request. Tutup dari entri yang diterbitkan, dan tutup sekali. &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;Feed dan widget&lt;/a&gt; membawa
entri yang sama kepada semua orang yang tidak meminta, yang merupakan kebanyakan orang;
komentarnya untuk yang meminta.&lt;/p&gt;
&lt;h2&gt;Mengapa kebanyakan template permintaan fitur gagal&lt;/h2&gt;
&lt;p&gt;Mereka dirancang untuk memudahkan triase dan berhasil, dengan mengorbankan satu momen yang
penting bagi peminta. Template dengan dua belas kolom menerima lebih sedikit permintaan, dan yang
diterimanya berasal dari orang-orang dengan kesabaran untuk mengisi dua belas kolom, yang bukan
populasi yang sama dengan yang membutuhkan fiturnya. Template dengan empat kolom, salah satunya
&amp;quot;bagaimana kami menghubungimu&amp;quot;, menerima lebih banyak permintaan dan bisa menghormati semuanya.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Haruskah template permintaan fitur menanyakan prioritas?&lt;/strong&gt;
Tidak. Tanyakan solusi sementara sebagai gantinya. &amp;quot;Saya mengekspor ke spreadsheet dan mengetik
ulang setiap Jumat&amp;quot; mengatakan lebih banyak tentang prioritas daripada dropdown yang diatur tinggi
oleh pengirim.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah peminta mengusulkan solusi?&lt;/strong&gt;
Bisa, di teks bebas. Jangan jadikan itu sebagai kerangka. Permintaan yang ditulis sebagai solusi
lebih sulit digabungkan satu sama lain dan lebih sulit diubah menjadi entri changelog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah permintaan fitur muncul di roadmap publik?&lt;/strong&gt;
Setelah direncanakan, ya: label di issue yang sama menempatkannya di kolom direncanakan, dan
peminta bisa melihat bagaimana pergerakannya. Artikel &lt;a href=&quot;https://changeloop.dev/blog/id/public-roadmap/&quot;&gt;roadmap publik&lt;/a&gt;
adalah mekanismenya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana cara menangani duplikat?&lt;/strong&gt;
Tautkan permintaan baru ke issue yang ada dan beri label prioritas rendah; jangan tutup. Setiap
duplikat adalah satu orang lagi untuk diberi tahu saat dirilis. Dengan komentar otomatis Changeloop,
orang itu hanya diberi tahu jika pull request juga menyebut issue mereka (&lt;code&gt;Fixes #142, fixes #187&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Di mana template seharusnya berada?&lt;/strong&gt;
Di repositori yang akan menerima pull request, sehingga kata kunci penutupannya berfungsi.
Permintaan di tracker terpisah harus ditautkan secara manual saat merge, dan itulah langkah yang
dilewatkan.&lt;/p&gt;
</content:encoded></item><item><title>Roadmap publik dari issue tracker Anda, tiga kolom</title><link>https://changeloop.dev/blog/id/public-roadmap/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/public-roadmap/</guid><description>Roadmap publik adalah janji tentang masa depan. Buat tetap kecil, isi dari issue yang sudah dilacak, dan pindahkan setiap item lewat label di issue-nya.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Roadmap publik adalah daftar apa yang Anda niatkan untuk dibangun, diterbitkan di tempat yang bisa
dilihat pelanggan. Kata yang melakukan pekerjaan itu adalah &lt;em&gt;niatkan&lt;/em&gt;: roadmap adalah kumpulan
janji tentang masa depan, dan setiap item di dalamnya adalah yang akan Anda tepati atau akan
terlihat tidak Anda tepati. Itulah alasan untuk menerbitkannya, dan itu juga alasan mengapa
kebanyakan roadmap publik menjadi usang dalam satu kuartal. Versi yang bertahan itu kecil,
diturunkan dari data yang sudah Anda pelihara, dan terhubung di ujung lain ke changelog, sehingga
janji menjadi fakta tanpa ada yang memasukkannya kembali.&lt;/p&gt;
&lt;h2&gt;Untuk apa roadmap publik?&lt;/h2&gt;
&lt;p&gt;Roadmap publik memberi tahu pelanggan dengan permintaan bahwa permintaan mereka didengar, sebelum
dirilis. Itu setengah awal dari menutup lingkaran: &amp;quot;Direncanakan&amp;quot; menjawab pertanyaan &amp;quot;apakah ada
yang membaca ini&amp;quot;, dan &amp;quot;Sedang dibangun&amp;quot; menjawab &amp;quot;apakah ini benar-benar terjadi&amp;quot;. Tidak ada yang
menggantikan langkah terakhir, memberi tahu peminta saat dirilis, tapi keduanya mengurangi jumlah
orang yang bertanya sementara itu.&lt;/p&gt;
&lt;p&gt;Ini juga melakukan sesuatu untuk tim: memaksa komitmen publik, yang merupakan obat termurah yang
diketahui melawan backlog yang diam-diam menyimpan empat ratus item yang tidak akan dibangun
siapa pun.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kolom&lt;/th&gt;
&lt;th&gt;Janji yang dibuatnya&lt;/th&gt;
&lt;th&gt;Yang memindahkan item ke dalamnya&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Direncanakan&lt;/td&gt;
&lt;td&gt;Kami berniat membangun ini&lt;/td&gt;
&lt;td&gt;Keputusan, dicatat sebagai label di issue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sedang dibangun&lt;/td&gt;
&lt;td&gt;Seseorang sedang mengerjakannya sekarang&lt;/td&gt;
&lt;td&gt;Label &lt;code&gt;roadmap:building&lt;/code&gt; di issue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dirilis&lt;/td&gt;
&lt;td&gt;Sudah live&lt;/td&gt;
&lt;td&gt;Label &lt;code&gt;roadmap:shipped&lt;/code&gt;, atau menutup issue selagi label itu terpasang&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Tiga kolom, dalam urutan tetap, sudah cukup. Kolom keempat (&amp;quot;dipertimbangkan&amp;quot;, &amp;quot;sedang ditinjau&amp;quot;,
&amp;quot;backlog&amp;quot;) adalah tempat niat baik berubah menjadi museum, dan itu yang pertama dipelajari
pelanggan untuk diabaikan.&lt;/p&gt;
&lt;h2&gt;Haruskah roadmap Anda publik?&lt;/h2&gt;
&lt;p&gt;Buat publik jika Anda bisa menjaganya tetap kecil dan jujur; jaga tetap privat jika alternatifnya
adalah daftar panjang mungkin-mungkin. Biaya roadmap publik tidak ada hubungannya dengan
menerbitkannya: setiap item di dalamnya sekarang menjadi pertanyaan yang akan ditanyakan
seseorang, dalam dukungan, dalam panggilan penjualan dan dalam percakapan perpanjangan. Sepuluh
item yang akan Anda bangun adalah aset. Enam puluh item yang mungkin Anda bangun adalah enam
puluh percakapan masa depan tentang mengapa tidak.&lt;/p&gt;
&lt;p&gt;Dua alasan jujur untuk tidak menerbitkan: rencana Anda berubah lebih cepat dari satu kuartal, atau
kompetisi Anda membaca roadmap Anda lebih hati-hati daripada pelanggan Anda. Keduanya nyata, dan
keduanya dijawab dengan menerbitkan lebih sedikit alih-alih tidak sama sekali: hanya &amp;quot;sedang
dibangun&amp;quot;, dengan &amp;quot;direncanakan&amp;quot; disimpan secara internal, tetap memberi tahu peminta bahwa
issue mereka bergerak.&lt;/p&gt;
&lt;h2&gt;Bagaimana cara membangun roadmap publik dari issue GitHub?&lt;/h2&gt;
&lt;p&gt;Letakkan satu label per kolom pada issue yang sudah Anda lacak, dan render issue berlabel sebagai
roadmap-nya. Tidak ada yang dimasukkan ulang, roadmap-nya tidak bisa menyimpang dari
pekerjaannya, dan issue yang sama yang dimulai sebagai permintaan pelanggan bergerak melalui
kolom tanpa mengubah identitasnya.&lt;/p&gt;
&lt;p&gt;Mekanismenya, seperti yang kami jalankan:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Satu label per kolom, dengan awalan tetap&lt;/strong&gt;: &lt;code&gt;roadmap:planned&lt;/code&gt;, &lt;code&gt;roadmap:building&lt;/code&gt;,
&lt;code&gt;roadmap:shipped&lt;/code&gt;. Issue mana pun di repositori yang terhubung yang membawa salah satunya
muncul di kolom itu. Issue tanpa salah satu dari itu tidak ada di roadmap, yang merupakan
kebanyakan issue, yang benar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kolom-kolomnya adalah array terurut, selalu dalam urutan yang sama.&lt;/strong&gt; Direncanakan, sedang
dibangun, dirilis. Bukan peta yang diindeks berdasarkan nama, sehingga pembaca (atau widget)
tidak pernah harus menebak urutannya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jika issue membawa dua label, yang paling maju yang menang.&lt;/strong&gt; Seseorang akan menambahkan
&lt;code&gt;roadmap:shipped&lt;/code&gt; sebelum menghapus &lt;code&gt;roadmap:planned&lt;/code&gt;; mesin status yang dipandu oleh &amp;quot;webhook
mana yang tiba terakhir&amp;quot; akan menempatkan item di kolom berbeda tergantung urutan pengiriman.
Memutuskan hanya dari kumpulan label membuat jawabannya sama terlepas dari bagaimana peristiwa
tiba.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dirilis adalah status label seperti yang lain.&lt;/strong&gt; Kartu berpindah saat issue mendapat
&lt;code&gt;roadmap:shipped&lt;/code&gt;, atau ditutup selagi membawa label itu. Kartu itu sendiri tidak menautkan ke
entri changelog; detailnya ada di entri, yang disusun dari pull request yang menutup issue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sajikan sebagai data.&lt;/strong&gt; Roadmap-nya adalah dokumen JSON dengan tiga kolom itu, diterbitkan
di samping feed changelog dengan header cache yang sama, sehingga situs dokumen, widget atau
halaman status bisa merendernya tanpa integrasi kedua. &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;Dokumentasi feed&lt;/a&gt; punya bentuk
pastinya.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Label itu hal kecil yang diminta dari maintainer, dan itu seluruh integrasinya. Tidak ada papan
untuk dijaga tetap sinkron, tidak ada alat terpisah untuk login, dan permintaan yang diajukan
pelanggan adalah item di roadmap; saat dirilis, itu item yang sama.&lt;/p&gt;
&lt;h2&gt;Apa yang tidak boleh dimuat roadmap publik?&lt;/h2&gt;
&lt;p&gt;Tidak boleh memuat tanggal, estimasi, atau apa pun yang akan membuat Anda malu jika ditanyakan
sembilan bulan kemudian. Tanggal adalah kesalahan klasik: satu kuartal di roadmap menjadi
komitmen di dek penjualan menjadi tiket bernama &amp;quot;kalian bilang Q3&amp;quot;. Kolom-kolom sudah cukup
mengatakan. &amp;quot;Sedang dibangun&amp;quot; sudah berarti &amp;quot;cukup segera sehingga ada yang mengerjakannya&amp;quot;.&lt;/p&gt;
&lt;p&gt;Juga tidak boleh memuat backlog internal. Roadmap dengan tiga ratus item adalah masalah pencarian,
bukan janji, dan pelanggan yang menemukan permintaannya di posisi 212 sudah mempelajari sesuatu
yang tidak ingin Anda katakan kepadanya.&lt;/p&gt;
&lt;h2&gt;Bagaimana roadmap terhubung ke changelog?&lt;/h2&gt;
&lt;p&gt;Roadmap dan changelog menggambarkan issue yang sama dari dua sisi, satu untuk masa depan dan
satu untuk masa lalu. Tidak ada yang memindahkan kartu di papan terpisah. Maintainer mengubah label
di issue yang memang sedang dikerjakannya, entrinya disusun dari pull request, dan saat seseorang
menyetujui entri itu, peminta yang umpan balik widget-nya menjadi issue tersebut diberi
tahu di sana. Memindahkan kartu ke dirilis tetap
langkah tersendiri, label &lt;code&gt;roadmap:shipped&lt;/code&gt;, jadi jadikan bagian dari tinjauan yang sama;
menyetujui entri tidak melakukannya untuk Anda.&lt;/p&gt;
&lt;p&gt;Ini lingkaran yang sama yang dijelaskan &lt;a href=&quot;https://changeloop.dev/blog/id/customer-feedback-loop/&quot;&gt;artikel lingkaran umpan balik&lt;/a&gt;
dari sisi changelog; roadmap adalah apa yang dilihat pelanggan di tengah-tengahnya. Rangkuman
&lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;alat changelog&lt;/a&gt; mencakup produk mana yang menawarkan tampilan roadmap dan mana
yang memperlakukannya sebagai papan terpisah, yang merupakan perbedaan yang menentukan apakah
tetap akurat.&lt;/p&gt;
&lt;h2&gt;Seperti apa roadmap publik yang baik?&lt;/h2&gt;
&lt;p&gt;Terlihat singkat, dan setiap item di dalamnya adalah issue yang bisa dibuka siapa pun. Tesnya
adalah apakah pelanggan bisa pergi dari sebuah item ke diskusi di baliknya, dan dari item yang
dirilis ke entri yang menjelaskan apa yang benar-benar berubah. Roadmap yang berupa daftar nama
fitur tanpa jalan masuk adalah brosur.&lt;/p&gt;
&lt;p&gt;Contoh yang dikerjakan, sebagai JSON yang akan diambil widget:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;columns&amp;quot;: [
    { &amp;quot;column&amp;quot;: &amp;quot;planned&amp;quot;, &amp;quot;hasMore&amp;quot;: false, &amp;quot;items&amp;quot;: [
      { &amp;quot;id&amp;quot;: &amp;quot;6b0c1f...&amp;quot;, &amp;quot;column&amp;quot;: &amp;quot;planned&amp;quot;,
        &amp;quot;publicTitle&amp;quot;: &amp;quot;Saved views on the inbox&amp;quot;,
        &amp;quot;publicDescription&amp;quot;: &amp;quot;Keep a filter you use often and come back to it.&amp;quot;,
        &amp;quot;publishedAt&amp;quot;: &amp;quot;2026-09-16T10:04:11.000Z&amp;quot; }
    ]},
    { &amp;quot;column&amp;quot;: &amp;quot;building&amp;quot;, &amp;quot;hasMore&amp;quot;: false, &amp;quot;items&amp;quot;: [
      { &amp;quot;id&amp;quot;: &amp;quot;71a4e2...&amp;quot;, &amp;quot;column&amp;quot;: &amp;quot;building&amp;quot;,
        &amp;quot;publicTitle&amp;quot;: &amp;quot;Roadmap column in the widget&amp;quot;,
        &amp;quot;publicDescription&amp;quot;: &amp;quot;See what is coming without leaving the page.&amp;quot;,
        &amp;quot;publishedAt&amp;quot;: &amp;quot;2026-09-12T08:20:02.000Z&amp;quot; }
    ]},
    { &amp;quot;column&amp;quot;: &amp;quot;shipped&amp;quot;, &amp;quot;hasMore&amp;quot;: false, &amp;quot;items&amp;quot;: [
      { &amp;quot;id&amp;quot;: &amp;quot;5c9d70...&amp;quot;, &amp;quot;column&amp;quot;: &amp;quot;shipped&amp;quot;,
        &amp;quot;publicTitle&amp;quot;: &amp;quot;Feedback filed as labelled issues&amp;quot;,
        &amp;quot;publicDescription&amp;quot;: &amp;quot;Widget submissions arrive as issues your triage already handles.&amp;quot;,
        &amp;quot;publishedAt&amp;quot;: &amp;quot;2026-09-02T15:41:37.000Z&amp;quot; }
    ]}
  ],
  &amp;quot;enabled&amp;quot;: true,
  &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tiga item di tiga kolom adalah roadmap publik yang sangat baik. Mengatakan apa yang akan datang,
apa yang sedang terjadi, dan apa yang sudah terjadi, dan setiap barisnya bisa diperiksa. Lima tata
letak lain, dari Now/Next/Later sampai berbasis hasil, ditampilkan dengan item contoh di
&lt;a href=&quot;https://changeloop.dev/blog/id/product-roadmap-examples/&quot;&gt;contoh roadmap produk&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Berapa banyak item yang seharusnya dimiliki roadmap publik?&lt;/strong&gt;
Sesedikit yang bisa Anda pertahankan. Di bawah sepuluh secara total itu normal untuk produk
kecil; lebih dari tiga puluh di &amp;quot;direncanakan&amp;quot; biasanya backlog yang menyamar sebagai roadmap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah roadmap publik punya tanggal?&lt;/strong&gt;
Tidak. Kolom-kolom mengomunikasikan urutan tanpa menciptakan tenggat waktu. Jika pelanggan
membutuhkan tanggal, itu percakapan, bukan item roadmap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah pelanggan memilih item roadmap?&lt;/strong&gt;
Voting mengukur siapa yang muncul, bukan apa yang penting. Komentar di issue yang menjelaskan
solusi sementara yang mereka gunakan hari ini bernilai lebih dari lima puluh suara, dan itu
memberi biaya bagi pemberi suara, yang menjadi intinya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa yang terjadi pada item roadmap yang dibatalkan?&lt;/strong&gt;
Hapus labelnya dan katakan alasannya di issue. &amp;quot;Kami tidak akan melakukan ini&amp;quot; yang publik adalah
bagian dari lingkaran, dan itu pesan yang tidak pernah dikirim kebanyakan tim.&lt;/p&gt;
</content:encoded></item><item><title>Otomatisasi changelog, dan batasannya</title><link>https://changeloop.dev/blog/id/changelog-automation/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/changelog-automation/</guid><description>Otomatisasi pengumpulan, pemformatan dan penerbitan. Jangan otomatisasi seleksi atau formulasi. Di mana batasnya dan apa yang terjadi setiap kali bergeser.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Otomatisasi changelog berhasil ketika mengotomatisasi pengumpulan, klasifikasi dan penerbitan, dan
berhenti di seleksi dan formulasi. Otomatisasi semuanya dan Anda mengirimkan git log yang
diformat; jangan otomatisasi apa pun dan changelog ditulis dalam ledakan, dari ingatan, sebelum
rilis. Pertanyaan yang berguna adalah bagian mana yang harus diotomatisasi, bukan seberapa banyak.&lt;/p&gt;
&lt;p&gt;Proyek otomatisasi changelog gagal dalam salah satu dari dua arah, dan keduanya bisa diprediksi
sejak rapat desain pertama. Otomatisasi terlalu sedikit dan changelog menjadi dokumen yang
seharusnya diperbarui seseorang, yang berarti diperbarui dalam ledakan, oleh siapa pun yang
kebagian tugas termalang. Otomatisasi terlalu banyak dan berubah menjadi git log yang diformat:
lengkap, akurat, dan tidak dibaca siapa pun.&lt;/p&gt;
&lt;h2&gt;Bagian mana dari changelog yang harus diotomatisasi?&lt;/h2&gt;
&lt;p&gt;Tiga dari empat langkah. Pengumpulan dan penerbitan sepenuhnya; klasifikasi sebagai langkah
pertama dengan penggantian manusia; seleksi dan formulasi tidak pernah.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Langkah&lt;/th&gt;
&lt;th&gt;Otomatisasi?&lt;/th&gt;
&lt;th&gt;Mengapa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Pengumpulan: perubahan dari commit, PR, tiket ke daftar&lt;/td&gt;
&lt;td&gt;Sepenuhnya&lt;/td&gt;
&lt;td&gt;Membosankan, dilewati saat tenggat waktu, mesin melakukannya dengan sempurna&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Klasifikasi: Added, Fixed, Changed, Deprecated, Removed, Security&lt;/td&gt;
&lt;td&gt;Langkah pertama, penggantian manusia&lt;/td&gt;
&lt;td&gt;Sekitar 80% benar hanya dari metadata; 20% yang salah adalah entri yang penting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seleksi dan formulasi: apa yang disampaikan ke pembaca, dan bagaimana&lt;/td&gt;
&lt;td&gt;Tidak pernah&lt;/td&gt;
&lt;td&gt;Ini seluruh nilai dari artefak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Penerbitan: halaman, feed, email, widget, Slack&lt;/td&gt;
&lt;td&gt;Sepenuhnya, dari satu sumber&lt;/td&gt;
&lt;td&gt;Tempat sebagian besar upaya manual sebenarnya dihabiskan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Pengumpulan.&lt;/strong&gt; Mengeluarkan perubahan dari tempat mereka terjadi (commit, PR, tiket) dan
memasukkannya ke daftar. Otomatisasi ini sepenuhnya. Manusia buruk dalam hal ini, membosankan, dan
merupakan langkah yang dilewati saat tenggat waktu.
&lt;a href=&quot;https://changeloop.dev/blog/id/conventional-commits-changelog/&quot;&gt;Conventional commits&lt;/a&gt; atau label PR biasanya bahan
mentahnya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Klasifikasi.&lt;/strong&gt; Memutuskan apakah sesuatu itu Added, Fixed, Changed, Deprecated, Removed atau
Security. Otomatisasi langkah pertama dari jenis commit atau label PR, dan biarkan manusia
menggantinya. Akurasi di sini sekitar delapan puluh persen hanya dari metadata, dan dua puluh
persen yang salah terkonsentrasi tepat di entri yang penting, karena ambiguitas berkorelasi
dengan pentingnya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Seleksi dan formulasi.&lt;/strong&gt; Memutuskan apa yang harus diketahui pembaca dan bagaimana
menyampaikannya. &lt;strong&gt;Jangan otomatisasi ini.&lt;/strong&gt; Ini seluruh nilai dari artefak. Semua yang lain
adalah logistik.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Penerbitan.&lt;/strong&gt; Membawa entri yang selesai ke halaman, feed, email, widget in-app, kanal Slack.
Otomatisasi sepenuhnya, dan dari satu sumber. Ini tempat sebagian besar upaya manual sebenarnya
dihabiskan, dan hampir tidak ada yang menghitungnya. Ini juga langkah yang bisa memberi tahu orang
yang meminta perubahan bahwa itu sudah dirilis, yang merupakan seluruh isi dari
&lt;a href=&quot;https://changeloop.dev/blog/id/customer-feedback-loop/&quot;&gt;menutup lingkaran umpan balik dari sisi changelog&lt;/a&gt;. Separuh email
dari langkah itu punya bentuknya sendiri, di &lt;a href=&quot;https://changeloop.dev/blog/id/product-update-email/&quot;&gt;template email update produk&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Poin terakhir itu layak dipikirkan. Tim cenderung melihat changelog sebagai masalah penulisan,
lalu menghabiskan sebagian besar waktu pada distribusi: menyalin entri ke alat email, memformat
ulang untuk in-app, menempel ke Slack, memperbarui halaman dokumen. Menulis butuh satu jam.
Menyalin butuh satu jam setiap rilis, selamanya, dan itu bagian yang seharusnya dimiliki mesin.&lt;/p&gt;
&lt;h2&gt;Apa yang terjadi ketika batasnya bergeser?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Geser ke atas dan Anda dapat dump git.&lt;/strong&gt; Otomatisasi penuh dari commit menghasilkan
&lt;code&gt;bump deps&lt;/code&gt;, &lt;code&gt;fix flaky test&lt;/code&gt;, &lt;code&gt;wip&lt;/code&gt; dan &lt;code&gt;address review comments&lt;/code&gt; di depan pelanggan. Setiap tim
yang melakukan ini kemudian menambahkan filter, dan filter tersebut adalah langkah seleksi yang
diperkenalkan kembali dengan nama lain, dengan ergonomi yang lebih buruk.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Geser ke bawah dan Anda dapat ledakan.&lt;/strong&gt; Pengumpulan sepenuhnya manual berarti entri ditulis
dari ingatan saat rilis. Itu mode yang diperingatkan
&lt;a href=&quot;https://changeloop.dev/blog/id/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt; sejak awal, dan memburuk diam-diam:
changelog terlihat terpelihara sampai tepat minggu ketika tidak ada yang punya waktu.&lt;/p&gt;
&lt;h2&gt;Seperti apa pipeline otomatisasi changelog?&lt;/h2&gt;
&lt;p&gt;Empat langkah, dengan tepat satu gerbang manusia, diletakkan di tempat draf menjadi publik.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Saat merge, turunkan entri draf dari PR: jenis dari label atau prefiks commit, judul sebagai
draf pertama, tautan kembali ke PR, penulis tercatat. Letakkan di bak yang belum dirilis.&lt;/li&gt;
&lt;li&gt;Siapa pun bisa mengedit draf apa pun kapan saja, dan mengedit itu murah. Kebanyakan mendapat
satu baris ditulis ulang.&lt;/li&gt;
&lt;li&gt;Memotong rilis mengharuskan setiap entri di bak sudah diedit atau ditandai secara eksplisit
sebagai internal. Gerbang ini adalah seluruh desainnya. Tanpanya, draf dirilis tanpa disunting
di minggu yang sibuk.&lt;/li&gt;
&lt;li&gt;Menerbitkan adalah fan-out dari set yang dirilis: halaman publik, feed, email, widget, posting
Slack. Satu sumber, beberapa rendering, tidak ada penyalinan.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Langkah 3 satu-satunya tempat yang membutuhkan seseorang, dan butuh sekitar sepuluh menit per
rilis begitu draf-nya layak. Di mana permintaan pelanggan terlibat, draf juga membawa issue yang
ditutupnya, yang memungkinkan langkah 4 memberi tahu peminta;
&lt;a href=&quot;https://changeloop.dev/blog/id/feature-request-template/&quot;&gt;template permintaan fitur&lt;/a&gt; dirancang agar tautan itu
bertahan. Posisi langkah ini dalam alur rilis yang lebih luas adalah topik
&lt;a href=&quot;https://changeloop.dev/blog/id/release-management-process/&quot;&gt;proses manajemen rilis&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Apa yang dibutuhkan otomatisasi dari data Anda?&lt;/h2&gt;
&lt;p&gt;Tidak ada yang di atas berfungsi jika changelog adalah berkas Markdown, karena berkas tidak bisa
dirender ke lima permukaan tanpa diurai ulang, dan mengurai prosa adalah cara Anda berakhir dengan
widget yang menampilkan setengah judul.&lt;/p&gt;
&lt;p&gt;Entri perlu terstruktur: jenis, tanggal, versi atau pengenal rilis, audiens, badan dan tautan.
Lalu berkas, halaman, feed dan email semuanya adalah tampilan. Poin struktural itu satu-satunya
hal yang layak dibenarkan sebelum memilih alat, karena itu yang tidak bisa Anda tambahkan dengan
murah setelahnya. Tidak
ada satu pun dari itu berfungsi selama entri tidak benar-benar dibuat untuk setiap perubahan
yang membutuhkannya; &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-ci-enforcement/&quot;&gt;mewajibkan entri changelog di CI&lt;/a&gt;
membahas cara membuat pipeline menolak merge tanpa entri, alih-alih menyerahkan langkah itu pada
ingatan.&lt;/p&gt;
&lt;p&gt;Kami membangun &lt;a href=&quot;https://changeloop.dev/&quot;&gt;changeloop&lt;/a&gt;, di mana changelog dulu adalah feed baru kemudian halaman, jadi
bacalah itu sebagai kepentingan alih-alih rekomendasi netral; &lt;a href=&quot;https://changeloop.dev/pricing&quot;&gt;harga&lt;/a&gt; adalah satu
repositori gratis tanpa kartu, cukup untuk melihat bentuknya.
&lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;Alat changelog&lt;/a&gt; adalah rangkuman kami tentang apa lagi yang ada, termasuk
produk yang kami saingi, dan &lt;a href=&quot;https://changeloop.dev/changelog-generator&quot;&gt;generator changelog&lt;/a&gt; melakukan langkah
pengumpulan dan klasifikasi di browser jika Anda ingin melihat penurunannya sebelum berkomitmen
pada pipeline.&lt;/p&gt;
&lt;h2&gt;Tesnya&lt;/h2&gt;
&lt;p&gt;Hitung menit antara perubahan yang di-merge dan perubahan itu terlihat bagi pelanggan yang tidak
membaca repo Anda. Jika sebagian besar menit itu adalah seseorang menyalin teks antar alat,
otomatisasi yang Anda butuhkan ada di penerbitan, bukan penulisan.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Bisakah AI menulis changelog?&lt;/strong&gt;
Bisa menyusun draf. Model yang diberi pull request yang di-merge kebanyakan menghasilkan draf
pertama judul dan badan yang bisa digunakan, yang merupakan langkah pengumpulan dan klasifikasi
yang dilakukan lebih baik. Seleksi, apakah pembaca harus diberi tahu sama sekali, dan formulasi
akhir, masih membutuhkan orang yang tahu audiensnya, dan pipeline yang menerbitkan draf tanpa
gerbang itu telah mengotomatisasi langkah yang salah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa bedanya generator changelog dengan otomatisasi changelog?&lt;/strong&gt;
Generator mengubah commit menjadi daftar yang diformat sekali, sesuai permintaan. Otomatisasi
berjalan di setiap merge, memelihara bak yang belum dirilis, mensyaratkan tinjauan manusia untuk
rilis, dan menerbitkan ke setiap permukaan dari satu sumber. Generator adalah langkah pertama
pipeline, dijalankan secara manual.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah changelog diotomatisasi dari commit atau dari pull request?&lt;/strong&gt;
Dari pull request, di mana unit perubahannya adalah PR: judul dan deskripsi ditulis sekali, untuk
seluruh perubahan, dan PR menautkan issue yang ditutupnya. Penurunan berbasis commit berhasil
ketika commit adalah unitnya dan mengikuti konvensi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana cara mencegah otomatisasi menerbitkan perubahan internal?&lt;/strong&gt;
Klasifikasikan &lt;code&gt;chore&lt;/code&gt;, &lt;code&gt;ci&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;refactor&lt;/code&gt; dan pembaruan dependensi sebagai internal secara
default, dan jadikan promosi ke publik tindakan yang disengaja. Default yang terbalik, publik
kecuali seseorang menyembunyikannya, adalah cara &lt;code&gt;bump deps&lt;/code&gt; sampai ke pelanggan.&lt;/p&gt;
</content:encoded></item><item><title>Changelog vs release notes: apa bedanya?</title><link>https://changeloop.dev/blog/id/changelog-vs-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/changelog-vs-release-notes/</guid><description>Changelog adalah catatan berkelanjutan untuk yang mencari sesuatu. Release notes adalah pesan terkurasi untuk yang memutuskan apakah itu penting.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Changelog adalah catatan berkelanjutan dan kumulatif dari semua yang berubah, ditulis untuk
seseorang yang sedang mencari sesuatu. Release notes adalah pesan terkurasi tentang satu rilis,
ditulis untuk seseorang yang memutuskan apakah itu penting baginya. Perbedaannya ada pada audiens,
bukan format, dan kebanyakan tim membutuhkan keduanya: satu sebagai referensi, satu sebagai
pengumuman, diturunkan dari entri yang sama.&lt;/p&gt;
&lt;p&gt;Kebanyakan tim berakhir dengan salah satunya secara tidak sengaja dan yang lain atas permintaan.
Anda mulai dengan changelog karena seorang developer ingin catatan tentang apa yang dirilis.
Berbulan-bulan kemudian seseorang dari dukungan bertanya mengapa pelanggan tidak tahu tentang fitur
yang sudah aktif sejak April, dan sekarang Anda butuh release notes.&lt;/p&gt;
&lt;h2&gt;Changelog vs release notes, berdampingan&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Changelog&lt;/th&gt;
&lt;th&gt;Release notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Pembaca&lt;/td&gt;
&lt;td&gt;Seseorang yang mencari sesuatu&lt;/td&gt;
&lt;td&gt;Seseorang yang memutuskan apakah itu penting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cakupan&lt;/td&gt;
&lt;td&gt;Semua yang berubah&lt;/td&gt;
&lt;td&gt;Apa yang layak disampaikan tentang rilis ini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kadensi&lt;/td&gt;
&lt;td&gt;Berkelanjutan, per merge atau per rilis&lt;/td&gt;
&lt;td&gt;Per rilis, dan hanya yang layak diumumkan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nada&lt;/td&gt;
&lt;td&gt;Ringkas, faktual, sering imperatif&lt;/td&gt;
&lt;td&gt;Menjelaskan, kadang persuasif&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Masa hidup&lt;/td&gt;
&lt;td&gt;Permanen, dibaca bertahun-tahun kemudian&lt;/td&gt;
&lt;td&gt;Dibaca minggu pertama, lalu diarsipkan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Berada di&lt;/td&gt;
&lt;td&gt;Repo, situs dokumen, halaman &lt;code&gt;/changelog&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Email, in-app, postingan blog, halaman rilis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gagal karena&lt;/td&gt;
&lt;td&gt;Tidak lengkap&lt;/td&gt;
&lt;td&gt;Membosankan, atau datang terlambat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apa itu changelog?&lt;/h2&gt;
&lt;p&gt;Changelog adalah catatan kronologis, hampir lengkap, tentang apa yang berubah, terbaru dulu,
dengan setiap entri diberi jenis (added, changed, deprecated, removed, fixed, security) dan
tanggal. Pembacanya sudah memutuskan bahwa mereka peduli. Mereka sedang mencari sesuatu: kapan
sebuah perilaku berubah, apakah sebuah bug sudah diperbaiki, versi mana yang memperkenalkan flag.
Kelengkapan adalah seluruh nilainya, itulah mengapa konvensi
&lt;a href=&quot;https://changeloop.dev/blog/id/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt; menghabiskan sebagian besar satu
halamannya untuk struktur dan hampir tidak ada untuk prosa.&lt;/p&gt;
&lt;h2&gt;Apa itu release notes?&lt;/h2&gt;
&lt;p&gt;Release notes adalah pesan selektif, ditulis dalam prosa, tentang satu rilis. Pembacanya belum
memutuskan apa pun. Mereka sedang memutuskan apakah rilis ini penting bagi mereka, dan apakah
mereka harus melakukan sesuatu tentang itu. Seleksi adalah seluruh nilainya: release note yang
mendaftar semuanya adalah changelog dengan paragraf, dan mengecewakan pembaca dengan cara yang
sama seperti changelog yang melewatkan sesuatu mengecewakan pembacanya.
&lt;a href=&quot;https://changeloop.dev/blog/id/how-to-write-release-notes/&quot;&gt;Cara menulis release notes&lt;/a&gt; membahas tentang seleksi dan
formulasi.&lt;/p&gt;
&lt;h2&gt;Apakah Anda membutuhkan changelog dan release notes?&lt;/h2&gt;
&lt;p&gt;Anda membutuhkan keduanya begitu kedua audiens Anda menginginkan hal yang berbeda; sebelum itu,
satu artefak yang melakukan kedua tugas adalah benar. Tim kecil menerbitkan satu halaman
&lt;code&gt;/changelog&lt;/code&gt; dengan paragraf singkat di atas setiap entri, dan untuk sementara itu melayani baik
developer yang mencari perbaikan maupun pelanggan yang sekilas mencari berita. Membagi terlalu
dini memberi Anda dua hal untuk dipelihara dan salah satunya akan membusuk.&lt;/p&gt;
&lt;p&gt;Pembagian menjadi layak ketika ini mulai terjadi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Entri changelog Anda telah berkembang menjadi paragraf penjelasan yang dilewati developer.&lt;/li&gt;
&lt;li&gt;Atau sebaliknya: pengumuman rilis Anda mulai mendaftar pembaruan dependensi.&lt;/li&gt;
&lt;li&gt;Dukungan menyalin entri ke email dan menulis ulang di tengah jalan.&lt;/li&gt;
&lt;li&gt;Seseorang meminta &amp;quot;hanya breaking change&amp;quot; dan Anda tidak bisa memfilternya.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yang terakhir itu tanda sebenarnya. Jika tidak ada yang bisa menjawab &amp;quot;apa yang berubah yang
memengaruhi saya&amp;quot; tanpa membaca semuanya, Anda punya satu artefak yang melakukan dua tugas dengan
buruk.&lt;/p&gt;
&lt;h2&gt;Satu sumber, dua tampilan&lt;/h2&gt;
&lt;p&gt;Kesalahannya adalah memperlakukan keduanya sebagai dua dokumen. Keduanya adalah dua tampilan atas
kumpulan perubahan yang sama.&lt;/p&gt;
&lt;p&gt;Tulis changelog seiring waktu, satu entri per perubahan yang berarti, masing-masing diberi label
apa itu: fixed, added, changed, removed, deprecated, security. Jaga entri cukup singkat sehingga
menulis satu bukan keputusan besar. Kemudian, saat rilis, release notes adalah seleksi dan
penulisan ulang: ambil entri yang penting bagi manusia, kelompokkan berdasarkan apa yang
memungkinkan seseorang lakukan, dan letakkan alasannya di atas.&lt;/p&gt;
&lt;p&gt;Ini punya konsekuensi praktis. Jika changelog adalah sumbernya, ia perlu menjadi data
terstruktur, bukan halaman yang dikelola manual. Sebuah entri butuh jenis, tanggal, versi, dan
cara menyatakan untuk siapa itu. Begitu punya itu, halaman publik, widget in-app dan feed
RSS atau JSON adalah tiga rendering dari satu hal, dan tidak ada yang menulis ulang apa pun di tengah
jalan menuju pelanggan. Email release notes bisa mengutip entri yang sama, dari alat apa pun yang
mengirim email Anda. &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-automation/&quot;&gt;Otomatisasi changelog&lt;/a&gt; membahas mana dari
langkah-langkah ini yang seharusnya dimiliki mesin. Itulah seluruh argumen untuk memperlakukan
changelog sebagai feed daripada halaman. Ini juga, secara transparan, apa yang kami bangun, jadi
bacalah ini sebagai kepentingan daripada survei netral.&lt;/p&gt;
&lt;h2&gt;Jika Anda hanya punya waktu untuk satu&lt;/h2&gt;
&lt;p&gt;Tulis changelog. Lebih murah per entri, berguna di hari Anda menulisnya, dan release notes bisa
diturunkan darinya kemudian. Sebaliknya tidak benar: Anda tidak bisa merekonstruksi setahun
perubahan dari dua belas email pengumuman, dan orang akan memintanya dari Anda.&lt;/p&gt;
&lt;p&gt;Simpan dalam format tetap sehingga penurunan tetap mungkin. Halaman &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;contoh changelog&lt;/a&gt;
kami mengumpulkan entri dari tim yang melakukan ini dengan baik, dan &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;template release notes&lt;/a&gt;
adalah bentuk yang kami gunakan saat mengubah sekumpulan entri menjadi sesuatu yang layak dikirim.&lt;/p&gt;
&lt;h2&gt;Catatan tentang penamaan&lt;/h2&gt;
&lt;p&gt;Tidak ada yang distandardisasi dari semua ini, dan Anda akan menemukan &amp;quot;release notes&amp;quot; digunakan
untuk daftar berkelanjutan dan &amp;quot;changelog&amp;quot; digunakan untuk pengumuman triwulanan. Berdebat
tentang kata-katanya tidak sepadan. Putuskan tugas mana dari keduanya yang dilakukan setiap
artefak Anda, namai sesuai apa yang sudah dipanggil tim Anda, dan pastikan tidak ada satu pun yang
diam-diam melakukan keduanya.&lt;/p&gt;
&lt;p&gt;Di permukaan mana hasilnya berakhir adalah keputusan terpisah, dibahas di
&lt;a href=&quot;https://changeloop.dev/blog/id/changelog-page/&quot;&gt;cara membangun halaman changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apakah changelog sama dengan release notes?&lt;/strong&gt;
Tidak. Changelog adalah catatan lengkap, dibaca oleh yang mencari sesuatu; release notes adalah
pengumuman terpilih, dibaca oleh yang memutuskan apakah mereka peduli. Perubahan yang sama muncul
di keduanya, diformulasikan berbeda untuk setiap pembaca.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bisakah release notes dihasilkan dari changelog?&lt;/strong&gt;
Ya, dan itu arah yang benar. Pilih entri yang penting bagi manusia, kelompokkan berdasarkan hasil,
tulis ulang judulnya. Sebaliknya, merekonstruksi changelog dari pengumuman, kehilangan semua yang
dilewatkan pengumuman.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Di mana changelog seharusnya berada?&lt;/strong&gt;
Di suatu tempat permanen dan bisa ditautkan yang bisa dicapai pembaca tanpa repositori: halaman
&lt;code&gt;/changelog&lt;/code&gt;, situs dokumen, atau feed yang dirender di beberapa tempat. &lt;code&gt;CHANGELOG.md&lt;/code&gt; sendiri
menjangkau kontributor, bukan pelanggan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah changelog mencakup perubahan internal?&lt;/strong&gt;
Ya, di bawah, satu baris masing-masing. Changelog adalah catatan lengkap. Release notes juga bisa
menyimpannya, di bagian terakhir yang singkat, asalkan perubahan yang akan diperhatikan pembaca muncul lebih dulu.&lt;/p&gt;
</content:encoded></item><item><title>Dari conventional commits ke changelog</title><link>https://changeloop.dev/blog/id/conventional-commits-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/conventional-commits-changelog/</guid><description>Conventional commits membuat changelog bisa diturunkan, tetapi tidak mudah dibaca. Apa yang diberikan konvensi, di mana berhenti, dan cara menutup celah.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Conventional commits memberi changelog tiga hal secara gratis: jenis setiap perubahan, bagian
sistem yang tersentuh, dan apakah itu merusak sesuatu. Tidak memberi apa pun lagi. Formulasi,
pengelompokan dan seleksi, yang merupakan changelog itu sendiri, tetap sepenuhnya terbuka, dan
pipeline yang berpura-pura sebaliknya mengirimkan git log yang diformat.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;feat(exports): add CSV column selection
fix(auth): reject expired refresh tokens
chore(deps): bump node-pg to 8.11
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tiga commit dalam format &lt;a href=&quot;https://www.conventionalcommits.org/&quot;&gt;Conventional Commits&lt;/a&gt;. Dari ini,
mesin bisa memberi tahu Anda bahwa satu adalah fitur, satu perbaikan, satu perawatan, dan bagian
sistem mana yang tersentuh masing-masing. Itu sungguh berguna, dan itu seluruh janji konvensi:
riwayat commit yang bisa dibaca oleh sesuatu selain manusia. Kesalahannya adalah mengira itu
memberi Anda changelog. Itu memberi Anda bahan mentah.&lt;/p&gt;
&lt;h2&gt;Apa yang ditentukan konvensi?&lt;/h2&gt;
&lt;p&gt;Jenis, scope opsional, dan deskripsi: &lt;code&gt;type(scope): description&lt;/code&gt;. Jenis-jenisnya secara
konvensional adalah &lt;code&gt;feat&lt;/code&gt;, &lt;code&gt;fix&lt;/code&gt;, &lt;code&gt;chore&lt;/code&gt;, &lt;code&gt;docs&lt;/code&gt;, &lt;code&gt;refactor&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;perf&lt;/code&gt;, &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;ci&lt;/code&gt;. Dua
hal menandai breaking change: &lt;code&gt;!&lt;/code&gt; sebelum titik dua, atau footer &lt;code&gt;BREAKING CHANGE:&lt;/code&gt;. Alat
mengandalkan &lt;code&gt;feat&lt;/code&gt; dan &lt;code&gt;fix&lt;/code&gt; untuk kenaikan versi minor dan patch, dan penanda breaking untuk
major.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Commit memberi Anda&lt;/th&gt;
&lt;th&gt;Changelog membutuhkan&lt;/th&gt;
&lt;th&gt;Siapa yang mengisi celah&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;feat&lt;/code&gt; / &lt;code&gt;fix&lt;/code&gt; / &lt;code&gt;chore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added / Fixed / internal&lt;/td&gt;
&lt;td&gt;Pemetaan, otomatis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(scope)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pengelompokan yang dikenali pembaca&lt;/td&gt;
&lt;td&gt;Seseorang, sekali per scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;!&lt;/code&gt; atau &lt;code&gt;BREAKING CHANGE:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Siapa yang rusak, sampai kapan, dan apa yang harus dilakukan&lt;/td&gt;
&lt;td&gt;Seseorang, setiap kali&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deskripsi, ditulis untuk peninjau&lt;/td&gt;
&lt;td&gt;Hasil, ditulis untuk pelanggan&lt;/td&gt;
&lt;td&gt;Seseorang, setiap entri&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Satu commit&lt;/td&gt;
&lt;td&gt;Satu perubahan, yang bisa jadi banyak commit&lt;/td&gt;
&lt;td&gt;Aturan squash, atau seseorang&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Penanda memberi tahu alatnya; tidak memberi tahu pemanggilnya, yang menjadi subjek
&lt;a href=&quot;https://changeloop.dev/blog/id/api-deprecation/&quot;&gt;cara men-deprecate API&lt;/a&gt; dan
&lt;a href=&quot;https://changeloop.dev/blog/id/breaking-changes/&quot;&gt;apa itu breaking change&lt;/a&gt;. Ini spesifikasi kecil dan layak diikuti
bahkan jika Anda tidak pernah menghasilkan apa pun darinya, karena memaksa satu keputusan per
commit: apakah ini perubahan yang dilihat pengguna, atau tidak.&lt;/p&gt;
&lt;h2&gt;Di mana conventional commits berhenti?&lt;/h2&gt;
&lt;p&gt;Berhenti di kalimat. Semua yang ditangkap konvensi adalah metadata tentang perubahan; perubahan
itu sendiri masih dijelaskan dalam kosakata peninjau.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pesan commit ditulis untuk peninjau.&lt;/strong&gt; &lt;code&gt;fix(auth): reject expired refresh tokens&lt;/code&gt; benar dan
tidak memberi tahu apa pun kepada pelanggan. Pembaca changelog ingin &amp;quot;Anda akan diminta login
ulang saat sesi benar-benar kedaluwarsa, alih-alih melihat 401 sesekali&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scope bersifat internal.&lt;/strong&gt; &lt;code&gt;exports&lt;/code&gt;, &lt;code&gt;auth&lt;/code&gt;, &lt;code&gt;ingest&lt;/code&gt; adalah nama modul. Stabil, yang membuat
mereka baik untuk pengelompokan, dan tidak bermakna bagi siapa pun di luar kode basis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Satu perubahan sering kali banyak commit.&lt;/strong&gt; Fitur yang di-merge dalam sebelas commit
menghasilkan sebelas entri, sepuluh di antaranya kebisingan, dan meng-squash untuk menyembunyikan
itu kehilangan riwayat peninjauan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;chore&lt;/code&gt; adalah tempat sampah, bukan kategori.&lt;/strong&gt; Pembaruan dependensi, perubahan CI dan
penggantian nama semuanya jatuh di sana, dan beberapa penting bagi pengguna sementara kebanyakan
tidak.&lt;/p&gt;
&lt;p&gt;Jadi: konvensi memberi Anda jenis, scope dan status breaking secara gratis, dan membiarkan
formulasi, pengelompokan dan seleksi sepenuhnya terbuka. Ketiganya adalah changelog.
&lt;a href=&quot;https://changeloop.dev/blog/id/changelog-entry-ownership/&quot;&gt;Siapa sebenarnya pemilik entri changelog&lt;/a&gt; membahas siapa
yang seharusnya menangani formulasi, pengelompokan, dan seleksi itu, karena konvensinya sendiri
tidak punya pendapat soal itu.&lt;/p&gt;
&lt;h2&gt;Bagaimana changelog dihasilkan dari conventional commits?&lt;/h2&gt;
&lt;p&gt;Dalam dua lapisan, dan yang kedua harus wajib.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lapisan satu, otomatis.&lt;/strong&gt; Saat merge, turunkan entri draf dari commit: jenis dipetakan ke jenis
changelog (&lt;code&gt;feat&lt;/code&gt; ke Added, &lt;code&gt;fix&lt;/code&gt; ke Fixed, penanda breaking ke Changed plus flag), scope disimpan
sebagai metadata alih-alih teks, tautan ke PR. Letakkan di bagian Unreleased yang diminta
&lt;a href=&quot;https://changeloop.dev/blog/id/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lapisan dua, manusia, dan diwajibkan.&lt;/strong&gt; Sebelum rilis keluar, setiap entri draf mendapat
penulisan ulang satu baris dalam kosakata pengguna, atau ditandai internal dan dihapus dari
tampilan publik. Ini langkah yang dicoba dilewatkan orang, dan melewatkannya menghasilkan
changelog yang terbaca seperti diff.&lt;/p&gt;
&lt;p&gt;Detail desain yang penting adalah lapisan dua tidak opsional dalam pipeline. Jika rilis bisa
dipotong dengan draf yang tidak diedit, itu akan terjadi, di minggu yang sibuk. Langkah mana yang
milik mesin dan mana milik orang adalah seluruh isi
&lt;a href=&quot;https://changeloop.dev/blog/id/changelog-automation/&quot;&gt;otomatisasi changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Memotong rilis juga saat tag git, rilis, dan entri changelog ini bisa selaras atau mulai tidak
sinkron; &lt;a href=&quot;https://changeloop.dev/blog/id/git-tags-releases-changelog/&quot;&gt;tag git, rilis, dan changelog Anda&lt;/a&gt; membahas cara
menjaga ketiganya tetap sinkron.&lt;/p&gt;
&lt;h2&gt;Tiga jebakan&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Squash merge memakan footer.&lt;/strong&gt; Jika platform Anda meng-squash dengan judul PR sebagai pesan,
footer &lt;code&gt;BREAKING CHANGE:&lt;/code&gt; dari commit di dalam branch itu menghilang, dan alat Anda diam-diam
berhenti melihat breaking change. Periksa apa yang sebenarnya disimpan template squash Anda.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Commit revert menghasilkan entri hantu.&lt;/strong&gt; &lt;code&gt;fix&lt;/code&gt; yang di-revert keesokan harinya menghasilkan
entri untuk sesuatu yang tidak pernah dirilis, kecuali penurunannya merekonsiliasi revert.
Kebanyakan alat tidak melakukan itu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kenaikan versi dan changelog jadi tidak sinkron.&lt;/strong&gt; Jika versi dihitung dari commit dan
changelog ditulis manual setelahnya, keduanya menyimpang dalam sekitar dua rilis. Hitung keduanya
dalam satu langkah yang sama atau terima salah satunya salah.&lt;/p&gt;
&lt;h2&gt;Jika Anda ingin bagian mekanisnya tanpa pipeline&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/changelog-generator&quot;&gt;Generator changelog&lt;/a&gt; kami melakukan langkah penurunan di browser: tempel
commit, dapatkan entri yang dikelompokkan dan berjenis. Ini sengaja deterministik dan sepenuhnya
sisi klien, jadi commit yang Anda tempel tidak pernah meninggalkan mesin Anda, yang penting saat
pesan berasal dari repositori privat. Melakukan separuh pengumpulan dengan jujur dan tidak mencoba
lapisan dua, karena lapisan dua adalah penilaian dan alat yang memalsukannya menghasilkan
tepatnya changelog yang diperdebatkan artikel ini.&lt;/p&gt;
&lt;p&gt;Untuk versi pipeline, &lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;alat changelog&lt;/a&gt; mencakup apa yang ada.&lt;/p&gt;
&lt;h2&gt;Ringkasan&lt;/h2&gt;
&lt;p&gt;Conventional commits menjawab &amp;quot;jenis perubahan apa ini&amp;quot; secara andal dan murah. Tidak menjawab
&amp;quot;apa yang harus kita katakan kepada orang-orang&amp;quot;, dan tidak ada jumlah alat di atas pesan commit
yang akan melakukannya, karena informasinya tidak pernah ada di pesan commit. Anggarkan untuk
penulisan ulang.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apakah conventional commits menghasilkan changelog secara otomatis?&lt;/strong&gt;
Mereka menghasilkan draf secara otomatis: entri berjenis, dengan scope, tertaut. Formulasi untuk
pelanggan, pengelompokan dan keputusan apa yang dihilangkan masih membutuhkan seseorang, dan
pipeline yang melewatkan langkah itu menerbitkan pesan commit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jenis conventional commit mana yang muncul di changelog?&lt;/strong&gt;
&lt;code&gt;feat&lt;/code&gt; dan &lt;code&gt;fix&lt;/code&gt; selalu, sebagai Added dan Fixed. &lt;code&gt;perf&lt;/code&gt; biasanya, sebagai Changed. &lt;code&gt;chore&lt;/code&gt;,
&lt;code&gt;docs&lt;/code&gt;, &lt;code&gt;refactor&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;build&lt;/code&gt; dan &lt;code&gt;ci&lt;/code&gt; bersifat internal secara default dan hanya muncul
jika seseorang mempromosikan salah satunya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana conventional commits menandai breaking change?&lt;/strong&gt;
Sebuah &lt;code&gt;!&lt;/code&gt; setelah jenis atau scope (&lt;code&gt;feat(api)!: ...&lt;/code&gt;), atau footer &lt;code&gt;BREAKING CHANGE:&lt;/code&gt; di badan
commit. Keduanya hilang jika squash merge hanya menyimpan judul PR.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah Anda perlu conventional commits untuk mengotomatisasi changelog?&lt;/strong&gt;
Tidak. Label PR, template PR dan tautan issue membawa metadata yang sama untuk tim yang merge
lewat pull request. Conventional commits adalah opsi termurah ketika unit perubahannya adalah
commit.&lt;/p&gt;
</content:encoded></item><item><title>Cara menulis release notes yang benar-benar dibaca orang</title><link>https://changeloop.dev/blog/id/how-to-write-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/how-to-write-release-notes/</guid><description>«Perbaikan bug dan peningkatan performa» bukan release note. Pertanyaan yang harus dijawab setiap entri, dan penulisan ulang dari satu yang nyata.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Untuk menulis release notes yang dibaca orang, jawab satu pertanyaan per entri: apa yang bisa
dilakukan pembaca sekarang yang sebelumnya tidak bisa, dan apa yang harus mereka lakukan. Letakkan
apa pun yang punya tenggat waktu di paling atas, sebutkan siapa yang terdampak, katakan &amp;quot;tidak ada
tindakan yang diperlukan&amp;quot; jika itu benar, dan lewati rilis yang tidak punya apa-apa untuk
disampaikan. Semua hal lain di halaman ini adalah penerapan aturan itu.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Perbaikan bug dan peningkatan performa.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Setiap produk pernah merilis ini. Penyebabnya jarang kemalasan: ini yang terjadi ketika release
notes ditulis dari dalam, oleh seseorang yang sudah dua minggu tenggelam dalam diff dan tidak bisa
lagi melihat bagian mana yang akan dipedulikan orang luar. Gaya bahasa yang lebih baik tidak akan
memperbaikinya; menjawab pertanyaannya yang akan.&lt;/p&gt;
&lt;h2&gt;Apa yang harus dicakup release notes?&lt;/h2&gt;
&lt;p&gt;Release notes harus mencakup, untuk setiap perubahan yang layak disebut: apa yang bisa dilakukan
pembaca sekarang, siapa yang terdampak, apa yang harus mereka lakukan (termasuk &amp;quot;tidak ada&amp;quot;), dan
kapan sesuatu yang punya tenggat waktu berlaku. Release notes tidak boleh mencakup nomor tiket
internal, nama komponen yang hanya digunakan tim, atau nomor versi sebagai satu-satunya judul.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sertakan&lt;/th&gt;
&lt;th&gt;Hilangkan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Hasil, dalam bahasa pembaca&lt;/td&gt;
&lt;td&gt;Implementasi, dalam bahasa tim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Siapa yang terdampak, berdasarkan paket, peran atau versi API&lt;/td&gt;
&lt;td&gt;&amp;quot;Beberapa pengguna&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tindakan yang diperlukan, atau &amp;quot;tidak ada tindakan yang diperlukan&amp;quot;&lt;/td&gt;
&lt;td&gt;Kesunyian, yang diisi pembaca dengan skenario terburuk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tanggal untuk apa pun yang punya tenggat waktu&lt;/td&gt;
&lt;td&gt;Nomor versi yang menggantikan tanggal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tautan ke dokumen yang menjelaskan&lt;/td&gt;
&lt;td&gt;Tautan ke pull request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bug yang dilaporkan orang, dan batas yang dinaikkan&lt;/td&gt;
&lt;td&gt;Id tiket internal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bagian yang membosankan, satu baris masing-masing, di bawah&lt;/td&gt;
&lt;td&gt;Bagian yang membosankan bercampur dengan berita&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Pemisahan antara release note dan &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-vs-release-notes/&quot;&gt;entri changelog&lt;/a&gt; adalah
yang membuat daftar ini mungkin: changelog menyimpan semuanya, jadi catatan bisa melewatkan
sesuatu. Contoh beranotasi untuk setiap jenis entri dikumpulkan di
&lt;a href=&quot;https://changeloop.dev/blog/id/release-notes-examples/&quot;&gt;contoh release notes&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Pertanyaan yang dijawab setiap entri&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apa yang bisa dilakukan pembaca sekarang yang sebelumnya tidak bisa, dan apa yang harus mereka
lakukan?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Jika sebuah entri tidak bisa menjawab itu, entri tersebut milik changelog, bukan release notes.
Kedua bagian penting. Bagian pertama adalah nilai. Bagian kedua adalah yang dilupakan tim, dan itu
yang menghasilkan tiket dukungan ketika hilang.&lt;/p&gt;
&lt;p&gt;Dua contoh bagian kedua yang benar-benar bekerja:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Webhook yang ada tetap berfungsi hingga 1 November. Setelah itu, payload yang tidak
ditandatangani akan ditolak.&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Tidak ada tindakan yang diperlukan. Ekspor yang ada akan dienkode ulang secara otomatis saat
Anda membukanya lagi.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yang kedua secara eksplisit mengatakan &amp;quot;tidak ada tindakan yang diperlukan&amp;quot;. Kalimat itu layak
ditulis setiap kali, karena pembaca yang tidak menemukannya akan mengasumsikan yang terburuk.&lt;/p&gt;
&lt;h2&gt;Bagaimana release notes harus diurutkan?&lt;/h2&gt;
&lt;p&gt;Urutkan berdasarkan konsekuensi bagi pembaca, jangan pernah berdasarkan bagian sistem yang berubah.
Mengelompokkan berdasarkan API, dasbor, seluler dan infrastruktur adalah bagan organisasi Anda,
bukan masalah pembaca.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Breaking change dan apa pun yang punya tenggat waktu.&lt;/strong&gt; Selalu pertama, meski kecil. Jika
pembaca berhenti membaca setelah satu baris, ini baris yang harus mereka baca. Jika tenggat
waktunya adalah sunset, entri tersebut harus terdengar seperti
&lt;a href=&quot;https://changeloop.dev/blog/id/api-deprecation/&quot;&gt;pemberitahuan deprecation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apa yang baru dan akan mereka inginkan.&lt;/strong&gt; Satu per paragraf, dengan hasil di klausa pertama.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apa yang membaik.&lt;/strong&gt; Bug yang dilaporkan, batas yang dinaikkan, hal-hal yang lambat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Semua yang lain, sebagai daftar.&lt;/strong&gt; Pembaruan dependensi, refactor internal, salinan kecil.
Satu baris masing-masing. Tidak ada yang membaca bagian ini, dan tetap harus ada, karena orang
yang mencarinya benar-benar membutuhkannya.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Penulisan ulang&lt;/h2&gt;
&lt;p&gt;Sebelum:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;v4.2.0&lt;/strong&gt; Memperbaiki masalah di mana endpoint &lt;code&gt;POST /exports&lt;/code&gt; sesekali mengembalikan 500 saat
beban tinggi. Merefaktor worker ekspor. Memperbarui &lt;code&gt;node-pg&lt;/code&gt; ke 8.11. Meningkatkan penanganan
error di serializer CSV.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sesudah:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ekspor tidak lagi gagal pada akun besar.&lt;/strong&gt;
Akun dengan lebih dari sekitar 50.000 baris bisa mendapatkan 500 saat memulai ekspor, lebih
sering di akhir bulan. Ini sudah diperbaiki, dan ekspor ukuran apa pun sekarang mencoba lagi
sendiri alih-alih gagal. Tidak ada tindakan yang diperlukan, dan ekspor mana pun yang gagal
minggu lalu bisa langsung dijalankan ulang.&lt;/p&gt;
&lt;p&gt;Juga di 4.2.0: &lt;code&gt;node-pg&lt;/code&gt; 8.11, error yang lebih jelas di serializer CSV.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rilis yang sama. Yang kedua menyebutkan akun yang terdampak, saat kondisinya terburuk, apa yang
berubah, dan apa yang harus dilakukan. Pembaruan dependensi tidak menghilang, hanya berhenti
menjadi judul. Artikel &lt;a href=&quot;https://changeloop.dev/blog/id/release-notes-best-practices/&quot;&gt;praktik terbaik release notes&lt;/a&gt;
punya sisa aturan yang diikuti penulisan ulang ini, masing-masing dengan biaya melewatkannya.&lt;/p&gt;
&lt;h2&gt;Hal-hal yang layak dihapus&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;Kami dengan senang hati mengumumkan.&amp;quot;&lt;/strong&gt; Pembaca belum senang. Dapatkan itu di kalimat
berikutnya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nomor tiket internal.&lt;/strong&gt; &lt;code&gt;PROJ-4471&lt;/code&gt; tidak berarti apa-apa di luar tracker Anda. Jika entri
butuh referensi, tautkan ke halaman dokumen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nama komponen yang hanya digunakan tim Anda.&lt;/strong&gt; Jika Anda mengganti nama &amp;quot;pipeline ingest&amp;quot;,
katakan &amp;quot;impor&amp;quot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nomor versi sebagai satu-satunya judul.&lt;/strong&gt; &lt;code&gt;v4.2.0&lt;/code&gt; adalah label pengarsipan, bukan ringkasan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Screenshot halaman pengaturan yang tidak pernah dikunjungi siapa pun.&lt;/strong&gt; Tunjukkan hal yang
berubah, dalam penggunaan.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Seberapa sering release notes harus diterbitkan?&lt;/h2&gt;
&lt;p&gt;Terbitkan saat sesuatu terjadi, bukan sesuai jadwal. Catatan yang datang setiap rilis melatih
semua orang untuk mengabaikannya. Catatan yang datang saat sesuatu terjadi dibuka. Tidak apa-apa,
dan biasanya benar, untuk merilis tanpa catatan sama sekali dan menggulirkan entrinya ke set
berikutnya yang punya judul yang layak dibaca.&lt;/p&gt;
&lt;p&gt;Changelog tetap mencatat semuanya. Itulah pembagian kerjanya: changelog lengkap, catatannya
selektif. Jika Anda menjaga changelog tetap terstruktur seiring waktu, menulis catatan menjadi
seleksi dan penulisan ulang, bukan arkeologi.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;Template release notes&lt;/a&gt; adalah bentuk yang kami gunakan untuk langkah
seleksi, dan &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;contoh changelog&lt;/a&gt; mengumpulkan entri dari tim yang
changelog-nya cukup baik untuk diturunkan menjadi catatan.&lt;/p&gt;
&lt;p&gt;Semua ini mengasumsikan halaman yang sepenuhnya Anda kendalikan, tanpa batas panjang dan dengan
tautan yang berfungsi. &lt;a href=&quot;https://changeloop.dev/blog/id/mobile-app-release-notes/&quot;&gt;Release notes untuk aplikasi mobile&lt;/a&gt;
membahas apa yang berubah saat permukaannya adalah daftar App Store atau Play Store.
&lt;a href=&quot;https://changeloop.dev/blog/id/emergency-release-notes/&quot;&gt;Release notes darurat&lt;/a&gt; membahas pengecualian lainnya: apa
yang berubah saat tidak ada waktu tersisa sama sekali untuk mengikuti proses penulisan normal.&lt;/p&gt;
&lt;h2&gt;Satu tes sebelum menerbitkan&lt;/h2&gt;
&lt;p&gt;Baca catatan seperti seseorang yang baru liburan dua minggu dan punya 40 detik. Jika, dalam waktu
itu, mereka tidak bisa memastikan apakah ada yang diminta dari mereka, catatan tersebut belum
selesai, seakurat apa pun catatan itu.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Seberapa panjang release notes seharusnya?&lt;/strong&gt;
Sepanjang yang dibutuhkan perubahan berkonsekuensi, dan tidak lebih satu baris pun. Rilis dengan
satu breaking change dan dua peningkatan adalah tiga paragraf. Mengisi rilis yang sepi agar
terlihat substansial adalah cara pembaca belajar melewatkan catatan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Siapa yang harus menulis release notes?&lt;/strong&gt;
Orang yang memahami perubahannya, diedit oleh seseorang yang tidak memahaminya. Insinyur tahu apa
yang berubah; editor tahu apa yang akan salah dipahami orang luar. Menulis entri saat merge,
selagi insinyur masih mengingatnya, adalah praktik yang membuat ini murah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apakah release notes harus mencakup perbaikan bug?&lt;/strong&gt;
Ya, yang dilaporkan atau dialami seseorang. Nyatakan gejala yang dilihat pembaca, bukan
penyebabnya. &amp;quot;Ekspor lebih dari 50.000 baris gagal&amp;quot; adalah perbaikan yang dikenali pembaca;
&amp;quot;memperbaiki race condition di worker ekspor&amp;quot; adalah pesan commit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa perbedaan antara release notes dan changelog?&lt;/strong&gt;
Changelog adalah catatan lengkap dan berkelanjutan; release notes adalah pesan terkurasi tentang
satu rilis, ditulis untuk orang yang belum memutuskan apakah mereka peduli. Jawaban yang lebih
panjang ada di &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-vs-release-notes/&quot;&gt;changelog vs release notes&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Keep a Changelog, benar-benar diimplementasikan</title><link>https://changeloop.dev/blog/id/keep-a-changelog-implemented/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/keep-a-changelog-implemented/</guid><description>Spesifikasi Keep a Changelog hanya satu halaman. Saat implementasi, tim menyimpang. Apa katanya, apa yang dibiarkan terbuka, dan di mana salahnya.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Keep a Changelog adalah konvensi satu halaman untuk &lt;code&gt;CHANGELOG.md&lt;/code&gt;: versi terbaru dulu, satu
bagian per versi dengan nomor dan tanggal ISO, entri dikelompokkan di bawah enam jenis (Added,
Changed, Deprecated, Removed, Fixed, Security), dan bagian Unreleased di atas untuk entri antar
rilis. Kebanyakan tim yang mengutipnya menerapkan sekitar dua pertiganya, dan sepertiga yang
mereka lewatkan adalah sepertiga yang melindungi pengguna mereka.&lt;/p&gt;
&lt;p&gt;Olivier Lacan menerbitkan &lt;a href=&quot;https://keepachangelog.com/&quot;&gt;Keep a Changelog&lt;/a&gt; pada 2014 dengan
kalimat yang bertahan lebih baik daripada kebanyakan tulisan perangkat lunak: &lt;em&gt;don&amp;#39;t let your
friends dump git logs into changelogs&lt;/em&gt;. Sepuluh tahun kemudian, ini adalah hal terdekat dengan
standar yang dimiliki sudut perangkat lunak ini. Layak membaca sumbernya daripada ringkasannya;
ini membahas bagian-bagian yang dilewatkan.&lt;/p&gt;
&lt;h2&gt;Apa yang diminta Keep a Changelog?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;CHANGELOG.md&lt;/code&gt; di root repo, terbaru dulu, dengan satu bagian per versi. Setiap versi membawa
nomor dan tanggal ISO, dan mengelompokkan entrinya di bawah enam jenis:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Jenis&lt;/th&gt;
&lt;th&gt;Untuk&lt;/th&gt;
&lt;th&gt;Biaya melewatkannya&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;Fitur baru&lt;/td&gt;
&lt;td&gt;Tidak ada; tidak ada yang melewatkan ini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changed&lt;/td&gt;
&lt;td&gt;Perubahan pada perilaku yang ada&lt;/td&gt;
&lt;td&gt;Pembaca menemukan perubahan perilaku dari sebuah error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deprecated&lt;/td&gt;
&lt;td&gt;Fitur yang akan dihapus&lt;/td&gt;
&lt;td&gt;Penghapusan menjadi insiden alih-alih peristiwa terjadwal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;td&gt;Fitur yang dihapus di rilis ini&lt;/td&gt;
&lt;td&gt;Tidak ada yang bisa membedakan penghapusan dari bug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;Perbaikan bug&lt;/td&gt;
&lt;td&gt;Tidak ada; tidak ada yang melewatkan ini juga&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Kerentanan&lt;/td&gt;
&lt;td&gt;Satu-satunya pembaca yang mencarinya tidak menemukannya&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Ditambah bagian &lt;code&gt;Unreleased&lt;/code&gt; di atas, sehingga ada tempat untuk meletakkan entri saat merge
dilakukan, dan sehingga siapa pun bisa melihat apa yang akan datang.&lt;/p&gt;
&lt;p&gt;Itu hampir semuanya. Sisanya adalah alasannya: entri untuk manusia, satu entri per perubahan, dan
berkas adalah dokumen alih-alih log.&lt;/p&gt;
&lt;h2&gt;Bagian mana dari Keep a Changelog yang dilewatkan?&lt;/h2&gt;
&lt;p&gt;Bagian Unreleased, lalu empat dari enam jenis, Security di antaranya, dalam urutan itu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Unreleased&lt;/code&gt; menghilang lebih dulu.&lt;/strong&gt; Ini bagian tanpa tenggat waktu, jadi ini yang pemeliharaan-nya
berhenti lebih dulu, dan begitu hilang entri ditulis saat rilis dari riwayat commit. Itu tepatnya
dump git-log yang diperingatkan spesifikasi sejak awal, dicapai secara bertahap.
&lt;a href=&quot;https://changeloop.dev/blog/id/changelog-automation/&quot;&gt;Otomatisasi changelog&lt;/a&gt; sebagian besar tentang menjaga bagian ini
tetap hidup tanpa perlu diingat siapa pun.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enam jenis menyusut jadi dua.&lt;/strong&gt; Kebanyakan changelog nyata berakhir dengan Added dan Fixed,
karena Changed dan Deprecated memerlukan penilaian tentang apa yang diandalkan seseorang.
Penilaian itu bagian yang berharga. Deprecated khususnya satu-satunya jenis yang merupakan janji
tentang masa depan, dan melewatkannya adalah bagaimana penghapusan berubah menjadi insiden;
mekanisme untuk menepati janji itu ada di &lt;a href=&quot;https://changeloop.dev/blog/id/api-deprecation/&quot;&gt;cara men-deprecate API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security berhenti terpisah.&lt;/strong&gt; Perbaikan keamanan yang diarsipkan di bawah Fixed tidak terlihat
bagi satu-satunya pembaca yang mencarinya. Jaga tetap terpisah bahkan ketika perbaikannya sepele,
dan terutama ketika Anda lebih memilih tidak menarik perhatian padanya.&lt;/p&gt;
&lt;h2&gt;Apa yang tidak dijawab spesifikasi?&lt;/h2&gt;
&lt;p&gt;Ini adalah format berkas. Tidak mengatakan apa-apa tentang pertanyaan yang segera Anda hadapi
setelah mengadopsinya:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bagaimana seseorang mengetahuinya?&lt;/strong&gt; Berkas di repo menjangkau kontributor. Tidak menjangkau
pelanggan yang tidak pernah membuka GitHub.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bagaimana dengan produk tanpa versi?&lt;/strong&gt; Layanan yang di-deploy terus-menerus tidak punya v4.2.0
untuk dikelompokkan. Kebanyakan tim menggantinya dengan tanggal, yang berhasil, dan spesifikasi
tidak merestui atau melarangnya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Siapa yang menulis entrinya?&lt;/strong&gt; Spesifikasi mengasumsikan manusia yang melakukannya. Tidak
mengatakan kapan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bagaimana dengan banyak audiens?&lt;/strong&gt; Satu berkas melayani developer. Tidak melayani konten yang
sama kepada admin non-teknis, dan memformat ulang secara manual untuk mereka adalah tempat
duplikasi dimulai. &lt;a href=&quot;https://changeloop.dev/blog/id/changelog-vs-release-notes/&quot;&gt;Changelog vs release notes&lt;/a&gt; adalah
pembagian yang dibiarkan spesifikasi untuk Anda buat sendiri.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://common-changelog.org/&quot;&gt;Common Changelog&lt;/a&gt;, fork yang lebih ketat dari ide ini,
memperketat sebagian ini: melarang formulasi entri tertentu, mewajibkan tautan ke perubahan, dan
punya pendapat jelas tentang siapa pembacanya. Layak dibaca jika bagian longgar Keep a Changelog
adalah yang terus diperdebatkan tim Anda.&lt;/p&gt;
&lt;h2&gt;Bisakah Keep a Changelog diotomatisasi tanpa membuang git log?&lt;/h2&gt;
&lt;p&gt;Bisa: turunkan draf dari commit terstruktur, letakkan di Unreleased dengan jenisnya sudah terisi
awal, dan wajibkan manusia mengedit formulasinya sebelum rilis dipotong. Peringatan spesifikasi
tentang keluarannya, bukan alatnya. Menurunkan draf dari commit tidak masalah. Menerbitkan draf
itu tanpa penyuntingan yang ditentangnya.&lt;/p&gt;
&lt;p&gt;Mesin menangani pengumpulan dan pemformatan, yang dikuasainya. Manusia menangani seleksi dan
formulasi, yang tidak dikuasainya. &lt;a href=&quot;https://changeloop.dev/blog/id/conventional-commits-changelog/&quot;&gt;Conventional commits&lt;/a&gt;
membahas pembagian dua lapis yang menjadi dasarnya, dan jenis commit mana yang berkaitan dengan
kategori mana dari enam kategori di atas. Rangkuman
&lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;alat changelog&lt;/a&gt; kami mencakup apa yang ada untuk separuh pengumpulan.&lt;/p&gt;
&lt;h2&gt;Di mana Keep a Changelog berhenti menjadi cukup?&lt;/h2&gt;
&lt;p&gt;Berhenti di distribusi. Keep a Changelog adalah jawaban yang baik untuk &amp;quot;seperti apa berkas ini
seharusnya&amp;quot;. Bukan jawaban untuk &amp;quot;bagaimana pengguna kami tahu apa yang berubah&amp;quot;, karena berkas
Markdown di repo adalah strategi distribusi yang hanya berhasil jika pengguna Anda adalah
kontributor.&lt;/p&gt;
&lt;p&gt;Itulah rintangan yang dihadapi kebanyakan tim kedua: berkasnya baik-baik saja, dan tidak ada yang
di luar tim membacanya. Menyelesaikannya berarti entri harus menjadi data yang bisa dirender di
tempat lain, yang merupakan masalah berbeda dari memformat berkas, dan alasan mengapa
&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;contoh changelog&lt;/a&gt; mengumpulkan halaman changelog publik alih-alih berkas
repositori. Cara mengubah entri itu menjadi sesuatu yang diikuti orang dibahas di
&lt;a href=&quot;https://changeloop.dev/blog/id/changelog-page/&quot;&gt;cara membangun halaman changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Adopsi spesifikasinya tetap saja. Butuh satu sore, membuat masalah kedua bisa ditangani, dan masih
halaman terbaik yang pernah ditulis tentang ini.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apakah Keep a Changelog sebuah standar?&lt;/strong&gt;
Ini konvensi yang diadopsi secara luas, bukan spesifikasi badan standardisasi. Alat (skrip rilis,
linter, parser) sering cukup mengasumsikan bentuknya sehingga mengikutinya membeli kompatibilitas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa yang masuk ke bagian Unreleased?&lt;/strong&gt;
Setiap entri untuk perubahan yang sudah di-merge tapi belum dirilis dalam versi bernomor. Ketika
rilis dipotong, bagian tersebut diganti nama menjadi versi dan tanggal, dan bagian Unreleased baru
yang kosong ditempatkan di atasnya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah changelog menggunakan versi semantik?&lt;/strong&gt;
Keep a Changelog merekomendasikannya dan tidak mewajibkannya. Pustaka dan API mendapat manfaat;
layanan yang di-deploy terus-menerus biasanya menggantinya dengan tanggal, yang diakomodasi
formatnya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah perbaikan keamanan ada di changelog sebelum dipublikasikan?&lt;/strong&gt;
Tambahkan entrinya saat perbaikan dirilis, dengan detail cukup untuk operator bisa bertindak dan
tidak lebih. Menunda entri hingga tanggal pengungkapan terkoordinasi itu normal; menghilangkannya
tidak.&lt;/p&gt;
</content:encoded></item><item><title>Praktik terbaik release notes yang layak dipertahankan</title><link>https://changeloop.dev/blog/id/release-notes-best-practices/</link><guid isPermaLink="true">https://changeloop.dev/blog/id/release-notes-best-practices/</guid><description>Kebanyakan daftar praktik terbaik adalah saran gaya. Ini mengubah apa yang dilakukan pembaca, dan tiga saran populer yang ternyata kultus kargo.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Praktik terbaik release notes yang penting adalah yang punya konsekuensi terlampir: tulis entri
saat merge, sebutkan siapa yang terdampak, nyatakan tindakan yang diperlukan bahkan jika tidak ada,
beri tanggal pada breaking change, pertahankan satu entri permanen per perubahan, kelompokkan
berdasarkan hasil, dan pertahankan bagian yang membosankan. Masing-masing mengubah apa yang
dilakukan pembaca. Sebagian besar saran lain tentang topik ini mengubah tampilan catatan.&lt;/p&gt;
&lt;p&gt;Cari praktik terbaik release notes dan Anda mendapatkan saran gaya: jelas, ringkas, gunakan bahasa
sederhana, tambahkan screenshot. Tidak ada yang salah dari itu semua dan tidak ada yang mengubah
apa pun, karena tidak ada tim yang pernah duduk dengan niat menjadi tidak jelas. Praktik di bawah
ini disertai dengan biaya melewatkannya, karena praktik tanpa mode kegagalan terlampir hanyalah
preferensi.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Praktik&lt;/th&gt;
&lt;th&gt;Biaya melewatkan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Menulis entri saat merge, bukan saat rilis&lt;/td&gt;
&lt;td&gt;Entri yang direkonstruksi kemudian mengatakan &amp;quot;berbagai peningkatan&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menyebutkan siapa yang terdampak&lt;/td&gt;
&lt;td&gt;Setiap pembaca memutuskan itu tidak berlaku untuknya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menyatakan tindakan yang diperlukan, termasuk &amp;quot;tidak ada&amp;quot;&lt;/td&gt;
&lt;td&gt;Empat puluh tiket dukungan yang identik, dan pembaca yang mengasumsikan yang terburuk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memberi tanggal pada breaking change, bukan memversikannya&lt;/td&gt;
&lt;td&gt;Tenggat waktu ditemukan setelah lewat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Satu entri permanen dan bisa ditautkan per perubahan&lt;/td&gt;
&lt;td&gt;Tidak ada yang bisa menjawab &amp;quot;kapan ini berubah&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mengelompokkan berdasarkan hasil, bukan sistem&lt;/td&gt;
&lt;td&gt;Pembaca membutuhkan arsitektur Anda untuk menemukan bagian mereka&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mempertahankan bagian yang membosankan&lt;/td&gt;
&lt;td&gt;Keamanan, kepatuhan, dan yang men-debug ketidakcocokan versi kehilangan sumber mereka&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apa saja praktik terbaik untuk release notes?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tulis entri saat Anda merge, bukan saat Anda rilis.&lt;/strong&gt;
Biaya melewatkan: orang yang merekonstruksi rilis dari riwayat commit bukan yang membuat
perubahan, dan akan menebak niatnya. Entri yang ditulis dua minggu kemudian adalah yang mengatakan
&amp;quot;berbagai peningkatan&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sebutkan siapa yang terdampak, dengan nama.&lt;/strong&gt;
&amp;quot;Tim di paket Business&amp;quot;, &amp;quot;siapa pun yang menggunakan API ekspor v1&amp;quot;, &amp;quot;instalasi self-hosted di
Postgres 14&amp;quot;. Biaya melewatkan: setiap pembaca harus mencari tahu apakah itu berlaku untuknya, dan
kebanyakan akan memutuskan tidak.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nyatakan tindakan yang diperlukan, termasuk saat tidak ada.&lt;/strong&gt;
Biaya melewatkan: dukungan menjawab pertanyaan yang sama empat puluh kali, dan pembaca yang tidak
bertanya berasumsi sesuatu diperlukan dan menundanya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Beri breaking change tanggal, bukan nomor rilis.&lt;/strong&gt;
&amp;quot;Dihapus di v5&amp;quot; tidak berarti apa-apa bagi yang tidak tahu kapan v5 tiba. &amp;quot;Berhenti berfungsi pada
1 November&amp;quot; berarti hal yang sama untuk semua orang. Biaya melewatkan: tenggat waktu ditemukan
setelah lewat. Apa yang termasuk itu, dan checklist untuk merilisnya, ada di
&lt;a href=&quot;https://changeloop.dev/blog/id/breaking-changes/&quot;&gt;apa itu breaking change&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pertahankan satu entri permanen dan bisa ditautkan per perubahan.&lt;/strong&gt;
Email bukan arsip dan pesan Slack bukan referensi. Biaya melewatkan: tidak ada yang bisa menjawab
&amp;quot;kapan ini berubah&amp;quot; enam bulan kemudian, termasuk Anda. Email tetap punya tugas, dibahas di
&lt;a href=&quot;https://changeloop.dev/blog/id/product-update-email/&quot;&gt;template email update produk&lt;/a&gt;; ia menunjuk ke entri alih-alih
menggantikannya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kelompokkan berdasarkan hasil, bukan sistem.&lt;/strong&gt;
Biaya melewatkan: pembaca harus menyimpan arsitektur Anda di kepala untuk mengetahui bagian mana
yang relevan bagi mereka. Urutan yang mengikuti ini ada di
&lt;a href=&quot;https://changeloop.dev/blog/id/how-to-write-release-notes/&quot;&gt;cara menulis release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pertahankan bagian yang membosankan.&lt;/strong&gt;
Pembaruan dependensi dan perubahan internal tetap ada, di bawah, satu baris masing-masing. Biaya
melewatkan: tim keamanan, peninjau kepatuhan, dan yang men-debug ketidakcocokan versi kehilangan
satu-satunya sumber mereka. Entri yang paling sering salah di sini adalah perbaikan;
&lt;a href=&quot;https://changeloop.dev/blog/id/bug-fix-release-notes/&quot;&gt;release notes perbaikan bug&lt;/a&gt; menunjukkan cara menulisnya agar pembaca
tahu apakah mereka perlu bertindak.&lt;/p&gt;
&lt;h2&gt;Apa saja praktik terbaik changelog, dan bagaimana bedanya?&lt;/h2&gt;
&lt;p&gt;Changelog adalah referensi, jadi praktiknya tentang kelengkapan dan struktur, bukan persuasi.
Empat yang penting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Satu jenis entri tetap per baris.&lt;/strong&gt; Added, Changed, Deprecated, Removed, Fixed, Security. Bukan
gaya rumah, tapi filter: itu yang memungkinkan permintaan &amp;quot;hanya breaking change&amp;quot;. Konvensi
&lt;a href=&quot;https://changeloop.dev/blog/id/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt; adalah sumber yang biasa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bagian belum rilis.&lt;/strong&gt; Tempat entri hidup antara merge dan rilis. Ketiadaannya adalah alasan
mengapa tim menulis entri terlambat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tanggal ISO.&lt;/strong&gt; &lt;code&gt;2026-08-28&lt;/code&gt;, bukan &lt;code&gt;28/08/26&lt;/code&gt;, yang berarti dua hari berbeda tergantung
pembaca.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Satu entri per perubahan, bukan per commit.&lt;/strong&gt; Tiga commit yang memperbaiki satu bug adalah
satu entri.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kedua artefak dibandingkan secara menyeluruh di
&lt;a href=&quot;https://changeloop.dev/blog/id/changelog-vs-release-notes/&quot;&gt;changelog vs release notes&lt;/a&gt;; versi singkatnya adalah
praktik changelog melindungi kelengkapan dan praktik release notes melindungi perhatian.
&lt;a href=&quot;https://changeloop.dev/blog/id/private-release-notes-enterprise/&quot;&gt;Release notes privat untuk pelanggan enterprise&lt;/a&gt;
membahas versi ini yang baru muncul begitu pelanggan Anda tidak lagi semuanya berada di build
yang sama: tujuan kelengkapan dan perhatian yang sama, tapi disesuaikan per akun alih-alih
disiarkan ke semua sekaligus.&lt;/p&gt;
&lt;h2&gt;Tiga yang ternyata kultus kargo&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Emoji sebagai jenis entri.&lt;/strong&gt; Roket dan kunci pas bukan taksonomi. Terlihat rapi dan tidak bisa
difilter, diurutkan, atau dibaca secara berguna oleh pembaca layar. Gunakan kata-kata, dan jika
Anda menginginkan emoji, letakkan setelah kata.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nomor versi semantik sebagai judul untuk produk yang di-hosting.&lt;/strong&gt; Semver adalah janji tentang
kompatibilitas API. Untuk produk SaaS di mana tidak ada yang memilih versinya, nomor versi di
judul adalah pengarsipan internal yang menyamar sebagai berita. Simpan semver di changelog dan
jangan masukkan ke pengumuman.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Menerbitkan sesuai jadwal terlepas dari konten.&lt;/strong&gt; Catatan bulanan tanpa isi mengajarkan orang
bahwa catatan Anda adalah kebisingan. Terbitkan saat ada sesuatu untuk disampaikan. Changelog
mencakup sisanya.&lt;/p&gt;
&lt;h2&gt;Yang benar-benar sulit&lt;/h2&gt;
&lt;p&gt;Menjaga changelog dan pengumuman tetap selaras, tanpa menulis semuanya dua kali.&lt;/p&gt;
&lt;p&gt;Kebanyakan tim mulai dengan satu halaman, membaginya saat audiens berbeda, lalu diam-diam
membiarkan salah satunya membusuk, biasanya changelog, karena itu yang tidak punya tenggat waktu
terlampir. Jalan keluarnya bersifat struktural, bukan disiplin: simpan entri sebagai data dengan
jenis, tanggal, dan audiens, dan perlakukan kedua permukaan sebagai rendering dari itu. Rangkuman
&lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;alat changelog&lt;/a&gt; kami mencakup apa yang tersedia untuk itu, termasuk alat yang
kami saingi, dan halaman &lt;a href=&quot;https://changeloop.dev/beamer-alternative&quot;&gt;alternatif Beamer&lt;/a&gt; adalah perbandingan jujur
terhadap widget tempat kebanyakan tim memulai.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;Template release notes&lt;/a&gt; adalah tempat langkah seleksi berada begitu
entri sudah ada.&lt;/p&gt;
&lt;h2&gt;Jika Anda hanya menerapkan satu hal&lt;/h2&gt;
&lt;p&gt;Tulis entri saat merge, dalam format tetap, dengan satu jenis. Setiap praktik lain di halaman ini
menjadi lebih mudah begitu itu diterapkan, dan tidak ada yang bertahan tanpanya.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Haruskah release notes punya screenshot?&lt;/strong&gt;
Hanya dari hal yang berubah, dalam penggunaan. Screenshot halaman pengaturan yang tidak pernah
dikunjungi siapa pun menambah gulir, bukan informasi. Teks yang menyebutkan hasil dan pembaca yang
terdampak mengalahkan gambar yang tidak menunjukkan keduanya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bagaimana cara menulis release notes untuk breaking change?&lt;/strong&gt;
Pertama tanggal, kedua pemanggil yang terdampak, ketiga tindakan yang diperlukan, keempat migrasi.
Jangan pernah memulai dengan nomor versi. Bentuk lengkapnya, dengan contoh entri, ada di
&lt;a href=&quot;https://changeloop.dev/blog/id/breaking-changes/&quot;&gt;apa itu breaking change&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haruskah release notes ditulis oleh engineering atau marketing?&lt;/strong&gt;
Disusun oleh insinyur yang membuat perubahan, saat merge, dan diedit oleh seseorang yang
membacanya sebagai orang luar. Tidak ada satu pun yang sendirian menghasilkan catatan yang bisa
ditindaklanjuti pelanggan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apa format ideal untuk release notes?&lt;/strong&gt;
Pertama item dengan tenggat waktu, lalu kemampuan baru, lalu peningkatan, lalu daftar satu baris
masing-masing untuk sisanya. &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;Template release notes&lt;/a&gt; adalah format itu
sebagai halaman untuk diisi.&lt;/p&gt;
</content:encoded></item></channel></rss>