Fix follow-up image lifecycle in describe.py vision analysis
The follow-up image was being closed immediately after creating async
requests, causing "Operation on closed image" errors when the batch
later tried to process them. This broke category-specific content
extraction (browsing, meeting, etc.) leaving empty content fields.
- Store follow-up images in frame_images dict keyed by frame_id
- Close image only when all follow-ups for that frame complete
- Removes stale references issue from multiple request objects
Bug was introduced in 03666da (Dec 24, 2025) when conditional close
logic was changed to unconditional.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>