Found while verifying useAdapter samples for the new react-pages guide (#10210).
Filing rather than fixing — examples/** is outside that card's file surface, and the
page is the golden example the react-tier dogfood audit points at, so a copy-paste from
it propagates.
The call
examples/app-showcase/src/ui/pages/renewals-pipeline.page.ts, inside the hand-rolled
rollup effect:
constpr=awaitadapter.find('showcase_project',{$filter: ['account','=',sel],top: 500});constiv=awaitadapter.find('showcase_invoice',{$filter: ['account','=',sel],top: 500});$filter is right. top is not a query option — the key is $top.
Evidence
QueryParams (objectui packages/types/src/data.ts) declares $select, $filter,
$orderby, $skip, $top, $expand, $search, $count — all $-prefixed, "follows
OData/REST conventions". The adapter a react page actually receives,
ObjectStackAdapter (objectui packages/data-objectstack/src/index.ts), reads the
prefixed spelling and nothing else:
if(params.$top!==undefined){queryParams.set('top',String(params.$top));}An unprefixed top reaches no branch. It is dropped without a warning, so the two
queries return the backend's default page size instead of up to 500 rows.
The visible consequence
The KPI strip this effect feeds — "Projects", "Invoices", "Open AR" — is computed as
records.length over the returned array. Any account with more related records than the
default page size shows a silently capped count that reads as a real number. There is
no error, and the framework-block half of the same panel (ObjectChart / ListView,
deliberately shown side by side as the declarative counterpart) is unaffected, so the two
halves of the comparison disagree for exactly the accounts where the comparison is most
interesting.
Fix
top: 500 → $top: 500 in both calls. Two characters; no other change.
Why it is worth a card
The page's docstring presents the hand-rolled branch as the teaching example of "you own
the queries, loading, and refresh". It is also the page
docs/audits/2026-06-react-tier-authoring-dogfood.md names as "the golden, validated
example", and os validate cannot catch this — the react prop checker deliberately
reads only static literals of block props, not useAdapter call arguments, so the page
validates clean today (confirmed: os validate on the showcase app exits 0).
Related audit staleness filed separately as #10284.
Found while verifying
useAdaptersamples for the new react-pages guide (#10210).Filing rather than fixing —
examples/**is outside that card's file surface, and thepage is the golden example the react-tier dogfood audit points at, so a copy-paste from
it propagates.
The call
examples/app-showcase/src/ui/pages/renewals-pipeline.page.ts, inside the hand-rolledrollup effect:
$filteris right.topis not a query option — the key is$top.Evidence
QueryParams(objectuipackages/types/src/data.ts) declares$select,$filter,$orderby,$skip,$top,$expand,$search,$count— all$-prefixed, "followsOData/REST conventions". The adapter a react page actually receives,
ObjectStackAdapter(objectuipackages/data-objectstack/src/index.ts), reads theprefixed spelling and nothing else:
An unprefixed
topreaches no branch. It is dropped without a warning, so the twoqueries return the backend's default page size instead of up to 500 rows.
The visible consequence
The KPI strip this effect feeds — "Projects", "Invoices", "Open AR" — is computed as
records.lengthover the returned array. Any account with more related records than thedefault page size shows a silently capped count that reads as a real number. There is
no error, and the framework-block half of the same panel (
ObjectChart/ListView,deliberately shown side by side as the declarative counterpart) is unaffected, so the two
halves of the comparison disagree for exactly the accounts where the comparison is most
interesting.
Fix
top: 500→$top: 500in both calls. Two characters; no other change.Why it is worth a card
The page's docstring presents the hand-rolled branch as the teaching example of "you own
the queries, loading, and refresh". It is also the page
docs/audits/2026-06-react-tier-authoring-dogfood.mdnames as "the golden, validatedexample", and
os validatecannot catch this — the react prop checker deliberatelyreads only static literals of block props, not
useAdaptercall arguments, so the pagevalidates clean today (confirmed:
os validateon the showcase app exits 0).Related audit staleness filed separately as #10284.