fix(tickets): 16 Tickets der Züchterin — Genetik, Importer, Daten, Akte
Genetik-Engine (bde4ec70, f89e95ad, 2322c2a8):
- Saphir/Platin/Platin-Hell unterscheiden sich NUR in der C-Zygotie und waren im
Katalog identisch (locusToken reduziert auf das dominante Allel) → Saphir war
unerreichbar. Token darf jetzt ein exaktes, ungeordnetes Allelpaar "x/y"
verlangen: Platin C/C, Saphir C/cchm, Platin-Hell C/ch. TS- und Python-Mirror
identisch, Seeds regeneriert, Migration ReseedColorVarietiesGen6Saphir.
- c[hm] wird als Alias auf c[chm] normalisiert (Tippfehler in zwei Charts) —
vorher war Jays Gencode unparsebar und ergab "Zobel-Hell".
- 6 Tiere wechseln den errechneten Farbschlag (5x Platin→Saphir, Jay→Zobel).
Importer-Logik:
- renameTo-Notiz-Sweep: der alte Name blieb in Wurf-Notizen stehen ("Blacky +
Kruke") — jetzt wortgenau ersetzt, mit vier Guards gegen Kollateralschaden.
- Neuer Resolution-Schlüssel goHomeDate (autoritativ, zieht GivenAway nach) und
spottingType; Gencode-Overrides gewinnen jetzt bei präzisem Match (vorher
wurden Entscheidungen stumm verschluckt, z. B. Eliza und Chris).
- parse_date verwirft implausible Jahre (JackJack hatte 1310-05-13).
- extract.py erkennt Stammbaum-Blöcke auch ohne Stern vor dem Geburtsdatum
(Bijou bekam dadurch den Nachbar-Ast als Mutter).
- Backend-Ingest überträgt SpottingType (nur bei Payload-Wert).
Daten (conflict-decisions.json, re-ingest-stabil): Kuke-Merge + Zuchtname,
Jamie- und Sakura-Dubletten, Phantom-Tier "Unbekannt", Eltern von Kathlin,
Fast Boy/Ziwa und dem Q4-/TS-Wurf, Eliza-Gencode, Merle-Abgabe, JackJack.
Frontend (24522f5f): Abgabedatum steht in der Tier-Akte jetzt direkt unter dem
Abnehmer und hängt nicht mehr am Status.
Tests: +25 Checks test_merge_resolve, +7 test_genotype, +8 genetics.test.ts,
neuer Extract- und Ingest-Test, e2e GOHOME-ROW. Alles grün.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -498,6 +498,57 @@ if os.path.exists(_emf_chart):
|
||||
else:
|
||||
print("\nWarning: EMF-Stammbaum nicht gefunden, EMF-Check übersprungen.")
|
||||
|
||||
# --- sternloses Geburtsdatum im Block (Ticket 65266679 Bijou) ---
|
||||
# Einige Charts vergessen den Stern ("22.08.2019/+09.04.2024"); ohne Stern erkannte die
|
||||
# Blockheuristik das Tier gar nicht und _reconstruct_parents griff in den Nachbar-Ast.
|
||||
# Normalisiert wird NUR mit Block-Kontext (Genotyp darunter UND Name darueber), damit
|
||||
# beliebige Datumszellen nicht faelschlich zu Tieren werden.
|
||||
_tmp_star = os.path.join(tempfile.gettempdir(), "starless_dob.xlsx")
|
||||
_make_xlsx(_tmp_star, {
|
||||
# echter Block, aber ohne Stern vor dem Geburtsdatum (Quelldatei-Tippfehler)
|
||||
"K44": "Louis of Black Forest",
|
||||
"K45": "22.08.2019/+09.04.2024",
|
||||
"K46": "Aa CC dd EE Gg P- spsp",
|
||||
# Datum mit Name darueber, aber OHNE Genotyp darunter -> kein Block
|
||||
"N44": "Irgendeine Notiz",
|
||||
"N45": "01.01.2020",
|
||||
# Datum mit Genotyp darunter, aber OHNE Namenszelle darueber -> kein Block
|
||||
"Q45": "02.02.2021",
|
||||
"Q46": "aa CC DD EE GG PP spsp",
|
||||
})
|
||||
try:
|
||||
_star_animals = e.extract_stammbaum(_tmp_star)
|
||||
_star_by_name = {a["name"]: a for a in _star_animals}
|
||||
check("sternloses DOB wird als Block erkannt", "Louis of Black Forest" in _star_by_name)
|
||||
check("sternloses DOB: Geburts- und Todesdatum geparst",
|
||||
_star_by_name.get("Louis of Black Forest", {}).get("dob") == "22.08.2019"
|
||||
and _star_by_name.get("Louis of Black Forest", {}).get("death") == "09.04.2024")
|
||||
check("Datumszelle ohne Block-Kontext wird NICHT zum Tier",
|
||||
len(_star_animals) == 1)
|
||||
finally:
|
||||
try: os.remove(_tmp_star)
|
||||
except OSError: pass
|
||||
|
||||
# Direkt auf der Normalisierung: Todesdatum-only-Zellen ("/+01.09.2024", kommt in
|
||||
# "Stammbaum von Kentucky/Watarus Kids" vor) duerfen NIE zum Geburtsdatum werden.
|
||||
_cells = {
|
||||
(11, 45): "22.08.2019/+09.04.2024", # Block -> bekommt den Stern
|
||||
(11, 44): "Louis of Black Forest",
|
||||
(11, 46): "Aa CC dd EE Gg P- spsp",
|
||||
(14, 66): "/+01.09.2024", # nur Todesdatum -> unangetastet
|
||||
(14, 65): "Nani of Black Forest",
|
||||
(14, 67): "Aa CC dd EE Gg P- spsp",
|
||||
(17, 30): "30.01.2020/+", # Block, Todesdatum leer -> bekommt den Stern
|
||||
(17, 29): "Jiminy of Black Forest",
|
||||
(17, 31): "Aa Cc[chm] Dd ee gg P- Spsp",
|
||||
}
|
||||
e._normalise_starless_dobs(_cells)
|
||||
check("Normalisierung setzt den Stern im Block", _cells[(11, 45)] == "*22.08.2019/+09.04.2024")
|
||||
check("Normalisierung setzt den Stern auch bei leerem Todesdatum",
|
||||
_cells[(17, 30)] == "*30.01.2020/+")
|
||||
check("Normalisierung laesst reine Todesdatum-Zellen unberuehrt",
|
||||
_cells[(14, 66)] == "/+01.09.2024")
|
||||
|
||||
if failed:
|
||||
print(f"\n{failed} test(s) FAILED")
|
||||
sys.exit(1)
|
||||
|
||||
Reference in New Issue
Block a user