- EstimateRates.finish_cost_per_sqft and min_per_finish are now dicts keyed by
finish kind (sanded/clear/stain/paint) — paint costs more and takes longer
than a clear coat; all editable.
- project_estimate prices the finish line per part by its finish kind × surface
area; finishing labor sums per-part by kind; raw parts cost nothing.
- load_rates generically merges any dict-valued rate field; RatesEditDialog
rewritten to render scalars + dict sub-sections automatically.
- tests: finish cost varies by kind, raw = no finish line, dict roundtrip.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>