From b72e0a9d9a2456e0ca40bbd36f955e6dee7085e9 Mon Sep 17 00:00:00 2001 From: Gulum Date: Sun, 7 Jun 2026 01:08:20 +0200 Subject: [PATCH] GEN-4c: PEW=REW konsolidiert (Julian) + REW-2-Verifikation - catalog.ts: 'Pink Eyed White (PEW)' -> 'REW' (frozen rename; chch+pp engine-computes 'REW' per Julian; entry now round-trips correctly) - genetics.test.ts: REW_SHADOWED-Ausnahme entfernt (kein Bedarf mehr); CATALOG[0]-Assertion auf 'REW'; aa cchmcchm+pp-Test als REW-2-Nachweis (Julian: A-Locus egal fuer REW-Bedingung) - chipColors.ts: 'REW'-Chip ergaenzt (gleiche Farbe wie PEW; additive; PEW-Eintrag bleibt fuer Rueckwaertskompatibilitaet waehrend DB-Migration) - Seed-Artefakte regeneriert (70 Reihen, REW statt PEW an Position 0) - FLAGGED to god: 'Altweiss (REW)' hat volles C (C:'C') -> faellt NICHT unter REW-Bedingung; warte auf Julian-Entscheid vor Aenderung --- .../src/genetics/__tests__/genetics.test.ts | 25 ++++++++----------- gerbil-manager-web/src/genetics/catalog.ts | 4 +-- .../genetics/colorVarietySeed.backend.json | 2 +- .../genetics/colorVarietySeed.generated.json | 2 +- gerbil-manager-web/src/pedigree/chipColors.ts | 3 +++ 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/gerbil-manager-web/src/genetics/__tests__/genetics.test.ts b/gerbil-manager-web/src/genetics/__tests__/genetics.test.ts index a0a69c1..8fdfad7 100644 --- a/gerbil-manager-web/src/genetics/__tests__/genetics.test.ts +++ b/gerbil-manager-web/src/genetics/__tests__/genetics.test.ts @@ -185,15 +185,11 @@ describe('Farbschlag catalog', () => { }) it('frozen contract names round-trip to themselves (DB-key guard)', () => { - // The first 18 are the frozen ColorVariety keys — their representative - // genotype MUST resolve back to their own name, never a later variety. - // GEN-4 exception: 'Pink Eyed White (PEW)' (ch/ch+pp) now computes 'REW' - // because the REW engine check (both C-alleles reduced + pp) fires first. - // PEW stays in the catalog as a user-pickable import name; its computed - // farbschlag is intentionally 'REW' per Julian's extended rule. - const REW_SHADOWED = new Set(['Pink Eyed White (PEW)']) + // The first 17 frozen ColorVariety keys — their representative genotype + // MUST resolve back to their own name, never a later variety. + // GEN-4c: 'REW' (formerly 'Pink Eyed White (PEW)') round-trips correctly: + // chch+pp → REW engine check → 'REW' = entry.name. for (const entry of BASE_COLORS.slice(0, FROZEN_COUNT)) { - if (REW_SHADOWED.has(entry.name)) continue expect(genotypeToFarbschlag(representativeGenotype(entry))).toBe(entry.name) } }) @@ -224,7 +220,7 @@ describe('Farbschlag catalog', () => { it('CATALOG seed view mirrors the ColorVariety table shape', () => { expect(CATALOG).toHaveLength(CATALOG_SIZE) - expect(CATALOG[0]).toMatchObject({ name: 'Pink Eyed White (PEW)', sortOrder: 0 }) + expect(CATALOG[0]).toMatchObject({ name: 'REW', sortOrder: 0 }) // Every row has a non-empty canonical genotype display string and unique name. // GEN-3h: bracket notation (e[f], c[chm], c[h]) allowed in tokens. expect(new Set(CATALOG.map((c) => c.name)).size).toBe(CATALOG.length) @@ -396,10 +392,10 @@ describe('GEN-3c: no Unbekannt when the E locus is known (family fallback)', () describe('GEN-3d: dominance tiebreak for unknown loci', () => { it('unknown-C reads as full-colour, NOT a c^h/c^chm white', () => { - // 'aa C- DD EE GG PP' -> Schwarz (dominant C reading), never PEW/Hermelin/Himalaya. + // 'aa C- DD EE GG PP' -> Schwarz (dominant C reading), never REW/Hermelin/Himalaya. const name = genotypeToFarbschlag(fromDisplayString('aa C- DD EE GG PP spsp rere')) expect(name).toBe('Schwarz') - expect(['Pink Eyed White (PEW)', 'Hermelin', 'Himalaya']).not.toContain(name) + expect(['REW', 'Hermelin', 'Himalaya']).not.toContain(name) }) it('unknown second marker allele defaults UNMARKED, not Schecke (marker-aware)', () => { @@ -549,15 +545,16 @@ describe('GEN-4: Dilute prefix, REW, no-bare-Fuchs', () => { }) it('REW: both C alleles reduced (no full C) + pp = REW — all three cases (Julian confirmed)', () => { - // hom cchm/cchm + pp - expect(name('AA cchmcchm DD EE GG pp spsp rere')).toBe('REW') // CP-Gold + // hom cchm/cchm + pp — A/D/E/G-independent (REW-2: Julian: "egal ob AA oder aa") + expect(name('AA cchmcchm DD EE GG pp spsp rere')).toBe('REW') // CP-Gold (A-) + expect(name('aa cchmcchm DD EE GG pp spsp rere')).toBe('REW') // aa: REW-2 verification expect(name('AA cchmcchm DD ee GG pp spsp rere')).toBe('REW') // CP-Goldfuchs expect(name('AA cchmcchm DD EE gg pp spsp rere')).toBe('REW') // CP-Elfenbein expect(name('AA cchmcchm DD ee gg pp spsp rere')).toBe('REW') // CP-Apricot expect(name('AA cchmcchm dd EE GG pp spsp rere')).toBe('REW') // CP-dd Gold // het cchm/ch + pp (Julian: also REW) expect(name('AA cchmch DD EE GG pp spsp rere')).toBe('REW') - // ch/ch + pp (Julian: also REW — subsumes PEW) + // ch/ch + pp (Julian: also REW; PEW renamed to REW in catalog per GEN-4c) expect(name('AA chch DD EE GG pp spsp rere')).toBe('REW') expect(name('aa chch DD EE GG pp spsp rere')).toBe('REW') // Counterproof: full C present → NOT REW (residual pigment) diff --git a/gerbil-manager-web/src/genetics/catalog.ts b/gerbil-manager-web/src/genetics/catalog.ts index 817642c..0aa0502 100644 --- a/gerbil-manager-web/src/genetics/catalog.ts +++ b/gerbil-manager-web/src/genetics/catalog.ts @@ -51,7 +51,7 @@ export const BASE_COLORS: readonly FarbschlagEntry[] = [ // GEN-3a: 'Schwarzschimmel' REMOVED (breeder C5: no such variety; efef base is // Orangeschimmel — see the GEN-2 block below). This was an authorized exception // to the frozen-name rule; the ColorVariety seed drops it too. - { name: 'Pink Eyed White (PEW)', english: 'Pink Eyed White', tokens: { C: 'ch', P: 'p' }, image: 'rotaugen-weiss-pew-d-sep-e-sep.jpg' }, + { name: 'REW', english: 'Pink Eyed White', tokens: { C: 'ch', P: 'p' }, image: 'rotaugen-weiss-pew-d-sep-e-sep.jpg' }, { name: 'Hermelin', english: 'Dark Tailed White', tokens: { A: 'a', C: 'ch', D: 'D', P: 'P' }, image: 'hermelin.jpeg' }, { name: 'Himalaya', english: 'Himalayan', tokens: { A: 'A', C: 'ch', D: 'D', P: 'P' }, image: 'himalaya.jpg' }, { name: 'Zobel', english: 'Sable', tokens: { A: 'a', C: 'cchm', D: 'D', E: 'E', G: 'g', P: 'P' }, image: 'zobel.jpeg' }, @@ -268,7 +268,7 @@ export function farbschlagFor(g: Genotype): FarbschlagMatch { // AND pink-eyed (pp) = REW (Rotaugenweiß), A/D/E/G-independent. // cchm/cchm + pp → REW (CP varieties with pink-eye) // cchm/ch + pp → REW (het colourpoint + pink-eye) - // ch/ch + pp → REW (this also subsumes the frozen 'Pink Eyed White (PEW)' entry) + // ch/ch + pp → REW (Julian confirmed PEW=REW; the 'REW' catalog entry matches here) // Counterproof: at least one full 'C' + pp → NOT REW (residual pigment remains). const [c0, c1] = resolvedPair(g, 'C') const [p0, p1] = resolvedPair(g, 'P') diff --git a/gerbil-manager-web/src/genetics/colorVarietySeed.backend.json b/gerbil-manager-web/src/genetics/colorVarietySeed.backend.json index 545e42b..3625c49 100644 --- a/gerbil-manager-web/src/genetics/colorVarietySeed.backend.json +++ b/gerbil-manager-web/src/genetics/colorVarietySeed.backend.json @@ -1,6 +1,6 @@ [ { - "name": "Pink Eyed White (PEW)", + "name": "REW", "english": "Pink Eyed White", "canonicalGenotype": "AA chch DD EE GG pp spsp rere", "sortOrder": 0, diff --git a/gerbil-manager-web/src/genetics/colorVarietySeed.generated.json b/gerbil-manager-web/src/genetics/colorVarietySeed.generated.json index 56ccef7..eba4707 100644 --- a/gerbil-manager-web/src/genetics/colorVarietySeed.generated.json +++ b/gerbil-manager-web/src/genetics/colorVarietySeed.generated.json @@ -1,6 +1,6 @@ [ { - "name": "Pink Eyed White (PEW)", + "name": "REW", "english": "Pink Eyed White", "canonicalGenotype": "AA c[h]c[h] DD EE GG pp spsp rere", "sortOrder": 0, diff --git a/gerbil-manager-web/src/pedigree/chipColors.ts b/gerbil-manager-web/src/pedigree/chipColors.ts index 4cb1d98..15ff5fb 100644 --- a/gerbil-manager-web/src/pedigree/chipColors.ts +++ b/gerbil-manager-web/src/pedigree/chipColors.ts @@ -13,6 +13,9 @@ export interface ChipColor { const CHIP_COLORS: Record = { // Colourpoint / C-Serie + // GEN-4c: PEW renamed to REW in catalog (Julian: PEW=REW). Both kept here for + // backward-compat during DB migration (old animals may still carry the old name). + 'REW': { bg: '#f7f3ec', fg: '#8a7d6b' }, 'Pink Eyed White (PEW)': { bg: '#f7f3ec', fg: '#8a7d6b' }, Hermelin: { bg: '#f3ede2', fg: '#8a7d6b' }, Himalaya: { bg: '#efe6d8', fg: '#8a7d6b' },