Filing gate: ① a defect with a named landing site: packages/drivers/driver-memory/src/memory-driver.ts, its $contains arm over a stored array. Finding class (b). reach: measured at the public door POST /api/v1/data/:object/query on an in-memory deployment. The measurement is the #20802 dev's (os-dev-report 5912874377 on #20802, out_of_scope_findings[1]).
Filed by the domain:engine execution seat 1 (session_01DEvba2nBuD4tWzfq8r8NFY, os-support-ai). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.
What happens
A multi-valued lookup owners: d1 and d3 store an array that contains u1, and d5 stores ['u10'].
where |
in-memory driver |
SQL drivers (SQLite, PostgreSQL) |
{ owners: { $contains: 'u1' } } |
d1, d3, d5 |
d1, d3 |
FILTER_OPERATORS' $contains docblock in @objectstack/spec declares membership over a stored array. It also records the in-memory gap in its own words: "driver-memory — DOES NOT ANSWER IT YET … matches a stored array by substring PER ELEMENT". The card it names for that gap (#17286) answers 404, so the declared gap has no live carrier.
PR #20872 (#20802) lowers { relation: { field: value } } on a multi-valued relation into $contains per id. On memory it inherits this answer: an id that is a prefix of another matches both.
Scope for whoever takes it (⛔ not a ruling)
- The in-memory driver answers
$contains on a stored array as membership (whole-element equality), as the SQL drivers do. The docblock's "DOES NOT ANSWER IT YET" clause and its dead tracker go.
- A string column keeps substring
$contains. The fork is by the stored value's shape, and it should follow whatever rule the SQL drivers already use.
- Pin
u1 against u10 on memory against SQLite.
Dedupe
mcp__github__search_issues, repo-scoped, open and closed, in the act that filed this card:
Dedupe words: driver-memory $contains stored array substring per element · memory multiple lookup contains u10 · stored-array membership memory driver
Generated by Claude Code
Filing gate: ① a defect with a named landing site:
packages/drivers/driver-memory/src/memory-driver.ts, its$containsarm over a stored array. Finding class (b).reach:measured at the public doorPOST /api/v1/data/:object/queryon an in-memory deployment. The measurement is the #20802 dev's (os-dev-report5912874377 on #20802,out_of_scope_findings[1]).Filed by the
domain:engineexecution seat 1 (session_01DEvba2nBuD4tWzfq8r8NFY,os-support-ai). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.What happens
A multi-valued lookup
owners:d1andd3store an array that containsu1, andd5stores['u10'].where{ owners: { $contains: 'u1' } }d1,d3,d5d1,d3FILTER_OPERATORS'$containsdocblock in@objectstack/specdeclares membership over a stored array. It also records the in-memory gap in its own words: "driver-memory — DOES NOT ANSWER IT YET … matches a stored array by substring PER ELEMENT". The card it names for that gap (#17286) answers 404, so the declared gap has no live carrier.PR #20872 (#20802) lowers
{ relation: { field: value } }on a multi-valued relation into$containsper id. On memory it inherits this answer: an id that is a prefix of another matches both.Scope for whoever takes it (⛔ not a ruling)
$containson a stored array as membership (whole-element equality), as the SQL drivers do. The docblock's "DOES NOT ANSWER IT YET" clause and its dead tracker go.$contains. The fork is by the stored value's shape, and it should follow whatever rule the SQL drivers already use.u1againstu10on memory against SQLite.Dedupe
mcp__github__search_issues, repo-scoped, open and closed, in the act that filed this card:$fieldarm — a cross-field comparand (bare or withaddDays) reaching it is presumably compared as a literal object rather than resolved or refused (grep reading, to be measured) #15104 (the reference matcher's$field), driver-memory's reference matcher matches a NULL-VALUED row against a well-formed bounded$between— the live mingo path excludes it, so one package answers one filter two ways #13549 (the reference matcher's$between) and drivers(memory, mongodb): the$containsfamily still folds case — the last two backends left on the wrong side of #4706 Q2 = A #6682 ($containscase folding). None covers per-element substring on a stored array.Dedupe words:
driver-memory $contains stored array substring per element·memory multiple lookup contains u10·stored-array membership memory driverGenerated by Claude Code