- Status: Accepted
- Date: 2026-07-20
- Decision makers: EDS Core Team
The production token pipeline is a bidirectional Figma REST sync (packages/eds-tokens-sync) plus a local Style Dictionary build (packages/eds-tokens-build → packages/eds-tokens). It is custom code against undocumented Figma internals, and the designers are reworking the token architecture in the Tokens Studio platform (tokens.studio), whose colour formulas (set_chroma(set_lightness(...))) the legacy toolchain cannot evaluate at all.
A decision was needed on how tokens flow from the design tool into this repository for the reworked token system: which system is the source of truth, what triggers an update, how CI authenticates, and what lands in the repo.
Two platform properties shaped the design:
- Releases are immutable, semver-named snapshots that can fire CI triggers — a natural, reproducible pipeline anchor.
- The platform has no undo, rollback or restore — only a read-only version history of releases — and plugin changes push to Studio in real time, so a designer mistake propagates immediately and everything between releases is unprotected.
- Retire the custom Figma-REST sync and its maintenance burden
- Token updates must be reproducible and reviewable, not ad-hoc syncs
- No long-lived secrets in CI
- The platform is the only thing that can evaluate its own colour formulas — outputs must come from its exports (see ADR-0008)
- Recoverability: designer mistakes must be recoverable at finer granularity than releases
- The legacy pipeline must keep owning the published artifacts until the rework graduates (coexistence, not big-bang)
Continue with eds-tokens-sync + Style Dictionary against the new token architecture.
Pros:
- No new platform dependency; familiar tooling
Cons:
- The reworked architecture is authored in Tokens Studio; Figma variables are a downstream projection of it
- Style Dictionary cannot evaluate the platform's colour formulas
- Keeps the custom sync code alive indefinitely
Designers or developers export from the Studio UI and open PRs.
Pros:
- No CI integration to build or authenticate
Cons:
- Manual, error-prone, and unversioned between exports
- No guarantee the committed state matches a platform release
- Scales with people instead of automation
Tokens Studio's outbound CI trigger fires a GitHub workflow on every release; the workflow pulls and exports via the studio CLI and opens a PR.
Pros:
- Every update is anchored to an immutable release and lands as a reviewable PR
- OIDC auth — no stored service tokens
- Platform exports are the single evaluation of formulas (ADR-0008 builds on this)
Cons:
- Depends on a young platform and CLI (v0.1.x) that move fast
repository_dispatchonly triggers workflows on the default branch
Adopt the Tokens Studio platform as the source of truth for the reworked tokens, with a release-triggered, OIDC-authenticated CI pipeline that lands platform output as PRs — and an hourly git backup to cover the platform's lack of undo.
The release pipeline (.github/workflows/tokens_studio_release.yaml):
- Trigger: the outbound CI Trigger in Studio sends a
repository_dispatchevent (typetokens-release) onrelease.created. - Auth: the workflow authenticates back to Studio with GitHub OIDC against the inbound CI Integration (subject pattern
repo:equinor/design-system:ref:refs/heads/main, read-only). No service tokens are stored; the outbound trigger and the inbound integration are deliberately separate configs. - Steps:
studio tokens pull(raw token sets),studio exports runfor the saved CSS and DTCG configurations — referenced by ID, not name, so UI renames cannot break the run — and the local TS codegen (ADR-0008). - Output: generated
src/tokens/{raw,css,dtcg,ts}committed to an automated PR. Generated output is never edited by hand and is not yet wired into the packageexportsmap — the legacy Style Dictionary build keeps owning the published artifacts until graduation.
Backup (tokens_studio_backup.yaml): because the platform has no undo and plugin edits push in real time, an hourly cron pulls all configured sources and commits changes to the orphan branch tokens-studio-backup — one directory per source alias, no commit when nothing changed, Slack alert on failure. The branch is never merged; it exists purely as an hourly-granularity recovery history. Recovery is manual (the CLI has no push command): locate the last good state on the branch, extract the token-set JSON, and re-import it in Tokens Studio in coordination with the designers. The backup installs the CLI standalone with npm --prefix outside the pnpm workspace instead of installing the whole monorepo — the one sanctioned exception to "never install the CLI with npm" — cutting warm runs from ~2 min to ~20–30 s.
- Good, because token updates are reproducible (anchored to immutable releases) and reviewed (they land as PRs, not direct commits)
- Good, because CI holds no long-lived secrets — OIDC subjects are validated by the platform
- Good, because designer mistakes are recoverable at hourly granularity via the orphan branch, not just at release granularity
- Good, because aliases and output paths live in
.studio.json, so both workflows are rename-proof without workflow edits - Bad, because the pipeline depends on a fast-moving v0.1.x platform/CLI — saved export configurations, formats, and flags can change under us (mitigated by the "staying current" rules in
TOKENS_STUDIO.md) - Bad, because
repository_dispatchonly fires on the default branch, so pipeline changes cannot be end-to-end tested before merge - Bad, because PRs created with the built-in
GITHUB_TOKENget no CI runs (same limitation as the legacy Figma sync; a GitHub App token is a possible upgrade) - Bad, because recovery from backup is a manual re-import — the CLI is pull-only — and removed source aliases must be cleaned up on the backup branch by hand
Every Tokens Studio release must produce a green tokens_studio_release.yaml run and an updated tokens-studio-release PR; the hourly backup alerts to Slack on failure. Both workflows read their sources from .studio.json, which is committed and reviewed.
- ADR-0008 — TS codegen on top of this pipeline's exports
- ADR-0007 — the token variable architecture being authored in Tokens Studio
documentation/agent-instructions/TOKENS_STUDIO.md— operational playbook (pipeline, backup & recovery, CLI)documentation/how-to/TOKEN_SYSTEM_GUIDE.md— the legacy pipeline this replaces- Issues #5108 (pipeline), #5154 (backup)
- PRs #5151, #5153, #5155, #5160, #5166, #5175, #5176