Skip to content

fix(tooling): re-tally @objectstack/plugin-auth's TEST_DEBT from tsc - #11583

Merged
os-steve merged 1 commit into
mainfrom
claude/issue-10615-plugin-auth-test-debt-retally
Aug 24, 2026
Merged

os-steve merged 1 commit into
mainfrom
claude/issue-10615-plugin-auth-test-debt-retally

Conversation

@os-steve

Copy link
Copy Markdown
Collaborator

Fixes #10615

@objectstack/plugin-auth's TEST_DEBT entry recorded errors: 109, a pile tsc no longer finds. It is re-tallied here from one measurement: 97, with the composition and the per-file split taken from that same tsc run rather than rescaled onto it.

The measurement

One command, on a fully built workspace closure, under the shared verify lock:

bash scripts/pm/os-verify-lock.sh -c \
  "NODE_OPTIONS=--max-old-space-size=4096 pnpm -s check:type-check-debt"

Its own informational line, before this change:

@objectstack/plugin-auth: TEST_DEBT records 109, tsc now reports 97 (-12)

The composition and the per-file split below are tallied from the raw diagnostics of that same tsc invocation — the gate's own generated project (the package tsconfig.json with the "**/*.test.ts" exclusion lifted, workspace imports resolving through each dependency's built dist/*.d.ts), counted with the gate's own rule (TSC_ERROR_LINE, TS6059 dropped).

TS2493 x36  TS18048 x24  TS2322 x11  TS2532 x9  TS2345 x4  TS2339 x3
TS2554 x3   TS2741 x3    TS7006 x2   TS2769 x1  TS6133 x1        = 97

Per file — complete, 11 files summing to 97, not a top-four:

n file (src/) n file (src/)
43 auth-manager.test.ts 3 sso-client-secret-at-rest.test.ts
18 admin-user-endpoints.test.ts 2 auth-manager.jwt-eddsa-fallback.test.ts
12 auth-plugin.test.ts 2 reconcile-membership.test.ts
11 admin-import-users.test.ts 1 better-auth-schema-parity.test.ts
3 objectql-adapter.test.ts 1 last-admin-guard.test.ts
1 oauth-provider-schema-parity.test.ts

The -12 is measured, not subtracted

109 - 11 = 98 is the arithmetic that looks right, and it is wrong twice over: the surplus was 11 when the card was filed and 12 when last swept. Cross-tabbing the recorded measurement against this one by file and by code attributes every one of the 12:

file code 109 97 Δ
admin-import-users.test.ts TS2339 5 0 -5
admin-import-users.test.ts TS2493 13 7 -6
auth-manager.test.ts TS2345 1 0 -1

The 11 are #10614 giving two engine doubles real typed parameters — a zero-parameter mock has a zero-length parameter tuple, so every .mock.calls[0][1] was a TS2493 and every options?.where off it a TS2339. The 12th is one TS2345 at auth-manager.test.ts(4086,46) that left afterwards, across three commits that rewrote 204 lines of that file; it is not attributed further rather than guessed.

Correction: the predicted per-file split was wrong

The card named admin-import-users.test.ts and admin-user-endpoints.test.ts as "exactly the two files that moved". admin-user-endpoints.test.ts holds 18 at both ends and never moved. All 11 of #10614's retirements landed in one file.

Re-deriving the whole split is what caught this. Patching the two numbers a reader believes changed would have written a plausible, wrong split over a correct total — the failure this ledger cannot see, since nothing but prose records a split.

Anchor, re-established before re-tallying

The recorded 109's credibility rests on d5e7b9f5a1 reproducing it. Measured today at that ref, with the same program shape and the same counting rule:

d5e7b9f5a1   109   (recorded: 109)

Not only the total — the composition reproduces class for class (TS2493 x42, TS18048 x24, TS2322 x11, TS2532 x9, TS2339 x8, TS2345 x5, TS2554 x3, TS2741 x3, TS7006 x2, TS2769 x1, TS6133 x1) and the per-file split reproduces the 44 / 22 / 18 / 12 the note recorded. So the measuring stick did not drift under the entry, and 97 is comparable to 109.

That was worth checking rather than assuming: this gate grew +1752/-81 since the anchor, and the re-measure path itself did move — measureTestDebt now asks tscErrorCount to drop TS6059 (#10779), and the include roots moved into includeRoot (#10876). Neither reaches this package: its output carries 0 TS6059, and includeRoot is the previously-inlined expression verbatim (glob.split('*')[0].replace(/\/$/, '')). The package's own tsconfig.json and the root tsconfig.json are both unchanged across the window.

No compositionAt, demonstrated rather than assumed

--lower writes compositionAt only when a lowering strands a tier itemisation. This note's opening tally is per-code, which tierItemisation deliberately does not read, so there is nothing to strand and the correct entry carries no such field. Verified by ablation (mutation confirmed on disk, restored under trap ... EXIT INT TERM) — injecting compositionAt: 109 turns the gate red naming this entry:

@objectstack/plugin-auth: TEST_DEBT declares `compositionAt: 109` but its note carries no readable tier itemisation for that number to describe

That is the check reading the new entry, and reading it correctly.

Not a graduation

97 is not 0. The entry stays and @objectstack/plugin-auth's typecheck script is unchanged.

Verification

Gate union derived from the real change set — node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (no paths; it derives from the merge base itself). All run at b56b81eb3, exit codes captured before any pipe:

gate verdict
check:type-check-debt (ratchet, --re-measure) OK — 32 entries, none above its recorded number
check:type-check-coverage OK — self-test 47+59+29+28+19 cases, structural clean
check:cross-package-test-inputs OK — 14 packages, all declared
check:entry-guard OK — 139 scripts/ files
check:parse-guard OK — 138 scripts/ files
check:pnpm-filter-targets OK — 120/148 filters resolve
check-ci-filter-parity.mjs OK — 89 declared globs covered

The ratchet run confirms the close from the other end: plugin-auth no longer appears in the surplus report at all, and the repo-wide surplus falls from 14 raw errors across 3 entries to 2 across 2.

scripts/**-only, so this PR publishes nothing and carries skip-changeset rather than a changeset — .github/workflows/pr-automation.yml's changeset-check has no path exemption, and scripts/pr-labels.mjs never applies that label itself.

⚠️ A re-measure PR is measured against your branch merged into main, so a plugin-auth-touching PR landing beside this one can redden it. Per the gate's own MERGE QUEUE note, the repair is a new commit carrying a re-measured number — never a re-run, which replays the same stale merge ref.

Generated by Claude Code


Generated by Claude Code

`errors: 109` recorded a pile tsc no longer finds. Re-measured against a
built workspace closure: 97, with the composition and the per-file split
taken from that same run rather than rescaled.

  TS2493 x36, TS18048 x24, TS2322 x11, TS2532 x9, TS2345 x4, TS2339 x3,
  TS2554 x3, TS2741 x3, TS7006 x2, TS2769 x1, TS6133 x1  =  97

The -12 is measured, not subtracted. 109 - 11 = 98 is the arithmetic that
looks right and is wrong twice over: the surplus was 11 when filed, 12 when
last swept, and cross-tabbing the two runs by file AND code attributes all
12 -- 11 in src/admin-import-users.test.ts alone (TS2339 5 -> 0, TS2493
13 -> 7, the typed engine doubles) and one TS2345 out of
src/auth-manager.test.ts afterwards, left unattributed rather than guessed.

The per-file split is re-derived whole, and doing so falsified the predicted
one: src/admin-user-endpoints.test.ts holds 18 at both ends and never moved.
It is now complete -- 11 files summing to 97, not a top-four.

Anchor re-established first: d5e7b9f still measures 109 today, matching
the recorded note class for class and file for file, so the measuring stick
did not drift under the entry and 97 is comparable to 109. Worth checking --
the re-measure path did move over that window (TS6059 now dropped, include
roots extracted), but neither change reaches this package.

Not a graduation: 97 is not 0, so the entry stays and the package's
typecheck script is unchanged. No `compositionAt` is written: the note's
opening tally is per-code, which COMPOSITION deliberately does not sum, and
declaring the field over an unreadable itemisation is itself a failure.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx
@os-steve os-steve added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 24, 2026 — with Claude
@os-steve
os-steve marked this pull request as ready for review August 24, 2026 04:46
@os-steve
os-steve added this pull request to the merge queue Aug 24, 2026
Merged via the queue into main with commit fbb5020 Aug 24, 2026
32 checks passed
@os-steve
os-steve deleted the claude/issue-10615-plugin-auth-test-debt-retally branch August 24, 2026 04:57
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Oct 7, 2026
…ui#11466, objectstack-ai#11574, objectstack-ai#11578, objectstack-ai#11581 and objectstack-ai#11583) (objectstack-ai#21710)

Fixes objectstack-ai#21696
Clause-②: no

This moves the bundled Console's objectui pin from `ab1879721595`
(objectstack-ai#21625) to objectui `main` as of the write time,
`2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6`, which is past `973fc20f3`.
The Console now carries objectui#11574 (the phantom "(empty)" groups
fix), objectui#11578, objectui#11581, objectui#11576, objectui#11583 and
objectui#11466 (V1 declared node slot). It also carries objectui's own
17.7.0 package release.

⛔ This is not a release act. Version PR objectstack-ai#21352 is untouched, and no tag,
publish or Release was made. Whether 17.7.0 ships with this pin is the
maintainer's call.

## Range

`ab1879721595..2e818d0b51ec` has 22 non-merge commits. `git merge-base
--is-ancestor` exits 0 against objectui `origin/main` for `973fc20f3`,
and `2e818d0b51ec` was objectui `main` when it was read (`git ls-remote`
just before this PR).

From the changesets objectui declared over the range:
- 17 releasing changesets, 1 release-nothing, and 6 commits that carry
no changeset.
- 12 of the 18 changesets were already consumed by objectui's release
`b493919c7`. Each was read from the commit that added it.
- 2 breaking entries, both annotated by the author and both from one
commit.

The range was listed by measurement, not copied from the card. Exactly
one commit subject in the range carries `!`:

`git log --format='%h %s' ab187972..2e818d0b5 | grep -E '^[0-9a-f]+
[a-z]+(\([^)]*\))?!:'` gives `83e3f8377
feat(types,react,core,plugin-dashboard)!: … (objectui#11466)`.

| objectui landing | commit | note |
|---|---|---|
| objectui#11466: node slot and `SchemaRenderer`'s `schema` take
`DeclaredNode`; the dashboard producers name declared nodes; an
envelope's object-metric retires | `83e3f8377` | **declared breaking**,
both breaking entries |
| objectui#11574: a grouping-field switch paints only the server's
groups | `2f54dca53` | smoke below |
| objectui#11581 / objectstack-ai#11578 / objectstack-ai#11576: Create View doors share one builder;
a refused save is said; chart views bind an ADR-0021 dataset |
`b65aa5e65`, `f1c937966`, `d0097af2e` | |
| objectui#11583: a refused metadata write on the view, report and draft
surfaces is said | `e8c0b9614` | past the card's `973fc20f3` |
| objectui#11598: dashboard slot-entry and chart-producer reads compile
without `BaseSchema`'s index signature | `2e818d0b5` (the pin itself) |
|
| objectui#11572 / objectstack-ai#10380: interface and object page relay stored view
config | `09036173c`, `068564691` | |
| objectui#11588: grid summary footer reads currency/precision from the
object field only | `d768c3178` | |
| objectui#11216: `object-kanban` declares `grouping` as the spec's
`GroupingConfig` | `a7557a7d4` | |
| objectui#11573, objectstack-ai#11564: `AnyComponentSchema` / flex child typing |
`bdc9049ed`, `b10c68e58` | |
| objectui release 17.7.0 | `b493919c7` | removes 2726 consumed
`.changeset/*.md` files |

## ADR-0087 disposition of the declared-breaking entries

Both entries are `not-required (no-migration-prescription)`. The
disposition is in `.changeset/console-2e818d0b51ec.md`, which replaces
the script's `adr-0087: TODO` placeholder.

| objectui PR | commit | entry | disposition |
|---|---|---|---|
| objectui#11466 (PR objectui#11512) | `83e3f8377` | A node slot and
`SchemaRenderer`'s `schema` prop take `DeclaredNode` | not-required
(no-migration-prescription). This is objectui's own TypeScript face
(`@object-ui/types` / `@object-ui/react`). No ObjectStack schema
declares or references it. |
| objectui#11466 (PR objectui#11512) | `83e3f8377` | An `object-metric`
node in a dashboard widget's legacy `component` envelope draws the
retired-format prompt | not-required (no-migration-prescription). An
ObjectStack author cannot write that envelope: `ui/dashboard.zod.ts`
refuses a widget's `component` key by name as objectui-internal, and no
example authors one. The showcase's `object-metric` page tiles still
draw their numbers (smoke below). |

`check-adr-0087-registration --base origin/main` gives "1
declared-breaking changeset(s), each carrying an ADR-0087 disposition".
`check-changeset-no-major --base origin/main` gives "This diff
introduces no `major` bump".

## What changed here

- **`.objectui-sha` and `.changeset/console-2e818d0b51ec.md`** were
written by `scripts/bump-objectui.sh
2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6 --no-commit` with
`OBJECTUI_ROOT` set to a read-only clone of objectui. The level was
auto-set to `minor`. No `../objectui` sibling exists in this container.
- **`scripts/sdui-manifest.record.json`** was re-recorded by `node
scripts/gen-sdui-manifest-node.mjs` over the tree that `pnpm
objectui:build` built at the pin. **`sdui.manifest.json` is
byte-identical**: 107 components, sha256 `0ead67c1111d…` at both pins,
so no component input moved. The record moves its pin, its `modulesRoot`
and objectui's workspace version (17.6.0 to 17.7.0).
- **`packages/sdui-parser/objectui-lockstep.json`** was re-recorded with
`pnpm gen:sdui-lockstep` against
`OBJECTUI_ROOT=.cache/objectui-2e818d0b51ec`. It records 214 grammar
lines (blob `0131f27cf86d`), 25 codes and containment predicate
`76c18fb95d1f`. All are unchanged, so no port is owed. objectui's
`packages/sdui-parser/src` is byte-identical across the range; only its
CHANGELOG and package.json moved.
- **The 54 asserting pin citations in `packages/spec/src`** were
re-measured at the new pin, not restamped:
- Every anchor in each asserting record was resolved against objectui's
tree at the old pin and mapped through `git diff -U0 ab187972
2e818d0b5`.
  - Four cited files changed:
- `plugin-dashboard/src/index.tsx` (+13/-1, objectui#11466). Lines were
added above the `object-metric` registration, so its start moves `244`
to `256` and the icon input moves `269` to `281`. Both lines are
byte-identical, still `{ name: 'icon', type: 'string' }`.
- `packages/types/src/objectql.ts`. objectui#11216's `grouping` member
landed below the cited `limit` member, so `:4720` did not move.
- `content/docs/plugins/plugin-kanban.mdx`. A `grouping` row landed
below the `limit` row, and the page still teaches `limit: 250`.
- `packages/react/src/SchemaRenderer.tsx` (+21/-20, objectui#11466).
Only the type import, the `SchemaRendererProps` docblock and the
`schema` type changed. The `properties.*` hoist, its strip list and the
`createElement` spread did not, so `object-timeline`'s prop channel
still carries `data`.
  - Every other cited file is byte-identical across the hop.
- Each record gains a dated 2026-10-04 hop sentence and keeps its
`ab1879721` history.
- **The six migration entries' corpus counts** were re-taken with `git
grep -o -F`. That method first reproduced every `ab1879721` number:
10267 files, `objectstack` 16377, `@objectstack/spec` 6665, `timeout`
1348, `useState` 2476, `TTL` 180, `tenant` 1238, `Span` 491.
- The new numbers are 7579 files, 17227, 7134, 1351, 2477, 182, 1317 and
505. The file count drops because objectui's 17.7.0 release removed 2726
consumed changesets.
- Every zero is still zero: 98 tokens were checked, the export lists of
the three cited spec files plus every named key. The only non-zero
tokens are the expected `Span` / `SpanSchema`. The 14 new `Span` hits
are `Spanish` prose.
- `packages/spec/src/migrations/registry.ts` was regenerated with
`gen:migration-registry`.
- **`.changeset/objectui-pin-citations-2e818d0b51ec.md`** is a
`@objectstack/spec` patch, because the `FormField.span` describe and six
migration descriptions name the pin.
`content/docs/references/ui/view.mdx` was regenerated by
`check:generated --fix`.
- **`main` was merged** (`7e0066af7a`) with
`scripts/pm/os-regen-merge.sh` in merge commit `a0a35cb30f`, with no
conflict hunk. Afterwards:
  - `check:generated` reports all 15 artifacts current.
- main's three new semantic entries
(`ui-object-form-fields-names-typed`, `ui-object-gantt-markers-typed`,
`ui-object-timeline-mapping-typed`) are present in the regenerated
registry.
- The pin-citation gate still counts 54 asserting citations. main added
historical ones only (108 to 118).

No example, test or gate needed adapting, and no code changed outside
generated records, citations and changesets.

## Browser smoke: `examples/app-showcase` with the Console built at
`2e818d0b51ec`

The Console was built by `pnpm objectui:build`. The build log reports:
"Console dist matches the objectui pin (objectui@2e818d0b51ec)",
"Single-zod canary: exactly one zod version literal
{major:4,minor:6,patch:5}" and "Console bundle carries THIS tree's
@objectstack/spec, and only it".

The server ran `pnpm dev -- --fresh --ui --no-watch -p 41853` (with
`OS_PORT=41853`) on its own ephemeral DB with the seeded admin. Headless
Chromium (`/opt/pw-browsers/chromium`) drove it, with console messages,
page errors and every non-2xx response captured. Only the PIDs this run
started were stopped.

**Dashboards.** objectui#11466 touches the dashboard producers. There
are no page errors and no "retired" prompt on any of the four
dashboards.

| dashboard | metric tiles (value read in the DOM) | charts drawn |
console errors |
|---|---|---|---|
| Delivery Operations `showcase_ops_dashboard` | Active Projects 2,
At-Risk (Red) 1, Awaiting Review 2, Total Budget 1,090,000 | 4 | 404
`/api/v1/usage/storage`, 404 `/favicon.ico` |
| Revenue Pulse `showcase_revenue_pulse` | Invoices 7, Invoiced Subtotal
1,920, Accounts Signed 3, Accounts (all time) 14, Paid Rate 42.9% | 4 |
404 `/api/v1/usage/storage` |
| Chart Gallery `showcase_chart_gallery` | Total Tasks 10, Avg Progress
47.0, Total Spent 616,000 | 13 | 404 `/api/v1/usage/storage` |
| System Overview `system_overview` (setup) | Total Users 3, Active
Sessions 3, Login Events 3, Config Changes 0 | 2 | 404
`/api/v1/usage/storage` |

The Delivery Operations tiles match the REST data on the same server:
- `showcase_project?status=active` returns 2 rows, `?health=red` returns
1, and the budget sum is 1,090,000.
- `showcase_task?status=in_review` returns 2 rows.
- `showcase_task` has 10 rows, matching the Chart Gallery's Total Tasks.
- `showcase_account` has 14 rows, matching Revenue Pulse's all-time
count.

The `object-metric` page tiles that this repo authors also draw:
- My Work shows Open Tasks 8, In Review 2 and At-Risk Projects 1.
- Command Center (大屏) shows 2 / 8 / 2 / 1 / 14 / 1.1M.

Neither page has a page error.

**Grouping-field switch (objectui#11574).** The drive was Tasks list,
then Group, then Add group field (it selects Title). The select then
switched to Priority, Status and Priority. The painted groups are
counted from the DOM, and the server answers are each `POST
/api/v1/data/showcase_task/query` with `groupBy`, all 200:

| step | painted groups | server rows | "(empty)" groups | stuck
"Loading grid…" |
|---|---|---|---|---|
| Title | 10 (one per task) | 10 | 0 | 0 |
| Priority | 4: High 3, Low 1, Medium 4, Urgent 2 | 4 | 0 | 0 |
| Status | 5: Backlog 2, Done 2, In Progress 2, In Review 2, To Do 2 | 5
| 0 | 0 |
| Priority | 4: High 3, Low 1, Medium 4, Urgent 2 | 4 | 0 | 0 |

The same sequence painted 13, 8 and 8 groups (9, 3 and 4 phantom) at
`ab1879721595`, as objectstack-ai#21625's acceptance notes recorded. **No phantom
"(empty)" groups appear at this pin.**

**Console errors across the run.** The only ones are the browser's
"Failed to load resource: 404" lines for `/api/v1/usage/storage` and
`/favicon.ico`, and the run has 0 page errors. The `usage/storage` 404
was already recorded in objectstack-ai#21625's smoke.

## objectstack-ai#21671 lockstep reading

- objectui's `packages/sdui-parser/src/validate.ts` at `2e818d0b5` is
byte-identical to `ab1879721595`.
- `checkType` (`:450-466`) still grades `type-mismatch` with `severity:
arms.includes('enum') ? 'error' : 'warning'`. `checkMemberTypes`
(`:407-419`) grades `member-type-mismatch` the same way.
- This repo grades both `error` since PR objectstack-ai#21678
(`packages/sdui-parser/src/validate.ts:446`, `:506`). **The gap still
stands at this pin.**
- This repo's "Known lead" note
(`packages/sdui-parser/src/validate.ts:336-340`) names objectui's copy
"at the `.objectui-sha` pin" without a sha, so it is still true and
needs no update. The bump route regenerates nothing there, and
`validate.ts` is not edited.
- `check:sdui-lockstep` does not compare severity, so this is a reading,
not a gate result.

## Gates and tests (head `a0a35cb30f`)

- `node scripts/pm/dispatch-gates.mjs --commands` derived 127 commands
from the 21-path diff. That is the same set before and after the merge.
- At `378d424915` (pre-merge) and again at `a0a35cb30f`, all 127 exited
0. `--ran` reports "127 derived, 127 run, 0 NOT-MEASURED, 0 UNRUN", with
every exit code recorded.
- Also exit 0:
- `check:objectui-pin-citations --verify-anchors` with objectui at the
pin: 54 asserting citations match `2e818d0b5`, and 7 content assertions
are verified.
- `check:objectui-bump` (20 assertions across 5 cases),
`check:sdui-lockstep`, `check-sdui-manifest`, `check:console-sha`,
`check:console-injection`, `check:migration-registry`.
- `@objectstack/spec check:generated`: all 15 artifacts current after
the merge.
- `pnpm --filter @objectstack/spec test`: 612 files, 18185 passed, 1
todo.
- `pnpm --filter @objectstack/spec typecheck`: exit 0.
- `pnpm --filter @objectstack/sdui-parser test`: 225 passed.
- `eslint --no-inline-config` on the 15 changed TS files: 0 errors and 0
warnings. The lint population is `**/*.{ts,…}`
(`eslint.config.mjs:971`). The config enables no type-aware linting
(`:328`), so this diff cannot move a judgment on an untouched file.
Repo-wide `pnpm lint` is left to CI.

## Acceptance notes

- `ui/component.zod.ts`'s `object-grid` `columns` record (the ⚠️
paragraph on `plugin-grid/src/useColumnSummary.ts:558-568`) says, about
`ab1879721595`, that the footer summary reads `currency` /
`defaultCurrency` / `precision` / `scale` off an authored column.
objectui#11588 (`d768c3178`, inside this pin) retires that read. The
record is in the historical spelling and stays true of the pin it names,
so it is left as is.
- Two anchors in records that cite no sha are outside the pin-citation
gate's population and were not re-measured:
- `ObjectView.tsx:882`, in `ui/view.zod.ts`'s [objectstack-ai#5074] block and two view
tests.
- `plugin-dashboard/src/index.tsx:204`, in the `ObjectMetricPropsSchema
icon liveness` test.
- Both already read an unrelated line at `ab1879721595`, and they shift
to `:936` and `:214` here.
- Writes: no PR assignee or label was written. This dispatch's write
budget names neither.

---
_Generated by [Claude
Code](https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] @objectstack/plugin-auth's TEST_DEBT records 109 where tsc now reports 98 — an 11-error surplus opened by PR #10614

2 participants