Skip to content

feat(spec): authoritative per-type create seeds + validating test#2270

Merged
os-zhuang merged 1 commit into
mainfrom
feat/spec-create-seeds
Jun 24, 2026
Merged

feat(spec): authoritative per-type create seeds + validating test#2270
os-zhuang merged 1 commit into
mainfrom
feat/spec-create-seeds

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Why

A recurring family found dogfooding the Studio designers: the designer creates a minimal item the spec rejects, so create → save 422s — a new dashboard lacked layout, a new script action lacks body, a new report carried stale objectName/columns. Root cause: the create-form's default shape is invented client-side (objectui createDefaults) and drifts from the spec's required fields, with nothing validating the two against each other.

Per-instance fixes (#2247 dashboard, objectui#1950 action) + guards (#2260, objectui#1950) treat the symptoms. This anchors the create shape to the spec so it can't drift — the root cause.

What (Phase 1)

  • packages/spec/src/kernel/metadata-create-seeds.ts — the single source of truth for each type's minimal valid create shape (getMetadataCreateSeed(type)), co-located with the schemas. Seeds the 9 core Studio-designer types: dashboard, action, page, view, flow, validation, hook, dataset, object.
  • metadata-create-seeds.test.ts — asserts every seed validates against its metadata-type-schemas schema (the canonical guard, at the most authoritative layer), returns fresh clones, and accounts for every schema-backed type (seeded or explicitly known-unseeded, e.g. canvas-create report).

Each seed reuses the exact shape proven save-valid (200) against the real backend while dogfooding.

Verification

vitest run metadata-create-seeds.test.ts12 passed (9 seed-validates + sanity + clone + no-silent-cap coverage).

Phase 2 (follow-up)

Expose createSeed per type via /meta/types (protocol getMetaTypes + rest), then the Studio designer (objectui anchors.ts) derives its createDefaults from the spec seed instead of hardcoding it — at which point the objectui conformance guard (objectui#1950) becomes a pure consistency check.

🤖 Generated with Claude Code

Root-cause fix for the recurring "the designer creates a minimal item the spec
rejects, so create→save 422s" family (dashboard `layout`, action `body`, report
stale anchors). The create-form's default shape was invented client-side
(objectui `createDefaults`) and drifted from the spec's required fields with
nothing validating the two against each other.

Add `metadata-create-seeds.ts` — the single source of truth for each type's
minimal valid create shape, co-located with the schemas. `metadata-create-
seeds.test.ts` asserts every seed validates against its `metadata-type-schemas`
schema (the canonical guard, at the most authoritative layer) and accounts for
every schema-backed type (seeded or explicitly known-unseeded — e.g. canvas-
create `report`). Seeds the 9 core Studio-designer types.

Phase 1 of the spec-derived create-shape contract; Phase 2 exposes `createSeed`
via /meta/types so the Studio designer derives its defaults from here instead of
re-inventing them.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@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 Building Building Preview, Comment Jun 24, 2026 7:23am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling size/m labels Jun 24, 2026
@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.

@os-zhuang
os-zhuang merged commit 3d04e06 into main Jun 24, 2026
14 of 16 checks passed
@os-zhuang
os-zhuang deleted the feat/spec-create-seeds branch June 24, 2026 07:23
os-zhuang added a commit that referenced this pull request Jun 24, 2026
…-shape contract, Phase 2) (#2276)

Phase 1 (#2270) added the authoritative minimal create seeds in
@objectstack/spec/kernel. Phase 2 delivers them to consumers: every
/meta/types entry now carries an optional `createSeed`, so the Studio
designer / CLI / API derive create defaults from the spec's single source of
truth instead of re-inventing `createDefaults` (the drift that produced the
dashboard-`layout` and action-`body` create→save 422s).

- spec: barrel-export getMetadataCreateSeed / listMetadataCreateSeedTypes from
  /kernel; add optional `createSeed` to the GetMetaTypesResponse entry schema;
  regenerate api-surface (purely additive — 2 new exports).
- objectql: getMetaTypes() attaches each type's seed to registry + runtime
  entries. Canvas-create types built interactively (report) stay absent.
- dogfood: meta-types-create-seed.dogfood.test.ts asserts /meta exposes the
  dashboard/action seeds end-to-end and omits report's (4 pass).

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 size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant