发现于 #6993 的五面 $regex 拒收普查(执行测量,非 grep;probe 命令与完整输出见 #6993 的 PR 报告)。
实测(2026-08-09,origin/main @ 08863dd18)
对每个面执行 { name: { $regex: 'ac.*' } } 与悬空 { name: { $options: 'i' } },读取抛出错误的 code / status / message:
| 面 |
code |
status |
message 含 RETIRED_FILTER_OPERATORS[op].why 全文 |
driver-sql(default: 臂) |
INVALID_FILTER |
400 |
是 |
| driver-sqlite-wasm(继承) |
INVALID_FILTER |
400 |
是 |
| driver-turso local + remote |
INVALID_FILTER |
400 |
是 |
driver-memory(filter-refusal.ts) |
INVALID_FILTER |
400 |
是 |
driver-mongodb(translateFieldOperators) |
INVALID_FILTER |
400 |
是 |
objectql having(having-filter.ts unknownOperator) |
undefined |
undefined |
是 |
最小重现:matchesHaving({ k: 'Alpha' }, { k: { $regex: '^alp' } }) — catch 到的是裸 new Error(...)(packages/objectql/src/having-filter.ts unknownOperator() 两处 return 均为裸 Error),code / status 均为 undefined。unknown-operator 分支(如 $nand、$icontains)同样裸抛。
后果
同一个 400 级作者错误,经 having 面到 REST 层会以 500-shaped body 到达客户端 —— 正是 filter-text-conformance.ts FilterTextRejectionCase.code 文档指出的「#5324 的另一半」。五个拒收面里四个已在信封内,只有这一面漏。
相关但不一致的记录
修复方向
unknownOperator() 返回携带 code: 'INVALID_FILTER' / status: 400 的错误(与四个驱动面一致、与 FILTER_TEXT_CASES 拒收 case 的要求一致),having-filter.test.ts 拒收断言升级为 code + status + message。
行为改动,超出 #6993(仅改注释)的围栏,故单独立卡。
Generated by Claude Code — session_018ffcE95NaMJcL9XJ9VDYgk
发现于 #6993 的五面
$regex拒收普查(执行测量,非 grep;probe 命令与完整输出见 #6993 的 PR 报告)。实测(2026-08-09,
origin/main@08863dd18)对每个面执行
{ name: { $regex: 'ac.*' } }与悬空{ name: { $options: 'i' } },读取抛出错误的code/status/ message:codestatusRETIRED_FILTER_OPERATORS[op].why全文default:臂)INVALID_FILTERINVALID_FILTERINVALID_FILTERfilter-refusal.ts)INVALID_FILTERtranslateFieldOperators)INVALID_FILTERhaving(having-filter.tsunknownOperator)最小重现:
matchesHaving({ k: 'Alpha' }, { k: { $regex: '^alp' } })— catch 到的是裸new Error(...)(packages/objectql/src/having-filter.tsunknownOperator()两处 return 均为裸Error),code/status均为undefined。unknown-operator 分支(如$nand、$icontains)同样裸抛。后果
同一个 400 级作者错误,经
having面到 REST 层会以 500-shaped body 到达客户端 —— 正是filter-text-conformance.tsFilterTextRejectionCase.code文档指出的「#5324 的另一半」。五个拒收面里四个已在信封内,只有这一面漏。相关但不一致的记录
scripts/check-driver-conformance.mjsFILTER_TEXT requirement-3 行写 driver-mongodb 的臂是 "the last place a barenew Errorescaped the ADR-0112 envelope" —— 对having面不成立,修复时应一并更新该句。packages/objectql/src/having-filter.test.ts的拒收断言只断 message 子串,不断code+status—— 正是 PR fix(drivers):undefined比较数一律拒收 —— 闸落在任何发射器/守卫之前,两个毛病同闸消灭 (#6050) #6142(drivers:undefined比较数被发射器读作 null、却被守卫/校验读作「值」—— turso local 抛裸 knex 错、remote 静默答 IS NULL(实测,origin/main) #6050)量过的「throw-only 断言对缺信封永远绿」的洞,修复时应升级断言。修复方向
unknownOperator()返回携带code: 'INVALID_FILTER'/status: 400的错误(与四个驱动面一致、与FILTER_TEXT_CASES拒收 case 的要求一致),having-filter.test.ts拒收断言升级为code+status+ message。行为改动,超出 #6993(仅改注释)的围栏,故单独立卡。
Generated by Claude Code — session_018ffcE95NaMJcL9XJ9VDYgk