Skip to content

feat(showcase): page-local state demo + flip variables @experimental→live (ADR-0049)#2269

Merged
os-zhuang merged 1 commit into
mainfrom
feat/page-variables-adr0049
Jun 24, 2026
Merged

feat(showcase): page-local state demo + flip variables @experimental→live (ADR-0049)#2269
os-zhuang merged 1 commit into
mainfrom
feat/page-variables-adr0049

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

What

Promotes PageSchema.variables from @experimental to live (ADR-0049) and ships a worked example. The end-to-end page-variable loop is now implemented in objectui (companion PR objectstack-ai/objectui#1957): page state is injected into the expression context as page.<var>, element:record_picker writes a variable via source, and visibility predicates gate live.

Changes

  • spec (packages/spec/src/ui/page.zod.ts) — replace the @experimental marker on PageSchema.variables with live docs; enrich PageVariableSchema (binding direction: a variable names its writer component via source, e.g. { name: 'selectedProjectId', source: 'project_picker' }).
  • showcase — new master/detail page showcase_page_variables: a record picker writes selectedProjectId; a detail panel gates on page.selectedProjectId != '' (empty-state hint on == ''). Wired into navigation + the app config.
  • dogfood test (test/page-variables.test.ts) — asserts the wiring is coherent (variable bound to a real picker id) and the gating predicates actually flip with the variable (mutually-exclusive empty/detail states), plus config + nav registration.

Verification

  • Spec page tests green; the showcase page parses under the current spec with its wiring intact.
  • Browser E2E (against this showcase served by a dev backend, rendered by the objectui#1957 console): picking a project reveals the detail panel live, no reload.

Requires objectstack-ai/objectui#1957 for the runtime behavior.

🤖 Generated with Claude Code

@vercel

vercel Bot commented Jun 24, 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 24, 2026 7:05am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

91 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 @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/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 @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.

…live (ADR-0049)

The page-variable end-to-end loop is now implemented in objectui (page state
injected as `page.<var>`, element:record_picker writes via `source`, visibility
gates live), so promote PageSchema.variables from @experimental to live and ship
a worked example.

- spec: replace the @experimental marker on PageSchema.variables with live docs;
  enrich PageVariableSchema (binding direction: a variable names its writer
  component via `source`).
- spec liveness ledger: flip page.variables experimental→live with the objectui
  consumer cited (packages/spec/liveness/page.json) — passes check:liveness.
- showcase: new master/detail page `showcase_page_variables` — a record picker
  writes `selectedProjectId`; a detail panel gates on `page.selectedProjectId`.
  Wired into navigation + the app config.
- dogfood test: asserts the wiring is coherent and the gating predicates flip
  with the variable (mutually exclusive empty/detail states) + registration.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@os-zhuang
os-zhuang force-pushed the feat/page-variables-adr0049 branch from 9fdae2f to d4fae4e Compare June 24, 2026 07:02
@github-actions github-actions Bot added documentation Improvements or additions to documentation tooling labels Jun 24, 2026
@os-zhuang
os-zhuang merged commit 2be5c1f into main Jun 24, 2026
16 of 17 checks passed
@os-zhuang
os-zhuang deleted the feat/page-variables-adr0049 branch June 24, 2026 07:06
os-zhuang added a commit that referenced this pull request Jun 24, 2026
…ig removal (#2268) (#2272)

#2268 hard-removed 16 dead exports (6 from ./ui Blank/RecordReview, 10 from
./studio PageBuilder/Canvas/Palette) and #2265 added PAGE_TYPE_ROADMAP, but the
committed api-surface.json snapshot was never regenerated — so check:api-surface
has been red on main for every PR touching packages/spec/** (surfaced on #2269).

Regenerate the snapshot to match the built surface. Diff is exactly the 16
intentional removals + PAGE_TYPE_ROADMAP; api-surface-signatures.json unchanged;
the frozen downstream-contract gate is unaffected (it never referenced these
symbols).

Kept at minor (not a major bump) as a deliberate, documented exception to the
ADR-0059 §4 freeze contract — see the appended note in the #2268 changeset. The
removed symbols are config for renderless page types with no plausible
functional consumer; the pre-publish hotcrm live gate guards any real break.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
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 tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant