# Changelog

Semua perubahan penting proyek dicatat di file ini.

## [2.9.1-lampiran-runtime-repair] — 27 Juli 2026

### Fixed

- Memulihkan tabel `materi_lampiran` secara otomatis apabila migration lama tercatat tetapi tabel fisiknya tidak tersedia.
- Menambahkan migration pemulihan `015_repair_materi_lampiran.sql` dan script fallback `database/repair_materi_lampiran.php`.
- Menjamin folder `storage/materi-lampiran` tersedia, dapat ditulis, dan terlindungi dari akses langsung.
- Mempertahankan upload aman PDF/PNG/JPG, preview, unduh, status aktif, urutan, serta penghapusan lampiran.
- Mengganti pesan migration lama dengan diagnostik yang hanya muncul bila pemulihan otomatis benar-benar gagal.

### Verification

- PHP lint seluruh file PHP lulus.
- Contract lampiran 18/18 dan contract Materi 20/20 lulus.
- Runtime Contract Fase 4, 5C, dan 6 serta engine kamera/praktikum tetap lulus.
- Pengujian HTTP, upload browser, dan MariaDB tetap dilakukan manual pada XAMPP.

## [2.8.0-phase-5c] — 27 Juli 2026

### Added

- Modul Data Siswa untuk Guru: pencarian, filter, tambah, edit, aktif/nonaktif, reset password, dan detail progres.
- `SiswaAccountService` untuk validasi akun, password hash, dan password sementara.
- `SiswaProgressService` untuk progres terpadu, Teknik Visual, revisi, hasil, serta aktivitas terbaru.
- Integrasi dashboard Guru dengan siswa yang membutuhkan perhatian.
- Checklist manual `MANUAL_TEST_PHASE5C.md` dan Runtime Contract Fase 5C.

### Security

- Role akun baru dikunci sebagai `siswa`; tidak ada input role dari request.
- Seluruh mutasi memakai CSRF, prepared statement, role guard, dan pembatasan query `role = 'siswa'`.
- Tidak ada hard delete akun; password tidak dicatat pada log.

### Verification

- Runtime Contract Fase 5C: 25/25 lulus.
- PHP lint dan JavaScript syntax check lulus.
- Pengujian HTTP/MariaDB dilakukan manual melalui XAMPP.

## [phase-5b-ui-polish] — 27 Juli 2026

### Improved

- Mendesain ulang halaman daftar `Virtual Lab Teknik Visual` agar lebih modern, terstruktur, dan sesuai identitas visual aplikasi.
- Mengganti ringkasan lama dengan hero pembelajaran, progres keseluruhan, progres per kategori, serta tombol lanjut latihan.
- Menambahkan ilustrasi visual berbeda untuk Komposisi, Angle Kamera, dan Framing/Shot Size tanpa aset eksternal.
- Memperjelas status, skor terbaik, jumlah percobaan, deskripsi, dan aksi pada setiap kartu latihan.
- Menambahkan navigasi kategori, layout desktop adaptif, tampilan mobile satu kolom, dan pencegahan horizontal overflow.
- Memindahkan styling halaman ke `public/assets/css/teknik-visual.css` agar lebih mudah dipelihara.

### Verification

- PHP lint view dan controller lulus.
- Preview desktop 1440 px dan mobile 390 px tidak mengalami horizontal overflow.

## [2.6.1-phase-4-runtime-fix] — 27 Juli 2026

### Fixed

- Memperbaiki HTTP 500 dashboard karena kontrak method Praktikum yang tidak sesuai.
- Menambahkan import `App\Core\Controller` pada seluruh controller Fase 4 yang sebelumnya mewarisi class yang tidak tersedia.
- Menyuntikkan data user secara terpusat ke layout terautentikasi.
- Memperbaiki import PDO pada progres terpadu, URL berbasis base path, CSP nonce, dan typo status komposisi.
- Menambahkan streaming file Digital Project terproteksi untuk guru/siswa.
- Memperkuat upload, thumbnail fallback, foto utama, penghapusan file, ownership, transaksi, rollback, serta validasi penilaian Digital Project.

### Verification

- PHP lint seluruh source/test lulus.
- JavaScript/MJS syntax check lulus.
- Photography Engine 22/22, Camera Capability 7/7, Praktikum Evaluation 6/6.
- Runtime Contract Fase 4 24/24 dan view smoke test 20/20 lulus.
- Acceptance HTTP/MariaDB penuh wajib dijalankan ulang melalui XAMPP pengguna.

## [2.6.0-phase-4] — 26 Juli 2026

### Added

- Migration `008_create_kuis_tables.sql` untuk `kuis`, `kuis_soal`, `kuis_pilihan`, `kuis_attempt`, `kuis_jawaban`, `kuis_topik_rekomendasi`.
- Migration `009_create_digital_project_tables.sql` untuk `digital_projects`, `digital_project_submissions`, `digital_project_files`, `digital_project_feedback`.
- Migration `010_create_progress_settings.sql` untuk `progress_settings` dan `komposisi_latihan`.
- Seed kuis: 2 kuis (Dasar Fotografi dan Segitiga Eksposur) dengan 12 soal nyata.
- Seed digital project: Cerita Aktivitas Sekolah.
- Seed progress settings: bobot default Materi 20%, Kuis 20%, Praktikum 35%, Digital Project 25%.
- Model Kuis, KuisSoal, KuisPilihan, KuisAttempt, KuisJawaban.
- Model DigitalProject, DigitalProjectSubmission, DigitalProjectFile, DigitalProjectFeedback, ProgressSettings.
- Service KuisService, AdaptiveLearningService, DigitalProjectService, IntegratedProgressService.
- Controller GuruKuisController, SiswaKuisController, SiswaKomposisiController, GuruDigitalProjectController, SiswaDigitalProjectController.
- Views untuk semua fitur baru.
- Route untuk semua fitur baru.
- Dashboard terintegrasi dengan progress terpadu dan rekomendasi.

### Features

- Kuis adaptif: CRUD guru, attempt siswa, timer, scoring backend, review jawaban dengan pembahasan.
- Simulasi komposisi: 6 latihan interaktif dengan drag-drop, grid, reset, skor real-time.
- Digital Project: draft, upload aman (MIME server, thumbnail, rollback), pilih utama, kumpulkan, feedback guru.
- Progress terpadu: 4 komponen dengan bobot, perhitungan backend, divide-by-zero safe.
- Dashboard siswa: progress total, komponen, rekomendasi adaptif, statistik.
- Dashboard guru: rata-rata progress siswa, submission pending.

### Security

- Jawaban benar tidak dikirim sebelum submit.
- Prepared statement seluruh controller baru.
- CSRF seluruh POST.
- MIME validation via fileinfo.
- Random filename dan extension based on MIME.
- Role guard seluruh route.
- IDOR protection untuk ownership.

### Verification

- 106/106 acceptance test Fase 4 PASS.
- PHP syntax check seluruh file baru PASS.
- CSRF checks PASS (tidak ada Csrf::generate).
- Database integrity PASS (foreign key terdefinisi).
- Backup database: `virtual_lab_fotografi_v2_after_phase4_20260726.sql`.
- Checkpoint ZIP: `virtual_lab_phase4_checkpoint_20260726.zip`.

## [2.5.1-phase-3c-runtime-patch] — 26 Juli 2026

### Fixed

- Memperbaiki HTTP 500 pada menu Praktikum akibat pemanggilan `Csrf::generate()` yang tidak tersedia, data `user` yang tidak diteruskan ke layout, dan query placeholder yang dijalankan melalui `PDO::query()`.
- Menambahkan helper `csrf_field()`, status default respons JSON, validasi status penilaian, serta route streaming hasil yang dapat diakses guru melalui role guard guru.
- Memperbaiki thumbnail hasil, label evaluasi, URL detail berbasis base path, dan integrasi kamera tanpa monkey patch global `fetch`.
- Menyimpan processed Canvas sebagai file simulasi tervalidasi dan terpisah dari foto asli, termasuk thumbnail dan rollback file bila record hasil gagal dibuat.
- Menambahkan pemeriksaan ownership capture sebelum hasil praktikum dibuat.
- Memperbaiki alur pengumpulan agar memakai judul/refleksi yang sudah tersimpan dan mendukung perbaikan serta pengumpulan ulang setelah status revisi.
- Mengintegrasikan seed praktikum ke `database/seed.php`, menormalkan rentang target shutter/aperture, memasukkan exposure aktual ke evaluasi, dan membuat evaluasi target deterministik.
- Menyimpan feedback dan perubahan status penilaian guru dalam satu transaksi serta mengembalikan form browser ke halaman detail dengan flash message.

### Verification Pending

- Syntax lint dan unit JavaScript dijalankan pada paket patch. Acceptance HTTP/database lengkap tetap harus dijalankan pada XAMPP/MariaDB pengguna.

## [2.4.0-phase-3b-rc] — 24 Juli 2026

### Added

- Modul `camera-capabilities.js`, `photography-engine.js`, `pro-controls.js`, dan `camera-renderer.js`; integrasi UI kamera tetap modular melalui `camera-ui.js`.
- Mode AUTO default dan PRO EDUKATIF, slider ISO 100–6400, shutter 1/2000–1 detik, aperture f/1.8–f/22, exposure meter, sumber meter, serta panel penjelasan dinamis.
- Capability detection setelah kamera aktif dan kontrol hardware dinamis untuk zoom/fokus/exposure/WB/torch bila dilaporkan.
- Processed preview Canvas terpisah untuk brightness, noise, motion, dan depth of field; analisis dibatasi sekitar 5 Hz dan rendering berhenti saat halaman hidden.
- Migration `camera_capture_settings`, model/service whitelist server, detail metadata edukatif, unit test engine, acceptance Fase 3B, enam screenshot, dan matriks perangkat.

### Security and Honesty

- Badge NYATA hanya setelah advanced constraint berhasil dan `getSettings()` cocok; kegagalan tidak menghentikan stream.
- ISO/shutter/aperture PRO disimpan sebagai SIMULASI, AUTO sebagai OTOMATIS; client tidak dapat mengirim klaim hardware.
- Snapshot tetap frame original; tidak ada file simulasi permanen dan tidak ada EXIF ISO/shutter/aperture palsu.
- Ownership, CSRF, MIME/dimensi/ukuran, random filename, storage deny, transaksi, rollback, dan cascade delete tetap aktif.

### Verification

- Migration 005 dijalankan dan idempotent dua kali.
- 65/65 PHP lint, 20/20 JS/MJS syntax, 22/22 engine, 7/7 capability, 21/21 Fase 1, 31/31 Fase 2, 30/30 Fase 3A, 17/17 Fase 3B, dan 40/40 browser lulus.
- Backup sebelum Fase 3B checksum `E5F0DD393A8E8BA703A2F0B5772CEDE1343D8F164D5998A612EFE0FF5245A5E2`.
- Backup setelah Fase 3B RC checksum `A8EB528A8F78C5120905B218CE3A7E473AE88AAD132205B45D3F2A043810CA3A`; tidak memuat password demo plaintext.
- Checkpoint RC final: `storage/checkpoints/virtual_lab_fotografi_v2_phase3b_rc_final_20260724.zip`; checksum otoritatif disimpan pada sidecar `.sha256`.
- Audit data menemukan baseline sebelum Fase 3B sudah 0 capture, walau backup final Fase 3A sebelumnya mencatat capture ID 15; binary tidak tersedia untuk recovery dan tidak diganti dengan data baru palsu.

### Pending Gate

- Webcam laptop fisik lulus acceptance 40/40 pada Edge 150; Chrome Android fisik depan/belakang, switch camera, sentuhan, background, dan capability aktual HP belum direkam.
- Status tetap RC; Fase 3C tidak boleh dimulai sebelum `tests/artifacts/phase3b/device-test.md` lengkap.

## [2.3.0-phase-3a-rc] — 24 Juli 2026

### Added

- Migration `camera_captures`, model capture, controller Virtual Lab siswa, serta service penyimpanan original/thumbnail.
- Aktivasi kamera atas klik dengan `audio: false`, preferensi kamera belakang, enumerate setelah izin, pilihan/switch perangkat, stop terpusat, dan fallback error/izin.
- Live view responsif, shutter Canvas ke Blob JPEG/FormData, preview lokal, galeri maksimal 20, detail, streaming file ownership, dan hapus milik sendiri.
- Ringkasan capture pada dashboard siswa, lima screenshot Fase 3A, acceptance HTTP/storage, dan pengujian browser kamera sintetis.

### Security

- Snapshot wajib session siswa dan CSRF; `user_id` request diabaikan.
- Server memverifikasi upload PHP, `finfo`, `getimagesize`, whitelist JPEG/PNG/WebP, batas 8 MB/40 megapiksel, serta membersihkan metadata perangkat.
- Nama file acak 48 karakter hex, path relatif ketat, storage ditolak Apache, transaksi/rollback mencegah data parsial, dan hapus memakai ownership serta staged deletion.
- CSP mengizinkan `blob:` hanya untuk preview/media lokal; Permissions-Policy hanya membuka kamera untuk origin sendiri dan menolak mikrofon.

### Verification

- 61/61 file PHP dan 4 file JavaScript lolos syntax check.
- 21/21 regression Fase 1, 31/31 Fase 2, 30/30 Fase 3A, dan 28/28 browser/responsive lulus.
- Edge 150 dengan kamera sintetis lulus izin diterima/ditolak, live view 640×480, tanpa audio, snapshot, thumbnail, stop track, dan responsive layout.
- Backup sebelum Fase 3A: `virtual_lab_fotografi_v2_before_phase3a_20260724_034123.sql`.
- Backup setelah Fase 3A: `virtual_lab_fotografi_v2_after_phase3a_20260724_040736.sql` (SHA-256 `E8B7B2B34204604B293E9229194A4BC1F0E6F9C34D7AB7D0C44A3AAB2EEE6E31`).
- Backup final setelah bukti webcam fisik: `virtual_lab_fotografi_v2_after_phase3a_final_20260724_041407.sql` (SHA-256 `5D17D8925A45AC9E6297BF0617CEC15E26294B4FC4AFADBF119FD9327C456008`).
- Checkpoint RC: `storage/checkpoints/virtual_lab_fotografi_v2_phase3a_rc_20260724_041000.zip`; checksum disimpan pada sidecar `.sha256`.

### Pending Gate

- Fase 3A belum final: laptop fisik baru terbukti parsial sampai snapshot; stop/indikator, izin ditolak, dan Chrome Android kamera depan/belakang belum lengkap di `tests/artifacts/phase3a/device-test.md`.
- Fase 3B tidak dimulai pada release candidate ini.

## [2.2.0-phase-2] — 24 Juli 2026

### Added

- Migration `materi` dan `progres_materi` dengan unique key, index, check constraint, serta foreign key aman.
- Seed delapan materi aktif dan satu nonaktif dengan konten original berbahasa Indonesia untuk Kelas X DKV.
- Model `Materi`, model `ProgresMateri`, service validasi materi, serta renderer teks artikel aman.
- Pengelolaan materi guru: daftar, tambah, edit, status, urutan, statistik, dan jumlah siswa selesai.
- Pembelajaran siswa: daftar aktif, detail, navigasi sebelum/berikutnya, mulai, selesai, materi terakhir, dan persentase progres.
- Integrasi statistik database ke dashboard guru/siswa tanpa mengubah susunan sembilan kartu siswa.
- Acceptance test Fase 2 dan lima screenshot responsif di `tests/artifacts/phase2/`.

### Security

- Semua route memakai role guard; seluruh POST memakai CSRF; input divalidasi dengan whitelist dan batas server-side.
- `user_id` progres berasal dari session; materi nonaktif ditolak; output di-escape dan HTML bebas tidak dirender.
- Tidak ada hard delete pada antarmuka materi dan tidak ada fitur kamera/dependency baru.

### Verification

- 52 file PHP lolos syntax lint akhir.
- 21/21 regression Fase 1, 31/31 acceptance Fase 2, dan 19/19 browser/responsive test lulus.
- Kondisi akhir database: 9 materi (8 aktif, 1 nonaktif), 3 migration tercatat, dan tidak ada fixture acceptance tersisa.
- Log aplikasi kosong/tidak terbentuk.
- Backup sebelum migration: `virtual_lab_fotografi_v2_before_phase2_20260724_021948.sql`.
- Backup setelah pengujian: `virtual_lab_fotografi_v2_after_phase2_20260724_024425.sql` (SHA-256 `1C712A77AF99F47BF57CEDA3AC54363102DD22E96030AAA43AF6CB89A657E4B0`).

## [2.1.0-phase-1] — 23 Juli 2026

### Added

- Struktur PHP native MVC sederhana, front controller, router GET/POST, view renderer, database service, session, CSRF, flash, logger, error handler, autentikasi, dan role guard.
- Migration tabel `users`, pencatatan migration, seed akun demo guru/siswa, dan backup database Fase 1.
- Login responsif dengan ilustrasi SVG original lokal dan design system CSS tanpa dependency/CDN.
- Layout guest, siswa, guru; sidebar/topbar/mobile navigation; dashboard siswa sembilan kartu dan dashboard guru.
- Halaman 403, 404, dan 500 serta proteksi Apache untuk seluruh folder/file internal.
- Acceptance test HTTP/security dan browser/responsive beserta screenshot test.

### Security

- Password disimpan dengan `password_hash()` dan diverifikasi memakai `password_verify()`.
- PDO memakai native prepared statement; session memakai strict mode, HttpOnly, SameSite=Lax, dan regenerasi ID.
- Login/logout dilindungi CSRF; error login generik; akun nonaktif dan role silang ditolak.

### Verification

- 40 file PHP lolos syntax lint.
- 21/21 HTTP/auth/security acceptance test lulus.
- 9/9 browser/responsive acceptance test lulus.
- Migration idempotent, backup tidak memuat password plaintext, dan log aplikasi kosong.

## [2.0.0-foundation] — 23 Juli 2026

### Added

- Memulai ulang Virtual Lab Fotografi Dasar dari awal dengan baseline **Kamera Pro Edukatif**.
- Menetapkan kamera perangkat sebagai live view dan sumber foto setelah tindakan pengguna.
- Menetapkan slider ISO, shutter speed, dan aperture dengan badge NYATA, SIMULASI, atau OTOMATIS.
- Menetapkan pemisahan foto asli dan hasil simulasi.
- Menetapkan arah UI berdasarkan struktur catatan Karina dan batas referensi Canon Play.
- Menambahkan dokumentasi Fase 0: konteks agent, status, keputusan, backlog, arsitektur, rancangan database, fitur, pengujian, UI, dan camera capability.

### Audit

- Kondisi awal root hanya berisi satu PDF panduan versi 2.0.
- Tidak ditemukan source code lama, struktur MVC, database/SQL, dependency, aset, atau artefak konsep lama.
- Tidak ada file yang dihapus, database yang dibuat, migration yang dijalankan, dependency yang diinstal, atau fitur aplikasi yang dibangun.

## Fase 6 — Finalisasi Fitur Inti (27 Juli 2026)

- Mengaktifkan halaman Hasil & Nilai terpadu untuk Siswa.
- Menambahkan halaman Progress Belajar khusus dengan progres terpadu, Teknik Visual, dan rekomendasi adaptif.
- Mengaktifkan Rekap Nilai serta Laporan Perkembangan untuk Guru.
- Menambahkan profil mandiri Guru/Siswa dengan verifikasi password saat ini.
- Menambahkan panduan penggunaan khusus Guru dan Siswa.
- Menambahkan mode cetak laporan melalui browser.
- Memperkuat focus state, drawer keyboard, reduced motion, struktur tabel, dan tampilan responsif.
- Menghapus hardcode nama folder dari `.htaccess` untuk deployment yang lebih portabel.
- Menambahkan `MANUAL_TEST_PHASE6.md`, `DEPLOYMENT.md`, dan runtime contract Fase 6.

## [6.0.1-material-ui-patch] — 27 Juli 2026

### Fixed

- Memperbaiki query daftar materi agar kompatibel dengan SQL mode ketat dan tidak menggandakan jumlah progres/lampiran.
- Menyelaraskan kategori Materi dengan Fase 5A: Komposisi, Angle Kamera, dan Framing melalui migration `014`.
- Menghapus input upload lampiran ganda pada mode edit dan memperjelas penanganan kegagalan status/urutan.

### Changed

- Merancang ulang daftar Materi Guru menjadi kartu responsif dengan pencarian, filter, progres, status, dan lampiran aktif.
- Merancang ulang editor materi dan pengelola lampiran untuk desktop/HP, termasuk character counter dan generator slug manual.

## Patch Praktikum Kamera & Digital Project — 27 Juli 2026

- Memperbaiki aktivasi kamera Praktikum, fallback constraint, dan race condition stream.
- Menjaga live view tetap aktif ketika capability atau preview simulasi tidak tersedia.
- Merancang ulang UI dan alur Digital Project Guru/Siswa.
- Menambahkan upload multi-foto, pengelolaan foto utama/hapus, checklist langsung, validasi tenggat, dan alur revisi yang benar.
