Skip to content

Topic summary architecture — cost efficiency and freshness #64

@AndreRobitaille

Description

@AndreRobitaille

Problem

The current topic summary model generates one TopicSummary per topic-per-meeting during SummarizeMeetingJob. This creates several problems:

  1. Waste — We pay for N LLM calls per topic but only display the most recent summary. All prior summaries are buried.
  2. Narrow view — The visible summary only reflects what happened at the last meeting, not the full arc of the topic across months of discussion.
  3. Staleness — The summary becomes outdated as soon as the next meeting happens. There's no mechanism to refresh it.
  4. No narrative — A topic discussed across 8 meetings should tell the story of how it evolved. Instead, residents just see a snapshot of meeting Bump turbo-rails from 2.0.20 to 2.0.21 #8.

Current Architecture

SummarizeMeetingJob → for each topic in meeting:
  → Ai::OpenAiService#analyze_topic_summary (reasoning model)
  → Ai::OpenAiService#render_topic_summary (reasoning model)
  → TopicSummary.create!(topic:, meeting:, content:)

Topic show page displays: topic.topic_summaries.order(created_at: :desc).first

Possible Directions

  • Rolling summary per topic — One summary record per topic, updated incrementally when new meeting data arrives. Cheaper (update vs. full generation), always reflects the full picture.
  • Periodic regeneration — Regenerate the topic summary on a schedule (weekly?) using all available meeting data. Simpler than incremental updates.
  • Layered approach — Keep per-meeting summaries for the meeting page, but generate a separate "topic overview" summary that synthesizes across all meetings.

Each has trade-offs around cost, freshness, and complexity. Needs design work before implementation.

Constraints

  • Must align with TOPIC_GOVERNANCE.md (fact/framing/sentiment separation in generation, even if not in display)
  • Must be cost-conscious — reasoning model calls are expensive
  • Must not fabricate continuity that doesn't exist in the source documents

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions