{
  "_meta": {
    "purpose": "Machine-readable map of token names that changed or disappeared, so a theme file authored against an older SLASHED can be migrated forward automatically.",
    "sourceOfTruth": "docs/migration.md — this file is its machine-readable mirror. Every entry here corresponds to a documented breaking change; do not add an entry that migration.md does not describe.",
    "whyNotTheRegistry": "token-registry.json cannot answer this. Its ids are permanent, but check-token-registry.js explicitly permits renames as IN-PLACE name updates on the same id — so after a rename the old name is simply gone from the registry, with nothing to look it up by. That is harmless for the share-link codec (it stores ids, not names) but fatal for a name-keyed theme file. Renames are a human fact and cannot be derived from the catalogue: a rename and a (delete + add) pair are indistinguishable to a generator.",
    "contract": "Every value in `renames` must be a LIVE token, and no key in `renames` or `removals` may be live. Enforced by scripts/check-token-renames.js. Because a rename target must be live, chains are impossible by construction — always record the fully resolved destination, never an intermediate name.",
    "consumedBy": [
      "scripts/migrate-theme.js",
      "scripts/lib/theme-file.js",
      "configurator (via configurator/src/data/token-renames.generated.json)"
    ]
  },

  "renames": {
    "--sf-color-primary-light": "--sf-color-primary-source-light",
    "--sf-color-primary-dark": "--sf-color-primary-source-dark",
    "--sf-color-secondary-light": "--sf-color-secondary-source-light",
    "--sf-color-secondary-dark": "--sf-color-secondary-source-dark",
    "--sf-color-tertiary-light": "--sf-color-tertiary-source-light",
    "--sf-color-tertiary-dark": "--sf-color-tertiary-source-dark",
    "--sf-color-action-light": "--sf-color-action-source-light",
    "--sf-color-action-dark": "--sf-color-action-source-dark",
    "--sf-color-neutral-light": "--sf-color-neutral-source-light",
    "--sf-color-neutral-dark": "--sf-color-neutral-source-dark",
    "--sf-color-base-light": "--sf-color-base-source-light",
    "--sf-color-base-dark": "--sf-color-base-source-dark",
    "--sf-color-success-light": "--sf-color-success-source-light",
    "--sf-color-success-dark": "--sf-color-success-source-dark",
    "--sf-color-warning-light": "--sf-color-warning-source-light",
    "--sf-color-warning-dark": "--sf-color-warning-source-dark",
    "--sf-color-info-light": "--sf-color-info-source-light",
    "--sf-color-info-dark": "--sf-color-info-source-dark",
    "--sf-color-danger-light": "--sf-color-danger-source-light",
    "--sf-color-danger-dark": "--sf-color-danger-source-dark",

    "--sf-color-error": "--sf-color-danger",
    "--sf-color-error-subtle": "--sf-color-danger-subtle",
    "--sf-color-error-muted": "--sf-color-danger-muted",
    "--sf-color-error-strong": "--sf-color-danger-strong",
    "--sf-color-error-source-light": "--sf-color-danger-source-light",
    "--sf-color-error-source-dark": "--sf-color-danger-source-dark",

    "--sf-color-primary-ghost": "--sf-color-primary-tint",
    "--sf-color-secondary-ghost": "--sf-color-secondary-tint",
    "--sf-color-tertiary-ghost": "--sf-color-tertiary-tint",
    "--sf-color-action-ghost": "--sf-color-action-tint",
    "--sf-color-neutral-ghost": "--sf-color-neutral-tint",
    "--sf-color-base-ghost": "--sf-color-base-tint",

    "--sf-color-base-superlight": "--sf-color-base-50",
    "--sf-color-base-xlight": "--sf-color-base-200",
    "--sf-color-base-lighter": "--sf-color-base-400",
    "--sf-color-base-darker": "--sf-color-base-600",
    "--sf-color-base-xdark": "--sf-color-base-800",
    "--sf-color-base-superdark": "--sf-color-base-950",

    "--sf-color-text--on-surface": "--sf-color-text--on-base",
    "--sf-color-text--secondary": "--sf-color-text--subtle",

    "--sf-z-low": "--sf-z-sticky",
    "--sf-z-mid": "--sf-z-fixed",
    "--sf-z-high": "--sf-z-dropdown",
    "--sf-z-top": "--sf-z-toast",

    "--sf-avatar-size": "--sf-card-avatar-size",

    "--sf-caret-color": "--sf-color-caret"
  },

  "removals": {
    "--sf-z-max": "Ambiguous by design: 0.6.0 split the old top rung into --sf-z-overlay (1030) and --sf-z-modal (1040). Pick the one matching your element's role — this is not auto-migrated because the wrong choice silently reorders your stacking context.",

    "--sf-blur-xs": "Removed in 0.6.0 — use --sf-blur (single default) or an inline blur(Npx).",
    "--sf-blur-s": "Removed in 0.6.0 — use --sf-blur (single default) or an inline blur(Npx).",
    "--sf-blur-m": "Removed in 0.6.0 — use --sf-blur (single default) or an inline blur(Npx).",
    "--sf-blur-l": "Removed in 0.6.0 — use --sf-blur (single default) or an inline blur(Npx).",
    "--sf-blur-xl": "Removed in 0.6.0 — use --sf-blur (single default) or an inline blur(Npx).",

    "--sf-opacity-0": "Removed in 0.6.0 — use --sf-opacity-muted / --sf-opacity-disabled, or a literal value.",
    "--sf-opacity-10": "Removed in 0.6.0 — use --sf-opacity-muted / --sf-opacity-disabled, or a literal value.",
    "--sf-opacity-25": "Removed in 0.6.0 — use --sf-opacity-muted / --sf-opacity-disabled, or a literal value.",
    "--sf-opacity-50": "Removed in 0.6.0 — use --sf-opacity-muted (0.5), or a literal value.",
    "--sf-opacity-75": "Removed in 0.6.0 — use --sf-opacity-muted / --sf-opacity-disabled, or a literal value.",
    "--sf-opacity-100": "Removed in 0.6.0 — use --sf-opacity-muted / --sf-opacity-disabled, or a literal value.",

    "--sf-stroke-thin": "Removed in 0.6.0 — use an SVG stroke-width=\"N\" attribute or a --sf-border-width-* token.",
    "--sf-stroke-regular": "Removed in 0.6.0 — use an SVG stroke-width=\"N\" attribute or a --sf-border-width-* token.",
    "--sf-stroke-bold": "Removed in 0.6.0 — use an SVG stroke-width=\"N\" attribute or a --sf-border-width-* token.",
    "--sf-stroke-heavy": "Removed in 0.6.0 — use an SVG stroke-width=\"N\" attribute or a --sf-border-width-* token.",

    "--sf-col-width-s": "Removed in 0.6.0 — set the column-width property directly.",
    "--sf-col-width-m": "Removed in 0.6.0 — set the column-width property directly.",
    "--sf-col-width-l": "Removed in 0.6.0 — set the column-width property directly.",
    "--sf-col-rule-width-s": "Removed in 0.6.0 — set the column-rule-width property directly.",
    "--sf-col-rule-width-m": "Removed in 0.6.0 — set the column-rule-width property directly.",
    "--sf-col-rule-width-l": "Removed in 0.6.0 — set the column-rule-width property directly.",

    "--sf-font-weight-thin": "Removed in 0.6.0 — write font-weight: 100 inline, or re-tune a role token (--sf-font-weight-{body,heading,display,interactive,strong}).",
    "--sf-font-weight-extralight": "Removed in 0.6.0 — write font-weight: 200 inline, or re-tune a role token.",
    "--sf-font-weight-extrabold": "Removed in 0.6.0 — write font-weight: 800 inline, or re-tune a role token.",
    "--sf-font-weight-black": "Removed in 0.6.0 — write font-weight: 900 inline, or re-tune a role token.",

    "--sf-fluid-custom-1": "Removed in 0.6.0 — write a clamp() directly. --sf-fluid-min-vw / --sf-fluid-max-vw are unchanged.",
    "--sf-fluid-custom-2": "Removed in 0.6.0 — write a clamp() directly. --sf-fluid-min-vw / --sf-fluid-max-vw are unchanged.",
    "--sf-fluid-custom-3": "Removed in 0.6.0 — write a clamp() directly. --sf-fluid-min-vw / --sf-fluid-max-vw are unchanged.",

    "--sf-truncate-suffix": "Removed in 0.6.0 — it was never read. .sf-truncate uses text-overflow: ellipsis.",

    "--sf-corner-scoop-size": "Removed before 1.0 together with the .sf-corner-scoop macro (issue #484): a single absolute size needed per-element tuning to read well at both button and hero scale, and the mask clipped box-shadow/border.",

    "--sf-aspect": "Removed in the lean cut (#681) with the .sf-aspect macro — set aspect-ratio directly, or use a named .sf-frame--* ratio. Named frame ratios remain.",
    "--sf-overlap-pull": "Removed in the lean cut (#681) with the .sf-overlap recipe — apply a negative logical margin directly on the overlapping element.",
    "--sf-density": "Removed in the lean cut (#681): its scope (the --sf-size-* rung ladder) was far narrower than the name implied. Override the individual --sf-size-* rungs, or the per-component size tokens, to compact controls.",
    "--sf-font-humanist": "Removed in the lean cut (#681) — declare the font-family stack directly, or point a core family token (--sf-font-body/-heading/-display) at your stack.",
    "--sf-font-geometric": "Removed in the lean cut (#681) — declare the font-family stack directly, or point a core family token (--sf-font-body/-heading/-display) at your stack.",
    "--sf-font-slab": "Removed in the lean cut (#681) — declare the font-family stack directly, or point a core family token (--sf-font-body/-heading/-display) at your stack.",
    "--sf-print-base-size": "Removed in the lean cut (#681) — set body font-size inside your own @media print rule.",
    "--sf-print-page-margin": "Removed in the lean cut (#681) — set @page margin in your own @media print rule.",
    "--sf-print-page-size": "Removed in the lean cut (#681) — set @page size in your own @media print rule."
  }
}
