Blog
Catatan teknis seputar web development, DevOps, dan integrasi AI.
504 artikel
- 17.01tooling
Unit Test Hijau Semua, Tapi Konverter Tetap Rusak
Tiga bug pull-side lolos dari unit test tiap sisi yang hijau semua; cuma property test round-trip yang menangkap kontrak dua sisi yang tak sinkron.
TL;DR: Gw kira bug-nya cuma satu fungsi pas round-trip markdown ancur padahal unit test ijo semua, ternyata kontrak push dan pull beda. Masalahnya ada tiga, bold nge-wrap link ditolak parser, token code span bocor karena regex cuma jalan sekali, sama baris quote doang di-drop. Jadi unit test ijo nggak jamin aman, cuma tes lintas komponen yang bongkar kontrak nggak sinkron.
#plane#python#markdown - 16.16tooling
Konverter dua arah: konservatif saat push, toleran saat pull
Bug garis horizontal yang hilang diam-diam mengungkap desain konverter dua arah yang sehat: push kanonik, pull toleran tapi tetap menolak keras.
TL;DR: Gue kira Plane yang ngapus garis horizontal pas pull, ternyata parser pull gue sendiri yang diam-diam nelen <hr> karena cuma kenal <hr />. Sekarang yang nggak dikenal langsung dilempar error pakai nomor baris, nggak lagi hilang senyap. Dari situ desainnya dibikin push yang konservatif dan pull yang toleran tapi cuma di dialek sendiri, plus tes round-trip biar aman.
#plane#python#markdown - 15.10tooling
Konverter Markdown yang bisa dipercaya justru pilih menolak
Parser Markdown dua arah di alat sync repo ke Plane Pages sengaja menolak sintaks di luar subset, biar mirror nggak rusak diam-diam.
TL;DR: Pull dokumen ke Plane gagal total cuma gara gara raw HTML di baris 57 langsung error. Parsernya emang dibikin strict cuma mau subset kecil kayak heading list tabel jadi sisanya ditolak pakai nomor baris. Galak di awal tapi enak banget soalnya mending error cepet daripada konten kepotong diam diam baru ketahuan belakangan.
#plane#python#markdown - 14.05devops
Mirror dokumen pindah kantor: dari work item ke Plane Pages
Halaman API Plane bikin mirror dokumen versi work item terasa salah tempat. Kontrak penyimpanannya berubah, desain identitas mirror ikut dibongkar.
TL;DR: Gue kira tinggal ganti endpoint Pages beres, ternyata kontrak storagenya beda total bikin desain mirror harus dibongkar. Di Pages HTML disimpen verbatim jadi marker bisa ngumpet di komen, kalau update itu ngereplace semua bukan nambahin. Halamannya datar tanpa folder, hapus harus diarsip dulu, dan gambar tetep nangkring di git aja.
#plane#self-hosting#git - 23.25devops
Status Done di tracker cuma klaim, buktinya ada di Git
Kartu Done tanpa bukti itu kata-kata. Sekarang work item cuma boleh Done kalau hash commit di baris Buktinya beneran resolve di Git.
TL;DR: Awalnya gue kira status Done di board udah paling bener, ternyata cuma klaim kosong kalau nggak ada bukti commit-nya. Makanya gue bikin gate yang ngunci, kartu baru boleh Done kalau baris "Bukti: hash" di deskripsi beneran ke-resolve di Git. Soalnya hash Git itu nggak bisa bohong, tanggal selesainya juga ngambil dari aktivitas tracker bukan timestamp commit.
#plane#self-hosting#git - 23.25backend
Sync dokumen dua arah: yang layak dipercaya rajin menolak
Pull balikin isi yang beda dari yang saya push, tanpa error. Ternyata jawabannya bukan parser yang lebih pintar, tapi peta penolakan yang presisi.
TL;DR: Gue pull markdown terus formatnya hilang tanpa error, ternyata server Plane ngebersihin description_html pakai nh3 clean jadi rich-editor kebuang diam-diam. Akhirnya gue putar haluan, identitas dokumen dipindah ke description_stripped yang aman dan sistem milih nolak daripada maksa nebak. Makanya dibikin enam status jelas biar tau kapan harus abort daripada data ilang setengah tanpa jejak.
#plane#self-hosting#sync - 23.24devops
Plane onboarding satu pintu: logika di pusat, data di tepi
Nyaris menyalin folder skill plane-init ke tiap repo. Ternyata satu pintu lebih sehat: logika di satu repo, config dan template di repo konsumen.
TL;DR: Gue hampir copy-paste skill plane-init ke tiap repo biar mandiri tapi sadar itu bakal jadi mimpi buruk maintenance. Akhirnya skill dibikin terpusat aja, repo lain cuma simpan config ringan dan template. Enak soalnya skill berat tetap murah diload, logic di pusat data di pinggiran.
#plane#self-hosting#claude-code - 22.30devops
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.
TL;DR: 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.
#plane#self-hosting#rest-api - 15.57backend
Saat Saya Berhenti Memisahkan Kode Berdasarkan Lapisan Teknis
Commit d7f02b2 memperkenalkan aturan wajib vertical slice architecture dan 4-tier testing: setiap fitur dibangun end-to-end dalam satu iterasi, bukan layer-by-layer horizontal. Hasilnya development lebih cepat, bug tertangkap di layer murah via Testcontainers, dan isolasi fitur bersih tanpa efek samping.
TL;DR: Awalnya gue kira pisah kode per layer itu rapi, eh pas fitur nambah malah pusing karena ubah DB dikit API bisa error. Sekarang pakai vertical slice jadi satu fitur ngumpul dari migrasi sampai frontend, lebih aman nggak merembet kemana-mana. Testingnya dibagi empat level pakai Testcontainers dan Playwright buat alur kritis, debuggingnya juga wajib urut biar nggak asal tebak.
#vertical-slice-architecture#testing#testcontainers