# Hasil Uji B3 โ€” Titik Go/No-Go BATCH B (review R18) > **Tanggal**: 2026-10-01 ยท **Image diuji**: `sicabe/airflow:3.3.2-om203-py313` (ID `33990a6c2b88`) > **Metode**: stack eksperimen terisolasi (`airflow332-exp`, port 12184/12185) + config & DAG > produksi di-mount **read-only** + uji koneksi/OPA/dbt dari container sekali pakai. > โš ๏ธ Produksi **tidak tersentuh** sepanjang uji. --- ## 1. VERDICT: ๐Ÿ”ด **NO-GO untuk Python 3.13** BATCH B **tidak boleh dilanjutkan** dengan base Python 3.13. Penyebab tunggal: **dbt tidak berfungsi** di Python 3.13 pada tumpukan dependensi kita โ€” dan dbt adalah tulang punggung lapisan silver/gold. **Yang tetap sahih**: seluruh hasil B3 lainnya, serta A1 (pin `sqlalchemy<2.1`), A2, dan B1. **Yang perlu diulang**: hanya **B2** (build image) dengan base Python **3.11**. --- ## 2. Yang LOLOS โœ… | Uji | Hasil | |---|---| | **DAG produksi (4 berkas, dari volume produksi)** | โœ… `dag_sitomat_gold_build.py`, `dag_sitomat_gold_build_prod.py` **impor bersih**. `sicabe_dq_gold_native.py` berhasil dimuat sampai tahap *generate workflow* (gagal hanya karena `openmetadata-server` tidak ter-resolve dari container uji saya โ€” bukan masalah versi) | | **Plugin OpenMetadata** | โœ… `/pluginsv2/api/v2/openmetadata/health-auth` โ†’ **200**; `/pluginsv2/` โ†’ **200** | | **Trino** | โœ… `SELECT 1` โ†’ `[[1]]`; `SHOW TABLES FROM iceberg.bronze` โ†’ `orders`, `orders_incremental` | | **MinIO** | โœ… bucket `['iceberg-data']` via `S3Hook` | | **MySQL (klien eksternal)** | โœ… `('8.0.40', 'asdp')` via `MySQLdb`/`MySqlHook` | | **PostgreSQL** | โœ… Postgres 15.18 via `PostgresHook` | | **OPA** | โœ… aturan bronze utuh (`bronze_orders`: ddl/select/write) + keputusan INSERT bronze = **true** | | **Metadata DB / migrasi** | โœ… `airflow db migrate` bersih; OM 2.0.3 (API `{"version":"2.0.3"}`) | --- ## 3. Yang GAGAL ๐Ÿ”ด โ€” dbt ### 3.1 Gejala ``` $ dbt debug --profile trino --target prod AttributeError: __class_getitem__ mashumaro/core/meta/helpers.py:624 โ†’ typing_extensions.Annotated.__class_getitem__ /usr/python/lib/python3.13/typing.py:548 ``` `dbt compile` gagal dengan galat yang sama. โš ๏ธ **`dbt --version` justru berhasil** โ€” sehingga pemeriksaan dangkal (`import dbt`, `dbt --version`) **tidak menangkap** kerusakan ini. ### 3.2 Akar masalah & tiga versi yang diuji | `mashumaro` | dbt (`debug`/`compile`) | `pip check` | |---|---|---| | **3.10** (maksimum yang diizinkan `collate-data-diff <3.11`) | โŒ **GAGAL** | โœ… **bersih** โ† *rusak, tapi terlihat sehat* | | **3.17** | โœ… **debug OK ("All checks passed!") + compile OK** (SQL `orders_silver` ter-compile) | โš ๏ธ melanggar `dbt-core <3.15` **dan** `collate-data-diff <3.11` | | **3.23** | โœ… berhasil | โš ๏ธ melanggar keduanya | ### 3.3 Kesimpulan teknis **Tidak ada versi `mashumaro` yang sekaligus (a) memenuhi batas dependensi kita dan (b) berfungsi di Python 3.13.** Yang mengikat ketat adalah `collate-data-diff` (dipakai jalur lineage dbt OpenMetadata) yang menuntut `<3.11.0`, sedangkan perbaikan kompatibilitas 3.13 berada di versi โ‰ฅ ~3.11. โžก๏ธ Jadi masalahnya bukan pilihan paket, melainkan **kombinasi Python 3.13 + tumpukan ini**. ### 3.4 Pelajaran metodologis (penting) `pip check` **bersih** pada konfigurasi yang **tidak berfungsi**. Artinya: > Batas dependensi yang dideklarasikan โ‰  kebenaran fungsional. Uji kelayakan untuk tumpukan ini **wajib menjalankan perintah nyata** (mis. `dbt debug`, `dbt compile`), bukan hanya mengimpor modul atau membaca `--version`. --- ## 4. Koreksi atas rekomendasi K1 Rekomendasi awal saya (K1 = Python **3.13**) dinilai **salah** dan dicabut. Dasarnya waktu itu adalah "artefak eksperimen sudah tervalidasi end-to-end" โ€” padahal validasi itu **tidak lengkap**: eksperimen memeriksa `import dbt` dan `dbt --version`, tetapi **tidak pernah menjalankan `dbt` sungguhan**. B3 โ€” yang memang dirancang sebagai gerbang โ€” yang menemukannya. **K1 direvisi menjadi Python 3.11**, dengan alasan: - tujuan BATCH B adalah **Airflow 3.3.2 + OM 2.0.3 + provider MySQL**, bukan Python 3.13; - `openmetadata-ingestion[airflow]` 2.0.3.0 mem-pin `apache-airflow==3.3.2` **terlepas dari Python** โ†’ 3.3.2 di Python 3.11 tetap koheren; - Python 3.11 mempertahankan seluruh dependensi lain di set yang **sudah terbukti di produksi** โ†’ risiko jauh lebih rendah. --- ## 5. Langkah berikutnya (B2 revisi) | Sub | Isi | |---|---| | B2r.1 | `Dockerfile.332` โ†’ base `slim-3.3.2-python3.11` (stage builder `mysqlclient` disesuaikan dengan kondisi header Python 3.11 pada base itu) | | B2r.2 | Regenerasi lock 3.3.2/py3.11 **dengan lock 3.3.1 sebagai `--constraint`** (platform identik โ†’ diff minimal; teknik yang terbukti di A1) | | B2r.3 | Build ulang image (tag tetap `sicabe/airflow:3.3.2-om203-py313`, menimpa image yang no-go) | | B3r | **Ulangi B3 dengan `dbt debug` + `dbt compile` sebagai syarat WAJIB** (bukan opsional) | --- ## 6. Catatan kesalahan uji saya (agar tidak terulang) | # | Kesalahan | Akibat | |---|---|---| | 1 | Memakai `airflow dags list` untuk menguji folder yang di-mount | `dags list` membaca **metadata DB**, bukan folder โ†’ uji pertama tidak sah (diperbaiki dengan impor langsung tiap berkas DAG) | | 2 | Menguji DAG dari container yang tidak berada di jaringan yang tepat | `openmetadata-server` tidak ter-resolve โ†’ kegagalan palsu | | 3 | Mount dbt **read-only** | dbt perlu menulis `logs/` โ†’ keluar `exit 2` **tanpa keluaran sama sekali** (menyesatkan) | | 4 | `pip install "mashumaro>=3.9,<3.18"` tanpa `--upgrade` | pip tidak menaikkan (3.10 sudah memenuhi rentang) โ†’ uji sempat tidak konklusif | | 5 | Salah mount point volume config OM | kegagalan palsu pada DAG DQ | | 6 | Pemeriksaan awal hanya `import dbt` / `dbt --version` | kerusakan dbt lolos sampai B3 |