Skip to content

feat(sdk): op-based extensions/mode-sets/ grammar for platform manifests - #1449

Open
GarthDB wants to merge 2 commits into
mainfrom
feat/mode-set-ops
Open

feat(sdk): op-based extensions/mode-sets/ grammar for platform manifests#1449
GarthDB wants to merge 2 commits into
mainfrom
feat/mode-set-ops

Conversation

@GarthDB

@GarthDB GarthDB commented Sep 11, 2026

Copy link
Copy Markdown
Member

Description

Platform manifests could previously only declare-or-replace a whole mode set by name under extensions/mode-sets/, forcing a platform to restate every other foundation mode value just to add one (e.g. a third scale mode). This adds an op-based grammar — addMode / removeMode / setDefault / remove — mirroring the existing extensions/relationships/ add/override/remove precedent, while leaving the no-op whole-set add/replace behavior unchanged.

Related Issue

No open issue tracked this; came out of a design discussion about supporting custom mode declarations (e.g. high contrast, additional color schemes/scale modes) without full-set restatement.

Motivation and Context

Redeclaring a full mode set to add one value drifts from foundation as foundation evolves. Granular ops let a platform add/drop a single mode value, retarget the default, or drop a whole set, without restating the rest.

How Has This Been Tested?

  • 14 new unit tests in sdk/core/src/graph.rs covering every op's success and error paths (missing target, missing required field, unknown op, removing the current default, removing the last mode, retargeting to a non-member default), plus an end-to-end cascade-resolution test.
  • 2 new unit tests in sdk/core/src/manifest.rs verifying op-only fragments bypass schema validation and that plain adds are ordered before ops regardless of file sort order.
  • 8 new conformance fixtures (4 valid, 4 invalid) under packages/design-data-spec/conformance/manifest-extensions/.
  • Full design-data-core lib suite (cargo nextest run via moon run sdk:test) passes.
  • cargo clippy -p design-data-core --lib -- -D warnings shows no new warnings (pre-existing has_relationship_record dead-code warning predates this change).

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • I have signed the Adobe Open Source CLA.
  • My code follows the code style of this project.
  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have read the CONTRIBUTING document.
  • I have added tests to cover my changes.
  • All new and existing tests passed.

Platforms could previously only declare-or-replace a whole mode set, forcing
a full restatement of foundation's other modes to add just one value. This
adds addMode/removeMode/setDefault/remove ops, mirroring the existing
extensions/relationships/ add/override/remove grammar.

- sdk/core/src/manifest.rs: dedicated mode-sets/ loader block partitioning
  plain adds before ops; new FragmentValidation::ModeSetAdds variant.
- sdk/core/src/graph.rs: op dispatch in apply_platform_manifest with loud
  validation errors for missing fields, unknown ops, and invalid targets.
- sdk/core/src/lib.rs: conformance harness gains absent/modes/default
  predicates for modeSets.
- packages/design-data-spec/spec/{manifest,mode-sets}.md: documented the
  op grammar and updated the capability matrix.
- packages/design-data-spec/conformance/manifest-extensions/: new valid and
  invalid fixtures covering each op.
@changeset-bot

changeset-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 414d5c4

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@adobe/design-data-spec Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actions Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

Run report for 414d5c44

Total time: 2m 19s | Comparison time: 4m 4s | Estimated savings: 1m 45s (42.9% faster)

Action Time Status Info
⬛️ SetupProto(0.57.4) 0ms Skipped
🟩 SyncWorkspace 10.5ms Passed
🟩 SyncProject(sdk) 0.4ms Passed
⬛️ SetupToolchain(node:20.17.0) 859.9ms Skipped
⬛️ SetupToolchain(rust:1.88.0) 1.5s Skipped
🟩 SetupEnvironment(rust, sdk) 100.5ms Passed
⬛️ InstallDependencies(rust, sdk) 2.7ms Skipped
⬛️ SetupToolchain(pnpm:10.17.1) 1.3s Skipped
⬛️ SetupToolchain(javascript) 0ms Skipped
⬛️ SetupEnvironment(javascript, sdk) 0.6ms Skipped
🟩 RunTask(sdk:fmt-check) 756.3ms Passed
🟩 InstallDependencies(javascript, sdk) 7.1s Passed
🟩 RunTask(sdk:codegen-check) 299.8ms Passed
🟩 RunTask(sdk:lint) 46s Passed
🟩 RunTask(sdk:test-doc) 1m 38s Passed
🟩 RunTask(sdk:test) 2m 10s Passed SLOW
Changed files
.changeset/mode-set-ops.md
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-remove-mode-of-default/expected-errors.json
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-remove-mode-of-default/extensions/mode-sets/remove-desktop.json
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-remove-mode-of-default/extensions/mode-sets/scale.json
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-remove-mode-of-default/manifest.json
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-set-default-nonmember/expected-errors.json
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-set-default-nonmember/extensions/mode-sets/default-tv.json
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-set-default-nonmember/extensions/mode-sets/scale.json
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-set-default-nonmember/manifest.json
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-target-not-found/expected-errors.json
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-target-not-found/extensions/mode-sets/add-tv.json
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-target-not-found/manifest.json
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-unknown-op/expected-errors.json
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-unknown-op/extensions/mode-sets/bogus.json
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-unknown-op/extensions/mode-sets/scale.json
packages/design-data-spec/conformance/manifest-extensions/invalid/mode-set-unknown-op/manifest.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-add-mode/expected.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-add-mode/extensions/mode-sets/add-tv.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-add-mode/extensions/mode-sets/scale.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-add-mode/manifest.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-remove-mode/expected.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-remove-mode/extensions/mode-sets/color-scheme.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-remove-mode/extensions/mode-sets/remove-wireframe.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-remove-mode/manifest.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-remove/expected.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-remove/extensions/mode-sets/contrast.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-remove/extensions/mode-sets/remove-contrast.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-remove/manifest.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-set-default/expected.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-set-default/extensions/mode-sets/default-tv.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-set-default/extensions/mode-sets/scale.json
packages/design-data-spec/conformance/manifest-extensions/valid/mode-set-set-default/manifest.json
packages/design-data-spec/spec/manifest.md
packages/design-data-spec/spec/mode-sets.md
sdk/core/src/graph.rs
sdk/core/src/lib.rs
sdk/core/src/manifest.rs

@github-actions

Copy link
Copy Markdown
Contributor

🧩 Component Schema Changes Report

No component schema changes detected.

This comment was automatically generated by the component schema diff tool. 🤖

@github-actions

Copy link
Copy Markdown
Contributor

🎨 Token Changes Report

Tokens Changed (0)

Original Branch: main


This comment was automatically generated by the token diff tool. 🤖

… fields

Addresses PR review findings on the mode-set op grammar:

- sdk/core/src/graph.rs: removeMode and remove now check the resolved graph
  for tokens still carrying the affected mode value/mode-set key, erroring
  instead of silently orphaning them for cascade matching (mirrors the
  authoring API's remove_mode/remove_mode_set "still referenced" guard).
- sdk/core/src/graph.rs: a non-string "op" now errors instead of falling
  through to the plain add/replace path; op entries missing "name" now error
  instead of being silently skipped.
- packages/design-data-spec/spec/manifest.md: documented both guards.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant