Skip to content

fix(plugin-calendar): authored events never reaches CalendarView's events prop (#4433) - #4455

Merged
yinlianghui merged 3 commits into
mainfrom
claude/issue-4433-calendar-events-crash
Aug 12, 2026
Merged

fix(plugin-calendar): authored events never reaches CalendarView's events prop (#4433)#4455
yinlianghui merged 3 commits into
mainfrom
claude/issue-4433-calendar-events-crash

Conversation

@yinlianghui

@yinlianghui yinlianghui commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

Fixes #4433

The calendar-view renderer computed a CalendarEvent[] from schema.data, passed it as events={…}, then spread the remaining props after it. SchemaRenderer forwards a node's events key as a plain prop — it is not on that renderer's strip list — so a node authoring events, the ordinary SDUI action metadata of AGENTS.md section 4 that is legal on any node, landed its { onClick: [...] } object on the array prop and CalendarView threw events is not iterable.

The authored key is destructured out before the spread, per the #4357 / PR #4428 deny-list precedent. The computed array always wins.

The semantics measurement first (ruling condition 1a)

Did authored events ever do anything on this node type? No — measured, and it never could.

  • Nothing in the renderer layer consumes a node's events key. Grepped across packages/react/src, packages/core/src/{registry,actions} and packages/components/src/renderers: SchemaRenderer forwards events as a prop and no consumer reads it. Re-measured after this branch merged origin/main (feat(lint): require an explicit type on plain button elements; fix the 114-site population (#4045) #4450 touches SchemaRenderer.tsx): the strip-list destructure at SchemaRenderer.tsx still names only dataSource, _hidden, _disabled and responsiveStyles, and the string events does not occur anywhere in that file. The one .events hit in the renderer/core layer is object-validation-engine.ts's validation-rule field, which is unrelated to a node key.
  • This repo's action path is properties.action executed through ActionRunner — the wiring element:button uses.
  • packages/types does declare EventableSchema.events, but as UIEventHandler[] — a different shape from the { onClick: [...] } map, and nothing runtime reads either one.
  • On calendar-view specifically the key reached exactly one place: CalendarView's events prop, whose declared type is CalendarEvent[]. CalendarView takes a fixed prop list and spreads nothing onto the DOM, so the key had no other destination.

So this strip disables nothing. Pre-existing state, not a regression: the key was a landmine, never a feature. The component's real action channel is onAction, and the last test case pins it still firing while events is authored.

The collision grading (ruling condition 1b)

Every prop the renderer declares before the spread, plus the neighbouring surface, measured node-by-node through the real SDUI host rather than reasoned about:

computed prop reachable by an authored key? measured behaviour grade action
events yes, both channels (node key and props: { events }) OBJECT → error boundary, events is not iterable. ARRAY → no throw, the authored array silently replaced the computed calendar crash-capable and data-destroying fixed here
className no destructured out of the renderer's own params, so the rest object cannot carry it; SchemaRenderer also assigns className after the node's props container. Authored props.className never reached the region; node-level className composes correctly not exposed none
onEventClick yes, both channels renders normally; a click throws onEventClick is not a function as an uncaught window error — React does not route event-handler errors to SchemaErrorBoundary crash-capable, but needs a contract decision filed #4453

⚠️ Flagged deviation from ruling condition 1b, deliberately not silent. The condition reads "fix the crash-capable ones, record the benign ones", and onEventClick graded crash-capable yet is not fixed here. Unlike events it has a producer that works today: a React host rendering SchemaRenderer schema={…} onEventClick={fn} reaches the same channel through the renderer's trailing ...props, and that is the component's genuine escape hatch. The key name cannot separate the working producer from the broken one — only the value's type can — so closing it is a choice between breaking a live path, adding value-type discrimination (AGENTS.md #0.1's lenient-coercion shape), or bounding the spread by declaration (#4425 phase 2). That is a contract decision this card's ruling did not make, so it is filed rather than guessed — but if the ruling intends onEventClick closed inside this card, this PR should be re-titled Part of #4433 and #4453 folded in instead.

The remaining canaries (bind, props, ariaLabel, ariaDescribedBy, dataSource, schema, the authored open tail) reach CalendarView and are dropped there — it names its props and never spreads onto an element. That is why plugin-calendar measured zero leaks in the phase-1 sweep, and it stays true with events back in the set.

Red-first evidence — re-derived on the final tree

The fix is already committed, so the red is re-established by mutation: revert only packages/plugin-calendar/src/calendar-view-renderer.tsx to its pre-fix blob (git checkout c10c16c12^ -- path), keep the new tests and the gate flip, run, then restore with git checkout HEAD -- path and confirm git status --porcelain is empty. Never git stash — that stack is shared across worktrees.

Verbatim, on the post-merge tree:

 × renders the calendar for a node whose only authored key is `events` 1125ms
 × still displays the events computed from `schema.data` when `events` is authored 1033ms
 × does not let an authored `events` ARRAY replace the computed events 1090ms
 × leaves the component's own action channel working while `events` is authored 1027ms
 × plugin-calendar:calendar-view 10062ms
 × authoring `events` on a calendar-view node renders the calendar 1027ms

 Test Files  2 failed (2)
      Tests  6 failed | 37 passed (43)

with the card's own reported DOM, captured by the sweep's readiness failure:

Component "plugin-calendar:calendar-view" failed to render
events is not iterable

Reverse verification — direction predicted first

case predicted observed
the 3 crash-shaped new cases red, error boundary, expected null not to be null exactly that
"authored events ARRAY" case red differently — an array is iterable, so it renders and fails on the missing Computed Standup exactly that: TestingLibraryElementError: Unable to find role="button" and name "Computed Standup"
the flipped sweep pin red, region never appears exactly that: expected null not to be null
sweep case plugin-calendar:calendar-view red on the readiness selector, not on the error-boundary assertion or a leak diff — readiness is checked first exactly that: readiness selector `[role="region"][aria-label="Calendar"]` never matched
plugin-calendar:object-calendar, view:calendar green — they render through ObjectCalendarRenderer, the mutation cannot reach them green
every charts / chatbot / dashboard target, both calibration fixtures, the ledger cases green, untouched controls green (37 passed alongside the 6 red)

Six red, each in its predicted direction. Correction to an earlier revision of this body: it reported the itemized six but summarised them as "5 tests failed, 7 files" — a miscount, with the file count carried over from a run that still included a since-deleted scratch probe. The re-derivation above is the measured truth: 2 failed (2) files, 6 failed | 37 passed (43) tests. The per-case directions, which are the substance, were right both times; only the arithmetic under them was wrong, and it is corrected rather than quietly dropped.

Post-fix the same four new cases are green, and the second one is the one that matters for "protected into emptiness": with data and authored events present, Computed Standup and Computed Review both render. The third pins the quiet half — pre-fix the authored array rendered Authored Overwrite and the computed events were gone; post-fix the computed events are back and the authored title is absent.

The gate's two halves, together

  • CALENDAR_VIEW_OMITS and the target's omitCanaries entry are removed: plugin-calendar:calendar-view is swept with the full canary set, events included, and passes — so no leak was hiding behind the crash.
  • The dedicated pin flipped: from "authoring events throws instead of rendering" to "authoring events renders the calendar", asserting role="region" aria-label="Calendar" with no error boundary.
  • The pin is kept rather than deleted because it is the diagnosis the sweep case cannot be: the sweep plants the whole canary set at once and can only say "calendar-view broke", while this one plants events alone and names the key.
  • The omitCanaries facility itself stays, with no current user. It carries the discipline the docblock spells out — a withheld canary is a recorded defect with its own pin, never a quiet exemption — which finding(plugin-dashboard): the #3291 toDomProps whitelist stops at packages/fields — SDUI widgets elsewhere still close their DOM leak by hand, if at all #4425 phase 2 will need the next time a target cannot take the full set. Flagged here as a deliberate non-removal, not an oversight.
  • The file's top docblock said plugin-calendar was clean "only because its one spreading target is swept with a canary WITHHELD". That sentence is now false, so it was corrected to the measured reason.

Depends on #4441 (the gate file is its surface), which is in main at 716c5ae91.

Verification — all re-run on the final tree, after merging origin/main

pnpm --filter '@object-ui/plugin-calendar^...' --filter '@object-ui/app-shell^...' build   exit 0 (closure first)
pnpm exec vitest run packages/plugin-calendar/ \
  packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx
      → Test Files  6 passed (6)      Tests  62 passed (62)
pnpm --filter @object-ui/plugin-calendar type-check    exit 0 — BOTH passes (tsc --noEmit && tsc -p tsconfig.test.json)
pnpm --filter @object-ui/app-shell     type-check      exit 0 — BOTH passes
eslint (the three touched source/test files)           exit 0 — 0 errors (4 pre-existing warnings: 3 `any` on the
                                                       signature line the fix reformats, 1 unused `handleAddClick`, which is #4454)
node scripts/check-control-bytes.mjs                   exit 0 — 4160 tracked text files scanned, clean

Repo-root vitest with paths relative to the repo root, per AGENTS.md 怎么跑测试. origin/main moved again mid-flight (#4450, #4449, #4447, #4448 — including a change to SchemaRenderer.tsx and a new button-has-type lint rule); it was merged in with no conflicts (the four touched paths are disjoint from all of it), and every command above was run after that merge.

Changeset: patch on @object-ui/plugin-calendar — measured, not assumed. calendar-view-renderer.tsx has no exports (it is a registration side-effect module, pulled in by import './calendar-view-renderer'), and building the package pre-fix and post-fix emits a byte-identical dist/index.d.ts (433 bytes both ways, diff empty). No exported type moves, so the ruling's grade-up condition does not fire, and never major. The app-shell half is test-only and correctly carries no changeset of its own.

Filed from the measurement


Generated by Claude Code

claude added 2 commits August 12, 2026 08:53
…events prop (#4433)

The calendar-view renderer computed a CalendarEvent[] from schema.data, passed
it as `events={…}`, then spread the remaining props AFTER it. SchemaRenderer
forwards a node's `events` key as a plain prop, so a node authoring `events` —
ordinary SDUI action metadata, legal on any node — landed its `{ onClick: [...] }`
object on the array prop and CalendarView threw `events is not iterable`.

The authored key is destructured out before the spread (the #4357 / PR #4428
deny-list precedent), so the computed array always wins. This also closes the
quiet half: an authored `events` ARRAY never threw, it silently replaced the
calendar's contents with itself.

Both halves of the #4425 sweep gate come out together: the CALENDAR_VIEW_OMITS
withheld canary is gone (calendar-view is swept with the full canary set again)
and the dedicated crash pin flips to asserting the calendar renders.
@vercel

vercel Bot commented Aug 12, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Aug 12, 2026 9:31am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 24.7 KB 350 KB
Entry file index-JY9dt9x3.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 9.56KB 3.59KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 8.92KB 3.41KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
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) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 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.65KB 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) 489.20KB 108.43KB
core (index.js) 2.99KB 1.14KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 153.42KB 41.19KB
fields (index.js) 228.99KB 56.82KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 3.35KB 1.38KB
i18n (pickLocalized.js) 3.69KB 1.73KB
i18n (provider.js) 23.12KB 7.62KB
i18n (useDisplayLocale.js) 2.33KB 1.20KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 7.77KB 3.13KB
layout (index.js) 38.98KB 10.85KB
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.74KB
mobile (index.js) 1.50KB 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.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 45.24KB 12.46KB
plugin-charts (index.js) 62.01KB 17.63KB
plugin-chatbot (index.js) 181.17KB 43.03KB
plugin-dashboard (index.js) 120.75KB 31.38KB
plugin-designer (index.js) 211.16KB 42.76KB
plugin-detail (index.js) 239.03KB 59.77KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 114.58KB 27.68KB
plugin-gantt (index.js) 164.14KB 39.98KB
plugin-grid (index.js) 187.99KB 49.92KB
plugin-kanban (index.js) 48.60KB 13.41KB
plugin-list (index.js) 110.21KB 26.79KB
plugin-map (index.js) 18.05KB 5.80KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.99KB 10.74KB
plugin-timeline (index.js) 26.21KB 7.52KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.03KB 20.55KB
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.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 23.71KB 7.96KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.23KB 0.66KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
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) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 0.20KB 0.18KB
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-retry.js) 4.32KB 2.02KB
types (index.js) 3.05KB 1.52KB
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 (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
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

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 24.7 KB 350 KB
Entry file index-kL9xUlWO.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 9.56KB 3.59KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 8.92KB 3.41KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
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) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 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.65KB 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) 489.32KB 108.45KB
core (index.js) 2.99KB 1.14KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 153.42KB 41.19KB
fields (index.js) 228.99KB 56.82KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 3.35KB 1.38KB
i18n (pickLocalized.js) 3.69KB 1.73KB
i18n (provider.js) 23.12KB 7.62KB
i18n (useDisplayLocale.js) 2.33KB 1.20KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 7.77KB 3.13KB
layout (index.js) 38.98KB 10.85KB
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.74KB
mobile (index.js) 1.50KB 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.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 45.24KB 12.46KB
plugin-charts (index.js) 62.01KB 17.63KB
plugin-chatbot (index.js) 181.17KB 43.03KB
plugin-dashboard (index.js) 120.75KB 31.38KB
plugin-designer (index.js) 212.58KB 42.83KB
plugin-detail (index.js) 239.03KB 59.77KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 114.58KB 27.68KB
plugin-gantt (index.js) 164.14KB 39.98KB
plugin-grid (index.js) 187.99KB 49.92KB
plugin-kanban (index.js) 48.62KB 13.42KB
plugin-list (index.js) 110.20KB 26.79KB
plugin-map (index.js) 18.16KB 5.81KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.99KB 10.74KB
plugin-timeline (index.js) 26.21KB 7.52KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.08KB 20.55KB
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.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 23.73KB 7.96KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.23KB 0.66KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
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) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 0.20KB 0.18KB
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-retry.js) 4.32KB 2.02KB
types (index.js) 3.05KB 1.52KB
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 (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
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

Copy link
Copy Markdown
Collaborator Author

ACCEPT — step-7 复核 by PM session session_017Qqyix2QcnpUC9XeYVDzx3 (wind-down mode, focused review).

Flipping ready + arming auto-merge. Slot NOT refilled per maintainer's wind-down instruction.


Generated by Claude Code


Generated by Claude Code

@yinlianghui
yinlianghui marked this pull request as ready for review August 12, 2026 09:40
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 12, 2026
Merged via the queue into main with commit 49b9de6 Aug 12, 2026
21 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-4433-calendar-events-crash branch August 12, 2026 09:41
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.

plugin-calendar: authoring events on a calendar-view node crashes the component — the SDUI action object overwrites the computed CalendarEvent array

2 participants