- _load_geometry(): compute extents/volume from individual Scene meshes
without concatenating — avoids the RAM spike that crashed the container
- analyse_in_background(): spawns a child process (spawn context, not fork)
with a 120s timeout; OOM/crash in child no longer takes down the app
- _failed set: tracks files that timed out or crashed; spinner stops and
a warning with inline override form is shown instead of looping forever
- analysis_failed state passed to template; override form shown immediately
when analysis failed (no expand needed)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>