Repair the collection-to-display path so each successful acquisition
publishes correct read/write deltas through the observation store and
visible dashboard.
Fixes:
- derive.py: accumulate bytes_read_delta on same-hour hour_observation
merge (was silently dropped)
- collector.py: rebuild day_aggregates from hour observations after
each collection run (previously only populated for cross-hour intervals)
- day_aggregate.py: add persist_day_aggregate upsert helper
- tui.py: query and display both read and write deltas in daily and
hourly readouts, constrained summaries, and graph data queries
Tests:
- Add 14 integration tests (test_measured_activity.py) exercising the
full collector→store→reader→display path with real fixtures and
injected time
- Update constrained-layout assertion to match new W/R format
Closes#89