Identity¶
Names are keys, so two spellings of one name are two people until something says otherwise, and an opaque platform id is nobody. Identity is a dictionary and stays one — hash lookups at ingest, no model on the per-line path.
Layers¶
- Contacts. The address book loads into a dict (
+19175551234 → Jordan) and resolves every inbound message before anything expensive runs. Contacts outrank everything below: a model guess cannot rename an address-book card, and two separate cards stay two people. - Stable platform ids. GroupMe and chat systems hand out opaque user ids; the display names are the unstable part and get ignored.
- Explicit naming.
memcal whocovers the rest:
memcal who # unnamed handles, assumed merges, open doubts
memcal who 12 "Jordan" # name one by hand
memcal who --adopt # take every name a platform already gave — free
memcal who --resolve # one model call over the whole picture
memcal who --split 3 # undo an assumed merge, handle for handle
memcal who --confirm 3 # accept a merge, or act on a doubt
--resolve is the only step that costs anything: it sends every unnamed handle
and every known person in one request, so a handle is matched against the whole
roster rather than judged alone.
Assumed, not decided¶
What the model concludes is provisional: merges take effect immediately, are listed by number, and are reversible. It can also decline to decide, which records a question rather than a guess. "Alex" alone never resolves when two Alexes exist; "Alex" plus poker and "Alex" plus work resolve differently, from evidence.