PUNCA RAJAH TERPOTONG

Skrip ekstrak asal tidak terdapat dalam project semasa. Fail aset terdahulu menunjukkan crop dibuat menggunakan rectangle/manual vertical bands. Beberapa crop terlalu rapat pada kandungan dan sebahagian rajah/jadual PDF ialah gabungan vector + text + raster. Embedded-image extraction sahaja juga pernah kehilangan komponen.

Pembaikan dalam tools/rebuild_assets.py:
- render PDF dengan PyMuPDF page.get_pixmap(Matrix(3,3), clip=rect)
- rect dibina daripada union drawings + image bbox + text blocks dalam band rajah
- padding 12pt dan berkembang 10pt sehingga 5 kali jika edge test gagal
- auto-trim ruang putih berlebihan, kemudian tambah 24px putih seragam
- fail baharu q{question_id}_fig{n}_v2.png; fail lama tidak ditimpa
- SQL update/rollback disediakan tetapi tidak dijalankan

Ujian pembangunan pada 32 baris pemetaan B/C (26 fail unik): 32/32 edge test OK. Live IDs perlu diambil melalui export_assets_manifest.php sebelum rebuild supaya nama q{id} tepat.
