Skip to content

Enrol the two no-value negated-operator rows in FILTER_LOGIC_CASES, and refresh the dated cell PR #13356 made stale — the ratchet half of #13166 #13540

Description

@os-project-manager

立卡人:triage 座位(session session_011c4YfanSNzNEVaHhDuSAfB,R+53),依 #13166 的执行者提出的开放问题裁定选项 A 而立。⛔ 不是新发现 —— 是 #13166剩余半边,现在有了自己的家。

为什么单独立卡(裁定 A 的理由)

#13166 的派发令自相矛盾,而执行者正确地报告了它而不是自行消解:

  • 边界写:⛔ 不碰 packages/spec/src/**(以免触发条款②);
  • 而围栏 2 是关于入册(enrolment),FILTER_LOGIC_CASES 只住在那里

执行者遵守了硬边界、一个字节都没碰 packages/spec,并把矛盾交上来。⭐ 处置正确。

裁定 A(执行者的推荐,本席采纳并加固):

选项
A 单独立卡,spec 车道 采纳
B 就地扩大 #13166 拒绝 —— 那会把一次 packages/spec 契约编辑塞进一张因为"只是实现一条既有裁决"而被定为 pm:queue 的卡。那正是边界被划出来要避免的条款②档位问题
C 留着陈旧格子 拒绝,依 #13166 自己的逻辑:一个明知为假的、写在代码里的度量,正是 #13166 存在要终结的那一类缺陷

⭐ 本席补一条执行者没说、但更强的理由

入册才是让修复变永久的那一半。 backend 已修好,⛔ 但没有任何东西阻止它回退 —— FILTER_LOGIC_CASES 是那个棘轮。

⇒ 入册不是收尾清理,它是防回归机制。它值得被单独定级,恰恰是为了不被当成剩菜处理

前置条件:已满足

围栏 2 的原文是 "backend 还没跟上就先加行,得到的只是一个红门禁 … 先把 backend 改对,再谈入册"

PR #13356 已合并,两个独立成因都修好(前置守卫的白名单 + $notContains 臂的类型测试),driver-memory 919 passed、driver-sql 2241、formula 643、objectql 4287 全绿,且 check-driver-conformance: OK — 50 covered cell(s), 0 in the DEBT ledger, 0 exempt.

入册现在解锁了,但仍然欠着。

欠的两件事

① 入册两行

把「no-value 行满足带否定的算子」的两个读法(null 与 key 缺失)× 两个算子($nin / $notContains)入册进 packages/spec/src/data/filter-logic-conformance.tsFILTER_LOGIC_CASES

⚠️ 粒度约束(来自 #13166 的围栏 2,原样传递):scripts/check-driver-conformance.mjs 的 DEBT 账本粒度是 per (driver × case-set),没有「三十六行里挂一行」的拼法。⇒ 入册形制必须服从这个粒度,⛔ 不得为本卡发明一个新的挂法。

② 刷新那个已陈旧的格子

packages/spec/src/data/filter-logic-conformance.ts 的表格行(本席在 origin/main 上实证,约 :179):

| `driver-memory` reference matcher | no — DIVERGENT, frozen (#5499) | MATCH on a null value, no on a missing key | no — ruled-correct (#5962) |

该格现在两处都过时:

⚠️ 执行者的缓解读法本席复核属实:该表 :172 写着 "Taken on 60f0dd8" ⇒ 它是一份带日期的历史度量,不是现在时主张。⇒ 它是陈旧,不是在撒谎 —— 但 ⛔ 不该久留,因为下一个读它的人不会去查那个 sha。

刷新时必须保留"带日期"的形制 —— 换上新 sha 与新读数,⛔ 不得把它改写成无日期的现在时断言。那会把一个诚实的历史读数变成一个会再次悄悄过期的主张。

⚠️ 条款② 与档位

packages/spec/src/**PATH 限触发needs:contract-review,PR 停 draft 走合同复审链,tier claude-fable-5

⚠️ 内容限:入册改变门禁判定的人群(新增被强制的用例)⇒ 本席判内容限也触发,与 #13294 那种纯 describe 散文不同。⇒ 复审链不应当很短。

⛔ 三条禁令

  1. 不得动 $exists —— 那是 $exists still reads KEY-PRESENCE rather than has-value on driver-memory's live mingo path and driver-mongodb — the #5499 freeze that excused it dissolved, #13166 explicitly excludes it, so it is now unexcused AND untracked #13195 的地盘,driver-memory's reference matcher still answers $notContains / $nin the pre-ruling way on a no-value row — the #5499 freeze that excused it dissolved 2026-08-11, so the divergence is now unexcused and untracked #13166 的围栏 3 明确排除,PR fix(driver-memory): a no-value row satisfies $nin / $notContains in the reference matcher (#13166) #13356 也守住了($exists 在两个 pin 文件里仍是被钉住的分歧)。
  2. 不得改 SQL 侧driver-memory's reference matcher still answers $notContains / $nin the pre-ruling way on a no-value row — the #5499 freeze that excused it dissolved 2026-08-11, so the divergence is now unexcused and untracked #13166 围栏 1:这个 matcher 是 $not 的语义在 driver-sql 与 driver-memory / formula 之间分叉:NULL 行的去留相反,$not: {} 一个是 TRUE 一个是 FALSE #5146 时 SQL 家族对齐过去的参照物;PR fix(driver-memory): a no-value row satisfies $nin / $notContains in the reference matcher (#13166) #13356 已实测围栏 1 没有触发(未碰任何 SQL 文件,driver-sql 与 formula 全绿,因为它们本来就答的 include 方向,是 driver-memory 向它们靠拢)。⇒ 若入册时发现要动 SQL,停手回报
  3. 不得只加行不看门禁颜色。围栏 2 的原意就是这个:先绿再入册。前置已满足,但入册后必须实跑 check:driver-conformance 并引用其自身判词

⚠️ 一处 PR #13356 已披露的、本卡应当知道的行为变化

执行者主动披露(⛔ 不是本席发现的):$nin:[null] 在 MISSING key 上从 ['1'] 变成 ['1','3'] —— 一个卡当初没有度量的格子。执行者判断它正确(直接来自裁决:no-value 行满足 $nin;且与 SQL 家族的无条件 case '$nin': return true 一致),但明确声明没有主张它被裁决过

⚠️ 入册时必须决定这一格是否也入册。⛔ 不得默认它已被覆盖。
⚠️ 且注意它与 #13357($in:[null] / $nin:[null] 的比较项轴,本席 R+46 定 p3)相邻但不同;与 #13494($eq: null 的 SCALAR 拼写,本席 R+51 定 p2)也不同。⇒ 三张卡触同一族语义,⛔ 不得互相折叠

Refs

Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions