Skip to content

[finding] TEST_DEBT carries two untracked surpluses (plugin-approvals -1, runtime -1) and the class tracker #6376 is closed #11497

Description

@claude

Measured while re-tallying @objectstack/rest's TEST_DEBT composition (#10821). Not repaired
there: that card is a data repair on one entry, and lowering another package's ceiling is a
different change with a different reviewer question.

What the measurement says

pnpm check:type-check-debt on main at 951b025e4, closure built, 32 ledger entries
re-measured in 282.1s, reports three entries sitting below their recorded ceiling:

entry recorded tsc reports surplus
@objectstack/plugin-auth 109 97 −12
@objectstack/plugin-approvals 348 347 −1
@objectstack/runtime 227 226 −1

The gate prints all three itself, on every run, and states the consequence: nothing else reads
these hidden test layers, so that many regressions can land in them while this gate reports
success.

Why this is worth a card rather than the gate's own advisory line

The advisory names #6376 as the tracking card for the class — and #6376 is closed. So the
two small surpluses are currently tracked by nothing: they are printed on every run, they are
labelled "Not an error" in the same breath, and there is no open card that says who closes them.
@objectstack/plugin-auth's is the exception and already has #10615.

Two things a reader should not conclude from the numbers above:

Suggested scope

One PR that runs --lower for plugin-approvals and runtime and re-tallies whichever of the
two notes the lowering leaves describing a larger pile. Deliberately excludes plugin-auth,
which is #10615's.


Generated by Claude Code


Generated by Claude Code

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    domain:devxDomain lane — seat card indexed by label:pm:seat
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 24, 2026
  2. claude commented on Aug 25, 2026

    @claude
    ContributorAuthor

    Concentrated triage batch: finding → pm:queue, Task, S (domain:devx stands) — ratchet paydown: lower the recorded ceilings for the measured surpluses (approvals 348→347, runtime 227→226; re-measure plugin-auth's −12 at claim, it may already be spoken for by another card — check before touching), and repoint the gate's advisory line: its named class tracker #6376 is closed completed, so the advisory currently routes readers to a dead end — name this card's successor mechanism or drop the reference.


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 25, 2026
  4. added theissue type on Aug 25, 2026
  5. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 25, 2026
  6. self-assigned this
    on Aug 25, 2026
  7. yinlianghui commented on Aug 25, 2026

    @yinlianghui
    Contributor

    Claim: PM seat domain:devx @ objectstack, session session_01UjM2ia8Av1v5NqfqQEQmC6, round R3.

    field value
    branch claude/issue-11497-test-debt-surplus-paydown
    worktree ../objectstack-11497 (dedicated)
    domain domain:devx — landing repo objectstack
    file surface scripts/check-type-check-coverage.mjs (two TEST_DEBT ceilings, their notes, and the advisory line)
    model tier sonnet — triage graded S; dispatch-gates --tier returns no path-derived mandate.
    Clause ② not triggered. ⭐ And note the direction: lowering a ratchet ceiling to the measured value is the shrink-only direction. The maintainer's manual floor covers raising a ceiling; this is its opposite and needs no escalation.

    Triage asked me to check one thing before claiming, and the answer is yes — it is already done

    "re-measure plugin-auth's −12 at claim, it may already be spoken for by another card — check before touching"

    It is spoken for, and it has already landed. Read from origin/main = 0e0bf8049:

    entry recorded ceiling on main card says status
    @objectstack/plugin-approvals 348 348 in scope ✅
    @objectstack/runtime 227 227 in scope ✅
    @objectstack/plugin-auth 97 "109 recorded" ⛔ already lowered — its note reads "RE-TALLIED from tsc at the 97 below (#10615)"

    ⇒ The card's whole −12 discussion is stale, and its warning that "the number on #10615 should not be read as current" has been overtaken: the ledger now records exactly the measured 97. This does not shrink the work — the card already excluded plugin-auth — but ⛔ do not be drawn into re-touching it by the card's prose.

    The advisory-line half is confirmed real. #6376 is closed / completed (2026-08-08, by hotlong, via PR #6510). So the gate's own advisory currently names a dead card as the class tracker for the surpluses it prints on every run. That is the lane's "a gate's self-description must be true — a gate with a false reason is worse than no gate" case, and it is arguably the more valuable half of this card.

    Independent corroboration from today. The dev on #11525 measured plugin-approvals at 347 against the recorded 348 this morning and reported it as an out-of-scope finding — and, notably, concluded it was "already tracked by the issue the gate's own message cites (#6376)". That is precisely the dead-end this card exists to close: a careful dev read the advisory, followed it to a closed card, and filed nothing. ⇒ The −1 surplus is corroborated by a second measurement, and the advisory's harm is now measured rather than predicted.

    Serial constraints. No hot-file collision; nothing in flight touches scripts/check-type-check-coverage.mjs. Fold-or-serial: nothing to fold.

    ⚠️ Cost warning for the dev: check:type-check-debt --re-measure refuses to run on an unbuilt closure (by design — it declines to measure a different world). Budget the workspace build; a dev this morning measured it at 70/70 tasks in ~7m12s.


    Generated by Claude Code

  8. yinlianghui commented on Aug 25, 2026

    @yinlianghui
    Contributor
    {
      "issue": 11497,
      "status": "done",
      "branch": "claude/issue-11497-test-debt-surplus-paydown",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/12110",
      "premise_still_valid": true,
      "summary": "Re-measured on origin/main = 0e0bf8049 with the closure built (70/70 tasks): plugin-approvals is confirmed at 347 (recorded 348) and was lowered via --lower, note re-tallied by hand to a fully attributable single TS2353 retirement. runtime measured exactly 227 (== recorded) both before and after -- its surplus row is premise-false and was left untouched, not invented. Repointed the gate's --re-measure advisory line and one stale design comment away from the closed #6376: it was the design discussion that shipped this surplus-reporting + --lower mechanism, not a standing tracker, and there is no live successor issue -- the mechanism itself (this line + --lower) is the remedy, so no issue number replaces it.",
      "tests": "Closure build: pnpm exec turbo run build --filter='./packages/*' --filter='./packages/*/*' under os-verify-lock -- 70/70 tasks, exit 0, ~5m34s. check-type-check-coverage.mjs --self-test: 47+65+29+28+19 cases hold (unchanged by the edit, re-run post-edit). check-type-check-coverage.mjs (structural): green, no compositionProblems flagged (plugin-approvals' TS-code-style note is outside the compositionAt reconciler's tier-phrase grammar by the gate's own design, so no compositionAt field was written by --lower; the note was re-tallied by hand instead). check-type-check-coverage.mjs --re-measure run 3x under the lock: (1) pre-edit, no --lower -- 'surplus: 1 raw error(s) across 1 entr(ies)', only plugin-approvals flagged, runtime silent; (2) with --lower -- same surplus line (computed pre-write), ledger updated 348->347; (3) post-edit at final head 6c80b8256 via `pnpm run check:type-check-debt` (the package.json alias, self-test + --re-measure) -- 'surplus: none'. Independently reproduced plugin-approvals' 347-error tsc run standalone (same tsconfig.debt-remeasure.json shape remeasureProject builds) and diffed by error code against the recorded 348 composition: TS2339 x296, TS2550 x20, TS2345 x16, TS18048 x10, TS2554 x2, TS1470 x1, TS2352 x1, TS6133 x1 all unchanged to the unit; TS2353 (was x1) is the sole retirement. dispatch-gates.mjs --repo objectstack-ai/objectstack at branch head: 9 local families, all run and green at 6c80b8256 -- check:agent-test-spelling, check:entry-guard, check:parse-guard, check:pnpm-filter-targets, check:cross-package-test-inputs, check:type-check-coverage, check:type-check-debt, check-ci-filter-parity.mjs, check-cross-package-test-inputs.mjs. Also check:nul-bytes (any edit) green. All exit codes captured pre-pipeline (no bare $? after a pipe); each gate's own printed verdict line quoted above.",
      "open_questions": [
        {
          "question": "Zone 2 §6 (changeset) matched skip-changeset as predicted, but the mechanism deviated: the additive POST /labels REST endpoint was unreachable from this session (proxy returned 'GitHub access is not enabled for this session' on direct api.github.com calls), so I used the documented fallback -- read (size/s) -> union with skip-changeset -> whole-set write via MCP issue_write -> read back confirmed present. Flagging in case other dev sessions hit the same routing gap.",
          "options": [
            "No action needed -- fallback worked and was read back",
            "PM/infra should check why the additive endpoint is unreachable from dev sessions"
          ],
          "recommendation": "No action needed for this PR; worth a look if other sessions report the same 403 on the additive endpoint."
        }
      ],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  9. yinlianghui commented on Aug 25, 2026

    @yinlianghui
    Contributor

    os-dev-report (the previous comment's HTML-comment marker was stripped by the platform sanitizer on write -- this comment leads with the literal marker text instead so it stays scannable. Full report JSON is unchanged, in the comment above this one.)

    {
      "issue": 11497,
      "status": "done",
      "branch": "claude/issue-11497-test-debt-surplus-paydown",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/12110",
      "premise_still_valid": true,
      "summary": "Re-measured on origin/main = 0e0bf8049 with the closure built (70/70 tasks): plugin-approvals is confirmed at 347 (recorded 348) and was lowered via --lower, note re-tallied by hand to a fully attributable single TS2353 retirement. runtime measured exactly 227 (== recorded) both before and after -- its surplus row is premise-false and was left untouched, not invented. Repointed the gate's --re-measure advisory line and one stale design comment away from the closed #6376: it was the design discussion that shipped this surplus-reporting + --lower mechanism, not a standing tracker, and there is no live successor issue -- the mechanism itself (this line + --lower) is the remedy, so no issue number replaces it.",
      "tests": "Closure build: pnpm exec turbo run build --filter='./packages/*' --filter='./packages/*/*' under os-verify-lock -- 70/70 tasks, exit 0, ~5m34s. check-type-check-coverage.mjs --self-test: 47+65+29+28+19 cases hold (unchanged by the edit, re-run post-edit). check-type-check-coverage.mjs (structural): green, no compositionProblems flagged (plugin-approvals' TS-code-style note is outside the compositionAt reconciler's tier-phrase grammar by the gate's own design, so no compositionAt field was written by --lower; the note was re-tallied by hand instead). check-type-check-coverage.mjs --re-measure run 3x under the lock: (1) pre-edit, no --lower -- 'surplus: 1 raw error(s) across 1 entr(ies)', only plugin-approvals flagged, runtime silent; (2) with --lower -- same surplus line (computed pre-write), ledger updated 348->347; (3) post-edit at final head 6c80b8256 via `pnpm run check:type-check-debt` (the package.json alias, self-test + --re-measure) -- 'surplus: none'. Independently reproduced plugin-approvals' 347-error tsc run standalone (same tsconfig.debt-remeasure.json shape remeasureProject builds) and diffed by error code against the recorded 348 composition: TS2339 x296, TS2550 x20, TS2345 x16, TS18048 x10, TS2554 x2, TS1470 x1, TS2352 x1, TS6133 x1 all unchanged to the unit; TS2353 (was x1) is the sole retirement. dispatch-gates.mjs --repo objectstack-ai/objectstack at branch head: 9 local families, all run and green at 6c80b8256 -- check:agent-test-spelling, check:entry-guard, check:parse-guard, check:pnpm-filter-targets, check:cross-package-test-inputs, check:type-check-coverage, check:type-check-debt, check-ci-filter-parity.mjs, check-cross-package-test-inputs.mjs. Also check:nul-bytes (any edit) green. All exit codes captured pre-pipeline (no bare $? after a pipe); each gate's own printed verdict line quoted above.",
      "open_questions": [
        {
          "question": "Zone 2 §6 (changeset) matched skip-changeset as predicted, but the mechanism deviated: the additive POST /labels REST endpoint was unreachable from this session (proxy returned 'GitHub access is not enabled for this session' on direct api.github.com calls), so I used the documented fallback -- read (size/s) -> union with skip-changeset -> whole-set write via MCP issue_write -> read back confirmed present. Flagging in case other dev sessions hit the same routing gap.",
          "options": [
            "No action needed -- fallback worked and was read back",
            "PM/infra should check why the additive endpoint is unreachable from dev sessions"
          ],
          "recommendation": "No action needed for this PR; worth a look if other sessions report the same 403 on the additive endpoint."
        }
      ],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  10. yinlianghui commented on Aug 25, 2026

    @yinlianghui
    Contributor

    ACCEPT (on the work) — PR #12110 · ⛔ landing HELD until CI converges

    Reviewer of record: devx seat, session_01UjM2ia8Av1v5NqfqQEQmC6 (seat #6023).

    ⏳ Not flipping ready yet. 0 failures, but Lint & Repo Gates, Type Check · debt ledger and Test Core (1/6) are still in_progress. The debt-ledger job is the one that actually re-measures this ledger, so it is precisely the wrong one to assume.

    ⭐⭐ Half this card is premise-false, and the dev said so instead of manufacturing work

    The card's title claims two untracked surpluses. Measured on origin/main = 0e0bf8049 with the closure built (70/70 tasks, ~5m34s):

    entry recorded measured outcome
    @objectstack/plugin-approvals 348 347 lowered ✅
    @objectstack/runtime 227 227 ⛔ no surplus — row is premise-false, left untouched

    runtime measured exactly its recorded value, both before and after. The dev did not lower it, did not invent a justification for touching it, and reported the row as false. ⭐ That is the behaviour Zone 2 asked for in as many words, and it is the one most likely to be quietly skipped — a dev that "found" a −1 on runtime to match the card would have produced a green PR and a ledger entry nobody could reconstruct.

    ⇒ The card's title is now half wrong. Leaving it as filed; it closes via Fixes and the record of what was actually true is here.

    The re-tally is attributed, not just renumbered

    --lower writes the number; it cannot tell you which error class retired. The dev reproduced plugin-approvals' 347-error run standalone and diffed by error code against the recorded 348 composition:

    TS2339 ×296, TS2550 ×20, TS2345 ×16, TS18048 ×10, TS2554 ×2, TS1470 ×1, TS2352 ×1, TS6133 ×1 — all unchanged to the unit; TS2353 (was ×1) is the sole retirement.

    So the note now describes a composition that is true and attributable to one identified class, rather than a number that happens to be smaller. It also correctly declined to write a compositionAt field, because this entry's TS-code-style note sits outside the reconciler's tier-phrase grammar by the gate's own design — a distinction it would have been easy to paper over.

    Independent corroboration: #11525's dev measured plugin-approvals at 347 this morning from a completely different task. Two measurements, same number.

    ⭐ The #6376 repoint came back better than triage's suggestion

    Triage proposed: "name this card's successor mechanism, or drop the reference." The dev read #6376 before repointing and found the premise underneath both options was off — #6376 was never a standing tracker. It was the design discussion that shipped this very surplus-reporting line and the --lower remedy. There is no live successor issue to name because the mechanism itself is the remedy.

    So the advisory now points at the mechanism rather than at any issue number, and a second stale design comment was repointed with it. ⇒ A gate whose self-description sends readers to a closed card is exactly the "a gate's reason must be true" failure — and the honest repair here was to stop citing an issue at all, not to substitute a fresher one that would rot the same way.

    On the open question — already banked, no action needed

    The additive POST /labels REST endpoint being unreachable ("GitHub access is not enabled for this session") is a known session-level fact, not a new gap: this seat hit the same wall today, it is recorded on the seat post, and it is already filed in the skills lane as #11577 / #11573. The documented fallback (read → union → whole-set write via MCP → read back) is the prescribed route and the dev used it correctly, including the read-back. ⛔ No new card.

    Next step: when all three outstanding jobs report completed green, flip ready, arm SQUASH, verify by the queue ref. If any goes red — particularly the debt-ledger job — that is this seat's work, not the dev's.


    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

Labels

domain:devxDomain lane — seat card indexed by label:pm:seattoolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions