Fictional support-ticket snapshot data for an AI-app comparison.
Reporting label: 21–23 September 2026. This label is not an opening-date filter.
Inclusive reporting cutoff: 2026-09-23T18:00:00Z.
Include all tickets opened on or before that cutoff, including tickets opened before 21 September.

CSV is UTF-8, comma-delimited, with a header. Each row is a full ticket snapshot.
event_id: snapshot identifier. One event is repeated exactly; remove exact repeated rows.
ticket_id: stable ticket identifier. Distinct events for one ticket are not duplicates.
updated_at_utc: time of this snapshot. Despite the column name, two cells have explicit non-UTC offsets. Parse ISO 8601 and compare absolute instants; do not sort timestamp strings.
team: responsible team in this snapshot. Use the latest eligible snapshot's team.
status: open or resolved. Use the latest eligible snapshot's status. Reopened tickets are open.
opened_at_utc: original ticket opening instant; a reopened ticket retains its original opening time.
resolved_at_utc: resolution instant for a resolved snapshot, otherwise blank. A blank resolved timestamp in a final resolved snapshot is missing data, not zero duration.
priority: normal or high; descriptive only, not a filter.

Processing order: remove exact duplicate rows; ignore snapshots after cutoff; select the latest remaining snapshot per ticket by actual timestamp instant. All tickets in this fixture were opened before cutoff. No two distinct events for a ticket have equal update instants.
Report current state, not number of events, and use the final team assignment.
Counts: open_ticket_count counts final open tickets; resolved_ticket_count counts final resolved tickets even when resolution time is missing.
Eligible durations: final resolved tickets with parseable opened and resolved timestamps, opened <= resolved <= cutoff. Compute (resolved - opened) in elapsed hours. Exclude current open tickets, including reopened tickets, from durations without listing them as missing-data exceptions.
Median: use the middle sorted duration, or the arithmetic mean of the two middle durations for an even-sized set. Round the final median to two decimal places. No eligible durations means blank, never zero.

Requested summary.csv headers: team,open_ticket_count,resolved_ticket_count,median_resolution_hours
Use one row for each team, sorted alphabetically. No total row.
Requested exceptions.csv headers: ticket_id,event_id,reason
List final resolved records excluded from duration calculations because of missing/invalid timestamps, with a clear reason. Do not list valid current open tickets, superseded snapshots, exact duplicates or post-cutoff snapshots as duration exceptions; describe their handling in the method explanation.
All names and records are fictional. Do not send the data to an external service.
