**CRITICAL FIX**: FEM results were identical across trials
**Root Cause**:
The LLM runner was passing design_vars to simulation_runner(), which then passed
them to NX Solver's expression_updates parameter. The solve journal tried to
update hardcoded expression names (tip_thickness, support_angle) that don't exist
in the beam model, causing the solver to ignore updates and use cached geometry.
**Solution**:
Match the working 50-trial optimization workflow:
1. model_updater() updates PRT file via NX import journal
2. Part file is closed/flushed to disk
3. simulation_runner() runs WITHOUT passing design_vars
4. NX solver loads SIM file, which references the updated PRT from disk
5. FEM regenerates with updated geometry automatically
**Changes**:
- llm_optimization_runner.py: Call simulation_runner() without arguments
- run_optimization.py: Remove design_vars parameter from simulation_runner closure
- import_expressions.py: Added theSession.Parts.CloseAll() to flush changes
- test_phase_3_2_e2e.py: Fixed remaining variable name bugs
**Test Results**:
✅ Trial 0: objective 7,315,679
✅ Trial 1: objective 9,158.67
✅ Trial 2: objective 7,655.28
FEM results are now DIFFERENT for each trial - optimization working correctly!
**Remaining Issue**: LLM parsing "20 to 30 mm" as 0-1 range (separate fix needed)
Critical bug fix for LLM mode optimization:
**Problem**:
- NXParameterUpdater.update_expressions() uses NX journal to import expressions (default use_nx_import=True)
- The NX journal directly updates the PRT file on disk and saves it
- But then run_optimization.py was calling updater.save() afterwards
- save() writes self.content (loaded at initialization) back to file
- This overwrote the NX journal changes with stale binary content!
**Result**: All optimization trials produced identical FEM results because the model was never actually updated.
**Fixes**:
1. Removed updater.save() call from model_updater closure in run_optimization.py
2. Added theSession.Parts.CloseAll() in import_expressions.py to ensure changes are flushed and file is released
3. Fixed test_phase_3_2_e2e.py variable name (best_trial_file → results_file)
**Testing**: Verified expressions persist to disk correctly with standalone test.
Next step: Address remaining issue where FEM results are still identical (likely solve journal not reloading updated PRT).