From 832d610d3d08eb27338fa273f79a6304fc0db96c Mon Sep 17 00:00:00 2001 From: garthdb Date: Thu, 10 Sep 2026 09:41:52 -0600 Subject: [PATCH 1/5] fix(design-data): drop stale corner-radius-button-extra-large tokenBinding Part of bead vpk.2 (SPEC-027 button.json cleanup). Confirmed via relationships/button.json's "Rounding (with wrapping)" CTR entry ($ref d639a0b5-16b4-4d75-ab37-d87815c7b500 -> layout.tokens.json corner-radius size:xl) that the extra-large slot is already correctly modeled through the CTR relationship. The legacy corner-radius-button- extra-large key doesn't exist anywhere in tokens/ -- pure dangling tokenBindings entry, safe to drop outright. The other two dangling entries (corner-radius-button-small/-large) still need a design-owner call between the corner-radius-small-size-* and corner-radius-medium-size-* legacy families before they can be rebound or removed -- left as-is pending that sign-off. - packages/design-data/components/button.json: removes the corner-radius-button-extra-large tokenBindings entry. Co-Authored-By: Claude Opus 4.8 (1M context) --- packages/design-data/components/button.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/design-data/components/button.json b/packages/design-data/components/button.json index 7c53fd8c2..424698c73 100644 --- a/packages/design-data/components/button.json +++ b/packages/design-data/components/button.json @@ -199,10 +199,6 @@ { "token": "corner-radius-button-large", "context": "Rounding (with wrapping)" - }, - { - "token": "corner-radius-button-extra-large", - "context": "Rounding (with wrapping)" } ], "accessibility": { From 34ab996bbed5b0a6cb335a7a00a7cecf26b5cc54 Mon Sep 17 00:00:00 2001 From: garthdb Date: Thu, 10 Sep 2026 09:42:27 -0600 Subject: [PATCH 2/5] chore: add changeset for button.json corner-radius binding cleanup Co-Authored-By: Claude Opus 4.8 (1M context) --- .changeset/button-corner-radius-extra-large-binding.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .changeset/button-corner-radius-extra-large-binding.md diff --git a/.changeset/button-corner-radius-extra-large-binding.md b/.changeset/button-corner-radius-extra-large-binding.md new file mode 100644 index 000000000..d862328d1 --- /dev/null +++ b/.changeset/button-corner-radius-extra-large-binding.md @@ -0,0 +1,9 @@ +--- +"@adobe/spectrum-design-data": patch +--- + +Drop a stale, unresolvable `tokenBindings` entry from `button.json` (part of bead vpk.2). + +- **packages/design-data/components/button.json**: removes the `corner-radius-button-extra-large` + tokenBindings entry — the legacy key doesn't exist in the corpus and the slot is already + correctly modeled via the `Rounding (with wrapping)` CTR relationship. From d50dff5694357c5339cdfc4963018079b179ffc1 Mon Sep 17 00:00:00 2001 From: garthdb Date: Thu, 10 Sep 2026 09:52:26 -0600 Subject: [PATCH 3/5] revert(design-data): restore corner-radius-button-extra-large binding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Part of bead vpk.2. Figma's S2 Token-specs "Button" page (node 8476:1743, "Rounding (with wrapping)" section) confirms this is a genuine, distinct 24px slot for the XL button size — not redundant with the existing CTR relationship. That CTR's single $ref (uuid d639a0b5) resolves to a different, confusingly-named 16px value (legacy key corner-radius-extra-large-default, actually the M-size default) — it does not cover S/L/XL sizes at all. This reverts 85ee4440, which incorrectly treated the XL binding as stale and removed it. All three dangling bindings (corner-radius-button-{small,large,extra-large}) are equally blocked on a design-owner decision about which token family (small-size vs medium-size) they should resolve to — none should be removed. - packages/design-data/components/button.json: restore the corner-radius-button-extra-large tokenBindings entry. - .changeset/button-corner-radius-extra-large-binding.md: remove — the change it described was incorrect. Co-Authored-By: Claude Sonnet 5 --- .changeset/button-corner-radius-extra-large-binding.md | 9 --------- packages/design-data/components/button.json | 4 ++++ 2 files changed, 4 insertions(+), 9 deletions(-) delete mode 100644 .changeset/button-corner-radius-extra-large-binding.md diff --git a/.changeset/button-corner-radius-extra-large-binding.md b/.changeset/button-corner-radius-extra-large-binding.md deleted file mode 100644 index d862328d1..000000000 --- a/.changeset/button-corner-radius-extra-large-binding.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@adobe/spectrum-design-data": patch ---- - -Drop a stale, unresolvable `tokenBindings` entry from `button.json` (part of bead vpk.2). - -- **packages/design-data/components/button.json**: removes the `corner-radius-button-extra-large` - tokenBindings entry — the legacy key doesn't exist in the corpus and the slot is already - correctly modeled via the `Rounding (with wrapping)` CTR relationship. diff --git a/packages/design-data/components/button.json b/packages/design-data/components/button.json index 424698c73..7c53fd8c2 100644 --- a/packages/design-data/components/button.json +++ b/packages/design-data/components/button.json @@ -199,6 +199,10 @@ { "token": "corner-radius-button-large", "context": "Rounding (with wrapping)" + }, + { + "token": "corner-radius-button-extra-large", + "context": "Rounding (with wrapping)" } ], "accessibility": { From 9c5f5f6d7c43f369217aed64b51edf8de8559b20 Mon Sep 17 00:00:00 2001 From: garthdb Date: Fri, 11 Sep 2026 15:26:55 -0600 Subject: [PATCH 4/5] fix(actions): validate action's latest-CLI lookup can miss the tag gh release list --limit 50 only returns the 50 most recently published releases across the whole repo. Other packages here release far more often than design-data-cli, so its tag can scroll off that window, resolving `version` to an empty string and producing a 404 when the action tries to download design-data-linux-x64 for tag "design-data-cli@". Bump the limit and fail loudly instead of building a bogus download URL if no matching tag is found. Found via GarthDB/spectrum-ios-design-data#5 CI failure. --- .github/actions/validate/action.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/actions/validate/action.yml b/.github/actions/validate/action.yml index 9215673a8..6e70c5c89 100644 --- a/.github/actions/validate/action.yml +++ b/.github/actions/validate/action.yml @@ -89,10 +89,17 @@ runs: set -euo pipefail version="${{ inputs.cli-version }}" if [[ "$version" == "latest" ]]; then + # --limit 1000: other packages in this repo release far more often + # than the CLI, so a small limit can scroll design-data-cli's tag + # off the window and silently resolve to an empty version. version=$(gh release list --repo adobe/spectrum-design-data \ - --limit 50 --json tagName \ + --limit 1000 --json tagName \ --jq '.[].tagName | select(startswith("design-data-cli@"))' \ | sed 's/^design-data-cli@//' | sort -V | tail -1) + if [[ -z "$version" ]]; then + echo "::error::could not find a design-data-cli@* release tag" >&2 + exit 1 + fi fi tag="design-data-cli@${version}" mkdir -p "$RUNNER_TEMP/design-data-cli" From a2f3b3538d5081ba3551ce9e0cf062a0cf4c7f51 Mon Sep 17 00:00:00 2001 From: garthdb Date: Sun, 13 Sep 2026 09:16:53 -0600 Subject: [PATCH 5/5] fix(actions): paginate CLI release lookup instead of raising the limit Extracts the design-data-cli@* version resolution into scripts/resolve-latest-cli-version.sh, using `gh api ... --paginate` (matching the foundation-tag lookup already in this action) instead of a fixed --limit, so a repo with many unrelated releases can't push the CLI tag past the window. Adds a test stubbing `gh` to cover many unrelated releases with no matching tag, and a match buried among them. Co-Authored-By: Claude Sonnet 5 --- .github/actions/validate/action.yml | 8 +-- .../scripts/resolve-latest-cli-version.sh | 22 ++++++++ .../resolve-latest-cli-version.test.sh | 53 +++++++++++++++++++ 3 files changed, 76 insertions(+), 7 deletions(-) create mode 100755 .github/actions/validate/scripts/resolve-latest-cli-version.sh create mode 100755 .github/actions/validate/scripts/resolve-latest-cli-version.test.sh diff --git a/.github/actions/validate/action.yml b/.github/actions/validate/action.yml index 6e70c5c89..fd9ef5a18 100644 --- a/.github/actions/validate/action.yml +++ b/.github/actions/validate/action.yml @@ -89,13 +89,7 @@ runs: set -euo pipefail version="${{ inputs.cli-version }}" if [[ "$version" == "latest" ]]; then - # --limit 1000: other packages in this repo release far more often - # than the CLI, so a small limit can scroll design-data-cli's tag - # off the window and silently resolve to an empty version. - version=$(gh release list --repo adobe/spectrum-design-data \ - --limit 1000 --json tagName \ - --jq '.[].tagName | select(startswith("design-data-cli@"))' \ - | sed 's/^design-data-cli@//' | sort -V | tail -1) + version=$("$GITHUB_ACTION_PATH/scripts/resolve-latest-cli-version.sh" adobe/spectrum-design-data) if [[ -z "$version" ]]; then echo "::error::could not find a design-data-cli@* release tag" >&2 exit 1 diff --git a/.github/actions/validate/scripts/resolve-latest-cli-version.sh b/.github/actions/validate/scripts/resolve-latest-cli-version.sh new file mode 100755 index 000000000..149ea6d43 --- /dev/null +++ b/.github/actions/validate/scripts/resolve-latest-cli-version.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +# Copyright 2026 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. + +# Prints the latest design-data-cli@* release version in , or +# nothing if none exists. Paginates through the full releases list instead of +# relying on a fixed --limit, so a repo with many non-CLI releases can't push +# the design-data-cli tag off the window. +set -euo pipefail + +repo="${1:?usage: resolve-latest-cli-version.sh }" + +gh api "repos/${repo}/releases" --paginate \ + --jq '.[].tag_name | select(startswith("design-data-cli@"))' \ + | sed 's/^design-data-cli@//' | sort -V | tail -1 diff --git a/.github/actions/validate/scripts/resolve-latest-cli-version.test.sh b/.github/actions/validate/scripts/resolve-latest-cli-version.test.sh new file mode 100755 index 000000000..068122e9c --- /dev/null +++ b/.github/actions/validate/scripts/resolve-latest-cli-version.test.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +# Copyright 2026 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. + +# Run: bash .github/actions/validate/scripts/resolve-latest-cli-version.test.sh +# +# Stubs `gh` on PATH to cover the two cases --limit 50/1000 couldn't: many +# pages of unrelated releases with no design-data-cli@ tag at all, and a +# design-data-cli@ tag buried among unrelated ones. +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +fake_bin="$(mktemp -d)" +trap 'rm -rf "$fake_bin"' EXIT + +cat > "$fake_bin/gh" <<'EOF' +#!/usr/bin/env bash +# Stands in for `gh api repos//releases --paginate --jq '...'`: emits +# what the real --jq filter would have already narrowed the paginated +# response down to. +case "$FAKE_GH_SCENARIO" in + no-match) + ;; # many unrelated releases, none matching design-data-cli@ — jq yields nothing + with-match) + printf 'design-data-cli@1.2.0\ndesign-data-cli@1.10.0\n' + ;; +esac +EOF +chmod +x "$fake_bin/gh" + +PATH="$fake_bin:$PATH" +export PATH + +got="$(FAKE_GH_SCENARIO=no-match "$script_dir/resolve-latest-cli-version.sh" adobe/spectrum-design-data)" +if [[ -n "$got" ]]; then + echo "no-match: expected empty output, got '$got'" >&2 + exit 1 +fi + +got="$(FAKE_GH_SCENARIO=with-match "$script_dir/resolve-latest-cli-version.sh" adobe/spectrum-design-data)" +if [[ "$got" != "1.10.0" ]]; then + echo "with-match: expected 1.10.0 (highest by sort -V), got '$got'" >&2 + exit 1 +fi + +echo "ok"