# Perbaikan konkurensi pemetaan produk paket Launch

AUTH-03 dalam peninjauan otorisasi telah diperbaiki. Hanya server Launch dan pengujian regresi terkait yang diubah, tanpa deployment atau rilis SDK; batas keputusan otorisasi Licentivo dan SDK tetap sama.

## Perubahan

- Saat menyimpan pemetaan, pertama kunci catatan produk Launch bersama di dalam transaksi, lalu kunci versi paket. Permintaan penyimpanan dari paket atau proses berbeda dengan demikian mengikuti kunci produk yang sama; permintaan konflik mengembalikan HTTP 409 `PRODUCT_MAPPING_CONFLICT`.
- `products.licentivo_product_id` menyimpan rute produk publik yang stabil. Setelah pemetaan pertama berhasil disimpan, paket lain dari produk Launch yang sama hanya dapat memilih produk Licentivo ini; kebijakan berbeda pada produk tersebut diperbolehkan. Bidang ini tidak menyimpan izin fitur, kuota perangkat, atau status otorisasi pelanggan.
- Identitas pelanggan membaca rute stabil, tidak lagi memilih produk berdasarkan versi maksimum seluruh paket. Publikasi paket dan pembuatan konfigurasi integrasi SDK juga memeriksa pengikatan yang sama.
- Basis data lama otomatis menambahkan bidang nullable. Data tanpa bidang stabil dirujuk secara berurutan ke riwayat pembelian seperti pembayaran, catatan publikasi historis, dan pemetaan lainnya; jika terdapat beberapa produk pada prioritas yang sama, konflik ditampilkan secara eksplisit tanpa menebak. Satu-satunya produk yang telah dibeli lebih diutamakan daripada draf yang tidak terkait, dan penyimpanan pemetaan yang kompatibel kemudian dapat menetapkan pengikatan. Pengeditan konten produk mempertahankan pengikatan.

Data historis salah yang telah dijual ke beberapa produk Licentivo tetap memerlukan pemeriksaan manual; perubahan ini tidak menulis ulang catatan pembelian atau lisensi jarak jauh. Untuk beralih ke produk Licentivo lain, buat produk Launch baru; paket baru tidak boleh digunakan untuk menulis ulang rute produk lama.

Lihat implementasi [penyimpanan pemetaan](https://github.com/spf86/licentivo-launch/blob/main/internal/app/connections.go), [rute produk](https://github.com/spf86/licentivo-launch/blob/main/internal/app/product_mapping.go), [penerbitan identitas](https://github.com/spf86/licentivo-launch/blob/main/internal/app/identity.go), [validasi publikasi](https://github.com/spf86/licentivo-launch/blob/main/internal/app/catalog.go), [pemeriksaan integrasi](https://github.com/spf86/licentivo-launch/blob/main/internal/app/integration.go), dan [model data](https://github.com/spf86/licentivo-launch/blob/main/internal/storage/models.go).

## Verifikasi lokal

| Pemeriksaan | Hasil |
| --- | --- |
| Perbandingan implementasi sebelum perbaikan | Pengujian regresi yang sama secara konsisten menangkap dua penyimpanan konflik yang sama-sama berhasil, dan gagal sesuai harapan |
| Regresi khusus pemetaan setelah perbaikan | Satu permintaan konflik berhasil, satu 409; kedua penyimpanan kompatibel berhasil; setelah sinkronisasi pembayaran identitas tidak terpengaruh draf yang salah; lapisan integrasi SDK menerima konteks produk yang benar |
| Perlindungan data historis | Rute yang telah dibeli diprioritaskan, ambiguitas menghasilkan kesalahan, draf salah dilarang diterbitkan, publikasi historis salah tidak dapat menghasilkan konfigurasi SDK, dan pengeditan konten mempertahankan pengikatan; semuanya lulus |
| Seluruh paket sumber Go dan regresi MySQL | 192 catatan pengujian lulus, termasuk subkasus; tanpa kegagalan. `TestProductUploadRoundTrip` dilewati dan tidak dihitung lulus |
| Peningkatan struktur basis data lama | Struktur tanpa kolom rute dilengkapi dengan bidang nullable setelah inisialisasi; inisialisasi berulang lulus |
| Pengujian bersama Launch, Licentivo, dan Go SDK nyata | 13 tahap bisnis lulus, mencakup pembelian, eksekusi fitur bertanda tangan nyata, pemulihan setelah penutupan biasa, logout, pelepasan jarak jauh, generasi lama, pengembalian dana perpanjangan, pencabutan akun, dan penolakan operasi setelah pengembalian dana/chargeback |
| Pengujian tambahan akhir | Regresi khusus pemetaan lulus pada basis data kosong baru, termasuk pemeriksaan konfigurasi integrasi publikasi historis; `go vet` lulus |

Setelah regresi lengkap dan pengujian bersama layanan nyata selesai, pemeriksaan konsistensi integrasi SDK ditambahkan terakhir, lalu regresi khusus yang mencakup skenario ini dan `go vet` dijalankan ulang secara terpisah. Kegagalan yang diharapkan pada implementasi lama membuktikan bahwa pengujian dapat menangkap race asli, bukan kegagalan regresi yang belum diselesaikan.

Pengujian bersama menggunakan MySQL 8.0.32 lokal yang terisolasi, layanan Licentivo saat ini, dan Go SDK nyata; kanal pembayaran dan DeepL menggunakan layanan simulasi terisolasi, tanpa penagihan nyata atau terjemahan berbayar. Pengujian khusus konkurensi dan pemetaan historis yang salah menggunakan bisnis Launch nyata, MySQL, dan simulator protokol; tidak diklaim bahwa sembilan SDK semuanya menyelesaikan pengujian layanan nyata pada putaran ini.

`192.168.2.177` tidak diakses pada putaran ini. Proses sementara MySQL dan Licentivo yang dimulai untuk tugas ini telah dihentikan; layanan yang ada dipertahankan. Materi asli disimpan di direktori yang diabaikan `.local/mapping-fix-20261024/`; ringkasan yang dapat dibagikan ada di [bukti verifikasi](https://github.com/spf86/licentivo-launch/blob/main/docs/product-mapping-fix-evidence-2026-10-24.json).
