# ADR 0003: Tata Kelola Toolchain Polyglot (Go + Node + Python) - **Status**: Diterima (Accepted) - **Tanggal**: 17 Oktober 2026 - **Penulis**: Principal Software Architect & Infrastructure Lead --- ## Konteks & Masalah KeluargaMart adalah platform polyglot dengan spesialisasi teknologi yang berbeda untuk setiap layanannya: - **Backend**: Go (Chi, GORM, Postgres) — dipilih karena efisiensi memori, performa konkurensi tinggi, dan type-safety yang ketat untuk core business logic. - **Frontends**: Node.js ecosystem (Vue 3, Nuxt 4, Vite, Tailwind CSS) — dipilih karena kecepatan rendering UI, ekosistem SPA kasir, dan kemampuan SSR untuk B2B e-commerce. - **Reporting Engine**: Python (ReportLab, Pandas) — dipilih karena kemudahan manipulasi tabel data dan ekspor PDF/XLSX. Tantangan dalam monorepo adalah menyatukan developer experience tanpa memaksakan satu runtime untuk mengendalikan runtime lainnya secara tidak wajar (misalnya tidak membungkus Go ke dalam npm package artifisial). --- ## Keputusan Kami memutuskan untuk mengadopsi model **Polyglot Monorepo Governance** dengan prinsip-prinsip berikut: 1. **Root Script Bridge**: Root `package.json` bertindak sebagai fasilitator developer experience terpadu dengan perintah bersahabat: - `pnpm dev:backend`: Menjalankan `go -C apps/backend run ./cmd/server`. - `pnpm build:backend`: Menjalankan `go -C apps/backend build -o bin/server ./cmd/server`. - `pnpm test:backend`: Menjalankan `go -C apps/backend test -v ./...`. - `pnpm drift:check`: Menjalankan script Python `scripts/check-drift.py`. 2. **Isolasi Toolchain Native**: - Direktori `apps/backend` mempertahankan `go.mod` dan `go.sum` standar Go tanpa intervensi bundler Node. - Frontends dan packages diorkestrasi oleh `pnpm` dan `turbo.json`. - NextReport mempertahankan `requirements.txt` standar Python. 3. **Decoupled Containerization**: Setiap layanan mempertahankan Dockerfile multi-stage aslinya: - Backend di-build langsung dengan image resmi `golang:1.23-alpine`. - Frontends di-build dengan `node:22-alpine` dan disajikan menggunakan web server statis ringan. - NextReport di-build dengan `python:3.11-slim`. --- ## Konsekuensi ### Konsekuensi Positif - **Zero Compromise pada Performa**: Backend tetap berjalan sebagai native binary Go tanpa overhead runtime Node. - **Konsistensi Developer Experience**: Developer dapat menjalankan build dan test di seluruh workspace menggunakan perintah terstandarisasi. - **Dukungan IDE yang Mulus**: Goland / VSCode Go extension dan WebStorm / VSCode Volar bekerja tanpa interferensi konfigurasi. ### Konsekuensi Negatif - Developer yang ingin mengembangkan backend dan frontend lokal secara bersamaan membutuhkan runtime Go dan Node.js di mesin lokalnya (atau menggunakan Docker Compose terpadu di `apps/backend/docker-compose.dev.yml`).