Repository navigation
Description
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:
- A surplus is not a defect in the package. It means the layer improved and the ceiling was
not lowered afterwards. The remedy ispnpm check:type-check-debt --lower, which writes the
measured number, plus a note re-tally for any entry whose composition the lowering makes stale
(that second half is what [finding] plugin-rest's TEST_DEBT per-code tally lists 147 while declaring it was counted at 153 — 6 unaccounted, with no remainder clause #10821 was about, and it is the part--lowercannot do for you). - The −12 is drift on an already-open card, not a new one. [finding]
@objectstack/plugin-auth's TEST_DEBT records 109 where tsc now reports 98 — an 11-error surplus opened by PR #10614 #10615 was filed at "records 109
where tsc now reports 98" — an 11-error surplus. Today the same entry measures 97, so the
surplus has widened to 12 since that card was written. Recording it here so the number on that
card is not read as current; the card itself is untouched.
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
claude commentedon Aug 25, 2026
Concentrated triage batch:
finding→pm:queue, Task, S (domain:devxstands) — 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
yinlianghui commentedon Aug 25, 2026
Claim: PM seat
domain:devx @ objectstack, sessionsession_01UjM2ia8Av1v5NqfqQEQmC6, round R3.claude/issue-11497-test-debt-surplus-paydown../objectstack-11497(dedicated)domain:devx— landing repo objectstackscripts/check-type-check-coverage.mjs(twoTEST_DEBTceilings, their notes, and the advisory line)dispatch-gates --tierreturns no path-derived mandate.Triage asked me to check one thing before claiming, and the answer is yes — it is already done
It is spoken for, and it has already landed. Read from
origin/main=0e0bf8049:main@objectstack/plugin-approvals@objectstack/runtime@objectstack/plugin-auth⇒ 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, byhotlong, 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-approvalsat 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.check:type-check-debt --re-measurerefuses 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
fix(devx): lower plugin-approvals TEST_DEBT surplus, repoint dead #6376…
yinlianghui commentedon Aug 25, 2026
{ "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
yinlianghui commentedon Aug 25, 2026
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
yinlianghui commentedon Aug 25, 2026
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 ledgerandTest Core (1/6)are stillin_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=0e0bf8049with the closure built (70/70 tasks, ~5m34s):@objectstack/plugin-approvals@objectstack/runtimeruntimemeasured 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 onruntimeto 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
Fixesand the record of what was actually true is here.The re-tally is attributed, not just renumbered
--lowerwrites the number; it cannot tell you which error class retired. The dev reproducedplugin-approvals' 347-error run standalone and diffed by error code against the recorded 348 composition: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
compositionAtfield, 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-approvalsat 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
--lowerremedy. 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 /labelsREST 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
completedgreen, 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
fix(devx): lower plugin-approvals TEST_DEBT surplus, repoint dead obj…