- AgentTree.restart() revives a stopped run in the same session: resets the
root, archives old branches, and restores spawnability (stop no longer
cancels the root).
- ResearchLoop.start() restarts from stopped/completed and resets iteration
counters; setGoal is allowed in terminal states; supervisor 'start' revives
the tree when the root is not spawnable.
- Cancelled/failed/archived children no longer count toward the per-agent
child limit and archived agents are ignored by the duplicate-task guard.
- cancel() no longer overwrites an already recorded agent result.
- Add agent_timeout_seconds (default 1800) so hung agent sessions fail
instead of blocking wait() forever.
- FTS search now prefix-matches tokens (tolerates inflections) and safely
handles punctuation/FTS5 metacharacters instead of returning false
negatives or throwing.
- Add tests for restart semantics, child limits, result preservation,
agent timeouts, and FTS morphology/special characters (38/38 passing).