Engineering notes
Decision record

Theme identity is determined by history, not by value

A theme edited away from a preset stays custom, even if its values later match. This decision avoids comparing every value against every preset during each colour drag.

ADRIdentityTradeoffs

Once a Theme is edited away from a Preset it becomes a Custom Theme and never regains preset identity, even if every value is later dialled back to match that Preset exactly. The alternative — treating a Theme as a Preset whenever all its values match one — is more intuitive and self-healing, but requires deep-comparing the working Theme against every Preset on each individual edit, and the Theme Editor mutates on every colour drag.

Consequences

A visitor who undoes their way back to a Preset's exact values will still see the Theme presented as custom rather than named. This is expected, not a bug.

Source: docs/adr/0001-theme-identity-by-history.md in the repository that runs this site. Inspect the theme module and its tests.