tts-voice-creator-clone-and.../scripts
mARTin-B78 1f812d2faf fix(characters): merge profiles only on real names, keep other cast names, reasoning and foreign quotes out of a character
Real-library audit (270 records) traced the data damage to:
- identity matching on ANY shared token ("Zwerg", "der Zwerg", "Mann") with
  "longer text wins" merging (Arthag b02 = Kolon's species/relationships), and
- csRosterCanonicalName renaming a sheet to the first cast name among its
  aliases, which saved 16 whole-sheet copies (Zwerg/Kolon = Arthag b03,
  Fremder = Mann, Alchimist = Promos ...).

Fixes:
- static/js/character-identity.js + core/character_records.py: generic labels
  are never identity evidence; csFindMergeKey, csConsolidateAliasDuplicates,
  csRosterCanonicalName, clSameIdentity use it; own name always wins; clUpsert
  writes to the exact-name record before any alias scan; no seed rename onto a
  name that has its own record.
- _charsheets_parse: in cast-target mode drop other cast members' names from
  aliases / first / last name (Kolon: "Sharraz Garthai"), strip reasoning
  leakage ("Warte:", "Der Text sagt ...") from every text field.
- _character_scene_evidence: only a quote naming the character is used,
  otherwise its own mannerisms (16 panels showed another character's scene).
- _character_age_category: Junge/Mädchen/boy/girl, number words, Sommer/
  Winter ages, evidence clause, age-tagged quotes; "15 Jahre älter" is no age.
- scripts/audit_character_records.py (read-only) and
  scripts/clean_character_records.py (dry run by default, --apply backs up).

Tests: tests/test_character_record_hygiene.py, tests/character-identity.test.mjs.
Docs: architecture/character-extraction.md, Manual, CHANGELOG.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 14:09:53 +02:00
..
hooks Add release automation: version bump script and pre-commit changelog hook 2026-05-29 14:14:41 +02:00
audit_character_records.py fix(characters): merge profiles only on real names, keep other cast names, reasoning and foreign quotes out of a character 2026-10-03 14:09:53 +02:00
backup_characters.py Release v1.22.2 2026-09-03 16:12:02 +02:00
bench_ocr.py feat(magazine): record/replay cache for vision responses in OCR comparisons 2026-10-03 11:09:17 +02:00
check-frontend.mjs perf: lazy-load section feature modules 2026-09-04 10:23:20 +02:00
clean_character_records.py fix(characters): merge profiles only on real names, keep other cast names, reasoning and foreign quotes out of a character 2026-10-03 14:09:53 +02:00
compare_casts.py Add cast comparison tool for validating automated casting against a manual one 2026-08-12 11:09:38 +02:00
compare_characters.py Release v1.22.2 2026-09-03 16:12:02 +02:00
compare_magazines.py feat(magazine): record/replay cache for vision responses in OCR comparisons 2026-10-03 11:09:17 +02:00
export_all_audiobooks.py chore: release 1.21.0 - Consistent ComfyUI Character Renders and Audiobook Export 2026-08-23 09:12:57 +02:00
generate_character_image_samples.py chore: release 1.21.0 - Consistent ComfyUI Character Renders and Audiobook Export 2026-08-23 09:12:57 +02:00
install-hooks.sh Add release automation: version bump script and pre-commit changelog hook 2026-05-29 14:14:41 +02:00
minify.mjs perf: lazy-load section feature modules 2026-09-04 10:23:20 +02:00
release.py fix(release): keep index.html's cache-busting version tags in sync 2026-09-22 20:28:46 +02:00
render_trial_chapters.mjs chore: release 1.21.0 - Consistent ComfyUI Character Renders and Audiobook Export 2026-08-23 09:12:57 +02:00
run_book01_test.sh Add one-command runner for the book01 manual-vs-automated cast comparison 2026-08-12 11:15:35 +02:00
run_voice_quality_pass.mjs chore: release 1.21.0 - Consistent ComfyUI Character Renders and Audiobook Export 2026-08-23 09:12:57 +02:00
score_attribution.py feat(audiobook): span-mode casting - deterministic quote spans, LLM only names speakers 2026-09-19 08:30:26 +02:00