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
This commit is contained in:
@@ -185,15 +185,11 @@ describe('Farbschlag catalog', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('frozen contract names round-trip to themselves (DB-key guard)', () => {
|
it('frozen contract names round-trip to themselves (DB-key guard)', () => {
|
||||||
// The first 18 are the frozen ColorVariety keys — their representative
|
// The first 17 frozen ColorVariety keys — their representative genotype
|
||||||
// genotype MUST resolve back to their own name, never a later variety.
|
// MUST resolve back to their own name, never a later variety.
|
||||||
// GEN-4 exception: 'Pink Eyed White (PEW)' (ch/ch+pp) now computes 'REW'
|
// GEN-4c: 'REW' (formerly 'Pink Eyed White (PEW)') round-trips correctly:
|
||||||
// because the REW engine check (both C-alleles reduced + pp) fires first.
|
// chch+pp → REW engine check → 'REW' = entry.name.
|
||||||
// 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)'])
|
|
||||||
for (const entry of BASE_COLORS.slice(0, FROZEN_COUNT)) {
|
for (const entry of BASE_COLORS.slice(0, FROZEN_COUNT)) {
|
||||||
if (REW_SHADOWED.has(entry.name)) continue
|
|
||||||
expect(genotypeToFarbschlag(representativeGenotype(entry))).toBe(entry.name)
|
expect(genotypeToFarbschlag(representativeGenotype(entry))).toBe(entry.name)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -224,7 +220,7 @@ describe('Farbschlag catalog', () => {
|
|||||||
|
|
||||||
it('CATALOG seed view mirrors the ColorVariety table shape', () => {
|
it('CATALOG seed view mirrors the ColorVariety table shape', () => {
|
||||||
expect(CATALOG).toHaveLength(CATALOG_SIZE)
|
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.
|
// 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.
|
// 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)
|
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', () => {
|
describe('GEN-3d: dominance tiebreak for unknown loci', () => {
|
||||||
it('unknown-C reads as full-colour, NOT a c^h/c^chm white', () => {
|
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'))
|
const name = genotypeToFarbschlag(fromDisplayString('aa C- DD EE GG PP spsp rere'))
|
||||||
expect(name).toBe('Schwarz')
|
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)', () => {
|
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)', () => {
|
it('REW: both C alleles reduced (no full C) + pp = REW — all three cases (Julian confirmed)', () => {
|
||||||
// hom cchm/cchm + pp
|
// 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
|
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-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-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-Apricot
|
||||||
expect(name('AA cchmcchm dd EE GG pp spsp rere')).toBe('REW') // CP-dd Gold
|
expect(name('AA cchmcchm dd EE GG pp spsp rere')).toBe('REW') // CP-dd Gold
|
||||||
// het cchm/ch + pp (Julian: also REW)
|
// het cchm/ch + pp (Julian: also REW)
|
||||||
expect(name('AA cchmch DD EE GG pp spsp rere')).toBe('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')
|
||||||
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)
|
// Counterproof: full C present → NOT REW (residual pigment)
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ export const BASE_COLORS: readonly FarbschlagEntry[] = [
|
|||||||
// GEN-3a: 'Schwarzschimmel' REMOVED (breeder C5: no such variety; efef base is
|
// GEN-3a: 'Schwarzschimmel' REMOVED (breeder C5: no such variety; efef base is
|
||||||
// Orangeschimmel — see the GEN-2 block below). This was an authorized exception
|
// Orangeschimmel — see the GEN-2 block below). This was an authorized exception
|
||||||
// to the frozen-name rule; the ColorVariety seed drops it too.
|
// 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: '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: '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' },
|
{ 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.
|
// AND pink-eyed (pp) = REW (Rotaugenweiß), A/D/E/G-independent.
|
||||||
// cchm/cchm + pp → REW (CP varieties with pink-eye)
|
// cchm/cchm + pp → REW (CP varieties with pink-eye)
|
||||||
// cchm/ch + pp → REW (het colourpoint + 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).
|
// Counterproof: at least one full 'C' + pp → NOT REW (residual pigment remains).
|
||||||
const [c0, c1] = resolvedPair(g, 'C')
|
const [c0, c1] = resolvedPair(g, 'C')
|
||||||
const [p0, p1] = resolvedPair(g, 'P')
|
const [p0, p1] = resolvedPair(g, 'P')
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"name": "Pink Eyed White (PEW)",
|
"name": "REW",
|
||||||
"english": "Pink Eyed White",
|
"english": "Pink Eyed White",
|
||||||
"canonicalGenotype": "AA chch DD EE GG pp spsp rere",
|
"canonicalGenotype": "AA chch DD EE GG pp spsp rere",
|
||||||
"sortOrder": 0,
|
"sortOrder": 0,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"name": "Pink Eyed White (PEW)",
|
"name": "REW",
|
||||||
"english": "Pink Eyed White",
|
"english": "Pink Eyed White",
|
||||||
"canonicalGenotype": "AA c[h]c[h] DD EE GG pp spsp rere",
|
"canonicalGenotype": "AA c[h]c[h] DD EE GG pp spsp rere",
|
||||||
"sortOrder": 0,
|
"sortOrder": 0,
|
||||||
|
|||||||
@@ -13,6 +13,9 @@ export interface ChipColor {
|
|||||||
|
|
||||||
const CHIP_COLORS: Record<string, ChipColor> = {
|
const CHIP_COLORS: Record<string, ChipColor> = {
|
||||||
// Colourpoint / C-Serie
|
// 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' },
|
'Pink Eyed White (PEW)': { bg: '#f7f3ec', fg: '#8a7d6b' },
|
||||||
Hermelin: { bg: '#f3ede2', fg: '#8a7d6b' },
|
Hermelin: { bg: '#f3ede2', fg: '#8a7d6b' },
|
||||||
Himalaya: { bg: '#efe6d8', fg: '#8a7d6b' },
|
Himalaya: { bg: '#efe6d8', fg: '#8a7d6b' },
|
||||||
|
|||||||
Reference in New Issue
Block a user