Skip to content

fix(plugin-list,plugin-view): omit gantt progress/dependencies rather than inventing them (#7499) - #8876

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-7499-gantt-nonaxis-floors
Sep 9, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/issue-7499-gantt-nonaxis-floors

Conversation

@claude

@claude claude Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Fixes #7499

Flavour 3 of #7070 — the half its 2026-09-01 maintainer ruling ordered carded separately and judged on its own terms, ⛔ explicitly forbidding the date-axis conclusion from being imported. The ruling did not decide this card's substance; it decided who decides, and how not to. The substantive call recorded here came from the dispatching PM seat, not the maintainer.

The ruling implemented: OMIT the key when it was not declared

Two faces floored the pair for every gantt view, declared or not:

Face Floors removed
packages/plugin-list/src/ListView.tsx progressField … || 'progress', dependenciesField … || 'dependencies'
packages/plugin-view/src/ObjectView.tsx same

The app-shell face carries neither, verified here rather than inherited: grep -c progressField on packages/app-shell/src/views/ObjectView.tsx returns 1, and that hit is a string in the dev-mode flatKeys diagnostic array — ⛔ not a floor, untouched. || 'progress' in that file counts 0. Control that the zero is not a dead probe: app-shell does floor titleField at 'name' for gantt. Second control: || 'start_date' / || 'end_date' / || 'created_at' count 0 across all three files — the date axes really are retired.

The asymmetry that decides it, and the reason the date-axis conclusion must not be imported:

  • A fabricated date axis has no legitimate twin — every bar lands on a column nobody declared. Whole-chart error. Refusal is right there.
  • A fabricated progress / dependencies name yields a per-row undefined, which is indistinguishable from the legitimate and common case: most gantt rows have neither.

⇒ Refusing would break that common case. Fabricating manufactured a binding the author never wrote, whose failure was silent — an author who spelled the key differently got an accidental hit on a same-named column and no diagnostic. Omission does neither.

Mechanically this is a deletion: both call sites already ended with ...(schema.options?.gantt || {}) / ...(schema.gantt || {}) (resp. ...(viewOptions.gantt || {})), which always had the last word over these two lines. The floor was the only thing they ever contributed, so a declared value still arrives verbatim through either authoring nesting.

⭐ The falsifiable premise, measured FIRST

The only population whose behaviour actually changes: a schema carrying a column literally named progress or dependencies that does NOT declare the corresponding field key. Those work today by accident and stop after omission.

Result: empty. Measured before anything was deleted.

Sharp predicate — a gantt view routed through one of the two floored faces (a list-view with viewType: 'gantt', or a plugin-view ObjectView gantt entry), on data carrying the literal column, without the key declared:

routed gantt-view declarations, whole tree:   8 files
  ∩ carries a literal progress/dependencies column:  2 files
    packages/plugin-list/src/__tests__/ListView.gantt-binding-7070.test.tsx
    packages/plugin-view/src/__tests__/ObjectView.ganttBinding-7070.test.tsx

Both are individually judged not real authored views: they carry the literal string only as the assertion of the floor itself, and they are the two pins this card is chartered to flip. Everything else was excluded on stated grounds, not by hand-waving:

  • examples/schema-catalog/src/schemas/plugin-gantt/*.json — two of the three DO carry a literal dependencies column, and both are out of population on two independent counts: they declare dependenciesField: "dependencies" explicitly, and they are direct type: "object-gantt" schemas, which take getGanttConfig's first branch, where these floors never applied.
  • content/docs/plugins/plugin-gantt.mdx, packages/plugin-gantt/README.md, skills/objectui/guides/page-builder.md — direct object-gantt / gantt renderer usage ('gantt' is registered straight to ObjectGanttRenderer), and every example carrying the literal column declares the key beside it.
  • The three sites in the tree that declare a field-definition literally named progress (plugin-detail percentClip test, plugin-form deriveMasterDetail test, plugin-grid bulk-actions demo) mention gantt zero times.
  • 528 JSON/YAML metadata files swept separately: the only intersection of "declares a gantt view" and "carries a literal progress/dependencies key" is the two example JSONs above.

Positive control that the census can speak. Relaxing exactly one conjunct — dropping "does not declare the key" — turns the same pipeline from 0 sites to 51, and the sharp predicate itself returns 2 rather than 0. A pipeline that returns nothing under every input would have returned nothing here too.

⚠️ Blind-spot reading — a zero with no blind-spot reading is not a measured zero

Blind spot Count Judgement
Non-text files in the corpora, unreadable by grep 75 (74 .png, 1 .xlsx) Individually judged by path: documentation screenshots, plus packages/plugin-grid/demo/sample.xlsx, a spreadsheet-import demo fixture. None is a view-metadata carrier.
Untracked, non-ignored files in the corpora 0 —
Gitignored non-build paths in the corpora 0 —
⚠️ Runtime / backend-supplied metadata unbounded, not in this repo The honest limit. These two faces build gantt configs from schema.gantt / viewOptions.gantt, which in production come from the server's object and listview metadata. The census covers the repo corpus the card named; it cannot see a customer's schema.

Tests

Everything below ran on the tree that is commit 544e95db2.

  • The two pins flipped — ListView.gantt-binding-7070 and ObjectView.ganttBinding-7070, plus the non-regression control plugin-gantt/src/ObjectGantt.unconfiguredRefusal-7070 (⛔ untouched): 3 files, 25 tests passed. The reason for omit-rather-than-refuse is written into the case names and docblocks, which is what finding(views): the gantt and timeline branches still fabricate date-axis field names on all three faces — and app-shell's own #3129 note certifies them as already fixed #7070 left the slot for.
  • Both affected packages in full — packages/plugin-list + packages/plugin-view: 109 files, 1206 tests passed.
  • Every test that reads these two files, enumerated rather than assumed — not just the packages touched. Source-text readers and ledgers: plugin-view/objectViewHostSurface, core/column-identity.ratchet, types/tree-view-config-readers-8253, types/object-kanban-group-by-limit-7322, types/object-view-unmirrored-keys-7779, types/object-kanban-record-source-7780, types/schema-reference-named-list-view-keys-7923, types/zod-mirror-parity, types/gantt-flat-config-declared-keys, types/gantt-dependency-field-deprecated-alias, plugin-grid/gridNonAuthorKeys, plugin-list/forwardref-props-annotation.guard, app-shell/defaults-maps-mirror-en-pack, app-shell/print-stylesheet-4462, app-shell/ObjectView.ganttBinding-7070, and all of packages/plugin-gantt: 77 files / 819 tests, plus a post-commit re-run of the ratchet family and the source-text pins at 544e95db2: 6 files / 162 tests. All green.
  • Type-check — @object-ui/plugin-list and @object-ui/plugin-view, both tsc --noEmit legs including tsconfig.test.json: green. ⚠️ Its first run was red with TS2307 Cannot find module '@object-ui/components' — that was NOT MEASURED, not a failure: the dependency closure was unbuilt. Green only after turbo run build --filter '@object-ui/plugin-list^...' --filter '@object-ui/plugin-view^...'.
  • Lint — measured over the whole population, not narrowed: eslint . --no-inline-config --format json read 4668 files (the count is eslint's own, from its JSON output). All four changed files report 0 errors. The CI-shaped turbo run lint for both packages exits 0. The 94 errors that run reports elsewhere are pre-existing, in files this diff does not touch, and are an artefact of --no-inline-config stripping inline disables — not this repo's lint script.
  • Gates. Derived by hand from this repo's package.json and .github/workflows/ (objectui has no scripts/pm/dispatch-gates.mjs). Green: check:comment-mask-corpus, check:control-bytes, check:doc-examples, check:doc-snippets, check:doc-types, check:dist-completeness, check:readme-exports, check:handler-key-reads, check:icon-record-names, check:docs-route-closure, check:spec-symbols, check:unreferenced-sources, check:element-data-source-declaration, check:doc-example-readers, check:vi-mock-specifiers, check:vi-mock-inherit, check:shell-escape-residue, check:lint-rule-coverage, check:i18n-keys, check:changeset-presence, check:governed-queue-guard --test (NOT GOVERNED, 5 paths). check:doc-examples matters most here — it carries literal line anchors into both edited files (ListView.tsx:808, ObjectView.tsx:618/632/649), all above the deletions; it prints its own verdict, "Every covered @example compiles, or fails exactly as its ledger row declares."
  • ⚠️ Declared NOT MEASURED locally, left to CI: check:eager-closure and check:sdui-registration-pins. Both exit 2 with PREREQUISITE NOT MET wording of their own — "This is exit 2, not a pass", "a broken gauge, not a passing budget" — because they weigh an apps/console bundle that was not built. Reading either as green would be reading a non-measurement as a pass. Neither can move on this diff (no import graph or registration changed), but that is an argument, not a measurement.

Ablation — from the committed tree, the floors put back

Direction predicted before running: the OMITS cases go RED, every declared-value CONTROL stays GREEN, and the refusal-screen control stays GREEN in both worlds.

On-disk proof, taken BEFORE the run — marker counts moved and both blobs diverged from HEAD:

                      pre   post
ListView   || 'progress'       1  ->  2
ListView   || 'dependencies'   1  ->  2
ObjectView || 'progress'       1  ->  2
ObjectView || 'dependencies'   1  ->  2

ListView.tsx    on-disk aaa5803de…  vs HEAD aae0b1da2…   differ
ObjectView.tsx  on-disk f0ca7d425…  vs HEAD c1a807af6…   differ

RED, by test-case name — 4 failed, 21 passed:

GREEN in both worlds — the real controls: CONTROL: a DECLARED \dependenciesField` still passes verbatim, CONTROL: the legacy `options.gantt` nesting carries the pair verbatim too, CONTROL: a DECLARED `progressField` / `dependenciesField` still passes verbatim, every #7070 date-axis case, and all **5** cases of ObjectGantt.unconfiguredRefusal-7070— including "refuses even when the out-of-scopeprogress/dependenciesfloors are still handed in".getGanttConfig` gates on the two date fields alone, so removing this pair cannot resurrect a config; the refusal screen is exactly as reachable as before.

Restore proven BY STATE, not by exit code: git diff HEAD empty, git status --porcelain empty, and both on-disk blobs back to their HEAD hashes (aae0b1da2…, c1a807af6…). The mutation script restored through a trap … EXIT INT TERM using absolute paths and git checkout HEAD -- … — never a bare git checkout --, which reads the index. Re-ran the three files from the restored tree: 25/25 green.

Clause-② — no, measured, with a control that speaks

Removing a fabricated default is a narrowing: no new exported symbol, no new key on a published payload.

check-widening-tells --self-test                          exit 0   (150 cases)
check-widening-tells --declaration no --diff THIS-PR.diff    exit 0   "no widening tell on any declared surface"

⚠️ That bare CLI reading is a dead probe for this repo, and only the required control caught it. Appending one added key on packages/types/src/zod/objectql.zod.ts — a file the tool's declared objectui mirror row covers — to a copy of this very diff and re-running the identical command still exits 0. The CLI has no --repo flag and main() never passes one, so it always judges as objectstack, where that row is inert.

The measurement that does speak, via the module's own exported judge:

CONTROL diff, repo=objectstack-ai/objectui       state = refused  (T1, packages/types/src/zod/objectql.zod.ts)
THIS PR diff, repo=objectstack-ai/objectui       state = clean
CONTROL diff, repo defaulted (what the CLI does) state = clean     ... THE DEAD-PROBE LEG

⇒ The control fires, this diff is clean. Clause-②: no. No needs:contract-review label, so nothing parks.

The CLI gap is filed as objectstack#17217, a sub-issue of the open objectstack#17112, which edits the same output line. ⛔ The enqueue gate is not affected — check-clause2-carriers.mjs threads the repo correctly via PM_SWEEP_REPO / GITHUB_REPOSITORY; the trap is only the hand-run CLI.

验收备注

What this omission means for dependencyField (#6470) — ⛔ not woken, but it moves. getGanttConfig's flat branch reads schema.dependenciesField || schema.dependencyField. While the floor stood, dependenciesField was always truthy through these two faces, so the declared legacy singular alias was unreachable via them — shadowed, never read, for as long as the floor existed. With the floor gone the alias limb becomes live: a view that wrote dependencyField now resolves through it, which is what its @deprecated contract already promises and what ObjectGantt.dependencyAlias already pins at the renderer. Measured: zero sites at either routed face declare dependencyField, so no in-repo view moves. Whether the alias is retired or sanctioned remains #6470's question, deliberately untouched here — but a future retirement should know that this PR is what made the alias reachable through the view layer at all.

Out-of-scope findings.

  • Filed as objectstack#17217 (sub-issue of objectstack#17112): check-widening-tells.mjs's CLI cannot be told the repo, so its declared objectui mirror surface is unreachable and every objectui diff reads clean. Reproduction and controls in the card.
  • noted, not filed: the ablation's CONTROL: declaring ONE of the pair leaves the other absent is named as a control but asserts an omission, so it fails under the mutation like a measurement. Cosmetic naming only; the case is correct and the file already carries three true two-world controls. Taker: whoever next edits ObjectView.ganttBinding-7070.test.tsx.
  • noted, not filed: packages/plugin-list/src/ListView.tsx and packages/plugin-view/src/ObjectView.tsx both compute startDateField / endDateField into a conditional spread that the trailing ...(schema.gantt || {}) would deliver anyway — the same redundancy this PR removed for the non-axis pair, left in place because the date axes are ⛔ out of scope for this card. Not a defect; the explicit form is arguably clearer. Taker: whoever next revisits the finding(views): the gantt and timeline branches still fabricate date-axis field names on all three faces — and app-shell's own #3129 note certifies them as already fixed #7070 date-axis shape.

Risks

Low, and the shape of the risk is stated rather than assumed. The only behaviour that moves is the accidental-hit population, measured empty in this repo and unbounded outside it. A deployment carrying a progress column and a gantt view that never declared progressField loses its progress fill — silently, exactly as silently as it gained it. If that turns out to matter for a real tenant, the alternative the census was there to trigger — keep the floor and document it, or omit plus a migration note — is a maintainer call, not this PR's.

Rollback: revert the commit. Both faces are pure deletions inside one case 'gantt' branch; nothing else in either file was touched, and no other package depends on the removed keys being present.

🤖 Generated with Claude Code

https://claude.ai/code/session_01611D6ZaRaMmwTNQmSbk8MH


Generated by Claude Code

… than inventing them (objectui#7499)

Flavour 3 of objectui#7070 — the half its 2026-09-01 ruling ordered carded
separately, explicitly forbidding the date-axis conclusion from being imported.

Two faces floored `progressField` at `'progress'` and `dependenciesField` at
`'dependencies'` for every gantt view, declared or not. app-shell carries
neither key (measured; its `titleField` floor is the control proving that zero
is not a dead probe).

The remedy is OMIT, not refuse. A fabricated date axis has no legitimate twin —
every bar lands on a column nobody declared — whereas a fabricated
progress/dependencies name yields a per-row `undefined`, indistinguishable from
the legitimate and common case: most gantt rows have neither. Refusing would
break that common case; fabricating manufactured a binding the author never
wrote, and its failure was silent.

Declared values still pass verbatim through the existing `gantt` /
`options.gantt` spreads, which always had the last word over these two lines —
the floor was all they ever contributed.

The two pins #7070 left as a declaration slot are flipped here, with the reason
on the cases. `ObjectGantt.unconfiguredRefusal-7070` is the non-regression
control and stays green: `getGanttConfig` gates on the two date fields alone.

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

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3486.9 KB 3512.7 KB
Main entry chunk (gzip) 144.1 KB 350 KB
Entry file index-C7QCzT18.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) 16.69KB 6.21KB
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) 11.08KB 4.58KB
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) 500.23KB 114.67KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 26.68KB 8.94KB
data-objectstack (index.js) 198.39KB 55.29KB
fields (index.js) 246.94KB 62.28KB
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) 13.52KB 4.88KB
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) 8.39KB 3.10KB
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) 14.81KB 3.63KB
plugin-calendar (index.js) 49.03KB 13.93KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 194.54KB 46.34KB
plugin-dashboard (index.js) 131.50KB 34.45KB
plugin-designer (index.js) 215.51KB 44.29KB
plugin-detail (index.js) 252.45KB 65.33KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.26KB 34.13KB
plugin-gantt (index.js) 166.96KB 40.93KB
plugin-grid (index.js) 210.86KB 57.28KB
plugin-kanban (index.js) 57.53KB 16.46KB
plugin-list (index.js) 112.54KB 27.65KB
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.55KB 3.32KB
plugin-view (index.js) 84.42KB 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.93KB 1.49KB
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 (strict-authoring-face.js) 14.27KB 5.47KB
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-zhuang
os-zhuang marked this pull request as ready for review September 9, 2026 18:36
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 9, 2026
Merged via the queue into main with commit 4c2e1d7 Sep 9, 2026
35 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-7499-gantt-nonaxis-floors branch September 9, 2026 18:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants