Skip to content

fix(core): repoint two deprecation warnings off the deleted MIGRATION_GUIDE.md - #6428

Merged
os-warren merged 1 commit into
mainfrom
claude/issue-6342-source-file-link-population
Aug 26, 2026
Merged

fix(core): repoint two deprecation warnings off the deleted MIGRATION_GUIDE.md#6428
os-warren merged 1 commit into
mainfrom
claude/issue-6342-source-file-link-population

Conversation

@os-warren

@os-warren os-warren commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Part of #6342

The card asked for a census first, and said the census decides the fork. It does.
The census says SMALL, so this PR takes the small fork: two hand repairs, and the
gate is left alone.
The measurement also turned up something the card did not
know, which independently argues against widening — see "Why not widen" below.

The census

Population: github.com/objectstack-ai/objectui/(blob|tree)/main/… in tracked files,
by extension.

ext occurrences in the gate's population today?
.md 84 yes
.mdx 33 yes
.ts 18 no
.mjs 2 no
.tsx 1 no

21 occurrences sit outside the gate's population. Broken down by what they
actually are:

what count dead?
scripts/__tests__/check-doc-links.test.ts — the gate's own fixtures 16 deliberately dead (packages/gone/README.md, blob/main/../../../etc/hosts, blob/12b287d8b/…)
scripts/check-doc-links.mjs — the literal ellipsis blob/main/... in its own hint text 2 not a link
genuine authored links in product source 3 2 dead

The three genuine ones:

site target state
apps/site/app/(home)/page.tsx:79 blob/main/LICENSE alive
packages/core/src/registry/Registry.ts:228 blob/main/MIGRATION_GUIDE.md dead
packages/core/src/validation/validation-engine.ts:411 blob/main/MIGRATION_GUIDE.md dead

Already dead: 2, both naming the same target, deleted in 8c5d20455.

Control terms

Every zero reading here is paired with a known-present string run through the
same command shape:

  • Variant spellings raw/main, blame/, blob/main with no trailing slash → 0 files.
    Control in the identical command shape: objectui/blob/main/MIGRATION2 files. The
    zeros are real absences, not a broken sweep.
  • The extension table above is itself controlled: .md/.mdx return 84/33, the population
    the gate already scans.

Why not widen — the census is small, and widening would not have worked anyway

The card's model is that the gate can already decide this URL and is only missing the
file. That is half true, and the missing half is decisive.

The gate's extractor is markdown link syntax only:

const MARKDOWN_LINK_RE = /\[[^\]]+\]\(([^)]+)\)/g;   // scripts/check-doc-links.mjs:518

It never extracts a bare URL. All three genuine source-file links are bare URLs, and
both dead ones sit inside a runtime console.warn string literal, not a docblock:

`  See: https://github.com/objectstack-ai/objectui/blob/main/MIGRATION_GUIDE.md`

Measured — the gate's own stripCode() + its own extractor over those files:

packages/core/src/registry/Registry.ts                        extracted=0  self-repo-blob=0
packages/core/src/validation/validation-engine.ts             extracted=0  self-repo-blob=0
packages/core/.../validators/object-validation-engine.ts      extracted=0  self-repo-blob=0
CONTROL README.md: extracted=62      CONTROL CONTRIBUTING.md: extracted=15
CONTROL same dead URL in [x](y) form: extracted=1, selfRepoPath=MIGRATION_GUIDE.md, existsOnDisk=false

So widening the extension filter alone is a no-op for this defect shape — it would not
have caught #6275's link either. The two populations spell links differently, and that is
measurable in both directions: inside the gate's current markdown population, 116 of 116
self-repo blob/tree URLs are written as [x](y) and 0 are bare; in source files, 3 of 3
are bare.

The real fix would therefore be population widening plus a new bare-URL extractor — a
materially larger gate than "one row in SCAN_ROOTS". That decision is handed back.

On the stripCode() analogue the card asked about: source files are all code, so the
analogue is the inverse — mask everything that is not a comment, which this repo already
answers once in scripts/js-comment-mask.mjs. But that helper keeps comments only, and
both dead links live in string literals, which it masks out. The correct protection and
the target defect are mutually exclusive here.

The noise a widened sweep admits

Pointing the existing pipeline at 3,764 source files under packages, apps, scripts,
e2e, examples extracts 257 [x](y) matches and would emit 194 findings — none of them
a genuine defect
:

TOTAL findings a widened source-file sweep would emit: 194
   172  disk-path
    18  site-absolute-url
     4  self-repo-url

Top files:  135  scripts/__tests__/check-doc-links.test.ts
             17  apps/console/src/pages/doc-links.test.ts
              9  apps/console/vite.config.ts

135 of them come from the gate's own test file — a widened gate's first act is to fail on
its own fixtures. 48 of the 257 extractions are not links at all, just TypeScript that matches
the regex:

file extracted "href"
packages/react/src/context/NotificationContext.tsx n.title, { description: n.message }
packages/react/src/hooks/useActionRunner.ts msg
packages/cli/src/__tests__/app-generator.test.ts a regex character class
packages/plugin-markdown/src/markdown-render.test.tsx javascript:alert(1

Triage's ratchet instruction was "if the widened sweep floods with historical debt, freeze it
in a reasoned baseline". What it floods with is not historical debt — it is test fixtures and
non-links
. Baselining 194 fixture strings would not be a ratchet, so the instruction's
precondition is not met and no baseline is proposed.

Two-direction proof

Both dead-URL spellings planted in packages/core/src/registry/Registry.ts, under
trap restore EXIT INT TERM, target DEAD_PROBE_6342.md confirmed absent:

mutation confirmed ON DISK:  bare spelling: 1   md spelling: 1

DIRECTION 1 — current gate:        exit=0  "Links are valid across 17 scan roots."   (invisible)
DIRECTION 2 — widened extension filter, same file:
    BROKEN self-repo-url  Registry.ts:181  .../blob/main/DEAD_PROBE_6342.md
    WIDENED-SIM VERDICT: RED (1 finding)

Line 181 is the markdown spelling. Line 180, the bare spelling — the shape both real
dead links actually use — is not reported. That is the whole argument, measured.

Control that the simulator works: run on the gate's own fixture file it reports RED with 4
findings (packages/gone/README.md, examples/crm).

Restore verified, not assumed:

git hash-object after restore = a2972821634e46789042b94184438aacd4b8ce4c  == HEAD blob
git diff HEAD  ->  empty
grep -c PROBE-6342  ->  0
re-run: gate exit=0 "Links are valid across 17 scan roots."   widened-sim: GREEN (0 findings)

What this PR changes

  • packages/core/src/registry/Registry.ts — the missing-namespace warning now points at the
    live docs page that documents namespaced registration,
    /docs/guide/plugin-development#namespaced-registration. Verified with the gate's own
    resolver: routeExists('/docs/guide/plugin-development') → resolves; dead control
    /docs/guide/definitely-not-a-real-page-xyz → dead.
  • packages/core/src/validation/validation-engine.ts — the function-based-condition warning
    drops its See: line. The deleted guide covered component namespaces and lazy field
    registration and never documented conditions at all (grep -i condition over
    git show 8c5d20455^:MIGRATION_GUIDE.md → no output), so that pointer was misdirected as
    well as dead. The message already carries a complete before/after inline.
  • Changeset: @object-ui/core patch.

Neither site can use the immutable git show SHA^:PATH provenance form #6275 used — that
was a docblock read by contributors with the repo; these are console messages read by
application developers who have only the npm package.

Because the gate's scan surface is unchanged, the surface descriptions #6280 rewrote stay
accurate; nothing there needed updating in this PR.

Verification

Union re-run on the final commit 5beb3e6ed, clean tree:

node scripts/check-doc-links.mjs      exit=0  "Links are valid across 17 scan roots."
node scripts/check-control-bytes.mjs  exit=0  "OK (scanned 5314 tracked text file(s); skipped 85 binary)."
pnpm exec vitest run --maxWorkers=2 scripts/__tests__ packages/core/
                                      exit=0  Test Files 181 passed (181)   Tests 4340 passed (4340)
pnpm --filter '@object-ui/core' run type-check   exit=0  (tsc --noEmit && tsc -p tsconfig.test.json)

The whole scripts/__tests__ tree is included, as the dispatch required (81 files on its own
run; 181 in the union above with packages/core/).


Generated by Claude Code

…_GUIDE.md

Both `Registry.register()`'s missing-namespace warning and `ValidationEngine`'s
function-based-condition warning ended in

    See: https://github.com/objectstack-ai/objectui/blob/main/MIGRATION_GUIDE.md

and that file was deleted in 8c5d204. The registry warning now points at the
live docs page documenting namespaced registration. The validation warning drops
its `See:` line: the deleted guide covered component namespaces and lazy field
registration and never documented conditions, so the pointer was misdirected as
well as dead, and the message already carries a complete before/after inline.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 52 chunks) 3233.6 KB 3266.6 KB
Main entry chunk (gzip) 157.4 KB 350 KB
Entry file index-D47oOCX6.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) 11.30KB 4.28KB
app-shell (runtime-config.js) 18.10KB 6.51KB
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) 505.86KB 114.58KB
core (index.js) 5.30KB 2.13KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 173.18KB 47.97KB
fields (index.js) 238.89KB 60.02KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.44KB 1.39KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 33.40KB 8.71KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.95KB 10.97KB
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.55KB 0.62KB
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 (useResponsiveConfig.js) 1.37KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 9.53KB 3.38KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 4.64KB 1.50KB
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) 1.93KB 0.88KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 46.66KB 12.84KB
plugin-charts (index.js) 64.66KB 18.32KB
plugin-chatbot (index.js) 188.60KB 44.82KB
plugin-dashboard (index.js) 133.46KB 34.48KB
plugin-designer (index.js) 211.90KB 42.74KB
plugin-detail (index.js) 245.10KB 62.31KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 131.78KB 32.19KB
plugin-gantt (index.js) 164.14KB 39.87KB
plugin-grid (index.js) 201.79KB 54.60KB
plugin-kanban (index.js) 52.87KB 14.57KB
plugin-list (index.js) 112.63KB 27.45KB
plugin-map (index.js) 20.09KB 6.62KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 43.49KB 11.93KB
plugin-timeline (index.js) 26.70KB 7.69KB
plugin-tree (index.js) 9.26KB 3.13KB
plugin-view (index.js) 84.55KB 20.74KB
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) 54.84KB 18.43KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.35KB 0.70KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 12.13KB 3.65KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 7.54KB 2.63KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
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 (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.72KB 2.24KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
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 (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) 3.40KB 1.71KB
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-warren
os-warren marked this pull request as ready for review August 26, 2026 00:04
@os-warren
os-warren added this pull request to the merge queue Aug 26, 2026
Merged via the queue into main with commit 3c2b6f7 Aug 26, 2026
29 checks passed
@os-warren
os-warren deleted the claude/issue-6342-source-file-link-population branch August 26, 2026 00:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants