Phase 1: investor↔contacts (member_of), system status, thesis seed v1
- entity_resolution: emit member_of relationship edges (contact -> investor), so one investor entity owns many contacts (institution) and a HNWI is the N=1 case; crm_tools.get_investor_contacts + get_entity contacts/member_of; MCP tool. - seed_synthetic: multi-contact institutions to exercise it (Harbor & Vine = 5). - server.py: GET /api/system/status (index/entity/thesis/activity health) for an in-app status view (no shell needed to verify the index). - docs/thesis-seed-v1.md: grounded v1 thesis (throughline, 6 pillars, objections, per-segment angles, voice) drawn from Ten31's newsletter/site/essays. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -189,6 +189,17 @@ def resolve_people(conn, org_canon_by_orgid, org_canon_by_fundinv, merge_map=Non
|
||||
display = full.strip() or email
|
||||
_upsert_entity(conn, cid, "person", display, email)
|
||||
_link(conn, cid, model, sid, match_value, match_kind, conf)
|
||||
# Record that this contact (person) belongs to its investor/org entity, so
|
||||
# one investor can own many contacts (e.g. a family office with several
|
||||
# people) — and a 1-contact HNWI is just the N=1 case.
|
||||
if org_canon and cid != org_canon:
|
||||
conn.execute("""
|
||||
INSERT INTO relationship_edges (id, src_id, dst_id, edge_type, source, strength, directed,
|
||||
first_seen_at, last_seen_at, created_at, updated_at)
|
||||
VALUES (?,?,?, 'member_of', 'entity_resolution', 1.0, 1, ?, ?, ?, ?)
|
||||
ON CONFLICT(src_id, dst_id, edge_type, source)
|
||||
DO UPDATE SET last_seen_at=excluded.last_seen_at, updated_at=excluded.updated_at
|
||||
""", (str(uuid.uuid4()), cid, org_canon, _now(), _now(), _now(), _now()))
|
||||
if model == "contacts":
|
||||
contact_to_person[sid] = cid
|
||||
meta = person_meta.setdefault(cid, {"org": org_canon, "last": _split_name(full)[1],
|
||||
|
||||
Reference in New Issue
Block a user