Skip to content

fix(app-shell): the Create View dialog binds a chart view to an ADR-0021 dataset of its object (objectui#11576) - #11580

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-11576-create-view-chart-binding
Oct 3, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-11576-create-view-chart-binding

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #11576

Clause-②: no

The console's Create View dialog now authors the spec's ADR-0021 chart binding, chart: { chartType, dataset, values, dimensions? }, and nothing else. Until now it wrote chart: { chartType, xAxisField, yAxisFields }, which @objectstack/spec 17.6.0's strict ListChartConfigSchema refuses by name. So the platform's view write door refused every chart view the console created.

Shape: option A of the seat's answer on the card (comment 5973755839, amending claim 5973664751), under triage 5973399361.

What users see today (ruling step 1, measured before any edit)

Measured at objectui main 0903617 (= this branch's base). The real ObjectDataPage and the real dialog were mounted, with a real MetadataClient whose fetch replays the platform's view gate (the installed spec 17.6.0 getMetadataTypeSchema('view')) at the network boundary:

  • Picking Chart in "Save as view" and pressing Create sends PUT …/meta/view/crm_deal.KEY?mode=draft with config.chart = {chartType: bar, xAxisField: stage, yAxisFields: [amount]}.
  • The gate refuses it. Its ViewItem arm reports unrecognized_keys [xAxisField, yAxisFields] and dataset / values missing, and the client throws a 422.
  • The user sees nothing. The dialog has already closed (its submit does not await the save). The page stays on /data, with no navigation, no toast and no alert. The only trace is console.error('[ObjectDataPage] Failed to save view:').
  • ObjectView.handleViewCreate (the view tab bar's add button) has the same catch-and-log shape.

That silent failure is a defect of its own and outlives this payload change. It is not addressed here: the seat files it as its own card.

What changed

  • CreateViewDialog. The chart type's picks are now:
    • chartType, unchanged;
    • dataset: only the ADR-0021 datasets whose base object is the view's object, never the whole catalog;
    • values: one of the chosen dataset's measures, required, written as a one-element list;
    • dimensions: one of its dimensions, optional, shown only when the dataset declares any, and omitted from the payload when empty.
  • How the dialog reads them. It reads the catalog itself through useDatasetCatalog() / useDatasetSemantics(), the pair the dashboard widget editor binds with. A closed dialog, or one with no objectDef, fetches nothing. A dataset, measure or dimension name counts only while it is among the current options, so a stale or foreign name can neither open Create nor reach the payload. Choosing another dataset clears the measure and dimension picked from the last one.
  • An object with no dataset. The chart card is disabled through the dialog's existing "type unavailable" path. Its tooltip names the reason ("exposes no dataset") instead of the field wording, because a dataset is not a field.
  • xAxisField / yAxisFields are gone from the dialog. There is no dual spelling.
  • Header comments corrected. The "pure, no dataSource coupling" sentence now says what the dialog reads and when. The spec-alignment claim now points at the two pins that re-derive it for chart, and says in writing that no test drives the other types' payloads through the dialog against the spec (AGENTS.md 完善设计器的每一个细节 #9).
  • useDatasetCatalog. DatasetCatalogEntry gains an optional object, the served document's base object; toCatalogEntry keeps it when served. No other consumer reads it.
  • @object-ui/i18n. The four axis keys (console.objectView.xAxisField, xAxisFieldHelp, yAxisField, yAxisFieldHelp) leave all ten packs; the dialog was their only reader. Eight keys label the new picks: dataset, datasetHelp, chartMeasure, chartMeasureHelp, chartDimension, chartDimensionHelp, viewTypeUnavailableDataset, noDatasetMeasure. Terms follow each pack's existing dashboard dataset vocabulary. objectView-config-keys-retired-4730.test.ts owns this namespace's arithmetic, so it moves with them: 123 retired, 102 surviving, 225 total.
  • Changeset. One, patch, for @object-ui/app-shell and @object-ui/i18n.

Clause-② stays no. CreateViewDialogProps is unchanged. Neither DatasetCatalogEntry nor useDatasetCatalog (nor CreateViewDialog itself) is exported from packages/app-shell/src/index.ts, and the package's exports publishes only ..

Pins

  • CreateViewDialog.chartBinding-11576.test.tsx:
    • the served dataset fixtures parse as spec DatasetSchema documents (control);
    • toCatalogEntry carries object;
    • the picker offers the crm_deal dataset and never the crm_account one;
    • it offers the chosen dataset's own measures and dimensions;
    • the chart card is disabled when the object exposes no dataset;
    • no catalog is fetched while the dialog is closed;
    • the payload is exactly the ADR-0021 block, with no legacy key;
    • dimensions is omitted when the dataset declares none;
    • DOOR 1, ObjectDataPage.buildSaveAsViewSpec: the payload parses against the 17.6.0 ListViewSchema, and its envelope passes ViewItemSchema;
    • the save-door probe, turned around: the same replayed view gate now answers 200 for the new payload, and the user lands on the new draft (…/view/crm_deal.KEY?preview=draft).
  • ObjectView.createChartView-11576.test.tsx:
    • DOOR 2, ObjectView.handleViewCreate: a chart view is created through the tab bar's add button with the real ObjectView and the real dialog. The body handed to metadataClient.save passes ListViewSchema (config) and ViewItemSchema (envelope), with no legacy key.
    • Renders on the object page: that saved config, mounted as the object's list view, reaches ObjectChart through the dataset branch (dataset / values / dimensions; no objectName / aggregate).

Evidence

Red first, at base 0903617:

  • The probe above answered 422, with the user seeing nothing.
  • The two new pin files, run on the unmodified tree: Tests 9 failed | 4 passed (13). Every failure is "no dataset / values picker exists", or (the unavailable-card case) "the old dialog reads no catalog". The 4 passes are the 3 fixture controls and "no catalog while closed", which the old dialog satisfies trivially.

Ablation, at 5db856f, run by objectstack's scripts/ablation-replace.mjs with an EXIT INT TERM restore trap:

  • The mutation plants subConfig.xAxisField = 'stage' into the dialog's payload: anchor 1 to 0, blob a8cc632c to 6b44f4a0, "mutation landed".
  • Predicted before the run: 5 red, 9 green. Observed: Tests 5 failed | 9 passed (14).
  • Red, on the spec's own refusal: the payload case, the no-dimensions case (refused by the spec: unrecognized_keys), DOOR 1 (unrecognized_keys), the 2xx door (expected 422 to be 200) and DOOR 2 (ListViewSchema refusal).
  • Green: the fixture and catalog controls, the four picker cases, and the render case.
  • Restored by blob hash: a8cc632c == HEAD blob, git diff HEAD empty, marker count 0.

Green, every run below at 5db856f (git rev-parse --short HEAD):

  • pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build: exit 0.
  • pnpm --filter @object-ui/app-shell --filter @object-ui/i18n type-check: both echoed type-check: Done. tsc -p tsconfig.test.json --listFilesOnly counts both new pins (app-shell) and the 4730 pin (i18n) in the checked program.
  • Narrowed pnpm exec vitest run --maxWorkers=2 over 140 files: every CreateViewDialog*, ObjectDataPage* and ObjectView* suite in app-shell, every suite naming the catalog reader, and the whole packages/i18n/ (all-locales parity included). Result: Test Files 140 passed (140), Tests 2012 passed | 13 skipped (2025). This is a declared narrowing: the rest of app-shell's suites are CI's.
  • Gates, all exit 0:
    • check:control-bytes (OK);
    • check:new-line-citations (VERDICT … 0 new citation(s));
    • check:changeset-claims (report-only);
    • check:pending-changeset-literals (No test source names a pending changeset);
    • check:i18n-keys (every call-site key resolves against the en pack);
    • check:i18n-drift (No en value changed in this range);
    • check:i18n-designer-parity;
    • check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape;
    • check:test-path-roots;
    • check:metadata-write-doors;
    • check:unreferenced-sources;
    • node scripts/check-changeset-presence.mjs (15 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)).
  • Bundle gates, after a @object-ui/console build (check:eager-closure, check:eager-locale-catalogues), exit 0:
    • aggregate eager closure 3311.7 KB against a 3330.4 KB budget;
    • all four per-chunk ceilings and chunk membership held;
    • exactly one locale catalogue (en) eager.
  • Lint, a proven narrowing:
    • Population: the root eslint.config.js files: ['**/*.{ts,tsx}'] blocks; the packages carry no config of their own.
    • Count: --format json linted 15 files with 0 errors.
    • Invariance: the config sets no parserOptions.project / projectService (no type-aware linting), and no rule under eslint-rules/ reads another file, so this diff cannot move a verdict in an untouched file.
    • Warnings: the two changed source files carry the same warnings as at base (8 and 8, 1 and 1). The 9 others are no-explicit-any in the two new test files.

Acceptance notes

  • UnifiedViewConfig.chart in @object-ui/types (packages/types/src/designer.ts) still declares chartType, xAxisField, yAxisFields, aggregation, series, config and filter, and no dataset / values. It is exported from the package index and has zero consumers in this repo. Noted, not changed here.
  • Render-side legacy chart readers still read the inline axes, which the 17.6.0 write door now refuses at save, so only rows saved before the cutover can reach them. Noted, not changed here; the ruling scopes the removal to the dialog. The readers:
    • ObjectView's non-dataset chart branch (the "Translate here" block over xAxisField / yAxisFields / aggregation);
    • ListView's case 'chart' fallback ("Legacy inline aggregate (deprecated …) Kept as a fallback").
  • The new picks' labels reach t() through REQUIRED_FIELDS_BY_TYPE's i18nKey, so check:i18n-dead-keys (report-only) lists six of them as needs-review. That is the same tier the dialog's existing keys (chartType, groupByField, startDateField, …) already sit in.
  • Dataset and member labels come from useDatasetCatalog, which resolves an author's I18nLabel in the designer locale (en-US or zh-CN), as the dashboard and report editors show them. A de or ja session therefore sees a dataset's English label where the author declared one.
  • No test drives the kanban, calendar, gallery, map or tree payloads through this dialog against the spec. The corrected header says so rather than claiming alignment.

Write route: objectstack-fleet[bot] through the fleet-write relay. Session https://claude.ai/code/session_01FjqrwXPfSMkSfkKYDSRkN2.


Generated by Claude Code

claude added 2 commits October 3, 2026 21:58
…021 dataset of its object (objectui#11576)

The dialog wrote `chart: { chartType, xAxisField, yAxisFields }`, which the
spec's strict list chart block refuses by name, so the view write door
refused every chart view created from the console (both doors).

The chart picks are now `dataset` (only datasets whose base `object` is the
view's object, through useDatasetCatalog), `values` and optional `dimensions`
(the chosen dataset's members, through useDatasetSemantics). An object with no
dataset disables the chart type through the existing unavailable path. The
four axis i18n keys leave all ten packs; eight dataset-binding keys join.
The catalog entry carries the served base `object`.

Claude-Session: https://claude.ai/code/session_01FjqrwXPfSMkSfkKYDSRkN2
Co-authored-by: Claude <noreply@anthropic.com>
… shape in the objectui#11576 pins

So an ablation that plants a legacy axis key reads red on the spec's own
refusal at both doors, not first on a shape equality.

Claude-Session: https://claude.ai/code/session_01FjqrwXPfSMkSfkKYDSRkN2
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 3, 2026

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 2 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/4730-objectview-config-keys-retired.md

  • names packages/i18n/src/__tests__/objectView-config-keys-retired-4730.test.ts → packages/i18n/src/__tests__/objectView-config-keys-retired-4730.test.ts — edited by this change

    packages/i18n/src/__tests__/objectView-config-keys-retired-4730.test.ts pins the removal by name. Every i18n gate in this repo runs call site → key, so none of them can see a dead key come back: the parity gate is fully satisfied by 116 dead keys present in all ten packs, and the reverse sweep that found them (scripts/check-i18n-dead-keys.mjs) is report-only by design. The pin is the only thing that would notice.

.changeset/6661-app-launcher-nav-menu-renderers.md

  • names en.ts → packages/i18n/src/locales/en.ts — edited by this change

    Three new strings — the launcher's and the menu's accessible names, and the menu's empty state — are declared under console.nav in en.ts and its nine sibling packs. An inline defaultValue alone is not a fix: it renders English at one call site and leaves the string untranslatable everywhere (objectui#3517).

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with 09036173c (merge-base with origin/main): 15 file(s) changed outside .changeset/, read against 2095 pending declaration(s) that publish a body (2730 pending in total). · run

@github-actions

github-actions Bot commented Oct 3, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 331 chunks) 3311.7 KB 3330.4 KB
Main entry chunk (gzip) 151.3 KB 350 KB
Entry file index-C52--bVU.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 17.22KB 6.37KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.17KB 5.40KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.70KB 10.94KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.11KB 7.97KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 572.97KB 137.34KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 232.57KB 64.51KB
fields (index.js) 261.62KB 66.20KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 35.66KB 9.49KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 39.47KB 11.25KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.86KB 5.00KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.52KB 2.26KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.04KB 3.92KB
plugin-calendar (index.js) 53.17KB 15.46KB
plugin-charts (index.js) 83.60KB 22.89KB
plugin-chatbot (index.js) 198.22KB 46.97KB
plugin-dashboard (index.js) 142.26KB 38.44KB
plugin-designer (index.js) 231.28KB 48.76KB
plugin-detail (index.js) 245.60KB 64.57KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 175.44KB 45.28KB
plugin-gantt (index.js) 179.16KB 45.06KB
plugin-grid (index.js) 235.02KB 64.63KB
plugin-kanban (index.js) 49.59KB 15.58KB
plugin-list (index.js) 116.46KB 28.93KB
plugin-map (index.js) 25.60KB 8.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.12KB 12.29KB
plugin-timeline (index.js) 38.80KB 11.71KB
plugin-tree (index.js) 14.51KB 5.15KB
plugin-view (index.js) 90.23KB 22.73KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 120.63KB 39.56KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 6.06KB 2.68KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 21.42KB 7.05KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.16KB 1.96KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.07KB 2.39KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.25KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

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

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 3, 2026 22:41
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 3, 2026 22:41
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 3, 2026
Merged via the queue into main with commit d0097af Oct 3, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-11576-create-view-chart-binding branch October 3, 2026 22:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

1 participant