refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held - #7511

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone
Sep 3, 2026
Merged

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held#7511
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes#7421

Head sha 73ef5ec7a. Every reading below was taken on that tree.

What changed

Two lines out, two lines in, one file:

  • Outconst taskListWidth_LEGACY_REMOVED = null; from the GanttView body (and the whitespace-only line it left behind).
  • In — the one fact its trailing comment was carrying, moved to the site that owns it. The useResizeObserver call site now names the observed container width as the source the auto-sized row height, base column width and task-list pane width all derive from. Triage asked for exactly this: "the trailing comment records where the value went. If that fact is not already stated at the useResizeObserver call site, carry it there rather than deleting it with the line." It was not stated there — checked at the call site, GanttView.tsx:875, which had no comment at all.

Plus an empty-frontmatter changeset: packages/plugin-gantt/src is released source, so the presence gate wants a declaration, and there is nothing to release.

Liveness probe, with the control that fired

The premise holds. Probed the declaration form and the read sites separately, never the bare word:

probeshaperesult
declarationgit grep -E '\b(const|let|var|function|class|interface|type|enum)\s+taskListWidth_LEGACY_REMOVED\b'1packages/plugin-gantt/src/GanttView.tsx:2323, its own binding
read sitesthe same grep for the identifier, minus lines matching the binder form0
controltaskListWidthidentical two shapes3 declaration lines, 20 read sites
controlrowHeightidentical two shapes2 declaration lines, 360 read sites

Both controls fired in the same run as the zero, so the zero is a reading. objectstack was swept too: 0 files / 0 lines for taskListWidth_LEGACY_REMOVEDand for the bare taskListWidth, in a run where the controls gantt (94 files / 359 lines) and rowHeight (34 / 74) fired — no spec, zod or type declaration of this key exists in the platform repo.

The word-count trap this card sits on, measured rather than trusted: in GanttView.tsx, \btaskListWidth\b goes 21 to 20 across this diff, not 21 to 0, because the tombstone's own comment said taskListWidth once. A word count would read that as "the key survives". The declaration-form count goes 1 to 0.

Reverse verification

Committed first, then mutated: the pre-fix file restored from the base commit under trap … EXIT INT TERM with an absolute path.

  • Mutation proved on disk — blob 756df02d3 becomes 96033b44f; the deleted text greps 0 to 1, the injected comment greps 1 to 0.
  • Restore proved by state, not by exit code — blob back to 756df02d3, byte-equal to HEAD's; git diff HEAD prints nothing; the greps read 0 and 1 again.
  • No rebuild leg is owed here: both gates read source directly (ESLint lints the file, Vitest resolves packages/plugin-gantt/src through the root config), so no dist/ sits between the mutation and the reading.

What moved, and what stayed:

readingtombstone presenttombstone deleted
eslint . on the package354 problems (0 errors), GanttView.tsx 17353 problems (0 errors), GanttView.tsx16
the specific message2323:9 warning 'taskListWidth_LEGACY_REMOVED' is assigned a value but never used @typescript-eslint/no-unused-varsabsent
control warning 'currentDate' is assigned a value but never usedpresentpresent
vitest run packages/plugin-gantt/src62 files, 485 passed62 files, 485 passed

⚠️ A correction to the card, from that table. The card says this line is something "the compiler and lint have no reason to complain about". Lint did complain: ESLint flagged it as @typescript-eslint/no-unused-vars. It never failed CI because unused vars sit at warning severity in this repo, while #7332 lifted only unused imports to error. The card's conclusion is unaffected — but the line was not invisible to the tooling, it was one row inside a 353-warning backlog.

No behavioural pin exists here and none was invented. The deleted binding was null with zero readers, so nothing observable distinguishes the two trees — and the table shows it: the suite is 485-green on both sides. The honest red/green is the lint reading above, from a rule that already existed.

Gates, each quoted from its own verdict line

Dependency closure built first (pnpm --filter '@object-ui/plugin-gantt^...' build, exit 0), so nothing below is a could-not-run.

  • pnpm --filter @object-ui/plugin-gantt type-check — exit 0, running tsc --noEmit && tsc -p tsconfig.test.json (both, the second being the test project).
  • pnpm --filter @object-ui/plugin-gantt lint — exit 0: ✖ 353 problems (0 errors, 353 warnings), all pre-existing, none in the lines this diff touches.
  • pnpm exec vitest run --maxWorkers=2 packages/plugin-gantt/src from the repo root (a package-cwd run is refused, objectui#3378) — Test Files 62 passed (62) / Tests 485 passed (485).
  • node scripts/check-changeset-presence.mjs✅ 1 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) … Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption and a complete answer to this gate.
  • node scripts/check-changeset-no-major.mjs✅ No changeset declares a 'major' bump.
  • node scripts/check-control-bytes.mjs✅ check-control-bytes: OK (scanned 6195 tracked text file(s); skipped 85 binary).

Declared narrowing. The repo lint job is turbo run lint, i.e. per-package eslint .; only the one package this diff touches was linted. The three readings that make that a measurement rather than a skip: the population comes from ESLint's own config resolution, not from my guess — eslint . --format json reports 92 files linted in packages/plugin-gantt; the counts above are that run's; and eslint.config.js configures no type-aware linting (no parserOptions.project, no projectService), so this diff cannot move the verdict of any file it does not contain. CI runs the full farm regardless.

Not in scope

Clause-②: no. The diff removes a function-local const and adds a comment — no exported symbol, prop, type, zod schema or spec key moves, so nothing on the published accept surface changes. The declaration check was derived, not assumed from the _LEGACY_REMOVED spelling; the sweep is in the claim comment on the card.

#7228 — the same file's other dead sizing arm, columnWidthForContainer returning 110 from all three branches — is deliberately untouched here and remains open.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC


Generated by Claude Code

…one fact it held
`GanttView` carried `const taskListWidth_LEGACY_REMOVED = null` in its body, left
behind by the finished task-list-width refactor. Measured on `origin/main`
`a27d153c2`: the identifier occurred exactly once in the repo — its own declaration
— and zero times in a read position, in a probe run where the same shape returned 20
read sites for the live `taskListWidth` and 360 for `rowHeight`. Nothing in
objectstack declared it either (0 files, controls `gantt` 94 and `rowHeight` 34 fired
in that run). It bound `null`, so it carried no state, no side effect and no
contract surface.
What it did carry was a false signal: a name spelling `_LEGACY_REMOVED`, sitting a
few hundred lines below the real derivation, reads as a seam retained for a reason
recorded elsewhere, and the next reader goes looking for that reason.
Its trailing comment held one fact worth keeping — the width now comes from the
container `useResizeObserver` — and that fact was stated nowhere at the observer
call site. It moves there instead of dying with the line: the observed container
width is named as the source the auto-sized row height, base column width and
task-list pane width all derive from.
Pure deletion of an inert binding plus a comment: no behaviour changes, so the
changeset declares an empty frontmatter (releasing nothing).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 50 chunks)3181.9 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-nXe7vDDx.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.19KB117.80KB
core (index.js)6.12KB2.42KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)242.42KB61.26KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)34.34KB9.17KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)48.12KB13.34KB
plugin-charts (index.js)70.87KB19.72KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.82KB34.64KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.07KB64.12KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.50KB41.08KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)52.71KB14.55KB
plugin-list (index.js)113.33KB27.60KB
plugin-map (index.js)20.55KB6.80KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.84KB8.85KB
plugin-tree (index.js)9.40KB3.23KB
plugin-view (index.js)85.22KB20.93KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.63KB1.70KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(plugin-gantt): taskListWidth_LEGACY_REMOVED is a declared-and-never-read const null left behind by a finished refactor

2 participants

@os-project-manager@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held - #7511

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone
Sep 3, 2026
Merged

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held#7511
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes#7421

Head sha 73ef5ec7a. Every reading below was taken on that tree.

What changed

Two lines out, two lines in, one file:

  • Outconst taskListWidth_LEGACY_REMOVED = null; from the GanttView body (and the whitespace-only line it left behind).
  • In — the one fact its trailing comment was carrying, moved to the site that owns it. The useResizeObserver call site now names the observed container width as the source the auto-sized row height, base column width and task-list pane width all derive from. Triage asked for exactly this: "the trailing comment records where the value went. If that fact is not already stated at the useResizeObserver call site, carry it there rather than deleting it with the line." It was not stated there — checked at the call site, GanttView.tsx:875, which had no comment at all.

Plus an empty-frontmatter changeset: packages/plugin-gantt/src is released source, so the presence gate wants a declaration, and there is nothing to release.

Liveness probe, with the control that fired

The premise holds. Probed the declaration form and the read sites separately, never the bare word:

probeshaperesult
declarationgit grep -E '\b(const|let|var|function|class|interface|type|enum)\s+taskListWidth_LEGACY_REMOVED\b'1packages/plugin-gantt/src/GanttView.tsx:2323, its own binding
read sitesthe same grep for the identifier, minus lines matching the binder form0
controltaskListWidthidentical two shapes3 declaration lines, 20 read sites
controlrowHeightidentical two shapes2 declaration lines, 360 read sites

Both controls fired in the same run as the zero, so the zero is a reading. objectstack was swept too: 0 files / 0 lines for taskListWidth_LEGACY_REMOVEDand for the bare taskListWidth, in a run where the controls gantt (94 files / 359 lines) and rowHeight (34 / 74) fired — no spec, zod or type declaration of this key exists in the platform repo.

The word-count trap this card sits on, measured rather than trusted: in GanttView.tsx, \btaskListWidth\b goes 21 to 20 across this diff, not 21 to 0, because the tombstone's own comment said taskListWidth once. A word count would read that as "the key survives". The declaration-form count goes 1 to 0.

Reverse verification

Committed first, then mutated: the pre-fix file restored from the base commit under trap … EXIT INT TERM with an absolute path.

  • Mutation proved on disk — blob 756df02d3 becomes 96033b44f; the deleted text greps 0 to 1, the injected comment greps 1 to 0.
  • Restore proved by state, not by exit code — blob back to 756df02d3, byte-equal to HEAD's; git diff HEAD prints nothing; the greps read 0 and 1 again.
  • No rebuild leg is owed here: both gates read source directly (ESLint lints the file, Vitest resolves packages/plugin-gantt/src through the root config), so no dist/ sits between the mutation and the reading.

What moved, and what stayed:

readingtombstone presenttombstone deleted
eslint . on the package354 problems (0 errors), GanttView.tsx 17353 problems (0 errors), GanttView.tsx16
the specific message2323:9 warning 'taskListWidth_LEGACY_REMOVED' is assigned a value but never used @typescript-eslint/no-unused-varsabsent
control warning 'currentDate' is assigned a value but never usedpresentpresent
vitest run packages/plugin-gantt/src62 files, 485 passed62 files, 485 passed

⚠️ A correction to the card, from that table. The card says this line is something "the compiler and lint have no reason to complain about". Lint did complain: ESLint flagged it as @typescript-eslint/no-unused-vars. It never failed CI because unused vars sit at warning severity in this repo, while #7332 lifted only unused imports to error. The card's conclusion is unaffected — but the line was not invisible to the tooling, it was one row inside a 353-warning backlog.

No behavioural pin exists here and none was invented. The deleted binding was null with zero readers, so nothing observable distinguishes the two trees — and the table shows it: the suite is 485-green on both sides. The honest red/green is the lint reading above, from a rule that already existed.

Gates, each quoted from its own verdict line

Dependency closure built first (pnpm --filter '@object-ui/plugin-gantt^...' build, exit 0), so nothing below is a could-not-run.

  • pnpm --filter @object-ui/plugin-gantt type-check — exit 0, running tsc --noEmit && tsc -p tsconfig.test.json (both, the second being the test project).
  • pnpm --filter @object-ui/plugin-gantt lint — exit 0: ✖ 353 problems (0 errors, 353 warnings), all pre-existing, none in the lines this diff touches.
  • pnpm exec vitest run --maxWorkers=2 packages/plugin-gantt/src from the repo root (a package-cwd run is refused, objectui#3378) — Test Files 62 passed (62) / Tests 485 passed (485).
  • node scripts/check-changeset-presence.mjs✅ 1 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) … Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption and a complete answer to this gate.
  • node scripts/check-changeset-no-major.mjs✅ No changeset declares a 'major' bump.
  • node scripts/check-control-bytes.mjs✅ check-control-bytes: OK (scanned 6195 tracked text file(s); skipped 85 binary).

Declared narrowing. The repo lint job is turbo run lint, i.e. per-package eslint .; only the one package this diff touches was linted. The three readings that make that a measurement rather than a skip: the population comes from ESLint's own config resolution, not from my guess — eslint . --format json reports 92 files linted in packages/plugin-gantt; the counts above are that run's; and eslint.config.js configures no type-aware linting (no parserOptions.project, no projectService), so this diff cannot move the verdict of any file it does not contain. CI runs the full farm regardless.

Not in scope

Clause-②: no. The diff removes a function-local const and adds a comment — no exported symbol, prop, type, zod schema or spec key moves, so nothing on the published accept surface changes. The declaration check was derived, not assumed from the _LEGACY_REMOVED spelling; the sweep is in the claim comment on the card.

#7228 — the same file's other dead sizing arm, columnWidthForContainer returning 110 from all three branches — is deliberately untouched here and remains open.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC


Generated by Claude Code

…one fact it held
`GanttView` carried `const taskListWidth_LEGACY_REMOVED = null` in its body, left
behind by the finished task-list-width refactor. Measured on `origin/main`
`a27d153c2`: the identifier occurred exactly once in the repo — its own declaration
— and zero times in a read position, in a probe run where the same shape returned 20
read sites for the live `taskListWidth` and 360 for `rowHeight`. Nothing in
objectstack declared it either (0 files, controls `gantt` 94 and `rowHeight` 34 fired
in that run). It bound `null`, so it carried no state, no side effect and no
contract surface.
What it did carry was a false signal: a name spelling `_LEGACY_REMOVED`, sitting a
few hundred lines below the real derivation, reads as a seam retained for a reason
recorded elsewhere, and the next reader goes looking for that reason.
Its trailing comment held one fact worth keeping — the width now comes from the
container `useResizeObserver` — and that fact was stated nowhere at the observer
call site. It moves there instead of dying with the line: the observed container
width is named as the source the auto-sized row height, base column width and
task-list pane width all derive from.
Pure deletion of an inert binding plus a comment: no behaviour changes, so the
changeset declares an empty frontmatter (releasing nothing).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 50 chunks)3181.9 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-nXe7vDDx.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.19KB117.80KB
core (index.js)6.12KB2.42KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)242.42KB61.26KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)34.34KB9.17KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)48.12KB13.34KB
plugin-charts (index.js)70.87KB19.72KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.82KB34.64KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.07KB64.12KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.50KB41.08KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)52.71KB14.55KB
plugin-list (index.js)113.33KB27.60KB
plugin-map (index.js)20.55KB6.80KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.84KB8.85KB
plugin-tree (index.js)9.40KB3.23KB
plugin-view (index.js)85.22KB20.93KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.63KB1.70KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(plugin-gantt): taskListWidth_LEGACY_REMOVED is a declared-and-never-read const null left behind by a finished refactor

2 participants

@os-project-manager@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held - #7511

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone
Sep 3, 2026
Merged

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held#7511
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes#7421

Head sha 73ef5ec7a. Every reading below was taken on that tree.

What changed

Two lines out, two lines in, one file:

  • Outconst taskListWidth_LEGACY_REMOVED = null; from the GanttView body (and the whitespace-only line it left behind).
  • In — the one fact its trailing comment was carrying, moved to the site that owns it. The useResizeObserver call site now names the observed container width as the source the auto-sized row height, base column width and task-list pane width all derive from. Triage asked for exactly this: "the trailing comment records where the value went. If that fact is not already stated at the useResizeObserver call site, carry it there rather than deleting it with the line." It was not stated there — checked at the call site, GanttView.tsx:875, which had no comment at all.

Plus an empty-frontmatter changeset: packages/plugin-gantt/src is released source, so the presence gate wants a declaration, and there is nothing to release.

Liveness probe, with the control that fired

The premise holds. Probed the declaration form and the read sites separately, never the bare word:

probeshaperesult
declarationgit grep -E '\b(const|let|var|function|class|interface|type|enum)\s+taskListWidth_LEGACY_REMOVED\b'1packages/plugin-gantt/src/GanttView.tsx:2323, its own binding
read sitesthe same grep for the identifier, minus lines matching the binder form0
controltaskListWidthidentical two shapes3 declaration lines, 20 read sites
controlrowHeightidentical two shapes2 declaration lines, 360 read sites

Both controls fired in the same run as the zero, so the zero is a reading. objectstack was swept too: 0 files / 0 lines for taskListWidth_LEGACY_REMOVEDand for the bare taskListWidth, in a run where the controls gantt (94 files / 359 lines) and rowHeight (34 / 74) fired — no spec, zod or type declaration of this key exists in the platform repo.

The word-count trap this card sits on, measured rather than trusted: in GanttView.tsx, \btaskListWidth\b goes 21 to 20 across this diff, not 21 to 0, because the tombstone's own comment said taskListWidth once. A word count would read that as "the key survives". The declaration-form count goes 1 to 0.

Reverse verification

Committed first, then mutated: the pre-fix file restored from the base commit under trap … EXIT INT TERM with an absolute path.

  • Mutation proved on disk — blob 756df02d3 becomes 96033b44f; the deleted text greps 0 to 1, the injected comment greps 1 to 0.
  • Restore proved by state, not by exit code — blob back to 756df02d3, byte-equal to HEAD's; git diff HEAD prints nothing; the greps read 0 and 1 again.
  • No rebuild leg is owed here: both gates read source directly (ESLint lints the file, Vitest resolves packages/plugin-gantt/src through the root config), so no dist/ sits between the mutation and the reading.

What moved, and what stayed:

readingtombstone presenttombstone deleted
eslint . on the package354 problems (0 errors), GanttView.tsx 17353 problems (0 errors), GanttView.tsx16
the specific message2323:9 warning 'taskListWidth_LEGACY_REMOVED' is assigned a value but never used @typescript-eslint/no-unused-varsabsent
control warning 'currentDate' is assigned a value but never usedpresentpresent
vitest run packages/plugin-gantt/src62 files, 485 passed62 files, 485 passed

⚠️ A correction to the card, from that table. The card says this line is something "the compiler and lint have no reason to complain about". Lint did complain: ESLint flagged it as @typescript-eslint/no-unused-vars. It never failed CI because unused vars sit at warning severity in this repo, while #7332 lifted only unused imports to error. The card's conclusion is unaffected — but the line was not invisible to the tooling, it was one row inside a 353-warning backlog.

No behavioural pin exists here and none was invented. The deleted binding was null with zero readers, so nothing observable distinguishes the two trees — and the table shows it: the suite is 485-green on both sides. The honest red/green is the lint reading above, from a rule that already existed.

Gates, each quoted from its own verdict line

Dependency closure built first (pnpm --filter '@object-ui/plugin-gantt^...' build, exit 0), so nothing below is a could-not-run.

  • pnpm --filter @object-ui/plugin-gantt type-check — exit 0, running tsc --noEmit && tsc -p tsconfig.test.json (both, the second being the test project).
  • pnpm --filter @object-ui/plugin-gantt lint — exit 0: ✖ 353 problems (0 errors, 353 warnings), all pre-existing, none in the lines this diff touches.
  • pnpm exec vitest run --maxWorkers=2 packages/plugin-gantt/src from the repo root (a package-cwd run is refused, objectui#3378) — Test Files 62 passed (62) / Tests 485 passed (485).
  • node scripts/check-changeset-presence.mjs✅ 1 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) … Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption and a complete answer to this gate.
  • node scripts/check-changeset-no-major.mjs✅ No changeset declares a 'major' bump.
  • node scripts/check-control-bytes.mjs✅ check-control-bytes: OK (scanned 6195 tracked text file(s); skipped 85 binary).

Declared narrowing. The repo lint job is turbo run lint, i.e. per-package eslint .; only the one package this diff touches was linted. The three readings that make that a measurement rather than a skip: the population comes from ESLint's own config resolution, not from my guess — eslint . --format json reports 92 files linted in packages/plugin-gantt; the counts above are that run's; and eslint.config.js configures no type-aware linting (no parserOptions.project, no projectService), so this diff cannot move the verdict of any file it does not contain. CI runs the full farm regardless.

Not in scope

Clause-②: no. The diff removes a function-local const and adds a comment — no exported symbol, prop, type, zod schema or spec key moves, so nothing on the published accept surface changes. The declaration check was derived, not assumed from the _LEGACY_REMOVED spelling; the sweep is in the claim comment on the card.

#7228 — the same file's other dead sizing arm, columnWidthForContainer returning 110 from all three branches — is deliberately untouched here and remains open.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC


Generated by Claude Code

…one fact it held
`GanttView` carried `const taskListWidth_LEGACY_REMOVED = null` in its body, left
behind by the finished task-list-width refactor. Measured on `origin/main`
`a27d153c2`: the identifier occurred exactly once in the repo — its own declaration
— and zero times in a read position, in a probe run where the same shape returned 20
read sites for the live `taskListWidth` and 360 for `rowHeight`. Nothing in
objectstack declared it either (0 files, controls `gantt` 94 and `rowHeight` 34 fired
in that run). It bound `null`, so it carried no state, no side effect and no
contract surface.
What it did carry was a false signal: a name spelling `_LEGACY_REMOVED`, sitting a
few hundred lines below the real derivation, reads as a seam retained for a reason
recorded elsewhere, and the next reader goes looking for that reason.
Its trailing comment held one fact worth keeping — the width now comes from the
container `useResizeObserver` — and that fact was stated nowhere at the observer
call site. It moves there instead of dying with the line: the observed container
width is named as the source the auto-sized row height, base column width and
task-list pane width all derive from.
Pure deletion of an inert binding plus a comment: no behaviour changes, so the
changeset declares an empty frontmatter (releasing nothing).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 50 chunks)3181.9 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-nXe7vDDx.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.19KB117.80KB
core (index.js)6.12KB2.42KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)242.42KB61.26KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)34.34KB9.17KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)48.12KB13.34KB
plugin-charts (index.js)70.87KB19.72KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.82KB34.64KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.07KB64.12KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.50KB41.08KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)52.71KB14.55KB
plugin-list (index.js)113.33KB27.60KB
plugin-map (index.js)20.55KB6.80KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.84KB8.85KB
plugin-tree (index.js)9.40KB3.23KB
plugin-view (index.js)85.22KB20.93KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.63KB1.70KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(plugin-gantt): taskListWidth_LEGACY_REMOVED is a declared-and-never-read const null left behind by a finished refactor

2 participants

@os-project-manager@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held - #7511

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone
Sep 3, 2026
Merged

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held#7511
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes#7421

Head sha 73ef5ec7a. Every reading below was taken on that tree.

What changed

Two lines out, two lines in, one file:

  • Outconst taskListWidth_LEGACY_REMOVED = null; from the GanttView body (and the whitespace-only line it left behind).
  • In — the one fact its trailing comment was carrying, moved to the site that owns it. The useResizeObserver call site now names the observed container width as the source the auto-sized row height, base column width and task-list pane width all derive from. Triage asked for exactly this: "the trailing comment records where the value went. If that fact is not already stated at the useResizeObserver call site, carry it there rather than deleting it with the line." It was not stated there — checked at the call site, GanttView.tsx:875, which had no comment at all.

Plus an empty-frontmatter changeset: packages/plugin-gantt/src is released source, so the presence gate wants a declaration, and there is nothing to release.

Liveness probe, with the control that fired

The premise holds. Probed the declaration form and the read sites separately, never the bare word:

probeshaperesult
declarationgit grep -E '\b(const|let|var|function|class|interface|type|enum)\s+taskListWidth_LEGACY_REMOVED\b'1packages/plugin-gantt/src/GanttView.tsx:2323, its own binding
read sitesthe same grep for the identifier, minus lines matching the binder form0
controltaskListWidthidentical two shapes3 declaration lines, 20 read sites
controlrowHeightidentical two shapes2 declaration lines, 360 read sites

Both controls fired in the same run as the zero, so the zero is a reading. objectstack was swept too: 0 files / 0 lines for taskListWidth_LEGACY_REMOVEDand for the bare taskListWidth, in a run where the controls gantt (94 files / 359 lines) and rowHeight (34 / 74) fired — no spec, zod or type declaration of this key exists in the platform repo.

The word-count trap this card sits on, measured rather than trusted: in GanttView.tsx, \btaskListWidth\b goes 21 to 20 across this diff, not 21 to 0, because the tombstone's own comment said taskListWidth once. A word count would read that as "the key survives". The declaration-form count goes 1 to 0.

Reverse verification

Committed first, then mutated: the pre-fix file restored from the base commit under trap … EXIT INT TERM with an absolute path.

  • Mutation proved on disk — blob 756df02d3 becomes 96033b44f; the deleted text greps 0 to 1, the injected comment greps 1 to 0.
  • Restore proved by state, not by exit code — blob back to 756df02d3, byte-equal to HEAD's; git diff HEAD prints nothing; the greps read 0 and 1 again.
  • No rebuild leg is owed here: both gates read source directly (ESLint lints the file, Vitest resolves packages/plugin-gantt/src through the root config), so no dist/ sits between the mutation and the reading.

What moved, and what stayed:

readingtombstone presenttombstone deleted
eslint . on the package354 problems (0 errors), GanttView.tsx 17353 problems (0 errors), GanttView.tsx16
the specific message2323:9 warning 'taskListWidth_LEGACY_REMOVED' is assigned a value but never used @typescript-eslint/no-unused-varsabsent
control warning 'currentDate' is assigned a value but never usedpresentpresent
vitest run packages/plugin-gantt/src62 files, 485 passed62 files, 485 passed

⚠️ A correction to the card, from that table. The card says this line is something "the compiler and lint have no reason to complain about". Lint did complain: ESLint flagged it as @typescript-eslint/no-unused-vars. It never failed CI because unused vars sit at warning severity in this repo, while #7332 lifted only unused imports to error. The card's conclusion is unaffected — but the line was not invisible to the tooling, it was one row inside a 353-warning backlog.

No behavioural pin exists here and none was invented. The deleted binding was null with zero readers, so nothing observable distinguishes the two trees — and the table shows it: the suite is 485-green on both sides. The honest red/green is the lint reading above, from a rule that already existed.

Gates, each quoted from its own verdict line

Dependency closure built first (pnpm --filter '@object-ui/plugin-gantt^...' build, exit 0), so nothing below is a could-not-run.

  • pnpm --filter @object-ui/plugin-gantt type-check — exit 0, running tsc --noEmit && tsc -p tsconfig.test.json (both, the second being the test project).
  • pnpm --filter @object-ui/plugin-gantt lint — exit 0: ✖ 353 problems (0 errors, 353 warnings), all pre-existing, none in the lines this diff touches.
  • pnpm exec vitest run --maxWorkers=2 packages/plugin-gantt/src from the repo root (a package-cwd run is refused, objectui#3378) — Test Files 62 passed (62) / Tests 485 passed (485).
  • node scripts/check-changeset-presence.mjs✅ 1 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) … Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption and a complete answer to this gate.
  • node scripts/check-changeset-no-major.mjs✅ No changeset declares a 'major' bump.
  • node scripts/check-control-bytes.mjs✅ check-control-bytes: OK (scanned 6195 tracked text file(s); skipped 85 binary).

Declared narrowing. The repo lint job is turbo run lint, i.e. per-package eslint .; only the one package this diff touches was linted. The three readings that make that a measurement rather than a skip: the population comes from ESLint's own config resolution, not from my guess — eslint . --format json reports 92 files linted in packages/plugin-gantt; the counts above are that run's; and eslint.config.js configures no type-aware linting (no parserOptions.project, no projectService), so this diff cannot move the verdict of any file it does not contain. CI runs the full farm regardless.

Not in scope

Clause-②: no. The diff removes a function-local const and adds a comment — no exported symbol, prop, type, zod schema or spec key moves, so nothing on the published accept surface changes. The declaration check was derived, not assumed from the _LEGACY_REMOVED spelling; the sweep is in the claim comment on the card.

#7228 — the same file's other dead sizing arm, columnWidthForContainer returning 110 from all three branches — is deliberately untouched here and remains open.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC


Generated by Claude Code

…one fact it held
`GanttView` carried `const taskListWidth_LEGACY_REMOVED = null` in its body, left
behind by the finished task-list-width refactor. Measured on `origin/main`
`a27d153c2`: the identifier occurred exactly once in the repo — its own declaration
— and zero times in a read position, in a probe run where the same shape returned 20
read sites for the live `taskListWidth` and 360 for `rowHeight`. Nothing in
objectstack declared it either (0 files, controls `gantt` 94 and `rowHeight` 34 fired
in that run). It bound `null`, so it carried no state, no side effect and no
contract surface.
What it did carry was a false signal: a name spelling `_LEGACY_REMOVED`, sitting a
few hundred lines below the real derivation, reads as a seam retained for a reason
recorded elsewhere, and the next reader goes looking for that reason.
Its trailing comment held one fact worth keeping — the width now comes from the
container `useResizeObserver` — and that fact was stated nowhere at the observer
call site. It moves there instead of dying with the line: the observed container
width is named as the source the auto-sized row height, base column width and
task-list pane width all derive from.
Pure deletion of an inert binding plus a comment: no behaviour changes, so the
changeset declares an empty frontmatter (releasing nothing).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 50 chunks)3181.9 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-nXe7vDDx.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.19KB117.80KB
core (index.js)6.12KB2.42KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)242.42KB61.26KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)34.34KB9.17KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)48.12KB13.34KB
plugin-charts (index.js)70.87KB19.72KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.82KB34.64KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.07KB64.12KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.50KB41.08KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)52.71KB14.55KB
plugin-list (index.js)113.33KB27.60KB
plugin-map (index.js)20.55KB6.80KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.84KB8.85KB
plugin-tree (index.js)9.40KB3.23KB
plugin-view (index.js)85.22KB20.93KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.63KB1.70KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(plugin-gantt): taskListWidth_LEGACY_REMOVED is a declared-and-never-read const null left behind by a finished refactor

2 participants

@os-project-manager@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held - #7511

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone
Sep 3, 2026
Merged

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held#7511
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes#7421

Head sha 73ef5ec7a. Every reading below was taken on that tree.

What changed

Two lines out, two lines in, one file:

  • Outconst taskListWidth_LEGACY_REMOVED = null; from the GanttView body (and the whitespace-only line it left behind).
  • In — the one fact its trailing comment was carrying, moved to the site that owns it. The useResizeObserver call site now names the observed container width as the source the auto-sized row height, base column width and task-list pane width all derive from. Triage asked for exactly this: "the trailing comment records where the value went. If that fact is not already stated at the useResizeObserver call site, carry it there rather than deleting it with the line." It was not stated there — checked at the call site, GanttView.tsx:875, which had no comment at all.

Plus an empty-frontmatter changeset: packages/plugin-gantt/src is released source, so the presence gate wants a declaration, and there is nothing to release.

Liveness probe, with the control that fired

The premise holds. Probed the declaration form and the read sites separately, never the bare word:

probeshaperesult
declarationgit grep -E '\b(const|let|var|function|class|interface|type|enum)\s+taskListWidth_LEGACY_REMOVED\b'1packages/plugin-gantt/src/GanttView.tsx:2323, its own binding
read sitesthe same grep for the identifier, minus lines matching the binder form0
controltaskListWidthidentical two shapes3 declaration lines, 20 read sites
controlrowHeightidentical two shapes2 declaration lines, 360 read sites

Both controls fired in the same run as the zero, so the zero is a reading. objectstack was swept too: 0 files / 0 lines for taskListWidth_LEGACY_REMOVEDand for the bare taskListWidth, in a run where the controls gantt (94 files / 359 lines) and rowHeight (34 / 74) fired — no spec, zod or type declaration of this key exists in the platform repo.

The word-count trap this card sits on, measured rather than trusted: in GanttView.tsx, \btaskListWidth\b goes 21 to 20 across this diff, not 21 to 0, because the tombstone's own comment said taskListWidth once. A word count would read that as "the key survives". The declaration-form count goes 1 to 0.

Reverse verification

Committed first, then mutated: the pre-fix file restored from the base commit under trap … EXIT INT TERM with an absolute path.

  • Mutation proved on disk — blob 756df02d3 becomes 96033b44f; the deleted text greps 0 to 1, the injected comment greps 1 to 0.
  • Restore proved by state, not by exit code — blob back to 756df02d3, byte-equal to HEAD's; git diff HEAD prints nothing; the greps read 0 and 1 again.
  • No rebuild leg is owed here: both gates read source directly (ESLint lints the file, Vitest resolves packages/plugin-gantt/src through the root config), so no dist/ sits between the mutation and the reading.

What moved, and what stayed:

readingtombstone presenttombstone deleted
eslint . on the package354 problems (0 errors), GanttView.tsx 17353 problems (0 errors), GanttView.tsx16
the specific message2323:9 warning 'taskListWidth_LEGACY_REMOVED' is assigned a value but never used @typescript-eslint/no-unused-varsabsent
control warning 'currentDate' is assigned a value but never usedpresentpresent
vitest run packages/plugin-gantt/src62 files, 485 passed62 files, 485 passed

⚠️ A correction to the card, from that table. The card says this line is something "the compiler and lint have no reason to complain about". Lint did complain: ESLint flagged it as @typescript-eslint/no-unused-vars. It never failed CI because unused vars sit at warning severity in this repo, while #7332 lifted only unused imports to error. The card's conclusion is unaffected — but the line was not invisible to the tooling, it was one row inside a 353-warning backlog.

No behavioural pin exists here and none was invented. The deleted binding was null with zero readers, so nothing observable distinguishes the two trees — and the table shows it: the suite is 485-green on both sides. The honest red/green is the lint reading above, from a rule that already existed.

Gates, each quoted from its own verdict line

Dependency closure built first (pnpm --filter '@object-ui/plugin-gantt^...' build, exit 0), so nothing below is a could-not-run.

  • pnpm --filter @object-ui/plugin-gantt type-check — exit 0, running tsc --noEmit && tsc -p tsconfig.test.json (both, the second being the test project).
  • pnpm --filter @object-ui/plugin-gantt lint — exit 0: ✖ 353 problems (0 errors, 353 warnings), all pre-existing, none in the lines this diff touches.
  • pnpm exec vitest run --maxWorkers=2 packages/plugin-gantt/src from the repo root (a package-cwd run is refused, objectui#3378) — Test Files 62 passed (62) / Tests 485 passed (485).
  • node scripts/check-changeset-presence.mjs✅ 1 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) … Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption and a complete answer to this gate.
  • node scripts/check-changeset-no-major.mjs✅ No changeset declares a 'major' bump.
  • node scripts/check-control-bytes.mjs✅ check-control-bytes: OK (scanned 6195 tracked text file(s); skipped 85 binary).

Declared narrowing. The repo lint job is turbo run lint, i.e. per-package eslint .; only the one package this diff touches was linted. The three readings that make that a measurement rather than a skip: the population comes from ESLint's own config resolution, not from my guess — eslint . --format json reports 92 files linted in packages/plugin-gantt; the counts above are that run's; and eslint.config.js configures no type-aware linting (no parserOptions.project, no projectService), so this diff cannot move the verdict of any file it does not contain. CI runs the full farm regardless.

Not in scope

Clause-②: no. The diff removes a function-local const and adds a comment — no exported symbol, prop, type, zod schema or spec key moves, so nothing on the published accept surface changes. The declaration check was derived, not assumed from the _LEGACY_REMOVED spelling; the sweep is in the claim comment on the card.

#7228 — the same file's other dead sizing arm, columnWidthForContainer returning 110 from all three branches — is deliberately untouched here and remains open.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC


Generated by Claude Code

…one fact it held
`GanttView` carried `const taskListWidth_LEGACY_REMOVED = null` in its body, left
behind by the finished task-list-width refactor. Measured on `origin/main`
`a27d153c2`: the identifier occurred exactly once in the repo — its own declaration
— and zero times in a read position, in a probe run where the same shape returned 20
read sites for the live `taskListWidth` and 360 for `rowHeight`. Nothing in
objectstack declared it either (0 files, controls `gantt` 94 and `rowHeight` 34 fired
in that run). It bound `null`, so it carried no state, no side effect and no
contract surface.
What it did carry was a false signal: a name spelling `_LEGACY_REMOVED`, sitting a
few hundred lines below the real derivation, reads as a seam retained for a reason
recorded elsewhere, and the next reader goes looking for that reason.
Its trailing comment held one fact worth keeping — the width now comes from the
container `useResizeObserver` — and that fact was stated nowhere at the observer
call site. It moves there instead of dying with the line: the observed container
width is named as the source the auto-sized row height, base column width and
task-list pane width all derive from.
Pure deletion of an inert binding plus a comment: no behaviour changes, so the
changeset declares an empty frontmatter (releasing nothing).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 50 chunks)3181.9 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-nXe7vDDx.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.19KB117.80KB
core (index.js)6.12KB2.42KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)242.42KB61.26KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)34.34KB9.17KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)48.12KB13.34KB
plugin-charts (index.js)70.87KB19.72KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.82KB34.64KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.07KB64.12KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.50KB41.08KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)52.71KB14.55KB
plugin-list (index.js)113.33KB27.60KB
plugin-map (index.js)20.55KB6.80KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.84KB8.85KB
plugin-tree (index.js)9.40KB3.23KB
plugin-view (index.js)85.22KB20.93KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.63KB1.70KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(plugin-gantt): taskListWidth_LEGACY_REMOVED is a declared-and-never-read const null left behind by a finished refactor

2 participants

@os-project-manager@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held - #7511

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone
Sep 3, 2026
Merged

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held#7511
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes#7421

Head sha 73ef5ec7a. Every reading below was taken on that tree.

What changed

Two lines out, two lines in, one file:

  • Outconst taskListWidth_LEGACY_REMOVED = null; from the GanttView body (and the whitespace-only line it left behind).
  • In — the one fact its trailing comment was carrying, moved to the site that owns it. The useResizeObserver call site now names the observed container width as the source the auto-sized row height, base column width and task-list pane width all derive from. Triage asked for exactly this: "the trailing comment records where the value went. If that fact is not already stated at the useResizeObserver call site, carry it there rather than deleting it with the line." It was not stated there — checked at the call site, GanttView.tsx:875, which had no comment at all.

Plus an empty-frontmatter changeset: packages/plugin-gantt/src is released source, so the presence gate wants a declaration, and there is nothing to release.

Liveness probe, with the control that fired

The premise holds. Probed the declaration form and the read sites separately, never the bare word:

probeshaperesult
declarationgit grep -E '\b(const|let|var|function|class|interface|type|enum)\s+taskListWidth_LEGACY_REMOVED\b'1packages/plugin-gantt/src/GanttView.tsx:2323, its own binding
read sitesthe same grep for the identifier, minus lines matching the binder form0
controltaskListWidthidentical two shapes3 declaration lines, 20 read sites
controlrowHeightidentical two shapes2 declaration lines, 360 read sites

Both controls fired in the same run as the zero, so the zero is a reading. objectstack was swept too: 0 files / 0 lines for taskListWidth_LEGACY_REMOVEDand for the bare taskListWidth, in a run where the controls gantt (94 files / 359 lines) and rowHeight (34 / 74) fired — no spec, zod or type declaration of this key exists in the platform repo.

The word-count trap this card sits on, measured rather than trusted: in GanttView.tsx, \btaskListWidth\b goes 21 to 20 across this diff, not 21 to 0, because the tombstone's own comment said taskListWidth once. A word count would read that as "the key survives". The declaration-form count goes 1 to 0.

Reverse verification

Committed first, then mutated: the pre-fix file restored from the base commit under trap … EXIT INT TERM with an absolute path.

  • Mutation proved on disk — blob 756df02d3 becomes 96033b44f; the deleted text greps 0 to 1, the injected comment greps 1 to 0.
  • Restore proved by state, not by exit code — blob back to 756df02d3, byte-equal to HEAD's; git diff HEAD prints nothing; the greps read 0 and 1 again.
  • No rebuild leg is owed here: both gates read source directly (ESLint lints the file, Vitest resolves packages/plugin-gantt/src through the root config), so no dist/ sits between the mutation and the reading.

What moved, and what stayed:

readingtombstone presenttombstone deleted
eslint . on the package354 problems (0 errors), GanttView.tsx 17353 problems (0 errors), GanttView.tsx16
the specific message2323:9 warning 'taskListWidth_LEGACY_REMOVED' is assigned a value but never used @typescript-eslint/no-unused-varsabsent
control warning 'currentDate' is assigned a value but never usedpresentpresent
vitest run packages/plugin-gantt/src62 files, 485 passed62 files, 485 passed

⚠️ A correction to the card, from that table. The card says this line is something "the compiler and lint have no reason to complain about". Lint did complain: ESLint flagged it as @typescript-eslint/no-unused-vars. It never failed CI because unused vars sit at warning severity in this repo, while #7332 lifted only unused imports to error. The card's conclusion is unaffected — but the line was not invisible to the tooling, it was one row inside a 353-warning backlog.

No behavioural pin exists here and none was invented. The deleted binding was null with zero readers, so nothing observable distinguishes the two trees — and the table shows it: the suite is 485-green on both sides. The honest red/green is the lint reading above, from a rule that already existed.

Gates, each quoted from its own verdict line

Dependency closure built first (pnpm --filter '@object-ui/plugin-gantt^...' build, exit 0), so nothing below is a could-not-run.

  • pnpm --filter @object-ui/plugin-gantt type-check — exit 0, running tsc --noEmit && tsc -p tsconfig.test.json (both, the second being the test project).
  • pnpm --filter @object-ui/plugin-gantt lint — exit 0: ✖ 353 problems (0 errors, 353 warnings), all pre-existing, none in the lines this diff touches.
  • pnpm exec vitest run --maxWorkers=2 packages/plugin-gantt/src from the repo root (a package-cwd run is refused, objectui#3378) — Test Files 62 passed (62) / Tests 485 passed (485).
  • node scripts/check-changeset-presence.mjs✅ 1 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) … Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption and a complete answer to this gate.
  • node scripts/check-changeset-no-major.mjs✅ No changeset declares a 'major' bump.
  • node scripts/check-control-bytes.mjs✅ check-control-bytes: OK (scanned 6195 tracked text file(s); skipped 85 binary).

Declared narrowing. The repo lint job is turbo run lint, i.e. per-package eslint .; only the one package this diff touches was linted. The three readings that make that a measurement rather than a skip: the population comes from ESLint's own config resolution, not from my guess — eslint . --format json reports 92 files linted in packages/plugin-gantt; the counts above are that run's; and eslint.config.js configures no type-aware linting (no parserOptions.project, no projectService), so this diff cannot move the verdict of any file it does not contain. CI runs the full farm regardless.

Not in scope

Clause-②: no. The diff removes a function-local const and adds a comment — no exported symbol, prop, type, zod schema or spec key moves, so nothing on the published accept surface changes. The declaration check was derived, not assumed from the _LEGACY_REMOVED spelling; the sweep is in the claim comment on the card.

#7228 — the same file's other dead sizing arm, columnWidthForContainer returning 110 from all three branches — is deliberately untouched here and remains open.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC


Generated by Claude Code

…one fact it held
`GanttView` carried `const taskListWidth_LEGACY_REMOVED = null` in its body, left
behind by the finished task-list-width refactor. Measured on `origin/main`
`a27d153c2`: the identifier occurred exactly once in the repo — its own declaration
— and zero times in a read position, in a probe run where the same shape returned 20
read sites for the live `taskListWidth` and 360 for `rowHeight`. Nothing in
objectstack declared it either (0 files, controls `gantt` 94 and `rowHeight` 34 fired
in that run). It bound `null`, so it carried no state, no side effect and no
contract surface.
What it did carry was a false signal: a name spelling `_LEGACY_REMOVED`, sitting a
few hundred lines below the real derivation, reads as a seam retained for a reason
recorded elsewhere, and the next reader goes looking for that reason.
Its trailing comment held one fact worth keeping — the width now comes from the
container `useResizeObserver` — and that fact was stated nowhere at the observer
call site. It moves there instead of dying with the line: the observed container
width is named as the source the auto-sized row height, base column width and
task-list pane width all derive from.
Pure deletion of an inert binding plus a comment: no behaviour changes, so the
changeset declares an empty frontmatter (releasing nothing).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 50 chunks)3181.9 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-nXe7vDDx.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.19KB117.80KB
core (index.js)6.12KB2.42KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)242.42KB61.26KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)34.34KB9.17KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)48.12KB13.34KB
plugin-charts (index.js)70.87KB19.72KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.82KB34.64KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.07KB64.12KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.50KB41.08KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)52.71KB14.55KB
plugin-list (index.js)113.33KB27.60KB
plugin-map (index.js)20.55KB6.80KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.84KB8.85KB
plugin-tree (index.js)9.40KB3.23KB
plugin-view (index.js)85.22KB20.93KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.63KB1.70KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(plugin-gantt): taskListWidth_LEGACY_REMOVED is a declared-and-never-read const null left behind by a finished refactor

2 participants

@os-project-manager@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held - #7511

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone
Sep 3, 2026
Merged

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held#7511
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes#7421

Head sha 73ef5ec7a. Every reading below was taken on that tree.

What changed

Two lines out, two lines in, one file:

  • Outconst taskListWidth_LEGACY_REMOVED = null; from the GanttView body (and the whitespace-only line it left behind).
  • In — the one fact its trailing comment was carrying, moved to the site that owns it. The useResizeObserver call site now names the observed container width as the source the auto-sized row height, base column width and task-list pane width all derive from. Triage asked for exactly this: "the trailing comment records where the value went. If that fact is not already stated at the useResizeObserver call site, carry it there rather than deleting it with the line." It was not stated there — checked at the call site, GanttView.tsx:875, which had no comment at all.

Plus an empty-frontmatter changeset: packages/plugin-gantt/src is released source, so the presence gate wants a declaration, and there is nothing to release.

Liveness probe, with the control that fired

The premise holds. Probed the declaration form and the read sites separately, never the bare word:

probeshaperesult
declarationgit grep -E '\b(const|let|var|function|class|interface|type|enum)\s+taskListWidth_LEGACY_REMOVED\b'1packages/plugin-gantt/src/GanttView.tsx:2323, its own binding
read sitesthe same grep for the identifier, minus lines matching the binder form0
controltaskListWidthidentical two shapes3 declaration lines, 20 read sites
controlrowHeightidentical two shapes2 declaration lines, 360 read sites

Both controls fired in the same run as the zero, so the zero is a reading. objectstack was swept too: 0 files / 0 lines for taskListWidth_LEGACY_REMOVEDand for the bare taskListWidth, in a run where the controls gantt (94 files / 359 lines) and rowHeight (34 / 74) fired — no spec, zod or type declaration of this key exists in the platform repo.

The word-count trap this card sits on, measured rather than trusted: in GanttView.tsx, \btaskListWidth\b goes 21 to 20 across this diff, not 21 to 0, because the tombstone's own comment said taskListWidth once. A word count would read that as "the key survives". The declaration-form count goes 1 to 0.

Reverse verification

Committed first, then mutated: the pre-fix file restored from the base commit under trap … EXIT INT TERM with an absolute path.

  • Mutation proved on disk — blob 756df02d3 becomes 96033b44f; the deleted text greps 0 to 1, the injected comment greps 1 to 0.
  • Restore proved by state, not by exit code — blob back to 756df02d3, byte-equal to HEAD's; git diff HEAD prints nothing; the greps read 0 and 1 again.
  • No rebuild leg is owed here: both gates read source directly (ESLint lints the file, Vitest resolves packages/plugin-gantt/src through the root config), so no dist/ sits between the mutation and the reading.

What moved, and what stayed:

readingtombstone presenttombstone deleted
eslint . on the package354 problems (0 errors), GanttView.tsx 17353 problems (0 errors), GanttView.tsx16
the specific message2323:9 warning 'taskListWidth_LEGACY_REMOVED' is assigned a value but never used @typescript-eslint/no-unused-varsabsent
control warning 'currentDate' is assigned a value but never usedpresentpresent
vitest run packages/plugin-gantt/src62 files, 485 passed62 files, 485 passed

⚠️ A correction to the card, from that table. The card says this line is something "the compiler and lint have no reason to complain about". Lint did complain: ESLint flagged it as @typescript-eslint/no-unused-vars. It never failed CI because unused vars sit at warning severity in this repo, while #7332 lifted only unused imports to error. The card's conclusion is unaffected — but the line was not invisible to the tooling, it was one row inside a 353-warning backlog.

No behavioural pin exists here and none was invented. The deleted binding was null with zero readers, so nothing observable distinguishes the two trees — and the table shows it: the suite is 485-green on both sides. The honest red/green is the lint reading above, from a rule that already existed.

Gates, each quoted from its own verdict line

Dependency closure built first (pnpm --filter '@object-ui/plugin-gantt^...' build, exit 0), so nothing below is a could-not-run.

  • pnpm --filter @object-ui/plugin-gantt type-check — exit 0, running tsc --noEmit && tsc -p tsconfig.test.json (both, the second being the test project).
  • pnpm --filter @object-ui/plugin-gantt lint — exit 0: ✖ 353 problems (0 errors, 353 warnings), all pre-existing, none in the lines this diff touches.
  • pnpm exec vitest run --maxWorkers=2 packages/plugin-gantt/src from the repo root (a package-cwd run is refused, objectui#3378) — Test Files 62 passed (62) / Tests 485 passed (485).
  • node scripts/check-changeset-presence.mjs✅ 1 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) … Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption and a complete answer to this gate.
  • node scripts/check-changeset-no-major.mjs✅ No changeset declares a 'major' bump.
  • node scripts/check-control-bytes.mjs✅ check-control-bytes: OK (scanned 6195 tracked text file(s); skipped 85 binary).

Declared narrowing. The repo lint job is turbo run lint, i.e. per-package eslint .; only the one package this diff touches was linted. The three readings that make that a measurement rather than a skip: the population comes from ESLint's own config resolution, not from my guess — eslint . --format json reports 92 files linted in packages/plugin-gantt; the counts above are that run's; and eslint.config.js configures no type-aware linting (no parserOptions.project, no projectService), so this diff cannot move the verdict of any file it does not contain. CI runs the full farm regardless.

Not in scope

Clause-②: no. The diff removes a function-local const and adds a comment — no exported symbol, prop, type, zod schema or spec key moves, so nothing on the published accept surface changes. The declaration check was derived, not assumed from the _LEGACY_REMOVED spelling; the sweep is in the claim comment on the card.

#7228 — the same file's other dead sizing arm, columnWidthForContainer returning 110 from all three branches — is deliberately untouched here and remains open.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC


Generated by Claude Code

…one fact it held
`GanttView` carried `const taskListWidth_LEGACY_REMOVED = null` in its body, left
behind by the finished task-list-width refactor. Measured on `origin/main`
`a27d153c2`: the identifier occurred exactly once in the repo — its own declaration
— and zero times in a read position, in a probe run where the same shape returned 20
read sites for the live `taskListWidth` and 360 for `rowHeight`. Nothing in
objectstack declared it either (0 files, controls `gantt` 94 and `rowHeight` 34 fired
in that run). It bound `null`, so it carried no state, no side effect and no
contract surface.
What it did carry was a false signal: a name spelling `_LEGACY_REMOVED`, sitting a
few hundred lines below the real derivation, reads as a seam retained for a reason
recorded elsewhere, and the next reader goes looking for that reason.
Its trailing comment held one fact worth keeping — the width now comes from the
container `useResizeObserver` — and that fact was stated nowhere at the observer
call site. It moves there instead of dying with the line: the observed container
width is named as the source the auto-sized row height, base column width and
task-list pane width all derive from.
Pure deletion of an inert binding plus a comment: no behaviour changes, so the
changeset declares an empty frontmatter (releasing nothing).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 50 chunks)3181.9 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-nXe7vDDx.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.19KB117.80KB
core (index.js)6.12KB2.42KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)242.42KB61.26KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)34.34KB9.17KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)48.12KB13.34KB
plugin-charts (index.js)70.87KB19.72KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.82KB34.64KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.07KB64.12KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.50KB41.08KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)52.71KB14.55KB
plugin-list (index.js)113.33KB27.60KB
plugin-map (index.js)20.55KB6.80KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.84KB8.85KB
plugin-tree (index.js)9.40KB3.23KB
plugin-view (index.js)85.22KB20.93KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.63KB1.70KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(plugin-gantt): taskListWidth_LEGACY_REMOVED is a declared-and-never-read const null left behind by a finished refactor

2 participants

@os-project-manager@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held - #7511

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone
Sep 3, 2026
Merged

refactor(plugin-gantt): delete the taskListWidth tombstone, keep the one fact it held#7511
os-project-manager merged 1 commit into
mainfrom
claude/issue-7421-tasklistwidth-tombstone

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes#7421

Head sha 73ef5ec7a. Every reading below was taken on that tree.

What changed

Two lines out, two lines in, one file:

  • Outconst taskListWidth_LEGACY_REMOVED = null; from the GanttView body (and the whitespace-only line it left behind).
  • In — the one fact its trailing comment was carrying, moved to the site that owns it. The useResizeObserver call site now names the observed container width as the source the auto-sized row height, base column width and task-list pane width all derive from. Triage asked for exactly this: "the trailing comment records where the value went. If that fact is not already stated at the useResizeObserver call site, carry it there rather than deleting it with the line." It was not stated there — checked at the call site, GanttView.tsx:875, which had no comment at all.

Plus an empty-frontmatter changeset: packages/plugin-gantt/src is released source, so the presence gate wants a declaration, and there is nothing to release.

Liveness probe, with the control that fired

The premise holds. Probed the declaration form and the read sites separately, never the bare word:

probeshaperesult
declarationgit grep -E '\b(const|let|var|function|class|interface|type|enum)\s+taskListWidth_LEGACY_REMOVED\b'1packages/plugin-gantt/src/GanttView.tsx:2323, its own binding
read sitesthe same grep for the identifier, minus lines matching the binder form0
controltaskListWidthidentical two shapes3 declaration lines, 20 read sites
controlrowHeightidentical two shapes2 declaration lines, 360 read sites

Both controls fired in the same run as the zero, so the zero is a reading. objectstack was swept too: 0 files / 0 lines for taskListWidth_LEGACY_REMOVEDand for the bare taskListWidth, in a run where the controls gantt (94 files / 359 lines) and rowHeight (34 / 74) fired — no spec, zod or type declaration of this key exists in the platform repo.

The word-count trap this card sits on, measured rather than trusted: in GanttView.tsx, \btaskListWidth\b goes 21 to 20 across this diff, not 21 to 0, because the tombstone's own comment said taskListWidth once. A word count would read that as "the key survives". The declaration-form count goes 1 to 0.

Reverse verification

Committed first, then mutated: the pre-fix file restored from the base commit under trap … EXIT INT TERM with an absolute path.

  • Mutation proved on disk — blob 756df02d3 becomes 96033b44f; the deleted text greps 0 to 1, the injected comment greps 1 to 0.
  • Restore proved by state, not by exit code — blob back to 756df02d3, byte-equal to HEAD's; git diff HEAD prints nothing; the greps read 0 and 1 again.
  • No rebuild leg is owed here: both gates read source directly (ESLint lints the file, Vitest resolves packages/plugin-gantt/src through the root config), so no dist/ sits between the mutation and the reading.

What moved, and what stayed:

readingtombstone presenttombstone deleted
eslint . on the package354 problems (0 errors), GanttView.tsx 17353 problems (0 errors), GanttView.tsx16
the specific message2323:9 warning 'taskListWidth_LEGACY_REMOVED' is assigned a value but never used @typescript-eslint/no-unused-varsabsent
control warning 'currentDate' is assigned a value but never usedpresentpresent
vitest run packages/plugin-gantt/src62 files, 485 passed62 files, 485 passed

⚠️ A correction to the card, from that table. The card says this line is something "the compiler and lint have no reason to complain about". Lint did complain: ESLint flagged it as @typescript-eslint/no-unused-vars. It never failed CI because unused vars sit at warning severity in this repo, while #7332 lifted only unused imports to error. The card's conclusion is unaffected — but the line was not invisible to the tooling, it was one row inside a 353-warning backlog.

No behavioural pin exists here and none was invented. The deleted binding was null with zero readers, so nothing observable distinguishes the two trees — and the table shows it: the suite is 485-green on both sides. The honest red/green is the lint reading above, from a rule that already existed.

Gates, each quoted from its own verdict line

Dependency closure built first (pnpm --filter '@object-ui/plugin-gantt^...' build, exit 0), so nothing below is a could-not-run.

  • pnpm --filter @object-ui/plugin-gantt type-check — exit 0, running tsc --noEmit && tsc -p tsconfig.test.json (both, the second being the test project).
  • pnpm --filter @object-ui/plugin-gantt lint — exit 0: ✖ 353 problems (0 errors, 353 warnings), all pre-existing, none in the lines this diff touches.
  • pnpm exec vitest run --maxWorkers=2 packages/plugin-gantt/src from the repo root (a package-cwd run is refused, objectui#3378) — Test Files 62 passed (62) / Tests 485 passed (485).
  • node scripts/check-changeset-presence.mjs✅ 1 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) … Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption and a complete answer to this gate.
  • node scripts/check-changeset-no-major.mjs✅ No changeset declares a 'major' bump.
  • node scripts/check-control-bytes.mjs✅ check-control-bytes: OK (scanned 6195 tracked text file(s); skipped 85 binary).

Declared narrowing. The repo lint job is turbo run lint, i.e. per-package eslint .; only the one package this diff touches was linted. The three readings that make that a measurement rather than a skip: the population comes from ESLint's own config resolution, not from my guess — eslint . --format json reports 92 files linted in packages/plugin-gantt; the counts above are that run's; and eslint.config.js configures no type-aware linting (no parserOptions.project, no projectService), so this diff cannot move the verdict of any file it does not contain. CI runs the full farm regardless.

Not in scope

Clause-②: no. The diff removes a function-local const and adds a comment — no exported symbol, prop, type, zod schema or spec key moves, so nothing on the published accept surface changes. The declaration check was derived, not assumed from the _LEGACY_REMOVED spelling; the sweep is in the claim comment on the card.

#7228 — the same file's other dead sizing arm, columnWidthForContainer returning 110 from all three branches — is deliberately untouched here and remains open.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC


Generated by Claude Code

…one fact it held
`GanttView` carried `const taskListWidth_LEGACY_REMOVED = null` in its body, left
behind by the finished task-list-width refactor. Measured on `origin/main`
`a27d153c2`: the identifier occurred exactly once in the repo — its own declaration
— and zero times in a read position, in a probe run where the same shape returned 20
read sites for the live `taskListWidth` and 360 for `rowHeight`. Nothing in
objectstack declared it either (0 files, controls `gantt` 94 and `rowHeight` 34 fired
in that run). It bound `null`, so it carried no state, no side effect and no
contract surface.
What it did carry was a false signal: a name spelling `_LEGACY_REMOVED`, sitting a
few hundred lines below the real derivation, reads as a seam retained for a reason
recorded elsewhere, and the next reader goes looking for that reason.
Its trailing comment held one fact worth keeping — the width now comes from the
container `useResizeObserver` — and that fact was stated nowhere at the observer
call site. It moves there instead of dying with the line: the observed container
width is named as the source the auto-sized row height, base column width and
task-list pane width all derive from.
Pure deletion of an inert binding plus a comment: no behaviour changes, so the
changeset declares an empty frontmatter (releasing nothing).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 50 chunks)3181.9 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-nXe7vDDx.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.19KB117.80KB
core (index.js)6.12KB2.42KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)242.42KB61.26KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)34.34KB9.17KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)48.12KB13.34KB
plugin-charts (index.js)70.87KB19.72KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.82KB34.64KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.07KB64.12KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.50KB41.08KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)52.71KB14.55KB
plugin-list (index.js)113.33KB27.60KB
plugin-map (index.js)20.55KB6.80KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.84KB8.85KB
plugin-tree (index.js)9.40KB3.23KB
plugin-view (index.js)85.22KB20.93KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.63KB1.70KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(plugin-gantt): taskListWidth_LEGACY_REMOVED is a declared-and-never-read const null left behind by a finished refactor

2 participants

@os-project-manager@claude