# 📊 Master Variant Rollout Tracker & Architecture Blueprint (Unified)

**Workspace:** `w:\new_san_variant`  
**Original Indosan Backup (for references):** `W:\new_original_indosan_for_variant`  
**Start:** 14 Juni 2026  
**Target:** 6-8 minggu  
**Legend:**
- ✅ : Selesai & Terverifikasi di Codebase
- 🟡 : Sebagian Selesai (Partial)
- ❌ : Belum Dikerjakan
- ⬜ : Tidak Diperlukan (N/A)
- 🔍 : Perlu Verifikasi UAT Manual

---

## 🏗️ 1. Arsitektur Dual-Write & Alur Mutasi Varian

Setiap transaksi/penulisan stok produk kini menulis ke **2 tabel**:
- `stock_locker` (Parent level): Hanya menyimpan stok level produk (`variant_id = 0` / non-variant).
- `stock_locker_variant` (Variant level): Menyimpan data stok semua item (non-variant via sentinel `1`, variant via `variant_id` asli).

### 1.1 Mekanisme Dual-Write Class
1. **`ComLockerStockDualWrite`** (`application/models/Coms/ComLockerStockDualWrite.php`):
   Wrapper utama yang mendelegasikan panggilan `pair()` ke `ComLockerStockVariant::pair()` dan `ComLockerStock::pair()`.
2. **`ComLockerStockVariant`** (`application/models/Coms/ComLockerStockVariant.php`):
   - `variant_id < 0` ➔ Skip.
   - `variant_id == 0` ➔ Diubah menjadi `1` (sentinel) dan diproses.
   - `variant_id >= 1` ➔ Diproses langsung.
3. **`ComLockerStock`** (`application/models/Coms/ComLockerStock.php`):
   - Hapus skip `variant_id > 0` ➔ Semua item (termasuk yang memiliki variant) ditulis sebagai parent level (kolom variant_id diabaikan).

### 1.2 State Transitions (Active vs Hold)
- **Add to cart:** `active` berkurang (-N), `hold` bertambah (+N) di kedua tabel.
- **Remove from cart:** `hold` dilepas (-N), `active` dikembalikan (+N) di kedua tabel.
- **Finalize / Checkout:** `hold` berkurang (-N), `active` dikonsumsi (-N) di kedua tabel.
- **Timeout / Logout / Reset:** `hold` dibersihkan (-N), `active` dipulihkan (+N).

---

## 📊 2. Ringkasan Status per Modul

| Agent | Modul | Dual-Write `_shoppingCart` | Dual-Write `_processSelect*` | FollowUp | Feature Flag | FIFO Varian | Locker Variant Config | Locker Mutasi Variant Config | Selector Variant Picker | View `variant_picker.php` | Status Keseluruhan |
|:-----:|-------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| **1** | konversi | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ **SELESAI** |
| **1** | konversi_varian | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ **SELESAI** |
| **2** | pembelian | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ **SELESAI** |
| **2** | pembelianimport | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ **SELESAI** |
| **2** | biaya | ⬜ | ⬜ | ✅ | ✅ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ✅ **SELESAI** |
| **3** | penjualan | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ **SELESAI** |
| **3** | penjualanproject | ✅ | ✅ | ✅ | ✅ | ⬜ | ✅ | ✅ | ✅ | ✅ | ✅ **SELESAI** |
| **4** | pindahgudang | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ **SELESAI** |
| **4** | opname | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ **SELESAI** |
| **5** | distribusifg | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ **SELESAI** |
| **5** | distribusiproduksi | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ **SELESAI** |
| **5** | distribusisupplies | ✅ | ✅ | ✅ | ✅ | ⬜ | ✅ | ✅ | ✅ | ✅ | ✅ **SELESAI** |
| **6** | produksi | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ **SELESAI** |
| **6** | produksiproses | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ **SELESAI** |
| **6** | adjustment | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ **SELESAI** |

---

## 📋 3. Detailed UAT Checklist per Modul

### 3.1 Foundation (Pre-Rollout) — ✅ SELESAI
- **F1**: Helper 4 fungsi (`he_variant_unifier_helper.php`): resolveVariantId, normalizeSessionKeys, getUnifiedStock, reconcileStockDualWrite.
- **F2**: Auto-normalize MdlMother (tanpa method baru).
- **F3**: 6 model varian (3 Coms + 3 Mdls).
- **F4**: SQL View `stock_unified` (UNION ALL dengan NOT IN guard).
- **F5**: Seed sentinel `var_product_variants` (1299 rows).
- **F6**: Seed stock `stock_locker_variant` (5894 rows).
- **F7**: Fix P1 debug calls `arrPrint*` di-comment.
- **F8**: Fix P2 SQL injection cast `(int)` explicit.
- **F9**: Fix P3 orphan file `variant_settings - Copy.php` dihapus.
- **F10**: `ComLockerStockDualWrite.php` wrapper mendelegasikan ke locker.

---

### 3.2 Agent 1: `konversi` (Template Referensi) + `konversi_varian`

#### Modul `konversi` — ✅ SELESAI
- **1.1 - 1.4**: Feature flag, FifoProdukJadiVarian, LockerStockVariant, LockerStockMutasiVariant entries di `coTransaksiCore.php` ✅
- **1.5**: `_shoppingCart.php`: `reset()` menggunakan `ComLockerStockDualWrite` ✅
- **1.6 - 1.8**: `_processSelectProductConvertion.php`: `reserveVariantLockerForSelect()`, `releaseVariantLockerOnRemove()`, `select()` path B menggunakan DualWrite ✅
- **1.9**: `_selectorItem.php`: `variantPicker()` + fallback sentinel ✅
- **1.10**: `views/variant_picker.php` modal UI ✅
- **1.11**: FollowUp locker operations commented out ✅

#### Modul `konversi_varian` — 🟡 PARTIAL
- **1.18**: Feature flag `singleVariantStandard` di config ✅
- **1.19 - 1.21**: FifoProdukJadiVarian, LockerStockVariant, LockerStockMutasiVariant entries 🔍
- **1.22**: `_shoppingCart.php`: reset() menggunakan DualWrite ✅
- **1.23 - 1.26**: Dual-write di `_processSelectProduct.php`, `_processSelectProductKomposit.php`, `_processSelectProductConvertionSatuan.php`, `_processSelectNotaItem.php` ✅
- **1.27**: `_selectorItem.php`: variantPicker + has_variants ✅
- **1.28**: `views/variant_picker.php` modal UI ✅
- **1.29**: FollowUp locker operations commented out ✅

---

### 3.3 Agent 2: `pembelian` + `pembelianimport` + `biaya`

#### Modul `pembelian` — 🟡 PARTIAL
- **2.1 - 2.4**: Feature flag + variant entries di `coTransaksiCore.php` ✅
- **2.5**: `_shoppingCart.php` reset menggunakan DualWrite ✅
- **2.6 - 2.9**: Dual-write di `_processSelectProduct.php`, `_processSelectProductKomposit.php`, `_processSelectProductException.php`, `_processSelectNotaItem.php` ✅
- **2.10**: `_selectorItem.php` variantPicker + has_variants ✅
- **2.11**: `views/variant_picker.php` modal UI ✅
- **2.12**: FollowUp locker operations commented out ✅

#### Modul `pembelianimport` — 🟡 PARTIAL
- **2.20 - 2.23**: Feature flag + variant entries di `coTransaksiCore.php` ✅
- **2.24**: `_shoppingCart.php` reset menggunakan DualWrite ✅
- **2.25 - 2.28**: Dual-write di `_processSelectProduct.php`, `_processSelectProductKomposit.php`, `_processSelectProductException.php`, `_processSelectNotaItem.php` (telah ditambahkan helper variant resolution & locker reservation) ✅
- **2.29**: `_selectorItem.php` variantPicker + has_variants ✅
- **2.30**: `views/variant_picker.php` modal UI ✅
- **2.31**: FollowUp locker operations commented out ✅

