tts-voice-creator-clone-and.../core
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
..
__init__.py Security audit, modular refactor, and container-name field 2026-05-29 12:13:07 +02:00
attribution_spans.py feat(audiobook): advisory verify and span-native recast for span casts 2026-09-19 20:17:38 +02:00
audio.py Fix Fish-Speech emotion tags, wire book context into portraits, add emotion controls app-wide (v1.20.5) 2026-08-11 18:02:41 +02:00
character_image_check.py feat(characters): short framing-first portrait prompt; the sheet follows what the finished portrait shows 2026-09-21 20:09:45 +02:00
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
config.py feat(magazine): find and import issues from the Internet Archive and OPDS catalogues 2026-09-29 17:35:08 +02:00
constants.py feat: complete magazine P1 (images, play-all, karaoke, driving mode, sidebar exclusion) + OCR engines page + second OCR engine 2026-09-06 23:39:34 +02:00
database.py feat(characters): translate character info to English before image prompts 2026-10-03 12:01:42 +02:00
docker_client.py fix(docker): remove undefined-variable reconnect that broke all container status/start/stop/restart 2026-09-14 18:14:22 +02:00
epub_export.py fix(magazine): use sentence timings of interview renders for player and EPUB 2026-10-03 00:09:45 +02:00
known_names.json feat(magazine): auto-link continuation pages, manual page linking, flow arrows by reading order, compact report, names/brands in spellcheck 2026-09-28 11:46:32 +02:00
magazine_sources.py feat(magazine): manage OPDS catalogues in the app, env-based login, result paging 2026-09-30 11:03:03 +02:00
magazine.py feat(magazine): record/replay cache for vision responses in OCR comparisons 2026-10-03 11:09:17 +02:00
presets.py Back user state with SQLite voice index 2026-06-30 15:06:43 +02:00
prompt_translation.py feat(characters): translate character info to English before image prompts 2026-10-03 12:01:42 +02:00
pronunciations.json feat(magazine): fuse paragraphs across columns/pages, article-aware acronyms, German/English spellcheck 2026-09-28 08:09:30 +02:00
pronunciations.py fix(magazine): suspect-OCR check uses page language and page vocabulary 2026-09-28 08:23:09 +02:00
provider_health.py refactor: centralize provider health probes 2026-09-04 10:25:55 +02:00
registry.py Security audit, modular refactor, and container-name field 2026-05-29 12:13:07 +02:00
retry.py feat: unify transient provider retries 2026-09-04 09:36:48 +02:00
routing.py Release v1.22.2 2026-09-03 16:12:02 +02:00
spelling.py feat(magazine): fast LLM calls for spelling agent, run-together word repair, magazine comparison tool 2026-09-28 20:09:42 +02:00
tts_helpers.py fix: explain why designed-voice benchmarks fail and stop batches on an unreachable service 2026-09-29 16:03:23 +02:00
validation.py feat: validate canonical image asset digests 2026-09-04 09:53:50 +02:00
vision_cache.py feat(magazine): record/replay cache for vision responses in OCR comparisons 2026-10-03 11:09:17 +02:00
voice_index.py Add unified Studio casting workflow and fix voice/casting pipeline bugs 2026-07-26 02:03:56 +02:00
voice.py security: harden P0 boundaries and recovery 2026-09-04 07:33:41 +02:00
word_alignment.py feat(magazine): word-level timing via forced-aligner sidecar with player word highlight 2026-10-03 00:37:40 +02:00