- Remove compute_spatial_freq_metrics() and _spatial_freq_html()
- Add compute_surface_psd(): 2D FFT + Hann window + radial averaging
- Add compute_psd_band_rms(): gravity/support/HF band decomposition
- Add make_psd_plot(): interactive log-log PSD plot with band annotations
- Add _psd_summary_html(): band RMS cards with % breakdown
- New section in report: Power Spectral Density Analysis
- Zernike details now show only coefficient bar charts (cleaner)
- Methodology: Tony Hull JWST approach for WFE spatial frequency analysis
New tool: tools/generate_optical_report.py
- CDR-ready single HTML report from OP2 results
- Executive summary with pass/fail vs targets
- Per-angle WFE analysis with 3D surface plots
- Zernike trajectory analysis (mode-specific RMS)
- Axial vs lateral sensitivity matrix
- Manufacturing correction metrics
- Collapsible Zernike coefficient bar charts
- Optional study DB integration for design params
- Annular aperture support (default M1 inner R=135.75mm)
- Dark theme, interactive Plotly charts, print-friendly