- Replace debounced auto-render-on-param-change with an explicit Render
button. Param changes mark the button "dirty" (accent ring); user clicks
Render to drive a render. A Cancel button (AbortController) appears
while a render is in flight.
- Add indeterminate progress bar with elapsed-time counter in the status
panel. Real OpenSCAD --progress streaming can come later.
- Bump OPENSCAD_TIMEOUT default 60s -> 300s and gunicorn --timeout
120s -> 300s. The 60s cap was misclassified by the frontend as
"OpenSCAD not installed" because the error string contained the word
"openscad" -- which the JS matched too greedily.
- Frontend error classifier now distinguishes "binary not found",
"timed out", and "geometry empty" cases and only shows the
install-OpenSCAD hint for the real not-found case.