Skip to content

[finding][devx] check:type-check-debt 的 ledger 余量会让新写的 pin 变哑:mongodb 曾有 33 条余量吞掉一次真实回退,另有 5 条目前带 4–19 余量 #6376

Description

@os-zhuang

#6212 批 C(PR #6356)实施期间实测发现,记录备查。观察类,不挂 pm:queue,请分诊轮定级。

现象

scripts/check-type-check-coverage.mjsDEBT / TEST_DEBT 是只减不增的棘轮,但记录值低于实测值时它不报错,只打一条 ℹ 提示:

ℹ @objectstack/rest: TEST_DEBT records 163, tsc now reports 144 (-19) -- the entry can be lowered. Not an error: an improvement must not have to pay a bookkeeping toll to land.

这条设计本身是对的(改进不该为记账付过路费)。但那段差额是实打实的许可额度:在被抹平之前,任何新增的、数量不超过余量的错误都不会让门禁变红。

为什么单独记一笔:它能让一条新写的 pin 完全失效

不是理论推演,是 PR #6356 实测撞上的:

也就是说:ledger 的余量不只是"记账不准",它会让这个包唯一能钉住该签名的门禁变成哑的。PR #6356 因此在同 PR 内把该条目降到实测的 10,降完之后同一反转实测报 records 10 … now reports 12 (+2),门禁才真的红。

当前还带余量的条目(在 d8e8d9cbc 实测)

条目 ledger 实测 余量
@objectstack/service-storage(DEBT) 52 42 -10
@objectstack/objectql(TEST_DEBT) 355 350 -5
@objectstack/runtime(TEST_DEBT) 227 223 -4
@objectstack/rest(TEST_DEBT) 163 144 -19
@objectstack/mcp(TEST_DEBT) 63 53 -10

driver-mongodb 已由 PR #6356 抹平,不在表内。数字会随 main 漂,以 re-measure 为准。)

其中 objectql / runtime / rest 三个包同样排除测试层,和 mongodb 是同一形态 —— 它们的测试层同样只由这条 ledger 看着。

不是缺陷,别当缺陷派

今天没有人踩:门禁在"高于记录值"时照常变红,余量只是削弱灵敏度而非关闭它,而且 ℹ 提示每次 re-measure 都会打出来、不会静默。所以这是被削弱的检查,不是活体缺陷,判级请按观察类走。

如果要做

几个方向,各有取舍,未预断:

  1. 逐条抹平(PR refactor(drivers)!: memory / mongodb 的 aggregate / distinct 收进 DriverQuery (#6212 批 C) #6356 对 mongodb 做的那样)—— 最直接,但每条都要重写 note 的组成描述,且 objectql / rest 这类活跃包很容易在评审期间再次漂移([finding] DEBT ledger counts in check-type-check-coverage.mjs drift silently — @objectstack/metadata-protocol records 28, actually reports 63 #5278 记过这个 race,option D 输了五次)。
  2. 给"余量超过阈值"加一条会红的判据 —— 比如余量超过记录值的某个比例、或某个绝对值就失败,逼作者当场抹平。风险是把 [finding] DEBT ledger counts in check-type-check-coverage.mjs drift silently — @objectstack/metadata-protocol records 28, actually reports 63 #5278 明确不想要的"记账过路费"又加回来。
  3. 只对排除测试层的包收紧 —— 那些包的 ledger 是唯一的看门人,余量的代价最高;不排除测试层的包有 pnpm typecheck 兜底,余量无害。这一条的信噪比看起来最好,但需要先确认 TESTS_COVERED 那批的实际分布。

会话:session_01WyvqvKMG6asi9aXjKE6xtx#6212 批 C 实施期间发现,未认领)

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions