The run command's completion check had a race condition: when a session
transitions busy->idle before the LLM generates any output (empty
response or API delay), checkCompletionConditions() returns true because
0 incomplete todos + 0 busy children = complete. This caused the runner
to exit with 'All tasks completed' before any work was done.
Fix:
- Add hasReceivedMeaningfulWork flag to EventState
- Set flag on: assistant text content, tool execution, or message update
with actual content (all scoped to main session only)
- Guard completion check in runner poll loop: skip if no meaningful work
has been observed yet
This ensures the runner waits until the session has produced at least one
observable output before considering completion conditions.
Adds 6 new test cases covering the race condition scenarios.