Skip to content
Centriu
Centriu Run

Task-List Pagination Integrity Automation: When a Database's Own Row Ceiling Hides Data Behind a 200 OK

Centriu Run's task list used to fetch every task for an organization in a single request — which worked invisibly right up until an organization crossed 1,000 tasks, because the underlying database layer enforces a hard 1,000-row ceiling that wins silently over any larger request: the response still comes back as a normal, successful HTTP 200 with exactly 1,000 rows, with nothing in the response indicating anything was cut. A real measurement on the day of the fix found 1,607 tasks in one organization, of which 607 never reached the browser at all — because the list is ordered newest-first, the ceiling always consumed the oldest tail, so a "Completed Tasks" tab showing a partial slice of history was reporting itself as complete, and any task past the cutoff was unreachable from search entirely. The fix requests successive 1,000-row pages using the database layer's own range mechanism until a page comes back smaller than a full page — the only way to know for certain nothing is left — with an explicit ceiling at 50 pages (50,000 tasks) so a pathological organization can't make the list load indefinitely; hitting that ceiling logs a warning and stops cleanly rather than looping forever.
Pages until proven complete
607 tasks measured, now retrievable
Small business owner checking a phone
607 tasks were there all along — just never fetched.

Why a single unpaginated query is invisible right up until it silently isn't

A single query with no explicit pagination looks completely correct in every test performed against a smaller dataset — it returns exactly what's asked for, with a normal success response, because the actual row count never gets anywhere near whatever hidden ceiling the underlying database platform enforces. The defect has no failure mode that looks like a failure: no error, no partial-content status code, nothing distinguishing a complete result from a truncated one. It only becomes visible once a real organization's data volume crosses that ceiling — and by then, the missing data has already been silently missing for however long it took to get there.

How the underlying problem shows up before you fix it

A list screen that used to show everything now quietly shows only part of the data, with the exact same successful response code as before — nothing in the interface signals that anything changed.

A tab labeled as showing a complete category (like "Completed") actually shows a partial slice, because the missing rows fall past whatever silent ceiling the query hit.

A search for something that genuinely exists in the database returns no result, because the record in question falls in the portion of data the query never even reached.

The specific rows that go missing aren't random — they're whichever end of the sort order the ceiling happens to cut, so the oldest (or newest) records disappear first and keep disappearing as the dataset grows.

The actual row count crossing a round number like 1,000 is the only thing that changes between "working perfectly" and "silently incomplete" — nothing about the query itself changed at all.

Why "it worked before" is not evidence the query was ever actually complete

A managed database platform enforcing a maximum row count per request is a reasonable, common safeguard against a single runaway query consuming unbounded resources — the platform, not the application, decides how many rows a single request can return, and that ceiling applies regardless of how the request itself was written. A single, unpaginated fetch built without an explicit page/range strategy isn't wrong when it's written — it's incomplete in a way that costs nothing to ignore until the data volume it's pointed at happens to grow past the platform's own ceiling, at which point the exact same code silently starts returning less than it asks for, with no code change required to trigger it.

How Centriu Run found and closed the gap, with a real measurement behind it

The defect was found by direct production measurement, not a code review guess: at the agency running the check, the organization had 1,607 tasks in total, and the single unpaginated request was silently returning only the first 1,000 of them — 607 tasks, comprising 463 completed and 12 still active, never reached the browser at all. Because the underlying query orders tasks by delivery date descending, the row ceiling always consumed the oldest tail of the list first: a "Completed Tasks" tab was displaying a partial slice of the organization's actual history while presenting itself as the complete record, and any task older than the silent cutoff simply did not exist as far as any search or filter in the product could tell — not slow to find, genuinely unreachable.

The root mechanism is specific to the database platform itself, not a bug in the application's own query logic: Supabase's PostgREST layer enforces its own `max-rows` setting (1,000 by default) that overrides any larger request automatically — the response still comes back as a completely normal, successful HTTP 200, with the row count simply capped and nothing in the response body or status code distinguishing a capped result from a genuinely complete one. A query written to ask for everything in one call has no way to detect this on its own; it looks identical whether the real total is 900 rows or 900,000.

The fix replaces the single request with a loop that requests successive pages of up to 1,000 rows each, using the database layer's own range mechanism to specify which slice of rows each request should return, continuing until a page comes back with fewer rows than the requested page size — the only reliable signal that nothing is left to fetch, since a full page could always mean there's more. An explicit ceiling stops the loop at 50 pages, a deliberate limit of 50,000 tasks per organization: the code comment accompanying it is direct about the reasoning — if an organization's task count ever gets that large, that scale is a different problem to solve deliberately, and a task list screen silently trying to load an unbounded number of rows forever is not where that problem should be discovered. Hitting that ceiling logs a specific warning rather than failing silently or looping without end.

What is actually built today

A paginated task-retrieval loop requesting successive 1,000-row pages via the database layer's own range mechanism, replacing a single unbounded request.

A completion check based on receiving a page smaller than the full page size — the only way to confirm nothing further remains, rather than assuming a full first page means the whole list.

An explicit 50-page (50,000-task) safety ceiling preventing an unbounded loop for a pathological organization, with a logged warning if that ceiling is ever reached.

The fix scoped specifically to the task-retrieval query identified as affected — confirmed via the same commit's own diff, not a platform-wide rewrite touching unrelated queries.

A defect measured and quantified in real production data before the fix (1,607 total tasks, 607 previously unreachable) rather than addressed as a purely theoretical risk.

No change to the task ordering itself (still newest-first by delivery date) — the fix corrects completeness of retrieval, not the display order users already expect.

A completed task from months ago, findable again (illustrative scenario, not a real client)

Someone searches for a specific task they know was completed several months earlier, in an organization with well over a thousand total tasks. Before the fix, that task simply wasn't present in the data the browser ever received — the search wasn't broken, the data behind it was silently incomplete. After the fix, the same task is retrievable, because the full task history is paged through completely rather than cut off at the platform's row ceiling.

What changes operationally

A task list, once an organization's history is large enough to have silently hit the platform's row ceiling, actually returns everything it claims to — a "Completed" tab that says complete now genuinely is, and a search for an older task can actually find it. And because the defect had no visible failure symptom (a normal 200 response, no error, no obviously wrong count for a smaller organization), the value here specifically is closing a class of defect that data volume alone would otherwise have kept hidden indefinitely for a smaller organization and silently active for a larger one.

When this is not the right fit

An organization with a task volume nowhere near the underlying 1,000-row ceiling was never actually affected by this specific defect — the fix's value is proportional to how close an organization's real task count sits to (or past) that ceiling. This is also not a general performance or infinite-scroll feature; the safety ceiling at 50,000 tasks is a deliberate stop, not a claim that Run is built to smoothly browse an unbounded task list of any size.

Trusting a single request vs. proving completeness by requesting until proven done

A single request that returns a normal success response looks complete by every visible signal available to the calling code — there is no error to catch, because nothing about the request actually failed from the database platform's own point of view. Centriu Run's fix doesn't trust that signal; it keeps requesting successive pages specifically until a page smaller than full proves there's genuinely nothing left, treating "the response looked successful" and "the response was complete" as two different claims that need two different checks.

Related systems

Main system: Centriu Run.

What it does NOT do

  • Does not trust a single request's successful response as proof the full task list was returned — completeness is confirmed only when a page comes back smaller than the requested page size.
  • Does not loop indefinitely for a pathological data volume — an explicit ceiling stops retrieval at 50 pages (50,000 tasks), logging a warning rather than hanging or failing silently.
  • Does not change the task list's existing sort order (newest delivery date first) — the fix corrects retrieval completeness, not display ordering.
  • Does not apply this specific pagination fix to unrelated queries elsewhere in the product — it is scoped to the task-retrieval query directly identified as affected by the row ceiling.
  • Does not rely on a smaller-scale test to prove correctness — the defect was measured directly against real production data (1,607 total tasks, 607 previously unreachable) before and after the fix.
  • Does not add a visible loading indicator claiming a specific total upfront — pages are requested until proven complete, not against a pre-known total row count.

Security and governance

Task retrieval remains scoped to the requesting organization's own tasks at every page of the pagination loop — no page of the loop can return another organization's data. Any personal or business data referenced in a task record remains subject to Brazil's LGPD (Law No. 13,709/2018). Full detail on access control lives at /governanca and /iso.

Pricing and contracting

Available by monthly subscription, with tiered plans. Values and terms come from the official pricing table at /precos (Centriu's central source — never restated here).

Frequently asked questions

What was the actual measured impact of this defect?

At the organization where it was measured, 1,607 total tasks existed, of which 607 (463 completed, 12 active) never reached the browser — silently cut off by the database platform's own 1,000-row ceiling.

Why didn't this show up as an error?

The database platform's row ceiling overrides a larger request automatically, and the response still comes back as a completely normal, successful HTTP 200 with the row count simply capped — there is no error signal to catch.

How does the fix know when it has actually retrieved everything?

It requests successive 1,000-row pages until a page comes back with fewer rows than the full page size — the only reliable signal that nothing further remains.

Is there a limit to how many tasks this can retrieve?

Yes, a deliberate ceiling at 50 pages (50,000 tasks) stops the loop and logs a warning, specifically so an extreme data volume can't make the list load without bound.

Which tasks were affected — old ones or new ones?

Because the list is ordered by delivery date descending, the ceiling always cut the oldest tail of the list first — older tasks, including completed ones, were the ones going missing.

What does Centriu Run cost?

It is sold by subscription with a published starting price — exact current values are on the central pricing page.

See how Centriu Run guarantees a complete task list, not just a fast one

Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.

Sources

  1. Centriu Run — public product page — Centriu, 2026-07-20 · link(primária)
  2. Centriu Run — public factsheet (API, JSON) — Centriu, 2026-07-21 · link
  3. Law No. 13,709/2018 — Brazil’s General Data Protection Law (LGPD) — Presidência da República (Brazil), 2018-08-14 · link

Last material update on .

By · AI-assisted production, with human review