Observation-class finding,做 #5278 (PR 见其中)时顺手量到。今天没有任何东西是红的 ,没有闸门失败,没有用户受影响。
背景
#5278 给 scripts/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() 从不比较 tests 和 testFiles,只在 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 那一类漂移的定义。
选项
删掉 tests 字段,改由闸门实时导出 。摘要行和 note 里的「隐藏了多少文件」改读 pkg.testFiles。结构上不可能再漂,零新增成本(数字本来就在算),diff 覆盖 19 条条目。推荐方向。
保留字段,加一条对账 :tests !== testFiles 时报错。会把「新增一个干净的测试文件」变成红 —— 对一个本该被鼓励的动作收记账费,和 [finding] DEBT ledger counts in check-type-check-coverage.mjs drift silently — @objectstack/metadata-protocol records 28, actually reports 63 #5278 裁决里「改善不得制造记账 churn」的原则相反。
保留字段,不一致时打 informational 行 。不红,但一旦有人加测试文件就变成常驻噪音,而常驻噪音是闸门被忽略的起点。
只定期重量 。就是 [finding] DEBT ledger counts in check-type-check-coverage.mjs drift silently — @objectstack/metadata-protocol records 28, actually reports 63 #5278 已经否决过的选项 2。
我倾向 1:这是唯一一个把漂移按构造消除 而不是靠巡查的选项,而且它比现状的代码更少。
范围外未做:#5278 的派发令把文件面框在棘轮逻辑 + 台账数字更新,删字段是形状变更,留给分诊定。
Observation-class finding,做 #5278(PR 见其中)时顺手量到。今天没有任何东西是红的,没有闸门失败,没有用户受影响。
背景
#5278 给
scripts/check-type-check-coverage.mjs的 DEBT / TEST_DEBTerrors数字装上了真棘轮:每次--re-measure重跑tsc --noEmit,实测 > 记录即红。那一单的范围到此为止。但 TEST_DEBT 条目有两个手写数字:
errors现在被重测了,tests没有。而tests(该包被 tsconfig 排除掉、因而对 tsc 隐形的测试文件数)恰恰是这个脚本每次运行都已经算出来的量 ——testCoverage()返回的pkg.testFiles,亚秒级、无需构建,evaluate()里就在用它判 TESTS_COVERED。实测(main @
5ab08428,#5278 重测前)teststestFiles@objectstack/runtime@objectstack/objectql@objectstack/lint@objectstack/rest@objectstack/plugin-auth@objectstack/plugin-approvals@objectstack/formula@objectstack/driver-mongodb@objectstack/plugin-sharing@objectstack/platform-objects@objectstack/trigger-record-change@objectstack/verify19 条里 12 条已漂,方向全部向上,最大 66 → 101(+53%)。剩下 7 条精确。
(#5278 的 PR 已把这 12 个数字更新到实测值,所以下表在该 PR 落地后是准的 —— 但机制没变,明天再加一个测试文件就又漂了。)
为什么它一直是绿的
和 #5278 的机制同源但更简单:
evaluate()从不比较tests和testFiles,只在errors上做非空/正数断言。tests纯粹是给人读的描述性数字,没有任何一方核对它。区别在于:
errors需要跑编译器才知道,所以「冻结 + 重测」是唯一选择;tests是免费的 —— 闸门已经在算了,只是没拿它和台账对账。为什么值得记一笔
台账文件自己的注释里已经写下过这个论点(#5286 毕业
packages/spec时留的):也就是说「该导出的数字不要手写」这条结论仓库里已经得出过一次,只是没有推广到剩下 19 条。一个同时存在「手写副本」和「实时算法」的数字就是两个事实源,而这正是 #5278 那一类漂移的定义。
选项
tests字段,改由闸门实时导出。摘要行和 note 里的「隐藏了多少文件」改读pkg.testFiles。结构上不可能再漂,零新增成本(数字本来就在算),diff 覆盖 19 条条目。推荐方向。tests !== testFiles时报错。会把「新增一个干净的测试文件」变成红 —— 对一个本该被鼓励的动作收记账费,和 [finding] DEBT ledger counts in check-type-check-coverage.mjs drift silently — @objectstack/metadata-protocol records 28, actually reports 63 #5278 裁决里「改善不得制造记账 churn」的原则相反。我倾向 1:这是唯一一个把漂移按构造消除而不是靠巡查的选项,而且它比现状的代码更少。
范围外未做:#5278 的派发令把文件面框在棘轮逻辑 + 台账数字更新,删字段是形状变更,留给分诊定。