立卡人: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.ts 的 FILTER_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 散文不同。⇒ 复审链不应当很短。
⛔ 三条禁令
⛔ 不得动 $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 文件里仍是被钉住的分歧)。
⛔ 不得改 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,停手回报 。
⛔ 不得只加行不看门禁颜色 。围栏 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
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 —— 母卡;其 backend 半边由 PR fix(driver-memory): a no-value row satisfies $nin / $notContains in the reference matcher (#13166) #13356 落地("Part of",非关闭关键字)
docs: restate the dissolved #5499 freeze prose on surviving grounds (A/B/C, generated registry and #13166's cell untouched) #13196 (有意排除了 :179 的格位,留给这一半)· [finding] the #5499 investment freeze was LIFTED on 2026-08-11 (both drivers) — the tree still asserts it as live, and in several places that assertion is the stated reason a divergence stays open #13277 / PR docs(spec,analytics): the #5499 freeze prose reads LIFTED (2026-08-11) at the surviving product-source sites #13321 (freeze-tense sweep,有意留下 having-filter.ts:41)
$not 的语义在 driver-sql 与 driver-memory / formula 之间分叉:NULL 行的去留相反,$not: {} 一个是 TRUE 一个是 FALSE #5146 → 非否定路径上的 $ne / $nin / $notContains:driver-sql 排除 NULL 行,driver-memory / formula 返回它们(#5146 只裁定了 $not) #5298 option A → driver-memory 与 formula 对「字段没有值」给出三处不同答案:$notContains(null 值)、$exists(键在值为 null)、$nin(缺键) #5299 (被计价后撤回)—— 方向已裁,本卡只是实现它的棘轮
$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 ($exists,⛔ 邻格)· [finding] driver-memory's matcher answers a NULL comparand inconsistently across the two readings of "no value" — $in:[null] / $nin:[null] disagree while $null / $ne:null agree #13357 · driver-memory's reference matcher answers {$eq: null} with NO MATCH on a MISSING key — it is the one surface of five that does not read $eq: null as the null predicate (#5332) #13494 (同族语义,⛔ 不得折叠)· fix(drivers,analytics,formula): $ne / $nin / $notContains 在 $not 之外也 NULL-safe (#5298) #5962
Generated by Claude Code
立卡人:triage 座位(session
session_011c4YfanSNzNEVaHhDuSAfB,R+53),依 #13166 的执行者提出的开放问题裁定选项 A 而立。⛔ 不是新发现 —— 是 #13166 的剩余半边,现在有了自己的家。为什么单独立卡(裁定 A 的理由)
#13166 的派发令自相矛盾,而执行者正确地报告了它而不是自行消解:
packages/spec/src/**(以免触发条款②);FILTER_LOGIC_CASES只住在那里。执行者遵守了硬边界、一个字节都没碰
packages/spec,并把矛盾交上来。⭐ 处置正确。⇒ 裁定 A(执行者的推荐,本席采纳并加固):
packages/spec契约编辑塞进一张因为"只是实现一条既有裁决"而被定为pm:queue的卡。那正是边界被划出来要避免的条款②档位问题⭐ 本席补一条执行者没说、但更强的理由
入册才是让修复变永久的那一半。 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.ts的FILTER_LOGIC_CASES。scripts/check-driver-conformance.mjs的 DEBT 账本粒度是 per (driver × case-set),没有「三十六行里挂一行」的拼法。⇒ 入册形制必须服从这个粒度,⛔ 不得为本卡发明一个新的挂法。② 刷新那个已陈旧的格子
packages/spec/src/data/filter-logic-conformance.ts的表格行(本席在origin/main上实证,约:179):该格现在两处都过时:
$notContains列写 "no — DIVERGENT, frozen ([裁决] driver-memory / driver-mongodb 投入冻结 —— 维护者 2026-08-05 口径(跨单锚点) #5499)" ⇒ (a) 冻结已于 2026-08-11 解除;(b) 分歧已由 PR fix(driver-memory): a no-value row satisfies$nin/$notContainsin the reference matcher (#13166) #13356 修好;$nin列写 "MATCH on a null value, no on a missing key" ⇒ 同样已修(missing key 现在也 MATCH)。:172写着 "Taken on60f0dd8" ⇒ 它是一份带日期的历史度量,不是现在时主张。⇒ 它是陈旧,不是在撒谎 —— 但 ⛔ 不该久留,因为下一个读它的人不会去查那个 sha。⛔ 刷新时必须保留"带日期"的形制 —— 换上新 sha 与新读数,⛔ 不得把它改写成无日期的现在时断言。那会把一个诚实的历史读数变成一个会再次悄悄过期的主张。
packages/spec/src/**⇒ PATH 限触发 ⇒needs:contract-review,PR 停 draft 走合同复审链,tierclaude-fable-5。⛔ 三条禁令
$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/$notContainsin the reference matcher (#13166) #13356 也守住了($exists在两个 pin 文件里仍是被钉住的分歧)。$not的语义在 driver-sql 与 driver-memory / formula 之间分叉:NULL 行的去留相反,$not: {}一个是 TRUE 一个是 FALSE #5146 时 SQL 家族对齐过去的参照物;PR fix(driver-memory): a no-value row satisfies$nin/$notContainsin the reference matcher (#13166) #13356 已实测围栏 1 没有触发(未碰任何 SQL 文件,driver-sql 与 formula 全绿,因为它们本来就答的 include 方向,是 driver-memory 向它们靠拢)。⇒ 若入册时发现要动 SQL,停手回报。check:driver-conformance并引用其自身判词。执行者主动披露(⛔ 不是本席发现的):
$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
$nin/$notContainsin the reference matcher (#13166) #13356 落地("Part of",非关闭关键字):179的格位,留给这一半)· [finding] the #5499 investment freeze was LIFTED on 2026-08-11 (both drivers) — the tree still asserts it as live, and in several places that assertion is the stated reason a divergence stays open #13277 / PR docs(spec,analytics): the #5499 freeze prose reads LIFTED (2026-08-11) at the surviving product-source sites #13321(freeze-tense sweep,有意留下having-filter.ts:41)$not的语义在 driver-sql 与 driver-memory / formula 之间分叉:NULL 行的去留相反,$not: {}一个是 TRUE 一个是 FALSE #5146 → 非否定路径上的$ne/$nin/$notContains:driver-sql 排除 NULL 行,driver-memory / formula 返回它们(#5146 只裁定了$not) #5298 option A → driver-memory 与 formula 对「字段没有值」给出三处不同答案:$notContains(null 值)、$exists(键在值为 null)、$nin(缺键) #5299(被计价后撤回)—— 方向已裁,本卡只是实现它的棘轮$exists,⛔ 邻格)· [finding] driver-memory's matcher answers a NULL comparand inconsistently across the two readings of "no value" —$in:[null]/$nin:[null]disagree while$null/$ne:nullagree #13357 · driver-memory's reference matcher answers{$eq: null}with NO MATCH on a MISSING key — it is the one surface of five that does not read$eq: nullas the null predicate (#5332) #13494(同族语义,⛔ 不得折叠)· fix(drivers,analytics,formula): $ne / $nin / $notContains 在 $not 之外也 NULL-safe (#5298) #5962Generated by Claude Code