Skip to content

docs(check-doc-links): re-derive two stale scan-surface claims from SCAN_ROOTS - #6410

Merged
os-warren merged 3 commits into
mainfrom
claude/issue-6280-scan-surface-claims
Aug 25, 2026
Merged

docs(check-doc-links): re-derive two stale scan-surface claims from SCAN_ROOTS#6410
os-warren merged 3 commits into
mainfrom
claude/issue-6280-scan-surface-claims

Conversation

@os-warren

Copy link
Copy Markdown
Collaborator

Fixes #6280

Two stale claims about scripts/check-doc-links.mjs's scan surface, both corrected by
re-deriving from the live SCAN_ROOTS table rather than from card history.

(a) The test docblock's justification was two cards stale

packages/components/src/__tests__/readme-shadcn-sync-categories.test.ts's ## Scan surface docblock said README_SHADCN_SYNC.md "has never been scanned by anything" and
that widening the scan root was "a separate change with its own entry price."

Verified false, not assumed:

$ node --input-type=module -e "
import { collectFiles } from './scripts/check-doc-links.mjs';
const files = collectFiles('./packages/*', new Set(['README.md','CHANGELOG.md']));
console.log(files.filter(f => f.includes('components/README_SHADCN_SYNC')));
"
[ 'packages/components/README_SHADCN_SYNC.md' ]

check-doc-links.mjs's packages/* row excludes only the basenames README.md /
CHANGELOG.md (objectui#4938); README_SHADCN_SYNC.md is neither, so it is inside that
row today.

Assertion-by-assertion: does the test still earn its keep? Per the ruling, yes, keep
it if its checks exceed what the link checker asserts — they do, on every one of the
file's 5 it blocks, and for two independent reasons:

# Test assertion Covered by check-doc-links.mjs?
1 README's documented "diverged" set ⊆ manifest's marked-diverged set No — compares prose against a JSON manifest (shadcn-components.json); not a link at all
2 manifest's marked-diverged set ⊆ README's documented set No — same reason, inverse direction
3 manifest parse sanity + partition invariant + "diverged section present iff manifest marks something" No — manifest-structure invariants, no link syntax involved
4 "Component Categories" prose names no components-registry key inline No — backtick-token vs. JSON-key comparison, not a link
5 every backticked in-repo path in the README exists on disk Structurally invisible to check-doc-links regardless of scan surface — see below

For #5, the closest analog: I measured what check-doc-links.mjs actually sees in this
file today —

$ node --input-type=module -e "
import { readFileSync } from 'node:fs';
/* ...stripCode() + MARKDOWN_LINK_RE reimplemented verbatim from check-doc-links.mjs... */
"
markdown-link hrefs found after stripCode: [
  'https://github.com/shadcn-ui/ui/tree/main/apps/www/registry/default/ui',
  'https://github.com/shadcn-ui/ui/releases',
  'https://github.com/shadcn-ui/ui/releases',
  'https://github.com/radix-ui/primitives/releases',
  'https://ui.shadcn.com',
  'https://www.radix-ui.com',
  'https://tailwindcss.com',
  'https://cva.style'
]

All 8 of this README's actual [text](href) markdown links are external URLs. Every
in-repo path it names (shadcn-components.json, scripts/shadcn-sync.js,
scripts/shadcn-local-patches.mjs) is written as a backticked code span, never as
markdown-link syntax — and check-doc-links.mjs's own stripCode() blanks every inline
code span before its link regex ever runs, by design (so a command example like
`pnpm shadcn:update button` can't be misread as a broken link). So even scanning
this file today, check-doc-links resolves zero repo-relative targets in it.

Conclusion: the test survives, for reasons unrelated to scan-surface width — 4 of 5
assertions ask a question no link checker can ask (prose vs. JSON manifest), and the 5th
checks a syntax (backticked paths) the link checker structurally never inspects. Rewrote
the docblock to argue from this, not from "not yet scanned."

(b) Both ci-cd-pipeline.md surface lists were frozen at #3622

The page described check-doc-links.mjs's surface twice (prose in "Internal Docs Links",
the two-link-checkers table in "Link Checking"), both ending at "the internal docs/
tree and every package README.md" — the surface as of #3622. Widened three times since
(#4148, #4938, #6026) and neither list knew.

Re-derived from the script itself, not from the card table:

$ node scripts/check-doc-links.mjs
Links are valid across 17 scan roots.

SCAN_ROOTS (17 rows): content/docs (docs rule); examples, root README.md,
CONTRIBUTING.md, ROADMAP.md, docs (disk); packages/*/README.md,
apps/*/README.md (disk); packages/* / apps/* excluding README.md+CHANGELOG.md
at every depth (disk, #4938); packages/*/* / apps/*/* collecting only nested
README.md (disk, #6026); root AGENTS.md, CHANGELOG.md, CLAUDE.md,
LICENSE-THIRD-PARTY.md, QUICK_REFERENCE.md (disk, #4148). 17 matches the gate's own
printed verdict above — the cheap cross-check the dispatch order suggested.

Both lists rewritten to enumerate this surface instead of the #3622 shape.

Sequencing

content/docs/guide/ci-cd-pipeline.md was contended 4 times today; per the dispatch
order I waited for #6408 to land (9e35810ba) before touching the file, merged it into
this branch (git merge origin/main, no rebase), and re-ran the surface re-derivation on
top of that merge — both spots were untouched by #6408 (which edited a different
section), and SCAN_ROOTS itself was untouched, so 17 held before and after the merge.

Per the dispatch order, #6308's section of this page (the fold triage suggested and the
PM seat declined) is untouched here, and the skip-changeset / #4912 staleness the PM
seat flagged is not addressed in this PR.

Tests

Full tree, per dispatch instruction (this page carries ci-cd-pipeline-doc.test.ts,
merge-queue-reporting.test.ts, and the doc-version-claims ledger, and none of them pin
the exact prose I rewrote — verified by grep before editing):

$ pnpm exec vitest run scripts/__tests__ packages/components/src/__tests__/readme-shadcn-sync-categories.test.ts
 Test Files  82 passed (82)
      Tests  2322 passed (2322)

(HEAD bd2ce2abf, git rev-parse --short HEAD.)

Plus targeted doc gates:

$ node scripts/check-doc-links.mjs        → Links are valid across 17 scan roots.
$ pnpm check:doc-fences                   → ✅ 223 documents scanned
$ node scripts/check-changeset-presence.mjs → ✅ 1 changeset added (empty frontmatter — no release)
$ node scripts/check-changeset-no-major.mjs → ✅ No changeset declares a major bump
$ grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' packages/components/src/__tests__/readme-shadcn-sync-categories.test.ts content/docs/guide/ci-cd-pipeline.md .changeset/6280-scan-surface-claims.md
  (no output — clean)

Notes

  • Draft — this seat arms it per the dispatch order.
  • No source or behaviour change: a test docblock and a docs page, text only.

Generated by Claude Code

claude added 3 commits August 25, 2026 21:35
…heck-doc-links surface

`readme-shadcn-sync-categories.test.ts`'s "## Scan surface" docblock said
`README_SHADCN_SYNC.md` had "never been scanned by anything" and that widening
the scan root was "a separate change with its own entry price". Both became
false with objectui#4938: `check-doc-links.mjs`'s `packages/*` row excludes
only the basenames `README.md`/`CHANGELOG.md`, and this file is neither -- it
is scanned today (re-verified against the live SCAN_ROOTS table, 17 rows).

The test survives anyway, for reasons unrelated to scan-surface width: every
in-repo path this README names is a backticked code span, never a
`[text](href)` markdown link, and check-doc-links.mjs blanks inline code spans
before its link regex runs by design -- so scanning this file resolves zero
repo-relative targets today (verified: its only 8 markdown links are all
external). The other four assertions compare README prose against
`shadcn-components.json`, a JSON-manifest question no link checker can ask.

Part of objectui#6280.
…AN_ROOTS

Both surface descriptions -- the prose in "Internal Docs Links" and the
two-link-checkers table in "Link Checking" -- ended at "the internal `docs/`
tree and every package `README.md`", the surface as of objectui#3622. It has
widened three times since (objectui#4148, objectui#4938, objectui#6026) and
neither list knew.

Re-derived directly from the live `check-doc-links.mjs` SCAN_ROOTS table (17
rows) rather than from the card history, and cross-checked against the gate's
own printed verdict ("Links are valid across 17 scan roots").

Part of objectui#6280.
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 52 chunks) 3230.8 KB 3266.6 KB
Main entry chunk (gzip) 156.1 KB 350 KB
Entry file index-50RJFVxV.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.84KB 114.57KB
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.95KB 42.75KB
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.87KB 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 25, 2026 21:53
@os-warren
os-warren added this pull request to the merge queue Aug 25, 2026
Merged via the queue into main with commit 64d8886 Aug 25, 2026
29 checks passed
@os-warren
os-warren deleted the claude/issue-6280-scan-surface-claims branch August 25, 2026 22:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants