# Naming a character How a discovered name reaches `characters.name`. The mechanism is `db.add_name_claim`, fed by the dialogue stage through `service._absorb`. ## A name is a word set, not a string {#alias-grouping} **Closed, 2026-08-13, not yet run on a GPU.** Claims grouped on the casefolded name, so `Lim Seonho` from a p010 caption and `Seonho` from a p047 address counted as two names for one character. `len(grouped) > 1` fired, a `conflicting-name-claims` flag was filed, and promotion was blocked permanently on evidence that in fact corroborated. `alias_groups` groups two names when one's word set contains the other's, and keeps the longer as canonical. `Seonho` and `Lim Seonho` are one name and the registry stores `Lim Seonho`. `Seonho` and `Haeseon` are still two, so a real conflict still flags. ## A confident caption names a character on its own {#caption-is-strong} **Closed, 2026-08-13, not yet run on a GPU.** Promotion needed two distinct panels, or one `self_intro` or `name_tag` claim above 0.9. On the 2026-08-12 chapter the only claim naming a main character was `Choi Haeseon`, a caption at p040 at confidence 1.0, and it was discarded. She held 13 correct crops and stayed anonymous through the whole pipeline. A caption is the narration naming the person it is drawn beside, which is how a webtoon introduces its cast, so it joins `STRONG_EVIDENCE`. This is the loosest of the three changes and is only safe because of the next one. ## A name belongs to one character {#one-name-one-character} **Closed, 2026-08-13, not yet run on a GPU.** Being addressed by name identifies the addressee. Choosing which drawn body that is fails often. Two panels addressed `Seonho`, the dialogue model pointed `target_local_id` at the woman standing beside him, and two independent claims promoted her. The registry then held a female `Seonho` over 9 crops beside the lead's `LIM SEONHO`. A promotion now checks every other live character of the same manga first, by alias group. A collision refuses the promotion and files a `name-already-taken` flag carrying both ids. The collision is itself evidence that either the addressee or the identity cluster is wrong, so it is worth surfacing rather than resolving silently. Deliberately not built: no attempt to decide WHICH character deserves the name. That needs the addressee fixed, which is `ARCHITECTURE.md` section 3. ## Checks `test_name_binding.py` replays the six real claims from the 2026-08-12 chapter. Each new assert was confirmed to fail with its fix disabled: the caption test with `STRONG_EVIDENCE` reverted, the alias test with casefold grouping restored. The taken-name test asserts a flag kind that only the new branch emits.