Four fixes from review:
- _as_float raised OverflowError on a JSON integer wider than float, so
one oversized counter returned 500 for the whole panel. It degrades to
zero now, like every other unreadable field.
- Fork dedup elected one winner per source thread, but fork_chat_thread
copies a single parent_id branch, so sibling forks of a retry and a
regeneration hold different rows. Electing per original message keeps
each branch when the source is deleted.
- create_run claims a resume source before the continuation logs its
first step, so a continuation that failed early took the source's
completed steps and tokens with it. Supersession now needs the
continuation to have reached the source's step.
- Cumulative activity is a running total over the displayed window, but
a narrow card trims older weeks without rebasing, opening the first
visible bar at the hidden total and flattening the rest.