Skip to content

[finding] TEST_DEBT 的 tests 字段是闸门自己已经算出来的数字,却手写在台账里 —— 19 条中 12 条已漂(runtime 记 66,实测 101) #5826

Description

@baozhoutao

Observation-class finding,做 #5278(PR 见其中)时顺手量到。今天没有任何东西是红的,没有闸门失败,没有用户受影响。

背景

#5278scripts/check-type-check-coverage.mjs 的 DEBT / TEST_DEBT errors 数字装上了真棘轮:每次 --re-measure 重跑 tsc --noEmit,实测 > 记录即红。那一单的范围到此为止。

但 TEST_DEBT 条目有两个手写数字:

'@objectstack/runtime': { tests: 66, errors: 220, note: '…' },

errors 现在被重测了,tests 没有。而 tests(该包被 tsconfig 排除掉、因而对 tsc 隐形的测试文件数)恰恰是这个脚本每次运行都已经算出来的量 —— testCoverage() 返回的 pkg.testFiles,亚秒级、无需构建,evaluate() 里就在用它判 TESTS_COVERED。

实测(main @ 5ab08428,#5278 重测前)

台账 tests 闸门实算 testFiles
@objectstack/runtime 66 101
@objectstack/objectql 87 125
@objectstack/lint 39 61
@objectstack/rest 35 56
@objectstack/plugin-auth 26 34
@objectstack/plugin-approvals 13 19
@objectstack/formula 13 16
@objectstack/driver-mongodb 7 15
@objectstack/plugin-sharing 11 13
@objectstack/platform-objects 8 9
@objectstack/trigger-record-change 4 5
@objectstack/verify 2 4

19 条里 12 条已漂,方向全部向上,最大 66 → 101(+53%)。剩下 7 条精确。

#5278 的 PR 已把这 12 个数字更新到实测值,所以下表在该 PR 落地后是准的 —— 但机制没变,明天再加一个测试文件就又漂了。)

为什么它一直是绿的

#5278 的机制同源但更简单:evaluate() 从不比较 teststestFiles,只在 errors 上做非空/正数断言。tests 纯粹是给人读的描述性数字,没有任何一方核对它。

区别在于:errors 需要跑编译器才知道,所以「冻结 + 重测」是唯一选择;tests免费的 —— 闸门已经在算了,只是没拿它和台账对账。

为什么值得记一笔

台账文件自己的注释里已经写下过这个论点(#5286 毕业 packages/spec 时留的):

The number that used to sit here (272 files / 902 errors) was also stale by 23 files, which is the other argument for a measurement the gate derives.

也就是说「该导出的数字不要手写」这条结论仓库里已经得出过一次,只是没有推广到剩下 19 条。一个同时存在「手写副本」和「实时算法」的数字就是两个事实源,而这正是 #5278 那一类漂移的定义。

选项

  1. 删掉 tests 字段,改由闸门实时导出。摘要行和 note 里的「隐藏了多少文件」改读 pkg.testFiles。结构上不可能再漂,零新增成本(数字本来就在算),diff 覆盖 19 条条目。推荐方向。
  2. 保留字段,加一条对账:tests !== testFiles 时报错。会把「新增一个干净的测试文件」变成红 —— 对一个本该被鼓励的动作收记账费,和 [finding] DEBT ledger counts in check-type-check-coverage.mjs drift silently — @objectstack/metadata-protocol records 28, actually reports 63 #5278 裁决里「改善不得制造记账 churn」的原则相反。
  3. 保留字段,不一致时打 informational 行。不红,但一旦有人加测试文件就变成常驻噪音,而常驻噪音是闸门被忽略的起点。
  4. 只定期重量。就是 [finding] DEBT ledger counts in check-type-check-coverage.mjs drift silently — @objectstack/metadata-protocol records 28, actually reports 63 #5278 已经否决过的选项 2。

我倾向 1:这是唯一一个把漂移按构造消除而不是靠巡查的选项,而且它比现状的代码更少。

范围外未做:#5278 的派发令把文件面框在棘轮逻辑 + 台账数字更新,删字段是形状变更,留给分诊定。

Activity

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions