- Publish konten langsung menyinkronkan lesson registry dan merekomputasi
composite/state siswa bila jenis evaluasi (latihan/kuis) berubah, tanpa
menunggu restart server.
- TTL cache (`LESSON_LIST_CACHE_TTL`, default 30 detik) untuk daftar lesson
agar worker gunicorn lain ikut segar tanpa invalidasi lintas proses.
- Endpoint POST /content/sync-registry (teacher-only) + tombol Sinkronisasi di
/teacher/progress untuk menangkap perubahan konten di luar webapp.
- Notifikasi editor saat progress siswa dihitung ulang pasca-publish.
- `recompute_lesson_progress()`: skor historis tetap disimpan; state legacy
completed/scored tidak disentuh.
- Test unit (TTL cache + signature evaluasi) dan integrasi (publish recompute,
sync registry, endpoint auth) + dokumentasi.
Tanpa perubahan schema DB.
Hasil review pasca-fix upload asset:
Keamanan:
- Mitigasi stored-XSS via SVG (route /assets/* publik, same-origin):
CSP 'default-src none; sandbox' saat serve SVG — di backend
(send_assets) DAN di proxy SvelteKit (proxy hanya meneruskan
content-type/set-cookie, jadi CSP backend tak sampai ke browser).
- Deteksi 413 proxy kini ber-test status code + pesan.
Testing:
- Regression guard: error jaringan biasa tetap 502, bukan 413.
- 413 via status code saja (tanpa regex pesan) tetap 413.
- Boundary 5 MiB: file TEPAT 5 MiB lolos; 5 MiB+1 ditolak (cabang
len(raw) — SVG dipakai karena dikecualikan validasi PIL).
- CSP: SVG dapat header, raster tidak.
- E2E script (verify_asset_upload.py) memakai file asli
mr-edu/assets/ilustrasi_beban.jpeg + test 413 terintegrasi.
Reuseability:
- Komentar silang-referensi _MAX_ASSET_BYTES (sumber) dengan pesan 413
proxy dan BODY_SIZE_LIMIT compose.
- Tambah PROTECTED_BASENAMES (home.md, sub-home.md) dengan konfirmasi
kedua saat rename/delete agar tidak merusak navigasi siswa (tidak
bisa di-undo). Diteruskan ke renameEntry/deleteEntry di contentEditor.ts.
- Hapus fitur featureSidebarNarrow + CSS terkait (tidak dipakai).
- Footer & backend: penyesuaian rute/test content editor.