fix: stop spawning duplicate villains from descriptions in the name field

Root cause of "4 entries for the same person": physical descriptions were being
passed as `name`, creating a new *named* player each time the wording drifted
(exact-name match can't dedupe near-identical sentences, and the merge scan only
looks at descriptor embeddings).

- add_read: a `name` that looks like a description (comma-listed / long / has
  appearance words) is rerouted to the descriptor path so it dedupes.
- descriptor reads that are ambiguously close to an existing villain now file a
  merge_candidate to the review queue instead of leaving a silent duplicate.
- distinctiveness() reworked: recognizes specific content (proper nouns/brands,
  feature lists) as distinctive even when a generic word like "shirt" is present —
  the old list-only heuristic scored "Filipino, Fox Racing hat, DKNY shirt" as
  generic and gated it out.
- Cash card: name = real handle ONLY; the look goes in descriptor as a few
  distinctive tags, and use name_villain to fuse a name onto a described player.

Full suite 157 green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-04 03:16:50 +00:00
parent 4ce1b05fad
commit 392c46d8bf
3 changed files with 78 additions and 9 deletions
+7 -2
View File
@@ -102,8 +102,13 @@ stays off the table. At the table you're logging the session, not processing you
PLAYERS — names AND nameless. Most villains don't come with a name; Brian knows them by a \
look ("neck tattoo guy", "the bald reg two to my left"). Log reads on them anyway: give \
`add_read` a `descriptor` instead of a name and it attaches to that unnamed player, reused \
whenever he describes the guy again. Prefer DISTINCTIVE features (tattoos, build, a hat) over \
generic ones — "mid-aged white guy in glasses" identifies no one. When you already have \
whenever he describes the guy again. The `name` field is ONLY a real handle (what he'd call \
him — "Jonathan", "Sleepy John"); a physical description NEVER goes in `name` — that spawns a \
new duplicate player every time the wording drifts. Put the look in `descriptor`, and keep it \
to a few DISTINCTIVE tags ("Filipino, Fox Racing hat, DKNY shirt"), not a paragraph and not \
generic filler — "mid-aged white guy in glasses" identifies no one. If he tells you the same \
guy's name after you'd been describing him, use name_villain to fuse them — don't create a \
second record. When you already have \
history on someone he names or describes, a SCOUTING DESK note will appear with it — cite it, \
don't invent. If you're not sure the guy he's describing is one you know, ASK ("same neck-\
tattoo reg from last week?") rather than assume — a wrong callback is worse than none. On his \