Repository navigation
fix(tooling): re-tally @objectstack/plugin-auth's TEST_DEBT from tsc - #11583
Merged
Merged
Conversation
`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
marked this pull request as ready for review
August 24, 2026 04:46
This was referenced Oct 4, 2026
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #10615
@objectstack/plugin-auth'sTEST_DEBTentry recordederrors: 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:
Its own informational line, before this change:
The composition and the per-file split below are tallied from the raw diagnostics of that same
tscinvocation — the gate's own generated project (the packagetsconfig.jsonwith the"**/*.test.ts"exclusion lifted, workspace imports resolving through each dependency's builtdist/*.d.ts), counted with the gate's own rule (TSC_ERROR_LINE, TS6059 dropped).Per file — complete, 11 files summing to 97, not a top-four:
src/)src/)auth-manager.test.tssso-client-secret-at-rest.test.tsadmin-user-endpoints.test.tsauth-manager.jwt-eddsa-fallback.test.tsauth-plugin.test.tsreconcile-membership.test.tsadmin-import-users.test.tsbetter-auth-schema-parity.test.tsobjectql-adapter.test.tslast-admin-guard.test.tsoauth-provider-schema-parity.test.tsThe -12 is measured, not subtracted
109 - 11 = 98is 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:admin-import-users.test.tsadmin-import-users.test.tsauth-manager.test.tsThe 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 everyoptions?.whereoff it a TS2339. The 12th is one TS2345 atauth-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.tsandadmin-user-endpoints.test.tsas "exactly the two files that moved".admin-user-endpoints.test.tsholds 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
d5e7b9f5a1reproducing it. Measured today at that ref, with the same program shape and the same counting rule: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 —
measureTestDebtnow askstscErrorCountto drop TS6059 (#10779), and theincluderoots moved intoincludeRoot(#10876). Neither reaches this package: its output carries 0 TS6059, andincludeRootis the previously-inlined expression verbatim (glob.split('*')[0].replace(/\/$/, '')). The package's owntsconfig.jsonand the roottsconfig.jsonare both unchanged across the window.No
compositionAt, demonstrated rather than assumed--lowerwritescompositionAtonly when a lowering strands a tier itemisation. This note's opening tally is per-code, whichtierItemisationdeliberately 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 undertrap ... EXIT INT TERM) — injectingcompositionAt: 109turns the gate red naming this entry: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'stypecheckscript 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 atb56b81eb3, exit codes captured before any pipe:check:type-check-debt(ratchet,--re-measure)check:type-check-coveragecheck:cross-package-test-inputscheck:entry-guardscripts/filescheck:parse-guardscripts/filescheck:pnpm-filter-targetscheck-ci-filter-parity.mjsThe ratchet run confirms the close from the other end:
plugin-authno 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 carriesskip-changesetrather than a changeset —.github/workflows/pr-automation.yml'schangeset-checkhas no path exemption, andscripts/pr-labels.mjsnever applies that label itself.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