- Add platform/io/spectra.py (UV-Vis onset/Tauc, PL peak/FWHM) + fixtures
- measurement_from_spectra: data/spectra/{formula}_uvvis|_pl.csv → decide()
- Wire 40/41 to prefer spectrum files, else synthetic metrics
- Schema: decisions.human_* + human_gates; human_gate.apply_override
- scripts/43_human_gate.py CLI; loops consume pending overrides
- Docs/README; 27 unit tests green; smoke 40/41 + 43 demo