Summary
- Adds a deterministic pre-check to
lint_missing_pagination_params.py for a generic "size-only pagination" gap.
- Flags collection actions that expose only a page-size/limit field while their response model exposes a next-page/cursor field, but the request model has no cursor/offset/page-token style traversal field.
- Keeps the existing LLM-backed missing-pagination flow for other cases.
Why this would catch the OneNote issue
This is not Microsoft-specific: the invariant is that if an action response exposes continuation metadata (@odata.nextLink, next, cursor, has_more, etc.), the action should also expose some request field that lets the caller request the next window (cursor, page_token, offset, skip, page, etc.) unless it intentionally handles pagination internally.
For OneNote, this catches the actions that have $top/page_size and @odata.nextLink, but no $skip/$skiptoken/cursor-style request field.
Full-repo scan
I ran the deterministic portion across all non-generated apps/*/actions/*.py files:
- Checked action classes: 36,367
- Collection candidates: 14,110
- Failures: 192
- Verification condition for every failure: response exposes continuation metadata, request exposes only page-size (
limit, top, page_size, etc.), and request exposes no traversal field.
Top apps by failure count:
constant_contact 20
zendesk 18
dropbox 16
mural 15
persona 13
confluence 12
onenote 11
paradym 9
one_drive 8
microsoft_teams 7
jira 6
notion 6
OneNote failures:
apps/onenote/actions/group_list_pages.py
apps/onenote/actions/group_list_section_groups_section_groups_2.py
apps/onenote/actions/group_list_sections_pages_2.py
apps/onenote/actions/group_list_sections_pages_4.py
apps/onenote/actions/list_group_section_groups_sections.py
apps/onenote/actions/list_notebooks_section_groups.py
apps/onenote/actions/list_site_notebook_section_groups.py
apps/onenote/actions/list_user_notebook_sections.py
apps/onenote/actions/me_list_sections_pages_4.py
apps/onenote/actions/site_list_sections.py
apps/onenote/actions/user_list_notebooks.py
I also ran the actual checker against those 192 files and it returned 192 violations. Full local lists were written to /tmp/pagination_all_failures.txt and /tmp/pagination_all_failures_verified.json during verification.
Verification
uv run pytest -q tests/test_lints/test_missing_pagination_params.py ✅
uv run python ci_checks/lint_missing_pagination_params.py apps/onenote/actions/*.py ✅ expected failure: 11 OneNote violations listed above
uv run python ci_checks/lint_missing_pagination_params.py $(cat /tmp/pagination_all_failures.txt) ✅ expected failure: 192/192 violations
make snt ✅
MYPY_DIFF_ONLY=true make chk ⚠️ unrelated existing formatting failure in tests/test_utils/test_http.py
npm run typecheck, npm run lint, npm test ⚠️ package.json has no such scripts
Linear: https://linear.app/composio/issue/INT-2045/improve-create-app-and-config-gen-for-onenote-gaps