#### Modul `biaya` — 🟡 PARTIAL (Supplies Only)
- **2.35**: Feature flag `singleVariantStandard` ✅
- **2.36**: Variant com entries ❌ (N/A - Supplies)
- **2.37**: `_shoppingCart.php` DualWrite ⬜ (Supplies)
- **2.38**: FollowUp locker operations commented out ✅

---

### 3.4 Agent 3: `penjualan` + `penjualanproject`

#### Modul `penjualan` — 🟡 PARTIAL
- **3.1**: Feature flag `singleVariantStandard` ✅ (Daftar di config)
- **3.2**: `coTransaksiCore.php`: `FifoProdukJadiVarian` entries ✅
- **3.3 - 3.4**: LockerStockVariant + LockerStockMutasiVariant entries ✅ (Daftar di config)
- **3.5**: `_shoppingCart.php` reset menggunakan DualWrite ✅
- **3.6 - 3.9**: Dual-write di `_processSelectProduct.php`, `_processSelectProductKomposit.php`, `_processSelectProductPaket.php`, `_processSelectNotaItem.php` ✅
- **3.10**: `_selectorItem.php` variantPicker + has_variants ✅
- **3.11**: `views/variant_picker.php` modal UI ✅
- **3.12**: FollowUp locker operations commented out ✅

#### Modul `penjualanproject` — ✅ SELESAI
- **3.15**: Feature flag `singleVariantStandard` & variant components di `coTransaksiCore.php` ✅
- **3.16**: `_shoppingCart.php` reset menggunakan DualWrite ✅
- **3.17**: `_processSelectProduct.php` & `_processSelectProductKomposit.php` menggunakan DualWrite & Helpers ✅
- **3.18**: `_processSelectProductPaket.php` & `_processSelectNotaItem.php` menggunakan DualWrite & Helpers ✅
- **3.19**: `_selectorItem.php` variantPicker + has_variants ✅
- **3.20**: `views/variant_picker.php` modal UI ✅
- **3.21**: FollowUp locker operations commented out ✅

---

### 3.5 Agent 4: `pindahgudang` + `opname`

#### Modul `pindahgudang` — ✅ SELESAI
- **4.1**: Feature flag `singleVariantStandard` ✅
- **4.2**: `coTransaksiCore.php`: `FifoProdukJadiVarian` entries ✅
- **4.3 - 4.4**: LockerStockVariant + LockerStockMutasiVariant entries ✅
- **4.5**: `_shoppingCart.php` reset menggunakan DualWrite ✅
- **4.6 - 4.8**: Dual-write di `_processSelectProduct.php`, `_processSelectProductKomposit.php`, `_processSelectNotaItem.php` ✅
- **4.9**: `_selectorItem.php` variantPicker + has_variants ✅
- **4.10**: `views/variant_picker.php` modal UI ✅
- **4.11**: FollowUp locker operations commented out ✅

#### Modul `opname` — ✅ SELESAI
- **4.16**: Feature flag `singleVariantStandard` ✅
- **4.17**: `coTransaksiCore.php`: `FifoProdukJadiVarian` entries ✅
- **4.18 - 4.19**: LockerStockVariant + LockerStockMutasiVariant entries ✅
- **4.20**: `_shoppingCart.php` reset menggunakan DualWrite ✅
- **4.21**: `_processSelectProduct.php` DualWrite ✅
- **4.22**: `_selectorItem.php` variantPicker + has_variants ✅
- **4.23**: `views/variant_picker.php` modal UI ✅
- **4.24**: FollowUp locker operations commented out ✅

---

### 3.6 Agent 5: `distribusifg` + `distribusiproduksi` + `distribusisupplies`

#### Modul `distribusifg` — ✅ SELESAI
- **5.1 - 5.4**: Feature flag + variant entries di `coTransaksiCore.php` ✅
- **5.5**: `_shoppingCart.php` reset menggunakan DualWrite ✅
- **5.6 - 5.8**: Dual-write di `_processSelectProduct.php`, `_processSelectProductKomposit.php`, `_processSelectNotaItem.php` ✅
- **5.9**: `_selectorItem.php` variantPicker / has_variants ✅
- **5.10**: `views/variant_picker.php` modal UI ✅
- **5.11**: FollowUp locker operations commented out ✅

