Skip to content

[Decision] The ruled aggregate × field-type table cannot be executed in full: its string rows contradict #15768's typing and its boolean rows contradict ruling #11152 — enforce, amend, or leave partly decorative? #16785

Description

@os-trump

Filed by the domain:services PM seat out of PR #16778 (card #16737). ⛔ The seat took the only option inside its own authority and is sending the rest up rather than deciding it.

What happened

isAggregateCompatibleWithFieldType (the aggregate × field-type compatibility table, #16353, decision batch #59) landed as 6ba0db4e0 / PR #16684. Measured on origin/main: 31 occurrences inside packages/spec, 0 consumers outside it (negative control 0). It was a ruled contract that nothing executed.

PR #16778 is its first consumer — and executing it revealed that the table cannot be executed in full:

rows what enforcing them would do the counter-authority
stringmin/max over text / select / lookup / autonumber refuses them #15768 types those 'string' and pins them — 15 cases measured red
boolean refuses them maintainer ruling #11152: booleans aggregate as numbers on every backend
temporal refuses them none — SQLite is silently wrong, Postgres refuses outright (SQLSTATE 42883, measured on a real PG 16.13), no shipped dataset pairs them

⇒ PR #16778 executes only the temporal rows and leaves the other two unenforced. That is the PM's ruling (option A on the dev's fork) and it was taken because B and C are both outside the PM's authority, not because it is obviously right:

  • B (enforce the whole table now) would retire two landed maintainer rulings as a side effect of a bug fix.
  • C (amend the spec table) would edit a contract the director ruled six days ago.

⚠️The collision is upstream and already known. The spec module's own header records the string and boolean rows as OVERRIDES of existing opinions rather than agreement, and refers the boolean one back to the maintainer as its own decision. This card is not reporting a discovery; it is asking for the decision that header defers.

The question

What is the end state for the string and boolean rows?

  • A — leave them unenforced. The table stays partly decorative: a declared compatibility contract that the compiler applies to one class and ignores for two. Cost: ⚠️ the repo's own recurring defect shape — a declared rule nothing enforces — now written into a contract that was ruled specifically to be authoritative. Zero work.
  • B — enforce the whole table, and retire what collides. #15768's string typing and ruling #11152's boolean answers get rewritten, their pins with them. Cost: two landed rulings reversed; 15 measured pins go red and must be re-authored; breaking for anyone aggregating those.
  • C — amend the table so the string and boolean rows accept what the platform already answers. Only the temporal refusal remains. Cost: the ruled contract changes shape weeks after it was ruled; but it becomes a table that is true of the platform.
  • ① 项目长远合理性(权重 ≥50%) —— 三选一里,A 是唯一让「已声明的规则」与「实际执行的规则」长期分叉的,而这正是本仓反复付学费的形状(声明面 ≠ 执行面)。B 与 C 都收敛,方向相反:B 让平台迁就表,C 让表迁就平台。⇒ ①反对 A;在 B/C 之间不表态,因为哪个是「对的语义」取决于 min('text') 到底该不该有意义 —— 那是产品判断。
  • ② 实际业务拉动 —— ⚠️ 温度类已经被本轮的 PR 关掉了,即卡面那个具名危害(一个看起来合理的错数字)已经消除。string/boolean 两组没有具名的实测危害:没有人报过 min over text 出错,#11152 反而说布尔按数字聚合是有意为之。⇒ ②的拉动很弱,这支持「不急」,但不支持「永远不定」。
  • ③ 防 AI 犯错 —— ⭐ 这一棱最有分量。今天一个 AI(或人)读 isAggregateCompatibleWithFieldType,会合理地相信它描述了平台的受理集 —— 而它只对三分之一为真。⚠️ 一个部分为真的契约比没有契约更危险,因为它看起来可以被信赖。B 和 C 都让它重新变成整体为真;A 则要求每个读者都记得「这张表只有温度行是活的」。⇒ ③明确反对 A,除非 A 附带把这个局限写进表自身
  • ④ 创业阶段不扩散 —— A 零成本;C 只改声明、不改行为;B 最贵(退两条裁决 + 重写 15 个 pin + 破坏性变更)。⇒ ④ 排序 A > C > B。

推荐:C,或「A + 把局限写进表自身」。 理由:② 说没有拉动去做 B 那么贵的事;③ 说不能让表继续假装整体为真。C 用最小成本让表恢复诚实;若你认为 min('text') 应当被拒(即平台今天是错的),那才轮到 B。⛔ 本席不裁:B 与 C 都动已裁的东西。

置信缺口: ⛔ 未测 string/boolean 聚合在真实应用里的使用面(有多少已发货的 dataset 真的 min 一个 text 列);那个数会改变 B 的代价,但不改变 ③ 的结论。

维护者速读

半年前定过一张表:「哪种聚合能用在哪种字段上」。这张表一直没有任何地方在用它 —— 直到今天第一次接上。接上才发现:这张表只有三分之一能执行

⇒ 现在这张表看起来是权威的,实际只有三分之一为真 —— 而一个部分为真的规则比没有规则更容易骗到人(包括 AI)。

你要做的:回 A / B / C。 A = 就这样(但建议至少把「只有时间行是活的」写进表里)· B = 整表执行,退掉那两条旧裁决 · C = 改表,让它只拒时间类(席位推荐)。

Refs

#16353 / PR #16684(表的来源,批次 #59#16737 / PR #16778(第一个消费者,执行温度类)· #15768(string 定型 + 15 个 pin)· #11152(布尔按数字聚合的裁决)· #16099(整表执行的那张卡,本轮刚由本席解除陈旧阻塞转 pm:queue)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions