Contacts manager: standalone view with dedup/merge strategy #73

Closed
opened 2026-04-06 10:05:44 -07:00 by pyr0ball · 0 comments
Owner

Context

Peregrine already captures contact data implicitly (recruiters, hiring managers, interviewers) through applications and calendar events. This issue gives contacts a proper home with dedup from the start rather than retrofitting later.

UI

Standalone Contacts view — first-class nav item. Contacts outlive individual applications (same recruiter, multiple roles; same hiring manager across companies) and need a dedicated home.

Contact card fields:

  • Name, title, company, email, phone, LinkedIn URL
  • Source (where captured: application, calendar event, manual)
  • Relationship history: linked applications, conversations, interviews
  • Notes

Dedup signal stack (cheapest to most expensive)

1. Exact email match         → definite duplicate — auto-merge
2. Exact LinkedIn URL match  → definite duplicate — auto-merge
3. Same name + same company  → probable — flag for user review
4. Fuzzy name + same domain  → possible — low-confidence flag
5. LLM similarity score      → edge cases only

Merge strategy

Field-level merge with user confirmation on conflicts.

  • Non-conflicting fields: fill gaps automatically (most recent non-null wins)
  • Conflicting fields: surface side-by-side for user to pick canonical value
  • Never auto-resolve conflicts silently — job search context makes misidentification genuinely harmful

Pipeline crystallization hook

Early ambiguous merges go through LLM-assisted review. User approvals crystallize into deterministic dedup rules over time (Circuit-Forge/circuitforge-core#33).

Acceptance criteria

  • Contacts view in nav
  • Contact card with full field set
  • Linked applications + conversation history per contact
  • Dedup runs on import and on manual add
  • Merge confirmation UI for conflicting fields
  • Manual merge trigger (user selects two contacts → merge flow)
  • Export contacts (vCard / CSV)
## Context Peregrine already captures contact data implicitly (recruiters, hiring managers, interviewers) through applications and calendar events. This issue gives contacts a proper home with dedup from the start rather than retrofitting later. ## UI Standalone **Contacts** view — first-class nav item. Contacts outlive individual applications (same recruiter, multiple roles; same hiring manager across companies) and need a dedicated home. **Contact card fields:** - Name, title, company, email, phone, LinkedIn URL - Source (where captured: application, calendar event, manual) - Relationship history: linked applications, conversations, interviews - Notes ## Dedup signal stack (cheapest to most expensive) ``` 1. Exact email match → definite duplicate — auto-merge 2. Exact LinkedIn URL match → definite duplicate — auto-merge 3. Same name + same company → probable — flag for user review 4. Fuzzy name + same domain → possible — low-confidence flag 5. LLM similarity score → edge cases only ``` ## Merge strategy **Field-level merge with user confirmation on conflicts.** - Non-conflicting fields: fill gaps automatically (most recent non-null wins) - Conflicting fields: surface side-by-side for user to pick canonical value - Never auto-resolve conflicts silently — job search context makes misidentification genuinely harmful ## Pipeline crystallization hook Early ambiguous merges go through LLM-assisted review. User approvals crystallize into deterministic dedup rules over time (Circuit-Forge/circuitforge-core#33). ## Acceptance criteria - [ ] Contacts view in nav - [ ] Contact card with full field set - [ ] Linked applications + conversation history per contact - [ ] Dedup runs on import and on manual add - [ ] Merge confirmation UI for conflicting fields - [ ] Manual merge trigger (user selects two contacts → merge flow) - [ ] Export contacts (vCard / CSV)
pyr0ball added this to the Paid Tier GA milestone 2026-04-06 10:05:58 -07:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Circuit-Forge/peregrine#73
No description provided.