Skip to content

feat(spec): ADR-0085 semantic roles — stageField, highlightFields rename, detail block removal, collapse enum, shared fieldGroups derivation#2521

Merged
os-zhuang merged 4 commits into
mainfrom
feat/adr-0085-spec-semantic-roles
Jul 2, 2026
Merged

feat(spec): ADR-0085 semantic roles — stageField, highlightFields rename, detail block removal, collapse enum, shared fieldGroups derivation#2521
os-zhuang merged 4 commits into
mainfrom
feat/adr-0085-spec-semantic-roles

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Executes ADR-0085 (#2520) in the spec layer. Companion objectui changes tracked separately (objectui#2149 revision + consumer switch).

What

@objectstack/spec

  • stageField: string | false typed at top level — the lifecycle-role key renderers already read (false = declared non-linear, suppress stage heuristics).
  • compactLayouthighlightFields — ordered most-important fields (default list columns, cards, child previews, detail highlight strip). Old key remains a parse-time alias, preserved on output (ADR-0079 displayNameField pattern).
  • fieldGroups[].collapse: 'none' | 'expanded' | 'collapsed' replaces defaultExpanded and the UI-dialect collapsible/collapsed pair (both alias-mapped at parse for one minor). visibleOn removed — zero consumers anywhere (ADR-0049 enforce-or-remove).
  • detail passthrough block removed — zero authors across framework+objectui; the typed hideReferenceRail was a proven no-op for spec authors; renderViaSchema retires with the legacy monolith render path (separate objectui PR).
  • New deriveFieldGroupLayout(def) in @objectstack/spec/data — single source of the fieldGroups rendering semantics; retires the two near-identical copies in objectui (consumer-switch PR follows).
  • Liveness ledger updated accordingly.

@objectstack/lint + os lint

  • New validateSemanticRoles: warns on dangling Field.group, declared-but-empty groups, unknown stageField/highlightFields names — Zod-valid-but-silently-inert pointers (ADR-0078 completeness gate).

@objectstack/platform-objects / examples

  • 35 system objects + app-todo renamed compactLayout:highlightFields: (behaviour unchanged via alias).

Verification

  • spec 6666/6666, lint 112/112, cli 440/440, platform-objects 63/63 tests green
  • check:api-surface unchanged ✓ (no export removals — key-level schema changes only)
  • check:liveness green (all governed properties classified)
  • app-todo example typecheck green after migration

Versioning note

detail/visibleOn removal is breaking on paper, dead in practice (zero-author evidence in the ADR). Shipped as minor under the documented dead-surface exception (PR #2272 precedent) — release owner may bump to major at version time.

🤖 Generated with Claude Code

…ame, detail block removal, collapse enum, shared fieldGroups derivation

Executes ADR-0085 (#2520) in the spec layer:

- ObjectSchema gains stageField: string | false (lifecycle role; false
  suppresses stage heuristics) — legitimizes the key renderers already read.
- compactLayout → highlightFields (ordered most-important fields; drives
  default columns, cards, previews, detail highlight strip). Old key stays a
  parse-time alias, preserved on output (ADR-0079 pattern). 35 platform
  objects + app-todo migrated.
- fieldGroups[].collapse enum replaces defaultExpanded and the UI-dialect
  collapsible/collapsed pair (both aliased at parse for one minor);
  visibleOn removed (zero consumers, ADR-0049 enforce-or-remove).
- detail passthrough UI-hints block removed (zero authors; the typed
  hideReferenceRail was a proven no-op; renderViaSchema retires with the
  legacy monolith render path in objectui).
- New @objectstack/spec/data deriveFieldGroupLayout — single source of the
  grouping semantics (declared order, empty groups dropped, ungrouped
  trailing bucket minus system fields, collapse passthrough incl. aliases).
- New @objectstack/lint validateSemanticRoles (wired into os lint): warns on
  dangling Field.group / empty declared groups / unknown stageField &
  highlightFields names (ADR-0078 completeness gate).
- Liveness ledger updated (detail dropped; highlightFields + stageField
  registered live; compactLayout marked deprecated alias).

spec 6666 tests, lint 112, cli 440, platform-objects 63 all green;
api-surface unchanged; check:liveness green; app-todo typecheck green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 2, 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 2, 2026 3:47pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:data tests tooling size/l labels Jul 2, 2026
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 5 package(s): @objectstack/cli, @objectstack/dogfood, @objectstack/lint, @objectstack/platform-objects, @objectstack/spec.

95 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/cli, 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/cli, @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/cli, @objectstack/platform-objects, @objectstack/spec)
  • content/docs/concepts/setup-app.mdx (via @objectstack/platform-objects, @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/cli, @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/cli, @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/authentication.mdx (via @objectstack/cli)
  • 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/cli, @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/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/cli, 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/cli, @objectstack/platform-objects, @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/cli, @objectstack/spec)
  • content/docs/guides/public-forms.mdx (via @objectstack/spec)
  • content/docs/guides/runtime-services/data-service.mdx (via packages/cli)
  • content/docs/guides/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/index.mdx (via packages/cli, 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 packages/cli, @objectstack/spec)
  • content/docs/guides/solutions/approval-workflow.mdx (via packages/spec)
  • content/docs/guides/solutions/create-vs-edit-form.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/cli, @objectstack/spec)
  • content/docs/protocol/objectos/realtime-protocol.mdx (via @objectstack/cli)
  • 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.

…-0085)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…sition

Browser dogfood of the rename found a live gap: metadata authored with the
canonical highlightFields key parsed to output WITHOUT compactLayout, so
current renderers that still read the old key (ObjectGrid default columns,
card compact views, vendored console) silently lost their curated field
list. The alias now mirrors both directions (canonical wins when both are
present); the back-fill is removed together with the deprecated key.

Verified end-to-end in a running app (app-todo, HMR console against the
worktree server): default list columns, mobile card fields, detail
highlight strip, stageField stepper, and field-group form sections all
render from the renamed keys.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ADR-0085 §3 removed fieldGroups[].visibleOn from ObjectSchema (declared,
zero consumers — enforce-or-remove per ADR-0049). The ADR-0060 ratchet
correctly flagged the ledger row as a stale cover; drop it until the key
returns with a real enforcement path.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@os-zhuang os-zhuang merged commit 5178906 into main Jul 2, 2026
17 checks passed
@os-zhuang os-zhuang deleted the feat/adr-0085-spec-semantic-roles branch July 2, 2026 15:53
os-zhuang added a commit that referenced this pull request Jul 3, 2026
…) (#2539)

The ADR-0085 deprecation window is closed: consumers switched in
objectui#2168, shipped via the console pin (#2526), one release soaked.

- ObjectSchema drops the compactLayout declaration: create() rejects it
  (unknown key), lenient parse strips it — no silent aliasing either way.
- normalizeSemanticRoleAliases loses both directions (alias + the #2521
  back-fill mirror); served metadata carries highlightFields only.
- 27 straggler system-object authors (plugins/services, missed by the
  #2521 sweep — the type gate caught the first one) renamed.
- liveness ledger drops the compactLayout row; the dogfood mirror
  assertion (#2528) flips to expect ABSENCE, exactly as it was designed
  to force in the retirement PR.
- Downstream smoke pin → hotcrm v1.2.2 (hotcrm#424, same rename).

spec 6666 + dogfood 181 green; api-surface unchanged; check:liveness ✓.

Closes #2536

Co-authored-by: Claude Fable 5 <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:data size/l tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant