Live probe Plane: dua asumsi spesifikku tumbang dalam 27 menit
Spesifikasi 905 baris kehilangan dua asumsinya setelah live probe ke Plane CE: marker HTML lenyap disanitasi server, endpoint archive ternyata 404.
Ringkasan
Gue udah bikin spek sinkronisasi panjang banget tapi pas di-probe langsung ketahuan dua asumsi ngaco. Komentar HTML buat marker ternyata kesapu sanitizer server jadi hilang, endpoint archive di CE juga zonk 404. Akhirnya marker dipindah ke teks polos dan config, cleanup cukup pindah status Done aja.
Dua puluh tujuh menit setelah saya menyelesaikan spesifikasi sinkronisasi sepanjang 905 baris, saya duduk kembali di depan terminal. Kali ini bukan untuk nulis, tapi membaca hasil live-probe: satu work item sekali pakai yang saya create, retrieve, update, dan komentar-i langsung di instance Plane Community Edition. Dua asumsi utama spesifikasi itu mati di layar yang sama.
Marker identitas yang saya sembunyikan di dalam komentar HTML? Lenyap. Endpoint archive yang saya andalkan buat cleanup? Server jawab 404. Sembilan ratus baris desain, dan dua fondasinya tumbang sebelum satu baris kode integrasi pun ditulis.
Tebakan awal yang meleset
Desain awalnya ringkas: setiap dokumen yang di-mirror ke work item Plane membawa marker mesin <!-- plane-doc-sync:v2 path=.pm/DECISIONS.md --> di awal deskripsi. Dari marker itu skill tahu dokumen mana pasangan itemnya apa, dan hash terakhir yang tersinkron.
Cleanup juga udah kebayang: item yang selesai tinggal di-archive lewat API, papan kerja tetap bersih. Kiraan saya sederhana, server tinggal menyimpan apa yang saya kirim. Dokumentasi resmi menampilkan field description_html, saya mengirim HTML, masa iya ada yang diubah.
Yang sebenarnya tersimpan
Probe membongkar keduanya sekaligus. Respons create memang meng-echo persis HTML yang saya kirim, jadi beberapa detik pertama rasanya semua aman. Tapi begitu item yang sama saya retrieve, yang kembali versi lain: komentar HTML hilang total, dan fragmen multi-elemen dibungkus ulang jadi satu <div> tunggal. Apa yang saya kirim bukan apa yang disimpan.
Endpoint archive? Di build CE ini jawabannya 404. Bukan error izin, bukan validasi gagal, endpoint itu memang nggak ada.
Setelah dibaca dari arah kode sumbernya, semuanya masuk akal. Plane mensanitasi HTML di sisi server pakai nh3 dengan allowlist tag, atribut, dan skema URL [3]. Komentar HTML jelas bukan anggota allowlist itu. Bahkan jalur komentar dan intake baru ditutup pada perbaikan keamanan Juni 2026 yang mewajibkan validate_html_content() di serializer terkait [2]. Sebelum tanggal itu, sebagian jalur masih menyimpan HTML mentah.
Field yang stabil justru bukan HTML mentah. Dokumentasi API memuat description_stripped, versi strip dari deskripsi html yang digenerate otomatis oleh aplikasi [1]. Server memang selalu membuat turunan teks polos dari deskripsi. Kalau butuh identitas atau hash, plane teks itulah yang layak dipakai, bukan HTML yang bentuknya bisa diatur ulang diam-diam.
Soal 404 tadi, itu konsekuensi model rilis mereka. Community Edition punya codebase terpisah dengan siklus rilis sendiri, dan fitur baru mendarat paling akhir di sana [5]. Edisi ini sejajar dengan Cloud Free tier, bukan tier berbayar [4]. Sementara dokumentasi dan permukaan tool resmi (MCP server dengan 28 tool dan 183 aksi [6]) mendeskripsikan permukaan cloud. Kalo endpoint cloud dianggap otomatis ada di CE, hasilnya persis kayak yang saya alami: 404 justru saat paling dibutuhkan.
Keputusan pasca-probe
Spesifikasi langsung di-amend. Marker pindah jadi baris teks pertama yang terlihat, plane-doc-sync:v2 path=... polos tanpa komentar HTML, dan identitas item (ID work item per dokumen) pindah ke file konfigurasi .pm/plane.json. Metadata mesin harus hidup di tempat yang nggak akan dibersihkan sanitizer.
Cleanup tanpa archive: item mirror yang selesai cukup pindah ke status Done, dan item probe sekali pakai hanya boleh dihapus kalo memang dibuat sendiri oleh probe itu. Deteksi drift pakai updated_at yang maju di tiap penulisan, sementara hash dihitung dari teks hasil ekstraksi yang dinormalisasi. Nggak pernah lagi dari HTML mentah yang bentuknya diatur server.
Satu item probe sekali pakai, sepuluh menit kerja, dan dua halaman spesifikasi selamat dari implementasi yang pasti remes. Probe dulu, baru percaya. Apalagi kalo targetnya edisi self-hosted yang selalu dapat fitur paling akhir.