/// <summary>
/// Cursor-paginated result set. The cursor is the OccurredAt timestamp
/// of the last item in this page. Pass it as the "after" query parameter
/// to get the next page.
///
/// This uses the N+1 fetch pattern: fetch pageSize+1 rows, return pageSize,
/// and use the existence of the extra row to determine HasMore without
/// a separate COUNT query.
/// </summary>
public record CursorPagedResult<T>(
    IReadOnlyList<T> Items,
    int PageSize,
    string? NextCursor,
    bool HasMore
);