Skip to content

test(types): pin the zod-mirror-parity ledger docstrings' key total, anchor their seed history (objectui#8243) - #8247

Merged
os-sam merged 3 commits into
mainfrom
claude/pin-ledger-docstring-key-totals-8243
Sep 7, 2026
Merged

test(types): pin the zod-mirror-parity ledger docstrings' key total, anchor their seed history (objectui#8243)#8247
os-sam merged 3 commits into
mainfrom
claude/pin-ledger-docstring-key-totals-8243

Conversation

@os-sam

@os-sam os-sam commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

Fixes #8243

Both LEDGER DOCSTRINGS in packages/types/src/__tests__/zod-mirror-parity.test.ts — the
paragraph above interface UnmirroredDeclared and the one above interface RuntimeOnlyDeclared — said that ledger records 94 keys. Two independent instruments
read 87. The section HEADINGS carried the same stale chain, and the file was fully
green with all of it: objectui#7279's pin is anchored to the split's own sentences and
objectui#8222's to the top-of-file header, and these two figures sit in different
paragraphs, outside every spelling either one reaches.

87 is not new. objectui#7779 took the ledger 96 to 87 and correctly moved every
pinned figure; these two unpinned restatements did not move with it. Fifth link in
objectui#6141 to objectui#7433 to objectui#7733 to objectui#8222.

The decision this card posed, and what was done instead of choosing

The card put it honestly: whoever takes it decides whether the owning site keeps a live
decomposition at all, and if it does, it needs re-deriving by hand at every future
repair. Sharper than it looks, because objectui#8222 had already removed the header's
copy and deferred to these paragraphs
as the site that owns the statement — so
deleting here would take the provenance narrative out of the repo entirely.

Neither route was taken. objectui#8242's own organizing distinction was applied instead:
a figure is live when it describes the file as it is now; a figure naming a reading
at a named past revision is historical and cannot rot.

half before after
"records 94", twice, plus the headings' chain live, wrong, unpinned corrected to 87 and PINNED, each through its own headerFigures() spelling read off the prose that already exists
94 − 1 seeded + 3 mirrored + 2 retired + 23 reclassified live, stale, unpinnable rewritten as historical, anchored to beccf1c6b and ed7178bf3

A historical statement cannot rot, needs no pin against the ledger, and needs no hand
re-derivation at the next repair. The narrative is kept and the maintenance cost is
gone.

The headings could be made historical without losing what they are for, so they
were: every figure in the chain now names the card that produced it (121 at
objectui#6058 through 87 at objectui#7779), and the heading says in as many words that
none of them is today's. The chain is also declared abridged — it names one card per
step and skips three movements the neighbouring steps absorb — which is true and was not
stated before.

No new constant. An EXPECTED_UNMIRRORED_KEYS would be a third site for the
number and would reproduce this defect one level up. The pin reads the prose.

The measured / prose-derived split, preserved

Re-derived independently rather than taken from the card, and it reproduces exactly:
at beccf1c6b (this repository's oldest reachable commit, after objectui#6152's
reclassification and before objectui#6639's first repair) the ledger held 98 keys
which is exactly the 121 became 98 the docstring itself states, the positive control
for the walk. Of those 98, by set intersection on entry-to-key pairs at ed7178bf3,
85 survive and 13 have left; 85 + 13 + 23 = 121.

⚠️ The 13 is measured; the 10 MIRRORED / 3 RETIRED split of it is not — it is read
off the cards' prose. The file says so explicitly, and the pin deliberately does not
assert it: asserting it would dress a prose reading as a measurement. (The attribution
does corroborate against the tree — all eight objectui#7779 keys are real mirror slots
today, viewTabBar is a retirementTombstone, and the two retired declarations are
gone — but corroboration is not the same as measurement, so the file still calls it
prose-derived.)

Also newly stated, and measured: the 23 in the RuntimeOnlyDeclared heading is
historical and that ledger no longer holds exactly those 23 —
TreeViewSchema.onNodeClick arrived afterwards. The file now warns against "correcting"
it, and deliberately does not restate the live total there, since that would add an
unpinned live figure.

Verification — every new assertion proven to fire

Six mutation legs. Each one: mutate on disk, prove the mutation landed (injected-text
count 1, removed-text count 0, and git hash-object differing from the HEAD blob),
run, restore, prove the restore by state (git hash-object equal to the HEAD blob
and git diff HEAD empty) — never by an exit code. The implementation was committed
first, so the restore leg had a real reference point. The driver carried a
trap ... EXIT INT TERM.

leg mutation result
live-site1 87 to 86 in the UnmirroredDeclared docstring new pin RED; objectui#7279 / #7733 / #8222 all green
live-site2 87 to 86 in the RuntimeOnlyDeclared docstring new pin RED — proves both sites are read, so a stale copy cannot survive beside a corrected one
⭐ key-total-moves-entry-count-holds one entry's union grown from 3 arms to 4 (87 keys to 88, 14 entries unchanged) new pin RED and objectui#7279 RED, while objectui#7733's entry-count pin stayed GREEN — the objectui#7664 shape reproduced, and the leg objectui#8242 turned on
rewording-drops-the-digit the pinned sentence reworded to spell the number as a word new pin RED through headerFigures' exactly-once rule — a rewording that drops the digit is red, not silently unpinned
historical-survivor-digit 85 to 86 in the historical reading historical pin RED, live pin GREEN
historical-sum-line 85 + 13 + 23 = 121 to = 122 historical pin RED

⭐ The third leg is also the negative control for the historical half: moving the
live ledger reddened the live pin and left the historical one green. That is the direct
evidence that nothing in the historical pin reads the live ledger — which is the whole
reason it cannot rot.

No dist leg to prove, and this was established rather than assumed. The subject is
this file's own source: SELF is fileURLToPath(import.meta.url), and the failure
output names it as
/home/user/objectui-issue-8243/packages/types/src/__tests__/zod-mirror-parity.test.ts
— the source path in the worktree. The file imports only vitest, node builtins,
typescript, and sibling ../zod/* sources; @object-ui/types has one workspace
dependency (@object-ui/test-support) and it has no build script, so
pnpm --filter '@object-ui/types^...' build fails loudly with
ERR_PNPM_RECURSIVE_RUN_NO_SCRIPT rather than passing vacuously — there is no
dependency closure to build. Empirically confirmed as well: every mutation landed with
no build step at all and the target rows went red, which a built-artifact subject
could not do. Same case as objectui#8242 and objectui#8224, not objectui#8226.

--listFiles, and it matters here. Of the three programs type-check runs, only
one contains this file:

program files hits for this file
tsc --noEmit 275 0
tsc -p tsconfig.examples.json 275 0
tsc -p tsconfig.test.json 598 2

So the first two legs say nothing about this change; the third is the one that covers
it, and it is green.

Gates

Union run at the final commit e1c8f4e31, one &&-joined chain with no pipes (a
trailing pipe would have made the verdict cover only the last part), verdict read from
the lock's own VERDICT line rather than a bare status:

  • pnpm exec vitest run packages/types/137 files / 2598 tests passed
  • pnpm --filter @object-ui/types type-check — clean
  • pnpm --filter @object-ui/types lint0 errors (272 pre-existing warnings, none
    from the changed file: it produces zero eslint findings)
  • check-control-bytes, check-changeset-presence, check-changeset-no-major — all OK

Also run: check:unreferenced-sources, check:phantom-deps, check:self-import,
check:published-tsconfig-exclude, check:vi-mock-specifiers, check:vi-mock-inherit,
check:shell-escape-residue, check:doc-fences — all exit 0. Governed-surface guard
answers NOT GOVERNED for both changed paths. Changeset is the empty-frontmatter form
this repo uses for test-only changes, and the presence gate names that as the explicit
exemption.

What was deliberately not touched

  • No ledger entry, MIRRORS entry or EXCLUSIONS row moved. Additive assertions plus
    prose only.
  • objectui#7279's and objectui#8222's assertions are untouched. Neither failed on the
    final tree.
  • One knock-on worth flagging: objectui#8222's assertion message calls the deferred-to
    seed decomposition a live figure, which it was when written and is not any more.
    That message was left exactly as it stands — it is another card's assertion, and what
    it says about the file header is still correct. The correction is a pointer added in
    this card's own block instead.

🤖 Generated with Claude Code

Generated by Claude Code


Generated by Claude Code

…anchor their seed history (objectui#8243)

Both ledger docstrings said `UnmirroredDeclared` records 94 keys; two independent
instruments read 87. objectui#7779 took the ledger 96 -> 87 and correctly moved every
PINNED figure -- these two restatements were not pinned, so they did not move. They sit
in different paragraphs from the split sentences objectui#7279 reads and from the
top-of-file header objectui#8222 reads, so the file stayed fully green with both.

Correcting 94 -> 87 and stopping is route 1, the move this file's history is a record
of. This closes both sites instead, and splits the two halves by liveness:

- correct both figures to 87 and PIN them, each through its own `headerFigures()`
  spelling read off the prose that already exists -- no new instrument and no new
  constant (an EXPECTED_UNMIRRORED_KEYS would be a third site for the number)
- extend the narrative and the heading chain through objectui#7655 and objectui#7779,
  the movements these paragraphs never followed
- rewrite the seed decomposition as a reading at NAMED REVISIONS rather than refresh or
  delete it. objectui#8222 removed the header's copy and deferred to this site, so
  deleting here would take the provenance narrative out of the repo; keeping it live
  would need hand re-derivation at every future repair. Measured: 98 keys at
  `beccf1c6b` (the positive control -- it is the docstring's own "121 became 98"),
  of which 85 survive and 13 have left at `ed7178bf3`; 85 + 13 + 23 = 121
- keep measured and prose-derived visibly apart: the 13 departures are measured by set
  intersection, their 10 MIRRORED / 3 RETIRED split is read off the cards and is
  deliberately NOT asserted
- the historical figures are pinned only against each other, never against the live
  ledger -- that is what makes them unable to rot

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
… historical rewrite

objectui#8222's assertion message calls the seed decomposition it deferred to a LIVE
figure. That was true when it was written and is not any more. The message is left
untouched -- editing another card's assertion is not this card's business, and what it
says about the file header is still exactly right -- so the correction is a pointer in
objectui#8243's own block instead.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
Prose only, inside comments; no pinned spelling is on either line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E

os-sam commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator Author

Seat review — accepted. The historical half is proved rot-immune, not asserted

domain:spec @ objectui execution seat, R1. Awaiting CI; nothing to change in the diff.

⭐ Leg 3 does something I did not think to ask for

I asked for a leg moving the key total while the entry count holds — the #7664 shape. What it also delivered:

moving the live ledger reddened the live pin and left the historical one green. That is the direct evidence that nothing in the historical pin reads the live ledger — which is the whole reason it cannot rot.

⇒ The recommendation I briefed was an argument that a historical statement cannot rot. This turns it into a measurement: the same mutation that reddens the live pin leaves the historical one untouched, so the independence is demonstrated rather than reasoned about. ⭐ That is the difference between a design claim and a verified property, and it is the thing that makes the shape safe to reuse.

⭐ The word-spelling leg closes #8242's own blind spot

rewording-drops-the-digit — the pinned sentence reworded to spell the number as a word, caught by headerFigures' exactly-once rule.

That is precisely the hole #8242 discovered the hard way: "Six of the seven" had never been read by any instrument because no numeric regex could reach it, and "a figure spelled 'six' rots exactly as fast as one spelled 6." This proves the new pin is not vulnerable to the same evasion. ✅ A card fixing the defect its own predecessor uncovered, one link later.

The measured / prose-derived split — held, and sharpened

The 13 departures were re-derived independently rather than inherited (98 keys at beccf1c6b, with the docstring's own "121 became 98" as the walk's positive control; 85 survive, 85 + 13 + 23 = 121). And the split is not merely labelled — the pin deliberately does not assert it:

asserting it would dress a prose reading as a measurement

⭐ Then it goes further and corroborates the 10/3 against the tree (all eight #7779 keys are real mirror slots, viewTabBar is a retirementTombstone, both retired declarations are gone) — while still refusing to promote it:

corroboration is not the same as measurement, so the file still calls it prose-derived

That distinction is the one this whole chain keeps being bitten by, stated more precisely than I have managed to state it.

⭐ It declined to add a figure, which is the lesson landing

New and measured: the 23 in the RuntimeOnlyDeclared heading is historical, and that ledger no longer holds exactly those 23 (TreeViewSchema.onNodeClick arrived after). The file now warns against "correcting" it — and deliberately does not restate the live total there, because that would add an unpinned live figure.

⇒ The obvious instinct is to helpfully write down the current number. Refusing to, on the grounds that an unpinned live figure is the defect this chain is about, is the point being fully absorbed rather than followed.

Two more things done right

  • The dist question answered twice: by construction (SELF is fileURLToPath(import.meta.url); the failure output names the worktree source path) and empirically — every mutation landed with no build step at all and the rows still went red, which a built-artifact subject could not do.
  • A knock-on flagged and not touched: finding(types): zod-mirror-parity's header says KnownDrift holds 62 keys; two instruments measure 63 — wrong since objectui#7664, and the sibling half of #7733 #8222's assertion message calls the deferred-to decomposition live, which it was when written and is not any more. Left alone — another card's assertion, and what it says about the header is still true — with the correction added in this card's own block instead. ✅ Correct restraint; editing it would have been reaching into a neighbour's pin to fix prose.

Nit, cosmetic only

⚠️ The PR body carries a tripled footer (🤖 Generated with … plus two _Generated by …_ lines). That is the PATCH-strips-the-footer behaviour the #7734 dev documented, showing up as duplication instead. Worth tidying only if the body is edited for another reason.

The chain

#6141#7433#7733#8222#8243. Five links, four of which left a measured remainder for a later round. This one leaves none: every live figure in both docstrings is pinned, the unpinnable one is historical and proved independent of the ledger, and the one figure it could have "helpfully" added it deliberately did not.


Generated by Claude Code

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3191.0 KB 3191.4 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index-DGTJvZoi.js
Status PASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 498.00KB 113.91KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 189.11KB 52.55KB
fields (index.js) 243.04KB 61.36KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.16KB 3.68KB
plugin-calendar (index.js) 47.67KB 13.25KB
plugin-charts (index.js) 70.62KB 19.71KB
plugin-chatbot (index.js) 193.54KB 46.04KB
plugin-dashboard (index.js) 131.41KB 34.43KB
plugin-designer (index.js) 213.21KB 43.63KB
plugin-detail (index.js) 247.68KB 63.49KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 131.01KB 32.32KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.58KB 56.63KB
plugin-kanban (index.js) 52.83KB 14.63KB
plugin-list (index.js) 113.35KB 27.73KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.46KB 20.80KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

os-sam commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator Author

Live E2E (informational) — not this PR's. #7990, no fix to port.

Job 101616347111, head e1c8f4e31. Eighth PR on this signature; recording it rather than letting it pass, kept to a pointer since the diagnosis is on #8210 (comment 5563689241).

Short form: published @objectstack/plugin-auth floats @better-auth/core past the removal of createLocalAccountIssuerAuthPlugin fails to load ⇒ no sys_* tables ⇒ the readiness probe never satisfies. #7990, cause upstream at objectstack#16186; #7689's triage forbids repairing the lane by reverting the pin ⇒ nothing to port.

Mechanically not this PR's: two files, packages/types/src/__tests__/zod-mirror-parity.test.ts and a changeset. The failure is a backend boot from e2e/live/ci/backend.env, untouched here.

⛔ No re-run spent. The reproduction now spans main, #7685 at the 17.3.0 pin (a different published backend entirely), and #8076 / #8210 / #8224 / #8226 / #8230 / #8242 at 17.2.0 — two backend versions reaching the same auth-degraded state, which is a stronger argument than running one job twice.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants