Anda melakukan pembaikan pada pukul empat petang pada hari Jumaat. Menjelang pagi Sabtu, amaran mula berbunyi. Anda mengesan insiden tersebut berpunca daripada satu pull request yang digabungkan lapan belas jam yang lalu. Cawangan (branch) tersebut berjaya dikompil, ujian lulus, tetapi deskripsi PR kosong. Tiada item kerja yang dipautkan kepadanya. Sejarah kelulusan tidak menunjukkan apa-apa. Anda sedang melihat satu ghost merge, dan kini anda menghabiskan hujung minggu anda untuk membersihkan kekacauan yang sepatutnya dikesan sebelum ia menyentuh main.

Pasukan kecil menghadapi risiko ini setiap hari. Anda tidak mempunyai pengurus pelepasan (release manager) yang memantau setiap penggabungan. Anda tidak mempunyai pasukan platform yang membina enjin polisi tersuai. Apa yang anda ada ialah Azure DevOps, dan polisi cawangan (branch policies) terbina dalamnya adalah alat yang kasar. Ia sama ada menutup pintu rapat-rapat atau membukanya luas-luas. Mewajibkan dua penyemak akan menyekat pembaikan segera (hotfixes) yang mendesak. Melonggarkan peraturan pula menyebabkan deskripsi kosong masuk ke pengeluaran bersama perubahan tanpa tiket. Jarang sekali terdapat jalan tengah.

Jurang itulah sebabnya kami membina Gatekeeper. Ia adalah meja semakan PR berkuasa AI yang direka khusus untuk Azure DevOps, tetapi lupakan segala yang anda sangka tentang alatan pembangun moden. Tiada bekas Docker, tiada pelan langganan, dan tiada saluran paip penggunaan awan (cloud deployment pipeline). Gatekeeper hanyalah satu fail HTML tunggal. Anda membukanya dalam pelayar anda, masukkan empat nilai, dan tekan butang. Alatan tersebut kemudian menjawab tiga soalan mudah: Adakah PR ini dipautkan ke satu tiket? Adakah manusia benar-benar menyemaknya? Dan adakah kualiti kodnya baik?

Keputusan untuk membungkus segalanya ke dalam satu fail kendiri bukanlah satu gimik. Ia menyelesaikan masalah operasi yang sebenar. Pertama, tiada infrastruktur untuk dihoskan atau dibayar. Anda tidak perlu menyediakan App Service atau risau tentang kos egress. Kedua, kredensial tidak pernah meninggalkan mesin anda. Personal access token Azure DevOps anda hanya berada dalam memori pelayar, dan hilang sebaik sahaja anda menyegarkan halaman. Tiada pangkalan data rahsia yang boleh bocor dan tiada pelayan OAuth untuk dipercayai. Ketiga, penggunaan menjadi sangat mudah. Anda tidak perlu melatih sesiapa melalui wiki. Anda lampirkan fail tersebut pada e-mel atau letakkannya dalam bebenang Slack. Penerima membukanya dan mula menyemak dengan serta-merta.

Lapisan Fakta: Keutamaan Determinisme

Gatekeeper membahagikan semakannya kepada dua lapisan yang berbeza, dan pengasingan itu adalah tulang belakang kebolehpercayaannya.

Lapisan pertama adalah JavaScript tulen yang bercakap terus dengan Azure DevOps REST API. Ia menyemak fakta yang tidak berubah. Sama ada satu pull request dipautkan ke item kerja, atau tidak. Sama ada penyemak telah memberikan undi kelulusan, atau tidak. Deskripsi sama ada kosong, atau mengandungi ayat yang sebenar. Perbincangan aktif sama ada telah diselesaikan, atau masih terbuka.

Secara khusus, Lapisan Fakta mencari empat perkara:

  • Pemetaan tiket: Adakah PR dipautkan kepada sekurang-kurangnya satu item kerja?
  • Pengesahan penyemak: Adakah sesiapa mengundi untuk meluluskan, atau bilangannya masih sifar?
  • Kualiti deskripsi: Adakah deskripsi kosong, atau sekadar penanda tempat (placeholder) yang ringkas?
  • Perbincangan terbuka: Adakah terdapat bebenang komen yang belum diselesaikan sementara menunggu maklum balas?

Semakan ini menghasilkan cap visual di seluruh halaman. Cap merah besar NOT MAPPED sukar untuk diabaikan. Tanda semak hijau nipis yang terselip dalam sel jadual mudah terlepas pandang. Kami belajar lebih awal bahawa kegagalan proses perlu dinyatakan dengan jelas. Apabila pembangun sedang tergesa-gesa untuk menggabungkan kod, kehalusan tidak akan berkesan. Lapisan Fakta wujud untuk menghapuskan kekaburan sepenuhnya.

Oleh kerana lapisan ini bergantung pada respons API yang deterministik, ketepatannya adalah mutlak. Jika cap menunjukkan NO APPROVAL, anda boleh pasti bahawa tiada sesiapa yang menekan butang lulus. Jika ia menunjukkan UNRESOLVED THREADS, perbincangan masih berlangsung. Lapisan ini tidak