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

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

Request Review

@os-zhuang

Copy link
Copy Markdown
Contributor Author

Renderer companion: objectstack-ai/objectui#2237

os-zhuang and 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

github-actions Bot commented Jul 4, 2026

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 main Jul 4, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the feat/adaptive-layout-2578 branch July 4, 2026 17:10
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