Build or update a person profile, run a biweekly relationship health check, manage coaching goals, or prep for a meeting with someone. Trigger: "person intel", "synthesize [name]", "build profile for [name]", "update [name]'s profile", "who is [name]", "person intelligence", "people profile", "refresh profiles", "relationship check", "health check", "biweekly check", "relationship health", "prep for [name]", "meeting prep [name]", "coaching goals"
Synthesizes rich person profiles into Obsidian (30-people/[Name].md) by pulling data from every available source: Fathom 1:1 transcripts, Airtable SLT meeting intelligence, Airtable People Ops, existing Obsidian notes, and conversation context.
Read OBSIDIAN_VAULT_PATH from ~/.claude/local-plugins/nsls-personal-toolkit/.env.
Scripts live at: ~/.claude/local-plugins/nsls-personal-toolkit/skills/person-intelligence/scripts/
"Synthesize Gary Tuerack" or "person intel on Adam Stone" -- the pipeline runs automatically.
Ask for or confirm: full name, known email(s). Check the Known People Registry below for shortcuts.
Run these in parallel where possible. Each outputs JSON to stdout, status to stderr.
Fathom 1:1s (if email known):
python3.12 ~/.claude/local-plugins/nsls-personal-toolkit/skills/person-intelligence/scripts/fetch_fathom_1on1s.py \
--email {email} --list
Airtable SLT (if SLT member -- Gary, Adam, Ashleigh, Michael, Anish, Kevin):
python3.12 ~/.claude/local-plugins/nsls-personal-toolkit/skills/person-intelligence/scripts/fetch_airtable_slt.py "{name}" > /tmp/person-intel-slt.json
Airtable People Ops (if NSLS employee):
python3.12 ~/.claude/local-plugins/nsls-personal-toolkit/skills/person-intelligence/scripts/fetch_airtable_people_ops.py "{name}" > /tmp/person-intel-people-ops.json
Existing Obsidian profiles (vault at $OBSIDIAN_VAULT_PATH):
30-people/{Name}.md (display name with spaces)10-slt/members/{slug}.md (lowercase hyphenated, e.g., gary-tuerack.md)20-projects/board-intelligence/members/{Name}.md (display name with spaces)If no email provided or Fathom returns 0 matches, skip this step. The synthesizer works with Airtable data alone.
Fetch transcripts and summarize each:
python3.12 ~/.claude/local-plugins/nsls-personal-toolkit/skills/person-intelligence/scripts/fetch_fathom_1on1s.py \
--email {email} --fetch-all > /tmp/person-intel-meetings.jsonl
# Summarize each meeting (one Claude API call per meeting)
while IFS= read -r line; do
echo "$line" | python3.12 ~/.claude/local-plugins/nsls-personal-toolkit/skills/person-intelligence/scripts/summarize_meeting.py
done < /tmp/person-intel-meetings.jsonl > /tmp/person-intel-summaries.jsonl
For weekly updates: Add --after {last-synthesized date} to only fetch new meetings.
Performance: First runs with 20+ meetings take 20+ API calls. This is expected. Subsequent weekly runs are fast (1-3 new meetings).
Assemble goals, actions, and topics from all sources into a JSON object and pipe to the inference engine:
python3.12 ~/.claude/local-plugins/nsls-personal-toolkit/skills/person-intelligence/scripts/infer_projects.py < /tmp/person-intel-data.json
Input format: {"goals": [...], "actions": [...], "topics": [...], "person_name": "..."}
Assemble ALL collected data into a single JSON payload and synthesize:
python3.12 ~/.claude/local-plugins/nsls-personal-toolkit/skills/person-intelligence/scripts/synthesize_profile.py < /tmp/person-intel-combined.json > /tmp/person-intel-profile.md
Input format:
{
"person_name": "...",
"meeting_summaries": [...],
"airtable_slt": {...},
"airtable_people_ops": {...},
"existing_profile": "...",
"existing_board_profile": "...",
"existing_slt_profile": "...",
"projects": {...}
}
All fields except person_name are nullable -- the synthesizer handles any combination.
Write the synthesized profile to $OBSIDIAN_VAULT_PATH/30-people/{Name}.md.
If the person is an SLT member, also update $OBSIDIAN_VAULT_PATH/10-slt/members/{slug}.md with coaching feedback patterns (speaking %, contribution quality trends, start/stop recommendations over time).
If the person is a board member, do NOT overwrite $OBSIDIAN_VAULT_PATH/20-projects/board-intelligence/members/{Name}.md -- that has hand-curated board context. The 30-people/ profile links to it instead.
If infer_projects.py returned "suggested" projects (1-2 matches, below the 3-match confirmation threshold), present them:
"I found possible project connections for {name}:
If confirmed, add to the profile AND update the project's collaborators: frontmatter.
For confirmed projects, update $OBSIDIAN_VAULT_PATH/20-projects/{project}/{project}.md frontmatter: