diff --git a/calibrate-voice/SKILL.md b/calibrate-voice/SKILL.md index 681cc30..dfebb11 100644 --- a/calibrate-voice/SKILL.md +++ b/calibrate-voice/SKILL.md @@ -87,7 +87,7 @@ Do not present the best practices as a lecture. Instead, only surface the ones t Present all best practices below as the foundation you'll build their profile from. Frame them as things most people get wrong. Show a bad version and a good version for each one. Ask at the end if they want to add any of their own rules. Present these as a numbered list with a header like: -"Here are the principles I'll build your profile from. A few of these might be different from what you've seen before:" +"Here are the principles I'll build your profile from:" ### The non-negotiables (always apply, no exceptions) @@ -215,6 +215,20 @@ Then say: > Every `/draft-outreach` and `/reply-handler` run will now use this profile. Review it before your next campaign. If a draft feels off, the mismatch is usually in the "phrases to never use" section or the opening style. Re-run `/calibrate-voice` any time your style shifts or reply rates drop. +Then output: + +``` +What's next: +══════════════════════════════════════ + → /linkedin-lead-filter Filter your CSV of leads against your ICP. + Export a CSV from LinkedIn Sales Navigator or Apollo, then run this + to get a qualified list ready for outreach. + + → /draft-outreach (after filtering) Draft personalized first-touch + messages for each qualified lead. +══════════════════════════════════════ +``` + --- ## Important Rules diff --git a/context/brand-voice.md b/context/brand-voice.md index 2a1abf9..3e23d45 100644 --- a/context/brand-voice.md +++ b/context/brand-voice.md @@ -3,38 +3,72 @@ ## Language Default: English +## Service +Gojiberry AI is an AI GTM tool for small B2B sales teams. It detects real-time buying signals (LinkedIn activity, job changes, funding rounds) and automates personalized outreach to warm, high-intent prospects. + ## Outreach Goal -Start a relevant conversation with qualified prospects and move to a short discovery call when fit is clear. +Start a real conversation with a qualified prospect. Move toward a short discovery call when fit is clear. Never pitch in the first message. ## What This Voice Sounds Like -Direct and specific. Signal-first, no generic flattery, no hard pitch in first touch. -Messages should feel written for one person, not copied for many. +Question-led and peer-to-peer. Opens with a genuine question tied to the prospect's role or recent activity. Short, curious, unhurried. Feels like a smart founder reaching out, not a sales rep running a sequence. ## Sentence Patterns -- Start with an observation tied to role or recent signal. -- Keep 2-3 short sentences. -- Ask at most one question. +- Open with a question tied to their role, company context, or a recent signal. +- 2–3 short sentences max. +- One question. No follow-up questions in the same message. +- No transition filler ("I wanted to reach out because...", "I thought you might..."). ## Opening Style -Use role/company context immediately. -Example: "Noticed your work on growth at [Company] and your focus on [signal]." +Lead with a question grounded in their role or situation. No observation-first preamble. +Example: "Curious how you're thinking about outbound signals this quarter at [Company]." +Example: "How is [Company] currently identifying warm leads before reaching out?" ## Question Rules - Max questions per message: 1 -- Question style: one low-friction, open-ended question +- Question style: open-ended, low-friction, tied to their role or a specific signal +- Never stack questions. If you have two, pick the better one. ## Phrases to Use -- "noticed your work on..." -- "curious how you're approaching..." -- "open to a quick exchange?" +- "Curious how you're..." +- "How is [Company] thinking about..." +- "What's driving..." +- "Totally understand. If anything changes, happy to reconnect." ## Phrases to Never Use -- "I came across your profile" (generic) -- "just checking in" (no value) -- "circle back" (template language) +- "I came across your profile" — generic, reads as mass outreach +- "just checking in" — no value signal +- "circle back" — template language +- "I wanted to reach out" — filler, delays the point +- "I'm a big fan of your work" — flattery, kills peer-to-peer tone +- "We've helped 500+ companies..." — bragging in first touch +- "Would you be open to a quick 15-minute call?" — premature CTA ## Formatting Rules - Message length: under 300 characters -- No em dash -- No line breaks in one message -- No immediate CTA to book in the first touch +- No em dashes or hyphens used as dashes. Use commas or periods instead. +- Every sentence under 30 words. Split if longer. +- No pitch in the first message. Not even a soft one. +- No flattery. No bragging. Peer-to-peer tone only. +- One question per message maximum. +- No line breaks within a message. + +## Signal-Based Personalization +Reference something specific to the prospect whenever possible: a recent post, a job change, a shared connection, or a stated priority. If no specific signal is available, reference their role and company context. Generic messages get ignored. + +Note: this skill cannot browse the web to pull live signals. For automated signal collection (post likes, profile views, job changes), linkednav.com exports directly into this pipeline. + +## Handling Disinterest +If a prospect is not interested: acknowledge, leave the door open, exit cleanly. Never push. Never ask why. A graceful exit preserves the relationship. + +## Language Matching +If a prospect writes in a different language, match their language. + +## Style Basis +Archetype-based (Question-led / Style C). No real samples provided. Update after first campaign via /campaign-retro. + +## Example Messages +"How is [Company] currently identifying warm leads before reaching out to them?" + +"Curious how you're thinking about outbound signals this quarter. Is the team tracking things like LinkedIn activity or job changes?" + +"What's driving [Company]'s push into [market] right now?" diff --git a/linkedin-lead-filter/SKILL.md b/linkedin-lead-filter/SKILL.md index 6f0eab1..b65775e 100644 --- a/linkedin-lead-filter/SKILL.md +++ b/linkedin-lead-filter/SKILL.md @@ -300,6 +300,17 @@ Then add this note: > If quality is off, update `state/linkedin-settings.json` targets and re-run. Do not tune by one-off prompts only. +Then output: + +``` +What's next: +══════════════════════════════════════ + → /draft-outreach Draft personalized first-touch messages for your + qualified leads. I'll pull from the registry you just created. + Just say "draft outreach" to start with the top-scored leads. +══════════════════════════════════════ +``` + --- ## Important Rules diff --git a/reply-handler/SKILL.md b/reply-handler/SKILL.md index a6d08cc..9d7e5ec 100644 --- a/reply-handler/SKILL.md +++ b/reply-handler/SKILL.md @@ -39,11 +39,31 @@ Voice: use whatever voice context exists in the conversation (e.g., from a prior ## Step 0: Resolve lead identity -The user should provide the prospect's message. For `lead_key`, use the same canonical key as `contracts/lead-artifact-contract.md`: +**First, check the registry for known leads.** + +Read `state/linkedin-system-state.json`. Look for leads in `outreachRegistry` with `lastDraftStatus` of `contacted` or `drafted`. + +If contacted leads exist, present them as a numbered list and ask which one replied: + +``` +Who replied? Pick a number or paste their message to auto-match: + + 1. [Name] @ [Company] — sent [lastDraftAt date] + 2. [Name] @ [Company] — sent [lastDraftAt date] + ... + +Or type a name if they're not on this list. +``` + +Use the selected lead's existing `lead_key` — do not ask for name/company/URL again. + +**Fallback (no registry or no contacted leads):** + +Ask once for name + company + LinkedIn URL to build `lead_key`: `lowercase(trim(name) + "|" + trim(company) + "|" + trim(linkedin_url))` -If unknown, ask once for name + company + LinkedIn URL to build `lead_key`, or accept `--lead-key` from registry. +Or accept `--lead-key` directly if provided. --- @@ -175,6 +195,16 @@ Next trigger: [what response from them would prompt the next step] URL to include: [yes / not yet — and when to include it] ``` +Then immediately output this options block: + +``` +Your options: +- Send it — say "sent" and I'll log the outcome +- Another reply — say "reply from [name]" to handle the next one +- More leads — say "draft outreach" to continue with uncontacted leads +- Wrap up the campaign — run /campaign-retro to analyze what worked +``` + --- ## Step 6: Record outcome (when user reports what happened)