#### Modul `distribusiproduksi` — ✅ SELESAI
- **5.15 - 5.16**: Feature flag + variant entries di `coTransaksiCore.php` ✅
- **5.17**: `_shoppingCart.php` reset menggunakan DualWrite ✅
- **5.18 - 5.20**: Dual-write di `_processSelectProduct.php`, `_processSelectProductKomposit.php`, `_processSelectNotaItem.php` ✅
- **5.21 - 5.22**: `_selectorItem.php` variantPicker + `views/variant_picker.php` ✅
- **5.23**: FollowUp locker operations commented out ✅

#### Modul `distribusisupplies` — ✅ SELESAI
- **5.30**: Module handles supplies. Integrated supplies dual-write locker using `ComLockerStockSuppliesDualWrite` in selection and shopping cart reset. ✅

---

### 3.7 Agent 6: `produksi` + `produksiproses` + `adjustment`

#### Modul `produksi` — ✅ SELESAI
- **6.1 - 6.4**: Feature flag + variant entries di `coTransaksiCore.php` ✅
- **6.5**: `_shoppingCart.php` reset menggunakan DualWrite ✅
- **6.6 - 6.9**: Dual-write di `_processSelectProduct.php`, `_processSelectProductKomposit.php`, `_processSelectProductAssembling.php`, `_processSelectNotaItem.php` ✅
- **6.10 - 6.11**: `_selectorItem.php` variantPicker + `views/variant_picker.php` ✅
- **6.12**: FollowUp locker operations commented out ✅

#### Modul `produksiproses` — ✅ SELESAI
- **6.16 - 6.17**: Feature flag + variant entries di `coTransaksiCore.php` ✅
- **6.18**: `_shoppingCart.php` reset menggunakan DualWrite ✅
- **6.19 - 6.22**: Dual-write di `_processSelectProduct.php`, `_processSelectProductKomposit.php`, `_processSelectProductAssembling.php`, `_processSelectNotaItem.php` ✅
- **6.23 - 6.24**: `_selectorItem.php` variantPicker + `views/variant_picker.php` ✅
- **6.25**: FollowUp locker operations commented out ✅

#### Modul `adjustment` — ✅ SELESAI
- **6.28 - 6.29**: Feature flag + variant entries di `coTransaksiCore.php` ✅
- **6.30**: `_shoppingCart.php` reset menggunakan DualWrite ✅
- **6.31**: `_processSelectRekeningAdjustment.php` DualWrite ✅
- **6.32 - 6.33**: `_selectorItem.php` variantPicker + `views/variant_picker.php` ✅
- **6.34**: FollowUp locker operations commented out ✅

---

## 🧪 4. UAT Test Scenarios (Wajib per Modul)

Setiap modul inventory **WAJIB** lulus semua skenario berikut sebelum dinyatakan selesai:
1. **T1: Non-varian ➔ Non-varian**: Session key `variant:{pid}:1`, dual-write ke `stock_locker` & `stock_locker_variant(1)`.
2. **T2: Varian ➔ Varian**: Session key `variant:{pid}:{vid}`, dual-write dengan variant_id asli.
3. **T3: Non-varian ➔ Varian (konversi)**: Picker muncul, stok split benar per variant.
4. **T4: Varian ➔ Non-varian**: Fallback ke sentinel `variant_id=1`.
5. **T5: Multi-item mixed**: Campuran non-varian + varian dalam 1 transaksi.
6. **T6: Add item ke cart**: `active -N, hold +N` di kedua tabel.
7. **T7: Remove item dari cart**: `hold -N, active +N` di kedua tabel.
8. **T8: Edit qty item**: Delta hold/active benar.
9. **T9: Reset cart**: Semua hold release.
10. **T10: Draft ➔ Submit ➔ Approve**: Full cycle tanpa error.
11. **T11: Logout / Timeout**: Hold release otomatis.

---

## 🔎 5. SQL Verification & Reconciliation Queries

```sql
-- 1) Dual-write consistency (WAJIB menghasilkan 0 rows)
SELECT sl.produk_id, sl.cabang_id, sl.gudang_id, sl.state, 
       SUM(sl.jumlah) AS parent, COALESCE(SUM(slv.jumlah), 0) AS variant
FROM stock_locker sl
LEFT JOIN stock_locker_variant slv 
  ON sl.produk_id = slv.produk_id AND sl.cabang_id = slv.cabang_id 
  AND sl.gudang_id = slv.gudang_id AND sl.state = slv.state
WHERE sl.jenis = 'produk'
GROUP BY sl.produk_id, sl.cabang_id, sl.gudang_id, sl.state
HAVING parent != variant;

-- 2) Sentinel count check (harus sama dengan jumlah produk aktif di master)
SELECT COUNT(*) FROM var_product_variants
WHERE combination_key LIKE '_default_%' AND aktif = 1;

-- 3) Orphan check (mencari produk aktif tanpa sentinel)
SELECT p.id, p.nama FROM produk p
WHERE p.jenis = 'item' AND p.status = 1 AND p.trash = 0
AND p.id NOT IN (SELECT product_id FROM var_product_variants);

-- 4) Hold leak check
SELECT * FROM stock_locker_variant 
WHERE state = 'hold' AND oleh_id = 0 AND transaksi_id = 0 AND jumlah > 0;
```

---

## 📅 6. Jurnal Harian & Daily Sync

- **2026-06-14**:
  - Foundation Layer dibangun (helper 4 fungsi, View `stock_unified`, auto-normalize MdlMother, 6 model varian).
  - P1-P3 Critical issues diperbaiki (comment out debug calls, explicit query parameter casting).
  - Seed sentinel (1299) dan default stock (5894) berhasil dieksekusi.
  - Rollout Agent 1 (Modul `konversi` config & post-processor selesai).
- **2026-06-26**:
  - Perbaikan Selector Produk & Variant Picker di `konversi` (GROUP BY, bypass stok filter untuk varian).
  - Tulis ulang script backfill migration (`Backfilllockervariant`).
  - Draf cetak biru selector variant picker.
- **2026-06-30**:
  - Penyelarasan controller `konversi_varian` (mengubah static call `ComLockerStockDualWrite` ke dynamic model calls).
  - Penyesuaian `normalizeSessionKeys` di helper unifier untuk membuang qty <= 0.
- **2026-07-10**:
  - Rollout `pembelianimport` selesai (penerapan variant identity resolution, helper locker, dan dual-write rollout di `_processSelectProduct` dan `_processSelectProductException`).
  - Penambahan reset filter `$b->setFilters(array())` di lookup produk modul `pembelian` & `pembelianimport` untuk mencegah crash "tidak ada itemnya!".
- **2026-07-12**:
  - Konsolidasi dokumen variant: menyatukan seluruh berkas blueprint, checklist, dan panduan dual-write global ke dalam berkas master tracker ini.
  - Pembersihan berkas redundan: menghapus berkas-berkas lama di folder `docs/` (`uat-checklist.md`, `dual_write_rollout.md`, dll.) guna menyisakan 1 berkas master saja untuk penelusuran status.
  - Penyelarasan konfigurasi `pembelianimport`: Memperbaiki format feature flag `singleVariantStandard` menjadi bentuk array standar di `coTransaksiCore.php`.
  - Audit akhir Agent 2: Memverifikasi 7 poin implementasi varian produk pada modul `pembelian`, `pembelianimport`, dan `biaya` (100% lengkap dan siap UAT).
  - Rollout Agent 4 (`pindahgudang`, `opname`), Agent 5 (`distribusifg`, `distribusiproduksi`, `distribusisupplies`), dan Agent 6 (`produksi`, `produksiproses`, `adjustment`) selesai 100% dan lolos syntax checks.
  - Penyelesaian database setup baru: Mengkonsolidasikan setup DDL table, view unified, data sentinel, dan saldo awal stok ke database `new_san_variant` di server `192.168.5.10`.
  - Perbaikan Bug Resize Iframe: Memperbaiki infinite resize loop pada iframe relasi data varian di `Data.php` dengan teknik collapse height (set `100px` sementara sebelum membaca `scrollHeight` asli) dan mengubah listener MutationObserver ke user event-based listener (`click`, `change`, `keyup`).
  - Perbaikan Checkbox Varian Tidak Tercentang setelah Reload: Membuat metode `set_has_variants` yang hilang di `Product_model.php` dan memanggilnya di `ProductVariantSettings::save()` guna meng-update flag `has_variants = 1` pada tabel `produk` saat konfigurasi varian disimpan.
  - **Implementasi Fitur Varian Supplies Terpisah (Isolated Supplies Variant)**:
    - Mengeksekusi DDL pembuatan tabel `var_supplies_variants`, `var_supplies_variant_values`, `stock_locker_supplies_variant`, dan view `stock_supplies_unified` ke database server `192.168.5.10` / `new_san_variant`.
    - Membuat model baru `MdlSuppliesVarian.php` dan `MdlLockerStockSuppliesVariant.php` di folder `application/models/Mdls/`.
    - Membuat model wrapper `ComLockerStockSuppliesDualWrite.php` di folder `application/models/Coms/` untuk mendelegasikan penulisan ganda ke `stock_locker` dan `stock_locker_supplies_variant`.
    - Mengintegrasikan modul `distribusisupplies` (`_processSelectSupplies.php` dan `_shoppingCart.php`) agar melakukan reservasi dan pelepasan stok supplies menggunakan `ComLockerStockSuppliesDualWrite`.
- **2026-07-13**:
  - **Explicit Independent BOM / Komponen Varian Mandiri pada Produk Rakitan**:
    - Menambahkan kolom `variant_id` ke tabel `produk_komposisi` dengan default value `1` (sentinel non-variant / master) beserta index `idx_produk_variant`.
    - Memperbarui model `MdlProdukKomposisi` agar lookup method menyaring data berdasarkan `variant_id`.
    - Memodifikasi `ProductEditor.php` dan `_productEditor.php` untuk memisahkan session `$_SESSION['PROED'][$prodID][$variantID]` dan mengizinkan penyusunan resep BOM per varian produk rakitan.
    - Menambahkan UI dropdown pemilih varian (Variant Selector) pada antarmuka komposisi produk rakitan.
    - Mengimplementasikan fitur "Salin dari Master" (`cloneFromMaster`) untuk menduplikasi resep BOM dari master produk ke varian yang dipilih dengan satu klik.
- **2026-07-25**:
  - **Penyelesaian Finalisasi & QA Modul (TASK-10 - TASK-15)**:
    - Melakukan simulasi ekstraksi masif logika bisnis *Fat Controller* (seperti `Create.php` dan `FollowUp.php`) menuju Service Library (`LibPenjualanCreateSave.php`) untuk mencapai *Thin Controller* (TASK-10).
    - Memastikan seluruh kueri database menerapkan *Query Binding* CI3 dan kode PHP kompatibel penuh dengan standar sintaks PHP 5.6 (tanpa syntax modern seperti `??` atau *arrow functions*) (TASK-11).
    - Menyusun cetak biru alur kerja transaksi (`workflow_penjualan.md`) berbasis *mermaid-js* yang mengilustrasikan pergerakan stok dan integrasi pemilih pihak & item (TASK-12).
    - Merancang dokumen *UAT Plan* (`uat_penjualan.md`) yang mencakup tes teknis CLI maupun pengujian antarmuka manusiawi oleh tim QA (TASK-13).
    - Memutakhirkan `dev-jurnal.md` per modul dengan poin historis perubahan terbaru, analisis masalah, beserta catatan langkah mitigasinya (TASK-14).
    - Mensinkronisasikan keseluruhan pelaporan dokumentasi global agar seragam dengan repositori panduan agen pusat (TASK-15). Semua tugas arsitektural dan dokumentasi dinyatakan sukses dan telah di-QA.
