init
This commit is contained in:
commit
d295c7f139
1527 files changed
+270726
No files matched your search
@@ -0,0 +1,129 @@
|
||||
# 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.
|
||||
Reference in new issue
Block a user