Skip to content

feat(spec,lint): adaptive record surface + semantic span + navigation.size (#2578) - #2595

Merged
os-zhuang merged 3 commits into
mainfrom
feat/adaptive-layout-2578
Jul 4, 2026
Merged

feat(spec,lint): adaptive record surface + semantic span + navigation.size (#2578)#2595
os-zhuang merged 3 commits into
mainfrom
feat/adaptive-layout-2578

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Framework / spec side of #2578. All metadata is AI-authored, so the design goal is to make AI unable to get presentation wrong — presentation (surface / width / columns) is runtime-derivable, so none of it is an authored key.

What

  • deriveRecordSurface (spec/src/data/record-surface.ts) — the default record surface (page vs drawer/modal) derived from authorable field count; mobile always pages. A derivation, not an authored key: a recordSurface object key fails ADR-0085 §2's admission test (field count is machine-inferable). Explicit override remains the assigned-page path.
  • FormField.span (auto | full) — relative field width, decoupled from the per-surface derived column count; replaces the fragile absolute colSpan (retained + clamped by the renderer).
  • NavigationConfig.size (auto | sm | md | lg | xl | full) — T-shirt overlay size aligned with FormView.modalSize; deprecates the pixel width / drawerWidth (a pixel width can't be authored blind — the author doesn't know the client viewport). auto ⇒ renderer derives size from field count + viewport, AI writes nothing.
  • validateFormLayout lint — form-field-unknown + absolute-colspan-discouraged (both warnings with fix hints; ADR-0078/0019, same bar for AI and hand authors).
  • ADR-0085 §2 clarification (records recordSurface as rejected, to prevent re-proposal) + changeset.

Tests

  • spec 6677 tests + check:api-surface (regenerated, additive) — green
  • lint 121 tests — green

Companion

Renderer side lives in objectstack-ai/objectui (companion PR). Build-independent: objectui ships a local mirror of deriveRecordSurface pending this spec's release, then consolidates to the import.

Refs #2578

🤖 Generated with Claude Code

@vercel

vercelBot commented Jul 4, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJul 4, 2026 5:06pm

Request Review

@os-zhuang

Copy link
Copy Markdown
ContributorAuthor

Renderer companion: objectstack-ai/objectui#2237

os-zhuangand others added 3 commits July 5, 2026 00:57
Step 1 (framework) of #2578 — field-heavy objects, AI-authored:
- deriveRecordSurface(def, opts): pure spec derivation of the default record
surface (page vs drawer/modal) from authorable (visible, non-system) field
count; mobile forces page. A DERIVATION, not an authored key — a
`recordSurface` object key fails ADR-0085 §2's admission test (field count is
machine-inferable, modal-vs-page is pure re-arrangement).
- FormField.span: 'auto' | 'full' — relative field width decoupled from the
per-surface derived column count (mobile 1 / modal 2 / page 3-4); replaces
absolute colSpan as the primary primitive (colSpan retained + clamped by the
renderer). `half` deferred.
- validateFormLayout lint: form-field-unknown + absolute-colspan-discouraged
(both warnings with fix hints, ADR-0078/0019, same bar for AI + hand authors).
- ADR-0085 §2 rejected-keys clarification (recordSurface); changeset.
Additive only (0 breaking). spec 6677 tests + api-surface green; lint 121 tests
+ tsc green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…2578)
Add NavigationConfig.size ('auto'|sm|md|lg|xl|full, default 'auto'), aligned with
FormView.modalSize; deprecate the pixel `width` and `drawerWidth`. A pixel width
can't be authored blind — the author (often AI) doesn't know the client viewport.
'auto' means the renderer derives the size from field count and clamps to the
viewport, so AI writes nothing. Additive; api-surface unchanged.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

90 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/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/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/cloud-artifact-api.mdx(via packages/spec)
  • content/docs/deployment/troubleshooting.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/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/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/storage-service.mdx(via packages/spec)
  • content/docs/kernel/services-checklist.mdx(via @objectstack/spec)
  • content/docs/permissions/authorization.mdx(via packages/spec)
  • content/docs/permissions/permission-sets.mdx(via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx(via @objectstack/spec)
  • content/docs/permissions/profiles.mdx(via @objectstack/spec)
  • content/docs/permissions/roles.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/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/implementation-status.mdx(via @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v9.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/setup-app.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 a8df396 into mainJul 4, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the feat/adaptive-layout-2578 branch July 4, 2026 17:10
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:dataprotocol:uiteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@os-zhuang