Problem
Topic page Record timeline entries are mostly low-information. For a topic like "lead service lines" (23 appearances, impact score 5), 8 of 10 Record entries say variations of "appeared on the agenda." Only 2 entries have substantive content (dollar amounts, contract details, scope).
Record entries also don't link to meeting pages — committee names and dates are plain text. A resident who wants to dig deeper hits a dead end.
Current State
Record entries come from `TopicBriefing.generation_data["factual_record"]`, an array of `{"date", "event", "meeting"}` hashes generated by `analyze_topic_briefing` (Pass 1). The generation prompt asks for factual record entries but doesn't have access to per-meeting summary content, so it can only work with agenda item titles and raw document text.
The entries render in `topics/show.html.erb` as a timeline (`.topic-timeline-entry`) with date, event text, and meeting name. Meeting name is plain text, not a link.
What Should Change
1. Make Record entries link to meeting pages
Each `factual_record` entry has a `"meeting"` field (e.g., "Public Utilities Committee"). Cross-reference with `TopicAppearance` records to find the actual `Meeting` record for that date + body name. Render the meeting name as a link to `meeting_path(meeting)`.
This is a view-layer change — the data already exists in `TopicAppearance`, just needs to be joined.
2. Enrich "appeared on the agenda" entries
Options (in order of preference):
- Use `MeetingSummary.generation_data` item details — if the meeting has a summary with `item_details` that mentions this topic, pull the item's summary text as the Record entry instead of "appeared on the agenda"
- Use the agenda item title — at minimum, show the actual agenda item title instead of "appeared on the agenda"
- Improve the briefing prompt — give `analyze_topic_briefing` access to meeting summary content so it can generate richer factual record entries
3. Hide "appeared on the agenda" entries below a threshold
If an entry has no substantive content beyond "appeared on the agenda," consider:
- Collapsing low-information entries behind a "Show all" toggle
- Or filtering them out entirely and only showing entries with real content
- Or grouping consecutive low-info entries ("Appeared on 4 committee agendas between Aug–Oct 2025")
Context
Problem
Topic page Record timeline entries are mostly low-information. For a topic like "lead service lines" (23 appearances, impact score 5), 8 of 10 Record entries say variations of "appeared on the agenda." Only 2 entries have substantive content (dollar amounts, contract details, scope).
Record entries also don't link to meeting pages — committee names and dates are plain text. A resident who wants to dig deeper hits a dead end.
Current State
Record entries come from `TopicBriefing.generation_data["factual_record"]`, an array of `{"date", "event", "meeting"}` hashes generated by `analyze_topic_briefing` (Pass 1). The generation prompt asks for factual record entries but doesn't have access to per-meeting summary content, so it can only work with agenda item titles and raw document text.
The entries render in `topics/show.html.erb` as a timeline (`.topic-timeline-entry`) with date, event text, and meeting name. Meeting name is plain text, not a link.
What Should Change
1. Make Record entries link to meeting pages
Each `factual_record` entry has a `"meeting"` field (e.g., "Public Utilities Committee"). Cross-reference with `TopicAppearance` records to find the actual `Meeting` record for that date + body name. Render the meeting name as a link to `meeting_path(meeting)`.
This is a view-layer change — the data already exists in `TopicAppearance`, just needs to be joined.
2. Enrich "appeared on the agenda" entries
Options (in order of preference):
3. Hide "appeared on the agenda" entries below a threshold
If an entry has no substantive content beyond "appeared on the agenda," consider:
Context