Lakukan uji berikut pada **salinan spreadsheet**, tidak langsung pada file utama.

## Persiapan
- Salin seluruh Google Sheets, bukan satu tab saja.
- Bagikan salinan ke service account sebagai Editor.
- Masukkan ID salinan ke GOOGLE_SHEETS_ID, APP_DEMO=false, config:clear.
- Simpan salinan backup kedua sebelum perintah repair.
- Jalankan php artisan test terlebih dahulu pada lingkungan PHP.

## Checklist
1. Login dengan kata sandi salah gagal; password benar masuk; logout menutup akses.
2. Dashboard tahun 2026 sesuai transaksi pada salinan.
3. Buat Makan Rp 30.000 untuk Iqbal, tanggal awal bulan:
   - Masuk slot kosong pertama (upload awal: baris 36).
   - A menjadi tanggal numerik dengan format tanggal.
   - D berisi VLOOKUP, E angka, bukan "Rp 30.000" teks.
   - Pengeluaran Iqbal bertambah 30.000 pada bulan yang benar.
4. Buat Investasi 0.25:
   - E adalah angka 0.25, tampil gr.
   - Investasi bertambah 0.25 gr.
   - Total Rp tidak bertambah 0.25.
5. Buat Dana Darurat 100000: masuk laporan dana darurat, bukan investasi.
6. Isi keterangan `=SUM(A1:A2)` atau `=HYPERLINK(...)`: muncul sebagai teks literal, bukan formula.
7. Edit transaksi: baris sama, nilai berubah, rumus D dipertahankan.
8. Buka edit, ubah nominal langsung di Sheets, lalu simpan form lama: ditolak sebagai data berubah.
9. Hapus: A:C dan E:G kosong, D tetap rumus, baris lain tidak bergeser.
10. Tambah lagi: slot yang dihapus bisa dipakai ulang.
11. Filter nama/tanggal/kategori/metode dan cari teks sesuai hasil.
12. Unduh CSV: BOM UTF-8, angka dan satuan terpisah, keterangan berawalan formula diamankan.
13. Uji batas 31 Januari / 1 Februari dan 31 Desember / 1 Januari: masuk bulan/tahun tepat.
14. Edit Parameter di Sheets: kategori berubah setelah refresh. Jangan rename kategori lama tanpa menyesuaikan transaksi.
15. Putus koneksi server dan lakukan uji timeout hanya pada salinan. Periksa hasil di Sheets sebelum retry.
16. Pratinjau sheets:repair tidak menghubungi Google atau mengubah file.
17. Pada salinan backup, apply repair dengan ID salinan:
    - D8:D19 Tabungan memakai Investasi dan A8/A9/...,
    - format gram tetap numerik,
    - A4 TOTAL TABUNGAN,
    - dropdown kategori valid,
    - nilai transaksi tidak berubah.
18. Uji protected range/izin ditolak: pesan jelas tanpa membocorkan kredensial.
19. Pastikan root domain mengarah ke public/, dan URL /.env maupun /storage/app/private/demo.json tidak tersedia.
20. Aktifkan APP_DEMO=true: semua endpoint mutasi menolak, termasuk request yang dibuat manual.

## Batas yang perlu diterima
Google Sheets bukan SQL database. Lock aplikasi dan pengecekan versi tidak sepenuhnya mencegah race dengan pengeditan manual. Penggunaan multi-server, audit trail, hak akses pemilik, penyimpanan biaya investasi+berat, dan idempotency tahan-gagal memerlukan pengembangan lanjutan.
