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:
Keysat
2026-06-05 10:47:26 -05:00
parent 3e199fd8d5
commit dd2c34d7bc
6 changed files with 154 additions and 0 deletions
+15
View File
@@ -146,6 +146,21 @@ def main():
match_email = email if i % 2 == 0 else "" # half share email (easy), half don't (hard)
overlap_specs.append((org_name, f"{variant} {last}", match_email))
# Multi-contact institutions: the first two orgs get extra contacts so ONE
# investor entity owns several people (a family office / institution), to
# exercise the member_of relationship. (A HNWI stays a 1-contact investor.)
for org_name in (ORGS[0][0], ORGS[1][0]):
for k in range(2):
fn, ln = FIRST[(k + 13) % len(FIRST)], LAST[(k + 13) % len(LAST)]
cid = gen()
conn.execute(
"INSERT INTO contacts (id, first_name, last_name, email, title, organization_id, contact_type, "
"status, source, notes, created_by, updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)",
(cid, fn, ln, f"{fn.lower()}.{ln.lower()}@{org_name.split()[0].lower()}.invalid",
random.choice(["Analyst", "Principal", "Associate"]), org_ids[org_name], "investor", "active",
"referral", f"Additional contact at {org_name}.", uid, now()))
contacts.append((cid, fn, ln, org_name, "investor"))
# extra prospect contacts (no org sometimes)
for j in range(12):
first = FIRST[(j + 8) % len(FIRST)]