Skip to content

docs(objectstack-ui): standardize the inline-vs-dataset chart rule (#2502)#3237

Merged
os-zhuang merged 1 commit into
mainfrom
claude/chart-data-inline-dataset-uz4ygf
Jul 19, 2026
Merged

docs(objectstack-ui): standardize the inline-vs-dataset chart rule (#2502)#3237
os-zhuang merged 1 commit into
mainfrom
claude/chart-data-inline-dataset-uz4ygf

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

What & why

Standardizes the rule for how a chart's data is expressed (#2502), pinned to what the analytics / dataset engine actually supports rather than the draft prose in the issue.

The evaluation posted on #2502 found the issue's premise had drifted from shipped code: ADR-0021's single-form cutover already removed the per-widget inline query (every persisted chart is dataset-backed), and a dataset is a deliberately narrow governed layer — 5 of the issue's 7 "dataset triggers" aren't expressible in a dataset either. So the useful, checkable rule is the dataset-envelope ceiling, not "inline vs dataset".

Changes

  • skills/objectstack-ui/SKILL.md — Dataset-Bound Widgets: reframed around the real boundary.
    • Level A ceiling table: fits → author a dataset; beyond → escalate to a hand-authored Cube (raw SQL), a stored rollup/formula field, or app code. Plus an iron-rule callout that a dataset is a governed, narrow layer, not a general analytics escape hatch.
    • Standardized answers for the recurring ambiguous cases: parent→child rollup (re-base on child / stored rollup), computed column, lookup-path filter, and dashboard-filter-drives-N-charts (→ Dashboard-level filters (date / region) driving multiple charts #2501).
    • Level B note: naming a dataset is governance/reuse, not expressibility.
    • Corrected the ## Dashboards intro that still described the removed inline widget shape.
  • skills/objectstack-ui/evals/analytics-inline-vs-dataset.json: first working evals for this skill (proven must_contain/must_not_contain format), encoding the key decisions.
  • packages/spec/src/ui/dashboard.zod.ts: fixed the @example that still showed the removed inline widget shape (object/valueField/aggregate), which contradicted the now-required dataset field declared a few lines below it.

Notes / not in this PR

  • Enforcement already existspackages/lint validateWidgetBindings links a widget's dataset/dimensions/values to its defineDataset, and the dataset schema forbids beyond-ceiling constructs by construction (the compiler throws on unsupported aggregates / undeclared join paths). No new heuristic lint added — it would be noise.
  • Follow-ups (larger, out of scope): service-analytics/README.md documents a retired API surface (HAVING, the old IAnalyticsService methods) and needs a full rewrite; the inline-embedded-dataset schema change and the save-as-dataset promotion flow are cross-repo design items discussed on Rule: when chart data stays inline vs. requires a dataset (expressibility boundary) #2502.

Test plan

  • Skill docs + one JSON eval + a JSDoc @example — no runtime code paths touched.
  • Eval JSON validated with jq.
  • dashboard.zod.ts edit is comment-only (no schema/behavior change).

🤖 Generated with Claude Code

https://claude.ai/code/session_016QR9X5jcv9tEQQX5V9UZDu


Generated by Claude Code

…2502)

Encode the chart-data expressibility rule into the objectstack-ui skill,
pinned to what the analytics/dataset engine actually supports rather than the
draft prose in the issue.

- SKILL.md (Dataset-Bound Widgets): reframe around the real boundary. Every
  persisted chart is dataset-backed (ADR-0021 single-form cutover), so the
  decision is not "inline vs dataset" but "does the need fit the dataset
  envelope". Adds a Level A ceiling table (fits -> dataset; beyond -> Cube /
  stored rollup field / app code), an iron-rule callout, standardized answers
  for the recurring ambiguous cases (parent->child rollup, computed column,
  lookup filter, dashboard filter -> #2501), and a Level B note that naming a
  dataset is governance, not expressibility. Also corrects the Dashboards
  intro that still described the removed inline widget shape.
- evals/analytics-inline-vs-dataset.json: first working evals for this skill,
  encoding the key decisions in the proven must_contain/must_not_contain
  format.
- dashboard.zod.ts: fix the @example that still showed the removed inline
  widget shape (object/valueField/aggregate), which contradicted the
  now-required `dataset` field declared a few lines below it.

Follow-ups intentionally left out of this change: service-analytics/README.md
documents a retired API surface (HAVING, old IAnalyticsService methods) and
needs a full rewrite; the inline-embedded-dataset schema change and the
save-as-dataset promotion flow are larger, cross-repo design items tracked on
the issue.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016QR9X5jcv9tEQQX5V9UZDu
@vercel

vercel Bot commented Jul 18, 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 Jul 18, 2026 5:01pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:ui size/m labels Jul 18, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

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

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/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/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.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 @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.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.

@os-zhuang
os-zhuang marked this pull request as ready for review July 19, 2026 02:03
@os-zhuang
os-zhuang merged commit fe2a1e3 into main Jul 19, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/chart-data-inline-dataset-uz4ygf branch July 19, 2026 14:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:ui size/m

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants