130 lines
6.9 KiB
Markdown
130 lines
6.9 KiB
Markdown
# Mode: contacto -- Outreach messages
|
|
|
|
> Apply `voice-dna.md` (if present) to every generated message — full guardrail, conversational voice included (Tier 1 + Tier 2). See `_shared.md` → Voice DNA.
|
|
|
|
This mode has two variants that share the same persona engine (recruiter → hard
|
|
requirements; hiring manager → impact/vision):
|
|
|
|
- **LinkedIn power move** (default) — find contacts and draft a ≤300-char message
|
|
tied to a specific application/interview. This is the flow below.
|
|
- **Greeting** — a single ultra-short first-touch message for platforms with a hard
|
|
character budget (BOSS Zhipin 打招呼, job-board chat, a cold-email opener). No
|
|
contact discovery. See **Greeting variant** at the end of this file.
|
|
|
|
**Pick the variant:** use **Greeting** when the user says "greeting" / "打招呼" /
|
|
"cold opener", names a chat-style platform (e.g. BOSS Zhipin), or asks for a very
|
|
short message; otherwise run the LinkedIn power move below.
|
|
|
|
## LinkedIn power move (default)
|
|
|
|
1. **Identify targets** via WebSearch:
|
|
- Hiring manager of the team
|
|
- Assigned recruiter
|
|
- 2-3 team peers (people with similar roles)
|
|
- Interviewer (if the candidate already has a scheduled interview)
|
|
|
|
2. **Classify contact type** -- ask the candidate or infer from context:
|
|
- **Recruiter** -- person whose role is talent acquisition, sourcing, or recruiting
|
|
- **Hiring Manager** -- the person who leads the hiring team
|
|
- **Peer** -- someone with a similar role in the team (indirect referral)
|
|
- **Interviewer** -- someone who will interview the candidate (known date)
|
|
|
|
3. **Select primary target**: the person who would benefit most from the candidate being there
|
|
|
|
4. **Generate message** with a 3-sentence framework adapted to the contact type:
|
|
|
|
### Recruiter
|
|
- **Sentence 1 (Fit)**: Direct match criteria -- role, relevant experience, availability, or location
|
|
- **Sentence 2 (Proof)**: Data that answers their screening questions before they ask them (e.g., "5 years building ML pipelines, currently in Berlin, available immediately")
|
|
- **Sentence 3 (CTA)**: "Happy to share my CV if this aligns with what you're looking for"
|
|
|
|
### Hiring Manager
|
|
- **Sentence 1 (Hook)**: Specific challenge their team is facing (extracted from the JD, company blog, or news)
|
|
- **Sentence 2 (Proof)**: Candidate's greatest quantifiable achievement showing they have solved similar problems
|
|
- **Sentence 3 (CTA)**: "Would love to hear how your team is approaching [specific challenge]"
|
|
|
|
### Peer (referral)
|
|
- **Sentence 1 (Interest)**: Genuine reference to their work -- blog post, talk, open-source project, or publication
|
|
- **Sentence 2 (Connection)**: Something the candidate is doing in the same space (NOT a job pitch)
|
|
- **Sentence 3 (CTA)**: "I've been working on similar problems at [company], would love to hear your take on [topic]"
|
|
- **Note**: DO NOT ask for a job. The referral happens naturally if the conversation flows.
|
|
|
|
### Interviewer (pre-interview)
|
|
- **Sentence 1 (Research)**: Reference to something specific from their work or trajectory
|
|
- **Sentence 2 (Context)**: Light connection to the candidate's experience in that area
|
|
- **Sentence 3 (CTA)**: "Looking forward to our conversation on [date]"
|
|
- **Note**: Light tone, not desperate. The goal is to show that you prepared.
|
|
|
|
5. **Versions**:
|
|
- EN (default)
|
|
- ES (if Spanish company)
|
|
|
|
6. **Alternative targets** with justification for why they are good second choices
|
|
|
|
**Contact channel preference:** Read `contact_preferences.preferred_channel` from
|
|
`config/profile.yml`. If it is absent or set to `"either"`, write the CTA
|
|
sentence exactly as specified above — no change. If it is set to `"email"` or
|
|
`"phone"`, steer the CTA toward that channel instead of the generic default
|
|
(e.g. Recruiter's CTA becomes "Happy to share my CV over email if this aligns
|
|
with what you're looking for" rather than defaulting to a call; Hiring
|
|
Manager's CTA leans on "happy to continue this over email" instead of
|
|
proposing a call). Keep the same
|
|
3-sentence structure and per-persona emphasis -- only the channel named in the
|
|
CTA changes. If `contact_preferences.note` is set, you may fold its intent into
|
|
the CTA phrasing (e.g. "screens unknown numbers" → prefer email wording) but do
|
|
not quote the note verbatim in a public-facing message.
|
|
|
|
**Message rules:**
|
|
- Maximum 300 characters (LinkedIn connection request limit)
|
|
- NO corporate-speak
|
|
- NO "I'm passionate about..."
|
|
- Something that makes them want to respond
|
|
- NEVER share phone number
|
|
- The contact type changes the EMPHASIS, not the structure
|
|
|
|
---
|
|
|
|
## Greeting variant
|
|
|
|
A single, punchy first-touch message for platforms where the opener has a hard
|
|
character budget — BOSS Zhipin's 打招呼, job-board chat boxes, or the first line
|
|
of a cold email. Reuses the persona engine above; the difference is brevity, and
|
|
that there is **no contact discovery**.
|
|
|
|
1. **Skip target identification.** There is no WebSearch/contact-finding step —
|
|
the message goes to whoever the platform connects you with (usually the poster
|
|
or the recruiter). Do not fabricate a named recipient.
|
|
|
|
2. **Classify the recipient's persona** from context (default to **Recruiter** if
|
|
unknown) and set the emphasis exactly as above:
|
|
- **Recruiter** → hard requirements met (role, years, stack, location, availability)
|
|
- **Hiring Manager / Founder** → impact and vision (a result that maps to their goal)
|
|
|
|
3. **Synthesize the top 3 match points** between the JD and `cv.md` (same JD↔profile
|
|
fit logic the LinkedIn flow uses). These are the raw material — you will surface
|
|
only the strongest one or two that fit the budget.
|
|
|
|
4. **Compose ONE message within the character budget.**
|
|
- **Budget:** read `outreach.greeting_max_chars` from `config/profile.yml`.
|
|
**Default 150** when the key is absent. The message MUST fit — count and trim.
|
|
- **Lead with a specific value proposition** (the single strongest match point),
|
|
not an introduction. Punchy sentences, not paragraphs.
|
|
- **Language:** match the JD / platform language (e.g. Simplified Chinese for
|
|
BOSS Zhipin). Character count applies to the output language.
|
|
|
|
5. **No-fluff policy (hard):** remove filler and replace it with a concrete value
|
|
prop. Ban phrases like "I'm looking for a job", "I'm passionate about",
|
|
"I hope to have the opportunity", generic self-description. Every clause must
|
|
earn its characters.
|
|
|
|
6. **Output:** the greeting, its character count vs the budget, and a one-line note
|
|
of which match point(s) it used. Offer a shorter fallback if it's near the limit.
|
|
|
|
**Greeting rules:**
|
|
- Platform-agnostic — never assume LinkedIn; works for any chat/opener surface.
|
|
- Within `outreach.greeting_max_chars` (default 150). Never exceed it.
|
|
- Same non-fabrication rule as the rest of career-ops: reformulate real experience
|
|
from `cv.md`, never invent a skill, metric, or claim.
|
|
- NO corporate-speak, NO "I'm passionate about...", NEVER share a phone number.
|
|
- Persona changes the EMPHASIS, not the structure.
|