Skip to content

feat(studio): online dataset authoring — create form, derived measures, joined-query fix#2248

Merged
os-zhuang merged 2 commits into
mainfrom
dogfood/studio-dataset-authoring
Jun 23, 2026
Merged

feat(studio): online dataset authoring — create form, derived measures, joined-query fix#2248
os-zhuang merged 2 commits into
mainfrom
dogfood/studio-dataset-authoring

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Summary

Dogfooded online dataset authoring (ADR-0021 analytics semantic layer) in the Studio app as a business user, found three issues, fixed them, and browser-verified each.

# Fix Package Type
A Add dataset.form.ts (sectioned create form + object picker) + register in METADATA_FORM_REGISTRY @objectstack/spec feat
B Make DatasetMeasure.aggregate optional — derived measures no longer need a dummy aggregate (required for non-derived only) @objectstack/spec feat
C Qualify base-object columns in joined dataset queries → fixes ambiguous column name 500s @objectstack/service-analytics fix

Why

  • Adataset was the only UI-authorable metadata type without a defineForm, so Studio's create surface fell back to the flat auto-layout (free-text object, no grouping).
  • B — a derived measure (derived: { op, of }) ignores aggregate at compile time, but the schema still required it → saving a derived measure failed validation (422) unless you added a meaningless aggregate.
  • C — a joined dataset (include + relationship.field) emitted bare base-table columns while joined columns were alias-qualified; when both tables share a column name (e.g. status), the query 500'd with ambiguous column name.

Verification

  • @objectstack/spec tests: 6624 pass (+2 derived-aggregate regression)
  • @objectstack/service-analytics tests: 151 pass (+2 base-column-qualification regression in native-sql-rls.test.ts)
  • Full framework build: 76/76 (no TypeScript ripple from making aggregate optional)
  • Browser-verified on showcase: improved create form (sections + object picker); joined + derived dataset query returns correct values — utilization = spent/budget = Contoso 70.0%, Fabrikam 97.8%, Northwind 40.0% / 96.0%, with account.name join + base status grouping + US$ formatting.

Notes / follow-ups (objectui, out of scope)

  • include/filter are intentionally curated out of the create form (the rich designer canvas owns them via CREATE_MODE_CANVAS_TYPES / hiddenFields in ResourceEditPage.tsx). The clean long-term fix is to add 'dataset' to the canvas-create list (same move as the in-flight report-create-canvas work) so create == the rich designer. Tracked separately to avoid colliding with that change.
  • The dataset designer appears to lack a dataset-level filter (scope) editor — possible objectui follow-up.

🤖 Generated with Claude Code

…s, joined-query fix

Dogfooded online dataset (ADR-0021 semantic layer) authoring in Studio as a
business user and fixed three issues found:

- spec: add `dataset.form.ts` (sectioned create form + `object` picker) and
  register it in `METADATA_FORM_REGISTRY`. `dataset` was the only UI-authorable
  metadata type without a `defineForm` layout, so its create surface fell back
  to the flat auto-layout.
- spec: make `DatasetMeasure.aggregate` optional so derived measures are
  authorable without a dummy aggregate (required for non-derived only,
  enforced in `superRefine`). Backward compatible.
- service-analytics: qualify base-object columns in joined dataset queries to
  fix "ambiguous column name" 500s when base/joined tables share a column
  (e.g. `status`). Single-object cubes unchanged.

Tests: spec 6624, service-analytics 151 (+4 regression), full build 76/76.
Browser-verified: improved create form; joined+derived dataset query returns
correct values (utilization = spent/budget = 70.0% / 97.8% / 40.0% / 96.0%).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 23, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jun 23, 2026 6:13pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): packages/services, @objectstack/spec.

93 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/cloud-artifact-api.mdx (via packages/spec)
  • content/docs/concepts/cluster-semantics.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/implementation-status.mdx (via @objectstack/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/concepts/packages.mdx (via @objectstack/spec)
  • content/docs/concepts/setup-app.mdx (via @objectstack/spec)
  • content/docs/concepts/skills.mdx (via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx (via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx (via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx (via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx (via @objectstack/spec)
  • content/docs/guides/api-reference.mdx (via @objectstack/spec)
  • content/docs/guides/business-logic.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx (via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx (via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx (via @objectstack/spec)
  • content/docs/guides/common-patterns.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx (via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx (via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx (via packages/spec)
  • content/docs/guides/data-modeling.mdx (via @objectstack/spec)
  • content/docs/guides/deployment-vercel.mdx (via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx (via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/guides/external-datasources.mdx (via @objectstack/spec)
  • content/docs/guides/formula.mdx (via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx (via packages/spec)
  • content/docs/guides/kernel-services.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/field.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx (via @objectstack/spec)
  • content/docs/guides/packages.mdx (via packages/services, @objectstack/spec)
  • content/docs/guides/plugin-development.mdx (via @objectstack/spec)
  • content/docs/guides/plugins.mdx (via @objectstack/spec)
  • content/docs/guides/project-scoping.mdx (via @objectstack/spec)
  • content/docs/guides/public-forms.mdx (via @objectstack/spec)
  • content/docs/guides/runtime-services/audit-service.mdx (via packages/services)
  • content/docs/guides/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/index.mdx (via packages/services, packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/settings-service.mdx (via packages/services)
  • content/docs/guides/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/guides/security.mdx (via @objectstack/spec)
  • content/docs/guides/seed-data.mdx (via @objectstack/spec)
  • content/docs/guides/skills.mdx (via @objectstack/spec)
  • content/docs/guides/standards.mdx (via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/guides/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx (via packages/services, @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

The public API-surface snapshot check flagged `+ datasetForm (const)`; regenerate
api-surface.json to include the new export.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@os-zhuang
os-zhuang merged commit 715d667 into main Jun 23, 2026
16 of 17 checks passed
@os-zhuang
os-zhuang deleted the dogfood/studio-dataset-authoring branch June 23, 2026 18:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant