Skip to content

Cutover 301 SeputarBorneo: jalankan peta artikel + tiga aturan halaman statis (kodenya sudah ada; sisanya artefak) #599

Description

@ahliweb

LINGKUP BERUBAH — 26 Agustus 2026. Issue ini SELESAI dan DITUTUP.

Pemilik produk mencabut kebutuhan migrasi PRD §41: tidak semua artikel dari
situs legacy perlu dimigrasikan atau diimpor, dan situsnya dipakai sebagai
RUJUKAN untuk fitur dan fungsionalitasnya.
Dicatat sebagai
ADR-0116.

Seluruh premis issue ini ada di kalimat pembuka aslinya di bawah — "yang
dipindahkan adalah 23.906 artikel yang sudah diindeks mesin pencari selama
bertahun-tahun". Premis itu dicabut, jadi issue ini ditutup: keempat butir
lingkupnya TERKIRIM, dan satu-satunya butir DoD yang tersisa DICABUT.

Keempat butir lingkup: TERKIRIM, semuanya ada di main

Butir lingkup Di mana
Kolom legacy_source_id/legacy_source_system + index sql/138_awcms_blog_legacy_provenance.sql — kolom pada awcms_blog_posts plus awcms_blog_posts_legacy_source_dedup (UNIQUE)
Impor massal redirect, dry-run secara bawaan, dengan laporan pemetaan bun run blog:legacy:redirects:import — tanpa --commit ia mencetak PREVIEW (nothing written)
Converter HTML → Portable Text yang menolak dengan laporan per-artikel src/modules/blog-content/domain/legacy-html-conversion.ts"a rejection is a fact"; ia menolak, bukan menyanitasi diam-diam
Validasi crawl pra-cutover bun run blog:legacy:cutover:verify (tingkat DB) dan bun run blog:legacy:edge:verify (tingkat HTTP, ADR-0115)

Ditambah yang ditemukan sesudahnya dan tidak ada di daftar siapa pun: importer
menulis content_json sebagai { blocks: [] } yang di-hardcode, sehingga
awcms-astro akan membangun NOL halaman untuk setiap artikel terimpor — dan
tujuan artikelnya tak pernah diputuskan sampai ADR-0115 (PR #732).

Yang DICABUT

"tidak ada URL legacy yang menyelesaikan ke 404 atau ke rantai >1 hop"

Ini satu-satunya butir DoD yang tidak terkirim, dan ia dicabut alih-alih
dikerjakan. Alasannya bukan penjadwalan melainkan kebenaran: 301 adalah JANJI
bahwa kontennya pindah.
Bila kontennya tidak pindah, tak ada tujuan jujur yang
bisa disebutnya.

Repo ini sudah menolak pertukaran itu persis sekali — ADR-0113 menolak
mengarahkan URL pencarian legacy ke artikel mana pun, karena "mengarahkannya ke
artikel mana pun adalah 301 yang berbohong". Diterapkan konsisten: URL tak bisa
dibawa tanpa membawa kontennya.
Untuk artikel yang sengaja tidak diimpor,
status jujurnya 410, bukan 301 ke indeks kategori — 25.029 dari itu adalah
ladang soft-404.

Yang TETAP, dan mengapa tak ada kode yang berubah

Keenam job legacy tetap ada. Impor selektif adalah pipeline yang SAMA dengan
masukan yang lebih kecil
, dan ia tak butuh kode baru karena
listLegacyRedirectMappings menyeleksi WHERE legacy_source_id IS NOT NULL — ia
menurunkan petanya dari baris yang ADA. Impor sepuluh artikel, ia memancarkan
sepuluh aturan. Impor parsial tak bisa menghasilkan aturan menggantung, secara
konstruksi.

Pemblokir media ~25.031 unggahan / 4,1 GB pun larut: secara bawaan tak ada yang
diimpor, jadi tak ada yang ditolak.


Konteks asli, dipertahankan sebagaimana ditulis

Bila SeputarBorneo masuk sebagai tenant kedua (PRD §41), yang dipindahkan adalah 23.906 artikel yang sudah diindeks mesin pencari selama bertahun-tahun. Dua hal hari ini membuat pemindahan itu kehilangan seluruh ekuitas SEO-nya, dan keduanya murah diperbaiki SEKARANG dan mahal diperbaiki nanti.

1. Tidak ada kolom id legacy, jadi pemetaan URL lama tidak bisa dibangun kembali

URL legacy berbentuk /news/{id_ber}_{slug}.html. Setelah impor, tidak ada apa pun pada baris awcms_blog_posts yang mengingat id_ber asalnya, jadi peta 301 tidak dapat diturunkan setelah fakta — hanya ditebak dari slug, yang tidak stabil (judul disunting, slug ikut berubah).

Perbaikan: kolom legacy_source_id (dan legacy_source_system) yang diisi saat impor. Murah sekarang; setelah 23.906 baris masuk tanpa kolom itu, hubungan asalnya hilang permanen.

2. seo_distribution punya redirect, tetapi tidak punya impor massal

awcms_seo_redirects (sql/060) menyimpan aturan redirect eksak-path dengan pencegahan rantai/loop dan gerbang assertSafeRedirectTarget di tulis MAUPUN resolve. Yang tidak ada: cara memuat puluhan ribu aturan sekaligus, dan cara memvalidasinya sebelum cutover.

PRD FR-DSC-007 menempatkan pemetaan 301 sebagai syarat migrasi tenant kedua, bukan pekerjaan opsional sesudahnya.

3. Badan CKEditor legacy tidak dapat disimpan

Badan artikel legacy adalah HTML CKEditor mentah. content_json tidak menerimanya, dan validasi tulis dengan benar MENOLAK <script>/<iframe>/<embed>/<object>. Jadi impor butuh converter HTML -> format kanonik yang: mempertahankan struktur (heading, list, quote, tautan, penekanan), memetakan <img> ke referensi objek media terkelola, dan menolak — bukan menyanitasi diam-diam — apa pun di luar tata bahasa yang diizinkan, dengan laporan per-baris atas apa yang ditolak.

Blokir pada #588: converter harus menargetkan format kanonik yang menang, bukan yang sedang diganti.

Lingkup

  • Kolom legacy_source_id/legacy_source_system + index.
  • Impor massal redirect dengan dry-run secara bawaan dan laporan pemetaan (--commit menulis), mengikuti preseden idn-regions:import.
  • Converter HTML -> Portable Text dengan laporan penolakan per-artikel.
  • Validasi crawl pra-cutover: ambil sitemap legacy, pastikan setiap URL menyelesaikan ke satu 301 (rantai >1 hop dilarang, PRD §9.2).

Definition of Done

Impor dapat dry-run dan menghasilkan laporan pemetaan (PRD §41 butir 14); tidak ada URL legacy yang menyelesaikan ke 404 atau ke rantai >1 hop; converter menolak dengan laporan alih-alih menyanitasi diam-diam; bun run check penuh hijau.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions