refactor(events): migrate live consumers + delete reader functions
Sprint 4 Lode C1. Completes retirement of legacy reader surfaces started
in 9a5d800b (A) and 930f1d36 (B); last-known-good for revert: 930f1d36.
- apps/home: rename `_collect_events` → `_collect_anticipated_activities`;
drop `get_events` call; rename pulse context key `events` →
`anticipated_activities`; update template iteration + empty-state copy.
- apps/activities: delete `/api/day/<day>/events` route + `activities_day_events`;
replace `activities_stats` with activities-sourced stub returning
`{YYYYMMDD: {facet: count}}` via `calendar.monthrange` + `load_activity_records`.
- apps/activities/_day.html: template surgery — replace `#eventsView` with
`#timelineView`, extract timeline rendering into new `renderTimeline()`,
delete event modal + `openModal`, delete all-day event block, delete
processedEvents/column-layout/legend code, drop `/api/day/<day>/events`
fetch. File: 1470 → 974 LOC.
- convey/static/month-picker.js: tooltip wording `events` → `items`.
- think/journal_stats.py: drop `facets/*/events/*.jsonl` mtime block from
`_get_day_mtime`.
- think/indexer/journal.py: delete `get_events`. `_find_signal_files`
event glob retained — historical event files remain searchable via
`sol call journal search`.
- think/event_formatter.py: delete `get_month_event_counts`; `format_events`
remains as the only public export. Registry entry at
`think/formatters.py:142` unchanged.
- tests: delete `tests/test_events.py` (5 tests); delete
`test_get_events*` from `test_journal_index.py` (2 tests); delete
`test_facet_event_mtime_invalidates_cache` from `test_journal_stats.py`
(1 test, covered deleted functionality); rewrite Pulse collector test
in `test_home_yesterdays_processing.py` (anticipated-only assertion);
update monkeypatches in `test_home_skills.py` + `test_home_routines.py`;
add one route-level stats stub test in `tests/test_app_activities.py`;
remove `day-events` entry from `tests/verify_api.py`; regenerate
`tests/baselines/api/activities/stats-month.json` for the new shape.
Keep-list invariants intact:
- `think/formatters.py:142` event formatter registry entry
- `think/event_formatter.py::format_events`
- `think/indexer/journal.py::_find_signal_files` event glob (line ~250)
- `tests/test_formatters.py`
Deferred to Lode D: `think/planner.md` references to `get_events` at
lines 19, 46, 82 (live prompt text, but no runtime tool-wrapper exists —
misleading but non-breaking); wider docs/baselines scrub.
Test count: 3234 passed, 1 skipped (net −7 tests from the migration:
−5 `test_events.py`, −2 `test_journal_index.py::test_get_events*`,
−1 `test_journal_stats.py::test_facet_event_mtime_invalidates_cache`,
−1 rewritten-in-place in `test_home_yesterdays_processing.py`,
+1 new `test_app_activities.py` stats route test, +1 existing
`test_home_yesterdays_processing.py` rewrite counted above).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>