Canonical Release Workflow
The canonical workflow treats the design system and its consumers as independently shipped artifacts. The design-system team releases on its own cadence; consumers bump when they need new capabilities or bug fixes.
When to use
Section titled “When to use”- The design-system change is self-contained and doesn’t need active validation by a specific consumer.
- The consumer can wait for a stable release before adopting.
- This is the default for any change that doesn’t justify the overhead of preview or local-link workflows.
Sequence
Section titled “Sequence”In ux-prototype
Section titled “In ux-prototype”- Branch off
main:git checkout -b <username>/<description>. - Implement the change. Follow the Storybook developer-workflow page for component and test conventions.
- Update CHANGELOG.md with a stable entry:
## [x.y.z] - YYYY-MM-DDunder one of the categories defined in.github/clq/changemap.json(Added,Changed,Fixed, etc.). - Push the branch. CI runs lint, typecheck, tests, VRT, and Storybook build. The
validate-releasejob rejects pre-release entries on PRs tomain, so use a stablex.y.zhere. - Open a PR to
main. Address Copilot/Codex review comments and obtain reviewer approval. - Merge. On the merge commit:
publish.ymlbuilds and publishes the package version (extracted from the changelog entry) to GitHub Packages with dist-taglatest.tagjob inci.ymlcreates a GitHub Release atvX.Y.Zwith the changelog body as release notes.
In the consuming app (e.g. arda-frontend-app)
Section titled “In the consuming app (e.g. arda-frontend-app)”- Decide to upgrade. Triggers can be: needing a new capability, a bug fix, security patch, or a routine dependency-update cycle.
- Bump the dependency:
Or pin to an exact version with
Terminal window npm install @arda-cards/design-system@latest--save-exactif reproducibility matters more than transparent patch upgrades. - Test locally that the new version doesn’t break anything (typecheck, unit tests, manual smoke).
- Open a PR in the consumer repo with the bumped
package.json+package-lock.json. - Merge following the consumer’s normal PR process.
Contracts
Section titled “Contracts”- Backwards compatibility: stable releases follow semver. Major-version bumps are reserved for breaking changes; minor for additive changes; patch for bug fixes. The
.github/clq/changemap.jsoninux-prototypeenforces the bump category from the changelog category. - Stable releases never carry preview suffixes: the
validate-releasegate inux-prototype/.github/workflows/ci.ymlrejects PRs tomainwhose changelog entry is a pre-release. latestdist-tag: onlypublish.yml(running onmainpush) updateslatest. Branch publishes use other dist-tags. See version-and-tag-conventions.
Trade-offs
Section titled “Trade-offs”| Pro | Con |
|---|---|
| Simple, predictable, well-understood | Slowest feedback loop — consumer can’t validate until after design-system ships |
| Stable releases never disappear — consumers can always pin | If a stable release breaks consumers, rollback requires a new patch release |
| Independent cadences — neither team blocks the other | Coordination of breaking changes happens via release notes only |
When to escalate
Section titled “When to escalate”If you’re in the middle of this workflow and discover the change actually requires consumer-side validation before shipping stable, switch to either preview publish (for asynchronous validation) or coordinated multi-PR (for synchronous gating).
Copyright: © Arda Systems 2025-2026, All rights reserved