Pipeline Konten Claude Code untuk Blog Next.js Dwibahasa

Karena satu item konten bisa menyentuh beberapa berkas yang saling terkait, dan suntingan separuh jalan adalah bug produksi yang senyap. Staging mengubah keluaran agen menjadi proposal yang divalidasi penuh oleh satu skrip deterministik — pohon kunci, metadata, aset — sebelum ia menulis apa pun ke repositori.
Penyimpangan pohon kunci: satu poin tambahan atau bagian yang diganti nama, ditulis di satu bahasa dan tidak di bahasa lainnya. Ia tidak gagal dengan berisik, hanya merusak satu locale dari satu halaman di produksi, dan karena itulah kesetaraan kedua pohon kunci harus menjadi pemeriksaan keras, bukan sekadar butir tinjauan.
Hanya kalau validasinya mencakup semua yang bisa gagal saat menulis. Skrip di sini memvalidasi seluruh kontennya dengan benar, lalu gagal di tengah penulisan karena konstanta yang menjadi titik sisipnya sudah pindah ke modul lain — meninggalkan repo dalam keadaan merge separuh. Penyelesaian anchor dan keberadaan path adalah milik fase validasi.
Ambil gambarnya dengan skrip yang membaca penulis dan lisensinya dari API sumber alih-alih mengetiknya manual, lalu simpan hasilnya di satu registry bertipe yang di-spread komponen artikel ke komponen figur. Satu gambar yang dipakai tiga artikel lalu membawa satu atribusi yang bisa diperbaiki di satu tempat.
Kuat di struktur, konsistensi gaya rumah, dan menghasilkan bahasa kedua yang wajar. Lemah dalam mengetahui apa yang benar dan dalam menahan diri — setiap angka spesifikasi butuh sumber, dan kerangka bagian yang tetap per jenis artikel mencegah bagian kelima yang mengulang bagian kedua.

Ringkasan Utama
Menerbitkan satu artikel dwibahasa di sini menyentuh lima berkas yang saling terkait, jadi agen tidak pernah menyuntingnya langsung: ia menulis folder staging, dan satu skrip memvalidasi paritas pohon kunci, kelengkapan terjemahan, dan metadata sebelum menulis apa pun. Pagar pengamannya, bukan tulisannya, yang membuat konten buatan agen aman dirilis.
Situs ini punya beberapa ratus artikel, masing-masing ada dua kali — sekali dalam bahasa Inggris dan sekali dalam bahasa Indonesia — dengan pohon kunci yang sama, komponen yang sama, dan data terstruktur yang sama. Itu masalah konten yang tampak seperti masalah menulis padahal sebenarnya masalah konsistensi, dan konsistensi justru titik terlemah model bahasa sekaligus titik terkuat sebuah skrip.
Maka pipeline-nya dibangun di atas pembagian kerja: agen menulis prosa dan memilih struktur, dan skrip deterministik memutuskan apakah keluaran itu boleh masuk ke repositori. Berikut cara kerjanya, termasuk kegagalan yang ia alami hari ini.
Satu artikel yang terbit tersebar di basis kode karena bagian-bagian framework membutuhkan potongan yang berbeda darinya.
Menyunting lima berkas dengan tangan untuk satu artikel itu melelahkan; menyuntingnya untuk dua puluh artikel adalah jaminan penyimpangan. Ketidakcocokannya juga tidak gagal dengan berisik — satu kunci yang hilang merusak satu locale dari satu artikel di produksi, jenis bug yang bisa bertahan berbulan-bulan.

