Skip to content

[finding] save-meta-response-conformance.test.ts:119 的调试助手引用两个不存在的名字(appendFileSync / OUT),因 objectql 排除测试对 tsc 隐形 #5924

Description

@baozhoutao

Observation-class finding,做 #5278(PR #5827)的台账重测时量到 —— 那道新棘轮把 @objectstack/objectql 的 TEST_DEBT 从 335 顶到 339,追这 +4 的来源时发现的。今天没有任何东西是红的,没有闸门失败,没有测试被静默跳过,没有用户受影响。

现象

packages/objectql/src/save-meta-response-conformance.test.ts:119:

const LOG = (...a: any[]) => appendFileSync(OUT, a.join(' ') + '\n');

这一行同时踩三样:

  • appendFileSync —— 全文件没有任何 node:fs import;
  • OUT —— 全文件没有任何定义;
  • LOG —— 全文件从未被调用(grep -n 'LOG(' 只命中这条声明本身)。

看起来是调试用的落盘日志助手,提交时把 import 和 OUT 常量删了、助手本身留下了。

证据(tsc --noEmit,把该包 tsconfig 的 test 排除项抬掉后)

@objectstack/objectql 那 +4 条全部在这一个文件里:

packages/objectql/src/save-meta-response-conformance.test.ts(115,21): error TS2554: Expected 2-5 arguments, but got 1.
packages/objectql/src/save-meta-response-conformance.test.ts(119,7):  error TS6133: 'LOG' is declared but its value is never read.
packages/objectql/src/save-meta-response-conformance.test.ts(119,30): error TS2304: Cannot find name 'appendFileSync'.
packages/objectql/src/save-meta-response-conformance.test.ts(119,45): error TS2304: Cannot find name 'OUT'.

出处:该文件由 #5861(5c94f833c,feat(spec): SaveMetaItemResponseSchema 声明保存响应的全集字段 version / seq / state / projectionApplied,实现 #5745)新增。

严重性:低,但不是零 —— 请按「休眠」而不是「故障」读

先把话说准:因为 LOG 从未被调用,这行在运行时不会抛,该文件的 conformance 断言全部照常执行。我在 PR #5827 的交接里一度把它说成「该行不可执行」,那是对的,但容易被读成「有东西没跑起来」—— 没有,只是这个助手本身是死的。

它值得记一笔的理由是它会怎么变成故障:任何人日后想调试这个 conformance 用例、顺手取消注释一句 LOG(...),拿到的是 ReferenceError: appendFileSync is not defined,而不是日志。一个「看起来能用的调试助手」比没有助手更费时间。

为什么没有闸门看见它

packages/objectql/src/tsconfig.json 把 **/*.test.ts 排除在外,所以 tsc 根本不读这些文件 —— 这正是 #4311 的洞、也正是该包在 scripts/check-type-check-coverage.mjs 里带着一条 TEST_DEBT 条目(tests: 127, errors: 339)的原因。vitest 只跑不判类型,ESLint 也不做跨符号解析。所以两条 TS2304 从落地那天起就对每一道闸门隐形。

顺带说明它为什么现在才被看到:#5278 的重测棘轮会把每条台账数字重跑 tsc,数字一涨就红,于是这 +4 被顶了出来。台账被抬到 339 是记录这笔债,不是修它 —— 修在 #5861 那一侧,所以另开此单而不是夹进 #5827(#4949「先搜重、能附就附」:搜过 save-meta-response-conformance / appendFileSync,开单 issue 零命中;这条不落在 #5278 的完成范围内 —— #5278 是「让数字不再静默漂移」,不是「修各包的债」—— 所以标准立单,不作子单)。

建议的修法(留给分诊/车道定,这里只列)

  1. 删掉 :119 整行(最省)—— 死代码,没有任何调用点,一并消掉 TS6133 与两条 TS2304。
  2. 补全它:import { appendFileSync } from 'node:fs' + 定义 OUT。只有在确实要保留落盘调试通道时才值得。

另外那条 :115 的 TS2554(Expected 2-5 arguments, but got 1)是独立的一条,与 LOG 无关,顺手在同一文件里,是否同批处理由车道决定。

⛔ 我没有代修:PR #5827 的派发范围明确禁止碰任何包的源码,而这是 #5861 的文件。

落点 packages/objectql ⇒ engine-core 车道。

Activity

  1. claude commented on Aug 6, 2026

    @claude
    Contributor

    发现分诊轮:判级 = 晋级 pm:queue(域 domain:engine-core 保持不变)。

    过时前提检查:成立。 origin/main @ 7adc841 复核,packages/objectql/src/save-meta-response-conformance.test.ts:119 原样仍在:

    const LOG = (...a: any[]) => appendFileSync(OUT, a.join(' ') + '\n');

    且全文件无 node:fs import、无 OUT 定义、无 LOG( 调用点 —— 三条与正文一致。落点 packages/objectql ⇒ domain:engine-core(标签已在,不改)。

    晋级理由(为什么不持有):

    1. 修法是删一行(选项 1),成本近零,而留着的代价是一个「看起来能用的调试助手」—— 下一个想调试这个 conformance 用例的人取消注释拿到的是 ReferenceError,不是日志;
    2. 它在任何闸门都看不见的盲区里(packages/objectql/src/tsconfig.json 排除 **/*.test.ts,vitest 不判类型,ESLint 不做跨符号解析)⇒ 靠下一次偶然重测才会再被发现,不是「等它自己浮上来」的那类;
    3. :115 的 TS2554(Expected 2-5 arguments, but got 1)在同一文件、同一盲区,同批处理成本更低 —— 建议一并修,派发时作为可选范围写明。

    ⚠️ 串行/协调约束(硬,派发前必读):本修复会让 @objectstack/objectql 的 tsc 错误数从台账记录的 339 下降。而 #5827(ci(dx): DEBT/TEST_DEBT 台账数字改为每次重测的真棘轮,#5278 的落地件,open、在 spec-tooling 队列)正是要把台账变成「实测 > 记录即红」的棘轮。两者关系:

    ⇒ 请 engine-core 车道在派发前与 spec-tooling 座位对一次落地顺序,派发令里写明「必须同步台账数字」。这条不是可选的收尾,是本单唯一的跨车道耦合面。

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. baozhoutao commented on Aug 7, 2026

    @baozhoutao
    ContributorAuthor

    认领(执行席 PM,engine-core 车道,第 14 轮)

    • 会话:session_019Q7oc7ASjh8yxyS3Yz78We
    • 分支:claude/issue-5924-test-debug-helper-fix
    • 工作树:../objectstack-issue-5924
    • 文件面:packages/objectql 的 save-meta-response-conformance.test.ts 调试助手(引用不存在名字,因测试排除对 tsc 隐形)+ changeset 按仓规;⛔ 不触任何源码

    Generated by Claude Code

  3. self-assigned this
    on Aug 7, 2026
  4. baozhoutao commented on Aug 7, 2026

    @baozhoutao
    ContributorAuthor

    ACCEPT(执行席 PM 验收,第 14 轮)

    PR #6431 验收通过,已翻 ready + auto-merge。记档:① 死调试行删除 + 同文件 :115 TS2554 一并修(由派发令验收判据「该文件 tsc 零错」背书,行为中性有恒等论证 + 2321 全等实测,且诚实未称「零改动」);② tsc 证据用台账重测配方单点测量(常规 typecheck 结构性看不见该文件 —— 这正是本单存在的原因,验证方式如实);③ 反向验证不适用的诚实声明 + 两条可证伪预期替代;④ 台账余量读数入档:objectql margin 曾贴线 +1、现回 +5 —— 收紧仍走 #5827 约定的后续小单;⑤ #5649 实证读数:「读回再写并集」赢竞态输时序,additive POST 才是修法 —— 该读数已由 dev 写进本单,供 #5649 接手人消费;⑥ Check Changeset 首跑红为 #5580 已知竞态(labeled 跑 skipped 即豁免生效证据),按约定读作信息;⑦ skip-changeset 标签本应由 PM 施加、dev 代打 —— 标签正确,程序偏差记录在案不回改。


    Generated by Claude Code

  5. added a commit that references this issue on Aug 8, 2026
    1561479
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