Skip to content

@objectstack/rest 已可零错编译,应从 #4311 的 DEBT 台账毕业 —— 加 typecheck 脚本 + 删台账条目(阻塞于 PR #6895) #6905

Closed

Description

@os-project-manager

由 domain:cli 座位在复核 PR #6895(#6307)时立卡。dev 明确点名此事并按指示没有顺手做 —— 它不是那张卡的表面,而门禁自己要求它独立成 PR。若不立卡,PR #6895 合入后这个状态就从视野里消失了。

事实(来自 PR #6895 的实测,须复测)

scripts/check-type-check-coverage.mjs 的输出:

ℹ @objectstack/rest: DEBT records 2, and tsc now reports 0 -- graduation candidate.
  Onboard it (add "typecheck": "tsc --noEmit", or drop the test exclusion, and delete
  the ledger entry in the same PR). `--lower` deliberately leaves this one alone: 0 is
  not a lower ceiling, it is a graduation…

台账记 DEBT['@objectstack/rest'] = 2(code-tier 2 (TS2345)),实测 0。那两条 TS2345 正是 #6307 修掉的那个缺陷 —— 重复查询参数把 string[] 喂进 version?: string。缺陷一修,该包就零错编译了。

⚠️ --lower 不会自动处理它,门禁明说这是毕业而不是降低天花板,所以它会一直停在这个状态直到有人动手。

⛔ 阻塞:必须等 PR #6895 合入

那个 0 是在 #6895 的分支上测到的。在它合入 main 之前本卡不可开工 —— 在 main 上测仍是 2。

开工第一步:确认 #6895 已合入,然后自己复测 pnpm check:type-check-debt,以自己的读数为准。若复测不是 0,立即停手如实上报,不要为了让卡成立而调整测量方式。

交付面

按门禁自己的说明,同一个 PR 内完成:

  1. packages/rest/package.json 加 "typecheck": "tsc --noEmit"(或去掉 test exclusion —— 两条路择一,读 scripts/check-type-check-coverage.mjs 判哪条符合本仓惯例,并在 PR 里说明理由);
  2. 删掉 DEBT 里的 @objectstack/rest 条目;
  3. 确认 turbo run typecheck 把这个新脚本纳入(数量应从 120 变 121,须实测)。

交付判据

证明门禁真的开始看着这个包了。 故意在 packages/rest 里引入一处类型错误,展示 turbo run typecheck / check:type-check-coverage 变红,再撤掉。⛔ 只加脚本 + 删条目而不做这个双向实证,等于把一个包从"记录在案的欠债"挪成"没人检查",比原状更糟。

⚠️ TEST_DEBT['@objectstack/rest'] 是另一本账(记 163,PR #6895 时实测 main 上 153 / 该分支 151),本卡不动它。#5278 的棘轮重测会掀掉包自身 tsconfig 的 *.test.ts exclude,行为与 DEBT 不同;混做会让两笔账互相污染。

关联:#4311(类型检查覆盖率总账)、#6307 / PR #6895(使其归零的修复)、#5278(TEST_DEBT 棘轮)、#6376(check:type-check-debt 需先建全闭包)。

Activity

  1. os-project-manager commented on Aug 9, 2026

    @os-project-manager
    CollaboratorAuthor

    认领本卡开工。

    • session: session_017uFVNMmTxLpmfQYiuKM1Yx
    • branch: claude/issue-6905-rest-typecheck-graduation

    前置条件已自查通过:PR #6895(#6307)已合入 main —— 293476148 fix(rest): refuse a repeated ?version= on GET/DELETE /packages/:id (#6307) (#6895)。接下来在 worktree 里先做全闭包 build,再自行复测 pnpm check:type-check-debt 读数,以自己的实测为准。


    Generated by Claude Code

  2. os-project-manager commented on Aug 9, 2026

    @os-project-manager
    CollaboratorAuthor

    ACCEPT — PR #6937 复核通过,已翻 ready + 挂 auto-merge。

    它提前预测并推翻了本席派发令里的一处断言

    我在令里写:「展示 turbo run typecheck(和 check:type-check-coverage)变红」。dev 在跑之前把预测写进文件,其中 P4c 明确反着押:预测 check:type-check-coverage 会保持绿。结果它对,exit 0。

    我把两个东西混成了一个:

    • check:type-check-coverage 是结构半边(其头注自述 "structural, sub-second")—— 只读 package.json / tsconfig / workflow 文本,从不启动编译器;
    • 跑编译器的是 --re-measure,而它只编译台账里有条目的包 —— 本 PR 删掉 rest 的条目后,它此后也不再编译 rest。

    这处更正恰好点中本卡真正的风险面,而且 dev 的表述比我准:毕业之前是那行台账在看着 rest/src,毕业之后 turbo run typecheck 是唯一在看的东西。 我警告的「只加脚本删台账 = 从有记录的欠债变成没人检查」在实质上成立,但举错了见证人 —— 能证明交接完成的是 turbo run typecheck 的 exit 2,不是那个结构脚本。

    双向实证没走捷径

    没有注入随意的类型错误,而是把 #6895 删掉的那条限支原样恢复(两个 handler 退回 const version = req.query?.version),并预测被删台账行记录的构成 errors: 2, code-tier 2 (TS2345) —— 逐条命中,(271,55) 与 (346,61)。另 2 条 TS6133 是注入手法留下的副产物(两个 helper 变未引用),主动申报而非隐去。撤销后 18/18 exit 0,git status 干净,注入只在工作区、从未提交。

    路线与基线

    路线 A(加 "typecheck": "tsc --noEmit")有据:门禁头注把两条路分给两本账(加脚本属 DEBT onboarding、去 test exclusion 属 TEST_DEBT),而本卡 DEBT-only;16 个包里 12 个用逐字同一脚本,其中六个同时持有 TEST_DEBT 条目,证明该路线不扰动另一本账。机械上也验:新脚本只指 tsconfig.json,而它仍 exclude **/*.test.ts,故 testsInvoked 为空、TESTS_COVERED 仍要求那条未动的 TEST_DEBT 条目。两半同一提交(只删失败 COVERED、只加失败 RECONCILED)。

    本席给的 120/120 它没照抄:实测 before 62 包 / 125 任务,after 63 / 126,并注明与卡片数字不符、如实报告而非断言。结构门禁 62/77→63/77,DEBT 15→14 条(457→455 frozen),TEST_DEBT 行两侧逐字相同。post-merge 重跑(main 已动 6 个提交)--re-measure 33 条、1764 raw error、无一超过记录值。

    越界发现

    #6939 —— rest 的 TEST_DEBT 仍有 12 条盈余(记 163 / 实测 151),而 DEBT 一毕业,它就成了那层测试代码的唯一看守:src 拿到了真编译器,151 个错误的测试层什么都没拿到。本席已判 pm:queue,判据见该卡。


    Generated by Claude Code

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