Repository navigation
feat(platforms): platform cascade in render, SPEC-076, platform-owned recipes and componentAliases (5/6) - #1581
Merged
Merged
Conversation
added 16 commits
October 31, 2026 18:07
Adds spec/artifact-moves.md and a platforms/README.md section with two worked examples. SPEC-077, SPEC-078 and lifecycle.moves are proposed, not implemented.
…ga.8.7) Design for letting a platform ship its own recipes: extensions/visuals, replace precedence, a button-ios component with a button alias, SPEC-077 to 079, loading across render, site and WASM, and a first iOS Button slice. Records the scoped exception that lets platform-owned components bind tokens directly.
SPEC-077 and SPEC-078 are reserved elsewhere.
🦋 Changeset detectedLatest commit: f077b2a The changes in this PR will be included in the next version bump. This PR includes changesets to release 15 packages
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 |
Contributor
Run report for f077b2a0Total time: 9m 13s | Comparison time: 26m 11s | Estimated savings: 16m 58s (64.8% faster)
Expanded report
Changed files |
Contributor
🎨 Token Changes ReportTokens Changed (0)Original Branch: This comment was automatically generated by the token diff tool. 🤖 |
Contributor
🧩 Component Schema Changes ReportNo component schema changes detected.This comment was automatically generated by the component schema diff tool. 🤖 |
…lper f28fb38 was dropped from this slice because main has a newer platform_cascade.rs. Main has the other cascade tests but not render_follows_the_platform_cascade or its fill_of helper, so re-apply those two on top of the current file. They render a widget through the foundation and a fixture platform and check that an override re-points the binding, an extension relationship binds an extension token, and a binding the platform removed reports a diagnostic instead of drawing nothing. Test only; no changeset.
GarthDB
force-pushed
the
feat/platform-cascade-s5
branch
from
November 1, 2026 00:30
a504c5c to
70bfd03
Compare
GarthDB
force-pushed
the
feat/platform-cascade-s5
branch
from
November 1, 2026 00:44
70bfd03 to
f077b2a
Compare
This was referenced Nov 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Squash merge is fine; the next slice is rebased onto the result.
Description
Slice 5 of 6 from #1569, into
next/visual-recipes. Stacked on slice 4 (#1580), now merged. It lets a platform manifest drive rendering and makes platform-owned visual recipes loadable and checkable.design-data renderanddesign-data siteaccept--platform <id>(orDESIGN_DATA_PLATFORM/default_platform) and apply the Foundation to Platform cascade before building scenes. WASM addsDataset.applyPlatform(manifest). With no platform selected, output is unchanged.design-data validate --platform <id> --visuals-path <dir>names each dropped binding. The iOS manifest drops itsincludewhitelist, which hid the height, padding, font-size and icon-size tokens recipes bind.extensions/visuals/<component>.jsonloads intograph.visualswithlayer: Platformand replaces the foundation recipe of the same name.manifest.schema.jsonacceptscomponentAliases; SPEC-081 (error) checks aliases.TokenGraph::canonical_componentreturns the alias target; render, site and WASM do not call it yet.component-visuals.mdandmanifest.mddescribe platform recipes;rules.yamladds SPEC-076, SPEC-079 (warning, an error one minor version later, planned), SPEC-080 (info, planned) and SPEC-081. SPEC-077 and SPEC-078 stay reserved byartifact-moves.md.artifact-moves.md(promoting and demoting one artifact between a platform and the foundation; proposed, not implemented) and proposal 014 (platform-owned visual recipes and the iOS Button).root:validate-platform-recipes(SPEC-079 guard) and its test run in CI; both are added to.github/ci-targets.json(root:test-platform-recipes-guardin.node[],root:validate-platform-recipesin.rust[]).Changesets (5):
render-platform-cascade,platform-recipe-check,platform-recipes-core,platform-recipes-spec-text,artifact-moves.Dropped from the original range because they are already on main: the override fixes released in #1573 (
bbb42746,7bd60e1d,ac5845ee,c646f953,89a6018a,674130ac) and the changeset wrap22b45707. Their changesetsfigma-export-override-modesandplatform-override-keeps-fieldswere already released and are not in this PR, so no changeset is consumed twice.Dropped only in part: the cascade audit test
f28fb389. Main has a newerplatform_cascade.rswith the other cascade tests, but notrender_follows_the_platform_cascadeor itsfill_ofhelper. The last commit of this PR (test(sdk): restore the render-follows-the-cascade test and fill_of helper, test only, no changeset) restores those two.Related Issue
Part of #1569 (sliced under bead p6ga.9).
Motivation and Context
A platform such as iOS owns tokens, components and now recipes, but render and validate only knew the foundation. Applying the cascade first makes the preview match what the platform ships, and SPEC-076 catches recipes that silently draw nothing under a platform. The planned rules and aliases are specified here so slice 6 can build on them.
How Has This Been Tested?
Run in a clean worktree on this branch (macOS):
cargo check --workspace --all-targetsat each of the 17 commits.cargo fmt --check,cargo clippy --workspace --all-targets -- -D warningsmoon run sdk:test sdk-wasm:test design-data:validate design-data:validate-dataset tokens:verifyLegacyOutput root:validate-platform-recipes root:test-platform-recipes-guard --force: 1710 Rust tests passed (2 skipped), 119 WASM tests passed; the working tree stayed clean, so no snapshot, golden or legacy output changednode tools/changeset-linter/src/cli.js check --fail-on-warnings(15 files, 0 warnings),node .github/scripts/check-ci-coverage.mjs(0 uncovered; it failed before theci-targets.jsoncommit),pnpm ai:checkpnpm-lock.yamldiff is emptysdk/cli/tests/cli_platform.rs,cli_manifest.rs(SPEC-076 throughvalidate --platform),sdk/core/tests/platform_cascade.rs, conformance fixturesinvalid/SPEC-076andinvalid/SPEC-081,validate-platform-recipes.test.mjs, andsdk/wasm/test/render.test.js.Screenshots (if appropriate):
None.
Types of changes
Checklist:
Review guide (reading order)
docs/proposals/014-platform-owned-visual-recipes.md(long; the intent), thenpackages/design-data-spec/spec/component-visuals.md,manifest.md,rules/rules.yaml,schemas/manifest.schema.json.sdk/core/src/manifest.rs,graph.rs: loading platform visuals,componentAliases,canonical_component.sdk/core/src/validate/rules/spec076.rs,spec081.rs,validate/mod.rs, and the fixturesconformance/invalid/SPEC-076,SPEC-081.sdk/cli/src/main.rs,sdk/cli/tests/cli_platform.rs,cli_manifest.rs; thensdk/plugins/siteandsdk/wasm/src/dataset.rs,test/render.test.js: render and site through a platform.platforms/ios/manifest.json,platforms/README.md..github/scripts/validate-platform-recipes.mjs, its test and fixtures,moon.yml,.github/ci-targets.json.packages/design-data-spec/spec/artifact-moves.md,index.md(docs only, independent of the rest)..changeset/.