Filing gate: ① a product defect with a measured reach:. Finding class (a) (one filter, two answers by driver), with a (b) half (a declared form no data-path driver serves). reach: is POST /api/v1/data/:object/query. The #20546 dev measured it on origin/main fbec216e2d, and it is unchanged at PR #20744's head, on InMemoryDriver, SqlDriver SQLite and a live PostgreSQL 16 (os-dev-report on #20546, out_of_scope_findings[0]). The readings are the dev's; the seat read the spec's declaration on origin/main.
Filed by the domain:engine execution seat 1 (session_01DEvba2nBuD4tWzfq8r8NFY, os-support-ai). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim. Reader: triage, then the seat that owns the filter contract and the drivers' nested-relation arm.
What happens
where |
InMemoryDriver |
SqlDriver (SQLite, PostgreSQL 16) |
{ owner: { region: 'NA' } } on a lookup (also on master_detail and a multiple lookup) |
200, no rows (rows d1 and d3 were meant: their owner is in region NA) |
400 INVALID_FILTER, in the driver's words |
{ meta: { a: 1 } } on a json field |
200, 1 row (deep equality) |
400 INVALID_FILTER, in the driver's words |
{ id: { a: 1 } } (id is not in the registry's declared field map) |
200, no rows |
400 INVALID_FILTER |
Why it is its own card
Scope for whoever takes it (⛔ not a ruling)
Triage decides, per the governing text:
In either case, pin the table above on memory, SQLite and PostgreSQL.
Dedupe
search_issues in objectstack-ai/objectstack, open and closed:
Dedupe words: nested relation filter lookup memory 200 sql 400 · FilterCondition nested relation unserved · json object comparand memory deep equality sql refusal
Generated by Claude Code
Filing gate: ① a product defect with a measured
reach:. Finding class (a) (one filter, two answers by driver), with a (b) half (a declared form no data-path driver serves).reach:isPOST /api/v1/data/:object/query. The #20546 dev measured it onorigin/mainfbec216e2d, and it is unchanged at PR #20744's head, on InMemoryDriver, SqlDriver SQLite and a live PostgreSQL 16 (os-dev-reporton #20546,out_of_scope_findings[0]). The readings are the dev's; the seat read the spec's declaration onorigin/main.Filed by the
domain:engineexecution seat 1 (session_01DEvba2nBuD4tWzfq8r8NFY,os-support-ai). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim. Reader: triage, then the seat that owns the filter contract and the drivers' nested-relation arm.What happens
where{ owner: { region: 'NA' } }on alookup(also onmaster_detailand amultiplelookup)d1andd3were meant: their owner is in region NA)INVALID_FILTER, in the driver's words{ meta: { a: 1 } }on ajsonfieldINVALID_FILTER, in the driver's words{ id: { a: 1 } }(idis not in the registry's declared field map)INVALID_FILTERWhy it is its own card
$key as a scalar field's filter value answers 200 with no rows on the memory driver andINVALID_FILTER400 on SQLite and PostgreSQL #20546's triage (5882227960) ruled thelookup/master_detailnested-relation filter and the json object comparand to be the controls that "must stay accepted". So PR fix(objectql)!: a no-operator object where a scalar field's value belongs is refused INVALID_FILTER / 400 on every driver (#20546) #20744 ([finding] a plain object with no$key as a scalar field's filter value answers 200 with no rows on the memory driver andINVALID_FILTER400 on SQLite and PostgreSQL #20546) deliberately leaves these shapes unjudged, and they are not that PR's.packages/spec/src/data/filter.zod.ts(about:1982onorigin/main) declares "4. Nested relations: { relation: { field: value } }" as aFilterConditionform. No data-path driver serves it: memory reads it as deep equality and finds nothing, and SQL refuses it. The form is declared but not enforced.Scope for whoever takes it (⛔ not a ruling)
Triage decides, per the governing text:
$key as a scalar field's filter value answers 200 with no rows on the memory driver andINVALID_FILTER400 on SQLite and PostgreSQL #20546 now does for scalars.In either case, pin the table above on memory, SQLite and PostgreSQL.
Dedupe
search_issuesinobjectstack-ai/objectstack, open and closed:$key as a scalar field's filter value answers 200 with no rows on the memory driver andINVALID_FILTER400 on SQLite and PostgreSQL #20546, the parent. None is this pair. Public lookup route builds object-shaped filter rules the data layer refuses:GET /forms/:slug/lookup/:fieldanswers 400 INVALID_FILTER for every search #16581 is the public lookup route building object-shaped rules, closed; [finding]FilterConditionSchemastill PARSES{ field: [...] }and{ field: { $eq: [...] } }, so a stored dataset or widget filter publishes clean and is refused at query time on every backend #19889 and spec: FilterConditionSchema (the save-time door) admits a non-boolean $null / $exists flag, so a stored dataset or widget filter carrying one saves clean and is refused 400 on every query face #20116 are save-door shape cards, closed.$key as a scalar field's filter value answers 200 with no rows on the memory driver andINVALID_FILTER400 on SQLite and PostgreSQL #20546, [finding] driver-memory analytics: MemoryAnalyticsService runs neither shared comparand door, so a cube where {d: undefined} answers the null rows instead of a 400 #20734, driver-sql on PostgreSQL answers 500 for a boolean or Date compared against a number field (where { amount: { $gt: true } }), while memory answers no rows and SQLite every row: the non-string half #20336 / #20351 left out #20502 and driver-sql + driver-memory: an epoch-millisecond NUMBER against adatefield is read by neither driver's storage rule —where: { placed_on: { $gt: 1769940000000 } }returns 6 of 6 rows on SqlDriver and 0 on InMemoryDriver over REST #20203 are comparand-type or door cards. None is the json object comparand.Dedupe words:
nested relation filter lookup memory 200 sql 400·FilterCondition nested relation unserved·json object comparand memory deep equality sql refusalGenerated by Claude Code