Skip to content

feat(spec): interface pages own their view metadata directly (revise ADR-0047 iron rule)#2050

Merged
os-zhuang merged 2 commits into
mainfrom
feat/interface-page-owns-view
Jun 19, 2026
Merged

feat(spec): interface pages own their view metadata directly (revise ADR-0047 iron rule)#2050
os-zhuang merged 2 commits into
mainfrom
feat/interface-page-owns-view

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Summary

Validating the Studio config panel against Airtable's Interface Designer surfaced that Airtable has no "inherit from a separate view" concept — an interface page defines its data surface (columns, sort, base filter, visualizations, toolbar) directly. This brings ObjectStack to parity and removes the confusing "Source View" picker.

Spec (packages/spec/src/ui)

  • page.zod.tsInterfacePageConfigSchema gains its own columns (string[] | ListColumnSchema[]) and sort; filterBy is the always-on base filter. sourceView is now @deprecated, kept only as a runtime back-compat fallback.
  • page.form.ts — the inspector now follows Airtable's IA:
    Data (Source → Columns → Filter By → Levels) · Appearance · User filters · User actions.
    The Source View picker is removed, replaced by a Columns field picker (widget: field-multi, dependsOn: source). Iron-rule helptext rewritten.

ADR

  • 0047 revised: the "iron rule" (pages reference views, never restate them) is superseded. The page is now the single place columns/sort/filter live.

Showcase migrated to the new model

  • task-triage.page.ts, task-workbench.page.ts define columns directly and drop sourceView.

Verification (browser, live backend)

  • Page editor shows Source / Columns / Filter By — no Source View.
  • Picking columns in the inspector re-renders the preview live (# / 标题 / 状态 / 优先级).
  • Both showcase pages render their own column sets — task-workbench shows Estimate (h), which the object's default view omits, proving the page defines columns independently (not inherited).

Pairs with the objectui runtime PR (InterfaceListPage reads page-owned columns/sort with a view→object fallback).

🤖 Generated with Claude Code

os-zhuang and others added 2 commits June 19, 2026 22:03
…ADR-0047 iron rule)

Airtable parity: an interface (list) page now defines its data surface DIRECTLY
as metadata — columns, base filter, sort — instead of inheriting them from a
referenced object view ("sourceView"). There is no "inherit from a separate
view" concept anymore; the page IS the view definition.

Spec (packages/spec/src/ui):
- page.zod.ts — InterfacePageConfigSchema gains its own `columns`
  (string[] | ListColumnSchema[]) and `sort`; `filterBy` clarified as the
  always-on base filter. `sourceView` is now @deprecated, kept only as a
  runtime back-compat fallback.
- page.form.ts — the inspector follows Airtable's IA: Data (Source → Columns →
  Filter By → Levels) · Appearance · User filters · User actions. The
  "Source View" picker is removed and replaced by a Columns field picker
  (widget: field-multi, dependsOn: source). Iron-rule helptext rewritten.

Showcase migrated to the new model (define columns directly, drop sourceView):
- task-triage.page.ts, task-workbench.page.ts.

Pairs with the objectui runtime change that reads page-owned columns/sort with
a view→object fallback. Browser-verified: the page editor shows Source/Columns/
Filter By (no Source View); picking columns re-renders the preview live; both
showcase pages render their own column sets (workbench shows Estimate (h), which
the object default view omits — proving independence).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…rectly (supersede iron rule)

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

vercel Bot commented Jun 19, 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 19, 2026 2:06pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:ui size/s and removed documentation Improvements or additions to documentation protocol:ui labels Jun 19, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

89 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/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 @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/email-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/index.mdx (via packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx (via packages/spec)
  • 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/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx (via @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.

@os-zhuang
os-zhuang merged commit 04ed478 into main Jun 19, 2026
14 of 16 checks passed
@os-zhuang
os-zhuang deleted the feat/interface-page-owns-view branch June 19, 2026 14:07
Sign up for free to 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.

1 participant