# Decisions

Semua keputusan berikut berstatus aktif dan bersumber dari Panduan Pengembangan Virtual Lab Fotografi Dasar versi 2.0, kecuali kelak digantikan oleh keputusan pengguna yang lebih baru.

## D-001 — Baseline Proyek Baru

- Tanggal: 23 Juli 2026
- Keputusan: proyek dimulai ulang dari awal dengan konsep Kamera Pro Edukatif.
- Alasan: arsitektur, tampilan, dan alur harus sesuai konsep terbaru tanpa membawa asumsi proyek lama.
- Dampak: source, database, dan keputusan lama tidak boleh digunakan tanpa persetujuan eksplisit.
- Status: **Aktif**.

## D-002 — Pengguna dan Tujuan

- Tanggal: 23 Juli 2026
- Keputusan: pengguna adalah guru dan siswa Kelas X DKV; produk mendukung pembelajaran fotografi dasar dan prapraktikum.
- Alasan: sekolah memerlukan alternatif latihan konsep saat kamera fisik terbatas.
- Dampak: bahasa, UI, alur, aksesibilitas, materi, dan penilaian harus sesuai konteks siswa Kelas X DKV.
- Status: **Aktif**.

## D-003 — Kamera Perangkat sebagai Live View

- Tanggal: 23 Juli 2026
- Keputusan: kamera asli HP/laptop menjadi live view dan sumber foto, hanya setelah tindakan pengguna.
- Alasan: praktik menggunakan kondisi nyata perangkat sambil menjaga privasi.
- Dampak: gunakan MediaDevices/MediaStreamTrack, `audio: false`, prioritas kamera belakang di HP, indikator aktif, tombol matikan, dan penghentian seluruh track saat keluar/mengganti kamera.
- Status: **Aktif**.

## D-004 — Kontrol Pro Edukatif dan Status Jujur

- Tanggal: 23 Juli 2026
- Keputusan: ISO, shutter speed, dan aperture selalu disediakan sebagai slider pembelajaran; setiap kontrol berstatus NYATA, SIMULASI, atau OTOMATIS.
- Alasan: pengalaman belajar harus konsisten tanpa mengarang kemampuan hardware.
- Dampak: capability/settings harus diperiksa; kegagalan constraint harus menghasilkan fallback dan perubahan status, bukan klaim palsu.
- Status: **Aktif**.

## D-005 — Pemisahan Hasil Capture

- Tanggal: 23 Juli 2026
- Keputusan: foto asli dan hasil simulasi disimpan terpisah, termasuk path dan metadata.
- Alasan: menjaga kejujuran teknis dan memungkinkan perbandingan edukatif.
- Dampak: storage, tabel capture, UI perbandingan, dan kebijakan hapus harus membedakan kedua hasil; nilai simulasi tidak ditulis sebagai EXIF hardware.
- Status: **Aktif**.

## D-006 — Arah UI

- Tanggal: 23 Juli 2026
- Keputusan: struktur dashboard mengikuti catatan Karina dengan sembilan menu; karakter visual bersih, modern, ramah siswa, responsif, dan bukan admin dashboard generik.
- Alasan: kesesuaian dengan kebutuhan dan mockup pemilik produk.
- Dampak: design system dan dashboard Fase 1 wajib memakai struktur di `docs/UI_GUIDE.md`; detail visual menunggu mockup/catatan Karina tersedia.
- Status: **Aktif**.

## D-007 — Batas Referensi Canon Play

- Tanggal: 23 Juli 2026
- Keputusan: Canon Play hanya menjadi inspirasi pola interaksi pengaturan → preview → shutter → penjelasan → perbandingan.
- Alasan: pola tersebut relevan secara edukatif tanpa menyalin produk pihak lain.
- Dampak: logo, merek, aset, desain identik, teks, dan kode Canon tidak boleh disalin.
- Status: **Aktif**.

## D-008 — Teknologi

- Tanggal: 23 Juli 2026
- Keputusan: gunakan PHP native MVC sederhana, MySQL/MariaDB, HTML5, CSS3, JavaScript vanilla, MediaDevices API, MediaStreamTrack API, dan Canvas 2D.
- Alasan: stack harus sederhana dan dapat dijalankan melalui XAMPP/Laragon.
- Dampak: framework frontend besar dan Node.js sebagai syarat runtime dilarang; produksi wajib HTTPS.
- Status: **Aktif**.

## D-009 — Scope Awal

- Tanggal: 23 Juli 2026
- Keputusan: aplikasi mobile native, rekaman video/audio, AI image analysis, klaim kontrol hardware yang tidak tersedia, dan peniruan Canon berada di luar scope.
- Alasan: fokus pada MVP pembelajaran kamera Pro berbasis web, privasi, dan kejujuran teknis.
- Dampak: backlog dan implementasi tidak boleh memperluas area tersebut tanpa keputusan baru pengguna.
- Status: **Aktif**.

## D-010 — Metode Pengembangan

- Tanggal: 23 Juli 2026
- Keputusan: pengembangan dilakukan per fase dan vertical slice dengan gate pengguna setelah fase penting.
- Alasan: pengguna tetap mengendalikan arah dan fitur harus selesai sampai database, keamanan, error handling, serta pengujian.
- Dampak: status, TODO, keputusan, dan changelog diperbarui pada setiap gate; fase berikutnya tidak boleh merusak acceptance test yang telah lulus.
- Status: **Aktif**.

## D-011 — Environment dan Database Fase 1

- Tanggal: 23 Juli 2026
- Keputusan: development memakai Apache 2.4.58, PHP 8.2.12, MariaDB 10.4.32, dan database terpisah `virtual_lab_fotografi_v2`.
- Alasan: versi tersebut tersedia pada XAMPP aktual dan memenuhi kebutuhan PDO/native prepared statement.
- Dampak: konfigurasi mendukung environment variable dengan default lokal XAMPP; produksi wajib mengganti kredensial/default dan memakai HTTPS.
- Status: **Aktif**.

## D-012 — Routing dan URL Development

- Tanggal: 23 Juli 2026
- Keputusan: aplikasi memakai front controller `public/index.php`, rewrite Apache, dan base URL `http://localhost/final_virtuallab/public/`.
- Alasan: source dan file internal harus berada di luar area publik aplikasi.
- Dampak: route aplikasi dihitung relatif terhadap base path; deployment dianjurkan mengarahkan document root langsung ke `public/`.
- Status: **Aktif**.

## D-013 — Baseline Design System Fase 1

- Tanggal: 23 Juli 2026
- Keputusan: karena mockup Karina asli belum tersedia, implementasi memakai `docs/UI_GUIDE.md` sebagai baseline sementara dengan aksen biru-ungu, kartu besar, SVG original lokal, sidebar desktop, dan drawer/mobile navigation.
- Alasan: Fase 1 memerlukan UI yang dapat diuji tanpa mengarang detail mockup yang tidak tersedia.
- Dampak: pengguna tetap perlu memvalidasi visual; koreksi berikutnya harus mempertahankan login, keamanan, dan susunan sembilan menu siswa.
- Status: **Aktif — menunggu validasi visual pengguna**.

## D-014 — Keamanan Fondasi

- Tanggal: 23 Juli 2026
- Keputusan: login/logout memakai POST dan CSRF, session strict mode/HttpOnly/SameSite=Lax, generic login error, throttling per session, role guard dua arah, serta deny access untuk seluruh folder internal.
- Alasan: fondasi harus aman sebelum data dan fitur kamera ditambahkan.
- Dampak: semua perubahan data pada fase berikutnya wajib mengikuti pola CSRF, prepared statement, validasi server, dan otorisasi yang sama.
- Status: **Aktif**.

## D-015 — Materi sebagai Teks Aman

- Tanggal: 24 Juli 2026
- Keputusan: isi materi disimpan sebagai teks biasa, menolak HTML mentah, di-escape saat output, lalu dibentuk menjadi section dan paragraf aman di server.
- Alasan: kebutuhan bacaan terstruktur dapat dipenuhi tanpa membuka permukaan XSS dari editor HTML bebas.
- Dampak: script, iframe, event handler, dan markup pengguna tidak dirender; format konten memakai heading kapital dan jeda baris.
- Status: **Aktif**.

## D-016 — Publikasi Tanpa Hard Delete

- Tanggal: 24 Juli 2026
- Keputusan: materi tidak memiliki fitur hapus permanen; visibilitas siswa dikendalikan dengan `status_aktif` dan urutan positif.
- Alasan: riwayat progres dan referensi materi harus tetap konsisten.
- Dampak: guru memakai aksi aktif/nonaktif; materi nonaktif tidak tampil dan menghasilkan 404 pada route siswa.
- Status: **Aktif**.

## D-017 — Progres Berbasis Session dan Backend

- Tanggal: 24 Juli 2026
- Keputusan: pasangan siswa–materi unik, identitas siswa selalu diambil dari session, dan persentase dihitung backend dari materi aktif yang selesai.
- Alasan: mencegah IDOR, progres tercampur, manipulasi nilai di JavaScript, dan penurunan status selesai saat materi dibuka ulang.
- Dampak: request `user_id` diabaikan; materi nonaktif tidak dihitung; nilai dibulatkan ke bilangan bulat dan bernilai 0% bila tidak ada materi aktif.
- Status: **Aktif**.

## D-018 — Batas Fase 3A Kamera Dasar

- Tanggal: 24 Juli 2026
- Keputusan: Fase 3A hanya mengimplementasikan aktivasi kamera atas klik siswa, live view, daftar/switch perangkat, stop stream, snapshot asli, thumbnail, galeri pribadi, detail, dan hapus.
- Alasan: fondasi kamera nyata dan penyimpanan harus stabil serta dapat diuji sebelum kontrol Pro atau simulasi ditambahkan.
- Dampak: tidak ada slider ISO/shutter/aperture, exposure meter, `getCapabilities()`, `applyConstraints()`, efek/simulasi, foto hasil simulasi, atau route kamera guru pada fase ini.
- Status: **Aktif — menunggu gate perangkat fisik**.

## D-019 — Penyimpanan Capture dan Ownership

- Tanggal: 24 Juli 2026
- Keputusan: frame dikirim sebagai Blob JPEG melalui FormData; database hanya menyimpan path relatif dan metadata tervalidasi, sedangkan original/thumbnail memakai nama acak pada storage yang ditolak Apache.
- Alasan: mencegah base64 membengkakkan database, eksekusi file, filename injection, IDOR, serta record/file parsial.
- Dampak: server memverifikasi upload envelope, `finfo`, dimensi, batas 8 MB, whitelist JPEG/PNG/WebP, ownership session, path ketat, transaksi database, rollback file, dan staged deletion.
- Status: **Aktif**.

## D-020 — Gate Perangkat Fisik sebelum Fase 3B

- Tanggal: 24 Juli 2026
- Keputusan: kelulusan otomatis dengan kamera sintetis tidak cukup untuk menutup Fase 3A.
- Alasan: facing mode, pilihan kamera depan/belakang, izin, resolusi, dan penghentian indikator perangkat hanya dapat dipastikan pada hardware nyata.
- Dampak: webcam laptop serta Chrome Android depan/belakang dengan izin diterima/ditolak wajib direkam di `tests/artifacts/phase3a/device-test.md`; Fase 3B tetap tertahan sampai seluruhnya lulus.
- Status: **Digantikan untuk urutan fase oleh instruksi eksplisit Fase 3B tanggal 24 Juli 2026; kewajiban bukti fisik tetap aktif sebagai gate penutupan Fase 3B/Fase 3C**.

## D-021 — Batas Implementasi Fase 3B

- Tanggal: 24 Juli 2026
- Keputusan: Fase 3B menyediakan AUTO/PRO EDUKATIF, capability detection, kontrol hardware dinamis, Photography Engine, processed preview Canvas, exposure meter, dan metadata edukatif; snapshot yang disimpan tetap frame original.
- Alasan: hubungan exposure perlu dapat dipelajari sekarang tanpa mengarang kemampuan hardware atau mencampur efek simulasi dengan foto kamera.
- Dampak: ISO/shutter/aperture berstatus SIMULASI pada PRO dan OTOMATIS pada AUTO; badge NYATA hanya setelah `applyConstraints()` berhasil dan nilai terverifikasi. Fase ini tidak membuat file hasil simulasi permanen, compare, hasil terbaik, atau monitoring kamera guru.
- Status: **Aktif — RC sampai HP Android fisik lulus**.
## D-022 — Kompatibilitas Runtime Fase 4

- Tanggal: 27 Juli 2026
- Keputusan: seluruh controller Fase 4 wajib mengimpor `App\Core\Controller`, URL view wajib melalui helper `url()`, inline script wajib memakai CSP nonce, dan file Digital Project hanya disajikan melalui route berotorisasi.
- Alasan: lint PHP tidak mendeteksi class induk yang salah sampai controller dimuat; URL root dan CSP lama juga menyebabkan fitur tidak berjalan pada instalasi subfolder.
- Dampak: runtime contract test ditambahkan untuk memverifikasi route-controller, kontrak model dashboard, import controller, CSP, base path, dan keamanan file sebelum rilis.
- Status: **Aktif**.


## D-025 — Pengelolaan Akun tanpa Role Admin

- Tanggal: 27 Juli 2026
- Keputusan: sistem tetap menggunakan dua role, yaitu Guru dan Siswa. Guru memperoleh fungsi pengelolaan akun siswa sederhana.
- Alasan: ruang lingkup penelitian adalah media pembelajaran satu lingkungan kelas; Role Admin terpisah tidak memberikan kontribusi langsung terhadap tujuan pembelajaran dan berisiko memperlebar scope.
- Dampak: Guru dapat membuat, mengedit, mengaktifkan/nonaktifkan, mereset password, dan melihat progres siswa. Role akun baru selalu ditetapkan server sebagai `siswa` dan tidak diterima dari request.
- Status: **Aktif**.

## D-026 — Tidak Ada Hard Delete Akun Siswa

- Tanggal: 27 Juli 2026
- Keputusan: akun siswa dinonaktifkan, bukan dihapus permanen.
- Alasan: progres, hasil kuis, praktikum, dan karya siswa memiliki foreign key serta perlu dipertahankan sebagai rekam jejak penelitian.
- Dampak: akun nonaktif tidak dapat login, tetapi seluruh data pembelajaran tetap tersedia untuk Guru.
- Status: **Aktif**.

## D-027 — Rekap Nilai Bukan Rapor Resmi

- Tanggal: 27 Juli 2026
- Keputusan: rata-rata pada aplikasi hanya dihitung dari kategori yang sudah memiliki nilai dan diberi penjelasan bahwa hasil tersebut bukan rapor resmi sekolah.
- Alasan: mencegah nilai kosong dianggap nol dan menghindari klaim di luar ruang lingkup media pembelajaran.
- Status: **Aktif**.

## D-028 — Profil Mandiri dengan Verifikasi Password

- Tanggal: 27 Juli 2026
- Keputusan: Guru dan Siswa dapat mengubah nama, username, dan password sendiri dengan verifikasi password saat ini; role tidak dapat diubah.
- Alasan: menjaga keamanan akun tanpa menambah Role Admin.
- Status: **Aktif**.

## D-029 — Pengujian Akhir Dilakukan Manual pada XAMPP

- Tanggal: 27 Juli 2026
- Keputusan: paket menyediakan lint, runtime contract, dan checklist manual; validasi HTTP, session, database, kamera, dan perangkat dilakukan pengguna pada XAMPP.
- Alasan: menghemat request serta memastikan pengujian berlangsung pada environment target sebenarnya.
- Status: **Aktif**.

## D-030 — Guru Tidak Mengoperasikan Virtual Lab Kamera Siswa

- Tanggal: 27 Juli 2026
- Keputusan: menu Virtual Lab langsung tidak disediakan pada role Guru; Guru memantau hasil melalui Hasil Siswa, Praktikum, Nilai, dan Laporan.
- Alasan: kamera perangkat merupakan ruang praktik pribadi Siswa dan tidak memerlukan mode operasional Guru.
- Status: **Aktif**.
