- Add backend/app/services/interviews/lifecycle.py with install_hooks() that
registers on_ready (pre-survey) and on_completed (post-survey + synthesis)
daemon-thread callbacks on a SimulationManager.
- Add SimulationRunner.register_on_completed() / _fire_on_completed() so
external callbacks can be notified when _monitor_simulation transitions to
COMPLETED (both exit-code-0 path and simulation_end event path).
- Wire both in app/__init__.py: create singleton SimulationManager, install
lifecycle hooks, and register its _notify_on_completed with SimulationRunner.
- Add test_lifecycle.py: verifies install_hooks registers one callable for each
of ready and completed.
- All 40 unit tests + 2 integration tests pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>