Aturan yang membuat semuanya aman adalah agen menghasilkan proposal, bukan suntingan. Semuanya mendarat di direktori staging, dan hanya skrip merge yang boleh menyentuh repositori.
# The agent never edits the five coupled files by hand. It stages, then
# one script validates everything and only then writes anything.
/tmp/blog-staging/agent-a/
registry.json # slug, category, dates, cover, SEO title and description
en.json # the English fragment, keyed by translationKey
id.json # the Indonesian fragment, same key tree
faqs.json # five bilingual question and answer pairs
node scripts/merge-blog-staging.mjs # validates, then edits 5 repo files
node scripts/merge-blog-faqs.mjs # adds FAQPage schema data
npx tsc --noEmit && npm run build # parity guard runs inside the buildSkrip itu memeriksa daftar spesifik sebelum menulis satu byte pun: slug dan kunci terjemahan yang unik, kategori dan bulan yang valid, tanggal yang benar, berkas sampul yang benar-benar ada di disk, berkas komponen yang ada, dua pohon kunci locale yang identik, tidak adanya karakter yang merusak format pesan, dan metadata yang lengkap. Baru setelah itu ia menyunting kelima berkasnya.
Setiap pemeriksaan dalam daftar itu ada karena sesuatu pernah salah. Lima yang paling sering membuktikan kegunaannya adalah ini.
Tak satu pun dari ini pintar. Semuanya murah, mekanis, dan mengubah satu kelas bug produksi yang senyap menjadi skrip yang menolak berjalan.
Buat validatornya bisa dijalankan terhadap artikel yang sudah terbit juga, bukan hanya yang di-staging. Retrofit sepenuhnya melewati jalur staging, dan terjemahan yang disunting tangan adalah persis tempat penyimpangan pohon kunci menyelinap kembali.
Saat menulis artikel ini, skrip merge-nya gagal dengan cara yang paling mendidik: ia memvalidasi semuanya dengan benar, mulai menulis, lalu melempar error di tengah jalan.
Error: anchor not found in lib/blog-posts-static.ts:
export const REAL_IMAGE_SLUGS = new Set([
# What had happened: the constant moved to lib/blog-display.ts months ago.
# The merge script validated the staged content perfectly, started writing,
# updated messages/en.json, messages/id.json and the post registry, and
# THEN failed on an anchor it could no longer find.
# The repo was left half-merged: translations present, metadata missing.
# Re-running would not help either, because the script skips slugs that
# already exist in en.json — it considered the work done.Penyebabnya adalah anchor. Skrip menyisipkan entri baru setelah baris kode tertentu, dan salah satu konstanta itu sudah pindah ke modul lain beberapa waktu lalu. Karena anchor diselesaikan saat menulis alih-alih saat validasi, skrip sudah memperbarui kedua berkas pesan dan registry artikel sebelum menemukan bahwa target ketiganya tidak ada. Lebih buruk lagi, menjalankan ulang bukan jalur pemulihan: skrip melewati slug yang sudah ada di pesan bahasa Inggris, jadi ia menganggap pekerjaannya selesai.
Skrip validate-then-write hanya atomik kalau validasinya mencakup semua yang bisa gagal saat penulisan. Penyelesaian anchor, izin berkas, dan keberadaan path semuanya adalah milik fase validasi — kalau tidak, Anda punya skrip yang hati-hati terhadap data Anda dan ceroboh terhadap prasyaratnya sendiri.
Prinsip yang sama berlaku untuk aset. Gambar sampul dihasilkan dari template situs sendiri, sehingga selalu berukuran benar, selalu sesuai merek, dan tidak pernah berupa foto stok yang lisensinya tak seorang pun periksa. Gambar dalam artikel diunduh dari Wikimedia Commons oleh skrip yang membaca penulis dan lisensinya dari API lalu menuliskannya ke registry bertipe.
# Covers are generated from the site's own template, not downloaded.
node scripts/generate-blog-cover.mjs --manifest covers.json
# In-article images are fetched from Wikimedia Commons, re-encoded, and
# their author and licence are read from the API rather than typed by hand.
node scripts/fetch-blog-inline-images.mjs \
--manifest images.json --report report.json
# The report becomes a typed registry, so one image reused by three posts
# carries exactly one credit line that can be corrected in one place.
export const BLOG_FIGURES: Record<string, BlogFigureSource> = { ... };Registry itulah bagian yang akan saya rekomendasikan kepada siapa pun yang melakukan hal serupa. Karena kredit tinggal di satu berkas alih-alih diketik ulang di tiap artikel, gambar yang dipakai tiga artikel membawa satu string atribusi, dan memperbaiki yang keliru cukup satu suntingan, bukan pencarian ke seluruh katalog.

Setelah beberapa ratus artikel melewati pipeline ini, pembagiannya jelas dan sedikit berlawanan dengan dugaan.
Ringkasan jujurnya: modelnya penulis draf yang kuat sekaligus pemeriksa fakta yang tidak bisa diandalkan, jadi harness-nya harus menyediakan faktanya dan memverifikasi bentuknya.
Kalau Anda memelihara konten di dalam repositori, empat langkah memberi Anda sebagian besar dari ini.
Bagian menarik dari konten buatan agen bukanlah tulisannya, yang justru separuh mudahnya. Yang menarik adalah membangun harness yang cukup ketat sehingga penulis yang percaya diri, fasih, dan sesekali keliru tidak bisa merusak produksi — lalu menjaga harness itu tetap jujur, termasuk pada hari ia menemukan bug pada dirinya sendiri.