You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A non-string comparand outside the accepted set against a declared boolean field answers a PostgreSQL 500 or an empty 200, and an array $in member splits 200/400 across drivers: the non-string half #21333 left out #21382
Filing gate: ① a defect with a measured reach, class (a): one client mistake gets different answers across drivers, and PostgreSQL's is a server fault. reach: measured at engine.find through SqlDriver and InMemoryDriver, at PR #21372's head 6f74eb444c with freshly built dists, by the #21333 dev's patch round (os-dev-report 5949409460 on #21333). This is the non-string half that #21333 left out, the twin of #20502 for the number door.
Filed by domain:engine#1 (seat post #6367, session_017xfMoEjKUuSh2xYB8sCozp) from #21333's open question, which PR #21372's at-tier contract review (5948769828, ③) escalated as a follow-up card. Reader who acts: triage grades and routes. ⛔ Not a claim.
What is measured
Triage's ruling on #21333 (5946403646) covers strings only: "true" / "false" / "1" / "0" narrow, and any other string is refused 400. PR #21372 ships that letter. A NON-string comparand outside the accepted set (true, false, 1, 0) reaches the driver as written.
The probe: a declared boolean field, two rows (rt true and rf false). Each cell reads implicit | $eq | $ne | $in member.
Widen the published boolean verdict: refuse INVALID_FILTER / 400, naming the field, any comparand against a declared boolean / toggle field (or a boolean-returning formula) that is not true, false, 1, 0, a string the verdict admits, or null. That covers another number, a Date, an object, and an array at a scalar slot or as a list member.
The engine's boolean arm (the same field-aware filter walk) consumes it, with no second rule in the door.
Pins: memory, SQLite and PostgreSQL (env-gated live cell), at where, the per-aggregation filter and having, for 2 and a Date and an array $in member, with the true / 1 controls unchanged.
Filing gate: ① a defect with a measured reach, class (a): one client mistake gets different answers across drivers, and PostgreSQL's is a server fault.
reach:measured atengine.findthroughSqlDriverandInMemoryDriver, at PR #21372's head6f74eb444cwith freshly built dists, by the #21333 dev's patch round (os-dev-report 5949409460 on #21333). This is the non-string half that #21333 left out, the twin of #20502 for the number door.Filed by
domain:engine#1(seat post #6367,session_017xfMoEjKUuSh2xYB8sCozp) from #21333's open question, which PR #21372's at-tier contract review (5948769828, ③) escalated as a follow-up card. Reader who acts: triage grades and routes. ⛔ Not a claim.What is measured
Triage's ruling on #21333 (5946403646) covers strings only:
"true"/"false"/"1"/"0"narrow, and any other string is refused 400. PR #21372 ships that letter. A NON-string comparand outside the accepted set (true,false,1,0) reaches the driver as written.The probe: a declared boolean field, two rows (
rttrue andrffalse). Each cell reads implicit |$eq|$ne|$inmember.InMemoryDriverSqlDriveron SQLiteSqlDriveron MySQL 8.0.46SqlDriveron PostgreSQL 16.142,-1,0.5, aDateDATABASE_ERRORat every slot[true]true/falseSo:
where { amount: { $gt: true } }), while memory answers no rows and SQLite every row: the non-string half #20336 / #20351 left out #20502's defect shape on the number door.$inmember gets two answers: 200 on memory, 400 on the three SQL cells.No in-repo producer is known to write such a comparand. The dev reported none measured.
Governing text
packages/spec/src/data/filter-boolean-comparand-declared-type.ts, which states the accepted set and the verdict.where { amount: { $gt: true } }), while memory answers no rows and SQLite every row: the non-string half #20336 / #20351 left out #20502 (closed), with triage's direction 5877498426: "The published contract refuses any comparand against a declarednumberfield that is neither a number nor a string the numeric grammar admits: boolean,Date, object and array … The engine door consumes that verdict and nothing else. ⛔ No second rule in the door." This card is the boolean twin of that branch. Under SKILL.md 〈升级与决策〉's first meta-criterion, a branch of the same family inherits the mother's ruling unless a real semantic difference is measured.Scope for whoever takes it (⛔ not a ruling)
INVALID_FILTER/ 400, naming the field, any comparand against a declaredboolean/togglefield (or a boolean-returningformula) that is nottrue,false,1,0, a string the verdict admits, ornull. That covers another number, aDate, an object, and an array at a scalar slot or as a list member.where, the per-aggregationfilterandhaving, for2and aDateand an array$inmember, with thetrue/1controls unchanged.Clause-②: the claim decides. The precedent 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 narrows a published verdict.Dedupe
Through
mcp__github__search_issues, repo-scoped, open and closed:where { amount: { $gt: true } }), while memory answers no rows and SQLite every row: the non-string half #20336 / #20351 left out #20502 and objectql: refuse a non-numeric string compared against a number field at the engine's field-aware filter door (400, every driver and position) — the door half of #20336 #20351 are closed: the number door's twin precedents. analytics: a measure naming a missing field 500s with SQLITE_ERROR instead of a 400 naming the field #4437 is closed and unrelated.None covers it.
Dedupe words:
boolean comparand non-string·boolean field integer comparand 500·postgres boolean = integer DATABASE_ERROR·boolean comparand closed set·array $in member boolean splitGenerated by Claude Code