Breeder merge rule: when two source variants of the SAME animal differ ONLY by a token PRESENT in one and ABSENT in the other — a whole locus (e.g. spsp charted in one source, omitted in another) or a modifier on the same base allele (e^f vs e, the [f] marker) — keep the present token; that is NOT a conflict. Genuine VALUE contradictions still quarantine: different base alleles (Ee↔ee), unknown-vs-filled (D-↔DD), different modifiers (c[h]↔c[chm]), C-↔Cc[h], P-↔Pp. Replaces the old `len(distinct normalized geno keys) > 1` test with _genotype_conflict() (per-locus, per-allele compatibility; '?'-vs-filled is a contradiction, modifier-present-vs-absent and whole-locus-absence are not). Markers/flags (WP/DP/WFNZ/hörend) are already tags/flags, never genotype, so they never reach conflict detection; empty Farbschlag/death already don't conflict (only non-empty values are compared). Clears Daja (keep spsp), Ichika (keep ee[f]) and the D4 marker cases: Konflikte 19 -> 15. test_extract covers spsp/[f] present-vs-absent = no conflict and the four genuine-contradiction shapes. python + dotnet 121/121 green; extractor-only. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
43 KiB
43 KiB