Pagination parameters. All-None means 'return everything'.
Named 'Paginate' (not 'PaginationParams') because this single model
is used for both GET query params and POST body fields — keeping one
name avoids the GET/POST semantic split. 'Pagination' was taken by
the response model.
Business defaults (this layer):
- page without per_page: per_page defaults to PAGE_SIZE
- per_page without page: page defaults to 0
Correctness guards (mira-lib-python fetch_paginated):
- per_page < 1: raises ValueError
- page < 0: raises ValueError
- asymmetric page/per_page: raises ValueError
Entry points:
- GET: resolve_paginate() dependency (paginate=false -> all-None)
- POST: PaginatedRequest field_validator (paginate: null -> all-None)