Problem
Event cards currently use description directly (line-clamped), but scraped/source descriptions vary widely in length and quality. We need a dedicated short teaser field for cards while preserving fuller descriptions for detail pages.
Proposal
Add a nullable teaser_text field and use it as the preferred card summary.
Scope
- Schema
- Add nullable
teaser_text to events and events_staged.
- Add length constraint for teaser (e.g. 280-400 chars max).
- Update
public_events view to include teaser_text.
- Scraper
- Populate
teaser_text from source teaser fields when available (e.g. listing excerpt / shortdesc).
- Keep full
description for detail/event pages.
- App/API/types
- Update generated DB TS types and API payloads to read/write
teaser_text.
- Ensure staged-event approve flow copies teaser into
events.
- UI behavior
- Event cards use
teaser_text ?? truncate(description, N) consistently (homepage + event list cards).
- Event detail pages continue to use full
description.
- Optional AI phase (phase 2)
- If teaser is missing and description is long, generate
teaser_text with Haiku.
- Run only for scraper-ingested events or backfill jobs; avoid overriding manual teasers.
- Optional: add teaser provenance (
manual|scraped|ai).
Acceptance Criteria
- Cards render teaser first, fallback second.
- Scraper preserves full descriptions while filling teaser when available.
- Existing records without teaser still render cleanly via fallback.
- No DB write failures from description/teaser constraints.
Open Decision
Current schema enforces description <= 2000 chars. Decide whether to keep this cap or increase it in the same migration.
Problem
Event cards currently use
descriptiondirectly (line-clamped), but scraped/source descriptions vary widely in length and quality. We need a dedicated short teaser field for cards while preserving fuller descriptions for detail pages.Proposal
Add a nullable
teaser_textfield and use it as the preferred card summary.Scope
teaser_texttoeventsandevents_staged.public_eventsview to includeteaser_text.teaser_textfrom source teaser fields when available (e.g. listing excerpt /shortdesc).descriptionfor detail/event pages.teaser_text.events.teaser_text ?? truncate(description, N)consistently (homepage + event list cards).description.teaser_textwith Haiku.manual|scraped|ai).Acceptance Criteria
Open Decision
Current schema enforces
description <= 2000chars. Decide whether to keep this cap or increase it in the same migration.