{
  "version": 1,
  "group": "palette",
  "description": "Deterministic palette generation and lock-preservation fixtures. Runtime IDs and timestamps are intentionally excluded because they are metadata, not color math.",
  "cases": [
    {
      "id": "seed-336699-role-palette",
      "operation": "createPaletteFromSeed",
      "seed": "#336699",
      "expected": {
        "name": "Seed #336699 color system",
        "source": "seed-color",
        "colors": [
          { "role": "primary", "hex": "#336699" },
          { "role": "secondary", "hex": "#36317C" },
          { "role": "accent", "hex": "#B6702B" },
          { "role": "surface", "hex": "#F4F4F6" },
          { "role": "text", "hex": "#242319" },
          { "role": "border", "hex": "#C1C2CD" },
          { "role": "success", "hex": "#3F8352" },
          { "role": "warning", "hex": "#C1A97B" },
          { "role": "danger", "hex": "#B9656F" }
        ],
        "summary": {
          "name": "Seed #336699 color system",
          "colors": 9,
          "slug": "336699-36317c-b6702b-f4f4f6-242319-c1c2cd-3f8352-c1a97b-b9656f",
          "accessiblePairs": 14
        }
      }
    },
    {
      "id": "locked-role-colors-survive-regeneration",
      "operation": "preserveLockedPaletteColors",
      "previousColors": [
        { "role": "primary", "hex": "#336699" },
        { "role": "secondary", "hex": "#123456" },
        { "role": "accent", "hex": "#ABCDEF" },
        { "role": "surface", "hex": "#F4F4F6" }
      ],
      "generatedColors": [
        { "role": "primary", "hex": "#ED1C24" },
        { "role": "secondary", "hex": "#7C3136" },
        { "role": "accent", "hex": "#1CEDCF" },
        { "role": "surface", "hex": "#F6F4F4" }
      ],
      "lockedRoles": ["secondary", "accent"],
      "expectedColors": [
        { "role": "primary", "hex": "#ED1C24" },
        { "role": "secondary", "hex": "#123456" },
        { "role": "accent", "hex": "#ABCDEF" },
        { "role": "surface", "hex": "#F6F4F4" }
      ],
      "invariant": "Every locked role keeps its prior HEX value while unlocked roles accept deterministic regenerated values."
    },
    {
      "id": "missing-locked-role-is-not-invented",
      "operation": "preserveLockedPaletteColors",
      "previousColors": [
        { "role": "primary", "hex": "#336699" },
        { "role": "accent", "hex": "#ABCDEF" }
      ],
      "generatedColors": [
        { "role": "primary", "hex": "#ED1C24" },
        { "role": "secondary", "hex": "#7C3136" }
      ],
      "lockedRoles": ["accent"],
      "expectedColors": [
        { "role": "primary", "hex": "#ED1C24" },
        { "role": "secondary", "hex": "#7C3136" }
      ],
      "invariant": "A lock only replaces a matching generated role; it never changes palette shape or injects a removed role."
    },
    {
      "id": "named-lock-without-previous-role-keeps-generated",
      "operation": "preserveLockedPaletteColors",
      "previousColors": [
        { "role": "primary", "hex": "#111111" }
      ],
      "generatedColors": [
        { "role": "secondary", "hex": "#222222" }
      ],
      "lockedRoles": ["secondary"],
      "expectedColors": [
        { "role": "secondary", "hex": "#222222" }
      ],
      "regression": "A named lock with no previous color of that role must not borrow an unrelated color at the same array index."
    }
  ]
}
