relationship-sourcing
Skill4 starsChanged 11 days agoMITView on GitHub
Find likely recruiters, hiring-team members, or warm contacts for tracked companies through the session browser, then capture candidate-reviewed leads into Network. User-initiated, local-only. Capability = relationship_sourcing; platforms = linkedin, wellfound.
In this repository31 other files it gives its agents.
- AGENTS.mdAGENTS.md
- templates/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- templates/CLAUDE.mdCLAUDE.md
- answer-questionSkill
- apply-jobSkill
- calendar-syncSkill
- coach-gapsSkill
- company-healthSkill
- configureSkill
- discover-companiesSkill
- email-commsSkill
- evaluate-jobSkill
- ingest-mailSkill
- ingest-messagesSkill
- ingest-profileSkill
- intake-extractSkill
- interview-prepSkill
- optimize-linkedinSkill
- reevaluate-strategySkill
- report-issueSkill
- research-boardsSkill
- research-companySkill
- research-compSkill
- resume-extractSkill
- schedule-meetingSkill
- search-jobsSkill
- setup-searchesSkill
- sync-statusSkill
- tailor-applicationSkill
- track-outcomesSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
15 rules. About 0 are common, 9 are distinctive, and 6 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈9
Distinctive · estimate
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 15
Use this skill when the user asks to find a recruiter, hiring manager, employee, warm path, referral path, or relationship contact for a …
- Very specific: line 38
If no requested platform is allowed, tell the operator it is turned off, give the commands that turn it on, and stop (do not open a …
- Distinctive: line 48
Never run this capability on a schedule or without a fresh user request.
- Very specific: line 52
Read workspace/tracker.json and use the Network page's sourcing targets when possible: active applications with no recruiter, hiring-team …
- Distinctive: line 58
Do not treat portal-only rows as warm paths.
- Distinctive: line 73
Search for specific people, not generic outreach blasts.
- Distinctive: line 80
Before each interaction, inspect the page state.
- Distinctive: line 101
Do not infer private emails, do not guess personal contact details, and do not add a person as an approved warm path until the candidate …
- Very specific: line 106
Mode detection: run careerrat data status.
- Very specific: line 151
Add concrete --company, --role, or --app-id refs when the leads map cleanly to one tracker row.
- Distinctive: line 161
When the candidate approves a lead:
- Distinctive: line 175
When the candidate rejects a lead:
- Distinctive: line 219
Only after the write can this contact be treated as a warm path.
- Very specific: line 225
If no other review or approved leads remain for that target job: restate jobs[id].nextAction → 'Re-run relationship-sourcing for <Company>' …
- Very specific: line 242
If outreach is needed, hand the approved contact and context to email-comms for a draft.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
relationship-sourcing
Use this skill when the user asks to find a recruiter, hiring manager, employee, warm path, referral path, or relationship contact for a tracked company or job.
This is not a Jobs priority shortcut. A submitted application with no contact path
stays waiting/monitoring until a lead is found, reviewed, and approved by the
candidate. This skill only creates lead candidates for review; outreach drafts go
through email-comms or ingest-messages and sending remains confirm-first.
Runs under AGENTS.md. These contracts bind without being restated here: Privacy Invariant (
current_basenever outbound), Honesty Firewall, Placeholder/Bracket Ban, Gate Write-back, Domain-Neutral Rule, Browser Automation Contract, Activity Pulse logging, Tracker verify+snapshot, and Sent-Clears-Draft. Inline reminders at point-of-use are intentional; standalone restatements point back to the relevant AGENTS.md section. Barecandidate/,workspace/,config/, and.internal/paths below are symbolic; resolve them per AGENTS.md's Path Resolution rule.
STEP 0: Capability check
Run:
careerrat automation status --jsonInspect capabilities.relationship_sourcing. Applicable platforms are linkedin
and wellfound. A platform may be used when its entry has allowed: true, which
means neither the capability switch nor that platform's switch is turned off.
Relationship sourcing is on by default.
If no requested platform is allowed, tell the operator it is turned off, give the
commands that turn it on, and stop (do not open a browser). If readError is set,
say the automation settings file can't be read and name it. Skip any single platform
that is off and note it.
careerrat automation enable relationship_sourcing --write
careerrat automation enable relationship_sourcing <platform> --writeNever run this capability on a schedule or without a fresh user request.
STEP 1 — Choose targets
Read workspace/tracker.json and use the Network page's sourcing targets when
possible: active applications with no recruiter, hiring-team member, referral, or
warm contact already tracked. If the user named a company or job, narrow to that
company/application.
Skip terminal rows unless the user explicitly wants historical relationship memory. Do not treat portal-only rows as warm paths; they are search targets only.
STEP 2 — Use the session browser
[DELEGATE: subagent — sequential] Per-platform/per-target sourcing drives the session
browser, so it runs one at a time (one-browser rule); delegation isolates each target's
context, not for parallelism. Each subagent searches its target and returns compact lead
candidates; the orchestrator captures only candidate-reviewed leads into relationshipLeads[]
(STEP 3–4), subagents never write the tracker or send outreach. STEP 0 capability check already
cleared on the orchestrator. See the Delegation Contract in AGENTS.md.
For each allowed platform, open the platform in the session browser. Prefer the configured extension session; fall back to a persistent Playwright profile only if that is the configured provider.
Search for specific people, not generic outreach blasts. Good query shape:
<Company> recruiter <role family><Company> talent acquisition <role family><Company> hiring manager <team or role family><Company> engineering manager <role family>
Before each interaction, inspect the page state. Halt on login walls, 2FA, captcha, rate-limit warnings, or unexpected interstitials.
STEP 3 — Capture review leads only
For each plausible person, record a compact lead:
companyapplicationIdwhen knownnametype(Recruiter,Decision maker,Referral, orContact)titleplatformurlbasisstatus: reviewfoundAt
Store long notes or screenshots under workspace/network-leads/ when useful. Keep
the dashboard-facing relationshipLeads[] record short and privacy-safe.
Do not infer private emails, do not guess personal contact details, and do not add a person as an approved warm path until the candidate approves the lead.
STEP 4 — Write back and render
Mode detection: run careerrat data status. Exit 0 → DB workspace — use the
careerrat data <verb> command below (Data Write Contract, AGENTS.md). Nonzero
exit → legacy workspace (no DB yet) — use the direct tracker.json write path
below.
Append review leads to relationshipLeads[]. Avoid duplicate lead records by
normalized company + name + platform.
DB workspace:
careerrat data relationship leads upsert --data '<relationship lead JSON array>'
careerrat data verify
careerrat tracker --verifyrelationship leads upsert persists relationshipLeads[], dedupes by
normalized company + name + platform, clears sourcing-related CTAs on linked
jobs in the same transaction, writes Activity Pulse, and exports
workspace/tracker.json + workspace/activity.jsonl. Run careerrat tracker
afterward only when a recovery snapshot is useful.
Legacy workspace (no DB): append review leads to
workspace/tracker.json#relationshipLeads[] directly.
CTA clear-down (same write): For each target job row, inspect jobs[id].nextAction
and jobs[id].followUp for any sourcing-related pending CTA (e.g. "find recruiter
contact", "source warm path"). If one is found, include these field updates in the
same tracker.json write as the relationshipLeads[] append — never as a
separate write:
jobs[id].nextAction→'Review relationship leads — approve or reject in Network tab'jobs[id].nextActionDue→null(ball is in candidate's court; no deadline until outreach is decided)
Partial writes leave ghost CTAs. One write, both mutations.
Then run:
careerrat tracker --verify
npm run verify:tracker
careerrat activity append --type system --title "Relationship leads found" --summary "Review leads captured for candidate approval." --tag relationship --needs-user --write
careerrat trackerAdd concrete --company, --role, or --app-id refs when the leads map cleanly
to one tracker row.
The Network dashboard will show pending leads in Lead review. Approved leads become Network contacts; rejected leads stay out of the warm-path map.
STEP 5 — Approval and outreach
DB workspace:
When the candidate approves a lead:
careerrat data relationship lead set-status <lead-id> approved --at <ISO timestamp> --follow-up-due <ISO date>
careerrat data verify
careerrat tracker --verifyrelationship lead set-status sets relationshipLeads[n].status = "approved",
records approvedAt, updates the linked job row to
nextAction: "Send outreach to <Name> via email-comms", sets nextActionDue,
appends the internal conversation note, logs Activity Pulse, and exports
tracker files in one transaction.
When the candidate rejects a lead:
careerrat data relationship lead set-status <lead-id> rejected --at <ISO timestamp> --note "<brief reason>"
careerrat data verify
careerrat tracker --verifyThe same verb records rejectedAt, appends the internal note, and if no other
review or approved leads remain for that target job, restates
nextAction: "Re-run relationship-sourcing for <Company>" with
nextActionDue: null in the same transaction. Run careerrat tracker afterward
only when a recovery snapshot is useful.
Legacy workspace (no DB):
When the candidate approves a lead, perform a single workspace/tracker.json
write that covers all three mutations together:
relationshipLeads[n].status→'approved';relationshipLeads[n].approvedAt→ ISO timestamp.- On the linked job row:
jobs[id].nextAction→'Send outreach to <Name> via email-comms';jobs[id].nextActionDue→ today + 3 days (ISO date). Append to
jobs[id].conversations[](orjobs[id].activityEvents[]if no comm record exists):{ "type": "note", "direction": "internal", "summary": "Relationship lead approved: <Name> (<title>, <platform>). Outreach queued to email-comms.", "timestamp": "<ISO>" }
Bump meta.lastUpdatedAt to the current ISO timestamp in the same write (per the AGENTS.md Tracker Write Contract).
Then run:
careerrat tracker --verify
npm run verify:tracker
careerrat activity append --type outreach --actor agent \
--title "Relationship lead approved: <Name>" \
--summary "Lead approved; outreach to <Name> (<title>, <platform>) queued to email-comms." --write
careerrat trackerOnly after the write can this contact be treated as a warm path.
When the candidate rejects a lead, write in a single pass:
relationshipLeads[n].status→'rejected'; append the same note shape with a brief reason.- If no other
revieworapprovedleads remain for that target job: restatejobs[id].nextAction→'Re-run relationship-sourcing for <Company>'so the CTA stays visible rather than silently disappearing.
Bump meta.lastUpdatedAt to the current ISO timestamp in the same write (per the AGENTS.md Tracker Write Contract).
Then run:
careerrat tracker --verify
npm run verify:tracker
careerrat activity append --type system --actor agent \
--title "Relationship lead declined: <Name>" \
--summary "Lead rejected; brief reason noted on lead record." --write
careerrat trackerIf outreach is needed, hand the approved contact and context to email-comms for a
draft. Never send automatically.
In-app and terminal paths
CareerRat's in-app path searches LinkedIn and Wellfound through its owned
browser workflow unless the operator turned relationship_sourcing off for that
platform. Results are saved as review-only leads in Network; the app never sends a
message, connection request, or outreach. A terminal or external-agent run still
follows STEP 0 → 5 exactly as written.
- Recording a contact the candidate found (
relationship.record-lead). Self-reports like "I found a recruiter at Acme on LinkedIn, named Jordan Lee" or "add Casey Wu as a hiring manager at Globex" offer a "Record the contact you found" chip. No capability switch applies: the candidate did the finding, so CareerRat drives no browser. The lead lands inrelationshipLeads[]withstatus: reviewthrough the same upsert verb (same dedupe, same CTA clearing) and is approved or rejected in the Network tab like any sourced lead. The company links to a tracked application when one matches; an untracked company still records, just without the link. Notes and titles are checked for the candidate's private current pay figure and refused if it appears. - Requesting a sourcing run (
relationship.source-request). Requests like "find a recruiter at Acme" or "who can refer me at Globex" offer a "Request people sourcing" chip. The handler checksmayRunforrelationship_sourcingper platform: with every platform off it says it is turned off and offers a "Turn it on" action; with at least one allowed it runs the native search and reports each platform's result. When the linked application has no pending next action, it writesnextAction: "Run relationship-sourcing for <Company>"so the request survives reload. That CTA deliberately uses this skill's sourcing vocabulary: STEP 4's lead upsert auto-clears it to the review CTA the moment leads land, in the same transaction. An existing next action is never overwritten. - Execution and recovery. The app performs the allowed search when the chip
is chosen. Login, captcha, 2FA, and turned-off blockers leave a durable retry
action instead of clearing the request. Approval, rejection, and outreach
handoff to
email-commsare unchanged.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

