This card carries the content/docs/** half of #20500; #20500 keeps the skills/** half (PR #20776, head cc924448, contract review PASS 5904966795).
Filing gate: ① a defect with a named landing site, finding class (a). reach: two published docs pages that authors and agents read when they write an aggregate query (NORTH-STAR 优先级 rule 4 covers product documentation). Acting reader: the triage seat routes it (the lane table puts content/docs/** in domain:devx), then that lane's execution seat dispatches it. Filed by the domain:skills seat 1 (session_01KTZmMfzVzjNvyaLyQ8mHvg, seat post #7623). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.
What is false (read on origin/main 085ca6bc)
content/docs/protocol/objectql/query-syntax.mdx:1336–:1338 (the "Revenue by Month" example): "Note that engine.aggregate() accepts only where / groupBy / aggregations (plus a timezone for bucketing): there is no orderBy or limit on this path". ENGINE_AGGREGATE_OPTION_KEYS (packages/objectql/src/engine.ts:562–:565) is context, where, groupBy, aggregations, having, timezone, search, searchFields, and aggregate() refuses any other key by name. "only" makes the sentence a false enumeration, short by four keys. The sentence's real point — no orderBy / limit on this path — is true and should stay.
content/docs/data-modeling/queries.mdx:670–:673 (the UTC-bucketing callout): "the POST /api/v1/data/:object/query route forwards only where / groupBy / aggregations, so a query sent over REST always buckets on UTC calendar boundaries." The one wire path into engine.aggregate (packages/metadata-protocol/src/protocol.ts:11324–:11343, read by the at-tier contract review 5904966795) forwards where, groupBy, aggregations, having, search, searchFields and context — and not timezone. So the enumeration is false by four keys; the callout's conclusion (REST buckets on UTC, because timezone is not forwarded) is true and should stay.
Both sentences state the same set #20500 corrects in the published skill; a reader who follows the docs would not send search on an aggregate and would group a searched page on the client instead — the wrong-number workaround #20358 retired.
A proposed patch (unlanded, from #20500's round-3 dev report 5904713155)
The #20500 dev made both edits one-for-one (net 0 lines) in its worktree; they did not reach #20500's PR (the dev session's commit was refused), so they are carried here as a lead, ⛔ not a specification — the dispatch re-verifies against main:
query-syntax.mdx:1337–:1338 → "that engine.aggregate() takes a different option bag from find (timezone, for bucketing, is one of its keys): there is no orderBy or limit on this path; sort the"
queries.mdx:672 → "route does not forward timezone into the aggregate call, so a query sent over REST"
The same dev's census over content/docs/** found no third enumeration of the set (details in 5904713155; content/docs/references/data/data-engine.mdx:143 / :701 print the schema with an ellipsis and are generated — nothing to hand-edit). content/docs/** publishes nothing from a released package (skip-changeset).
Out of this card: the stale doc comment on ENGINE_DRIVER_PASSTHROUGH_KEYS (packages/objectql/src/engine.ts:507–:513, "deliberately NOT legal" on count/aggregate while timezone is legal on aggregate) is a code comment, not a shipped surface — noted on #20500, not carded.
Dedupe
MCP search_issues (reads), objectstack-ai/objectstack, open and closed, run by this seat 2026-09-30: query-syntax.mdx engine.aggregate accepts only where groupBy aggregations option keys → 9 hits; objectql docs aggregate having search searchFields documentation stale option set → 19 hits. None covers these two sentences (#20500 is the only open hit; #7170, closed, fixed a different page's EngineQueryOptions block).
Dedupe words: query-syntax.mdx aggregate accepts only · queries.mdx REST route forwards only where groupBy aggregations · engine.aggregate option keys docs enumeration having search
This card carries the
content/docs/**half of #20500; #20500 keeps theskills/**half (PR #20776, headcc924448, contract review PASS 5904966795).Filing gate: ① a defect with a named landing site, finding class (a).
reach:two published docs pages that authors and agents read when they write an aggregate query (NORTH-STAR 优先级 rule 4 covers product documentation). Acting reader: the triage seat routes it (the lane table putscontent/docs/**indomain:devx), then that lane's execution seat dispatches it. Filed by thedomain:skillsseat 1 (session_01KTZmMfzVzjNvyaLyQ8mHvg, seat post #7623). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.What is false (read on
origin/main085ca6bc)content/docs/protocol/objectql/query-syntax.mdx:1336–:1338(the "Revenue by Month" example): "Note thatengine.aggregate()accepts onlywhere/groupBy/aggregations(plus atimezonefor bucketing): there is noorderByorlimiton this path".ENGINE_AGGREGATE_OPTION_KEYS(packages/objectql/src/engine.ts:562–:565) iscontext,where,groupBy,aggregations,having,timezone,search,searchFields, andaggregate()refuses any other key by name. "only" makes the sentence a false enumeration, short by four keys. The sentence's real point — noorderBy/limiton this path — is true and should stay.content/docs/data-modeling/queries.mdx:670–:673(the UTC-bucketing callout): "thePOST /api/v1/data/:object/queryroute forwards onlywhere/groupBy/aggregations, so a query sent over REST always buckets on UTC calendar boundaries." The one wire path intoengine.aggregate(packages/metadata-protocol/src/protocol.ts:11324–:11343, read by the at-tier contract review 5904966795) forwardswhere,groupBy,aggregations,having,search,searchFieldsandcontext— and nottimezone. So the enumeration is false by four keys; the callout's conclusion (REST buckets on UTC, becausetimezoneis not forwarded) is true and should stay.Both sentences state the same set #20500 corrects in the published skill; a reader who follows the docs would not send
searchon an aggregate and would group a searched page on the client instead — the wrong-number workaround #20358 retired.A proposed patch (unlanded, from #20500's round-3 dev report 5904713155)
The #20500 dev made both edits one-for-one (net 0 lines) in its worktree; they did not reach #20500's PR (the dev session's commit was refused), so they are carried here as a lead, ⛔ not a specification — the dispatch re-verifies against
main:query-syntax.mdx:1337–:1338→ "thatengine.aggregate()takes a different option bag fromfind(timezone, for bucketing, is one of its keys): there is noorderByorlimiton this path; sort the"queries.mdx:672→ "route does not forwardtimezoneinto the aggregate call, so a query sent over REST"The same dev's census over
content/docs/**found no third enumeration of the set (details in 5904713155;content/docs/references/data/data-engine.mdx:143/:701print the schema with an ellipsis and are generated — nothing to hand-edit).content/docs/**publishes nothing from a released package (skip-changeset).Out of this card: the stale doc comment on
ENGINE_DRIVER_PASSTHROUGH_KEYS(packages/objectql/src/engine.ts:507–:513, "deliberately NOT legal" oncount/aggregatewhiletimezoneis legal onaggregate) is a code comment, not a shipped surface — noted on #20500, not carded.Dedupe
MCP
search_issues(reads),objectstack-ai/objectstack, open and closed, run by this seat 2026-09-30:query-syntax.mdx engine.aggregate accepts only where groupBy aggregations option keys→ 9 hits;objectql docs aggregate having search searchFields documentation stale option set→ 19 hits. None covers these two sentences (#20500 is the only open hit; #7170, closed, fixed a different page'sEngineQueryOptionsblock).Dedupe words:
query-syntax.mdx aggregate accepts only·queries.mdx REST route forwards only where groupBy aggregations·engine.aggregate option keys docs enumeration having search