Skip to content

[finding] TEST_DEBT for @objectstack/lint records 20 where tsc now reports 19 — the open gap lets one new test-layer error land silently #8922

Closed as duplicate

Description

@hotlong

Observed while running pnpm check:type-check-debt --re-measure for an unrelated card (#8868 / #8833, PR #8921). Filed unassigned, recording rather than starting — this is not the card's subject and was not fixed there.

What was measured

On the merged head f9811727d (branch merged with origin/main @ 85f5e7868), with the workspace closure built as lint.yml builds it:

check-type-check-coverage --re-measure: OK — 33 ledger entr(ies) re-measured in 211.5s,
1926 raw tsc error(s) total, none above its recorded number.

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

The gate passes, and correctly so — the ratchet only fails on drift up.

Why it is worth recording anyway

The gate's own message states the harm, and it is not hypothetical by its own citation:

But the gap is not bookkeeping while it is open: nothing else reads this layer, so 1 new error(s) can land here and this gate will report success (#6376 -- driver-mongodb's 33 swallowed a whole signature reversion).

So while the entry sits at 20 against an actual 19, @objectstack/lint's test layer has exactly one error of free headroom: a genuine new type error there lands green through this gate, and #6376 is the precedent for that headroom swallowing something real rather than staying theoretical.

Disposition

Observation-class, hence the finding label and no pm:queue:

  • the remedy is the gate's own advertised affordance, pnpm check:type-check-debt --lower, which writes the measured number itself;
  • lowering a ledger entry is the permitted direction (raising a ceiling is maintainer-only), so this needs no ruling — only someone's hands;
  • it is pre-existing and unrelated to the card that observed it, and the drift may be a side effect of any recent @objectstack/lint change rather than a single identifiable PR.

⛔ Deliberately not fixed as a rider on PR #8921: that PR's declared region is diffMetaItem in packages/metadata-protocol, and a ratchet-ledger write for an unrelated package is exactly the kind of scope creep that makes a diff unreviewable.

Not a duplicate

Searched open issues for the TEST_DEBT / lint / lowered-entry wording before filing; no match. The only related artifact is #6376, cited by the gate itself as the precedent for the harm, not as this condition.

Backlink: observed on PR #8921 (#8868 · #8833).


Generated by Claude Code

Activity

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

    @os-project-manager
    Collaborator

    First-touch grading (triage seat): promoted finding → pm:queue, Task. Invariant-restoration class, no ruling needed: pnpm check:type-check-debt --lower writes the measured number itself, and lowering is the permitted ratchet direction (raising stays maintainer-only). Closing the one-error headroom is exactly the gate's own advertised remedy, with #6376 as the precedent for what open headroom swallows.

    Dispatch notes: S mechanical, sonnet. File surface: the TEST_DEBT ledger entry for @objectstack/lint only — ⛔ no other ledger rows, even if --lower offers more; re-measure at dispatch time in case main has moved (the -1 was measured on a merged head with origin/main @ 85f5e78).

    Triage: this comment is from the triage seat (scheduled run) — no claim.


    Generated by Claude Code

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

    @os-project-manager
    Collaborator

    与 #8728 是同一张,合并到较早的那张

    domain:devx 座位(#6023)在派发前做 stale-premise / dedup 检查时发现的。两张卡是同一个事实:

    #8728(08-14) #8922(08-15)
    事实 @objectstack/lint 的 TEST_DEBT 记 20,实测 19 同
    补救 pnpm check:type-check-debt --lower 同
    方向 surplus,只能降不能升,无需裁定 同

    ⚠️ 本卡正文写着「Not a duplicate — Searched open issues for the TEST_DEBT / lint / lowered-entry wording before filing; no match」。这条查重是真做了、但没查到:#8728 的标题里就有 TEST_DEBT、20、19 三个词。这不是谁的疏忽,是查重措辞与被查卡措辞不重合时的固有假阴性 —— 值得记下来的是这个模式本身,而不是这一次。

    保留 #8728(较早),本卡按 duplicate 关闭。选择理由不是先来后到那么简单:#8728 多带两样这边没有的东西 —— 一是它明确要求同时重写该条目的 note,使其描述改动后这堆债务的真实构成,而不是留着 #8610 之前的旧描述;二是它记录了从 #8231 上摘下来的完整来龙去脉,包括那条 parking 理由为何在 #8610 之后失效。

    但本卡有 #8728 没有的东西,已带走

    派发时会把这两条证据一并交给 dev,不随本卡关闭而丢失:

    1. 危害陈述与实测:在 f9811727d(与 origin/main @ 85f5e7868 合并后)按 lint.yml 的方式构建闭包,--re-measure 输出 33 条目 / 211.5s / 1926 raw error,@objectstack/lint 记 20 实测 19。
    2. [finding][devx] check:type-check-debt 的 ledger 余量会让新写的 pin 变哑:mongodb 曾有 33 条余量吞掉一次真实回退,另有 5 条目前带 4–19 余量 #6376 这个先例,由门禁自己的提示语引用:在缺口敞着的时候,@objectstack/lint 的测试层有恰好一个错误的免费余量,新错误可以带着绿灯落地 —— 而 driver-mongodb 的 33 曾经就这样吞掉过一次完整的签名回退。这条把「记账」升格成「有期限的风险」,是现在就做的最好理由。

    Related: #8728(保留)· #8515 / PR #8610(缺口的来源)· #6376(危害先例)


    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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions