GEN-3f: reconcile cchm colourpoint catalog to the breeder's CP- naming

Computed Farbschlag now == the breeder's dropdown/seed names for colourpoints,
so the mismatch hint stops and the live re-import name-matches her data
(god: she uses the CP- prefix form + Marder/Siam/Zobel/Zobel-Hell; ZERO of the
old portal suffix names). FULL collapse (god-approved, data-safe).

Catalog (BASE_COLORS) 73 -> 61: the 24 portal cchm rows collapse to 12 breeder
varieties — Marder, Siam, Zobel, Zobel-Hell (aa marten/sable group; E & D
irrelevant per the merged GEN-3e rule) and CP-Agouti, CP-Silberagouti,
CP-Algierfuchs, CP-Polarfuchs, CP-Fuchs, CP-Fuchs-Hell, CP-Blaufuchs,
CP-Orangeschimmel (A- 'CP-<base>'; -Hell shade variants collapsed).

- representativeGenotype() now splits a heterozygous 'x/y' token, so the het
  colourpoints Siam & Zobel-Hell (C: 'cchm/ch') carry the correct het canonical
  genotype and the engine computes their own names (verified).
- Engine covers all fox(ee)/dilute(dd) A- cchm bases via the E-family fallback
  (no Unbekannt). KNOWN BEST-EFFORT GAP: CP-Fuchs-Hell and CP-Blaufuchs both
  compute 'CP-Fuchs' (the het-lighter / blue-dilute distinction isn't encoded);
  their distinct rows remain for hand-pick + import name-match. Closing this
  fully needs the breeder's exact fox-CP genotype rule.

Regenerated colorVarietySeed.generated.json (61 rows) for Pam's re-seed
migration. Gate green: build, eslint, vitest 78, e2e 80. de.ts untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-06 11:47:33 +02:00
parent 029ffb9895
commit 972570b142
3 changed files with 166 additions and 188 deletions

View File

@@ -154,303 +154,228 @@
"sortOrder": 22,
"image": "kohlfuchs.jpg"
},
{
"name": "Marder",
"canonicalGenotype": "aa cchmcchm DD EE GG PP spsp rere",
"sortOrder": 23,
"image": "marder.JPG"
},
{
"name": "Siam (Marder-Hell)",
"canonicalGenotype": "aa cchmcchm DD EE GG PP spsp rere",
"sortOrder": 24,
"image": "siam-marder-hell.JPG"
},
{
"name": "Polarfuchs",
"canonicalGenotype": "AA CC DD ee gg PP spsp rere",
"sortOrder": 25,
"sortOrder": 23,
"image": "polarfuchs.jpg"
},
{
"name": "Saphir",
"canonicalGenotype": "aa CC DD EE GG pp spsp rere",
"sortOrder": 26,
"sortOrder": 24,
"image": "saphir.jpg"
},
{
"name": "Orangeschimmel",
"canonicalGenotype": "AA CC DD efef GG PP spsp rere",
"sortOrder": 27,
"sortOrder": 25,
"image": "schimmel-orangeschimmel.jpg"
},
{
"name": "Topas",
"canonicalGenotype": "AA CC DD EE GG pp spsp rere",
"sortOrder": 28,
"sortOrder": 26,
"image": "topas.jpg"
},
{
"name": "Platin-Hell",
"canonicalGenotype": "aa CC DD EE GG pp spsp rere",
"sortOrder": 29,
"sortOrder": 27,
"image": "platin-hell.jpg"
},
{
"name": "Agouti dd",
"canonicalGenotype": "AA CC dd EE GG PP spsp rere",
"sortOrder": 30,
"sortOrder": 28,
"image": "agouti-dd.jpg"
},
{
"name": "Silberagouti dd",
"canonicalGenotype": "AA CC dd EE gg PP spsp rere",
"sortOrder": 31,
"sortOrder": 29,
"image": "silberagouti-dd.jpg"
},
{
"name": "Kohlfuchs dd",
"canonicalGenotype": "aa CC dd ee GG PP spsp rere",
"sortOrder": 32,
"sortOrder": 30,
"image": "kohlfuchs-dd.jpg"
},
{
"name": "Anthrazit dd",
"canonicalGenotype": "aa CC dd EE gg PP spsp rere",
"sortOrder": 33,
"sortOrder": 31,
"image": "anthrazit-dd.jpg"
},
{
"name": "Agouti CP-Hell",
"canonicalGenotype": "AA cchmcchm DD EE GG PP spsp rere",
"sortOrder": 34,
"image": "agouti-cp-hell.JPG"
},
{
"name": "Blaufuchs CP",
"canonicalGenotype": "aa cchmcchm DD ee gg PP spsp rere",
"sortOrder": 35,
"image": "blaufuchs-cp.jpg"
},
{
"name": "Silberschimmel",
"canonicalGenotype": "AA CC DD efef gg PP spsp rere",
"sortOrder": 36,
"sortOrder": 32,
"image": "silberschimmel.jpg"
},
{
"name": "Polarfuchsschimmel",
"canonicalGenotype": "AA CC DD efef gg PP spsp rere",
"sortOrder": 37,
"sortOrder": 33,
"image": "polarfuchsschimmel.jpg"
},
{
"name": "Algierfuchsschimmel",
"canonicalGenotype": "AA CC DD efef GG PP spsp rere",
"sortOrder": 38,
"sortOrder": 34,
"image": "algierfuchsschimmel.jpg"
},
{
"name": "Polarfuchs-Hell CP",
"canonicalGenotype": "AA cchmcchm DD ee gg PP spsp rere",
"sortOrder": 39,
"image": "polarfuchs-hell-cp.jpg"
},
{
"name": "Kohlfuchsschimmel",
"canonicalGenotype": "aa CC DD efef GG PP spsp rere",
"sortOrder": 40,
"sortOrder": 35,
"image": "kohlfuchsschimmel.jpg"
},
{
"name": "Blaufuchsschimmel",
"canonicalGenotype": "aa CC DD efef gg PP spsp rere",
"sortOrder": 41,
"sortOrder": 36,
"image": "blaufuchsschimmel.jpg"
},
{
"name": "Kohlfuchs, hell",
"canonicalGenotype": "aa CC DD ee GG PP spsp rere",
"sortOrder": 42,
"sortOrder": 37,
"image": "kohlfuchs-hell.jpg"
},
{
"name": "Goldfuchs, hell",
"canonicalGenotype": "AA CC DD ee GG pp spsp rere",
"sortOrder": 43,
"sortOrder": 38,
"image": "goldfuchs-hell.jpg"
},
{
"name": "Goldfuchsschimmel",
"canonicalGenotype": "AA CC DD efef GG pp spsp rere",
"sortOrder": 44,
"sortOrder": 39,
"image": "goldfuchsschimmel.jpg"
},
{
"name": "Gold-Hell",
"canonicalGenotype": "AA CC DD EE GG pp spsp rere",
"sortOrder": 45,
"sortOrder": 40,
"image": "gold-hell.jpg"
},
{
"name": "Siam (Marder-Hell) dd",
"canonicalGenotype": "aa cchmcchm dd EE GG PP spsp rere",
"sortOrder": 46,
"image": "siam-marder-hell-dd.jpg"
},
{
"name": "Marder dd",
"canonicalGenotype": "aa cchmcchm dd EE GG PP spsp rere",
"sortOrder": 47,
"image": "marder-dd.jpg"
},
{
"name": "Zobel-Hell",
"canonicalGenotype": "aa cchmcchm DD EE gg PP spsp rere",
"sortOrder": 48,
"image": "zobel-hell.jpg"
},
{
"name": "Silberagouti dd CP",
"canonicalGenotype": "AA cchmcchm dd EE gg PP spsp rere",
"sortOrder": 49,
"image": "silberagouti-dd-cp.jpg"
},
{
"name": "Silberagouti-Hell dd CP",
"canonicalGenotype": "AA cchmcchm dd EE gg PP spsp rere",
"sortOrder": 50,
"image": "silberagouti-hell-dd-cp.jpg"
},
{
"name": "Agouti dd CP",
"canonicalGenotype": "AA cchmcchm dd EE GG PP spsp rere",
"sortOrder": 51,
"image": "agouti-dd-cp.jpg"
},
{
"name": "Agouti-Hell dd CP",
"canonicalGenotype": "AA cchmcchm dd EE GG PP spsp rere",
"sortOrder": 52,
"image": "agouti-hell-dd-cp.jpg"
},
{
"name": "Blaufuchs, hell",
"canonicalGenotype": "aa CC DD ee gg PP spsp rere",
"sortOrder": 53,
"sortOrder": 41,
"image": "blaufuchs-hell.jpeg"
},
{
"name": "Rotfuchsschimmel",
"canonicalGenotype": "aa CC DD efef GG pp spsp rere",
"sortOrder": 54,
"sortOrder": 42,
"image": "rotfuchsschimmel.jpg"
},
{
"name": "Polarfuchs, hell",
"canonicalGenotype": "AA CC DD ee gg PP spsp rere",
"sortOrder": 55,
"sortOrder": 43,
"image": "polarfuchs-hell.jpeg"
},
{
"name": "Kohlfuchsschimmel, hell",
"canonicalGenotype": "aa CC DD efef GG PP spsp rere",
"sortOrder": 56,
"sortOrder": 44,
"image": "kohlfuchsschimmel-hell.jpg"
},
{
"name": "Rotfuchs, hell",
"canonicalGenotype": "aa CC DD ee GG pp spsp rere",
"sortOrder": 57,
"sortOrder": 45,
"image": "rotfuchs-hell.jpg"
},
{
"name": "Zobel dd",
"canonicalGenotype": "aa cchmcchm dd EE gg PP spsp rere",
"sortOrder": 58,
"image": "zobel-dd.jpg"
},
{
"name": "Kohlfuchs-Hell",
"canonicalGenotype": "aa CC DD ee GG PP spsp rere",
"sortOrder": 59,
"sortOrder": 46,
"image": "kohlfuchs-hell-2.jpg"
},
{
"name": "Kohlfuchs CP",
"canonicalGenotype": "aa cchmcchm DD ee GG PP spsp rere",
"sortOrder": 60,
"image": "kohlfuchs-cp.jpg"
},
{
"name": "Algierfuchs CP",
"canonicalGenotype": "AA cchmcchm DD ee GG PP spsp rere",
"sortOrder": 61,
"image": "algierfuchs-cp.jpg"
},
{
"name": "Silberagouti CP",
"canonicalGenotype": "AA cchmcchm DD EE gg PP spsp rere",
"sortOrder": 62,
"image": "silberagouti-cp.JPG"
},
{
"name": "Agouti CP",
"canonicalGenotype": "AA cchmcchm DD EE GG PP spsp rere",
"sortOrder": 63,
"image": "agouti-cp.jpg"
},
{
"name": "Algierfuchs-Hell CP",
"canonicalGenotype": "AA cchmcchm DD ee GG PP spsp rere",
"sortOrder": 64,
"image": "algierfuchs-hell-cp.jpg"
},
{
"name": "Kohlfuchs,hell CP",
"canonicalGenotype": "aa cchmcchm DD ee GG PP spsp rere",
"sortOrder": 65,
"image": "kohlfuchs-hell-cp.jpg"
},
{
"name": "Polarfuchs CP",
"canonicalGenotype": "AA cchmcchm DD ee gg PP spsp rere",
"sortOrder": 66,
"image": "polarfuchs-cp.jpg"
},
{
"name": "Algierfuchs, hell",
"canonicalGenotype": "AA CC DD ee GG PP spsp rere",
"sortOrder": 67,
"sortOrder": 47,
"image": "algierfuchs-hell.JPG"
},
{
"name": "Topas dd",
"canonicalGenotype": "AA CC dd EE GG pp spsp rere",
"sortOrder": 68,
"sortOrder": 48,
"image": "topas-dd.jpg"
},
{
"name": "Zobel-Hell dd",
"canonicalGenotype": "aa cchmcchm dd EE gg PP spsp rere",
"sortOrder": 69,
"image": "zobel-hell-dd.jpg"
},
{
"name": "Kohlfuchsschimmel CP",
"canonicalGenotype": "aa cchmcchm DD efef GG PP spsp rere",
"sortOrder": 70,
"image": "kohlfuchsschimmel-cp.JPG"
},
{
"name": "Blaufuchs dd",
"canonicalGenotype": "aa CC dd ee gg pp spsp rere",
"sortOrder": 71,
"sortOrder": 49,
"image": "blaufuchs-dd.jpg"
},
{
"name": "Marder",
"canonicalGenotype": "aa cchmcchm DD EE GG PP spsp rere",
"sortOrder": 50,
"image": "marder.JPG"
},
{
"name": "Siam",
"canonicalGenotype": "aa cchmch DD EE GG PP spsp rere",
"sortOrder": 51,
"image": "siam-marder-hell.JPG"
},
{
"name": "Zobel-Hell",
"canonicalGenotype": "aa cchmch DD EE gg PP spsp rere",
"sortOrder": 52,
"image": "zobel-hell.jpg"
},
{
"name": "CP-Agouti",
"canonicalGenotype": "AA cchmcchm DD EE GG PP spsp rere",
"sortOrder": 53,
"image": "agouti-cp.jpg"
},
{
"name": "CP-Silberagouti",
"canonicalGenotype": "AA cchmcchm DD EE gg PP spsp rere",
"sortOrder": 54,
"image": "silberagouti-cp.JPG"
},
{
"name": "CP-Algierfuchs",
"canonicalGenotype": "AA cchmcchm DD ee GG PP spsp rere",
"sortOrder": 55,
"image": "algierfuchs-cp.jpg"
},
{
"name": "CP-Polarfuchs",
"canonicalGenotype": "AA cchmcchm DD ee gg PP spsp rere",
"sortOrder": 56,
"image": "polarfuchs-cp.jpg"
},
{
"name": "CP-Fuchs",
"canonicalGenotype": "AA cchmcchm dd ee GG PP spsp rere",
"sortOrder": 57
},
{
"name": "CP-Fuchs-Hell",
"canonicalGenotype": "AA cchmch dd ee GG PP spsp rere",
"sortOrder": 58
},
{
"name": "CP-Blaufuchs",
"canonicalGenotype": "AA cchmcchm dd ee gg PP spsp rere",
"sortOrder": 59
},
{
"name": "CP-Orangeschimmel",
"canonicalGenotype": "AA cchmcchm DD efef GG PP spsp rere",
"sortOrder": 72
"sortOrder": 60
}
]